Index: /tags/ipp-1-X/bug123/psLib/.cvsignore
===================================================================
--- /tags/ipp-1-X/bug123/psLib/.cvsignore	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/.cvsignore	(revision 22331)
@@ -0,0 +1,20 @@
+DoxygenLog
+Doxyfile
+bin
+lib
+include
+man
+include
+pslib.kdevelop.*
+docs
+Makefile.in
+aclocal.m4
+autom4te.cache
+configure
+Makefile
+config.log
+config.status
+libtool
+pslib-config
+pslib.pc
+pslib-*.tar.gz
Index: /tags/ipp-1-X/bug123/psLib/AUTHORS
===================================================================
--- /tags/ipp-1-X/bug123/psLib/AUTHORS	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/AUTHORS	(revision 22331)
@@ -0,0 +1,1 @@
+Copyright 2004 Maui High Performance Computing Center, University of Hawaii
Index: /tags/ipp-1-X/bug123/psLib/COPYING
===================================================================
--- /tags/ipp-1-X/bug123/psLib/COPYING	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/COPYING	(revision 22331)
@@ -0,0 +1,345 @@
+		    GNU GENERAL PUBLIC LICENSE
+		       Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+                       59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+			    Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+
+		    GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+			    NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+		     END OF TERMS AND CONDITIONS
+
+
+	    How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) year name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Library General
+Public License instead of this License.
Index: /tags/ipp-1-X/bug123/psLib/ChangeLog
===================================================================
--- /tags/ipp-1-X/bug123/psLib/ChangeLog	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/ChangeLog	(revision 22331)
@@ -0,0 +1,1 @@
+Initial Version
Index: /tags/ipp-1-X/bug123/psLib/DEV_NOTES
===================================================================
--- /tags/ipp-1-X/bug123/psLib/DEV_NOTES	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/DEV_NOTES	(revision 22331)
@@ -0,0 +1,171 @@
+---- Developing in the autotools environment for non-autotools developers. ----
+
+
+There are many detailed resources on the web about the autotools (autoconf,
+automake, libtools).  Being GNU tools, the primary resources are found there
+at:
+  o  http://www.gnu.org/software/autoconf/manual/autoconf-2.57/autoconf.html
+  o  http://www.gnu.org/software/automake/manual/automake.html
+  o  http://www.gnu.org/software/libtool/manual.html
+
+This document will deal with only the basic required tasks for developing in
+the autotools environment, namely:
+  o  Creating the configuration environment from CVS check-out,
+  o  Configuring the library,
+  o  Making the library,
+  o  Adding and removing a source code file, and
+  o  Adding and removing a test code file.
+
+
+Creating the configuration environment from CVS check-out
+===============================================================================
+
+The autotools as a group help you create software distributions which will
+build reliably on a large variety of platforms.  The minimum required contact
+with the autotools is to generate the files which will let you configure a
+freshly checked-out directory before working on it, since these configuration
+files are not checked in to the repository. The Makefile.cvs makefile will do
+this for you, but it can only do this if the autotools are installed (which is
+commonly included into every Linux Distribution as well as Mac OSX).
+
+The command sequence example for this step is as follows:
+  > cvs co psLib
+  > cd psLib
+  > make -f Makefile.cvs
+
+Configuring the library
+===============================================================================
+
+Running the configure script is basically very simple: ./configure.  There are,
+however, options and arguments which can help you, or catch you out.  You can
+see the full list of options with the command ./configure --help.
+
+You set the place where the configured component will be installed with the
+--prefix option. This names a directory which will end up with the standard
+directories bin, lib and so on.  The default is `pwd` currently, but that may
+change to something like $HOME in the future.
+
+The psLib autoconf adds a couple of extra options to ./configure that may be
+of interest to a developer.
+
+--enable-perlmodule
+  enables the building of the perl module using SWIG.  The default is to not
+  build the perl modules
+
+--enable-optimize
+  by default, the build disables compiler optimization for C files to speed up
+  the compile time.  By adding this, '-O2' is added to CFLAGS.
+
+--enable-static
+  by default, only a shared, dynamically-linked, library is built.  This option
+  enables the creation of a static library at the cost of doubling the compiling
+  time.  To create only a static library, include the --disable-shared option
+  as well.
+
+--with-cfitsio=DIR
+  specifies the location of the CFITSIO installation prefix, e.g., /usr/local.
+  To specify the include and/or library directories directly, use the options
+  --with-cfitsio-include=DIR and --with-cfitsio-lib=DIR respectively.  If not
+  specified, CFITSIO is assumed to have been installed in the standard paths
+  for the OS, e.g., /usr or /usr/local.
+
+--with-fftw3=DIR
+  specifies the location of the FFTW3 installation prefix, e.g., /usr/local.
+  To specify the include and/or library directories directly, use the options
+  --with-fftw3-include=DIR and --with-fftw3-lib=DIR respectively.  If not
+  specified, FFTW3 is assumed to have been installed in the standard paths
+  for the OS, e.g., /usr or /usr/local.
+
+--with-gsl-config=FILE
+  specifies the gsl-config script to use to gather the GSL library information.
+  This is the full path to the gsl-config script included in the package's
+  installation, e.g., /usr/local/bin/gsl-config.  If not specified, $PATH is
+  used to find the script.
+
+--with-xml2-config=FILE
+  specifies the xml2-config script to use to gather the XML2 library
+  information.  This is the full path to the xml2-config script included in
+  the package's installation, e.g., /usr/local/bin/xml2-config.  If not
+  specified, $PATH is used to find the script.
+
+--with-swig=FILE
+  specifies the swig executable to use to generate the SWIG wrapper code.
+  This is the full path to the swig executable, e.g., /usr/bin/swig.  If not
+  specified, $PATH is used to find the executable.
+
+--with-perl=FILE
+  specifies the perl executable to use to generate the SWIG wrapper code.
+  This is the full path to the perl executable, e.g., /usr/bin/perl.  If not
+  specified, $PATH is used to find the executable.
+
+--with-perlprefix=DIR
+  specifies the installation prefix for the perl module.  If not
+  specified, the PREFIX as specified by the --prefix option (or its default)
+  is used.
+
+
+The command sequence example for this step, using all default settings, is as
+follows:  
+  > ./configure
+
+  
+Adding and removing a source code file
+===============================================================================
+
+The library is built from a number of smaller, 'convienence' libraries, one
+convienence library for each subdirectory off of src.  To add a file to the
+pslib library, you need to add it to one of convienence libraries in the
+appropriate subdirectory
+
+To add functionality, you need to add the filenames to the Makefile.am in the
+subdirectory in which the file is being added.
+  o  The source filename needs to added to the libpslibSUBDIR_la_SOURCES
+     variable, where SUBDIR is the subdirectory name.
+  o  Any header files needed to be installed (which is generally going to be
+     all header files) should be added to the pslibinclude_HEADERS variable.
+  o  Any other file needed to be included in the distribution tarball but are
+     not to be installed should be included in the EXTRA_DIST variable.
+
+Upon saving Makefile.am, the existing Makefile will detect the change and
+automagically perform any executation of automake/autoconf, so a simple
+'make' should fold in these changes for you.
+
+
+Adding and removing a test code file
+===============================================================================
+
+Tests are added into a subdirectory of the test directory which corresponds to
+the functionality location under src being tested.  For example, if testing
+functionality found in src/astronomy/psFoo.c, you will need to add the
+corresponding tests in test/astronomy/tst_psFoo.c.  If the test driver code
+file does not current exist, use test/tst_template.c as a template on how to
+utilize the psLib test facilities.
+
+To add a test, you need to add the filenames to the Makefile.am in the
+subdirectory in which the file is being added.
+  o  The source filename minux the .c suffix needs to added to the
+     TESTS and variable.  This specifies the executable target name.
+  o  Using the name you added to TESTS, create a line of the form
+        tst_psFoo_SOURCES = tst_psFoo.c
+     This specifies the source files needed to create the test driver
+     executable (in the psLib test suite, this is generally just one file).
+  o  Any test data file needs to be added to the check_DATA variable and
+     a rule needs to be created that will copy the file from the source
+     directory to the build directory.  This is because the directory in
+     which your data file exists is not necessarily where the test executable
+     is built.  The simpliest way to do this is to place the data file in
+     a subdirectory like 'verified' and create a rule like:
+        fBiOut.fits: verified/fBiOut.fits
+                cp $? $@
+     Automake will determine that the target directory of the cp should be
+     the build directory, so the file will be copied to the same directory
+     as your executable (so that in the code, you can assume the path is '.')
+     
+
+Upon saving Makefile.am, the existing Makefile will detect the change and
+automagically perform any executation of automake/autoconf, so a simple
+'make' should fold in these changes for you.
+
+-------------------------------------------------------------------------------
+N.B. this file is not to be included in distribution packages.
+
Index: /tags/ipp-1-X/bug123/psLib/Doxyfile.in
===================================================================
--- /tags/ipp-1-X/bug123/psLib/Doxyfile.in	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/Doxyfile.in	(revision 22331)
@@ -0,0 +1,1079 @@
+# Doxyfile 1.3.4
+
+# This file describes the settings to be used by the documentation system
+# doxygen (www.doxygen.org) for a project
+#
+# All text after a hash (#) is considered a comment and will be ignored
+# The format is:
+#       TAG = value [value, ...]
+# For lists items can also be appended using:
+#       TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (" ")
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+
+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded
+# by quotes) that should identify the project.
+
+PROJECT_NAME           = "Pan-STARRS Foundation Library"
+
+# The PROJECT_NUMBER tag can be used to enter a project or revision number.
+# This could be handy for archiving the generated documentation or
+# if some version control system is used.
+
+PROJECT_NUMBER         = @VERSION@
+
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
+# base path where the generated documentation will be put.
+# If a relative path is entered, it will be relative to the location
+# where doxygen was started. If left blank the current directory will be used.
+
+OUTPUT_DIRECTORY       = @prefix@/docs/pslib
+
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all
+# documentation generated by doxygen is written. Doxygen will use this
+# information to generate all constant output in the proper language.
+# The default language is English, other supported languages are:
+# Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, Dutch,
+# Finnish, French, German, Greek, Hungarian, Italian, Japanese, Japanese-en
+# (Japanese with English messages), Korean, Norwegian, Polish, Portuguese,
+# Romanian, Russian, Serbian, Slovak, Slovene, Spanish, Swedish, and Ukrainian.
+
+OUTPUT_LANGUAGE        = English
+
+# This tag can be used to specify the encoding used in the generated output.
+# The encoding is not always determined by the language that is chosen,
+# but also whether or not the output is meant for Windows or non-Windows users.
+# In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES
+# forces the Windows encoding (this is the default for the Windows binary),
+# whereas setting the tag to NO uses a Unix-style encoding (the default for
+# all platforms other than Windows).
+
+USE_WINDOWS_ENCODING   = NO
+
+# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will
+# include brief member descriptions after the members that are listed in
+# the file and class documentation (similar to JavaDoc).
+# Set to NO to disable this.
+
+BRIEF_MEMBER_DESC      = YES
+
+# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend
+# the brief description of a member or function before the detailed description.
+# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
+# brief descriptions will be completely suppressed.
+
+REPEAT_BRIEF           = YES
+
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
+# Doxygen will generate a detailed section even if there is only a brief
+# description.
+
+ALWAYS_DETAILED_SEC    = YES
+
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all inherited
+# members of a class in the documentation of that class as if those members were
+# ordinary class members. Constructors, destructors and assignment operators of
+# the base classes will not be shown.
+
+INLINE_INHERITED_MEMB  = NO
+
+# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full
+# path before files name in the file list and in the header files. If set
+# to NO the shortest path that makes the file name unique will be used.
+
+FULL_PATH_NAMES        = NO
+
+# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag
+# can be used to strip a user-defined part of the path. Stripping is
+# only done if one of the specified strings matches the left-hand part of
+# the path. It is allowed to use relative paths in the argument list.
+
+STRIP_FROM_PATH        =
+
+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter
+# (but less readable) file names. This can be useful is your file systems
+# doesn't support long names like on DOS, Mac, or CD-ROM.
+
+SHORT_NAMES            = NO
+
+# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen
+# will interpret the first line (until the first dot) of a JavaDoc-style
+# comment as the brief description. If set to NO, the JavaDoc
+# comments will behave just like the Qt-style comments (thus requiring an
+# explict @brief command for a brief description.
+
+JAVADOC_AUTOBRIEF      = YES
+
+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen
+# treat a multi-line C++ special comment block (i.e. a block of //! or ///
+# comments) as a brief description. This used to be the default behaviour.
+# The new default is to treat a multi-line C++ comment block as a detailed
+# description. Set this tag to YES if you prefer the old behaviour instead.
+
+MULTILINE_CPP_IS_BRIEF = NO
+
+# If the DETAILS_AT_TOP tag is set to YES then Doxygen
+# will output the detailed description near the top, like JavaDoc.
+# If set to NO, the detailed description appears after the member
+# documentation.
+
+DETAILS_AT_TOP         = YES
+
+# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented
+# member inherits the documentation from any documented member that it
+# reimplements.
+
+INHERIT_DOCS           = YES
+
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
+# tag is set to YES, then doxygen will reuse the documentation of the first
+# member in the group (if any) for the other members of the group. By default
+# all members of a group must be documented explicitly.
+
+DISTRIBUTE_GROUP_DOC   = NO
+
+# The TAB_SIZE tag can be used to set the number of spaces in a tab.
+# Doxygen uses this value to replace tabs by spaces in code fragments.
+
+TAB_SIZE               = 4
+
+# This tag can be used to specify a number of aliases that acts
+# as commands in the documentation. An alias has the form "name=value".
+# For example adding "sideeffect=\par Side Effects:\n" will allow you to
+# put the command \sideeffect (or @sideeffect) in the documentation, which
+# will result in a user-defined paragraph with heading "Side Effects:".
+# You can put \n's in the value part of an alias to insert newlines.
+
+ALIASES                =
+
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources
+# only. Doxygen will then generate output that is more tailored for C.
+# For instance, some of the names that are used will be different. The list
+# of all members will be omitted, etc.
+
+OPTIMIZE_OUTPUT_FOR_C  = YES
+
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java sources
+# only. Doxygen will then generate output that is more tailored for Java.
+# For instance, namespaces will be presented as packages, qualified scopes
+# will look different, etc.
+
+OPTIMIZE_OUTPUT_JAVA   = NO
+
+# Set the SUBGROUPING tag to YES (the default) to allow class member groups of
+# the same type (for instance a group of public functions) to be put as a
+# subgroup of that type (e.g. under the Public Functions section). Set it to
+# NO to prevent subgrouping. Alternatively, this can be done per class using
+# the \nosubgrouping command.
+
+SUBGROUPING            = NO
+
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+
+# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in
+# documentation are documented, even if no documentation was available.
+# Private class members and static file members will be hidden unless
+# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
+
+EXTRACT_ALL            = YES
+
+# If the EXTRACT_PRIVATE tag is set to YES all private members of a class
+# will be included in the documentation.
+
+EXTRACT_PRIVATE        = NO
+
+# If the EXTRACT_STATIC tag is set to YES all static members of a file
+# will be included in the documentation.
+
+EXTRACT_STATIC         = NO
+
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs)
+# defined locally in source files will be included in the documentation.
+# If set to NO only classes defined in header files are included.
+
+EXTRACT_LOCAL_CLASSES  = NO
+
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all
+# undocumented members of documented classes, files or namespaces.
+# If set to NO (the default) these members will be included in the
+# various overviews, but no documentation section is generated.
+# This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_MEMBERS     = NO
+
+# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all
+# undocumented classes that are normally visible in the class hierarchy.
+# If set to NO (the default) these classes will be included in the various
+# overviews. This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_CLASSES     = NO
+
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all
+# friend (class|struct|union) declarations.
+# If set to NO (the default) these declarations will be included in the
+# documentation.
+
+HIDE_FRIEND_COMPOUNDS  = NO
+
+# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any
+# documentation blocks found inside the body of a function.
+# If set to NO (the default) these blocks will be appended to the
+# function's detailed documentation block.
+
+HIDE_IN_BODY_DOCS      = NO
+
+# The INTERNAL_DOCS tag determines if documentation
+# that is typed after a \internal command is included. If the tag is set
+# to NO (the default) then the documentation will be excluded.
+# Set it to YES to include the internal documentation.
+
+INTERNAL_DOCS          = NO
+
+# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate
+# file names in lower-case letters. If set to YES upper-case letters are also
+# allowed. This is useful if you have classes or files whose names only differ
+# in case and if your file system supports case sensitive file names. Windows
+# users are advised to set this option to NO.
+
+CASE_SENSE_NAMES       = YES
+
+# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen
+# will show members with their full class and namespace scopes in the
+# documentation. If set to YES the scope will be hidden.
+
+HIDE_SCOPE_NAMES       = NO
+
+# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen
+# will put a list of the files that are included by a file in the documentation
+# of that file.
+
+SHOW_INCLUDE_FILES     = YES
+
+# If the INLINE_INFO tag is set to YES (the default) then a tag [inline]
+# is inserted in the documentation for inline members.
+
+INLINE_INFO            = YES
+
+# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen
+# will sort the (detailed) documentation of file and class members
+# alphabetically by member name. If set to NO the members will appear in
+# declaration order.
+
+SORT_MEMBER_DOCS       = YES
+
+# The GENERATE_TODOLIST tag can be used to enable (YES) or
+# disable (NO) the todo list. This list is created by putting \todo
+# commands in the documentation.
+
+GENERATE_TODOLIST      = YES
+
+# The GENERATE_TESTLIST tag can be used to enable (YES) or
+# disable (NO) the test list. This list is created by putting \test
+# commands in the documentation.
+
+GENERATE_TESTLIST      = YES
+
+# The GENERATE_BUGLIST tag can be used to enable (YES) or
+# disable (NO) the bug list. This list is created by putting \bug
+# commands in the documentation.
+
+GENERATE_BUGLIST       = YES
+
+# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or
+# disable (NO) the deprecated list. This list is created by putting
+# \deprecated commands in the documentation.
+
+GENERATE_DEPRECATEDLIST= YES
+
+# The ENABLED_SECTIONS tag can be used to enable conditional
+# documentation sections, marked by \if sectionname ... \endif.
+
+ENABLED_SECTIONS       =
+
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines
+# the initial value of a variable or define consists of for it to appear in
+# the documentation. If the initializer consists of more lines than specified
+# here it will be hidden. Use a value of 0 to hide initializers completely.
+# The appearance of the initializer of individual variables and defines in the
+# documentation can be controlled using \showinitializer or \hideinitializer
+# command in the documentation regardless of this setting.
+
+MAX_INITIALIZER_LINES  = 30
+
+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated
+# at the bottom of the documentation of classes and structs. If set to YES the
+# list will mention the files that were used to generate the documentation.
+
+SHOW_USED_FILES        = YES
+
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+
+# The QUIET tag can be used to turn on/off the messages that are generated
+# by doxygen. Possible values are YES and NO. If left blank NO is used.
+
+QUIET                  = NO
+
+# The WARNINGS tag can be used to turn on/off the warning messages that are
+# generated by doxygen. Possible values are YES and NO. If left blank
+# NO is used.
+
+WARNINGS               = YES
+
+# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings
+# for undocumented members. If EXTRACT_ALL is set to YES then this flag will
+# automatically be disabled.
+
+WARN_IF_UNDOCUMENTED   = YES
+
+# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for
+# potential errors in the documentation, such as not documenting some
+# parameters in a documented function, or documenting parameters that
+# don't exist or using markup commands wrongly.
+
+WARN_IF_DOC_ERROR      = YES
+
+# The WARN_FORMAT tag determines the format of the warning messages that
+# doxygen can produce. The string should contain the $file, $line, and $text
+# tags, which will be replaced by the file and line number from which the
+# warning originated and the warning text.
+
+WARN_FORMAT            = "$file:$line: $text"
+
+# The WARN_LOGFILE tag can be used to specify a file to which warning
+# and error messages should be written. If left blank the output is written
+# to stderr.
+
+WARN_LOGFILE           = DoxygenLog
+
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+
+# The INPUT tag can be used to specify the files and/or directories that contain
+# documented source files. You may enter file names like "myfile.cpp" or
+# directories like "/usr/src/myproject". Separate the files or directories
+# with spaces.
+
+INPUT                  = src
+
+# If the value of the INPUT tag contains directories, you can use the
+# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
+# and *.h) to filter out the source-files in the directories. If left
+# blank the following patterns are tested:
+# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx *.hpp
+# *.h++ *.idl *.odl *.cs *.php *.php3 *.inc
+
+FILE_PATTERNS          = *.h *.dox
+
+# The RECURSIVE tag can be used to turn specify whether or not subdirectories
+# should be searched for input files as well. Possible values are YES and NO.
+# If left blank NO is used.
+
+RECURSIVE              = YES
+
+# The EXCLUDE tag can be used to specify files and/or directories that should
+# excluded from the INPUT source files. This way you can easily exclude a
+# subdirectory from a directory tree whose root is specified with the INPUT tag.
+
+EXCLUDE                =
+
+# The EXCLUDE_SYMLINKS tag can be used select whether or not files or directories
+# that are symbolic links (a Unix filesystem feature) are excluded from the input.
+
+EXCLUDE_SYMLINKS       = NO
+
+# If the value of the INPUT tag contains directories, you can use the
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
+# certain files from those directories.
+
+EXCLUDE_PATTERNS       = *_wrap.c
+
+# The EXAMPLE_PATH tag can be used to specify one or more files or
+# directories that contain example code fragments that are included (see
+# the \include command).
+
+EXAMPLE_PATH           =
+
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
+# and *.h) to filter out the source-files in the directories. If left
+# blank all files are included.
+
+EXAMPLE_PATTERNS       =
+
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
+# searched for input files to be used with the \include or \dontinclude
+# commands irrespective of the value of the RECURSIVE tag.
+# Possible values are YES and NO. If left blank NO is used.
+
+EXAMPLE_RECURSIVE      = NO
+
+# The IMAGE_PATH tag can be used to specify one or more files or
+# directories that contain image that are included in the documentation (see
+# the \image command).
+
+IMAGE_PATH             =
+
+# The INPUT_FILTER tag can be used to specify a program that doxygen should
+# invoke to filter for each input file. Doxygen will invoke the filter program
+# by executing (via popen()) the command <filter> <input-file>, where <filter>
+# is the value of the INPUT_FILTER tag, and <input-file> is the name of an
+# input file. Doxygen will then use the output that the filter program writes
+# to standard output.
+
+INPUT_FILTER           =
+
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
+# INPUT_FILTER) will be used to filter the input files when producing source
+# files to browse (i.e. when SOURCE_BROWSER is set to YES).
+
+FILTER_SOURCE_FILES    = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will
+# be generated. Documented entities will be cross-referenced with these sources.
+
+SOURCE_BROWSER         = YES
+
+# Setting the INLINE_SOURCES tag to YES will include the body
+# of functions and classes directly in the documentation.
+
+INLINE_SOURCES         = NO
+
+# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct
+# doxygen to hide any special comment blocks from generated source code
+# fragments. Normal C and C++ comments will always remain visible.
+
+STRIP_CODE_COMMENTS    = NO
+
+# If the REFERENCED_BY_RELATION tag is set to YES (the default)
+# then for each documented function all documented
+# functions referencing it will be listed.
+
+REFERENCED_BY_RELATION = YES
+
+# If the REFERENCES_RELATION tag is set to YES (the default)
+# then for each documented function all documented entities
+# called/used by that function will be listed.
+
+REFERENCES_RELATION    = YES
+
+# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen
+# will generate a verbatim copy of the header file for each class for
+# which an include is specified. Set to NO to disable this.
+
+VERBATIM_HEADERS       = YES
+
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index
+# of all compounds will be generated. Enable this if the project
+# contains a lot of classes, structs, unions or interfaces.
+
+ALPHABETICAL_INDEX     = YES
+
+# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then
+# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns
+# in which this list will be split (can be a number in the range [1..20])
+
+COLS_IN_ALPHA_INDEX    = 5
+
+# In case all classes in a project start with a common prefix, all
+# classes will be put under the same header in the alphabetical index.
+# The IGNORE_PREFIX tag can be used to specify one or more prefixes that
+# should be ignored while generating the index headers.
+
+IGNORE_PREFIX          =
+
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_HTML tag is set to YES (the default) Doxygen will
+# generate HTML output.
+
+GENERATE_HTML          = YES
+
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `html' will be used as the default path.
+
+HTML_OUTPUT            = html
+
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for
+# each generated HTML page (for example: .htm,.php,.asp). If it is left blank
+# doxygen will generate files with .html extension.
+
+HTML_FILE_EXTENSION    = .html
+
+# The HTML_HEADER tag can be used to specify a personal HTML header for
+# each generated HTML page. If it is left blank doxygen will generate a
+# standard header.
+
+HTML_HEADER            =
+
+# The HTML_FOOTER tag can be used to specify a personal HTML footer for
+# each generated HTML page. If it is left blank doxygen will generate a
+# standard footer.
+
+HTML_FOOTER            =
+
+# The HTML_STYLESHEET tag can be used to specify a user-defined cascading
+# style sheet that is used by each HTML page. It can be used to
+# fine-tune the look of the HTML output. If the tag is left blank doxygen
+# will generate a default style sheet
+
+HTML_STYLESHEET        =
+
+# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes,
+# files or namespaces will be aligned in HTML using tables. If set to
+# NO a bullet list will be used.
+
+HTML_ALIGN_MEMBERS     = YES
+
+# If the GENERATE_HTMLHELP tag is set to YES, additional index files
+# will be generated that can be used as input for tools like the
+# Microsoft HTML help workshop to generate a compressed HTML help file (.chm)
+# of the generated HTML documentation.
+
+GENERATE_HTMLHELP      = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can
+# be used to specify the file name of the resulting .chm file. You
+# can add a path in front of the file if the result should not be
+# written to the html output dir.
+
+CHM_FILE               =
+
+# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can
+# be used to specify the location (absolute path including file name) of
+# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run
+# the HTML help compiler on the generated index.hhp.
+
+HHC_LOCATION           =
+
+# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag
+# controls if a separate .chi index file is generated (YES) or that
+# it should be included in the master .chm file (NO).
+
+GENERATE_CHI           = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag
+# controls whether a binary table of contents is generated (YES) or a
+# normal table of contents (NO) in the .chm file.
+
+BINARY_TOC             = NO
+
+# The TOC_EXPAND flag can be set to YES to add extra items for group members
+# to the contents of the HTML help documentation and to the tree view.
+
+TOC_EXPAND             = YES
+
+# The DISABLE_INDEX tag can be used to turn on/off the condensed index at
+# top of each HTML page. The value NO (the default) enables the index and
+# the value YES disables it.
+
+DISABLE_INDEX          = NO
+
+# This tag can be used to set the number of enum values (range [1..20])
+# that doxygen will group on one line in the generated HTML documentation.
+
+ENUM_VALUES_PER_LINE   = 10
+
+# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be
+# generated containing a tree-like index structure (just like the one that
+# is generated for HTML Help). For this to work a browser that supports
+# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+,
+# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are
+# probably better off using the HTML help feature.
+
+GENERATE_TREEVIEW      = NO
+
+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be
+# used to set the initial width (in pixels) of the frame in which the tree
+# is shown.
+
+TREEVIEW_WIDTH         = 250
+
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will
+# generate Latex output.
+
+GENERATE_LATEX         = NO
+
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `latex' will be used as the default path.
+
+LATEX_OUTPUT           = latex
+
+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
+# invoked. If left blank `latex' will be used as the default command name.
+
+LATEX_CMD_NAME         = latex
+
+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to
+# generate index for LaTeX. If left blank `makeindex' will be used as the
+# default command name.
+
+MAKEINDEX_CMD_NAME     = makeindex
+
+# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact
+# LaTeX documents. This may be useful for small projects and may help to
+# save some trees in general.
+
+COMPACT_LATEX          = YES
+
+# The PAPER_TYPE tag can be used to set the paper type that is used
+# by the printer. Possible values are: a4, a4wide, letter, legal and
+# executive. If left blank a4wide will be used.
+
+PAPER_TYPE             = letter
+
+# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX
+# packages that should be included in the LaTeX output.
+
+EXTRA_PACKAGES         = times
+
+# The LATEX_HEADER tag can be used to specify a personal LaTeX header for
+# the generated latex document. The header should contain everything until
+# the first chapter. If it is left blank doxygen will generate a
+# standard header. Notice: only use this tag if you know what you are doing!
+
+LATEX_HEADER           =
+
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated
+# is prepared for conversion to pdf (using ps2pdf). The pdf file will
+# contain links (just like the HTML output) instead of page references
+# This makes the output suitable for online browsing using a pdf viewer.
+
+PDF_HYPERLINKS         = YES
+
+# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of
+# plain latex in the generated Makefile. Set this option to YES to get a
+# higher quality PDF documentation.
+
+USE_PDFLATEX           = YES
+
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode.
+# command to the generated LaTeX files. This will instruct LaTeX to keep
+# running if errors occur, instead of asking the user for help.
+# This option is also used when generating formulas in HTML.
+
+LATEX_BATCHMODE        = NO
+
+# If LATEX_HIDE_INDICES is set to YES then doxygen will not
+# include the index chapters (such as File Index, Compound Index, etc.)
+# in the output.
+
+LATEX_HIDE_INDICES     = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output
+# The RTF output is optimised for Word 97 and may not look very pretty with
+# other RTF readers or editors.
+
+GENERATE_RTF           = NO
+
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `rtf' will be used as the default path.
+
+RTF_OUTPUT             = rtf
+
+# If the COMPACT_RTF tag is set to YES Doxygen generates more compact
+# RTF documents. This may be useful for small projects and may help to
+# save some trees in general.
+
+COMPACT_RTF            = NO
+
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated
+# will contain hyperlink fields. The RTF file will
+# contain links (just like the HTML output) instead of page references.
+# This makes the output suitable for online browsing using WORD or other
+# programs which support those fields.
+# Note: wordpad (write) and others do not support links.
+
+RTF_HYPERLINKS         = NO
+
+# Load stylesheet definitions from file. Syntax is similar to doxygen's
+# config file, i.e. a series of assigments. You only have to provide
+# replacements, missing definitions are set to their default value.
+
+RTF_STYLESHEET_FILE    =
+
+# Set optional variables used in the generation of an rtf document.
+# Syntax is similar to doxygen's config file.
+
+RTF_EXTENSIONS_FILE    =
+
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_MAN tag is set to YES (the default) Doxygen will
+# generate man pages
+
+GENERATE_MAN           = YES
+
+# The MAN_OUTPUT tag is used to specify where the man pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `man' will be used as the default path.
+
+MAN_OUTPUT             = man
+
+# The MAN_EXTENSION tag determines the extension that is added to
+# the generated man pages (default is the subroutine's section .3)
+
+MAN_EXTENSION          = .3
+
+# If the MAN_LINKS tag is set to YES and Doxygen generates man output,
+# then it will generate one additional man file for each entity
+# documented in the real man page(s). These additional files
+# only source the real man page, but without them the man command
+# would be unable to find the correct page. The default is NO.
+
+MAN_LINKS              = YES
+
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_XML tag is set to YES Doxygen will
+# generate an XML file that captures the structure of
+# the code including all documentation. Note that this
+# feature is still experimental and incomplete at the
+# moment.
+
+GENERATE_XML           = NO
+
+# The XML_OUTPUT tag is used to specify where the XML pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `xml' will be used as the default path.
+
+XML_OUTPUT             = xml
+
+# The XML_SCHEMA tag can be used to specify an XML schema,
+# which can be used by a validating XML parser to check the
+# syntax of the XML files.
+
+XML_SCHEMA             =
+
+# The XML_DTD tag can be used to specify an XML DTD,
+# which can be used by a validating XML parser to check the
+# syntax of the XML files.
+
+XML_DTD                =
+
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will
+# generate an AutoGen Definitions (see autogen.sf.net) file
+# that captures the structure of the code including all
+# documentation. Note that this feature is still experimental
+# and incomplete at the moment.
+
+GENERATE_AUTOGEN_DEF   = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_PERLMOD tag is set to YES Doxygen will
+# generate a Perl module file that captures the structure of
+# the code including all documentation. Note that this
+# feature is still experimental and incomplete at the
+# moment.
+
+GENERATE_PERLMOD       = NO
+
+# If the PERLMOD_LATEX tag is set to YES Doxygen will generate
+# the necessary Makefile rules, Perl scripts and LaTeX code to be able
+# to generate PDF and DVI output from the Perl module output.
+
+PERLMOD_LATEX          = NO
+
+# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be
+# nicely formatted so it can be parsed by a human reader.  This is useful
+# if you want to understand what is going on.  On the other hand, if this
+# tag is set to NO the size of the Perl module output will be much smaller
+# and Perl will parse it just the same.
+
+PERLMOD_PRETTY         = YES
+
+# The names of the make variables in the generated doxyrules.make file
+# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX.
+# This is useful so different doxyrules.make files included by the same
+# Makefile don't overwrite each other's variables.
+
+PERLMOD_MAKEVAR_PREFIX =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+
+# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will
+# evaluate all C-preprocessor directives found in the sources and include
+# files.
+
+ENABLE_PREPROCESSING   = YES
+
+# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro
+# names in the source code. If set to NO (the default) only conditional
+# compilation will be performed. Macro expansion can be done in a controlled
+# way by setting EXPAND_ONLY_PREDEF to YES.
+
+MACRO_EXPANSION        = NO
+
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES
+# then the macro expansion is limited to the macros specified with the
+# PREDEFINED and EXPAND_AS_PREDEFINED tags.
+
+EXPAND_ONLY_PREDEF     = NO
+
+# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files
+# in the INCLUDE_PATH (see below) will be search if a #include is found.
+
+SEARCH_INCLUDES        = YES
+
+# The INCLUDE_PATH tag can be used to specify one or more directories that
+# contain include files that are not input files but should be processed by
+# the preprocessor.
+
+INCLUDE_PATH           =
+
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
+# patterns (like *.h and *.hpp) to filter out the header-files in the
+# directories. If left blank, the patterns specified with FILE_PATTERNS will
+# be used.
+
+INCLUDE_FILE_PATTERNS  =
+
+# The PREDEFINED tag can be used to specify one or more macro names that
+# are defined before the preprocessor is started (similar to the -D option of
+# gcc). The argument of the tag is a list of macros of the form: name
+# or name=definition (no spaces). If the definition and the = are
+# omitted =1 is assumed.
+
+PREDEFINED             = DOXYGEN
+
+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then
+# this tag can be used to specify a list of macro names that should be expanded.
+# The macro definition that is found in the sources will be used.
+# Use the PREDEFINED tag if you want to use a different macro definition.
+
+EXPAND_AS_DEFINED      =
+
+# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then
+# doxygen's preprocessor will remove all function-like macros that are alone
+# on a line, have an all uppercase name, and do not end with a semicolon. Such
+# function macros are typically used for boiler-plate code, and will confuse the
+# parser if not removed.
+
+SKIP_FUNCTION_MACROS   = YES
+
+#---------------------------------------------------------------------------
+# Configuration::addtions related to external references
+#---------------------------------------------------------------------------
+
+# The TAGFILES option can be used to specify one or more tagfiles.
+# Optionally an initial location of the external documentation
+# can be added for each tagfile. The format of a tag file without
+# this location is as follows:
+#   TAGFILES = file1 file2 ...
+# Adding location for the tag files is done as follows:
+#   TAGFILES = file1=loc1 "file2 = loc2" ...
+# where "loc1" and "loc2" can be relative or absolute paths or
+# URLs. If a location is present for each tag, the installdox tool
+# does not have to be run to correct the links.
+# Note that each tag file must have a unique name
+# (where the name does NOT include the path)
+# If a tag file is not located in the directory in which doxygen
+# is run, you must also specify the path to the tagfile here.
+
+TAGFILES               =
+
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create
+# a tag file that is based on the input files it reads.
+
+GENERATE_TAGFILE       =
+
+# If the ALLEXTERNALS tag is set to YES all external classes will be listed
+# in the class index. If set to NO only the inherited external classes
+# will be listed.
+
+ALLEXTERNALS           = NO
+
+# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed
+# in the modules index. If set to NO, only the current project's groups will
+# be listed.
+
+EXTERNAL_GROUPS        = YES
+
+# The PERL_PATH should be the absolute path and name of the perl script
+# interpreter (i.e. the result of `which perl').
+
+PERL_PATH              = /usr/bin/perl
+
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+
+# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will
+# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base or
+# super classes. Setting the tag to NO turns the diagrams off. Note that this
+# option is superceded by the HAVE_DOT option below. This is only a fallback. It is
+# recommended to install and use dot, since it yields more powerful graphs.
+
+CLASS_DIAGRAMS         = YES
+
+# If set to YES, the inheritance and collaboration graphs will hide
+# inheritance and usage relations if the target is undocumented
+# or is not a class.
+
+HIDE_UNDOC_RELATIONS   = YES
+
+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
+# available from the path. This tool is part of Graphviz, a graph visualization
+# toolkit from AT&T and Lucent Bell Labs. The other options in this section
+# have no effect if this option is set to NO (the default)
+
+HAVE_DOT               = YES
+
+# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for each documented class showing the direct and
+# indirect inheritance relations. Setting this tag to YES will force the
+# the CLASS_DIAGRAMS tag to NO.
+
+CLASS_GRAPH            = YES
+
+# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for each documented class showing the direct and
+# indirect implementation dependencies (inheritance, containment, and
+# class references variables) of the class with other documented classes.
+
+COLLABORATION_GRAPH    = YES
+
+# If the UML_LOOK tag is set to YES doxygen will generate inheritance and
+# collaboration diagrams in a style similiar to the OMG's Unified Modeling
+# Language.
+
+UML_LOOK               = YES
+
+# If set to YES, the inheritance and collaboration graphs will show the
+# relations between templates and their instances.
+
+TEMPLATE_RELATIONS     = YES
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT
+# tags are set to YES then doxygen will generate a graph for each documented
+# file showing the direct and indirect include dependencies of the file with
+# other documented files.
+
+INCLUDE_GRAPH          = YES
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and
+# HAVE_DOT tags are set to YES then doxygen will generate a graph for each
+# documented header file showing the documented files that directly or
+# indirectly include this file.
+
+INCLUDED_BY_GRAPH      = YES
+
+# If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will
+# generate a call dependency graph for every global function or class method.
+# Note that enabling this option will significantly increase the time of a run.
+# So in most cases it will be better to enable call graphs for selected
+# functions only using the \callgraph command.
+
+CALL_GRAPH             = NO
+
+# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen
+# will graphical hierarchy of all classes instead of a textual one.
+
+GRAPHICAL_HIERARCHY    = YES
+
+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
+# generated by dot. Possible values are png, jpg, or gif
+# If left blank png will be used.
+
+DOT_IMAGE_FORMAT       = png
+
+# The tag DOT_PATH can be used to specify the path where the dot tool can be
+# found. If left blank, it is assumed the dot tool can be found on the path.
+
+DOT_PATH               =
+
+# The DOTFILE_DIRS tag can be used to specify one or more directories that
+# contain dot files that are included in the documentation (see the
+# \dotfile command).
+
+DOTFILE_DIRS           =
+
+# The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width
+# (in pixels) of the graphs generated by dot. If a graph becomes larger than
+# this value, doxygen will try to truncate the graph, so that it fits within
+# the specified constraint. Beware that most browsers cannot cope with very
+# large images.
+
+MAX_DOT_GRAPH_WIDTH    = 1024
+
+# The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height
+# (in pixels) of the graphs generated by dot. If a graph becomes larger than
+# this value, doxygen will try to truncate the graph, so that it fits within
+# the specified constraint. Beware that most browsers cannot cope with very
+# large images.
+
+MAX_DOT_GRAPH_HEIGHT   = 1024
+
+# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the
+# graphs generated by dot. A depth value of 3 means that only nodes reachable
+# from the root by following a path via at most 3 edges will be shown. Nodes that
+# lay further from the root node will be omitted. Note that setting this option to
+# 1 or 2 may greatly reduce the computation time needed for large code bases. Also
+# note that a graph may be further truncated if the graph's image dimensions are
+# not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH and MAX_DOT_GRAPH_HEIGHT).
+# If 0 is used for the depth value (the default), the graph is not depth-constrained.
+
+MAX_DOT_GRAPH_DEPTH    = 0
+
+# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will
+# generate a legend page explaining the meaning of the various boxes and
+# arrows in the dot generated graphs.
+
+GENERATE_LEGEND        = YES
+
+# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will
+# remove the intermediate dot files that are used to generate
+# the various graphs.
+
+DOT_CLEANUP            = YES
+
+#---------------------------------------------------------------------------
+# Configuration::addtions related to the search engine
+#---------------------------------------------------------------------------
+
+# The SEARCHENGINE tag specifies whether or not a search engine should be
+# used. If set to NO the values of all tags below this one will be ignored.
+
+SEARCHENGINE           = NO
+
Index: /tags/ipp-1-X/bug123/psLib/INSTALL
===================================================================
--- /tags/ipp-1-X/bug123/psLib/INSTALL	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/INSTALL	(revision 22331)
@@ -0,0 +1,167 @@
+Basic Installation
+==================
+
+   These are generic installation instructions.
+
+   The `configure' shell script attempts to guess correct values for
+various system-dependent variables used during compilation.  It uses
+those values to create a `Makefile' in each directory of the package.
+It may also create one or more `.h' files containing system-dependent
+definitions.  Finally, it creates a shell script `config.status' that
+you can run in the future to recreate the current configuration, a file
+`config.cache' that saves the results of its tests to speed up
+reconfiguring, and a file `config.log' containing compiler output
+(useful mainly for debugging `configure').
+
+   If you need to do unusual things to compile the package, please try
+to figure out how `configure' could check whether to do them, and mail
+diffs or instructions to the address given in the `README' so they can
+be considered for the next release.  If at some point `config.cache'
+contains results you don't want to keep, you may remove or edit it.
+
+   The file `configure.in' is used to create `configure' by a program
+called `autoconf'.  You only need `configure.in' if you want to change
+it or regenerate `configure' using a newer version of `autoconf'.
+
+The simplest way to compile this package is:
+
+  1. `cd' to the directory containing the package's source code and type
+     `./configure' to configure the package for your system.  If you're
+     using `csh' on an old version of System V, you might need to type
+     `sh ./configure' instead to prevent `csh' from trying to execute
+     `configure' itself.
+
+     Running `configure' takes a while.  While running, it prints some
+     messages telling which features it is checking for.
+
+  2. Type `make' to compile the package.
+
+  3. Type `make install' to install the programs and any data files and
+     documentation.
+
+  4. You can remove the program binaries and object files from the
+     source code directory by typing `make clean'.  
+
+Compilers and Options
+=====================
+
+   Some systems require unusual options for compilation or linking that
+the `configure' script does not know about.  You can give `configure'
+initial values for variables by setting them in the environment.  Using
+a Bourne-compatible shell, you can do that on the command line like
+this:
+     CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure
+
+Or on systems that have the `env' program, you can do it like this:
+     env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure
+
+Compiling For Multiple Architectures
+====================================
+
+   You can compile the package for more than one kind of computer at the
+same time, by placing the object files for each architecture in their
+own directory.  To do this, you must use a version of `make' that
+supports the `VPATH' variable, such as GNU `make'.  `cd' to the
+directory where you want the object files and executables to go and run
+the `configure' script.  `configure' automatically checks for the
+source code in the directory that `configure' is in and in `..'.
+
+   If you have to use a `make' that does not supports the `VPATH'
+variable, you have to compile the package for one architecture at a time
+in the source code directory.  After you have installed the package for
+one architecture, use `make distclean' before reconfiguring for another
+architecture.
+
+Installation Names
+==================
+
+   By default, `make install' will install the package's files in
+`/usr/local/bin', `/usr/local/man', etc.  You can specify an
+installation prefix other than `/usr/local' by giving `configure' the
+option `--prefix=PATH'.
+
+   You can specify separate installation prefixes for
+architecture-specific files and architecture-independent files.  If you
+give `configure' the option `--exec-prefix=PATH', the package will use
+PATH as the prefix for installing programs and libraries.
+Documentation and other data files will still use the regular prefix.
+
+   If the package supports it, you can cause programs to be installed
+with an extra prefix or suffix on their names by giving `configure' the
+option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
+
+Optional Features
+=================
+
+   Some packages pay attention to `--enable-FEATURE' options to
+`configure', where FEATURE indicates an optional part of the package.
+They may also pay attention to `--with-PACKAGE' options, where PACKAGE
+is something like `gnu-as' or `x' (for the X Window System).  The
+`README' should mention any `--enable-' and `--with-' options that the
+package recognizes.
+
+   For packages that use the X Window System, `configure' can usually
+find the X include and library files automatically, but if it doesn't,
+you can use the `configure' options `--x-includes=DIR' and
+`--x-libraries=DIR' to specify their locations.
+
+Specifying the System Type
+==========================
+
+   There may be some features `configure' can not figure out
+automatically, but needs to determine by the type of host the package
+will run on.  Usually `configure' can figure that out, but if it prints
+a message saying it can not guess the host type, give it the
+`--host=TYPE' option.  TYPE can either be a short name for the system
+type, such as `sun4', or a canonical name with three fields:
+     CPU-COMPANY-SYSTEM
+
+See the file `config.sub' for the possible values of each field.  If
+`config.sub' isn't included in this package, then this package doesn't
+need to know the host type.
+
+   If you are building compiler tools for cross-compiling, you can also
+use the `--target=TYPE' option to select the type of system they will
+produce code for and the `--build=TYPE' option to select the type of
+system on which you are compiling the package.
+
+Sharing Defaults
+================
+
+   If you want to set default values for `configure' scripts to share,
+you can create a site shell script called `config.site' that gives
+default values for variables like `CC', `cache_file', and `prefix'.
+`configure' looks for `PREFIX/share/config.site' if it exists, then
+`PREFIX/etc/config.site' if it exists.  Or, you can set the
+`CONFIG_SITE' environment variable to the location of the site script.
+A warning: not all `configure' scripts look for a site script.
+
+Operation Controls
+==================
+
+   `configure' recognizes the following options to control how it
+operates.
+
+`--cache-file=FILE'
+     Use and save the results of the tests in FILE instead of
+     `./config.cache'.  Set FILE to `/dev/null' to disable caching, for
+     debugging `configure'.
+
+`--help'
+     Print a summary of the options to `configure', and exit.
+
+`--quiet'
+`--silent'
+`-q'
+     Do not print messages saying which checks are being made.
+
+`--srcdir=DIR'
+     Look for the package's source code in directory DIR.  Usually
+     `configure' can determine that directory automatically.
+
+`--version'
+     Print the version of Autoconf used to generate the `configure'
+     script, and exit.
+
+`configure' also accepts some other, not widely useful, options.
+
Index: /tags/ipp-1-X/bug123/psLib/Makefile.am
===================================================================
--- /tags/ipp-1-X/bug123/psLib/Makefile.am	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/Makefile.am	(revision 22331)
@@ -0,0 +1,39 @@
+SUBDIRS = $(SUBDIR)
+
+bin_SCRIPTS = pslib-config
+
+pkgconfigdir = $(libdir)/pkgconfig
+pkgconfig_DATA= pslib.pc
+
+EXTRA_DIST = Doxyfile.in pslib-config.in pslib.pc.in share
+
+docs: Doxyfile $(prefix)/docs/pslib $(mandir)/man3
+	$(DOXYGEN)
+	mv -f $(prefix)/docs/pslib/man/man3/* $(mandir)/man3
+	rm -rf $(prefix)/docs/pslib/man
+
+$(prefix)/docs/pslib:
+	mkdir -p -m 755 $(prefix)/docs/pslib
+
+$(mandir)/man3:
+	mkdir -p -m 755 $(mandir)/man3
+
+$(datadir)/pslib:
+	mkdir -p -m 755 $(datadir)/pslib
+
+install-data-hook: $(datadir)/pslib
+	if [ `pwd`/share != $(datadir) ] ; then $(INSTALL) $(srcdir)/share/pslib/*.dat $(datadir)/pslib ; fi
+
+uninstall-hook:
+	if [ `pwd`/share/pslib != $(datadir) ] ; then rm -rf $(datadir) ; fi
+	rm -rf $(prefix)/docs/pslib/*
+
+CLEANFILES = $(prefix)/docs/pslib/*
+
+test: check
+
+distuninstallcheck_listfiles = \
+	`find . -name .packlist -or -name perllocal.pod -or -name pslib.bs -or -name pslib.so -or -name pslib.pm`
+
+distuninstallcheck:
+	@:
Index: /tags/ipp-1-X/bug123/psLib/Makefile.cvs
===================================================================
--- /tags/ipp-1-X/bug123/psLib/Makefile.cvs	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/Makefile.cvs	(revision 22331)
@@ -0,0 +1,9 @@
+default: all
+
+all:
+	if [ "`which glibtoolize 2> /dev/null`" != "" ] ; then glibtoolize --force ; else libtoolize --force ; fi
+	aclocal
+	autoheader
+	automake
+	autoconf
+
Index: /tags/ipp-1-X/bug123/psLib/README
===================================================================
--- /tags/ipp-1-X/bug123/psLib/README	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/README	(revision 22331)
@@ -0,0 +1,47 @@
+Pan-STARRS Image Processing Pipeline Library
+============================================
+
+The is psLib, the Pan-STARRS Image Processing Pipeline Library, a base
+collection of functions for the Pan-STARRS PS1 observatory.
+
+It was developed by the Maui High Performance Computing Center
+(http://www.mhpcc.edu) for the University of Hawai'i Institute for Astronomy
+(http://ifa.hawaii.edu).
+
+psLib is free software, you can redistribute it and/or modify it under
+the terms of the GNU General Public License.
+
+The GNU General Public License does not permit this software to be
+redistributed in proprietary programs.
+
+This library 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.
+
+Availability
+============
+
+The current version of psLib is always available from
+http://mhpcc.pan-starrs.org/code.
+
+Installation
+============
+
+psLib follows the standard GNU installation procedure.  Please consult
+the INSTALL file in this distribution for more detailed instructions.
+
+For information about specific platforms and compilers see the
+"Compilation Notes" section in the INSTALL file.
+
+More information about Pan-STARRS
+=================================
+
+The project homepage is http://www.pan-starrs.org.
+
+Reporting Bugs
+==============
+
+If you find a bug, please report it via the project's Bugzilla webpage at
+http://www.pan-starrs.org/bugzilla or email robert.desonia@mhpcc.hpc.mil.
+
+
Index: /tags/ipp-1-X/bug123/psLib/config.guess
===================================================================
--- /tags/ipp-1-X/bug123/psLib/config.guess	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/config.guess	(revision 22331)
@@ -0,0 +1,1411 @@
+#! /bin/sh
+# Attempt to guess a canonical system name.
+#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+#   2000, 2001, 2002, 2003 Free Software Foundation, Inc.
+
+timestamp='2003-06-17'
+
+# This file 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# Originally written by Per Bothner <per@bothner.com>.
+# Please send patches to <config-patches@gnu.org>.  Submit a context
+# diff and a properly formatted ChangeLog entry.
+#
+# This script attempts to guess a canonical system name similar to
+# config.sub.  If it succeeds, it prints the system name on stdout, and
+# exits with 0.  Otherwise, it exits with 1.
+#
+# The plan is that this can be called by configure scripts if you
+# don't specify an explicit build system type.
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION]
+
+Output the configuration name of the system \`$me' is run on.
+
+Operation modes:
+  -h, --help         print this help, then exit
+  -t, --time-stamp   print date of last modification, then exit
+  -v, --version      print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.guess ($timestamp)
+
+Originally written by Per Bothner.
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
+Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+  case $1 in
+    --time-stamp | --time* | -t )
+       echo "$timestamp" ; exit 0 ;;
+    --version | -v )
+       echo "$version" ; exit 0 ;;
+    --help | --h* | -h )
+       echo "$usage"; exit 0 ;;
+    -- )     # Stop option processing
+       shift; break ;;
+    - )	# Use stdin as input.
+       break ;;
+    -* )
+       echo "$me: invalid option $1$help" >&2
+       exit 1 ;;
+    * )
+       break ;;
+  esac
+done
+
+if test $# != 0; then
+  echo "$me: too many arguments$help" >&2
+  exit 1
+fi
+
+trap 'exit 1' 1 2 15
+
+# CC_FOR_BUILD -- compiler used by this script. Note that the use of a
+# compiler to aid in system detection is discouraged as it requires
+# temporary files to be created and, as you can see below, it is a
+# headache to deal with in a portable fashion.
+
+# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still
+# use `HOST_CC' if defined, but it is deprecated.
+
+# Portable tmp directory creation inspired by the Autoconf team.
+
+set_cc_for_build='
+trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ;
+trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ;
+: ${TMPDIR=/tmp} ;
+ { tmp=`(umask 077 && mktemp -d -q "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } ||
+ { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } ||
+ { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } ||
+ { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ;
+dummy=$tmp/dummy ;
+tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ;
+case $CC_FOR_BUILD,$HOST_CC,$CC in
+ ,,)    echo "int x;" > $dummy.c ;
+	for c in cc gcc c89 c99 ; do
+	  if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then
+	     CC_FOR_BUILD="$c"; break ;
+	  fi ;
+	done ;
+	if test x"$CC_FOR_BUILD" = x ; then
+	  CC_FOR_BUILD=no_compiler_found ;
+	fi
+	;;
+ ,,*)   CC_FOR_BUILD=$CC ;;
+ ,*,*)  CC_FOR_BUILD=$HOST_CC ;;
+esac ;'
+
+# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
+# (ghazi@noc.rutgers.edu 1994-08-24)
+if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
+	PATH=$PATH:/.attbin ; export PATH
+fi
+
+UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
+UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
+UNAME_SYSTEM=`(uname -s) 2>/dev/null`  || UNAME_SYSTEM=unknown
+UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
+
+## for Red Hat Linux
+if test -f /etc/redhat-release ; then
+    VENDOR=redhat ;
+else
+    VENDOR= ;
+fi
+
+# Note: order is significant - the case branches are not exclusive.
+
+case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
+    *:NetBSD:*:*)
+	# NetBSD (nbsd) targets should (where applicable) match one or
+	# more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*,
+	# *-*-netbsdecoff* and *-*-netbsd*.  For targets that recently
+	# switched to ELF, *-*-netbsd* would select the old
+	# object file format.  This provides both forward
+	# compatibility and a consistent mechanism for selecting the
+	# object file format.
+	#
+	# Note: NetBSD doesn't particularly care about the vendor
+	# portion of the name.  We always set it to "unknown".
+	sysctl="sysctl -n hw.machine_arch"
+	UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \
+	    /usr/sbin/$sysctl 2>/dev/null || echo unknown)`
+	case "${UNAME_MACHINE_ARCH}" in
+	    armeb) machine=armeb-unknown ;;
+	    arm*) machine=arm-unknown ;;
+	    sh3el) machine=shl-unknown ;;
+	    sh3eb) machine=sh-unknown ;;
+	    *) machine=${UNAME_MACHINE_ARCH}-unknown ;;
+	esac
+	# The Operating System including object format, if it has switched
+	# to ELF recently, or will in the future.
+	case "${UNAME_MACHINE_ARCH}" in
+	    arm*|i386|m68k|ns32k|sh3*|sparc|vax)
+		eval $set_cc_for_build
+		if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
+			| grep __ELF__ >/dev/null
+		then
+		    # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
+		    # Return netbsd for either.  FIX?
+		    os=netbsd
+		else
+		    os=netbsdelf
+		fi
+		;;
+	    *)
+	        os=netbsd
+		;;
+	esac
+	# The OS release
+	# Debian GNU/NetBSD machines have a different userland, and
+	# thus, need a distinct triplet. However, they do not need
+	# kernel version information, so it can be replaced with a
+	# suitable tag, in the style of linux-gnu.
+	case "${UNAME_VERSION}" in
+	    Debian*)
+		release='-gnu'
+		;;
+	    *)
+		release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+		;;
+	esac
+	# Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
+	# contains redundant information, the shorter form:
+	# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
+	echo "${machine}-${os}${release}"
+	exit 0 ;;
+    amiga:OpenBSD:*:*)
+	echo m68k-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    arc:OpenBSD:*:*)
+	echo mipsel-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    hp300:OpenBSD:*:*)
+	echo m68k-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    mac68k:OpenBSD:*:*)
+	echo m68k-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    macppc:OpenBSD:*:*)
+	echo powerpc-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    mvme68k:OpenBSD:*:*)
+	echo m68k-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    mvme88k:OpenBSD:*:*)
+	echo m88k-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    mvmeppc:OpenBSD:*:*)
+	echo powerpc-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    pmax:OpenBSD:*:*)
+	echo mipsel-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    sgi:OpenBSD:*:*)
+	echo mipseb-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    sun3:OpenBSD:*:*)
+	echo m68k-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    wgrisc:OpenBSD:*:*)
+	echo mipsel-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    *:OpenBSD:*:*)
+	echo ${UNAME_MACHINE}-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    alpha:OSF1:*:*)
+	if test $UNAME_RELEASE = "V4.0"; then
+		UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
+	fi
+	# According to Compaq, /usr/sbin/psrinfo has been available on
+	# OSF/1 and Tru64 systems produced since 1995.  I hope that
+	# covers most systems running today.  This code pipes the CPU
+	# types through head -n 1, so we only detect the type of CPU 0.
+	ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^  The alpha \(.*\) processor.*$/\1/p' | head -n 1`
+	case "$ALPHA_CPU_TYPE" in
+	    "EV4 (21064)")
+		UNAME_MACHINE="alpha" ;;
+	    "EV4.5 (21064)")
+		UNAME_MACHINE="alpha" ;;
+	    "LCA4 (21066/21068)")
+		UNAME_MACHINE="alpha" ;;
+	    "EV5 (21164)")
+		UNAME_MACHINE="alphaev5" ;;
+	    "EV5.6 (21164A)")
+		UNAME_MACHINE="alphaev56" ;;
+	    "EV5.6 (21164PC)")
+		UNAME_MACHINE="alphapca56" ;;
+	    "EV5.7 (21164PC)")
+		UNAME_MACHINE="alphapca57" ;;
+	    "EV6 (21264)")
+		UNAME_MACHINE="alphaev6" ;;
+	    "EV6.7 (21264A)")
+		UNAME_MACHINE="alphaev67" ;;
+	    "EV6.8CB (21264C)")
+		UNAME_MACHINE="alphaev68" ;;
+	    "EV6.8AL (21264B)")
+		UNAME_MACHINE="alphaev68" ;;
+	    "EV6.8CX (21264D)")
+		UNAME_MACHINE="alphaev68" ;;
+	    "EV6.9A (21264/EV69A)")
+		UNAME_MACHINE="alphaev69" ;;
+	    "EV7 (21364)")
+		UNAME_MACHINE="alphaev7" ;;
+	    "EV7.9 (21364A)")
+		UNAME_MACHINE="alphaev79" ;;
+	esac
+	# A Vn.n version is a released version.
+	# A Tn.n version is a released field test version.
+	# A Xn.n version is an unreleased experimental baselevel.
+	# 1.2 uses "1.2" for uname -r.
+	echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[VTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+	exit 0 ;;
+    Alpha*:OpenVMS:*:*)
+	echo alpha-hp-vms
+	exit 0 ;;
+    Alpha\ *:Windows_NT*:*)
+	# How do we know it's Interix rather than the generic POSIX subsystem?
+	# Should we change UNAME_MACHINE based on the output of uname instead
+	# of the specific Alpha model?
+	echo alpha-pc-interix
+	exit 0 ;;
+    21064:Windows_NT:50:3)
+	echo alpha-dec-winnt3.5
+	exit 0 ;;
+    Amiga*:UNIX_System_V:4.0:*)
+	echo m68k-unknown-sysv4
+	exit 0;;
+    *:[Aa]miga[Oo][Ss]:*:*)
+	echo ${UNAME_MACHINE}-unknown-amigaos
+	exit 0 ;;
+    *:[Mm]orph[Oo][Ss]:*:*)
+	echo ${UNAME_MACHINE}-unknown-morphos
+	exit 0 ;;
+    *:OS/390:*:*)
+	echo i370-ibm-openedition
+	exit 0 ;;
+    arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
+	echo arm-acorn-riscix${UNAME_RELEASE}
+	exit 0;;
+    SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
+	echo hppa1.1-hitachi-hiuxmpp
+	exit 0;;
+    Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
+	# akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
+	if test "`(/bin/universe) 2>/dev/null`" = att ; then
+		echo pyramid-pyramid-sysv3
+	else
+		echo pyramid-pyramid-bsd
+	fi
+	exit 0 ;;
+    NILE*:*:*:dcosx)
+	echo pyramid-pyramid-svr4
+	exit 0 ;;
+    DRS?6000:unix:4.0:6*)
+	echo sparc-icl-nx6
+	exit 0 ;;
+    DRS?6000:UNIX_SV:4.2*:7*)
+	case `/usr/bin/uname -p` in
+	    sparc) echo sparc-icl-nx7 && exit 0 ;;
+	esac ;;
+    sun4H:SunOS:5.*:*)
+	echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit 0 ;;
+    sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
+	echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit 0 ;;
+    i86pc:SunOS:5.*:*)
+	echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit 0 ;;
+    sun4*:SunOS:6*:*)
+	# According to config.sub, this is the proper way to canonicalize
+	# SunOS6.  Hard to guess exactly what SunOS6 will be like, but
+	# it's likely to be more like Solaris than SunOS4.
+	echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit 0 ;;
+    sun4*:SunOS:*:*)
+	case "`/usr/bin/arch -k`" in
+	    Series*|S4*)
+		UNAME_RELEASE=`uname -v`
+		;;
+	esac
+	# Japanese Language versions have a version number like `4.1.3-JL'.
+	echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`
+	exit 0 ;;
+    sun3*:SunOS:*:*)
+	echo m68k-sun-sunos${UNAME_RELEASE}
+	exit 0 ;;
+    sun*:*:4.2BSD:*)
+	UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
+	test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3
+	case "`/bin/arch`" in
+	    sun3)
+		echo m68k-sun-sunos${UNAME_RELEASE}
+		;;
+	    sun4)
+		echo sparc-sun-sunos${UNAME_RELEASE}
+		;;
+	esac
+	exit 0 ;;
+    aushp:SunOS:*:*)
+	echo sparc-auspex-sunos${UNAME_RELEASE}
+	exit 0 ;;
+    # The situation for MiNT is a little confusing.  The machine name
+    # can be virtually everything (everything which is not
+    # "atarist" or "atariste" at least should have a processor
+    # > m68000).  The system name ranges from "MiNT" over "FreeMiNT"
+    # to the lowercase version "mint" (or "freemint").  Finally
+    # the system name "TOS" denotes a system which is actually not
+    # MiNT.  But MiNT is downward compatible to TOS, so this should
+    # be no problem.
+    atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
+        echo m68k-atari-mint${UNAME_RELEASE}
+	exit 0 ;;
+    atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
+	echo m68k-atari-mint${UNAME_RELEASE}
+        exit 0 ;;
+    *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
+        echo m68k-atari-mint${UNAME_RELEASE}
+	exit 0 ;;
+    milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
+        echo m68k-milan-mint${UNAME_RELEASE}
+        exit 0 ;;
+    hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
+        echo m68k-hades-mint${UNAME_RELEASE}
+        exit 0 ;;
+    *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
+        echo m68k-unknown-mint${UNAME_RELEASE}
+        exit 0 ;;
+    powerpc:machten:*:*)
+	echo powerpc-apple-machten${UNAME_RELEASE}
+	exit 0 ;;
+    RISC*:Mach:*:*)
+	echo mips-dec-mach_bsd4.3
+	exit 0 ;;
+    RISC*:ULTRIX:*:*)
+	echo mips-dec-ultrix${UNAME_RELEASE}
+	exit 0 ;;
+    VAX*:ULTRIX*:*:*)
+	echo vax-dec-ultrix${UNAME_RELEASE}
+	exit 0 ;;
+    2020:CLIX:*:* | 2430:CLIX:*:*)
+	echo clipper-intergraph-clix${UNAME_RELEASE}
+	exit 0 ;;
+    mips:*:*:UMIPS | mips:*:*:RISCos)
+	eval $set_cc_for_build
+	sed 's/^	//' << EOF >$dummy.c
+#ifdef __cplusplus
+#include <stdio.h>  /* for printf() prototype */
+	int main (int argc, char *argv[]) {
+#else
+	int main (argc, argv) int argc; char *argv[]; {
+#endif
+	#if defined (host_mips) && defined (MIPSEB)
+	#if defined (SYSTYPE_SYSV)
+	  printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0);
+	#endif
+	#if defined (SYSTYPE_SVR4)
+	  printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0);
+	#endif
+	#if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
+	  printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0);
+	#endif
+	#endif
+	  exit (-1);
+	}
+EOF
+	$CC_FOR_BUILD -o $dummy $dummy.c \
+	  && $dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \
+	  && exit 0
+	echo mips-mips-riscos${UNAME_RELEASE}
+	exit 0 ;;
+    Motorola:PowerMAX_OS:*:*)
+	echo powerpc-motorola-powermax
+	exit 0 ;;
+    Motorola:*:4.3:PL8-*)
+	echo powerpc-harris-powermax
+	exit 0 ;;
+    Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*)
+	echo powerpc-harris-powermax
+	exit 0 ;;
+    Night_Hawk:Power_UNIX:*:*)
+	echo powerpc-harris-powerunix
+	exit 0 ;;
+    m88k:CX/UX:7*:*)
+	echo m88k-harris-cxux7
+	exit 0 ;;
+    m88k:*:4*:R4*)
+	echo m88k-motorola-sysv4
+	exit 0 ;;
+    m88k:*:3*:R3*)
+	echo m88k-motorola-sysv3
+	exit 0 ;;
+    AViiON:dgux:*:*)
+        # DG/UX returns AViiON for all architectures
+        UNAME_PROCESSOR=`/usr/bin/uname -p`
+	if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ]
+	then
+	    if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \
+	       [ ${TARGET_BINARY_INTERFACE}x = x ]
+	    then
+		echo m88k-dg-dgux${UNAME_RELEASE}
+	    else
+		echo m88k-dg-dguxbcs${UNAME_RELEASE}
+	    fi
+	else
+	    echo i586-dg-dgux${UNAME_RELEASE}
+	fi
+ 	exit 0 ;;
+    M88*:DolphinOS:*:*)	# DolphinOS (SVR3)
+	echo m88k-dolphin-sysv3
+	exit 0 ;;
+    M88*:*:R3*:*)
+	# Delta 88k system running SVR3
+	echo m88k-motorola-sysv3
+	exit 0 ;;
+    XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
+	echo m88k-tektronix-sysv3
+	exit 0 ;;
+    Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
+	echo m68k-tektronix-bsd
+	exit 0 ;;
+    *:IRIX*:*:*)
+	echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
+	exit 0 ;;
+    ????????:AIX?:[12].1:2)   # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
+	echo romp-ibm-aix      # uname -m gives an 8 hex-code CPU id
+	exit 0 ;;              # Note that: echo "'`uname -s`'" gives 'AIX '
+    i*86:AIX:*:*)
+	echo i386-ibm-aix
+	exit 0 ;;
+    ia64:AIX:*:*)
+	if [ -x /usr/bin/oslevel ] ; then
+		IBM_REV=`/usr/bin/oslevel`
+	else
+		IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+	fi
+	echo ${UNAME_MACHINE}-ibm-aix${IBM_REV}
+	exit 0 ;;
+    *:AIX:2:3)
+	if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
+		eval $set_cc_for_build
+		sed 's/^		//' << EOF >$dummy.c
+		#include <sys/systemcfg.h>
+
+		main()
+			{
+			if (!__power_pc())
+				exit(1);
+			puts("powerpc-ibm-aix3.2.5");
+			exit(0);
+			}
+EOF
+		$CC_FOR_BUILD -o $dummy $dummy.c && $dummy && exit 0
+		echo rs6000-ibm-aix3.2.5
+	elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
+		echo rs6000-ibm-aix3.2.4
+	else
+		echo rs6000-ibm-aix3.2
+	fi
+	exit 0 ;;
+    *:AIX:*:[45])
+	IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`
+	if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then
+		IBM_ARCH=rs6000
+	else
+		IBM_ARCH=powerpc
+	fi
+	if [ -x /usr/bin/oslevel ] ; then
+		IBM_REV=`/usr/bin/oslevel`
+	else
+		IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+	fi
+	echo ${IBM_ARCH}-ibm-aix${IBM_REV}
+	exit 0 ;;
+    *:AIX:*:*)
+	echo rs6000-ibm-aix
+	exit 0 ;;
+    ibmrt:4.4BSD:*|romp-ibm:BSD:*)
+	echo romp-ibm-bsd4.4
+	exit 0 ;;
+    ibmrt:*BSD:*|romp-ibm:BSD:*)            # covers RT/PC BSD and
+	echo romp-ibm-bsd${UNAME_RELEASE}   # 4.3 with uname added to
+	exit 0 ;;                           # report: romp-ibm BSD 4.3
+    *:BOSX:*:*)
+	echo rs6000-bull-bosx
+	exit 0 ;;
+    DPX/2?00:B.O.S.:*:*)
+	echo m68k-bull-sysv3
+	exit 0 ;;
+    9000/[34]??:4.3bsd:1.*:*)
+	echo m68k-hp-bsd
+	exit 0 ;;
+    hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
+	echo m68k-hp-bsd4.4
+	exit 0 ;;
+    9000/[34678]??:HP-UX:*:*)
+	HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+	case "${UNAME_MACHINE}" in
+	    9000/31? )            HP_ARCH=m68000 ;;
+	    9000/[34]?? )         HP_ARCH=m68k ;;
+	    9000/[678][0-9][0-9])
+		if [ -x /usr/bin/getconf ]; then
+		    sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
+                    sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
+                    case "${sc_cpu_version}" in
+                      523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0
+                      528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1
+                      532)                      # CPU_PA_RISC2_0
+                        case "${sc_kernel_bits}" in
+                          32) HP_ARCH="hppa2.0n" ;;
+                          64) HP_ARCH="hppa2.0w" ;;
+			  '') HP_ARCH="hppa2.0" ;;   # HP-UX 10.20
+                        esac ;;
+                    esac
+		fi
+		if [ "${HP_ARCH}" = "" ]; then
+		    eval $set_cc_for_build
+		    sed 's/^              //' << EOF >$dummy.c
+
+              #define _HPUX_SOURCE
+              #include <stdlib.h>
+              #include <unistd.h>
+
+              int main ()
+              {
+              #if defined(_SC_KERNEL_BITS)
+                  long bits = sysconf(_SC_KERNEL_BITS);
+              #endif
+                  long cpu  = sysconf (_SC_CPU_VERSION);
+
+                  switch (cpu)
+              	{
+              	case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
+              	case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
+              	case CPU_PA_RISC2_0:
+              #if defined(_SC_KERNEL_BITS)
+              	    switch (bits)
+              		{
+              		case 64: puts ("hppa2.0w"); break;
+              		case 32: puts ("hppa2.0n"); break;
+              		default: puts ("hppa2.0"); break;
+              		} break;
+              #else  /* !defined(_SC_KERNEL_BITS) */
+              	    puts ("hppa2.0"); break;
+              #endif
+              	default: puts ("hppa1.0"); break;
+              	}
+                  exit (0);
+              }
+EOF
+		    (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy`
+		    test -z "$HP_ARCH" && HP_ARCH=hppa
+		fi ;;
+	esac
+	if [ ${HP_ARCH} = "hppa2.0w" ]
+	then
+	    # avoid double evaluation of $set_cc_for_build
+	    test -n "$CC_FOR_BUILD" || eval $set_cc_for_build
+	    if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E -) | grep __LP64__ >/dev/null
+	    then
+		HP_ARCH="hppa2.0w"
+	    else
+		HP_ARCH="hppa64"
+	    fi
+	fi
+	echo ${HP_ARCH}-hp-hpux${HPUX_REV}
+	exit 0 ;;
+    ia64:HP-UX:*:*)
+	HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+	echo ia64-hp-hpux${HPUX_REV}
+	exit 0 ;;
+    3050*:HI-UX:*:*)
+	eval $set_cc_for_build
+	sed 's/^	//' << EOF >$dummy.c
+	#include <unistd.h>
+	int
+	main ()
+	{
+	  long cpu = sysconf (_SC_CPU_VERSION);
+	  /* The order matters, because CPU_IS_HP_MC68K erroneously returns
+	     true for CPU_PA_RISC1_0.  CPU_IS_PA_RISC returns correct
+	     results, however.  */
+	  if (CPU_IS_PA_RISC (cpu))
+	    {
+	      switch (cpu)
+		{
+		  case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
+		  case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
+		  case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
+		  default: puts ("hppa-hitachi-hiuxwe2"); break;
+		}
+	    }
+	  else if (CPU_IS_HP_MC68K (cpu))
+	    puts ("m68k-hitachi-hiuxwe2");
+	  else puts ("unknown-hitachi-hiuxwe2");
+	  exit (0);
+	}
+EOF
+	$CC_FOR_BUILD -o $dummy $dummy.c && $dummy && exit 0
+	echo unknown-hitachi-hiuxwe2
+	exit 0 ;;
+    9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
+	echo hppa1.1-hp-bsd
+	exit 0 ;;
+    9000/8??:4.3bsd:*:*)
+	echo hppa1.0-hp-bsd
+	exit 0 ;;
+    *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
+	echo hppa1.0-hp-mpeix
+	exit 0 ;;
+    hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
+	echo hppa1.1-hp-osf
+	exit 0 ;;
+    hp8??:OSF1:*:*)
+	echo hppa1.0-hp-osf
+	exit 0 ;;
+    i*86:OSF1:*:*)
+	if [ -x /usr/sbin/sysversion ] ; then
+	    echo ${UNAME_MACHINE}-unknown-osf1mk
+	else
+	    echo ${UNAME_MACHINE}-unknown-osf1
+	fi
+	exit 0 ;;
+    parisc*:Lites*:*:*)
+	echo hppa1.1-hp-lites
+	exit 0 ;;
+    C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
+	echo c1-convex-bsd
+        exit 0 ;;
+    C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
+	if getsysinfo -f scalar_acc
+	then echo c32-convex-bsd
+	else echo c2-convex-bsd
+	fi
+        exit 0 ;;
+    C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
+	echo c34-convex-bsd
+        exit 0 ;;
+    C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
+	echo c38-convex-bsd
+        exit 0 ;;
+    C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
+	echo c4-convex-bsd
+        exit 0 ;;
+    CRAY*Y-MP:*:*:*)
+	echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit 0 ;;
+    CRAY*[A-Z]90:*:*:*)
+	echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
+	| sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
+	      -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \
+	      -e 's/\.[^.]*$/.X/'
+	exit 0 ;;
+    CRAY*TS:*:*:*)
+	echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit 0 ;;
+    CRAY*T3E:*:*:*)
+	echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit 0 ;;
+    CRAY*SV1:*:*:*)
+	echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit 0 ;;
+    *:UNICOS/mp:*:*)
+	echo nv1-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' 
+	exit 0 ;;
+    F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
+	FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+        FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+        FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
+        echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+        exit 0 ;;
+    i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
+	echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
+	exit 0 ;;
+    sparc*:BSD/OS:*:*)
+	echo sparc-unknown-bsdi${UNAME_RELEASE}
+	exit 0 ;;
+    *:BSD/OS:*:*)
+	echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
+	exit 0 ;;
+    *:FreeBSD:*:*|*:GNU/FreeBSD:*:*)
+	# Determine whether the default compiler uses glibc.
+	eval $set_cc_for_build
+	sed 's/^	//' << EOF >$dummy.c
+	#include <features.h>
+	#if __GLIBC__ >= 2
+	LIBC=gnu
+	#else
+	LIBC=
+	#endif
+EOF
+	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=`
+	echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`${LIBC:+-$LIBC}
+	exit 0 ;;
+    i*:CYGWIN*:*)
+	echo ${UNAME_MACHINE}-pc-cygwin
+	exit 0 ;;
+    i*:MINGW*:*)
+	echo ${UNAME_MACHINE}-pc-mingw32
+	exit 0 ;;
+    i*:PW*:*)
+	echo ${UNAME_MACHINE}-pc-pw32
+	exit 0 ;;
+    x86:Interix*:[34]*)
+	echo i586-pc-interix${UNAME_RELEASE}|sed -e 's/\..*//'
+	exit 0 ;;
+    [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*)
+	echo i${UNAME_MACHINE}-pc-mks
+	exit 0 ;;
+    i*:Windows_NT*:* | Pentium*:Windows_NT*:*)
+	# How do we know it's Interix rather than the generic POSIX subsystem?
+	# It also conflicts with pre-2.0 versions of AT&T UWIN. Should we
+	# UNAME_MACHINE based on the output of uname instead of i386?
+	echo i586-pc-interix
+	exit 0 ;;
+    i*:UWIN*:*)
+	echo ${UNAME_MACHINE}-pc-uwin
+	exit 0 ;;
+    p*:CYGWIN*:*)
+	echo powerpcle-unknown-cygwin
+	exit 0 ;;
+    prep*:SunOS:5.*:*)
+	echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit 0 ;;
+    *:GNU:*:*)
+	echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
+	exit 0 ;;
+    i*86:Minix:*:*)
+	echo ${UNAME_MACHINE}-pc-minix
+	exit 0 ;;
+    arm*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit 0 ;;
+    cris:Linux:*:*)
+	echo cris-axis-linux-gnu
+	exit 0 ;;
+    ia64:Linux:*:*)
+	echo ${UNAME_MACHINE}-${VENDOR:-unknown}-linux-gnu
+	exit 0 ;;
+    m68*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit 0 ;;
+    mips:Linux:*:*)
+	eval $set_cc_for_build
+	sed 's/^	//' << EOF >$dummy.c
+	#undef CPU
+	#undef mips
+	#undef mipsel
+	#if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
+	CPU=mipsel
+	#else
+	#if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
+	CPU=mips
+	#else
+	CPU=
+	#endif
+	#endif
+EOF
+	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=`
+	test x"${CPU}" != x && echo "${CPU}-unknown-linux-gnu" && exit 0
+	;;
+    mips64:Linux:*:*)
+	eval $set_cc_for_build
+	sed 's/^	//' << EOF >$dummy.c
+	#undef CPU
+	#undef mips64
+	#undef mips64el
+	#if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
+	CPU=mips64el
+	#else
+	#if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
+	CPU=mips64
+	#else
+	CPU=
+	#endif
+	#endif
+EOF
+	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=`
+	test x"${CPU}" != x && echo "${CPU}-unknown-linux-gnu" && exit 0
+	;;
+    ppc:Linux:*:*)
+	echo powerpc-${VENDOR:-unknown}-linux-gnu
+	exit 0 ;;
+    ppc64:Linux:*:*)
+	echo powerpc64-${VENDOR:-unknown}-linux-gnu
+	exit 0 ;;
+    alpha:Linux:*:*)
+	case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
+	  EV5)   UNAME_MACHINE=alphaev5 ;;
+	  EV56)  UNAME_MACHINE=alphaev56 ;;
+	  PCA56) UNAME_MACHINE=alphapca56 ;;
+	  PCA57) UNAME_MACHINE=alphapca56 ;;
+	  EV6)   UNAME_MACHINE=alphaev6 ;;
+	  EV67)  UNAME_MACHINE=alphaev67 ;;
+	  EV68*) UNAME_MACHINE=alphaev68 ;;
+        esac
+	objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null
+	if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi
+	echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}
+	exit 0 ;;
+    parisc:Linux:*:* | hppa:Linux:*:*)
+	# Look for CPU level
+	case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
+	  PA7*) echo hppa1.1-unknown-linux-gnu ;;
+	  PA8*) echo hppa2.0-unknown-linux-gnu ;;
+	  *)    echo hppa-unknown-linux-gnu ;;
+	esac
+	exit 0 ;;
+    parisc64:Linux:*:* | hppa64:Linux:*:*)
+	echo hppa64-unknown-linux-gnu
+	exit 0 ;;
+    s390:Linux:*:* | s390x:Linux:*:*)
+	echo ${UNAME_MACHINE}-${VENDOR:-ibm}-linux-gnu
+	exit 0 ;;
+    sh64*:Linux:*:*)
+    	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit 0 ;;
+    sh*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit 0 ;;
+    sparc:Linux:*:* | sparc64:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit 0 ;;
+    x86_64:Linux:*:*)
+	echo x86_64-${VENDOR:-unknown}-linux-gnu
+	exit 0 ;;
+    i*86:Linux:*:*)
+	# The BFD linker knows what the default object file format is, so
+	# first see if it will tell us. cd to the root directory to prevent
+	# problems with other programs or directories called `ld' in the path.
+	# Set LC_ALL=C to ensure ld outputs messages in English.
+	ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \
+			 | sed -ne '/supported targets:/!d
+				    s/[ 	][ 	]*/ /g
+				    s/.*supported targets: *//
+				    s/ .*//
+				    p'`
+        case "$ld_supported_targets" in
+	  elf32-i386)
+		TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu"
+		;;
+	  a.out-i386-linux)
+		echo "${UNAME_MACHINE}-pc-linux-gnuaout"
+		exit 0 ;;
+	  coff-i386)
+		echo "${UNAME_MACHINE}-pc-linux-gnucoff"
+		exit 0 ;;
+	  "")
+		# Either a pre-BFD a.out linker (linux-gnuoldld) or
+		# one that does not give us useful --help.
+		echo "${UNAME_MACHINE}-pc-linux-gnuoldld"
+		exit 0 ;;
+	esac
+	# Determine whether the default compiler is a.out or elf
+	eval $set_cc_for_build
+	sed 's/^	//' << EOF >$dummy.c
+	#include <features.h>
+	#ifdef __ELF__
+	# ifdef __GLIBC__
+	#  if __GLIBC__ >= 2
+	LIBC=gnu
+	#  else
+	LIBC=gnulibc1
+	#  endif
+	# else
+	LIBC=gnulibc1
+	# endif
+	#else
+	#ifdef __INTEL_COMPILER
+	LIBC=gnu
+	#else
+	LIBC=gnuaout
+	#endif
+	#endif
+EOF
+	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=`
+	test x"${LIBC}" != x && echo "${UNAME_MACHINE}-${VENDOR:-pc}-linux-${LIBC}" && exit 0
+	test x"${TENTATIVE}" != x && echo "${TENTATIVE}" && exit 0
+	;;
+    i*86:DYNIX/ptx:4*:*)
+	# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
+	# earlier versions are messed up and put the nodename in both
+	# sysname and nodename.
+	echo i386-sequent-sysv4
+	exit 0 ;;
+    i*86:UNIX_SV:4.2MP:2.*)
+        # Unixware is an offshoot of SVR4, but it has its own version
+        # number series starting with 2...
+        # I am not positive that other SVR4 systems won't match this,
+	# I just have to hope.  -- rms.
+        # Use sysv4.2uw... so that sysv4* matches it.
+	echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
+	exit 0 ;;
+    i*86:OS/2:*:*)
+	# If we were able to find `uname', then EMX Unix compatibility
+	# is probably installed.
+	echo ${UNAME_MACHINE}-pc-os2-emx
+	exit 0 ;;
+    i*86:XTS-300:*:STOP)
+	echo ${UNAME_MACHINE}-unknown-stop
+	exit 0 ;;
+    i*86:atheos:*:*)
+	echo ${UNAME_MACHINE}-unknown-atheos
+	exit 0 ;;
+    i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*)
+	echo i386-unknown-lynxos${UNAME_RELEASE}
+	exit 0 ;;
+    i*86:*DOS:*:*)
+	echo ${UNAME_MACHINE}-pc-msdosdjgpp
+	exit 0 ;;
+    i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*)
+	UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'`
+	if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
+		echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL}
+	else
+		echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL}
+	fi
+	exit 0 ;;
+    i*86:*:5:[78]*)
+	case `/bin/uname -X | grep "^Machine"` in
+	    *486*)	     UNAME_MACHINE=i486 ;;
+	    *Pentium)	     UNAME_MACHINE=i586 ;;
+	    *Pent*|*Celeron) UNAME_MACHINE=i686 ;;
+	esac
+	echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}
+	exit 0 ;;
+    i*86:*:3.2:*)
+	if test -f /usr/options/cb.name; then
+		UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
+		echo ${UNAME_MACHINE}-pc-isc$UNAME_REL
+	elif /bin/uname -X 2>/dev/null >/dev/null ; then
+		UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')`
+		(/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486
+		(/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \
+			&& UNAME_MACHINE=i586
+		(/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \
+			&& UNAME_MACHINE=i686
+		(/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \
+			&& UNAME_MACHINE=i686
+		echo ${UNAME_MACHINE}-pc-sco$UNAME_REL
+	else
+		echo ${UNAME_MACHINE}-pc-sysv32
+	fi
+	exit 0 ;;
+    pc:*:*:*)
+	# Left here for compatibility:
+        # uname -m prints for DJGPP always 'pc', but it prints nothing about
+        # the processor, so we play safe by assuming i386.
+	echo i386-pc-msdosdjgpp
+        exit 0 ;;
+    Intel:Mach:3*:*)
+	echo i386-pc-mach3
+	exit 0 ;;
+    paragon:*:*:*)
+	echo i860-intel-osf1
+	exit 0 ;;
+    i860:*:4.*:*) # i860-SVR4
+	if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
+	  echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4
+	else # Add other i860-SVR4 vendors below as they are discovered.
+	  echo i860-unknown-sysv${UNAME_RELEASE}  # Unknown i860-SVR4
+	fi
+	exit 0 ;;
+    mini*:CTIX:SYS*5:*)
+	# "miniframe"
+	echo m68010-convergent-sysv
+	exit 0 ;;
+    mc68k:UNIX:SYSTEM5:3.51m)
+	echo m68k-convergent-sysv
+	exit 0 ;;
+    M680?0:D-NIX:5.3:*)
+	echo m68k-diab-dnix
+	exit 0 ;;
+    M68*:*:R3V[567]*:*)
+	test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;;
+    3[34]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0)
+	OS_REL=''
+	test -r /etc/.relid \
+	&& OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+	  && echo i486-ncr-sysv4.3${OS_REL} && exit 0
+	/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+	  && echo i586-ncr-sysv4.3${OS_REL} && exit 0 ;;
+    3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
+        /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+          && echo i486-ncr-sysv4 && exit 0 ;;
+    m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
+	echo m68k-unknown-lynxos${UNAME_RELEASE}
+	exit 0 ;;
+    mc68030:UNIX_System_V:4.*:*)
+	echo m68k-atari-sysv4
+	exit 0 ;;
+    TSUNAMI:LynxOS:2.*:*)
+	echo sparc-unknown-lynxos${UNAME_RELEASE}
+	exit 0 ;;
+    rs6000:LynxOS:2.*:*)
+	echo rs6000-unknown-lynxos${UNAME_RELEASE}
+	exit 0 ;;
+    PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*)
+	echo powerpc-unknown-lynxos${UNAME_RELEASE}
+	exit 0 ;;
+    SM[BE]S:UNIX_SV:*:*)
+	echo mips-dde-sysv${UNAME_RELEASE}
+	exit 0 ;;
+    RM*:ReliantUNIX-*:*:*)
+	echo mips-sni-sysv4
+	exit 0 ;;
+    RM*:SINIX-*:*:*)
+	echo mips-sni-sysv4
+	exit 0 ;;
+    *:SINIX-*:*:*)
+	if uname -p 2>/dev/null >/dev/null ; then
+		UNAME_MACHINE=`(uname -p) 2>/dev/null`
+		echo ${UNAME_MACHINE}-sni-sysv4
+	else
+		echo ns32k-sni-sysv
+	fi
+	exit 0 ;;
+    PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
+                      # says <Richard.M.Bartel@ccMail.Census.GOV>
+        echo i586-unisys-sysv4
+        exit 0 ;;
+    *:UNIX_System_V:4*:FTX*)
+	# From Gerald Hewes <hewes@openmarket.com>.
+	# How about differentiating between stratus architectures? -djm
+	echo hppa1.1-stratus-sysv4
+	exit 0 ;;
+    *:*:*:FTX*)
+	# From seanf@swdc.stratus.com.
+	echo i860-stratus-sysv4
+	exit 0 ;;
+    *:VOS:*:*)
+	# From Paul.Green@stratus.com.
+	echo hppa1.1-stratus-vos
+	exit 0 ;;
+    mc68*:A/UX:*:*)
+	echo m68k-apple-aux${UNAME_RELEASE}
+	exit 0 ;;
+    news*:NEWS-OS:6*:*)
+	echo mips-sony-newsos6
+	exit 0 ;;
+    R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
+	if [ -d /usr/nec ]; then
+	        echo mips-nec-sysv${UNAME_RELEASE}
+	else
+	        echo mips-unknown-sysv${UNAME_RELEASE}
+	fi
+        exit 0 ;;
+    BeBox:BeOS:*:*)	# BeOS running on hardware made by Be, PPC only.
+	echo powerpc-be-beos
+	exit 0 ;;
+    BeMac:BeOS:*:*)	# BeOS running on Mac or Mac clone, PPC only.
+	echo powerpc-apple-beos
+	exit 0 ;;
+    BePC:BeOS:*:*)	# BeOS running on Intel PC compatible.
+	echo i586-pc-beos
+	exit 0 ;;
+    SX-4:SUPER-UX:*:*)
+	echo sx4-nec-superux${UNAME_RELEASE}
+	exit 0 ;;
+    SX-5:SUPER-UX:*:*)
+	echo sx5-nec-superux${UNAME_RELEASE}
+	exit 0 ;;
+    SX-6:SUPER-UX:*:*)
+	echo sx6-nec-superux${UNAME_RELEASE}
+	exit 0 ;;
+    Power*:Rhapsody:*:*)
+	echo powerpc-apple-rhapsody${UNAME_RELEASE}
+	exit 0 ;;
+    *:Rhapsody:*:*)
+	echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}
+	exit 0 ;;
+    *:Darwin:*:*)
+	case `uname -p` in
+	    *86) UNAME_PROCESSOR=i686 ;;
+	    powerpc) UNAME_PROCESSOR=powerpc ;;
+	esac
+	echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}
+	exit 0 ;;
+    *:procnto*:*:* | *:QNX:[0123456789]*:*)
+	UNAME_PROCESSOR=`uname -p`
+	if test "$UNAME_PROCESSOR" = "x86"; then
+		UNAME_PROCESSOR=i386
+		UNAME_MACHINE=pc
+	fi
+	echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE}
+	exit 0 ;;
+    *:QNX:*:4*)
+	echo i386-pc-qnx
+	exit 0 ;;
+    NSR-[DGKLNPTVW]:NONSTOP_KERNEL:*:*)
+	echo nsr-tandem-nsk${UNAME_RELEASE}
+	exit 0 ;;
+    *:NonStop-UX:*:*)
+	echo mips-compaq-nonstopux
+	exit 0 ;;
+    BS2000:POSIX*:*:*)
+	echo bs2000-siemens-sysv
+	exit 0 ;;
+    DS/*:UNIX_System_V:*:*)
+	echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE}
+	exit 0 ;;
+    *:Plan9:*:*)
+	# "uname -m" is not consistent, so use $cputype instead. 386
+	# is converted to i386 for consistency with other x86
+	# operating systems.
+	if test "$cputype" = "386"; then
+	    UNAME_MACHINE=i386
+	else
+	    UNAME_MACHINE="$cputype"
+	fi
+	echo ${UNAME_MACHINE}-unknown-plan9
+	exit 0 ;;
+    *:TOPS-10:*:*)
+	echo pdp10-unknown-tops10
+	exit 0 ;;
+    *:TENEX:*:*)
+	echo pdp10-unknown-tenex
+	exit 0 ;;
+    KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
+	echo pdp10-dec-tops20
+	exit 0 ;;
+    XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
+	echo pdp10-xkl-tops20
+	exit 0 ;;
+    *:TOPS-20:*:*)
+	echo pdp10-unknown-tops20
+	exit 0 ;;
+    *:ITS:*:*)
+	echo pdp10-unknown-its
+	exit 0 ;;
+    SEI:*:*:SEIUX)
+        echo mips-sei-seiux${UNAME_RELEASE}
+	exit 0 ;;
+esac
+
+#echo '(No uname command or uname output not recognized.)' 1>&2
+#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
+
+eval $set_cc_for_build
+cat >$dummy.c <<EOF
+#ifdef _SEQUENT_
+# include <sys/types.h>
+# include <sys/utsname.h>
+#endif
+main ()
+{
+#if defined (sony)
+#if defined (MIPSEB)
+  /* BFD wants "bsd" instead of "newsos".  Perhaps BFD should be changed,
+     I don't know....  */
+  printf ("mips-sony-bsd\n"); exit (0);
+#else
+#include <sys/param.h>
+  printf ("m68k-sony-newsos%s\n",
+#ifdef NEWSOS4
+          "4"
+#else
+	  ""
+#endif
+         ); exit (0);
+#endif
+#endif
+
+#if defined (__arm) && defined (__acorn) && defined (__unix)
+  printf ("arm-acorn-riscix"); exit (0);
+#endif
+
+#if defined (hp300) && !defined (hpux)
+  printf ("m68k-hp-bsd\n"); exit (0);
+#endif
+
+#if defined (NeXT)
+#if !defined (__ARCHITECTURE__)
+#define __ARCHITECTURE__ "m68k"
+#endif
+  int version;
+  version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
+  if (version < 4)
+    printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
+  else
+    printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
+  exit (0);
+#endif
+
+#if defined (MULTIMAX) || defined (n16)
+#if defined (UMAXV)
+  printf ("ns32k-encore-sysv\n"); exit (0);
+#else
+#if defined (CMU)
+  printf ("ns32k-encore-mach\n"); exit (0);
+#else
+  printf ("ns32k-encore-bsd\n"); exit (0);
+#endif
+#endif
+#endif
+
+#if defined (__386BSD__)
+  printf ("i386-pc-bsd\n"); exit (0);
+#endif
+
+#if defined (sequent)
+#if defined (i386)
+  printf ("i386-sequent-dynix\n"); exit (0);
+#endif
+#if defined (ns32000)
+  printf ("ns32k-sequent-dynix\n"); exit (0);
+#endif
+#endif
+
+#if defined (_SEQUENT_)
+    struct utsname un;
+
+    uname(&un);
+
+    if (strncmp(un.version, "V2", 2) == 0) {
+	printf ("i386-sequent-ptx2\n"); exit (0);
+    }
+    if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
+	printf ("i386-sequent-ptx1\n"); exit (0);
+    }
+    printf ("i386-sequent-ptx\n"); exit (0);
+
+#endif
+
+#if defined (vax)
+# if !defined (ultrix)
+#  include <sys/param.h>
+#  if defined (BSD)
+#   if BSD == 43
+      printf ("vax-dec-bsd4.3\n"); exit (0);
+#   else
+#    if BSD == 199006
+      printf ("vax-dec-bsd4.3reno\n"); exit (0);
+#    else
+      printf ("vax-dec-bsd\n"); exit (0);
+#    endif
+#   endif
+#  else
+    printf ("vax-dec-bsd\n"); exit (0);
+#  endif
+# else
+    printf ("vax-dec-ultrix\n"); exit (0);
+# endif
+#endif
+
+#if defined (alliant) && defined (i860)
+  printf ("i860-alliant-bsd\n"); exit (0);
+#endif
+
+  exit (1);
+}
+EOF
+
+$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && $dummy && exit 0
+
+# Apollos put the system type in the environment.
+
+test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; }
+
+# Convex versions that predate uname can use getsysinfo(1)
+
+if [ -x /usr/convex/getsysinfo ]
+then
+    case `getsysinfo -f cpu_type` in
+    c1*)
+	echo c1-convex-bsd
+	exit 0 ;;
+    c2*)
+	if getsysinfo -f scalar_acc
+	then echo c32-convex-bsd
+	else echo c2-convex-bsd
+	fi
+	exit 0 ;;
+    c34*)
+	echo c34-convex-bsd
+	exit 0 ;;
+    c38*)
+	echo c38-convex-bsd
+	exit 0 ;;
+    c4*)
+	echo c4-convex-bsd
+	exit 0 ;;
+    esac
+fi
+
+cat >&2 <<EOF
+$0: unable to guess system type
+
+This script, last modified $timestamp, has failed to recognize
+the operating system you are using. It is advised that you
+download the most up to date version of the config scripts from
+
+    ftp://ftp.gnu.org/pub/gnu/config/
+
+If the version you run ($0) is already up to date, please
+send the following data and any information you think might be
+pertinent to <config-patches@gnu.org> in order to provide the needed
+information to handle your system.
+
+config.guess timestamp = $timestamp
+
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null`
+/bin/uname -X     = `(/bin/uname -X) 2>/dev/null`
+
+hostinfo               = `(hostinfo) 2>/dev/null`
+/bin/universe          = `(/bin/universe) 2>/dev/null`
+/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null`
+/bin/arch              = `(/bin/arch) 2>/dev/null`
+/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`
+
+UNAME_MACHINE = ${UNAME_MACHINE}
+UNAME_RELEASE = ${UNAME_RELEASE}
+UNAME_SYSTEM  = ${UNAME_SYSTEM}
+UNAME_VERSION = ${UNAME_VERSION}
+EOF
+
+exit 1
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
Index: /tags/ipp-1-X/bug123/psLib/config.sub
===================================================================
--- /tags/ipp-1-X/bug123/psLib/config.sub	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/config.sub	(revision 22331)
@@ -0,0 +1,1500 @@
+#! /bin/sh
+# Configuration validation subroutine script.
+#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+#   2000, 2001, 2002, 2003 Free Software Foundation, Inc.
+
+timestamp='2003-06-18'
+
+# This file is (in principle) common to ALL GNU software.
+# The presence of a machine in this file suggests that SOME GNU software
+# can handle that machine.  It does not imply ALL GNU software can.
+#
+# This file 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., 59 Temple Place - Suite 330,
+# Boston, MA 02111-1307, USA.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# Please send patches to <config-patches@gnu.org>.  Submit a context
+# diff and a properly formatted ChangeLog entry.
+#
+# Configuration subroutine to validate and canonicalize a configuration type.
+# Supply the specified configuration type as an argument.
+# If it is invalid, we print an error message on stderr and exit with code 1.
+# Otherwise, we print the canonical config type on stdout and succeed.
+
+# This file is supposed to be the same for all GNU packages
+# and recognize all the CPU types, system types and aliases
+# that are meaningful with *any* GNU software.
+# Each package is responsible for reporting which valid configurations
+# it does not support.  The user should be able to distinguish
+# a failure to support a valid configuration from a meaningless
+# configuration.
+
+# The goal of this file is to map all the various variations of a given
+# machine specification into a single specification in the form:
+#	CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or in some cases, the newer four-part form:
+#	CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+# It is wrong to echo any other type of specification.
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION] CPU-MFR-OPSYS
+       $0 [OPTION] ALIAS
+
+Canonicalize a configuration name.
+
+Operation modes:
+  -h, --help         print this help, then exit
+  -t, --time-stamp   print date of last modification, then exit
+  -v, --version      print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.sub ($timestamp)
+
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
+Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+  case $1 in
+    --time-stamp | --time* | -t )
+       echo "$timestamp" ; exit 0 ;;
+    --version | -v )
+       echo "$version" ; exit 0 ;;
+    --help | --h* | -h )
+       echo "$usage"; exit 0 ;;
+    -- )     # Stop option processing
+       shift; break ;;
+    - )	# Use stdin as input.
+       break ;;
+    -* )
+       echo "$me: invalid option $1$help"
+       exit 1 ;;
+
+    *local*)
+       # First pass through any local machine types.
+       echo $1
+       exit 0;;
+
+    * )
+       break ;;
+  esac
+done
+
+case $# in
+ 0) echo "$me: missing argument$help" >&2
+    exit 1;;
+ 1) ;;
+ *) echo "$me: too many arguments$help" >&2
+    exit 1;;
+esac
+
+# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
+# Here we must recognize all the valid KERNEL-OS combinations.
+maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
+case $maybe_os in
+  nto-qnx* | linux-gnu* | freebsd*-gnu* | netbsd*-gnu* | storm-chaos* | os2-emx* | rtmk-nova*)
+    os=-$maybe_os
+    basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
+    ;;
+  *)
+    basic_machine=`echo $1 | sed 's/-[^-]*$//'`
+    if [ $basic_machine != $1 ]
+    then os=`echo $1 | sed 's/.*-/-/'`
+    else os=; fi
+    ;;
+esac
+
+### Let's recognize common machines as not being operating systems so
+### that things like config.sub decstation-3100 work.  We also
+### recognize some manufacturers as not being operating systems, so we
+### can provide default operating systems below.
+case $os in
+	-sun*os*)
+		# Prevent following clause from handling this invalid input.
+		;;
+	-dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \
+	-att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \
+	-unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \
+	-convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
+	-c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
+	-harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
+	-apple | -axis)
+		os=
+		basic_machine=$1
+		;;
+	-sim | -cisco | -oki | -wec | -winbond)
+		os=
+		basic_machine=$1
+		;;
+	-scout)
+		;;
+	-wrs)
+		os=-vxworks
+		basic_machine=$1
+		;;
+	-chorusos*)
+		os=-chorusos
+		basic_machine=$1
+		;;
+ 	-chorusrdb)
+ 		os=-chorusrdb
+		basic_machine=$1
+ 		;;
+	-hiux*)
+		os=-hiuxwe2
+		;;
+	-sco5)
+		os=-sco3.2v5
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco4)
+		os=-sco3.2v4
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco3.2.[4-9]*)
+		os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco3.2v[4-9]*)
+		# Don't forget version if it is 3.2v4 or newer.
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco*)
+		os=-sco3.2v2
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-udk*)
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-isc)
+		os=-isc2.2
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-clix*)
+		basic_machine=clipper-intergraph
+		;;
+	-isc*)
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-lynx*)
+		os=-lynxos
+		;;
+	-ptx*)
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
+		;;
+	-windowsnt*)
+		os=`echo $os | sed -e 's/windowsnt/winnt/'`
+		;;
+	-psos*)
+		os=-psos
+		;;
+	-mint | -mint[0-9]*)
+		basic_machine=m68k-atari
+		os=-mint
+		;;
+esac
+
+# Decode aliases for certain CPU-COMPANY combinations.
+case $basic_machine in
+	# Recognize the basic CPU types without company name.
+	# Some are omitted here because they have special meanings below.
+	1750a | 580 \
+	| a29k \
+	| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
+	| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
+	| arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \
+	| c4x | clipper \
+	| d10v | d30v | dlx | dsp16xx \
+	| fr30 | frv \
+	| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
+	| i370 | i860 | i960 | ia64 \
+	| ip2k \
+	| m32r | m68000 | m68k | m88k | mcore \
+	| mips | mipsbe | mipseb | mipsel | mipsle \
+	| mips16 \
+	| mips64 | mips64el \
+	| mips64vr | mips64vrel \
+	| mips64orion | mips64orionel \
+	| mips64vr4100 | mips64vr4100el \
+	| mips64vr4300 | mips64vr4300el \
+	| mips64vr5000 | mips64vr5000el \
+	| mipsisa32 | mipsisa32el \
+	| mipsisa32r2 | mipsisa32r2el \
+	| mipsisa64 | mipsisa64el \
+	| mipsisa64sb1 | mipsisa64sb1el \
+	| mipsisa64sr71k | mipsisa64sr71kel \
+	| mipstx39 | mipstx39el \
+	| mn10200 | mn10300 \
+	| msp430 \
+	| ns16k | ns32k \
+	| openrisc | or32 \
+	| pdp10 | pdp11 | pj | pjl \
+	| powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \
+	| pyramid \
+	| s390 | s390x \
+	| sh | sh[1234] | sh[23]e | sh[34]eb | shbe | shle | sh[1234]le | sh3ele \
+	| sh64 | sh64le \
+	| sparc | sparc64 | sparc86x | sparclet | sparclite | sparcv9 | sparcv9b \
+	| strongarm \
+	| tahoe | thumb | tic4x | tic80 | tron \
+	| v850 | v850e \
+	| we32k \
+	| x86 | xscale | xstormy16 | xtensa \
+	| z8k)
+		basic_machine=$basic_machine-unknown
+		;;
+	m6811 | m68hc11 | m6812 | m68hc12)
+		# Motorola 68HC11/12.
+		basic_machine=$basic_machine-unknown
+		os=-none
+		;;
+	m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)
+		;;
+
+	# We use `pc' rather than `unknown'
+	# because (1) that's what they normally are, and
+	# (2) the word "unknown" tends to confuse beginning users.
+	i*86 | x86_64)
+	  basic_machine=$basic_machine-pc
+	  ;;
+	# Object if more than one company name word.
+	*-*-*)
+		echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+		exit 1
+		;;
+	# Recognize the basic CPU types with company name.
+	580-* \
+	| a29k-* \
+	| alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
+	| alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
+	| alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
+	| arm-*  | armbe-* | armle-* | armeb-* | armv*-* \
+	| avr-* \
+	| bs2000-* \
+	| c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \
+	| clipper-* | cydra-* \
+	| d10v-* | d30v-* | dlx-* \
+	| elxsi-* \
+	| f30[01]-* | f700-* | fr30-* | frv-* | fx80-* \
+	| h8300-* | h8500-* \
+	| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
+	| i*86-* | i860-* | i960-* | ia64-* \
+	| ip2k-* \
+	| m32r-* \
+	| m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
+	| m88110-* | m88k-* | mcore-* \
+	| mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
+	| mips16-* \
+	| mips64-* | mips64el-* \
+	| mips64vr-* | mips64vrel-* \
+	| mips64orion-* | mips64orionel-* \
+	| mips64vr4100-* | mips64vr4100el-* \
+	| mips64vr4300-* | mips64vr4300el-* \
+	| mips64vr5000-* | mips64vr5000el-* \
+	| mipsisa32-* | mipsisa32el-* \
+	| mipsisa32r2-* | mipsisa32r2el-* \
+	| mipsisa64-* | mipsisa64el-* \
+	| mipsisa64sb1-* | mipsisa64sb1el-* \
+	| mipsisa64sr71k-* | mipsisa64sr71kel-* \
+	| mipstx39-* | mipstx39el-* \
+	| msp430-* \
+	| none-* | np1-* | nv1-* | ns16k-* | ns32k-* \
+	| orion-* \
+	| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
+	| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \
+	| pyramid-* \
+	| romp-* | rs6000-* \
+	| s390-* | s390x-* \
+	| sh-* | sh[1234]-* | sh[23]e-* | sh[34]eb-* | shbe-* \
+	| shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
+	| sparc-* | sparc64-* | sparc86x-* | sparclet-* | sparclite-* \
+	| sparcv9-* | sparcv9b-* | strongarm-* | sv1-* | sx?-* \
+	| tahoe-* | thumb-* \
+	| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
+	| tron-* \
+	| v850-* | v850e-* | vax-* \
+	| we32k-* \
+	| x86-* | x86_64-* | xps100-* | xscale-* | xstormy16-* \
+	| xtensa-* \
+	| ymp-* \
+	| z8k-*)
+		;;
+	# Recognize the various machine names and aliases which stand
+	# for a CPU type and a company and sometimes even an OS.
+	386bsd)
+		basic_machine=i386-unknown
+		os=-bsd
+		;;
+	3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
+		basic_machine=m68000-att
+		;;
+	3b*)
+		basic_machine=we32k-att
+		;;
+	a29khif)
+		basic_machine=a29k-amd
+		os=-udi
+		;;
+	adobe68k)
+		basic_machine=m68010-adobe
+		os=-scout
+		;;
+	alliant | fx80)
+		basic_machine=fx80-alliant
+		;;
+	altos | altos3068)
+		basic_machine=m68k-altos
+		;;
+	am29k)
+		basic_machine=a29k-none
+		os=-bsd
+		;;
+	amd64)
+		basic_machine=x86_64-pc
+		;;
+	amdahl)
+		basic_machine=580-amdahl
+		os=-sysv
+		;;
+	amiga | amiga-*)
+		basic_machine=m68k-unknown
+		;;
+	amigaos | amigados)
+		basic_machine=m68k-unknown
+		os=-amigaos
+		;;
+	amigaunix | amix)
+		basic_machine=m68k-unknown
+		os=-sysv4
+		;;
+	apollo68)
+		basic_machine=m68k-apollo
+		os=-sysv
+		;;
+	apollo68bsd)
+		basic_machine=m68k-apollo
+		os=-bsd
+		;;
+	aux)
+		basic_machine=m68k-apple
+		os=-aux
+		;;
+	balance)
+		basic_machine=ns32k-sequent
+		os=-dynix
+		;;
+	c90)
+		basic_machine=c90-cray
+		os=-unicos
+		;;
+	convex-c1)
+		basic_machine=c1-convex
+		os=-bsd
+		;;
+	convex-c2)
+		basic_machine=c2-convex
+		os=-bsd
+		;;
+	convex-c32)
+		basic_machine=c32-convex
+		os=-bsd
+		;;
+	convex-c34)
+		basic_machine=c34-convex
+		os=-bsd
+		;;
+	convex-c38)
+		basic_machine=c38-convex
+		os=-bsd
+		;;
+	cray | j90)
+		basic_machine=j90-cray
+		os=-unicos
+		;;
+	crds | unos)
+		basic_machine=m68k-crds
+		;;
+	cris | cris-* | etrax*)
+		basic_machine=cris-axis
+		;;
+	da30 | da30-*)
+		basic_machine=m68k-da30
+		;;
+	decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
+		basic_machine=mips-dec
+		;;
+	decsystem10* | dec10*)
+		basic_machine=pdp10-dec
+		os=-tops10
+		;;
+	decsystem20* | dec20*)
+		basic_machine=pdp10-dec
+		os=-tops20
+		;;
+	delta | 3300 | motorola-3300 | motorola-delta \
+	      | 3300-motorola | delta-motorola)
+		basic_machine=m68k-motorola
+		;;
+	delta88)
+		basic_machine=m88k-motorola
+		os=-sysv3
+		;;
+	dpx20 | dpx20-*)
+		basic_machine=rs6000-bull
+		os=-bosx
+		;;
+	dpx2* | dpx2*-bull)
+		basic_machine=m68k-bull
+		os=-sysv3
+		;;
+	ebmon29k)
+		basic_machine=a29k-amd
+		os=-ebmon
+		;;
+	elxsi)
+		basic_machine=elxsi-elxsi
+		os=-bsd
+		;;
+	encore | umax | mmax)
+		basic_machine=ns32k-encore
+		;;
+	es1800 | OSE68k | ose68k | ose | OSE)
+		basic_machine=m68k-ericsson
+		os=-ose
+		;;
+	fx2800)
+		basic_machine=i860-alliant
+		;;
+	genix)
+		basic_machine=ns32k-ns
+		;;
+	gmicro)
+		basic_machine=tron-gmicro
+		os=-sysv
+		;;
+	go32)
+		basic_machine=i386-pc
+		os=-go32
+		;;
+	h3050r* | hiux*)
+		basic_machine=hppa1.1-hitachi
+		os=-hiuxwe2
+		;;
+	h8300hms)
+		basic_machine=h8300-hitachi
+		os=-hms
+		;;
+	h8300xray)
+		basic_machine=h8300-hitachi
+		os=-xray
+		;;
+	h8500hms)
+		basic_machine=h8500-hitachi
+		os=-hms
+		;;
+	harris)
+		basic_machine=m88k-harris
+		os=-sysv3
+		;;
+	hp300-*)
+		basic_machine=m68k-hp
+		;;
+	hp300bsd)
+		basic_machine=m68k-hp
+		os=-bsd
+		;;
+	hp300hpux)
+		basic_machine=m68k-hp
+		os=-hpux
+		;;
+	hp3k9[0-9][0-9] | hp9[0-9][0-9])
+		basic_machine=hppa1.0-hp
+		;;
+	hp9k2[0-9][0-9] | hp9k31[0-9])
+		basic_machine=m68000-hp
+		;;
+	hp9k3[2-9][0-9])
+		basic_machine=m68k-hp
+		;;
+	hp9k6[0-9][0-9] | hp6[0-9][0-9])
+		basic_machine=hppa1.0-hp
+		;;
+	hp9k7[0-79][0-9] | hp7[0-79][0-9])
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k78[0-9] | hp78[0-9])
+		# FIXME: really hppa2.0-hp
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
+		# FIXME: really hppa2.0-hp
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k8[0-9][13679] | hp8[0-9][13679])
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k8[0-9][0-9] | hp8[0-9][0-9])
+		basic_machine=hppa1.0-hp
+		;;
+	hppa-next)
+		os=-nextstep3
+		;;
+	hppaosf)
+		basic_machine=hppa1.1-hp
+		os=-osf
+		;;
+	hppro)
+		basic_machine=hppa1.1-hp
+		os=-proelf
+		;;
+	i370-ibm* | ibm*)
+		basic_machine=i370-ibm
+		;;
+# I'm not sure what "Sysv32" means.  Should this be sysv3.2?
+	i*86v32)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-sysv32
+		;;
+	i*86v4*)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-sysv4
+		;;
+	i*86v)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-sysv
+		;;
+	i*86sol2)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-solaris2
+		;;
+	i386mach)
+		basic_machine=i386-mach
+		os=-mach
+		;;
+	i386-vsta | vsta)
+		basic_machine=i386-unknown
+		os=-vsta
+		;;
+	iris | iris4d)
+		basic_machine=mips-sgi
+		case $os in
+		    -irix*)
+			;;
+		    *)
+			os=-irix4
+			;;
+		esac
+		;;
+	isi68 | isi)
+		basic_machine=m68k-isi
+		os=-sysv
+		;;
+	m88k-omron*)
+		basic_machine=m88k-omron
+		;;
+	magnum | m3230)
+		basic_machine=mips-mips
+		os=-sysv
+		;;
+	merlin)
+		basic_machine=ns32k-utek
+		os=-sysv
+		;;
+	mingw32)
+		basic_machine=i386-pc
+		os=-mingw32
+		;;
+	miniframe)
+		basic_machine=m68000-convergent
+		;;
+	*mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*)
+		basic_machine=m68k-atari
+		os=-mint
+		;;
+	mips3*-*)
+		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
+		;;
+	mips3*)
+		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
+		;;
+	mmix*)
+		basic_machine=mmix-knuth
+		os=-mmixware
+		;;
+	monitor)
+		basic_machine=m68k-rom68k
+		os=-coff
+		;;
+	morphos)
+		basic_machine=powerpc-unknown
+		os=-morphos
+		;;
+	msdos)
+		basic_machine=i386-pc
+		os=-msdos
+		;;
+	mvs)
+		basic_machine=i370-ibm
+		os=-mvs
+		;;
+	ncr3000)
+		basic_machine=i486-ncr
+		os=-sysv4
+		;;
+	netbsd386)
+		basic_machine=i386-unknown
+		os=-netbsd
+		;;
+	netwinder)
+		basic_machine=armv4l-rebel
+		os=-linux
+		;;
+	news | news700 | news800 | news900)
+		basic_machine=m68k-sony
+		os=-newsos
+		;;
+	news1000)
+		basic_machine=m68030-sony
+		os=-newsos
+		;;
+	news-3600 | risc-news)
+		basic_machine=mips-sony
+		os=-newsos
+		;;
+	necv70)
+		basic_machine=v70-nec
+		os=-sysv
+		;;
+	next | m*-next )
+		basic_machine=m68k-next
+		case $os in
+		    -nextstep* )
+			;;
+		    -ns2*)
+		      os=-nextstep2
+			;;
+		    *)
+		      os=-nextstep3
+			;;
+		esac
+		;;
+	nh3000)
+		basic_machine=m68k-harris
+		os=-cxux
+		;;
+	nh[45]000)
+		basic_machine=m88k-harris
+		os=-cxux
+		;;
+	nindy960)
+		basic_machine=i960-intel
+		os=-nindy
+		;;
+	mon960)
+		basic_machine=i960-intel
+		os=-mon960
+		;;
+	nonstopux)
+		basic_machine=mips-compaq
+		os=-nonstopux
+		;;
+	np1)
+		basic_machine=np1-gould
+		;;
+	nv1)
+		basic_machine=nv1-cray
+		os=-unicosmp
+		;;
+	nsr-tandem)
+		basic_machine=nsr-tandem
+		;;
+	op50n-* | op60c-*)
+		basic_machine=hppa1.1-oki
+		os=-proelf
+		;;
+	or32 | or32-*)
+		basic_machine=or32-unknown
+		os=-coff
+		;;
+	OSE68000 | ose68000)
+		basic_machine=m68000-ericsson
+		os=-ose
+		;;
+	os68k)
+		basic_machine=m68k-none
+		os=-os68k
+		;;
+	pa-hitachi)
+		basic_machine=hppa1.1-hitachi
+		os=-hiuxwe2
+		;;
+	paragon)
+		basic_machine=i860-intel
+		os=-osf
+		;;
+	pbd)
+		basic_machine=sparc-tti
+		;;
+	pbb)
+		basic_machine=m68k-tti
+		;;
+	pc532 | pc532-*)
+		basic_machine=ns32k-pc532
+		;;
+	pentium | p5 | k5 | k6 | nexgen | viac3)
+		basic_machine=i586-pc
+		;;
+	pentiumpro | p6 | 6x86 | athlon | athlon_*)
+		basic_machine=i686-pc
+		;;
+	pentiumii | pentium2 | pentiumiii | pentium3)
+		basic_machine=i686-pc
+		;;
+	pentium4)
+		basic_machine=i786-pc
+		;;
+	pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
+		basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentiumpro-* | p6-* | 6x86-* | athlon-*)
+		basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)
+		basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentium4-*)
+		basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pn)
+		basic_machine=pn-gould
+		;;
+	power)	basic_machine=power-ibm
+		;;
+	ppc)	basic_machine=powerpc-unknown
+		;;
+	ppc-*)	basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ppcle | powerpclittle | ppc-le | powerpc-little)
+		basic_machine=powerpcle-unknown
+		;;
+	ppcle-* | powerpclittle-*)
+		basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ppc64)	basic_machine=powerpc64-unknown
+		;;
+	ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ppc64le | powerpc64little | ppc64-le | powerpc64-little)
+		basic_machine=powerpc64le-unknown
+		;;
+	ppc64le-* | powerpc64little-*)
+		basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ps2)
+		basic_machine=i386-ibm
+		;;
+	pw32)
+		basic_machine=i586-unknown
+		os=-pw32
+		;;
+	rom68k)
+		basic_machine=m68k-rom68k
+		os=-coff
+		;;
+	rm[46]00)
+		basic_machine=mips-siemens
+		;;
+	rtpc | rtpc-*)
+		basic_machine=romp-ibm
+		;;
+	sa29200)
+		basic_machine=a29k-amd
+		os=-udi
+		;;
+	sb1)
+		basic_machine=mipsisa64sb1-unknown
+		;;
+	sb1el)
+		basic_machine=mipsisa64sb1el-unknown
+		;;
+	sei)
+		basic_machine=mips-sei
+		os=-seiux
+		;;
+	sequent)
+		basic_machine=i386-sequent
+		;;
+	sh)
+		basic_machine=sh-hitachi
+		os=-hms
+		;;
+	sh64)
+		basic_machine=sh64-unknown
+		;;
+	sparclite-wrs | simso-wrs)
+		basic_machine=sparclite-wrs
+		os=-vxworks
+		;;
+	sps7)
+		basic_machine=m68k-bull
+		os=-sysv2
+		;;
+	spur)
+		basic_machine=spur-unknown
+		;;
+	st2000)
+		basic_machine=m68k-tandem
+		;;
+	stratus)
+		basic_machine=i860-stratus
+		os=-sysv4
+		;;
+	sun2)
+		basic_machine=m68000-sun
+		;;
+	sun2os3)
+		basic_machine=m68000-sun
+		os=-sunos3
+		;;
+	sun2os4)
+		basic_machine=m68000-sun
+		os=-sunos4
+		;;
+	sun3os3)
+		basic_machine=m68k-sun
+		os=-sunos3
+		;;
+	sun3os4)
+		basic_machine=m68k-sun
+		os=-sunos4
+		;;
+	sun4os3)
+		basic_machine=sparc-sun
+		os=-sunos3
+		;;
+	sun4os4)
+		basic_machine=sparc-sun
+		os=-sunos4
+		;;
+	sun4sol2)
+		basic_machine=sparc-sun
+		os=-solaris2
+		;;
+	sun3 | sun3-*)
+		basic_machine=m68k-sun
+		;;
+	sun4)
+		basic_machine=sparc-sun
+		;;
+	sun386 | sun386i | roadrunner)
+		basic_machine=i386-sun
+		;;
+	sv1)
+		basic_machine=sv1-cray
+		os=-unicos
+		;;
+	symmetry)
+		basic_machine=i386-sequent
+		os=-dynix
+		;;
+	t3e)
+		basic_machine=alphaev5-cray
+		os=-unicos
+		;;
+	t90)
+		basic_machine=t90-cray
+		os=-unicos
+		;;
+	tic54x | c54x*)
+		basic_machine=tic54x-unknown
+		os=-coff
+		;;
+	tic55x | c55x*)
+		basic_machine=tic55x-unknown
+		os=-coff
+		;;
+	tic6x | c6x*)
+		basic_machine=tic6x-unknown
+		os=-coff
+		;;
+	tx39)
+		basic_machine=mipstx39-unknown
+		;;
+	tx39el)
+		basic_machine=mipstx39el-unknown
+		;;
+	toad1)
+		basic_machine=pdp10-xkl
+		os=-tops20
+		;;
+	tower | tower-32)
+		basic_machine=m68k-ncr
+		;;
+	udi29k)
+		basic_machine=a29k-amd
+		os=-udi
+		;;
+	ultra3)
+		basic_machine=a29k-nyu
+		os=-sym1
+		;;
+	v810 | necv810)
+		basic_machine=v810-nec
+		os=-none
+		;;
+	vaxv)
+		basic_machine=vax-dec
+		os=-sysv
+		;;
+	vms)
+		basic_machine=vax-dec
+		os=-vms
+		;;
+	vpp*|vx|vx-*)
+		basic_machine=f301-fujitsu
+		;;
+	vxworks960)
+		basic_machine=i960-wrs
+		os=-vxworks
+		;;
+	vxworks68)
+		basic_machine=m68k-wrs
+		os=-vxworks
+		;;
+	vxworks29k)
+		basic_machine=a29k-wrs
+		os=-vxworks
+		;;
+	w65*)
+		basic_machine=w65-wdc
+		os=-none
+		;;
+	w89k-*)
+		basic_machine=hppa1.1-winbond
+		os=-proelf
+		;;
+	xps | xps100)
+		basic_machine=xps100-honeywell
+		;;
+	ymp)
+		basic_machine=ymp-cray
+		os=-unicos
+		;;
+	z8k-*-coff)
+		basic_machine=z8k-unknown
+		os=-sim
+		;;
+	none)
+		basic_machine=none-none
+		os=-none
+		;;
+
+# Here we handle the default manufacturer of certain CPU types.  It is in
+# some cases the only manufacturer, in others, it is the most popular.
+	w89k)
+		basic_machine=hppa1.1-winbond
+		;;
+	op50n)
+		basic_machine=hppa1.1-oki
+		;;
+	op60c)
+		basic_machine=hppa1.1-oki
+		;;
+	romp)
+		basic_machine=romp-ibm
+		;;
+	rs6000)
+		basic_machine=rs6000-ibm
+		;;
+	vax)
+		basic_machine=vax-dec
+		;;
+	pdp10)
+		# there are many clones, so DEC is not a safe bet
+		basic_machine=pdp10-unknown
+		;;
+	pdp11)
+		basic_machine=pdp11-dec
+		;;
+	we32k)
+		basic_machine=we32k-att
+		;;
+	sh3 | sh4 | sh[34]eb | sh[1234]le | sh[23]ele)
+		basic_machine=sh-unknown
+		;;
+	sh64)
+		basic_machine=sh64-unknown
+		;;
+	sparc | sparcv9 | sparcv9b)
+		basic_machine=sparc-sun
+		;;
+	cydra)
+		basic_machine=cydra-cydrome
+		;;
+	orion)
+		basic_machine=orion-highlevel
+		;;
+	orion105)
+		basic_machine=clipper-highlevel
+		;;
+	mac | mpw | mac-mpw)
+		basic_machine=m68k-apple
+		;;
+	pmac | pmac-mpw)
+		basic_machine=powerpc-apple
+		;;
+	*-unknown)
+		# Make sure to match an already-canonicalized machine name.
+		;;
+	*)
+		echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+		exit 1
+		;;
+esac
+
+# Here we canonicalize certain aliases for manufacturers.
+case $basic_machine in
+	*-digital*)
+		basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`
+		;;
+	*-commodore*)
+		basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`
+		;;
+	*)
+		;;
+esac
+
+# Decode manufacturer-specific aliases for certain operating systems.
+
+if [ x"$os" != x"" ]
+then
+case $os in
+        # First match some system type aliases
+        # that might get confused with valid system types.
+	# -solaris* is a basic system type, with this one exception.
+	-solaris1 | -solaris1.*)
+		os=`echo $os | sed -e 's|solaris1|sunos4|'`
+		;;
+	-solaris)
+		os=-solaris2
+		;;
+	-svr4*)
+		os=-sysv4
+		;;
+	-unixware*)
+		os=-sysv4.2uw
+		;;
+	-gnu/linux*)
+		os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
+		;;
+	# First accept the basic system types.
+	# The portable systems comes first.
+	# Each alternative MUST END IN A *, to match a version number.
+	# -sysv* is not here because it comes later, after sysvr4.
+	-gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
+	      | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\
+	      | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \
+	      | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
+	      | -aos* \
+	      | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
+	      | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
+	      | -hiux* | -386bsd* | -netbsd* | -openbsd* | -freebsd* | -riscix* \
+	      | -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
+	      | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
+	      | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
+	      | -chorusos* | -chorusrdb* \
+	      | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
+	      | -mingw32* | -linux-gnu* | -uxpv* | -beos* | -mpeix* | -udk* \
+	      | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
+	      | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
+	      | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
+	      | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
+	      | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
+	      | -powermax* | -dnix* | -nx6 | -nx7 | -sei*)
+	# Remember, each alternative MUST END IN *, to match a version number.
+		;;
+	-qnx*)
+		case $basic_machine in
+		    x86-* | i*86-*)
+			;;
+		    *)
+			os=-nto$os
+			;;
+		esac
+		;;
+	-nto-qnx*)
+		;;
+	-nto*)
+		os=`echo $os | sed -e 's|nto|nto-qnx|'`
+		;;
+	-sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \
+	      | -windows* | -osx | -abug | -netware* | -os9* | -beos* \
+	      | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)
+		;;
+	-mac*)
+		os=`echo $os | sed -e 's|mac|macos|'`
+		;;
+	-linux*)
+		os=`echo $os | sed -e 's|linux|linux-gnu|'`
+		;;
+	-sunos5*)
+		os=`echo $os | sed -e 's|sunos5|solaris2|'`
+		;;
+	-sunos6*)
+		os=`echo $os | sed -e 's|sunos6|solaris3|'`
+		;;
+	-opened*)
+		os=-openedition
+		;;
+	-wince*)
+		os=-wince
+		;;
+	-osfrose*)
+		os=-osfrose
+		;;
+	-osf*)
+		os=-osf
+		;;
+	-utek*)
+		os=-bsd
+		;;
+	-dynix*)
+		os=-bsd
+		;;
+	-acis*)
+		os=-aos
+		;;
+	-atheos*)
+		os=-atheos
+		;;
+	-386bsd)
+		os=-bsd
+		;;
+	-ctix* | -uts*)
+		os=-sysv
+		;;
+	-nova*)
+		os=-rtmk-nova
+		;;
+	-ns2 )
+		os=-nextstep2
+		;;
+	-nsk*)
+		os=-nsk
+		;;
+	# Preserve the version number of sinix5.
+	-sinix5.*)
+		os=`echo $os | sed -e 's|sinix|sysv|'`
+		;;
+	-sinix*)
+		os=-sysv4
+		;;
+	-triton*)
+		os=-sysv3
+		;;
+	-oss*)
+		os=-sysv3
+		;;
+	-svr4)
+		os=-sysv4
+		;;
+	-svr3)
+		os=-sysv3
+		;;
+	-sysvr4)
+		os=-sysv4
+		;;
+	# This must come after -sysvr4.
+	-sysv*)
+		;;
+	-ose*)
+		os=-ose
+		;;
+	-es1800*)
+		os=-ose
+		;;
+	-xenix)
+		os=-xenix
+		;;
+	-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+		os=-mint
+		;;
+	-aros*)
+		os=-aros
+		;;
+	-kaos*)
+		os=-kaos
+		;;
+	-none)
+		;;
+	*)
+		# Get rid of the `-' at the beginning of $os.
+		os=`echo $os | sed 's/[^-]*-//'`
+		echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2
+		exit 1
+		;;
+esac
+else
+
+# Here we handle the default operating systems that come with various machines.
+# The value should be what the vendor currently ships out the door with their
+# machine or put another way, the most popular os provided with the machine.
+
+# Note that if you're going to try to match "-MANUFACTURER" here (say,
+# "-sun"), then you have to tell the case statement up towards the top
+# that MANUFACTURER isn't an operating system.  Otherwise, code above
+# will signal an error saying that MANUFACTURER isn't an operating
+# system, and we'll never get to this point.
+
+case $basic_machine in
+	*-acorn)
+		os=-riscix1.2
+		;;
+	arm*-rebel)
+		os=-linux
+		;;
+	arm*-semi)
+		os=-aout
+		;;
+	c4x-* | tic4x-*)
+		os=-coff
+		;;
+	# This must come before the *-dec entry.
+	pdp10-*)
+		os=-tops20
+		;;
+	pdp11-*)
+		os=-none
+		;;
+	*-dec | vax-*)
+		os=-ultrix4.2
+		;;
+	m68*-apollo)
+		os=-domain
+		;;
+	i386-sun)
+		os=-sunos4.0.2
+		;;
+	m68000-sun)
+		os=-sunos3
+		# This also exists in the configure program, but was not the
+		# default.
+		# os=-sunos4
+		;;
+	m68*-cisco)
+		os=-aout
+		;;
+	mips*-cisco)
+		os=-elf
+		;;
+	mips*-*)
+		os=-elf
+		;;
+	or32-*)
+		os=-coff
+		;;
+	*-tti)	# must be before sparc entry or we get the wrong os.
+		os=-sysv3
+		;;
+	sparc-* | *-sun)
+		os=-sunos4.1.1
+		;;
+	*-be)
+		os=-beos
+		;;
+	*-ibm)
+		os=-aix
+		;;
+	*-wec)
+		os=-proelf
+		;;
+	*-winbond)
+		os=-proelf
+		;;
+	*-oki)
+		os=-proelf
+		;;
+	*-hp)
+		os=-hpux
+		;;
+	*-hitachi)
+		os=-hiux
+		;;
+	i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
+		os=-sysv
+		;;
+	*-cbm)
+		os=-amigaos
+		;;
+	*-dg)
+		os=-dgux
+		;;
+	*-dolphin)
+		os=-sysv3
+		;;
+	m68k-ccur)
+		os=-rtu
+		;;
+	m88k-omron*)
+		os=-luna
+		;;
+	*-next )
+		os=-nextstep
+		;;
+	*-sequent)
+		os=-ptx
+		;;
+	*-crds)
+		os=-unos
+		;;
+	*-ns)
+		os=-genix
+		;;
+	i370-*)
+		os=-mvs
+		;;
+	*-next)
+		os=-nextstep3
+		;;
+	*-gould)
+		os=-sysv
+		;;
+	*-highlevel)
+		os=-bsd
+		;;
+	*-encore)
+		os=-bsd
+		;;
+	*-sgi)
+		os=-irix
+		;;
+	*-siemens)
+		os=-sysv4
+		;;
+	*-masscomp)
+		os=-rtu
+		;;
+	f30[01]-fujitsu | f700-fujitsu)
+		os=-uxpv
+		;;
+	*-rom68k)
+		os=-coff
+		;;
+	*-*bug)
+		os=-coff
+		;;
+	*-apple)
+		os=-macos
+		;;
+	*-atari*)
+		os=-mint
+		;;
+	*)
+		os=-none
+		;;
+esac
+fi
+
+# Here we handle the case where we know the os, and the CPU type, but not the
+# manufacturer.  We pick the logical manufacturer.
+vendor=unknown
+case $basic_machine in
+	*-unknown)
+		case $os in
+			-riscix*)
+				vendor=acorn
+				;;
+			-sunos*)
+				vendor=sun
+				;;
+			-aix*)
+				vendor=ibm
+				;;
+			-beos*)
+				vendor=be
+				;;
+			-hpux*)
+				vendor=hp
+				;;
+			-mpeix*)
+				vendor=hp
+				;;
+			-hiux*)
+				vendor=hitachi
+				;;
+			-unos*)
+				vendor=crds
+				;;
+			-dgux*)
+				vendor=dg
+				;;
+			-luna*)
+				vendor=omron
+				;;
+			-genix*)
+				vendor=ns
+				;;
+			-mvs* | -opened*)
+				vendor=ibm
+				;;
+			-ptx*)
+				vendor=sequent
+				;;
+			-vxsim* | -vxworks* | -windiss*)
+				vendor=wrs
+				;;
+			-aux*)
+				vendor=apple
+				;;
+			-hms*)
+				vendor=hitachi
+				;;
+			-mpw* | -macos*)
+				vendor=apple
+				;;
+			-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+				vendor=atari
+				;;
+			-vos*)
+				vendor=stratus
+				;;
+		esac
+		basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
+		;;
+esac
+
+echo $basic_machine$os
+exit 0
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
Index: /tags/ipp-1-X/bug123/psLib/configure.ac
===================================================================
--- /tags/ipp-1-X/bug123/psLib/configure.ac	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/configure.ac	(revision 22331)
@@ -0,0 +1,248 @@
+AC_INIT([pslib],[0.5.1],[www.pan-starrs.org/bugzilla])
+AM_CONFIG_HEADER(src/config.h)
+AM_INIT_AUTOMAKE(1.6)
+
+PSLIB_LT_VERSION="0:5:0"
+AC_SUBST(PSLIB_LT_VERSION,$PSLIB_LT_VERSION)
+
+SUBDIR="etc src test" dnl don't include 'swig', as it is optional
+
+AC_DISABLE_STATIC
+AC_PROG_MAKE_SET
+
+dnl handle debug building
+AC_ARG_ENABLE(optimize,
+  [AC_HELP_STRING([--enable-optimize],[enable compiler optimization])],
+  [AC_MSG_RESULT(compile optimization enabled)
+   CFLAGS="${CFLAGS=} -O2"],
+  [AC_MSG_RESULT([compile optimization disabled])
+   CFLAGS="${CFLAGS=} -O0 -g"]
+)
+
+AC_LANG(C)
+AC_PROG_CC
+AC_GNU_SOURCE
+dnl Setup CFLAGS with project-particulars
+AC_MSG_CHECKING([C99 flag])
+if test "$GCC" == "yes"
+then
+CFLAGS="${CFLAGS=} -std=gnu99"
+AC_MSG_RESULT([-std=gnu99])
+else
+CFLAGS="${CFLAGS=} -std=c99"
+AC_MSG_RESULT([-std=c99])
+fi
+
+AC_LANG_PUSH(Fortran 77)
+AC_PROG_F77
+AC_F77_WRAPPERS
+AC_LANG_POP(Fortran 77)
+
+AC_PROG_INSTALL
+AC_PROG_LIBTOOL
+
+AC_PREFIX_DEFAULT([`pwd`])
+test "$prefix" = NONE && prefix=`pwd`
+
+dnl Setup the info for psLib for pkg-config
+PSLIB_CFLAGS="-I${includedir}"
+
+dnl ----------------- MYSQL options --------------------
+dnl MYSQL_LDFLAGS="-L${libdir}/mysql"
+dnl MYSQL_CFLAGS="-I${includedir}/mysql"
+AC_ARG_ENABLE(mysql, 
+ [AC_HELP_STRING([--disable-mysql],[Disable MySQL functionality])],
+ [MYSQL_REQ=$enableval],
+ [MYSQL_REQ="yes"])
+
+if test "$MYSQL_REQ" == "yes"
+then
+  AC_MSG_RESULT([enable building MySQL functionality])
+  AC_ARG_WITH(mysql_config,
+    [AC_HELP_STRING([--with-mysql_config=FILE],[Specify location of MYSQL configuration script.])],
+    [MYSQL_CONFIG=$withval],
+    [MYSQL_CONFIG=`which mysql_config`])
+  AC_CHECK_FILE($MYSQL_CONFIG,[],
+    [AC_MSG_ERROR([MYSQL 4.1.2 or newer is required.  http://www.mysql.com or use --with-mysql_config to specify location of ocnfiguration script.])])
+
+  AC_MSG_CHECKING([MySQL cflags])
+  MYSQL_CFLAGS="`${MYSQL_CONFIG} --cflags`"
+  AC_MSG_RESULT([${MYSQL_CFLAGS}])
+  CFLAGS="${CFLAGS=} ${MYSQL_CFLAGS}"
+
+  AC_MSG_CHECKING([MySQL link options])
+  MYSQL_LDFLAGS="`${MYSQL_CONFIG} --libs`"
+  AC_MSG_RESULT([${MYSQL_LDFLAGS}])
+  PSLIB_LIBS="${PSLIB_LIBS=} ${MYSQL_LDFLAGS}"
+  AC_SUBST(TST_PSDB,"tst_psDB") dnl enable the test for psDB
+  
+  AC_RUN_IFELSE([AC_LANG_PROGRAM(
+[[#include <stdlib.h>
+#include <stdio.h>
+#include <mysql_version.h>
+]],[[int v=MYSQL_VERSION_ID;
+    if (v < 40102) {
+	exit(1);
+    } else {
+	exit(0);
+    }
+]])], [], [AC_MSG_ERROR([MySQL 4.1.2 or newer is required.  Obtain it at  http://www.mysql.com or use --with-mysql to specify location.])])
+
+  CFLAGS="${CFLAGS=} -DBUILD_PSDB"
+  PSLIB_CFLAGS="${PSLIB_CFLAGS=} -DBUILD_PSDB"
+else
+  AC_MSG_RESULT([disable building MySQL functionality])
+fi
+
+dnl ----------------- CFITSIO options --------------------
+AC_ARG_WITH(cfitsio,
+[AC_HELP_STRING([--with-cfitsio=DIR],[Specify location of CFITSIO.])],
+[CFITSIO_CFLAGS="-I$withval/include"
+ CFITSIO_LDFLAGS="-L$withval/lib"])
+AC_ARG_WITH(cfitsio-include,
+[AC_HELP_STRING([--with-cfitsio-include=DIR],[Specify CFITSIO include directory.])],
+[CFITSIO_CFLAGS="-I$withval"])
+AC_ARG_WITH(cfitsio-lib,
+[AC_HELP_STRING([--with-cfitsio-lib=DIR],[Specify CFITSIO library directory.])],
+[CFITSIO_LDFLAGS="-L$withval"])
+CFLAGS="${CFLAGS=} $CFITSIO_CFLAGS"
+dnl LDFLAGS="${LDFLAGS} $CFITSIO_LDFLAGS -lcfitsio"
+PSLIB_LIBS="${PSLIB_LIBS=} $CFITSIO_LDFLAGS -lcfitsio"
+AC_CHECK_HEADERS([fitsio.h],[],
+   [AC_MSG_ERROR([CFITSIO is required.  Obtain it at  http://heasarc.gsfc.nasa.gov/docs/software/fitsio or use --with-cfitsio to specify location.])])
+
+dnl ------------------ FFTW3 options ---------------------
+AC_ARG_WITH(fftw3,
+[AC_HELP_STRING([--with-fftw3=DIR],[Specify location of FFTW version 3.])],
+[FFTW3_CFLAGS="-I$withval/include"
+ FFTW3_LDFLAGS="-L$withval/lib"])
+AC_ARG_WITH(fftw3-include,
+[AC_HELP_STRING([--with-fftw3-include=DIR],[Specify FFTW version 3 include directory.])],
+[FFTW3_CFLAGS="-I$withval"])
+AC_ARG_WITH(fftw3-lib,
+[AC_HELP_STRING([--with-fftw3-lib=DIR],[Specify FFTW version 3 library directory.])],
+[FFTW3_LDFLAGS="-L$withval"])
+CFLAGS="${CFLAGS=} $FFTW3_CFLAGS"
+dnl LDFLAGS="${LDFLAGS=} $FFTW3_LDFLAGS -lfftw3f"
+PSLIB_LIBS="${PSLIB_LIBS=} $FFTW3_LDFLAGS -lfftw3f"
+AC_MSG_CHECKING([FFTW header files])
+AC_CHECK_HEADERS([fftw3.h],[],
+   [AC_MSG_ERROR([FFTW version 3 with float support is required.  Obtain it at http://www.fftw.org/or use --with-fftw3 to specify location.])])
+
+dnl -------------------- GSL options ---------------------
+AC_ARG_WITH(gsl-config,
+[AC_HELP_STRING([--with-gsl-config=FILE],[Specify location of gsl-config.])],
+[GSL_CONFIG=$withval],
+[GSL_CONFIG=`which gsl-config`])
+AC_CHECK_FILE($GSL_CONFIG,[],
+    [AC_MSG_ERROR([GSL is required.  Obtain it at http://www.gnu.org/software/gsl or use --with-gsl-config to specify location.])])
+AC_MSG_CHECKING([GSL cflags])
+GSL_CFLAGS="`${GSL_CONFIG} --cflags`"
+AC_MSG_RESULT([${GSL_CFLAGS}])
+CFLAGS="${CFLAGS=} ${GSL_CFLAGS}"
+dnl LDFLAGS="${LDFLAGS=} `${GSL_CONFIG} --libs`"
+PSLIB_LIBS="${PSLIB_LIBS=} `${GSL_CONFIG} --libs`"
+   
+dnl ------------------- XML2 options ---------------------
+AC_ARG_WITH(xml2-config,
+[AC_HELP_STRING([--with-xml2-config=FILE],[Specify location of xml2-config.])],
+[XML_CONFIG=$withval],
+[XML_CONFIG=`which xml2-config`])
+AC_CHECK_FILE($XML_CONFIG,[],
+    [AC_MSG_ERROR([GNOME XML C parser is required.  Obtain it at http://www.xmlsoft.org or use --with-xml2-config to specify location.])])
+AC_MSG_CHECKING([xml2 cflags])
+XML_CFLAGS="`${XML_CONFIG} --cflags`"
+AC_MSG_RESULT([${XML_CFLAGS}])
+CFLAGS="${CFLAGS=} ${XML_CFLAGS}"
+dnl LDFLAGS="${LDFLAGS=} `${XML_CONFIG} --libs`"
+PSLIB_LIBS="${PSLIB_LIBS=} `${XML_CONFIG} --libs`"
+
+dnl ------------------- SWIG options ---------------------
+AC_ARG_ENABLE(perlmodule, 
+ [AC_HELP_STRING([--disable-perlmodule],[Disable creation of perl module])],
+ [SWIG_REQ="$enableval"],
+ [SWIG_REQ="yes"])
+
+if test "$SWIG_REQ" == "yes"
+then
+  AC_MSG_RESULT([enable building perl module])
+  AC_ARG_WITH(swig,
+  [AC_HELP_STRING([--with-swig=FILE],[Specify location of SWIG executable.])],
+  [SWIG=$withval],
+  [SWIG=`which swig`])
+  AC_SUBST(SWIG,$SWIG)
+
+  AC_CHECK_FILE($SWIG,[],
+     [AC_MSG_ERROR([SWIG is required.  Obtain it at www.swig.org or use --with-swig to specify its install location.])])
+  SUBDIR="${SUBDIR=} swig"
+
+dnl ------------------- PERL options ---------------------
+  AC_ARG_WITH(perl,
+    [AC_HELP_STRING([--with-perl=FILE],[Specify location of PERL executable.])],
+    [AC_CHECK_PROG(PERL, $withval, $withval)],
+    [AC_CHECK_PROG(PERL, perl, `which perl`)])
+    if test "$PERL" == ""
+    then
+      AC_MSG_ERROR([PERL is required.  Use --with-perl to specify its install location.])
+    fi
+    AC_SUBST(PERL,$PERL)
+
+dnl ---------------- PERLPREFIX option -------------------
+  AC_ARG_WITH(perlprefix,
+    [AC_HELP_STRING([--with-perlprefix=DIR],[Specify prefix of Perl Module's installation. (default=PREFIX)])],
+    [PERL_PREFIX="$withval"],
+    [PERL_PREFIX="$prefix"])
+    AC_SUBST(PERL_PREFIX,$PERL_PREFIX)
+    AC_SUBST(PERL_INSTALLSYTLE,[`perl '-V:installstyle'`])
+
+else
+  AC_MSG_RESULT([disable building perl module])
+fi
+
+dnl for MacOSX, check if sqrtf is in mx library.
+AC_CHECK_LIB(mx,sqrtf,
+  [PSLIB_LIBS="${PSLIB_LIBS=} -lmx"])
+AC_CHECK_FUNC(atoll, [],
+  [AC_MSG_ERROR([The C99 function, atoll, is required; update your compiler?])])
+
+DOXYGEN="doxygen Doxyfile"
+AC_CHECK_PROG(DOXYGEN,doxygen,[echo Doxygen not detected in configure stage.])
+AC_SUBST(DOXYGEN,$DOXYGEN)
+
+CFLAGS="${CFLAGS=} -Wall -Werror"
+
+dnl ---------------- export variables --------------------
+
+AC_SUBST(SUBDIR,[$SUBDIR])
+AC_SUBST(PSLIB_LIBS,[$PSLIB_LIBS])
+AC_SUBST(PSLIB_CFLAGS,[$PSLIB_CFLAGS])
+
+AC_CONFIG_FILES([ Makefile ])
+AC_CONFIG_FILES([ src/Makefile ])
+AC_CONFIG_FILES([ src/astronomy/Makefile ])
+AC_CONFIG_FILES([ src/collections/Makefile ])
+AC_CONFIG_FILES([ src/dataManip/Makefile ])
+AC_CONFIG_FILES([ src/dataIO/Makefile ])
+AC_CONFIG_FILES([ src/image/Makefile ])
+AC_CONFIG_FILES([ src/sysUtils/Makefile ])
+
+if test "$SWIG_REQ" == "yes" 
+then
+  AC_CONFIG_FILES([ swig/Makefile ])
+fi
+
+AC_CONFIG_FILES([ test/Makefile ])
+AC_CONFIG_FILES([ test/astronomy/Makefile ])
+AC_CONFIG_FILES([ test/collections/Makefile ])
+AC_CONFIG_FILES([ test/dataManip/Makefile ])
+AC_CONFIG_FILES([ test/dataIO/Makefile ])
+AC_CONFIG_FILES([ test/image/Makefile ])
+AC_CONFIG_FILES([ test/sysUtils/Makefile ])
+AC_CONFIG_FILES([ etc/pslib/Makefile ])
+AC_CONFIG_FILES([ etc/Makefile ])
+AC_CONFIG_FILES([ pslib-config ])
+AC_CONFIG_FILES([ pslib.pc ])
+AC_CONFIG_FILES([ Doxyfile ])
+
+AC_OUTPUT
+
Index: /tags/ipp-1-X/bug123/psLib/depcomp
===================================================================
--- /tags/ipp-1-X/bug123/psLib/depcomp	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/depcomp	(revision 22331)
@@ -0,0 +1,441 @@
+#! /bin/sh
+
+# depcomp - compile a program generating dependencies as side-effects
+# Copyright 1999, 2000 Free Software Foundation, Inc.
+
+# 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, 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., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.
+
+if test -z "$depmode" || test -z "$source" || test -z "$object"; then
+  echo "depcomp: Variables source, object and depmode must be set" 1>&2
+  exit 1
+fi
+# `libtool' can also be set to `yes' or `no'.
+
+depfile=${depfile-`echo "$object" | sed 's,\([^/]*\)$,.deps/\1,;s/\.\([^.]*\)$/.P\1/'`}
+tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
+
+rm -f "$tmpdepfile"
+
+# Some modes work just like other modes, but use different flags.  We
+# parameterize here, but still list the modes in the big case below,
+# to make depend.m4 easier to write.  Note that we *cannot* use a case
+# here, because this file can only contain one case statement.
+if test "$depmode" = hp; then
+  # HP compiler uses -M and no extra arg.
+  gccflag=-M
+  depmode=gcc
+fi
+
+if test "$depmode" = dashXmstdout; then
+   # This is just like dashmstdout with a different argument.
+   dashmflag=-xM
+   depmode=dashmstdout
+fi
+
+case "$depmode" in
+gcc3)
+## gcc 3 implements dependency tracking that does exactly what
+## we want.  Yay!  Note: for some reason libtool 1.4 doesn't like
+## it if -MD -MP comes after the -MF stuff.  Hmm.
+  "$@" -MT "$object" -MD -MP -MF "$tmpdepfile"
+  stat=$?
+  if test $stat -eq 0; then :
+  else
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  mv "$tmpdepfile" "$depfile"
+  ;;
+
+gcc)
+## There are various ways to get dependency output from gcc.  Here's
+## why we pick this rather obscure method:
+## - Don't want to use -MD because we'd like the dependencies to end
+##   up in a subdir.  Having to rename by hand is ugly.
+##   (We might end up doing this anyway to support other compilers.)
+## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
+##   -MM, not -M (despite what the docs say).
+## - Using -M directly means running the compiler twice (even worse
+##   than renaming).
+  if test -z "$gccflag"; then
+    gccflag=-MD,
+  fi
+  "$@" -Wp,"$gccflag$tmpdepfile"
+  stat=$?
+  if test $stat -eq 0; then :
+  else
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+  echo "$object : \\" > "$depfile"
+  alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
+## The second -e expression handles DOS-style file names with drive letters.
+  sed -e 's/^[^:]*: / /' \
+      -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
+## This next piece of magic avoids the `deleted header file' problem.
+## The problem is that when a header file which appears in a .P file
+## is deleted, the dependency causes make to die (because there is
+## typically no way to rebuild the header).  We avoid this by adding
+## dummy dependencies for each header file.  Too bad gcc doesn't do
+## this for us directly.
+  tr ' ' '
+' < "$tmpdepfile" |
+## Some versions of gcc put a space before the `:'.  On the theory
+## that the space means something, we add a space to the output as
+## well.
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly.  Breaking it into two sed invocations is a workaround.
+    sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+hp)
+  # This case exists only to let depend.m4 do its work.  It works by
+  # looking at the text of this script.  This case will never be run,
+  # since it is checked for above.
+  exit 1
+  ;;
+
+sgi)
+  if test "$libtool" = yes; then
+    "$@" "-Wp,-MDupdate,$tmpdepfile"
+  else
+    "$@" -MDupdate "$tmpdepfile"
+  fi
+  stat=$?
+  if test $stat -eq 0; then :
+  else
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+
+  if test -f "$tmpdepfile"; then  # yes, the sourcefile depend on other files
+    echo "$object : \\" > "$depfile"
+
+    # Clip off the initial element (the dependent).  Don't try to be
+    # clever and replace this with sed code, as IRIX sed won't handle
+    # lines with more than a fixed number of characters (4096 in
+    # IRIX 6.2 sed, 8192 in IRIX 6.5).  We also remove comment lines;
+    # the IRIX cc adds comments like `#:fec' to the end of the
+    # dependency line.
+    tr ' ' '
+' < "$tmpdepfile" \
+    | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \
+    tr '
+' ' ' >> $depfile
+    echo >> $depfile
+
+    # The second pass generates a dummy entry for each header file.
+    tr ' ' '
+' < "$tmpdepfile" \
+   | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
+   >> $depfile
+  else
+    # The sourcefile does not contain any dependencies, so just
+    # store a dummy comment line, to avoid errors with the Makefile
+    # "include basename.Plo" scheme.
+    echo "#dummy" > "$depfile"
+  fi
+  rm -f "$tmpdepfile"
+  ;;
+
+aix)
+  # The C for AIX Compiler uses -M and outputs the dependencies
+  # in a .u file.  This file always lives in the current directory.
+  # Also, the AIX compiler puts `$object:' at the start of each line;
+  # $object doesn't have directory information.
+  stripped=`echo "$object" | sed -e 's,^.*/,,' -e 's/\(.*\)\..*$/\1/'`
+  tmpdepfile="$stripped.u"
+  outname="$stripped.o"
+  if test "$libtool" = yes; then
+    "$@" -Wc,-M
+  else
+    "$@" -M
+  fi
+
+  stat=$?
+  if test $stat -eq 0; then :
+  else
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+
+  if test -f "$tmpdepfile"; then
+    # Each line is of the form `foo.o: dependent.h'.
+    # Do two passes, one to just change these to
+    # `$object: dependent.h' and one to simply `dependent.h:'.
+    sed -e "s,^$outname:,$object :," < "$tmpdepfile" > "$depfile"
+    sed -e "s,^$outname: \(.*\)$,\1:," < "$tmpdepfile" >> "$depfile"
+  else
+    # The sourcefile does not contain any dependencies, so just
+    # store a dummy comment line, to avoid errors with the Makefile
+    # "include basename.Plo" scheme.
+    echo "#dummy" > "$depfile"
+  fi
+  rm -f "$tmpdepfile"
+  ;;
+
+icc)
+  # Must come before tru64.
+
+  # Intel's C compiler understands `-MD -MF file'.  However
+  #    icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c
+  # will fill foo.d with something like
+  #    foo.o: sub/foo.c
+  #    foo.o: sub/foo.h
+  # which is wrong.  We want:
+  #    sub/foo.o: sub/foo.c
+  #    sub/foo.o: sub/foo.h
+  #    sub/foo.c:
+  #    sub/foo.h:
+
+  "$@" -MD -MF "$tmpdepfile"
+  stat=$?
+  if test $stat -eq 0; then :
+  else
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+  # Each line is of the form `foo.o: dependent.h'.
+  # Do two passes, one to just change these to
+  # `$object: dependent.h' and one to simply `dependent.h:'.
+  sed -e "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
+  sed -e "s,^[^:]*: \(.*\)$,\1:," < "$tmpdepfile" >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+tru64)
+   # The Tru64 AIX compiler uses -MD to generate dependencies as a side
+   # effect.  `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'.
+   # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put 
+   # dependencies in `foo.d' instead, so we check for that too.
+   # Subdirectories are respected.
+
+   tmpdepfile1="$object.d"
+   tmpdepfile2=`echo "$object" | sed -e 's/.o$/.d/'` 
+   if test "$libtool" = yes; then
+      "$@" -Wc,-MD
+   else
+      "$@" -MD
+   fi
+
+   stat=$?
+   if test $stat -eq 0; then :
+   else
+      rm -f "$tmpdepfile1" "$tmpdepfile2"
+      exit $stat
+   fi
+
+   if test -f "$tmpdepfile1"; then
+      tmpdepfile="$tmpdepfile1"
+   else
+      tmpdepfile="$tmpdepfile2"
+   fi
+   if test -f "$tmpdepfile"; then
+      sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
+      # That's a space and a tab in the [].
+      sed -e 's,^.*\.[a-z]*:[ 	]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
+   else
+      echo "#dummy" > "$depfile"
+   fi
+   rm -f "$tmpdepfile"
+   ;;
+
+#nosideeffect)
+  # This comment above is used by automake to tell side-effect
+  # dependency tracking mechanisms from slower ones.
+
+dashmstdout)
+  # Important note: in order to support this mode, a compiler *must*
+  # always write the proprocessed file to stdout, regardless of -o,
+  # because we must use -o when running libtool.
+  test -z "$dashmflag" && dashmflag=-M
+  ( IFS=" "
+    case " $* " in
+    *" --mode=compile "*) # this is libtool, let us make it quiet
+      for arg
+      do # cycle over the arguments
+        case "$arg" in
+	"--mode=compile")
+	  # insert --quiet before "--mode=compile"
+	  set fnord "$@" --quiet
+	  shift # fnord
+	  ;;
+	esac
+	set fnord "$@" "$arg"
+	shift # fnord
+	shift # "$arg"
+      done
+      ;;
+    esac
+    "$@" $dashmflag | sed 's:^[^:]*\:[ 	]*:'"$object"'\: :' > "$tmpdepfile"
+  ) &
+  proc=$!
+  "$@"
+  stat=$?
+  wait "$proc"
+  if test "$stat" != 0; then exit $stat; fi
+  rm -f "$depfile"
+  cat < "$tmpdepfile" > "$depfile"
+  tr ' ' '
+' < "$tmpdepfile" | \
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly.  Breaking it into two sed invocations is a workaround.
+    sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+dashXmstdout)
+  # This case only exists to satisfy depend.m4.  It is never actually
+  # run, as this mode is specially recognized in the preamble.
+  exit 1
+  ;;
+
+makedepend)
+  # X makedepend
+  (
+    shift
+    cleared=no
+    for arg in "$@"; do
+      case $cleared in no)
+        set ""; shift
+	cleared=yes
+      esac
+      case "$arg" in
+        -D*|-I*)
+	  set fnord "$@" "$arg"; shift;;
+	-*)
+	  ;;
+	*)
+	  set fnord "$@" "$arg"; shift;;
+      esac
+    done
+    obj_suffix="`echo $object | sed 's/^.*\././'`"
+    touch "$tmpdepfile"
+    ${MAKEDEPEND-makedepend} 2>/dev/null -o"$obj_suffix" -f"$tmpdepfile" "$@"
+  ) &
+  proc=$!
+  "$@"
+  stat=$?
+  wait "$proc"
+  if test "$stat" != 0; then exit $stat; fi
+  rm -f "$depfile"
+  cat < "$tmpdepfile" > "$depfile"
+  tail +3 "$tmpdepfile" | tr ' ' '
+' | \
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly.  Breaking it into two sed invocations is a workaround.
+    sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile" "$tmpdepfile".bak
+  ;;
+
+cpp)
+  # Important note: in order to support this mode, a compiler *must*
+  # always write the proprocessed file to stdout, regardless of -o,
+  # because we must use -o when running libtool.
+  ( IFS=" "
+    case " $* " in
+    *" --mode=compile "*)
+      for arg
+      do # cycle over the arguments
+        case $arg in
+	"--mode=compile")
+	  # insert --quiet before "--mode=compile"
+	  set fnord "$@" --quiet
+	  shift # fnord
+	  ;;
+	esac
+	set fnord "$@" "$arg"
+	shift # fnord
+	shift # "$arg"
+      done
+      ;;
+    esac
+    "$@" -E |
+    sed -n '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' |
+    sed '$ s: \\$::' > "$tmpdepfile"
+  ) &
+  proc=$!
+  "$@"
+  stat=$?
+  wait "$proc"
+  if test "$stat" != 0; then exit $stat; fi
+  rm -f "$depfile"
+  echo "$object : \\" > "$depfile"
+  cat < "$tmpdepfile" >> "$depfile"
+  sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+msvisualcpp)
+  # Important note: in order to support this mode, a compiler *must*
+  # always write the proprocessed file to stdout, regardless of -o,
+  # because we must use -o when running libtool.
+  ( IFS=" "
+    case " $* " in
+    *" --mode=compile "*)
+      for arg
+      do # cycle over the arguments
+        case $arg in
+	"--mode=compile")
+	  # insert --quiet before "--mode=compile"
+	  set fnord "$@" --quiet
+	  shift # fnord
+	  ;;
+	esac
+	set fnord "$@" "$arg"
+	shift # fnord
+	shift # "$arg"
+      done
+      ;;
+    esac
+    "$@" -E |
+    sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::echo "`cygpath -u \\"\1\\"`":p' | sort | uniq > "$tmpdepfile"
+  ) &
+  proc=$!
+  "$@"
+  stat=$?
+  wait "$proc"
+  if test "$stat" != 0; then exit $stat; fi
+  rm -f "$depfile"
+  echo "$object : \\" > "$depfile"
+  . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::	\1 \\:p' >> "$depfile"
+  echo "	" >> "$depfile"
+  . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::\1\::p' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+none)
+  exec "$@"
+  ;;
+
+*)
+  echo "Unknown depmode $depmode" 1>&2
+  exit 1
+  ;;
+esac
+
+exit 0
Index: /tags/ipp-1-X/bug123/psLib/etc/.cvsignore
===================================================================
--- /tags/ipp-1-X/bug123/psLib/etc/.cvsignore	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/etc/.cvsignore	(revision 22331)
@@ -0,0 +1,2 @@
+Makefile
+Makefile.in
Index: /tags/ipp-1-X/bug123/psLib/etc/Makefile.am
===================================================================
--- /tags/ipp-1-X/bug123/psLib/etc/Makefile.am	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/etc/Makefile.am	(revision 22331)
@@ -0,0 +1,2 @@
+SUBDIRS = pslib 
+
Index: /tags/ipp-1-X/bug123/psLib/etc/pslib/.cvsignore
===================================================================
--- /tags/ipp-1-X/bug123/psLib/etc/pslib/.cvsignore	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/etc/pslib/.cvsignore	(revision 22331)
@@ -0,0 +1,3 @@
+psTime.config
+Makefile
+Makefile.in
Index: /tags/ipp-1-X/bug123/psLib/etc/pslib/Makefile.am
===================================================================
--- /tags/ipp-1-X/bug123/psLib/etc/pslib/Makefile.am	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/etc/pslib/Makefile.am	(revision 22331)
@@ -0,0 +1,21 @@
+ #Makefile for astronomy functions of psLib
+#
+
+BUILT_SOURCES = psTime.config 
+CLEANFILES = psTime.config
+
+EXTRA_DIST = psTime.xml psTime.config.template 
+
+psTime.config: psTime.config.template
+	sed 's|PREFIX|$(prefix)|' $? > $@
+
+$(sysconfdir)/pslib:
+	mkdir -p -m 755 $(sysconfdir)/pslib
+
+install-exec-hook: psTime.config $(sysconfdir)/pslib
+	if [ `pwd` != $(sysconfdir)/pslib ] ; then  $(INSTALL) $(srcdir)/psTime.xml psTime.config $(sysconfdir)/pslib ; fi
+
+uninstall-local:
+	if [ `pwd` != $(sysconfdir) ] ; then  rm -rf $(sysconfdir) ; fi
+
+	
Index: /tags/ipp-1-X/bug123/psLib/etc/pslib/psTime.config.template
===================================================================
--- /tags/ipp-1-X/bug123/psLib/etc/pslib/psTime.config.template	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/etc/pslib/psTime.config.template	(revision 22331)
@@ -0,0 +1,23 @@
+# This configuration file specifies values required for time calculations by psLib.
+psLib.time.tables.dir STR PREFIX/share/pslib                                            # Directory for time tables
+psLib.time.tables.n S32 4                                                               # Number of time tables
+psLib.time.tables.files STR ser7.dat eopc01_1900_2004.dat finals_all.dat tai_utc.dat    # These are the table file names
+@psLib.time.tables.from F64 53258.0, 15020.0, 41684.0 2437300.5                         # Valid from these dates
+@psLib.time.tables.to F64 53622.0, 53258.0, 53627.0 2451179.5                           # Valid to these dates
+psLib.time.before.xp F64 0.0                                                            # Value of XP for before the earliest MJD
+psLib.time.before.yp F64 0.0                                                            # Value of YP for before the earliest MJD
+psLib.time.before.dut F64 0.0                                                           # Value of UT1-UTC for before the earliest MJD
+
+# Now follows formulae for predicting ahead of the most recent available table entry.
+# xp = [0] + [1]*cos A + [2]*sin A + [3]*cos C + [4]*sin C
+# yp = [0] + [1]*cos A + [2]*sin A + [3]*cos C + [4]*sin C
+# A = 2*pi*(MJD - pslib.time.predict.mjd)/365.25
+# C = 2*pi*(MJD - pslib.time.predict.mjd)/435.0
+# dut = ut1-utc = [0] + [1]*(MJD - [2]) - (UT2-UT1)
+# ut2-ut1 = 0.022 sin(2*pi*T) - 0.012 cos(2*pi*T) - 0.006 sin(4*pi*T) + 0.007 cos(4*pi*T)
+# T = 2000.0 + (MJD - 51544.03)/365.2422
+@psLib.time.predict.xp F64 0.0569, 0.0555, -0.0200, 0.0513, 0.1483
+@psLib.time.predict.yp F64 0.3498, -0.0176, -0.0498, 0.1483, -0.0513
+psLib.time.predict.mjd F64 53257.0
+@psLib.time.predict.dut F64 -0.4944, -0.00023, 53262.0
+
Index: /tags/ipp-1-X/bug123/psLib/etc/pslib/psTime.xml
===================================================================
--- /tags/ipp-1-X/bug123/psLib/etc/pslib/psTime.xml	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/etc/pslib/psTime.xml	(revision 22331)
@@ -0,0 +1,45 @@
+<?xml version="1.0"?>
+
+<!-- This configuration file specifies values required for time calculations by psLib -->
+<psRoot>
+
+    <!-- Directory for time tables -->
+    <psMetadataItem name = "psLib.time.tables.dir" psType = "psString" value = "../../data"/>
+
+    <!-- Number of time tables -->
+    <psMetadataItem name = "psLib.time.tables.n" psType = "psS32" value = "4"/>
+
+    <!-- Table file names -->
+    <psMetadataItem name = "psLib.time.tables.files" psType = "psString" value = "ser7.dat eopc01_1900_2004.dat finals_all.dat tai_utc.dat"/>
+
+    <!-- Valid from these dates -->
+    <psVector name = "psLib.time.tables.from" psType = "psF64" value = "53258.0, 15020.0, 41684.0 2437300.5"/>
+
+    <!-- Valid to these dates -->
+    <psVector name = "psLib.time.tables.to" psType = "psF64" value = "53622.0, 53258.0, 53627.0 2451179.5"/>
+
+    <!-- Value of XP for before the earliest MJD -->
+    <psMetadataItem name = "psLib.time.before.xp" psType = "psF64" value = "0.0"/>
+
+    <!-- Value of YP for before the earliest MJD -->
+    <psMetadataItem name = "psLib.time.before.yp" psType = "psF64" value = "0.0"/>
+
+    <!-- Value of UT1-UTC for before the earliest MJD -->
+    <psMetadataItem name = "psLib.time.before.dut" psType = "psF64" value = "0.0"/>
+
+
+    <!-- Now follows formulae for predicting ahead of the most recent available table entry.
+            xp = [0] + [1]*cos A + [2]*sin A + [3]*cos C + [4]*sin C
+            yp = [0] + [1]*cos A + [2]*sin A + [3]*cos C + [4]*sin C
+            A = 2*pi*(MJD - pslib.time.predict.mjd)/365.25
+            C = 2*pi*(MJD - pslib.time.predict.mjd)/435.0
+            dut = ut1-utc = [0] + [1]*(MJD - [2]) - (UT2-UT1)
+            ut2-ut1 = 0.022 sin(2*pi*T) - 0.012 cos(2*pi*T) - 0.006 sin(4*pi*T) + 0.007 cos(4*pi*T)
+            T = 2000.0 + (MJD - 51544.03)/365.2422
+    -->    
+    <psVector name = "psLib.time.predict.xp" psType = "psF64" value = "0.0569, 0.0555, -0.0200, 0.0513, 0.1483"/>
+    <psVector name = "psLib.time.predict.yp" psType = "psF64" value = "0.3498, -0.0176, -0.0498, 0.1483, -0.0513"/>
+    <psMetadataItem name = "psLib.time.predict.mjd" psType = "psF64" value = "53257.0"/>
+    <psVector name = "psLib.time.predict.dut" psType = "psF64" value = "-0.4944, -0.00023, 53262.0"/>
+
+</psRoot>
Index: /tags/ipp-1-X/bug123/psLib/install-sh
===================================================================
--- /tags/ipp-1-X/bug123/psLib/install-sh	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/install-sh	(revision 22331)
@@ -0,0 +1,276 @@
+#!/bin/sh
+#
+# install - install a program, script, or datafile
+# This comes from X11R5 (mit/util/scripts/install.sh).
+#
+# Copyright 1991 by the Massachusetts Institute of Technology
+#
+# 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, and that the name of M.I.T. not be used in advertising or
+# publicity pertaining to distribution of the software without specific,
+# written prior permission.  M.I.T. makes no representations about the
+# suitability of this software for any purpose.  It is provided "as is"
+# without express or implied warranty.
+#
+# Calling this script install-sh is preferred over install.sh, to prevent
+# `make' implicit rules from creating a file called install from it
+# when there is no Makefile.
+#
+# This script is compatible with the BSD install script, but was written
+# from scratch.  It can only install one file at a time, a restriction
+# shared with many OS's install programs.
+
+
+# set DOITPROG to echo to test this script
+
+# Don't use :- since 4.3BSD and earlier shells don't like it.
+doit="${DOITPROG-}"
+
+
+# put in absolute paths if you don't have them in your path; or use env. vars.
+
+mvprog="${MVPROG-mv}"
+cpprog="${CPPROG-cp}"
+chmodprog="${CHMODPROG-chmod}"
+chownprog="${CHOWNPROG-chown}"
+chgrpprog="${CHGRPPROG-chgrp}"
+stripprog="${STRIPPROG-strip}"
+rmprog="${RMPROG-rm}"
+mkdirprog="${MKDIRPROG-mkdir}"
+
+transformbasename=""
+transform_arg=""
+instcmd="$mvprog"
+chmodcmd="$chmodprog 0755"
+chowncmd=""
+chgrpcmd=""
+stripcmd=""
+rmcmd="$rmprog -f"
+mvcmd="$mvprog"
+src=""
+dst=""
+dir_arg=""
+
+while [ x"$1" != x ]; do
+    case $1 in
+	-c) instcmd=$cpprog
+	    shift
+	    continue;;
+
+	-d) dir_arg=true
+	    shift
+	    continue;;
+
+	-m) chmodcmd="$chmodprog $2"
+	    shift
+	    shift
+	    continue;;
+
+	-o) chowncmd="$chownprog $2"
+	    shift
+	    shift
+	    continue;;
+
+	-g) chgrpcmd="$chgrpprog $2"
+	    shift
+	    shift
+	    continue;;
+
+	-s) stripcmd=$stripprog
+	    shift
+	    continue;;
+
+	-t=*) transformarg=`echo $1 | sed 's/-t=//'`
+	    shift
+	    continue;;
+
+	-b=*) transformbasename=`echo $1 | sed 's/-b=//'`
+	    shift
+	    continue;;
+
+	*)  if [ x"$src" = x ]
+	    then
+		src=$1
+	    else
+		# this colon is to work around a 386BSD /bin/sh bug
+		:
+		dst=$1
+	    fi
+	    shift
+	    continue;;
+    esac
+done
+
+if [ x"$src" = x ]
+then
+	echo "$0: no input file specified" >&2
+	exit 1
+else
+	:
+fi
+
+if [ x"$dir_arg" != x ]; then
+	dst=$src
+	src=""
+
+	if [ -d "$dst" ]; then
+		instcmd=:
+		chmodcmd=""
+	else
+		instcmd=$mkdirprog
+	fi
+else
+
+# Waiting for this to be detected by the "$instcmd $src $dsttmp" command
+# might cause directories to be created, which would be especially bad
+# if $src (and thus $dsttmp) contains '*'.
+
+	if [ -f "$src" ] || [ -d "$src" ]
+	then
+		:
+	else
+		echo "$0: $src does not exist" >&2
+		exit 1
+	fi
+
+	if [ x"$dst" = x ]
+	then
+		echo "$0: no destination specified" >&2
+		exit 1
+	else
+		:
+	fi
+
+# If destination is a directory, append the input filename; if your system
+# does not like double slashes in filenames, you may need to add some logic
+
+	if [ -d "$dst" ]
+	then
+		dst=$dst/`basename "$src"`
+	else
+		:
+	fi
+fi
+
+## this sed command emulates the dirname command
+dstdir=`echo "$dst" | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
+
+# Make sure that the destination directory exists.
+#  this part is taken from Noah Friedman's mkinstalldirs script
+
+# Skip lots of stat calls in the usual case.
+if [ ! -d "$dstdir" ]; then
+defaultIFS='
+	'
+IFS="${IFS-$defaultIFS}"
+
+oIFS=$IFS
+# Some sh's can't handle IFS=/ for some reason.
+IFS='%'
+set - `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'`
+IFS=$oIFS
+
+pathcomp=''
+
+while [ $# -ne 0 ] ; do
+	pathcomp=$pathcomp$1
+	shift
+
+	if [ ! -d "$pathcomp" ] ;
+        then
+		$mkdirprog "$pathcomp"
+	else
+		:
+	fi
+
+	pathcomp=$pathcomp/
+done
+fi
+
+if [ x"$dir_arg" != x ]
+then
+	$doit $instcmd "$dst" &&
+
+	if [ x"$chowncmd" != x ]; then $doit $chowncmd "$dst"; else : ; fi &&
+	if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd "$dst"; else : ; fi &&
+	if [ x"$stripcmd" != x ]; then $doit $stripcmd "$dst"; else : ; fi &&
+	if [ x"$chmodcmd" != x ]; then $doit $chmodcmd "$dst"; else : ; fi
+else
+
+# If we're going to rename the final executable, determine the name now.
+
+	if [ x"$transformarg" = x ]
+	then
+		dstfile=`basename "$dst"`
+	else
+		dstfile=`basename "$dst" $transformbasename |
+			sed $transformarg`$transformbasename
+	fi
+
+# don't allow the sed command to completely eliminate the filename
+
+	if [ x"$dstfile" = x ]
+	then
+		dstfile=`basename "$dst"`
+	else
+		:
+	fi
+
+# Make a couple of temp file names in the proper directory.
+
+	dsttmp=$dstdir/#inst.$$#
+	rmtmp=$dstdir/#rm.$$#
+
+# Trap to clean up temp files at exit.
+
+	trap 'status=$?; rm -f "$dsttmp" "$rmtmp" && exit $status' 0
+	trap '(exit $?); exit' 1 2 13 15
+
+# Move or copy the file name to the temp name
+
+	$doit $instcmd "$src" "$dsttmp" &&
+
+# and set any options; do chmod last to preserve setuid bits
+
+# If any of these fail, we abort the whole thing.  If we want to
+# ignore errors from any of these, just make sure not to ignore
+# errors from the above "$doit $instcmd $src $dsttmp" command.
+
+	if [ x"$chowncmd" != x ]; then $doit $chowncmd "$dsttmp"; else :;fi &&
+	if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd "$dsttmp"; else :;fi &&
+	if [ x"$stripcmd" != x ]; then $doit $stripcmd "$dsttmp"; else :;fi &&
+	if [ x"$chmodcmd" != x ]; then $doit $chmodcmd "$dsttmp"; else :;fi &&
+
+# Now remove or move aside any old file at destination location.  We try this
+# two ways since rm can't unlink itself on some systems and the destination
+# file might be busy for other reasons.  In this case, the final cleanup
+# might fail but the new file should still install successfully.
+
+{
+	if [ -f "$dstdir/$dstfile" ]
+	then
+		$doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null ||
+		$doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null ||
+		{
+		  echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2
+		  (exit 1); exit
+		}
+	else
+		:
+	fi
+} &&
+
+# Now rename the file to the real destination.
+
+	$doit $mvcmd "$dsttmp" "$dstdir/$dstfile"
+
+fi &&
+
+# The final little trick to "correctly" pass the exit status to the exit trap.
+
+{
+	(exit 0); exit
+}
Index: /tags/ipp-1-X/bug123/psLib/ltmain.sh
===================================================================
--- /tags/ipp-1-X/bug123/psLib/ltmain.sh	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/ltmain.sh	(revision 22331)
@@ -0,0 +1,6425 @@
+# ltmain.sh - Provide generalized library-building support services.
+# NOTE: Changing this file will not affect anything until you rerun configure.
+#
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004
+# Free Software Foundation, Inc.
+# Originally by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
+#
+# 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+basename="s,^.*/,,g"
+
+# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh
+# is ksh but when the shell is invoked as "sh" and the current value of
+# the _XPG environment variable is not equal to 1 (one), the special
+# positional parameter $0, within a function call, is the name of the
+# function.
+progpath="$0"
+
+# RH: define SED for historic ltconfig's generated by Libtool 1.3
+[ -z "$SED" ] && SED=sed
+
+# The name of this program:
+progname=`echo "$progpath" | $SED $basename`
+modename="$progname"
+
+# Global variables:
+EXIT_SUCCESS=0
+EXIT_FAILURE=1
+
+PROGRAM=ltmain.sh
+PACKAGE=libtool
+VERSION=1.5.6
+TIMESTAMP=" (1.1220.2.95 2004/04/11 05:50:42)"
+
+
+# Check that we have a working $echo.
+if test "X$1" = X--no-reexec; then
+  # Discard the --no-reexec flag, and continue.
+  shift
+elif test "X$1" = X--fallback-echo; then
+  # Avoid inline document here, it may be left over
+  :
+elif test "X`($echo '\t') 2>/dev/null`" = 'X\t'; then
+  # Yippee, $echo works!
+  :
+else
+  # Restart under the correct shell, and then maybe $echo will work.
+  exec $SHELL "$progpath" --no-reexec ${1+"$@"}
+fi
+
+if test "X$1" = X--fallback-echo; then
+  # used as fallback echo
+  shift
+  cat <<EOF
+$*
+EOF
+  exit $EXIT_SUCCESS
+fi
+
+default_mode=
+help="Try \`$progname --help' for more information."
+magic="%%%MAGIC variable%%%"
+mkdir="mkdir"
+mv="mv -f"
+rm="rm -f"
+
+# Sed substitution that helps us do robust quoting.  It backslashifies
+# metacharacters that are still active within double-quoted strings.
+Xsed="${SED}"' -e 1s/^X//'
+sed_quote_subst='s/\([\\`\\"$\\\\]\)/\\\1/g'
+# test EBCDIC or ASCII
+case `echo A|tr A '\301'` in
+ A) # EBCDIC based system
+  SP2NL="tr '\100' '\n'"
+  NL2SP="tr '\r\n' '\100\100'"
+  ;;
+ *) # Assume ASCII based system
+  SP2NL="tr '\040' '\012'"
+  NL2SP="tr '\015\012' '\040\040'"
+  ;;
+esac
+
+# NLS nuisances.
+# Only set LANG and LC_ALL to C if already set.
+# These must not be set unconditionally because not all systems understand
+# e.g. LANG=C (notably SCO).
+# We save the old values to restore during execute mode.
+if test "${LC_ALL+set}" = set; then
+  save_LC_ALL="$LC_ALL"; LC_ALL=C; export LC_ALL
+fi
+if test "${LANG+set}" = set; then
+  save_LANG="$LANG"; LANG=C; export LANG
+fi
+
+# Make sure IFS has a sensible default
+: ${IFS=" 	
+"}
+
+if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then
+  $echo "$modename: not configured to build any kind of library" 1>&2
+  $echo "Fatal configuration error.  See the $PACKAGE docs for more information." 1>&2
+  exit $EXIT_FAILURE
+fi
+
+# Global variables.
+mode=$default_mode
+nonopt=
+prev=
+prevopt=
+run=
+show="$echo"
+show_help=
+execute_dlfiles=
+lo2o="s/\\.lo\$/.${objext}/"
+o2lo="s/\\.${objext}\$/.lo/"
+
+#####################################
+# Shell function definitions:
+# This seems to be the best place for them
+
+# func_win32_libid arg
+# return the library type of file 'arg'
+#
+# Need a lot of goo to handle *both* DLLs and import libs
+# Has to be a shell function in order to 'eat' the argument
+# that is supplied when $file_magic_command is called.
+func_win32_libid () {
+  win32_libid_type="unknown"
+  win32_fileres=`file -L $1 2>/dev/null`
+  case $win32_fileres in
+  *ar\ archive\ import\ library*) # definitely import
+    win32_libid_type="x86 archive import"
+    ;;
+  *ar\ archive*) # could be an import, or static
+    if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | \
+      $EGREP -e 'file format pe-i386(.*architecture: i386)?' >/dev/null ; then
+      win32_nmres=`eval $NM -f posix -A $1 | \
+	sed -n -e '1,100{/ I /{x;/import/!{s/^/import/;h;p;};x;};}'`
+      if test "X$win32_nmres" = "Ximport" ; then
+        win32_libid_type="x86 archive import"
+      else
+        win32_libid_type="x86 archive static"
+      fi
+    fi
+    ;;
+  *DLL*)
+    win32_libid_type="x86 DLL"
+    ;;
+  *executable*) # but shell scripts are "executable" too...
+    case $win32_fileres in
+    *MS\ Windows\ PE\ Intel*)
+      win32_libid_type="x86 DLL"
+      ;;
+    esac
+    ;;
+  esac
+  $echo $win32_libid_type
+}
+
+
+# func_infer_tag arg
+# Infer tagged configuration to use if any are available and
+# if one wasn't chosen via the "--tag" command line option.
+# Only attempt this if the compiler in the base compile
+# command doesn't match the default compiler.
+# arg is usually of the form 'gcc ...'
+func_infer_tag () {
+    if test -n "$available_tags" && test -z "$tagname"; then
+      CC_quoted=
+      for arg in $CC; do
+	case $arg in
+	  *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+	  arg="\"$arg\""
+	  ;;
+	esac
+	CC_quoted="$CC_quoted $arg"
+      done
+      case $@ in
+      # Blanks in the command may have been stripped by the calling shell,
+      # but not from the CC environment variable when configure was run.
+      " $CC "* | "$CC "* | " `$echo $CC` "* | "`$echo $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$echo $CC_quoted` "* | "`$echo $CC_quoted` "*) ;;
+      # Blanks at the start of $base_compile will cause this to fail
+      # if we don't check for them as well.
+      *)
+	for z in $available_tags; do
+	  if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then
+	    # Evaluate the configuration.
+	    eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`"
+	    CC_quoted=
+	    for arg in $CC; do
+	    # Double-quote args containing other shell metacharacters.
+	    case $arg in
+	      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+	      arg="\"$arg\""
+	      ;;
+	    esac
+	    CC_quoted="$CC_quoted $arg"
+	  done
+	    case "$@ " in
+	      " $CC "* | "$CC "* | " `$echo $CC` "* | "`$echo $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$echo $CC_quoted` "* | "`$echo $CC_quoted` "*)
+	      # The compiler in the base compile command matches
+	      # the one in the tagged configuration.
+	      # Assume this is the tagged configuration we want.
+	      tagname=$z
+	      break
+	      ;;
+	    esac
+	  fi
+	done
+	# If $tagname still isn't set, then no tagged configuration
+	# was found and let the user know that the "--tag" command
+	# line option must be used.
+	if test -z "$tagname"; then
+	  $echo "$modename: unable to infer tagged configuration"
+	  $echo "$modename: specify a tag with \`--tag'" 1>&2
+	  exit $EXIT_FAILURE
+#        else
+#          $echo "$modename: using $tagname tagged configuration"
+	fi
+	;;
+      esac
+    fi
+}
+# End of Shell function definitions
+#####################################
+
+# Darwin sucks
+eval std_shrext=\"$shrext_cmds\"
+
+# Parse our command line options once, thoroughly.
+while test "$#" -gt 0
+do
+  arg="$1"
+  shift
+
+  case $arg in
+  -*=*) optarg=`$echo "X$arg" | $Xsed -e 's/[-_a-zA-Z0-9]*=//'` ;;
+  *) optarg= ;;
+  esac
+
+  # If the previous option needs an argument, assign it.
+  if test -n "$prev"; then
+    case $prev in
+    execute_dlfiles)
+      execute_dlfiles="$execute_dlfiles $arg"
+      ;;
+    tag)
+      tagname="$arg"
+      preserve_args="${preserve_args}=$arg"
+
+      # Check whether tagname contains only valid characters
+      case $tagname in
+      *[!-_A-Za-z0-9,/]*)
+	$echo "$progname: invalid tag name: $tagname" 1>&2
+	exit $EXIT_FAILURE
+	;;
+      esac
+
+      case $tagname in
+      CC)
+	# Don't test for the "default" C tag, as we know, it's there, but
+	# not specially marked.
+	;;
+      *)
+	if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "$progpath" > /dev/null; then
+	  taglist="$taglist $tagname"
+	  # Evaluate the configuration.
+	  eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$tagname'$/,/^# ### END LIBTOOL TAG CONFIG: '$tagname'$/p' < $progpath`"
+	else
+	  $echo "$progname: ignoring unknown tag $tagname" 1>&2
+	fi
+	;;
+      esac
+      ;;
+    *)
+      eval "$prev=\$arg"
+      ;;
+    esac
+
+    prev=
+    prevopt=
+    continue
+  fi
+
+  # Have we seen a non-optional argument yet?
+  case $arg in
+  --help)
+    show_help=yes
+    ;;
+
+  --version)
+    $echo "$PROGRAM (GNU $PACKAGE) $VERSION$TIMESTAMP"
+    $echo
+    $echo "Copyright (C) 2003  Free Software Foundation, Inc."
+    $echo "This is free software; see the source for copying conditions.  There is NO"
+    $echo "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+    exit $EXIT_SUCCESS
+    ;;
+
+  --config)
+    ${SED} -e '1,/^# ### BEGIN LIBTOOL CONFIG/d' -e '/^# ### END LIBTOOL CONFIG/,$d' $progpath
+    # Now print the configurations for the tags.
+    for tagname in $taglist; do
+      ${SED} -n -e "/^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$/,/^# ### END LIBTOOL TAG CONFIG: $tagname$/p" < "$progpath"
+    done
+    exit $EXIT_SUCCESS
+    ;;
+
+  --debug)
+    $echo "$progname: enabling shell trace mode"
+    set -x
+    preserve_args="$preserve_args $arg"
+    ;;
+
+  --dry-run | -n)
+    run=:
+    ;;
+
+  --features)
+    $echo "host: $host"
+    if test "$build_libtool_libs" = yes; then
+      $echo "enable shared libraries"
+    else
+      $echo "disable shared libraries"
+    fi
+    if test "$build_old_libs" = yes; then
+      $echo "enable static libraries"
+    else
+      $echo "disable static libraries"
+    fi
+    exit $EXIT_SUCCESS
+    ;;
+
+  --finish) mode="finish" ;;
+
+  --mode) prevopt="--mode" prev=mode ;;
+  --mode=*) mode="$optarg" ;;
+
+  --preserve-dup-deps) duplicate_deps="yes" ;;
+
+  --quiet | --silent)
+    show=:
+    preserve_args="$preserve_args $arg"
+    ;;
+
+  --tag) prevopt="--tag" prev=tag ;;
+  --tag=*)
+    set tag "$optarg" ${1+"$@"}
+    shift
+    prev=tag
+    preserve_args="$preserve_args --tag"
+    ;;
+
+  -dlopen)
+    prevopt="-dlopen"
+    prev=execute_dlfiles
+    ;;
+
+  -*)
+    $echo "$modename: unrecognized option \`$arg'" 1>&2
+    $echo "$help" 1>&2
+    exit $EXIT_FAILURE
+    ;;
+
+  *)
+    nonopt="$arg"
+    break
+    ;;
+  esac
+done
+
+if test -n "$prevopt"; then
+  $echo "$modename: option \`$prevopt' requires an argument" 1>&2
+  $echo "$help" 1>&2
+  exit $EXIT_FAILURE
+fi
+
+# If this variable is set in any of the actions, the command in it
+# will be execed at the end.  This prevents here-documents from being
+# left over by shells.
+exec_cmd=
+
+if test -z "$show_help"; then
+
+  # Infer the operation mode.
+  if test -z "$mode"; then
+    $echo "*** Warning: inferring the mode of operation is deprecated." 1>&2
+    $echo "*** Future versions of Libtool will require -mode=MODE be specified." 1>&2
+    case $nonopt in
+    *cc | cc* | *++ | gcc* | *-gcc* | g++* | xlc*)
+      mode=link
+      for arg
+      do
+	case $arg in
+	-c)
+	   mode=compile
+	   break
+	   ;;
+	esac
+      done
+      ;;
+    *db | *dbx | *strace | *truss)
+      mode=execute
+      ;;
+    *install*|cp|mv)
+      mode=install
+      ;;
+    *rm)
+      mode=uninstall
+      ;;
+    *)
+      # If we have no mode, but dlfiles were specified, then do execute mode.
+      test -n "$execute_dlfiles" && mode=execute
+
+      # Just use the default operation mode.
+      if test -z "$mode"; then
+	if test -n "$nonopt"; then
+	  $echo "$modename: warning: cannot infer operation mode from \`$nonopt'" 1>&2
+	else
+	  $echo "$modename: warning: cannot infer operation mode without MODE-ARGS" 1>&2
+	fi
+      fi
+      ;;
+    esac
+  fi
+
+  # Only execute mode is allowed to have -dlopen flags.
+  if test -n "$execute_dlfiles" && test "$mode" != execute; then
+    $echo "$modename: unrecognized option \`-dlopen'" 1>&2
+    $echo "$help" 1>&2
+    exit $EXIT_FAILURE
+  fi
+
+  # Change the help message to a mode-specific one.
+  generic_help="$help"
+  help="Try \`$modename --help --mode=$mode' for more information."
+
+  # These modes are in order of execution frequency so that they run quickly.
+  case $mode in
+  # libtool compile mode
+  compile)
+    modename="$modename: compile"
+    # Get the compilation command and the source file.
+    base_compile=
+    srcfile="$nonopt"  #  always keep a non-empty value in "srcfile"
+    suppress_opt=yes
+    suppress_output=
+    arg_mode=normal
+    libobj=
+    later=
+
+    for arg
+    do
+      case "$arg_mode" in
+      arg  )
+	# do not "continue".  Instead, add this to base_compile
+	lastarg="$arg"
+	arg_mode=normal
+	;;
+
+      target )
+	libobj="$arg"
+	arg_mode=normal
+	continue
+	;;
+
+      normal )
+	# Accept any command-line options.
+	case $arg in
+	-o)
+	  if test -n "$libobj" ; then
+	    $echo "$modename: you cannot specify \`-o' more than once" 1>&2
+	    exit $EXIT_FAILURE
+	  fi
+	  arg_mode=target
+	  continue
+	  ;;
+
+	-static | -prefer-pic | -prefer-non-pic)
+	  later="$later $arg"
+	  continue
+	  ;;
+
+	-no-suppress)
+	  suppress_opt=no
+	  continue
+	  ;;
+
+	-Xcompiler)
+	  arg_mode=arg  #  the next one goes into the "base_compile" arg list
+	  continue      #  The current "srcfile" will either be retained or
+	  ;;            #  replaced later.  I would guess that would be a bug.
+
+	-Wc,*)
+	  args=`$echo "X$arg" | $Xsed -e "s/^-Wc,//"`
+	  lastarg=
+	  save_ifs="$IFS"; IFS=','
+ 	  for arg in $args; do
+	    IFS="$save_ifs"
+
+	    # Double-quote args containing other shell metacharacters.
+	    # Many Bourne shells cannot handle close brackets correctly
+	    # in scan sets, so we specify it separately.
+	    case $arg in
+	      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+	      arg="\"$arg\""
+	      ;;
+	    esac
+	    lastarg="$lastarg $arg"
+	  done
+	  IFS="$save_ifs"
+	  lastarg=`$echo "X$lastarg" | $Xsed -e "s/^ //"`
+
+	  # Add the arguments to base_compile.
+	  base_compile="$base_compile $lastarg"
+	  continue
+	  ;;
+
+	* )
+	  # Accept the current argument as the source file.
+	  # The previous "srcfile" becomes the current argument.
+	  #
+	  lastarg="$srcfile"
+	  srcfile="$arg"
+	  ;;
+	esac  #  case $arg
+	;;
+      esac    #  case $arg_mode
+
+      # Aesthetically quote the previous argument.
+      lastarg=`$echo "X$lastarg" | $Xsed -e "$sed_quote_subst"`
+
+      case $lastarg in
+      # Double-quote args containing other shell metacharacters.
+      # Many Bourne shells cannot handle close brackets correctly
+      # in scan sets, so we specify it separately.
+      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+	lastarg="\"$lastarg\""
+	;;
+      esac
+
+      base_compile="$base_compile $lastarg"
+    done # for arg
+
+    case $arg_mode in
+    arg)
+      $echo "$modename: you must specify an argument for -Xcompile"
+      exit $EXIT_FAILURE
+      ;;
+    target)
+      $echo "$modename: you must specify a target with \`-o'" 1>&2
+      exit $EXIT_FAILURE
+      ;;
+    *)
+      # Get the name of the library object.
+      [ -z "$libobj" ] && libobj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%'`
+      ;;
+    esac
+
+    # Recognize several different file suffixes.
+    # If the user specifies -o file.o, it is replaced with file.lo
+    xform='[cCFSifmso]'
+    case $libobj in
+    *.ada) xform=ada ;;
+    *.adb) xform=adb ;;
+    *.ads) xform=ads ;;
+    *.asm) xform=asm ;;
+    *.c++) xform=c++ ;;
+    *.cc) xform=cc ;;
+    *.ii) xform=ii ;;
+    *.class) xform=class ;;
+    *.cpp) xform=cpp ;;
+    *.cxx) xform=cxx ;;
+    *.f90) xform=f90 ;;
+    *.for) xform=for ;;
+    *.java) xform=java ;;
+    esac
+
+    libobj=`$echo "X$libobj" | $Xsed -e "s/\.$xform$/.lo/"`
+
+    case $libobj in
+    *.lo) obj=`$echo "X$libobj" | $Xsed -e "$lo2o"` ;;
+    *)
+      $echo "$modename: cannot determine name of library object from \`$libobj'" 1>&2
+      exit $EXIT_FAILURE
+      ;;
+    esac
+
+    func_infer_tag $base_compile
+
+    for arg in $later; do
+      case $arg in
+      -static)
+	build_old_libs=yes
+	continue
+	;;
+
+      -prefer-pic)
+	pic_mode=yes
+	continue
+	;;
+
+      -prefer-non-pic)
+	pic_mode=no
+	continue
+	;;
+      esac
+    done
+
+    objname=`$echo "X$obj" | $Xsed -e 's%^.*/%%'`
+    xdir=`$echo "X$obj" | $Xsed -e 's%/[^/]*$%%'`
+    if test "X$xdir" = "X$obj"; then
+      xdir=
+    else
+      xdir=$xdir/
+    fi
+    lobj=${xdir}$objdir/$objname
+
+    if test -z "$base_compile"; then
+      $echo "$modename: you must specify a compilation command" 1>&2
+      $echo "$help" 1>&2
+      exit $EXIT_FAILURE
+    fi
+
+    # Delete any leftover library objects.
+    if test "$build_old_libs" = yes; then
+      removelist="$obj $lobj $libobj ${libobj}T"
+    else
+      removelist="$lobj $libobj ${libobj}T"
+    fi
+
+    $run $rm $removelist
+    trap "$run $rm $removelist; exit $EXIT_FAILURE" 1 2 15
+
+    # On Cygwin there's no "real" PIC flag so we must build both object types
+    case $host_os in
+    cygwin* | mingw* | pw32* | os2*)
+      pic_mode=default
+      ;;
+    esac
+    if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then
+      # non-PIC code in shared libraries is not supported
+      pic_mode=default
+    fi
+
+    # Calculate the filename of the output object if compiler does
+    # not support -o with -c
+    if test "$compiler_c_o" = no; then
+      output_obj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%' -e 's%\.[^.]*$%%'`.${objext}
+      lockfile="$output_obj.lock"
+      removelist="$removelist $output_obj $lockfile"
+      trap "$run $rm $removelist; exit $EXIT_FAILURE" 1 2 15
+    else
+      output_obj=
+      need_locks=no
+      lockfile=
+    fi
+
+    # Lock this critical section if it is needed
+    # We use this script file to make the link, it avoids creating a new file
+    if test "$need_locks" = yes; then
+      until $run ln "$progpath" "$lockfile" 2>/dev/null; do
+	$show "Waiting for $lockfile to be removed"
+	sleep 2
+      done
+    elif test "$need_locks" = warn; then
+      if test -f "$lockfile"; then
+	$echo "\
+*** ERROR, $lockfile exists and contains:
+`cat $lockfile 2>/dev/null`
+
+This indicates that another process is trying to use the same
+temporary object file, and libtool could not work around it because
+your compiler does not support \`-c' and \`-o' together.  If you
+repeat this compilation, it may succeed, by chance, but you had better
+avoid parallel builds (make -j) in this platform, or get a better
+compiler."
+
+	$run $rm $removelist
+	exit $EXIT_FAILURE
+      fi
+      $echo $srcfile > "$lockfile"
+    fi
+
+    if test -n "$fix_srcfile_path"; then
+      eval srcfile=\"$fix_srcfile_path\"
+    fi
+
+    $run $rm "$libobj" "${libobj}T"
+
+    # Create a libtool object file (analogous to a ".la" file),
+    # but don't create it if we're doing a dry run.
+    test -z "$run" && cat > ${libobj}T <<EOF
+# $libobj - a libtool object file
+# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+EOF
+
+    # Only build a PIC object if we are building libtool libraries.
+    if test "$build_libtool_libs" = yes; then
+      # Without this assignment, base_compile gets emptied.
+      fbsd_hideous_sh_bug=$base_compile
+
+      if test "$pic_mode" != no; then
+	command="$base_compile $srcfile $pic_flag"
+      else
+	# Don't build PIC code
+	command="$base_compile $srcfile"
+      fi
+
+      if test ! -d "${xdir}$objdir"; then
+	$show "$mkdir ${xdir}$objdir"
+	$run $mkdir ${xdir}$objdir
+	status=$?
+	if test "$status" -ne 0 && test ! -d "${xdir}$objdir"; then
+	  exit $status
+	fi
+      fi
+
+      if test -z "$output_obj"; then
+	# Place PIC objects in $objdir
+	command="$command -o $lobj"
+      fi
+
+      $run $rm "$lobj" "$output_obj"
+
+      $show "$command"
+      if $run eval "$command"; then :
+      else
+	test -n "$output_obj" && $run $rm $removelist
+	exit $EXIT_FAILURE
+      fi
+
+      if test "$need_locks" = warn &&
+	 test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then
+	$echo "\
+*** ERROR, $lockfile contains:
+`cat $lockfile 2>/dev/null`
+
+but it should contain:
+$srcfile
+
+This indicates that another process is trying to use the same
+temporary object file, and libtool could not work around it because
+your compiler does not support \`-c' and \`-o' together.  If you
+repeat this compilation, it may succeed, by chance, but you had better
+avoid parallel builds (make -j) in this platform, or get a better
+compiler."
+
+	$run $rm $removelist
+	exit $EXIT_FAILURE
+      fi
+
+      # Just move the object if needed, then go on to compile the next one
+      if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then
+	$show "$mv $output_obj $lobj"
+	if $run $mv $output_obj $lobj; then :
+	else
+	  error=$?
+	  $run $rm $removelist
+	  exit $error
+	fi
+      fi
+
+      # Append the name of the PIC object to the libtool object file.
+      test -z "$run" && cat >> ${libobj}T <<EOF
+pic_object='$objdir/$objname'
+
+EOF
+
+      # Allow error messages only from the first compilation.
+      if test "$suppress_opt" = yes; then
+        suppress_output=' >/dev/null 2>&1'
+      fi
+    else
+      # No PIC object so indicate it doesn't exist in the libtool
+      # object file.
+      test -z "$run" && cat >> ${libobj}T <<EOF
+pic_object=none
+
+EOF
+    fi
+
+    # Only build a position-dependent object if we build old libraries.
+    if test "$build_old_libs" = yes; then
+      if test "$pic_mode" != yes; then
+	# Don't build PIC code
+	command="$base_compile $srcfile"
+      else
+	command="$base_compile $srcfile $pic_flag"
+      fi
+      if test "$compiler_c_o" = yes; then
+	command="$command -o $obj"
+      fi
+
+      # Suppress compiler output if we already did a PIC compilation.
+      command="$command$suppress_output"
+      $run $rm "$obj" "$output_obj"
+      $show "$command"
+      if $run eval "$command"; then :
+      else
+	$run $rm $removelist
+	exit $EXIT_FAILURE
+      fi
+
+      if test "$need_locks" = warn &&
+	 test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then
+	$echo "\
+*** ERROR, $lockfile contains:
+`cat $lockfile 2>/dev/null`
+
+but it should contain:
+$srcfile
+
+This indicates that another process is trying to use the same
+temporary object file, and libtool could not work around it because
+your compiler does not support \`-c' and \`-o' together.  If you
+repeat this compilation, it may succeed, by chance, but you had better
+avoid parallel builds (make -j) in this platform, or get a better
+compiler."
+
+	$run $rm $removelist
+	exit $EXIT_FAILURE
+      fi
+
+      # Just move the object if needed
+      if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then
+	$show "$mv $output_obj $obj"
+	if $run $mv $output_obj $obj; then :
+	else
+	  error=$?
+	  $run $rm $removelist
+	  exit $error
+	fi
+      fi
+
+      # Append the name of the non-PIC object the libtool object file.
+      # Only append if the libtool object file exists.
+      test -z "$run" && cat >> ${libobj}T <<EOF
+# Name of the non-PIC object.
+non_pic_object='$objname'
+
+EOF
+    else
+      # Append the name of the non-PIC object the libtool object file.
+      # Only append if the libtool object file exists.
+      test -z "$run" && cat >> ${libobj}T <<EOF
+# Name of the non-PIC object.
+non_pic_object=none
+
+EOF
+    fi
+
+    $run $mv "${libobj}T" "${libobj}"
+
+    # Unlock the critical section if it was locked
+    if test "$need_locks" != no; then
+      $run $rm "$lockfile"
+    fi
+
+    exit $EXIT_SUCCESS
+    ;;
+
+  # libtool link mode
+  link | relink)
+    modename="$modename: link"
+    case $host in
+    *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*)
+      # It is impossible to link a dll without this setting, and
+      # we shouldn't force the makefile maintainer to figure out
+      # which system we are compiling for in order to pass an extra
+      # flag for every libtool invocation.
+      # allow_undefined=no
+
+      # FIXME: Unfortunately, there are problems with the above when trying
+      # to make a dll which has undefined symbols, in which case not
+      # even a static library is built.  For now, we need to specify
+      # -no-undefined on the libtool link line when we can be certain
+      # that all symbols are satisfied, otherwise we get a static library.
+      allow_undefined=yes
+      ;;
+    *)
+      allow_undefined=yes
+      ;;
+    esac
+    libtool_args="$nonopt"
+    base_compile="$nonopt $@"
+    compile_command="$nonopt"
+    finalize_command="$nonopt"
+
+    compile_rpath=
+    finalize_rpath=
+    compile_shlibpath=
+    finalize_shlibpath=
+    convenience=
+    old_convenience=
+    deplibs=
+    old_deplibs=
+    compiler_flags=
+    linker_flags=
+    dllsearchpath=
+    lib_search_path=`pwd`
+    inst_prefix_dir=
+
+    avoid_version=no
+    dlfiles=
+    dlprefiles=
+    dlself=no
+    export_dynamic=no
+    export_symbols=
+    export_symbols_regex=
+    generated=
+    libobjs=
+    ltlibs=
+    module=no
+    no_install=no
+    objs=
+    non_pic_objects=
+    precious_files_regex=
+    prefer_static_libs=no
+    preload=no
+    prev=
+    prevarg=
+    release=
+    rpath=
+    xrpath=
+    perm_rpath=
+    temp_rpath=
+    thread_safe=no
+    vinfo=
+    vinfo_number=no
+
+    func_infer_tag $base_compile
+
+    # We need to know -static, to get the right output filenames.
+    for arg
+    do
+      case $arg in
+      -all-static | -static)
+	if test "X$arg" = "X-all-static"; then
+	  if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then
+	    $echo "$modename: warning: complete static linking is impossible in this configuration" 1>&2
+	  fi
+	  if test -n "$link_static_flag"; then
+	    dlopen_self=$dlopen_self_static
+	  fi
+	else
+	  if test -z "$pic_flag" && test -n "$link_static_flag"; then
+	    dlopen_self=$dlopen_self_static
+	  fi
+	fi
+	build_libtool_libs=no
+	build_old_libs=yes
+	prefer_static_libs=yes
+	break
+	;;
+      esac
+    done
+
+    # See if our shared archives depend on static archives.
+    test -n "$old_archive_from_new_cmds" && build_old_libs=yes
+
+    # Go through the arguments, transforming them on the way.
+    while test "$#" -gt 0; do
+      arg="$1"
+      shift
+      case $arg in
+      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+	qarg=\"`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`\" ### testsuite: skip nested quoting test
+	;;
+      *) qarg=$arg ;;
+      esac
+      libtool_args="$libtool_args $qarg"
+
+      # If the previous option needs an argument, assign it.
+      if test -n "$prev"; then
+	case $prev in
+	output)
+	  compile_command="$compile_command @OUTPUT@"
+	  finalize_command="$finalize_command @OUTPUT@"
+	  ;;
+	esac
+
+	case $prev in
+	dlfiles|dlprefiles)
+	  if test "$preload" = no; then
+	    # Add the symbol object into the linking commands.
+	    compile_command="$compile_command @SYMFILE@"
+	    finalize_command="$finalize_command @SYMFILE@"
+	    preload=yes
+	  fi
+	  case $arg in
+	  *.la | *.lo) ;;  # We handle these cases below.
+	  force)
+	    if test "$dlself" = no; then
+	      dlself=needless
+	      export_dynamic=yes
+	    fi
+	    prev=
+	    continue
+	    ;;
+	  self)
+	    if test "$prev" = dlprefiles; then
+	      dlself=yes
+	    elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then
+	      dlself=yes
+	    else
+	      dlself=needless
+	      export_dynamic=yes
+	    fi
+	    prev=
+	    continue
+	    ;;
+	  *)
+	    if test "$prev" = dlfiles; then
+	      dlfiles="$dlfiles $arg"
+	    else
+	      dlprefiles="$dlprefiles $arg"
+	    fi
+	    prev=
+	    continue
+	    ;;
+	  esac
+	  ;;
+	expsyms)
+	  export_symbols="$arg"
+	  if test ! -f "$arg"; then
+	    $echo "$modename: symbol file \`$arg' does not exist"
+	    exit $EXIT_FAILURE
+	  fi
+	  prev=
+	  continue
+	  ;;
+	expsyms_regex)
+	  export_symbols_regex="$arg"
+	  prev=
+	  continue
+	  ;;
+	inst_prefix)
+	  inst_prefix_dir="$arg"
+	  prev=
+	  continue
+	  ;;
+	precious_regex)
+	  precious_files_regex="$arg"
+	  prev=
+	  continue
+	  ;;
+	release)
+	  release="-$arg"
+	  prev=
+	  continue
+	  ;;
+	objectlist)
+	  if test -f "$arg"; then
+	    save_arg=$arg
+	    moreargs=
+	    for fil in `cat $save_arg`
+	    do
+#	      moreargs="$moreargs $fil"
+	      arg=$fil
+	      # A libtool-controlled object.
+
+	      # Check to see that this really is a libtool object.
+	      if (${SED} -e '2q' $arg | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
+		pic_object=
+		non_pic_object=
+
+		# Read the .lo file
+		# If there is no directory component, then add one.
+		case $arg in
+		*/* | *\\*) . $arg ;;
+		*) . ./$arg ;;
+		esac
+
+		if test -z "$pic_object" || \
+		   test -z "$non_pic_object" ||
+		   test "$pic_object" = none && \
+		   test "$non_pic_object" = none; then
+		  $echo "$modename: cannot find name of object for \`$arg'" 1>&2
+		  exit $EXIT_FAILURE
+		fi
+
+		# Extract subdirectory from the argument.
+		xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'`
+		if test "X$xdir" = "X$arg"; then
+		  xdir=
+		else
+		  xdir="$xdir/"
+		fi
+
+		if test "$pic_object" != none; then
+		  # Prepend the subdirectory the object is found in.
+		  pic_object="$xdir$pic_object"
+
+		  if test "$prev" = dlfiles; then
+		    if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then
+		      dlfiles="$dlfiles $pic_object"
+		      prev=
+		      continue
+		    else
+		      # If libtool objects are unsupported, then we need to preload.
+		      prev=dlprefiles
+		    fi
+		  fi
+
+		  # CHECK ME:  I think I busted this.  -Ossama
+		  if test "$prev" = dlprefiles; then
+		    # Preload the old-style object.
+		    dlprefiles="$dlprefiles $pic_object"
+		    prev=
+		  fi
+
+		  # A PIC object.
+		  libobjs="$libobjs $pic_object"
+		  arg="$pic_object"
+		fi
+
+		# Non-PIC object.
+		if test "$non_pic_object" != none; then
+		  # Prepend the subdirectory the object is found in.
+		  non_pic_object="$xdir$non_pic_object"
+
+		  # A standard non-PIC object
+		  non_pic_objects="$non_pic_objects $non_pic_object"
+		  if test -z "$pic_object" || test "$pic_object" = none ; then
+		    arg="$non_pic_object"
+		  fi
+		fi
+	      else
+		# Only an error if not doing a dry-run.
+		if test -z "$run"; then
+		  $echo "$modename: \`$arg' is not a valid libtool object" 1>&2
+		  exit $EXIT_FAILURE
+		else
+		  # Dry-run case.
+
+		  # Extract subdirectory from the argument.
+		  xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'`
+		  if test "X$xdir" = "X$arg"; then
+		    xdir=
+		  else
+		    xdir="$xdir/"
+		  fi
+
+		  pic_object=`$echo "X${xdir}${objdir}/${arg}" | $Xsed -e "$lo2o"`
+		  non_pic_object=`$echo "X${xdir}${arg}" | $Xsed -e "$lo2o"`
+		  libobjs="$libobjs $pic_object"
+		  non_pic_objects="$non_pic_objects $non_pic_object"
+		fi
+	      fi
+	    done
+	  else
+	    $echo "$modename: link input file \`$save_arg' does not exist"
+	    exit $EXIT_FAILURE
+	  fi
+	  arg=$save_arg
+	  prev=
+	  continue
+	  ;;
+	rpath | xrpath)
+	  # We need an absolute path.
+	  case $arg in
+	  [\\/]* | [A-Za-z]:[\\/]*) ;;
+	  *)
+	    $echo "$modename: only absolute run-paths are allowed" 1>&2
+	    exit $EXIT_FAILURE
+	    ;;
+	  esac
+	  if test "$prev" = rpath; then
+	    case "$rpath " in
+	    *" $arg "*) ;;
+	    *) rpath="$rpath $arg" ;;
+	    esac
+	  else
+	    case "$xrpath " in
+	    *" $arg "*) ;;
+	    *) xrpath="$xrpath $arg" ;;
+	    esac
+	  fi
+	  prev=
+	  continue
+	  ;;
+	xcompiler)
+	  compiler_flags="$compiler_flags $qarg"
+	  prev=
+	  compile_command="$compile_command $qarg"
+	  finalize_command="$finalize_command $qarg"
+	  continue
+	  ;;
+	xlinker)
+	  linker_flags="$linker_flags $qarg"
+	  compiler_flags="$compiler_flags $wl$qarg"
+	  prev=
+	  compile_command="$compile_command $wl$qarg"
+	  finalize_command="$finalize_command $wl$qarg"
+	  continue
+	  ;;
+	xcclinker)
+	  linker_flags="$linker_flags $qarg"
+	  compiler_flags="$compiler_flags $qarg"
+	  prev=
+	  compile_command="$compile_command $qarg"
+	  finalize_command="$finalize_command $qarg"
+	  continue
+	  ;;
+	shrext)
+  	  shrext_cmds="$arg"
+	  prev=
+	  continue
+	  ;;
+	*)
+	  eval "$prev=\"\$arg\""
+	  prev=
+	  continue
+	  ;;
+	esac
+      fi # test -n "$prev"
+
+      prevarg="$arg"
+
+      case $arg in
+      -all-static)
+	if test -n "$link_static_flag"; then
+	  compile_command="$compile_command $link_static_flag"
+	  finalize_command="$finalize_command $link_static_flag"
+	fi
+	continue
+	;;
+
+      -allow-undefined)
+	# FIXME: remove this flag sometime in the future.
+	$echo "$modename: \`-allow-undefined' is deprecated because it is the default" 1>&2
+	continue
+	;;
+
+      -avoid-version)
+	avoid_version=yes
+	continue
+	;;
+
+      -dlopen)
+	prev=dlfiles
+	continue
+	;;
+
+      -dlpreopen)
+	prev=dlprefiles
+	continue
+	;;
+
+      -export-dynamic)
+	export_dynamic=yes
+	continue
+	;;
+
+      -export-symbols | -export-symbols-regex)
+	if test -n "$export_symbols" || test -n "$export_symbols_regex"; then
+	  $echo "$modename: more than one -exported-symbols argument is not allowed"
+	  exit $EXIT_FAILURE
+	fi
+	if test "X$arg" = "X-export-symbols"; then
+	  prev=expsyms
+	else
+	  prev=expsyms_regex
+	fi
+	continue
+	;;
+
+      -inst-prefix-dir)
+	prev=inst_prefix
+	continue
+	;;
+
+      # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:*
+      # so, if we see these flags be careful not to treat them like -L
+      -L[A-Z][A-Z]*:*)
+	case $with_gcc/$host in
+	no/*-*-irix* | /*-*-irix*)
+	  compile_command="$compile_command $arg"
+	  finalize_command="$finalize_command $arg"
+	  ;;
+	esac
+	continue
+	;;
+
+      -L*)
+	dir=`$echo "X$arg" | $Xsed -e 's/^-L//'`
+	# We need an absolute path.
+	case $dir in
+	[\\/]* | [A-Za-z]:[\\/]*) ;;
+	*)
+	  absdir=`cd "$dir" && pwd`
+	  if test -z "$absdir"; then
+	    $echo "$modename: cannot determine absolute directory name of \`$dir'" 1>&2
+	    exit $EXIT_FAILURE
+	  fi
+	  dir="$absdir"
+	  ;;
+	esac
+	case "$deplibs " in
+	*" -L$dir "*) ;;
+	*)
+	  deplibs="$deplibs -L$dir"
+	  lib_search_path="$lib_search_path $dir"
+	  ;;
+	esac
+	case $host in
+	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*)
+	  case :$dllsearchpath: in
+	  *":$dir:"*) ;;
+	  *) dllsearchpath="$dllsearchpath:$dir";;
+	  esac
+	  ;;
+	esac
+	continue
+	;;
+
+      -l*)
+	if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then
+	  case $host in
+	  *-*-cygwin* | *-*-pw32* | *-*-beos*)
+	    # These systems don't actually have a C or math library (as such)
+	    continue
+	    ;;
+	  *-*-mingw* | *-*-os2*)
+	    # These systems don't actually have a C library (as such)
+	    test "X$arg" = "X-lc" && continue
+	    ;;
+	  *-*-openbsd* | *-*-freebsd*)
+	    # Do not include libc due to us having libc/libc_r.
+	    test "X$arg" = "X-lc" && continue
+	    ;;
+	  *-*-rhapsody* | *-*-darwin1.[012])
+	    # Rhapsody C and math libraries are in the System framework
+	    deplibs="$deplibs -framework System"
+	    continue
+	  esac
+	elif test "X$arg" = "X-lc_r"; then
+	 case $host in
+	 *-*-openbsd* | *-*-freebsd*)
+	   # Do not include libc_r directly, use -pthread flag.
+	   continue
+	   ;;
+	 esac
+	fi
+	deplibs="$deplibs $arg"
+	continue
+	;;
+
+     -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe)
+	deplibs="$deplibs $arg"
+	continue
+	;;
+
+      -module)
+	module=yes
+	continue
+	;;
+
+      # gcc -m* arguments should be passed to the linker via $compiler_flags
+      # in order to pass architecture information to the linker
+      # (e.g. 32 vs 64-bit).  This may also be accomplished via -Wl,-mfoo
+      # but this is not reliable with gcc because gcc may use -mfoo to
+      # select a different linker, different libraries, etc, while
+      # -Wl,-mfoo simply passes -mfoo to the linker.
+      -m*)
+	# Unknown arguments in both finalize_command and compile_command need
+	# to be aesthetically quoted because they are evaled later.
+	arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
+	case $arg in
+	*[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+	  arg="\"$arg\""
+	  ;;
+	esac
+        compile_command="$compile_command $arg"
+        finalize_command="$finalize_command $arg"
+        if test "$with_gcc" = "yes" ; then
+          compiler_flags="$compiler_flags $arg"
+        fi
+        continue
+        ;;
+
+      -shrext)
+	prev=shrext
+	continue
+	;;
+
+      -no-fast-install)
+	fast_install=no
+	continue
+	;;
+
+      -no-install)
+	case $host in
+	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*)
+	  # The PATH hackery in wrapper scripts is required on Windows
+	  # in order for the loader to find any dlls it needs.
+	  $echo "$modename: warning: \`-no-install' is ignored for $host" 1>&2
+	  $echo "$modename: warning: assuming \`-no-fast-install' instead" 1>&2
+	  fast_install=no
+	  ;;
+	*) no_install=yes ;;
+	esac
+	continue
+	;;
+
+      -no-undefined)
+	allow_undefined=no
+	continue
+	;;
+
+      -objectlist)
+	prev=objectlist
+	continue
+	;;
+
+      -o) prev=output ;;
+
+      -precious-files-regex)
+	prev=precious_regex
+	continue
+	;;
+
+      -release)
+	prev=release
+	continue
+	;;
+
+      -rpath)
+	prev=rpath
+	continue
+	;;
+
+      -R)
+	prev=xrpath
+	continue
+	;;
+
+      -R*)
+	dir=`$echo "X$arg" | $Xsed -e 's/^-R//'`
+	# We need an absolute path.
+	case $dir in
+	[\\/]* | [A-Za-z]:[\\/]*) ;;
+	*)
+	  $echo "$modename: only absolute run-paths are allowed" 1>&2
+	  exit $EXIT_FAILURE
+	  ;;
+	esac
+	case "$xrpath " in
+	*" $dir "*) ;;
+	*) xrpath="$xrpath $dir" ;;
+	esac
+	continue
+	;;
+
+      -static)
+	# The effects of -static are defined in a previous loop.
+	# We used to do the same as -all-static on platforms that
+	# didn't have a PIC flag, but the assumption that the effects
+	# would be equivalent was wrong.  It would break on at least
+	# Digital Unix and AIX.
+	continue
+	;;
+
+      -thread-safe)
+	thread_safe=yes
+	continue
+	;;
+
+      -version-info)
+	prev=vinfo
+	continue
+	;;
+      -version-number)
+	prev=vinfo
+	vinfo_number=yes
+	continue
+	;;
+
+      -Wc,*)
+	args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wc,//'`
+	arg=
+	save_ifs="$IFS"; IFS=','
+	for flag in $args; do
+	  IFS="$save_ifs"
+	  case $flag in
+	    *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+	    flag="\"$flag\""
+	    ;;
+	  esac
+	  arg="$arg $wl$flag"
+	  compiler_flags="$compiler_flags $flag"
+	done
+	IFS="$save_ifs"
+	arg=`$echo "X$arg" | $Xsed -e "s/^ //"`
+	;;
+
+      -Wl,*)
+	args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wl,//'`
+	arg=
+	save_ifs="$IFS"; IFS=','
+	for flag in $args; do
+	  IFS="$save_ifs"
+	  case $flag in
+	    *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+	    flag="\"$flag\""
+	    ;;
+	  esac
+	  arg="$arg $wl$flag"
+	  compiler_flags="$compiler_flags $wl$flag"
+	  linker_flags="$linker_flags $flag"
+	done
+	IFS="$save_ifs"
+	arg=`$echo "X$arg" | $Xsed -e "s/^ //"`
+	;;
+
+      -Xcompiler)
+	prev=xcompiler
+	continue
+	;;
+
+      -Xlinker)
+	prev=xlinker
+	continue
+	;;
+
+      -XCClinker)
+	prev=xcclinker
+	continue
+	;;
+
+      # Some other compiler flag.
+      -* | +*)
+	# Unknown arguments in both finalize_command and compile_command need
+	# to be aesthetically quoted because they are evaled later.
+	arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
+	case $arg in
+	*[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+	  arg="\"$arg\""
+	  ;;
+	esac
+	;;
+
+      *.$objext)
+	# A standard object.
+	objs="$objs $arg"
+	;;
+
+      *.lo)
+	# A libtool-controlled object.
+
+	# Check to see that this really is a libtool object.
+	if (${SED} -e '2q' $arg | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
+	  pic_object=
+	  non_pic_object=
+
+	  # Read the .lo file
+	  # If there is no directory component, then add one.
+	  case $arg in
+	  */* | *\\*) . $arg ;;
+	  *) . ./$arg ;;
+	  esac
+
+	  if test -z "$pic_object" || \
+	     test -z "$non_pic_object" ||
+	     test "$pic_object" = none && \
+	     test "$non_pic_object" = none; then
+	    $echo "$modename: cannot find name of object for \`$arg'" 1>&2
+	    exit $EXIT_FAILURE
+	  fi
+
+	  # Extract subdirectory from the argument.
+	  xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'`
+	  if test "X$xdir" = "X$arg"; then
+	    xdir=
+ 	  else
+	    xdir="$xdir/"
+	  fi
+
+	  if test "$pic_object" != none; then
+	    # Prepend the subdirectory the object is found in.
+	    pic_object="$xdir$pic_object"
+
+	    if test "$prev" = dlfiles; then
+	      if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then
+		dlfiles="$dlfiles $pic_object"
+		prev=
+		continue
+	      else
+		# If libtool objects are unsupported, then we need to preload.
+		prev=dlprefiles
+	      fi
+	    fi
+
+	    # CHECK ME:  I think I busted this.  -Ossama
+	    if test "$prev" = dlprefiles; then
+	      # Preload the old-style object.
+	      dlprefiles="$dlprefiles $pic_object"
+	      prev=
+	    fi
+
+	    # A PIC object.
+	    libobjs="$libobjs $pic_object"
+	    arg="$pic_object"
+	  fi
+
+	  # Non-PIC object.
+	  if test "$non_pic_object" != none; then
+	    # Prepend the subdirectory the object is found in.
+	    non_pic_object="$xdir$non_pic_object"
+
+	    # A standard non-PIC object
+	    non_pic_objects="$non_pic_objects $non_pic_object"
+	    if test -z "$pic_object" || test "$pic_object" = none ; then
+	      arg="$non_pic_object"
+	    fi
+	  fi
+	else
+	  # Only an error if not doing a dry-run.
+	  if test -z "$run"; then
+	    $echo "$modename: \`$arg' is not a valid libtool object" 1>&2
+	    exit $EXIT_FAILURE
+	  else
+	    # Dry-run case.
+
+	    # Extract subdirectory from the argument.
+	    xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'`
+	    if test "X$xdir" = "X$arg"; then
+	      xdir=
+	    else
+	      xdir="$xdir/"
+	    fi
+
+	    pic_object=`$echo "X${xdir}${objdir}/${arg}" | $Xsed -e "$lo2o"`
+	    non_pic_object=`$echo "X${xdir}${arg}" | $Xsed -e "$lo2o"`
+	    libobjs="$libobjs $pic_object"
+	    non_pic_objects="$non_pic_objects $non_pic_object"
+	  fi
+	fi
+	;;
+
+      *.$libext)
+	# An archive.
+	deplibs="$deplibs $arg"
+	old_deplibs="$old_deplibs $arg"
+	continue
+	;;
+
+      *.la)
+	# A libtool-controlled library.
+
+	if test "$prev" = dlfiles; then
+	  # This library was specified with -dlopen.
+	  dlfiles="$dlfiles $arg"
+	  prev=
+	elif test "$prev" = dlprefiles; then
+	  # The library was specified with -dlpreopen.
+	  dlprefiles="$dlprefiles $arg"
+	  prev=
+	else
+	  deplibs="$deplibs $arg"
+	fi
+	continue
+	;;
+
+      # Some other compiler argument.
+      *)
+	# Unknown arguments in both finalize_command and compile_command need
+	# to be aesthetically quoted because they are evaled later.
+	arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
+	case $arg in
+	*[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+	  arg="\"$arg\""
+	  ;;
+	esac
+	;;
+      esac # arg
+
+      # Now actually substitute the argument into the commands.
+      if test -n "$arg"; then
+	compile_command="$compile_command $arg"
+	finalize_command="$finalize_command $arg"
+      fi
+    done # argument parsing loop
+
+    if test -n "$prev"; then
+      $echo "$modename: the \`$prevarg' option requires an argument" 1>&2
+      $echo "$help" 1>&2
+      exit $EXIT_FAILURE
+    fi
+
+    if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then
+      eval arg=\"$export_dynamic_flag_spec\"
+      compile_command="$compile_command $arg"
+      finalize_command="$finalize_command $arg"
+    fi
+
+    oldlibs=
+    # calculate the name of the file, without its directory
+    outputname=`$echo "X$output" | $Xsed -e 's%^.*/%%'`
+    libobjs_save="$libobjs"
+
+    if test -n "$shlibpath_var"; then
+      # get the directories listed in $shlibpath_var
+      eval shlib_search_path=\`\$echo \"X\${$shlibpath_var}\" \| \$Xsed -e \'s/:/ /g\'\`
+    else
+      shlib_search_path=
+    fi
+    eval sys_lib_search_path=\"$sys_lib_search_path_spec\"
+    eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\"
+
+    output_objdir=`$echo "X$output" | $Xsed -e 's%/[^/]*$%%'`
+    if test "X$output_objdir" = "X$output"; then
+      output_objdir="$objdir"
+    else
+      output_objdir="$output_objdir/$objdir"
+    fi
+    # Create the object directory.
+    if test ! -d "$output_objdir"; then
+      $show "$mkdir $output_objdir"
+      $run $mkdir $output_objdir
+      status=$?
+      if test "$status" -ne 0 && test ! -d "$output_objdir"; then
+	exit $status
+      fi
+    fi
+
+    # Determine the type of output
+    case $output in
+    "")
+      $echo "$modename: you must specify an output file" 1>&2
+      $echo "$help" 1>&2
+      exit $EXIT_FAILURE
+      ;;
+    *.$libext) linkmode=oldlib ;;
+    *.lo | *.$objext) linkmode=obj ;;
+    *.la) linkmode=lib ;;
+    *) linkmode=prog ;; # Anything else should be a program.
+    esac
+
+    case $host in
+    *cygwin* | *mingw* | *pw32*)
+      # don't eliminate duplications in $postdeps and $predeps
+      duplicate_compiler_generated_deps=yes
+      ;;
+    *)
+      duplicate_compiler_generated_deps=$duplicate_deps
+      ;;
+    esac
+    specialdeplibs=
+
+    libs=
+    # Find all interdependent deplibs by searching for libraries
+    # that are linked more than once (e.g. -la -lb -la)
+    for deplib in $deplibs; do
+      if test "X$duplicate_deps" = "Xyes" ; then
+	case "$libs " in
+	*" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
+	esac
+      fi
+      libs="$libs $deplib"
+    done
+
+    if test "$linkmode" = lib; then
+      libs="$predeps $libs $compiler_lib_search_path $postdeps"
+
+      # Compute libraries that are listed more than once in $predeps
+      # $postdeps and mark them as special (i.e., whose duplicates are
+      # not to be eliminated).
+      pre_post_deps=
+      if test "X$duplicate_compiler_generated_deps" = "Xyes" ; then
+	for pre_post_dep in $predeps $postdeps; do
+	  case "$pre_post_deps " in
+	  *" $pre_post_dep "*) specialdeplibs="$specialdeplibs $pre_post_deps" ;;
+	  esac
+	  pre_post_deps="$pre_post_deps $pre_post_dep"
+	done
+      fi
+      pre_post_deps=
+    fi
+
+    deplibs=
+    newdependency_libs=
+    newlib_search_path=
+    need_relink=no # whether we're linking any uninstalled libtool libraries
+    notinst_deplibs= # not-installed libtool libraries
+    notinst_path= # paths that contain not-installed libtool libraries
+    case $linkmode in
+    lib)
+	passes="conv link"
+	for file in $dlfiles $dlprefiles; do
+	  case $file in
+	  *.la) ;;
+	  *)
+	    $echo "$modename: libraries can \`-dlopen' only libtool libraries: $file" 1>&2
+	    exit $EXIT_FAILURE
+	    ;;
+	  esac
+	done
+	;;
+    prog)
+	compile_deplibs=
+	finalize_deplibs=
+	alldeplibs=no
+	newdlfiles=
+	newdlprefiles=
+	passes="conv scan dlopen dlpreopen link"
+	;;
+    *)  passes="conv"
+	;;
+    esac
+    for pass in $passes; do
+      if test "$linkmode,$pass" = "lib,link" ||
+	 test "$linkmode,$pass" = "prog,scan"; then
+	libs="$deplibs"
+	deplibs=
+      fi
+      if test "$linkmode" = prog; then
+	case $pass in
+	dlopen) libs="$dlfiles" ;;
+	dlpreopen) libs="$dlprefiles" ;;
+	link) libs="$deplibs %DEPLIBS% $dependency_libs" ;;
+	esac
+      fi
+      if test "$pass" = dlopen; then
+	# Collect dlpreopened libraries
+	save_deplibs="$deplibs"
+	deplibs=
+      fi
+      for deplib in $libs; do
+	lib=
+	found=no
+	case $deplib in
+	-mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe)
+	  if test "$linkmode,$pass" = "prog,link"; then
+	    compile_deplibs="$deplib $compile_deplibs"
+	    finalize_deplibs="$deplib $finalize_deplibs"
+	  else
+	    deplibs="$deplib $deplibs"
+	  fi
+	  continue
+	  ;;
+	-l*)
+	  if test "$linkmode" != lib && test "$linkmode" != prog; then
+	    $echo "$modename: warning: \`-l' is ignored for archives/objects" 1>&2
+	    continue
+	  fi
+	  if test "$pass" = conv; then
+	    deplibs="$deplib $deplibs"
+	    continue
+	  fi
+	  name=`$echo "X$deplib" | $Xsed -e 's/^-l//'`
+	  for searchdir in $newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path; do
+	    for search_ext in .la $std_shrext .so .a; do
+	      # Search the libtool library
+	      lib="$searchdir/lib${name}${search_ext}"
+	      if test -f "$lib"; then
+		if test "$search_ext" = ".la"; then
+		  found=yes
+		else
+		  found=no
+		fi
+		break 2
+	      fi
+	    done
+	  done
+	  if test "$found" != yes; then
+	    # deplib doesn't seem to be a libtool library
+	    if test "$linkmode,$pass" = "prog,link"; then
+	      compile_deplibs="$deplib $compile_deplibs"
+	      finalize_deplibs="$deplib $finalize_deplibs"
+	    else
+	      deplibs="$deplib $deplibs"
+	      test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs"
+	    fi
+	    continue
+	  else # deplib is a libtool library
+	    # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib,
+	    # We need to do some special things here, and not later.
+	    if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+	      case " $predeps $postdeps " in
+	      *" $deplib "*)
+		if (${SED} -e '2q' $lib |
+                    grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
+		  library_names=
+		  old_library=
+		  case $lib in
+		  */* | *\\*) . $lib ;;
+		  *) . ./$lib ;;
+		  esac
+		  for l in $old_library $library_names; do
+		    ll="$l"
+		  done
+		  if test "X$ll" = "X$old_library" ; then # only static version available
+		    found=no
+		    ladir=`$echo "X$lib" | $Xsed -e 's%/[^/]*$%%'`
+		    test "X$ladir" = "X$lib" && ladir="."
+		    lib=$ladir/$old_library
+		    if test "$linkmode,$pass" = "prog,link"; then
+		      compile_deplibs="$deplib $compile_deplibs"
+		      finalize_deplibs="$deplib $finalize_deplibs"
+		    else
+		      deplibs="$deplib $deplibs"
+		      test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs"
+		    fi
+		    continue
+		  fi
+		fi
+	        ;;
+	      *) ;;
+	      esac
+	    fi
+	  fi
+	  ;; # -l
+	-L*)
+	  case $linkmode in
+	  lib)
+	    deplibs="$deplib $deplibs"
+	    test "$pass" = conv && continue
+	    newdependency_libs="$deplib $newdependency_libs"
+	    newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'`
+	    ;;
+	  prog)
+	    if test "$pass" = conv; then
+	      deplibs="$deplib $deplibs"
+	      continue
+	    fi
+	    if test "$pass" = scan; then
+	      deplibs="$deplib $deplibs"
+	    else
+	      compile_deplibs="$deplib $compile_deplibs"
+	      finalize_deplibs="$deplib $finalize_deplibs"
+	    fi
+	    newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'`
+	    ;;
+	  *)
+	    $echo "$modename: warning: \`-L' is ignored for archives/objects" 1>&2
+	    ;;
+	  esac # linkmode
+	  continue
+	  ;; # -L
+	-R*)
+	  if test "$pass" = link; then
+	    dir=`$echo "X$deplib" | $Xsed -e 's/^-R//'`
+	    # Make sure the xrpath contains only unique directories.
+	    case "$xrpath " in
+	    *" $dir "*) ;;
+	    *) xrpath="$xrpath $dir" ;;
+	    esac
+	  fi
+	  deplibs="$deplib $deplibs"
+	  continue
+	  ;;
+	*.la) lib="$deplib" ;;
+	*.$libext)
+	  if test "$pass" = conv; then
+	    deplibs="$deplib $deplibs"
+	    continue
+	  fi
+	  case $linkmode in
+	  lib)
+	    if test "$deplibs_check_method" != pass_all; then
+	      $echo
+	      $echo "*** Warning: Trying to link with static lib archive $deplib."
+	      $echo "*** I have the capability to make that library automatically link in when"
+	      $echo "*** you link to this library.  But I can only do this if you have a"
+	      $echo "*** shared version of the library, which you do not appear to have"
+	      $echo "*** because the file extensions .$libext of this argument makes me believe"
+	      $echo "*** that it is just a static archive that I should not used here."
+	    else
+	      $echo
+	      $echo "*** Warning: Linking the shared library $output against the"
+	      $echo "*** static library $deplib is not portable!"
+	      deplibs="$deplib $deplibs"
+	    fi
+	    continue
+	    ;;
+	  prog)
+	    if test "$pass" != link; then
+	      deplibs="$deplib $deplibs"
+	    else
+	      compile_deplibs="$deplib $compile_deplibs"
+	      finalize_deplibs="$deplib $finalize_deplibs"
+	    fi
+	    continue
+	    ;;
+	  esac # linkmode
+	  ;; # *.$libext
+	*.lo | *.$objext)
+	  if test "$pass" = conv; then
+	    deplibs="$deplib $deplibs"
+	  elif test "$linkmode" = prog; then
+	    if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then
+	      # If there is no dlopen support or we're linking statically,
+	      # we need to preload.
+	      newdlprefiles="$newdlprefiles $deplib"
+	      compile_deplibs="$deplib $compile_deplibs"
+	      finalize_deplibs="$deplib $finalize_deplibs"
+	    else
+	      newdlfiles="$newdlfiles $deplib"
+	    fi
+	  fi
+	  continue
+	  ;;
+	%DEPLIBS%)
+	  alldeplibs=yes
+	  continue
+	  ;;
+	esac # case $deplib
+	if test "$found" = yes || test -f "$lib"; then :
+	else
+	  $echo "$modename: cannot find the library \`$lib'" 1>&2
+	  exit $EXIT_FAILURE
+	fi
+
+	# Check to see that this really is a libtool archive.
+	if (${SED} -e '2q' $lib | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then :
+	else
+	  $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2
+	  exit $EXIT_FAILURE
+	fi
+
+	ladir=`$echo "X$lib" | $Xsed -e 's%/[^/]*$%%'`
+	test "X$ladir" = "X$lib" && ladir="."
+
+	dlname=
+	dlopen=
+	dlpreopen=
+	libdir=
+	library_names=
+	old_library=
+	# If the library was installed with an old release of libtool,
+	# it will not redefine variables installed, or shouldnotlink
+	installed=yes
+	shouldnotlink=no
+
+	# Read the .la file
+	case $lib in
+	*/* | *\\*) . $lib ;;
+	*) . ./$lib ;;
+	esac
+
+	if test "$linkmode,$pass" = "lib,link" ||
+	   test "$linkmode,$pass" = "prog,scan" ||
+	   { test "$linkmode" != prog && test "$linkmode" != lib; }; then
+	  test -n "$dlopen" && dlfiles="$dlfiles $dlopen"
+	  test -n "$dlpreopen" && dlprefiles="$dlprefiles $dlpreopen"
+	fi
+
+	if test "$pass" = conv; then
+	  # Only check for convenience libraries
+	  deplibs="$lib $deplibs"
+	  if test -z "$libdir"; then
+	    if test -z "$old_library"; then
+	      $echo "$modename: cannot find name of link library for \`$lib'" 1>&2
+	      exit $EXIT_FAILURE
+	    fi
+	    # It is a libtool convenience library, so add in its objects.
+	    convenience="$convenience $ladir/$objdir/$old_library"
+	    old_convenience="$old_convenience $ladir/$objdir/$old_library"
+	    tmp_libs=
+	    for deplib in $dependency_libs; do
+	      deplibs="$deplib $deplibs"
+              if test "X$duplicate_deps" = "Xyes" ; then
+	        case "$tmp_libs " in
+	        *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
+	        esac
+              fi
+	      tmp_libs="$tmp_libs $deplib"
+	    done
+	  elif test "$linkmode" != prog && test "$linkmode" != lib; then
+	    $echo "$modename: \`$lib' is not a convenience library" 1>&2
+	    exit $EXIT_FAILURE
+	  fi
+	  continue
+	fi # $pass = conv
+
+
+	# Get the name of the library we link against.
+	linklib=
+	for l in $old_library $library_names; do
+	  linklib="$l"
+	done
+	if test -z "$linklib"; then
+	  $echo "$modename: cannot find name of link library for \`$lib'" 1>&2
+	  exit $EXIT_FAILURE
+	fi
+
+	# This library was specified with -dlopen.
+	if test "$pass" = dlopen; then
+	  if test -z "$libdir"; then
+	    $echo "$modename: cannot -dlopen a convenience library: \`$lib'" 1>&2
+	    exit $EXIT_FAILURE
+	  fi
+	  if test -z "$dlname" ||
+	     test "$dlopen_support" != yes ||
+	     test "$build_libtool_libs" = no; then
+	    # If there is no dlname, no dlopen support or we're linking
+	    # statically, we need to preload.  We also need to preload any
+	    # dependent libraries so libltdl's deplib preloader doesn't
+	    # bomb out in the load deplibs phase.
+	    dlprefiles="$dlprefiles $lib $dependency_libs"
+	  else
+	    newdlfiles="$newdlfiles $lib"
+	  fi
+	  continue
+	fi # $pass = dlopen
+
+	# We need an absolute path.
+	case $ladir in
+	[\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;;
+	*)
+	  abs_ladir=`cd "$ladir" && pwd`
+	  if test -z "$abs_ladir"; then
+	    $echo "$modename: warning: cannot determine absolute directory name of \`$ladir'" 1>&2
+	    $echo "$modename: passing it literally to the linker, although it might fail" 1>&2
+	    abs_ladir="$ladir"
+	  fi
+	  ;;
+	esac
+	laname=`$echo "X$lib" | $Xsed -e 's%^.*/%%'`
+
+	# Find the relevant object directory and library name.
+	if test "X$installed" = Xyes; then
+	  if test ! -f "$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then
+	    $echo "$modename: warning: library \`$lib' was moved." 1>&2
+	    dir="$ladir"
+	    absdir="$abs_ladir"
+	    libdir="$abs_ladir"
+	  else
+	    dir="$libdir"
+	    absdir="$libdir"
+	  fi
+	else
+	  dir="$ladir/$objdir"
+	  absdir="$abs_ladir/$objdir"
+	  # Remove this search path later
+	  notinst_path="$notinst_path $abs_ladir"
+	fi # $installed = yes
+	name=`$echo "X$laname" | $Xsed -e 's/\.la$//' -e 's/^lib//'`
+
+	# This library was specified with -dlpreopen.
+	if test "$pass" = dlpreopen; then
+	  if test -z "$libdir"; then
+	    $echo "$modename: cannot -dlpreopen a convenience library: \`$lib'" 1>&2
+	    exit $EXIT_FAILURE
+	  fi
+	  # Prefer using a static library (so that no silly _DYNAMIC symbols
+	  # are required to link).
+	  if test -n "$old_library"; then
+	    newdlprefiles="$newdlprefiles $dir/$old_library"
+	  # Otherwise, use the dlname, so that lt_dlopen finds it.
+	  elif test -n "$dlname"; then
+	    newdlprefiles="$newdlprefiles $dir/$dlname"
+	  else
+	    newdlprefiles="$newdlprefiles $dir/$linklib"
+	  fi
+	fi # $pass = dlpreopen
+
+	if test -z "$libdir"; then
+	  # Link the convenience library
+	  if test "$linkmode" = lib; then
+	    deplibs="$dir/$old_library $deplibs"
+	  elif test "$linkmode,$pass" = "prog,link"; then
+	    compile_deplibs="$dir/$old_library $compile_deplibs"
+	    finalize_deplibs="$dir/$old_library $finalize_deplibs"
+	  else
+	    deplibs="$lib $deplibs" # used for prog,scan pass
+	  fi
+	  continue
+	fi
+
+
+	if test "$linkmode" = prog && test "$pass" != link; then
+	  newlib_search_path="$newlib_search_path $ladir"
+	  deplibs="$lib $deplibs"
+
+	  linkalldeplibs=no
+	  if test "$link_all_deplibs" != no || test -z "$library_names" ||
+	     test "$build_libtool_libs" = no; then
+	    linkalldeplibs=yes
+	  fi
+
+	  tmp_libs=
+	  for deplib in $dependency_libs; do
+	    case $deplib in
+	    -L*) newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'`;; ### testsuite: skip nested quoting test
+	    esac
+	    # Need to link against all dependency_libs?
+	    if test "$linkalldeplibs" = yes; then
+	      deplibs="$deplib $deplibs"
+	    else
+	      # Need to hardcode shared library paths
+	      # or/and link against static libraries
+	      newdependency_libs="$deplib $newdependency_libs"
+	    fi
+	    if test "X$duplicate_deps" = "Xyes" ; then
+	      case "$tmp_libs " in
+	      *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
+	      esac
+	    fi
+	    tmp_libs="$tmp_libs $deplib"
+	  done # for deplib
+	  continue
+	fi # $linkmode = prog...
+
+	if test "$linkmode,$pass" = "prog,link"; then
+	  if test -n "$library_names" &&
+	     { test "$prefer_static_libs" = no || test -z "$old_library"; }; then
+	    # We need to hardcode the library path
+	    if test -n "$shlibpath_var"; then
+	      # Make sure the rpath contains only unique directories.
+	      case "$temp_rpath " in
+	      *" $dir "*) ;;
+	      *" $absdir "*) ;;
+	      *) temp_rpath="$temp_rpath $dir" ;;
+	      esac
+	    fi
+
+	    # Hardcode the library path.
+	    # Skip directories that are in the system default run-time
+	    # search path.
+	    case " $sys_lib_dlsearch_path " in
+	    *" $absdir "*) ;;
+	    *)
+	      case "$compile_rpath " in
+	      *" $absdir "*) ;;
+	      *) compile_rpath="$compile_rpath $absdir"
+	      esac
+	      ;;
+	    esac
+	    case " $sys_lib_dlsearch_path " in
+	    *" $libdir "*) ;;
+	    *)
+	      case "$finalize_rpath " in
+	      *" $libdir "*) ;;
+	      *) finalize_rpath="$finalize_rpath $libdir"
+	      esac
+	      ;;
+	    esac
+	  fi # $linkmode,$pass = prog,link...
+
+	  if test "$alldeplibs" = yes &&
+	     { test "$deplibs_check_method" = pass_all ||
+	       { test "$build_libtool_libs" = yes &&
+		 test -n "$library_names"; }; }; then
+	    # We only need to search for static libraries
+	    continue
+	  fi
+	fi
+
+	link_static=no # Whether the deplib will be linked statically
+	if test -n "$library_names" &&
+	   { test "$prefer_static_libs" = no || test -z "$old_library"; }; then
+	  if test "$installed" = no; then
+	    notinst_deplibs="$notinst_deplibs $lib"
+	    need_relink=yes
+	  fi
+	  # This is a shared library
+
+	  # Warn about portability, can't link against -module's on
+	  # some systems (darwin)
+	  if test "$shouldnotlink" = yes && test "$pass" = link ; then
+	    $echo
+	    if test "$linkmode" = prog; then
+	      $echo "*** Warning: Linking the executable $output against the loadable module"
+	    else
+	      $echo "*** Warning: Linking the shared library $output against the loadable module"
+	    fi
+	    $echo "*** $linklib is not portable!"
+	  fi
+	  if test "$linkmode" = lib &&
+	     test "$hardcode_into_libs" = yes; then
+	    # Hardcode the library path.
+	    # Skip directories that are in the system default run-time
+	    # search path.
+	    case " $sys_lib_dlsearch_path " in
+	    *" $absdir "*) ;;
+	    *)
+	      case "$compile_rpath " in
+	      *" $absdir "*) ;;
+	      *) compile_rpath="$compile_rpath $absdir"
+	      esac
+	      ;;
+	    esac
+	    case " $sys_lib_dlsearch_path " in
+	    *" $libdir "*) ;;
+	    *)
+	      case "$finalize_rpath " in
+	      *" $libdir "*) ;;
+	      *) finalize_rpath="$finalize_rpath $libdir"
+	      esac
+	      ;;
+	    esac
+	  fi
+
+	  if test -n "$old_archive_from_expsyms_cmds"; then
+	    # figure out the soname
+	    set dummy $library_names
+	    realname="$2"
+	    shift; shift
+	    libname=`eval \\$echo \"$libname_spec\"`
+	    # use dlname if we got it. it's perfectly good, no?
+	    if test -n "$dlname"; then
+	      soname="$dlname"
+	    elif test -n "$soname_spec"; then
+	      # bleh windows
+	      case $host in
+	      *cygwin* | mingw*)
+		major=`expr $current - $age`
+		versuffix="-$major"
+		;;
+	      esac
+	      eval soname=\"$soname_spec\"
+	    else
+	      soname="$realname"
+	    fi
+
+	    # Make a new name for the extract_expsyms_cmds to use
+	    soroot="$soname"
+	    soname=`$echo $soroot | ${SED} -e 's/^.*\///'`
+	    newlib="libimp-`$echo $soname | ${SED} 's/^lib//;s/\.dll$//'`.a"
+
+	    # If the library has no export list, then create one now
+	    if test -f "$output_objdir/$soname-def"; then :
+	    else
+	      $show "extracting exported symbol list from \`$soname'"
+	      save_ifs="$IFS"; IFS='~'
+	      cmds=$extract_expsyms_cmds
+	      for cmd in $cmds; do
+		IFS="$save_ifs"
+		eval cmd=\"$cmd\"
+		$show "$cmd"
+		$run eval "$cmd" || exit $?
+	      done
+	      IFS="$save_ifs"
+	    fi
+
+	    # Create $newlib
+	    if test -f "$output_objdir/$newlib"; then :; else
+	      $show "generating import library for \`$soname'"
+	      save_ifs="$IFS"; IFS='~'
+	      cmds=$old_archive_from_expsyms_cmds
+	      for cmd in $cmds; do
+		IFS="$save_ifs"
+		eval cmd=\"$cmd\"
+		$show "$cmd"
+		$run eval "$cmd" || exit $?
+	      done
+	      IFS="$save_ifs"
+	    fi
+	    # make sure the library variables are pointing to the new library
+	    dir=$output_objdir
+	    linklib=$newlib
+	  fi # test -n "$old_archive_from_expsyms_cmds"
+
+	  if test "$linkmode" = prog || test "$mode" != relink; then
+	    add_shlibpath=
+	    add_dir=
+	    add=
+	    lib_linked=yes
+	    case $hardcode_action in
+	    immediate | unsupported)
+	      if test "$hardcode_direct" = no; then
+		add="$dir/$linklib"
+		case $host in
+		  *-*-sco3.2v5* ) add_dir="-L$dir" ;;
+		  *-*-darwin* )
+		    # if the lib is a module then we can not link against
+		    # it, someone is ignoring the new warnings I added
+		    if /usr/bin/file -L $add 2> /dev/null | $EGREP "bundle" >/dev/null ; then
+		      $echo "** Warning, lib $linklib is a module, not a shared library"
+		      if test -z "$old_library" ; then
+		        $echo
+		        $echo "** And there doesn't seem to be a static archive available"
+		        $echo "** The link will probably fail, sorry"
+		      else
+		        add="$dir/$old_library"
+		      fi
+		    fi
+		esac
+	      elif test "$hardcode_minus_L" = no; then
+		case $host in
+		*-*-sunos*) add_shlibpath="$dir" ;;
+		esac
+		add_dir="-L$dir"
+		add="-l$name"
+	      elif test "$hardcode_shlibpath_var" = no; then
+		add_shlibpath="$dir"
+		add="-l$name"
+	      else
+		lib_linked=no
+	      fi
+	      ;;
+	    relink)
+	      if test "$hardcode_direct" = yes; then
+		add="$dir/$linklib"
+	      elif test "$hardcode_minus_L" = yes; then
+		add_dir="-L$dir"
+		# Try looking first in the location we're being installed to.
+		if test -n "$inst_prefix_dir"; then
+		  case "$libdir" in
+		    [\\/]*)
+		      add_dir="$add_dir -L$inst_prefix_dir$libdir"
+		      ;;
+		  esac
+		fi
+		add="-l$name"
+	      elif test "$hardcode_shlibpath_var" = yes; then
+		add_shlibpath="$dir"
+		add="-l$name"
+	      else
+		lib_linked=no
+	      fi
+	      ;;
+	    *) lib_linked=no ;;
+	    esac
+
+	    if test "$lib_linked" != yes; then
+	      $echo "$modename: configuration error: unsupported hardcode properties"
+	      exit $EXIT_FAILURE
+	    fi
+
+	    if test -n "$add_shlibpath"; then
+	      case :$compile_shlibpath: in
+	      *":$add_shlibpath:"*) ;;
+	      *) compile_shlibpath="$compile_shlibpath$add_shlibpath:" ;;
+	      esac
+	    fi
+	    if test "$linkmode" = prog; then
+	      test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs"
+	      test -n "$add" && compile_deplibs="$add $compile_deplibs"
+	    else
+	      test -n "$add_dir" && deplibs="$add_dir $deplibs"
+	      test -n "$add" && deplibs="$add $deplibs"
+	      if test "$hardcode_direct" != yes && \
+		 test "$hardcode_minus_L" != yes && \
+		 test "$hardcode_shlibpath_var" = yes; then
+		case :$finalize_shlibpath: in
+		*":$libdir:"*) ;;
+		*) finalize_shlibpath="$finalize_shlibpath$libdir:" ;;
+		esac
+	      fi
+	    fi
+	  fi
+
+	  if test "$linkmode" = prog || test "$mode" = relink; then
+	    add_shlibpath=
+	    add_dir=
+	    add=
+	    # Finalize command for both is simple: just hardcode it.
+	    if test "$hardcode_direct" = yes; then
+	      add="$libdir/$linklib"
+	    elif test "$hardcode_minus_L" = yes; then
+	      add_dir="-L$libdir"
+	      add="-l$name"
+	    elif test "$hardcode_shlibpath_var" = yes; then
+	      case :$finalize_shlibpath: in
+	      *":$libdir:"*) ;;
+	      *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;;
+	      esac
+	      add="-l$name"
+	    elif test "$hardcode_automatic" = yes; then
+	      if test -n "$inst_prefix_dir" &&
+		 test -f "$inst_prefix_dir$libdir/$linklib" ; then
+	        add="$inst_prefix_dir$libdir/$linklib"
+	      else
+	        add="$libdir/$linklib"
+	      fi
+	    else
+	      # We cannot seem to hardcode it, guess we'll fake it.
+	      add_dir="-L$libdir"
+	      # Try looking first in the location we're being installed to.
+	      if test -n "$inst_prefix_dir"; then
+		case "$libdir" in
+		  [\\/]*)
+		    add_dir="$add_dir -L$inst_prefix_dir$libdir"
+		    ;;
+		esac
+	      fi
+	      add="-l$name"
+	    fi
+
+	    if test "$linkmode" = prog; then
+	      test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs"
+	      test -n "$add" && finalize_deplibs="$add $finalize_deplibs"
+	    else
+	      test -n "$add_dir" && deplibs="$add_dir $deplibs"
+	      test -n "$add" && deplibs="$add $deplibs"
+	    fi
+	  fi
+	elif test "$linkmode" = prog; then
+	  # Here we assume that one of hardcode_direct or hardcode_minus_L
+	  # is not unsupported.  This is valid on all known static and
+	  # shared platforms.
+	  if test "$hardcode_direct" != unsupported; then
+	    test -n "$old_library" && linklib="$old_library"
+	    compile_deplibs="$dir/$linklib $compile_deplibs"
+	    finalize_deplibs="$dir/$linklib $finalize_deplibs"
+	  else
+	    compile_deplibs="-l$name -L$dir $compile_deplibs"
+	    finalize_deplibs="-l$name -L$dir $finalize_deplibs"
+	  fi
+	elif test "$build_libtool_libs" = yes; then
+	  # Not a shared library
+	  if test "$deplibs_check_method" != pass_all; then
+	    # We're trying link a shared library against a static one
+	    # but the system doesn't support it.
+
+	    # Just print a warning and add the library to dependency_libs so
+	    # that the program can be linked against the static library.
+	    $echo
+	    $echo "*** Warning: This system can not link to static lib archive $lib."
+	    $echo "*** I have the capability to make that library automatically link in when"
+	    $echo "*** you link to this library.  But I can only do this if you have a"
+	    $echo "*** shared version of the library, which you do not appear to have."
+	    if test "$module" = yes; then
+	      $echo "*** But as you try to build a module library, libtool will still create "
+	      $echo "*** a static module, that should work as long as the dlopening application"
+	      $echo "*** is linked with the -dlopen flag to resolve symbols at runtime."
+	      if test -z "$global_symbol_pipe"; then
+		$echo
+		$echo "*** However, this would only work if libtool was able to extract symbol"
+		$echo "*** lists from a program, using \`nm' or equivalent, but libtool could"
+		$echo "*** not find such a program.  So, this module is probably useless."
+		$echo "*** \`nm' from GNU binutils and a full rebuild may help."
+	      fi
+	      if test "$build_old_libs" = no; then
+		build_libtool_libs=module
+		build_old_libs=yes
+	      else
+		build_libtool_libs=no
+	      fi
+	    fi
+	  else
+	    convenience="$convenience $dir/$old_library"
+	    old_convenience="$old_convenience $dir/$old_library"
+	    deplibs="$dir/$old_library $deplibs"
+	    link_static=yes
+	  fi
+	fi # link shared/static library?
+
+	if test "$linkmode" = lib; then
+	  if test -n "$dependency_libs" &&
+	     { test "$hardcode_into_libs" != yes ||
+	       test "$build_old_libs" = yes ||
+	       test "$link_static" = yes; }; then
+	    # Extract -R from dependency_libs
+	    temp_deplibs=
+	    for libdir in $dependency_libs; do
+	      case $libdir in
+	      -R*) temp_xrpath=`$echo "X$libdir" | $Xsed -e 's/^-R//'`
+		   case " $xrpath " in
+		   *" $temp_xrpath "*) ;;
+		   *) xrpath="$xrpath $temp_xrpath";;
+		   esac;;
+	      *) temp_deplibs="$temp_deplibs $libdir";;
+	      esac
+	    done
+	    dependency_libs="$temp_deplibs"
+	  fi
+
+	  newlib_search_path="$newlib_search_path $absdir"
+	  # Link against this library
+	  test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs"
+	  # ... and its dependency_libs
+	  tmp_libs=
+	  for deplib in $dependency_libs; do
+	    newdependency_libs="$deplib $newdependency_libs"
+	    if test "X$duplicate_deps" = "Xyes" ; then
+	      case "$tmp_libs " in
+	      *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
+	      esac
+	    fi
+	    tmp_libs="$tmp_libs $deplib"
+	  done
+
+	  if test "$link_all_deplibs" != no; then
+	    # Add the search paths of all dependency libraries
+	    for deplib in $dependency_libs; do
+	      case $deplib in
+	      -L*) path="$deplib" ;;
+	      *.la)
+		dir=`$echo "X$deplib" | $Xsed -e 's%/[^/]*$%%'`
+		test "X$dir" = "X$deplib" && dir="."
+		# We need an absolute path.
+		case $dir in
+		[\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;;
+		*)
+		  absdir=`cd "$dir" && pwd`
+		  if test -z "$absdir"; then
+		    $echo "$modename: warning: cannot determine absolute directory name of \`$dir'" 1>&2
+		    absdir="$dir"
+		  fi
+		  ;;
+		esac
+		if grep "^installed=no" $deplib > /dev/null; then
+		  path="$absdir/$objdir"
+		else
+		  eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib`
+		  if test -z "$libdir"; then
+		    $echo "$modename: \`$deplib' is not a valid libtool archive" 1>&2
+		    exit $EXIT_FAILURE
+		  fi
+		  if test "$absdir" != "$libdir"; then
+		    $echo "$modename: warning: \`$deplib' seems to be moved" 1>&2
+		  fi
+		  path="$absdir"
+		fi
+		depdepl=
+		case $host in
+		*-*-darwin*)
+		  # we do not want to link against static libs,
+		  # but need to link against shared
+		  eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib`
+		  if test -n "$deplibrary_names" ; then
+		    for tmp in $deplibrary_names ; do
+		      depdepl=$tmp
+		    done
+		    if test -f "$path/$depdepl" ; then
+		      depdepl="$path/$depdepl"
+		    fi
+		    # do not add paths which are already there
+		    case " $newlib_search_path " in
+		    *" $path "*) ;;
+		    *) newlib_search_path="$newlib_search_path $path";;
+		    esac
+		  fi
+		  path=""
+		  ;;
+		*)
+		  path="-L$path"
+		  ;;
+		esac
+		;;
+	      -l*)
+		case $host in
+		*-*-darwin*)
+		  # Again, we only want to link against shared libraries
+		  eval tmp_libs=`$echo "X$deplib" | $Xsed -e "s,^\-l,,"`
+		  for tmp in $newlib_search_path ; do
+		    if test -f "$tmp/lib$tmp_libs.dylib" ; then
+		      eval depdepl="$tmp/lib$tmp_libs.dylib"
+		      break
+		    fi
+		  done
+		  path=""
+		  ;;
+		*) continue ;;
+		esac
+		;;
+	      *) continue ;;
+	      esac
+	      case " $deplibs " in
+	      *" $depdepl "*) ;;
+	      *) deplibs="$depdepl $deplibs" ;;
+	      esac
+	      case " $deplibs " in
+	      *" $path "*) ;;
+	      *) deplibs="$deplibs $path" ;;
+	      esac
+	    done
+	  fi # link_all_deplibs != no
+	fi # linkmode = lib
+      done # for deplib in $libs
+      dependency_libs="$newdependency_libs"
+      if test "$pass" = dlpreopen; then
+	# Link the dlpreopened libraries before other libraries
+	for deplib in $save_deplibs; do
+	  deplibs="$deplib $deplibs"
+	done
+      fi
+      if test "$pass" != dlopen; then
+	if test "$pass" != conv; then
+	  # Make sure lib_search_path contains only unique directories.
+	  lib_search_path=
+	  for dir in $newlib_search_path; do
+	    case "$lib_search_path " in
+	    *" $dir "*) ;;
+	    *) lib_search_path="$lib_search_path $dir" ;;
+	    esac
+	  done
+	  newlib_search_path=
+	fi
+
+	if test "$linkmode,$pass" != "prog,link"; then
+	  vars="deplibs"
+	else
+	  vars="compile_deplibs finalize_deplibs"
+	fi
+	for var in $vars dependency_libs; do
+	  # Add libraries to $var in reverse order
+	  eval tmp_libs=\"\$$var\"
+	  new_libs=
+	  for deplib in $tmp_libs; do
+	    # FIXME: Pedantically, this is the right thing to do, so
+	    #        that some nasty dependency loop isn't accidentally
+	    #        broken:
+	    #new_libs="$deplib $new_libs"
+	    # Pragmatically, this seems to cause very few problems in
+	    # practice:
+	    case $deplib in
+	    -L*) new_libs="$deplib $new_libs" ;;
+	    -R*) ;;
+	    *)
+	      # And here is the reason: when a library appears more
+	      # than once as an explicit dependence of a library, or
+	      # is implicitly linked in more than once by the
+	      # compiler, it is considered special, and multiple
+	      # occurrences thereof are not removed.  Compare this
+	      # with having the same library being listed as a
+	      # dependency of multiple other libraries: in this case,
+	      # we know (pedantically, we assume) the library does not
+	      # need to be listed more than once, so we keep only the
+	      # last copy.  This is not always right, but it is rare
+	      # enough that we require users that really mean to play
+	      # such unportable linking tricks to link the library
+	      # using -Wl,-lname, so that libtool does not consider it
+	      # for duplicate removal.
+	      case " $specialdeplibs " in
+	      *" $deplib "*) new_libs="$deplib $new_libs" ;;
+	      *)
+		case " $new_libs " in
+		*" $deplib "*) ;;
+		*) new_libs="$deplib $new_libs" ;;
+		esac
+		;;
+	      esac
+	      ;;
+	    esac
+	  done
+	  tmp_libs=
+	  for deplib in $new_libs; do
+	    case $deplib in
+	    -L*)
+	      case " $tmp_libs " in
+	      *" $deplib "*) ;;
+	      *) tmp_libs="$tmp_libs $deplib" ;;
+	      esac
+	      ;;
+	    *) tmp_libs="$tmp_libs $deplib" ;;
+	    esac
+	  done
+	  eval $var=\"$tmp_libs\"
+	done # for var
+      fi
+      # Last step: remove runtime libs from dependency_libs
+      # (they stay in deplibs)
+      tmp_libs=
+      for i in $dependency_libs ; do
+	case " $predeps $postdeps $compiler_lib_search_path " in
+	*" $i "*)
+	  i=""
+	  ;;
+	esac
+	if test -n "$i" ; then
+	  tmp_libs="$tmp_libs $i"
+	fi
+      done
+      dependency_libs=$tmp_libs
+    done # for pass
+    if test "$linkmode" = prog; then
+      dlfiles="$newdlfiles"
+      dlprefiles="$newdlprefiles"
+    fi
+
+    case $linkmode in
+    oldlib)
+      if test -n "$deplibs"; then
+	$echo "$modename: warning: \`-l' and \`-L' are ignored for archives" 1>&2
+      fi
+
+      if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
+	$echo "$modename: warning: \`-dlopen' is ignored for archives" 1>&2
+      fi
+
+      if test -n "$rpath"; then
+	$echo "$modename: warning: \`-rpath' is ignored for archives" 1>&2
+      fi
+
+      if test -n "$xrpath"; then
+	$echo "$modename: warning: \`-R' is ignored for archives" 1>&2
+      fi
+
+      if test -n "$vinfo"; then
+	$echo "$modename: warning: \`-version-info/-version-number' is ignored for archives" 1>&2
+      fi
+
+      if test -n "$release"; then
+	$echo "$modename: warning: \`-release' is ignored for archives" 1>&2
+      fi
+
+      if test -n "$export_symbols" || test -n "$export_symbols_regex"; then
+	$echo "$modename: warning: \`-export-symbols' is ignored for archives" 1>&2
+      fi
+
+      # Now set the variables for building old libraries.
+      build_libtool_libs=no
+      oldlibs="$output"
+      objs="$objs$old_deplibs"
+      ;;
+
+    lib)
+      # Make sure we only generate libraries of the form `libNAME.la'.
+      case $outputname in
+      lib*)
+	name=`$echo "X$outputname" | $Xsed -e 's/\.la$//' -e 's/^lib//'`
+	eval shared_ext=\"$shrext_cmds\"
+	eval libname=\"$libname_spec\"
+	;;
+      *)
+	if test "$module" = no; then
+	  $echo "$modename: libtool library \`$output' must begin with \`lib'" 1>&2
+	  $echo "$help" 1>&2
+	  exit $EXIT_FAILURE
+	fi
+	if test "$need_lib_prefix" != no; then
+	  # Add the "lib" prefix for modules if required
+	  name=`$echo "X$outputname" | $Xsed -e 's/\.la$//'`
+	  eval shared_ext=\"$shrext_cmds\"
+	  eval libname=\"$libname_spec\"
+	else
+	  libname=`$echo "X$outputname" | $Xsed -e 's/\.la$//'`
+	fi
+	;;
+      esac
+
+      if test -n "$objs"; then
+	if test "$deplibs_check_method" != pass_all; then
+	  $echo "$modename: cannot build libtool library \`$output' from non-libtool objects on this host:$objs" 2>&1
+	  exit $EXIT_FAILURE
+	else
+	  $echo
+	  $echo "*** Warning: Linking the shared library $output against the non-libtool"
+	  $echo "*** objects $objs is not portable!"
+	  libobjs="$libobjs $objs"
+	fi
+      fi
+
+      if test "$dlself" != no; then
+	$echo "$modename: warning: \`-dlopen self' is ignored for libtool libraries" 1>&2
+      fi
+
+      set dummy $rpath
+      if test "$#" -gt 2; then
+	$echo "$modename: warning: ignoring multiple \`-rpath's for a libtool library" 1>&2
+      fi
+      install_libdir="$2"
+
+      oldlibs=
+      if test -z "$rpath"; then
+	if test "$build_libtool_libs" = yes; then
+	  # Building a libtool convenience library.
+	  # Some compilers have problems with a `.al' extension so
+	  # convenience libraries should have the same extension an
+	  # archive normally would.
+	  oldlibs="$output_objdir/$libname.$libext $oldlibs"
+	  build_libtool_libs=convenience
+	  build_old_libs=yes
+	fi
+
+	if test -n "$vinfo"; then
+	  $echo "$modename: warning: \`-version-info/-version-number' is ignored for convenience libraries" 1>&2
+	fi
+
+	if test -n "$release"; then
+	  $echo "$modename: warning: \`-release' is ignored for convenience libraries" 1>&2
+	fi
+      else
+
+	# Parse the version information argument.
+	save_ifs="$IFS"; IFS=':'
+	set dummy $vinfo 0 0 0
+	IFS="$save_ifs"
+
+	if test -n "$8"; then
+	  $echo "$modename: too many parameters to \`-version-info'" 1>&2
+	  $echo "$help" 1>&2
+	  exit $EXIT_FAILURE
+	fi
+
+	# convert absolute version numbers to libtool ages
+	# this retains compatibility with .la files and attempts
+	# to make the code below a bit more comprehensible
+
+	case $vinfo_number in
+	yes)
+	  number_major="$2"
+	  number_minor="$3"
+	  number_revision="$4"
+	  #
+	  # There are really only two kinds -- those that
+	  # use the current revision as the major version
+	  # and those that subtract age and use age as
+	  # a minor version.  But, then there is irix
+	  # which has an extra 1 added just for fun
+	  #
+	  case $version_type in
+	  darwin|linux|osf|windows)
+	    current=`expr $number_major + $number_minor`
+	    age="$number_minor"
+	    revision="$number_revision"
+	    ;;
+	  freebsd-aout|freebsd-elf|sunos)
+	    current="$number_major"
+	    revision="$number_minor"
+	    age="0"
+	    ;;
+	  irix|nonstopux)
+	    current=`expr $number_major + $number_minor - 1`
+	    age="$number_minor"
+	    revision="$number_minor"
+	    ;;
+	  esac
+	  ;;
+	no)
+	  current="$2"
+	  revision="$3"
+	  age="$4"
+	  ;;
+	esac
+
+	# Check that each of the things are valid numbers.
+	case $current in
+	[0-9]*) ;;
+	*)
+	  $echo "$modename: CURRENT \`$current' is not a nonnegative integer" 1>&2
+	  $echo "$modename: \`$vinfo' is not valid version information" 1>&2
+	  exit $EXIT_FAILURE
+	  ;;
+	esac
+
+	case $revision in
+	[0-9]*) ;;
+	*)
+	  $echo "$modename: REVISION \`$revision' is not a nonnegative integer" 1>&2
+	  $echo "$modename: \`$vinfo' is not valid version information" 1>&2
+	  exit $EXIT_FAILURE
+	  ;;
+	esac
+
+	case $age in
+	[0-9]*) ;;
+	*)
+	  $echo "$modename: AGE \`$age' is not a nonnegative integer" 1>&2
+	  $echo "$modename: \`$vinfo' is not valid version information" 1>&2
+	  exit $EXIT_FAILURE
+	  ;;
+	esac
+
+	if test "$age" -gt "$current"; then
+	  $echo "$modename: AGE \`$age' is greater than the current interface number \`$current'" 1>&2
+	  $echo "$modename: \`$vinfo' is not valid version information" 1>&2
+	  exit $EXIT_FAILURE
+	fi
+
+	# Calculate the version variables.
+	major=
+	versuffix=
+	verstring=
+	case $version_type in
+	none) ;;
+
+	darwin)
+	  # Like Linux, but with the current version available in
+	  # verstring for coding it into the library header
+	  major=.`expr $current - $age`
+	  versuffix="$major.$age.$revision"
+	  # Darwin ld doesn't like 0 for these options...
+	  minor_current=`expr $current + 1`
+	  verstring="-compatibility_version $minor_current -current_version $minor_current.$revision"
+	  ;;
+
+	freebsd-aout)
+	  major=".$current"
+	  versuffix=".$current.$revision";
+	  ;;
+
+	freebsd-elf)
+	  major=".$current"
+	  versuffix=".$current";
+	  ;;
+
+	irix | nonstopux)
+	  major=`expr $current - $age + 1`
+
+	  case $version_type in
+	    nonstopux) verstring_prefix=nonstopux ;;
+	    *)         verstring_prefix=sgi ;;
+	  esac
+	  verstring="$verstring_prefix$major.$revision"
+
+	  # Add in all the interfaces that we are compatible with.
+	  loop=$revision
+	  while test "$loop" -ne 0; do
+	    iface=`expr $revision - $loop`
+	    loop=`expr $loop - 1`
+	    verstring="$verstring_prefix$major.$iface:$verstring"
+	  done
+
+	  # Before this point, $major must not contain `.'.
+	  major=.$major
+	  versuffix="$major.$revision"
+	  ;;
+
+	linux)
+	  major=.`expr $current - $age`
+	  versuffix="$major.$age.$revision"
+	  ;;
+
+	osf)
+	  major=.`expr $current - $age`
+	  versuffix=".$current.$age.$revision"
+	  verstring="$current.$age.$revision"
+
+	  # Add in all the interfaces that we are compatible with.
+	  loop=$age
+	  while test "$loop" -ne 0; do
+	    iface=`expr $current - $loop`
+	    loop=`expr $loop - 1`
+	    verstring="$verstring:${iface}.0"
+	  done
+
+	  # Make executables depend on our current version.
+	  verstring="$verstring:${current}.0"
+	  ;;
+
+	sunos)
+	  major=".$current"
+	  versuffix=".$current.$revision"
+	  ;;
+
+	windows)
+	  # Use '-' rather than '.', since we only want one
+	  # extension on DOS 8.3 filesystems.
+	  major=`expr $current - $age`
+	  versuffix="-$major"
+	  ;;
+
+	*)
+	  $echo "$modename: unknown library version type \`$version_type'" 1>&2
+	  $echo "Fatal configuration error.  See the $PACKAGE docs for more information." 1>&2
+	  exit $EXIT_FAILURE
+	  ;;
+	esac
+
+	# Clear the version info if we defaulted, and they specified a release.
+	if test -z "$vinfo" && test -n "$release"; then
+	  major=
+	  case $version_type in
+	  darwin)
+	    # we can't check for "0.0" in archive_cmds due to quoting
+	    # problems, so we reset it completely
+	    verstring=
+	    ;;
+	  *)
+	    verstring="0.0"
+	    ;;
+	  esac
+	  if test "$need_version" = no; then
+	    versuffix=
+	  else
+	    versuffix=".0.0"
+	  fi
+	fi
+
+	# Remove version info from name if versioning should be avoided
+	if test "$avoid_version" = yes && test "$need_version" = no; then
+	  major=
+	  versuffix=
+	  verstring=""
+	fi
+
+	# Check to see if the archive will have undefined symbols.
+	if test "$allow_undefined" = yes; then
+	  if test "$allow_undefined_flag" = unsupported; then
+	    $echo "$modename: warning: undefined symbols not allowed in $host shared libraries" 1>&2
+	    build_libtool_libs=no
+	    build_old_libs=yes
+	  fi
+	else
+	  # Don't allow undefined symbols.
+	  allow_undefined_flag="$no_undefined_flag"
+	fi
+      fi
+
+      if test "$mode" != relink; then
+	# Remove our outputs, but don't remove object files since they
+	# may have been created when compiling PIC objects.
+	removelist=
+	tempremovelist=`$echo "$output_objdir/*"`
+	for p in $tempremovelist; do
+	  case $p in
+	    *.$objext)
+	       ;;
+	    $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*)
+	       if test "X$precious_files_regex" != "X"; then
+	         if echo $p | $EGREP -e "$precious_files_regex" >/dev/null 2>&1
+	         then
+		   continue
+		 fi
+	       fi
+	       removelist="$removelist $p"
+	       ;;
+	    *) ;;
+	  esac
+	done
+	if test -n "$removelist"; then
+	  $show "${rm}r $removelist"
+	  $run ${rm}r $removelist
+	fi
+      fi
+
+      # Now set the variables for building old libraries.
+      if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then
+	oldlibs="$oldlibs $output_objdir/$libname.$libext"
+
+	# Transform .lo files to .o files.
+	oldobjs="$objs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e "$lo2o" | $NL2SP`
+      fi
+
+      # Eliminate all temporary directories.
+      for path in $notinst_path; do
+	lib_search_path=`$echo "$lib_search_path " | ${SED} -e 's% $path % %g'`
+	deplibs=`$echo "$deplibs " | ${SED} -e 's% -L$path % %g'`
+	dependency_libs=`$echo "$dependency_libs " | ${SED} -e 's% -L$path % %g'`
+      done
+
+      if test -n "$xrpath"; then
+	# If the user specified any rpath flags, then add them.
+	temp_xrpath=
+	for libdir in $xrpath; do
+	  temp_xrpath="$temp_xrpath -R$libdir"
+	  case "$finalize_rpath " in
+	  *" $libdir "*) ;;
+	  *) finalize_rpath="$finalize_rpath $libdir" ;;
+	  esac
+	done
+	if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then
+	  dependency_libs="$temp_xrpath $dependency_libs"
+	fi
+      fi
+
+      # Make sure dlfiles contains only unique files that won't be dlpreopened
+      old_dlfiles="$dlfiles"
+      dlfiles=
+      for lib in $old_dlfiles; do
+	case " $dlprefiles $dlfiles " in
+	*" $lib "*) ;;
+	*) dlfiles="$dlfiles $lib" ;;
+	esac
+      done
+
+      # Make sure dlprefiles contains only unique files
+      old_dlprefiles="$dlprefiles"
+      dlprefiles=
+      for lib in $old_dlprefiles; do
+	case "$dlprefiles " in
+	*" $lib "*) ;;
+	*) dlprefiles="$dlprefiles $lib" ;;
+	esac
+      done
+
+      if test "$build_libtool_libs" = yes; then
+	if test -n "$rpath"; then
+	  case $host in
+	  *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos*)
+	    # these systems don't actually have a c library (as such)!
+	    ;;
+	  *-*-rhapsody* | *-*-darwin1.[012])
+	    # Rhapsody C library is in the System framework
+	    deplibs="$deplibs -framework System"
+	    ;;
+	  *-*-netbsd*)
+	    # Don't link with libc until the a.out ld.so is fixed.
+	    ;;
+	  *-*-openbsd* | *-*-freebsd*)
+	    # Do not include libc due to us having libc/libc_r.
+	    test "X$arg" = "X-lc" && continue
+	    ;;
+ 	  *)
+	    # Add libc to deplibs on all other systems if necessary.
+	    if test "$build_libtool_need_lc" = "yes"; then
+	      deplibs="$deplibs -lc"
+	    fi
+	    ;;
+	  esac
+	fi
+
+	# Transform deplibs into only deplibs that can be linked in shared.
+	name_save=$name
+	libname_save=$libname
+	release_save=$release
+	versuffix_save=$versuffix
+	major_save=$major
+	# I'm not sure if I'm treating the release correctly.  I think
+	# release should show up in the -l (ie -lgmp5) so we don't want to
+	# add it in twice.  Is that correct?
+	release=""
+	versuffix=""
+	major=""
+	newdeplibs=
+	droppeddeps=no
+	case $deplibs_check_method in
+	pass_all)
+	  # Don't check for shared/static.  Everything works.
+	  # This might be a little naive.  We might want to check
+	  # whether the library exists or not.  But this is on
+	  # osf3 & osf4 and I'm not really sure... Just
+	  # implementing what was already the behavior.
+	  newdeplibs=$deplibs
+	  ;;
+	test_compile)
+	  # This code stresses the "libraries are programs" paradigm to its
+	  # limits. Maybe even breaks it.  We compile a program, linking it
+	  # against the deplibs as a proxy for the library.  Then we can check
+	  # whether they linked in statically or dynamically with ldd.
+	  $rm conftest.c
+	  cat > conftest.c <<EOF
+	  int main() { return 0; }
+EOF
+	  $rm conftest
+	  $LTCC -o conftest conftest.c $deplibs
+	  if test "$?" -eq 0 ; then
+	    ldd_output=`ldd conftest`
+	    for i in $deplibs; do
+	      name="`expr $i : '-l\(.*\)'`"
+	      # If $name is empty we are operating on a -L argument.
+              if test "$name" != "" && test "$name" -ne "0"; then
+		if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+		  case " $predeps $postdeps " in
+		  *" $i "*)
+		    newdeplibs="$newdeplibs $i"
+		    i=""
+		    ;;
+		  esac
+	        fi
+		if test -n "$i" ; then
+		  libname=`eval \\$echo \"$libname_spec\"`
+		  deplib_matches=`eval \\$echo \"$library_names_spec\"`
+		  set dummy $deplib_matches
+		  deplib_match=$2
+		  if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
+		    newdeplibs="$newdeplibs $i"
+		  else
+		    droppeddeps=yes
+		    $echo
+		    $echo "*** Warning: dynamic linker does not accept needed library $i."
+		    $echo "*** I have the capability to make that library automatically link in when"
+		    $echo "*** you link to this library.  But I can only do this if you have a"
+		    $echo "*** shared version of the library, which I believe you do not have"
+		    $echo "*** because a test_compile did reveal that the linker did not use it for"
+		    $echo "*** its dynamic dependency list that programs get resolved with at runtime."
+		  fi
+		fi
+	      else
+		newdeplibs="$newdeplibs $i"
+	      fi
+	    done
+	  else
+	    # Error occurred in the first compile.  Let's try to salvage
+	    # the situation: Compile a separate program for each library.
+	    for i in $deplibs; do
+	      name="`expr $i : '-l\(.*\)'`"
+	      # If $name is empty we are operating on a -L argument.
+              if test "$name" != "" && test "$name" != "0"; then
+		$rm conftest
+		$LTCC -o conftest conftest.c $i
+		# Did it work?
+		if test "$?" -eq 0 ; then
+		  ldd_output=`ldd conftest`
+		  if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+		    case " $predeps $postdeps " in
+		    *" $i "*)
+		      newdeplibs="$newdeplibs $i"
+		      i=""
+		      ;;
+		    esac
+		  fi
+		  if test -n "$i" ; then
+		    libname=`eval \\$echo \"$libname_spec\"`
+		    deplib_matches=`eval \\$echo \"$library_names_spec\"`
+		    set dummy $deplib_matches
+		    deplib_match=$2
+		    if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
+		      newdeplibs="$newdeplibs $i"
+		    else
+		      droppeddeps=yes
+		      $echo
+		      $echo "*** Warning: dynamic linker does not accept needed library $i."
+		      $echo "*** I have the capability to make that library automatically link in when"
+		      $echo "*** you link to this library.  But I can only do this if you have a"
+		      $echo "*** shared version of the library, which you do not appear to have"
+		      $echo "*** because a test_compile did reveal that the linker did not use this one"
+		      $echo "*** as a dynamic dependency that programs can get resolved with at runtime."
+		    fi
+		  fi
+		else
+		  droppeddeps=yes
+		  $echo
+		  $echo "*** Warning!  Library $i is needed by this library but I was not able to"
+		  $echo "***  make it link in!  You will probably need to install it or some"
+		  $echo "*** library that it depends on before this library will be fully"
+		  $echo "*** functional.  Installing it before continuing would be even better."
+		fi
+	      else
+		newdeplibs="$newdeplibs $i"
+	      fi
+	    done
+	  fi
+	  ;;
+	file_magic*)
+	  set dummy $deplibs_check_method
+	  file_magic_regex=`expr "$deplibs_check_method" : "$2 \(.*\)"`
+	  for a_deplib in $deplibs; do
+	    name="`expr $a_deplib : '-l\(.*\)'`"
+	    # If $name is empty we are operating on a -L argument.
+            if test "$name" != "" && test  "$name" != "0"; then
+	      if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+		case " $predeps $postdeps " in
+		*" $a_deplib "*)
+		  newdeplibs="$newdeplibs $a_deplib"
+		  a_deplib=""
+		  ;;
+		esac
+	      fi
+	      if test -n "$a_deplib" ; then
+		libname=`eval \\$echo \"$libname_spec\"`
+		for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
+		  potential_libs=`ls $i/$libname[.-]* 2>/dev/null`
+		  for potent_lib in $potential_libs; do
+		      # Follow soft links.
+		      if ls -lLd "$potent_lib" 2>/dev/null \
+			 | grep " -> " >/dev/null; then
+			continue
+		      fi
+		      # The statement above tries to avoid entering an
+		      # endless loop below, in case of cyclic links.
+		      # We might still enter an endless loop, since a link
+		      # loop can be closed while we follow links,
+		      # but so what?
+		      potlib="$potent_lib"
+		      while test -h "$potlib" 2>/dev/null; do
+			potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'`
+			case $potliblink in
+			[\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";;
+			*) potlib=`$echo "X$potlib" | $Xsed -e 's,[^/]*$,,'`"$potliblink";;
+			esac
+		      done
+		      if eval $file_magic_cmd \"\$potlib\" 2>/dev/null \
+			 | ${SED} 10q \
+			 | $EGREP "$file_magic_regex" > /dev/null; then
+			newdeplibs="$newdeplibs $a_deplib"
+			a_deplib=""
+			break 2
+		      fi
+		  done
+		done
+	      fi
+	      if test -n "$a_deplib" ; then
+		droppeddeps=yes
+		$echo
+		$echo "*** Warning: linker path does not have real file for library $a_deplib."
+		$echo "*** I have the capability to make that library automatically link in when"
+		$echo "*** you link to this library.  But I can only do this if you have a"
+		$echo "*** shared version of the library, which you do not appear to have"
+		$echo "*** because I did check the linker path looking for a file starting"
+		if test -z "$potlib" ; then
+		  $echo "*** with $libname but no candidates were found. (...for file magic test)"
+		else
+		  $echo "*** with $libname and none of the candidates passed a file format test"
+		  $echo "*** using a file magic. Last file checked: $potlib"
+		fi
+	      fi
+	    else
+	      # Add a -L argument.
+	      newdeplibs="$newdeplibs $a_deplib"
+	    fi
+	  done # Gone through all deplibs.
+	  ;;
+	match_pattern*)
+	  set dummy $deplibs_check_method
+	  match_pattern_regex=`expr "$deplibs_check_method" : "$2 \(.*\)"`
+	  for a_deplib in $deplibs; do
+	    name="`expr $a_deplib : '-l\(.*\)'`"
+	    # If $name is empty we are operating on a -L argument.
+	    if test -n "$name" && test "$name" != "0"; then
+	      if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+		case " $predeps $postdeps " in
+		*" $a_deplib "*)
+		  newdeplibs="$newdeplibs $a_deplib"
+		  a_deplib=""
+		  ;;
+		esac
+	      fi
+	      if test -n "$a_deplib" ; then
+		libname=`eval \\$echo \"$libname_spec\"`
+		for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
+		  potential_libs=`ls $i/$libname[.-]* 2>/dev/null`
+		  for potent_lib in $potential_libs; do
+		    potlib="$potent_lib" # see symlink-check above in file_magic test
+		    if eval $echo \"$potent_lib\" 2>/dev/null \
+		        | ${SED} 10q \
+		        | $EGREP "$match_pattern_regex" > /dev/null; then
+		      newdeplibs="$newdeplibs $a_deplib"
+		      a_deplib=""
+		      break 2
+		    fi
+		  done
+		done
+	      fi
+	      if test -n "$a_deplib" ; then
+		droppeddeps=yes
+		$echo
+		$echo "*** Warning: linker path does not have real file for library $a_deplib."
+		$echo "*** I have the capability to make that library automatically link in when"
+		$echo "*** you link to this library.  But I can only do this if you have a"
+		$echo "*** shared version of the library, which you do not appear to have"
+		$echo "*** because I did check the linker path looking for a file starting"
+		if test -z "$potlib" ; then
+		  $echo "*** with $libname but no candidates were found. (...for regex pattern test)"
+		else
+		  $echo "*** with $libname and none of the candidates passed a file format test"
+		  $echo "*** using a regex pattern. Last file checked: $potlib"
+		fi
+	      fi
+	    else
+	      # Add a -L argument.
+	      newdeplibs="$newdeplibs $a_deplib"
+	    fi
+	  done # Gone through all deplibs.
+	  ;;
+	none | unknown | *)
+	  newdeplibs=""
+	  tmp_deplibs=`$echo "X $deplibs" | $Xsed -e 's/ -lc$//' \
+	    -e 's/ -[LR][^ ]*//g'`
+	  if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+	    for i in $predeps $postdeps ; do
+	      # can't use Xsed below, because $i might contain '/'
+	      tmp_deplibs=`$echo "X $tmp_deplibs" | ${SED} -e "1s,^X,," -e "s,$i,,"`
+	    done
+	  fi
+	  if $echo "X $tmp_deplibs" | $Xsed -e 's/[ 	]//g' \
+	    | grep . >/dev/null; then
+	    $echo
+	    if test "X$deplibs_check_method" = "Xnone"; then
+	      $echo "*** Warning: inter-library dependencies are not supported in this platform."
+	    else
+	      $echo "*** Warning: inter-library dependencies are not known to be supported."
+	    fi
+	    $echo "*** All declared inter-library dependencies are being dropped."
+	    droppeddeps=yes
+	  fi
+	  ;;
+	esac
+	versuffix=$versuffix_save
+	major=$major_save
+	release=$release_save
+	libname=$libname_save
+	name=$name_save
+
+	case $host in
+	*-*-rhapsody* | *-*-darwin1.[012])
+	  # On Rhapsody replace the C library is the System framework
+	  newdeplibs=`$echo "X $newdeplibs" | $Xsed -e 's/ -lc / -framework System /'`
+	  ;;
+	esac
+
+	if test "$droppeddeps" = yes; then
+	  if test "$module" = yes; then
+	    $echo
+	    $echo "*** Warning: libtool could not satisfy all declared inter-library"
+	    $echo "*** dependencies of module $libname.  Therefore, libtool will create"
+	    $echo "*** a static module, that should work as long as the dlopening"
+	    $echo "*** application is linked with the -dlopen flag."
+	    if test -z "$global_symbol_pipe"; then
+	      $echo
+	      $echo "*** However, this would only work if libtool was able to extract symbol"
+	      $echo "*** lists from a program, using \`nm' or equivalent, but libtool could"
+	      $echo "*** not find such a program.  So, this module is probably useless."
+	      $echo "*** \`nm' from GNU binutils and a full rebuild may help."
+	    fi
+	    if test "$build_old_libs" = no; then
+	      oldlibs="$output_objdir/$libname.$libext"
+	      build_libtool_libs=module
+	      build_old_libs=yes
+	    else
+	      build_libtool_libs=no
+	    fi
+	  else
+	    $echo "*** The inter-library dependencies that have been dropped here will be"
+	    $echo "*** automatically added whenever a program is linked with this library"
+	    $echo "*** or is declared to -dlopen it."
+
+	    if test "$allow_undefined" = no; then
+	      $echo
+	      $echo "*** Since this library must not contain undefined symbols,"
+	      $echo "*** because either the platform does not support them or"
+	      $echo "*** it was explicitly requested with -no-undefined,"
+	      $echo "*** libtool will only create a static version of it."
+	      if test "$build_old_libs" = no; then
+		oldlibs="$output_objdir/$libname.$libext"
+		build_libtool_libs=module
+		build_old_libs=yes
+	      else
+		build_libtool_libs=no
+	      fi
+	    fi
+	  fi
+	fi
+	# Done checking deplibs!
+	deplibs=$newdeplibs
+      fi
+
+      # All the library-specific variables (install_libdir is set above).
+      library_names=
+      old_library=
+      dlname=
+
+      # Test again, we may have decided not to build it any more
+      if test "$build_libtool_libs" = yes; then
+	if test "$hardcode_into_libs" = yes; then
+	  # Hardcode the library paths
+	  hardcode_libdirs=
+	  dep_rpath=
+	  rpath="$finalize_rpath"
+	  test "$mode" != relink && rpath="$compile_rpath$rpath"
+	  for libdir in $rpath; do
+	    if test -n "$hardcode_libdir_flag_spec"; then
+	      if test -n "$hardcode_libdir_separator"; then
+		if test -z "$hardcode_libdirs"; then
+		  hardcode_libdirs="$libdir"
+		else
+		  # Just accumulate the unique libdirs.
+		  case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
+		  *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
+		    ;;
+		  *)
+		    hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
+		    ;;
+		  esac
+		fi
+	      else
+		eval flag=\"$hardcode_libdir_flag_spec\"
+		dep_rpath="$dep_rpath $flag"
+	      fi
+	    elif test -n "$runpath_var"; then
+	      case "$perm_rpath " in
+	      *" $libdir "*) ;;
+	      *) perm_rpath="$perm_rpath $libdir" ;;
+	      esac
+	    fi
+	  done
+	  # Substitute the hardcoded libdirs into the rpath.
+	  if test -n "$hardcode_libdir_separator" &&
+	     test -n "$hardcode_libdirs"; then
+	    libdir="$hardcode_libdirs"
+	    if test -n "$hardcode_libdir_flag_spec_ld"; then
+	      eval dep_rpath=\"$hardcode_libdir_flag_spec_ld\"
+	    else
+	      eval dep_rpath=\"$hardcode_libdir_flag_spec\"
+	    fi
+	  fi
+	  if test -n "$runpath_var" && test -n "$perm_rpath"; then
+	    # We should set the runpath_var.
+	    rpath=
+	    for dir in $perm_rpath; do
+	      rpath="$rpath$dir:"
+	    done
+	    eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var"
+	  fi
+	  test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs"
+	fi
+
+	shlibpath="$finalize_shlibpath"
+	test "$mode" != relink && shlibpath="$compile_shlibpath$shlibpath"
+	if test -n "$shlibpath"; then
+	  eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var"
+	fi
+
+	# Get the real and link names of the library.
+	eval shared_ext=\"$shrext_cmds\"
+	eval library_names=\"$library_names_spec\"
+	set dummy $library_names
+	realname="$2"
+	shift; shift
+
+	if test -n "$soname_spec"; then
+	  eval soname=\"$soname_spec\"
+	else
+	  soname="$realname"
+	fi
+	if test -z "$dlname"; then
+	  dlname=$soname
+	fi
+
+	lib="$output_objdir/$realname"
+	for link
+	do
+	  linknames="$linknames $link"
+	done
+
+	# Use standard objects if they are pic
+	test -z "$pic_flag" && libobjs=`$echo "X$libobjs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
+
+	# Prepare the list of exported symbols
+	if test -z "$export_symbols"; then
+	  if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then
+	    $show "generating symbol list for \`$libname.la'"
+	    export_symbols="$output_objdir/$libname.exp"
+	    $run $rm $export_symbols
+	    cmds=$export_symbols_cmds
+	    save_ifs="$IFS"; IFS='~'
+	    for cmd in $cmds; do
+	      IFS="$save_ifs"
+	      eval cmd=\"$cmd\"
+	      if len=`expr "X$cmd" : ".*"` &&
+	       test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then
+	        $show "$cmd"
+	        $run eval "$cmd" || exit $?
+	        skipped_export=false
+	      else
+	        # The command line is too long to execute in one step.
+	        $show "using reloadable object file for export list..."
+	        skipped_export=:
+	      fi
+	    done
+	    IFS="$save_ifs"
+	    if test -n "$export_symbols_regex"; then
+	      $show "$EGREP -e \"$export_symbols_regex\" \"$export_symbols\" > \"${export_symbols}T\""
+	      $run eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"'
+	      $show "$mv \"${export_symbols}T\" \"$export_symbols\""
+	      $run eval '$mv "${export_symbols}T" "$export_symbols"'
+	    fi
+	  fi
+	fi
+
+	if test -n "$export_symbols" && test -n "$include_expsyms"; then
+	  $run eval '$echo "X$include_expsyms" | $SP2NL >> "$export_symbols"'
+	fi
+
+	tmp_deplibs=
+	for test_deplib in $deplibs; do
+		case " $convenience " in
+		*" $test_deplib "*) ;;
+		*)
+			tmp_deplibs="$tmp_deplibs $test_deplib"
+			;;
+		esac
+	done
+	deplibs="$tmp_deplibs"
+
+	if test -n "$convenience"; then
+	  if test -n "$whole_archive_flag_spec"; then
+	    save_libobjs=$libobjs
+	    eval libobjs=\"\$libobjs $whole_archive_flag_spec\"
+	  else
+	    gentop="$output_objdir/${outputname}x"
+	    $show "${rm}r $gentop"
+	    $run ${rm}r "$gentop"
+	    $show "$mkdir $gentop"
+	    $run $mkdir "$gentop"
+	    status=$?
+	    if test "$status" -ne 0 && test ! -d "$gentop"; then
+	      exit $status
+	    fi
+	    generated="$generated $gentop"
+
+	    for xlib in $convenience; do
+	      # Extract the objects.
+	      case $xlib in
+	      [\\/]* | [A-Za-z]:[\\/]*) xabs="$xlib" ;;
+	      *) xabs=`pwd`"/$xlib" ;;
+	      esac
+	      xlib=`$echo "X$xlib" | $Xsed -e 's%^.*/%%'`
+	      xdir="$gentop/$xlib"
+
+	      $show "${rm}r $xdir"
+	      $run ${rm}r "$xdir"
+	      $show "$mkdir $xdir"
+	      $run $mkdir "$xdir"
+	      status=$?
+	      if test "$status" -ne 0 && test ! -d "$xdir"; then
+		exit $status
+	      fi
+	      # We will extract separately just the conflicting names and we will no
+	      # longer touch any unique names. It is faster to leave these extract
+	      # automatically by $AR in one run.
+	      $show "(cd $xdir && $AR x $xabs)"
+	      $run eval "(cd \$xdir && $AR x \$xabs)" || exit $?
+	      if ($AR t "$xabs" | sort | sort -uc >/dev/null 2>&1); then
+		:
+	      else
+		$echo "$modename: warning: object name conflicts; renaming object files" 1>&2
+		$echo "$modename: warning: to ensure that they will not overwrite" 1>&2
+		$AR t "$xabs" | sort | uniq -cd | while read -r count name
+		do
+		  i=1
+		  while test "$i" -le "$count"
+		  do
+		   # Put our $i before any first dot (extension)
+		   # Never overwrite any file
+		   name_to="$name"
+		   while test "X$name_to" = "X$name" || test -f "$xdir/$name_to"
+		   do
+		     name_to=`$echo "X$name_to" | $Xsed -e "s/\([^.]*\)/\1-$i/"`
+		   done
+		   $show "(cd $xdir && $AR xN $i $xabs '$name' && $mv '$name' '$name_to')"
+		   $run eval "(cd \$xdir && $AR xN $i \$xabs '$name' && $mv '$name' '$name_to')" || exit $?
+		   i=`expr $i + 1`
+		  done
+		done
+	      fi
+
+	      libobjs="$libobjs "`find $xdir -name \*.$objext -print -o -name \*.lo -print | $NL2SP`
+	    done
+	  fi
+	fi
+
+	if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then
+	  eval flag=\"$thread_safe_flag_spec\"
+	  linker_flags="$linker_flags $flag"
+	fi
+
+	# Make a backup of the uninstalled library when relinking
+	if test "$mode" = relink; then
+	  $run eval '(cd $output_objdir && $rm ${realname}U && $mv $realname ${realname}U)' || exit $?
+	fi
+
+	# Do each of the archive commands.
+	if test "$module" = yes && test -n "$module_cmds" ; then
+	  if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then
+	    eval test_cmds=\"$module_expsym_cmds\"
+	    cmds=$module_expsym_cmds
+	  else
+	    eval test_cmds=\"$module_cmds\"
+	    cmds=$module_cmds
+	  fi
+	else
+	if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then
+	  eval test_cmds=\"$archive_expsym_cmds\"
+	  cmds=$archive_expsym_cmds
+	else
+	  eval test_cmds=\"$archive_cmds\"
+	  cmds=$archive_cmds
+	  fi
+	fi
+
+	if test "X$skipped_export" != "X:" && len=`expr "X$test_cmds" : ".*"` &&
+	   test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then
+	  :
+	else
+	  # The command line is too long to link in one step, link piecewise.
+	  $echo "creating reloadable object files..."
+
+	  # Save the value of $output and $libobjs because we want to
+	  # use them later.  If we have whole_archive_flag_spec, we
+	  # want to use save_libobjs as it was before
+	  # whole_archive_flag_spec was expanded, because we can't
+	  # assume the linker understands whole_archive_flag_spec.
+	  # This may have to be revisited, in case too many
+	  # convenience libraries get linked in and end up exceeding
+	  # the spec.
+	  if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then
+	    save_libobjs=$libobjs
+	  fi
+	  save_output=$output
+
+	  # Clear the reloadable object creation command queue and
+	  # initialize k to one.
+	  test_cmds=
+	  concat_cmds=
+	  objlist=
+	  delfiles=
+	  last_robj=
+	  k=1
+	  output=$output_objdir/$save_output-${k}.$objext
+	  # Loop over the list of objects to be linked.
+	  for obj in $save_libobjs
+	  do
+	    eval test_cmds=\"$reload_cmds $objlist $last_robj\"
+	    if test "X$objlist" = X ||
+	       { len=`expr "X$test_cmds" : ".*"` &&
+		 test "$len" -le "$max_cmd_len"; }; then
+	      objlist="$objlist $obj"
+	    else
+	      # The command $test_cmds is almost too long, add a
+	      # command to the queue.
+	      if test "$k" -eq 1 ; then
+		# The first file doesn't have a previous command to add.
+		eval concat_cmds=\"$reload_cmds $objlist $last_robj\"
+	      else
+		# All subsequent reloadable object files will link in
+		# the last one created.
+		eval concat_cmds=\"\$concat_cmds~$reload_cmds $objlist $last_robj\"
+	      fi
+	      last_robj=$output_objdir/$save_output-${k}.$objext
+	      k=`expr $k + 1`
+	      output=$output_objdir/$save_output-${k}.$objext
+	      objlist=$obj
+	      len=1
+	    fi
+	  done
+	  # Handle the remaining objects by creating one last
+	  # reloadable object file.  All subsequent reloadable object
+	  # files will link in the last one created.
+	  test -z "$concat_cmds" || concat_cmds=$concat_cmds~
+	  eval concat_cmds=\"\${concat_cmds}$reload_cmds $objlist $last_robj\"
+
+	  if ${skipped_export-false}; then
+	    $show "generating symbol list for \`$libname.la'"
+	    export_symbols="$output_objdir/$libname.exp"
+	    $run $rm $export_symbols
+	    libobjs=$output
+	    # Append the command to create the export file.
+	    eval concat_cmds=\"\$concat_cmds~$export_symbols_cmds\"
+          fi
+
+	  # Set up a command to remove the reloadale object files
+	  # after they are used.
+	  i=0
+	  while test "$i" -lt "$k"
+	  do
+	    i=`expr $i + 1`
+	    delfiles="$delfiles $output_objdir/$save_output-${i}.$objext"
+	  done
+
+	  $echo "creating a temporary reloadable object file: $output"
+
+	  # Loop through the commands generated above and execute them.
+	  save_ifs="$IFS"; IFS='~'
+	  for cmd in $concat_cmds; do
+	    IFS="$save_ifs"
+	    $show "$cmd"
+	    $run eval "$cmd" || exit $?
+	  done
+	  IFS="$save_ifs"
+
+	  libobjs=$output
+	  # Restore the value of output.
+	  output=$save_output
+
+	  if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then
+	    eval libobjs=\"\$libobjs $whole_archive_flag_spec\"
+	  fi
+	  # Expand the library linking commands again to reset the
+	  # value of $libobjs for piecewise linking.
+
+	  # Do each of the archive commands.
+	  if test "$module" = yes && test -n "$module_cmds" ; then
+	    if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then
+	      cmds=$module_expsym_cmds
+	    else
+	      cmds=$module_cmds
+	    fi
+	  else
+	  if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then
+	    cmds=$archive_expsym_cmds
+	  else
+	    cmds=$archive_cmds
+	    fi
+	  fi
+
+	  # Append the command to remove the reloadable object files
+	  # to the just-reset $cmds.
+	  eval cmds=\"\$cmds~\$rm $delfiles\"
+	fi
+	save_ifs="$IFS"; IFS='~'
+	for cmd in $cmds; do
+	  IFS="$save_ifs"
+	  eval cmd=\"$cmd\"
+	  $show "$cmd"
+	  $run eval "$cmd" || exit $?
+	done
+	IFS="$save_ifs"
+
+	# Restore the uninstalled library and exit
+	if test "$mode" = relink; then
+	  $run eval '(cd $output_objdir && $rm ${realname}T && $mv $realname ${realname}T && $mv "$realname"U $realname)' || exit $?
+	  exit $EXIT_SUCCESS
+	fi
+
+	# Create links to the real library.
+	for linkname in $linknames; do
+	  if test "$realname" != "$linkname"; then
+	    $show "(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)"
+	    $run eval '(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)' || exit $?
+	  fi
+	done
+
+	# If -module or -export-dynamic was specified, set the dlname.
+	if test "$module" = yes || test "$export_dynamic" = yes; then
+	  # On all known operating systems, these are identical.
+	  dlname="$soname"
+	fi
+      fi
+      ;;
+
+    obj)
+      if test -n "$deplibs"; then
+	$echo "$modename: warning: \`-l' and \`-L' are ignored for objects" 1>&2
+      fi
+
+      if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
+	$echo "$modename: warning: \`-dlopen' is ignored for objects" 1>&2
+      fi
+
+      if test -n "$rpath"; then
+	$echo "$modename: warning: \`-rpath' is ignored for objects" 1>&2
+      fi
+
+      if test -n "$xrpath"; then
+	$echo "$modename: warning: \`-R' is ignored for objects" 1>&2
+      fi
+
+      if test -n "$vinfo"; then
+	$echo "$modename: warning: \`-version-info' is ignored for objects" 1>&2
+      fi
+
+      if test -n "$release"; then
+	$echo "$modename: warning: \`-release' is ignored for objects" 1>&2
+      fi
+
+      case $output in
+      *.lo)
+	if test -n "$objs$old_deplibs"; then
+	  $echo "$modename: cannot build library object \`$output' from non-libtool objects" 1>&2
+	  exit $EXIT_FAILURE
+	fi
+	libobj="$output"
+	obj=`$echo "X$output" | $Xsed -e "$lo2o"`
+	;;
+      *)
+	libobj=
+	obj="$output"
+	;;
+      esac
+
+      # Delete the old objects.
+      $run $rm $obj $libobj
+
+      # Objects from convenience libraries.  This assumes
+      # single-version convenience libraries.  Whenever we create
+      # different ones for PIC/non-PIC, this we'll have to duplicate
+      # the extraction.
+      reload_conv_objs=
+      gentop=
+      # reload_cmds runs $LD directly, so let us get rid of
+      # -Wl from whole_archive_flag_spec
+      wl=
+
+      if test -n "$convenience"; then
+	if test -n "$whole_archive_flag_spec"; then
+	  eval reload_conv_objs=\"\$reload_objs $whole_archive_flag_spec\"
+	else
+	  gentop="$output_objdir/${obj}x"
+	  $show "${rm}r $gentop"
+	  $run ${rm}r "$gentop"
+	  $show "$mkdir $gentop"
+	  $run $mkdir "$gentop"
+	  status=$?
+	  if test "$status" -ne 0 && test ! -d "$gentop"; then
+	    exit $status
+	  fi
+	  generated="$generated $gentop"
+
+	  for xlib in $convenience; do
+	    # Extract the objects.
+	    case $xlib in
+	    [\\/]* | [A-Za-z]:[\\/]*) xabs="$xlib" ;;
+	    *) xabs=`pwd`"/$xlib" ;;
+	    esac
+	    xlib=`$echo "X$xlib" | $Xsed -e 's%^.*/%%'`
+	    xdir="$gentop/$xlib"
+
+	    $show "${rm}r $xdir"
+	    $run ${rm}r "$xdir"
+	    $show "$mkdir $xdir"
+	    $run $mkdir "$xdir"
+	    status=$?
+	    if test "$status" -ne 0 && test ! -d "$xdir"; then
+	      exit $status
+	    fi
+	    # We will extract separately just the conflicting names and we will no
+	    # longer touch any unique names. It is faster to leave these extract
+	    # automatically by $AR in one run.
+	    $show "(cd $xdir && $AR x $xabs)"
+	    $run eval "(cd \$xdir && $AR x \$xabs)" || exit $?
+	    if ($AR t "$xabs" | sort | sort -uc >/dev/null 2>&1); then
+	      :
+	    else
+	      $echo "$modename: warning: object name conflicts; renaming object files" 1>&2
+	      $echo "$modename: warning: to ensure that they will not overwrite" 1>&2
+	      $AR t "$xabs" | sort | uniq -cd | while read -r count name
+	      do
+		i=1
+		while test "$i" -le "$count"
+		do
+		 # Put our $i before any first dot (extension)
+		 # Never overwrite any file
+		 name_to="$name"
+		 while test "X$name_to" = "X$name" || test -f "$xdir/$name_to"
+		 do
+		   name_to=`$echo "X$name_to" | $Xsed -e "s/\([^.]*\)/\1-$i/"`
+		 done
+		 $show "(cd $xdir && $AR xN $i $xabs '$name' && $mv '$name' '$name_to')"
+		 $run eval "(cd \$xdir && $AR xN $i \$xabs '$name' && $mv '$name' '$name_to')" || exit $?
+		 i=`expr $i + 1`
+		done
+	      done
+	    fi
+
+	    reload_conv_objs="$reload_objs "`find $xdir -name \*.$objext -print -o -name \*.lo -print | $NL2SP`
+	  done
+	fi
+      fi
+
+      # Create the old-style object.
+      reload_objs="$objs$old_deplibs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}$'/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test
+
+      output="$obj"
+      cmds=$reload_cmds
+      save_ifs="$IFS"; IFS='~'
+      for cmd in $cmds; do
+	IFS="$save_ifs"
+	eval cmd=\"$cmd\"
+	$show "$cmd"
+	$run eval "$cmd" || exit $?
+      done
+      IFS="$save_ifs"
+
+      # Exit if we aren't doing a library object file.
+      if test -z "$libobj"; then
+	if test -n "$gentop"; then
+	  $show "${rm}r $gentop"
+	  $run ${rm}r $gentop
+	fi
+
+	exit $EXIT_SUCCESS
+      fi
+
+      if test "$build_libtool_libs" != yes; then
+	if test -n "$gentop"; then
+	  $show "${rm}r $gentop"
+	  $run ${rm}r $gentop
+	fi
+
+	# Create an invalid libtool object if no PIC, so that we don't
+	# accidentally link it into a program.
+	# $show "echo timestamp > $libobj"
+	# $run eval "echo timestamp > $libobj" || exit $?
+	exit $EXIT_SUCCESS
+      fi
+
+      if test -n "$pic_flag" || test "$pic_mode" != default; then
+	# Only do commands if we really have different PIC objects.
+	reload_objs="$libobjs $reload_conv_objs"
+	output="$libobj"
+	cmds=$reload_cmds
+	save_ifs="$IFS"; IFS='~'
+	for cmd in $cmds; do
+	  IFS="$save_ifs"
+	  eval cmd=\"$cmd\"
+	  $show "$cmd"
+	  $run eval "$cmd" || exit $?
+	done
+	IFS="$save_ifs"
+      fi
+
+      if test -n "$gentop"; then
+	$show "${rm}r $gentop"
+	$run ${rm}r $gentop
+      fi
+
+      exit $EXIT_SUCCESS
+      ;;
+
+    prog)
+      case $host in
+	*cygwin*) output=`$echo $output | ${SED} -e 's,.exe$,,;s,$,.exe,'` ;;
+      esac
+      if test -n "$vinfo"; then
+	$echo "$modename: warning: \`-version-info' is ignored for programs" 1>&2
+      fi
+
+      if test -n "$release"; then
+	$echo "$modename: warning: \`-release' is ignored for programs" 1>&2
+      fi
+
+      if test "$preload" = yes; then
+	if test "$dlopen_support" = unknown && test "$dlopen_self" = unknown &&
+	   test "$dlopen_self_static" = unknown; then
+	  $echo "$modename: warning: \`AC_LIBTOOL_DLOPEN' not used. Assuming no dlopen support."
+	fi
+      fi
+
+      case $host in
+      *-*-rhapsody* | *-*-darwin1.[012])
+	# On Rhapsody replace the C library is the System framework
+	compile_deplibs=`$echo "X $compile_deplibs" | $Xsed -e 's/ -lc / -framework System /'`
+	finalize_deplibs=`$echo "X $finalize_deplibs" | $Xsed -e 's/ -lc / -framework System /'`
+	;;
+      esac
+
+      case $host in
+      *darwin*)
+        # Don't allow lazy linking, it breaks C++ global constructors
+        if test "$tagname" = CXX ; then
+        compile_command="$compile_command ${wl}-bind_at_load"
+        finalize_command="$finalize_command ${wl}-bind_at_load"
+        fi
+        ;;
+      esac
+
+      compile_command="$compile_command $compile_deplibs"
+      finalize_command="$finalize_command $finalize_deplibs"
+
+      if test -n "$rpath$xrpath"; then
+	# If the user specified any rpath flags, then add them.
+	for libdir in $rpath $xrpath; do
+	  # This is the magic to use -rpath.
+	  case "$finalize_rpath " in
+	  *" $libdir "*) ;;
+	  *) finalize_rpath="$finalize_rpath $libdir" ;;
+	  esac
+	done
+      fi
+
+      # Now hardcode the library paths
+      rpath=
+      hardcode_libdirs=
+      for libdir in $compile_rpath $finalize_rpath; do
+	if test -n "$hardcode_libdir_flag_spec"; then
+	  if test -n "$hardcode_libdir_separator"; then
+	    if test -z "$hardcode_libdirs"; then
+	      hardcode_libdirs="$libdir"
+	    else
+	      # Just accumulate the unique libdirs.
+	      case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
+	      *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
+		;;
+	      *)
+		hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
+		;;
+	      esac
+	    fi
+	  else
+	    eval flag=\"$hardcode_libdir_flag_spec\"
+	    rpath="$rpath $flag"
+	  fi
+	elif test -n "$runpath_var"; then
+	  case "$perm_rpath " in
+	  *" $libdir "*) ;;
+	  *) perm_rpath="$perm_rpath $libdir" ;;
+	  esac
+	fi
+	case $host in
+	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*)
+	  case :$dllsearchpath: in
+	  *":$libdir:"*) ;;
+	  *) dllsearchpath="$dllsearchpath:$libdir";;
+	  esac
+	  ;;
+	esac
+      done
+      # Substitute the hardcoded libdirs into the rpath.
+      if test -n "$hardcode_libdir_separator" &&
+	 test -n "$hardcode_libdirs"; then
+	libdir="$hardcode_libdirs"
+	eval rpath=\" $hardcode_libdir_flag_spec\"
+      fi
+      compile_rpath="$rpath"
+
+      rpath=
+      hardcode_libdirs=
+      for libdir in $finalize_rpath; do
+	if test -n "$hardcode_libdir_flag_spec"; then
+	  if test -n "$hardcode_libdir_separator"; then
+	    if test -z "$hardcode_libdirs"; then
+	      hardcode_libdirs="$libdir"
+	    else
+	      # Just accumulate the unique libdirs.
+	      case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
+	      *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
+		;;
+	      *)
+		hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
+		;;
+	      esac
+	    fi
+	  else
+	    eval flag=\"$hardcode_libdir_flag_spec\"
+	    rpath="$rpath $flag"
+	  fi
+	elif test -n "$runpath_var"; then
+	  case "$finalize_perm_rpath " in
+	  *" $libdir "*) ;;
+	  *) finalize_perm_rpath="$finalize_perm_rpath $libdir" ;;
+	  esac
+	fi
+      done
+      # Substitute the hardcoded libdirs into the rpath.
+      if test -n "$hardcode_libdir_separator" &&
+	 test -n "$hardcode_libdirs"; then
+	libdir="$hardcode_libdirs"
+	eval rpath=\" $hardcode_libdir_flag_spec\"
+      fi
+      finalize_rpath="$rpath"
+
+      if test -n "$libobjs" && test "$build_old_libs" = yes; then
+	# Transform all the library objects into standard objects.
+	compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
+	finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
+      fi
+
+      dlsyms=
+      if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
+	if test -n "$NM" && test -n "$global_symbol_pipe"; then
+	  dlsyms="${outputname}S.c"
+	else
+	  $echo "$modename: not configured to extract global symbols from dlpreopened files" 1>&2
+	fi
+      fi
+
+      if test -n "$dlsyms"; then
+	case $dlsyms in
+	"") ;;
+	*.c)
+	  # Discover the nlist of each of the dlfiles.
+	  nlist="$output_objdir/${outputname}.nm"
+
+	  $show "$rm $nlist ${nlist}S ${nlist}T"
+	  $run $rm "$nlist" "${nlist}S" "${nlist}T"
+
+	  # Parse the name list into a source file.
+	  $show "creating $output_objdir/$dlsyms"
+
+	  test -z "$run" && $echo > "$output_objdir/$dlsyms" "\
+/* $dlsyms - symbol resolution table for \`$outputname' dlsym emulation. */
+/* Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP */
+
+#ifdef __cplusplus
+extern \"C\" {
+#endif
+
+/* Prevent the only kind of declaration conflicts we can make. */
+#define lt_preloaded_symbols some_other_symbol
+
+/* External symbol declarations for the compiler. */\
+"
+
+	  if test "$dlself" = yes; then
+	    $show "generating symbol list for \`$output'"
+
+	    test -z "$run" && $echo ': @PROGRAM@ ' > "$nlist"
+
+	    # Add our own program objects to the symbol list.
+	    progfiles=`$echo "X$objs$old_deplibs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
+	    for arg in $progfiles; do
+	      $show "extracting global C symbols from \`$arg'"
+	      $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'"
+	    done
+
+	    if test -n "$exclude_expsyms"; then
+	      $run eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T'
+	      $run eval '$mv "$nlist"T "$nlist"'
+	    fi
+
+	    if test -n "$export_symbols_regex"; then
+	      $run eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T'
+	      $run eval '$mv "$nlist"T "$nlist"'
+	    fi
+
+	    # Prepare the list of exported symbols
+	    if test -z "$export_symbols"; then
+	      export_symbols="$output_objdir/$output.exp"
+	      $run $rm $export_symbols
+	      $run eval "${SED} -n -e '/^: @PROGRAM@$/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"'
+	    else
+	      $run eval "${SED} -e 's/\([][.*^$]\)/\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$output.exp"'
+	      $run eval 'grep -f "$output_objdir/$output.exp" < "$nlist" > "$nlist"T'
+	      $run eval 'mv "$nlist"T "$nlist"'
+	    fi
+	  fi
+
+	  for arg in $dlprefiles; do
+	    $show "extracting global C symbols from \`$arg'"
+	    name=`$echo "$arg" | ${SED} -e 's%^.*/%%'`
+	    $run eval '$echo ": $name " >> "$nlist"'
+	    $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'"
+	  done
+
+	  if test -z "$run"; then
+	    # Make sure we have at least an empty file.
+	    test -f "$nlist" || : > "$nlist"
+
+	    if test -n "$exclude_expsyms"; then
+	      $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T
+	      $mv "$nlist"T "$nlist"
+	    fi
+
+	    # Try sorting and uniquifying the output.
+	    if grep -v "^: " < "$nlist" |
+		if sort -k 3 </dev/null >/dev/null 2>&1; then
+		  sort -k 3
+		else
+		  sort +2
+		fi |
+		uniq > "$nlist"S; then
+	      :
+	    else
+	      grep -v "^: " < "$nlist" > "$nlist"S
+	    fi
+
+	    if test -f "$nlist"S; then
+	      eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$dlsyms"'
+	    else
+	      $echo '/* NONE */' >> "$output_objdir/$dlsyms"
+	    fi
+
+	    $echo >> "$output_objdir/$dlsyms" "\
+
+#undef lt_preloaded_symbols
+
+#if defined (__STDC__) && __STDC__
+# define lt_ptr void *
+#else
+# define lt_ptr char *
+# define const
+#endif
+
+/* The mapping between symbol names and symbols. */
+const struct {
+  const char *name;
+  lt_ptr address;
+}
+lt_preloaded_symbols[] =
+{\
+"
+
+	    eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$dlsyms"
+
+	    $echo >> "$output_objdir/$dlsyms" "\
+  {0, (lt_ptr) 0}
+};
+
+/* This works around a problem in FreeBSD linker */
+#ifdef FREEBSD_WORKAROUND
+static const void *lt_preloaded_setup() {
+  return lt_preloaded_symbols;
+}
+#endif
+
+#ifdef __cplusplus
+}
+#endif\
+"
+	  fi
+
+	  pic_flag_for_symtable=
+	  case $host in
+	  # compiling the symbol table file with pic_flag works around
+	  # a FreeBSD bug that causes programs to crash when -lm is
+	  # linked before any other PIC object.  But we must not use
+	  # pic_flag when linking with -static.  The problem exists in
+	  # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1.
+	  *-*-freebsd2*|*-*-freebsd3.0*|*-*-freebsdelf3.0*)
+	    case "$compile_command " in
+	    *" -static "*) ;;
+	    *) pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND";;
+	    esac;;
+	  *-*-hpux*)
+	    case "$compile_command " in
+	    *" -static "*) ;;
+	    *) pic_flag_for_symtable=" $pic_flag";;
+	    esac
+	  esac
+
+	  # Now compile the dynamic symbol file.
+	  $show "(cd $output_objdir && $LTCC -c$no_builtin_flag$pic_flag_for_symtable \"$dlsyms\")"
+	  $run eval '(cd $output_objdir && $LTCC -c$no_builtin_flag$pic_flag_for_symtable "$dlsyms")' || exit $?
+
+	  # Clean up the generated files.
+	  $show "$rm $output_objdir/$dlsyms $nlist ${nlist}S ${nlist}T"
+	  $run $rm "$output_objdir/$dlsyms" "$nlist" "${nlist}S" "${nlist}T"
+
+	  # Transform the symbol file into the correct name.
+	  compile_command=`$echo "X$compile_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"`
+	  finalize_command=`$echo "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"`
+	  ;;
+	*)
+	  $echo "$modename: unknown suffix for \`$dlsyms'" 1>&2
+	  exit $EXIT_FAILURE
+	  ;;
+	esac
+      else
+	# We keep going just in case the user didn't refer to
+	# lt_preloaded_symbols.  The linker will fail if global_symbol_pipe
+	# really was required.
+
+	# Nullify the symbol file.
+	compile_command=`$echo "X$compile_command" | $Xsed -e "s% @SYMFILE@%%"`
+	finalize_command=`$echo "X$finalize_command" | $Xsed -e "s% @SYMFILE@%%"`
+      fi
+
+      if test "$need_relink" = no || test "$build_libtool_libs" != yes; then
+	# Replace the output file specification.
+	compile_command=`$echo "X$compile_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'`
+	link_command="$compile_command$compile_rpath"
+
+	# We have no uninstalled library dependencies, so finalize right now.
+	$show "$link_command"
+	$run eval "$link_command"
+	status=$?
+
+	# Delete the generated files.
+	if test -n "$dlsyms"; then
+	  $show "$rm $output_objdir/${outputname}S.${objext}"
+	  $run $rm "$output_objdir/${outputname}S.${objext}"
+	fi
+
+	exit $status
+      fi
+
+      if test -n "$shlibpath_var"; then
+	# We should set the shlibpath_var
+	rpath=
+	for dir in $temp_rpath; do
+	  case $dir in
+	  [\\/]* | [A-Za-z]:[\\/]*)
+	    # Absolute path.
+	    rpath="$rpath$dir:"
+	    ;;
+	  *)
+	    # Relative path: add a thisdir entry.
+	    rpath="$rpath\$thisdir/$dir:"
+	    ;;
+	  esac
+	done
+	temp_rpath="$rpath"
+      fi
+
+      if test -n "$compile_shlibpath$finalize_shlibpath"; then
+	compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command"
+      fi
+      if test -n "$finalize_shlibpath"; then
+	finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command"
+      fi
+
+      compile_var=
+      finalize_var=
+      if test -n "$runpath_var"; then
+	if test -n "$perm_rpath"; then
+	  # We should set the runpath_var.
+	  rpath=
+	  for dir in $perm_rpath; do
+	    rpath="$rpath$dir:"
+	  done
+	  compile_var="$runpath_var=\"$rpath\$$runpath_var\" "
+	fi
+	if test -n "$finalize_perm_rpath"; then
+	  # We should set the runpath_var.
+	  rpath=
+	  for dir in $finalize_perm_rpath; do
+	    rpath="$rpath$dir:"
+	  done
+	  finalize_var="$runpath_var=\"$rpath\$$runpath_var\" "
+	fi
+      fi
+
+      if test "$no_install" = yes; then
+	# We don't need to create a wrapper script.
+	link_command="$compile_var$compile_command$compile_rpath"
+	# Replace the output file specification.
+	link_command=`$echo "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'`
+	# Delete the old output file.
+	$run $rm $output
+	# Link the executable and exit
+	$show "$link_command"
+	$run eval "$link_command" || exit $?
+	exit $EXIT_SUCCESS
+      fi
+
+      if test "$hardcode_action" = relink; then
+	# Fast installation is not supported
+	link_command="$compile_var$compile_command$compile_rpath"
+	relink_command="$finalize_var$finalize_command$finalize_rpath"
+
+	$echo "$modename: warning: this platform does not like uninstalled shared libraries" 1>&2
+	$echo "$modename: \`$output' will be relinked during installation" 1>&2
+      else
+	if test "$fast_install" != no; then
+	  link_command="$finalize_var$compile_command$finalize_rpath"
+	  if test "$fast_install" = yes; then
+	    relink_command=`$echo "X$compile_var$compile_command$compile_rpath" | $Xsed -e 's%@OUTPUT@%\$progdir/\$file%g'`
+	  else
+	    # fast_install is set to needless
+	    relink_command=
+	  fi
+	else
+	  link_command="$compile_var$compile_command$compile_rpath"
+	  relink_command="$finalize_var$finalize_command$finalize_rpath"
+	fi
+      fi
+
+      # Replace the output file specification.
+      link_command=`$echo "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'`
+
+      # Delete the old output files.
+      $run $rm $output $output_objdir/$outputname $output_objdir/lt-$outputname
+
+      $show "$link_command"
+      $run eval "$link_command" || exit $?
+
+      # Now create the wrapper script.
+      $show "creating $output"
+
+      # Quote the relink command for shipping.
+      if test -n "$relink_command"; then
+	# Preserve any variables that may affect compiler behavior
+	for var in $variables_saved_for_relink; do
+	  if eval test -z \"\${$var+set}\"; then
+	    relink_command="{ test -z \"\${$var+set}\" || unset $var || { $var=; export $var; }; }; $relink_command"
+	  elif eval var_value=\$$var; test -z "$var_value"; then
+	    relink_command="$var=; export $var; $relink_command"
+	  else
+	    var_value=`$echo "X$var_value" | $Xsed -e "$sed_quote_subst"`
+	    relink_command="$var=\"$var_value\"; export $var; $relink_command"
+	  fi
+	done
+	relink_command="(cd `pwd`; $relink_command)"
+	relink_command=`$echo "X$relink_command" | $Xsed -e "$sed_quote_subst"`
+      fi
+
+      # Quote $echo for shipping.
+      if test "X$echo" = "X$SHELL $progpath --fallback-echo"; then
+	case $progpath in
+	[\\/]* | [A-Za-z]:[\\/]*) qecho="$SHELL $progpath --fallback-echo";;
+	*) qecho="$SHELL `pwd`/$progpath --fallback-echo";;
+	esac
+	qecho=`$echo "X$qecho" | $Xsed -e "$sed_quote_subst"`
+      else
+	qecho=`$echo "X$echo" | $Xsed -e "$sed_quote_subst"`
+      fi
+
+      # Only actually do things if our run command is non-null.
+      if test -z "$run"; then
+	# win32 will think the script is a binary if it has
+	# a .exe suffix, so we strip it off here.
+	case $output in
+	  *.exe) output=`$echo $output|${SED} 's,.exe$,,'` ;;
+	esac
+	# test for cygwin because mv fails w/o .exe extensions
+	case $host in
+	  *cygwin*)
+	    exeext=.exe
+	    outputname=`$echo $outputname|${SED} 's,.exe$,,'` ;;
+	  *) exeext= ;;
+	esac
+	case $host in
+	  *cygwin* | *mingw* )
+	    cwrappersource=`$echo ${objdir}/lt-${output}.c`
+	    cwrapper=`$echo ${output}.exe`
+	    $rm $cwrappersource $cwrapper
+	    trap "$rm $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15
+
+	    cat > $cwrappersource <<EOF
+
+/* $cwrappersource - temporary wrapper executable for $objdir/$outputname
+   Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP
+
+   The $output program cannot be directly executed until all the libtool
+   libraries that it depends on are installed.
+
+   This wrapper executable should never be moved out of the build directory.
+   If it is, it will not operate correctly.
+
+   Currently, it simply execs the wrapper *script* "/bin/sh $output",
+   but could eventually absorb all of the scripts functionality and
+   exec $objdir/$outputname directly.
+*/
+EOF
+	    cat >> $cwrappersource<<"EOF"
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <malloc.h>
+#include <stdarg.h>
+#include <assert.h>
+
+#if defined(PATH_MAX)
+# define LT_PATHMAX PATH_MAX
+#elif defined(MAXPATHLEN)
+# define LT_PATHMAX MAXPATHLEN
+#else
+# define LT_PATHMAX 1024
+#endif
+
+#ifndef DIR_SEPARATOR
+#define DIR_SEPARATOR '/'
+#endif
+
+#if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \
+  defined (__OS2__)
+#define HAVE_DOS_BASED_FILE_SYSTEM
+#ifndef DIR_SEPARATOR_2
+#define DIR_SEPARATOR_2 '\\'
+#endif
+#endif
+
+#ifndef DIR_SEPARATOR_2
+# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR)
+#else /* DIR_SEPARATOR_2 */
+# define IS_DIR_SEPARATOR(ch) \
+        (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2))
+#endif /* DIR_SEPARATOR_2 */
+
+#define XMALLOC(type, num)      ((type *) xmalloc ((num) * sizeof(type)))
+#define XFREE(stale) do { \
+  if (stale) { free ((void *) stale); stale = 0; } \
+} while (0)
+
+const char *program_name = NULL;
+
+void * xmalloc (size_t num);
+char * xstrdup (const char *string);
+char * basename (const char *name);
+char * fnqualify(const char *path);
+char * strendzap(char *str, const char *pat);
+void lt_fatal (const char *message, ...);
+
+int
+main (int argc, char *argv[])
+{
+  char **newargz;
+  int i;
+
+  program_name = (char *) xstrdup ((char *) basename (argv[0]));
+  newargz = XMALLOC(char *, argc+2);
+EOF
+
+	    cat >> $cwrappersource <<EOF
+  newargz[0] = "$SHELL";
+EOF
+
+	    cat >> $cwrappersource <<"EOF"
+  newargz[1] = fnqualify(argv[0]);
+  /* we know the script has the same name, without the .exe */
+  /* so make sure newargz[1] doesn't end in .exe */
+  strendzap(newargz[1],".exe");
+  for (i = 1; i < argc; i++)
+    newargz[i+1] = xstrdup(argv[i]);
+  newargz[argc+1] = NULL;
+EOF
+
+	    cat >> $cwrappersource <<EOF
+  execv("$SHELL",newargz);
+EOF
+
+	    cat >> $cwrappersource <<"EOF"
+}
+
+void *
+xmalloc (size_t num)
+{
+  void * p = (void *) malloc (num);
+  if (!p)
+    lt_fatal ("Memory exhausted");
+
+  return p;
+}
+
+char *
+xstrdup (const char *string)
+{
+  return string ? strcpy ((char *) xmalloc (strlen (string) + 1), string) : NULL
+;
+}
+
+char *
+basename (const char *name)
+{
+  const char *base;
+
+#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
+  /* Skip over the disk name in MSDOS pathnames. */
+  if (isalpha (name[0]) && name[1] == ':')
+    name += 2;
+#endif
+
+  for (base = name; *name; name++)
+    if (IS_DIR_SEPARATOR (*name))
+      base = name + 1;
+  return (char *) base;
+}
+
+char *
+fnqualify(const char *path)
+{
+  size_t size;
+  char *p;
+  char tmp[LT_PATHMAX + 1];
+
+  assert(path != NULL);
+
+  /* Is it qualified already? */
+#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
+  if (isalpha (path[0]) && path[1] == ':')
+    return xstrdup (path);
+#endif
+  if (IS_DIR_SEPARATOR (path[0]))
+    return xstrdup (path);
+
+  /* prepend the current directory */
+  /* doesn't handle '~' */
+  if (getcwd (tmp, LT_PATHMAX) == NULL)
+    lt_fatal ("getcwd failed");
+  size = strlen(tmp) + 1 + strlen(path) + 1; /* +2 for '/' and '\0' */
+  p = XMALLOC(char, size);
+  sprintf(p, "%s%c%s", tmp, DIR_SEPARATOR, path);
+  return p;
+}
+
+char *
+strendzap(char *str, const char *pat)
+{
+  size_t len, patlen;
+
+  assert(str != NULL);
+  assert(pat != NULL);
+
+  len = strlen(str);
+  patlen = strlen(pat);
+
+  if (patlen <= len)
+  {
+    str += len - patlen;
+    if (strcmp(str, pat) == 0)
+      *str = '\0';
+  }
+  return str;
+}
+
+static void
+lt_error_core (int exit_status, const char * mode,
+          const char * message, va_list ap)
+{
+  fprintf (stderr, "%s: %s: ", program_name, mode);
+  vfprintf (stderr, message, ap);
+  fprintf (stderr, ".\n");
+
+  if (exit_status >= 0)
+    exit (exit_status);
+}
+
+void
+lt_fatal (const char *message, ...)
+{
+  va_list ap;
+  va_start (ap, message);
+  lt_error_core (EXIT_FAILURE, "FATAL", message, ap);
+  va_end (ap);
+}
+EOF
+	  # we should really use a build-platform specific compiler
+	  # here, but OTOH, the wrappers (shell script and this C one)
+	  # are only useful if you want to execute the "real" binary.
+	  # Since the "real" binary is built for $host, then this
+	  # wrapper might as well be built for $host, too.
+	  $run $LTCC -s -o $cwrapper $cwrappersource
+	  ;;
+	esac
+	$rm $output
+	trap "$rm $output; exit $EXIT_FAILURE" 1 2 15
+
+	$echo > $output "\
+#! $SHELL
+
+# $output - temporary wrapper script for $objdir/$outputname
+# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP
+#
+# The $output program cannot be directly executed until all the libtool
+# libraries that it depends on are installed.
+#
+# This wrapper script should never be moved out of the build directory.
+# If it is, it will not operate correctly.
+
+# Sed substitution that helps us do robust quoting.  It backslashifies
+# metacharacters that are still active within double-quoted strings.
+Xsed='${SED} -e 1s/^X//'
+sed_quote_subst='$sed_quote_subst'
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+if test \"\${CDPATH+set}\" = set; then CDPATH=:; export CDPATH; fi
+
+relink_command=\"$relink_command\"
+
+# This environment variable determines our operation mode.
+if test \"\$libtool_install_magic\" = \"$magic\"; then
+  # install mode needs the following variable:
+  notinst_deplibs='$notinst_deplibs'
+else
+  # When we are sourced in execute mode, \$file and \$echo are already set.
+  if test \"\$libtool_execute_magic\" != \"$magic\"; then
+    echo=\"$qecho\"
+    file=\"\$0\"
+    # Make sure echo works.
+    if test \"X\$1\" = X--no-reexec; then
+      # Discard the --no-reexec flag, and continue.
+      shift
+    elif test \"X\`(\$echo '\t') 2>/dev/null\`\" = 'X\t'; then
+      # Yippee, \$echo works!
+      :
+    else
+      # Restart under the correct shell, and then maybe \$echo will work.
+      exec $SHELL \"\$0\" --no-reexec \${1+\"\$@\"}
+    fi
+  fi\
+"
+	$echo >> $output "\
+
+  # Find the directory that this script lives in.
+  thisdir=\`\$echo \"X\$file\" | \$Xsed -e 's%/[^/]*$%%'\`
+  test \"x\$thisdir\" = \"x\$file\" && thisdir=.
+
+  # Follow symbolic links until we get to the real thisdir.
+  file=\`ls -ld \"\$file\" | ${SED} -n 's/.*-> //p'\`
+  while test -n \"\$file\"; do
+    destdir=\`\$echo \"X\$file\" | \$Xsed -e 's%/[^/]*\$%%'\`
+
+    # If there was a directory component, then change thisdir.
+    if test \"x\$destdir\" != \"x\$file\"; then
+      case \"\$destdir\" in
+      [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;;
+      *) thisdir=\"\$thisdir/\$destdir\" ;;
+      esac
+    fi
+
+    file=\`\$echo \"X\$file\" | \$Xsed -e 's%^.*/%%'\`
+    file=\`ls -ld \"\$thisdir/\$file\" | ${SED} -n 's/.*-> //p'\`
+  done
+
+  # Try to get the absolute directory name.
+  absdir=\`cd \"\$thisdir\" && pwd\`
+  test -n \"\$absdir\" && thisdir=\"\$absdir\"
+"
+
+	if test "$fast_install" = yes; then
+	  $echo >> $output "\
+  program=lt-'$outputname'$exeext
+  progdir=\"\$thisdir/$objdir\"
+
+  if test ! -f \"\$progdir/\$program\" || \\
+     { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\
+       test \"X\$file\" != \"X\$progdir/\$program\"; }; then
+
+    file=\"\$\$-\$program\"
+
+    if test ! -d \"\$progdir\"; then
+      $mkdir \"\$progdir\"
+    else
+      $rm \"\$progdir/\$file\"
+    fi"
+
+	  $echo >> $output "\
+
+    # relink executable if necessary
+    if test -n \"\$relink_command\"; then
+      if relink_command_output=\`eval \$relink_command 2>&1\`; then :
+      else
+	$echo \"\$relink_command_output\" >&2
+	$rm \"\$progdir/\$file\"
+	exit $EXIT_FAILURE
+      fi
+    fi
+
+    $mv \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null ||
+    { $rm \"\$progdir/\$program\";
+      $mv \"\$progdir/\$file\" \"\$progdir/\$program\"; }
+    $rm \"\$progdir/\$file\"
+  fi"
+	else
+	  $echo >> $output "\
+  program='$outputname'
+  progdir=\"\$thisdir/$objdir\"
+"
+	fi
+
+	$echo >> $output "\
+
+  if test -f \"\$progdir/\$program\"; then"
+
+	# Export our shlibpath_var if we have one.
+	if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
+	  $echo >> $output "\
+    # Add our own library path to $shlibpath_var
+    $shlibpath_var=\"$temp_rpath\$$shlibpath_var\"
+
+    # Some systems cannot cope with colon-terminated $shlibpath_var
+    # The second colon is a workaround for a bug in BeOS R4 sed
+    $shlibpath_var=\`\$echo \"X\$$shlibpath_var\" | \$Xsed -e 's/::*\$//'\`
+
+    export $shlibpath_var
+"
+	fi
+
+	# fixup the dll searchpath if we need to.
+	if test -n "$dllsearchpath"; then
+	  $echo >> $output "\
+    # Add the dll search path components to the executable PATH
+    PATH=$dllsearchpath:\$PATH
+"
+	fi
+
+	$echo >> $output "\
+    if test \"\$libtool_execute_magic\" != \"$magic\"; then
+      # Run the actual program with our arguments.
+"
+	case $host in
+	# Backslashes separate directories on plain windows
+	*-*-mingw | *-*-os2*)
+	  $echo >> $output "\
+      exec \$progdir\\\\\$program \${1+\"\$@\"}
+"
+	  ;;
+
+	*)
+	  $echo >> $output "\
+      exec \$progdir/\$program \${1+\"\$@\"}
+"
+	  ;;
+	esac
+	$echo >> $output "\
+      \$echo \"\$0: cannot exec \$program \${1+\"\$@\"}\"
+      exit $EXIT_FAILURE
+    fi
+  else
+    # The program doesn't exist.
+    \$echo \"\$0: error: \$progdir/\$program does not exist\" 1>&2
+    \$echo \"This script is just a wrapper for \$program.\" 1>&2
+    $echo \"See the $PACKAGE documentation for more information.\" 1>&2
+    exit $EXIT_FAILURE
+  fi
+fi\
+"
+	chmod +x $output
+      fi
+      exit $EXIT_SUCCESS
+      ;;
+    esac
+
+    # See if we need to build an old-fashioned archive.
+    for oldlib in $oldlibs; do
+
+      if test "$build_libtool_libs" = convenience; then
+	oldobjs="$libobjs_save"
+	addlibs="$convenience"
+	build_libtool_libs=no
+      else
+	if test "$build_libtool_libs" = module; then
+	  oldobjs="$libobjs_save"
+	  build_libtool_libs=no
+	else
+	  oldobjs="$old_deplibs $non_pic_objects"
+	fi
+	addlibs="$old_convenience"
+      fi
+
+      if test -n "$addlibs"; then
+	gentop="$output_objdir/${outputname}x"
+	$show "${rm}r $gentop"
+	$run ${rm}r "$gentop"
+	$show "$mkdir $gentop"
+	$run $mkdir "$gentop"
+	status=$?
+	if test "$status" -ne 0 && test ! -d "$gentop"; then
+	  exit $status
+	fi
+	generated="$generated $gentop"
+
+	# Add in members from convenience archives.
+	for xlib in $addlibs; do
+	  # Extract the objects.
+	  case $xlib in
+	  [\\/]* | [A-Za-z]:[\\/]*) xabs="$xlib" ;;
+	  *) xabs=`pwd`"/$xlib" ;;
+	  esac
+	  xlib=`$echo "X$xlib" | $Xsed -e 's%^.*/%%'`
+	  xdir="$gentop/$xlib"
+
+	  $show "${rm}r $xdir"
+	  $run ${rm}r "$xdir"
+	  $show "$mkdir $xdir"
+	  $run $mkdir "$xdir"
+	  status=$?
+	  if test "$status" -ne 0 && test ! -d "$xdir"; then
+	    exit $status
+	  fi
+	  # We will extract separately just the conflicting names and we will no
+	  # longer touch any unique names. It is faster to leave these extract
+	  # automatically by $AR in one run.
+	  $show "(cd $xdir && $AR x $xabs)"
+	  $run eval "(cd \$xdir && $AR x \$xabs)" || exit $?
+	  if ($AR t "$xabs" | sort | sort -uc >/dev/null 2>&1); then
+	    :
+	  else
+	    $echo "$modename: warning: object name conflicts; renaming object files" 1>&2
+	    $echo "$modename: warning: to ensure that they will not overwrite" 1>&2
+	    $AR t "$xabs" | sort | uniq -cd | while read -r count name
+	    do
+	      i=1
+	      while test "$i" -le "$count"
+	      do
+	       # Put our $i before any first dot (extension)
+	       # Never overwrite any file
+	       name_to="$name"
+	       while test "X$name_to" = "X$name" || test -f "$xdir/$name_to"
+	       do
+		 name_to=`$echo "X$name_to" | $Xsed -e "s/\([^.]*\)/\1-$i/"`
+	       done
+	       $show "(cd $xdir && $AR xN $i $xabs '$name' && $mv '$name' '$name_to')"
+	       $run eval "(cd \$xdir && $AR xN $i \$xabs '$name' && $mv '$name' '$name_to')" || exit $?
+	       i=`expr $i + 1`
+	      done
+	    done
+	  fi
+
+	  oldobjs="$oldobjs "`find $xdir -name \*.${objext} -print -o -name \*.lo -print | $NL2SP`
+	done
+      fi
+
+      # Do each command in the archive commands.
+      if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then
+       cmds=$old_archive_from_new_cmds
+      else
+	eval cmds=\"$old_archive_cmds\"
+
+	if len=`expr "X$cmds" : ".*"` &&
+	     test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then
+	  cmds=$old_archive_cmds
+	else
+	  # the command line is too long to link in one step, link in parts
+	  $echo "using piecewise archive linking..."
+	  save_RANLIB=$RANLIB
+	  RANLIB=:
+	  objlist=
+	  concat_cmds=
+	  save_oldobjs=$oldobjs
+	  # GNU ar 2.10+ was changed to match POSIX; thus no paths are
+	  # encoded into archives.  This makes 'ar r' malfunction in
+	  # this piecewise linking case whenever conflicting object
+	  # names appear in distinct ar calls; check, warn and compensate.
+	    if (for obj in $save_oldobjs
+	    do
+	      $echo "X$obj" | $Xsed -e 's%^.*/%%'
+	    done | sort | sort -uc >/dev/null 2>&1); then
+	    :
+	  else
+	    $echo "$modename: warning: object name conflicts; overriding AR_FLAGS to 'cq'" 1>&2
+	    $echo "$modename: warning: to ensure that POSIX-compatible ar will work" 1>&2
+	    AR_FLAGS=cq
+	  fi
+	  # Is there a better way of finding the last object in the list?
+	  for obj in $save_oldobjs
+	  do
+	    last_oldobj=$obj
+	  done
+	  for obj in $save_oldobjs
+	  do
+	    oldobjs="$objlist $obj"
+	    objlist="$objlist $obj"
+	    eval test_cmds=\"$old_archive_cmds\"
+	    if len=`expr "X$test_cmds" : ".*"` &&
+	       test "$len" -le "$max_cmd_len"; then
+	      :
+	    else
+	      # the above command should be used before it gets too long
+	      oldobjs=$objlist
+	      if test "$obj" = "$last_oldobj" ; then
+	        RANLIB=$save_RANLIB
+	      fi
+	      test -z "$concat_cmds" || concat_cmds=$concat_cmds~
+	      eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\"
+	      objlist=
+	    fi
+	  done
+	  RANLIB=$save_RANLIB
+	  oldobjs=$objlist
+	  if test "X$oldobjs" = "X" ; then
+	    eval cmds=\"\$concat_cmds\"
+	  else
+	    eval cmds=\"\$concat_cmds~\$old_archive_cmds\"
+	  fi
+	fi
+      fi
+      save_ifs="$IFS"; IFS='~'
+      for cmd in $cmds; do
+        eval cmd=\"$cmd\"
+	IFS="$save_ifs"
+	$show "$cmd"
+	$run eval "$cmd" || exit $?
+      done
+      IFS="$save_ifs"
+    done
+
+    if test -n "$generated"; then
+      $show "${rm}r$generated"
+      $run ${rm}r$generated
+    fi
+
+    # Now create the libtool archive.
+    case $output in
+    *.la)
+      old_library=
+      test "$build_old_libs" = yes && old_library="$libname.$libext"
+      $show "creating $output"
+
+      # Preserve any variables that may affect compiler behavior
+      for var in $variables_saved_for_relink; do
+	if eval test -z \"\${$var+set}\"; then
+	  relink_command="{ test -z \"\${$var+set}\" || unset $var || { $var=; export $var; }; }; $relink_command"
+	elif eval var_value=\$$var; test -z "$var_value"; then
+	  relink_command="$var=; export $var; $relink_command"
+	else
+	  var_value=`$echo "X$var_value" | $Xsed -e "$sed_quote_subst"`
+	  relink_command="$var=\"$var_value\"; export $var; $relink_command"
+	fi
+      done
+      # Quote the link command for shipping.
+      relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)"
+      relink_command=`$echo "X$relink_command" | $Xsed -e "$sed_quote_subst"`
+      if test "$hardcode_automatic" = yes ; then
+	relink_command=
+      fi
+
+
+      # Only create the output if not a dry run.
+      if test -z "$run"; then
+	for installed in no yes; do
+	  if test "$installed" = yes; then
+	    if test -z "$install_libdir"; then
+	      break
+	    fi
+	    output="$output_objdir/$outputname"i
+	    # Replace all uninstalled libtool libraries with the installed ones
+	    newdependency_libs=
+	    for deplib in $dependency_libs; do
+	      case $deplib in
+	      *.la)
+		name=`$echo "X$deplib" | $Xsed -e 's%^.*/%%'`
+		eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib`
+		if test -z "$libdir"; then
+		  $echo "$modename: \`$deplib' is not a valid libtool archive" 1>&2
+		  exit $EXIT_FAILURE
+		fi
+		newdependency_libs="$newdependency_libs $libdir/$name"
+		;;
+	      *) newdependency_libs="$newdependency_libs $deplib" ;;
+	      esac
+	    done
+	    dependency_libs="$newdependency_libs"
+	    newdlfiles=
+	    for lib in $dlfiles; do
+	      name=`$echo "X$lib" | $Xsed -e 's%^.*/%%'`
+	      eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
+	      if test -z "$libdir"; then
+		$echo "$modename: \`$lib' is not a valid libtool archive" 1>&2
+		exit $EXIT_FAILURE
+	      fi
+	      newdlfiles="$newdlfiles $libdir/$name"
+	    done
+	    dlfiles="$newdlfiles"
+	    newdlprefiles=
+	    for lib in $dlprefiles; do
+	      name=`$echo "X$lib" | $Xsed -e 's%^.*/%%'`
+	      eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
+	      if test -z "$libdir"; then
+		$echo "$modename: \`$lib' is not a valid libtool archive" 1>&2
+		exit $EXIT_FAILURE
+	      fi
+	      newdlprefiles="$newdlprefiles $libdir/$name"
+	    done
+	    dlprefiles="$newdlprefiles"
+	  else
+	    newdlfiles=
+	    for lib in $dlfiles; do
+	      case $lib in
+		[\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;;
+		*) abs=`pwd`"/$lib" ;;
+	      esac
+	      newdlfiles="$newdlfiles $abs"
+	    done
+	    dlfiles="$newdlfiles"
+	    newdlprefiles=
+	    for lib in $dlprefiles; do
+	      case $lib in
+		[\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;;
+		*) abs=`pwd`"/$lib" ;;
+	      esac
+	      newdlprefiles="$newdlprefiles $abs"
+	    done
+	    dlprefiles="$newdlprefiles"
+	  fi
+	  $rm $output
+	  # place dlname in correct position for cygwin
+	  tdlname=$dlname
+	  case $host,$output,$installed,$module,$dlname in
+	    *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll) tdlname=../bin/$dlname ;;
+	  esac
+	  $echo > $output "\
+# $outputname - a libtool library file
+# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# The name that we can dlopen(3).
+dlname='$tdlname'
+
+# Names of this library.
+library_names='$library_names'
+
+# The name of the static archive.
+old_library='$old_library'
+
+# Libraries that this one depends upon.
+dependency_libs='$dependency_libs'
+
+# Version information for $libname.
+current=$current
+age=$age
+revision=$revision
+
+# Is this an already installed library?
+installed=$installed
+
+# Should we warn about portability when linking against -modules?
+shouldnotlink=$module
+
+# Files to dlopen/dlpreopen
+dlopen='$dlfiles'
+dlpreopen='$dlprefiles'
+
+# Directory that this library needs to be installed in:
+libdir='$install_libdir'"
+	  if test "$installed" = no && test "$need_relink" = yes; then
+	    $echo >> $output "\
+relink_command=\"$relink_command\""
+	  fi
+	done
+      fi
+
+      # Do a symbolic link so that the libtool archive can be found in
+      # LD_LIBRARY_PATH before the program is installed.
+      $show "(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)"
+      $run eval '(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)' || exit $?
+      ;;
+    esac
+    exit $EXIT_SUCCESS
+    ;;
+
+  # libtool install mode
+  install)
+    modename="$modename: install"
+
+    # There may be an optional sh(1) argument at the beginning of
+    # install_prog (especially on Windows NT).
+    if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh ||
+       # Allow the use of GNU shtool's install command.
+       $echo "X$nonopt" | $Xsed | grep shtool > /dev/null; then
+      # Aesthetically quote it.
+      arg=`$echo "X$nonopt" | $Xsed -e "$sed_quote_subst"`
+      case $arg in
+      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*)
+	arg="\"$arg\""
+	;;
+      esac
+      install_prog="$arg "
+      arg="$1"
+      shift
+    else
+      install_prog=
+      arg="$nonopt"
+    fi
+
+    # The real first argument should be the name of the installation program.
+    # Aesthetically quote it.
+    arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
+    case $arg in
+    *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*)
+      arg="\"$arg\""
+      ;;
+    esac
+    install_prog="$install_prog$arg"
+
+    # We need to accept at least all the BSD install flags.
+    dest=
+    files=
+    opts=
+    prev=
+    install_type=
+    isdir=no
+    stripme=
+    for arg
+    do
+      if test -n "$dest"; then
+	files="$files $dest"
+	dest="$arg"
+	continue
+      fi
+
+      case $arg in
+      -d) isdir=yes ;;
+      -f) prev="-f" ;;
+      -g) prev="-g" ;;
+      -m) prev="-m" ;;
+      -o) prev="-o" ;;
+      -s)
+	stripme=" -s"
+	continue
+	;;
+      -*) ;;
+
+      *)
+	# If the previous option needed an argument, then skip it.
+	if test -n "$prev"; then
+	  prev=
+	else
+	  dest="$arg"
+	  continue
+	fi
+	;;
+      esac
+
+      # Aesthetically quote the argument.
+      arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
+      case $arg in
+      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*)
+	arg="\"$arg\""
+	;;
+      esac
+      install_prog="$install_prog $arg"
+    done
+
+    if test -z "$install_prog"; then
+      $echo "$modename: you must specify an install program" 1>&2
+      $echo "$help" 1>&2
+      exit $EXIT_FAILURE
+    fi
+
+    if test -n "$prev"; then
+      $echo "$modename: the \`$prev' option requires an argument" 1>&2
+      $echo "$help" 1>&2
+      exit $EXIT_FAILURE
+    fi
+
+    if test -z "$files"; then
+      if test -z "$dest"; then
+	$echo "$modename: no file or destination specified" 1>&2
+      else
+	$echo "$modename: you must specify a destination" 1>&2
+      fi
+      $echo "$help" 1>&2
+      exit $EXIT_FAILURE
+    fi
+
+    # Strip any trailing slash from the destination.
+    dest=`$echo "X$dest" | $Xsed -e 's%/$%%'`
+
+    # Check to see that the destination is a directory.
+    test -d "$dest" && isdir=yes
+    if test "$isdir" = yes; then
+      destdir="$dest"
+      destname=
+    else
+      destdir=`$echo "X$dest" | $Xsed -e 's%/[^/]*$%%'`
+      test "X$destdir" = "X$dest" && destdir=.
+      destname=`$echo "X$dest" | $Xsed -e 's%^.*/%%'`
+
+      # Not a directory, so check to see that there is only one file specified.
+      set dummy $files
+      if test "$#" -gt 2; then
+	$echo "$modename: \`$dest' is not a directory" 1>&2
+	$echo "$help" 1>&2
+	exit $EXIT_FAILURE
+      fi
+    fi
+    case $destdir in
+    [\\/]* | [A-Za-z]:[\\/]*) ;;
+    *)
+      for file in $files; do
+	case $file in
+	*.lo) ;;
+	*)
+	  $echo "$modename: \`$destdir' must be an absolute directory name" 1>&2
+	  $echo "$help" 1>&2
+	  exit $EXIT_FAILURE
+	  ;;
+	esac
+      done
+      ;;
+    esac
+
+    # This variable tells wrapper scripts just to set variables rather
+    # than running their programs.
+    libtool_install_magic="$magic"
+
+    staticlibs=
+    future_libdirs=
+    current_libdirs=
+    for file in $files; do
+
+      # Do each installation.
+      case $file in
+      *.$libext)
+	# Do the static libraries later.
+	staticlibs="$staticlibs $file"
+	;;
+
+      *.la)
+	# Check to see that this really is a libtool archive.
+	if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then :
+	else
+	  $echo "$modename: \`$file' is not a valid libtool archive" 1>&2
+	  $echo "$help" 1>&2
+	  exit $EXIT_FAILURE
+	fi
+
+	library_names=
+	old_library=
+	relink_command=
+	# If there is no directory component, then add one.
+	case $file in
+	*/* | *\\*) . $file ;;
+	*) . ./$file ;;
+	esac
+
+	# Add the libdir to current_libdirs if it is the destination.
+	if test "X$destdir" = "X$libdir"; then
+	  case "$current_libdirs " in
+	  *" $libdir "*) ;;
+	  *) current_libdirs="$current_libdirs $libdir" ;;
+	  esac
+	else
+	  # Note the libdir as a future libdir.
+	  case "$future_libdirs " in
+	  *" $libdir "*) ;;
+	  *) future_libdirs="$future_libdirs $libdir" ;;
+	  esac
+	fi
+
+	dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`/
+	test "X$dir" = "X$file/" && dir=
+	dir="$dir$objdir"
+
+	if test -n "$relink_command"; then
+	  # Determine the prefix the user has applied to our future dir.
+	  inst_prefix_dir=`$echo "$destdir" | $SED "s%$libdir\$%%"`
+
+	  # Don't allow the user to place us outside of our expected
+	  # location b/c this prevents finding dependent libraries that
+	  # are installed to the same prefix.
+	  # At present, this check doesn't affect windows .dll's that
+	  # are installed into $libdir/../bin (currently, that works fine)
+	  # but it's something to keep an eye on.
+	  if test "$inst_prefix_dir" = "$destdir"; then
+	    $echo "$modename: error: cannot install \`$file' to a directory not ending in $libdir" 1>&2
+	    exit $EXIT_FAILURE
+	  fi
+
+	  if test -n "$inst_prefix_dir"; then
+	    # Stick the inst_prefix_dir data into the link command.
+	    relink_command=`$echo "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"`
+	  else
+	    relink_command=`$echo "$relink_command" | $SED "s%@inst_prefix_dir@%%"`
+	  fi
+
+	  $echo "$modename: warning: relinking \`$file'" 1>&2
+	  $show "$relink_command"
+	  if $run eval "$relink_command"; then :
+	  else
+	    $echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2
+	    exit $EXIT_FAILURE
+	  fi
+	fi
+
+	# See the names of the shared library.
+	set dummy $library_names
+	if test -n "$2"; then
+	  realname="$2"
+	  shift
+	  shift
+
+	  srcname="$realname"
+	  test -n "$relink_command" && srcname="$realname"T
+
+	  # Install the shared library and build the symlinks.
+	  $show "$install_prog $dir/$srcname $destdir/$realname"
+	  $run eval "$install_prog $dir/$srcname $destdir/$realname" || exit $?
+	  if test -n "$stripme" && test -n "$striplib"; then
+	    $show "$striplib $destdir/$realname"
+	    $run eval "$striplib $destdir/$realname" || exit $?
+	  fi
+
+	  if test "$#" -gt 0; then
+	    # Delete the old symlinks, and create new ones.
+	    for linkname
+	    do
+	      if test "$linkname" != "$realname"; then
+		$show "(cd $destdir && $rm $linkname && $LN_S $realname $linkname)"
+		$run eval "(cd $destdir && $rm $linkname && $LN_S $realname $linkname)"
+	      fi
+	    done
+	  fi
+
+	  # Do each command in the postinstall commands.
+	  lib="$destdir/$realname"
+	  cmds=$postinstall_cmds
+	  save_ifs="$IFS"; IFS='~'
+	  for cmd in $cmds; do
+	    IFS="$save_ifs"
+	    eval cmd=\"$cmd\"
+	    $show "$cmd"
+	    $run eval "$cmd" || exit $?
+	  done
+	  IFS="$save_ifs"
+	fi
+
+	# Install the pseudo-library for information purposes.
+	name=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
+	instname="$dir/$name"i
+	$show "$install_prog $instname $destdir/$name"
+	$run eval "$install_prog $instname $destdir/$name" || exit $?
+
+	# Maybe install the static library, too.
+	test -n "$old_library" && staticlibs="$staticlibs $dir/$old_library"
+	;;
+
+      *.lo)
+	# Install (i.e. copy) a libtool object.
+
+	# Figure out destination file name, if it wasn't already specified.
+	if test -n "$destname"; then
+	  destfile="$destdir/$destname"
+	else
+	  destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
+	  destfile="$destdir/$destfile"
+	fi
+
+	# Deduce the name of the destination old-style object file.
+	case $destfile in
+	*.lo)
+	  staticdest=`$echo "X$destfile" | $Xsed -e "$lo2o"`
+	  ;;
+	*.$objext)
+	  staticdest="$destfile"
+	  destfile=
+	  ;;
+	*)
+	  $echo "$modename: cannot copy a libtool object to \`$destfile'" 1>&2
+	  $echo "$help" 1>&2
+	  exit $EXIT_FAILURE
+	  ;;
+	esac
+
+	# Install the libtool object if requested.
+	if test -n "$destfile"; then
+	  $show "$install_prog $file $destfile"
+	  $run eval "$install_prog $file $destfile" || exit $?
+	fi
+
+	# Install the old object if enabled.
+	if test "$build_old_libs" = yes; then
+	  # Deduce the name of the old-style object file.
+	  staticobj=`$echo "X$file" | $Xsed -e "$lo2o"`
+
+	  $show "$install_prog $staticobj $staticdest"
+	  $run eval "$install_prog \$staticobj \$staticdest" || exit $?
+	fi
+	exit $EXIT_SUCCESS
+	;;
+
+      *)
+	# Figure out destination file name, if it wasn't already specified.
+	if test -n "$destname"; then
+	  destfile="$destdir/$destname"
+	else
+	  destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
+	  destfile="$destdir/$destfile"
+	fi
+
+	# If the file is missing, and there is a .exe on the end, strip it
+	# because it is most likely a libtool script we actually want to
+	# install
+	stripped_ext=""
+	case $file in
+	  *.exe)
+	    if test ! -f "$file"; then
+	      file=`$echo $file|${SED} 's,.exe$,,'`
+	      stripped_ext=".exe"
+	    fi
+	    ;;
+	esac
+
+	# Do a test to see if this is really a libtool program.
+	case $host in
+	*cygwin*|*mingw*)
+	    wrapper=`$echo $file | ${SED} -e 's,.exe$,,'`
+	    ;;
+	*)
+	    wrapper=$file
+	    ;;
+	esac
+	if (${SED} -e '4q' $wrapper | grep "^# Generated by .*$PACKAGE")>/dev/null 2>&1; then
+	  notinst_deplibs=
+	  relink_command=
+
+	  # To insure that "foo" is sourced, and not "foo.exe",
+	  # finese the cygwin/MSYS system by explicitly sourcing "foo."
+	  # which disallows the automatic-append-.exe behavior.
+	  case $build in
+	  *cygwin* | *mingw*) wrapperdot=${wrapper}. ;;
+	  *) wrapperdot=${wrapper} ;;
+	  esac
+	  # If there is no directory component, then add one.
+	  case $file in
+	  */* | *\\*) . ${wrapperdot} ;;
+	  *) . ./${wrapperdot} ;;
+	  esac
+
+	  # Check the variables that should have been set.
+	  if test -z "$notinst_deplibs"; then
+	    $echo "$modename: invalid libtool wrapper script \`$wrapper'" 1>&2
+	    exit $EXIT_FAILURE
+	  fi
+
+	  finalize=yes
+	  for lib in $notinst_deplibs; do
+	    # Check to see that each library is installed.
+	    libdir=
+	    if test -f "$lib"; then
+	      # If there is no directory component, then add one.
+	      case $lib in
+	      */* | *\\*) . $lib ;;
+	      *) . ./$lib ;;
+	      esac
+	    fi
+	    libfile="$libdir/"`$echo "X$lib" | $Xsed -e 's%^.*/%%g'` ### testsuite: skip nested quoting test
+	    if test -n "$libdir" && test ! -f "$libfile"; then
+	      $echo "$modename: warning: \`$lib' has not been installed in \`$libdir'" 1>&2
+	      finalize=no
+	    fi
+	  done
+
+	  relink_command=
+	  # To insure that "foo" is sourced, and not "foo.exe",
+	  # finese the cygwin/MSYS system by explicitly sourcing "foo."
+	  # which disallows the automatic-append-.exe behavior.
+	  case $build in
+	  *cygwin* | *mingw*) wrapperdot=${wrapper}. ;;
+	  *) wrapperdot=${wrapper} ;;
+	  esac
+	  # If there is no directory component, then add one.
+	  case $file in
+	  */* | *\\*) . ${wrapperdot} ;;
+	  *) . ./${wrapperdot} ;;
+	  esac
+
+	  outputname=
+	  if test "$fast_install" = no && test -n "$relink_command"; then
+	    if test "$finalize" = yes && test -z "$run"; then
+	      tmpdir="/tmp"
+	      test -n "$TMPDIR" && tmpdir="$TMPDIR"
+	      tmpdir="$tmpdir/libtool-$$"
+	      save_umask=`umask`
+	      umask 0077
+	      if $mkdir "$tmpdir"; then
+	        umask $save_umask
+	      else
+	        umask $save_umask
+		$echo "$modename: error: cannot create temporary directory \`$tmpdir'" 1>&2
+		continue
+	      fi
+	      file=`$echo "X$file$stripped_ext" | $Xsed -e 's%^.*/%%'`
+	      outputname="$tmpdir/$file"
+	      # Replace the output file specification.
+	      relink_command=`$echo "X$relink_command" | $Xsed -e 's%@OUTPUT@%'"$outputname"'%g'`
+
+	      $show "$relink_command"
+	      if $run eval "$relink_command"; then :
+	      else
+		$echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2
+		${rm}r "$tmpdir"
+		continue
+	      fi
+	      file="$outputname"
+	    else
+	      $echo "$modename: warning: cannot relink \`$file'" 1>&2
+	    fi
+	  else
+	    # Install the binary that we compiled earlier.
+	    file=`$echo "X$file$stripped_ext" | $Xsed -e "s%\([^/]*\)$%$objdir/\1%"`
+	  fi
+	fi
+
+	# remove .exe since cygwin /usr/bin/install will append another
+	# one anyways
+	case $install_prog,$host in
+	*/usr/bin/install*,*cygwin*)
+	  case $file:$destfile in
+	  *.exe:*.exe)
+	    # this is ok
+	    ;;
+	  *.exe:*)
+	    destfile=$destfile.exe
+	    ;;
+	  *:*.exe)
+	    destfile=`$echo $destfile | ${SED} -e 's,.exe$,,'`
+	    ;;
+	  esac
+	  ;;
+	esac
+	$show "$install_prog$stripme $file $destfile"
+	$run eval "$install_prog\$stripme \$file \$destfile" || exit $?
+	test -n "$outputname" && ${rm}r "$tmpdir"
+	;;
+      esac
+    done
+
+    for file in $staticlibs; do
+      name=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
+
+      # Set up the ranlib parameters.
+      oldlib="$destdir/$name"
+
+      $show "$install_prog $file $oldlib"
+      $run eval "$install_prog \$file \$oldlib" || exit $?
+
+      if test -n "$stripme" && test -n "$old_striplib"; then
+	$show "$old_striplib $oldlib"
+	$run eval "$old_striplib $oldlib" || exit $?
+      fi
+
+      # Do each command in the postinstall commands.
+      cmds=$old_postinstall_cmds
+      save_ifs="$IFS"; IFS='~'
+      for cmd in $cmds; do
+	IFS="$save_ifs"
+	eval cmd=\"$cmd\"
+	$show "$cmd"
+	$run eval "$cmd" || exit $?
+      done
+      IFS="$save_ifs"
+    done
+
+    if test -n "$future_libdirs"; then
+      $echo "$modename: warning: remember to run \`$progname --finish$future_libdirs'" 1>&2
+    fi
+
+    if test -n "$current_libdirs"; then
+      # Maybe just do a dry run.
+      test -n "$run" && current_libdirs=" -n$current_libdirs"
+      exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs'
+    else
+      exit $EXIT_SUCCESS
+    fi
+    ;;
+
+  # libtool finish mode
+  finish)
+    modename="$modename: finish"
+    libdirs="$nonopt"
+    admincmds=
+
+    if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then
+      for dir
+      do
+	libdirs="$libdirs $dir"
+      done
+
+      for libdir in $libdirs; do
+	if test -n "$finish_cmds"; then
+	  # Do each command in the finish commands.
+	  cmds=$finish_cmds
+	  save_ifs="$IFS"; IFS='~'
+	  for cmd in $cmds; do
+	    IFS="$save_ifs"
+	    eval cmd=\"$cmd\"
+	    $show "$cmd"
+	    $run eval "$cmd" || admincmds="$admincmds
+       $cmd"
+	  done
+	  IFS="$save_ifs"
+	fi
+	if test -n "$finish_eval"; then
+	  # Do the single finish_eval.
+	  eval cmds=\"$finish_eval\"
+	  $run eval "$cmds" || admincmds="$admincmds
+       $cmds"
+	fi
+      done
+    fi
+
+    # Exit here if they wanted silent mode.
+    test "$show" = : && exit $EXIT_SUCCESS
+
+    $echo "----------------------------------------------------------------------"
+    $echo "Libraries have been installed in:"
+    for libdir in $libdirs; do
+      $echo "   $libdir"
+    done
+    $echo
+    $echo "If you ever happen to want to link against installed libraries"
+    $echo "in a given directory, LIBDIR, you must either use libtool, and"
+    $echo "specify the full pathname of the library, or use the \`-LLIBDIR'"
+    $echo "flag during linking and do at least one of the following:"
+    if test -n "$shlibpath_var"; then
+      $echo "   - add LIBDIR to the \`$shlibpath_var' environment variable"
+      $echo "     during execution"
+    fi
+    if test -n "$runpath_var"; then
+      $echo "   - add LIBDIR to the \`$runpath_var' environment variable"
+      $echo "     during linking"
+    fi
+    if test -n "$hardcode_libdir_flag_spec"; then
+      libdir=LIBDIR
+      eval flag=\"$hardcode_libdir_flag_spec\"
+
+      $echo "   - use the \`$flag' linker flag"
+    fi
+    if test -n "$admincmds"; then
+      $echo "   - have your system administrator run these commands:$admincmds"
+    fi
+    if test -f /etc/ld.so.conf; then
+      $echo "   - have your system administrator add LIBDIR to \`/etc/ld.so.conf'"
+    fi
+    $echo
+    $echo "See any operating system documentation about shared libraries for"
+    $echo "more information, such as the ld(1) and ld.so(8) manual pages."
+    $echo "----------------------------------------------------------------------"
+    exit $EXIT_SUCCESS
+    ;;
+
+  # libtool execute mode
+  execute)
+    modename="$modename: execute"
+
+    # The first argument is the command name.
+    cmd="$nonopt"
+    if test -z "$cmd"; then
+      $echo "$modename: you must specify a COMMAND" 1>&2
+      $echo "$help"
+      exit $EXIT_FAILURE
+    fi
+
+    # Handle -dlopen flags immediately.
+    for file in $execute_dlfiles; do
+      if test ! -f "$file"; then
+	$echo "$modename: \`$file' is not a file" 1>&2
+	$echo "$help" 1>&2
+	exit $EXIT_FAILURE
+      fi
+
+      dir=
+      case $file in
+      *.la)
+	# Check to see that this really is a libtool archive.
+	if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then :
+	else
+	  $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2
+	  $echo "$help" 1>&2
+	  exit $EXIT_FAILURE
+	fi
+
+	# Read the libtool library.
+	dlname=
+	library_names=
+
+	# If there is no directory component, then add one.
+	case $file in
+	*/* | *\\*) . $file ;;
+	*) . ./$file ;;
+	esac
+
+	# Skip this library if it cannot be dlopened.
+	if test -z "$dlname"; then
+	  # Warn if it was a shared library.
+	  test -n "$library_names" && $echo "$modename: warning: \`$file' was not linked with \`-export-dynamic'"
+	  continue
+	fi
+
+	dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`
+	test "X$dir" = "X$file" && dir=.
+
+	if test -f "$dir/$objdir/$dlname"; then
+	  dir="$dir/$objdir"
+	else
+	  $echo "$modename: cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" 1>&2
+	  exit $EXIT_FAILURE
+	fi
+	;;
+
+      *.lo)
+	# Just add the directory containing the .lo file.
+	dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`
+	test "X$dir" = "X$file" && dir=.
+	;;
+
+      *)
+	$echo "$modename: warning \`-dlopen' is ignored for non-libtool libraries and objects" 1>&2
+	continue
+	;;
+      esac
+
+      # Get the absolute pathname.
+      absdir=`cd "$dir" && pwd`
+      test -n "$absdir" && dir="$absdir"
+
+      # Now add the directory to shlibpath_var.
+      if eval "test -z \"\$$shlibpath_var\""; then
+	eval "$shlibpath_var=\"\$dir\""
+      else
+	eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\""
+      fi
+    done
+
+    # This variable tells wrapper scripts just to set shlibpath_var
+    # rather than running their programs.
+    libtool_execute_magic="$magic"
+
+    # Check if any of the arguments is a wrapper script.
+    args=
+    for file
+    do
+      case $file in
+      -*) ;;
+      *)
+	# Do a test to see if this is really a libtool program.
+	if (${SED} -e '4q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
+	  # If there is no directory component, then add one.
+	  case $file in
+	  */* | *\\*) . $file ;;
+	  *) . ./$file ;;
+	  esac
+
+	  # Transform arg to wrapped name.
+	  file="$progdir/$program"
+	fi
+	;;
+      esac
+      # Quote arguments (to preserve shell metacharacters).
+      file=`$echo "X$file" | $Xsed -e "$sed_quote_subst"`
+      args="$args \"$file\""
+    done
+
+    if test -z "$run"; then
+      if test -n "$shlibpath_var"; then
+	# Export the shlibpath_var.
+	eval "export $shlibpath_var"
+      fi
+
+      # Restore saved environment variables
+      if test "${save_LC_ALL+set}" = set; then
+	LC_ALL="$save_LC_ALL"; export LC_ALL
+      fi
+      if test "${save_LANG+set}" = set; then
+	LANG="$save_LANG"; export LANG
+      fi
+
+      # Now prepare to actually exec the command.
+      exec_cmd="\$cmd$args"
+    else
+      # Display what would be done.
+      if test -n "$shlibpath_var"; then
+	eval "\$echo \"\$shlibpath_var=\$$shlibpath_var\""
+	$echo "export $shlibpath_var"
+      fi
+      $echo "$cmd$args"
+      exit $EXIT_SUCCESS
+    fi
+    ;;
+
+  # libtool clean and uninstall mode
+  clean | uninstall)
+    modename="$modename: $mode"
+    rm="$nonopt"
+    files=
+    rmforce=
+    exit_status=0
+
+    # This variable tells wrapper scripts just to set variables rather
+    # than running their programs.
+    libtool_install_magic="$magic"
+
+    for arg
+    do
+      case $arg in
+      -f) rm="$rm $arg"; rmforce=yes ;;
+      -*) rm="$rm $arg" ;;
+      *) files="$files $arg" ;;
+      esac
+    done
+
+    if test -z "$rm"; then
+      $echo "$modename: you must specify an RM program" 1>&2
+      $echo "$help" 1>&2
+      exit $EXIT_FAILURE
+    fi
+
+    rmdirs=
+
+    origobjdir="$objdir"
+    for file in $files; do
+      dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`
+      if test "X$dir" = "X$file"; then
+	dir=.
+	objdir="$origobjdir"
+      else
+	objdir="$dir/$origobjdir"
+      fi
+      name=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
+      test "$mode" = uninstall && objdir="$dir"
+
+      # Remember objdir for removal later, being careful to avoid duplicates
+      if test "$mode" = clean; then
+	case " $rmdirs " in
+	  *" $objdir "*) ;;
+	  *) rmdirs="$rmdirs $objdir" ;;
+	esac
+      fi
+
+      # Don't error if the file doesn't exist and rm -f was used.
+      if (test -L "$file") >/dev/null 2>&1 \
+	|| (test -h "$file") >/dev/null 2>&1 \
+	|| test -f "$file"; then
+	:
+      elif test -d "$file"; then
+	exit_status=1
+	continue
+      elif test "$rmforce" = yes; then
+	continue
+      fi
+
+      rmfiles="$file"
+
+      case $name in
+      *.la)
+	# Possibly a libtool archive, so verify it.
+	if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
+	  . $dir/$name
+
+	  # Delete the libtool libraries and symlinks.
+	  for n in $library_names; do
+	    rmfiles="$rmfiles $objdir/$n"
+	  done
+	  test -n "$old_library" && rmfiles="$rmfiles $objdir/$old_library"
+	  test "$mode" = clean && rmfiles="$rmfiles $objdir/$name $objdir/${name}i"
+
+	  if test "$mode" = uninstall; then
+	    if test -n "$library_names"; then
+	      # Do each command in the postuninstall commands.
+	      cmds=$postuninstall_cmds
+	      save_ifs="$IFS"; IFS='~'
+	      for cmd in $cmds; do
+		IFS="$save_ifs"
+		eval cmd=\"$cmd\"
+		$show "$cmd"
+		$run eval "$cmd"
+		if test "$?" -ne 0 && test "$rmforce" != yes; then
+		  exit_status=1
+		fi
+	      done
+	      IFS="$save_ifs"
+	    fi
+
+	    if test -n "$old_library"; then
+	      # Do each command in the old_postuninstall commands.
+	      cmds=$old_postuninstall_cmds
+	      save_ifs="$IFS"; IFS='~'
+	      for cmd in $cmds; do
+		IFS="$save_ifs"
+		eval cmd=\"$cmd\"
+		$show "$cmd"
+		$run eval "$cmd"
+		if test "$?" -ne 0 && test "$rmforce" != yes; then
+		  exit_status=1
+		fi
+	      done
+	      IFS="$save_ifs"
+	    fi
+	    # FIXME: should reinstall the best remaining shared library.
+	  fi
+	fi
+	;;
+
+      *.lo)
+	# Possibly a libtool object, so verify it.
+	if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
+
+	  # Read the .lo file
+	  . $dir/$name
+
+	  # Add PIC object to the list of files to remove.
+	  if test -n "$pic_object" \
+	     && test "$pic_object" != none; then
+	    rmfiles="$rmfiles $dir/$pic_object"
+	  fi
+
+	  # Add non-PIC object to the list of files to remove.
+	  if test -n "$non_pic_object" \
+	     && test "$non_pic_object" != none; then
+	    rmfiles="$rmfiles $dir/$non_pic_object"
+	  fi
+	fi
+	;;
+
+      *)
+	if test "$mode" = clean ; then
+	  noexename=$name
+	  case $file in
+	  *.exe)
+	    file=`$echo $file|${SED} 's,.exe$,,'`
+	    noexename=`$echo $name|${SED} 's,.exe$,,'`
+	    # $file with .exe has already been added to rmfiles,
+	    # add $file without .exe
+	    rmfiles="$rmfiles $file"
+	    ;;
+	  esac
+	  # Do a test to see if this is a libtool program.
+	  if (${SED} -e '4q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
+	    relink_command=
+	    . $dir/$noexename
+
+	    # note $name still contains .exe if it was in $file originally
+	    # as does the version of $file that was added into $rmfiles
+	    rmfiles="$rmfiles $objdir/$name $objdir/${name}S.${objext}"
+	    if test "$fast_install" = yes && test -n "$relink_command"; then
+	      rmfiles="$rmfiles $objdir/lt-$name"
+	    fi
+	    if test "X$noexename" != "X$name" ; then
+	      rmfiles="$rmfiles $objdir/lt-${noexename}.c"
+	    fi
+	  fi
+	fi
+	;;
+      esac
+      $show "$rm $rmfiles"
+      $run $rm $rmfiles || exit_status=1
+    done
+    objdir="$origobjdir"
+
+    # Try to remove the ${objdir}s in the directories where we deleted files
+    for dir in $rmdirs; do
+      if test -d "$dir"; then
+	$show "rmdir $dir"
+	$run rmdir $dir >/dev/null 2>&1
+      fi
+    done
+
+    exit $exit_status
+    ;;
+
+  "")
+    $echo "$modename: you must specify a MODE" 1>&2
+    $echo "$generic_help" 1>&2
+    exit $EXIT_FAILURE
+    ;;
+  esac
+
+  if test -z "$exec_cmd"; then
+    $echo "$modename: invalid operation mode \`$mode'" 1>&2
+    $echo "$generic_help" 1>&2
+    exit $EXIT_FAILURE
+  fi
+fi # test -z "$show_help"
+
+if test -n "$exec_cmd"; then
+  eval exec $exec_cmd
+  exit $EXIT_FAILURE
+fi
+
+# We need to display help for each of the modes.
+case $mode in
+"") $echo \
+"Usage: $modename [OPTION]... [MODE-ARG]...
+
+Provide generalized library-building support services.
+
+    --config          show all configuration variables
+    --debug           enable verbose shell tracing
+-n, --dry-run         display commands without modifying any files
+    --features        display basic configuration information and exit
+    --finish          same as \`--mode=finish'
+    --help            display this help message and exit
+    --mode=MODE       use operation mode MODE [default=inferred from MODE-ARGS]
+    --quiet           same as \`--silent'
+    --silent          don't print informational messages
+    --tag=TAG         use configuration variables from tag TAG
+    --version         print version information
+
+MODE must be one of the following:
+
+      clean           remove files from the build directory
+      compile         compile a source file into a libtool object
+      execute         automatically set library path, then run a program
+      finish          complete the installation of libtool libraries
+      install         install libraries or executables
+      link            create a library or an executable
+      uninstall       remove libraries from an installed directory
+
+MODE-ARGS vary depending on the MODE.  Try \`$modename --help --mode=MODE' for
+a more detailed description of MODE.
+
+Report bugs to <bug-libtool@gnu.org>."
+  exit $EXIT_SUCCESS
+  ;;
+
+clean)
+  $echo \
+"Usage: $modename [OPTION]... --mode=clean RM [RM-OPTION]... FILE...
+
+Remove files from the build directory.
+
+RM is the name of the program to use to delete files associated with each FILE
+(typically \`/bin/rm').  RM-OPTIONS are options (such as \`-f') to be passed
+to RM.
+
+If FILE is a libtool library, object or program, all the files associated
+with it are deleted. Otherwise, only FILE itself is deleted using RM."
+  ;;
+
+compile)
+  $echo \
+"Usage: $modename [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE
+
+Compile a source file into a libtool library object.
+
+This mode accepts the following additional options:
+
+  -o OUTPUT-FILE    set the output file name to OUTPUT-FILE
+  -prefer-pic       try to building PIC objects only
+  -prefer-non-pic   try to building non-PIC objects only
+  -static           always build a \`.o' file suitable for static linking
+
+COMPILE-COMMAND is a command to be used in creating a \`standard' object file
+from the given SOURCEFILE.
+
+The output file name is determined by removing the directory component from
+SOURCEFILE, then substituting the C source code suffix \`.c' with the
+library object suffix, \`.lo'."
+  ;;
+
+execute)
+  $echo \
+"Usage: $modename [OPTION]... --mode=execute COMMAND [ARGS]...
+
+Automatically set library path, then run a program.
+
+This mode accepts the following additional options:
+
+  -dlopen FILE      add the directory containing FILE to the library path
+
+This mode sets the library path environment variable according to \`-dlopen'
+flags.
+
+If any of the ARGS are libtool executable wrappers, then they are translated
+into their corresponding uninstalled binary, and any of their required library
+directories are added to the library path.
+
+Then, COMMAND is executed, with ARGS as arguments."
+  ;;
+
+finish)
+  $echo \
+"Usage: $modename [OPTION]... --mode=finish [LIBDIR]...
+
+Complete the installation of libtool libraries.
+
+Each LIBDIR is a directory that contains libtool libraries.
+
+The commands that this mode executes may require superuser privileges.  Use
+the \`--dry-run' option if you just want to see what would be executed."
+  ;;
+
+install)
+  $echo \
+"Usage: $modename [OPTION]... --mode=install INSTALL-COMMAND...
+
+Install executables or libraries.
+
+INSTALL-COMMAND is the installation command.  The first component should be
+either the \`install' or \`cp' program.
+
+The rest of the components are interpreted as arguments to that command (only
+BSD-compatible install options are recognized)."
+  ;;
+
+link)
+  $echo \
+"Usage: $modename [OPTION]... --mode=link LINK-COMMAND...
+
+Link object files or libraries together to form another library, or to
+create an executable program.
+
+LINK-COMMAND is a command using the C compiler that you would use to create
+a program from several object files.
+
+The following components of LINK-COMMAND are treated specially:
+
+  -all-static       do not do any dynamic linking at all
+  -avoid-version    do not add a version suffix if possible
+  -dlopen FILE      \`-dlpreopen' FILE if it cannot be dlopened at runtime
+  -dlpreopen FILE   link in FILE and add its symbols to lt_preloaded_symbols
+  -export-dynamic   allow symbols from OUTPUT-FILE to be resolved with dlsym(3)
+  -export-symbols SYMFILE
+		    try to export only the symbols listed in SYMFILE
+  -export-symbols-regex REGEX
+		    try to export only the symbols matching REGEX
+  -LLIBDIR          search LIBDIR for required installed libraries
+  -lNAME            OUTPUT-FILE requires the installed library libNAME
+  -module           build a library that can dlopened
+  -no-fast-install  disable the fast-install mode
+  -no-install       link a not-installable executable
+  -no-undefined     declare that a library does not refer to external symbols
+  -o OUTPUT-FILE    create OUTPUT-FILE from the specified objects
+  -objectlist FILE  Use a list of object files found in FILE to specify objects
+  -precious-files-regex REGEX
+                    don't remove output files matching REGEX
+  -release RELEASE  specify package release information
+  -rpath LIBDIR     the created library will eventually be installed in LIBDIR
+  -R[ ]LIBDIR       add LIBDIR to the runtime path of programs and libraries
+  -static           do not do any dynamic linking of libtool libraries
+  -version-info CURRENT[:REVISION[:AGE]]
+		    specify library version info [each variable defaults to 0]
+
+All other options (arguments beginning with \`-') are ignored.
+
+Every other argument is treated as a filename.  Files ending in \`.la' are
+treated as uninstalled libtool libraries, other files are standard or library
+object files.
+
+If the OUTPUT-FILE ends in \`.la', then a libtool library is created,
+only library objects (\`.lo' files) may be specified, and \`-rpath' is
+required, except when creating a convenience library.
+
+If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created
+using \`ar' and \`ranlib', or on Windows using \`lib'.
+
+If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file
+is created, otherwise an executable program is created."
+  ;;
+
+uninstall)
+  $echo \
+"Usage: $modename [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE...
+
+Remove libraries from an installation directory.
+
+RM is the name of the program to use to delete files associated with each FILE
+(typically \`/bin/rm').  RM-OPTIONS are options (such as \`-f') to be passed
+to RM.
+
+If FILE is a libtool library, all the files associated with it are deleted.
+Otherwise, only FILE itself is deleted using RM."
+  ;;
+
+*)
+  $echo "$modename: invalid operation mode \`$mode'" 1>&2
+  $echo "$help" 1>&2
+  exit $EXIT_FAILURE
+  ;;
+esac
+
+$echo
+$echo "Try \`$modename --help' for more information about other modes."
+
+exit $EXIT_SUCCESS
+
+# The TAGs below are defined such that we never get into a situation
+# in which we disable both kinds of libraries.  Given conflicting
+# choices, we go for a static library, that is the most portable,
+# since we can't tell whether shared libraries were disabled because
+# the user asked for that or because the platform doesn't support
+# them.  This is particularly important on AIX, because we don't
+# support having both static and shared libraries enabled at the same
+# time on that platform, so we default to a shared-only configuration.
+# If a disable-shared tag is given, we'll fallback to a static-only
+# configuration.  But we'll never go from static-only to shared-only.
+
+# ### BEGIN LIBTOOL TAG CONFIG: disable-shared
+build_libtool_libs=no
+build_old_libs=yes
+# ### END LIBTOOL TAG CONFIG: disable-shared
+
+# ### BEGIN LIBTOOL TAG CONFIG: disable-static
+build_old_libs=`case $build_libtool_libs in yes) $echo no;; *) $echo yes;; esac`
+# ### END LIBTOOL TAG CONFIG: disable-static
+
+# Local Variables:
+# mode:shell-script
+# sh-indentation:2
+# End:
Index: /tags/ipp-1-X/bug123/psLib/missing
===================================================================
--- /tags/ipp-1-X/bug123/psLib/missing	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/missing	(revision 22331)
@@ -0,0 +1,336 @@
+#! /bin/sh
+# Common stub for a few missing GNU programs while installing.
+# Copyright (C) 1996, 1997, 1999, 2000, 2002 Free Software Foundation, Inc.
+# Originally by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.
+
+# 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, 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., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+if test $# -eq 0; then
+  echo 1>&2 "Try \`$0 --help' for more information"
+  exit 1
+fi
+
+run=:
+
+# In the cases where this matters, `missing' is being run in the
+# srcdir already.
+if test -f configure.ac; then
+  configure_ac=configure.ac
+else
+  configure_ac=configure.in
+fi
+
+case "$1" in
+--run)
+  # Try to run requested program, and just exit if it succeeds.
+  run=
+  shift
+  "$@" && exit 0
+  ;;
+esac
+
+# If it does not exist, or fails to run (possibly an outdated version),
+# try to emulate it.
+case "$1" in
+
+  -h|--h|--he|--hel|--help)
+    echo "\
+$0 [OPTION]... PROGRAM [ARGUMENT]...
+
+Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an
+error status if there is no known handling for PROGRAM.
+
+Options:
+  -h, --help      display this help and exit
+  -v, --version   output version information and exit
+  --run           try to run the given command, and emulate it if it fails
+
+Supported PROGRAM values:
+  aclocal      touch file \`aclocal.m4'
+  autoconf     touch file \`configure'
+  autoheader   touch file \`config.h.in'
+  automake     touch all \`Makefile.in' files
+  bison        create \`y.tab.[ch]', if possible, from existing .[ch]
+  flex         create \`lex.yy.c', if possible, from existing .c
+  help2man     touch the output file
+  lex          create \`lex.yy.c', if possible, from existing .c
+  makeinfo     touch the output file
+  tar          try tar, gnutar, gtar, then tar without non-portable flags
+  yacc         create \`y.tab.[ch]', if possible, from existing .[ch]"
+    ;;
+
+  -v|--v|--ve|--ver|--vers|--versi|--versio|--version)
+    echo "missing 0.4 - GNU automake"
+    ;;
+
+  -*)
+    echo 1>&2 "$0: Unknown \`$1' option"
+    echo 1>&2 "Try \`$0 --help' for more information"
+    exit 1
+    ;;
+
+  aclocal*)
+    if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
+       # We have it, but it failed.
+       exit 1
+    fi
+
+    echo 1>&2 "\
+WARNING: \`$1' is missing on your system.  You should only need it if
+         you modified \`acinclude.m4' or \`${configure_ac}'.  You might want
+         to install the \`Automake' and \`Perl' packages.  Grab them from
+         any GNU archive site."
+    touch aclocal.m4
+    ;;
+
+  autoconf)
+    if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
+       # We have it, but it failed.
+       exit 1
+    fi
+
+    echo 1>&2 "\
+WARNING: \`$1' is missing on your system.  You should only need it if
+         you modified \`${configure_ac}'.  You might want to install the
+         \`Autoconf' and \`GNU m4' packages.  Grab them from any GNU
+         archive site."
+    touch configure
+    ;;
+
+  autoheader)
+    if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
+       # We have it, but it failed.
+       exit 1
+    fi
+
+    echo 1>&2 "\
+WARNING: \`$1' is missing on your system.  You should only need it if
+         you modified \`acconfig.h' or \`${configure_ac}'.  You might want
+         to install the \`Autoconf' and \`GNU m4' packages.  Grab them
+         from any GNU archive site."
+    files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}`
+    test -z "$files" && files="config.h"
+    touch_files=
+    for f in $files; do
+      case "$f" in
+      *:*) touch_files="$touch_files "`echo "$f" |
+				       sed -e 's/^[^:]*://' -e 's/:.*//'`;;
+      *) touch_files="$touch_files $f.in";;
+      esac
+    done
+    touch $touch_files
+    ;;
+
+  automake*)
+    if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
+       # We have it, but it failed.
+       exit 1
+    fi
+
+    echo 1>&2 "\
+WARNING: \`$1' is missing on your system.  You should only need it if
+         you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'.
+         You might want to install the \`Automake' and \`Perl' packages.
+         Grab them from any GNU archive site."
+    find . -type f -name Makefile.am -print |
+	   sed 's/\.am$/.in/' |
+	   while read f; do touch "$f"; done
+    ;;
+
+  autom4te)
+    if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
+       # We have it, but it failed.
+       exit 1
+    fi
+
+    echo 1>&2 "\
+WARNING: \`$1' is needed, and you do not seem to have it handy on your
+         system.  You might have modified some files without having the
+         proper tools for further handling them.
+         You can get \`$1Help2man' as part of \`Autoconf' from any GNU
+         archive site."
+
+    file=`echo "$*" | sed -n 's/.*--output[ =]*\([^ ]*\).*/\1/p'`
+    test -z "$file" && file=`echo "$*" | sed -n 's/.*-o[ ]*\([^ ]*\).*/\1/p'`
+    if test -f "$file"; then
+	touch $file
+    else
+	test -z "$file" || exec >$file
+	echo "#! /bin/sh"
+	echo "# Created by GNU Automake missing as a replacement of"
+	echo "#  $ $@"
+	echo "exit 0"
+	chmod +x $file
+	exit 1
+    fi
+    ;;
+
+  bison|yacc)
+    echo 1>&2 "\
+WARNING: \`$1' is missing on your system.  You should only need it if
+         you modified a \`.y' file.  You may need the \`Bison' package
+         in order for those modifications to take effect.  You can get
+         \`Bison' from any GNU archive site."
+    rm -f y.tab.c y.tab.h
+    if [ $# -ne 1 ]; then
+        eval LASTARG="\${$#}"
+	case "$LASTARG" in
+	*.y)
+	    SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'`
+	    if [ -f "$SRCFILE" ]; then
+	         cp "$SRCFILE" y.tab.c
+	    fi
+	    SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'`
+	    if [ -f "$SRCFILE" ]; then
+	         cp "$SRCFILE" y.tab.h
+	    fi
+	  ;;
+	esac
+    fi
+    if [ ! -f y.tab.h ]; then
+	echo >y.tab.h
+    fi
+    if [ ! -f y.tab.c ]; then
+	echo 'main() { return 0; }' >y.tab.c
+    fi
+    ;;
+
+  lex|flex)
+    echo 1>&2 "\
+WARNING: \`$1' is missing on your system.  You should only need it if
+         you modified a \`.l' file.  You may need the \`Flex' package
+         in order for those modifications to take effect.  You can get
+         \`Flex' from any GNU archive site."
+    rm -f lex.yy.c
+    if [ $# -ne 1 ]; then
+        eval LASTARG="\${$#}"
+	case "$LASTARG" in
+	*.l)
+	    SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'`
+	    if [ -f "$SRCFILE" ]; then
+	         cp "$SRCFILE" lex.yy.c
+	    fi
+	  ;;
+	esac
+    fi
+    if [ ! -f lex.yy.c ]; then
+	echo 'main() { return 0; }' >lex.yy.c
+    fi
+    ;;
+
+  help2man)
+    if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
+       # We have it, but it failed.
+       exit 1
+    fi
+
+    echo 1>&2 "\
+WARNING: \`$1' is missing on your system.  You should only need it if
+	 you modified a dependency of a manual page.  You may need the
+	 \`Help2man' package in order for those modifications to take
+	 effect.  You can get \`Help2man' from any GNU archive site."
+
+    file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'`
+    if test -z "$file"; then
+	file=`echo "$*" | sed -n 's/.*--output=\([^ ]*\).*/\1/p'`
+    fi
+    if [ -f "$file" ]; then
+	touch $file
+    else
+	test -z "$file" || exec >$file
+	echo ".ab help2man is required to generate this page"
+	exit 1
+    fi
+    ;;
+
+  makeinfo)
+    if test -z "$run" && (makeinfo --version) > /dev/null 2>&1; then
+       # We have makeinfo, but it failed.
+       exit 1
+    fi
+
+    echo 1>&2 "\
+WARNING: \`$1' is missing on your system.  You should only need it if
+         you modified a \`.texi' or \`.texinfo' file, or any other file
+         indirectly affecting the aspect of the manual.  The spurious
+         call might also be the consequence of using a buggy \`make' (AIX,
+         DU, IRIX).  You might want to install the \`Texinfo' package or
+         the \`GNU make' package.  Grab either from any GNU archive site."
+    file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'`
+    if test -z "$file"; then
+      file=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'`
+      file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $file`
+    fi
+    touch $file
+    ;;
+
+  tar)
+    shift
+    if test -n "$run"; then
+      echo 1>&2 "ERROR: \`tar' requires --run"
+      exit 1
+    fi
+
+    # We have already tried tar in the generic part.
+    # Look for gnutar/gtar before invocation to avoid ugly error
+    # messages.
+    if (gnutar --version > /dev/null 2>&1); then
+       gnutar "$@" && exit 0
+    fi
+    if (gtar --version > /dev/null 2>&1); then
+       gtar "$@" && exit 0
+    fi
+    firstarg="$1"
+    if shift; then
+	case "$firstarg" in
+	*o*)
+	    firstarg=`echo "$firstarg" | sed s/o//`
+	    tar "$firstarg" "$@" && exit 0
+	    ;;
+	esac
+	case "$firstarg" in
+	*h*)
+	    firstarg=`echo "$firstarg" | sed s/h//`
+	    tar "$firstarg" "$@" && exit 0
+	    ;;
+	esac
+    fi
+
+    echo 1>&2 "\
+WARNING: I can't seem to be able to run \`tar' with the given arguments.
+         You may want to install GNU tar or Free paxutils, or check the
+         command line arguments."
+    exit 1
+    ;;
+
+  *)
+    echo 1>&2 "\
+WARNING: \`$1' is needed, and you do not seem to have it handy on your
+         system.  You might have modified some files without having the
+         proper tools for further handling them.  Check the \`README' file,
+         it often tells you about the needed prerequirements for installing
+         this package.  You may also peek at any GNU archive site, in case
+         some other package would contain this missing \`$1' program."
+    exit 1
+    ;;
+esac
+
+exit 0
Index: /tags/ipp-1-X/bug123/psLib/mkinstalldirs
===================================================================
--- /tags/ipp-1-X/bug123/psLib/mkinstalldirs	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/mkinstalldirs	(revision 22331)
@@ -0,0 +1,99 @@
+#! /bin/sh
+# mkinstalldirs --- make directory hierarchy
+# Author: Noah Friedman <friedman@prep.ai.mit.edu>
+# Created: 1993-05-16
+# Public domain
+
+errstatus=0
+dirmode=""
+
+usage="\
+Usage: mkinstalldirs [-h] [--help] [-m mode] dir ..."
+
+# process command line arguments
+while test $# -gt 0 ; do
+   case "${1}" in
+     -h | --help | --h* )			# -h for help
+	echo "${usage}" 1>&2; exit 0 ;;
+     -m )					# -m PERM arg
+	shift
+	test $# -eq 0 && { echo "${usage}" 1>&2; exit 1; }
+	dirmode="${1}"
+	shift ;;
+     -- ) shift; break ;;			# stop option processing
+     -* ) echo "${usage}" 1>&2; exit 1 ;;	# unknown option
+     * )  break ;;				# first non-opt arg
+   esac
+done
+
+for file
+do
+  if test -d "$file"; then
+    shift
+  else
+    break
+  fi
+done
+
+case $# in
+0) exit 0 ;;
+esac
+
+case $dirmode in
+'')
+  if mkdir -p -- . 2>/dev/null; then
+    echo "mkdir -p -- $*"
+    exec mkdir -p -- "$@"
+  fi ;;
+*)
+  if mkdir -m "$dirmode" -p -- . 2>/dev/null; then
+    echo "mkdir -m $dirmode -p -- $*"
+    exec mkdir -m "$dirmode" -p -- "$@"
+  fi ;;
+esac
+
+for file
+do
+   set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'`
+   shift
+
+   pathcomp=
+   for d
+   do
+     pathcomp="$pathcomp$d"
+     case "$pathcomp" in
+       -* ) pathcomp=./$pathcomp ;;
+     esac
+
+     if test ! -d "$pathcomp"; then
+	echo "mkdir $pathcomp"
+
+	mkdir "$pathcomp" || lasterr=$?
+
+	if test ! -d "$pathcomp"; then
+	  errstatus=$lasterr
+	else
+	  if test ! -z "$dirmode"; then
+	     echo "chmod $dirmode $pathcomp"
+
+	     lasterr=""
+	     chmod "$dirmode" "$pathcomp" || lasterr=$?
+
+	     if test ! -z "$lasterr"; then
+	       errstatus=$lasterr
+	     fi
+	  fi
+	fi
+     fi
+
+     pathcomp="$pathcomp/"
+   done
+done
+
+exit $errstatus
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 3
+# End:
+# mkinstalldirs ends here
Index: /tags/ipp-1-X/bug123/psLib/pslib-config.in
===================================================================
--- /tags/ipp-1-X/bug123/psLib/pslib-config.in	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/pslib-config.in	(revision 22331)
@@ -0,0 +1,80 @@
+#! /bin/sh
+
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+includedir=@includedir@
+@PERL_INSTALLSYTLE@
+
+usage()
+{
+    cat <<EOF
+Usage: pslib-config [OPTION]
+
+Known values for OPTION are:
+
+  --prefix		print psLib installation prefix
+  --perlmodule  	print psLib perl module's installation location
+  --libs		print library linking information
+  --cflags		print pre-processor and compiler flags
+  --help		display this help and exit
+  --version		output version information
+
+EOF
+
+    exit $1
+}
+
+if test $# -eq 0; then
+    usage 1
+fi
+
+cflags=false
+libs=false
+
+while test $# -gt 0; do
+    case "$1" in
+    -*=*) optarg=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
+    *) optarg= ;;
+    esac
+
+    case "$1" in
+    --prefix=*)
+	prefix=$optarg
+	;;
+
+    --prefix)
+	echo $prefix
+	;;
+
+    --version)
+	echo @VERSION@
+	exit 0
+	;;
+
+    --help)
+	usage 0
+	;;
+
+    --cflags)
+       	echo @PSLIB_CFLAGS@ 
+       	;;
+
+    --libs)
+       	echo -L@libdir@ -lpslib @PSLIB_LIBS@
+       	;;
+    
+    --deps)
+       	echo @PSLIB_LIBS@
+       	;;
+    --perlmodule)
+       	echo @PERL_PREFIX@/$installstyle
+       	;;
+    *)
+	usage
+	exit 1
+	;;
+    esac
+    shift
+done
+
+exit 0
Index: /tags/ipp-1-X/bug123/psLib/pslib.kdevelop
===================================================================
--- /tags/ipp-1-X/bug123/psLib/pslib.kdevelop	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/pslib.kdevelop	(revision 22331)
@@ -0,0 +1,158 @@
+<?xml version = '1.0'?>
+<kdevelop>
+  <general>
+    <author>Robert Daniel DeSonia</author>
+    <email>robert.desonia@mhpcc.hpc.mil</email>
+    <version>1.5</version>
+    <projectmanagement>KDevAutoProject</projectmanagement>
+    <primarylanguage>C</primarylanguage>
+    <keywords>
+      <keyword>C</keyword>
+      <keyword>Code</keyword>
+    </keywords>
+    <ignoreparts>
+      <part>KDevCTags</part>
+      <part>KDevsubversion</part>
+      <part>KDevcopyto</part>
+      <part>KDevClearCase</part>
+      <part>KDevFileGroups</part>
+      <part>CvsService</part>
+      <part>KDevPerforce</part>
+    </ignoreparts>
+  </general>
+  <kdevautoproject>
+    <general>
+      <activetarget>src/pslib</activetarget>
+      <useconfiguration>default</useconfiguration>
+    </general>
+    <run>
+      <mainprogram>src/pslib</mainprogram>
+      <terminal>true</terminal>
+      <directoryradio>executable</directoryradio>
+    </run>
+    <configurations>
+      <optimized>
+        <builddir>optimized</builddir>
+        <ccompiler>kdevgccoptions</ccompiler>
+        <cxxcompiler>kdevgppoptions</cxxcompiler>
+        <f77compiler>kdevg77options</f77compiler>
+        <cflags>-O2 -g0 </cflags>
+      </optimized>
+      <debug>
+        <configargs>--enable-debug=full</configargs>
+        <builddir>debug</builddir>
+        <ccompiler>kdevgccoptions</ccompiler>
+        <cxxcompiler>kdevgppoptions</cxxcompiler>
+        <f77compiler>kdevg77options</f77compiler>
+        <cflags>-O0 -g3 </cflags>
+      </debug>
+    </configurations>
+    <make>
+      <envvars>
+        <envvar value="1" name="WANT_AUTOCONF_2_5" />
+        <envvar value="1" name="WANT_AUTOMAKE_1_6" />
+      </envvars>
+    </make>
+  </kdevautoproject>
+  <kdevdoctreeview>
+    <ignoretocs>
+      <toc>ada</toc>
+      <toc>ada_bugs_gcc</toc>
+      <toc>bash</toc>
+      <toc>bash_bugs</toc>
+      <toc>clanlib</toc>
+      <toc>w3c-dom-level2-html</toc>
+      <toc>fortran_bugs_gcc</toc>
+      <toc>gnome1</toc>
+      <toc>gnustep</toc>
+      <toc>gtk</toc>
+      <toc>gtk_bugs</toc>
+      <toc>haskell</toc>
+      <toc>haskell_bugs_ghc</toc>
+      <toc>java_bugs_gcc</toc>
+      <toc>java_bugs_sun</toc>
+      <toc>kde2book</toc>
+      <toc>libstdc++</toc>
+      <toc>opengl</toc>
+      <toc>pascal_bugs_fp</toc>
+      <toc>php</toc>
+      <toc>php_bugs</toc>
+      <toc>perl</toc>
+      <toc>perl_bugs</toc>
+      <toc>python</toc>
+      <toc>python_bugs</toc>
+      <toc>qt-kdev3</toc>
+      <toc>ruby</toc>
+      <toc>ruby_bugs</toc>
+      <toc>sdl</toc>
+      <toc>stl</toc>
+      <toc>w3c-svg</toc>
+      <toc>sw</toc>
+      <toc>w3c-uaag10</toc>
+      <toc>wxwidgets_bugs</toc>
+    </ignoretocs>
+    <ignoreqt_xml>
+      <toc>Guide to the Qt Translation Tools</toc>
+      <toc>Qt Assistant Manual</toc>
+      <toc>Qt Designer Manual</toc>
+      <toc>Qt Reference Documentation</toc>
+      <toc>qmake User Guide</toc>
+    </ignoreqt_xml>
+    <ignoredoxygen>
+      <toc>KDE Libraries (Doxygen)</toc>
+    </ignoredoxygen>
+  </kdevdoctreeview>
+  <kdevfilecreate>
+    <useglobaltypes>
+      <type ext="c" />
+      <type ext="h" />
+    </useglobaltypes>
+  </kdevfilecreate>
+  <kdevfileview>
+    <groups>
+      <group pattern="*.h" name="Header files" />
+      <group pattern="*.c" name="Source files" />
+      <hidenonprojectfiles>false</hidenonprojectfiles>
+      <hidenonlocation>false</hidenonlocation>
+    </groups>
+    <tree>
+      <hidepatterns>*.o,*.lo,CVS</hidepatterns>
+      <hidenonprojectfiles>false</hidenonprojectfiles>
+    </tree>
+  </kdevfileview>
+  <kdevdocumentation>
+    <projectdoc>
+      <docsystem>Doxygen Documentation Collection</docsystem>
+      <docurl>${APPNAMELC}.tag</docurl>
+    </projectdoc>
+  </kdevdocumentation>
+  <substmap>
+    <APPNAME>psLib</APPNAME>
+    <APPNAMELC>pslib</APPNAMELC>
+    <APPNAMEUC>PSLIB</APPNAMEUC>
+    <AUTHOR>Robert Daniel DeSonia</AUTHOR>
+    <CFLAGS/>
+    <EMAIL>robert.desonia@mhpcc.hpc.mil</EMAIL>
+    <LICENSE>GPL</LICENSE>
+    <LICENSEFILE>COPYING</LICENSEFILE>
+    <OPT_INCS>-I/usr/include</OPT_INCS>
+    <OPT_LIBS>-lm</OPT_LIBS>
+    <VERSION>1.5</VERSION>
+    <dest>/home/desonia/pslib</dest>
+  </substmap>
+  <kdevcppsupport>
+    <references/>
+    <codecompletion>
+      <includeGlobalFunctions>true</includeGlobalFunctions>
+      <includeTypes>true</includeTypes>
+      <includeEnums>true</includeEnums>
+      <includeTypedefs>false</includeTypedefs>
+      <automaticCodeCompletion>true</automaticCodeCompletion>
+      <automaticArgumentsHint>true</automaticArgumentsHint>
+      <automaticHeaderCompletion>true</automaticHeaderCompletion>
+      <codeCompletionDelay>250</codeCompletionDelay>
+      <argumentsHintDelay>400</argumentsHintDelay>
+      <headerCompletionDelay>250</headerCompletionDelay>
+    </codecompletion>
+  </kdevcppsupport>
+</kdevelop>
Index: /tags/ipp-1-X/bug123/psLib/pslib.kdevses
===================================================================
--- /tags/ipp-1-X/bug123/psLib/pslib.kdevses	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/pslib.kdevses	(revision 22331)
@@ -0,0 +1,29 @@
+<?xml version = '1.0' encoding = 'UTF-8'?>
+<!DOCTYPE KDevPrjSession>
+<KDevPrjSession>
+ <DocsAndViews NumberOfDocuments="3" >
+  <Doc0 NumberOfViews="1" URL="file:///home/desonia/panstarrs/psLib/src/image/psImageManip.h" >
+   <View0 line="22" Type="Source" />
+  </Doc0>
+  <Doc1 NumberOfViews="1" URL="file:///home/desonia/panstarrs/psLib/src/image/psImageManip.c" >
+   <View0 line="1173" Type="Source" />
+  </Doc1>
+  <Doc2 NumberOfViews="1" URL="file:///home/desonia/panstarrs/psLib/src/image/psImage.h" >
+   <View0 line="159" Type="Source" />
+  </Doc2>
+ </DocsAndViews>
+ <pluginList>
+  <kdevdebugger>
+   <breakpointList/>
+  </kdevdebugger>
+  <kdevbookmarks>
+   <bookmarks/>
+  </kdevbookmarks>
+  <kdevvalgrind>
+   <executable path="" params="" />
+   <valgrind path="" params="" />
+   <calltree path="" params="" />
+   <kcachegrind path="" />
+  </kdevvalgrind>
+ </pluginList>
+</KDevPrjSession>
Index: /tags/ipp-1-X/bug123/psLib/pslib.pc.in
===================================================================
--- /tags/ipp-1-X/bug123/psLib/pslib.pc.in	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/pslib.pc.in	(revision 22331)
@@ -0,0 +1,10 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: psLib
+Description: Pan-STARRS Library
+Version: @VERSION@
+Libs: -L@libdir@ -lpslib @PSLIB_LIBS@ @LIBS@
+Cflags: @PSLIB_CFLAGS@
Index: /tags/ipp-1-X/bug123/psLib/share/pslib/.cvsignore
===================================================================
--- /tags/ipp-1-X/bug123/psLib/share/pslib/.cvsignore	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/share/pslib/.cvsignore	(revision 22331)
@@ -0,0 +1,2 @@
+psTime.config
+psTime.xml
Index: /tags/ipp-1-X/bug123/psLib/share/pslib/eopc01_1900_2004.dat
===================================================================
--- /tags/ipp-1-X/bug123/psLib/share/pslib/eopc01_1900_2004.dat	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/share/pslib/eopc01_1900_2004.dat	(revision 22331)
@@ -0,0 +1,2103 @@
+#  eopc01_1900_2004.dat
+#
+#  This file comes from http://hpiers.obspm.fr/eoppc/eop/eopc01/eopc01.1900-2004. See readme.eopc01 (located
+#  in the psLib/data directory) for details.
+#
+#  @author Ross Harman, MHPCC
+#
+#  @version $Revision: 1.1 $ $Name: not supported by cvs2svn $
+#  @date $Date: 2005-02-10 02:36:41 $
+#
+#
+#    Date       PM-x      PM-y     UT1-UTC
+#   (year)    (arcsec)   (arcsec)   (sec)
+     psF64     psF64      psF64     psF64
+    1900.00  -.212818  -.097229   .0000000
+    1900.05  -.047461  -.065631   .0000000
+    1900.10  -.112006  -.040467   .0000000
+    1900.15  -.076710  -.009674   .0000000
+    1900.20  -.099850  -.066660   .0000000
+    1900.25  -.131173  -.072076   .0000000
+    1900.30  -.087390  -.089427   .0000000
+    1900.35  -.164078  -.131034   .0000000
+    1900.40  -.151407  -.105838   .0000000
+    1900.45  -.143764  -.179125   .0000000
+    1900.50  -.124341  -.105747   .0000000
+    1900.55  -.206229  -.144555   .0000000
+    1900.60  -.192711  -.095563   .0000000
+    1900.65  -.190299  -.067717   .0000000
+    1900.70  -.135718  -.081480   .0000000
+    1900.75  -.153807   .030568   .0000000
+    1900.80  -.173818   .001034   .0000000
+    1900.85  -.257716  -.006499   .0000000
+    1900.90  -.209085   .046511   .0000000
+    1900.95  -.133145   .004905   .0000000
+    1901.00  -.138242   .014255   .0000000
+    1901.05  -.162602   .006609   .0000000
+    1901.10  -.121242  -.000875   .0000000
+    1901.15  -.109773   .024691   .0000000
+    1901.20  -.103805   .039564   .0000000
+    1901.25  -.021306  -.011519   .0000000
+    1901.30  -.001300   .021700   .0000000
+    1901.35   .037156  -.049753   .0000000
+    1901.40   .003993  -.095314   .0000000
+    1901.45   .054079  -.081336   .0000000
+    1901.50   .089761  -.084901   .0000000
+    1901.55   .004864  -.187233   .0000000
+    1901.60  -.023099  -.179528   .0000000
+    1901.65  -.057910  -.197673   .0000000
+    1901.70  -.033170  -.202981   .0000000
+    1901.75  -.155604  -.187085   .0000000
+    1901.80  -.169658  -.183163   .0000000
+    1901.85  -.188623  -.181458   .0000000
+    1901.90  -.223086  -.144566   .0000000
+    1901.95  -.254958  -.114447   .0000000
+    1902.00  -.259243  -.078157   .0000000
+    1902.05  -.211792   .038633   .0000000
+    1902.10  -.216991   .064250   .0000000
+    1902.15  -.242537   .171246   .0000000
+    1902.20  -.188324   .158468   .0000000
+    1902.25  -.152570   .207171   .0000000
+    1902.30  -.062244   .171387   .0000000
+    1902.35  -.016045   .182141   .0000000
+    1902.40   .036032   .156268   .0000000
+    1902.45   .217293   .252814   .0000000
+    1902.50   .119283   .066262   .0000000
+    1902.55   .125538   .016781   .0000000
+    1902.60   .082496  -.058369   .0000000
+    1902.65   .051287  -.069631   .0000000
+    1902.70   .051239  -.093785   .0000000
+    1902.75  -.024248  -.151921   .0000000
+    1902.80  -.054789  -.179957   .0000000
+    1902.85  -.146320  -.146959   .0000000
+    1902.90  -.193061  -.169534   .0000000
+    1902.95  -.237694  -.119404   .0000000
+    1903.00  -.319420  -.043030   .0000000
+    1903.05  -.341204   .031366   .0000000
+    1903.10  -.345930  -.002271   .0000000
+    1903.15  -.363449   .022246   .0000000
+    1903.20  -.363639   .126744   .0000000
+    1903.25  -.275204   .088178   .0000000
+    1903.30  -.217973   .142752   .0000000
+    1903.35  -.133649   .193127   .0000000
+    1903.40  -.073538   .187785   .0000000
+    1903.45  -.033275   .242905   .0000000
+    1903.50  -.025665   .185828   .0000000
+    1903.55   .065994   .199396   .0000000
+    1903.60   .124642   .131603   .0000000
+    1903.65   .138085   .043707   .0000000
+    1903.70   .131036  -.010458   .0000000
+    1903.75   .129875  -.132885   .0000000
+    1903.80   .020188  -.149501   .0000000
+    1903.85  -.013164  -.224089   .0000000
+    1903.90   .017200  -.148400   .0000000
+    1903.95  -.054459  -.187411   .0000000
+    1904.00  -.148856  -.076687   .0000000
+    1904.05  -.254004  -.136031   .0000000
+    1904.10  -.260513  -.134266   .0000000
+    1904.15  -.250640  -.062308   .0000000
+    1904.20  -.318450  -.022118   .0000000
+    1904.25  -.293126   .024733   .0000000
+    1904.30  -.249230   .052166   .0000000
+    1904.35  -.263860   .072953   .0000000
+    1904.40  -.210918   .172463   .0000000
+    1904.45  -.152700   .188900   .0000000
+    1904.50  -.109676   .182564   .0000000
+    1904.55  -.082798   .158201   .0000000
+    1904.60   .001500   .164000   .0000000
+    1904.65   .042084   .134884   .0000000
+    1904.70   .062535   .070240   .0000000
+    1904.75   .083512   .063227   .0000000
+    1904.80   .042326   .010531   .0000000
+    1904.85   .042284  -.029751   .0000000
+    1904.90  -.008473  -.063250   .0000000
+    1904.95   .028258  -.057405   .0000000
+    1905.00  -.040538  -.099671   .0000000
+    1905.05  -.017099  -.158118   .0000000
+    1905.10  -.105713  -.176117   .0000000
+    1905.15  -.176213  -.100777   .0000000
+    1905.20  -.231493  -.136695   .0000000
+    1905.25  -.251440  -.151097   .0000000
+    1905.30  -.248000  -.108800   .0000000
+    1905.35  -.304428   .045206   .0000000
+    1905.40  -.236545   .042822   .0000000
+    1905.45  -.250592   .048859   .0000000
+    1905.50  -.185960   .112145   .0000000
+    1905.55  -.156532   .117102   .0000000
+    1905.60  -.109352   .166247   .0000000
+    1905.65  -.067846   .135598   .0000000
+    1905.70   .014037   .151407   .0000000
+    1905.75  -.034403   .175804   .0000000
+    1905.80  -.031721   .049970   .0000000
+    1905.85   .025746   .080453   .0000000
+    1905.90   .024021  -.056728   .0000000
+    1905.95   .040706  -.006383   .0000000
+    1906.00   .003853  -.026096   .0000000
+    1906.05  -.017613  -.075020   .0000000
+    1906.10  -.157406  -.092487   .0000000
+    1906.15  -.067506  -.080298   .0000000
+    1906.20  -.149450  -.119103   .0000000
+    1906.25  -.128247  -.061169   .0000000
+    1906.30  -.179648  -.057693   .0000000
+    1906.35  -.186449  -.044109   .0000000
+    1906.40  -.208575  -.019448   .0000000
+    1906.45  -.217870   .042944   .0000000
+    1906.50  -.199891   .058881   .0000000
+    1906.55  -.173543   .070934   .0000000
+    1906.60  -.182003   .113024   .0000000
+    1906.65  -.142776   .095154   .0000000
+    1906.70  -.093740   .095224   .0000000
+    1906.75  -.093900   .111200   .0000000
+    1906.80  -.102758   .078405   .0000000
+    1906.85  -.009641   .137918   .0000000
+    1906.90  -.126885   .077766   .0000000
+    1906.95  -.085940   .122947   .0000000
+    1907.00  -.079416   .150174   .0000000
+    1907.05  -.067350   .041498   .0000000
+    1907.10  -.027042   .024883   .0000000
+    1907.15  -.069913   .039794   .0000000
+    1907.20  -.059194  -.025833   .0000000
+    1907.25  -.032978  -.010025   .0000000
+    1907.30  -.032298  -.079952   .0000000
+    1907.35  -.012800  -.038790   .0000000
+    1907.40  -.094517  -.051596   .0000000
+    1907.45  -.089447  -.124297   .0000000
+    1907.50  -.131771  -.098748   .0000000
+    1907.55  -.109356  -.122489   .0000000
+    1907.60  -.134764  -.084340   .0000000
+    1907.65  -.150915  -.095204   .0000000
+    1907.70  -.183652  -.070567   .0000000
+    1907.75  -.247755  -.037271   .0000000
+    1907.80  -.276782   .006594   .0000000
+    1907.85  -.260675   .115176   .0000000
+    1907.90  -.279309   .066165   .0000000
+    1907.95  -.247411   .158512   .0000000
+    1908.00  -.179825   .190418   .0000000
+    1908.05  -.162104   .175855   .0000000
+    1908.10  -.073775   .244495   .0000000
+    1908.15  -.088534   .184551   .0000000
+    1908.20   .072181   .185212   .0000000
+    1908.25   .000811   .129285   .0000000
+    1908.30   .094290   .125029   .0000000
+    1908.35   .098031   .048028   .0000000
+    1908.40   .085376  -.037173   .0000000
+    1908.45   .110614  -.053618   .0000000
+    1908.50   .110175  -.121985   .0000000
+    1908.55   .062891  -.147259   .0000000
+    1908.60   .016036  -.174778   .0000000
+    1908.65  -.044507  -.258578   .0000000
+    1908.70  -.126698  -.236805   .0000000
+    1908.75  -.185227  -.279032   .0000000
+    1908.80  -.218671  -.234349   .0000000
+    1908.85  -.258124  -.193490   .0000000
+    1908.90  -.348498  -.117029   .0000000
+    1908.95  -.441656  -.087821   .0000000
+    1909.00  -.418026   .032515   .0000000
+    1909.05  -.464700   .053100   .0000000
+    1909.10  -.381402   .081369   .0000000
+    1909.15  -.331872   .208343   .0000000
+    1909.20  -.262800   .230900   .0000000
+    1909.25  -.180022   .262477   .0000000
+    1909.30  -.088674   .272316   .0000000
+    1909.35  -.017300   .301900   .0000000
+    1909.40   .082311   .293915   .0000000
+    1909.45   .145682   .242356   .0000000
+    1909.50   .159939   .145514   .0000000
+    1909.55   .219001   .050735   .0000000
+    1909.60   .251107   .038325   .0000000
+    1909.65   .216000  -.092100   .0000000
+    1909.70   .239771  -.129218   .0000000
+    1909.75   .122030  -.229024   .0000000
+    1909.80  -.027219  -.280542   .0000000
+    1909.85  -.097816  -.318227   .0000000
+    1909.90  -.212272  -.273213   .0000000
+    1909.95  -.262295  -.211841   .0000000
+    1910.00  -.323074  -.200846   .0000000
+    1910.05  -.442329  -.257217   .0000000
+    1910.10  -.448532  -.107453   .0000000
+    1910.15  -.408744   .030815   .0000000
+    1910.20  -.414020  -.006268   .0000000
+    1910.25  -.385676   .162890   .0000000
+    1910.30  -.368387   .272702   .0000000
+    1910.35  -.268774   .293213   .0000000
+    1910.40  -.147573   .342824   .0000000
+    1910.45  -.081273   .328529   .0000000
+    1910.50  -.020932   .388520   .0000000
+    1910.55   .105674   .327555   .0000000
+    1910.60   .176301   .312524   .0000000
+    1910.65   .191756   .171612   .0000000
+    1910.70   .222257   .091742   .0000000
+    1910.75   .211332  -.009012   .0000000
+    1910.80   .205000  -.105700   .0000000
+    1910.85   .120900  -.162494   .0000000
+    1910.90   .083916  -.253801   .0000000
+    1910.95  -.057477  -.280025   .0000000
+    1911.00  -.089579  -.260914   .0000000
+    1911.05  -.218786  -.263597   .0000000
+    1911.10  -.224700  -.257286   .0000000
+    1911.15  -.335860  -.182205   .0000000
+    1911.20  -.267000  -.050900   .0000000
+    1911.25  -.370633   .021540   .0000000
+    1911.30  -.353109   .047330   .0000000
+    1911.35  -.332727   .126340   .0000000
+    1911.40  -.234107   .168826   .0000000
+    1911.45  -.272718   .310644   .0000000
+    1911.50  -.193283   .331807   .0000000
+    1911.55  -.136796   .347029   .0000000
+    1911.60  -.056770   .304448   .0000000
+    1911.65   .060600   .363500   .0000000
+    1911.70   .112694   .325844   .0000000
+    1911.75   .129599   .242729   .0000000
+    1911.80   .130866   .155825   .0000000
+    1911.85   .158551   .088616   .0000000
+    1911.90   .145314  -.044498   .0000000
+    1911.95   .095603  -.041933   .0000000
+    1912.00   .083131  -.041367   .0000000
+    1912.05  -.038956  -.097988   .0000000
+    1912.10   .078300  -.165300   .0000000
+    1912.15  -.088995  -.223549   .0000000
+    1912.20  -.127587  -.102840   .0000000
+    1912.25  -.227272  -.194080   .0000000
+    1912.30  -.209405  -.109730   .0000000
+    1912.35  -.237021  -.041122   .0000000
+    1912.40  -.262082  -.006966   .0000000
+    1912.45  -.225320   .056285   .0000000
+    1912.50  -.263907   .044713   .0000000
+    1912.55  -.196951   .144625   .0000000
+    1912.60  -.198267   .185500   .0000000
+    1912.65  -.219124   .151146   .0000000
+    1912.70  -.175982   .183356   .0000000
+    1912.75  -.160280   .162811   .0000000
+    1912.80  -.103200   .187700   .0000000
+    1912.85  -.078852   .172599   .0000000
+    1912.90  -.076719   .222193   .0000000
+    1912.95  -.018200   .178000   .0000000
+    1913.00  -.088918   .098053   .0000000
+    1913.05  -.043449   .115101   .0000000
+    1913.10  -.001323   .124168   .0000000
+    1913.15  -.021744   .057252   .0000000
+    1913.20   .011122   .015761   .0000000
+    1913.25  -.010477  -.071666   .0000000
+    1913.30   .032491   .003044   .0000000
+    1913.35   .048101  -.050706   .0000000
+    1913.40   .032669  -.039496   .0000000
+    1913.45   .008311  -.068348   .0000000
+    1913.50   .000027  -.047918   .0000000
+    1913.55  -.076685  -.083122   .0000000
+    1913.60  -.108057  -.085386   .0000000
+    1913.65  -.100400  -.040800   .0000000
+    1913.70  -.162152  -.081823   .0000000
+    1913.75  -.223157  -.030051   .0000000
+    1913.80  -.224000  -.002700   .0000000
+    1913.85  -.226344   .078679   .0000000
+    1913.90  -.200560   .102525   .0000000
+    1913.95  -.313300   .074600   .0000000
+    1914.00  -.203986   .155067   .0000000
+    1914.05  -.260937   .252070   .0000000
+    1914.10  -.152037   .221001   .0000000
+    1914.15  -.093945   .191653   .0000000
+    1914.20  -.063798   .184214   .0000000
+    1914.25  -.013635   .132013   .0000000
+    1914.30   .045383   .170364   .0000000
+    1914.35   .034013   .110450   .0000000
+    1914.40   .073793   .089719   .0000000
+    1914.45   .106389   .069624   .0000000
+    1914.50   .104207   .003118   .0000000
+    1914.55   .085502  -.025467   .0000000
+    1914.60   .049258  -.008534   .0000000
+    1914.65  -.013923  -.060487   .0000000
+    1914.70  -.046141  -.151237   .0000000
+    1914.75  -.094789  -.177467   .0000000
+    1914.80  -.140169  -.214589   .0000000
+    1914.85  -.220007  -.164939   .0000000
+    1914.90  -.271487  -.080598   .0000000
+    1914.95  -.197162  -.003731   .0000000
+    1915.00  -.365371   .018627   .0000000
+    1915.05  -.311390   .018527   .0000000
+    1915.10  -.363577   .127944   .0000000
+    1915.15  -.230546   .091634   .0000000
+    1915.20  -.285678   .254673   .0000000
+    1915.25  -.300793   .364102   .0000000
+    1915.30  -.145488   .374588   .0000000
+    1915.35  -.084157   .325899   .0000000
+    1915.40  -.008400   .253100   .0000000
+    1915.45   .086674   .275352   .0000000
+    1915.50   .081245   .210673   .0000000
+    1915.55   .121650   .162508   .0000000
+    1915.60   .169064  -.052355   .0000000
+    1915.65   .112084   .002862   .0000000
+    1915.70   .099188  -.061928   .0000000
+    1915.75   .093628  -.172293   .0000000
+    1915.80  -.031363  -.267297   .0000000
+    1915.85  -.050020  -.262266   .0000000
+    1915.90  -.047776  -.265495   .0000000
+    1915.95  -.135461  -.219164   .0000000
+    1916.00  -.250486  -.127502   .0000000
+    1916.05  -.339030  -.192532   .0000000
+    1916.10  -.414793  -.366168   .0000000
+    1916.15  -.341536  -.026629   .0000000
+    1916.20  -.344556   .102289   .0000000
+    1916.25  -.312204   .143646   .0000000
+    1916.30  -.283589   .181301   .0000000
+    1916.35  -.251093   .263902   .0000000
+    1916.40  -.158543   .396971   .0000000
+    1916.45  -.236712   .246063   .0000000
+    1916.50  -.049133   .295525   .0000000
+    1916.55  -.019000   .215800   .0000000
+    1916.60   .091660   .193570   .0000000
+    1916.65   .171184   .142932   .0000000
+    1916.70   .135500   .053900   .0000000
+    1916.75   .159276  -.060418   .0000000
+    1916.80   .195249  -.060384   .0000000
+    1916.85   .041662  -.606821   .0000000
+    1916.90   .012991  -.219566   .0000000
+    1916.95  -.003679  -.318930   .0000000
+    1917.00  -.095516  -.232917   .0000000
+    1917.05  -.151536  -.182785   .0000000
+    1917.10  -.182049  -.136279   .0000000
+    1917.15  -.292198  -.114514   .0000000
+    1917.20  -.293211  -.077170   .0000000
+    1917.25  -.310501  -.047076   .0000000
+    1917.30  -.262144   .028782   .0000000
+    1917.35  -.195616   .145893   .0000000
+    1917.40  -.216823   .172434   .0000000
+    1917.45  -.195552   .154519   .0000000
+    1917.50  -.114387   .252819   .0000000
+    1917.55  -.014913   .095478   .0000000
+    1917.60  -.032948   .203552   .0000000
+    1917.65  -.004274   .202191   .0000000
+    1917.70  -.029300   .187800   .0000000
+    1917.75   .047363   .077854   .0000000
+    1917.80   .027454   .011902   .0000000
+    1917.85   .086395   .016630   .0000000
+    1917.90   .011086   .026413   .0000000
+    1917.95   .061347  -.033647   .0000000
+    1918.00  -.045800  -.126500   .0000000
+    1918.05  -.063352  -.187119   .0000000
+    1918.10  -.140380  -.029766   .0000000
+    1918.15  -.139590  -.046948   .0000000
+    1918.20  -.186229  -.012003   .0000000
+    1918.25  -.197272  -.022847   .0000000
+    1918.30  -.162233   .009864   .0000000
+    1918.35  -.209522   .106965   .0000000
+    1918.40  -.183315   .111698   .0000000
+    1918.45  -.186120   .161230   .0000000
+    1918.50  -.206139   .170211   .0000000
+    1918.55  -.140500   .134700   .0000000
+    1918.60  -.075624   .126939   .0000000
+    1918.65  -.035250   .149125   .0000000
+    1918.70  -.038388   .139481   .0000000
+    1918.75   .005607   .126979   .0000000
+    1918.80  -.039489   .133454   .0000000
+    1918.85  -.047400   .170000   .0000000
+    1918.90  -.061884   .112716   .0000000
+    1918.95  -.059354   .062420   .0000000
+    1919.00  -.058158   .016625   .0000000
+    1919.05  -.045037   .121493   .0000000
+    1919.10  -.064165   .072740   .0000000
+    1919.15  -.046142   .055541   .0000000
+    1919.20  -.076649   .084834   .0000000
+    1919.25  -.032000   .101400   .0000000
+    1919.30  -.032764   .042454   .0000000
+    1919.35  -.034002   .057361   .0000000
+    1919.40  -.081513   .071678   .0000000
+    1919.45  -.024396   .011394   .0000000
+    1919.50  -.005435   .014449   .0000000
+    1919.55  -.036700  -.072300   .0000000
+    1919.60  -.054480  -.035798   .0000000
+    1919.65  -.109833  -.018115   .0000000
+    1919.70  -.180209  -.046368   .0000000
+    1919.75  -.144050   .048583   .0000000
+    1919.80  -.181892  -.009524   .0000000
+    1919.85  -.159213   .054630   .0000000
+    1919.90  -.092562  -.197751   .0000000
+    1919.95  -.186227   .107207   .0000000
+    1920.00  -.097388   .112723   .0000000
+    1920.05  -.145513   .244405   .0000000
+    1920.10  -.066010   .127964   .0000000
+    1920.15  -.108000   .125400   .0000000
+    1920.20  -.066646   .249459   .0000000
+    1920.25   .062692   .241400   .0000000
+    1920.30   .077897   .212694   .0000000
+    1920.35   .112620   .177084   .0000000
+    1920.40   .081000   .157700   .0000000
+    1920.45   .148386   .115656   .0000000
+    1920.50   .111770   .088776   .0000000
+    1920.55   .063562  -.046004   .0000000
+    1920.60   .129866   .027842   .0000000
+    1920.65   .091341  -.043051   .0000000
+    1920.70   .068767  -.053549   .0000000
+    1920.75  -.008467  -.089633   .0000000
+    1920.80  -.052510  -.063097   .0000000
+    1920.85  -.131312  -.127174   .0000000
+    1920.90  -.098074  -.069955   .0000000
+    1920.95  -.202848  -.093388   .0000000
+    1921.00  -.275100   .041200   .0000000
+    1921.05  -.199380   .005397   .0000000
+    1921.10  -.269861   .062960   .0000000
+    1921.15  -.315700   .186534   .0000000
+    1921.20  -.190287   .164991   .0000000
+    1921.25  -.119466   .139311   .0000000
+    1921.30  -.014599   .217462   .0000000
+    1921.35   .031054   .201362   .0000000
+    1921.40   .091820   .160909   .0000000
+    1921.45   .100985   .083825   .0000000
+    1921.50   .212445   .182524   .0000000
+    1921.55   .138182   .088243   .0000000
+    1921.60   .178414   .025800   .0000000
+    1921.65   .167323   .004838   .0000000
+    1921.70   .073545  -.078915   .0000000
+    1921.75   .127179  -.080673   .0000000
+    1921.80  -.002474  -.169272   .0000000
+    1921.85  -.007518  -.143864   .0000000
+    1921.90  -.098209   .106262   .0000000
+    1921.95  -.133071  -.095128   .0000000
+    1922.00  -.045524  -.029486   .0000000
+    1922.05  -.194756  -.097510   .0000000
+    1922.10  -.208934   .039567   .0000000
+    1922.15  -.210300   .137300   .0000000
+    1922.20  -.165744   .125734   .0000000
+    1922.25  -.162390   .134218   .0000000
+    1922.30  -.132697   .221570   .0000000
+    1922.35  -.090259   .277564   .0000000
+    1922.40  -.047480   .260568   .0000000
+    1922.45   .009070   .222538   .0000000
+    1922.50   .111622   .240501   .0000000
+    1922.55   .088770   .114259   .0000000
+    1922.60   .163154   .076991   .0000000
+    1922.65   .151317   .014994   .0000000
+    1922.70   .141800   .014900   .0000000
+    1922.75   .120772  -.019145   .0000000
+    1922.80   .083381  -.139651   .0000000
+    1922.85   .063654  -.088851   .0000000
+    1922.90   .041976   .015059   .0000000
+    1922.95  -.163179  -.120346   .0000000
+    1923.00  -.162345  -.088042   .0000000
+    1923.05  -.166986  -.055441   .0000000
+    1923.10  -.332673  -.032441   .0000000
+    1923.15  -.262008  -.033456   .0000000
+    1923.20  -.207748   .016212   .0000000
+    1923.25  -.274792   .140175   .0000000
+    1923.30  -.179152   .157417   .0000000
+    1923.35  -.176779   .129676   .0000000
+    1923.40  -.097364   .300984   .0000000
+    1923.45  -.024124   .317510   .0000000
+    1923.50  -.019994   .239535   .0000000
+    1923.55   .060132   .240230   .0000000
+    1923.60   .112367   .311274   .0000000
+    1923.65   .142183   .249476   .0000000
+    1923.70   .151780   .226170   .0000000
+    1923.75   .161990   .129040   .0000000
+    1923.80   .130175   .020789   .0000000
+    1923.85   .136144   .082803   .0000000
+    1923.90   .088243   .024731   .0000000
+    1923.95   .035504  -.012841   .0000000
+    1924.00  -.005804   .073064   .0000000
+    1924.05  -.068517   .011667   .0000000
+    1924.10  -.029063   .003840   .0000000
+    1924.15  -.149500  -.020500   .0000000
+    1924.20  -.151107   .038096   .0000000
+    1924.25  -.170714   .072246   .0000000
+    1924.30  -.127400   .135100   .0000000
+    1924.35  -.165261   .139194   .0000000
+    1924.40  -.187563   .107926   .0000000
+    1924.45  -.081980   .195088   .0000000
+    1924.50  -.075229   .183050   .0000000
+    1924.55  -.059435   .142566   .0000000
+    1924.60   .014627   .135909   .0000000
+    1924.65   .029893   .185564   .0000000
+    1924.70  -.002107   .154303   .0000000
+    1924.75   .041539   .113626   .0000000
+    1924.80   .032319   .000498   .0000000
+    1924.85  -.079291   .056224   .0000000
+    1924.90  -.006172   .025546   .0000000
+    1924.95   .035597   .085593   .0000000
+    1925.00  -.012995   .036963   .0000000
+    1925.05  -.056182  -.049412   .0000000
+    1925.10  -.103481  -.003581   .0000000
+    1925.15  -.107312  -.041495   .0000000
+    1925.20  -.141179  -.046236   .0000000
+    1925.25  -.102647   .016748   .0000000
+    1925.30  -.130539   .119861   .0000000
+    1925.35  -.066774   .097721   .0000000
+    1925.40  -.004013   .055231   .0000000
+    1925.45  -.066873   .032174   .0000000
+    1925.50  -.055672   .061909   .0000000
+    1925.55  -.070311   .114851   .0000000
+    1925.60   .017853   .118506   .0000000
+    1925.65  -.015743   .056794   .0000000
+    1925.70   .001485   .004726   .0000000
+    1925.75  -.005631   .015549   .0000000
+    1925.80   .001128   .013928   .0000000
+    1925.85  -.243256  -.060509   .0000000
+    1925.90  -.025734   .007049   .0000000
+    1925.95  -.041648  -.013321   .0000000
+    1926.00  -.199605  -.083663   .0000000
+    1926.05  -.163818  -.029853   .0000000
+    1926.10  -.073051  -.074540   .0000000
+    1926.15  -.177265  -.060285   .0000000
+    1926.20  -.230084  -.024826   .0000000
+    1926.25  -.173813   .058121   .0000000
+    1926.30  -.052708   .122825   .0000000
+    1926.35  -.106664   .067451   .0000000
+    1926.40  -.129567   .112402   .0000000
+    1926.45  -.076581   .132865   .0000000
+    1926.50  -.051765   .131885   .0000000
+    1926.55  -.033933   .119936   .0000000
+    1926.60  -.053049   .122331   .0000000
+    1926.65  -.021532   .117705   .0000000
+    1926.70   .018915   .156256   .0000000
+    1926.75  -.001894   .104146   .0000000
+    1926.80  -.075772   .076597   .0000000
+    1926.85  -.120294   .111799   .0000000
+    1926.90  -.050061   .130391   .0000000
+    1926.95  -.098525   .073404   .0000000
+    1927.00  -.058200   .056215   .0000000
+    1927.05  -.142988   .109762   .0000000
+    1927.10  -.032237   .116674   .0000000
+    1927.15  -.095191   .115885   .0000000
+    1927.20  -.059447   .084129   .0000000
+    1927.25  -.115876   .071429   .0000000
+    1927.30  -.052232   .049356   .0000000
+    1927.35  -.054137   .027885   .0000000
+    1927.40  -.013624   .120684   .0000000
+    1927.45   .095331   .074304   .0000000
+    1927.50   .015128   .128662   .0000000
+    1927.55  -.016024   .158240   .0000000
+    1927.60  -.031647   .047004   .0000000
+    1927.65  -.020014   .048718   .0000000
+    1927.70  -.004146   .054252   .0000000
+    1927.75  -.052691   .005745   .0000000
+    1927.80  -.052571  -.025327   .0000000
+    1927.85  -.093446  -.044573   .0000000
+    1927.90  -.185615   .036816   .0000000
+    1927.95  -.159711  -.002380   .0000000
+    1928.00  -.008822  -.065239   .0000000
+    1928.05  -.145700  -.017500   .0000000
+    1928.10  -.134670   .100011   .0000000
+    1928.15  -.142914   .014838   .0000000
+    1928.20  -.130658   .109191   .0000000
+    1928.25  -.071799   .135022   .0000000
+    1928.30  -.077913   .109713   .0000000
+    1928.35  -.084562   .184119   .0000000
+    1928.40  -.070452   .122462   .0000000
+    1928.45  -.071262   .128166   .0000000
+    1928.50  -.023166   .138252   .0000000
+    1928.55  -.049392   .114652   .0000000
+    1928.60  -.132084  -.134582   .0000000
+    1928.65   .020427   .100107   .0000000
+    1928.70  -.028438   .032299   .0000000
+    1928.75  -.110100   .107500   .0000000
+    1928.80  -.143376  -.000841   .0000000
+    1928.85  -.115036   .011216   .0000000
+    1928.90  -.110841   .085727   .0000000
+    1928.95  -.072093   .151032   .0000000
+    1929.00  -.160303   .044210   .0000000
+    1929.05  -.288649   .003539   .0000000
+    1929.10  -.100071   .109711   .0000000
+    1929.15  -.169363   .171496   .0000000
+    1929.20  -.126222   .140853   .0000000
+    1929.25  -.057249   .149535   .0000000
+    1929.30   .003629   .164681   .0000000
+    1929.35   .131595   .332923   .0000000
+    1929.40   .031158   .160059   .0000000
+    1929.45   .069220   .115295   .0000000
+    1929.50   .103978   .187112   .0000000
+    1929.55   .082883   .085168   .0000000
+    1929.60   .049832  -.000080   .0000000
+    1929.65   .073767   .013919   .0000000
+    1929.70   .084972   .064950   .0000000
+    1929.75  -.015329  -.028934   .0000000
+    1929.80  -.093999  -.073280   .0000000
+    1929.85  -.161299  -.061529   .0000000
+    1929.90  -.165908  -.084395   .0000000
+    1929.95  -.205862   .028014   .0000000
+    1930.00  -.214153  -.044059   .0000000
+    1930.05  -.215942   .054329   .0000000
+    1930.10  -.225480   .057826   .0000000
+    1930.15  -.206525   .096138   .0000000
+    1930.20  -.166814   .146704   .0000000
+    1930.25  -.130922   .224514   .0000000
+    1930.30  -.049593   .179473   .0000000
+    1930.35  -.125200   .154900   .0000000
+    1930.40   .006745   .237422   .0000000
+    1930.45   .017674   .198183   .0000000
+    1930.50   .035577   .132240   .0000000
+    1930.55   .081022   .126161   .0000000
+    1930.60   .098407   .114242   .0000000
+    1930.65   .074379  -.037760   .0000000
+    1930.70   .062912  -.022243   .0000000
+    1930.75   .028598   .019082   .0000000
+    1930.80  -.011225  -.081563   .0000000
+    1930.85  -.084804  -.009200   .0000000
+    1930.90  -.116025  -.003658   .0000000
+    1930.95  -.158405  -.031682   .0000000
+    1931.00  -.353309   .027867   .0000000
+    1931.05  -.277671   .046550   .0000000
+    1931.10  -.239000  -.015100   .0000000
+    1931.15  -.355078   .116611   .0000000
+    1931.20  -.226864   .167103   .0000000
+    1931.25  -.248657   .182523   .0000000
+    1931.30  -.150564   .238762   .0000000
+    1931.35  -.151393   .231228   .0000000
+    1931.40  -.039529   .281355   .0000000
+    1931.45   .024987   .296176   .0000000
+    1931.50   .039600   .242500   .0000000
+    1931.55   .074415   .182812   .0000000
+    1931.60   .098426   .094944   .0000000
+    1931.65   .082462   .055652   .0000000
+    1931.70   .165785   .079323   .0000000
+    1931.75   .067878   .029704   .0000000
+    1931.80   .052973  -.106345   .0000000
+    1931.85  -.083590  -.105084   .0000000
+    1931.90  -.060868  -.054736   .0000000
+    1931.95  -.091079  -.143458   .0000000
+    1932.00  -.117202  -.090917   .0000000
+    1932.05  -.196529  -.057717   .0000000
+    1932.10  -.166200  -.015500   .0000000
+    1932.15  -.312357   .014781   .0000000
+    1932.20  -.324819   .020690   .0000000
+    1932.25  -.229236   .137146   .0000000
+    1932.30  -.199450   .181143   .0000000
+    1932.35  -.169007   .207207   .0000000
+    1932.40  -.138350   .219864   .0000000
+    1932.45  -.071670   .214482   .0000000
+    1932.50  -.075142   .230743   .0000000
+    1932.55  -.052070   .236227   .0000000
+    1932.60   .026338   .224720   .0000000
+    1932.65   .071800   .178200   .0000000
+    1932.70   .070092   .209808   .0000000
+    1932.75   .087369   .059518   .0000000
+    1932.80   .122666   .122560   .0000000
+    1932.85   .085699   .068358   .0000000
+    1932.90   .094388   .033874   .0000000
+    1932.95   .097006   .030486   .0000000
+    1933.00  -.073655  -.011865   .0000000
+    1933.05  -.058596   .014472   .0000000
+    1933.10  -.188030  -.012586   .0000000
+    1933.15  -.173476   .013624   .0000000
+    1933.20  -.221474   .048831   .0000000
+    1933.25  -.211408   .107715   .0000000
+    1933.30  -.186714   .112536   .0000000
+    1933.35  -.179116   .019117   .0000000
+    1933.40  -.132931   .166511   .0000000
+    1933.45  -.129933   .222792   .0000000
+    1933.50  -.065800   .247600   .0000000
+    1933.55  -.061257   .170077   .0000000
+    1933.60  -.092890   .168864   .0000000
+    1933.65  -.011311   .114462   .0000000
+    1933.70  -.041560   .155440   .0000000
+    1933.75  -.007268   .135250   .0000000
+    1933.80  -.048100   .064100   .0000000
+    1933.85  -.030166   .051458   .0000000
+    1933.90  -.059454   .050490   .0000000
+    1933.95  -.000334  -.055485   .0000000
+    1934.00  -.047994   .160539   .0000000
+    1934.05  -.128330   .132957   .0000000
+    1934.10  -.104712  -.032479   .0000000
+    1934.15  -.123185   .026628   .0000000
+    1934.20  -.156884   .046650   .0000000
+    1934.25  -.146878   .039678   .0000000
+    1934.30  -.212952   .066280   .0000000
+    1934.35  -.109680   .080647   .0000000
+    1934.40  -.064907   .218438   .0000000
+    1934.45  -.115818   .182058   .0000000
+    1934.50  -.093600   .146400   .0000000
+    1934.55  -.026049   .206821   .0000000
+    1934.60  -.036375   .197949   .0000000
+    1934.65  -.018200   .130900   .0000000
+    1934.70   .003251   .176660   .0000000
+    1934.75  -.019469   .192448   .0000000
+    1934.80   .016400   .142200   .0000000
+    1934.85   .017784   .028679   .0000000
+    1934.90  -.064537   .102035   .0000000
+    1934.95  -.095694   .072497   .0000000
+    1935.00  -.053671   .063917   .0000000
+    1935.05  -.169016   .020530   .0000000
+    1935.10   .005900   .019800   .0000000
+    1935.15  -.121309   .043629   .0000000
+    1935.20  -.067132   .059209   .0000000
+    1935.25  -.065954   .062433   .0000000
+    1935.30  -.066468   .107258   .0000000
+    1935.35  -.021635   .104029   .0000000
+    1935.40  -.033804   .063816   .0000000
+    1935.45  -.056658   .141422   .0000000
+    1935.50  -.052090   .108980   .0000000
+    1935.55  -.177790  -.002912   .0000000
+    1935.60  -.039043   .085087   .0000000
+    1935.65  -.133855   .062467   .0000000
+    1935.70  -.005002   .093252   .0000000
+    1935.75  -.055390   .041687   .0000000
+    1935.80  -.109561   .035449   .0000000
+    1935.85  -.173680   .091852   .0000000
+    1935.90  -.136077   .056437   .0000000
+    1935.95  -.015578   .047611   .0000000
+    1936.00   .023251   .090679   .0000000
+    1936.05  -.146877   .108152   .0000000
+    1936.10  -.047500   .098500   .0000000
+    1936.15  -.125964   .209295   .0000000
+    1936.20  -.159573   .182595   .0000000
+    1936.25  -.106700   .188100   .0000000
+    1936.30  -.080483   .175745   .0000000
+    1936.35  -.093917   .159713   .0000000
+    1936.40  -.037416   .107419   .0000000
+    1936.45   .060450   .167046   .0000000
+    1936.50  -.013617   .143961   .0000000
+    1936.55  -.000451   .115066   .0000000
+    1936.60  -.004315   .072471   .0000000
+    1936.65  -.043164   .033288   .0000000
+    1936.70  -.018826   .032928   .0000000
+    1936.75  -.074570  -.007560   .0000000
+    1936.80  -.106024  -.004717   .0000000
+    1936.85  -.100771  -.011306   .0000000
+    1936.90  -.188334   .029368   .0000000
+    1936.95  -.173300  -.047400   .0000000
+    1937.00  -.140145   .085152   .0000000
+    1937.05  -.193481   .094688   .0000000
+    1937.10  -.158811   .074182   .0000000
+    1937.15  -.245489   .179964   .0000000
+    1937.20  -.176313   .131564   .0000000
+    1937.25  -.121499   .208926   .0000000
+    1937.30  -.116696   .187814   .0000000
+    1937.35  -.040102   .222305   .0000000
+    1937.40  -.088573   .195445   .0000000
+    1937.45   .035320   .209660   .0000000
+    1937.50   .073386   .231432   .0000000
+    1937.55   .069100   .137800   .0000000
+    1937.60   .090711   .121711   .0000000
+    1937.65   .056677   .054539   .0000000
+    1937.70   .047138   .041472   .0000000
+    1937.75  -.015251  -.021479   .0000000
+    1937.80  -.008680  -.029054   .0000000
+    1937.85  -.107027  -.071074   .0000000
+    1937.90  -.105060  -.016349   .0000000
+    1937.95  -.217410  -.006067   .0000000
+    1938.00  -.204894   .021733   .0000000
+    1938.05  -.303156   .013057   .0000000
+    1938.10  -.147755   .071361   .0000000
+    1938.15  -.221442   .102093   .0000000
+    1938.20  -.226757   .130364   .0000000
+    1938.25  -.171954   .165869   .0000000
+    1938.30  -.138432   .225318   .0000000
+    1938.35  -.116911   .287363   .0000000
+    1938.40  -.046436   .227821   .0000000
+    1938.45  -.080914   .286589   .0000000
+    1938.50   .111257   .295958   .0000000
+    1938.55   .109700   .236000   .0000000
+    1938.60   .174186   .248989   .0000000
+    1938.65   .172035   .065415   .0000000
+    1938.70   .075919   .117887   .0000000
+    1938.75   .167309   .023607   .0000000
+    1938.80   .026111  -.003055   .0000000
+    1938.85  -.037869  -.061382   .0000000
+    1938.90  -.052264  -.072478   .0000000
+    1938.95  -.134539   .030821   .0000000
+    1939.00  -.301769   .106206   .0000000
+    1939.05  -.116858  -.001150   .0000000
+    1939.10  -.213896   .044637   .0000000
+    1939.15  -.161300   .101800   .0000000
+    1939.20  -.181054   .143917   .0000000
+    1939.25  -.192526   .184454   .0000000
+    1939.30  -.119371   .187626   .0000000
+    1939.35  -.079336   .224723   .0000000
+    1939.40  -.087263   .216206   .0000000
+    1939.45  -.044976   .211200   .0000000
+    1939.50   .023086   .214921   .0000000
+    1939.55   .072500   .233900   .0000000
+    1939.60   .118411   .224190   .0000000
+    1939.65   .146657   .195121   .0000000
+    1939.70   .095496   .180767   .0000000
+    1939.75   .089672   .076885   .0000000
+    1939.80   .069378   .045780   .0000000
+    1939.85   .042361   .018571   .0000000
+    1939.90   .005289   .055015   .0000000
+    1939.95  -.058344   .043141   .0000000
+    1940.00   .027411  -.055656   .0000000
+    1940.05  -.148565  -.007660   .0000000
+    1940.10  -.249170  -.018138   .0000000
+    1940.15  -.210741   .047170   .0000000
+    1940.20  -.226589   .078515   .0000000
+    1940.25  -.290100   .142200   .0000000
+    1940.30  -.223492   .078291   .0000000
+    1940.35  -.135189   .151824   .0000000
+    1940.40  -.175712   .271518   .0000000
+    1940.45  -.063144   .235042   .0000000
+    1940.50  -.029661   .260179   .0000000
+    1940.55   .019816   .250937   .0000000
+    1940.60   .162656   .241704   .0000000
+    1940.65   .098439   .147379   .0000000
+    1940.70   .065800   .175200   .0000000
+    1940.75   .125165   .119102   .0000000
+    1940.80   .070275   .085726   .0000000
+    1940.85   .053300   .043221   .0000000
+    1940.90   .004300  -.026993   .0000000
+    1940.95  -.049213   .034742   .0000000
+    1941.00   .033843   .015616   .0000000
+    1941.05   .033262  -.034927   .0000000
+    1941.10  -.043717   .028212   .0000000
+    1941.15  -.000032   .034220   .0000000
+    1941.20   .008262   .025372   .0000000
+    1941.25  -.118927   .084292   .0000000
+    1941.30  -.183857   .100975   .0000000
+    1941.35  -.159123   .204194   .0000000
+    1941.40  -.088480   .133512   .0000000
+    1941.45  -.092443   .191571   .0000000
+    1941.50  -.062260   .120954   .0000000
+    1941.55  -.073372   .253085   .0000000
+    1941.60   .012678   .219220   .0000000
+    1941.65  -.041165   .167041   .0000000
+    1941.70  -.086224   .093311   .0000000
+    1941.75   .001683   .150415   .0000000
+    1941.80   .068909   .186888   .0000000
+    1941.85  -.028851   .102187   .0000000
+    1941.90  -.020115   .119301   .0000000
+    1941.95   .145863   .081312   .0000000
+    1942.00  -.029700   .145400   .0000000
+    1942.05  -.086609   .107756   .0000000
+    1942.10   .034025   .019905   .0000000
+    1942.15  -.065983   .120029   .0000000
+    1942.20  -.026845   .031907   .0000000
+    1942.25  -.066569   .031627   .0000000
+    1942.30  -.008392   .098245   .0000000
+    1942.35  -.012154   .089180   .0000000
+    1942.40  -.068264   .122550   .0000000
+    1942.45  -.064544   .139302   .0000000
+    1942.50  -.032732   .122930   .0000000
+    1942.55  -.007371   .174390   .0000000
+    1942.60  -.089026   .117492   .0000000
+    1942.65  -.075180   .095255   .0000000
+    1942.70  -.036158   .121535   .0000000
+    1942.75  -.075817   .122674   .0000000
+    1942.80  -.089165   .085346   .0000000
+    1942.85  -.152931   .083401   .0000000
+    1942.90  -.103187   .103300   .0000000
+    1942.95  -.039915   .183470   .0000000
+    1943.00  -.090405   .234551   .0000000
+    1943.05  -.093652   .180949   .0000000
+    1943.10  -.061971   .090993   .0000000
+    1943.15  -.080573   .145031   .0000000
+    1943.20  -.051329   .138129   .0000000
+    1943.25   .001923   .184841   .0000000
+    1943.30  -.019745   .090795   .0000000
+    1943.35   .035917   .105605   .0000000
+    1943.40   .078661   .117427   .0000000
+    1943.45   .033384   .108682   .0000000
+    1943.50   .105491   .061063   .0000000
+    1943.55  -.047847  -.001805   .0000000
+    1943.60  -.036338   .050187   .0000000
+    1943.65   .022793   .034134   .0000000
+    1943.70   .070899   .024180   .0000000
+    1943.75   .004438   .011224   .0000000
+    1943.80  -.122806   .001491   .0000000
+    1943.85  -.144327   .028604   .0000000
+    1943.90  -.120953   .074676   .0000000
+    1943.95  -.253705   .095567   .0000000
+    1944.00  -.188535   .058157   .0000000
+    1944.05  -.213170   .082626   .0000000
+    1944.10  -.133388   .103606   .0000000
+    1944.15  -.243714   .045296   .0000000
+    1944.20  -.280687   .123924   .0000000
+    1944.25  -.099857   .132270   .0000000
+    1944.30  -.102089   .098582   .0000000
+    1944.35   .034173   .068935   .0000000
+    1944.40   .052475   .180058   .0000000
+    1944.45   .204300   .170300   .0000000
+    1944.50   .174930   .065429   .0000000
+    1944.55   .236527   .061957   .0000000
+    1944.60   .208915  -.039275   .0000000
+    1944.65   .171265  -.034213   .0000000
+    1944.70   .158830  -.127515   .0000000
+    1944.75  -.041184  -.081574   .0000000
+    1944.80  -.054199  -.141045   .0000000
+    1944.85  -.122864  -.138640   .0000000
+    1944.90  -.173922  -.079180   .0000000
+    1944.95  -.266129  -.029277   .0000000
+    1945.00  -.117527   .046084   .0000000
+    1945.05  -.172366   .076642   .0000000
+    1945.10  -.218168   .119657   .0000000
+    1945.15  -.269380   .084980   .0000000
+    1945.20  -.105476   .185324   .0000000
+    1945.25  -.252149   .252063   .0000000
+    1945.30  -.119100   .283700   .0000000
+    1945.35  -.098829   .296275   .0000000
+    1945.40   .041205   .299528   .0000000
+    1945.45   .070100   .328900   .0000000
+    1945.50   .161286   .243704   .0000000
+    1945.55   .111735   .157891   .0000000
+    1945.60   .279930   .129955   .0000000
+    1945.65   .210791   .086270   .0000000
+    1945.70   .167958  -.034212   .0000000
+    1945.75   .387534  -.060857   .0000000
+    1945.80   .203824  -.175689   .0000000
+    1945.85  -.009562  -.200723   .0000000
+    1945.90   .082043  -.254725   .0000000
+    1945.95  -.167775   .011828   .0000000
+    1946.00  -.105894  -.143593   .0000000
+    1946.05  -.238800  -.143600   .0000000
+    1946.10  -.161621  -.086524   .0000000
+    1946.15  -.292120  -.032154   .0000000
+    1946.20  -.369539   .005399   .0000000
+    1946.25  -.243748   .106804   .0000000
+    1946.30  -.260700   .154700   .0000000
+    1946.35  -.227834   .263600   .0000000
+    1946.40  -.105890   .285597   .0000000
+    1946.45  -.219288   .379684   .0000000
+    1946.50  -.063112   .324947   .0000000
+    1946.55   .056826   .295929   .0000000
+    1946.60   .082673   .302031   .0000000
+    1946.65   .134672   .242569   .0000000
+    1946.70   .188918   .179805   .0000000
+    1946.75   .230337   .153795   .0000000
+    1946.80   .230653   .126700   .0000000
+    1946.85   .324003  -.014854   .0000000
+    1946.90   .083430  -.030662   .0000000
+    1946.95   .071411  -.089697   .0000000
+    1947.00   .033741  -.095143   .0000000
+    1947.05  -.003804  -.062704   .0000000
+    1947.10  -.105253  -.159077   .0000000
+    1947.15  -.140851  -.129656   .0000000
+    1947.20  -.217901  -.081483   .0000000
+    1947.25  -.204585  -.117897   .0000000
+    1947.30  -.260050   .044441   .0000000
+    1947.35  -.358491   .174358   .0000000
+    1947.40  -.202905   .152120   .0000000
+    1947.45  -.254945   .153196   .0000000
+    1947.50  -.137802   .288460   .0000000
+    1947.55  -.094877   .287150   .0000000
+    1947.60   .023089   .335301   .0000000
+    1947.65   .060945   .357002   .0000000
+    1947.70   .113078   .313539   .0000000
+    1947.75   .120020   .273848   .0000000
+    1947.80   .175924   .294753   .0000000
+    1947.85   .206992   .222458   .0000000
+    1947.90   .140099   .174866   .0000000
+    1947.95   .157648   .156590   .0000000
+    1948.00   .225955   .143369   .0000000
+    1948.05   .157129   .071959   .0000000
+    1948.10   .150055   .021583   .0000000
+    1948.15   .171585  -.019271   .0000000
+    1948.20   .145400  -.041700   .0000000
+    1948.25   .147680  -.064178   .0000000
+    1948.30   .053983  -.075038   .0000000
+    1948.35  -.045837  -.072956   .0000000
+    1948.40  -.091431  -.067958   .0000000
+    1948.45  -.076060   .010010   .0000000
+    1948.50  -.106057   .014185   .0000000
+    1948.55  -.097516   .015430   .0000000
+    1948.60  -.130026   .063326   .0000000
+    1948.65  -.136613   .110269   .0000000
+    1948.70  -.236212   .081015   .0000000
+    1948.75  -.122022   .165015   .0000000
+    1948.80  -.082996   .181422   .0000000
+    1948.85  -.102718   .194496   .0000000
+    1948.90  -.056364   .288203   .0000000
+    1948.95  -.060517   .337067   .0000000
+    1949.00  -.038708   .272547   .0000000
+    1949.05   .050766   .309560   .0000000
+    1949.10  -.036412   .244629   .0000000
+    1949.15   .092035   .269182   .0000000
+    1949.20   .117000   .151400   .0000000
+    1949.25   .167243   .119693   .0000000
+    1949.30   .167879   .072692   .0000000
+    1949.35   .134722   .072089   .0000000
+    1949.40   .145230   .001256   .0000000
+    1949.45   .089326  -.093079   .0000000
+    1949.50   .154408  -.078539   .0000000
+    1949.55   .073064  -.060780   .0000000
+    1949.60   .043289  -.033614   .0000000
+    1949.65  -.013262  -.122149   .0000000
+    1949.70  -.164254  -.145566   .0000000
+    1949.75  -.163827  -.040926   .0000000
+    1949.80  -.236686  -.074967   .0000000
+    1949.85  -.237557   .040887   .0000000
+    1949.90  -.224455   .063927   .0000000
+    1949.95  -.290753   .157252   .0000000
+    1950.00  -.220930   .287191   .0000000
+    1950.05  -.222249   .248856   .0000000
+    1950.10  -.144425   .335072   .0000000
+    1950.15  -.061597   .365805   .0000000
+    1950.20   .023935   .338761   .0000000
+    1950.25   .046105   .332438   .0000000
+    1950.30   .127597   .297890   .0000000
+    1950.35   .258100   .317900   .0000000
+    1950.40   .238376   .209297   .0000000
+    1950.45   .300481   .140257   .0000000
+    1950.50   .287564   .015981   .0000000
+    1950.55   .286892   .093660   .0000000
+    1950.60   .270451  -.079337   .0000000
+    1950.65   .258830  -.098373   .0000000
+    1950.70   .116078  -.227489   .0000000
+    1950.75  -.010608  -.232154   .0000000
+    1950.80  -.087101  -.278552   .0000000
+    1950.85  -.183732  -.306109   .0000000
+    1950.90  -.306855  -.243256   .0000000
+    1950.95  -.321363  -.117027   .0000000
+    1951.00  -.365022   .014938   .0000000
+    1951.05  -.304225   .001015   .0000000
+    1951.10  -.369566   .099280   .0000000
+    1951.15  -.378609   .229045   .0000000
+    1951.20  -.253183   .324399   .0000000
+    1951.25  -.183608   .395804   .0000000
+    1951.30  -.113043   .407480   .0000000
+    1951.35   .025400   .357400   .0000000
+    1951.40   .169217   .366203   .0000000
+    1951.45   .251730   .336817   .0000000
+    1951.50   .268771   .266485   .0000000
+    1951.55   .325834   .218909   .0000000
+    1951.60   .416116   .097318   .0000000
+    1951.65   .369300   .007200   .0000000
+    1951.70   .311161  -.128485   .0000000
+    1951.75   .291955  -.216643   .0000000
+    1951.80   .143989  -.282893   .0000000
+    1951.85   .078168  -.298582   .0000000
+    1951.90  -.072498  -.293768   .0000000
+    1951.95  -.121266  -.283286   .0000000
+    1952.00  -.228941  -.289334   .0000000
+    1952.05  -.384844  -.280973   .0000000
+    1952.10  -.425432  -.085033   .0000000
+    1952.15  -.415187   .007147   .0000000
+    1952.20  -.438050   .104950   .0000000
+    1952.25  -.373937   .199595   .0000000
+    1952.30  -.214791   .330880   .0000000
+    1952.35  -.237011   .436678   .0000000
+    1952.40  -.206498   .424479   .0000000
+    1952.45  -.114247   .462331   .0000000
+    1952.50   .053909   .452330   .0000000
+    1952.55   .152162   .415113   .0000000
+    1952.60   .302914   .389455   .0000000
+    1952.65   .303583   .272217   .0000000
+    1952.70   .379665   .235664   .0000000
+    1952.75   .284255   .115197   .0000000
+    1952.80   .290673   .004058   .0000000
+    1952.85   .273678  -.093103   .0000000
+    1952.90   .201204  -.160920   .0000000
+    1952.95   .092473  -.181244   .0000000
+    1953.00   .123811  -.231433   .0000000
+    1953.05  -.059768  -.287803   .0000000
+    1953.10  -.099969  -.181194   .0000000
+    1953.15  -.117820  -.081862   .0000000
+    1953.20  -.288724  -.112507   .0000000
+    1953.25  -.256646  -.080086   .0000000
+    1953.30  -.275672   .047975   .0000000
+    1953.35  -.343300   .172800   .0000000
+    1953.40  -.325734   .244282   .0000000
+    1953.45  -.275838   .294124   .0000000
+    1953.50  -.079095   .448538   .0000000
+    1953.55  -.029260   .528535   .0000000
+    1953.60   .021387   .421200   .0000000
+    1953.65   .022300   .491500   .0000000
+    1953.70   .219443   .448367   .0000000
+    1953.75   .204160   .288329   .0000000
+    1953.80   .197400   .214300   .0000000
+    1953.85   .224082   .155717   .0000000
+    1953.90   .236336   .022065   .0000000
+    1953.95   .184200   .032600   .0000000
+    1954.00   .136603  -.090735   .0000000
+    1954.05   .015320  -.126354   .0000000
+    1954.10   .036575  -.126953   .0000000
+    1954.15  -.024887  -.150786   .0000000
+    1954.20  -.154021  -.147087   .0000000
+    1954.25  -.164556  -.108061   .0000000
+    1954.30  -.195623  -.112539   .0000000
+    1954.35  -.239513  -.079926   .0000000
+    1954.40  -.212137   .053878   .0000000
+    1954.45  -.133960   .116843   .0000000
+    1954.50  -.215416   .144317   .0000000
+    1954.55  -.127059   .218349   .0000000
+    1954.60  -.161882   .209542   .0000000
+    1954.65   .022753   .272072   .0000000
+    1954.70  -.093222   .296413   .0000000
+    1954.75  -.075965   .339411   .0000000
+    1954.80   .010000   .310600   .0000000
+    1954.85  -.019012   .279865   .0000000
+    1954.90  -.029023   .206222   .0000000
+    1954.95   .099499   .204533   .0000000
+    1955.00   .017291   .175152   .0000000
+    1955.05   .124344   .144779   .0000000
+    1955.10   .029988   .049576   .0000000
+    1955.15   .124568   .140522   .0000000
+    1955.20   .158988   .106674   .0000000
+    1955.25   .105321   .083753   .0000000
+    1955.30   .046473  -.027556   .0000000
+    1955.35   .065044  -.038566   .0000000
+    1955.40   .041687  -.021509   .0000000
+    1955.45  -.001269  -.080686   .0000000
+    1955.50  -.055935  -.006263   .0000000
+    1955.55   .003124   .039639   .0000000
+    1955.60  -.109785   .034162   .0000000
+    1955.65  -.137337   .039769   .0000000
+    1955.70  -.226992   .043228   .0000000
+    1955.75  -.229553   .066146   .0000000
+    1955.80  -.219600   .137300   .0000000
+    1955.85  -.189281   .159204   .0000000
+    1955.90  -.219306   .167037   .0000000
+    1955.95  -.203131   .233918   .0000000
+    1956.00  -.070247   .341707   .0000000
+    1956.05  -.007398   .192673   .0000000
+    1956.10   .016713   .339190   .0000000
+    1956.15   .038798   .279099   .0000000
+    1956.20   .117409   .334384   .0000000
+    1956.25   .083759   .248766   .0000000
+    1956.30   .152189   .209354   .0000000
+    1956.35   .160798   .161261   .0000000
+    1956.40   .211912   .132122   .0000000
+    1956.45   .219468   .113755   .0000000
+    1956.50   .212688   .021181   .0000000
+    1956.55   .169132  -.055280   .0000000
+    1956.60   .146149   .000797   .0000000
+    1956.65   .059496  -.049301   .0000000
+    1956.70   .018377  -.044723   .0000000
+    1956.75  -.050507  -.037579   .0000000
+    1956.80  -.204692  -.059809   .0000000
+    1956.85  -.228535   .004844   .0000000
+    1956.90  -.318792   .068497   .0000000
+    1956.95  -.290530   .108736   .0000000
+    1957.00  -.401787   .175879   .0000000
+    1957.05  -.340710   .217146   .0000000
+    1957.10  -.222754   .314496   .0000000
+    1957.15  -.224552   .381610   .0000000
+    1957.20  -.194858   .441895   .0000000
+    1957.25  -.099300   .411100   .0000000
+    1957.30   .007920   .425095   .0000000
+    1957.35   .076323   .453030   .0000000
+    1957.40   .152477   .481943   .0000000
+    1957.45   .235240   .383132   .0000000
+    1957.50   .240076   .308449   .0000000
+    1957.55   .292684   .272059   .0000000
+    1957.60   .345486   .208463   .0000000
+    1957.65   .271110   .018347   .0000000
+    1957.70   .229000  -.058924   .0000000
+    1957.75   .126351  -.051070   .0000000
+    1957.80   .039747  -.126282   .0000000
+    1957.85  -.003182  -.164541   .0000000
+    1957.90  -.069900  -.130259   .0000000
+    1957.95  -.209601  -.084401   .0000000
+    1958.00  -.305232  -.027916   .0000000
+    1958.05  -.343994   .036549   .0000000
+    1958.10  -.333001   .173344   .0000000
+    1958.15  -.335927   .215384   .0000000
+    1958.20  -.305676   .288831   .0000000
+    1958.25  -.300800   .338700   .0000000
+    1958.30  -.179030   .409116   .0000000
+    1958.35  -.101308   .407552   .0000000
+    1958.40  -.041921   .434062   .0000000
+    1958.45   .051783   .422110   .0000000
+    1958.50   .098517   .451402   .0000000
+    1958.55   .180900   .370800   .0000000
+    1958.60   .203233   .334686   .0000000
+    1958.65   .303286   .248765   .0000000
+    1958.70   .276253   .146280   .0000000
+    1958.75   .267226   .075078   .0000000
+    1958.80   .266128   .119921   .0000000
+    1958.85   .213073  -.055607   .0000000
+    1958.90   .164238  -.060513   .0000000
+    1958.95   .101815  -.044255   .0000000
+    1959.00   .016105  -.129490   .0000000
+    1959.05  -.095165  -.054368   .0000000
+    1959.10  -.153168  -.068371   .0000000
+    1959.15  -.195475  -.058794   .0000000
+    1959.20  -.253927   .017351   .0000000
+    1959.25  -.238076   .061599   .0000000
+    1959.30  -.240657   .198641   .0000000
+    1959.35  -.252739   .262649   .0000000
+    1959.40  -.214144   .308577   .0000000
+    1959.45  -.142987   .396049   .0000000
+    1959.50  -.037927   .401546   .0000000
+    1959.55  -.034800   .382000   .0000000
+    1959.60   .106849   .415365   .0000000
+    1959.65   .129032   .368627   .0000000
+    1959.70   .175804   .336333   .0000000
+    1959.75   .222541   .303817   .0000000
+    1959.80   .203199   .215274   .0000000
+    1959.85   .202366   .197922   .0000000
+    1959.90   .175341   .085444   .0000000
+    1959.95   .132030   .058528   .0000000
+    1960.00   .008173   .006252   .0000000
+    1960.05  -.003037  -.014016   .0000000
+    1960.10  -.096783  -.064746   .0000000
+    1960.15  -.049029  -.015531   .0000000
+    1960.20  -.070352   .005059   .0000000
+    1960.25  -.093472  -.033430   .0000000
+    1960.30  -.144743   .036124   .0000000
+    1960.35  -.136289   .091137   .0000000
+    1960.40  -.185600   .139573   .0000000
+    1960.45  -.144215   .156992   .0000000
+    1960.50  -.093892   .234106   .0000000
+    1960.55  -.141900   .251100   .0000000
+    1960.60  -.082108   .224170   .0000000
+    1960.65  -.054888   .246897   .0000000
+    1960.70   .000500   .272000   .0000000
+    1960.75   .027616   .261292   .0000000
+    1960.80   .028359   .217569   .0000000
+    1960.85  -.026324   .268219   .0000000
+    1960.90   .045255   .178998   .0000000
+    1960.95   .018041   .148022   .0000000
+    1961.00  -.010002   .178091   .0000000
+    1961.05   .014227   .129318   .0000000
+    1961.10  -.034519   .135146   .0000000
+    1961.15   .020541   .071804   .0000000
+    1961.20  -.008860   .093978   .0000000
+    1961.25  -.009493   .077921   .0000000
+    1961.30  -.013247   .104033   .0000000
+    1961.35  -.011871   .106863   .0000000
+    1961.40  -.055595   .050930   .0000000
+    1961.45  -.006478   .093211   .0000000
+    1961.50  -.052932   .075634   .0000000
+    1961.55  -.008206   .085606   .0000000
+    1961.60  -.051487   .123137   .0000000
+    1961.65  -.017757   .095707   .0000000
+    1961.70  -.062010   .097662   .0000000
+    1961.75  -.081090   .089862   .0000000
+    1961.80  -.110423   .077764   .0000000
+    1961.85  -.090300   .114700   .0000000
+    1961.90  -.167482   .169747   .0000000
+    1961.95  -.142626   .162677   .0000000
+    1962.00  -.033900   .203700   .0376300
+    1962.05  -.050170   .211840   .0338900
+    1962.10  -.002320   .229940   .0290470
+    1962.15   .006920   .252420   .0240100
+    1962.20   .024920   .267420   .0164880
+    1962.25   .036710   .249550   .0102410
+    1962.30   .072420   .225380  -.0005960
+    1962.35   .094690   .208290  -.0104660
+    1962.40   .093250   .193210  -.0187080
+    1962.45   .107960   .129190  -.0156280
+    1962.50   .095310   .127660  -.0096470
+    1962.55   .086920   .113560   .0013710
+    1962.60   .069240   .063740   .0066930
+    1962.65   .055400   .049150   .0122100
+    1962.70   .008500   .041810   .0142490
+    1962.75  -.014150   .060290   .0105620
+    1962.80  -.066110   .050990   .0038340
+    1962.85  -.113040   .105830  -.0066870
+    1962.90  -.153970   .139440  -.0175860
+    1962.95  -.160030   .176030  -.0286510
+    1963.00  -.205590   .212120  -.0332190
+    1963.05  -.201720   .264370  -.0339840
+    1963.10  -.173000   .287920  -.0309280
+    1963.15  -.148670   .335970  -.0308550
+    1963.20  -.099870   .335960  -.0392730
+    1963.25  -.044310   .360350  -.0507330
+    1963.30   .021450   .354760  -.0615850
+    1963.35   .093210   .324570  -.0762480
+    1963.40   .152910   .306570  -.0852720
+    1963.45   .175600   .263720  -.0898040
+    1963.50   .230800   .226120  -.0911400
+    1963.55   .218840   .193180  -.0850800
+    1963.60   .207420   .115940  -.0800220
+    1963.65   .148670   .085350  -.0829150
+    1963.70   .096090   .028620  -.0876470
+    1963.75   .053710  -.010670  -.0974610
+    1963.80  -.017030  -.023980  -.1141360
+    1963.85  -.106000  -.008970  -.0370110
+    1963.90  -.162800   .001510  -.0481380
+    1963.95  -.172400   .042730  -.0669830
+    1964.00  -.225800   .073470  -.0808460
+    1964.05  -.277190   .142370  -.0959270
+    1964.10  -.316290   .213450  -.1133170
+    1964.15  -.278600   .281690  -.1248710
+    1964.20  -.246040   .323490  -.1403400
+    1964.25  -.179450   .390780  -.0597570
+    1964.30  -.106780   .417820  -.0730700
+    1964.35  -.051130   .465850  -.0918930
+    1964.40  -.000180   .454570  -.1099970
+    1964.45   .070820   .457390  -.1212000
+    1964.50   .122250   .410720  -.1147420
+    1964.55   .188300   .371690  -.1164510
+    1964.60   .233650   .317960  -.1142910
+    1964.65   .243950   .251720  -.1118720
+    1964.70   .228520   .159640  -.0165730
+    1964.75   .202930   .093010  -.0291840
+    1964.80   .163200   .037870  -.0476800
+    1964.85   .107390   .018400  -.0671060
+    1964.90   .042310  -.014260  -.0837400
+    1964.95  -.022710  -.019620  -.1003350
+    1965.00  -.089890  -.005080  -.0182700
+    1965.05  -.109340  -.011770  -.0248210
+    1965.10  -.187520   .079690  -.0413790
+    1965.15  -.220180   .108850  -.0595530
+    1965.20  -.239960   .170890   .0201840
+    1965.25  -.239880   .232370  -.0057010
+    1965.30  -.221390   .286720  -.0330600
+    1965.35  -.177010   .329310  -.0487050
+    1965.40  -.151550   .380270  -.0661190
+    1965.45  -.115410   .406270  -.0832370
+    1965.50  -.033960   .439390   .0111050
+    1965.55   .047390   .425360   .0060030
+    1965.60   .084440   .411480  -.0046230
+    1965.65   .105520   .371940  -.0087120
+    1965.70   .137420   .304360   .0758570
+    1965.75   .168630   .248710   .0544290
+    1965.80   .200590   .176560   .0353090
+    1965.85   .178810   .143930   .0119610
+    1965.90   .158060   .087030  -.0139660
+    1965.95   .115300   .054420  -.0327310
+    1966.00   .047900   .005530  -.0467430
+    1966.05   .003210   .018400  -.0442320
+    1966.10  -.020370   .017330  -.0397280
+    1966.15  -.092720   .042830  -.0398940
+    1966.20  -.126630   .060540  -.0393290
+    1966.25  -.126250   .087680  -.0396900
+    1966.30  -.167720   .130720  -.0463990
+    1966.35  -.161730   .172470  -.0516050
+    1966.40  -.151510   .196200  -.0495510
+    1966.45  -.128550   .234880  -.0432800
+    1966.50  -.124150   .306450  -.0321410
+    1966.55  -.081600   .310620  -.0125560
+    1966.60  -.055550   .328730   .0003880
+    1966.65  -.017090   .338450   .0095020
+    1966.70   .006590   .333040   .0161450
+    1966.75   .042120   .311320   .0146070
+    1966.80   .091960   .283830   .0121820
+    1966.85   .094580   .252760   .0098330
+    1966.90   .116210   .220110   .0051870
+    1966.95   .135490   .172910   .0058710
+    1967.00   .097100   .162300   .0124750
+    1967.05   .070010   .139910   .0184380
+    1967.10   .048010   .130910   .0211400
+    1967.15   .032320   .139020   .0229620
+    1967.20   .014320   .136220   .0194950
+    1967.25   .005330   .130830   .0167670
+    1967.30  -.008570   .144330   .0133100
+    1967.35  -.013670   .164530   .0065720
+    1967.40  -.008560   .148640   .0071750
+    1967.45   .003850   .168250   .0176880
+    1967.50  -.011850   .176050   .0301300
+    1967.55  -.008350   .193960   .0477730
+    1967.60  -.011740   .189260   .0663160
+    1967.65  -.001430   .186370   .0768980
+    1967.70  -.029530   .191370   .0890110
+    1967.75  -.033830   .184480   .0963740
+    1967.80  -.030620   .195580   .0971770
+    1967.85  -.035120   .205980   .0953500
+    1967.90  -.026910   .212290   .0952730
+    1967.95  -.026200   .222600   .0931660
+    1968.00  -.034000   .239700   .0951090
+    1968.05  -.005100   .237510   .0987210
+    1968.10  -.004790   .238810  -.0023360
+    1968.15  -.001680   .237720  -.0036230
+    1968.20   .030920   .241420  -.0012590
+    1968.25   .015230   .230330  -.0024360
+    1968.30   .046430   .242330  -.0107430
+    1968.35   .060630   .223740  -.0118800
+    1968.40   .057340   .203640  -.0136970
+    1968.45   .059250   .198750  -.0100140
+    1968.50   .068150   .173950   .0057390
+    1968.55   .067460   .166360   .0170720
+    1968.60   .052060   .142860   .0302750
+    1968.65   .027070   .135670   .0354390
+    1968.70   .005570   .135770   .0390020
+    1968.75  -.013830   .118780   .0406750
+    1968.80  -.042020   .106380   .0419680
+    1968.85  -.084920   .124390   .0356310
+    1968.90  -.139410   .147490   .0341150
+    1968.95  -.126810   .185200   .0350180
+    1969.00  -.139900   .214900   .0335710
+    1969.05  -.124100   .251100   .0372640
+    1969.10  -.106290   .262510   .0391280
+    1969.15  -.095880   .326120   .0309210
+    1969.20  -.079080   .337320   .0246540
+    1969.25  -.036380   .347630   .0124870
+    1969.30  -.000970   .351930   .0000710
+    1969.35   .055030   .361340  -.0043960
+    1969.40   .090640   .316240  -.0064830
+    1969.45   .125150   .295450  -.0097100
+    1969.50   .133450   .267750   .0040040
+    1969.55   .150150   .228760   .0133570
+    1969.60   .134960   .187660   .0232700
+    1969.65   .117370   .136570   .0362230
+    1969.70   .095770   .114170   .0343170
+    1969.75   .058680   .100680   .0285300
+    1969.80   .011380   .065480   .0246530
+    1969.85  -.011720   .063480   .0178860
+    1969.90  -.062210   .070390   .0119090
+    1969.95  -.122410   .082300   .0067420
+    1970.00  -.163200   .117800   .0047260
+    1970.05  -.200400   .175210  -.0043710
+    1970.10  -.217990   .213110  -.0072880
+    1970.15  -.167580   .287720  -.0178350
+    1970.20  -.155880   .325820  -.0272820
+    1970.25  -.140180   .357830  -.0373190
+    1970.30  -.092070   .388230  -.0515660
+    1970.35  -.036570   .394540  -.0614930
+    1970.40   .009940   .407740  -.0624500
+    1970.45   .077750   .394750  -.0622170
+    1970.50   .130150   .370950  -.0542940
+    1970.55   .166660   .330060  -.0435010
+    1970.60   .200960   .262860  -.0298880
+    1970.65   .205070   .222970  -.0204550
+    1970.70   .196270   .160070  -.0125620
+    1970.75   .178680   .101880  -.0144890
+    1970.80   .141580   .043980  -.0185570
+    1970.85   .064680   .026980  -.0256240
+    1970.90   .013790   .006190  -.0358210
+    1970.95  -.045910  -.008500  -.0395080
+    1971.00  -.094800   .014300  -.0386560
+    1971.05  -.145000   .063100  -.0423130
+    1971.10  -.193590   .108210  -.0417900
+    1971.15  -.226190   .164220  -.0385280
+    1971.20  -.248080   .221720  -.0447450
+    1971.25  -.221480   .298620  -.0573030
+    1971.30  -.200070   .353230  -.0652400
+    1971.35  -.187870   .384540  -.0779880
+    1971.40  -.131860   .428740  -.0875360
+    1971.45  -.046460   .458050  -.0888030
+    1971.50   .029850   .466050  -.0875110
+    1971.55   .104850   .444960  -.0828490
+    1971.60   .162960   .400160  -.0790560
+    1971.65   .211970   .361270  -.0778240
+    1971.70   .233970   .304470  -.0821020
+    1971.75   .225880   .218780  -.0877900
+    1971.80   .208880   .167780  -.1047780
+    1971.85   .181790   .101490  -.1220760
+    1971.90   .140590   .071290  -.1384440
+    1971.95   .084400   .039100  -.1490720
+    1972.00   .031820   .019710  -.0474900
+    1972.05  -.029350   .019540  -.1025340
+    1972.10  -.085000   .023390  -.1641870
+    1972.15  -.113320   .038780  -.2239540
+    1972.20  -.170800   .100130  -.2844970
+    1972.25  -.178190   .157660  -.3489940
+    1972.30  -.193440   .216340  -.4137270
+    1972.35  -.177900   .273960  -.4751870
+    1972.40  -.148990   .302730  -.5400640
+    1972.45  -.101340   .350600  -.5937930
+    1972.50  -.048730   .379110   .3591600
+    1972.55   .000850   .403050   .3124850
+    1972.60   .057740   .404590   .2662670
+    1972.65   .089870   .408890   .2208620
+    1972.70   .119360   .367470   .1685090
+    1972.75   .125150   .330830   .1107640
+    1972.80   .161790   .292310   .0507720
+    1972.85   .164080   .229730  -.0089650
+    1972.90   .154490   .213280  -.0670860
+    1972.95   .142830   .172430  -.1269170
+    1973.00   .123610   .125710   .8114390
+    1973.05   .091980   .093390   .7545430
+    1973.10   .055100   .086390   .6973530
+    1973.15   .024830   .089030   .6317400
+    1973.20  -.023270   .093100   .5731350
+    1973.25  -.050430   .105840   .5070570
+    1973.30  -.090950   .145940   .4422160
+    1973.35  -.107840   .174450   .3817300
+    1973.40  -.116560   .201930   .3252920
+    1973.45  -.109350   .245230   .2701480
+    1973.50  -.097490   .273170   .2259990
+    1973.55  -.074020   .300780   .1814520
+    1973.60  -.053250   .315260   .1350890
+    1973.65  -.014030   .319880   .0897480
+    1973.70   .014500   .323150   .0381470
+    1973.75   .034570   .333410  -.0166510
+    1973.80   .069270   .331530  -.0721010
+    1973.85   .082930   .288210  -.1313010
+    1973.90   .094550   .270630  -.1950090
+    1973.95   .105000   .265120  -.2487100
+    1974.00   .113200   .225230   .7002310
+    1974.05   .091980   .203370   .6520660
+    1974.10   .077870   .176520   .6063570
+    1974.15   .078890   .171530   .5537260
+    1974.20   .050750   .157750   .4983770
+    1974.25   .029950   .179730   .4438800
+    1974.30   .029220   .187280   .3871170
+    1974.35   .015470   .182320   .3220300
+    1974.40   .005080   .179910   .2706650
+    1974.45  -.016260   .187160   .2230120
+    1974.50   .019490   .195670   .1828640
+    1974.55   .022340   .210720   .1474170
+    1974.60   .019950   .212310   .1109470
+    1974.65   .016610   .209630   .0663730
+    1974.70   .010980   .202280   .0252920
+    1974.75   .003730   .216240  -.0251410
+    1974.80  -.012130   .232720  -.0802570
+    1974.85  -.024480   .240310  -.1325930
+    1974.90  -.033410   .254200  -.1905590
+    1974.95  -.043730   .267890  -.2441870
+    1975.00  -.050120   .270650   .7083150
+    1975.05  -.053700   .285590   .6585310
+    1975.10  -.030920   .306400   .6055510
+    1975.15  -.019500   .329540   .5525990
+    1975.20   .010660   .335300   .5013940
+    1975.25   .043890   .337490   .4422900
+    1975.30   .070800   .313520   .3887900
+    1975.35   .089170   .296380   .3321200
+    1975.40   .103620   .270190   .2824180
+    1975.45   .125630   .246550   .2386220
+    1975.50   .146030   .234320   .1972230
+    1975.55   .132900   .199120   .1637560
+    1975.60   .126320   .176400   .1307220
+    1975.65   .119740   .152660   .0878550
+    1975.70   .092300   .118640   .0444550
+    1975.75   .062280   .103450  -.0020730
+    1975.80   .020950   .098770  -.0586960
+    1975.85  -.041700   .103980  -.1161850
+    1975.90  -.072420   .130280  -.1711520
+    1975.95  -.127410   .157660  -.2229470
+    1976.00  -.144340   .193270   .7251490
+    1976.05  -.151500   .247180   .6775030
+    1976.10  -.156180   .289100   .6214200
+    1976.15  -.145290   .329230   .5693700
+    1976.20  -.117400   .367510   .5147140
+    1976.25  -.095400   .393190   .4538780
+    1976.30  -.041730   .425870   .3908040
+    1976.35  -.008800   .433170   .3343790
+    1976.40   .046660   .423870   .2739120
+    1976.45   .111730   .401030   .2245910
+    1976.50   .156480   .370970   .1856130
+    1976.55   .195270   .330200   .1405230
+    1976.60   .229060   .289950   .0972370
+    1976.65   .235790   .241180   .0569540
+    1976.70   .220780   .189190   .0056210
+    1976.75   .172600   .157950  -.0542780
+    1976.80   .159550   .117960  -.1129530
+    1976.85   .113500   .093390  -.1756720
+    1976.90   .053590   .071240  -.2292200
+    1976.95  -.004070   .065610  -.2824520
+    1977.00  -.068560   .069220   .6657090
+    1977.05  -.139290   .118540   .6143360
+    1977.10  -.188740   .156640   .5651410
+    1977.15  -.226790   .231150   .5121100
+    1977.20  -.228460   .290850   .4600880
+    1977.25  -.216780   .362450   .4021850
+    1977.30  -.174880   .414280   .3418380
+    1977.35  -.133880   .458560   .2827490
+    1977.40  -.071690   .489080   .2309290
+    1977.45   .012030   .504510   .1838870
+    1977.50   .082770   .495390   .1468180
+    1977.55   .149380   .454360   .1142770
+    1977.60   .210730   .410780   .0768320
+    1977.65   .249250   .351780   .0408590
+    1977.70   .269380   .292600  -.0085350
+    1977.75   .263020   .222970  -.0636710
+    1977.80   .243710   .151260  -.1196200
+    1977.85   .195430   .095930  -.1771710
+    1977.90   .133680   .061560  -.2363140
+    1977.95   .063460   .030340  -.2912280
+    1978.00  -.000350   .027050   .6495220
+    1978.05  -.067600   .036990   .5903240
+    1978.10  -.136660   .072860   .5357610
+    1978.15  -.182100   .105900   .4701360
+    1978.20  -.214500   .163140   .4061470
+    1978.25  -.236230   .234600   .3442840
+    1978.30  -.229900   .312160   .2835510
+    1978.35  -.200940   .379730   .2243820
+    1978.40  -.157910   .433860   .1677820
+    1978.45  -.110240   .468530   .1209930
+    1978.50  -.044260   .492280   .0799780
+    1978.55   .033760   .496900   .0461430
+    1978.60   .098530   .478150   .0128410
+    1978.65   .150640   .444140  -.0312900
+    1978.70   .194320   .408640  -.0754340
+    1978.75   .221790   .353150  -.1252120
+    1978.80   .234780   .290520  -.1826230
+    1978.85   .228930   .229200  -.2362770
+    1978.90   .196110   .176960  -.2927440
+    1978.95   .169350   .117020  -.3501350
+    1979.00   .140600   .085500   .5990550
+    1979.05   .098400   .059560   .5436940
+    1979.10   .023200   .064460   .4873690
+    1979.15  -.017580   .069020   .4372970
+    1979.20  -.067290   .087350   .3838980
+    1979.25  -.111680   .125490   .3253590
+    1979.30  -.137550   .174350   .2698590
+    1979.35  -.152140   .218350   .2124640
+    1979.40  -.158240   .263800   .1596610
+    1979.45  -.145410   .301690   .1196450
+    1979.50  -.120340   .348910   .0786440
+    1979.55  -.093020   .378590   .0405690
+    1979.60  -.032280   .404160   .0082610
+    1979.65   .013040   .420310  -.0308800
+    1979.70   .053770   .423000  -.0723390
+    1979.75   .087730   .410920  -.1151000
+    1979.80   .103920   .386840  -.1669670
+    1979.85   .133930   .357770  -.2160390
+    1979.90   .132630   .322640  -.2606420
+    1979.95   .135250   .285040  -.3086520
+    1980.00   .142150   .250260   .6449390
+    1980.05   .121150   .224530   .5994770
+    1980.10   .089390   .199240   .5548120
+    1980.15   .064250   .182700   .5085250
+    1980.20   .043590   .179240   .4666600
+    1980.25   .012160   .187460   .4165130
+    1980.30  -.020440   .201760   .3666940
+    1980.35  -.043480   .221870   .3219240
+    1980.40  -.052250   .240890   .2763230
+    1980.45  -.054760   .259160   .2387700
+    1980.50  -.051620   .282750   .2063630
+    1980.55  -.039350   .301970   .1755970
+    1980.60  -.035550   .314750   .1452760
+    1980.65  -.030090   .328120   .1151990
+    1980.70  -.030200   .337170   .0750790
+    1980.75  -.023160   .345640   .0300980
+    1980.80  -.012370   .358870  -.0127940
+    1980.85   .000830   .366600  -.0624580
+    1980.90   .022640   .373160  -.1078580
+    1980.95   .049120   .373030  -.1500100
+    1981.00   .070580   .360660  -.1953270
+    1981.05   .077000   .348400  -.2391430
+    1981.10   .089260   .329090  -.2776990
+    1981.15   .084840   .315780  -.3202690
+    1981.20   .090210   .304230  -.3727280
+    1981.25   .101630   .289720  -.4159950
+    1981.30   .096310   .268760  -.4685540
+    1981.35   .093750   .257220  -.5165520
+    1981.40   .090250   .241670  -.5587390
+    1981.45   .078570   .226280  -.6009320
+    1981.50   .068150   .210210   .3698510
+    1981.55   .059540   .193490   .3498320
+    1981.60   .033080   .184820   .3198500
+    1981.65   .004150   .185370   .2918900
+    1981.70  -.024140   .193490   .2653000
+    1981.75  -.060920   .209640   .2228820
+    1981.80  -.084890   .235550   .1804970
+    1981.85  -.104520   .264190   .1393580
+    1981.90  -.110340   .298730   .0957520
+    1981.95  -.112180   .336860   .0571520
+    1982.00  -.093080   .376820   .0184280
+    1982.05  -.056710   .406900  -.0233770
+    1982.10  -.029250   .429470  -.0576400
+    1982.15   .016930   .440390  -.0968960
+    1982.20   .062800   .438790  -.1429420
+    1982.25   .108360   .429570  -.1860770
+    1982.30   .144250   .410160  -.2324500
+    1982.35   .175760   .379360  -.2826500
+    1982.40   .202440   .335180  -.3212050
+    1982.45   .227390   .284220  -.3589540
+    1982.50   .225400   .235390   .6073090
+    1982.55   .211690   .183440   .5824430
+    1982.60   .188000   .139540   .5595280
+    1982.65   .147580   .100920   .5266190
+    1982.70   .090980   .077680   .4890550
+    1982.75   .028040   .068920   .4484150
+    1982.80  -.036070   .079650   .4039600
+    1982.85  -.092580   .099410   .3645380
+    1982.90  -.143280   .139280   .3204710
+    1982.95  -.184870   .194480   .2722880
+    1983.00  -.202510   .257960   .2276730
+    1983.05  -.208590   .319420   .1807080
+    1983.10  -.188080   .386630   .1215960
+    1983.15  -.166980   .446850   .0712980
+    1983.20  -.130670   .499770   .0173990
+    1983.25  -.060990   .541150  -.0393690
+    1983.30   .018010   .561080  -.0893990
+    1983.35   .089520   .551750  -.1353850
+    1983.40   .165160   .528540  -.1815520
+    1983.45   .220450   .481900  -.2193950
+    1983.50   .270130   .421220   .7475800
+    1983.55   .307330   .346400   .7215090
+    1983.60   .323430   .271320   .6952120
+    1983.65   .311990   .193620   .6642850
+    1983.70   .270820   .123360   .6298510
+    1983.75   .212870   .065270   .5983220
+    1983.80   .144260   .027540   .5583590
+    1983.85   .061990   .014950   .5132280
+    1983.90  -.016890   .026220   .4716860
+    1983.95  -.085210   .050470   .4337780
+    1984.00  -.133280   .091680   .3954610
+    1984.05  -.178600   .145720   .3663980
+    1984.10  -.217680   .203540   .3393920
+    1984.15  -.239790   .267220   .3071050
+    1984.20  -.240330   .342950   .2769000
+    1984.25  -.215180   .414620   .2386810
+    1984.30  -.165880   .478570   .2012160
+    1984.35  -.103940   .529520   .1686240
+    1984.40  -.036610   .557690   .1381370
+    1984.45   .043530   .559030   .1142480
+    1984.50   .118910   .544370   .0977110
+    1984.55   .192030   .505220   .0854250
+    1984.60   .256550   .452690   .0683640
+    1984.65   .294920   .386890   .0497870
+    1984.70   .308190   .317250   .0228220
+    1984.75   .311850   .246370  -.0075050
+    1984.80   .284570   .180700  -.0363910
+    1984.85   .247250   .123390  -.0715010
+    1984.90   .198900   .081750  -.1028830
+    1984.95   .127310   .041390  -.1301440
+    1985.00   .045080   .022560  -.1575460
+    1985.05  -.021710   .036290  -.1889130
+    1985.10  -.079030   .063220  -.2116370
+    1985.15  -.133690   .102890  -.2407380
+    1985.20  -.185320   .156740  -.2736890
+    1985.25  -.201050   .230230  -.3070830
+    1985.30  -.195870   .298580  -.3429910
+    1985.35  -.182010   .364520  -.3771130
+    1985.40  -.138460   .418650  -.4025590
+    1985.45  -.095300   .459340  -.4317500
+    1985.50  -.043950   .483270   .5478600
+    1985.55   .017740   .494700   .5395290
+    1985.60   .076740   .494160   .5251140
+    1985.65   .135950   .477470   .5115900
+    1985.70   .182620   .445550   .4948280
+    1985.75   .211380   .402010   .4660470
+    1985.80   .227170   .347600   .4338690
+    1985.85   .228420   .297330   .4018540
+    1985.90   .228310   .251090   .3668480
+    1985.95   .209470   .210230   .3364070
+    1986.00   .185940   .170580   .3132290
+    1986.05   .148620   .136920   .2869110
+    1986.10   .097820   .120120   .2595480
+    1986.15   .050650   .114890   .2343500
+    1986.20  -.004480   .120220   .2069080
+    1986.25  -.045110   .137800   .1831500
+    1986.30  -.074620   .174240   .1553600
+    1986.35  -.091050   .210930   .1220280
+    1986.40  -.103510   .248370   .0984900
+    1986.45  -.097870   .286570   .0863460
+    1986.50  -.071490   .325960   .0698390
+    1986.55  -.044780   .356680   .0591900
+    1986.60  -.017440   .376640   .0494220
+    1986.65   .010780   .391720   .0327720
+    1986.70   .039560   .398150   .0179060
+    1986.75   .061300   .393670  -.0068750
+    1986.80   .085600   .389850  -.0389540
+    1986.85   .108410   .379180  -.0658570
+    1986.90   .121680   .358470  -.0899120
+    1986.95   .139690   .333040  -.1163700
+    1987.00   .146260   .313070  -.1380760
+    1987.05   .139250   .286810  -.1601160
+    1987.10   .129080   .265690  -.1865420
+    1987.15   .122130   .247910  -.2129500
+    1987.20   .110320   .223500  -.2463650
+    1987.25   .094220   .212870  -.2807030
+    1987.30   .072280   .204670  -.3086560
+    1987.35   .053320   .200540  -.3362570
+    1987.40   .030170   .199490  -.3639160
+    1987.45   .015310   .199420  -.3832670
+    1987.50  -.006420   .206770  -.3985660
+    1987.55  -.025810   .218770  -.4124200
+    1987.60  -.031970   .234330  -.4193230
+    1987.65  -.037620   .254830  -.4346680
+    1987.70  -.043540   .272020  -.4584800
+    1987.75  -.055190   .296620  -.4825460
+    1987.80  -.063220   .318760  -.5129600
+    1987.85  -.060180   .341610  -.5455880
+    1987.90  -.056330   .371220  -.5748670
+    1987.95  -.049860   .395210  -.6043940
+    1988.00  -.023960   .412730   .3641980
+    1988.05   .004500   .424730   .3384500
+    1988.10   .047020   .432110   .3144130
+    1988.15   .067110   .430020   .2785320
+    1988.20   .105530   .427540   .2471970
+    1988.25   .133210   .406300   .2166860
+    1988.30   .150780   .378320   .1792750
+    1988.35   .171170   .354020   .1522840
+    1988.40   .176460   .321580   .1225530
+    1988.45   .165470   .287990   .0988100
+    1988.50   .169520   .251610   .0898640
+    1988.55   .162560   .216260   .0807490
+    1988.60   .140250   .179670   .0689520
+    1988.65   .106640   .154640   .0603010
+    1988.70   .066470   .136560   .0448510
+    1988.75   .009150   .129100   .0228930
+    1988.80  -.050020   .138100  -.0018930
+    1988.85  -.100790   .165460  -.0330640
+    1988.90  -.138410   .207940  -.0653100
+    1988.95  -.164740   .261170  -.0918720
+    1989.00  -.160800   .315200  -.1150310
+    1989.05  -.142800   .359530  -.1376110
+    1989.10  -.118060   .400480  -.1614360
+    1989.15  -.076130   .436720  -.1886810
+    1989.20  -.027240   .466260  -.2181740
+    1989.25   .029070   .480900  -.2452640
+    1989.30   .085860   .481670  -.2761340
+    1989.35   .127570   .470310  -.3109290
+    1989.40   .169220   .445260  -.3388540
+    1989.45   .204420   .412890  -.3680090
+    1989.50   .239210   .364510  -.3859960
+    1989.55   .259150   .312920  -.4009490
+    1989.60   .259400   .255620  -.4214040
+    1989.65   .250970   .197720  -.4424920
+    1989.70   .217420   .146080  -.4611150
+    1989.75   .165120   .105110  -.4903590
+    1989.80   .098020   .083150  -.5228010
+    1989.85   .031480   .074730  -.5592470
+    1989.90  -.036820   .087780  -.6014820
+    1989.95  -.090410   .118340  -.6390910
+    1990.00  -.132820   .163800   .3294770
+    1990.05  -.165870   .215080   .2971590
+    1990.10  -.202780   .276390   .2614270
+    1990.15  -.201680   .344430   .2205110
+    1990.20  -.185180   .413230   .1791940
+    1990.25  -.153910   .471710   .1351550
+    1990.30  -.101550   .524360   .0948910
+    1990.35  -.049070   .556830   .0554040
+    1990.40   .025280   .572830   .0201240
+    1990.45   .096160   .568570  -.0096640
+    1990.50   .166980   .541670  -.0403750
+    1990.55   .230520   .499990  -.0614930
+    1990.60   .276540   .439320  -.0830990
+    1990.65   .306230   .379690  -.1154370
+    1990.70   .312300   .309110  -.1458280
+    1990.75   .295990   .241750  -.1816860
+    1990.80   .258290   .178550  -.2226650
+    1990.85   .214630   .130690  -.2630650
+    1990.90   .158460   .095450  -.3023270
+    1990.95   .092590   .076290  -.3458130
+    1991.00   .023070   .070420   .6189660
+    1991.05  -.040210   .085850   .5788470
+    1991.10  -.104560   .109710   .5375110
+    1991.15  -.159350   .156090   .4982140
+    1991.20  -.193710   .215880   .4563180
+    1991.25  -.218250   .286330   .4101900
+    1991.30  -.211540   .359670   .3695240
+    1991.35  -.196100   .427740   .3269160
+    1991.40  -.148030   .487300   .2852580
+    1991.45  -.087780   .535430   .2509990
+    1991.50  -.027600   .563210   .2244370
+    1991.55   .049470   .572690   .1994110
+    1991.60   .118890   .560660   .1792000
+    1991.65   .172940   .527310   .1523860
+    1991.70   .218130   .487510   .1145380
+    1991.75   .251390   .434860   .0781450
+    1991.80   .262130   .372840   .0419620
+    1991.85   .263160   .317840   .0002900
+    1991.90   .247290   .263630  -.0397540
+    1991.95   .217400   .209210  -.0833930
+    1992.00   .183430   .168250  -.1253090
+    1992.05   .132860   .139720  -.1664230
+    1992.10   .083410   .121340  -.2133580
+    1992.15   .026850   .116920  -.2592480
+    1992.20  -.034650   .126400  -.3037880
+    1992.25  -.082680   .163990  -.3574120
+    1992.30  -.115610   .203320  -.4102900
+    1992.35  -.145550   .245630  -.4539040
+    1992.40  -.156500   .291880  -.4959850
+    1992.45  -.153110   .334650  -.5303330
+    1992.50  -.140940   .381020   .4420910
+    1992.55  -.115160   .420770   .4184490
+    1992.60  -.077490   .459320   .3892290
+    1992.65  -.031830   .492120   .3596050
+    1992.70   .014530   .506730   .3231410
+    1992.75   .055600   .503780   .2854080
+    1992.80   .103120   .494250   .2458780
+    1992.85   .137780   .473110   .1994080
+    1992.90   .170750   .444760   .1538820
+    1992.95   .187750   .406300   .1096390
+    1993.00   .208200   .361780   .0639800
+    1993.05   .212870   .311750   .0163900
+    1993.10   .205710   .265790  -.0283100
+    1993.15   .186400   .225690  -.0785000
+    1993.20   .159450   .194090  -.1275600
+    1993.25   .113650   .170110  -.1750500
+    1993.30   .065420   .163930  -.2286500
+    1993.35   .025160   .166410  -.2813400
+    1993.40  -.005520   .177900  -.3249500
+    1993.45  -.036590   .190810  -.3670900
+    1993.50  -.063740   .211350   .5975800
+    1993.55  -.073070   .234400   .5709200
+    1993.60  -.091560   .266690   .5374700
+    1993.65  -.101560   .302050   .5021000
+    1993.70  -.099970   .336910   .4679700
+    1993.75  -.095410   .370980   .4245500
+    1993.80  -.080940   .403840   .3774500
+    1993.85  -.062500   .428470   .3322200
+    1993.90  -.041250   .448950   .2851400
+    1993.95  -.019600   .464960   .2441700
+    1994.00   .009200   .476210   .2006800
+    1994.05   .054050   .478850   .1576400
+    1994.10   .099840   .467200   .1161800
+    1994.15   .137660   .448700   .0759200
+    1994.20   .158340   .421910   .0247300
+    1994.25   .175010   .390000  -.0223200
+    1994.30   .183970   .356950  -.0662200
+    1994.35   .186340   .317810  -.1154700
+    1994.40   .180670   .281910  -.1586500
+    1994.45   .160850   .243850  -.1904900
+    1994.50   .134830   .210780   .7815600
+    1994.55   .101460   .184820   .7562100
+    1994.60   .067260   .172080   .7314100
+    1994.65   .026570   .168170   .7029600
+    1994.70  -.016290   .179410   .6665200
+    1994.75  -.066370   .200140   .6249200
+    1994.80  -.106130   .232880   .5793400
+    1994.85  -.141410   .271820   .5355300
+    1994.90  -.152620   .321150   .4935800
+    1994.95  -.153790   .368190   .4476700
+    1995.00  -.153720   .418090   .3991000
+    1995.05  -.127450   .461200   .3532000
+    1995.10  -.111580   .494070   .3028200
+    1995.15  -.075420   .524080   .2573700
+    1995.20  -.022770   .546010   .2056500
+    1995.25   .035210   .558400   .1532400
+    1995.30   .092910   .555900   .1027500
+    1995.35   .162220   .532900   .0547700
+    1995.40   .209220   .497340   .0067200
+    1995.45   .254650   .443560  -.0324300
+    1995.50   .281610   .378980  -.0635800
+    1995.55   .287570   .308430  -.0926700
+    1995.60   .273820   .237780  -.1136100
+    1995.65   .237560   .179860  -.1418400
+    1995.70   .189520   .133990  -.1803800
+    1995.75   .135580   .105900  -.2213600
+    1995.80   .066650   .085830  -.2632900
+    1995.85   .002730   .084730  -.3084000
+    1995.90  -.067070   .101140  -.3533700
+    1995.95  -.138200   .136100  -.3981800
+    1996.00  -.176160   .192180   .5551900
+    1996.05  -.203930   .246410   .5221600
+    1996.10  -.223380   .312950   .4899200
+    1996.15  -.220960   .378460   .4499500
+    1996.20  -.196520   .448570   .4092600
+    1996.25  -.150870   .508690   .3699700
+    1996.30  -.101690   .553340   .3258300
+    1996.35  -.033850   .584490   .2846000
+    1996.40   .040580   .595820   .2454400
+    1996.45   .115360   .581210   .2114200
+    1996.50   .181570   .545250   .1862900
+    1996.55   .239170   .495410   .1659300
+    1996.60   .267760   .436840   .1407800
+    1996.65   .297160   .371810   .1230500
+    1996.70   .290780   .296700   .0985300
+    1996.75   .267110   .228290   .0638000
+    1996.80   .227160   .171270   .0297800
+    1996.85   .175940   .122030  -.0071800
+    1996.90   .109730   .096200  -.0441600
+    1996.95   .039500   .084250  -.0749400
+    1997.00  -.020320   .095060  -.1096500
+    1997.05  -.073030   .119750  -.1459800
+    1997.10  -.124420   .156650  -.1730900
+    1997.15  -.161820   .203960  -.2056400
+    1997.20  -.186450   .263310  -.2482000
+    1997.25  -.190710   .331710  -.2929300
+    1997.30  -.174960   .396620  -.3387100
+    1997.35  -.145010   .452930  -.3794300
+    1997.40  -.098250   .498370  -.4162300
+    1997.45  -.047990   .525350  -.4516000
+    1997.50   .023090   .536790   .5261800
+    1997.55   .088210   .526330   .5094900
+    1997.60   .141170   .505000   .4812500
+    1997.65   .181140   .467130   .4540400
+    1997.70   .216860   .428130   .4276000
+    1997.75   .221240   .378750   .3908700
+    1997.80   .226280   .329150   .3513700
+    1997.85   .214670   .278540   .3151900
+    1997.90   .190380   .234080   .2784700
+    1997.95   .151700   .201890   .2466500
+    1998.00   .103371   .174919   .2187928
+    1998.05   .051655   .167526   .1878736
+    1998.10  -.005228   .173571   .1500342
+    1998.15  -.051800   .188169   .1146000
+    1998.20  -.079308   .220212   .0745974
+    1998.25  -.110294   .254246   .0360847
+    1998.30  -.113475   .301652   .0024942
+    1998.35  -.114391   .344204  -.0345923
+    1998.40  -.107406   .383854  -.0684825
+    1998.45  -.099535   .414513  -.0887736
+    1998.50  -.065007   .440850  -.1011400
+    1998.55  -.021674   .465308  -.1082697
+    1998.60   .017316   .478858  -.1146002
+    1998.65   .058055   .476585  -.1250252
+    1998.70   .097135   .465706  -.1418293
+    1998.75   .125857   .444588  -.1587117
+    1998.80   .149956   .418823  -.1862362
+    1998.85   .163218   .388340  -.2147711
+    1998.90   .154524   .350655  -.2401730
+    1998.95   .137225   .321181  -.2653190
+    1999.00   .138906   .296108   .7168562
+    1999.05   .117532   .271385   .7014530
+    1999.10   .100290   .252373   .6791687
+    1999.15   .077098   .244566   .6561574
+    1999.20   .054921   .239895   .6399826
+    1999.25   .023809   .240618   .6145151
+    1999.30   .001100   .248865   .5879676
+    1999.35  -.017471   .262305   .5664931
+    1999.40  -.023004   .281431   .5435885
+    1999.45  -.031745   .296763   .5267825
+    1999.50  -.031910   .311187   .5198637
+    1999.55  -.024948   .330418   .5120479
+    1999.60  -.014139   .345615   .5055648
+    1999.65  -.008467   .361644   .4977768
+    1999.70   .002079   .370914   .4819857
+    1999.75   .006586   .379679   .4688203
+    1999.80   .015741   .382597   .4506114
+    1999.85   .024443   .379545   .4230946
+    1999.90   .032087   .377378   .3974911
+    1999.95   .037562   .380865   .3782104
+    2000.00   .043300   .377661   .3554817
+    2000.05   .052375   .375702   .3413574
+    2000.10   .060632   .372427   .3250578
+    2000.15   .067994   .365396   .3071171
+    2000.20   .074610   .357979   .2899885
+    2000.25   .075437   .346051   .2762541
+    2000.30   .082353   .343278   .2552646
+    2000.35   .088049   .332016   .2358447
+    2000.40   .096303   .321406   .2198842
+    2000.45   .113565   .304386   .2064913
+    2000.50   .110079   .279086   .2040804
+    2000.55   .096137   .261702   .2004203
+    2000.60   .083088   .248498   .1987985
+    2000.65   .058388   .242745   .1949233
+    2000.70   .025972   .239588   .1871360
+    2000.75  -.005722   .246917   .1747298
+    2000.80  -.036045   .262831   .1600032
+    2000.85  -.059965   .292223   .1391654
+    2000.90  -.076915   .325404   .1205337
+    2000.95  -.082660   .357017   .1045817
+    2001.00  -.074006   .396764   .0936988
+    2001.05  -.060835   .427064   .0806986
+    2001.10  -.032401   .451341   .0762852
+    2001.15   .004327   .475921   .0624390
+    2001.20   .044840   .486196   .0388944
+    2001.25   .091974   .489418   .0251539
+    2001.30   .139116   .477702   .0096675
+    2001.35   .178791   .452008  -.0088652
+    2001.40   .215170   .409242  -.0228961
+    2001.45   .242795   .359595  -.0245445
+    2001.50   .254005   .304725  -.0278187
+    2001.55   .247620   .249184  -.0254430
+    2001.60   .220968   .199893  -.0206066
+    2001.65   .175053   .158811  -.0281492
+    2001.70   .125932   .132198  -.0304154
+    2001.75   .064697   .117778  -.0383976
+    2001.80   .001422   .120744  -.0558549
+    2001.85  -.061030   .140506  -.0697006
+    2001.90  -.103646   .180496  -.0868556
+    2001.95  -.153361   .228492  -.1008918
+    2002.00  -.176817   .292216  -.1154380
+    2002.05  -.178852   .348438  -.1269166
+    2002.10  -.163183   .406360  -.1417309
+    2002.15  -.135832   .461499  -.1552923
+    2002.20  -.088799   .513379  -.1739301
+    2002.25  -.027634   .540974  -.1901581
+    2002.30   .029239   .554816  -.2007113
+    2002.35   .092521   .550437  -.2137458
+    2002.40   .142157   .534179  -.2303514
+    2002.45   .192923   .504114  -.2287794
+    2002.50   .228889   .458092  -.2296246
+    2002.55   .244514   .404459  -.2327614
+    2002.60   .257521   .348296  -.2240428
+    2002.65   .254939   .295393  -.2248033
+    2002.70   .235509   .242129  -.2303263
+    2002.75   .197659   .199413  -.2327877
+    2002.80   .151551   .165804  -.2429725
+    2002.85   .084865   .146837  -.2549716
+    2002.90   .022450   .142124  -.2612171
+    2002.95  -.038228   .154264  -.2767537
+    2003.00  -.087743   .187387  -.2892390
+    2003.05  -.127578   .228891  -.2995032
+    2003.10  -.147530   .278647  -.3078795
+    2003.15  -.154775   .332102  -.3201905
+    2003.20  -.157108   .383491  -.3285379
+    2003.25  -.131007   .438825  -.3439523
+    2003.30  -.094644   .486399  -.3588043
+    2003.35  -.043183   .522695  -.3638535
+    2003.40   .001931   .541957  -.3745652
+    2003.45   .062632   .546600  -.3752839
+    2003.50   .135203   .538240  -.3661265
+    2003.55   .191134   .509318  -.3577046
+    2003.60   .232086   .463954  -.3537978
+    2003.65   .259508   .415127  -.3494880
+    2003.70   .264299   .356543  -.3529986
+    2003.75   .257771   .302232  -.3575570
+    2003.80   .226130   .250158  -.3628298
+    2003.85   .195950   .207643  -.3728456
+    2003.90   .147593   .174905  -.3807556
+    2003.95   .087282   .158884  -.3820300
+    2004.00   .031246   .153785  -.3896036
+    2004.05  -.014033   .166554  -.3994989
+    2004.10  -.057805   .191331  -.4041551
+    2004.15  -.101004   .228144  -.4153922
+    2004.20  -.126021   .268583  -.4225892
+    2004.25  -.140343   .321451  -.4338646
+    2004.30  -.132911   .375713  -.4512439
+    2004.35  -.112725   .423506  -.4596331
+    2004.40  -.090722   .458455  -.4683249
Index: /tags/ipp-1-X/bug123/psLib/share/pslib/eopc01_1900_2004.raw
===================================================================
--- /tags/ipp-1-X/bug123/psLib/share/pslib/eopc01_1900_2004.raw	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/share/pslib/eopc01_1900_2004.raw	(revision 22331)
@@ -0,0 +1,2092 @@
+     Date         x       sx         y       sy      ut1-utc    sut1       dPsi     sdPsi     dEps      sEps
+     year        (")      (")       (")      (")        s         s         (")      (")       (")      (")
+
+    1900.00  -.212818  .053760  -.097229  .037446   .0000000  .0000000  -.333677  .126760  -.065408  .046343
+    1900.05  -.047461  .029853  -.065631  .023330   .0000000  .0000000  -.193398  .127676   .017394  .021636
+    1900.10  -.112006  .028504  -.040467  .024327   .0000000  .0000000   .521675  .123684   .068013  .029930
+    1900.15  -.076710  .021791  -.009674  .021233   .0000000  .0000000   .352564  .078239   .072061  .029062
+    1900.20  -.099850  .026908  -.066660  .025620   .0000000  .0000000   .318962  .097104   .007820  .057366
+    1900.25  -.131173  .039344  -.072076  .027851   .0000000  .0000000   .232096  .066951   .093766  .058547
+    1900.30  -.087390  .025660  -.089427  .024505   .0000000  .0000000   .307133  .066507   .003862  .042366
+    1900.35  -.164078  .026598  -.131034  .027439   .0000000  .0000000   .317237  .071973   .026743  .042837
+    1900.40  -.151407  .019173  -.105838  .020221   .0000000  .0000000   .202192  .096423   .017399  .023063
+    1900.45  -.143764  .021261  -.179125  .029817   .0000000  .0000000  -.028123  .129358  -.012124  .020663
+    1900.50  -.124341  .024357  -.105747  .019115   .0000000  .0000000   .041669  .127181   .044334  .017158
+    1900.55  -.206229  .021263  -.144555  .025505   .0000000  .0000000  -.041788  .102389   .095807  .029772
+    1900.60  -.192711  .025172  -.095563  .029564   .0000000  .0000000   .002017  .105331   .044212  .031575
+    1900.65  -.190299  .023335  -.067717  .020577   .0000000  .0000000   .194828  .076930   .085772  .045933
+    1900.70  -.135718  .022933  -.081480  .020157   .0000000  .0000000   .269845  .072594   .075357  .044405
+    1900.75  -.153807  .024518   .030568  .021592   .0000000  .0000000   .181946  .044492  -.154452  .052427
+    1900.80  -.173818  .022558   .001034  .018183   .0000000  .0000000   .170594  .039178  -.072797  .045202
+    1900.85  -.257716  .032834  -.006499  .028017   .0000000  .0000000   .236454  .094350  -.162464  .054953
+    1900.90  -.209085  .025040   .046511  .025197   .0000000  .0000000   .088373  .092346  -.089729  .055564
+    1900.95  -.133145  .034581   .004905  .026144   .0000000  .0000000  -.039864  .127792  -.039118  .041313
+    1901.00  -.138242  .027367   .014255  .024185   .0000000  .0000000  -.228636  .134455  -.003944  .038305
+    1901.05  -.162602  .024087   .006609  .023908   .0000000  .0000000  -.262902  .109076  -.069779  .020676
+    1901.10  -.121242  .025526  -.000875  .022222   .0000000  .0000000   .356041  .119705  -.014506  .031232
+    1901.15  -.109773  .028420   .024691  .024157   .0000000  .0000000   .373538  .100048   .018214  .036225
+    1901.20  -.103805  .026286   .039564  .021736   .0000000  .0000000   .309930  .078709  -.018732  .045262
+    1901.25  -.021306  .024508  -.011519  .023560   .0000000  .0000000   .226326  .046973  -.026068  .056093
+    1901.30  -.001300  .016000   .021700  .023300   .0000000  .0000000   .431800  .058100  -.012900  .035900
+    1901.35   .037156  .024692  -.049753  .024062   .0000000  .0000000   .430826  .066845  -.018088  .038805
+    1901.40   .003993  .019282  -.095314  .029126   .0000000  .0000000   .120522  .119007   .083355  .027210
+    1901.45   .054079  .019606  -.081336  .019143   .0000000  .0000000   .051073  .111137   .020471  .014069
+    1901.50   .089761  .031152  -.084901  .023841   .0000000  .0000000   .055714  .133759   .011540  .022405
+    1901.55   .004864  .024183  -.187233  .019218   .0000000  .0000000   .191254  .111589   .051708  .031744
+    1901.60  -.023099  .020532  -.179528  .016169   .0000000  .0000000  -.025500  .092583   .010166  .026232
+    1901.65  -.057910  .022283  -.197673  .018043   .0000000  .0000000   .127452  .059894   .095943  .032516
+    1901.70  -.033170  .021132  -.202981  .020887   .0000000  .0000000   .151218  .074568   .035224  .044759
+    1901.75  -.155604  .038076  -.187085  .030924   .0000000  .0000000   .009135  .074519  -.123734  .051462
+    1901.80  -.169658  .026229  -.183163  .023359   .0000000  .0000000   .110066  .049415  -.117592  .046192
+    1901.85  -.188623  .023529  -.181458  .023343   .0000000  .0000000   .176267  .083759  -.158104  .051685
+    1901.90  -.223086  .037997  -.144566  .029526   .0000000  .0000000   .074590  .108405  -.100008  .058672
+    1901.95  -.254958  .016090  -.114447  .017896   .0000000  .0000000   .038950  .101799  -.062510  .027550
+    1902.00  -.259243  .023993  -.078157  .021579   .0000000  .0000000   .062919  .117810  -.054074  .032269
+    1902.05  -.211792  .028790   .038633  .029579   .0000000  .0000000   .017451  .148456   .020130  .024810
+    1902.10  -.216991  .031892   .064250  .026547   .0000000  .0000000   .199832  .133961   .037086  .035402
+    1902.15  -.242537  .023685   .171246  .025297   .0000000  .0000000   .415690  .088702   .043663  .034234
+    1902.20  -.188324  .019932   .158468  .019402   .0000000  .0000000   .337145  .073499   .052572  .046916
+    1902.25  -.152570  .029794   .207171  .027372   .0000000  .0000000   .214367  .061488  -.046953  .060194
+    1902.30  -.062244  .016488   .171387  .022647   .0000000  .0000000   .256881  .057371   .006551  .033174
+    1902.35  -.016045  .025756   .182141  .020157   .0000000  .0000000   .265355  .062603  -.028692  .033970
+    1902.40   .036032  .019117   .156268  .020794   .0000000  .0000000   .211676  .098381  -.021285  .023510
+    1902.45   .217293  .048928   .252814  .059193   .0000000  .0000000   .146268  .124285  -.113359  .044438
+    1902.50   .119283  .025360   .066262  .021894   .0000000  .0000000   .024206  .116290   .019059  .018772
+    1902.55   .125538  .021669   .016781  .019109   .0000000  .0000000   .091941  .099925   .027890  .029268
+    1902.60   .082496  .025116  -.058369  .022971   .0000000  .0000000   .250234  .108900   .110308  .030400
+    1902.65   .051287  .024489  -.069631  .016515   .0000000  .0000000   .261163  .069618   .097323  .039865
+    1902.70   .051239  .015838  -.093785  .015438   .0000000  .0000000   .250384  .055426   .068387  .034338
+    1902.75  -.024248  .022473  -.151921  .025442   .0000000  .0000000   .149156  .045045  -.095975  .053371
+    1902.80  -.054789  .019443  -.179957  .016628   .0000000  .0000000   .124553  .035265  -.069583  .040068
+    1902.85  -.146320  .020063  -.146959  .023110   .0000000  .0000000   .078608  .078920  -.089216  .047165
+    1902.90  -.193061  .020857  -.169534  .022315   .0000000  .0000000   .286457  .076181  -.208670  .046902
+    1902.95  -.237694  .019690  -.119404  .024324   .0000000  .0000000   .109034  .129370  -.052789  .034514
+    1903.00  -.319420  .030492  -.043030  .024811   .0000000  .0000000  -.038528  .145631  -.047724  .038302
+    1903.05  -.341204  .033829   .031366  .029406   .0000000  .0000000  -.098874  .160686   .018102  .023703
+    1903.10  -.345930  .022972  -.002271  .021847   .0000000  .0000000   .351093  .102851   .012471  .027943
+    1903.15  -.363449  .026083   .022246  .026034   .0000000  .0000000   .188593  .093308  -.023174  .037211
+    1903.20  -.363639  .026221   .126744  .020945   .0000000  .0000000   .245152  .087844   .029758  .051375
+    1903.25  -.275204  .023659   .088178  .025161   .0000000  .0000000   .291261  .044592   .065540  .051947
+    1903.30  -.217973  .027174   .142752  .021557   .0000000  .0000000   .210847  .075501   .063304  .043755
+    1903.35  -.133649  .019233   .193127  .019408   .0000000  .0000000   .260252  .056126   .060431  .031402
+    1903.40  -.073538  .019722   .187785  .025512   .0000000  .0000000   .238595  .103039  -.018625  .024658
+    1903.45  -.033275  .020533   .242905  .022048   .0000000  .0000000   .056127  .129511   .027798  .017107
+    1903.50  -.025665  .019429   .185828  .015678   .0000000  .0000000  -.045779  .099979   .027960  .013960
+    1903.55   .065994  .027595   .199396  .021362   .0000000  .0000000   .091259  .113401   .039908  .032424
+    1903.60   .124642  .022783   .131603  .021652   .0000000  .0000000   .051145  .098411   .025315  .027842
+    1903.65   .138085  .017587   .043707  .024380   .0000000  .0000000   .246657  .066217   .079088  .036242
+    1903.70   .131036  .023145  -.010458  .018213   .0000000  .0000000   .227846  .071262   .028294  .042237
+    1903.75   .129875  .035187  -.132885  .050492   .0000000  .0000000   .250549  .112846  -.094268  .048466
+    1903.80   .020188  .021139  -.149501  .017604   .0000000  .0000000   .109261  .036528  -.073754  .040709
+    1903.85  -.013164  .021345  -.224089  .020262   .0000000  .0000000   .056925  .074780  -.070392  .044352
+    1903.90   .017200  .027500  -.148400  .021400   .0000000  .0000000   .365700  .082200  -.239900  .051000
+    1903.95  -.054459  .030056  -.187411  .022835   .0000000  .0000000   .143493  .154516  -.103709  .039701
+    1904.00  -.148856  .044509  -.076687  .044456   .0000000  .0000000  -.114333  .231473   .061858  .075829
+    1904.05  -.254004  .025206  -.136031  .021177   .0000000  .0000000   .004573  .125550  -.037187  .017298
+    1904.10  -.260513  .025120  -.134266  .024182   .0000000  .0000000   .245917  .113408  -.023869  .030194
+    1904.15  -.250640  .038286  -.062308  .029112   .0000000  .0000000   .153720  .139136  -.072025  .046748
+    1904.20  -.318450  .021790  -.022118  .038002   .0000000  .0000000   .343107  .107286   .029958  .054168
+    1904.25  -.293126  .023025   .024733  .019604   .0000000  .0000000   .257570  .041421   .099537  .048628
+    1904.30  -.249230  .043032   .052166  .022314   .0000000  .0000000   .250262  .082833   .005740  .053675
+    1904.35  -.263860  .019701   .072953  .018143   .0000000  .0000000   .249463  .055609   .056281  .034733
+    1904.40  -.210918  .029867   .172463  .020549   .0000000  .0000000   .242277  .114143   .012153  .028773
+    1904.45  -.152700  .018200   .188900  .018000   .0000000  .0000000  -.038200  .111600   .003300  .013500
+    1904.50  -.109676  .019307   .182564  .018938   .0000000  .0000000  -.148627  .111520   .030744  .015061
+    1904.55  -.082798  .020647   .158201  .020009   .0000000  .0000000   .046632  .096224   .074456  .028089
+    1904.60   .001500  .014600   .164000  .015300   .0000000  .0000000   .059100  .081200   .033100  .023200
+    1904.65   .042084  .017502   .134884  .014207   .0000000  .0000000   .299232  .053479   .160529  .030251
+    1904.70   .062535  .019610   .070240  .018761   .0000000  .0000000   .233434  .063943   .112999  .037691
+    1904.75   .083512  .024774   .063227  .023502   .0000000  .0000000   .100183  .048551   .039087  .030313
+    1904.80   .042326  .022076   .010531  .021354   .0000000  .0000000   .108009  .041403  -.080528  .043561
+    1904.85   .042284  .020582  -.029751  .021504   .0000000  .0000000   .096546  .079450  -.128975  .047377
+    1904.90  -.008473  .045473  -.063250  .044351   .0000000  .0000000   .231014  .135878  -.063402  .095840
+    1904.95   .028258  .028399  -.057405  .026815   .0000000  .0000000   .103781  .158414  -.073395  .041300
+    1905.00  -.040538  .025021  -.099671  .024519   .0000000  .0000000   .185220  .087951  -.032327  .026835
+    1905.05  -.017099  .027266  -.158118  .027398   .0000000  .0000000  -.161540  .107012   .074302  .024020
+    1905.10  -.105713  .031136  -.176117  .024035   .0000000  .0000000   .347522  .131488   .052168  .033695
+    1905.15  -.176213  .023287  -.100777  .021215   .0000000  .0000000   .290801  .072797   .017315  .027805
+    1905.20  -.231493  .023017  -.136695  .016189   .0000000  .0000000   .101899  .056885   .024298  .027994
+    1905.25  -.251440  .023914  -.151097  .022693   .0000000  .0000000   .183959  .044511   .085260  .040895
+    1905.30  -.248000  .029100  -.108800  .028300   .0000000  .0000000   .303300  .084900   .012900  .044900
+    1905.35  -.304428  .020727   .045206  .018309   .0000000  .0000000   .195471  .060148   .000919  .037654
+    1905.40  -.236545  .022973   .042822  .026077   .0000000  .0000000   .123361  .118627   .009977  .029220
+    1905.45  -.250592  .031413   .048859  .027624   .0000000  .0000000   .029364  .124702   .025729  .021942
+    1905.50  -.185960  .023539   .112145  .027395   .0000000  .0000000   .098352  .135807   .009326  .019311
+    1905.55  -.156532  .021895   .117102  .020138   .0000000  .0000000  -.081301  .087252  -.037089  .024732
+    1905.60  -.109352  .021554   .166247  .018456   .0000000  .0000000  -.052333  .098533  -.005779  .029043
+    1905.65  -.067846  .028256   .135598  .020885   .0000000  .0000000   .277618  .064061   .111046  .035631
+    1905.70   .014037  .023029   .151407  .022182   .0000000  .0000000   .282266  .062970   .052905  .033997
+    1905.75  -.034403  .030475   .175804  .021521   .0000000  .0000000   .255754  .049868  -.148491  .055323
+    1905.80  -.031721  .028070   .049970  .029042   .0000000  .0000000  -.006276  .049203  -.163042  .046545
+    1905.85   .025746  .026045   .080453  .024204   .0000000  .0000000   .318572  .083837  -.162672  .049900
+    1905.90   .024021  .023876  -.056728  .024447   .0000000  .0000000   .191888  .086082  -.081159  .052664
+    1905.95   .040706  .025939  -.006383  .031653   .0000000  .0000000   .176684  .151253  -.066028  .042122
+    1906.00   .003853  .027774  -.026096  .022568   .0000000  .0000000   .353052  .125609  -.085851  .034335
+    1906.05  -.017613  .037626  -.075020  .028373   .0000000  .0000000   .058236  .116066   .042743  .028389
+    1906.10  -.157406  .027525  -.092487  .019150   .0000000  .0000000   .270125  .098675   .087800  .028450
+    1906.15  -.067506  .039670  -.080298  .024017   .0000000  .0000000   .057244  .086367   .041170  .032989
+    1906.20  -.149450  .019538  -.119103  .021544   .0000000  .0000000   .113356  .066083   .003460  .039537
+    1906.25  -.128247  .021258  -.061169  .019210   .0000000  .0000000   .102973  .039658   .057831  .043484
+    1906.30  -.179648  .019342  -.057693  .015619   .0000000  .0000000   .175340  .057093  -.039542  .032940
+    1906.35  -.186449  .028318  -.044109  .017466   .0000000  .0000000   .140376  .060295  -.002299  .033838
+    1906.40  -.208575  .017756  -.019448  .017400   .0000000  .0000000   .015574  .074861   .005300  .018332
+    1906.45  -.217870  .027036   .042944  .019247   .0000000  .0000000   .248883  .103492   .000061  .019037
+    1906.50  -.199891  .026352   .058881  .022948   .0000000  .0000000   .227682  .100657   .031386  .018187
+    1906.55  -.173543  .014562   .070934  .014278   .0000000  .0000000   .117292  .076299   .023764  .021614
+    1906.60  -.182003  .014184   .113024  .020481   .0000000  .0000000   .238491  .076914   .064891  .023037
+    1906.65  -.142776  .020805   .095154  .018992   .0000000  .0000000   .200399  .060830   .052899  .036334
+    1906.70  -.093740  .023427   .095224  .019026   .0000000  .0000000   .165899  .057427   .024389  .033984
+    1906.75  -.093900  .030400   .111200  .029700   .0000000  .0000000   .123100  .056800  -.022900  .055700
+    1906.80  -.102758  .020273   .078405  .019941   .0000000  .0000000   .158671  .038107  -.057296  .034270
+    1906.85  -.009641  .037790   .137918  .023678   .0000000  .0000000   .110473  .086093  -.121337  .055949
+    1906.90  -.126885  .017403   .077766  .014954   .0000000  .0000000   .071042  .050965  -.101739  .029910
+    1906.95  -.085940  .024352   .122947  .033076   .0000000  .0000000  -.173911  .144919   .052592  .043974
+    1907.00  -.079416  .024620   .150174  .023710   .0000000  .0000000   .080001  .116688   .018143  .029500
+    1907.05  -.067350  .025143   .041498  .035409   .0000000  .0000000   .073095  .126257   .055036  .023696
+    1907.10  -.027042  .044273   .024883  .037921   .0000000  .0000000   .189029  .138258   .070923  .040212
+    1907.15  -.069913  .023457   .039794  .019305   .0000000  .0000000   .247270  .073147   .059702  .028726
+    1907.20  -.059194  .025568  -.025833  .019658   .0000000  .0000000  -.067453  .070577  -.036942  .042421
+    1907.25  -.032978  .027136  -.010025  .021118   .0000000  .0000000   .097977  .045607   .028819  .047104
+    1907.30  -.032298  .018376  -.079952  .018100   .0000000  .0000000   .091289  .058321   .098117  .035752
+    1907.35  -.012800  .019968  -.038790  .015828   .0000000  .0000000   .026669  .051078   .005099  .029065
+    1907.40  -.094517  .018850  -.051596  .019350   .0000000  .0000000   .154034  .095591  -.036263  .023594
+    1907.45  -.089447  .022296  -.124297  .019779   .0000000  .0000000   .029209  .101385   .026543  .015722
+    1907.50  -.131771  .019108  -.098748  .017119   .0000000  .0000000   .242100  .089088   .009307  .014240
+    1907.55  -.109356  .015221  -.122489  .014661   .0000000  .0000000   .138257  .080858   .007021  .022508
+    1907.60  -.134764  .018056  -.084340  .015443   .0000000  .0000000   .202735  .078593   .056406  .022873
+    1907.65  -.150915  .013218  -.095204  .011457   .0000000  .0000000   .186489  .042036   .065484  .024490
+    1907.70  -.183652  .013853  -.070567  .012711   .0000000  .0000000   .238161  .042637   .067956  .025900
+    1907.75  -.247755  .015944  -.037271  .014847   .0000000  .0000000   .069057  .030949  -.166534  .035037
+    1907.80  -.276782  .022683   .006594  .013921   .0000000  .0000000   .113611  .036307  -.078859  .035934
+    1907.85  -.260675  .020328   .115176  .026887   .0000000  .0000000   .036991  .076862  -.028790  .043520
+    1907.90  -.279309  .022735   .066165  .018080   .0000000  .0000000   .244677  .062092  -.110026  .038954
+    1907.95  -.247411  .024711   .158512  .031173   .0000000  .0000000   .062917  .124068   .010688  .030974
+    1908.00  -.179825  .022677   .190418  .019382   .0000000  .0000000   .045084  .106993   .062586  .027161
+    1908.05  -.162104  .025046   .175855  .028444   .0000000  .0000000   .103742  .155855   .042061  .019892
+    1908.10  -.073775  .028891   .244495  .024516   .0000000  .0000000   .245695  .110802   .095557  .031435
+    1908.15  -.088534  .027458   .184551  .017033   .0000000  .0000000   .202671  .076752   .059013  .031780
+    1908.20   .072181  .033438   .185212  .026915   .0000000  .0000000  -.041708  .089470  -.103296  .050987
+    1908.25   .000811  .023430   .129285  .025494   .0000000  .0000000   .206115  .053034   .050623  .041550
+    1908.30   .094290  .022523   .125029  .016876   .0000000  .0000000   .216543  .060033  -.027207  .036610
+    1908.35   .098031  .015570   .048028  .014659   .0000000  .0000000   .030976  .044622   .052821  .026959
+    1908.40   .085376  .019153  -.037173  .015904   .0000000  .0000000   .105038  .078267   .015997  .019045
+    1908.45   .110614  .025853  -.053618  .024285   .0000000  .0000000   .153787  .106634   .013544  .019968
+    1908.50   .110175  .026610  -.121985  .025563   .0000000  .0000000   .031077  .108516   .006967  .020390
+    1908.55   .062891  .022400  -.147259  .019060   .0000000  .0000000  -.082788  .089320  -.037852  .025333
+    1908.60   .016036  .021495  -.174778  .023275   .0000000  .0000000   .210112  .099015   .066788  .027598
+    1908.65  -.044507  .019073  -.258578  .021281   .0000000  .0000000   .179528  .051480   .053306  .026579
+    1908.70  -.126698  .019826  -.236805  .014026   .0000000  .0000000   .159666  .057586   .116131  .031215
+    1908.75  -.185227  .018908  -.279032  .016051   .0000000  .0000000  -.038867  .036568  -.059976  .030485
+    1908.80  -.218671  .014651  -.234349  .016957   .0000000  .0000000   .085591  .033574  -.055343  .025266
+    1908.85  -.258124  .022801  -.193490  .017680   .0000000  .0000000   .058307  .057282  -.155806  .034798
+    1908.90  -.348498  .023013  -.117029  .019986   .0000000  .0000000  -.044263  .072425  -.031398  .041662
+    1908.95  -.441656  .045827  -.087821  .024170   .0000000  .0000000  -.222508  .111975   .074175  .042506
+    1909.00  -.418026  .030202   .032515  .029485   .0000000  .0000000  -.124136  .114958   .001844  .034290
+    1909.05  -.464700  .023300   .053100  .021200   .0000000  .0000000   .142200  .122400  -.021900  .017600
+    1909.10  -.381402  .029397   .081369  .026583   .0000000  .0000000   .136482  .135028   .026300  .032872
+    1909.15  -.331872  .024908   .208343  .022250   .0000000  .0000000   .142551  .088861   .003686  .028690
+    1909.20  -.262800  .025300   .230900  .020400   .0000000  .0000000   .246000  .077700   .119000  .052700
+    1909.25  -.180022  .021604   .262477  .015586   .0000000  .0000000   .204810  .034370   .159389  .041898
+    1909.30  -.088674  .020876   .272316  .018026   .0000000  .0000000   .224372  .061549  -.013291  .039957
+    1909.35  -.017300  .024900   .301900  .020400   .0000000  .0000000   .115400  .068600  -.009000  .037100
+    1909.40   .082311  .016643   .293915  .015624   .0000000  .0000000   .161696  .084291   .000839  .021602
+    1909.45   .145682  .019466   .242356  .024029   .0000000  .0000000   .169328  .107429  -.009796  .017280
+    1909.50   .159939  .021629   .145514  .016260   .0000000  .0000000  -.073128  .091190   .030057  .015366
+    1909.55   .219001  .015849   .050735  .015308   .0000000  .0000000  -.011547  .079780  -.013148  .022447
+    1909.60   .251107  .017083   .038325  .012976   .0000000  .0000000   .142763  .076342   .011621  .021565
+    1909.65   .216000  .017200  -.092100  .014200   .0000000  .0000000   .209600  .053300   .068800  .031100
+    1909.70   .239771  .033367  -.129218  .018723   .0000000  .0000000   .327841  .068174   .031505  .035607
+    1909.75   .122030  .026859  -.229024  .021510   .0000000  .0000000   .118789  .051222  -.041929  .044658
+    1909.80  -.027219  .018091  -.280542  .014742   .0000000  .0000000   .105788  .032512  -.034222  .033019
+    1909.85  -.097816  .031222  -.318227  .020306   .0000000  .0000000   .102209  .083756  -.040327  .052036
+    1909.90  -.212272  .020651  -.273213  .013760   .0000000  .0000000   .155022  .055398  -.090967  .034028
+    1909.95  -.262295  .016361  -.211841  .019362   .0000000  .0000000  -.306349  .093272   .051436  .026436
+    1910.00  -.323074  .027015  -.200846  .037795   .0000000  .0000000   .099003  .103352  -.005730  .037950
+    1910.05  -.442329  .027265  -.257217  .023282   .0000000  .0000000   .036708  .143048  -.002189  .019658
+    1910.10  -.448532  .041123  -.107453  .027419   .0000000  .0000000   .043621  .162329   .045460  .040389
+    1910.15  -.408744  .021087   .030815  .032683   .0000000  .0000000   .172827  .103869  -.015696  .038230
+    1910.20  -.414020  .027029  -.006268  .022893   .0000000  .0000000  -.006953  .079653  -.073319  .048574
+    1910.25  -.385676  .029272   .162890  .037814   .0000000  .0000000   .131554  .075221   .115988  .049835
+    1910.30  -.368387  .014246   .272702  .023082   .0000000  .0000000   .168008  .058720   .013868  .035304
+    1910.35  -.268774  .014096   .293213  .017618   .0000000  .0000000   .102868  .050954   .015300  .031518
+    1910.40  -.147573  .033402   .342824  .031269   .0000000  .0000000   .108410  .144680   .021531  .038312
+    1910.45  -.081273  .036206   .328529  .024940   .0000000  .0000000   .268834  .133538  -.046158  .027171
+    1910.50  -.020932  .018243   .388520  .021784   .0000000  .0000000   .186364  .101418   .015650  .016119
+    1910.55   .105674  .015903   .327555  .015193   .0000000  .0000000  -.016453  .084989  -.015338  .023625
+    1910.60   .176301  .025502   .312524  .018735   .0000000  .0000000   .146119  .091503   .028960  .027777
+    1910.65   .191756  .047195   .171612  .029191   .0000000  .0000000   .176229  .097407   .121387  .055812
+    1910.70   .222257  .017196   .091742  .015870   .0000000  .0000000   .182638  .052853   .063604  .032838
+    1910.75   .211332  .016710  -.009012  .016112   .0000000  .0000000   .048463  .032674  -.060190  .037462
+    1910.80   .205000  .020700  -.105700  .017200   .0000000  .0000000   .062800  .036400  -.095100  .039600
+    1910.85   .120900  .020101  -.162494  .021135   .0000000  .0000000   .123726  .059606  -.019765  .042156
+    1910.90   .083916  .023956  -.253801  .024007   .0000000  .0000000   .013354  .073655  -.021508  .051519
+    1910.95  -.057477  .033626  -.280025  .025436   .0000000  .0000000   .072073  .128036  -.009321  .037844
+    1911.00  -.089579  .028621  -.260914  .027948   .0000000  .0000000   .169478  .116395   .037311  .032178
+    1911.05  -.218786  .029820  -.263597  .035792   .0000000  .0000000   .069459  .152501   .061462  .023480
+    1911.10  -.224700  .024170  -.257286  .021305   .0000000  .0000000   .325278  .115919   .068961  .028144
+    1911.15  -.335860  .021547  -.182205  .019739   .0000000  .0000000   .133424  .083961   .036224  .025924
+    1911.20  -.267000  .034500  -.050900  .036500   .0000000  .0000000  -.104000  .121900   .078500  .058700
+    1911.25  -.370633  .024922   .021540  .022191   .0000000  .0000000   .297392  .046601   .002211  .053352
+    1911.30  -.353109  .024050   .047330  .019022   .0000000  .0000000   .167158  .069713  -.013280  .040848
+    1911.35  -.332727  .014668   .126340  .014928   .0000000  .0000000   .252875  .048137  -.056184  .031637
+    1911.40  -.234107  .032662   .168826  .020525   .0000000  .0000000   .201020  .113961   .056925  .030206
+    1911.45  -.272718  .028763   .310644  .020913   .0000000  .0000000   .192952  .130471   .027320  .018467
+    1911.50  -.193283  .022444   .331807  .023636   .0000000  .0000000   .287728  .116745  -.006204  .019212
+    1911.55  -.136796  .026687   .347029  .020769   .0000000  .0000000   .100558  .095132  -.013315  .028295
+    1911.60  -.056770  .020828   .304448  .016125   .0000000  .0000000   .038851  .087052  -.008402  .025164
+    1911.65   .060600  .022900   .363500  .027100   .0000000  .0000000   .205100  .059600   .017900  .029800
+    1911.70   .112694  .032188   .325844  .023151   .0000000  .0000000   .299304  .082079   .040320  .047025
+    1911.75   .129599  .019997   .242729  .021387   .0000000  .0000000   .155515  .039558  -.094239  .038228
+    1911.80   .130866  .021743   .155825  .020309   .0000000  .0000000   .123438  .042282  -.010054  .034573
+    1911.85   .158551  .020434   .088616  .025134   .0000000  .0000000   .051214  .068383  -.010926  .041562
+    1911.90   .145314  .028595  -.044498  .021946   .0000000  .0000000  -.100129  .069086  -.007673  .044906
+    1911.95   .095603  .025949  -.041933  .034319   .0000000  .0000000   .023942  .151461  -.068062  .043736
+    1912.00   .083131  .028082  -.041367  .045117   .0000000  .0000000   .086921  .127853   .026547  .039122
+    1912.05  -.038956  .035506  -.097988  .024047   .0000000  .0000000  -.007819  .159622   .019820  .021583
+    1912.10   .078300  .036400  -.165300  .022900   .0000000  .0000000   .233500  .115600   .104200  .031000
+    1912.15  -.088995  .031251  -.223549  .023255   .0000000  .0000000   .220333  .093899   .077473  .038050
+    1912.20  -.127587  .022657  -.102840  .033381   .0000000  .0000000   .170145  .089310   .010912  .046724
+    1912.25  -.227272  .023288  -.194080  .022502   .0000000  .0000000   .186406  .044893  -.084389  .049865
+    1912.30  -.209405  .020707  -.109730  .020075   .0000000  .0000000   .055672  .058713   .017194  .031326
+    1912.35  -.237021  .016480  -.041122  .019962   .0000000  .0000000   .022407  .056949   .025940  .032792
+    1912.40  -.262082  .018289  -.006966  .017816   .0000000  .0000000   .029363  .090838   .043339  .022758
+    1912.45  -.225320  .035063   .056285  .028655   .0000000  .0000000   .180293  .125295  -.022633  .026061
+    1912.50  -.263907  .021742   .044713  .019951   .0000000  .0000000   .002937  .113586   .003018  .016324
+    1912.55  -.196951  .023121   .144625  .021044   .0000000  .0000000   .068149  .094223   .007916  .027238
+    1912.60  -.198267  .021321   .185500  .018223   .0000000  .0000000   .204439  .104019   .018183  .028277
+    1912.65  -.219124  .027649   .151146  .023604   .0000000  .0000000   .159364  .071235   .100388  .039220
+    1912.70  -.175982  .021677   .183356  .018936   .0000000  .0000000   .236280  .063918   .115620  .039114
+    1912.75  -.160280  .019553   .162811  .016252   .0000000  .0000000   .097070  .035523  -.038213  .039632
+    1912.80  -.103200  .021500   .187700  .021600   .0000000  .0000000   .069900  .040000  -.065100  .046800
+    1912.85  -.078852  .022537   .172599  .021871   .0000000  .0000000   .014043  .067846   .025894  .043515
+    1912.90  -.076719  .031453   .222193  .024394   .0000000  .0000000   .080993  .083189  -.048971  .054231
+    1912.95  -.018200  .033800   .178000  .021300   .0000000  .0000000  -.209300  .149500   .097800  .039400
+    1913.00  -.088918  .036157   .098053  .038779   .0000000  .0000000  -.130297  .147099   .004638  .045245
+    1913.05  -.043449  .024134   .115101  .031313   .0000000  .0000000  -.107525  .148353   .028795  .019234
+    1913.10  -.001323  .029225   .124168  .025147   .0000000  .0000000   .274923  .112863   .004371  .033360
+    1913.15  -.021744  .022356   .057252  .022649   .0000000  .0000000  -.015634  .080957  -.073590  .030838
+    1913.20   .011122  .019340   .015761  .020873   .0000000  .0000000   .202756  .058131   .031678  .036427
+    1913.25  -.010477  .016419  -.071666  .019034   .0000000  .0000000   .000632  .034529   .016072  .036418
+    1913.30   .032491  .025253   .003044  .016851   .0000000  .0000000  -.002118  .060835   .051937  .035678
+    1913.35   .048101  .019458  -.050706  .023830   .0000000  .0000000   .005973  .067868   .058074  .035138
+    1913.40   .032669  .022624  -.039496  .022980   .0000000  .0000000   .145719  .101370  -.023783  .025456
+    1913.45   .008311  .023950  -.068348  .019240   .0000000  .0000000   .095341  .112721   .009351  .016753
+    1913.50   .000027  .031816  -.047918  .022600   .0000000  .0000000   .254609  .113267  -.033878  .023651
+    1913.55  -.076685  .026892  -.083122  .018481   .0000000  .0000000  -.087757  .110497  -.002857  .031253
+    1913.60  -.108057  .017340  -.085386  .017913   .0000000  .0000000  -.016574  .091878  -.013581  .024005
+    1913.65  -.100400  .027900  -.040800  .019000   .0000000  .0000000   .371500  .067400   .106400  .035600
+    1913.70  -.162152  .019790  -.081823  .024953   .0000000  .0000000   .226011  .076275   .094102  .046150
+    1913.75  -.223157  .019148  -.030051  .015589   .0000000  .0000000   .140482  .033187  -.042264  .041169
+    1913.80  -.224000  .020000  -.002700  .028700   .0000000  .0000000   .069600  .047200   .013500  .044900
+    1913.85  -.226344  .023162   .078679  .023742   .0000000  .0000000   .094095  .068956  -.075759  .047116
+    1913.90  -.200560  .022160   .102525  .020236   .0000000  .0000000   .123629  .061773  -.061520  .034578
+    1913.95  -.313300  .039300   .074600  .021000   .0000000  .0000000  -.070900  .110300  -.070800  .034100
+    1914.00  -.203986  .042377   .155067  .052640   .0000000  .0000000  -.053388  .166647  -.005376  .060606
+    1914.05  -.260937  .067620   .252070  .062023   .0000000  .0000000   .482868  .261586  -.080710  .047209
+    1914.10  -.152037  .032358   .221001  .033547   .0000000  .0000000   .460108  .138175   .079547  .033998
+    1914.15  -.093945  .023823   .191653  .020597   .0000000  .0000000   .274282  .082321  -.003172  .029356
+    1914.20  -.063798  .022074   .184214  .017949   .0000000  .0000000   .368801  .055476   .034615  .036141
+    1914.25  -.013635  .021036   .132013  .036281   .0000000  .0000000   .182668  .064550  -.005456  .042311
+    1914.30   .045383  .017243   .170364  .018313   .0000000  .0000000   .027064  .052599   .079159  .031296
+    1914.35   .034013  .021428   .110450  .025557   .0000000  .0000000   .058854  .067678   .018142  .040045
+    1914.40   .073793  .015420   .089719  .013907   .0000000  .0000000   .195994  .076098  -.004195  .018039
+    1914.45   .106389  .029431   .069624  .018977   .0000000  .0000000   .150803  .132359   .044380  .016981
+    1914.50   .104207  .017302   .003118  .015383   .0000000  .0000000   .061613  .079659   .007552  .014041
+    1914.55   .085502  .013219  -.025467  .011498   .0000000  .0000000  -.005456  .066776  -.016331  .019034
+    1914.60   .049258  .014447  -.008534  .018946   .0000000  .0000000  -.039541  .090380   .020453  .024494
+    1914.65  -.013923  .021070  -.060487  .020484   .0000000  .0000000   .029862  .061791   .025569  .031829
+    1914.70  -.046141  .017808  -.151237  .014883   .0000000  .0000000   .000046  .048187  -.025157  .027803
+    1914.75  -.094789  .022287  -.177467  .016968   .0000000  .0000000   .017265  .038972  -.054229  .037879
+    1914.80  -.140169  .032081  -.214589  .017725   .0000000  .0000000  -.107241  .042845  -.020467  .037875
+    1914.85  -.220007  .022213  -.164939  .020100   .0000000  .0000000   .010800  .055608  -.127015  .043005
+    1914.90  -.271487  .019822  -.080598  .028419   .0000000  .0000000   .093833  .074114  -.119831  .044306
+    1914.95  -.197162  .054534  -.003731  .040356   .0000000  .0000000  -.033235  .234490   .126051  .065477
+    1915.00  -.365371  .033632   .018627  .024793   .0000000  .0000000   .050076  .137027   .007352  .039388
+    1915.05  -.311390  .034237   .018527  .036937   .0000000  .0000000   .470422  .190718  -.025907  .027027
+    1915.10  -.363577  .028404   .127944  .046152   .0000000  .0000000   .199111  .082412  -.005714  .031288
+    1915.15  -.230546  .034338   .091634  .039141   .0000000  .0000000   .217155  .152154   .062311  .052850
+    1915.20  -.285678  .027666   .254673  .030284   .0000000  .0000000   .366048  .083251   .064727  .056257
+    1915.25  -.300793  .035000   .364102  .032230   .0000000  .0000000   .480897  .069664  -.061038  .070711
+    1915.30  -.145488  .022572   .374588  .051362   .0000000  .0000000   .264689  .087911  -.030308  .039430
+    1915.35  -.084157  .022819   .325899  .025296   .0000000  .0000000   .251653  .074966   .026434  .040212
+    1915.40  -.008400  .021600   .253100  .027800   .0000000  .0000000   .261400  .120600   .015400  .027700
+    1915.45   .086674  .025374   .275352  .030762   .0000000  .0000000   .027152  .116818   .032016  .025083
+    1915.50   .081245  .018951   .210673  .023988   .0000000  .0000000   .020150  .110182   .042758  .016256
+    1915.55   .121650  .022685   .162508  .020369   .0000000  .0000000  -.076632  .111521   .060233  .031530
+    1915.60   .169064  .028416  -.052355  .038319   .0000000  .0000000   .017374  .111772  -.019577  .038525
+    1915.65   .112084  .021944   .002862  .022580   .0000000  .0000000   .038242  .062160   .031483  .035854
+    1915.70   .099188  .020367  -.061928  .021327   .0000000  .0000000  -.010568  .066166   .064707  .036261
+    1915.75   .093628  .029174  -.172293  .033092   .0000000  .0000000  -.095497  .050692  -.056246  .054216
+    1915.80  -.031363  .037232  -.267297  .036264   .0000000  .0000000   .011846  .072173  -.063122  .041518
+    1915.85  -.050020  .030742  -.262266  .023155   .0000000  .0000000  -.027821  .088036  -.038193  .050505
+    1915.90  -.047776  .025033  -.265495  .028877   .0000000  .0000000   .118091  .069539  -.019792  .039372
+    1915.95  -.135461  .023173  -.219164  .028298   .0000000  .0000000  -.012289  .086845  -.027399  .027321
+    1916.00  -.250486  .023204  -.127502  .022968   .0000000  .0000000  -.021577  .103420   .018951  .028163
+    1916.05  -.339030  .037330  -.192532  .045931   .0000000  .0000000   .024111  .137392  -.018940  .034175
+    1916.10  -.414793  .058039  -.366168  .141532   .0000000  .0000000  -.098174  .170431   .076541  .118153
+    1916.15  -.341536  .021953  -.026629  .029162   .0000000  .0000000   .169266  .088743  -.014264  .030157
+    1916.20  -.344556  .018814   .102289  .019703   .0000000  .0000000   .252240  .050378  -.029106  .028335
+    1916.25  -.312204  .024609   .143646  .020499   .0000000  .0000000   .180470  .047266   .015853  .027610
+    1916.30  -.283589  .023924   .181301  .020568   .0000000  .0000000   .143325  .058658   .063949  .026548
+    1916.35  -.251093  .018184   .263902  .019588   .0000000  .0000000   .138055  .053509   .020526  .024625
+    1916.40  -.158543  .020020   .396971  .033556   .0000000  .0000000   .158620  .085492   .044177  .026115
+    1916.45  -.236712  .062220   .246063  .050573   .0000000  .0000000   .136788  .152108   .143947  .057248
+    1916.50  -.049133  .028615   .295525  .022294   .0000000  .0000000  -.030297  .075359   .037090  .022295
+    1916.55  -.019000  .038200   .215800  .026700   .0000000  .0000000   .070100  .103300   .069400  .029700
+    1916.60   .091660  .018963   .193570  .018460   .0000000  .0000000  -.039878  .073489   .007240  .022693
+    1916.65   .171184  .018604   .142932  .016015   .0000000  .0000000   .230323  .045535   .085540  .025321
+    1916.70   .135500  .023400   .053900  .025100   .0000000  .0000000  -.046700  .057800  -.000100  .025700
+    1916.75   .159276  .025292  -.060418  .036456   .0000000  .0000000   .011834  .078911  -.008215  .026973
+    1916.80   .195249  .023248  -.060384  .023203   .0000000  .0000000   .031580  .041769  -.048167  .034018
+    1916.85   .041662  .033202  -.606821  .141969   .0000000  .0000000   .943431  .274302   .112475  .054856
+    1916.90   .012991  .025535  -.219566  .030003   .0000000  .0000000   .053736  .068762  -.061942  .039228
+    1916.95  -.003679  .034430  -.318930  .051949   .0000000  .0000000   .050138  .118290  -.018448  .050335
+    1917.00  -.095516  .031991  -.232917  .036690   .0000000  .0000000   .113371  .098425  -.038837  .039895
+    1917.05  -.151536  .032643  -.182785  .035632   .0000000  .0000000   .177793  .081918  -.049965  .028040
+    1917.10  -.182049  .018780  -.136279  .020541   .0000000  .0000000   .226590  .064294  -.029064  .017525
+    1917.15  -.292198  .021566  -.114514  .025900   .0000000  .0000000   .378588  .066745  -.025331  .022017
+    1917.20  -.293211  .023421  -.077170  .028302   .0000000  .0000000   .271657  .067886  -.007479  .030789
+    1917.25  -.310501  .018384  -.047076  .019377   .0000000  .0000000   .320842  .036052   .020607  .038323
+    1917.30  -.262144  .022858   .028782  .036242   .0000000  .0000000   .158905  .076173   .065957  .042121
+    1917.35  -.195616  .034674   .145893  .043448   .0000000  .0000000  -.131604  .107830   .175394  .060186
+    1917.40  -.216823  .016046   .172434  .021974   .0000000  .0000000   .205536  .089022   .029871  .023536
+    1917.45  -.195552  .023695   .154519  .024785   .0000000  .0000000   .094768  .093800   .041009  .017617
+    1917.50  -.114387  .021710   .252819  .017637   .0000000  .0000000   .160593  .109832   .011260  .015601
+    1917.55  -.014913  .026123   .095478  .050081   .0000000  .0000000   .119251  .121268  -.101896  .040784
+    1917.60  -.032948  .022517   .203552  .021771   .0000000  .0000000  -.017169  .093714  -.018236  .029087
+    1917.65  -.004274  .018041   .202191  .017393   .0000000  .0000000   .223112  .056366   .133130  .035319
+    1917.70  -.029300  .023400   .187800  .020200   .0000000  .0000000   .092500  .064100   .150900  .036000
+    1917.75   .047363  .042714   .077854  .035380   .0000000  .0000000  -.021470  .089513  -.046959  .056889
+    1917.80   .027454  .027359   .011902  .023281   .0000000  .0000000  -.023835  .047870  -.100501  .044000
+    1917.85   .086395  .033256   .016630  .018122   .0000000  .0000000   .164901  .073747  -.031988  .042757
+    1917.90   .011086  .026318   .026413  .034694   .0000000  .0000000   .093324  .100088  -.148308  .056746
+    1917.95   .061347  .020973  -.033647  .023957   .0000000  .0000000  -.024511  .101763   .006694  .027343
+    1918.00  -.045800  .028200  -.126500  .035300   .0000000  .0000000   .111100  .145300  -.004400  .040900
+    1918.05  -.063352  .035400  -.187119  .045038   .0000000  .0000000  -.004287  .122131   .022486  .027016
+    1918.10  -.140380  .021869  -.029766  .034383   .0000000  .0000000   .138678  .119162  -.033442  .029042
+    1918.15  -.139590  .025411  -.046948  .025044   .0000000  .0000000   .255759  .076958   .009428  .028052
+    1918.20  -.186229  .018686  -.012003  .022437   .0000000  .0000000   .099720  .046074  -.030547  .019541
+    1918.25  -.197272  .017486  -.022847  .021751   .0000000  .0000000   .138537  .040238   .001337  .024304
+    1918.30  -.162233  .019532   .009864  .026445   .0000000  .0000000   .072541  .049151  -.023444  .023410
+    1918.35  -.209522  .022531   .106965  .024980   .0000000  .0000000   .166654  .068932  -.049008  .032858
+    1918.40  -.183315  .017646   .111698  .021615   .0000000  .0000000   .030447  .078502   .025251  .021946
+    1918.45  -.186120  .023373   .161230  .026925   .0000000  .0000000   .057971  .095803   .032482  .020663
+    1918.50  -.206139  .033232   .170211  .036136   .0000000  .0000000   .083654  .106947   .070057  .023682
+    1918.55  -.140500  .023300   .134700  .019600   .0000000  .0000000   .227200  .082400   .039700  .023100
+    1918.60  -.075624  .019336   .126939  .021875   .0000000  .0000000   .214103  .104242   .041851  .030046
+    1918.65  -.035250  .017052   .149125  .023557   .0000000  .0000000   .188283  .065782   .040647  .035960
+    1918.70  -.038388  .018281   .139481  .017860   .0000000  .0000000   .132147  .048923  -.014313  .024805
+    1918.75   .005607  .032180   .126979  .025465   .0000000  .0000000   .182018  .068228  -.028571  .028371
+    1918.80  -.039489  .022068   .133454  .021575   .0000000  .0000000   .134319  .041766  -.041681  .031411
+    1918.85  -.047400  .036400   .170000  .021500   .0000000  .0000000   .337000  .084200  -.073900  .051500
+    1918.90  -.061884  .029362   .112716  .024389   .0000000  .0000000   .055984  .073331  -.062078  .035249
+    1918.95  -.059354  .023109   .062420  .030480   .0000000  .0000000   .077009  .074970  -.013496  .022825
+    1919.00  -.058158  .032137   .016625  .047864   .0000000  .0000000  -.016848  .102171  -.051654  .033902
+    1919.05  -.045037  .027163   .121493  .032572   .0000000  .0000000   .061742  .159161   .007806  .023268
+    1919.10  -.064165  .030520   .072740  .023797   .0000000  .0000000   .054161  .103195  -.030628  .028565
+    1919.15  -.046142  .019958   .055541  .023710   .0000000  .0000000   .175499  .058670   .000885  .017390
+    1919.20  -.076649  .021472   .084834  .024008   .0000000  .0000000   .192932  .054744   .038099  .024214
+    1919.25  -.032000  .023100   .101400  .024500   .0000000  .0000000   .019400  .044200  -.032300  .039800
+    1919.30  -.032764  .019670   .042454  .021259   .0000000  .0000000   .063473  .058489  -.018695  .035014
+    1919.35  -.034002  .016296   .057361  .029991   .0000000  .0000000  -.073542  .063390   .036074  .027766
+    1919.40  -.081513  .022556   .071678  .026159   .0000000  .0000000   .028931  .092000  -.007650  .026187
+    1919.45  -.024396  .025236   .011394  .055909   .0000000  .0000000  -.005223  .115240   .015397  .031016
+    1919.50  -.005435  .021494   .014449  .023472   .0000000  .0000000  -.038104  .127579  -.000757  .018115
+    1919.55  -.036700  .021400  -.072300  .031400   .0000000  .0000000   .269200  .086200   .023200  .025300
+    1919.60  -.054480  .015453  -.035798  .017133   .0000000  .0000000   .178399  .073800   .000860  .022478
+    1919.65  -.109833  .019620  -.018115  .022290   .0000000  .0000000   .165576  .057084   .045457  .031020
+    1919.70  -.180209  .028864  -.046368  .034048   .0000000  .0000000  -.171687  .073328  -.040531  .036099
+    1919.75  -.144050  .022290   .048583  .024879   .0000000  .0000000   .020057  .046725   .052546  .035444
+    1919.80  -.181892  .022085  -.009524  .029451   .0000000  .0000000   .105329  .047459   .021452  .057824
+    1919.85  -.159213  .031568   .054630  .033813   .0000000  .0000000   .116987  .080398  -.092610  .059791
+    1919.90  -.092562  .035587  -.197751  .085221   .0000000  .0000000   .508266  .132410  -.030663  .066537
+    1919.95  -.186227  .020600   .107207  .025198   .0000000  .0000000   .190069  .079840  -.028542  .020491
+    1920.00  -.097388  .030280   .112723  .034355   .0000000  .0000000   .077211  .158857   .019743  .045632
+    1920.05  -.145513  .024771   .244405  .039029   .0000000  .0000000   .138524  .118895   .020497  .021109
+    1920.10  -.066010  .025834   .127964  .037067   .0000000  .0000000   .069846  .071235   .039802  .023703
+    1920.15  -.108000  .026100   .125400  .030600   .0000000  .0000000   .066300  .061600  -.028500  .020500
+    1920.20  -.066646  .021442   .249459  .031772   .0000000  .0000000   .259358  .059627   .009901  .025076
+    1920.25   .062692  .073768   .241400  .067889   .0000000  .0000000  -.048321  .138016   .122761  .080310
+    1920.30   .077897  .026364   .212694  .025041   .0000000  .0000000   .062704  .072934   .037479  .040486
+    1920.35   .112620  .035137   .177084  .039181   .0000000  .0000000  -.098984  .079850  -.019825  .039959
+    1920.40   .081000  .026100   .157700  .026100   .0000000  .0000000  -.043700  .108300  -.015600  .028200
+    1920.45   .148386  .049244   .115656  .054235   .0000000  .0000000   .112764  .143248   .013350  .037333
+    1920.50   .111770  .030133   .088776  .036499   .0000000  .0000000   .028214  .158865   .019352  .026783
+    1920.55   .063562  .015232  -.046004  .020074   .0000000  .0000000   .165210  .082557   .043804  .025214
+    1920.60   .129866  .041977   .027842  .044099   .0000000  .0000000   .444455  .121075   .035385  .035705
+    1920.65   .091341  .025804  -.043051  .044110   .0000000  .0000000   .423298  .113613   .126527  .044771
+    1920.70   .068767  .019510  -.053549  .019567   .0000000  .0000000   .301134  .054516   .031598  .032433
+    1920.75  -.008467  .023590  -.089633  .026491   .0000000  .0000000   .246094  .050688  -.014311  .026566
+    1920.80  -.052510  .023572  -.063097  .026540   .0000000  .0000000   .236741  .048355   .000018  .029138
+    1920.85  -.131312  .033720  -.127174  .033493   .0000000  .0000000   .118162  .097614  -.029769  .052448
+    1920.90  -.098074  .032286  -.069955  .039897   .0000000  .0000000   .253234  .084957  -.026576  .049577
+    1920.95  -.202848  .015313  -.093388  .023228   .0000000  .0000000   .182078  .068140  -.040270  .013923
+    1921.00  -.275100  .066800   .041200  .042500   .0000000  .0000000  -.023400  .165100   .016600  .058000
+    1921.05  -.199380  .028586   .005397  .035333   .0000000  .0000000  -.091572  .106408   .013613  .024602
+    1921.10  -.269861  .029700   .062960  .035227   .0000000  .0000000   .056699  .084797   .008766  .026645
+    1921.15  -.315700  .072269   .186534  .055564   .0000000  .0000000   .005612  .166973  -.066640  .056276
+    1921.20  -.190287  .020595   .164991  .022318   .0000000  .0000000   .165225  .054654   .011393  .022283
+    1921.25  -.119466  .019502   .139311  .022964   .0000000  .0000000   .019224  .041993   .045599  .037519
+    1921.30  -.014599  .021085   .217462  .027666   .0000000  .0000000  -.095568  .071875   .053887  .036645
+    1921.35   .031054  .022785   .201362  .025135   .0000000  .0000000  -.092298  .078183   .029571  .039060
+    1921.40   .091820  .030242   .160909  .034076   .0000000  .0000000   .148554  .113642  -.091464  .030982
+    1921.45   .100985  .022216   .083825  .027543   .0000000  .0000000   .026744  .143369   .003906  .018410
+    1921.50   .212445  .039267   .182524  .042606   .0000000  .0000000   .140091  .125525  -.098040  .030768
+    1921.55   .138182  .021575   .088243  .019204   .0000000  .0000000   .229534  .076740   .023025  .021882
+    1921.60   .178414  .025674   .025800  .028487   .0000000  .0000000   .214034  .076980  -.028148  .027220
+    1921.65   .167323  .022291   .004838  .025249   .0000000  .0000000   .247682  .060809   .003549  .027454
+    1921.70   .073545  .013037  -.078915  .019119   .0000000  .0000000   .220099  .042119   .012353  .023753
+    1921.75   .127179  .026772  -.080673  .030632   .0000000  .0000000   .314240  .060325   .082886  .038983
+    1921.80  -.002474  .023205  -.169272  .027927   .0000000  .0000000   .209071  .046972  -.018626  .044988
+    1921.85  -.007518  .031000  -.143864  .026801   .0000000  .0000000   .203157  .091797  -.064613  .051434
+    1921.90  -.098209  .028421   .106262  .070691   .0000000  .0000000   .097249  .075872  -.090948  .061889
+    1921.95  -.133071  .031967  -.095128  .035219   .0000000  .0000000   .117126  .148240   .014827  .043509
+    1922.00  -.045524  .055991  -.029486  .044384   .0000000  .0000000   .307043  .104146  -.016902  .046439
+    1922.05  -.194756  .044532  -.097510  .058848   .0000000  .0000000   .106856  .218178   .015172  .035679
+    1922.10  -.208934  .027890   .039567  .023542   .0000000  .0000000  -.073805  .098981  -.066748  .026652
+    1922.15  -.210300  .032200   .137300  .030800   .0000000  .0000000   .054500  .114600  -.016000  .036100
+    1922.20  -.165744  .024812   .125734  .026711   .0000000  .0000000   .114625  .076649   .019807  .040009
+    1922.25  -.162390  .024060   .134218  .035829   .0000000  .0000000   .058232  .055785  -.023740  .059016
+    1922.30  -.132697  .018657   .221570  .018851   .0000000  .0000000  -.022634  .045866   .005230  .025428
+    1922.35  -.090259  .029663   .277564  .025982   .0000000  .0000000   .017361  .084752  -.018873  .040448
+    1922.40  -.047480  .019893   .260568  .022366   .0000000  .0000000   .175300  .084793  -.012303  .021789
+    1922.45   .009070  .019132   .222538  .023939   .0000000  .0000000  -.056816  .112701  -.019610  .016697
+    1922.50   .111622  .026181   .240501  .028555   .0000000  .0000000   .412616  .116971  -.064542  .019953
+    1922.55   .088770  .020152   .114259  .024598   .0000000  .0000000   .214716  .105492   .025888  .030218
+    1922.60   .163154  .024272   .076991  .025729   .0000000  .0000000  -.013639  .112548  -.019895  .030195
+    1922.65   .151317  .021950   .014994  .023451   .0000000  .0000000   .186478  .061686  -.002172  .033412
+    1922.70   .141800  .018300   .014900  .018700   .0000000  .0000000   .139000  .038700   .018300  .031200
+    1922.75   .120772  .026230  -.019145  .032331   .0000000  .0000000   .103344  .057611   .012603  .056829
+    1922.80   .083381  .019058  -.139651  .018579   .0000000  .0000000   .134790  .050035  -.044946  .030526
+    1922.85   .063654  .035885  -.088851  .036843   .0000000  .0000000   .060419  .131035  -.020871  .058891
+    1922.90   .041976  .038739   .015059  .046298   .0000000  .0000000   .137765  .082264   .022699  .035152
+    1922.95  -.163179  .049215  -.120346  .044629   .0000000  .0000000  -.088422  .186106   .057819  .039344
+    1923.00  -.162345  .024176  -.088042  .028195   .0000000  .0000000  -.164558  .105026   .022870  .021395
+    1923.05  -.166986  .029597  -.055441  .032552   .0000000  .0000000  -.155703  .122746  -.022616  .036478
+    1923.10  -.332673  .046590  -.032441  .038226   .0000000  .0000000   .118174  .100248   .127325  .057503
+    1923.15  -.262008  .031040  -.033456  .038152   .0000000  .0000000  -.075136  .091210  -.070144  .043722
+    1923.20  -.207748  .020628   .016212  .020991   .0000000  .0000000  -.002057  .040807  -.018829  .031774
+    1923.25  -.274792  .051456   .140175  .032202   .0000000  .0000000   .200018  .110268   .020372  .031238
+    1923.30  -.179152  .022040   .157417  .021359   .0000000  .0000000  -.096701  .057214   .020842  .030157
+    1923.35  -.176779  .038078   .129676  .046107   .0000000  .0000000   .232484  .110410   .012090  .038815
+    1923.40  -.097364  .026461   .300984  .030708   .0000000  .0000000   .012199  .114308  -.024269  .032124
+    1923.45  -.024124  .029729   .317510  .037800   .0000000  .0000000   .242278  .122543  -.026966  .025412
+    1923.50  -.019994  .014380   .239535  .021068   .0000000  .0000000   .097043  .096033   .007601  .012214
+    1923.55   .060132  .038504   .240230  .038033   .0000000  .0000000   .008628  .090767  -.027426  .036225
+    1923.60   .112367  .014229   .311274  .019214   .0000000  .0000000   .109885  .052765   .034879  .027024
+    1923.65   .142183  .016013   .249476  .023914   .0000000  .0000000   .086034  .050317   .040333  .029040
+    1923.70   .151780  .026662   .226170  .029457   .0000000  .0000000   .065406  .051934   .009481  .027690
+    1923.75   .161990  .027635   .129040  .031921   .0000000  .0000000  -.002354  .060430   .038004  .044922
+    1923.80   .130175  .022364   .020789  .024598   .0000000  .0000000   .076566  .061195  -.044418  .038181
+    1923.85   .136144  .036406   .082803  .038211   .0000000  .0000000  -.134067  .095774   .027947  .040494
+    1923.90   .088243  .027972   .024731  .025906   .0000000  .0000000  -.078050  .103716   .037490  .030391
+    1923.95   .035504  .031898  -.012841  .031608   .0000000  .0000000   .128937  .135153   .027011  .025480
+    1924.00  -.005804  .035143   .073064  .051468   .0000000  .0000000  -.102657  .167052   .001261  .032029
+    1924.05  -.068517  .027242   .011667  .025525   .0000000  .0000000   .059077  .111376   .021297  .030942
+    1924.10  -.029063  .036913   .003840  .046785   .0000000  .0000000   .232378  .154239   .074931  .048315
+    1924.15  -.149500  .033400  -.020500  .049200   .0000000  .0000000   .296300  .127700   .093800  .074500
+    1924.20  -.151107  .021433   .038096  .026611   .0000000  .0000000   .023358  .049099   .009227  .029539
+    1924.25  -.170714  .022449   .072246  .022869   .0000000  .0000000   .026865  .044276  -.077597  .042873
+    1924.30  -.127400  .020900   .135100  .025000   .0000000  .0000000  -.040200  .068600  -.015300  .035600
+    1924.35  -.165261  .035290   .139194  .034218   .0000000  .0000000  -.000914  .122546  -.014604  .040754
+    1924.40  -.187563  .014175   .107926  .015713   .0000000  .0000000   .089797  .091070  -.022451  .023568
+    1924.45  -.081980  .023478   .195088  .030162   .0000000  .0000000   .124901  .125047  -.048720  .019768
+    1924.50  -.075229  .031225   .183050  .046061   .0000000  .0000000   .102382  .137256  -.009329  .023857
+    1924.55  -.059435  .017414   .142566  .018273   .0000000  .0000000   .192221  .072824   .009825  .019926
+    1924.60   .014627  .017728   .135909  .020162   .0000000  .0000000   .138120  .065731   .009780  .030529
+    1924.65   .029893  .027133   .185564  .023512   .0000000  .0000000   .102141  .075815   .020640  .040568
+    1924.70  -.002107  .026548   .154303  .031812   .0000000  .0000000  -.026603  .057367  -.011327  .030482
+    1924.75   .041539  .036354   .113626  .034837   .0000000  .0000000   .151911  .071214   .043723  .033814
+    1924.80   .032319  .024384   .000498  .024990   .0000000  .0000000   .207029  .078052  -.085419  .044908
+    1924.85  -.079291  .038861   .056224  .034261   .0000000  .0000000   .076218  .110676  -.016385  .058046
+    1924.90  -.006172  .018051   .025546  .020137   .0000000  .0000000  -.054575  .085395   .029590  .022098
+    1924.95   .035597  .040982   .085593  .033254   .0000000  .0000000   .234642  .097196   .022594  .030779
+    1925.00  -.012995  .031013   .036963  .045216   .0000000  .0000000   .188166  .186937   .012966  .026431
+    1925.05  -.056182  .020519  -.049412  .028318   .0000000  .0000000   .285166  .064449   .087534  .023179
+    1925.10  -.103481  .027056  -.003581  .026594   .0000000  .0000000   .125679  .101046  -.029143  .030668
+    1925.15  -.107312  .034292  -.041495  .031768   .0000000  .0000000   .212551  .082271  -.011883  .035673
+    1925.20  -.141179  .021992  -.046236  .026297   .0000000  .0000000  -.026763  .049519  -.021964  .028860
+    1925.25  -.102647  .037056   .016748  .044842   .0000000  .0000000  -.039005  .088062  -.049630  .046314
+    1925.30  -.130539  .021781   .119861  .026310   .0000000  .0000000   .018221  .070534  -.089786  .034850
+    1925.35  -.066774  .024942   .097721  .023850   .0000000  .0000000  -.014274  .068507  -.016102  .033898
+    1925.40  -.004013  .035871   .055231  .029359   .0000000  .0000000   .224329  .117863   .022171  .035324
+    1925.45  -.066873  .019233   .032174  .023508   .0000000  .0000000   .259899  .137874  -.029799  .017789
+    1925.50  -.055672  .016072   .061909  .019348   .0000000  .0000000   .361168  .126978   .002462  .014184
+    1925.55  -.070311  .022033   .114851  .022917   .0000000  .0000000   .040450  .074518   .020575  .020834
+    1925.60   .017853  .031090   .118506  .030840   .0000000  .0000000   .070523  .090048   .005634  .031098
+    1925.65  -.015743  .021671   .056794  .019940   .0000000  .0000000   .035280  .051561   .027148  .024849
+    1925.70   .001485  .022114   .004726  .025001   .0000000  .0000000   .123941  .045601   .003221  .030968
+    1925.75  -.005631  .042884   .015549  .045587   .0000000  .0000000   .017215  .067382  -.048574  .041449
+    1925.80   .001128  .022221   .013928  .028038   .0000000  .0000000   .024302  .054538  -.002247  .034619
+    1925.85  -.243256  .079470  -.060509  .053110   .0000000  .0000000   .276019  .175165  -.019029  .077528
+    1925.90  -.025734  .030105   .007049  .023785   .0000000  .0000000   .121188  .105485   .002998  .040199
+    1925.95  -.041648  .066166  -.013321  .030918   .0000000  .0000000   .015089  .105117   .021729  .049347
+    1926.00  -.199605  .036146  -.083663  .038724   .0000000  .0000000   .245215  .109884   .039478  .035638
+    1926.05  -.163818  .039434  -.029853  .040669   .0000000  .0000000   .044359  .068495   .053898  .032339
+    1926.10  -.073051  .027728  -.074540  .032460   .0000000  .0000000   .213393  .066358  -.048102  .023696
+    1926.15  -.177265  .023116  -.060285  .021659   .0000000  .0000000   .105872  .050817  -.037163  .026399
+    1926.20  -.230084  .046104  -.024826  .045615   .0000000  .0000000   .025719  .090929   .040620  .034105
+    1926.25  -.173813  .019079   .058121  .020126   .0000000  .0000000   .132828  .041532  -.018853  .028000
+    1926.30  -.052708  .037348   .122825  .027319   .0000000  .0000000  -.076773  .071126  -.041129  .037601
+    1926.35  -.106664  .050808   .067451  .031627   .0000000  .0000000   .269221  .103461  -.035203  .041686
+    1926.40  -.129567  .034399   .112402  .028636   .0000000  .0000000  -.020163  .110908   .014179  .027107
+    1926.45  -.076581  .041883   .132865  .051608   .0000000  .0000000   .286320  .144497  -.043525  .025421
+    1926.50  -.051765  .019589   .131885  .021134   .0000000  .0000000   .052798  .090155   .047918  .015748
+    1926.55  -.033933  .030075   .119936  .029214   .0000000  .0000000   .315712  .098450   .006669  .028847
+    1926.60  -.053049  .024930   .122331  .026656   .0000000  .0000000   .154883  .074546   .015092  .039362
+    1926.65  -.021532  .025016   .117705  .028125   .0000000  .0000000   .160320  .076375   .063924  .039989
+    1926.70   .018915  .028880   .156256  .031268   .0000000  .0000000   .164856  .056655  -.000981  .030026
+    1926.75  -.001894  .051763   .104146  .035162   .0000000  .0000000   .018542  .092282  -.065648  .073984
+    1926.80  -.075772  .034355   .076597  .025218   .0000000  .0000000   .115426  .075478  -.006398  .036664
+    1926.85  -.120294  .031359   .111799  .022066   .0000000  .0000000   .009381  .067532   .019260  .032445
+    1926.90  -.050061  .047015   .130391  .040796   .0000000  .0000000  -.137747  .156385   .046403  .040460
+    1926.95  -.098525  .038333   .073404  .038221   .0000000  .0000000   .009895  .081858   .017527  .033499
+    1927.00  -.058200  .031028   .056215  .030066   .0000000  .0000000   .045607  .114872   .011025  .024078
+    1927.05  -.142988  .021528   .109762  .025240   .0000000  .0000000   .117355  .050786   .038633  .014167
+    1927.10  -.032237  .029414   .116674  .028615   .0000000  .0000000   .072703  .088337   .033588  .026881
+    1927.15  -.095191  .041669   .115885  .031413   .0000000  .0000000  -.020091  .084410  -.002517  .021791
+    1927.20  -.059447  .042723   .084129  .029841   .0000000  .0000000   .129499  .067080   .031133  .036799
+    1927.25  -.115876  .069511   .071429  .057155   .0000000  .0000000  -.078722  .128583  -.029423  .079680
+    1927.30  -.052232  .023950   .049356  .028721   .0000000  .0000000  -.131758  .063986  -.015955  .033137
+    1927.35  -.054137  .026269   .027885  .031093   .0000000  .0000000  -.111493  .097984  -.040770  .029515
+    1927.40  -.013624  .039136   .120684  .028181   .0000000  .0000000   .007610  .143696  -.035268  .039320
+    1927.45   .095331  .054825   .074304  .030591   .0000000  .0000000   .251516  .118766   .055469  .038560
+    1927.50   .015128  .025200   .128662  .022917   .0000000  .0000000   .098949  .079649  -.039049  .019701
+    1927.55  -.016024  .022647   .158240  .023726   .0000000  .0000000   .097476  .087155  -.044639  .022680
+    1927.60  -.031647  .018259   .047004  .021176   .0000000  .0000000   .125683  .060861   .048557  .029299
+    1927.65  -.020014  .030139   .048718  .035066   .0000000  .0000000   .149458  .064278   .009084  .029568
+    1927.70  -.004146  .030681   .054252  .029156   .0000000  .0000000   .114527  .062750  -.020703  .027155
+    1927.75  -.052691  .022091   .005745  .024345   .0000000  .0000000   .004075  .043762  -.019228  .034849
+    1927.80  -.052571  .021420  -.025327  .020197   .0000000  .0000000   .121377  .062185  -.034289  .031578
+    1927.85  -.093446  .029344  -.044573  .032284   .0000000  .0000000   .242147  .119038  -.103622  .049001
+    1927.90  -.185615  .022153   .036816  .025910   .0000000  .0000000  -.005638  .086229   .039597  .024397
+    1927.95  -.159711  .056181  -.002380  .036259   .0000000  .0000000   .080488  .138148  -.032442  .037062
+    1928.00  -.008822  .073018  -.065239  .048131   .0000000  .0000000   .060773  .116263  -.147510  .046945
+    1928.05  -.145700  .027000  -.017500  .028100   .0000000  .0000000   .270700  .055800  -.018800  .023000
+    1928.10  -.134670  .045726   .100011  .059042   .0000000  .0000000   .168304  .084694   .043459  .044433
+    1928.15  -.142914  .038281   .014838  .046056   .0000000  .0000000   .107359  .084557  -.028794  .052158
+    1928.20  -.130658  .024641   .109191  .027751   .0000000  .0000000   .026775  .050999  -.017275  .032088
+    1928.25  -.071799  .039508   .135022  .041766   .0000000  .0000000  -.192268  .090376  -.008559  .044952
+    1928.30  -.077913  .033120   .109713  .023627   .0000000  .0000000  -.035111  .069778   .018221  .041598
+    1928.35  -.084562  .016658   .184119  .017469   .0000000  .0000000  -.049343  .069065   .025439  .023154
+    1928.40  -.070452  .022088   .122462  .029237   .0000000  .0000000   .106064  .091812  -.013073  .025375
+    1928.45  -.071262  .019075   .128166  .024402   .0000000  .0000000   .173467  .102949  -.034195  .016324
+    1928.50  -.023166  .030166   .138252  .028569   .0000000  .0000000   .127043  .091048  -.010519  .024191
+    1928.55  -.049392  .022526   .114652  .023977   .0000000  .0000000   .083308  .071831  -.025202  .024135
+    1928.60  -.132084  .056938  -.134582  .083942   .0000000  .0000000  -.190699  .101467   .059541  .048184
+    1928.65   .020427  .019776   .100107  .024660   .0000000  .0000000   .087240  .054196   .014561  .032237
+    1928.70  -.028438  .018567   .032299  .019668   .0000000  .0000000  -.034806  .039592   .048647  .026722
+    1928.75  -.110100  .026400   .107500  .033000   .0000000  .0000000  -.023100  .060300   .111700  .072200
+    1928.80  -.143376  .025745  -.000841  .024534   .0000000  .0000000  -.069267  .061539  -.023213  .023665
+    1928.85  -.115036  .034254   .011216  .024412   .0000000  .0000000   .040894  .081254  -.065663  .034994
+    1928.90  -.110841  .024115   .085727  .033606   .0000000  .0000000   .007425  .148468  -.024778  .044137
+    1928.95  -.072093  .032112   .151032  .037101   .0000000  .0000000   .038861  .124679  -.002752  .024079
+    1929.00  -.160303  .029001   .044210  .030370   .0000000  .0000000   .121852  .128216  -.032636  .021252
+    1929.05  -.288649  .053456   .003539  .044103   .0000000  .0000000  -.023736  .147949  -.084211  .042433
+    1929.10  -.100071  .039581   .109711  .034391   .0000000  .0000000   .289148  .113132  -.033205  .044177
+    1929.15  -.169363  .033012   .171496  .030953   .0000000  .0000000   .241431  .111617  -.005452  .049005
+    1929.20  -.126222  .020713   .140853  .024303   .0000000  .0000000   .067108  .045114  -.056829  .037420
+    1929.25  -.057249  .016782   .149535  .017242   .0000000  .0000000   .031820  .032694  -.046550  .031388
+    1929.30   .003629  .032178   .164681  .031323   .0000000  .0000000   .092760  .083365   .035925  .044336
+    1929.35   .131595  .040910   .332923  .037479   .0000000  .0000000  -.356197  .110153   .059423  .033529
+    1929.40   .031158  .021226   .160059  .029831   .0000000  .0000000   .028882  .119329   .013646  .030434
+    1929.45   .069220  .021082   .115295  .019283   .0000000  .0000000   .196940  .112372   .007935  .014267
+    1929.50   .103978  .030232   .187112  .034392   .0000000  .0000000   .202257  .130538   .013072  .024857
+    1929.55   .082883  .017225   .085168  .023736   .0000000  .0000000   .082421  .084147   .017983  .020976
+    1929.60   .049832  .020908  -.000080  .026960   .0000000  .0000000   .138280  .081479   .046409  .034977
+    1929.65   .073767  .019423   .013919  .021340   .0000000  .0000000   .065310  .066193   .016860  .034935
+    1929.70   .084972  .061105   .064950  .075161   .0000000  .0000000   .161526  .109929  -.025795  .083002
+    1929.75  -.015329  .020990  -.028934  .031128   .0000000  .0000000  -.002841  .046003  -.101838  .056884
+    1929.80  -.093999  .017499  -.073280  .016597   .0000000  .0000000   .073164  .043236  -.044932  .023701
+    1929.85  -.161299  .029904  -.061529  .021325   .0000000  .0000000  -.006386  .072407   .008835  .041415
+    1929.90  -.165908  .024019  -.084395  .026630   .0000000  .0000000  -.121433  .117280   .028022  .031988
+    1929.95  -.205862  .034033   .028014  .040755   .0000000  .0000000   .026057  .137650  -.067140  .030804
+    1930.00  -.214153  .025399  -.044059  .024030   .0000000  .0000000   .202892  .112867   .004848  .020655
+    1930.05  -.215942  .020998   .054329  .022252   .0000000  .0000000   .153369  .082377  -.003220  .020741
+    1930.10  -.225480  .033817   .057826  .028905   .0000000  .0000000   .103087  .099115  -.045942  .038739
+    1930.15  -.206525  .026438   .096138  .031489   .0000000  .0000000   .032674  .078500   .019438  .036829
+    1930.20  -.166814  .026412   .146704  .021097   .0000000  .0000000   .070394  .052440  -.038621  .031795
+    1930.25  -.130922  .025349   .224514  .023384   .0000000  .0000000  -.037018  .048621   .040396  .033628
+    1930.30  -.049593  .026987   .179473  .025143   .0000000  .0000000   .135378  .074078  -.008703  .042877
+    1930.35  -.125200  .026100   .154900  .024500   .0000000  .0000000   .104500  .094000  -.024100  .028100
+    1930.40   .006745  .019346   .237422  .020329   .0000000  .0000000  -.048105  .087983   .035750  .025097
+    1930.45   .017674  .022192   .198183  .024829   .0000000  .0000000   .497903  .112541  -.047527  .017231
+    1930.50   .035577  .019204   .132240  .022916   .0000000  .0000000   .114673  .112661   .031958  .015928
+    1930.55   .081022  .028941   .126161  .035280   .0000000  .0000000   .178570  .113183   .044067  .033186
+    1930.60   .098407  .020433   .114242  .025772   .0000000  .0000000   .115599  .079567   .015376  .029606
+    1930.65   .074379  .020892  -.037760  .025658   .0000000  .0000000  -.079804  .064054   .053494  .038670
+    1930.70   .062912  .022160  -.022243  .022567   .0000000  .0000000   .042622  .042296  -.013889  .047025
+    1930.75   .028598  .018984   .019082  .021020   .0000000  .0000000   .040430  .039123  -.000354  .032659
+    1930.80  -.011225  .023863  -.081563  .021891   .0000000  .0000000   .037880  .062133  -.007597  .035154
+    1930.85  -.084804  .062224  -.009200  .038617   .0000000  .0000000  -.028399  .149308   .076616  .069941
+    1930.90  -.116025  .028558  -.003658  .026403   .0000000  .0000000   .122780  .124121  -.036343  .039668
+    1930.95  -.158405  .032485  -.031682  .028104   .0000000  .0000000   .230804  .094347  -.015785  .025706
+    1931.00  -.353309  .096479   .027867  .089982   .0000000  .0000000  -.059218  .147494   .047382  .083239
+    1931.05  -.277671  .037328   .046550  .032796   .0000000  .0000000   .029490  .181518   .039120  .037162
+    1931.10  -.239000  .080700  -.015100  .066000   .0000000  .0000000   .135500  .183700  -.036200  .061100
+    1931.15  -.355078  .047704   .116611  .027520   .0000000  .0000000  -.068468  .119503  -.011647  .037294
+    1931.20  -.226864  .040213   .167103  .029516   .0000000  .0000000   .008206  .083614   .006204  .048961
+    1931.25  -.248657  .048779   .182523  .025817   .0000000  .0000000  -.106053  .087283  -.017485  .048950
+    1931.30  -.150564  .025159   .238762  .019410   .0000000  .0000000  -.021250  .053953  -.038649  .032878
+    1931.35  -.151393  .023537   .231228  .027262   .0000000  .0000000   .005501  .079420   .004284  .027058
+    1931.40  -.039529  .026810   .281355  .018958   .0000000  .0000000   .011981  .079330  -.009609  .023743
+    1931.45   .024987  .022077   .296176  .025076   .0000000  .0000000   .034315  .105782   .013971  .017995
+    1931.50   .039600  .020200   .242500  .021800   .0000000  .0000000   .024100  .122600  -.003900  .015000
+    1931.55   .074415  .022490   .182812  .023523   .0000000  .0000000   .025877  .085360   .022079  .023021
+    1931.60   .098426  .027142   .094944  .022076   .0000000  .0000000   .019474  .068532   .038770  .032649
+    1931.65   .082462  .022539   .055652  .020618   .0000000  .0000000  -.131105  .059693   .032424  .033455
+    1931.70   .165785  .028535   .079323  .020027   .0000000  .0000000   .014870  .042304  -.046763  .030159
+    1931.75   .067878  .020433   .029704  .017501   .0000000  .0000000  -.026892  .036533  -.004535  .030519
+    1931.80   .052973  .019446  -.106345  .016117   .0000000  .0000000  -.001599  .049110   .000611  .027249
+    1931.85  -.083590  .035160  -.105084  .021113   .0000000  .0000000   .167197  .098585  -.038658  .042268
+    1931.90  -.060868  .023135  -.054736  .023489   .0000000  .0000000   .098301  .077842  -.032916  .026478
+    1931.95  -.091079  .025492  -.143458  .016987   .0000000  .0000000   .006878  .111090   .002060  .014193
+    1932.00  -.117202  .022857  -.090917  .014931   .0000000  .0000000   .032518  .104975  -.031310  .014357
+    1932.05  -.196529  .025311  -.057717  .024631   .0000000  .0000000   .020887  .093791  -.023320  .023453
+    1932.10  -.166200  .038500  -.015500  .021000   .0000000  .0000000   .148800  .080700  -.020600  .028300
+    1932.15  -.312357  .031985   .014781  .024170   .0000000  .0000000   .038023  .080383  -.026564  .031241
+    1932.20  -.324819  .072653   .020690  .050831   .0000000  .0000000   .031104  .170624  -.100605  .080162
+    1932.25  -.229236  .026510   .137146  .021528   .0000000  .0000000   .013136  .050132   .049470  .031438
+    1932.30  -.199450  .026455   .181143  .016335   .0000000  .0000000   .095308  .054191  -.026872  .023956
+    1932.35  -.169007  .034571   .207207  .032670   .0000000  .0000000   .044033  .102384   .025012  .037867
+    1932.40  -.138350  .036293   .219864  .040626   .0000000  .0000000   .060440  .140345   .036075  .038355
+    1932.45  -.071670  .043042   .214482  .046258   .0000000  .0000000  -.173260  .179819  -.021750  .028001
+    1932.50  -.075142  .023103   .230743  .021057   .0000000  .0000000   .103975  .124324   .021563  .016261
+    1932.55  -.052070  .017708   .236227  .018063   .0000000  .0000000  -.052630  .081070   .009506  .023476
+    1932.60   .026338  .029331   .224720  .020402   .0000000  .0000000   .121501  .071173   .029831  .028301
+    1932.65   .071800  .021400   .178200  .016200   .0000000  .0000000   .176200  .064800   .027600  .034400
+    1932.70   .070092  .031963   .209808  .019638   .0000000  .0000000   .157431  .046568  -.018677  .039795
+    1932.75   .087369  .026903   .059518  .018128   .0000000  .0000000   .041519  .042163   .044435  .039343
+    1932.80   .122666  .029306   .122560  .023321   .0000000  .0000000   .119499  .083814   .019577  .054465
+    1932.85   .085699  .034806   .068358  .021347   .0000000  .0000000   .049531  .108948  -.015296  .041625
+    1932.90   .094388  .040534   .033874  .026315   .0000000  .0000000  -.108647  .114058  -.060994  .031474
+    1932.95   .097006  .050740   .030486  .029273   .0000000  .0000000   .482296  .145305   .000628  .028292
+    1933.00  -.073655  .027436  -.011865  .031985   .0000000  .0000000   .162502  .157095  -.020578  .021128
+    1933.05  -.058596  .051280   .014472  .053169   .0000000  .0000000   .223380  .102794   .066612  .048012
+    1933.10  -.188030  .022039  -.012586  .033302   .0000000  .0000000   .250070  .092253   .044862  .039280
+    1933.15  -.173476  .033322   .013624  .023011   .0000000  .0000000   .194918  .072032   .048475  .039047
+    1933.20  -.221474  .041821   .048831  .041000   .0000000  .0000000   .119403  .071452  -.081642  .051296
+    1933.25  -.211408  .022399   .107715  .020713   .0000000  .0000000  -.020870  .044128  -.019603  .039541
+    1933.30  -.186714  .030754   .112536  .021771   .0000000  .0000000  -.002865  .075552   .026320  .049219
+    1933.35  -.179116  .026288   .019117  .087056   .0000000  .0000000  -.201524  .142281   .035768  .052919
+    1933.40  -.132931  .016888   .166511  .016395   .0000000  .0000000   .060002  .072293  -.004573  .020527
+    1933.45  -.129933  .016924   .222792  .014909   .0000000  .0000000   .286473  .091703  -.005444  .011969
+    1933.50  -.065800  .025900   .247600  .020300   .0000000  .0000000   .311900  .120900  -.017000  .016600
+    1933.55  -.061257  .021807   .170077  .017113   .0000000  .0000000   .039399  .081939  -.018902  .022170
+    1933.60  -.092890  .018754   .168864  .018460   .0000000  .0000000   .113285  .056890   .045761  .023309
+    1933.65  -.011311  .017613   .114462  .013330   .0000000  .0000000   .064859  .048461   .045019  .025788
+    1933.70  -.041560  .030493   .155440  .028708   .0000000  .0000000   .049236  .053531  -.015828  .042651
+    1933.75  -.007268  .017906   .135250  .018020   .0000000  .0000000  -.007973  .034135  -.000158  .033869
+    1933.80  -.048100  .019500   .064100  .017400   .0000000  .0000000   .017600  .058100  -.063400  .038000
+    1933.85  -.030166  .025628   .051458  .019159   .0000000  .0000000   .034753  .089541   .032965  .037829
+    1933.90  -.059454  .029041   .050490  .020860   .0000000  .0000000  -.164756  .096039   .047298  .032548
+    1933.95  -.000334  .034076  -.055485  .023257   .0000000  .0000000   .230726  .104399   .016229  .025451
+    1934.00  -.047994  .028916   .160539  .032204   .0000000  .0000000   .065271  .168737  -.021590  .027670
+    1934.05  -.128330  .116172   .132957  .078644   .0000000  .0000000  -.139608  .119120  -.007947  .065655
+    1934.10  -.104712  .044574  -.032479  .045279   .0000000  .0000000   .189751  .182927  -.016887  .044388
+    1934.15  -.123185  .034839   .026628  .023806   .0000000  .0000000  -.001909  .080452   .042261  .036319
+    1934.20  -.156884  .022421   .046650  .014031   .0000000  .0000000  -.077774  .035064  -.053603  .025990
+    1934.25  -.146878  .022878   .039678  .017834   .0000000  .0000000   .004010  .039645   .032796  .035823
+    1934.30  -.212952  .024627   .066280  .025561   .0000000  .0000000   .004615  .064923  -.011894  .041422
+    1934.35  -.109680  .021540   .080647  .019629   .0000000  .0000000  -.072650  .066917   .003651  .024807
+    1934.40  -.064907  .045330   .218438  .045155   .0000000  .0000000  -.371262  .146182   .036964  .043452
+    1934.45  -.115818  .023038   .182058  .018394   .0000000  .0000000   .101136  .124249  -.027130  .015075
+    1934.50  -.093600  .024600   .146400  .021300   .0000000  .0000000  -.052800  .123400  -.006600  .016700
+    1934.55  -.026049  .035938   .206821  .025948   .0000000  .0000000   .146997  .091495  -.058792  .031002
+    1934.60  -.036375  .029411   .197949  .023037   .0000000  .0000000   .099724  .078245  -.046107  .031760
+    1934.65  -.018200  .015900   .130900  .014700   .0000000  .0000000   .117400  .055500   .027800  .028700
+    1934.70   .003251  .029618   .176660  .036611   .0000000  .0000000   .038319  .058136   .000146  .038912
+    1934.75  -.019469  .019153   .192448  .019467   .0000000  .0000000   .035354  .039079  -.123725  .034856
+    1934.80   .016400  .020800   .142200  .015600   .0000000  .0000000   .110800  .041500  -.044200  .026500
+    1934.85   .017784  .039544   .028679  .035506   .0000000  .0000000   .034240  .080020  -.051485  .039956
+    1934.90  -.064537  .023501   .102035  .022977   .0000000  .0000000  -.032496  .110469   .037326  .032922
+    1934.95  -.095694  .072841   .072497  .043608   .0000000  .0000000   .066833  .100561   .004247  .038628
+    1935.00  -.053671  .027453   .063917  .025431   .0000000  .0000000   .530155  .161149  -.037620  .019547
+    1935.05  -.169016  .044842   .020530  .061196   .0000000  .0000000   .000152  .139986   .016457  .054370
+    1935.10   .005900  .041800   .019800  .023600   .0000000  .0000000   .105800  .093200  -.024400  .029100
+    1935.15  -.121309  .039625   .043629  .025194   .0000000  .0000000   .154113  .083605   .027210  .035617
+    1935.20  -.067132  .058136   .059209  .032996   .0000000  .0000000   .070527  .094074   .016045  .067279
+    1935.25  -.065954  .020239   .062433  .016524   .0000000  .0000000   .020752  .038651   .017978  .031286
+    1935.30  -.066468  .018206   .107258  .015299   .0000000  .0000000   .147676  .050194  -.030079  .029955
+    1935.35  -.021635  .032644   .104029  .022829   .0000000  .0000000   .127678  .090082  -.013917  .034060
+    1935.40  -.033804  .023187   .063816  .014742   .0000000  .0000000   .084520  .068957  -.018098  .020813
+    1935.45  -.056658  .021884   .141422  .022076   .0000000  .0000000   .067394  .119437  -.035622  .016660
+    1935.50  -.052090  .023446   .108980  .020627   .0000000  .0000000   .081002  .098951  -.009813  .017371
+    1935.55  -.177790  .028614  -.002912  .021799   .0000000  .0000000   .175896  .084399   .095563  .025291
+    1935.60  -.039043  .021399   .085087  .019792   .0000000  .0000000   .042098  .070193  -.024099  .027889
+    1935.65  -.133855  .029242   .062467  .018438   .0000000  .0000000   .015839  .059663  -.000203  .031181
+    1935.70  -.005002  .024380   .093252  .014874   .0000000  .0000000   .086950  .036097  -.071649  .026762
+    1935.75  -.055390  .044761   .041687  .032838   .0000000  .0000000   .035882  .084773   .030563  .038356
+    1935.80  -.109561  .032418   .035449  .020733   .0000000  .0000000   .044617  .062241   .051621  .032317
+    1935.85  -.173680  .063585   .091852  .041729   .0000000  .0000000   .191925  .110010  -.010510  .050761
+    1935.90  -.136077  .022508   .056437  .019658   .0000000  .0000000   .189125  .083693  -.032856  .027713
+    1935.95  -.015578  .049221   .047611  .030480   .0000000  .0000000   .212536  .151736  -.092986  .028781
+    1936.00   .023251  .075588   .090679  .029556   .0000000  .0000000  -.002397  .137610  -.040276  .034707
+    1936.05  -.146877  .035923   .108152  .031524   .0000000  .0000000  -.182166  .136466  -.078906  .033638
+    1936.10  -.047500  .045100   .098500  .029300   .0000000  .0000000   .059100  .095300  -.064600  .041600
+    1936.15  -.125964  .044336   .209295  .047551   .0000000  .0000000  -.013101  .148607   .038221  .034734
+    1936.20  -.159573  .031869   .182595  .024035   .0000000  .0000000   .086452  .052309   .002678  .050131
+    1936.25  -.106700  .021800   .188100  .024300   .0000000  .0000000   .083400  .045200   .004700  .036900
+    1936.30  -.080483  .037462   .175745  .023124   .0000000  .0000000   .182437  .068031  -.021893  .040778
+    1936.35  -.093917  .025288   .159713  .018555   .0000000  .0000000   .254458  .063727   .016423  .025453
+    1936.40  -.037416  .027242   .107419  .017531   .0000000  .0000000   .164477  .088120  -.023220  .024444
+    1936.45   .060450  .027773   .167046  .014396   .0000000  .0000000   .176408  .107607  -.063856  .013305
+    1936.50  -.013617  .028925   .143961  .025305   .0000000  .0000000   .236894  .130004   .035176  .020557
+    1936.55  -.000451  .017115   .115066  .017856   .0000000  .0000000   .122627  .081777  -.058150  .020610
+    1936.60  -.004315  .025184   .072471  .020889   .0000000  .0000000   .038232  .081985  -.058168  .031985
+    1936.65  -.043164  .028713   .033288  .021693   .0000000  .0000000   .094645  .064962   .018201  .035522
+    1936.70  -.018826  .029628   .032928  .023917   .0000000  .0000000   .155039  .054656  -.025877  .033828
+    1936.75  -.074570  .021101  -.007560  .019749   .0000000  .0000000   .080734  .039849  -.029856  .040096
+    1936.80  -.106024  .027836  -.004717  .023634   .0000000  .0000000  -.100276  .067963   .123125  .041897
+    1936.85  -.100771  .034341  -.011306  .033811   .0000000  .0000000   .091602  .124978   .002425  .049008
+    1936.90  -.188334  .046712   .029368  .036290   .0000000  .0000000   .144275  .148300   .051888  .054622
+    1936.95  -.173300  .034400  -.047400  .033100   .0000000  .0000000   .208300  .134200  -.087100  .029800
+    1937.00  -.140145  .030719   .085152  .035730   .0000000  .0000000  -.028907  .188436   .019138  .025183
+    1937.05  -.193481  .028051   .094688  .027126   .0000000  .0000000   .064059  .116828  -.054443  .026500
+    1937.10  -.158811  .048222   .074182  .024328   .0000000  .0000000  -.005732  .118084  -.057897  .037315
+    1937.15  -.245489  .037300   .179964  .024899   .0000000  .0000000  -.082441  .095065   .015064  .035935
+    1937.20  -.176313  .024347   .131564  .021480   .0000000  .0000000  -.011162  .047116   .007665  .035588
+    1937.25  -.121499  .027993   .208926  .020364   .0000000  .0000000   .055374  .052535   .003693  .031433
+    1937.30  -.116696  .019325   .187814  .017441   .0000000  .0000000   .031160  .051109   .025088  .031903
+    1937.35  -.040102  .019283   .222305  .018618   .0000000  .0000000  -.006141  .067700   .013902  .025889
+    1937.40  -.088573  .032312   .195445  .025157   .0000000  .0000000   .036933  .108610   .035897  .031983
+    1937.45   .035320  .032900   .209660  .037569   .0000000  .0000000   .286079  .120190  -.061321  .033034
+    1937.50   .073386  .027070   .231432  .034139   .0000000  .0000000   .280629  .125639   .000056  .019985
+    1937.55   .069100  .021000   .137800  .021600   .0000000  .0000000   .183700  .097800  -.010900  .022900
+    1937.60   .090711  .017787   .121711  .017775   .0000000  .0000000   .155485  .063704  -.047427  .028153
+    1937.65   .056677  .025156   .054539  .029534   .0000000  .0000000   .085924  .077674   .002358  .044134
+    1937.70   .047138  .020415   .041472  .019505   .0000000  .0000000   .109899  .040740  -.021845  .033649
+    1937.75  -.015251  .029698  -.021479  .026262   .0000000  .0000000   .240537  .052747   .030065  .054171
+    1937.80  -.008680  .024570  -.029054  .021966   .0000000  .0000000  -.011361  .071538   .032695  .042628
+    1937.85  -.107027  .052301  -.071074  .029844   .0000000  .0000000  -.010644  .121826  -.009140  .052614
+    1937.90  -.105060  .033224  -.016349  .021708   .0000000  .0000000   .000897  .097421   .024894  .028423
+    1937.95  -.217410  .042351  -.006067  .021722   .0000000  .0000000   .163760  .106926  -.045437  .024199
+    1938.00  -.204894  .067766   .021733  .040401   .0000000  .0000000  -.026212  .134573   .019500  .049776
+    1938.05  -.303156  .051189   .013057  .057781   .0000000  .0000000   .455009  .256240   .061652  .060953
+    1938.10  -.147755  .030762   .071361  .022609   .0000000  .0000000   .103134  .085082   .057226  .032009
+    1938.15  -.221442  .020302   .102093  .022050   .0000000  .0000000   .012967  .059919  -.070502  .029053
+    1938.20  -.226757  .021464   .130364  .026643   .0000000  .0000000   .001658  .043406  -.006758  .051291
+    1938.25  -.171954  .020038   .165869  .024298   .0000000  .0000000  -.015881  .041937   .027639  .048387
+    1938.30  -.138432  .027223   .225318  .026550   .0000000  .0000000   .005010  .071389   .049609  .036109
+    1938.35  -.116911  .032602   .287363  .030442   .0000000  .0000000   .023008  .087321  -.083163  .045743
+    1938.40  -.046436  .022237   .227821  .021177   .0000000  .0000000   .113723  .092236  -.024826  .026919
+    1938.45  -.080914  .049543   .286589  .026940   .0000000  .0000000   .413938  .153469  -.041876  .030065
+    1938.50   .111257  .046529   .295958  .032882   .0000000  .0000000   .105264  .144089  -.049291  .032748
+    1938.55   .109700  .023800   .236000  .032100   .0000000  .0000000   .188500  .136200   .070100  .035900
+    1938.60   .174186  .027008   .248989  .025076   .0000000  .0000000  -.058945  .089978   .001625  .036058
+    1938.65   .172035  .024829   .065415  .017812   .0000000  .0000000  -.020619  .065169  -.092811  .034848
+    1938.70   .075919  .028103   .117887  .029399   .0000000  .0000000   .080439  .054649   .078144  .057554
+    1938.75   .167309  .024278   .023607  .020665   .0000000  .0000000   .012905  .044571   .011731  .039332
+    1938.80   .026111  .026090  -.003055  .018168   .0000000  .0000000  -.050130  .064328   .032800  .035397
+    1938.85  -.037869  .024814  -.061382  .026313   .0000000  .0000000  -.139398  .101758   .068126  .036773
+    1938.90  -.052264  .036085  -.072478  .027939   .0000000  .0000000   .227134  .081018  -.049973  .031785
+    1938.95  -.134539  .074845   .030821  .034255   .0000000  .0000000   .203647  .139364   .006955  .034675
+    1939.00  -.301769  .052095   .106206  .041046   .0000000  .0000000   .097782  .134445   .126933  .040015
+    1939.05  -.116858  .031761  -.001150  .027067   .0000000  .0000000   .069219  .114100  -.043972  .026676
+    1939.10  -.213896  .052347   .044637  .029951   .0000000  .0000000   .100499  .115589  -.034090  .040064
+    1939.15  -.161300  .028000   .101800  .022400   .0000000  .0000000   .026600  .079200   .033400  .032600
+    1939.20  -.181054  .026344   .143917  .017714   .0000000  .0000000   .108271  .043838  -.012560  .032033
+    1939.25  -.192526  .031348   .184454  .017928   .0000000  .0000000   .063502  .044160  -.075863  .035745
+    1939.30  -.119371  .031056   .187626  .017082   .0000000  .0000000   .060381  .054162  -.000618  .035005
+    1939.35  -.079336  .031918   .224723  .019528   .0000000  .0000000   .100471  .072304  -.010194  .028022
+    1939.40  -.087263  .033604   .216206  .018087   .0000000  .0000000   .029625  .098189  -.024268  .026120
+    1939.45  -.044976  .026415   .211200  .017721   .0000000  .0000000   .127332  .116805   .012013  .015370
+    1939.50   .023086  .029357   .214921  .024272   .0000000  .0000000   .143133  .143921  -.008201  .020892
+    1939.55   .072500  .021500   .233900  .028500   .0000000  .0000000   .200600  .111800   .034800  .028200
+    1939.60   .118411  .034504   .224190  .022418   .0000000  .0000000   .287927  .083553   .059985  .030415
+    1939.65   .146657  .026608   .195121  .022452   .0000000  .0000000   .056615  .078763   .049268  .045366
+    1939.70   .095496  .035816   .180767  .028811   .0000000  .0000000  -.041206  .062114   .054138  .050547
+    1939.75   .089672  .036394   .076885  .031936   .0000000  .0000000   .103650  .054497   .044565  .059625
+    1939.80   .069378  .025942   .045780  .020362   .0000000  .0000000   .014679  .068846   .001210  .038438
+    1939.85   .042361  .022277   .018571  .019603   .0000000  .0000000   .116647  .076374  -.030570  .028495
+    1939.90   .005289  .024937   .055015  .021233   .0000000  .0000000   .263913  .091441  -.088895  .026766
+    1939.95  -.058344  .061163   .043141  .028428   .0000000  .0000000  -.027276  .144601  -.054993  .033244
+    1940.00   .027411  .077275  -.055656  .040309   .0000000  .0000000   .280673  .124019  -.035461  .049996
+    1940.05  -.148565  .048427  -.007660  .029624   .0000000  .0000000   .036827  .132048  -.063083  .034740
+    1940.10  -.249170  .031848  -.018138  .026098   .0000000  .0000000   .102082  .088814  -.092441  .032061
+    1940.15  -.210741  .037178   .047170  .021871   .0000000  .0000000   .010781  .074147  -.079933  .032336
+    1940.20  -.226589  .024698   .078515  .018759   .0000000  .0000000   .085455  .046548  -.040264  .028160
+    1940.25  -.290100  .050400   .142200  .033500   .0000000  .0000000   .134700  .071900   .042900  .053100
+    1940.30  -.223492  .021873   .078291  .021431   .0000000  .0000000   .027242  .064239  -.034537  .032075
+    1940.35  -.135189  .033253   .151824  .022526   .0000000  .0000000   .232845  .087503  -.051245  .033133
+    1940.40  -.175712  .026622   .271518  .024079   .0000000  .0000000   .114010  .103141   .010283  .029308
+    1940.45  -.063144  .024189   .235042  .021942   .0000000  .0000000   .478962  .120381  -.016662  .017980
+    1940.50  -.029661  .027901   .260179  .025258   .0000000  .0000000   .238529  .128248   .022554  .021672
+    1940.55   .019816  .031393   .250937  .020228   .0000000  .0000000   .354490  .091541   .059761  .024911
+    1940.60   .162656  .033993   .241704  .019243   .0000000  .0000000   .174897  .087947   .029852  .031332
+    1940.65   .098439  .030861   .147379  .026781   .0000000  .0000000   .240708  .082500   .081456  .045187
+    1940.70   .065800  .040900   .175200  .018000   .0000000  .0000000  -.035700  .042700   .085200  .040300
+    1940.75   .125165  .021480   .119102  .016993   .0000000  .0000000   .016575  .035997   .066860  .036856
+    1940.80   .070275  .044378   .085726  .026840   .0000000  .0000000  -.112729  .075342   .022843  .052931
+    1940.85   .053300  .039909   .043221  .022772   .0000000  .0000000   .036946  .099058   .016973  .049873
+    1940.90   .004300  .047102  -.026993  .022398   .0000000  .0000000   .087581  .123251  -.052575  .037425
+    1940.95  -.049213  .047073   .034742  .025669   .0000000  .0000000   .139401  .127260  -.014801  .025328
+    1941.00   .033843  .046840   .015616  .040643   .0000000  .0000000  -.091313  .169246  -.034822  .030156
+    1941.05   .033262  .065113  -.034927  .049589   .0000000  .0000000   .245435  .199929  -.094435  .040091
+    1941.10  -.043717  .034446   .028212  .023694   .0000000  .0000000  -.081372  .089249  -.088631  .024387
+    1941.15  -.000032  .040323   .034220  .023892   .0000000  .0000000  -.150594  .086706  -.096703  .041061
+    1941.20   .008262  .043291   .025372  .030470   .0000000  .0000000   .248876  .079912   .058207  .043168
+    1941.25  -.118927  .034295   .084292  .022975   .0000000  .0000000   .111681  .054924   .024383  .042665
+    1941.30  -.183857  .030309   .100975  .021078   .0000000  .0000000   .107066  .059447   .000181  .036107
+    1941.35  -.159123  .039022   .204194  .031221   .0000000  .0000000   .071615  .081202  -.068183  .040363
+    1941.40  -.088480  .032885   .133512  .017317   .0000000  .0000000   .070452  .086127   .044016  .024793
+    1941.45  -.092443  .034238   .191571  .017249   .0000000  .0000000   .117795  .113137  -.001774  .015851
+    1941.50  -.062260  .034985   .120954  .025898   .0000000  .0000000   .154337  .164516   .060142  .021607
+    1941.55  -.073372  .034124   .253085  .025499   .0000000  .0000000   .175314  .089621  -.032968  .031504
+    1941.60   .012678  .047325   .219220  .028237   .0000000  .0000000   .377508  .098725   .051572  .037240
+    1941.65  -.041165  .030633   .167041  .020566   .0000000  .0000000   .226991  .070394   .075100  .036381
+    1941.70  -.086224  .042656   .093311  .024666   .0000000  .0000000  -.065811  .076606   .024269  .038115
+    1941.75   .001683  .035139   .150415  .033889   .0000000  .0000000   .066674  .066441  -.051084  .071325
+    1941.80   .068909  .027624   .186888  .030051   .0000000  .0000000  -.062154  .087481   .111358  .049014
+    1941.85  -.028851  .042976   .102187  .034278   .0000000  .0000000  -.062261  .122940  -.000004  .047542
+    1941.90  -.020115  .032129   .119301  .036007   .0000000  .0000000   .083441  .141823   .000045  .040889
+    1941.95   .145863  .062788   .081312  .039067   .0000000  .0000000  -.007050  .135487  -.107320  .035369
+    1942.00  -.029700  .035000   .145400  .036400   .0000000  .0000000  -.023400  .145000   .047000  .030200
+    1942.05  -.086609  .043305   .107756  .043155   .0000000  .0000000   .130386  .156484  -.001875  .044788
+    1942.10   .034025  .099193   .019905  .065306   .0000000  .0000000   .143195  .150532  -.075786  .050544
+    1942.15  -.065983  .072737   .120029  .039191   .0000000  .0000000  -.010695  .103966  -.056494  .047800
+    1942.20  -.026845  .054073   .031907  .044318   .0000000  .0000000   .058500  .099629  -.057425  .067689
+    1942.25  -.066569  .033252   .031627  .021536   .0000000  .0000000   .235923  .052015   .010261  .035920
+    1942.30  -.008392  .035500   .098245  .025834   .0000000  .0000000  -.010612  .066911   .041308  .034586
+    1942.35  -.012154  .043636   .089180  .020492   .0000000  .0000000   .145144  .083706   .067848  .034201
+    1942.40  -.068264  .024748   .122550  .016674   .0000000  .0000000   .096755  .072277   .030454  .019928
+    1942.45  -.064544  .021997   .139302  .017836   .0000000  .0000000   .314458  .119425  -.015997  .014334
+    1942.50  -.032732  .023724   .122930  .023171   .0000000  .0000000   .154348  .125251  -.016508  .019523
+    1942.55  -.007371  .025769   .174390  .020405   .0000000  .0000000   .184138  .089648  -.053147  .023645
+    1942.60  -.089026  .027264   .117492  .027789   .0000000  .0000000   .171854  .105929   .063537  .043272
+    1942.65  -.075180  .025712   .095255  .017548   .0000000  .0000000   .079381  .066570   .051325  .035699
+    1942.70  -.036158  .026547   .121535  .020117   .0000000  .0000000   .056200  .051173   .051601  .032470
+    1942.75  -.075817  .024570   .122674  .020107   .0000000  .0000000   .044556  .041433   .073768  .042854
+    1942.80  -.089165  .025839   .085346  .023589   .0000000  .0000000  -.085206  .072822   .050192  .047934
+    1942.85  -.152931  .030206   .083401  .026797   .0000000  .0000000   .064794  .101785  -.119249  .040379
+    1942.90  -.103187  .039909   .103300  .029302   .0000000  .0000000  -.051792  .135763  -.004428  .042467
+    1942.95  -.039915  .046498   .183470  .030930   .0000000  .0000000  -.154219  .135897   .022603  .031303
+    1943.00  -.090405  .044945   .234551  .028097   .0000000  .0000000   .031918  .130831   .002072  .024383
+    1943.05  -.093652  .033425   .180949  .023112   .0000000  .0000000   .307004  .136349   .039921  .032842
+    1943.10  -.061971  .041347   .090993  .035224   .0000000  .0000000   .125377  .126839  -.037571  .041480
+    1943.15  -.080573  .025864   .145031  .020718   .0000000  .0000000   .010542  .065253  -.060381  .032471
+    1943.20  -.051329  .044348   .138129  .024337   .0000000  .0000000   .114304  .060216  -.071526  .042656
+    1943.25   .001923  .020443   .184841  .014117   .0000000  .0000000   .080154  .033484  -.028209  .025002
+    1943.30  -.019745  .047888   .090795  .029239   .0000000  .0000000   .286805  .085349  -.065939  .046350
+    1943.35   .035917  .046036   .105605  .027853   .0000000  .0000000  -.071916  .116350   .011802  .039509
+    1943.40   .078661  .029069   .117427  .015875   .0000000  .0000000  -.017176  .107309   .031813  .027567
+    1943.45   .033384  .028581   .108682  .016851   .0000000  .0000000   .211785  .118690  -.001950  .015077
+    1943.50   .105491  .034946   .061063  .017106   .0000000  .0000000   .162842  .133454   .015217  .015918
+    1943.55  -.047847  .103549  -.001805  .032245   .0000000  .0000000   .078989  .171419  -.055324  .049530
+    1943.60  -.036338  .029169   .050187  .016889   .0000000  .0000000   .270467  .067593   .080426  .035071
+    1943.65   .022793  .032813   .034134  .016076   .0000000  .0000000   .131087  .060479   .025598  .033468
+    1943.70   .070899  .035442   .024180  .017600   .0000000  .0000000  -.005569  .045031   .007882  .031512
+    1943.75   .004438  .048663   .011224  .022566   .0000000  .0000000  -.051189  .056973   .018685  .052347
+    1943.80  -.122806  .048296   .001491  .031982   .0000000  .0000000  -.112682  .090687   .019698  .065615
+    1943.85  -.144327  .059258   .028604  .023563   .0000000  .0000000  -.227848  .107147   .001673  .039855
+    1943.90  -.120953  .040528   .074676  .019274   .0000000  .0000000  -.181415  .090120   .034939  .027690
+    1943.95  -.253705  .054648   .095567  .033760   .0000000  .0000000  -.038519  .105800   .043310  .030581
+    1944.00  -.188535  .056504   .058157  .026927   .0000000  .0000000   .011710  .117984   .050033  .025258
+    1944.05  -.213170  .050255   .082626  .030045   .0000000  .0000000  -.043329  .159056   .015731  .038148
+    1944.10  -.133388  .045661   .103606  .024095   .0000000  .0000000   .229543  .103942   .175796  .038943
+    1944.15  -.243714  .051614   .045296  .028302   .0000000  .0000000   .177000  .105652   .113149  .053398
+    1944.20  -.280687  .055970   .123924  .030138   .0000000  .0000000  -.188279  .079808   .142494  .052159
+    1944.25  -.099857  .044604   .132270  .024510   .0000000  .0000000  -.025648  .058133   .069120  .050952
+    1944.30  -.102089  .049295   .098582  .026644   .0000000  .0000000  -.105879  .081537  -.005922  .046044
+    1944.35   .034173  .049135   .068935  .022447   .0000000  .0000000  -.023121  .090661  -.065807  .032003
+    1944.40   .052475  .031410   .180058  .020077   .0000000  .0000000  -.054212  .110366  -.009055  .033903
+    1944.45   .204300  .039900   .170300  .019200   .0000000  .0000000  -.041200  .149500  -.017000  .018300
+    1944.50   .174930  .034829   .065429  .018224   .0000000  .0000000   .283677  .123221   .036322  .017098
+    1944.55   .236527  .044383   .061957  .020707   .0000000  .0000000   .188768  .113215   .012042  .027235
+    1944.60   .208915  .031465  -.039275  .017646   .0000000  .0000000  -.005744  .077108   .019100  .031084
+    1944.65   .171265  .036525  -.034213  .019816   .0000000  .0000000  -.062495  .073567  -.102429  .040486
+    1944.70   .158830  .051306  -.127515  .024358   .0000000  .0000000  -.038891  .054838   .097809  .058068
+    1944.75  -.041184  .050911  -.081574  .028622   .0000000  .0000000   .155086  .088314  -.062691  .057585
+    1944.80  -.054199  .033951  -.141045  .019266   .0000000  .0000000  -.094099  .062789   .080547  .037140
+    1944.85  -.122864  .049362  -.138640  .027245   .0000000  .0000000  -.050906  .092832  -.001887  .045221
+    1944.90  -.173922  .041193  -.079180  .024982   .0000000  .0000000  -.034262  .124491   .051550  .040084
+    1944.95  -.266129  .053704  -.029277  .022854   .0000000  .0000000   .131877  .110016  -.008643  .020029
+    1945.00  -.117527  .098174   .046084  .041335   .0000000  .0000000   .087723  .217282   .013102  .036075
+    1945.05  -.172366  .049912   .076642  .030967   .0000000  .0000000   .267719  .179675  -.006805  .044952
+    1945.10  -.218168  .050084   .119657  .026439   .0000000  .0000000   .154283  .108024   .033489  .042789
+    1945.15  -.269380  .049677   .084980  .028834   .0000000  .0000000   .082804  .098489   .000447  .045397
+    1945.20  -.105476  .046714   .185324  .018697   .0000000  .0000000  -.039045  .050584   .029208  .036366
+    1945.25  -.252149  .085268   .252063  .049965   .0000000  .0000000  -.159686  .129068   .042012  .044566
+    1945.30  -.119100  .039700   .283700  .019900   .0000000  .0000000   .073600  .061300  -.050300  .036300
+    1945.35  -.098829  .042741   .296275  .018875   .0000000  .0000000   .039859  .081486   .017185  .031128
+    1945.40   .041205  .032181   .299528  .018137   .0000000  .0000000   .064232  .099406   .040381  .028527
+    1945.45   .070100  .036700   .328900  .019100   .0000000  .0000000   .396100  .134000  -.033000  .017800
+    1945.50   .161286  .035364   .243704  .019020   .0000000  .0000000   .203888  .143130   .028038  .016730
+    1945.55   .111735  .045860   .157891  .023770   .0000000  .0000000   .181839  .111435   .048925  .027434
+    1945.60   .279930  .033860   .129955  .019470   .0000000  .0000000  -.146537  .081354  -.012702  .036212
+    1945.65   .210791  .036056   .086270  .018333   .0000000  .0000000  -.033172  .070699   .023239  .035846
+    1945.70   .167958  .069541  -.034212  .029604   .0000000  .0000000  -.117022  .078929   .033399  .058465
+    1945.75   .387534  .081155  -.060857  .039921   .0000000  .0000000  -.163738  .085766   .026932  .080324
+    1945.80   .203824  .038877  -.175689  .021959   .0000000  .0000000  -.196190  .063085  -.030286  .035599
+    1945.85  -.009562  .068992  -.200723  .050136   .0000000  .0000000  -.100653  .130011  -.024714  .045668
+    1945.90   .082043  .098983  -.254725  .060995   .0000000  .0000000  -.152230  .134994  -.064263  .053177
+    1945.95  -.167775  .079020   .011828  .069978   .0000000  .0000000   .177563  .114048   .221283  .066533
+    1946.00  -.105894  .056205  -.143593  .034311   .0000000  .0000000   .199964  .143624  -.000929  .034314
+    1946.05  -.238800  .088800  -.143600  .064100   .0000000  .0000000   .131900  .121100  -.025600  .062000
+    1946.10  -.161621  .048683  -.086524  .026893   .0000000  .0000000   .231302  .121796  -.045219  .045241
+    1946.15  -.292120  .041826  -.032154  .024745   .0000000  .0000000  -.072356  .097341  -.079506  .047899
+    1946.20  -.369539  .095096   .005399  .055328   .0000000  .0000000   .052740  .148879  -.113594  .053330
+    1946.25  -.243748  .049762   .106804  .017998   .0000000  .0000000   .037891  .052028  -.000958  .033355
+    1946.30  -.260700  .043900   .154700  .024700   .0000000  .0000000   .146500  .060100   .015300  .028900
+    1946.35  -.227834  .043383   .263600  .027335   .0000000  .0000000   .054514  .099861  -.014064  .035241
+    1946.40  -.105890  .029765   .285597  .015086   .0000000  .0000000   .209512  .066402  -.021484  .018107
+    1946.45  -.219288  .045405   .379684  .028341   .0000000  .0000000   .452054  .158962  -.033761  .026542
+    1946.50  -.063112  .023701   .324947  .023954   .0000000  .0000000   .329269  .135513  -.005721  .018983
+    1946.55   .056826  .021226   .295929  .018350   .0000000  .0000000  -.002104  .085088  -.017459  .020736
+    1946.60   .082673  .031070   .302031  .017679   .0000000  .0000000   .128310  .076546   .041444  .030472
+    1946.65   .134672  .028275   .242569  .018267   .0000000  .0000000  -.028935  .065586  -.006894  .035842
+    1946.70   .188918  .042253   .179805  .024653   .0000000  .0000000  -.085803  .069558   .082797  .058786
+    1946.75   .230337  .027345   .153795  .018577   .0000000  .0000000  -.135090  .042785   .070652  .040411
+    1946.80   .230653  .029557   .126700  .021510   .0000000  .0000000  -.081513  .070902   .011646  .042602
+    1946.85   .324003  .050001  -.014854  .031141   .0000000  .0000000  -.035261  .123641   .093395  .055954
+    1946.90   .083430  .029570  -.030662  .030935   .0000000  .0000000   .022357  .123080  -.104915  .035679
+    1946.95   .071411  .037775  -.089697  .035099   .0000000  .0000000   .207114  .170228  -.059531  .032194
+    1947.00   .033741  .037012  -.095143  .035317   .0000000  .0000000   .042302  .138704  -.001326  .028954
+    1947.05  -.003804  .040478  -.062704  .036415   .0000000  .0000000   .057712  .144446   .028471  .038643
+    1947.10  -.105253  .032813  -.159077  .026207   .0000000  .0000000  -.130260  .128557  -.006703  .040601
+    1947.15  -.140851  .044726  -.129656  .031276   .0000000  .0000000   .151813  .087397  -.009561  .037416
+    1947.20  -.217901  .022739  -.081483  .019933   .0000000  .0000000   .194724  .038687  -.082918  .045835
+    1947.25  -.204585  .031621  -.117897  .024841   .0000000  .0000000   .088210  .050211   .043359  .050085
+    1947.30  -.260050  .024410   .044441  .020965   .0000000  .0000000   .143500  .059651  -.004458  .031726
+    1947.35  -.358491  .051825   .174358  .038713   .0000000  .0000000  -.150770  .096426  -.043413  .039711
+    1947.40  -.202905  .022247   .152120  .016348   .0000000  .0000000   .142834  .078507  -.003972  .021997
+    1947.45  -.254945  .036398   .153196  .024495   .0000000  .0000000   .397632  .136809   .050744  .019703
+    1947.50  -.137802  .039259   .288460  .018339   .0000000  .0000000   .293369  .123364  -.003044  .017321
+    1947.55  -.094877  .027323   .287150  .018613   .0000000  .0000000   .368362  .095231   .027479  .024367
+    1947.60   .023089  .026612   .335301  .022225   .0000000  .0000000   .150553  .077407   .061567  .034232
+    1947.65   .060945  .023461   .357002  .018134   .0000000  .0000000   .097432  .066202   .048073  .035423
+    1947.70   .113078  .020025   .313539  .016869   .0000000  .0000000  -.070258  .035820   .101461  .024940
+    1947.75   .120020  .028834   .273848  .017090   .0000000  .0000000  -.054866  .041783   .080301  .036715
+    1947.80   .175924  .021367   .294753  .021098   .0000000  .0000000  -.096099  .059629  -.025532  .033285
+    1947.85   .206992  .026904   .222458  .026059   .0000000  .0000000  -.169918  .093163   .019324  .036768
+    1947.90   .140099  .156501   .174866  .060855   .0000000  .0000000   .308350  .258739  -.060133  .111353
+    1947.95   .157648  .033763   .156590  .020766   .0000000  .0000000  -.193207  .100077  -.016713  .022002
+    1948.00   .225955  .060139   .143369  .036132   .0000000  .0000000  -.092621  .131439  -.043843  .036950
+    1948.05   .157129  .032190   .071959  .019313   .0000000  .0000000   .173710  .115614  -.018864  .031870
+    1948.10   .150055  .042780   .021583  .029804   .0000000  .0000000   .052631  .106024  -.078329  .042590
+    1948.15   .171585  .046287  -.019271  .026507   .0000000  .0000000   .106127  .104273   .019381  .050631
+    1948.20   .145400  .027900  -.041700  .017300   .0000000  .0000000   .061600  .043200  -.053500  .028000
+    1948.25   .147680  .042680  -.064178  .028623   .0000000  .0000000   .200452  .066728  -.018979  .038952
+    1948.30   .053983  .032261  -.075038  .023059   .0000000  .0000000   .129227  .065461  -.012305  .032841
+    1948.35  -.045837  .029177  -.072956  .018100   .0000000  .0000000   .188712  .075504   .014525  .029107
+    1948.40  -.091431  .027583  -.067958  .028678   .0000000  .0000000   .169771  .114458   .026487  .034330
+    1948.45  -.076060  .032359   .010010  .024096   .0000000  .0000000   .027309  .122213  -.001558  .022938
+    1948.50  -.106057  .029471   .014185  .023433   .0000000  .0000000   .331345  .133211   .006509  .020305
+    1948.55  -.097516  .035671   .015430  .022947   .0000000  .0000000   .126049  .105235  -.000300  .028138
+    1948.60  -.130026  .022269   .063326  .020675   .0000000  .0000000   .013796  .068888  -.005195  .026597
+    1948.65  -.136613  .027877   .110269  .016852   .0000000  .0000000   .035140  .061022   .025543  .033534
+    1948.70  -.236212  .036919   .081015  .020424   .0000000  .0000000  -.058798  .047650   .040632  .030948
+    1948.75  -.122022  .023509   .165015  .021825   .0000000  .0000000  -.061524  .043538   .001342  .044698
+    1948.80  -.082996  .027186   .181422  .022777   .0000000  .0000000  -.039394  .068076  -.033338  .040318
+    1948.85  -.102718  .027953   .194496  .030520   .0000000  .0000000  -.054000  .090691   .015084  .040774
+    1948.90  -.056364  .032781   .288203  .026870   .0000000  .0000000  -.055418  .127534   .046448  .038790
+    1948.95  -.060517  .032204   .337067  .027905   .0000000  .0000000   .111431  .081826   .008714  .026545
+    1949.00  -.038708  .049316   .272547  .039019   .0000000  .0000000   .165371  .196818   .017298  .033085
+    1949.05   .050766  .046642   .309560  .032725   .0000000  .0000000   .053360  .111299   .008811  .040210
+    1949.10  -.036412  .034106   .244629  .035866   .0000000  .0000000   .058169  .111719   .045433  .043521
+    1949.15   .092035  .026254   .269182  .028319   .0000000  .0000000   .047496  .079311  -.003430  .044089
+    1949.20   .117000  .030700   .151400  .021500   .0000000  .0000000   .121100  .057800  -.038500  .032400
+    1949.25   .167243  .019974   .119693  .019482   .0000000  .0000000   .029460  .038689   .002111  .032263
+    1949.30   .167879  .019742   .072692  .018970   .0000000  .0000000   .079695  .055856  -.065511  .031070
+    1949.35   .134722  .018528   .072089  .017990   .0000000  .0000000  -.005600  .064474  -.028475  .024032
+    1949.40   .145230  .020357   .001256  .019435   .0000000  .0000000  -.009693  .083433  -.012814  .022777
+    1949.45   .089326  .032677  -.093079  .026228   .0000000  .0000000   .145656  .151896  -.012762  .022385
+    1949.50   .154408  .024388  -.078539  .019318   .0000000  .0000000   .266006  .106446  -.037253  .018520
+    1949.55   .073064  .019811  -.060780  .019254   .0000000  .0000000   .142959  .090937  -.041160  .022053
+    1949.60   .043289  .020218  -.033614  .020112   .0000000  .0000000   .205821  .056832   .001724  .022392
+    1949.65  -.013262  .031902  -.122149  .021421   .0000000  .0000000   .142460  .071339   .053448  .035449
+    1949.70  -.164254  .018967  -.145566  .017345   .0000000  .0000000  -.015451  .034611   .066843  .027464
+    1949.75  -.163827  .021670  -.040926  .019401   .0000000  .0000000   .024694  .039400   .012926  .034357
+    1949.80  -.236686  .025116  -.074967  .021759   .0000000  .0000000  -.159054  .061893  -.000411  .033474
+    1949.85  -.237557  .024531   .040887  .019382   .0000000  .0000000  -.125444  .074771   .002484  .027168
+    1949.90  -.224455  .033530   .063927  .018810   .0000000  .0000000   .023909  .066713  -.057764  .022311
+    1949.95  -.290753  .033619   .157252  .026266   .0000000  .0000000   .122957  .121459   .002499  .023060
+    1950.00  -.220930  .031188   .287191  .027116   .0000000  .0000000   .096834  .072355   .057514  .028313
+    1950.05  -.222249  .025733   .248856  .019958   .0000000  .0000000   .104625  .074014  -.005680  .018913
+    1950.10  -.144425  .027227   .335072  .022605   .0000000  .0000000   .028561  .060323  -.026022  .026755
+    1950.15  -.061597  .027136   .365805  .021433   .0000000  .0000000   .024639  .059588  -.037465  .026662
+    1950.20   .023935  .031899   .338761  .020543   .0000000  .0000000   .059885  .052747   .066709  .027018
+    1950.25   .046105  .025279   .332438  .016279   .0000000  .0000000   .076271  .042306   .073850  .026697
+    1950.30   .127597  .020170   .297890  .015238   .0000000  .0000000   .056717  .042025  -.009493  .022675
+    1950.35   .258100  .018500   .317900  .015100   .0000000  .0000000  -.020400  .045700  -.037300  .017900
+    1950.40   .238376  .018584   .209297  .018693   .0000000  .0000000  -.076414  .079552   .026728  .021964
+    1950.45   .300481  .034000   .140257  .022063   .0000000  .0000000   .057815  .104537  -.019883  .022607
+    1950.50   .287564  .026024   .015981  .022256   .0000000  .0000000   .226741  .112107  -.052289  .020011
+    1950.55   .286892  .019714   .093660  .017169   .0000000  .0000000   .112008  .067624   .007534  .019107
+    1950.60   .270451  .020268  -.079337  .015524   .0000000  .0000000   .067069  .046463   .031933  .019940
+    1950.65   .258830  .028976  -.098373  .021452   .0000000  .0000000   .172046  .055504  -.006099  .028183
+    1950.70   .116078  .031592  -.227489  .022550   .0000000  .0000000   .003803  .057717   .008677  .031671
+    1950.75  -.010608  .020131  -.232154  .018407   .0000000  .0000000  -.004975  .037832   .033624  .028346
+    1950.80  -.087101  .027544  -.278552  .022565   .0000000  .0000000  -.063955  .066989  -.024757  .025075
+    1950.85  -.183732  .026532  -.306109  .019244   .0000000  .0000000  -.110177  .063411  -.030087  .026370
+    1950.90  -.306855  .023793  -.243256  .019914   .0000000  .0000000   .053527  .057910  -.056163  .022108
+    1950.95  -.321363  .042409  -.117027  .020603   .0000000  .0000000   .059400  .104950   .044587  .020723
+    1951.00  -.365022  .027994   .014938  .024338   .0000000  .0000000   .033574  .070227   .052409  .023757
+    1951.05  -.304225  .029966   .001015  .019948   .0000000  .0000000   .245382  .073638  -.006980  .023904
+    1951.10  -.369566  .026330   .099280  .020125   .0000000  .0000000   .016276  .066839  -.017562  .022936
+    1951.15  -.378609  .027648   .229045  .020079   .0000000  .0000000   .090817  .056998   .047240  .025224
+    1951.20  -.253183  .022810   .324399  .018429   .0000000  .0000000   .046964  .041849   .002459  .028010
+    1951.25  -.183608  .024150   .395804  .019034   .0000000  .0000000  -.037382  .044917   .057110  .031569
+    1951.30  -.113043  .023771   .407480  .014823   .0000000  .0000000   .062870  .045151  -.038716  .023368
+    1951.35   .025400  .022200   .357400  .017600   .0000000  .0000000   .124400  .055300   .024200  .022200
+    1951.40   .169217  .024409   .366203  .018242   .0000000  .0000000   .024260  .074441  -.045446  .022145
+    1951.45   .251730  .029607   .336817  .018573   .0000000  .0000000   .236504  .116554  -.033823  .017608
+    1951.50   .268771  .026562   .266485  .020994   .0000000  .0000000   .157566  .093858  -.016515  .020215
+    1951.55   .325834  .019822   .218909  .017563   .0000000  .0000000   .235511  .071342  -.004900  .019775
+    1951.60   .416116  .016950   .097318  .012584   .0000000  .0000000   .155524  .039133  -.041868  .017702
+    1951.65   .369300  .021400   .007200  .015000   .0000000  .0000000   .065100  .049500  -.037700  .025500
+    1951.70   .311161  .023969  -.128485  .015394   .0000000  .0000000   .039483  .040843   .057950  .022981
+    1951.75   .291955  .028273  -.216643  .022009   .0000000  .0000000   .089520  .052363   .037232  .033229
+    1951.80   .143989  .022624  -.282893  .015852   .0000000  .0000000   .040347  .048814   .001367  .022678
+    1951.85   .078168  .022632  -.298582  .017123   .0000000  .0000000  -.003139  .050304   .007860  .021614
+    1951.90  -.072498  .032917  -.293768  .018894   .0000000  .0000000   .125502  .076976   .015054  .025251
+    1951.95  -.121266  .022373  -.283286  .017006   .0000000  .0000000   .057744  .061298   .007417  .016688
+    1952.00  -.228941  .023453  -.289334  .015160   .0000000  .0000000   .065699  .092924   .003733  .013960
+    1952.05  -.384844  .040550  -.280973  .024273   .0000000  .0000000   .284884  .084576  -.039072  .026814
+    1952.10  -.425432  .029375  -.085033  .024938   .0000000  .0000000   .197790  .069953   .036197  .028108
+    1952.15  -.415187  .022758   .007147  .018201   .0000000  .0000000   .014303  .053656  -.042298  .024848
+    1952.20  -.438050  .021653   .104950  .013956   .0000000  .0000000   .103593  .038544   .013736  .021002
+    1952.25  -.373937  .019560   .199595  .015899   .0000000  .0000000   .082171  .034312  -.021995  .029667
+    1952.30  -.214791  .022330   .330880  .015622   .0000000  .0000000  -.000098  .045004   .010157  .021459
+    1952.35  -.237011  .019115   .436678  .016079   .0000000  .0000000   .085512  .059804  -.036097  .020952
+    1952.40  -.206498  .024081   .424479  .014987   .0000000  .0000000  -.106002  .058773  -.011340  .017563
+    1952.45  -.114247  .019359   .462331  .013963   .0000000  .0000000   .197230  .078764  -.027464  .013303
+    1952.50   .053909  .020944   .452330  .015244   .0000000  .0000000   .220087  .065328  -.021920  .014673
+    1952.55   .152162  .021907   .415113  .015937   .0000000  .0000000   .258642  .055326  -.015693  .018024
+    1952.60   .302914  .027762   .389455  .021787   .0000000  .0000000   .189218  .066538  -.038539  .026682
+    1952.65   .303583  .024397   .272217  .019567   .0000000  .0000000   .027558  .060530   .059113  .029543
+    1952.70   .379665  .028581   .235664  .018126   .0000000  .0000000   .074403  .052206   .018652  .023236
+    1952.75   .284255  .027142   .115197  .015107   .0000000  .0000000   .068113  .039440  -.013031  .024266
+    1952.80   .290673  .022339   .004058  .017613   .0000000  .0000000  -.026814  .055548  -.016646  .029117
+    1952.85   .273678  .020792  -.093103  .016658   .0000000  .0000000  -.034611  .056709  -.003478  .023533
+    1952.90   .201204  .024394  -.160920  .017352   .0000000  .0000000   .101205  .066918  -.021440  .021197
+    1952.95   .092473  .035990  -.181244  .018135   .0000000  .0000000   .170540  .070181   .035931  .018927
+    1953.00   .123811  .046112  -.231433  .020713   .0000000  .0000000   .146975  .077941   .022420  .020965
+    1953.05  -.059768  .026615  -.287803  .019405   .0000000  .0000000   .073539  .061229   .031161  .022222
+    1953.10  -.099969  .025918  -.181194  .018804   .0000000  .0000000   .323839  .059555   .015830  .022517
+    1953.15  -.117820  .027928  -.081862  .022704   .0000000  .0000000   .083580  .061634   .087507  .024412
+    1953.20  -.288724  .030705  -.112507  .019672   .0000000  .0000000   .199470  .052632   .023652  .024078
+    1953.25  -.256646  .026746  -.080086  .022173   .0000000  .0000000  -.022337  .051580   .003880  .031966
+    1953.30  -.275672  .020599   .047975  .014455   .0000000  .0000000  -.058750  .041994   .037409  .023317
+    1953.35  -.343300  .027500   .172800  .021700   .0000000  .0000000   .059600  .060800  -.079200  .026000
+    1953.40  -.325734  .024532   .244282  .019035   .0000000  .0000000  -.140676  .074294  -.025887  .022799
+    1953.45  -.275838  .026641   .294124  .022470   .0000000  .0000000  -.053471  .102814  -.008273  .021290
+    1953.50  -.079095  .026144   .448538  .019122   .0000000  .0000000  -.217507  .080168  -.055041  .019564
+    1953.55  -.029260  .034099   .528535  .024925   .0000000  .0000000  -.271311  .082407  -.112618  .028206
+    1953.60   .021387  .028585   .421200  .018422   .0000000  .0000000   .246134  .065248  -.032333  .023040
+    1953.65   .022300  .022600   .491500  .016100   .0000000  .0000000   .021900  .051500  -.053600  .025900
+    1953.70   .219443  .028716   .448367  .021305   .0000000  .0000000   .081104  .050590  -.103119  .029687
+    1953.75   .204160  .023329   .288329  .022475   .0000000  .0000000   .063711  .047750   .050719  .031526
+    1953.80   .197400  .022700   .214300  .018100   .0000000  .0000000  -.168400  .053500   .047700  .029700
+    1953.85   .224082  .032786   .155717  .022938   .0000000  .0000000  -.147230  .058603   .052039  .028865
+    1953.90   .236336  .031970   .022065  .020042   .0000000  .0000000  -.041651  .071485  -.009290  .026217
+    1953.95   .184200  .022800   .032600  .018100   .0000000  .0000000   .031900  .065100   .028800  .017000
+    1954.00   .136603  .026849  -.090735  .023182   .0000000  .0000000  -.050796  .061331  -.024245  .023569
+    1954.05   .015320  .026526  -.126354  .027416   .0000000  .0000000   .055392  .101392  -.020027  .026427
+    1954.10   .036575  .028672  -.126953  .021059   .0000000  .0000000   .049545  .062772   .017389  .023557
+    1954.15  -.024887  .026248  -.150786  .018394   .0000000  .0000000   .027980  .050050   .006061  .023351
+    1954.20  -.154021  .026855  -.147087  .022367   .0000000  .0000000   .099882  .049362  -.064110  .038953
+    1954.25  -.164556  .021461  -.108061  .015823   .0000000  .0000000   .013419  .035979   .034450  .032006
+    1954.30  -.195623  .019666  -.112539  .014869   .0000000  .0000000   .068849  .042354  -.004632  .022316
+    1954.35  -.239513  .027637  -.079926  .020540   .0000000  .0000000   .120193  .052482  -.023196  .024829
+    1954.40  -.212137  .021964   .053878  .015717   .0000000  .0000000  -.030530  .063171  -.023356  .019706
+    1954.45  -.133960  .026786   .116843  .020849   .0000000  .0000000   .148397  .093316  -.062326  .018748
+    1954.50  -.215416  .032565   .144317  .022605   .0000000  .0000000   .077216  .082065   .011241  .023161
+    1954.55  -.127059  .022877   .218349  .016607   .0000000  .0000000   .220575  .059648  -.058397  .018458
+    1954.60  -.161882  .021549   .209542  .014593   .0000000  .0000000   .143856  .050849  -.025255  .018115
+    1954.65   .022753  .033378   .272072  .017886   .0000000  .0000000   .370787  .069710  -.024009  .031002
+    1954.70  -.093222  .026299   .296413  .019708   .0000000  .0000000   .117923  .043945  -.004252  .024702
+    1954.75  -.075965  .029848   .339411  .018236   .0000000  .0000000   .090049  .048544  -.034750  .027623
+    1954.80   .010000  .028200   .310600  .017800   .0000000  .0000000   .081200  .052000   .034100  .027200
+    1954.85  -.019012  .031351   .279865  .019533   .0000000  .0000000  -.167084  .066989  -.023408  .025878
+    1954.90  -.029023  .024480   .206222  .019033   .0000000  .0000000   .033885  .058871  -.016160  .021829
+    1954.95   .099499  .037242   .204533  .031026   .0000000  .0000000  -.042950  .097768   .047091  .030742
+    1955.00   .017291  .021213   .175152  .014290   .0000000  .0000000   .033370  .060138  -.009317  .014478
+    1955.05   .124344  .031213   .144779  .017718   .0000000  .0000000   .155624  .053807   .046471  .021918
+    1955.10   .029988  .022320   .049576  .019991   .0000000  .0000000   .130361  .063377  -.044089  .022481
+    1955.15   .124568  .023803   .140522  .017538   .0000000  .0000000   .099333  .048360  -.019436  .019780
+    1955.20   .158988  .028047   .106674  .020956   .0000000  .0000000   .027132  .056954   .019986  .020199
+    1955.25   .105321  .020346   .083753  .013910   .0000000  .0000000   .145617  .037687  -.006161  .018209
+    1955.30   .046473  .022676  -.027556  .016976   .0000000  .0000000   .059051  .046376  -.011698  .024166
+    1955.35   .065044  .022393  -.038566  .018508   .0000000  .0000000   .141355  .053642   .015979  .020549
+    1955.40   .041687  .021698  -.021509  .017344   .0000000  .0000000   .049719  .058520  -.013052  .018222
+    1955.45  -.001269  .019033  -.080686  .017959   .0000000  .0000000   .157478  .077168  -.034083  .014725
+    1955.50  -.055935  .018975  -.006263  .016799   .0000000  .0000000   .168650  .068965  -.004592  .014438
+    1955.55   .003124  .021527   .039639  .017456   .0000000  .0000000   .285877  .055508  -.027040  .017711
+    1955.60  -.109785  .024289   .034162  .020938   .0000000  .0000000   .155096  .051168   .005073  .020720
+    1955.65  -.137337  .016833   .039769  .014406   .0000000  .0000000   .221681  .037552   .015682  .016835
+    1955.70  -.226992  .018502   .043228  .013887   .0000000  .0000000   .019429  .034500   .008777  .017654
+    1955.75  -.229553  .028384   .066146  .018650   .0000000  .0000000   .028042  .048891  -.015119  .021530
+    1955.80  -.219600  .034400   .137300  .022400   .0000000  .0000000   .055500  .068100  -.045900  .026000
+    1955.85  -.189281  .026314   .159204  .023051   .0000000  .0000000   .008612  .064603  -.018369  .029468
+    1955.90  -.219306  .015150   .167037  .014494   .0000000  .0000000  -.007341  .043047  -.058591  .015797
+    1955.95  -.203131  .020472   .233918  .019303   .0000000  .0000000  -.005547  .055439  -.053440  .017788
+    1956.00  -.070247  .032431   .341707  .031719   .0000000  .0000000   .135590  .076991   .014708  .031785
+    1956.05  -.007398  .035739   .192673  .028194   .0000000  .0000000   .279279  .089268   .011918  .030549
+    1956.10   .016713  .022564   .339190  .016817   .0000000  .0000000  -.016698  .043762   .026854  .019658
+    1956.15   .038798  .019068   .279099  .015588   .0000000  .0000000   .074850  .041926   .016647  .017933
+    1956.20   .117409  .024592   .334384  .022962   .0000000  .0000000   .116289  .049460  -.006365  .018888
+    1956.25   .083759  .020019   .248766  .015039   .0000000  .0000000   .150435  .038028   .011561  .018956
+    1956.30   .152189  .026345   .209354  .017636   .0000000  .0000000   .075592  .048774  -.003266  .022999
+    1956.35   .160798  .016985   .161261  .012469   .0000000  .0000000   .097469  .041497  -.003484  .014663
+    1956.40   .211912  .021913   .132122  .016197   .0000000  .0000000  -.051769  .059819   .008059  .017699
+    1956.45   .219468  .026982   .113755  .020920   .0000000  .0000000   .021605  .075035  -.053813  .017971
+    1956.50   .212688  .023269   .021181  .017172   .0000000  .0000000   .002238  .083659  -.027947  .015641
+    1956.55   .169132  .028754  -.055280  .025008   .0000000  .0000000   .141001  .088082  -.001245  .026443
+    1956.60   .146149  .017097   .000797  .015538   .0000000  .0000000   .153254  .042082  -.055786  .017332
+    1956.65   .059496  .017297  -.049301  .015542   .0000000  .0000000   .073822  .039023  -.068925  .019163
+    1956.70   .018377  .015792  -.044723  .014377   .0000000  .0000000   .116191  .033209   .042646  .018835
+    1956.75  -.050507  .015619  -.037579  .015578   .0000000  .0000000   .100776  .031217  -.026861  .016950
+    1956.80  -.204692  .020241  -.059809  .016760   .0000000  .0000000   .042062  .045466  -.058731  .018652
+    1956.85  -.228535  .015021   .004844  .015190   .0000000  .0000000   .101849  .044702  -.061427  .017412
+    1956.90  -.318792  .017388   .068497  .018115   .0000000  .0000000   .059661  .049314  -.004755  .019308
+    1956.95  -.290530  .022402   .108736  .015607   .0000000  .0000000   .073717  .070250  -.046158  .016280
+    1957.00  -.401787  .020041   .175879  .017971   .0000000  .0000000   .020759  .054482  -.038155  .017054
+    1957.05  -.340710  .013184   .217146  .014033   .0000000  .0000000   .043470  .039909   .013138  .013164
+    1957.10  -.222754  .020310   .314496  .018886   .0000000  .0000000   .133183  .046866   .069621  .020912
+    1957.15  -.224552  .015429   .381610  .015155   .0000000  .0000000   .043022  .041393  -.013743  .016201
+    1957.20  -.194858  .017215   .441895  .013724   .0000000  .0000000   .036351  .034424   .007720  .019962
+    1957.25  -.099300  .012700   .411100  .012500   .0000000  .0000000   .052800  .030400   .017200  .013700
+    1957.30   .007920  .019006   .425095  .016097   .0000000  .0000000  -.068439  .041536  -.043108  .021122
+    1957.35   .076323  .017320   .453030  .014204   .0000000  .0000000   .022407  .046976  -.013461  .017459
+    1957.40   .152477  .017111   .481943  .013762   .0000000  .0000000  -.008718  .049449  -.044238  .015537
+    1957.45   .235240  .019941   .383132  .014899   .0000000  .0000000   .054280  .061264  -.026198  .015178
+    1957.50   .240076  .018320   .308449  .014258   .0000000  .0000000   .127074  .057250  -.053032  .014600
+    1957.55   .292684  .018822   .272059  .014287   .0000000  .0000000   .164388  .051760  -.012495  .016205
+    1957.60   .345486  .021836   .208463  .017253   .0000000  .0000000   .144962  .046548  -.044037  .019490
+    1957.65   .271110  .017701   .018347  .016626   .0000000  .0000000   .186498  .041069  -.008776  .019808
+    1957.70   .229000  .019985  -.058924  .017160   .0000000  .0000000   .212200  .039170   .039827  .021540
+    1957.75   .126351  .013356  -.051070  .011486   .0000000  .0000000   .098832  .028027   .000193  .016418
+    1957.80   .039747  .017662  -.126282  .015886   .0000000  .0000000   .103719  .040471   .013898  .018150
+    1957.85  -.003182  .017681  -.164541  .014422   .0000000  .0000000   .103918  .045521  -.058888  .017935
+    1957.90  -.069900  .017277  -.130259  .016231   .0000000  .0000000   .044071  .049795   .025530  .017047
+    1957.95  -.209601  .016394  -.084401  .013534   .0000000  .0000000   .013751  .041087   .004369  .013311
+    1958.00  -.305232  .025889  -.027916  .020974   .0000000  .0000000   .082277  .079180  -.008332  .020418
+    1958.05  -.343994  .024077   .036549  .023193   .0000000  .0000000   .119698  .054790  -.000916  .021924
+    1958.10  -.333001  .029858   .173344  .021209   .0000000  .0000000   .184998  .061702   .025625  .021775
+    1958.15  -.335927  .021083   .215384  .017353   .0000000  .0000000  -.038407  .050054   .059727  .019629
+    1958.20  -.305676  .013074   .288831  .012035   .0000000  .0000000   .000673  .027834   .029655  .017165
+    1958.25  -.300800  .016700   .338700  .012700   .0000000  .0000000   .068600  .037200  -.012200  .014500
+    1958.30  -.179030  .015640   .409116  .012973   .0000000  .0000000   .000773  .035277  -.023103  .015460
+    1958.35  -.101308  .015426   .407552  .013248   .0000000  .0000000  -.082328  .041851  -.003564  .015349
+    1958.40  -.041921  .011854   .434062  .011071   .0000000  .0000000   .055644  .041768  -.053159  .012218
+    1958.45   .051783  .015866   .422110  .012064   .0000000  .0000000   .232517  .059118  -.058358  .011873
+    1958.50   .098517  .016172   .451402  .013366   .0000000  .0000000   .046882  .056090  -.034994  .012743
+    1958.55   .180900  .016500   .370800  .013300   .0000000  .0000000   .091200  .044200  -.047700  .014600
+    1958.60   .203233  .018061   .334686  .013407   .0000000  .0000000   .011579  .041113  -.035020  .017378
+    1958.65   .303286  .015997   .248765  .012940   .0000000  .0000000   .125521  .035626  -.012307  .016621
+    1958.70   .276253  .012998   .146280  .010124   .0000000  .0000000  -.015057  .027164  -.007869  .014747
+    1958.75   .267226  .014759   .075078  .011492   .0000000  .0000000   .047112  .029887   .006651  .014882
+    1958.80   .266128  .019581   .119921  .014314   .0000000  .0000000   .031926  .040676  -.005640  .019317
+    1958.85   .213073  .022286  -.055607  .017133   .0000000  .0000000   .187421  .049471  -.037917  .021103
+    1958.90   .164238  .017142  -.060513  .012750   .0000000  .0000000   .112400  .041721  -.007397  .014646
+    1958.95   .101815  .018071  -.044255  .014672   .0000000  .0000000  -.037404  .040891   .040556  .014509
+    1959.00   .016105  .016596  -.129490  .016078   .0000000  .0000000   .215527  .058118   .043330  .014219
+    1959.05  -.095165  .015366  -.054368  .013998   .0000000  .0000000  -.027941  .050308   .039826  .013974
+    1959.10  -.153168  .012186  -.068371  .010996   .0000000  .0000000  -.074850  .034602   .038500  .012638
+    1959.15  -.195475  .012676  -.058794  .010334   .0000000  .0000000  -.105669  .029582   .067018  .012900
+    1959.20  -.253927  .011124   .017351  .010816   .0000000  .0000000  -.142133  .024682  -.006852  .012762
+    1959.25  -.238076  .011033   .061599  .010326   .0000000  .0000000  -.131493  .023456  -.007203  .014765
+    1959.30  -.240657  .013727   .198641  .012008   .0000000  .0000000  -.101022  .033062  -.033398  .015979
+    1959.35  -.252739  .016361   .262649  .012664   .0000000  .0000000  -.062746  .043776  -.057614  .015424
+    1959.40  -.214144  .015160   .308577  .012240   .0000000  .0000000  -.021546  .048769  -.098482  .014808
+    1959.45  -.142987  .014320   .396049  .012083   .0000000  .0000000   .121990  .055278  -.110626  .011749
+    1959.50  -.037927  .015406   .401546  .013586   .0000000  .0000000   .080033  .055336  -.131910  .013763
+    1959.55  -.034800  .013400   .382000  .012900   .0000000  .0000000   .264400  .044500  -.023000  .012800
+    1959.60   .106849  .019451   .415365  .015951   .0000000  .0000000   .293255  .046029  -.042593  .020540
+    1959.65   .129032  .016194   .368627  .012976   .0000000  .0000000   .179256  .037492  -.054083  .016866
+    1959.70   .175804  .019261   .336333  .014357   .0000000  .0000000   .099735  .039610   .006099  .021384
+    1959.75   .222541  .020118   .303817  .015057   .0000000  .0000000   .192338  .042252   .040102  .019978
+    1959.80   .203199  .012170   .215274  .011218   .0000000  .0000000   .075466  .029823  -.025358  .016907
+    1959.85   .202366  .014406   .197922  .014152   .0000000  .0000000  -.028643  .033913   .086031  .018165
+    1959.90   .175341  .011394   .085444  .010511   .0000000  .0000000   .049587  .030991   .019198  .011465
+    1959.95   .132030  .014553   .058528  .014121   .0000000  .0000000  -.013851  .052494  -.002008  .012094
+    1960.00   .008173  .019278   .006252  .016657   .0000000  .0000000   .178324  .069497   .058431  .015235
+    1960.05  -.003037  .017665  -.014016  .013888   .0000000  .0000000  -.064124  .047557   .010047  .014619
+    1960.10  -.096783  .013952  -.064746  .012789   .0000000  .0000000   .106423  .042002  -.000985  .013848
+    1960.15  -.049029  .012919  -.015531  .012193   .0000000  .0000000  -.087043  .031708   .000092  .014702
+    1960.20  -.070352  .018905   .005059  .015333   .0000000  .0000000  -.105083  .037064  -.038903  .022636
+    1960.25  -.093472  .013986  -.033430  .010931   .0000000  .0000000  -.061937  .026397   .024171  .016309
+    1960.30  -.144743  .010967   .036124  .009691   .0000000  .0000000  -.067451  .026687  -.002796  .012403
+    1960.35  -.136289  .013576   .091137  .011939   .0000000  .0000000  -.076098  .039075  -.017355  .015119
+    1960.40  -.185600  .011906   .139573  .010679   .0000000  .0000000  -.002643  .039828  -.050680  .011802
+    1960.45  -.144215  .015781   .156992  .012210   .0000000  .0000000  -.015514  .055952  -.047725  .012257
+    1960.50  -.093892  .014294   .234106  .012054   .0000000  .0000000   .292676  .057465  -.098800  .011318
+    1960.55  -.141900  .011200   .251100  .009400   .0000000  .0000000   .151300  .037400  -.033800  .010100
+    1960.60  -.082108  .010316   .224170  .009024   .0000000  .0000000   .062250  .029440  -.026798  .011262
+    1960.65  -.054888  .012519   .246897  .011749   .0000000  .0000000   .045087  .032512  -.058084  .016015
+    1960.70   .000500  .017600   .272000  .014800   .0000000  .0000000   .124200  .038200  -.016300  .019400
+    1960.75   .027616  .012393   .261292  .010364   .0000000  .0000000   .052321  .024867   .015003  .016433
+    1960.80   .028359  .012729   .217569  .010841   .0000000  .0000000  -.008342  .029411   .025216  .015182
+    1960.85  -.026324  .013635   .268219  .012928   .0000000  .0000000   .038656  .041050   .005303  .016382
+    1960.90   .045255  .017858   .178998  .013681   .0000000  .0000000   .052844  .047472  -.010855  .017694
+    1960.95   .018041  .022609   .148022  .013632   .0000000  .0000000   .086354  .057597   .003814  .014939
+    1961.00  -.010002  .021576   .178091  .018578   .0000000  .0000000  -.109701  .072493   .033406  .017217
+    1961.05   .014227  .016229   .129318  .014031   .0000000  .0000000   .172641  .051102   .000182  .013001
+    1961.10  -.034519  .012398   .135146  .010864   .0000000  .0000000   .046666  .040969  -.001677  .012123
+    1961.15   .020541  .009690   .071804  .008953   .0000000  .0000000   .017130  .023800  -.002468  .011041
+    1961.20  -.008860  .013770   .093978  .011954   .0000000  .0000000  -.062540  .030784   .042272  .017489
+    1961.25  -.009493  .013722   .077921  .012877   .0000000  .0000000  -.064367  .027888  -.002371  .019533
+    1961.30  -.013247  .012140   .104033  .010537   .0000000  .0000000  -.027246  .029362  -.027553  .013240
+    1961.35  -.011871  .016049   .106863  .012333   .0000000  .0000000  -.042391  .043669  -.025470  .015685
+    1961.40  -.055595  .010554   .050930  .010174   .0000000  .0000000   .015492  .037524  -.030144  .010919
+    1961.45  -.006478  .013451   .093211  .011987   .0000000  .0000000  -.007698  .053913  -.067298  .011171
+    1961.50  -.052932  .012403   .075634  .010452   .0000000  .0000000   .044608  .049361  -.022091  .010010
+    1961.55  -.008206  .011519   .085606  .010050   .0000000  .0000000   .122173  .040208  -.064085  .011324
+    1961.60  -.051487  .015238   .123137  .012517   .0000000  .0000000   .076453  .040358  -.034798  .016069
+    1961.65  -.017757  .013816   .095707  .012173   .0000000  .0000000   .139748  .037766  -.009789  .017459
+    1961.70  -.062010  .014301   .097662  .010789   .0000000  .0000000   .151076  .028427   .021771  .016330
+    1961.75  -.081090  .015416   .089862  .012166   .0000000  .0000000   .050875  .029772  -.029162  .018757
+    1961.80  -.110423  .013068   .077764  .010812   .0000000  .0000000   .050749  .030057  -.051615  .016866
+    1961.85  -.090300  .016100   .114700  .012300   .0000000  .0000000  -.014600  .037900  -.010800  .016400
+    1961.90  -.167482  .018102   .169747  .012490   .0000000  .0000000  -.025160  .044893  -.020808  .015706
+    1961.95  -.142626  .013234   .162677  .012140   .0000000  .0000000   .096048  .047052   .003845  .011241
+    1962.00  -.033900  .017100   .203700  .013600   .0376300  .0146000   .000000  .000000   .000000  .000000
+    1962.05  -.050170  .014430   .211840  .012140   .0338900  .0133200   .000000  .000000   .000000  .000000
+    1962.10  -.002320  .017110   .229940  .012770   .0290470  .0134500   .000000  .000000   .000000  .000000
+    1962.15   .006920  .018700   .252420  .018200   .0240100  .0162000   .000000  .000000   .000000  .000000
+    1962.20   .024920  .016200   .267420  .015500   .0164880  .0149000   .000000  .000000   .000000  .000000
+    1962.25   .036710  .015210   .249550  .015050   .0102410  .0142600   .000000  .000000   .000000  .000000
+    1962.30   .072420  .017430   .225380  .017660  -.0005960  .0168200   .000000  .000000   .000000  .000000
+    1962.35   .094690  .018700   .208290  .017540  -.0104660  .0169000   .000000  .000000   .000000  .000000
+    1962.40   .093250  .017570   .193210  .017020  -.0187080  .0156600   .000000  .000000   .000000  .000000
+    1962.45   .107960  .018660   .129190  .018270  -.0156280  .0180200   .000000  .000000   .000000  .000000
+    1962.50   .095310  .017460   .127660  .017260  -.0096470  .0164200   .000000  .000000   .000000  .000000
+    1962.55   .086920  .016900   .113560  .015650   .0013710  .0151500   .000000  .000000   .000000  .000000
+    1962.60   .069240  .017840   .063740  .017960   .0066930  .0171500   .000000  .000000   .000000  .000000
+    1962.65   .055400  .016640   .049150  .016300   .0122100  .0149300   .000000  .000000   .000000  .000000
+    1962.70   .008500  .016540   .041810  .015810   .0142490  .0148400   .000000  .000000   .000000  .000000
+    1962.75  -.014150  .018820   .060290  .018700   .0105620  .0178200   .000000  .000000   .000000  .000000
+    1962.80  -.066110  .016250   .050990  .015590   .0038340  .0149800   .000000  .000000   .000000  .000000
+    1962.85  -.113040  .016610   .105830  .015680  -.0066870  .0155700   .000000  .000000   .000000  .000000
+    1962.90  -.153970  .021970   .139440  .019620  -.0175860  .0181300   .000000  .000000   .000000  .000000
+    1962.95  -.160030  .021360   .176030  .019750  -.0286510  .0182100   .000000  .000000   .000000  .000000
+    1963.00  -.205590  .024840   .212120  .022870  -.0332190  .0207100   .000000  .000000   .000000  .000000
+    1963.05  -.201720  .020230   .264370  .018510  -.0339840  .0173800   .000000  .000000   .000000  .000000
+    1963.10  -.173000  .017760   .287920  .016570  -.0309280  .0156300   .000000  .000000   .000000  .000000
+    1963.15  -.148670  .018450   .335970  .017880  -.0308550  .0159600   .000000  .000000   .000000  .000000
+    1963.20  -.099870  .017450   .335960  .016390  -.0392730  .0161400   .000000  .000000   .000000  .000000
+    1963.25  -.044310  .017840   .360350  .016930  -.0507330  .0157900   .000000  .000000   .000000  .000000
+    1963.30   .021450  .017350   .354760  .016500  -.0615850  .0150300   .000000  .000000   .000000  .000000
+    1963.35   .093210  .018140   .324570  .016940  -.0762480  .0155900   .000000  .000000   .000000  .000000
+    1963.40   .152910  .018670   .306570  .017860  -.0852720  .0170900   .000000  .000000   .000000  .000000
+    1963.45   .175600  .021310   .263720  .019770  -.0898040  .0196500   .000000  .000000   .000000  .000000
+    1963.50   .230800  .019620   .226120  .017420  -.0911400  .0167700   .000000  .000000   .000000  .000000
+    1963.55   .218840  .016860   .193180  .015570  -.0850800  .0147700   .000000  .000000   .000000  .000000
+    1963.60   .207420  .018510   .115940  .016960  -.0800220  .0155000   .000000  .000000   .000000  .000000
+    1963.65   .148670  .018730   .085350  .019220  -.0829150  .0174300   .000000  .000000   .000000  .000000
+    1963.70   .096090  .016040   .028620  .015490  -.0876470  .0147500   .000000  .000000   .000000  .000000
+    1963.75   .053710  .020020  -.010670  .018330  -.0974610  .0165900   .000000  .000000   .000000  .000000
+    1963.80  -.017030  .015520  -.023980  .014320  -.1141360  .0137500   .000000  .000000   .000000  .000000
+    1963.85  -.106000  .018730  -.008970  .018460  -.0370110  .0172000   .000000  .000000   .000000  .000000
+    1963.90  -.162800  .022040   .001510  .021360  -.0481380  .0197300   .000000  .000000   .000000  .000000
+    1963.95  -.172400  .018540   .042730  .017540  -.0669830  .0169800   .000000  .000000   .000000  .000000
+    1964.00  -.225800  .021630   .073470  .019990  -.0808460  .0189500   .000000  .000000   .000000  .000000
+    1964.05  -.277190  .019900   .142370  .019340  -.0959270  .0189700   .000000  .000000   .000000  .000000
+    1964.10  -.316290  .018270   .213450  .017350  -.1133170  .0162800   .000000  .000000   .000000  .000000
+    1964.15  -.278600  .020010   .281690  .017670  -.1248710  .0168000   .000000  .000000   .000000  .000000
+    1964.20  -.246040  .017960   .323490  .016880  -.1403400  .0160800   .000000  .000000   .000000  .000000
+    1964.25  -.179450  .016490   .390780  .015240  -.0597570  .0147800   .000000  .000000   .000000  .000000
+    1964.30  -.106780  .015610   .417820  .015450  -.0730700  .0143500   .000000  .000000   .000000  .000000
+    1964.35  -.051130  .017730   .465850  .017200  -.0918930  .0154900   .000000  .000000   .000000  .000000
+    1964.40  -.000180  .016200   .454570  .015860  -.1099970  .0146100   .000000  .000000   .000000  .000000
+    1964.45   .070820  .017660   .457390  .017230  -.1212000  .0157600   .000000  .000000   .000000  .000000
+    1964.50   .122250  .016730   .410720  .017010  -.1147420  .0153900   .000000  .000000   .000000  .000000
+    1964.55   .188300  .016040   .371690  .015870  -.1164510  .0145300   .000000  .000000   .000000  .000000
+    1964.60   .233650  .018730   .317960  .018160  -.1142910  .0164100   .000000  .000000   .000000  .000000
+    1964.65   .243950  .015300   .251720  .015260  -.1118720  .0137800   .000000  .000000   .000000  .000000
+    1964.70   .228520  .015130   .159640  .014810  -.0165730  .0137500   .000000  .000000   .000000  .000000
+    1964.75   .202930  .016080   .093010  .015660  -.0291840  .0142000   .000000  .000000   .000000  .000000
+    1964.80   .163200  .017480   .037870  .017150  -.0476800  .0153100   .000000  .000000   .000000  .000000
+    1964.85   .107390  .017250   .018400  .016220  -.0671060  .0146300   .000000  .000000   .000000  .000000
+    1964.90   .042310  .018970  -.014260  .017750  -.0837400  .0159100   .000000  .000000   .000000  .000000
+    1964.95  -.022710  .017480  -.019620  .017800  -.1003350  .0168300   .000000  .000000   .000000  .000000
+    1965.00  -.089890  .017540  -.005080  .017770  -.0182700  .0155700   .000000  .000000   .000000  .000000
+    1965.05  -.109340  .020910  -.011770  .019760  -.0248210  .0178900   .000000  .000000   .000000  .000000
+    1965.10  -.187520  .016700   .079690  .015740  -.0413790  .0153700   .000000  .000000   .000000  .000000
+    1965.15  -.220180  .015780   .108850  .015600  -.0595530  .0148100   .000000  .000000   .000000  .000000
+    1965.20  -.239960  .015850   .170890  .014540   .0201840  .0139800   .000000  .000000   .000000  .000000
+    1965.25  -.239880  .014860   .232370  .014700  -.0057010  .0133300   .000000  .000000   .000000  .000000
+    1965.30  -.221390  .016120   .286720  .014580  -.0330600  .0137300   .000000  .000000   .000000  .000000
+    1965.35  -.177010  .016430   .329310  .015110  -.0487050  .0144700   .000000  .000000   .000000  .000000
+    1965.40  -.151550  .014790   .380270  .013930  -.0661190  .0133300   .000000  .000000   .000000  .000000
+    1965.45  -.115410  .017280   .406270  .016860  -.0832370  .0153900   .000000  .000000   .000000  .000000
+    1965.50  -.033960  .018000   .439390  .016580   .0111050  .0152100   .000000  .000000   .000000  .000000
+    1965.55   .047390  .018020   .425360  .016460   .0060030  .0153800   .000000  .000000   .000000  .000000
+    1965.60   .084440  .020530   .411480  .019450  -.0046230  .0178800   .000000  .000000   .000000  .000000
+    1965.65   .105520  .016310   .371940  .015300  -.0087120  .0140700   .000000  .000000   .000000  .000000
+    1965.70   .137420  .016280   .304360  .015810   .0758570  .0142700   .000000  .000000   .000000  .000000
+    1965.75   .168630  .020750   .248710  .019550   .0544290  .0168100   .000000  .000000   .000000  .000000
+    1965.80   .200590  .016310   .176560  .016160   .0353090  .0145100   .000000  .000000   .000000  .000000
+    1965.85   .178810  .017050   .143930  .016190   .0119610  .0151900   .000000  .000000   .000000  .000000
+    1965.90   .158060  .021980   .087030  .020220  -.0139660  .0178700   .000000  .000000   .000000  .000000
+    1965.95   .115300  .019820   .054420  .018510  -.0327310  .0171400   .000000  .000000   .000000  .000000
+    1966.00   .047900  .021460   .005530  .019630  -.0467430  .0170800   .000000  .000000   .000000  .000000
+    1966.05   .003210  .021070   .018400  .019450  -.0442320  .0179400   .000000  .000000   .000000  .000000
+    1966.10  -.020370  .019000   .017330  .017320  -.0397280  .0152900   .000000  .000000   .000000  .000000
+    1966.15  -.092720  .018200   .042830  .016850  -.0398940  .0153300   .000000  .000000   .000000  .000000
+    1966.20  -.126630  .016810   .060540  .016230  -.0393290  .0144800   .000000  .000000   .000000  .000000
+    1966.25  -.126250  .016740   .087680  .015810  -.0396900  .0146800   .000000  .000000   .000000  .000000
+    1966.30  -.167720  .015830   .130720  .015330  -.0463990  .0140700   .000000  .000000   .000000  .000000
+    1966.35  -.161730  .017410   .172470  .016490  -.0516050  .0149100   .000000  .000000   .000000  .000000
+    1966.40  -.151510  .017850   .196200  .018220  -.0495510  .0164900   .000000  .000000   .000000  .000000
+    1966.45  -.128550  .016130   .234880  .015210  -.0432800  .0141600   .000000  .000000   .000000  .000000
+    1966.50  -.124150  .018800   .306450  .019320  -.0321410  .0172300   .000000  .000000   .000000  .000000
+    1966.55  -.081600  .016620   .310620  .015820  -.0125560  .0141500   .000000  .000000   .000000  .000000
+    1966.60  -.055550  .015510   .328730  .015120   .0003880  .0138900   .000000  .000000   .000000  .000000
+    1966.65  -.017090  .017080   .338450  .016220   .0095020  .0144900   .000000  .000000   .000000  .000000
+    1966.70   .006590  .015310   .333040  .014830   .0161450  .0135400   .000000  .000000   .000000  .000000
+    1966.75   .042120  .017470   .311320  .016490   .0146070  .0149000   .000000  .000000   .000000  .000000
+    1966.80   .091960  .017500   .283830  .016510   .0121820  .0146500   .000000  .000000   .000000  .000000
+    1966.85   .094580  .019200   .252760  .017990   .0098330  .0157100   .000000  .000000   .000000  .000000
+    1966.90   .116210  .023420   .220110  .021570   .0051870  .0180300   .000000  .000000   .000000  .000000
+    1966.95   .135490  .020350   .172910  .017450   .0058710  .0172200   .000000  .000000   .000000  .000000
+    1967.00   .097100  .016900   .162300  .014300   .0124750  .0140000   .000000  .000000   .000000  .000000
+    1967.05   .070010  .015300   .139910  .013600   .0184380  .0129000   .000000  .000000   .000000  .000000
+    1967.10   .048010  .014100   .130910  .012600   .0211400  .0121000   .000000  .000000   .000000  .000000
+    1967.15   .032320  .014100   .139020  .012500   .0229620  .0122000   .000000  .000000   .000000  .000000
+    1967.20   .014320  .014500   .136220  .013100   .0194950  .0124000   .000000  .000000   .000000  .000000
+    1967.25   .005330  .013900   .130830  .012200   .0167670  .0120000   .000000  .000000   .000000  .000000
+    1967.30  -.008570  .013300   .144330  .011700   .0133100  .0117000   .000000  .000000   .000000  .000000
+    1967.35  -.013670  .014300   .164530  .013100   .0065720  .0126000   .000000  .000000   .000000  .000000
+    1967.40  -.008560  .013800   .148640  .012200   .0071750  .0121000   .000000  .000000   .000000  .000000
+    1967.45   .003850  .014000   .168250  .012300   .0176880  .0122000   .000000  .000000   .000000  .000000
+    1967.50  -.011850  .014100   .176050  .012200   .0301300  .0124000   .000000  .000000   .000000  .000000
+    1967.55  -.008350  .013500   .193960  .011900   .0477730  .0121000   .000000  .000000   .000000  .000000
+    1967.60  -.011740  .013700   .189260  .011600   .0663160  .0120000   .000000  .000000   .000000  .000000
+    1967.65  -.001430  .014800   .186370  .012900   .0768980  .0127000   .000000  .000000   .000000  .000000
+    1967.70  -.029530  .013400   .191370  .011300   .0890110  .0117000   .000000  .000000   .000000  .000000
+    1967.75  -.033830  .013300   .184480  .011800   .0963740  .0118000   .000000  .000000   .000000  .000000
+    1967.80  -.030620  .014100   .195580  .012400   .0971770  .0125000   .000000  .000000   .000000  .000000
+    1967.85  -.035120  .013800   .205980  .012100   .0953500  .0121000   .000000  .000000   .000000  .000000
+    1967.90  -.026910  .014200   .212290  .013000   .0952730  .0126000   .000000  .000000   .000000  .000000
+    1967.95  -.026200  .014100   .222600  .012300   .0931660  .0121000   .000000  .000000   .000000  .000000
+    1968.00  -.034000  .015100   .239700  .012400   .0951090  .0127000   .000000  .000000   .000000  .000000
+    1968.05  -.005100  .016200   .237510  .014100   .0987210  .0143000   .000000  .000000   .000000  .000000
+    1968.10  -.004790  .014500   .238810  .012300  -.0023360  .0129000   .000000  .000000   .000000  .000000
+    1968.15  -.001680  .014200   .237720  .011900  -.0036230  .0123000   .000000  .000000   .000000  .000000
+    1968.20   .030920  .015500   .241420  .013500  -.0012590  .0137000   .000000  .000000   .000000  .000000
+    1968.25   .015230  .013900   .230330  .011900  -.0024360  .0123000   .000000  .000000   .000000  .000000
+    1968.30   .046430  .013500   .242330  .011700  -.0107430  .0121000   .000000  .000000   .000000  .000000
+    1968.35   .060630  .014400   .223740  .012300  -.0118800  .0127000   .000000  .000000   .000000  .000000
+    1968.40   .057340  .014100   .203640  .011900  -.0136970  .0125000   .000000  .000000   .000000  .000000
+    1968.45   .059250  .012900   .198750  .011400  -.0100140  .0119000   .000000  .000000   .000000  .000000
+    1968.50   .068150  .013800   .173950  .012800   .0057390  .0131000   .000000  .000000   .000000  .000000
+    1968.55   .067460  .012900   .166360  .011300   .0170720  .0117000   .000000  .000000   .000000  .000000
+    1968.60   .052060  .013300   .142860  .011400   .0302750  .0120000   .000000  .000000   .000000  .000000
+    1968.65   .027070  .014100   .135670  .012200   .0354390  .0123000   .000000  .000000   .000000  .000000
+    1968.70   .005570  .012700   .135770  .011500   .0390020  .0117000   .000000  .000000   .000000  .000000
+    1968.75  -.013830  .013300   .118780  .011800   .0406750  .0120000   .000000  .000000   .000000  .000000
+    1968.80  -.042020  .013400   .106380  .012200   .0419680  .0123000   .000000  .000000   .000000  .000000
+    1968.85  -.084920  .013700   .124390  .012000   .0356310  .0122000   .000000  .000000   .000000  .000000
+    1968.90  -.139410  .013500   .147490  .011800   .0341150  .0121000   .000000  .000000   .000000  .000000
+    1968.95  -.126810  .014100   .185200  .012800   .0350180  .0130000   .000000  .000000   .000000  .000000
+    1969.00  -.139900  .013900   .214900  .012500   .0335710  .0124000   .000000  .000000   .000000  .000000
+    1969.05  -.124100  .014400   .251100  .013200   .0372640  .0130000   .000000  .000000   .000000  .000000
+    1969.10  -.106290  .014000   .262510  .012300   .0391280  .0124000   .000000  .000000   .000000  .000000
+    1969.15  -.095880  .013200   .326120  .011800   .0309210  .0121000   .000000  .000000   .000000  .000000
+    1969.20  -.079080  .014000   .337320  .012600   .0246540  .0127000   .000000  .000000   .000000  .000000
+    1969.25  -.036380  .013000   .347630  .011600   .0124870  .0121000   .000000  .000000   .000000  .000000
+    1969.30  -.000970  .012900   .351930  .011700   .0000710  .0119000   .000000  .000000   .000000  .000000
+    1969.35   .055030  .013300   .361340  .011900  -.0043960  .0120000   .000000  .000000   .000000  .000000
+    1969.40   .090640  .013200   .316240  .011700  -.0064830  .0120000   .000000  .000000   .000000  .000000
+    1969.45   .125150  .012500   .295450  .011800  -.0097100  .0117000   .000000  .000000   .000000  .000000
+    1969.50   .133450  .013100   .267750  .012100   .0040040  .0121000   .000000  .000000   .000000  .000000
+    1969.55   .150150  .012800   .228760  .011500   .0133570  .0117000   .000000  .000000   .000000  .000000
+    1969.60   .134960  .012500   .187660  .011100   .0232700  .0114000   .000000  .000000   .000000  .000000
+    1969.65   .117370  .013900   .136570  .012200   .0362230  .0124000   .000000  .000000   .000000  .000000
+    1969.70   .095770  .012500   .114170  .011000   .0343170  .0114000   .000000  .000000   .000000  .000000
+    1969.75   .058680  .012700   .100680  .011200   .0285300  .0115000   .000000  .000000   .000000  .000000
+    1969.80   .011380  .013400   .065480  .012200   .0246530  .0122000   .000000  .000000   .000000  .000000
+    1969.85  -.011720  .012800   .063480  .011300   .0178860  .0116000   .000000  .000000   .000000  .000000
+    1969.90  -.062210  .013700   .070390  .011900   .0119090  .0122000   .000000  .000000   .000000  .000000
+    1969.95  -.122410  .013900   .082300  .012300   .0067420  .0122000   .000000  .000000   .000000  .000000
+    1970.00  -.163200  .013900   .117800  .012300   .0047260  .0123000   .000000  .000000   .000000  .000000
+    1970.05  -.200400  .013900   .175210  .012800  -.0043710  .0122000   .000000  .000000   .000000  .000000
+    1970.10  -.217990  .013300   .213110  .012200  -.0072880  .0119000   .000000  .000000   .000000  .000000
+    1970.15  -.167580  .013400   .287720  .012000  -.0178350  .0119000   .000000  .000000   .000000  .000000
+    1970.20  -.155880  .013700   .325820  .013200  -.0272820  .0127000   .000000  .000000   .000000  .000000
+    1970.25  -.140180  .013600   .357830  .012300  -.0373190  .0122000   .000000  .000000   .000000  .000000
+    1970.30  -.092070  .012800   .388230  .011900  -.0515660  .0116000   .000000  .000000   .000000  .000000
+    1970.35  -.036570  .014100   .394540  .012600  -.0614930  .0126000   .000000  .000000   .000000  .000000
+    1970.40   .009940  .012700   .407740  .011300  -.0624500  .0116000   .000000  .000000   .000000  .000000
+    1970.45   .077750  .013100   .394750  .011700  -.0622170  .0120000   .000000  .000000   .000000  .000000
+    1970.50   .130150  .013700   .370950  .012300  -.0542940  .0124000   .000000  .000000   .000000  .000000
+    1970.55   .166660  .012800   .330060  .011600  -.0435010  .0117000   .000000  .000000   .000000  .000000
+    1970.60   .200960  .012700   .262860  .011000  -.0298880  .0113000   .000000  .000000   .000000  .000000
+    1970.65   .205070  .013300   .222970  .011800  -.0204550  .0120000   .000000  .000000   .000000  .000000
+    1970.70   .196270  .012800   .160070  .011500  -.0125620  .0117000   .000000  .000000   .000000  .000000
+    1970.75   .178680  .012600   .101880  .011300  -.0144890  .0115000   .000000  .000000   .000000  .000000
+    1970.80   .141580  .013000   .043980  .011900  -.0185570  .0120000   .000000  .000000   .000000  .000000
+    1970.85   .064680  .012600   .026980  .011300  -.0256240  .0115000   .000000  .000000   .000000  .000000
+    1970.90   .013790  .012900   .006190  .011500  -.0358210  .0115000   .000000  .000000   .000000  .000000
+    1970.95  -.045910  .013500  -.008500  .012300  -.0395080  .0121000   .000000  .000000   .000000  .000000
+    1971.00  -.094800  .013300   .014300  .011800  -.0386560  .0118000   .000000  .000000   .000000  .000000
+    1971.05  -.145000  .013400   .063100  .011700  -.0423130  .0118000   .000000  .000000   .000000  .000000
+    1971.10  -.193590  .013100   .108210  .011500  -.0417900  .0117000   .000000  .000000   .000000  .000000
+    1971.15  -.226190  .012700   .164220  .011100  -.0385280  .0115000   .000000  .000000   .000000  .000000
+    1971.20  -.248080  .012700   .221720  .010900  -.0447450  .0112000   .000000  .000000   .000000  .000000
+    1971.25  -.221480  .012500   .298620  .010800  -.0573030  .0112000   .000000  .000000   .000000  .000000
+    1971.30  -.200070  .012400   .353230  .010700  -.0652400  .0112000   .000000  .000000   .000000  .000000
+    1971.35  -.187870  .013100   .384540  .011400  -.0779880  .0117000   .000000  .000000   .000000  .000000
+    1971.40  -.131860  .013100   .428740  .011000  -.0875360  .0115000   .000000  .000000   .000000  .000000
+    1971.45  -.046460  .012800   .458050  .010900  -.0888030  .0114000   .000000  .000000   .000000  .000000
+    1971.50   .029850  .012700   .466050  .011100  -.0875110  .0113000   .000000  .000000   .000000  .000000
+    1971.55   .104850  .012400   .444960  .010600  -.0828490  .0111000   .000000  .000000   .000000  .000000
+    1971.60   .162960  .012000   .400160  .010200  -.0790560  .0108000   .000000  .000000   .000000  .000000
+    1971.65   .211970  .012600   .361270  .011000  -.0778240  .0114000   .000000  .000000   .000000  .000000
+    1971.70   .233970  .012200   .304470  .010700  -.0821020  .0111000   .000000  .000000   .000000  .000000
+    1971.75   .225880  .012300   .218780  .010600  -.0877900  .0111000   .000000  .000000   .000000  .000000
+    1971.80   .208880  .012600   .167780  .011000  -.1047780  .0114000   .000000  .000000   .000000  .000000
+    1971.85   .181790  .012500   .101490  .010900  -.1220760  .0112000   .000000  .000000   .000000  .000000
+    1971.90   .140590  .012800   .071290  .011000  -.1384440  .0112000   .000000  .000000   .000000  .000000
+    1971.95   .084400  .014100   .039100  .012000  -.1490720  .0119000   .000000  .000000   .000000  .000000
+    1972.00   .031820  .013570   .019710  .011210  -.0474900  .0033800   .000000  .000000   .000000  .000000
+    1972.05  -.029350  .012770   .019540  .010910  -.1025340  .0037900   .000000  .000000   .000000  .000000
+    1972.10  -.085000  .013210   .023390  .011220  -.1641870  .0035000   .000000  .000000   .000000  .000000
+    1972.15  -.113320  .012570   .038780  .010590  -.2239540  .0021800   .000000  .000000   .000000  .000000
+    1972.20  -.170800  .012180   .100130  .010510  -.2844970  .0034200   .000000  .000000   .000000  .000000
+    1972.25  -.178190  .013190   .157660  .011180  -.3489940  .0024900   .000000  .000000   .000000  .000000
+    1972.30  -.193440  .012520   .216340  .010780  -.4137270  .0029400   .000000  .000000   .000000  .000000
+    1972.35  -.177900  .012220   .273960  .010460  -.4751870  .0043600   .000000  .000000   .000000  .000000
+    1972.40  -.148990  .013040   .302730  .011340  -.5400640  .0031600   .000000  .000000   .000000  .000000
+    1972.45  -.101340  .012210   .350600  .010680  -.5937930  .0110200   .000000  .000000   .000000  .000000
+    1972.50  -.048730  .012910   .379110  .010840   .3591600  .0042800   .000000  .000000   .000000  .000000
+    1972.55   .000850  .012690   .403050  .010910   .3124850  .0029100   .000000  .000000   .000000  .000000
+    1972.60   .057740  .012190   .404590  .010360   .2662670  .0026800   .000000  .000000   .000000  .000000
+    1972.65   .089870  .012660   .408890  .010920   .2208620  .0023600   .000000  .000000   .000000  .000000
+    1972.70   .119360  .012130   .367470  .010410   .1685090  .0057300   .000000  .000000   .000000  .000000
+    1972.75   .125150  .012250   .330830  .010670   .1107640  .0028700   .000000  .000000   .000000  .000000
+    1972.80   .161790  .013110   .292310  .011320   .0507720  .0115700   .000000  .000000   .000000  .000000
+    1972.85   .164080  .012730   .229730  .010910  -.0089650  .0112300   .000000  .000000   .000000  .000000
+    1972.90   .154490  .012570   .213280  .010660  -.0670860  .0029200   .000000  .000000   .000000  .000000
+    1972.95   .142830  .013030   .172430  .011240  -.1269170  .0037200   .000000  .000000   .000000  .000000
+    1973.00   .123610  .010590   .125710  .007920   .8114390  .0113200   .000000  .000000   .000000  .000000
+    1973.05   .091980  .008970   .093390  .007760   .7545430  .0028400   .000000  .000000   .000000  .000000
+    1973.10   .055100  .010360   .086390  .007830   .6973530  .0116100   .000000  .000000   .000000  .000000
+    1973.15   .024830  .008970   .089030  .007800   .6317400  .0036200   .000000  .000000   .000000  .000000
+    1973.20  -.023270  .009910   .093100  .007690   .5731350  .0039400   .000000  .000000   .000000  .000000
+    1973.25  -.050430  .010230   .105840  .007750   .5070570  .0041400   .000000  .000000   .000000  .000000
+    1973.30  -.090950  .010050   .145940  .007670   .4422160  .0030600   .000000  .000000   .000000  .000000
+    1973.35  -.107840  .007540   .174450  .006420   .3817300  .0030300   .000000  .000000   .000000  .000000
+    1973.40  -.116560  .007550   .201930  .005940   .3252920  .0036100   .000000  .000000   .000000  .000000
+    1973.45  -.109350  .011160   .245230  .005950   .2701480  .0031200   .000000  .000000   .000000  .000000
+    1973.50  -.097490  .007510   .273170  .005970   .2259990  .0034000   .000000  .000000   .000000  .000000
+    1973.55  -.074020  .009970   .300780  .007710   .1814520  .0071400   .000000  .000000   .000000  .000000
+    1973.60  -.053250  .009780   .315260  .007550   .1350890  .0030500   .000000  .000000   .000000  .000000
+    1973.65  -.014030  .009960   .319880  .007620   .0897480  .0035100   .000000  .000000   .000000  .000000
+    1973.70   .014500  .009970   .323150  .007660   .0381470  .0060700   .000000  .000000   .000000  .000000
+    1973.75   .034570  .009690   .333410  .006090  -.0166510  .0063800   .000000  .000000   .000000  .000000
+    1973.80   .069270  .007630   .331530  .007560  -.0721010  .0033300   .000000  .000000   .000000  .000000
+    1973.85   .082930  .008760   .288210  .007590  -.1313010  .0024900   .000000  .000000   .000000  .000000
+    1973.90   .094550  .009970   .270630  .007570  -.1950090  .0106800   .000000  .000000   .000000  .000000
+    1973.95   .105000  .009050   .265120  .007810  -.2487100  .0023500   .000000  .000000   .000000  .000000
+    1974.00   .113200  .010100   .225230  .007730   .7002310  .0073000   .000000  .000000   .000000  .000000
+    1974.05   .091980  .011510   .203370  .007650   .6520660  .0043200   .000000  .000000   .000000  .000000
+    1974.10   .077870  .008970   .176520  .007820   .6063570  .0031800   .000000  .000000   .000000  .000000
+    1974.15   .078890  .009940   .171530  .007620   .5537260  .0069500   .000000  .000000   .000000  .000000
+    1974.20   .050750  .010050   .157750  .007660   .4983770  .0044100   .000000  .000000   .000000  .000000
+    1974.25   .029950  .007680   .179730  .006060   .4438800  .0107400   .000000  .000000   .000000  .000000
+    1974.30   .029220  .009390   .187280  .007720   .3871170  .0107700   .000000  .000000   .000000  .000000
+    1974.35   .015470  .009500   .182320  .007730   .3220300  .0031000   .000000  .000000   .000000  .000000
+    1974.40   .005080  .009580   .179910  .007850   .2706650  .0115400   .000000  .000000   .000000  .000000
+    1974.45  -.016260  .009460   .187160  .007750   .2230120  .0031700   .000000  .000000   .000000  .000000
+    1974.50   .019490  .009480   .195670  .007770   .1828640  .0025100   .000000  .000000   .000000  .000000
+    1974.55   .022340  .009570   .210720  .007760   .1474170  .0038500   .000000  .000000   .000000  .000000
+    1974.60   .019950  .009360   .212310  .007650   .1109470  .0031300   .000000  .000000   .000000  .000000
+    1974.65   .016610  .009410   .209630  .007650   .0663730  .0027200   .000000  .000000   .000000  .000000
+    1974.70   .010980  .009550   .202280  .007770   .0252920  .0024300   .000000  .000000   .000000  .000000
+    1974.75   .003730  .009660   .216240  .007790  -.0251410  .0033500   .000000  .000000   .000000  .000000
+    1974.80  -.012130  .008500   .232720  .007750  -.0802570  .0059400   .000000  .000000   .000000  .000000
+    1974.85  -.024480  .009820   .240310  .007970  -.1325930  .0041100   .000000  .000000   .000000  .000000
+    1974.90  -.033410  .009690   .254200  .007970  -.1905590  .0028600   .000000  .000000   .000000  .000000
+    1974.95  -.043730  .009750   .267890  .008040  -.2441870  .0086400   .000000  .000000   .000000  .000000
+    1975.00  -.050120  .008590   .270650  .008000   .7083150  .0113300   .000000  .000000   .000000  .000000
+    1975.05  -.053700  .008370   .285590  .007710   .6585310  .0049400   .000000  .000000   .000000  .000000
+    1975.10  -.030920  .008550   .306400  .008030   .6055510  .0112100   .000000  .000000   .000000  .000000
+    1975.15  -.019500  .009350   .329540  .007790   .5525990  .0035600   .000000  .000000   .000000  .000000
+    1975.20   .010660  .009430   .335300  .007810   .5013940  .0068100   .000000  .000000   .000000  .000000
+    1975.25   .043890  .009600   .337490  .007980   .4422900  .0026300   .000000  .000000   .000000  .000000
+    1975.30   .070800  .009650   .313520  .007850   .3887900  .0025400   .000000  .000000   .000000  .000000
+    1975.35   .089170  .009480   .296380  .007840   .3321200  .0029200   .000000  .000000   .000000  .000000
+    1975.40   .103620  .009630   .270190  .007850   .2824180  .0024800   .000000  .000000   .000000  .000000
+    1975.45   .125630  .009450   .246550  .007760   .2386220  .0028800   .000000  .000000   .000000  .000000
+    1975.50   .146030  .009560   .234320  .007940   .1972230  .0039100   .000000  .000000   .000000  .000000
+    1975.55   .132900  .009470   .199120  .007760   .1637560  .0032000   .000000  .000000   .000000  .000000
+    1975.60   .126320  .009330   .176400  .007760   .1307220  .0105700   .000000  .000000   .000000  .000000
+    1975.65   .119740  .009380   .152660  .007800   .0878550  .0028400   .000000  .000000   .000000  .000000
+    1975.70   .092300  .009530   .118640  .007850   .0444550  .0039100   .000000  .000000   .000000  .000000
+    1975.75   .062280  .009540   .103450  .007720  -.0020730  .0026100   .000000  .000000   .000000  .000000
+    1975.80   .020950  .009400   .098770  .007780  -.0586960  .0024800   .000000  .000000   .000000  .000000
+    1975.85  -.041700  .009490   .103980  .007900  -.1161850  .0027700   .000000  .000000   .000000  .000000
+    1975.90  -.072420  .009650   .130280  .007910  -.1711520  .0025700   .000000  .000000   .000000  .000000
+    1975.95  -.127410  .008520   .157660  .007880  -.2229470  .0032300   .000000  .000000   .000000  .000000
+    1976.00  -.144340  .009600   .193270  .008000   .7251490  .0105200   .000000  .000000   .000000  .000000
+    1976.05  -.151500  .008420   .247180  .007820   .6775030  .0033100   .000000  .000000   .000000  .000000
+    1976.10  -.156180  .009510   .289100  .007920   .6214200  .0066400   .000000  .000000   .000000  .000000
+    1976.15  -.145290  .009630   .329230  .007930   .5693700  .0037300   .000000  .000000   .000000  .000000
+    1976.20  -.117400  .009560   .367510  .007930   .5147140  .0046300   .000000  .000000   .000000  .000000
+    1976.25  -.095400  .009540   .393190  .007880   .4538780  .0109900   .000000  .000000   .000000  .000000
+    1976.30  -.041730  .009490   .425870  .007790   .3908040  .0060800   .000000  .000000   .000000  .000000
+    1976.35  -.008800  .007870   .433170  .006840   .3343790  .0037900   .000000  .000000   .000000  .000000
+    1976.40   .046660  .004470   .423870  .006980   .2739120  .0041400   .000000  .000000   .000000  .000000
+    1976.45   .111730  .004720   .401030  .006880   .2245910  .0032300   .000000  .000000   .000000  .000000
+    1976.50   .156480  .005240   .370970  .006350   .1856130  .0037500   .000000  .000000   .000000  .000000
+    1976.55   .195270  .005570   .330200  .007560   .1405230  .0072500   .000000  .000000   .000000  .000000
+    1976.60   .229060  .008910   .289950  .009410   .0972370  .0027300   .000000  .000000   .000000  .000000
+    1976.65   .235790  .007970   .241180  .006750   .0569540  .0066700   .000000  .000000   .000000  .000000
+    1976.70   .220780  .008280   .189190  .006630   .0056210  .0033300   .000000  .000000   .000000  .000000
+    1976.75   .172600  .004740   .157950  .005040  -.0542780  .0057200   .000000  .000000   .000000  .000000
+    1976.80   .159550  .003200   .117960  .003370  -.1129530  .0032600   .000000  .000000   .000000  .000000
+    1976.85   .113500  .003710   .093390  .003730  -.1756720  .0035700   .000000  .000000   .000000  .000000
+    1976.90   .053590  .003540   .071240  .003560  -.2292200  .0041000   .000000  .000000   .000000  .000000
+    1976.95  -.004070  .003990   .065610  .003690  -.2824520  .0048500   .000000  .000000   .000000  .000000
+    1977.00  -.068560  .004880   .069220  .004230   .6657090  .0036700   .000000  .000000   .000000  .000000
+    1977.05  -.139290  .004730   .118540  .004370   .6143360  .0051800   .000000  .000000   .000000  .000000
+    1977.10  -.188740  .004460   .156640  .003860   .5651410  .0031900   .000000  .000000   .000000  .000000
+    1977.15  -.226790  .006250   .231150  .004950   .5121100  .0031000   .000000  .000000   .000000  .000000
+    1977.20  -.228460  .005680   .290850  .004120   .4600880  .0068900   .000000  .000000   .000000  .000000
+    1977.25  -.216780  .003080   .362450  .002890   .4021850  .0021700   .000000  .000000   .000000  .000000
+    1977.30  -.174880  .003600   .414280  .003440   .3418380  .0045300   .000000  .000000   .000000  .000000
+    1977.35  -.133880  .004150   .458560  .003960   .2827490  .0051900   .000000  .000000   .000000  .000000
+    1977.40  -.071690  .010490   .489080  .009550   .2309290  .0023600   .000000  .000000   .000000  .000000
+    1977.45   .012030  .003540   .504510  .003880   .1838870  .0041000   .000000  .000000   .000000  .000000
+    1977.50   .082770  .002520   .495390  .002840   .1468180  .0018000   .000000  .000000   .000000  .000000
+    1977.55   .149380  .003370   .454360  .003620   .1142770  .0019800   .000000  .000000   .000000  .000000
+    1977.60   .210730  .003320   .410780  .003600   .0768320  .0019700   .000000  .000000   .000000  .000000
+    1977.65   .249250  .004220   .351780  .004520   .0408590  .0024600   .000000  .000000   .000000  .000000
+    1977.70   .269380  .002950   .292600  .003710  -.0085350  .0021100   .000000  .000000   .000000  .000000
+    1977.75   .263020  .003500   .222970  .003510  -.0636710  .0025300   .000000  .000000   .000000  .000000
+    1977.80   .243710  .003790   .151260  .003990  -.1196200  .0033400   .000000  .000000   .000000  .000000
+    1977.85   .195430  .003850   .095930  .004190  -.1771710  .0026900   .000000  .000000   .000000  .000000
+    1977.90   .133680  .003770   .061560  .003970  -.2363140  .0019400   .000000  .000000   .000000  .000000
+    1977.95   .063460  .003070   .030340  .003390  -.2912280  .0026400   .000000  .000000   .000000  .000000
+    1978.00  -.000350  .006860   .027050  .006710   .6495220  .0045600   .000000  .000000   .000000  .000000
+    1978.05  -.067600  .005140   .036990  .007410   .5903240  .0049700   .000000  .000000   .000000  .000000
+    1978.10  -.136660  .005210   .072860  .006600   .5357610  .0070500   .000000  .000000   .000000  .000000
+    1978.15  -.182100  .005230   .105900  .006590   .4701360  .0039900   .000000  .000000   .000000  .000000
+    1978.20  -.214500  .003140   .163140  .003850   .4061470  .0056400   .000000  .000000   .000000  .000000
+    1978.25  -.236230  .003270   .234600  .003050   .3442840  .0041700   .000000  .000000   .000000  .000000
+    1978.30  -.229900  .003970   .312160  .003250   .2835510  .0022700   .000000  .000000   .000000  .000000
+    1978.35  -.200940  .002850   .379730  .002600   .2243820  .0069100   .000000  .000000   .000000  .000000
+    1978.40  -.157910  .004050   .433860  .003990   .1677820  .0022300   .000000  .000000   .000000  .000000
+    1978.45  -.110240  .003970   .468530  .003570   .1209930  .0031800   .000000  .000000   .000000  .000000
+    1978.50  -.044260  .003530   .492280  .003560   .0799780  .0027100   .000000  .000000   .000000  .000000
+    1978.55   .033760  .002730   .496900  .002830   .0461430  .0025300   .000000  .000000   .000000  .000000
+    1978.60   .098530  .002640   .478150  .002760   .0128410  .0034000   .000000  .000000   .000000  .000000
+    1978.65   .150640  .001940   .444140  .002040  -.0312900  .0030700   .000000  .000000   .000000  .000000
+    1978.70   .194320  .002790   .408640  .002980  -.0754340  .0036100   .000000  .000000   .000000  .000000
+    1978.75   .221790  .002910   .353150  .003140  -.1252120  .0037900   .000000  .000000   .000000  .000000
+    1978.80   .234780  .002740   .290520  .002920  -.1826230  .0020000   .000000  .000000   .000000  .000000
+    1978.85   .228930  .003190   .229200  .003160  -.2362770  .0029900   .000000  .000000   .000000  .000000
+    1978.90   .196110  .004580   .176960  .004140  -.2927440  .0029900   .000000  .000000   .000000  .000000
+    1978.95   .169350  .004230   .117020  .004390  -.3501350  .0030400   .000000  .000000   .000000  .000000
+    1979.00   .140600  .004850   .085500  .004540   .5990550  .0092100   .000000  .000000   .000000  .000000
+    1979.05   .098400  .006120   .059560  .005460   .5436940  .0079200   .000000  .000000   .000000  .000000
+    1979.10   .023200  .003360   .064460  .003420   .4873690  .0025000   .000000  .000000   .000000  .000000
+    1979.15  -.017580  .003950   .069020  .004470   .4372970  .0035200   .000000  .000000   .000000  .000000
+    1979.20  -.067290  .004260   .087350  .004270   .3838980  .0025100   .000000  .000000   .000000  .000000
+    1979.25  -.111680  .003470   .125490  .003760   .3253590  .0027200   .000000  .000000   .000000  .000000
+    1979.30  -.137550  .002330   .174350  .002950   .2698590  .0018600   .000000  .000000   .000000  .000000
+    1979.35  -.152140  .002870   .218350  .003250   .2124640  .0021400   .000000  .000000   .000000  .000000
+    1979.40  -.158240  .002720   .263800  .003010   .1596610  .0032200   .000000  .000000   .000000  .000000
+    1979.45  -.145410  .003090   .301690  .003070   .1196450  .0029900   .000000  .000000   .000000  .000000
+    1979.50  -.120340  .002530   .348910  .003130   .0786440  .0064600   .000000  .000000   .000000  .000000
+    1979.55  -.093020  .002590   .378590  .002700   .0405690  .0031000   .000000  .000000   .000000  .000000
+    1979.60  -.032280  .004930   .404160  .004640   .0082610  .0040400   .000000  .000000   .000000  .000000
+    1979.65   .013040  .003750   .420310  .003990  -.0308800  .0025600   .000000  .000000   .000000  .000000
+    1979.70   .053770  .002720   .423000  .003330  -.0723390  .0024500   .000000  .000000   .000000  .000000
+    1979.75   .087730  .002540   .410920  .002940  -.1151000  .0041800   .000000  .000000   .000000  .000000
+    1979.80   .103920  .001630   .386840  .001740  -.1669670  .0022100   .000000  .000000   .000000  .000000
+    1979.85   .133930  .003380   .357770  .003350  -.2160390  .0041200   .000000  .000000   .000000  .000000
+    1979.90   .132630  .001940   .322640  .002410  -.2606420  .0032900   .000000  .000000   .000000  .000000
+    1979.95   .135250  .001860   .285040  .001910  -.3086520  .0027600   .000000  .000000   .000000  .000000
+    1980.00   .142150  .002360   .250260  .002550   .6449390  .0010700   .000000  .000000   .000000  .000000
+    1980.05   .121150  .002430   .224530  .002000   .5994770  .0011100   .000000  .000000   .000000  .000000
+    1980.10   .089390  .002000   .199240  .001640   .5548120  .0012400   .000000  .000000   .000000  .000000
+    1980.15   .064250  .001990   .182700  .001610   .5085250  .0009700   .000000  .000000   .000000  .000000
+    1980.20   .043590  .001540   .179240  .001360   .4666600  .0011300   .000000  .000000   .000000  .000000
+    1980.25   .012160  .001970   .187460  .001550   .4165130  .0012000   .000000  .000000   .000000  .000000
+    1980.30  -.020440  .001920   .201760  .002020   .3666940  .0005600   .012390  .001200  -.003550  .000350
+    1980.35  -.043480  .002040   .221870  .001830   .3219240  .0014400   .000000  .000000   .000000  .000000
+    1980.40  -.052250  .001920   .240890  .001830   .2763230  .0012400   .000000  .000000   .000000  .000000
+    1980.45  -.054760  .001770   .259160  .001660   .2387700  .0013700   .000000  .000000   .000000  .000000
+    1980.50  -.051620  .001940   .282750  .001860   .2063630  .0015100   .000000  .000000   .000000  .000000
+    1980.55  -.039350  .001980   .301970  .001810   .1755970  .0002600   .002900  .000800  -.003360  .000230
+    1980.60  -.035550  .001470   .314750  .001410   .1452760  .0009200   .000000  .000000   .000000  .000000
+    1980.65  -.030090  .001510   .328120  .001390   .1151990  .0009800   .000000  .000000   .000000  .000000
+    1980.70  -.030200  .001490   .337170  .001410   .0750790  .0009700   .000000  .000000   .000000  .000000
+    1980.75  -.023160  .001500   .345640  .001450   .0300980  .0001600   .000590  .000360  -.002620  .000120
+    1980.80  -.012370  .001400   .358870  .001410  -.0127940  .0001400   .004850  .000300  -.001960  .000100
+    1980.85   .000830  .001430   .366600  .001360  -.0624580  .0012400  -.000310  .003340  -.001500  .000790
+    1980.90   .022640  .001990   .373160  .001740  -.1078580  .0004200   .007390  .001200  -.001790  .000320
+    1980.95   .049120  .002020   .373030  .001700  -.1500100  .0003600   .010830  .001030  -.000520  .000270
+    1981.00   .070580  .001670   .360660  .001840  -.1953270  .0040700   .004000  .002680  -.000470  .000650
+    1981.05   .077000  .001510   .348400  .001680  -.2391430  .0005100   .007830  .001280  -.000010  .000380
+    1981.10   .089260  .001270   .329090  .001060  -.2776990  .0011000   .010230  .002700  -.000250  .000960
+    1981.15   .084840  .001010   .315780  .001020  -.3202690  .0007000   .011050  .002700   .000040  .000580
+    1981.20   .090210  .000790   .304230  .000800  -.3727280  .0013700   .008890  .002840  -.002880  .000900
+    1981.25   .101630  .000890   .289720  .000940  -.4159950  .0016800   .000000  .000000   .000000  .000000
+    1981.30   .096310  .000870   .268760  .001200  -.4685540  .0013900   .000000  .000000   .000000  .000000
+    1981.35   .093750  .000980   .257220  .000920  -.5165520  .0015500   .010480  .004480  -.003860  .001390
+    1981.40   .090250  .001110   .241670  .001230  -.5587390  .0015600   .000000  .000000   .000000  .000000
+    1981.45   .078570  .000850   .226280  .001070  -.6009320  .0004300   .002930  .000690  -.003700  .000200
+    1981.50   .068150  .000810   .210210  .000810   .3698510  .0014900   .002610  .002490  -.004120  .000620
+    1981.55   .059540  .000770   .193490  .000780   .3498320  .0013400   .000750  .003130  -.002280  .000880
+    1981.60   .033080  .000950   .184820  .001110   .3198500  .0017100  -.003550  .003350  -.003460  .000910
+    1981.65   .004150  .000740   .185370  .000750   .2918900  .0012000   .000910  .002860  -.004060  .000710
+    1981.70  -.024140  .000710   .193490  .000710   .2653000  .0011700  -.005840  .002480  -.002860  .000720
+    1981.75  -.060920  .000710   .209640  .000700   .2228820  .0011100  -.005830  .002680  -.000670  .000950
+    1981.80  -.084890  .000690   .235550  .000670   .1804970  .0005200  -.001860  .001480  -.001690  .000470
+    1981.85  -.104520  .000780   .264190  .000800   .1393580  .0013800   .005070  .001970  -.000530  .000530
+    1981.90  -.110340  .001250   .298730  .000870   .0957520  .0002200   .001260  .000360   .000660  .000120
+    1981.95  -.112180  .001070   .336860  .000790   .0571520  .0020500   .006620  .002610   .000650  .000690
+    1982.00  -.093080  .001000   .376820  .000860   .0184280  .0017100   .005820  .001770   .001000  .000510
+    1982.05  -.056710  .001150   .406900  .000920  -.0233770  .0024400   .001600  .001660   .001710  .000480
+    1982.10  -.029250  .000960   .429470  .000810  -.0576400  .0017900   .004510  .002200   .001450  .000580
+    1982.15   .016930  .000960   .440390  .000860  -.0968960  .0018300   .002170  .002170   .000850  .000570
+    1982.20   .062800  .000970   .438790  .000820  -.1429420  .0004100   .004220  .001240  -.000430  .000340
+    1982.25   .108360  .000970   .429570  .000940  -.1860770  .0023100   .004830  .002410  -.000950  .000720
+    1982.30   .144250  .000790   .410160  .000790  -.2324500  .0006000   .007640  .001680  -.002570  .000390
+    1982.35   .175760  .000710   .379360  .000750  -.2826500  .0013700   .004140  .002320  -.002400  .000650
+    1982.40   .202440  .000650   .335180  .000690  -.3212050  .0009700   .006000  .002100  -.002670  .000570
+    1982.45   .227390  .000730   .284220  .000920  -.3589540  .0001600   .001880  .000460  -.001670  .000140
+    1982.50   .225400  .000620   .235390  .000680   .6073090  .0009800  -.003910  .002750  -.001360  .000780
+    1982.55   .211690  .000650   .183440  .000650   .5824430  .0010100  -.000930  .002400  -.001680  .000670
+    1982.60   .188000  .000700   .139540  .000730   .5595280  .0011600  -.003430  .003010   .000260  .000800
+    1982.65   .147580  .000710   .100920  .000670   .5266190  .0012700  -.004690  .002940  -.001270  .000780
+    1982.70   .090980  .000660   .077680  .000680   .4890550  .0005400  -.005130  .001680  -.000640  .000510
+    1982.75   .028040  .000650   .068920  .000670   .4484150  .0012400  -.008690  .003000   .000710  .000970
+    1982.80  -.036070  .000640   .079650  .000610   .4039600  .0002700  -.002760  .000740  -.000180  .000200
+    1982.85  -.092580  .000660   .099410  .000700   .3645380  .0009400  -.001670  .001640   .000520  .000530
+    1982.90  -.143280  .000890   .139280  .000840   .3204710  .0017700  -.000420  .002110   .002190  .000590
+    1982.95  -.184870  .000690   .194480  .000690   .2722880  .0001700   .000730  .000420   .002030  .000130
+    1983.00  -.202510  .000710   .257960  .000670   .2276730  .0011300   .004010  .001640   .002770  .000480
+    1983.05  -.208590  .000690   .319420  .000710   .1807080  .0011500   .002530  .001490   .002220  .000410
+    1983.10  -.188080  .000740   .386630  .000780   .1215960  .0004400   .002640  .000960   .001590  .000270
+    1983.15  -.166980  .000740   .446850  .000760   .0712980  .0004000   .007800  .001060   .000500  .000310
+    1983.20  -.130670  .000690   .499770  .000680   .0173990  .0004000   .004030  .001030   .000410  .000290
+    1983.25  -.060990  .000680   .541150  .000730  -.0393690  .0010800   .002480  .002210  -.000190  .000610
+    1983.30   .018010  .000730   .561080  .000730  -.0893990  .0010700   .005370  .001500  -.001230  .000430
+    1983.35   .089520  .000660   .551750  .000890  -.1353850  .0003100   .005970  .000760  -.001240  .000230
+    1983.40   .165160  .000700   .528540  .000850  -.1815520  .0010800   .003960  .002480  -.001540  .000630
+    1983.45   .220450  .000760   .481900  .000930  -.2193950  .0003800   .002630  .000840  -.001270  .000240
+    1983.50   .270130  .000770   .421220  .000920   .7475800  .0010100  -.003070  .001710   .000180  .000430
+    1983.55   .307330  .000670   .346400  .000780   .7215090  .0006600  -.006430  .001190  -.000660  .000270
+    1983.60   .323430  .000710   .271320  .000770   .6952120  .0007200  -.004220  .001220  -.000850  .000320
+    1983.65   .311990  .000680   .193620  .000840   .6642850  .0008600  -.006240  .001200  -.000820  .000310
+    1983.70   .270820  .000560   .123360  .000640   .6298510  .0008700  -.008450  .001710  -.000360  .000500
+    1983.75   .212870  .000570   .065270  .000690   .5983220  .0004400  -.006270  .000840  -.000160  .000250
+    1983.80   .144260  .000200   .027540  .000210   .5583590  .0004000  -.007880  .001040   .001710  .000580
+    1983.85   .061990  .000220   .014950  .000200   .5132280  .0059100  -.004500  .000960   .002060  .000720
+    1983.90  -.016890  .000210   .026220  .000210   .4716860  .0022000   .000610  .001070   .004000  .000750
+    1983.95  -.085210  .000200   .050470  .000200   .4337780  .0004600   .000050  .000660   .003990  .000490
+    1984.00  -.133280  .000230   .091680  .000230   .3954610  .0002500   .001240  .000900   .002650  .000490
+    1984.05  -.178600  .000200   .145720  .000190   .3663980  .0002200   .002630  .000710   .003010  .000320
+    1984.10  -.217680  .000210   .203540  .000210   .3393920  .0002100   .001960  .000650   .003760  .000390
+    1984.15  -.239790  .000210   .267220  .000190   .3071050  .0002200   .001970  .000640   .002560  .000280
+    1984.20  -.240330  .000210   .342950  .000210   .2769000  .0001600   .004310  .000360   .001640  .000190
+    1984.25  -.215180  .000210   .414620  .000210   .2386810  .0002000   .003990  .000530   .001510  .000320
+    1984.30  -.165880  .000180   .478570  .000170   .2012160  .0001500   .004670  .000270  -.000090  .000160
+    1984.35  -.103940  .000200   .529520  .000180   .1686240  .0001900   .005600  .000380  -.000670  .000250
+    1984.40  -.036610  .000170   .557690  .000160   .1381370  .0001700   .002970  .000330  -.000030  .000230
+    1984.45   .043530  .000180   .559030  .000170   .1142480  .0001700   .000400  .000350  -.000580  .000220
+    1984.50   .118910  .000170   .544370  .000170   .0977110  .0001500  -.000110  .000220  -.000540  .000130
+    1984.55   .192030  .000170   .505220  .000160   .0854250  .0001600  -.004690  .000250   .000080  .000150
+    1984.60   .256550  .000160   .452690  .000150   .0683640  .0001300  -.006200  .000210  -.000330  .000110
+    1984.65   .294920  .000130   .386890  .000130   .0497870  .0000800  -.007620  .000160  -.000590  .000090
+    1984.70   .308190  .000180   .317250  .000170   .0228220  .0001600  -.008140  .000320   .000970  .000190
+    1984.75   .311850  .000180   .246370  .000170  -.0075050  .0001700  -.009280  .000330   .000570  .000200
+    1984.80   .284570  .000170   .180700  .000160  -.0363910  .0001600  -.004020  .000290   .001860  .000200
+    1984.85   .247250  .000180   .123390  .000170  -.0715010  .0001600  -.004470  .000300   .002490  .000220
+    1984.90   .198900  .000180   .081750  .000170  -.1028830  .0001700  -.001400  .000320   .003070  .000250
+    1984.95   .127310  .000170   .041390  .000160  -.1301440  .0001500  -.000720  .000240   .003610  .000160
+    1985.00   .045080  .000180   .022560  .000170  -.1575460  .0001400   .000660  .000240   .004680  .000130
+    1985.05  -.021710  .000190   .036290  .000170  -.1889130  .0001500   .001040  .000300   .003940  .000130
+    1985.10  -.079030  .000170   .063220  .000160  -.2116370  .0001200   .002930  .000220   .003730  .000110
+    1985.15  -.133690  .000170   .102890  .000170  -.2407380  .0001200   .001780  .000220   .003340  .000110
+    1985.20  -.185320  .000170   .156740  .000160  -.2736890  .0001200   .002900  .000210   .000710  .000120
+    1985.25  -.201050  .000160   .230230  .000150  -.3070830  .0001200   .006560  .000200   .000520  .000110
+    1985.30  -.195870  .000170   .298580  .000150  -.3429910  .0001200   .005330  .000210   .000700  .000130
+    1985.35  -.182010  .000140   .364520  .000130  -.3771130  .0001000   .005260  .000180  -.000440  .000090
+    1985.40  -.138460  .000170   .418650  .000160  -.4025590  .0001300   .004820  .000210  -.000700  .000130
+    1985.45  -.095300  .000130   .459340  .000130  -.4317500  .0000800   .001180  .000170  -.000230  .000090
+    1985.50  -.043950  .000150   .483270  .000150   .5478600  .0001200  -.000110  .000190   .000060  .000110
+    1985.55   .017740  .000140   .494700  .000140   .5395290  .0001100  -.003020  .000180  -.000640  .000090
+    1985.60   .076740  .000150   .494160  .000140   .5251140  .0001200  -.006370  .000190   .000200  .000100
+    1985.65   .135950  .000150   .477470  .000150   .5115900  .0001300  -.008700  .000240  -.000310  .000120
+    1985.70   .182620  .000150   .445550  .000150   .4948280  .0001200  -.007150  .000210  -.000090  .000120
+    1985.75   .211380  .000150   .402010  .000140   .4660470  .0001200  -.008410  .000190   .001000  .000100
+    1985.80   .227170  .000160   .347600  .000150   .4338690  .0001200  -.006020  .000210   .000470  .000140
+    1985.85   .228420  .000150   .297330  .000150   .4018540  .0001200  -.003090  .000210   .001620  .000130
+    1985.90   .228310  .000130   .251090  .000130   .3668480  .0000800  -.003190  .000170   .003280  .000100
+    1985.95   .209470  .000170   .210230  .000160   .3364070  .0001400  -.002280  .000240   .003710  .000160
+    1986.00   .185940  .000180   .170580  .000170   .3132290  .0001600   .000210  .000280   .003660  .000180
+    1986.05   .148620  .000140   .136920  .000130   .2869110  .0001200  -.001040  .000190   .004400  .000100
+    1986.10   .097820  .000140   .120120  .000130   .2595480  .0001100  -.001060  .000190   .003540  .000090
+    1986.15   .050650  .000150   .114890  .000150   .2343500  .0001200   .000210  .000240   .002680  .000120
+    1986.20  -.004480  .000160   .120220  .000150   .2069080  .0001300   .001510  .000200   .002050  .000120
+    1986.25  -.045110  .000140   .137800  .000130   .1831500  .0001000   .001580  .000180   .000470  .000100
+    1986.30  -.074620  .000150   .174240  .000150   .1553600  .0001200   .005500  .000210   .000020  .000130
+    1986.35  -.091050  .000150   .210930  .000140   .1220280  .0001100   .003860  .000180  -.000070  .000100
+    1986.40  -.103510  .000170   .248370  .000160   .0984900  .0001400   .003140  .000240  -.000240  .000160
+    1986.45  -.097870  .000130   .286570  .000130   .0863460  .0000800   .002230  .000170   .000410  .000100
+    1986.50  -.071490  .000150   .325960  .000150   .0698390  .0001100  -.003030  .000180   .000210  .000100
+    1986.55  -.044780  .000140   .356680  .000140   .0591900  .0001000  -.004290  .000160   .000190  .000080
+    1986.60  -.017440  .000150   .376640  .000140   .0494220  .0001100  -.007430  .000170   .000050  .000090
+    1986.65   .010780  .000180   .391720  .000170   .0327720  .0001500  -.010920  .000310  -.000160  .000170
+    1986.70   .039560  .000160   .398150  .000150   .0179060  .0001200  -.008650  .000190   .000010  .000110
+    1986.75   .061300  .000170   .393670  .000160  -.0068750  .0001500  -.006850  .000330   .001200  .000200
+    1986.80   .085600  .000140   .389850  .000130  -.0389540  .0001000  -.006290  .000180   .001170  .000100
+    1986.85   .108410  .000130   .379180  .000130  -.0658570  .0000800  -.003770  .000160   .001570  .000090
+    1986.90   .121680  .000160   .358470  .000150  -.0899120  .0001200  -.001090  .000210   .002640  .000150
+    1986.95   .139690  .000150   .333040  .000140  -.1163700  .0001100  -.002590  .000190   .002420  .000110
+    1987.00   .146260  .000160   .313070  .000150  -.1380760  .0001100  -.001700  .000210   .002690  .000120
+    1987.05   .139250  .000160   .286810  .000140  -.1601160  .0001100  -.001080  .000190   .003260  .000100
+    1987.10   .129080  .000130   .265690  .000120  -.1865420  .0001100  -.002300  .000160   .002650  .000090
+    1987.15   .122130  .000130   .247910  .000120  -.2129500  .0001000  -.000630  .000160   .001850  .000090
+    1987.20   .110320  .000140   .223500  .000140  -.2463650  .0001100  -.000050  .000190   .001220  .000100
+    1987.25   .094220  .000140   .212870  .000130  -.2807030  .0001000  -.000080  .000170   .000190  .000090
+    1987.30   .072280  .000140   .204670  .000140  -.3086560  .0001100   .001600  .000180  -.000620  .000100
+    1987.35   .053320  .000130   .200540  .000130  -.3362570  .0001000   .002010  .000170  -.000810  .000090
+    1987.40   .030170  .000150   .199490  .000150  -.3639160  .0001100   .001280  .000190  -.000580  .000110
+    1987.45   .015310  .000140   .199420  .000140  -.3832670  .0001100  -.000210  .000180  -.000410  .000110
+    1987.50  -.006420  .000130   .206770  .000130  -.3985660  .0000800  -.002110  .000160   .000130  .000090
+    1987.55  -.025810  .000130   .218770  .000130  -.4124200  .0001000  -.006670  .000160  -.000360  .000090
+    1987.60  -.031970  .000140   .234330  .000130  -.4193230  .0001100  -.007390  .000160  -.000770  .000090
+    1987.65  -.037620  .000140   .254830  .000140  -.4346680  .0001100  -.009480  .000200   .000110  .000100
+    1987.70  -.043540  .000150   .272020  .000140  -.4584800  .0001100  -.010770  .000200  -.000250  .000110
+    1987.75  -.055190  .000150   .296620  .000150  -.4825460  .0001300  -.007710  .000220  -.000170  .000130
+    1987.80  -.063220  .000130   .318760  .000130  -.5129600  .0000900  -.006400  .000160   .000820  .000090
+    1987.85  -.060180  .000130   .341610  .000130  -.5455880  .0000800  -.005460  .000160   .001310  .000090
+    1987.90  -.056330  .000150   .371220  .000140  -.5748670  .0001200  -.003730  .000190   .001910  .000110
+    1987.95  -.049860  .000140   .395210  .000130  -.6043940  .0001000  -.001870  .000170   .002500  .000100
+    1988.00  -.023960  .000140   .412730  .000130   .3641980  .0001200  -.004140  .000190   .002660  .000100
+    1988.05   .004500  .000120   .424730  .000110   .3384500  .0001000  -.002530  .000160   .002120  .000090
+    1988.10   .047020  .000130   .432110  .000120   .3144130  .0001000  -.000740  .000180   .002150  .000100
+    1988.15   .067110  .000130   .430020  .000130   .2785320  .0001100  -.002550  .000190   .000600  .000100
+    1988.20   .105530  .000130   .427540  .000130   .2471970  .0001000  -.000980  .000170  -.000240  .000090
+    1988.25   .133210  .000130   .406300  .000130   .2166860  .0001100  -.000500  .000180  -.000430  .000100
+    1988.30   .150780  .000130   .378320  .000120   .1792750  .0000900  -.000370  .000160  -.001620  .000090
+    1988.35   .171170  .000140   .354020  .000140   .1522840  .0001100   .000780  .000190  -.001780  .000130
+    1988.40   .176460  .000130   .321580  .000130   .1225530  .0001000  -.000040  .000180  -.001500  .000100
+    1988.45   .165470  .000120   .287990  .000120   .0988100  .0000800  -.001720  .000160  -.001290  .000090
+    1988.50   .169520  .000140   .251610  .000130   .0898640  .0001200  -.003630  .000190  -.001180  .000100
+    1988.55   .162560  .000130   .216260  .000120   .0807490  .0001000  -.007890  .000160  -.000680  .000090
+    1988.60   .140250  .000120   .179670  .000110   .0689520  .0000800  -.010350  .000160  -.001420  .000080
+    1988.65   .106640  .000120   .154640  .000120   .0603010  .0001000  -.010090  .000180  -.001000  .000100
+    1988.70   .066470  .000120   .136560  .000120   .0448510  .0001000  -.010210  .000170  -.000500  .000100
+    1988.75   .009150  .000130   .129100  .000130   .0228930  .0001000  -.011320  .000200  -.000380  .000110
+    1988.80  -.050020  .000130   .138100  .000130  -.0018930  .0001100  -.007830  .000200  -.000750  .000110
+    1988.85  -.100790  .000110   .165460  .000110  -.0330640  .0000700  -.005600  .000150   .000990  .000080
+    1988.90  -.138410  .000120   .207940  .000120  -.0653100  .0000900  -.005220  .000170   .001020  .000100
+    1988.95  -.164740  .000120   .261170  .000110  -.0918720  .0000800  -.003500  .000160   .001530  .000080
+    1989.00  -.160800  .000130   .315200  .000140  -.1150310  .0000900  -.002340  .000170   .002030  .000090
+    1989.05  -.142800  .000120   .359530  .000110  -.1376110  .0000900  -.003600  .000170   .001370  .000090
+    1989.10  -.118060  .000120   .400480  .000110  -.1614360  .0000900  -.002340  .000170   .000860  .000090
+    1989.15  -.076130  .000120   .436720  .000110  -.1886810  .0000900  -.001680  .000160   .000380  .000080
+    1989.20  -.027240  .000130   .466260  .000120  -.2181740  .0001000  -.001820  .000180  -.001260  .000100
+    1989.25   .029070  .000120   .480900  .000120  -.2452640  .0000900  -.000610  .000170  -.002120  .000090
+    1989.30   .085860  .000120   .481670  .000120  -.2761340  .0000800  -.000780  .000150  -.002250  .000080
+    1989.35   .127570  .000120   .470310  .000120  -.3109290  .0001000  -.001920  .000170  -.003040  .000100
+    1989.40   .169220  .000120   .445260  .000120  -.3388540  .0000800  -.001680  .000150  -.003030  .000080
+    1989.45   .204420  .000120   .412890  .000120  -.3680090  .0000900  -.004720  .000170  -.002620  .000090
+    1989.50   .239210  .000120   .364510  .000120  -.3859960  .0000800  -.007490  .000160  -.002840  .000090
+    1989.55   .259150  .000120   .312920  .000120  -.4009490  .0000900  -.009020  .000170  -.002220  .000090
+    1989.60   .259400  .000120   .255620  .000120  -.4214040  .0000800  -.011270  .000150  -.002020  .000080
+    1989.65   .250970  .000120   .197720  .000120  -.4424920  .0000900  -.013980  .000160  -.002400  .000090
+    1989.70   .217420  .000120   .146080  .000120  -.4611150  .0000800  -.013140  .000160  -.002080  .000090
+    1989.75   .165120  .000120   .105110  .000110  -.4903590  .0000800  -.012600  .000160  -.000730  .000080
+    1989.80   .098020  .000110   .083150  .000110  -.5228010  .0000700  -.011010  .000150  -.001130  .000070
+    1989.85   .031480  .000110   .074730  .000110  -.5592470  .0000700  -.008550  .000150  -.000710  .000080
+    1989.90  -.036820  .000110   .087780  .000110  -.6014820  .0000800  -.007450  .000150   .000760  .000080
+    1989.95  -.090410  .000110   .118340  .000110  -.6390910  .0000700  -.006100  .000150   .000840  .000080
+    1990.00  -.132820  .000120   .163800  .000120   .3294770  .0000800  -.004230  .000160   .000950  .000090
+    1990.05  -.165870  .000110   .215080  .000110   .2971590  .0000800  -.005310  .000150   .000930  .000080
+    1990.10  -.202780  .000110   .276390  .000110   .2614270  .0000800  -.005390  .000150  -.000120  .000080
+    1990.15  -.201680  .000110   .344430  .000110   .2205110  .0000800  -.004370  .000160  -.000690  .000080
+    1990.20  -.185180  .000110   .413230  .000110   .1791940  .0000800  -.004430  .000150  -.002050  .000080
+    1990.25  -.153910  .000110   .471710  .000110   .1351550  .0000800  -.003760  .000150  -.003080  .000080
+    1990.30  -.101550  .000110   .524360  .000110   .0948910  .0000800  -.001280  .000150  -.003890  .000080
+    1990.35  -.049070  .000110   .556830  .000110   .0554040  .0000800  -.002860  .000150  -.003970  .000080
+    1990.40   .025280  .000110   .572830  .000110   .0201240  .0000700  -.004400  .000150  -.004260  .000080
+    1990.45   .096160  .000110   .568570  .000110  -.0096640  .0000800  -.004910  .000160  -.004050  .000080
+    1990.50   .166980  .000110   .541670  .000110  -.0403750  .0000800  -.009000  .000150  -.003880  .000080
+    1990.55   .230520  .000110   .499990  .000110  -.0614930  .0000800  -.011350  .000160  -.003850  .000080
+    1990.60   .276540  .000120   .439320  .000110  -.0830990  .0000800  -.013660  .000160  -.002920  .000090
+    1990.65   .306230  .000110   .379690  .000110  -.1154370  .0000700  -.015530  .000160  -.003320  .000080
+    1990.70   .312300  .000110   .309110  .000110  -.1458280  .0000800  -.015250  .000160  -.003160  .000080
+    1990.75   .295990  .000110   .241750  .000110  -.1816860  .0000800  -.014130  .000150  -.002630  .000080
+    1990.80   .258290  .000110   .178550  .000110  -.2226650  .0000800  -.013370  .000150  -.001910  .000080
+    1990.85   .214630  .000110   .130690  .000110  -.2630650  .0000800  -.010960  .000150  -.001740  .000080
+    1990.90   .158460  .000110   .095450  .000110  -.3023270  .0000800  -.009260  .000150  -.000700  .000080
+    1990.95   .092590  .000110   .076290  .000110  -.3458130  .0000800  -.008690  .000150   .000090  .000080
+    1991.00   .023070  .000120   .070420  .000120   .6189660  .0000800  -.007640  .000160   .000100  .000080
+    1991.05  -.040210  .000110   .085850  .000110   .5788470  .0000800  -.006390  .000160   .000290  .000080
+    1991.10  -.104560  .000110   .109710  .000100   .5375110  .0000700  -.007400  .000150  -.000780  .000080
+    1991.15  -.159350  .000110   .156090  .000110   .4982140  .0000800  -.007290  .000160  -.002160  .000080
+    1991.20  -.193710  .000110   .215880  .000110   .4563180  .0000700  -.005840  .000150  -.002750  .000080
+    1991.25  -.218250  .000110   .286330  .000110   .4101900  .0000800  -.005420  .000150  -.004230  .000080
+    1991.30  -.211540  .000110   .359670  .000110   .3695240  .0000700  -.004780  .000150  -.005250  .000080
+    1991.35  -.196100  .000120   .427740  .000110   .3269160  .0000800  -.003480  .000150  -.005350  .000080
+    1991.40  -.148030  .000110   .487300  .000110   .2852580  .0000700  -.006750  .000150  -.005630  .000080
+    1991.45  -.087780  .000120   .535430  .000110   .2509990  .0000800  -.007820  .000150  -.005310  .000080
+    1991.50  -.027600  .000110   .563210  .000110   .2244370  .0000700  -.010640  .000150  -.004690  .000080
+    1991.55   .049470  .000110   .572690  .000110   .1994110  .0000800  -.014450  .000150  -.004550  .000080
+    1991.60   .118890  .000110   .560660  .000110   .1792000  .0000700  -.015800  .000150  -.004890  .000080
+    1991.65   .172940  .000110   .527310  .000110   .1523860  .0000800  -.017410  .000150  -.004390  .000080
+    1991.70   .218130  .000110   .487510  .000110   .1145380  .0000700  -.019540  .000150  -.003880  .000080
+    1991.75   .251390  .000110   .434860  .000120   .0781450  .0000800  -.017070  .000150  -.004230  .000080
+    1991.80   .262130  .000100   .372840  .000100   .0419620  .0000700  -.015530  .000150  -.003410  .000070
+    1991.85   .263160  .000110   .317840  .000110   .0002900  .0000700  -.013880  .000150  -.002470  .000080
+    1991.90   .247290  .000110   .263630  .000110  -.0397540  .0000800  -.011140  .000150  -.001880  .000080
+    1991.95   .217400  .000100   .209210  .000100  -.0833930  .0000700  -.010160  .000150  -.000890  .000070
+    1992.00   .183430  .000110   .168250  .000110  -.1253090  .0000700  -.010560  .000150  -.001100  .000080
+    1992.05   .132860  .000110   .139720  .000110  -.1664230  .0000700  -.009680  .000150  -.001230  .000080
+    1992.10   .083410  .000110   .121340  .000110  -.2133580  .0000700  -.009250  .000150  -.001360  .000070
+    1992.15   .026850  .000110   .116920  .000100  -.2592480  .0000700  -.009810  .000150  -.002790  .000080
+    1992.20  -.034650  .000110   .126400  .000110  -.3037880  .0000700  -.008310  .000150  -.004080  .000080
+    1992.25  -.082680  .000120   .163990  .000110  -.3574120  .0000800  -.007420  .000160  -.004690  .000080
+    1992.30  -.115610  .000110   .203320  .000110  -.4102900  .0000700  -.007920  .000150  -.005450  .000080
+    1992.35  -.145550  .000110   .245630  .000110  -.4539040  .0000700  -.007330  .000150  -.006620  .000080
+    1992.40  -.156500  .000110   .291880  .000110  -.4959850  .0000700  -.008410  .000150  -.006170  .000080
+    1992.45  -.153110  .000120   .334650  .000120  -.5303330  .0000800  -.010970  .000170  -.005880  .000090
+    1992.50  -.140940  .000110   .381020  .000110   .4420910  .0000700  -.012890  .000150  -.006070  .000080
+    1992.55  -.115160  .000110   .420770  .000110   .4184490  .0000700  -.016380  .000140  -.005610  .000070
+    1992.60  -.077490  .000100   .459320  .000100   .3892290  .0000700  -.020190  .000140  -.005790  .000070
+    1992.65  -.031830  .000110   .492120  .000110   .3596050  .0000700  -.020360  .000150  -.006130  .000080
+    1992.70   .014530  .000110   .506730  .000110   .3231410  .0000700  -.021800  .000150  -.005180  .000080
+    1992.75   .055600  .000110   .503780  .000110   .2854080  .0000700  -.021980  .000150  -.005110  .000080
+    1992.80   .103120  .000110   .494250  .000100   .2458780  .0000700  -.018870  .000150  -.004950  .000080
+    1992.85   .137780  .000110   .473110  .000110   .1994080  .0000700  -.017150  .000150  -.004090  .000080
+    1992.90   .170750  .000110   .444760  .000110   .1538820  .0000700  -.015860  .000150  -.003210  .000080
+    1992.95   .187750  .000110   .406300  .000110   .1096390  .0000700  -.014370  .000150  -.002500  .000080
+    1993.00   .208200  .000170   .361780  .000190   .0639800  .0010000  -.012130  .000220  -.001820  .000110
+    1993.05   .212870  .000170   .311750  .000160   .0163900  .0010000  -.013700  .000240  -.001980  .000130
+    1993.10   .205710  .000220   .265790  .000200  -.0283100  .0010000  -.013700  .000160  -.003160  .000080
+    1993.15   .186400  .000210   .225690  .000200  -.0785000  .0010000  -.013380  .000160  -.003430  .000080
+    1993.20   .159450  .000220   .194090  .000150  -.1275600  .0010000  -.012960  .000160  -.005350  .000080
+    1993.25   .113650  .000210   .170110  .000230  -.1750500  .0010000  -.011070  .000170  -.006100  .000080
+    1993.30   .065420  .000250   .163930  .000160  -.2286500  .0010000  -.010500  .000170  -.006910  .000080
+    1993.35   .025160  .000210   .166410  .000190  -.2813400  .0010000  -.012890  .000170  -.007620  .000080
+    1993.40  -.005520  .000210   .177900  .000180  -.3249500  .0010000  -.012100  .000160  -.007690  .000080
+    1993.45  -.036590  .000150   .190810  .000200  -.3670900  .0010000  -.013970  .000160  -.007020  .000070
+    1993.50  -.063740  .000150   .211350  .000230   .5975800  .0010000  -.018750  .000150  -.006860  .000070
+    1993.55  -.073070  .000180   .234400  .000190   .5709200  .0010000  -.019920  .000150  -.007380  .000070
+    1993.60  -.091560  .000150   .266690  .000200   .5374700  .0010000  -.022820  .000160  -.006800  .000080
+    1993.65  -.101560  .000150   .302050  .000170   .5021000  .0010000  -.024430  .000160  -.007300  .000080
+    1993.70  -.099970  .000150   .336910  .000150   .4679700  .0010000  -.024360  .000160  -.007220  .000080
+    1993.75  -.095410  .000150   .370980  .000150   .4245500  .0010000  -.024680  .000150  -.006070  .000070
+    1993.80  -.080940  .000150   .403840  .000180   .3774500  .0010000  -.023390  .000150  -.005460  .000070
+    1993.85  -.062500  .000200   .428470  .000150   .3322200  .0010000  -.020420  .000150  -.005010  .000080
+    1993.90  -.041250  .000160   .448950  .000230   .2851400  .0010000  -.019020  .000150  -.004290  .000070
+    1993.95  -.019600  .000160   .464960  .000170   .2441700  .0010000  -.018560  .000150  -.003470  .000070
+    1994.00   .009200  .000170   .476210  .000190   .2006800  .0010000  -.016450  .000160  -.003840  .000070
+    1994.05   .054050  .000150   .478850  .000160   .1576400  .0010000  -.018260  .000150  -.002940  .000070
+    1994.10   .099840  .000190   .467200  .000180   .1161800  .0010000  -.019390  .000150  -.003820  .000070
+    1994.15   .137660  .000200   .448700  .000150   .0759200  .0010000  -.019230  .000160  -.005950  .000080
+    1994.20   .158340  .000190   .421910  .000150   .0247300  .0010000  -.018050  .000160  -.005840  .000070
+    1994.25   .175010  .000150   .390000  .000240  -.0223200  .0010000  -.017140  .000160  -.007230  .000080
+    1994.30   .183970  .000250   .356950  .000230  -.0662200  .0010000  -.015760  .000150  -.007610  .000070
+    1994.35   .186340  .000150   .317810  .000170  -.1154700  .0010000  -.017740  .000160  -.007860  .000080
+    1994.40   .180670  .000190   .281910  .000150  -.1586500  .0010000  -.017830  .000150  -.008150  .000070
+    1994.45   .160850  .000210   .243850  .000150  -.1904900  .0010000  -.019400  .000160  -.008520  .000080
+    1994.50   .134830  .000150   .210780  .000190   .7815600  .0010000  -.022820  .000150  -.007870  .000080
+    1994.55   .101460  .000170   .184820  .000180   .7562100  .0010000  -.026320  .000150  -.007960  .000070
+    1994.60   .067260  .000180   .172080  .000230   .7314100  .0010000  -.028350  .000160  -.008050  .000070
+    1994.65   .026570  .000160   .168170  .000230   .7029600  .0010000  -.029900  .000150  -.007730  .000070
+    1994.70  -.016290  .000150   .179410  .000190   .6665200  .0010000  -.030070  .000150  -.007650  .000070
+    1994.75  -.066370  .000150   .200140  .000190   .6249200  .0010000  -.029730  .000150  -.008050  .000070
+    1994.80  -.106130  .000140   .232880  .000190   .5793400  .0010000  -.028170  .000150  -.006430  .000070
+    1994.85  -.141410  .000170   .271820  .000170   .5355300  .0010000  -.026750  .000150  -.005780  .000080
+    1994.90  -.152620  .000190   .321150  .000180   .4935800  .0010000  -.024040  .000150  -.005160  .000070
+    1994.95  -.153790  .000170   .368190  .000160   .4476700  .0010000  -.022980  .000150  -.004610  .000070
+    1995.00  -.153720  .000170   .418090  .000170   .3991000  .0010000  -.023030  .000150  -.004120  .000070
+    1995.05  -.127450  .000130   .461200  .000150   .3532000  .0010000  -.022230  .000150  -.004420  .000070
+    1995.10  -.111580  .000130   .494070  .000160   .3028200  .0010000  -.024400  .000150  -.004660  .000070
+    1995.15  -.075420  .000170   .524080  .000150   .2573700  .0010000  -.023460  .000160  -.005540  .000070
+    1995.20  -.022770  .000140   .546010  .000130   .2056500  .0010000  -.022640  .000150  -.007170  .000070
+    1995.25   .035210  .000170   .558400  .000140   .1532400  .0010000  -.023210  .000150  -.007800  .000070
+    1995.30   .092910  .000130   .555900  .000200   .1027500  .0010000  -.021940  .000150  -.008930  .000070
+    1995.35   .162220  .000130   .532900  .000130   .0547700  .0010000  -.020550  .000150  -.009080  .000070
+    1995.40   .209220  .000170   .497340  .000210   .0067200  .0010000  -.023280  .000150  -.008740  .000080
+    1995.45   .254650  .000170   .443560  .000170  -.0324300  .0010000  -.024970  .000150  -.008710  .000070
+    1995.50   .281610  .000140   .378980  .000160  -.0635800  .0010000  -.026890  .000160  -.008000  .000080
+    1995.55   .287570  .000140   .308430  .000170  -.0926700  .0010000  -.031920  .000150  -.008630  .000070
+    1995.60   .273820  .000130   .237780  .000160  -.1136100  .0010000  -.034000  .000150  -.008830  .000070
+    1995.65   .237560  .000140   .179860  .000130  -.1418400  .0010000  -.035010  .000150  -.008040  .000070
+    1995.70   .189520  .000140   .133990  .000170  -.1803800  .0010000  -.036390  .000150  -.008250  .000070
+    1995.75   .135580  .000130   .105900  .000180  -.2213600  .0010000  -.035770  .000150  -.008060  .000070
+    1995.80   .066650  .000130   .085830  .000130  -.2632900  .0010000  -.033420  .000150  -.007150  .000070
+    1995.85   .002730  .000130   .084730  .000160  -.3084000  .0010000  -.032240  .000150  -.006220  .000070
+    1995.90  -.067070  .000140   .101140  .000160  -.3533700  .0010000  -.029910  .000150  -.005870  .000070
+    1995.95  -.138200  .000140   .136100  .000150  -.3981800  .0010000  -.029210  .000150  -.005260  .000070
+    1996.00  -.176160  .000140   .192180  .000160   .5551900  .0010000  -.029560  .000150  -.004540  .000070
+    1996.05  -.203930  .000140   .246410  .000130   .5221600  .0010000  -.028890  .000150  -.005090  .000070
+    1996.10  -.223380  .000140   .312950  .000130   .4899200  .0010000  -.028480  .000150  -.005710  .000070
+    1996.15  -.220960  .000130   .378460  .000210   .4499500  .0010000  -.030480  .000160  -.006550  .000070
+    1996.20  -.196520  .000130   .448570  .000150   .4092600  .0010000  -.029110  .000150  -.007690  .000070
+    1996.25  -.150870  .000130   .508690  .000130   .3699700  .0010000  -.028160  .000150  -.008330  .000070
+    1996.30  -.101690  .000140   .553340  .000160   .3258300  .0010000  -.028610  .000150  -.009150  .000070
+    1996.35  -.033850  .000170   .584490  .000150   .2846000  .0010000  -.029230  .000150  -.009690  .000070
+    1996.40   .040580  .000130   .595820  .000130   .2454400  .0010000  -.028510  .000160  -.009100  .000080
+    1996.45   .115360  .000170   .581210  .000130   .2114200  .0010000  -.032010  .000150  -.009350  .000070
+    1996.50   .181570  .000140   .545250  .000160   .1862900  .0010000  -.034130  .000150  -.008760  .000070
+    1996.55   .239170  .000170   .495410  .000130   .1659300  .0010000  -.036630  .000160  -.008420  .000070
+    1996.60   .267760  .000170   .436840  .000170   .1407800  .0010000  -.040480  .000150  -.008540  .000070
+    1996.65   .297160  .000240   .371810  .000140   .1230500  .0010000  -.041550  .000150  -.009250  .000070
+    1996.70   .290780  .000260   .296700  .000130   .0985300  .0010000  -.041950  .000150  -.008320  .000070
+    1996.75   .267110  .000130   .228290  .000130   .0638000  .0010000  -.042090  .000150  -.007370  .000070
+    1996.80   .227160  .000130   .171270  .000210   .0297800  .0010000  -.039090  .000150  -.007420  .000070
+    1996.85   .175940  .000140   .122030  .000150  -.0071800  .0010000  -.037160  .000150  -.007010  .000070
+    1996.90   .109730  .000140   .096200  .000170  -.0441600  .0010000  -.036960  .000150  -.005310  .000070
+    1996.95   .039500  .000140   .084250  .000160  -.0749400  .0010000  -.034810  .000150  -.005410  .000070
+    1997.00  -.020320  .000090   .095060  .000100  -.1096500  .0010000  -.034140  .000260  -.004920  .000100
+    1997.05  -.073030  .000100   .119750  .000090  -.1459800  .0010000  -.035390  .000290  -.004340  .000100
+    1997.10  -.124420  .000100   .156650  .000100  -.1730900  .0010000  -.035760  .000100  -.005370  .000100
+    1997.15  -.161820  .000090   .203960  .000100  -.2056400  .0010000  -.034520  .000260  -.006530  .000200
+    1997.20  -.186450  .000100   .263310  .000100  -.2482000  .0010000  -.035780  .000110  -.007860  .000200
+    1997.25  -.190710  .000100   .331710  .000090  -.2929300  .0010000  -.034320  .000100  -.008360  .000250
+    1997.30  -.174960  .000210   .396620  .000090  -.3387100  .0010000  -.033330  .000140  -.008810  .000200
+    1997.35  -.145010  .000100   .452930  .000100  -.3794300  .0010000  -.034730  .000310  -.009360  .000200
+    1997.40  -.098250  .000090   .498370  .000100  -.4162300  .0010000  -.036400  .000240  -.008940  .000250
+    1997.45  -.047990  .000090   .525350  .000090  -.4516000  .0010000  -.037960  .000130  -.008900  .000100
+    1997.50   .023090  .000090   .536790  .000100   .5261800  .0010000  -.041230  .000160  -.008490  .000200
+    1997.55   .088210  .000090   .526330  .000100   .5094900  .0010000  -.043740  .000130  -.007930  .000210
+    1997.60   .141170  .000100   .505000  .000100   .4812500  .0010000  -.045890  .000250  -.008370  .000090
+    1997.65   .181140  .000100   .467130  .000100   .4540400  .0010000  -.048080  .000130  -.008480  .000250
+    1997.70   .216860  .000100   .428130  .000100   .4276000  .0010000  -.047640  .000130  -.008290  .000090
+    1997.75   .221240  .000090   .378750  .000100   .3908700  .0010000  -.046790  .000110  -.007660  .000090
+    1997.80   .226280  .000100   .329150  .000100   .3513700  .0010000  -.047260  .000140  -.007180  .000140
+    1997.85   .214670  .000100   .278540  .000100   .3151900  .0010000  -.043960  .000230  -.006110  .000250
+    1997.90   .190380  .000100   .234080  .000100   .2784700  .0010000  -.041880  .000120  -.005170  .000100
+    1997.95   .151700  .000100   .201890  .000090   .2466500  .0010000  -.042270  .000270  -.004300  .000090
+    1998.00   .103371  .000034   .174919  .000027   .2187928  .0000860  -.040796  .000037  -.004526  .000010
+    1998.05   .051655  .000022   .167526  .000019   .1878736  .0000890  -.041014  .000035  -.004475  .000012
+    1998.10  -.005228  .000016   .173571  .000018   .1500342  .0000730  -.041089  .000022  -.005161  .000008
+    1998.15  -.051800  .000023   .188169  .000023   .1146000  .0001160  -.041022  .000032  -.005626  .000010
+    1998.20  -.079308  .000030   .220212  .000019   .0745974  .0000880  -.040480  .000039  -.006825  .000012
+    1998.25  -.110294  .000014   .254246  .000016   .0360847  .0001770  -.040068  .000027  -.007821  .000008
+    1998.30  -.113475  .000016   .301652  .000019   .0024942  .0001720  -.038470  .000023  -.008066  .000007
+    1998.35  -.114391  .000017   .344204  .000018  -.0345923  .0000870  -.039421  .000031  -.008546  .000010
+    1998.40  -.107406  .000018   .383854  .000019  -.0684825  .0000940  -.041256  .000027  -.008334  .000010
+    1998.45  -.099535  .000028   .414513  .000017  -.0887736  .0000800  -.041621  .000026  -.008251  .000008
+    1998.50  -.065007  .000030   .440850  .000025  -.1011400  .0000880  -.045405  .000032  -.008110  .000011
+    1998.55  -.021674  .000015   .465308  .000016  -.1082697  .0000780  -.048663  .000024  -.008757  .000008
+    1998.60   .017316  .000019   .478858  .000027  -.1146002  .0002360  -.050511  .000039  -.007435  .000011
+    1998.65   .058055  .000016   .476585  .000023  -.1250252  .0002150  -.052327  .000030  -.007918  .000009
+    1998.70   .097135  .000027   .465706  .000028  -.1418293  .0001130  -.053894  .000040  -.008104  .000011
+    1998.75   .125857  .000018   .444588  .000019  -.1587117  .0001640  -.051842  .000022  -.007051  .000007
+    1998.80   .149956  .000021   .418823  .000019  -.1862362  .0000880  -.050192  .000031  -.006161  .000011
+    1998.85   .163218  .000021   .388340  .000021  -.2147711  .0000750  -.049319  .000030  -.006025  .000010
+    1998.90   .154524  .000028   .350655  .000017  -.2401730  .0000940  -.047797  .000031  -.004755  .000011
+    1998.95   .137225  .000021   .321181  .000020  -.2653190  .0001500  -.047813  .000021  -.003519  .000007
+    1999.00   .138906  .000031   .296108  .000029   .7168562  .0000292  -.047632  .000102  -.004189  .000043
+    1999.05   .117532  .000023   .271385  .000020   .7014530  .0000153  -.046335  .000048  -.003666  .000020
+    1999.10   .100290  .000021   .252373  .000021   .6791687  .0000143  -.046361  .000049  -.004161  .000020
+    1999.15   .077098  .000025   .244566  .000019   .6561574  .0000165  -.046789  .000052  -.005200  .000021
+    1999.20   .054921  .000027   .239895  .000025   .6399826  .0000120  -.045030  .000034  -.006293  .000016
+    1999.25   .023809  .000025   .240618  .000020   .6145151  .0000125  -.044196  .000045  -.007261  .000018
+    1999.30   .001100  .000019   .248865  .000019   .5879676  .0000131  -.044112  .000036  -.007830  .000016
+    1999.35  -.017471  .000018   .262305  .000019   .5664931  .0000136  -.044623  .000039  -.008106  .000016
+    1999.40  -.023004  .000021   .281431  .000020   .5435885  .0000194  -.045556  .000056  -.007660  .000023
+    1999.45  -.031745  .000021   .296763  .000020   .5267825  .0000126  -.048393  .000040  -.007395  .000016
+    1999.50  -.031910  .000022   .311187  .000022   .5198637  .0000156  -.048944  .000060  -.007195  .000024
+    1999.55  -.024948  .000020   .330418  .000018   .5120479  .0000152  -.053295  .000049  -.007043  .000020
+    1999.60  -.014139  .000024   .345615  .000018   .5055648  .0000141  -.056278  .000043  -.007418  .000019
+    1999.65  -.008467  .000024   .361644  .000020   .4977768  .0000187  -.056558  .000058  -.008033  .000024
+    1999.70   .002079  .000023   .370914  .000021   .4819857  .0000165  -.056409  .000052  -.007053  .000020
+    1999.75   .006586  .000021   .379679  .000020   .4688203  .0000177  -.056851  .000056  -.006375  .000024
+    1999.80   .015741  .000023   .382597  .000021   .4506114  .0000177  -.054003  .000055  -.005858  .000024
+    1999.85   .024443  .000019   .379545  .000021   .4230946  .0000175  -.053148  .000040  -.004652  .000016
+    1999.90   .032087  .000018   .377378  .000022   .3974911  .0000145  -.051094  .000053  -.003961  .000022
+    1999.95   .037562  .000014   .380865  .000016   .3782104  .0000090  -.051070  .000033  -.003416  .000014
+    2000.00   .043300  .000014   .377661  .000021   .3554817  .0000572  -.050733  .000113  -.002289  .000040
+    2000.05   .052375  .000013   .375702  .000010   .3413574  .0000176  -.051501  .000042  -.002836  .000017
+    2000.10   .060632  .000009   .372427  .000010   .3250578  .0000117  -.050521  .000020  -.003334  .000008
+    2000.15   .067994  .000010   .365396  .000012   .3071171  .0000317  -.049754  .000059  -.004597  .000022
+    2000.20   .074610  .000010   .357979  .000010   .2899885  .0000127  -.049540  .000021  -.005112  .000008
+    2000.25   .075437  .000013   .346051  .000011   .2762541  .0000417  -.047537  .000065  -.005662  .000025
+    2000.30   .082353  .000009   .343278  .000012   .2552646  .0000219  -.047555  .000041  -.006187  .000015
+    2000.35   .088049  .000010   .332016  .000011   .2358447  .0000313  -.047653  .000056  -.006571  .000025
+    2000.40   .096303  .000010   .321406  .000009   .2198842  .0000179  -.048984  .000028  -.007124  .000011
+    2000.45   .113565  .000010   .304386  .000010   .2064913  .0000369  -.051715  .000058  -.006255  .000026
+    2000.50   .110079  .000010   .279086  .000010   .2040804  .0000193  -.054816  .000029  -.006360  .000013
+    2000.55   .096137  .000010   .261702  .000009   .2004203  .0000221  -.056391  .000040  -.006197  .000016
+    2000.60   .083088  .000009   .248498  .000010   .1987985  .0000409  -.058853  .000067  -.005982  .000024
+    2000.65   .058388  .000010   .242745  .000009   .1949233  .0000220  -.061330  .000046  -.006232  .000017
+    2000.70   .025972  .000011   .239588  .000009   .1871360  .0000185  -.059727  .000043  -.005855  .000016
+    2000.75  -.005722  .000011   .246917  .000009   .1747298  .0000378  -.060691  .000064  -.005000  .000026
+    2000.80  -.036045  .000011   .262831  .000008   .1600032  .0000134  -.057246  .000025  -.004209  .000010
+    2000.85  -.059965  .000009   .292223  .000009   .1391654  .0000181  -.055712  .000047  -.003613  .000017
+    2000.90  -.076915  .000010   .325404  .000010   .1205337  .0000302  -.054880  .000062  -.002841  .000022
+    2000.95  -.082660  .000008   .357017  .000009   .1045817  .0000131  -.053226  .000023  -.001982  .000008
+    2001.00  -.074006  .000010   .396764  .000009   .0936988  .0000299  -.051517  .000057  -.002267  .000022
+    2001.05  -.060835  .000011   .427064  .000009   .0806986  .0000145  -.051206  .000034  -.001604  .000013
+    2001.10  -.032401  .000008   .451341  .000009   .0762852  .0000112  -.054284  .000022  -.002328  .000008
+    2001.15   .004327  .000010   .475921  .000009   .0624390  .0000224  -.051152  .000049  -.002799  .000019
+    2001.20   .044840  .000008   .486196  .000008   .0388944  .0000105  -.050633  .000020  -.004153  .000008
+    2001.25   .091974  .000010   .489418  .000009   .0251539  .0000108  -.050009  .000020  -.005388  .000008
+    2001.30   .139116  .000011   .477702  .000011   .0096675  .0000143  -.049561  .000031  -.005489  .000013
+    2001.35   .178791  .000009   .452008  .000009  -.0088652  .0000125  -.051474  .000024  -.005586  .000009
+    2001.40   .215170  .000008   .409242  .000008  -.0228961  .0000160  -.051036  .000033  -.006224  .000014
+    2001.45   .242795  .000009   .359595  .000010  -.0245445  .0000168  -.053049  .000033  -.006319  .000013
+    2001.50   .254005  .000008   .304725  .000011  -.0278187  .0000118  -.055182  .000022  -.005536  .000008
+    2001.55   .247620  .000008   .249184  .000008  -.0254430  .0000161  -.059426  .000037  -.005789  .000014
+    2001.60   .220968  .000009   .199893  .000010  -.0206066  .0000143  -.060879  .000033  -.005547  .000012
+    2001.65   .175053  .000010   .158811  .000008  -.0281492  .0000148  -.062667  .000033  -.005926  .000013
+    2001.70   .125932  .000009   .132198  .000009  -.0304154  .0000126  -.062257  .000030  -.005599  .000012
+    2001.75   .064697  .000008   .117778  .000010  -.0383976  .0000155  -.060742  .000033  -.004371  .000013
+    2001.80   .001422  .000009   .120744  .000009  -.0558549  .0000201  -.059793  .000035  -.003611  .000015
+    2001.85  -.061030  .000010   .140506  .000009  -.0697006  .0000124  -.057258  .000022  -.002969  .000009
+    2001.90  -.103646  .000009   .180496  .000011  -.0868556  .0000215  -.055186  .000049  -.001724  .000020
+    2001.95  -.153361  .000010   .228492  .000010  -.1008918  .0000126  -.055469  .000028  -.001427  .000010
+    2002.00  -.176817  .000008   .292216  .000010  -.1154380  .0000264  -.053319  .000053  -.000648  .000022
+    2002.05  -.178852  .000009   .348438  .000008  -.1269166  .0000109  -.053365  .000021  -.001380  .000010
+    2002.10  -.163183  .000009   .406360  .000008  -.1417309  .0000151  -.053999  .000037  -.001540  .000014
+    2002.15  -.135832  .000008   .461499  .000008  -.1552923  .0000115  -.053015  .000033  -.003430  .000013
+    2002.20  -.088799  .000009   .513379  .000008  -.1739301  .0000084  -.051685  .000019  -.003023  .000007
+    2002.25  -.027634  .000009   .540974  .000007  -.1901581  .0000111  -.049814  .000027  -.004247  .000011
+    2002.30   .029239  .000008   .554816  .000008  -.2007113  .0000127  -.050367  .000032  -.005206  .000014
+    2002.35   .092521  .000009   .550437  .000008  -.2137458  .0000109  -.050343  .000020  -.004880  .000008
+    2002.40   .142157  .000008   .534179  .000008  -.2303514  .0000141  -.052550  .000037  -.004780  .000014
+    2002.45   .192923  .000007   .504114  .000008  -.2287794  .0000185  -.054054  .000036  -.005547  .000015
+    2002.50   .228889  .000009   .458092  .000008  -.2296246  .0000129  -.056387  .000033  -.005342  .000013
+    2002.55   .244514  .000007   .404459  .000007  -.2327614  .0000150  -.059477  .000026  -.005044  .000012
+    2002.60   .257521  .000010   .348296  .000008  -.2240428  .0000160  -.061751  .000039  -.005617  .000015
+    2002.65   .254939  .000008   .295393  .000008  -.2248033  .0000158  -.062523  .000045  -.004834  .000018
+    2002.70   .235509  .000007   .242129  .000007  -.2303263  .0000137  -.063071  .000027  -.004894  .000011
+    2002.75   .197659  .000007   .199413  .000007  -.2327877  .0000115  -.061560  .000022  -.004292  .000009
+    2002.80   .151551  .000010   .165804  .000007  -.2429725  .0000068  -.059948  .000013  -.003171  .000006
+    2002.85   .084865  .000008   .146837  .000008  -.2549716  .0000092  -.058425  .000020  -.002538  .000008
+    2002.90   .022450  .000008   .142124  .000009  -.2612171  .0000117  -.056420  .000026  -.002110  .000011
+    2002.95  -.038228  .000007   .154264  .000009  -.2767537  .0000111  -.055849  .000022  -.000854  .000010
+    2003.00  -.087743  .000008   .187387  .000009  -.2892390  .0000166  -.057149  .000032  -.000539  .000013
+    2003.05  -.127578  .000009   .228891  .000008  -.2995032  .0000119  -.054522  .000029  -.001356  .000012
+    2003.10  -.147530  .000007   .278647  .000008  -.3078795  .0000102  -.053909  .000022  -.001160  .000008
+    2003.15  -.154775  .000007   .332102  .000008  -.3201905  .0000109  -.053952  .000027  -.001913  .000010
+    2003.20  -.157108  .000008   .383491  .000008  -.3285379  .0000101  -.052108  .000022  -.003382  .000008
+    2003.25  -.131007  .000009   .438825  .000008  -.3439523  .0000120  -.051249  .000026  -.003305  .000010
+    2003.30  -.094644  .000008   .486399  .000008  -.3588043  .0000091  -.050741  .000021  -.004457  .000009
+    2003.35  -.043183  .000007   .522695  .000008  -.3638535  .0000108  -.050307  .000021  -.005323  .000009
+    2003.40   .001931  .000007   .541957  .000008  -.3745652  .0000102  -.051708  .000023  -.004153  .000009
+    2003.45   .062632  .000007   .546600  .000008  -.3752839  .0000160  -.054049  .000027  -.004697  .000012
+    2003.50   .135203  .000007   .538240  .000007  -.3661265  .0000115  -.056222  .000022  -.005013  .000009
+    2003.55   .191134  .000008   .509318  .000008  -.3577046  .0000128  -.060297  .000028  -.004614  .000012
+    2003.60   .232086  .000007   .463954  .000008  -.3537978  .0000190  -.062184  .000036  -.004744  .000015
+    2003.65   .259508  .000007   .415127  .000007  -.3494880  .0000129  -.062965  .000029  -.005055  .000011
+    2003.70   .264299  .000008   .356543  .000008  -.3529986  .0000103  -.063232  .000023  -.003950  .000009
+    2003.75   .257771  .000008   .302232  .000008  -.3575570  .0000116  -.062983  .000024  -.004229  .000010
+    2003.80   .226130  .000007   .250158  .000008  -.3628298  .0000113  -.059567  .000025  -.003622  .000011
+    2003.85   .195950  .000007   .207643  .000011  -.3728456  .0000145  -.058843  .000028  -.002215  .000013
+    2003.90   .147593  .000007   .174905  .000010  -.3807556  .0000134  -.057362  .000026  -.001897  .000011
+    2003.95   .087282  .000007   .158884  .000008  -.3820300  .0000099  -.054770  .000019  -.001608  .000008
+    2004.00   .031246  .000007   .153785  .000007  -.3896036  .0000155  -.056035  .000032  -.000255  .000014
+    2004.05  -.014033  .000009   .166554  .000010  -.3994989  .0000112  -.055954  .000030  -.000864  .000012
+    2004.10  -.057805  .000007   .191331  .000008  -.4041551  .0000156  -.054298  .000036  -.001804  .000014
+    2004.15  -.101004  .000007   .228144  .000008  -.4153922  .0000097  -.054532  .000024  -.002010  .000009
+    2004.20  -.126021  .000007   .268583  .000008  -.4225892  .0000165  -.053954  .000034  -.003026  .000014
+    2004.25  -.140343  .000008   .321451  .000008  -.4338646  .0000126  -.051273  .000029  -.004478  .000012
+    2004.30  -.132911  .000007   .375713  .000007  -.4512439  .0000137  -.051136  .000030  -.003701  .000012
+    2004.35  -.112725  .000007   .423506  .000008  -.4596331  .0000144  -.052649  .000025  -.005159  .000011
+    2004.40  -.090722  .000008   .458455  .000008  -.4683249  .0000165  -.051299  .000033  -.005609  .000015
Index: /tags/ipp-1-X/bug123/psLib/share/pslib/finals_all.dat
===================================================================
--- /tags/ipp-1-X/bug123/psLib/share/pslib/finals_all.dat	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/share/pslib/finals_all.dat	(revision 22331)
@@ -0,0 +1,11960 @@
+#  finals_all.dat
+#
+#  This file comes from http://maia.usno.navy.mil (Click on finals.all). This file may also be directly
+#  downloaded from ftp://maia.usno.navy.mil/ser7/finals.all. See readme.finals_all (located in the psLib/data
+#  directory) for details. Only bulletin A values are listed below.
+#
+#  @author Ross Harman, MHPCC
+#
+#  @version $Revision: 1.1 $ $Name: not supported by cvs2svn $
+#  @date $Date: 2005-02-10 02:36:41 $
+#
+#
+#        MJD         PM-x     PM-y    UT1-UTC
+#      (days)     (arcsec)  (arcsec)   (sec)
+        psF64  	    psF64     psF64     psF64
+      41684.00    .120724   .137066   .8084319
+      41685.00    .118971   .135756   .8056304
+      41686.00    .117218   .134448   .8028036
+      41687.00    .115464   .133144   .7998870
+      41688.00    .113708   .131846   .7968285
+      41689.00    .111948   .130558   .7935963
+      41690.00    .110180   .129282   .7901851
+      41691.00    .108401   .128020   .7866194
+      41692.00    .106607   .126775   .7829530
+      41693.00    .104795   .125551   .7792628
+      41694.00    .102960   .124351   .7756359
+      41695.00    .101103   .123180   .7721500
+      41696.00    .099219   .122040   .7688519
+      41697.00    .097304   .120936   .7657376
+      41698.00    .095355   .119870   .7627466
+      41699.00    .093368   .118846   .7597749
+      41700.00    .091341   .117865   .7567072
+      41701.00    .089273   .116926   .7534582
+      41702.00    .087167   .116031   .7500021
+      41703.00    .085025   .115178   .7463792
+      41704.00    .082853   .114370   .7426762
+      41705.00    .080657   .113605   .7389931
+      41706.00    .078440   .112884   .7354139
+      41707.00    .076205   .112202   .7319919
+      41708.00    .073954   .111559   .7287489
+      41709.00    .071691   .110952   .7256811
+      41710.00    .069420   .110378   .7227643
+      41711.00    .067147   .109836   .7199568
+      41712.00    .064874   .109325   .7172012
+      41713.00    .062607   .108846   .7144307
+      41714.00    .060349   .108400   .7115769
+      41715.00    .058100   .107987   .7085797
+      41716.00    .055865   .107608   .7053972
+      41717.00    .053644   .107263   .7020146
+      41718.00    .051441   .106954   .6984511
+      41719.00    .049257   .106681   .6947614
+      41720.00    .047093   .106442   .6910290
+      41721.00    .044951   .106239   .6873489
+      41722.00    .042831   .106070   .6838052
+      41723.00    .040732   .105935   .6804490
+      41724.00    .038653   .105832   .6772827
+      41725.00    .036593   .105760   .6742568
+      41726.00    .034550   .105717   .6712808
+      41727.00    .032521   .105702   .6682469
+      41728.00    .030505   .105715   .6650607
+      41729.00    .028503   .105755   .6616712
+      41730.00    .026512   .105824   .6580860
+      41731.00    .024531   .105922   .6543676
+      41732.00    .022556   .106048   .6506111
+      41733.00    .020582   .106203   .6469136
+      41734.00    .018606   .106384   .6433499
+      41735.00    .016623   .106592   .6399606
+      41736.00    .014632   .106828   .6367535
+      41737.00    .012634   .107093   .6337102
+      41738.00    .010628   .107386   .6307923
+      41739.00    .008615   .107709   .6279462
+      41740.00    .006593   .108060   .6251074
+      41741.00    .004564   .108438   .6222069
+      41742.00    .002526   .108842   .6191790
+      41743.00    .000479   .109270   .6159706
+      41744.00   -.001578   .109721   .6125505
+      41745.00   -.003643   .110195   .6089196
+      41746.00   -.005713   .110692   .6051180
+      41747.00   -.007786   .111214   .6012241
+      41748.00   -.009857   .111761   .5973410
+      41749.00   -.011922   .112336   .5935706
+      41750.00   -.013977   .112940   .5899833
+      41751.00   -.016019   .113573   .5865962
+      41752.00   -.018040   .114237   .5833682
+      41753.00   -.020032   .114933   .5802133
+      41754.00   -.021990   .115661   .5770261
+      41755.00   -.023907   .116421   .5737111
+      41756.00   -.025780   .117212   .5702072
+      41757.00   -.027610   .118036   .5665027
+      41758.00   -.029400   .118890   .5626361
+      41759.00   -.031155   .119773   .5586838
+      41760.00   -.032878   .120683   .5547386
+      41761.00   -.034573   .121619   .5508857
+      41762.00   -.036242   .122582   .5471853
+      41763.00   -.037885   .123571   .5436641
+      41764.00   -.039504   .124588   .5403179
+      41765.00   -.041099   .125635   .5371173
+      41766.00   -.042673   .126712   .5340153
+      41767.00   -.044229   .127821   .5309537
+      41768.00   -.045771   .128964   .5278687
+      41769.00   -.047302   .130142   .5246976
+      41770.00   -.048828   .131356   .5213856
+      41771.00   -.050351   .132605   .5178924
+      41772.00   -.051875   .133891   .5142009
+      41773.00   -.053404   .135214   .5103278
+      41774.00   -.054940   .136573   .5063304
+      41775.00   -.056488   .137969   .5023026
+      41776.00   -.058053   .139402   .4983553
+      41777.00   -.059639   .140872   .4945843
+      41778.00   -.061247   .142377   .4910366
+      41779.00   -.062874   .143917   .4876939
+      41780.00   -.064517   .145494   .4844787
+      41781.00   -.066174   .147108   .4812836
+      41782.00   -.067840   .148757   .4780073
+      41783.00   -.069512   .150437   .4745829
+      41784.00   -.071188   .152143   .4709918
+      41785.00   -.072868   .153873   .4672608
+      41786.00   -.074547   .155619   .4634499
+      41787.00   -.076226   .157377   .4596361
+      41788.00   -.077898   .159141   .4558961
+      41789.00   -.079559   .160904   .4522916
+      41790.00   -.081206   .162664   .4488589
+      41791.00   -.082836   .164416   .4456047
+      41792.00   -.084445   .166159   .4425079
+      41793.00   -.086031   .167888   .4395262
+      41794.00   -.087594   .169602   .4366037
+      41795.00   -.089132   .171299   .4336788
+      41796.00   -.090646   .172977   .4306908
+      41797.00   -.092135   .174637   .4275866
+      41798.00   -.093600   .176280   .4243250
+      41799.00   -.095039   .177908   .4208818
+      41800.00   -.096452   .179524   .4172571
+      41801.00   -.097839   .181129   .4134837
+      41802.00   -.099202   .182728   .4096311
+      41803.00   -.100543   .184322   .4057984
+      41804.00   -.101860   .185910   .4020902
+      41805.00   -.103149   .187492   .3985825
+      41806.00   -.104401   .189067   .3952917
+      41807.00   -.105607   .190634   .3921651
+      41808.00   -.106760   .192195   .3891000
+      41809.00   -.107853   .193751   .3859841
+      41810.00   -.108882   .195303   .3827358
+      41811.00   -.109843   .196854   .3793280
+      41812.00   -.110735   .198402   .3757875
+      41813.00   -.111557   .199950   .3721774
+      41814.00   -.112313   .201499   .3685739
+      41815.00   -.113006   .203052   .3650488
+      41816.00   -.113643   .204611   .3616590
+      41817.00   -.114229   .206179   .3584406
+      41818.00   -.114769   .207756   .3554062
+      41819.00   -.115267   .209342   .3525437
+      41820.00   -.115729   .210937   .3498182
+      41821.00   -.116160   .212543   .3471778
+      41822.00   -.116560   .214161   .3445621
+      41823.00   -.116928   .215794   .3419107
+      41824.00   -.117260   .217446   .3391710
+      41825.00   -.117551   .219118   .3363033
+      41826.00   -.117796   .220811   .3332839
+      41827.00   -.117988   .222526   .3301084
+      41828.00   -.118122   .224260   .3267957
+      41829.00   -.118191   .226015   .3233929
+      41830.00   -.118187   .227791   .3199751
+      41831.00   -.118104   .229587   .3166341
+      41832.00   -.117943   .231402   .3134538
+      41833.00   -.117703   .233238   .3104780
+      41834.00   -.117388   .235091   .3076868
+      41835.00   -.117002   .236962   .3049978
+      41836.00   -.116549   .238846   .3022950
+      41837.00   -.116036   .240738   .2994746
+      41838.00   -.115466   .242636   .2964846
+      41839.00   -.114846   .244536   .2933393
+      41840.00   -.114180   .246436   .2901054
+      41841.00   -.113474   .248333   .2868723
+      41842.00   -.112728   .250227   .2837227
+      41843.00   -.111943   .252117   .2807165
+      41844.00   -.111124   .254000   .2778874
+      41845.00   -.110279   .255878   .2752458
+      41846.00   -.109416   .257745   .2727809
+      41847.00   -.108543   .259600   .2704624
+      41848.00   -.107669   .261438   .2682428
+      41849.00   -.106798   .263258   .2660632
+      41850.00   -.105935   .265060   .2638618
+      41851.00   -.105082   .266846   .2615839
+      41852.00   -.104241   .268620   .2591881
+      41853.00   -.103414   .270385   .2566509
+      41854.00   -.102602   .272147   .2539691
+      41855.00   -.101802   .273910   .2511601
+      41856.00   -.101014   .275678   .2482631
+      41857.00   -.100233   .277455   .2453372
+      41858.00   -.099456   .279243   .2424569
+      41859.00   -.098677   .281043   .2396968
+      41860.00   -.097889   .282855   .2371084
+      41861.00   -.097085   .284679   .2346963
+      41862.00   -.096256   .286516   .2324062
+      41863.00   -.095395   .288366   .2301356
+      41864.00   -.094499   .290226   .2277697
+      41865.00   -.093566   .292091   .2252259
+      41866.00   -.092596   .293957   .2224869
+      41867.00   -.091588   .295818   .2196042
+      41868.00   -.090547   .297669   .2166747
+      41869.00   -.089478   .299504   .2138025
+      41870.00   -.088387   .301319   .2110689
+      41871.00   -.087280   .303108   .2085187
+      41872.00   -.086167   .304868   .2061633
+      41873.00   -.085056   .306592   .2039890
+      41874.00   -.083952   .308278   .2019641
+      41875.00   -.082861   .309919   .2000425
+      41876.00   -.081780   .311513   .1981661
+      41877.00   -.080706   .313057   .1962715
+      41878.00   -.079639   .314550   .1942984
+      41879.00   -.078576   .315992   .1921991
+      41880.00   -.077516   .317382   .1899451
+      41881.00   -.076456   .318721   .1875310
+      41882.00   -.075393   .320007   .1849750
+      41883.00   -.074324   .321240   .1823177
+      41884.00   -.073249   .322420   .1796175
+      41885.00   -.072165   .323546   .1769433
+      41886.00   -.071074   .324618   .1743623
+      41887.00   -.069974   .325637   .1719236
+      41888.00   -.068865   .326605   .1696410
+      41889.00   -.067746   .327521   .1674796
+      41890.00   -.066615   .328385   .1653574
+      41891.00   -.065470   .329200   .1631654
+      41892.00   -.064308   .329966   .1608038
+      41893.00   -.063127   .330684   .1582205
+      41894.00   -.061922   .331356   .1554320
+      41895.00   -.060690   .331984   .1525183
+      41896.00   -.059426   .332571   .1495917
+      41897.00   -.058129   .333123   .1467587
+      41898.00   -.056796   .333641   .1440916
+      41899.00   -.055426   .334129   .1416190
+      41900.00   -.054018   .334587   .1393332
+      41901.00   -.052571   .335018   .1372021
+      41902.00   -.051087   .335422   .1351788
+      41903.00   -.049566   .335801   .1332063
+      41904.00   -.048009   .336158   .1312213
+      41905.00   -.046418   .336495   .1291610
+      41906.00   -.044793   .336814   .1269711
+      41907.00   -.043138   .337117   .1246142
+      41908.00   -.041457   .337408   .1220762
+      41909.00   -.039753   .337689   .1193688
+      41910.00   -.038027   .337962   .1165303
+      41911.00   -.036279   .338231   .1136211
+      41912.00   -.034509   .338497   .1107146
+      41913.00   -.032716   .338764   .1078820
+      41914.00   -.030904   .339034   .1051753
+      41915.00   -.029072   .339312   .1026111
+      41916.00   -.027225   .339599   .1001622
+      41917.00   -.025364   .339898   .0977587
+      41918.00   -.023491   .340210   .0953036
+      41919.00   -.021609   .340534   .0926991
+      41920.00   -.019719   .340866   .0898766
+      41921.00   -.017823   .341204   .0868220
+      41922.00   -.015923   .341546   .0835842
+      41923.00   -.014024   .341889   .0802614
+      41924.00   -.012126   .342230   .0769694
+      41925.00   -.010233   .342570   .0738075
+      41926.00   -.008345   .342904   .0708351
+      41927.00   -.006462   .343233   .0680673
+      41928.00   -.004582   .343554   .0654838
+      41929.00   -.002703   .343867   .0630419
+      41930.00   -.000823   .344170   .0606870
+      41931.00    .001061   .344464   .0583584
+      41932.00    .002946   .344750   .0559943
+      41933.00    .004833   .345026   .0535381
+      41934.00    .006719   .345293   .0509461
+      41935.00    .008606   .345551   .0481927
+      41936.00    .010491   .345797   .0452758
+      41937.00    .012375   .346029   .0422207
+      41938.00    .014258   .346244   .0390798
+      41939.00    .016138   .346440   .0359271
+      41940.00    .018015   .346613   .0328428
+      41941.00    .019888   .346762   .0298925
+      41942.00    .021754   .346884   .0271064
+      41943.00    .023611   .346978   .0244669
+      41944.00    .025456   .347042   .0219114
+      41945.00    .027289   .347074   .0193484
+      41946.00    .029108   .347072   .0166814
+      41947.00    .030916   .347036   .0138355
+      41948.00    .032711   .346966   .0107781
+      41949.00    .034492   .346860   .0075291
+      41950.00    .036259   .346719   .0041565
+      41951.00    .038008   .346543   .0007577
+      41952.00    .039739   .346333  -.0025677
+      41953.00    .041450   .346086  -.0057439
+      41954.00    .043140   .345801  -.0087342
+      41955.00    .044808   .345476  -.0115428
+      41956.00    .046453   .345111  -.0142048
+      41957.00    .048076   .344705  -.0167739
+      41958.00    .049673   .344259  -.0193120
+      41959.00    .051242   .343773  -.0218818
+      41960.00    .052777   .343248  -.0245414
+      41961.00    .054276   .342684  -.0273383
+      41962.00    .055736   .342080  -.0303046
+      41963.00    .057156   .341436  -.0334515
+      41964.00    .058539   .340754  -.0367661
+      41965.00    .059888   .340035  -.0402090
+      41966.00    .061203   .339282  -.0437149
+      41967.00    .062488   .338497  -.0472011
+      41968.00    .063742   .337684  -.0505867
+      41969.00    .064969   .336845  -.0538171
+      41970.00    .066169   .335980  -.0568853
+      41971.00    .067343   .335085  -.0598382
+      41972.00    .068487   .334159  -.0627630
+      41973.00    .069599   .333202  -.0657581
+      41974.00    .070676   .332213  -.0689022
+      41975.00    .071714   .331195  -.0722334
+      41976.00    .072709   .330147  -.0757409
+      41977.00    .073660   .329075  -.0793711
+      41978.00    .074564   .327981  -.0830434
+      41979.00    .075421   .326871  -.0866712
+      41980.00    .076229   .325751  -.0901797
+      41981.00    .076990   .324625  -.0935217
+      41982.00    .077706   .323499  -.0966847
+      41983.00    .078381   .322377  -.0996889
+      41984.00    .079016   .321265  -.1025792
+      41985.00    .079614   .320168  -.1054139
+      41986.00    .080175   .319086  -.1082551
+      41987.00    .080703   .318022  -.1111607
+      41988.00    .081201   .316975  -.1141787
+      41989.00    .081671   .315947  -.1173433
+      41990.00    .082118   .314936  -.1206712
+      41991.00    .082543   .313944  -.1241596
+      41992.00    .082951   .312970  -.1277842
+      41993.00    .083347   .312016  -.1314973
+      41994.00    .083732   .311082  -.1352296
+      41995.00    .084109   .310169  -.1389005
+      41996.00    .084479   .309275  -.1424400
+      41997.00    .084843   .308399  -.1458132
+      41998.00    .085205   .307541  -.1490397
+      41999.00    .085567   .306698  -.1521912
+      42000.00    .085934   .305868  -.1553673
+      42001.00    .086310   .305050  -.1586579
+      42002.00    .086696   .304242  -.1621106
+      42003.00    .087092   .303442  -.1657170
+      42004.00    .087500   .302650  -.1694219
+      42005.00    .087923   .301867  -.1731446
+      42006.00    .088360   .301092  -.1768022
+      42007.00    .088813   .300322  -.1803275
+      42008.00    .089282   .299559  -.1836772
+      42009.00    .089767   .298800  -.1868358
+      42010.00    .090270   .298044  -.1898150
+      42011.00    .090789   .297288  -.1926504
+      42012.00    .091322   .296531  -.1953941
+      42013.00    .091866   .295769  -.1981060
+      42014.00    .092419   .295002  -.2008443
+      42015.00    .092978   .294225  -.2036580
+      42016.00    .093541   .293436  -.2065818
+      42017.00    .094106   .292631  -.2096332
+      42018.00    .094671   .291809  -.2128122
+      42019.00    .095233   .290966  -.2161014
+      42020.00    .095789   .290100  -.2194657
+      42021.00    .096336   .289208  -.2228531
+      42022.00    .096871   .288288  -.2261984
+      42023.00    .097393   .287336  -.2294359
+      42024.00    .097902   .286351  -.2325201
+      42025.00    .098396   .285330  -.2354485
+      42026.00    .098876   .284272  -.2382734
+      42027.00    .099341   .283177  -.2410897
+      42028.00    .099789   .282043  -.2440007
+      42029.00    .100218   .280870  -.2470769
+      42030.00    .100626   .279656  -.2503280
+      42031.00    .101013   .278397  -.2537002
+      42032.00    .101377   .277095  -.2570999
+      42033.00    .101720   .275751  -.2604279
+      42034.00    .102043   .274366  -.2636073
+      42035.00    .102347   .272944  -.2665943
+      42036.00    .102630   .271487  -.2693777
+      42037.00    .102890   .270000  -.2719721
+      42038.00    .103124   .268487  -.2744117
+      42039.00    .103328   .266952  -.2767452
+      42040.00    .103502   .265400  -.2790302
+      42041.00    .103641   .263832  -.2813262
+      42042.00    .103746   .262251  -.2836854
+      42043.00    .103816   .260657  -.2861463
+      42044.00    .103849   .259051  -.2887288
+      42045.00    .103845   .257437  -.2914337
+      42046.00    .103805   .255813  -.2942442
+      42047.00    .103728   .254183  -.2971285
+      42048.00    .103613   .252548   .6999577
+      42049.00    .103459   .250912   .6970678
+      42050.00    .103264   .249280   .6942575
+      42051.00    .103028   .247655   .6915715
+      42052.00    .102751   .246038   .6890254
+      42053.00    .102434   .244432   .6865897
+      42054.00    .102077   .242835   .6841878
+      42055.00    .101678   .241249   .6817150
+      42056.00    .101236   .239674   .6790766
+      42057.00    .100750   .238110   .6762273
+      42058.00    .100222   .236557   .6731927
+      42059.00    .099653   .235016   .6700606
+      42060.00    .099045   .233489   .6669475
+      42061.00    .098399   .231975   .6639589
+      42062.00    .097719   .230476   .6611611
+      42063.00    .097006   .228990   .6585751
+      42064.00    .096261   .227517   .6561854
+      42065.00    .095487   .226057   .6539538
+      42066.00    .094684   .224609   .6518298
+      42067.00    .093852   .223173   .6497560
+      42068.00    .092995   .221752   .6476724
+      42069.00    .092117   .220345   .6455229
+      42070.00    .091222   .218956   .6432632
+      42071.00    .090317   .217587   .6408669
+      42072.00    .089404   .216242   .6383288
+      42073.00    .088485   .214922   .6356643
+      42074.00    .087567   .213632   .6329062
+      42075.00    .086653   .212376   .6301000
+      42076.00    .085750   .211155   .6272985
+      42077.00    .084863   .209973   .6245540
+      42078.00    .083998   .208833   .6219084
+      42079.00    .083160   .207738   .6193803
+      42080.00    .082351   .206691   .6169531
+      42081.00    .081573   .205695   .6145682
+      42082.00    .080822   .204752   .6121330
+      42083.00    .080096   .203862   .6095460
+      42084.00    .079390   .203027   .6067332
+      42085.00    .078702   .202247   .6036800
+      42086.00    .078027   .201524   .6004433
+      42087.00    .077360   .200856   .5971340
+      42088.00    .076698   .200241   .5938779
+      42089.00    .076036   .199679   .5907764
+      42090.00    .075371   .199166   .5878817
+      42091.00    .074696   .198701   .5851957
+      42092.00    .074011   .198281   .5826839
+      42093.00    .073312   .197903   .5802936
+      42094.00    .072601   .197565   .5779652
+      42095.00    .071874   .197261   .5756383
+      42096.00    .071131   .196990   .5732552
+      42097.00    .070373   .196746   .5707666
+      42098.00    .069596   .196527   .5681383
+      42099.00    .068798   .196328   .5653568
+      42100.00    .067976   .196145   .5624308
+      42101.00    .067127   .195974   .5593901
+      42102.00    .066248   .195811   .5562812
+      42103.00    .065336   .195653   .5531613
+      42104.00    .064391   .195500   .5500884
+      42105.00    .063408   .195349   .5471104
+      42106.00    .062390   .195202   .5442519
+      42107.00    .061338   .195056   .5415040
+      42108.00    .060251   .194913   .5388205
+      42109.00    .059132   .194771   .5361227
+      42110.00    .057982   .194630   .5333157
+      42111.00    .056803   .194488   .5303155
+      42112.00    .055601   .194343   .5270781
+      42113.00    .054379   .194194   .5236205
+      42114.00    .053147   .194042   .5200213
+      42115.00    .051913   .193888   .5163977
+      42116.00    .050682   .193733   .5128685
+      42117.00    .049458   .193578   .5095191
+      42118.00    .048242   .193426   .5063829
+      42119.00    .047038   .193276   .5034451
+      42120.00    .045847   .193131   .5006586
+      42121.00    .044672   .192991   .4979625
+      42122.00    .043517   .192859   .4952943
+      42123.00    .042385   .192733   .4925950
+      42124.00    .041274   .192617   .4898130
+      42125.00    .040185   .192508   .4869085
+      42126.00    .039119   .192409   .4838591
+      42127.00    .038076   .192317   .4806634
+      42128.00    .037057   .192231   .4773418
+      42129.00    .036067   .192146   .4739344
+      42130.00    .035104   .192061   .4704966
+      42131.00    .034171   .191977   .4670908
+      42132.00    .033267   .191893   .4637744
+      42133.00    .032395   .191811   .4605841
+      42134.00    .031552   .191732   .4575226
+      42135.00    .030738   .191656   .4545535
+      42136.00    .029953   .191584   .4516067
+      42137.00    .029197   .191517   .4485951
+      42138.00    .028470   .191456   .4454372
+      42139.00    .027772   .191399   .4420806
+      42140.00    .027104   .191349   .4385193
+      42141.00    .026463   .191303   .4347997
+      42142.00    .025851   .191261   .4310112
+      42143.00    .025266   .191223   .4272623
+      42144.00    .024707   .191187   .4236496
+      42145.00    .024174   .191153   .4202328
+      42146.00    .023660   .191121   .4170238
+      42147.00    .023163   .191091   .4139931
+      42148.00    .022678   .191064   .4110859
+      42149.00    .022199   .191040   .4082387
+      42150.00    .021724   .191017   .4053908
+      42151.00    .021250   .190994   .4024893
+      42152.00    .020770   .190971   .3994923
+      42153.00    .020280   .190949   .3963728
+      42154.00    .019776   .190925   .3931219
+      42155.00    .019254   .190901   .3897500
+      42156.00    .018715   .190875   .3862870
+      42157.00    .018156   .190850   .3827794
+      42158.00    .017577   .190827   .3792856
+      42159.00    .016976   .190808   .3758664
+      42160.00    .016356   .190795   .3725704
+      42161.00    .015719   .190790   .3694168
+      42162.00    .015068   .190796   .3663835
+      42163.00    .014407   .190812   .3634087
+      42164.00    .013735   .190839   .3604073
+      42165.00    .013053   .190877   .3572975
+      42166.00    .012362   .190927   .3540256
+      42167.00    .011662   .190986   .3505813
+      42168.00    .010954   .191053   .3470003
+      42169.00    .010240   .191129   .3433539
+      42170.00    .009519   .191213   .3397321
+      42171.00    .008791   .191305   .3362223
+      42172.00    .008058   .191406   .3328887
+      42173.00    .007323   .191517   .3297594
+      42174.00    .006592   .191636   .3268237
+      42175.00    .005869   .191765   .3240393
+      42176.00    .005159   .191901   .3213473
+      42177.00    .004465   .192046   .3186855
+      42178.00    .003788   .192197   .3159986
+      42179.00    .003132   .192354   .3132432
+      42180.00    .002499   .192516   .3103906
+      42181.00    .001889   .192683   .3074284
+      42182.00    .001303   .192856   .3043618
+      42183.00    .000740   .193037   .3012128
+      42184.00    .000202   .193225   .2980181
+      42185.00   -.000310   .193423   .2948268
+      42186.00   -.000794   .193631   .2916945
+      42187.00   -.001250   .193850   .2886731
+      42188.00   -.001679   .194079   .2857950
+      42189.00   -.002080   .194321   .2830565
+      42190.00   -.002456   .194577   .2804098
+      42191.00   -.002805   .194845   .2777733
+      42192.00   -.003130   .195128   .2750574
+      42193.00   -.003430   .195427   .2721975
+      42194.00   -.003708   .195744   .2691772
+      42195.00   -.003966   .196082   .2660328
+      42196.00   -.004202   .196445   .2628389
+      42197.00   -.004414   .196839   .2596849
+      42198.00   -.004600   .197266   .2566525
+      42199.00   -.004756   .197730   .2538000
+      42200.00   -.004877   .198235   .2511548
+      42201.00   -.004960   .198781   .2487125
+      42202.00   -.005000   .199370   .2464406
+      42203.00   -.004992   .200001   .2442871
+      42204.00   -.004932   .200676   .2421917
+      42205.00   -.004816   .201393   .2400963
+      42206.00   -.004643   .202153   .2379537
+      42207.00   -.004410   .202956   .2357321
+      42208.00   -.004117   .203801   .2334170
+      42209.00   -.003764   .204685   .2310113
+      42210.00   -.003348   .205605   .2285338
+      42211.00   -.002866   .206557   .2260158
+      42212.00   -.002321   .207536   .2234977
+      42213.00   -.001713   .208538   .2210256
+      42214.00   -.001045   .209555   .2186454
+      42215.00   -.000315   .210579   .2163925
+      42216.00    .000476   .211604   .2142759
+      42217.00    .001331   .212624   .2122651
+      42218.00    .002251   .213636   .2102885
+      42219.00    .003234   .214635   .2082511
+      42220.00    .004277   .215616   .2060678
+      42221.00    .005373   .216573   .2036984
+      42222.00    .006518   .217503   .2011655
+      42223.00    .007703   .218405   .1985464
+      42224.00    .008924   .219276   .1959452
+      42225.00    .010171   .220115   .1934584
+      42226.00    .011437   .220919   .1911510
+      42227.00    .012711   .221686   .1890489
+      42228.00    .013984   .222416   .1871428
+      42229.00    .015250   .223106   .1853992
+      42230.00    .016503   .223758   .1837679
+      42231.00    .017736   .224372   .1821913
+      42232.00    .018940   .224947   .1806110
+      42233.00    .020113   .225484   .1789761
+      42234.00    .021252   .225982   .1772496
+      42235.00    .022358   .226444   .1754130
+      42236.00    .023430   .226867   .1734666
+      42237.00    .024465   .227255   .1714277
+      42238.00    .025459   .227607   .1693264
+      42239.00    .026407   .227925   .1672016
+      42240.00    .027305   .228211   .1650959
+      42241.00    .028151   .228464   .1630508
+      42242.00    .028942   .228683   .1610997
+      42243.00    .029674   .228869   .1592580
+      42244.00    .030340   .229023   .1575102
+      42245.00    .030935   .229145   .1558022
+      42246.00    .031459   .229236   .1540466
+      42247.00    .031910   .229297   .1521472
+      42248.00    .032289   .229326   .1500348
+      42249.00    .032598   .229326   .1476996
+      42250.00    .032838   .229296   .1452006
+      42251.00    .033012   .229237   .1426478
+      42252.00    .033124   .229150   .1401629
+      42253.00    .033179   .229032   .1378411
+      42254.00    .033183   .228884   .1357282
+      42255.00    .033140   .228705   .1338212
+      42256.00    .033052   .228495   .1320826
+      42257.00    .032919   .228251   .1304569
+      42258.00    .032742   .227975   .1288833
+      42259.00    .032525   .227666   .1273020
+      42260.00    .032268   .227323   .1256589
+      42261.00    .031975   .226948   .1239113
+      42262.00    .031645   .226540   .1220332
+      42263.00    .031279   .226103   .1200186
+      42264.00    .030879   .225640   .1178811
+      42265.00    .030451   .225155   .1156503
+      42266.00    .029999   .224651   .1133655
+      42267.00    .029528   .224133   .1110705
+      42268.00    .029038   .223605   .1088073
+      42269.00    .028531   .223069   .1066102
+      42270.00    .028009   .222528   .1044981
+      42271.00    .027475   .221983   .1024651
+      42272.00    .026931   .221433   .1004733
+      42273.00    .026380   .220880   .0984520
+      42274.00    .025824   .220324   .0963103
+      42275.00    .025264   .219770   .0939641
+      42276.00    .024699   .219221   .0913700
+      42277.00    .024131   .218679   .0885501
+      42278.00    .023558   .218150   .0855929
+      42279.00    .022981   .217635   .0826272
+      42280.00    .022400   .217136   .0797792
+      42281.00    .021818   .216657   .0771343
+      42282.00    .021237   .216199   .0747195
+      42283.00    .020664   .215762   .0725103
+      42284.00    .020105   .215347   .0704511
+      42285.00    .019567   .214953   .0684765
+      42286.00    .019055   .214582   .0665239
+      42287.00    .018573   .214234   .0645387
+      42288.00    .018120   .213910   .0624767
+      42289.00    .017700   .213614   .0603081
+      42290.00    .017314   .213344   .0580213
+      42291.00    .016963   .213104   .0556227
+      42292.00    .016648   .212894   .0531363
+      42293.00    .016370   .212717   .0505988
+      42294.00    .016129   .212577   .0480536
+      42295.00    .015927   .212477   .0455436
+      42296.00    .015762   .212418   .0431045
+      42297.00    .015632   .212401   .0407563
+      42298.00    .015532   .212427   .0384965
+      42299.00    .015456   .212495   .0362936
+      42300.00    .015400   .212606   .0340879
+      42301.00    .015358   .212761   .0317988
+      42302.00    .015324   .212960   .0293420
+      42303.00    .015293   .213203   .0266552
+      42304.00    .015256   .213488   .0237243
+      42305.00    .015206   .213815   .0205976
+      42306.00    .015133   .214184   .0173782
+      42307.00    .015032   .214591   .0141941
+      42308.00    .014897   .215036   .0111579
+      42309.00    .014725   .215514   .0083342
+      42310.00    .014510   .216019   .0057286
+      42311.00    .014246   .216544   .0032992
+      42312.00    .013932   .217082   .0009794
+      42313.00    .013565   .217628  -.0013001
+      42314.00    .013142   .218176  -.0036001
+      42315.00    .012664   .218720  -.0059688
+      42316.00    .012129   .219255  -.0084405
+      42317.00    .011540   .219774  -.0110335
+      42318.00    .010901   .220274  -.0137479
+      42319.00    .010218   .220751  -.0165659
+      42320.00    .009497   .221202  -.0194541
+      42321.00    .008739   .221628  -.0223698
+      42322.00    .007946   .222027  -.0252664
+      42323.00    .007119   .222401  -.0281018
+      42324.00    .006262   .222753  -.0308468
+      42325.00    .005380   .223082  -.0334946
+      42326.00    .004477   .223392  -.0360675
+      42327.00    .003560   .223685  -.0386168
+      42328.00    .002633   .223963  -.0412151
+      42329.00    .001704   .224230  -.0439406
+      42330.00    .000778   .224491  -.0468567
+      42331.00   -.000138   .224747  -.0499919
+      42332.00   -.001038   .225001  -.0533268
+      42333.00   -.001917   .225253  -.0567922
+      42334.00   -.002775   .225504  -.0602843
+      42335.00   -.003611   .225755  -.0636919
+      42336.00   -.004427   .226006  -.0669295
+      42337.00   -.005222   .226259  -.0699599
+      42338.00   -.005998   .226515  -.0727978
+      42339.00   -.006755   .226777  -.0754965
+      42340.00   -.007498   .227044  -.0781253
+      42341.00   -.008231   .227318  -.0807508
+      42342.00   -.008959   .227600  -.0834263
+      42343.00   -.009685   .227891  -.0861902
+      42344.00   -.010412   .228192  -.0890648
+      42345.00   -.011141   .228506  -.0920563
+      42346.00   -.011873   .228834  -.0951537
+      42347.00   -.012609   .229178  -.0983305
+      42348.00   -.013350   .229538  -.1015481
+      42349.00   -.014093   .229916  -.1047621
+      42350.00   -.014838   .230312  -.1079286
+      42351.00   -.015582   .230727  -.1110115
+      42352.00   -.016326   .231161  -.1139930
+      42353.00   -.017073   .231616  -.1168828
+      42354.00   -.017822   .232090  -.1197222
+      42355.00   -.018574   .232584  -.1225786
+      42356.00   -.019330   .233097  -.1255277
+      42357.00   -.020086   .233628  -.1286323
+      42358.00   -.020843   .234176  -.1319226
+      42359.00   -.021598   .234741  -.1353865
+      42360.00   -.022348   .235320  -.1389706
+      42361.00   -.023091   .235914  -.1425916
+      42362.00   -.023823   .236519  -.1461556
+      42363.00   -.024543   .237136  -.1495809
+      42364.00   -.025251   .237761  -.1528176
+      42365.00   -.025948   .238390  -.1558584
+      42366.00   -.026638   .239023  -.1587363
+      42367.00   -.027322   .239655  -.1615100
+      42368.00   -.027999   .240288  -.1642452
+      42369.00   -.028670   .240920  -.1669996
+      42370.00   -.029332   .241553  -.1698154
+      42371.00   -.029984   .242187  -.1727172
+      42372.00   -.030624   .242822  -.1757133
+      42373.00   -.031252   .243455  -.1787966
+      42374.00   -.031866   .244087  -.1819454
+      42375.00   -.032463   .244716  -.1851271
+      42376.00   -.033043   .245339  -.1883019
+      42377.00   -.033605   .245957  -.1914286
+      42378.00   -.034149   .246568  -.1944705
+      42379.00   -.034674   .247172  -.1974034
+      42380.00   -.035178   .247771  -.2002257
+      42381.00   -.035660   .248366  -.2029672
+      42382.00   -.036119   .248959  -.2056880
+      42383.00   -.036555   .249549  -.2084660
+      42384.00   -.036969   .250136  -.2113722
+      42385.00   -.037360   .250720  -.2144449
+      42386.00   -.037727   .251301  -.2176753
+      42387.00   -.038067   .251878  -.2210090
+      42388.00   -.038382   .252448  -.2243632
+      42389.00   -.038673   .253012  -.2276498
+      42390.00   -.038940   .253568  -.2307956
+      42391.00   -.039184   .254115  -.2337566
+      42392.00   -.039408   .254656  -.2365234
+      42393.00   -.039614   .255193  -.2391202
+      42394.00   -.039809   .255726  -.2415963
+      42395.00   -.039996   .256257  -.2440136
+      42396.00   -.040178   .256789  -.2464328
+      42397.00   -.040360   .257323  -.2489018
+      42398.00   -.040542   .257858  -.2514511
+      42399.00   -.040724   .258394  -.2540928
+      42400.00   -.040910   .258930  -.2568225
+      42401.00   -.041101   .259466  -.2596221
+      42402.00   -.041297   .260000  -.2624630
+      42403.00   -.041498   .260534  -.2653103
+      42404.00   -.041705   .261069  -.2681275
+      42405.00   -.041917   .261606  -.2708818
+      42406.00   -.042136   .262144  -.2735492
+      42407.00   -.042362   .262684  -.2761222
+      42408.00   -.042596   .263227  -.2786190
+      42409.00   -.042837   .263773  -.2810892
+      42410.00   -.043081   .264322  -.2836080
+      42411.00   -.043325   .264876  -.2862566
+      42412.00   -.043569   .265436  -.2890927
+      42413.00   -.043813   .266001   .7078756
+      42414.00   -.044056   .266573   .7046980
+      42415.00   -.044299   .267153   .7014674
+      42416.00   -.044538   .267744   .6982891
+      42417.00   -.044768   .268350   .6952497
+      42418.00   -.044988   .268975   .6923984
+      42419.00   -.045193   .269624   .6897425
+      42420.00   -.045381   .270298   .6872556
+      42421.00   -.045545   .271002   .6848888
+      42422.00   -.045681   .271735   .6825825
+      42423.00   -.045780   .272497   .6802763
+      42424.00   -.045838   .273288   .6779183
+      42425.00   -.045849   .274108   .6754717
+      42426.00   -.045810   .274956   .6729187
+      42427.00   -.045718   .275833   .6702599
+      42428.00   -.045572   .276739   .6675120
+      42429.00   -.045372   .277675   .6647030
+      42430.00   -.045120   .278643   .6618672
+      42431.00   -.044818   .279643   .6590403
+      42432.00   -.044467   .280677   .6562544
+      42433.00   -.044070   .281746   .6535334
+      42434.00   -.043628   .282851   .6508876
+      42435.00   -.043138   .283988   .6483073
+      42436.00   -.042603   .285155   .6457559
+      42437.00   -.042021   .286350   .6431682
+      42438.00   -.041394   .287570   .6404612
+      42439.00   -.040726   .288813   .6375585
+      42440.00   -.040018   .290078   .6344222
+      42441.00   -.039271   .291366   .6310758
+      42442.00   -.038487   .292676   .6276040
+      42443.00   -.037672   .294007   .6241280
+      42444.00   -.036831   .295362   .6207651
+      42445.00   -.035972   .296738   .6175948
+      42446.00   -.035098   .298134   .6146428
+      42447.00   -.034215   .299551   .6118869
+      42448.00   -.033323   .300984   .6092753
+      42449.00   -.032428   .302432   .6067448
+      42450.00   -.031533   .303890   .6042334
+      42451.00   -.030641   .305355   .6016879
+      42452.00   -.029752   .306822   .5990674
+      42453.00   -.028867   .308289   .5963479
+      42454.00   -.027985   .309752   .5935241
+      42455.00   -.027107   .311208   .5906088
+      42456.00   -.026233   .312651   .5876293
+      42457.00   -.025359   .314078   .5846213
+      42458.00   -.024481   .315489   .5816232
+      42459.00   -.023595   .316880   .5786704
+      42460.00   -.022698   .318250   .5757901
+      42461.00   -.021785   .319596   .5729971
+      42462.00   -.020854   .320913   .5702878
+      42463.00   -.019901   .322199   .5676357
+      42464.00   -.018922   .323451   .5649878
+      42465.00   -.017916   .324668   .5622687
+      42466.00   -.016879   .325847   .5593957
+      42467.00   -.015812   .326987   .5563054
+      42468.00   -.014712   .328087   .5529823
+      42469.00   -.013581   .329149   .5494757
+      42470.00   -.012420   .330173   .5458914
+      42471.00   -.011231   .331158   .5423600
+      42472.00   -.010016   .332105   .5389947
+      42473.00   -.008773   .333012   .5358580
+      42474.00   -.007500   .333880   .5329514
+      42475.00   -.006197   .334705   .5302293
+      42476.00   -.004863   .335489   .5276233
+      42477.00   -.003500   .336232   .5250636
+      42478.00   -.002108   .336934   .5224911
+      42479.00   -.000692   .337597   .5198611
+      42480.00    .000744   .338223   .5171438
+      42481.00    .002194   .338812   .5143260
+      42482.00    .003653   .339365   .5114119
+      42483.00    .005126   .339885   .5084225
+      42484.00    .006613   .340372   .5053905
+      42485.00    .008116   .340829   .5023538
+      42486.00    .009635   .341255   .4993497
+      42487.00    .011171   .341651   .4964084
+      42488.00    .012726   .342017   .4935487
+      42489.00    .014304   .342352   .4907725
+      42490.00    .015905   .342660   .4880607
+      42491.00    .017531   .342942   .4853706
+      42492.00    .019180   .343198   .4826378
+      42493.00    .020849   .343430   .4797859
+      42494.00    .022537   .343638   .4767436
+      42495.00    .024242   .343820   .4734686
+      42496.00    .025962   .343976   .4699702
+      42497.00    .027694   .344104   .4663166
+      42498.00    .029437   .344201   .4626221
+      42499.00    .031187   .344266   .4590129
+      42500.00    .032941   .344294   .4555869
+      42501.00    .034696   .344283   .4523866
+      42502.00    .036448   .344232   .4493950
+      42503.00    .038197   .344141   .4465544
+      42504.00    .039936   .344009   .4437925
+      42505.00    .041661   .343836   .4410437
+      42506.00    .043367   .343622   .4382584
+      42507.00    .045053   .343367   .4354043
+      42508.00    .046719   .343070   .4324646
+      42509.00    .048364   .342730   .4294378
+      42510.00    .049985   .342348   .4263381
+      42511.00    .051578   .341921   .4231931
+      42512.00    .053137   .341449   .4200387
+      42513.00    .054661   .340931   .4169125
+      42514.00    .056146   .340369   .4138476
+      42515.00    .057593   .339764   .4108669
+      42516.00    .058999   .339119   .4079785
+      42517.00    .060367   .338435   .4051706
+      42518.00    .061701   .337716   .4024088
+      42519.00    .063009   .336966   .3996382
+      42520.00    .064296   .336186   .3967917
+      42521.00    .065567   .335382   .3938035
+      42522.00    .066826   .334554   .3906270
+      42523.00    .068077   .333704   .3872515
+      42524.00    .069321   .332833   .3837133
+      42525.00    .070557   .331940   .3800930
+      42526.00    .071788   .331024   .3764981
+      42527.00    .073014   .330086   .3730323
+      42528.00    .074238   .329124   .3697646
+      42529.00    .075463   .328141   .3667112
+      42530.00    .076690   .327137   .3638376
+      42531.00    .077921   .326113   .3610792
+      42532.00    .079157   .325068   .3583660
+      42533.00    .080398   .324001   .3556415
+      42534.00    .081641   .322911   .3528694
+      42535.00    .082882   .321798   .3500319
+      42536.00    .084121   .320663   .3471267
+      42537.00    .085356   .319504   .3441649
+      42538.00    .086586   .318325   .3411700
+      42539.00    .087811   .317127   .3381746
+      42540.00    .089031   .315913   .3352143
+      42541.00    .090241   .314689   .3323221
+      42542.00    .091439   .313459   .3295229
+      42543.00    .092621   .312226   .3268285
+      42544.00    .093786   .310993   .3242325
+      42545.00    .094932   .309761   .3217068
+      42546.00    .096058   .308531   .3192016
+      42547.00    .097163   .307303   .3166529
+      42548.00    .098247   .306076   .3139979
+      42549.00    .099311   .304848   .3111915
+      42550.00    .100359   .303619   .3082210
+      42551.00    .101397   .302388   .3051124
+      42552.00    .102426   .301158   .3019278
+      42553.00    .103450   .299929   .2987524
+      42554.00    .104473   .298699   .2956753
+      42555.00    .105500   .297467   .2927661
+      42556.00    .106539   .296233   .2900570
+      42557.00    .107595   .294997   .2875349
+      42558.00    .108671   .293758   .2851496
+      42559.00    .109773   .292518   .2828336
+      42560.00    .110906   .291275   .2805229
+      42561.00    .112075   .290031   .2781713
+      42562.00    .113283   .288785   .2757543
+      42563.00    .114533   .287537   .2732663
+      42564.00    .115825   .286288   .2707160
+      42565.00    .117160   .285035   .2681232
+      42566.00    .118536   .283780   .2655170
+      42567.00    .119950   .282521   .2629321
+      42568.00    .121398   .281258   .2604028
+      42569.00    .122879   .279990   .2579562
+      42570.00    .124388   .278717   .2556079
+      42571.00    .125921   .277438   .2533572
+      42572.00    .127474   .276154   .2511834
+      42573.00    .129037   .274864   .2490428
+      42574.00    .130603   .273567   .2468736
+      42575.00    .132165   .272260   .2446096
+      42576.00    .133713   .270945   .2422005
+      42577.00    .135237   .269625   .2396310
+      42578.00    .136725   .268302   .2369286
+      42579.00    .138167   .266980   .2341584
+      42580.00    .139554   .265660   .2314051
+      42581.00    .140882   .264345   .2287524
+      42582.00    .142146   .263038   .2262630
+      42583.00    .143336   .261738   .2239675
+      42584.00    .144446   .260444   .2218601
+      42585.00    .145469   .259152   .2199022
+      42586.00    .146405   .257856   .2180341
+      42587.00    .147255   .256553   .2161921
+      42588.00    .148021   .255237   .2143237
+      42589.00    .148702   .253903   .2123966
+      42590.00    .149300   .252549   .2104005
+      42591.00    .149817   .251173   .2083430
+      42592.00    .150256   .249773   .2062449
+      42593.00    .150620   .248350   .2041341
+      42594.00    .150907   .246906   .2020430
+      42595.00    .151121   .245438   .2000033
+      42596.00    .151264   .243945   .1980417
+      42597.00    .151341   .242428   .1961746
+      42598.00    .151357   .240886   .1944039
+      42599.00    .151316   .239321   .1927134
+      42600.00    .151218   .237734   .1910650
+      42601.00    .151067   .236130   .1893995
+      42602.00    .150864   .234510   .1876449
+      42603.00    .150608   .232880   .1857359
+      42604.00    .150303   .231240   .1836383
+      42605.00    .149951   .229592   .1813664
+      42606.00    .149556   .227935   .1789845
+      42607.00    .149123   .226270   .1765882
+      42608.00    .148659   .224596   .1742749
+      42609.00    .148167   .222915   .1721174
+      42610.00    .147651   .221225   .1701488
+      42611.00    .147119   .219529   .1683616
+      42612.00    .146579   .217826   .1667168
+      42613.00    .146036   .216118   .1651568
+      42614.00    .145495   .214404   .1636182
+      42615.00    .144958   .212684   .1620442
+      42616.00    .144430   .210958   .1603935
+      42617.00    .143917   .209226   .1586456
+      42618.00    .143422   .207487   .1568008
+      42619.00    .142948   .205744   .1548759
+      42620.00    .142495   .203995   .1528981
+      42621.00    .142061   .202241   .1508998
+      42622.00    .141647   .200481   .1489135
+      42623.00    .141250   .198715   .1469678
+      42624.00    .140866   .196941   .1450827
+      42625.00    .140495   .195159   .1432652
+      42626.00    .140131   .193370   .1415062
+      42627.00    .139771   .191574   .1397771
+      42628.00    .139409   .189773   .1380281
+      42629.00    .139043   .187967   .1361916
+      42630.00    .138669   .186160   .1341949
+      42631.00    .138283   .184355   .1319829
+      42632.00    .137886   .182552   .1295436
+      42633.00    .137474   .180753   .1269223
+      42634.00    .137044   .178960   .1242150
+      42635.00    .136594   .177173   .1215397
+      42636.00    .136127   .175389   .1189993
+      42637.00    .135643   .173609   .1166529
+      42638.00    .135138   .171833   .1145063
+      42639.00    .134611   .170059   .1125222
+      42640.00    .134057   .168287   .1106400
+      42641.00    .133477   .166517   .1087940
+      42642.00    .132872   .164748   .1069262
+      42643.00    .132241   .162980   .1049929
+      42644.00    .131582   .161210   .1029686
+      42645.00    .130895   .159439   .1008470
+      42646.00    .130180   .157663   .0986407
+      42647.00    .129438   .155884   .0963759
+      42648.00    .128669   .154099   .0940867
+      42649.00    .127872   .152307   .0918087
+      42650.00    .127042   .150509   .0895730
+      42651.00    .126175   .148704   .0874023
+      42652.00    .125270   .146895   .0853067
+      42653.00    .124326   .145082   .0832809
+      42654.00    .123343   .143270   .0813027
+      42655.00    .122316   .141461   .0793306
+      42656.00    .121242   .139659   .0773052
+      42657.00    .120119   .137868   .0751549
+      42658.00    .118946   .136090   .0728116
+      42659.00    .117724   .134331   .0702342
+      42660.00    .116450   .132594   .0674318
+      42661.00    .115122   .130881   .0644718
+      42662.00    .113735   .129198   .0614672
+      42663.00    .112285   .127549   .0585415
+      42664.00    .110770   .125938   .0557892
+      42665.00    .109188   .124368   .0532491
+      42666.00    .107540   .122843   .0509018
+      42667.00    .105831   .121362   .0486878
+      42668.00    .104064   .119928   .0465338
+      42669.00    .102244   .118541   .0443734
+      42670.00    .100377   .117203   .0421573
+      42671.00    .098468   .115914   .0398549
+      42672.00    .096524   .114671   .0374535
+      42673.00    .094556   .113472   .0349574
+      42674.00    .092568   .112315   .0323854
+      42675.00    .090562   .111197   .0297676
+      42676.00    .088541   .110116   .0271382
+      42677.00    .086507   .109068   .0245291
+      42678.00    .084463   .108051   .0219647
+      42679.00    .082411   .107063   .0194578
+      42680.00    .080351   .106103   .0170073
+      42681.00    .078281   .105169   .0145964
+      42682.00    .076200   .104262   .0121912
+      42683.00    .074109   .103379   .0097417
+      42684.00    .072008   .102523   .0071859
+      42685.00    .069891   .101693   .0044591
+      42686.00    .067753   .100891   .0015094
+      42687.00    .065591   .100115  -.0016819
+      42688.00    .063400   .099364  -.0050831
+      42689.00    .061177   .098637  -.0086107
+      42690.00    .058918   .097935  -.0121475
+      42691.00    .056619   .097260  -.0155777
+      42692.00    .054278   .096614  -.0188238
+      42693.00    .051893   .095998  -.0218672
+      42694.00    .049466   .095416  -.0247445
+      42695.00    .046997   .094868  -.0275243
+      42696.00    .044489   .094358  -.0302791
+      42697.00    .041945   .093886  -.0330653
+      42698.00    .039363   .093452  -.0359169
+      42699.00    .036746   .093054  -.0388482
+      42700.00    .034093   .092693  -.0418584
+      42701.00    .031402   .092367  -.0449336
+      42702.00    .028671   .092077  -.0480485
+      42703.00    .025899   .091825  -.0511704
+      42704.00    .023088   .091609  -.0542659
+      42705.00    .020236   .091433  -.0573070
+      42706.00    .017343   .091295  -.0602766
+      42707.00    .014408   .091196  -.0631707
+      42708.00    .011430   .091136  -.0660001
+      42709.00    .008415   .091113  -.0687916
+      42710.00    .005366   .091128  -.0715879
+      42711.00    .002284   .091180  -.0744434
+      42712.00   -.000828   .091271  -.0774171
+      42713.00   -.003970   .091400  -.0805602
+      42714.00   -.007140   .091566  -.0839023
+      42715.00   -.010330   .091769  -.0874367
+      42716.00   -.013536   .092013  -.0911128
+      42717.00   -.016752   .092297  -.0948426
+      42718.00   -.019973   .092625  -.0985208
+      42719.00   -.023191   .092996  -.1020561
+      42720.00   -.026399   .093412  -.1053988
+      42721.00   -.029590   .093876  -.1085538
+      42722.00   -.032760   .094391  -.1115712
+      42723.00   -.035902   .094961  -.1145216
+      42724.00   -.039010   .095587  -.1174698
+      42725.00   -.042077   .096271  -.1204590
+      42726.00   -.045090   .097017  -.1235075
+      42727.00   -.048044   .097829  -.1266150
+      42728.00   -.050932   .098710  -.1297683
+      42729.00   -.053751   .099660  -.1329450
+      42730.00   -.056499   .100680  -.1361156
+      42731.00   -.059173   .101771  -.1392475
+      42732.00   -.061773   .102933  -.1423112
+      42733.00   -.064300   .104164  -.1452861
+      42734.00   -.066758   .105465  -.1481645
+      42735.00   -.069154   .106830  -.1509530
+      42736.00   -.071496   .108256  -.1536738
+      42737.00   -.073792   .109737  -.1563645
+      42738.00   -.076051   .111268  -.1590747
+      42739.00   -.078276   .112848  -.1618592
+      42740.00   -.080474   .114472  -.1647655
+      42741.00   -.082652   .116140  -.1678220
+      42742.00   -.084820   .117848  -.1710272
+      42743.00   -.086983   .119596  -.1743461
+      42744.00   -.089145   .121384  -.1777136
+      42745.00   -.091308   .123210  -.1810477
+      42746.00   -.093472   .125073  -.1842687
+      42747.00   -.095638   .126970  -.1873216
+      42748.00   -.097804   .128899  -.1901925
+      42749.00   -.099969   .130854  -.1929110
+      42750.00   -.102128   .132833  -.1955375
+      42751.00   -.104281   .134833  -.1981401
+      42752.00   -.106423   .136852  -.2007731
+      42753.00   -.108550   .138887  -.2034657
+      42754.00   -.110656   .140936  -.2062227
+      42755.00   -.112735   .142996  -.2090323
+      42756.00   -.114783   .145066  -.2118730
+      42757.00   -.116794   .147142  -.2147182
+      42758.00   -.118762   .149221  -.2175390
+      42759.00   -.120682   .151303  -.2203080
+      42760.00   -.122549   .153388  -.2230042
+      42761.00   -.124360   .155474  -.2256178
+      42762.00   -.126111   .157562  -.2281532
+      42763.00   -.127800   .159653  -.2306297
+      42764.00   -.129423   .161749  -.2330821
+      42765.00   -.130977   .163852  -.2355587
+      42766.00   -.132461   .165965  -.2381153
+      42767.00   -.133879   .168089  -.2408033
+      42768.00   -.135231   .170225  -.2436542
+      42769.00   -.136520   .172373  -.2466668
+      42770.00   -.137749   .174535  -.2498037
+      42771.00   -.138922   .176708  -.2529990
+      42772.00   -.140046   .178891  -.2561747
+      42773.00   -.141125   .181081  -.2592587
+      42774.00   -.142162   .183277  -.2622010
+      42775.00   -.143157   .185479  -.2649847
+      42776.00   -.144114   .187689  -.2676290
+      42777.00   -.145035   .189909  -.2701822
+      42778.00   -.145922   .192143   .7272928
+      42779.00   -.146779   .194393   .7247370
+      42780.00   -.147599   .196662   .7221112
+      42781.00   -.148380   .198951   .7194019
+      42782.00   -.149117   .201257   .7166183
+      42783.00   -.149810   .203580   .7137839
+      42784.00   -.150451   .205917   .7109287
+      42785.00   -.151041   .208267   .7080839
+      42786.00   -.151577   .210631   .7052786
+      42787.00   -.152057   .213008   .7025362
+      42788.00   -.152481   .215400   .6998696
+      42789.00   -.152852   .217808   .6972785
+      42790.00   -.153173   .220234   .6947468
+      42791.00   -.153446   .222679   .6922431
+      42792.00   -.153675   .225144   .6897202
+      42793.00   -.153862   .227632   .6871198
+      42794.00   -.154011   .230140   .6843817
+      42795.00   -.154124   .232668   .6814605
+      42796.00   -.154204   .235217   .6783439
+      42797.00   -.154253   .237786   .6750641
+      42798.00   -.154273   .240376   .6716935
+      42799.00   -.154264   .242988   .6683242
+      42800.00   -.154226   .245617   .6650428
+      42801.00   -.154162   .248261   .6619076
+      42802.00   -.154076   .250916   .6589383
+      42803.00   -.153970   .253580   .6561175
+      42804.00   -.153848   .256250   .6533998
+      42805.00   -.153715   .258922   .6507259
+      42806.00   -.153574   .261594   .6480368
+      42807.00   -.153428   .264265   .6452861
+      42808.00   -.153279   .266934   .6424496
+      42809.00   -.153131   .269604   .6395274
+      42810.00   -.152986   .272274   .6365390
+      42811.00   -.152842   .274945   .6335159
+      42812.00   -.152695   .277617   .6304930
+      42813.00   -.152540   .280290   .6275034
+      42814.00   -.152375   .282961   .6245740
+      42815.00   -.152197   .285628   .6217225
+      42816.00   -.152000   .288288   .6189541
+      42817.00   -.151781   .290936   .6162592
+      42818.00   -.151533   .293573   .6136127
+      42819.00   -.151251   .296199   .6109741
+      42820.00   -.150933   .298814   .6082897
+      42821.00   -.150575   .301418   .6054976
+      42822.00   -.150174   .304014   .6025395
+      42823.00   -.149726   .306599   .5993805
+      42824.00   -.149229   .309176   .5960279
+      42825.00   -.148684   .311742   .5925383
+      42826.00   -.148094   .314296   .5890064
+      42827.00   -.147460   .316836   .5855373
+      42828.00   -.146784   .319360   .5822144
+      42829.00   -.146073   .321867   .5790765
+      42830.00   -.145331   .324357   .5761146
+      42831.00   -.144566   .326827   .5732827
+      42832.00   -.143778   .329279   .5705177
+      42833.00   -.142971   .331710   .5677568
+      42834.00   -.142145   .334119   .5649494
+      42835.00   -.141302   .336505   .5620635
+      42836.00   -.140442   .338863   .5590883
+      42837.00   -.139563   .341194   .5560332
+      42838.00   -.138660   .343496   .5529235
+      42839.00   -.137733   .345769   .5497932
+      42840.00   -.136781   .348013   .5466772
+      42841.00   -.135807   .350227   .5436056
+      42842.00   -.134811   .352411   .5405995
+      42843.00   -.133796   .354565   .5376686
+      42844.00   -.132760   .356692   .5348089
+      42845.00   -.131707   .358793   .5320016
+      42846.00   -.130636   .360869   .5292134
+      42847.00   -.129551   .362923   .5263966
+      42848.00   -.128452   .364956   .5234931
+      42849.00   -.127341   .366971   .5204408
+      42850.00   -.126221   .368970   .5171889
+      42851.00   -.125094   .370954   .5137165
+      42852.00   -.123959   .372922   .5100498
+      42853.00   -.122815   .374874   .5062651
+      42854.00   -.121658   .376808   .5024721
+      42855.00   -.120484   .378726   .4987803
+      42856.00   -.119284   .380628   .4952644
+      42857.00   -.118052   .382514   .4919446
+      42858.00   -.116778   .384388   .4887897
+      42859.00   -.115450   .386253   .4857373
+      42860.00   -.114059   .388112   .4827192
+      42861.00   -.112595   .389968   .4796800
+      42862.00   -.111052   .391823   .4765838
+      42863.00   -.109424   .393681   .4734152
+      42864.00   -.107709   .395542   .4701765
+      42865.00   -.105906   .397406   .4668847
+      42866.00   -.104018   .399271   .4635681
+      42867.00   -.102047   .401134   .4602603
+      42868.00   -.099995   .402994   .4569929
+      42869.00   -.097866   .404852   .4537904
+      42870.00   -.095669   .406706   .4506658
+      42871.00   -.093413   .408553   .4476198
+      42872.00   -.091109   .410392   .4446395
+      42873.00   -.088767   .412218   .4416984
+      42874.00   -.086392   .414029   .4387576
+      42875.00   -.083990   .415821   .4357669
+      42876.00   -.081562   .417591   .4326701
+      42877.00   -.079110   .419335   .4294138
+      42878.00   -.076635   .421048   .4259609
+      42879.00   -.074138   .422728   .4223079
+      42880.00   -.071621   .424368   .4184967
+      42881.00   -.069088   .425965   .4146124
+      42882.00   -.066544   .427516   .4107633
+      42883.00   -.063992   .429019   .4070470
+      42884.00   -.061439   .430471   .4035190
+      42885.00   -.058886   .431870   .4001787
+      42886.00   -.056337   .433213   .3969785
+      42887.00   -.053792   .434496   .3938495
+      42888.00   -.051253   .435720   .3907280
+      42889.00   -.048720   .436883   .3875718
+      42890.00   -.046197   .437983   .3843629
+      42891.00   -.043688   .439018   .3811017
+      42892.00   -.041199   .439986   .3778019
+      42893.00   -.038736   .440883   .3744861
+      42894.00   -.036303   .441706   .3711830
+      42895.00   -.033903   .442451   .3679226
+      42896.00   -.031534   .443115   .3647305
+      42897.00   -.029191   .443696   .3616222
+      42898.00   -.026867   .444191   .3586003
+      42899.00   -.024555   .444600   .3556546
+      42900.00   -.022248   .444920   .3527621
+      42901.00   -.019943   .445150   .3498887
+      42902.00   -.017638   .445288   .3469905
+      42903.00   -.015335   .445331   .3440182
+      42904.00   -.013036   .445276   .3409233
+      42905.00   -.010745   .445122   .3376682
+      42906.00   -.008465   .444867   .3342371
+      42907.00   -.006202   .444511   .3306472
+      42908.00   -.003954   .444053   .3269529
+      42909.00   -.001718   .443494   .3232386
+      42910.00    .000512   .442837   .3195973
+      42911.00    .002734   .442084   .3161017
+      42912.00    .004949   .441237   .3127807
+      42913.00    .007154   .440300   .3096121
+      42914.00    .009354   .439276   .3065373
+      42915.00    .011554   .438172   .3034880
+      42916.00    .013761   .436993   .3004110
+      42917.00    .015983   .435748   .2972803
+      42918.00    .018227   .434445   .2940956
+      42919.00    .020497   .433093   .2908756
+      42920.00    .022791   .431707   .2876480
+      42921.00    .025112   .430297   .2844442
+      42922.00    .027462   .428878   .2812960
+      42923.00    .029845   .427465   .2782318
+      42924.00    .032266   .426071   .2752722
+      42925.00    .034735   .424714   .2724254
+      42926.00    .037259   .423411   .2696860
+      42927.00    .039850   .422181   .2670353
+      42928.00    .042519   .421041   .2644432
+      42929.00    .045268   .419990   .2618698
+      42930.00    .048095   .419011   .2592691
+      42931.00    .050998   .418092   .2565967
+      42932.00    .053973   .417222   .2538185
+      42933.00    .057023   .416390   .2509208
+      42934.00    .060145   .415586   .2479160
+      42935.00    .063339   .414802   .2448453
+      42936.00    .066601   .414032   .2417737
+      42937.00    .069929   .413270   .2387777
+      42938.00    .073319   .412510   .2359248
+      42939.00    .076764   .411747   .2332542
+      42940.00    .080261   .410977   .2307632
+      42941.00    .083804   .410197   .2284091
+      42942.00    .087388   .409404   .2261262
+      42943.00    .091007   .408596   .2238509
+      42944.00    .094657   .407772   .2215422
+      42945.00    .098336   .406929   .2191885
+      42946.00    .102046   .406065   .2168023
+      42947.00    .105785   .405180   .2144087
+      42948.00    .109553   .404273   .2120361
+      42949.00    .113344   .403338   .2097117
+      42950.00    .117150   .402367   .2074596
+      42951.00    .120965   .401350   .2052974
+      42952.00    .124783   .400278   .2032318
+      42953.00    .128599   .399142   .2012559
+      42954.00    .132409   .397934   .1993482
+      42955.00    .136210   .396646   .1974747
+      42956.00    .139998   .395270   .1955915
+      42957.00    .143772   .393797   .1936489
+      42958.00    .147529   .392219   .1915975
+      42959.00    .151267   .390543   .1893993
+      42960.00    .154984   .388776   .1870376
+      42961.00    .158679   .386923   .1845248
+      42962.00    .162352   .384992   .1819028
+      42963.00    .166004   .382986   .1792345
+      42964.00    .169636   .380910   .1765898
+      42965.00    .173247   .378770   .1740294
+      42966.00    .176837   .376569   .1715909
+      42967.00    .180401   .374315   .1692790
+      42968.00    .183934   .372014   .1670645
+      42969.00    .187428   .369671   .1648930
+      42970.00    .190877   .367294   .1627037
+      42971.00    .194274   .364887   .1604486
+      42972.00    .197611   .362456   .1581059
+      42973.00    .200882   .360005   .1556828
+      42974.00    .204078   .357538   .1532076
+      42975.00    .207189   .355057   .1507172
+      42976.00    .210205   .352562   .1482482
+      42977.00    .213113   .350055   .1458315
+      42978.00    .215903   .347537   .1434907
+      42979.00    .218565   .345008   .1412396
+      42980.00    .221086   .342468   .1390792
+      42981.00    .223456   .339916   .1369961
+      42982.00    .225666   .337350   .1349622
+      42983.00    .227725   .334770   .1329375
+      42984.00    .229645   .332174   .1308736
+      42985.00    .231435   .329559   .1287194
+      42986.00    .233101   .326925   .1264293
+      42987.00    .234651   .324267   .1239761
+      42988.00    .236088   .321585   .1213634
+      42989.00    .237420   .318877   .1186313
+      42990.00    .238655   .316140   .1158493
+      42991.00    .239798   .313373   .1130985
+      42992.00    .240858   .310575   .1104494
+      42993.00    .241840   .307745   .1079439
+      42994.00    .242751   .304881   .1055884
+      42995.00    .243595   .301983   .1033558
+      42996.00    .244380   .299052   .1011959
+      42997.00    .245108   .296091   .0990505
+      42998.00    .245781   .293101   .0968681
+      42999.00    .246402   .290085   .0946168
+      43000.00    .246970   .287047   .0922901
+      43001.00    .247487   .283988   .0899044
+      43002.00    .247953   .280913   .0874919
+      43003.00    .248371   .277825   .0850903
+      43004.00    .248745   .274725   .0827333
+      43005.00    .249075   .271617   .0804458
+      43006.00    .249363   .268503   .0782417
+      43007.00    .249611   .265386   .0761236
+      43008.00    .249819   .262269   .0740805
+      43009.00    .249988   .259157   .0720864
+      43010.00    .250115   .256052   .0701021
+      43011.00    .250199   .252957   .0680790
+      43012.00    .250237   .249874   .0659637
+      43013.00    .250226   .246806   .0637037
+      43014.00    .250164   .243753   .0612575
+      43015.00    .250047   .240718   .0586089
+      43016.00    .249873   .237703   .0557798
+      43017.00    .249635   .234708   .0528321
+      43018.00    .249330   .231736   .0498545
+      43019.00    .248952   .228790   .0469369
+      43020.00    .248499   .225872   .0441424
+      43021.00    .247962   .222984   .0414915
+      43022.00    .247335   .220128   .0389619
+      43023.00    .246611   .217308   .0365018
+      43024.00    .245781   .214527   .0340482
+      43025.00    .244837   .211786   .0315440
+      43026.00    .243773   .209088   .0289484
+      43027.00    .242580   .206434   .0262430
+      43028.00    .241249   .203825   .0234329
+      43029.00    .239773   .201263   .0205429
+      43030.00    .238153   .198749   .0176095
+      43031.00    .236405   .196285   .0146718
+      43032.00    .234546   .193873   .0117630
+      43033.00    .232589   .191512   .0089050
+      43034.00    .230549   .189206   .0061070
+      43035.00    .228436   .186953   .0033653
+      43036.00    .226262   .184756   .0006625
+      43037.00    .224040   .182613  -.0020313
+      43038.00    .221780   .180523  -.0047568
+      43039.00    .219493   .178483  -.0075618
+      43040.00    .217189   .176491  -.0104971
+      43041.00    .214879   .174542  -.0136096
+      43042.00    .212572   .172634  -.0169307
+      43043.00    .210280   .170763  -.0204622
+      43044.00    .208015   .168926  -.0241649
+      43045.00    .205788   .167116  -.0279605
+      43046.00    .203607   .165330  -.0317496
+      43047.00    .201482   .163560  -.0354420
+      43048.00    .199423   .161799  -.0389851
+      43049.00    .197443   .160038  -.0423772
+      43050.00    .195556   .158267  -.0456595
+      43051.00    .193761   .156476  -.0488942
+      43052.00    .192049   .154657  -.0521409
+      43053.00    .190412   .152802  -.0554420
+      43054.00    .188844   .150901  -.0588172
+      43055.00    .187338   .148947  -.0622645
+      43056.00    .185878   .146941  -.0657649
+      43057.00    .184444   .144886  -.0692867
+      43058.00    .183018   .142781  -.0727925
+      43059.00    .181581   .140626  -.0762483
+      43060.00    .180116   .138420  -.0796288
+      43061.00    .178626   .136163  -.0829199
+      43062.00    .177119   .133857  -.0861213
+      43063.00    .175602   .131502  -.0892462
+      43064.00    .174075   .129107  -.0923197
+      43065.00    .172531   .126686  -.0953760
+      43066.00    .170964   .124257  -.0984571
+      43067.00    .169366   .121837  -.1016087
+      43068.00    .167730   .119440  -.1048764
+      43069.00    .166052   .117081  -.1082973
+      43070.00    .164323   .114771  -.1118907
+      43071.00    .162540   .112517  -.1156453
+      43072.00    .160699   .110324  -.1195118
+      43073.00    .158798   .108199  -.1234077
+      43074.00    .156836   .106147  -.1272383
+      43075.00    .154807   .104176  -.1309265
+      43076.00    .152708   .102291  -.1344389
+      43077.00    .150532   .100493  -.1377922
+      43078.00    .148275   .098774  -.1410399
+      43079.00    .145933   .097124  -.1442462
+      43080.00    .143504   .095532  -.1474621
+      43081.00    .140986   .093990  -.1507129
+      43082.00    .138378   .092491  -.1540004
+      43083.00    .135685   .091033  -.1573108
+      43084.00    .132909   .089609  -.1606205
+      43085.00    .130046   .088210  -.1638992
+      43086.00    .127091   .086820  -.1671159
+      43087.00    .124040   .085427  -.1702435
+      43088.00    .120887   .084023  -.1732639
+      43089.00    .117629   .082602  -.1761719
+      43090.00    .114259   .081160  -.1789766
+      43091.00    .110789   .079701  -.1817006
+      43092.00    .107237   .078236  -.1843763
+      43093.00    .103622   .076775  -.1870431
+      43094.00    .099976   .075327  -.1897447
+      43095.00    .096332   .073900  -.1925243
+      43096.00    .092723   .072502  -.1954200
+      43097.00    .089176   .071137  -.1984565
+      43098.00    .085713   .069805  -.2016370
+      43099.00    .082352   .068506  -.2049362
+      43100.00    .079093   .067245  -.2083012
+      43101.00    .075922   .066036  -.2116598
+      43102.00    .072820   .064892  -.2149386
+      43103.00    .069783   .063821  -.2180867
+      43104.00    .066805   .062834  -.2210963
+      43105.00    .063885   .061943  -.2240040
+      43106.00    .061019   .061152  -.2268716
+      43107.00    .058197   .060458  -.2297588
+      43108.00    .055414   .059859  -.2327027
+      43109.00    .052661   .059348  -.2357106
+      43110.00    .049933   .058916  -.2387657
+      43111.00    .047221   .058557  -.2418399
+      43112.00    .044512   .058263  -.2449021
+      43113.00    .041779   .058026  -.2479232
+      43114.00    .038999   .057837  -.2508785
+      43115.00    .036147   .057695  -.2537501
+      43116.00    .033197   .057603  -.2565310
+      43117.00    .030129   .057561  -.2592275
+      43118.00    .026940   .057570  -.2618595
+      43119.00    .023629   .057629  -.2644568
+      43120.00    .020197   .057738  -.2670559
+      43121.00    .016660   .057894  -.2696957
+      43122.00    .013042   .058091  -.2724142
+      43123.00    .009367   .058325  -.2752438
+      43124.00    .005650   .058591  -.2782053
+      43125.00    .001900   .058889  -.2813018
+      43126.00   -.001873   .059217  -.2845144
+      43127.00   -.005671   .059580  -.2878015
+      43128.00   -.009501   .059986  -.2911032
+      43129.00   -.013371   .060446  -.2943538
+      43130.00   -.017289   .060970  -.2974989
+      43131.00   -.021259   .061568  -.3005132
+      43132.00   -.025285   .062241  -.3034101
+      43133.00   -.029368   .062994  -.3062365
+      43134.00   -.033512   .063830  -.3090520
+      43135.00   -.037719   .064751  -.3119048
+      43136.00   -.041989   .065763  -.3148158
+      43137.00   -.046322   .066870  -.3177753
+      43138.00   -.050717   .068076  -.3207530
+      43139.00   -.055176   .069388  -.3237125
+      43140.00   -.059698   .070808  -.3266212
+      43141.00   -.064273   .072331  -.3294534
+      43142.00   -.068888   .073951  -.3321916
+      43143.00   -.073529   .075660  -.3348284
+      43144.00   -.078182   .077451   .6626318
+      43145.00   -.082831   .079316   .6601714
+      43146.00   -.087456   .081248   .6577609
+      43147.00   -.092040   .083241   .6553626
+      43148.00   -.096564   .085288   .6529353
+      43149.00   -.101010   .087382   .6504376
+      43150.00   -.105357   .089515   .6478336
+      43151.00   -.109588   .091680   .6450997
+      43152.00   -.113685   .093870   .6422322
+      43153.00   -.117633   .096076   .6392508
+      43154.00   -.121416   .098289   .6361975
+      43155.00   -.125019   .100498   .6331285
+      43156.00   -.128428   .102693   .6301016
+      43157.00   -.131651   .104872   .6271638
+      43158.00   -.134713   .107036   .6243384
+      43159.00   -.137636   .109191   .6216184
+      43160.00   -.140438   .111338   .6189663
+      43161.00   -.143137   .113481   .6163259
+      43162.00   -.145749   .115623   .6136413
+      43163.00   -.148288   .117769   .6108770
+      43164.00   -.150769   .119923   .6080291
+      43165.00   -.153209   .122089   .6051233
+      43166.00   -.155619   .124269   .6022025
+      43167.00   -.158001   .126466   .5993115
+      43168.00   -.160358   .128681   .5964868
+      43169.00   -.162693   .130919   .5937527
+      43170.00   -.165008   .133184   .5911218
+      43171.00   -.167302   .135480   .5885942
+      43172.00   -.169575   .137814   .5861572
+      43173.00   -.171822   .140189   .5837852
+      43174.00   -.174043   .142610   .5814415
+      43175.00   -.176244   .145082   .5790819
+      43176.00   -.178434   .147612   .5766600
+      43177.00   -.180620   .150203   .5741326
+      43178.00   -.182809   .152861   .5714666
+      43179.00   -.185006   .155592   .5686478
+      43180.00   -.187216   .158401   .5656889
+      43181.00   -.189444   .161298   .5626312
+      43182.00   -.191697   .164290   .5595370
+      43183.00   -.193973   .167373   .5564734
+      43184.00   -.196266   .170544   .5534939
+      43185.00   -.198571   .173796   .5506249
+      43186.00   -.200881   .177122   .5478609
+      43187.00   -.203191   .180515   .5451674
+      43188.00   -.205494   .183966   .5424907
+      43189.00   -.207785   .187470   .5397734
+      43190.00   -.210053   .191017   .5369705
+      43191.00   -.212281   .194602   .5340632
+      43192.00   -.214452   .198216   .5310624
+      43193.00   -.216553   .201853   .5280040
+      43194.00   -.218572   .205506   .5249359
+      43195.00   -.220498   .209170   .5219041
+      43196.00   -.222323   .212838   .5189433
+      43197.00   -.224035   .216503   .5160743
+      43198.00   -.225626   .220158   .5133038
+      43199.00   -.227088   .223796   .5106251
+      43200.00   -.228413   .227410   .5080187
+      43201.00   -.229592   .230994   .5054527
+      43202.00   -.230618   .234542   .5028868
+      43203.00   -.231493   .238056   .5002744
+      43204.00   -.232225   .241545   .4975693
+      43205.00   -.232824   .245014   .4947312
+      43206.00   -.233299   .248473   .4917340
+      43207.00   -.233660   .251931   .4885759
+      43208.00   -.233915   .255398   .4852872
+      43209.00   -.234077   .258884   .4819292
+      43210.00   -.234156   .262400   .4785808
+      43211.00   -.234164   .265954   .4753155
+      43212.00   -.234116   .269558   .4721797
+      43213.00   -.234025   .273222   .4691810
+      43214.00   -.233903   .276956   .4662904
+      43215.00   -.233757   .280757   .4634546
+      43216.00   -.233593   .284619   .4606137
+      43217.00   -.233417   .288535   .4577165
+      43218.00   -.233234   .292501   .4547318
+      43219.00   -.233050   .296512   .4516527
+      43220.00   -.232852   .300562   .4484970
+      43221.00   -.232628   .304642   .4453000
+      43222.00   -.232363   .308747   .4421034
+      43223.00   -.232043   .312871   .4389447
+      43224.00   -.231654   .317004   .4358503
+      43225.00   -.231184   .321135   .4328343
+      43226.00   -.230620   .325247   .4298967
+      43227.00   -.229953   .329327   .4270241
+      43228.00   -.229171   .333361   .4241914
+      43229.00   -.228262   .337335   .4213638
+      43230.00   -.227216   .341235   .4184999
+      43231.00   -.226025   .345047   .4155560
+      43232.00   -.224684   .348760   .4124907
+      43233.00   -.223197   .352373   .4092696
+      43234.00   -.221567   .355890   .4058751
+      43235.00   -.219801   .359314   .4023164
+      43236.00   -.217905   .362650   .3986364
+      43237.00   -.215888   .365903   .3949074
+      43238.00   -.213757   .369077   .3912141
+      43239.00   -.211521   .372177   .3876271
+      43240.00   -.209204   .375211   .3841797
+      43241.00   -.206833   .378192   .3808609
+      43242.00   -.204436   .381129   .3776260
+      43243.00   -.202037   .384034   .3744170
+      43244.00   -.199634   .386910   .3711831
+      43245.00   -.197223   .389761   .3678933
+      43246.00   -.194800   .392590   .3645398
+      43247.00   -.192364   .395402   .3611356
+      43248.00   -.189909   .398198   .3577092
+      43249.00   -.187432   .400979   .3542975
+      43250.00   -.184928   .403743   .3509383
+      43251.00   -.182393   .406489   .3476626
+      43252.00   -.179824   .409217   .3444889
+      43253.00   -.177220   .411927   .3414210
+      43254.00   -.174581   .414621   .3384487
+      43255.00   -.171908   .417300   .3355486
+      43256.00   -.169202   .419965   .3326873
+      43257.00   -.166465   .422621   .3298248
+      43258.00   -.163700   .425272   .3269178
+      43259.00   -.160921   .427918   .3239247
+      43260.00   -.158151   .430559   .3208092
+      43261.00   -.155409   .433193   .3175457
+      43262.00   -.152699   .435805   .3141276
+      43263.00   -.150019   .438383   .3105747
+      43264.00   -.147367   .440911   .3069376
+      43265.00   -.144737   .443377   .3032920
+      43266.00   -.142125   .445774   .2997180
+      43267.00   -.139531   .448096   .2962739
+      43268.00   -.136957   .450348   .2929751
+      43269.00   -.134402   .452536   .2897933
+      43270.00   -.131868   .454667   .2866728
+      43271.00   -.129341   .456743   .2835566
+      43272.00   -.126805   .458766   .2804070
+      43273.00   -.124248   .460739   .2772138
+      43274.00   -.121648   .462667   .2739915
+      43275.00   -.118986   .464559   .2707687
+      43276.00   -.116243   .466423   .2675802
+      43277.00   -.113404   .468267   .2644600
+      43278.00   -.110466   .470091   .2614370
+      43279.00   -.107435   .471893   .2585308
+      43280.00   -.104316   .473673   .2557486
+      43281.00   -.101114   .475428   .2530837
+      43282.00   -.097835   .477158   .2505171
+      43283.00   -.094479   .478858   .2480201
+      43284.00   -.091047   .480525   .2455580
+      43285.00   -.087541   .482158   .2430929
+      43286.00   -.083960   .483754   .2405877
+      43287.00   -.080306   .485308   .2380093
+      43288.00   -.076579   .486820   .2353333
+      43289.00   -.072781   .488284   .2325485
+      43290.00   -.068911   .489700   .2296621
+      43291.00   -.064971   .491064   .2267043
+      43292.00   -.060961   .492372   .2237282
+      43293.00   -.056883   .493623   .2208005
+      43294.00   -.052743   .494815   .2179811
+      43295.00   -.048549   .495946   .2153028
+      43296.00   -.044308   .497014   .2127578
+      43297.00   -.040027   .498019   .2103014
+      43298.00   -.035714   .498957   .2078726
+      43299.00   -.031377   .499829   .2054199
+      43300.00   -.027023   .500632   .2029206
+      43301.00   -.022658   .501365   .2003829
+      43302.00   -.018292   .502026   .1978364
+      43303.00   -.013929   .502613   .1953189
+      43304.00   -.009571   .503126   .1928660
+      43305.00   -.005223   .503562   .1905050
+      43306.00   -.000887   .503920   .1882536
+      43307.00    .003430   .504204   .1861192
+      43308.00    .007721   .504419   .1840966
+      43309.00    .011979   .504571   .1821681
+      43310.00    .016202   .504661   .1803069
+      43311.00    .020388   .504691   .1784795
+      43312.00    .024538   .504661   .1766499
+      43313.00    .028650   .504573   .1747829
+      43314.00    .032724   .504425   .1728472
+      43315.00    .036766   .504209   .1708190
+      43316.00    .040780   .503916   .1686870
+      43317.00    .044771   .503537   .1664562
+      43318.00    .048745   .503064   .1641497
+      43319.00    .052704   .502488   .1618082
+      43320.00    .056653   .501798   .1594844
+      43321.00    .060594   .500987   .1572312
+      43322.00    .064541   .500045   .1550854
+      43323.00    .068508   .498965   .1530532
+      43324.00    .072512   .497736   .1511055
+      43325.00    .076569   .496352   .1491874
+      43326.00    .080691   .494806   .1472403
+      43327.00    .084878   .493103   .1452269
+      43328.00    .089128   .491249   .1431446
+      43329.00    .093441   .489249   .1410233
+      43330.00    .097811   .487111   .1389103
+      43331.00    .102226   .484849   .1368509
+      43332.00    .106665   .482482   .1348787
+      43333.00    .111111   .480027   .1330132
+      43334.00    .115549   .477496   .1312618
+      43335.00    .119963   .474902   .1296198
+      43336.00    .124338   .472259   .1280705
+      43337.00    .128654   .469581   .1265848
+      43338.00    .132889   .466887   .1251247
+      43339.00    .137022   .464193   .1236482
+      43340.00    .141046   .461511   .1221143
+      43341.00    .144961   .458851   .1204865
+      43342.00    .148769   .456223   .1187374
+      43343.00    .152475   .453630   .1168530
+      43344.00    .156086   .451069   .1148374
+      43345.00    .159611   .448538   .1127143
+      43346.00    .163059   .446031   .1105254
+      43347.00    .166440   .443541   .1083208
+      43348.00    .169759   .441062   .1061490
+      43349.00    .173020   .438590   .1040455
+      43350.00    .176223   .436122   .1020235
+      43351.00    .179368   .433652   .1000677
+      43352.00    .182457   .431178   .0981372
+      43353.00    .185491   .428696   .0961782
+      43354.00    .188469   .426202   .0941448
+      43355.00    .191393   .423697   .0920173
+      43356.00    .194260   .421184   .0898110
+      43357.00    .197068   .418666   .0875704
+      43358.00    .199812   .416148   .0853505
+      43359.00    .202487   .413635   .0831987
+      43360.00    .205086   .411134   .0811463
+      43361.00    .207607   .408645   .0792069
+      43362.00    .210050   .406167   .0773793
+      43363.00    .212415   .403695   .0756495
+      43364.00    .214700   .401224   .0739912
+      43365.00    .216906   .398749   .0723674
+      43366.00    .219033   .396262   .0707352
+      43367.00    .221096   .393754   .0690521
+      43368.00    .223113   .391214   .0672798
+      43369.00    .225102   .388632   .0653877
+      43370.00    .227082   .385999   .0633572
+      43371.00    .229062   .383309   .0611873
+      43372.00    .231045   .380563   .0588980
+      43373.00    .233032   .377760   .0565309
+      43374.00    .235027   .374900   .0541403
+      43375.00    .237031   .371983   .0517795
+      43376.00    .239047   .369011   .0494863
+      43377.00    .241077   .365981   .0472730
+      43378.00    .243123   .362896   .0451234
+      43379.00    .245184   .359754   .0429967
+      43380.00    .247249   .356560   .0408378
+      43381.00    .249300   .353319   .0385923
+      43382.00    .251321   .350034   .0362236
+      43383.00    .253295   .346710   .0337251
+      43384.00    .255206   .343352   .0311225
+      43385.00    .257037   .339965   .0284644
+      43386.00    .258773   .336553   .0258056
+      43387.00    .260403   .333124   .0231927
+      43388.00    .261918   .329686   .0206533
+      43389.00    .263308   .326247   .0181958
+      43390.00    .264561   .322814   .0158123
+      43391.00    .265669   .319396   .0134830
+      43392.00    .266628   .315994   .0111780
+      43393.00    .267445   .312596   .0088600
+      43394.00    .268133   .309189   .0064876
+      43395.00    .268701   .305760   .0040210
+      43396.00    .269160   .302295   .0014261
+      43397.00    .269522   .298782  -.0013213
+      43398.00    .269796   .295208  -.0042306
+      43399.00    .269986   .291573  -.0072892
+      43400.00    .270092   .287884  -.0104594
+      43401.00    .270114   .284148  -.0136818
+      43402.00    .270054   .280373  -.0168882
+      43403.00    .269909   .276564  -.0200210
+      43404.00    .269682   .272729  -.0230495
+      43405.00    .269372   .268874  -.0259776
+      43406.00    .268979   .265007  -.0288387
+      43407.00    .268504   .261134  -.0316835
+      43408.00    .267952   .257254  -.0345648
+      43409.00    .267328   .253366  -.0375231
+      43410.00    .266637   .249467  -.0405750
+      43411.00    .265886   .245557  -.0437097
+      43412.00    .265079   .241635  -.0468915
+      43413.00    .264214   .237704  -.0500708
+      43414.00    .263284   .233771  -.0531981
+      43415.00    .262283   .229846  -.0562362
+      43416.00    .261204   .225936  -.0591666
+      43417.00    .260040   .222048  -.0619897
+      43418.00    .258791   .218186  -.0647210
+      43419.00    .257454   .214353  -.0673890
+      43420.00    .256033   .210549  -.0700321
+      43421.00    .254546   .206766  -.0726932
+      43422.00    .253012   .202993  -.0754167
+      43423.00    .251451   .199220  -.0782432
+      43424.00    .249883   .195435  -.0812060
+      43425.00    .248334   .191630  -.0843280
+      43426.00    .246824   .187794  -.0876157
+      43427.00    .245357   .183928  -.0910496
+      43428.00    .243924   .180034  -.0945828
+      43429.00    .242517   .176116  -.0981487
+      43430.00    .241125   .172177  -.1016771
+      43431.00    .239742   .168223  -.1051158
+      43432.00    .238365   .164261  -.1084474
+      43433.00    .236992   .160299  -.1116924
+      43434.00    .235622   .156343  -.1148973
+      43435.00    .234244   .152405  -.1181151
+      43436.00    .232834   .148495  -.1213882
+      43437.00    .231360   .144629  -.1247362
+      43438.00    .229791   .140821  -.1281541
+      43439.00    .228100   .137082  -.1316161
+      43440.00    .226268   .133418  -.1350826
+      43441.00    .224273   .129837  -.1385092
+      43442.00    .222098   .126344  -.1418558
+      43443.00    .219726   .122945  -.1450950
+      43444.00    .217146   .119647  -.1482166
+      43445.00    .214360   .116453  -.1512272
+      43446.00    .211380   .113368  -.1541470
+      43447.00    .208216   .110397  -.1570059
+      43448.00    .204878   .107544  -.1598398
+      43449.00    .201393   .104809  -.1626876
+      43450.00    .197804   .102181  -.1655874
+      43451.00    .194157   .099653  -.1685717
+      43452.00    .190500   .097216  -.1716640
+      43453.00    .186872   .094859  -.1748758
+      43454.00    .183296   .092575  -.1782032
+      43455.00    .179789   .090356  -.1816217
+      43456.00    .176367   .088191  -.1850845
+      43457.00    .173044   .086073  -.1885299
+      43458.00    .169819   .083993  -.1918985
+      43459.00    .166678   .081943  -.1951549
+      43460.00    .163610   .079914  -.1983014
+      43461.00    .160601   .077898  -.2013761
+      43462.00    .157639   .075885  -.2044350
+      43463.00    .154712   .073867  -.2075283
+      43464.00    .151806   .071837  -.2106822
+      43465.00    .148908   .069796  -.2138939
+      43466.00    .146001   .067748  -.2171378
+      43467.00    .143069   .065696  -.2203774
+      43468.00    .140096   .063645  -.2235741
+      43469.00    .137068   .061601  -.2266946
+      43470.00    .133967   .059568  -.2297155
+      43471.00    .130783   .057551  -.2326260
+      43472.00    .127525   .055548  -.2354300
+      43473.00    .124210   .053556  -.2381449
+      43474.00    .120857   .051573  -.2407984
+      43475.00    .117476   .049596  -.2434254
+      43476.00    .114076   .047626  -.2460646
+      43477.00    .110660   .045664  -.2487541
+      43478.00    .107236   .043711  -.2515275
+      43479.00    .103810   .041766  -.2544109
+      43480.00    .100399   .039832  -.2574196
+      43481.00    .097018   .037907  -.2605561
+      43482.00    .093685   .035992  -.2638080
+      43483.00    .090413   .034089  -.2671458
+      43484.00    .087214   .032206  -.2705236
+      43485.00    .084094   .030357  -.2738882
+      43486.00    .081061   .028552  -.2771957
+      43487.00    .078120   .026806  -.2804311
+      43488.00    .075273   .025137  -.2836161
+      43489.00    .072525   .023559  -.2867999
+      43490.00    .069874   .022086  -.2900354
+      43491.00    .067317   .020731  -.2933573
+      43492.00    .064853   .019504  -.2967677
+      43493.00    .062474   .018405  -.3002377
+      43494.00    .060173   .017429  -.3037211
+      43495.00    .057942   .016575  -.3071703
+      43496.00    .055757   .015844  -.3105474
+      43497.00    .053585   .015243  -.3138279
+      43498.00    .051390   .014776  -.3170006
+      43499.00    .049138   .014450  -.3200671
+      43500.00    .046792   .014270  -.3230414
+      43501.00    .044321   .014241  -.3259482
+      43502.00    .041712   .014360  -.3288195
+      43503.00    .038970   .014618  -.3316910
+      43504.00    .036101   .015005  -.3345972
+      43505.00    .033110   .015512  -.3375686
+      43506.00    .030003   .016128  -.3406283
+      43507.00    .026786   .016844  -.3437893
+      43508.00    .023463   .017651  -.3470520
+      43509.00    .020040   .018540   .6495968
+      43510.00    .016522   .019499   .6461826
+      43511.00    .012916   .020520   .6427420
+      43512.00    .009227   .021594   .6393177
+      43513.00    .005460   .022710   .6359491
+      43514.00    .001620   .023858   .6326596
+      43515.00   -.002286   .025031   .6294446
+      43516.00   -.006254   .026216   .6262694
+      43517.00   -.010278   .027406   .6230813
+      43518.00   -.014352   .028591   .6198327
+      43519.00   -.018472   .029769   .6165018
+      43520.00   -.022634   .030938   .6131041
+      43521.00   -.026834   .032100   .6096852
+      43522.00   -.031067   .033253   .6063026
+      43523.00   -.035329   .034397   .6030057
+      43524.00   -.039617   .035533   .5998260
+      43525.00   -.043925   .036659   .5967754
+      43526.00   -.048250   .037777   .5938494
+      43527.00   -.052587   .038885   .5910312
+      43528.00   -.056933   .039983   .5882930
+      43529.00   -.061283   .041071   .5855990
+      43530.00   -.065632   .042149   .5829089
+      43531.00   -.069978   .043217   .5801827
+      43532.00   -.074314   .044276   .5773848
+      43533.00   -.078629   .045329   .5744866
+      43534.00   -.082914   .046382   .5714703
+      43535.00   -.087156   .047440   .5683313
+      43536.00   -.091345   .048508   .5650802
+      43537.00   -.095469   .049592   .5617421
+      43538.00   -.099518   .050695   .5583520
+      43539.00   -.103479   .051823   .5549479
+      43540.00   -.107343   .052982   .5515624
+      43541.00   -.111101   .054176   .5482159
+      43542.00   -.114749   .055410   .5449082
+      43543.00   -.118282   .056689   .5416135
+      43544.00   -.121695   .058017   .5382847
+      43545.00   -.124985   .059400   .5348688
+      43546.00   -.128145   .060842   .5313286
+      43547.00   -.131173   .062348   .5276610
+      43548.00   -.134063   .063923   .5239011
+      43549.00   -.136811   .065571   .5201109
+      43550.00   -.139412   .067299   .5163583
+      43551.00   -.141862   .069109   .5126973
+      43552.00   -.144157   .071007   .5091584
+      43553.00   -.146306   .072987   .5057484
+      43554.00   -.148325   .075040   .5024562
+      43555.00   -.150229   .077157   .4992585
+      43556.00   -.152032   .079328   .4961223
+      43557.00   -.153750   .081544   .4930084
+      43558.00   -.155398   .083795   .4898759
+      43559.00   -.156991   .086073   .4866864
+      43560.00   -.158545   .088367   .4834090
+      43561.00   -.160073   .090673   .4800234
+      43562.00   -.161591   .092993   .4765236
+      43563.00   -.163112   .095331   .4729200
+      43564.00   -.164649   .097691   .4692407
+      43565.00   -.166217   .100078   .4655291
+      43566.00   -.167826   .102497   .4618338
+      43567.00   -.169483   .104958   .4581963
+      43568.00   -.171196   .107469   .4546412
+      43569.00   -.172969   .110041   .4511691
+      43570.00   -.174810   .112681   .4477555
+      43571.00   -.176725   .115401   .4443550
+      43572.00   -.178721   .118208   .4409123
+      43573.00   -.180803   .121112   .4373785
+      43574.00   -.182979   .124123   .4337276
+      43575.00   -.185247   .127245   .4299692
+      43576.00   -.187587   .130475   .4261477
+      43577.00   -.189978   .133808   .4223286
+      43578.00   -.192398   .137237   .4185771
+      43579.00   -.194826   .140760   .4149412
+      43580.00   -.197240   .144369   .4114441
+      43581.00   -.199617   .148061   .4080856
+      43582.00   -.201929   .151830   .4048488
+      43583.00   -.204152   .155670   .4017049
+      43584.00   -.206260   .159578   .3986177
+      43585.00   -.208229   .163547   .3955460
+      43586.00   -.210050   .167578   .3924463
+      43587.00   -.211723   .171670   .3892796
+      43588.00   -.213243   .175824   .3860160
+      43589.00   -.214610   .180039   .3826376
+      43590.00   -.215820   .184315   .3791411
+      43591.00   -.216879   .188649   .3755424
+      43592.00   -.217801   .193031   .3718781
+      43593.00   -.218600   .197451   .3681999
+      43594.00   -.219292   .201898   .3645615
+      43595.00   -.219892   .206364   .3610038
+      43596.00   -.220414   .210837   .3575414
+      43597.00   -.220871   .215307   .3541595
+      43598.00   -.221278   .219764   .3508197
+      43599.00   -.221646   .224195   .3474716
+      43600.00   -.221987   .228597   .3440670
+      43601.00   -.222313   .232972   .3405726
+      43602.00   -.222636   .237325   .3369818
+      43603.00   -.222965   .241659   .3333181
+      43604.00   -.223290   .245977   .3296311
+      43605.00   -.223596   .250283   .3259824
+      43606.00   -.223867   .254578   .3224283
+      43607.00   -.224091   .258862   .3190052
+      43608.00   -.224257   .263134   .3157250
+      43609.00   -.224355   .267391   .3125785
+      43610.00   -.224376   .271631   .3095413
+      43611.00   -.224308   .275854   .3065796
+      43612.00   -.224149   .280058   .3036531
+      43613.00   -.223913   .284249   .3007180
+      43614.00   -.223616   .288433   .2977329
+      43615.00   -.223270   .292613   .2946647
+      43616.00   -.222878   .296791   .2914932
+      43617.00   -.222440   .300969   .2882108
+      43618.00   -.221956   .305144   .2848250
+      43619.00   -.221413   .309310   .2813607
+      43620.00   -.220797   .313452   .2778616
+      43621.00   -.220093   .317558   .2743831
+      43622.00   -.219285   .321617   .2709789
+      43623.00   -.218367   .325616   .2676812
+      43624.00   -.217331   .329543   .2644895
+      43625.00   -.216175   .333387   .2613712
+      43626.00   -.214891   .337134   .2582750
+      43627.00   -.213476   .340775   .2551491
+      43628.00   -.211925   .344296   .2519580
+      43629.00   -.210242   .347698   .2486897
+      43630.00   -.208441   .350988   .2453578
+      43631.00   -.206533   .354173   .2419965
+      43632.00   -.204531   .357260   .2386522
+      43633.00   -.202448   .360257   .2353720
+      43634.00   -.200298   .363172   .2321928
+      43635.00   -.198095   .366014   .2291324
+      43636.00   -.195857   .368795   .2261885
+      43637.00   -.193599   .371523   .2233411
+      43638.00   -.191337   .374210   .2205588
+      43639.00   -.189077   .376868   .2178060
+      43640.00   -.186824   .379510   .2150448
+      43641.00   -.184585   .382150   .2122382
+      43642.00   -.182362   .384800   .2093543
+      43643.00   -.180143   .387471   .2063708
+      43644.00   -.177914   .390173   .2032768
+      43645.00   -.175657   .392915   .2000735
+      43646.00   -.173361   .395700   .1967754
+      43647.00   -.171014   .398527   .1934123
+      43648.00   -.168606   .401396   .1900291
+      43649.00   -.166125   .404308   .1866781
+      43650.00   -.163564   .407259   .1834043
+      43651.00   -.160919   .410238   .1802282
+      43652.00   -.158192   .413233   .1771364
+      43653.00   -.155381   .416231   .1740874
+      43654.00   -.152485   .419219   .1710302
+      43655.00   -.149505   .422184   .1679265
+      43656.00   -.146444   .425115   .1647655
+      43657.00   -.143321   .428001   .1615647
+      43658.00   -.140155   .430832   .1583622
+      43659.00   -.136967   .433598   .1552040
+      43660.00   -.133776   .436289   .1521349
+      43661.00   -.130589   .438906   .1491926
+      43662.00   -.127415   .441447   .1464011
+      43663.00   -.124258   .443914   .1437676
+      43664.00   -.121127   .446307   .1412826
+      43665.00   -.118027   .448625   .1389238
+      43666.00   -.114966   .450871   .1366611
+      43667.00   -.111946   .453043   .1344602
+      43668.00   -.108962   .455143   .1322833
+      43669.00   -.106002   .457171   .1300956
+      43670.00   -.103056   .459126   .1278696
+      43671.00   -.100114   .461011   .1255884
+      43672.00   -.097167   .462824   .1232466
+      43673.00   -.094212   .464567   .1208500
+      43674.00   -.091255   .466241   .1184157
+      43675.00   -.088300   .467846   .1159719
+      43676.00   -.085345   .469387   .1135555
+      43677.00   -.082389   .470867   .1112044
+      43678.00   -.079428   .472291   .1089430
+      43679.00   -.076459   .473663   .1067689
+      43680.00   -.073480   .474988   .1046477
+      43681.00   -.070485   .476267   .1025246
+      43682.00   -.067473   .477504   .1003467
+      43683.00   -.064438   .478702   .0980864
+      43684.00   -.061377   .479862   .0957528
+      43685.00   -.058285   .480987   .0933861
+      43686.00   -.055159   .482079   .0910414
+      43687.00   -.051996   .483137   .0887710
+      43688.00   -.048792   .484159   .0866126
+      43689.00   -.045544   .485142   .0845858
+      43690.00   -.042250   .486085   .0826924
+      43691.00   -.038905   .486984   .0809192
+      43692.00   -.035507   .487837   .0792409
+      43693.00   -.032052   .488642   .0776234
+      43694.00   -.028535   .489396   .0760289
+      43695.00   -.024953   .490096   .0744199
+      43696.00   -.021301   .490739   .0727630
+      43697.00   -.017575   .491319   .0710331
+      43698.00   -.013772   .491827   .0692151
+      43699.00   -.009888   .492256   .0673059
+      43700.00   -.005928   .492599   .0653151
+      43701.00   -.001900   .492850   .0632630
+      43702.00    .002188   .493007   .0611786
+      43703.00    .006322   .493071   .0590949
+      43704.00    .010492   .493048   .0570456
+      43705.00    .014681   .492942   .0550569
+      43706.00    .018873   .492757   .0531365
+      43707.00    .023046   .492495   .0512652
+      43708.00    .027181   .492160   .0493981
+      43709.00    .031258   .491754   .0474797
+      43710.00    .035262   .491279   .0454676
+      43711.00    .039190   .490733   .0433524
+      43712.00    .043039   .490114   .0411655
+      43713.00    .046808   .489419   .0389671
+      43714.00    .050496   .488646   .0368240
+      43715.00    .054113   .487792   .0347876
+      43716.00    .057670   .486857   .0328847
+      43717.00    .061179   .485838   .0311179
+      43718.00    .064651   .484736   .0294711
+      43719.00    .068101   .483559   .0279158
+      43720.00    .071536   .482311   .0264152
+      43721.00    .074958   .481001   .0249285
+      43722.00    .078364   .479640   .0234147
+      43723.00    .081753   .478236   .0218367
+      43724.00    .085123   .476798   .0201654
+      43725.00    .088473   .475336   .0183812
+      43726.00    .091802   .473857   .0164758
+      43727.00    .095104   .472363   .0144542
+      43728.00    .098376   .470854   .0123337
+      43729.00    .101614   .469331   .0101418
+      43730.00    .104814   .467794   .0079106
+      43731.00    .107971   .466245   .0056707
+      43732.00    .111084   .464682   .0034456
+      43733.00    .114151   .463104   .0012434
+      43734.00    .117171   .461510  -.0009488
+      43735.00    .120145   .459899  -.0031673
+      43736.00    .123077   .458278  -.0054643
+      43737.00    .125976   .456650  -.0078913
+      43738.00    .128849   .455022  -.0104762
+      43739.00    .131701   .453397  -.0132074
+      43740.00    .134538   .451778  -.0160330
+      43741.00    .137366   .450165  -.0188762
+      43742.00    .140189   .448559  -.0216605
+      43743.00    .143012   .446960  -.0243301
+      43744.00    .145841   .445366  -.0268586
+      43745.00    .148680   .443773  -.0292468
+      43746.00    .151531   .442177  -.0315147
+      43747.00    .154396   .440571  -.0336935
+      43748.00    .157271   .438948  -.0358210
+      43749.00    .160151   .437299  -.0379363
+      43750.00    .163031   .435617  -.0400759
+      43751.00    .165899   .433894  -.0422703
+      43752.00    .168737   .432123  -.0445405
+      43753.00    .171528   .430297  -.0468958
+      43754.00    .174256   .428408  -.0493332
+      43755.00    .176908   .426457  -.0518383
+      43756.00    .179473   .424449  -.0543860
+      43757.00    .181941   .422390  -.0569425
+      43758.00    .184304   .420286  -.0594734
+      43759.00    .186550   .418143  -.0619536
+      43760.00    .188684   .415963  -.0643739
+      43761.00    .190718   .413744  -.0667459
+      43762.00    .192669   .411482  -.0691035
+      43763.00    .194550   .409169  -.0714977
+      43764.00    .196378   .406797  -.0739843
+      43765.00    .198163   .404359  -.0766076
+      43766.00    .199903   .401853  -.0793833
+      43767.00    .201596   .399274  -.0822877
+      43768.00    .203239   .396620  -.0852623
+      43769.00    .204826   .393892  -.0882315
+      43770.00    .206351   .391093  -.0911272
+      43771.00    .207809   .388224  -.0939069
+      43772.00    .209195   .385287  -.0965604
+      43773.00    .210502   .382285  -.0991042
+      43774.00    .211732   .379220  -.1015708
+      43775.00    .212889   .376092  -.1040003
+      43776.00    .213980   .372904  -.1064361
+      43777.00    .215010   .369658  -.1089203
+      43778.00    .215989   .366356  -.1114893
+      43779.00    .216932   .363006  -.1141692
+      43780.00    .217853   .359612  -.1169746
+      43781.00    .218767   .356179  -.1199073
+      43782.00    .219684   .352717  -.1229554
+      43783.00    .220609   .349234  -.1260928
+      43784.00    .221550   .345743  -.1292806
+      43785.00    .222509   .342253  -.1324730
+      43786.00    .223491   .338774  -.1356278
+      43787.00    .224485   .335309  -.1387186
+      43788.00    .225478   .331858  -.1417440
+      43789.00    .226457   .328422  -.1447283
+      43790.00    .227409   .325001  -.1477144
+      43791.00    .228323   .321596  -.1507530
+      43792.00    .229191   .318206  -.1538881
+      43793.00    .230008   .314828  -.1571436
+      43794.00    .230768   .311463  -.1605123
+      43795.00    .231468   .308107  -.1639545
+      43796.00    .232115   .304757  -.1674075
+      43797.00    .232718   .301409  -.1708012
+      43798.00    .233283   .298057  -.1740780
+      43799.00    .233814   .294691  -.1772045
+      43800.00    .234310   .291299  -.1801762
+      43801.00    .234773   .287874  -.1830117
+      43802.00    .235200   .284417  -.1857462
+      43803.00    .235586   .280934  -.1884211
+      43804.00    .235928   .277428  -.1910785
+      43805.00    .236222   .273904  -.1937577
+      43806.00    .236463   .270369  -.1964924
+      43807.00    .236650   .266835  -.1993084
+      43808.00    .236778   .263312  -.2022192
+      43809.00    .236845   .259814  -.2052260
+      43810.00    .236847   .256349  -.2083172
+      43811.00    .236778   .252925  -.2114663
+      43812.00    .236632   .249544  -.2146351
+      43813.00    .236404   .246213  -.2177810
+      43814.00    .236086   .242932  -.2208692
+      43815.00    .235680   .239702  -.2238856
+      43816.00    .235182   .236519  -.2268452
+      43817.00    .234594   .233379  -.2297885
+      43818.00    .233914   .230281  -.2327680
+      43819.00    .233142   .227222  -.2358311
+      43820.00    .232276   .224198  -.2390052
+      43821.00    .231317   .221208  -.2422912
+      43822.00    .230263   .218247  -.2456624
+      43823.00    .229114   .215313  -.2490712
+      43824.00    .227870   .212404  -.2524596
+      43825.00    .226529   .209516  -.2557732
+      43826.00    .225095   .206646  -.2589735
+      43827.00    .223575   .203788  -.2620454
+      43828.00    .221976   .200937  -.2649981
+      43829.00    .220303   .198088  -.2678583
+      43830.00    .218564   .195236  -.2706623
+      43831.00    .216764   .192375  -.2734491
+      43832.00    .214912   .189501  -.2762562
+      43833.00    .213012   .186609  -.2791156
+      43834.00    .211071   .183701  -.2820508
+      43835.00    .209093   .180776  -.2850740
+      43836.00    .207082   .177839  -.2881851
+      43837.00    .205044   .174892  -.2913729
+      43838.00    .202984   .171935  -.2946162
+      43839.00    .200905   .168972  -.2978839
+      43840.00    .198815   .166005  -.3011377
+      43841.00    .196725   .163037  -.3043399
+      43842.00    .194646   .160071  -.3074654
+      43843.00    .192590   .157112  -.3105135
+      43844.00    .190570   .154161  -.3135135
+      43845.00    .188596   .151222  -.3165158
+      43846.00    .186681   .148300  -.3195721
+      43847.00    .184837   .145396  -.3227160
+      43848.00    .183075   .142515  -.3259501
+      43849.00    .181394   .139662  -.3292471
+      43850.00    .179786   .136842  -.3325594
+      43851.00    .178245   .134062  -.3358331
+      43852.00    .176763   .131326  -.3390196
+      43853.00    .175333   .128642  -.3420848
+      43854.00    .173948   .126014  -.3450138
+      43855.00    .172598   .123448  -.3478125
+      43856.00    .171269   .120945  -.3505033
+      43857.00    .169949   .118509  -.3531192
+      43858.00    .168623   .116141  -.3556976
+      43859.00    .167280   .113846  -.3582751
+      43860.00    .165906   .111626  -.3608843
+      43861.00    .164489   .109482  -.3635510
+      43862.00    .163023   .107410  -.3662935
+      43863.00    .161506   .105405  -.3691193
+      43864.00    .159933   .103460  -.3720247
+      43865.00    .158303   .101569  -.3749969
+      43866.00    .156610   .099725  -.3780160
+      43867.00    .154854   .097924  -.3810565
+      43868.00    .153029   .096158  -.3840898
+      43869.00    .151133   .094422  -.3870918
+      43870.00    .149163   .092709  -.3900537
+      43871.00    .147115   .091014  -.3929930
+      43872.00    .144987   .089332  -.3959529
+      43873.00    .142776   .087666  -.3989868
+      43874.00    .140480   .086025   .5978633
+      43875.00    .138099   .084414   .5945863
+      43876.00    .135629   .082840   .5912098
+      43877.00    .133069   .081309   .5877910
+      43878.00    .130417   .079829   .5843976
+      43879.00    .127672   .078406   .5810892
+      43880.00    .124831   .077047   .5779048
+      43881.00    .121894   .075758   .5748607
+      43882.00    .118858   .074545   .5719519
+      43883.00    .115732   .073408   .5691563
+      43884.00    .112525   .072343   .5664409
+      43885.00    .109250   .071345   .5637676
+      43886.00    .105917   .070411   .5610988
+      43887.00    .102538   .069537   .5584014
+      43888.00    .099123   .068719   .5556491
+      43889.00    .095684   .067954   .5528245
+      43890.00    .092231   .067237   .5499209
+      43891.00    .088776   .066565   .5469430
+      43892.00    .085330   .065933   .5439059
+      43893.00    .081903   .065338   .5408321
+      43894.00    .078507   .064776   .5377474
+      43895.00    .075153   .064243   .5346777
+      43896.00    .071853   .063735   .5316455
+      43897.00    .068616   .063248   .5286629
+      43898.00    .065446   .062784   .5257234
+      43899.00    .062342   .062344   .5227957
+      43900.00    .059301   .061935   .5198283
+      43901.00    .056322   .061559   .5167664
+      43902.00    .053402   .061220   .5135772
+      43903.00    .050539   .060923   .5102684
+      43904.00    .047732   .060670   .5068909
+      43905.00    .044977   .060467   .5035221
+      43906.00    .042272   .060316   .5002411
+      43907.00    .039616   .060220   .4971054
+      43908.00    .037003   .060177   .4941406
+      43909.00    .034431   .060183   .4913431
+      43910.00    .031894   .060235   .4886884
+      43911.00    .029391   .060324   .4861395
+      43912.00    .026917   .060443   .4836543
+      43913.00    .024464   .060590   .4811906
+      43914.00    .022021   .060766   .4787103
+      43915.00    .019579   .060969   .4761830
+      43916.00    .017129   .061199   .4735876
+      43917.00    .014664   .061456   .4709136
+      43918.00    .012186   .061739   .4681619
+      43919.00    .009695   .062047   .4653447
+      43920.00    .007190   .062380   .4624842
+      43921.00    .004672   .062736   .4596078
+      43922.00    .002142   .063115   .4567426
+      43923.00   -.000401   .063517   .4539100
+      43924.00   -.002956   .063940   .4511200
+      43925.00   -.005524   .064384   .4483673
+      43926.00   -.008108   .064848   .4456269
+      43927.00   -.010711   .065332   .4428528
+      43928.00   -.013336   .065834   .4399875
+      43929.00   -.015987   .066356   .4369807
+      43930.00   -.018666   .066895   .4338127
+      43931.00   -.021378   .067451   .4305092
+      43932.00   -.024122   .068028   .4271378
+      43933.00   -.026899   .068637   .4237864
+      43934.00   -.029706   .069293   .4205356
+      43935.00   -.032543   .070009   .4174369
+      43936.00   -.035406   .070797   .4145046
+      43937.00   -.038296   .071672   .4117220
+      43938.00   -.041208   .072647   .4090524
+      43939.00   -.044139   .073730   .4064513
+      43940.00   -.047081   .074925   .4038728
+      43941.00   -.050025   .076239   .4012742
+      43942.00   -.052969   .077670   .3986191
+      43943.00   -.055911   .079210   .3958803
+      43944.00   -.058854   .080847   .3930421
+      43945.00   -.061800   .082570   .3901010
+      43946.00   -.064750   .084368   .3870650
+      43947.00   -.067704   .086231   .3839535
+      43948.00   -.070664   .088147   .3807956
+      43949.00   -.073618   .090106   .3776271
+      43950.00   -.076549   .092098   .3744811
+      43951.00   -.079444   .094114   .3713788
+      43952.00   -.082286   .096143   .3683230
+      43953.00   -.085059   .098177   .3652961
+      43954.00   -.087749   .100204   .3622606
+      43955.00   -.090350   .102221   .3591650
+      43956.00   -.092865   .104229   .3559556
+      43957.00   -.095296   .106231   .3525963
+      43958.00   -.097642   .108233   .3490860
+      43959.00   -.099898   .110239   .3454675
+      43960.00   -.102064   .112255   .3418196
+      43961.00   -.104136   .114286   .3382344
+      43962.00   -.106120   .116336   .3347871
+      43963.00   -.108024   .118409   .3315186
+      43964.00   -.109856   .120506   .3284323
+      43965.00   -.111624   .122632   .3255016
+      43966.00   -.113335   .124790   .3226839
+      43967.00   -.114998   .126982   .3199310
+      43968.00   -.116619   .129213   .3171962
+      43969.00   -.118202   .131482   .3144374
+      43970.00   -.119746   .133788   .3116208
+      43971.00   -.121251   .136129   .3087243
+      43972.00   -.122714   .138504   .3057383
+      43973.00   -.124135   .140910   .3026656
+      43974.00   -.125512   .143345   .2995202
+      43975.00   -.126849   .145809   .2963268
+      43976.00   -.128150   .148298   .2931183
+      43977.00   -.129419   .150811   .2899290
+      43978.00   -.130661   .153347   .2867850
+      43979.00   -.131882   .155903   .2836958
+      43980.00   -.133085   .158477   .2806490
+      43981.00   -.134274   .161067   .2776110
+      43982.00   -.135449   .163669   .2745349
+      43983.00   -.136606   .166279   .2713707
+      43984.00   -.137741   .168891   .2680793
+      43985.00   -.138853   .171502   .2646455
+      43986.00   -.139941   .174110   .2610886
+      43987.00   -.141004   .176715   .2574631
+      43988.00   -.142046   .179318   .2538475
+      43989.00   -.143074   .181927   .2503237
+      43990.00   -.144092   .184548   .2469541
+      43991.00   -.145100   .187182   .2437655
+      43992.00   -.146089   .189825   .2407493
+      43993.00   -.147054   .192477   .2378725
+      43994.00   -.147988   .195134   .2350903
+      43995.00   -.148886   .197796   .2323562
+      43996.00   -.149745   .200461   .2296276
+      43997.00   -.150564   .203128   .2268695
+      43998.00   -.151339   .205796   .2240570
+      43999.00   -.152070   .208464   .2211782
+      44000.00   -.152753   .211131   .2182336
+      44001.00   -.153387   .213797   .2152346
+      44002.00   -.153973   .216460   .2122023
+      44003.00   -.154510   .219120   .2091655
+      44004.00   -.154999   .221774   .2061571
+      44005.00   -.155442   .224422   .2032085
+      44006.00   -.155839   .227063   .2003390
+      44007.00   -.156190   .229696   .1975461
+      44008.00   -.156498   .232317   .1948025
+      44009.00   -.156760   .234922   .1920627
+      44010.00   -.156979   .237507   .1892751
+      44011.00   -.157154   .240066   .1863978
+      44012.00   -.157284   .242593   .1834122
+      44013.00   -.157372   .245080   .1803290
+      44014.00   -.157415   .247523   .1771873
+      44015.00   -.157410   .249924   .1740488
+      44016.00   -.157353   .252291   .1709837
+      44017.00   -.157240   .254629   .1680538
+      44018.00   -.157071   .256943   .1652975
+      44019.00   -.156842   .259234   .1627230
+      44020.00   -.156555   .261507   .1603115
+      44021.00   -.156206   .263765   .1580270
+      44022.00   -.155797   .266011   .1558269
+      44023.00   -.155330   .268245   .1536684
+      44024.00   -.154810   .270470   .1515140
+      44025.00   -.154242   .272685   .1493351
+      44026.00   -.153628   .274892   .1471131
+      44027.00   -.152969   .277094   .1448408
+      44028.00   -.152263   .279291   .1425226
+      44029.00   -.151511   .281486   .1401719
+      44030.00   -.150712   .283680   .1378086
+      44031.00   -.149866   .285876   .1354564
+      44032.00   -.148972   .288076   .1331408
+      44033.00   -.148031   .290280   .1308829
+      44034.00   -.147047   .292494   .1286901
+      44035.00   -.146027   .294720   .1265461
+      44036.00   -.144979   .296961   .1244090
+      44037.00   -.143907   .299222   .1222235
+      44038.00   -.142819   .301505   .1199394
+      44039.00   -.141721   .303814   .1175309
+      44040.00   -.140619   .306150   .1150055
+      44041.00   -.139515   .308510   .1124028
+      44042.00   -.138413   .310891   .1097815
+      44043.00   -.137315   .313290   .1072050
+      44044.00   -.136226   .315703   .1047273
+      44045.00   -.135149   .318127   .1023839
+      44046.00   -.134082   .320558   .1001851
+      44047.00   -.133023   .322987   .0981170
+      44048.00   -.131967   .325406   .0961475
+      44049.00   -.130909   .327807   .0942354
+      44050.00   -.129846   .330183   .0923394
+      44051.00   -.128778   .332535   .0904232
+      44052.00   -.127706   .334862   .0884588
+      44053.00   -.126628   .337163   .0864284
+      44054.00   -.125542   .339439   .0843264
+      44055.00   -.124442   .341688   .0821596
+      44056.00   -.123326   .343909   .0799453
+      44057.00   -.122188   .346100   .0777069
+      44058.00   -.121023   .348261   .0754707
+      44059.00   -.119823   .350392   .0732628
+      44060.00   -.118580   .352492   .0711070
+      44061.00   -.117286   .354562   .0690175
+      44062.00   -.115933   .356601   .0669908
+      44063.00   -.114514   .358609   .0649984
+      44064.00   -.113023   .360584   .0629905
+      44065.00   -.111458   .362525   .0609115
+      44066.00   -.109817   .364427   .0587243
+      44067.00   -.108098   .366288   .0564281
+      44068.00   -.106300   .368105   .0540628
+      44069.00   -.104419   .369877   .0516943
+      44070.00   -.102454   .371605   .0493954
+      44071.00   -.100404   .373287   .0472259
+      44072.00   -.098267   .374923   .0452206
+      44073.00   -.096040   .376514   .0433866
+      44074.00   -.093725   .378060   .0417069
+      44075.00   -.091327   .379565   .0401465
+      44076.00   -.088856   .381037   .0386609
+      44077.00   -.086321   .382482   .0372045
+      44078.00   -.083733   .383905   .0357367
+      44079.00   -.081101   .385315   .0342253
+      44080.00   -.078433   .386717   .0326479
+      44081.00   -.075739   .388117   .0309929
+      44082.00   -.073026   .389522   .0292595
+      44083.00   -.070302   .390939   .0274579
+      44084.00   -.067573   .392373   .0256065
+      44085.00   -.064847   .393830   .0237269
+      44086.00   -.062126   .395308   .0218404
+      44087.00   -.059411   .396802   .0199639
+      44088.00   -.056703   .398306   .0181066
+      44089.00   -.054003   .399814   .0162656
+      44090.00   -.051312   .401319   .0144201
+      44091.00   -.048629   .402812   .0125271
+      44092.00   -.045956   .404284   .0105286
+      44093.00   -.043291   .405727   .0083720
+      44094.00   -.040636   .407132   .0060328
+      44095.00   -.037989   .408492   .0035321
+      44096.00   -.035345   .409799   .0009371
+      44097.00   -.032689   .411047  -.0016589
+      44098.00   -.030008   .412228  -.0041672
+      44099.00   -.027287   .413337  -.0065267
+      44100.00   -.024514   .414367  -.0087132
+      44101.00   -.021675   .415312  -.0107356
+      44102.00   -.018775   .416172  -.0126275
+      44103.00   -.015826   .416953  -.0144346
+      44104.00   -.012839   .417659  -.0162036
+      44105.00   -.009828   .418293  -.0179767
+      44106.00   -.006804   .418860  -.0197865
+      44107.00   -.003779   .419365  -.0216552
+      44108.00   -.000767   .419812  -.0235931
+      44109.00    .002222   .420205  -.0255994
+      44110.00    .005175   .420548  -.0276627
+      44111.00    .008079   .420847  -.0297624
+      44112.00    .010923   .421105  -.0318720
+      44113.00    .013703   .421323  -.0339667
+      44114.00    .016420   .421501  -.0360279
+      44115.00    .019077   .421639  -.0380466
+      44116.00    .021674   .421735  -.0400268
+      44117.00    .024215   .421790  -.0419887
+      44118.00    .026700   .421802  -.0439715
+      44119.00    .029132   .421771  -.0460322
+      44120.00    .031511   .421697  -.0482331
+      44121.00    .033842   .421579  -.0506223
+      44122.00    .036124   .421415  -.0532098
+      44123.00    .038362   .421208  -.0559546
+      44124.00    .040559   .420956  -.0587727
+      44125.00    .042720   .420659  -.0615625
+      44126.00    .044847   .420319  -.0642366
+      44127.00    .046946   .419936  -.0667455
+      44128.00    .049019   .419508  -.0690829
+      44129.00    .051074   .419032  -.0712768
+      44130.00    .053117   .418502  -.0733744
+      44131.00    .055153   .417912  -.0754270
+      44132.00    .057180   .417258  -.0774808
+      44133.00    .059199   .416536  -.0795726
+      44134.00    .061206   .415743  -.0817274
+      44135.00    .063200   .414878  -.0839581
+      44136.00    .065176   .413944  -.0862669
+      44137.00    .067126   .412949  -.0886452
+      44138.00    .069047   .411900  -.0910757
+      44139.00    .070931   .410806  -.0935341
+      44140.00    .072773   .409675  -.0959929
+      44141.00    .074567   .408515  -.0984269
+      44142.00    .076307   .407335  -.1008215
+      44143.00    .077989   .406142  -.1031763
+      44144.00    .079608   .404944  -.1055084
+      44145.00    .081169   .403754  -.1078519
+      44146.00    .082675   .402580  -.1102558
+      44147.00    .084132   .401428  -.1127779
+      44148.00    .085546   .400303  -.1154722
+      44149.00    .086922   .399210  -.1183698
+      44150.00    .088261   .398147  -.1214611
+      44151.00    .089562   .397110  -.1246893
+      44152.00    .090826   .396094  -.1279624
+      44153.00    .092056   .395093  -.1311808
+      44154.00    .093254   .394100  -.1342675
+      44155.00    .094421   .393111  -.1371874
+      44156.00    .095564   .392119  -.1399479
+      44157.00    .096691   .391120  -.1425862
+      44158.00    .097813   .390111  -.1451529
+      44159.00    .098939   .389088  -.1476981
+      44160.00    .100079   .388046  -.1502641
+      44161.00    .101241   .386981  -.1528811
+      44162.00    .102432   .385888  -.1555665
+      44163.00    .103656   .384759  -.1583234
+      44164.00    .104919   .383589  -.1611426
+      44165.00    .106230   .382375  -.1640036
+      44166.00    .107594   .381114  -.1668783
+      44167.00    .109010   .379805  -.1697354
+      44168.00    .110472   .378448  -.1725428
+      44169.00    .111973   .377043  -.1752734
+      44170.00    .113508   .375592  -.1779123
+      44171.00    .115071   .374096  -.1804638
+      44172.00    .116658   .372558  -.1829532
+      44173.00    .118264   .370981  -.1854237
+      44174.00    .119881   .369370  -.1879304
+      44175.00    .121499   .367730  -.1905278
+      44176.00    .123110   .366067  -.1932557
+      44177.00    .124704   .364386  -.1961259
+      44178.00    .126267   .362696  -.1991127
+      44179.00    .127786   .361002  -.2021533
+      44180.00    .129247   .359310  -.2051622
+      44181.00    .130640   .357627  -.2080566
+      44182.00    .131952   .355957  -.2107808
+      44183.00    .133174   .354305  -.2133200
+      44184.00    .134298   .352671  -.2156970
+      44185.00    .135323   .351057  -.2179589
+      44186.00    .136248   .349458  -.2201601
+      44187.00    .137075   .347869  -.2223508
+      44188.00    .137808   .346286  -.2245710
+      44189.00    .138446   .344704  -.2268483
+      44190.00    .138994   .343119  -.2291972
+      44191.00    .139451   .341524  -.2316187
+      44192.00    .139821   .339914  -.2341023
+      44193.00    .140103   .338282  -.2366291
+      44194.00    .140302   .336622  -.2391737
+      44195.00    .140426   .334928  -.2417079
+      44196.00    .140482   .333196  -.2442046
+      44197.00    .140477   .331420  -.2466437
+      44198.00    .140419   .329595  -.2490207
+      44199.00    .140318   .327721  -.2513531
+      44200.00    .140180   .325795  -.2536803
+      44201.00    .140012   .323818  -.2560557
+      44202.00    .139821   .321787  -.2585334
+      44203.00    .139611   .319701  -.2611536
+      44204.00    .139390   .317562  -.2639311
+      44205.00    .139167   .315386  -.2668483
+      44206.00    .138953   .313192  -.2698572
+      44207.00    .138753   .310995  -.2728880
+      44208.00    .138573   .308809  -.2758646
+      44209.00    .138418   .306639  -.2787243
+      44210.00    .138289   .304489  -.2814329
+      44211.00    .138190   .302360  -.2839919
+      44212.00    .138124   .300255  -.2864315
+      44213.00    .138091   .298174  -.2887981
+      44214.00    .138089   .296114  -.2911396
+      44215.00    .138117   .294075  -.2934961
+      44216.00    .138168   .292058  -.2958970
+      44217.00    .138238   .290066  -.2983595
+      44218.00    .138320   .288099  -.3008881
+      44219.00    .138410   .286159  -.3034748
+      44220.00    .138505   .284248  -.3061010
+      44221.00    .138603   .282368  -.3087421
+      44222.00    .138703   .280516  -.3113708
+      44223.00    .138805   .278690  -.3139607
+      44224.00    .138909   .276887  -.3164895
+      44225.00    .139014   .275106  -.3189447
+      44226.00    .139120   .273342  -.3213305
+      44227.00    .139225   .271595  -.3236743
+      44228.00    .139326   .269861  -.3260234
+      44229.00    .139418   .268135  -.3284335
+      44230.00    .139498   .266416  -.3309502
+      44231.00    .139560   .264700  -.3335935
+      44232.00    .139603   .262986  -.3363494
+      44233.00    .139621   .261273  -.3391744
+      44234.00    .139611   .259557  -.3420076
+      44235.00    .139569   .257838  -.3447863
+      44236.00    .139492   .256114  -.3474594
+      44237.00    .139373   .254387  -.3499978
+      44238.00    .139205   .252659  -.3524007
+      44239.00    .138980   .250935   .6453058
+      44240.00    .138693   .249216   .6430784
+      44241.00    .138335   .247506   .6408691
+      44242.00    .137902   .245807   .6386352
+      44243.00    .137395   .244120   .6363457
+      44244.00    .136811   .242446   .6339818
+      44245.00    .136151   .240786   .6315374
+      44246.00    .135413   .239142   .6290184
+      44247.00    .134598   .237513   .6264412
+      44248.00    .133709   .235902   .6238294
+      44249.00    .132757   .234310   .6212086
+      44250.00    .131748   .232740   .6186020
+      44251.00    .130692   .231191   .6160289
+      44252.00    .129593   .229665   .6135018
+      44253.00    .128457   .228159   .6110210
+      44254.00    .127290   .226672   .6085683
+      44255.00    .126096   .225205   .6061039
+      44256.00    .124881   .223755   .6035730
+      44257.00    .123646   .222321   .6009239
+      44258.00    .122392   .220902   .5981297
+      44259.00    .121118   .219496   .5952043
+      44260.00    .119821   .218103   .5922023
+      44261.00    .118501   .216720   .5892033
+      44262.00    .117150   .215348   .5862886
+      44263.00    .115758   .213987   .5835214
+      44264.00    .114323   .212638   .5809352
+      44265.00    .112841   .211304   .5785319
+      44266.00    .111310   .209984   .5762861
+      44267.00    .109728   .208682   .5741545
+      44268.00    .108092   .207398   .5720865
+      44269.00    .106402   .206132   .5700354
+      44270.00    .104655   .204884   .5679641
+      44271.00    .102851   .203651   .5658492
+      44272.00    .100993   .202433   .5636796
+      44273.00    .099091   .201231   .5614565
+      44274.00    .097155   .200045   .5591909
+      44275.00    .095195   .198875   .5569018
+      44276.00    .093226   .197723   .5546116
+      44277.00    .091266   .196591   .5523411
+      44278.00    .089333   .195479   .5501051
+      44279.00    .087446   .194388   .5479092
+      44280.00    .085620   .193319   .5457478
+      44281.00    .083873   .192271   .5436007
+      44282.00    .082218   .191244   .5414283
+      44283.00    .080651   .190240   .5391704
+      44284.00    .079166   .189260   .5367591
+      44285.00    .077756   .188305   .5341446
+      44286.00    .076414   .187376   .5313165
+      44287.00    .075131   .186474   .5283146
+      44288.00    .073900   .185601   .5252221
+      44289.00    .072715   .184756   .5221418
+      44290.00    .071567   .183944   .5191657
+      44291.00    .070449   .183165   .5163523
+      44292.00    .069354   .182425   .5137186
+      44293.00    .068273   .181726   .5112459
+      44294.00    .067199   .181072   .5088943
+      44295.00    .066122   .180469   .5066145
+      44296.00    .065033   .179919   .5043588
+      44297.00    .063923   .179427   .5020888
+      44298.00    .062782   .178993   .4997791
+      44299.00    .061603   .178619   .4974185
+      44300.00    .060380   .178307   .4950075
+      44301.00    .059110   .178054   .4925570
+      44302.00    .057789   .177863   .4900871
+      44303.00    .056416   .177730   .4876240
+      44304.00    .054990   .177653   .4851957
+      44305.00    .053512   .177625   .4828251
+      44306.00    .051987   .177643   .4805241
+      44307.00    .050421   .177702   .4782909
+      44308.00    .048818   .177795   .4761094
+      44309.00    .047184   .177919   .4739461
+      44310.00    .045521   .178073   .4717485
+      44311.00    .043833   .178255   .4694499
+      44312.00    .042121   .178468   .4669834
+      44313.00    .040391   .178710   .4643042
+      44314.00    .038646   .178983   .4614115
+      44315.00    .036890   .179286   .4583594
+      44316.00    .035126   .179618   .4552437
+      44317.00    .033358   .179979   .4521716
+      44318.00    .031588   .180365   .4492286
+      44319.00    .029816   .180776   .4464563
+      44320.00    .028044   .181209   .4438491
+      44321.00    .026277   .181661   .4413673
+      44322.00    .024517   .182131   .4389552
+      44323.00    .022769   .182616   .4365571
+      44324.00    .021032   .183114   .4341277
+      44325.00    .019308   .183625   .4316361
+      44326.00    .017596   .184149   .4290667
+      44327.00    .015900   .184683   .4264192
+      44328.00    .014225   .185227   .4237058
+      44329.00    .012573   .185779   .4209487
+      44330.00    .010942   .186341   .4181764
+      44331.00    .009330   .186913   .4154210
+      44332.00    .007732   .187499   .4127132
+      44333.00    .006145   .188098   .4100757
+      44334.00    .004564   .188713   .4075181
+      44335.00    .002985   .189344   .4050339
+      44336.00    .001404   .189993   .4025986
+      44337.00   -.000184   .190657   .4001715
+      44338.00   -.001784   .191338   .3976986
+      44339.00   -.003399   .192036   .3951184
+      44340.00   -.005035   .192749   .3923766
+      44341.00   -.006693   .193480   .3894468
+      44342.00   -.008371   .194228   .3863481
+      44343.00   -.010064   .194996   .3831491
+      44344.00   -.011767   .195783   .3799519
+      44345.00   -.013473   .196591   .3768602
+      44346.00   -.015173   .197424   .3739470
+      44347.00   -.016861   .198283   .3712357
+      44348.00   -.018531   .199172   .3687020
+      44349.00   -.020180   .200093   .3662917
+      44350.00   -.021803   .201050   .3639420
+      44351.00   -.023391   .202038   .3615979
+      44352.00   -.024933   .203054   .3592189
+      44353.00   -.026421   .204098   .3567803
+      44354.00   -.027852   .205166   .3542727
+      44355.00   -.029222   .206260   .3517004
+      44356.00   -.030530   .207376   .3490794
+      44357.00   -.031780   .208512   .3464344
+      44358.00   -.032974   .209662   .3437946
+      44359.00   -.034117   .210823   .3411890
+      44360.00   -.035211   .211990   .3386427
+      44361.00   -.036260   .213160   .3361710
+      44362.00   -.037268   .214328   .3337745
+      44363.00   -.038237   .215493   .3314354
+      44364.00   -.039170   .216651   .3291184
+      44365.00   -.040070   .217799   .3267747
+      44366.00   -.040940   .218938   .3243499
+      44367.00   -.041786   .220064   .3217946
+      44368.00   -.042610   .221179   .3190770
+      44369.00   -.043412   .222281   .3161979
+      44370.00   -.044191   .223371   .3131995
+      44371.00   -.044944   .224447   .3101614
+      44372.00   -.045667   .225511   .3071817
+      44373.00   -.046356   .226563   .3043487
+      44374.00   -.047008   .227603   .3017146
+      44375.00   -.047627   .228634   .2992833
+      44376.00   -.048213   .229657   .2970177
+      44377.00   -.048768   .230674   .2948597
+      44378.00   -.049291   .231685   .2927505
+      44379.00   -.049783   .232689   .2906432
+      44380.00   -.050242   .233687   .2885074
+      44381.00   -.050670   .234679   .2863292
+      44382.00   -.051071   .235667   .2841089
+      44383.00   -.051448   .236653   .2818591
+      44384.00   -.051806   .237638   .2796014
+      44385.00   -.052152   .238627   .2773624
+      44386.00   -.052492   .239621   .2751687
+      44387.00   -.052829   .240622   .2730435
+      44388.00   -.053166   .241634   .2710025
+      44389.00   -.053503   .242657   .2690501
+      44390.00   -.053835   .243694   .2671735
+      44391.00   -.054155   .244745   .2653405
+      44392.00   -.054454   .245810   .2635027
+      44393.00   -.054729   .246888   .2616043
+      44394.00   -.054978   .247978   .2595953
+      44395.00   -.055198   .249076   .2574431
+      44396.00   -.055390   .250181   .2551422
+      44397.00   -.055555   .251291   .2527187
+      44398.00   -.055697   .252403   .2502291
+      44399.00   -.055819   .253518   .2477506
+      44400.00   -.055929   .254635   .2453624
+      44401.00   -.056030   .255754   .2431236
+      44402.00   -.056121   .256876   .2410578
+      44403.00   -.056197   .258000   .2391486
+      44404.00   -.056252   .259130   .2373506
+      44405.00   -.056283   .260267   .2356071
+      44406.00   -.056288   .261414   .2338680
+      44407.00   -.056263   .262575   .2320990
+      44408.00   -.056206   .263751   .2302829
+      44409.00   -.056120   .264944   .2284177
+      44410.00   -.056007   .266154   .2265144
+      44411.00   -.055869   .267379   .2245938
+      44412.00   -.055710   .268620   .2226833
+      44413.00   -.055531   .269874   .2208110
+      44414.00   -.055334   .271140   .2190006
+      44415.00   -.055118   .272416   .2172690
+      44416.00   -.054881   .273700   .2156238
+      44417.00   -.054612   .274989   .2140596
+      44418.00   -.054299   .276282   .2125530
+      44419.00   -.053930   .277574   .2110616
+      44420.00   -.053497   .278865   .2095287
+      44421.00   -.052996   .280150   .2078977
+      44422.00   -.052422   .281429   .2061299
+      44423.00   -.051780   .282702   .2042170
+      44424.00   -.051095   .283971   .2021850
+      44425.00   -.050384   .285238   .2000888
+      44426.00   -.049652   .286501   .1980003
+      44427.00   -.048902   .287755   .1959907
+      44428.00   -.048137   .288998   .1941150
+      44429.00   -.047357   .290226   .1924001
+      44430.00   -.046564   .291435   .1908393
+      44431.00   -.045762   .292623   .1893957
+      44432.00   -.044962   .293793   .1880149
+      44433.00   -.044175   .294946   .1866427
+      44434.00   -.043412   .296085   .1852377
+      44435.00   -.042680   .297212   .1837753
+      44436.00   -.041982   .298330   .1822469
+      44437.00   -.041317   .299440   .1806576
+      44438.00   -.040682   .300543   .1790231
+      44439.00   -.040070   .301639   .1773670
+      44440.00   -.039481   .302728   .1757154
+      44441.00   -.038915   .303805   .1740930
+      44442.00   -.038378   .304868   .1725194
+      44443.00   -.037876   .305911   .1710052
+      44444.00   -.037416   .306930   .1695499
+      44445.00   -.037005   .307918   .1681384
+      44446.00   -.036652   .308869   .1667384
+      44447.00   -.036373   .309774   .1653007
+      44448.00   -.036176   .310620   .1637689
+      44449.00   -.036043   .311387   .1620941
+      44450.00   -.035959   .312081   .1602557
+      44451.00   -.035911   .312715   .1582745
+      44452.00   -.035885   .313299   .1562108
+      44453.00   -.035873   .313843   .1541461
+      44454.00   -.035866   .314353   .1521605
+      44455.00   -.035856   .314838   .1503126
+      44456.00   -.035834   .315303   .1486280
+      44457.00   -.035796   .315753   .1470977
+      44458.00   -.035736   .316194   .1456845
+      44459.00   -.035652   .316631   .1443340
+      44460.00   -.035543   .317071   .1429894
+      44461.00   -.035410   .317518   .1416036
+      44462.00   -.035258   .317974   .1401463
+      44463.00   -.035091   .318443   .1386056
+      44464.00   -.034914   .318927   .1369849
+      44465.00   -.034730   .319428   .1352991
+      44466.00   -.034545   .319948   .1335716
+      44467.00   -.034361   .320488   .1318295
+      44468.00   -.034185   .321048   .1300996
+      44469.00   -.034021   .321629   .1284021
+      44470.00   -.033876   .322231   .1267463
+      44471.00   -.033753   .322852   .1251295
+      44472.00   -.033655   .323491   .1235369
+      44473.00   -.033585   .324146   .1219387
+      44474.00   -.033544   .324811   .1202889
+      44475.00   -.033532   .325482   .1185273
+      44476.00   -.033545   .326154   .1165928
+      44477.00   -.033575   .326823   .1144442
+      44478.00   -.033616   .327484   .1120823
+      44479.00   -.033658   .328135   .1095587
+      44480.00   -.033692   .328774   .1069650
+      44481.00   -.033706   .329403   .1044053
+      44482.00   -.033692   .330022   .1019650
+      44483.00   -.033648   .330632   .0996895
+      44484.00   -.033568   .331235   .0975787
+      44485.00   -.033449   .331832   .0955965
+      44486.00   -.033291   .332424   .0936871
+      44487.00   -.033093   .333013   .0917909
+      44488.00   -.032856   .333598   .0898578
+      44489.00   -.032585   .334183   .0878542
+      44490.00   -.032281   .334766   .0857654
+      44491.00   -.031950   .335350   .0835940
+      44492.00   -.031593   .335936   .0813562
+      44493.00   -.031215   .336526   .0790771
+      44494.00   -.030818   .337119   .0767870
+      44495.00   -.030404   .337719   .0745165
+      44496.00   -.029974   .338327   .0722922
+      44497.00   -.029527   .338943   .0701300
+      44498.00   -.029065   .339567   .0680318
+      44499.00   -.028584   .340199   .0659849
+      44500.00   -.028086   .340837   .0639626
+      44501.00   -.027570   .341480   .0619229
+      44502.00   -.027034   .342124   .0598094
+      44503.00   -.026481   .342766   .0575568
+      44504.00   -.025918   .343399   .0551051
+      44505.00   -.025350   .344019   .0524227
+      44506.00   -.024784   .344617   .0495267
+      44507.00   -.024228   .345183   .0464885
+      44508.00   -.023692   .345704   .0434152
+      44509.00   -.023185   .346167   .0404165
+      44510.00   -.022722   .346558   .0375738
+      44511.00   -.022320   .346877   .0349343
+      44512.00   -.021988   .347173   .0324995
+      44513.00   -.021717   .347498   .0302196
+      44514.00   -.021472   .347867   .0280224
+      44515.00   -.021217   .348281   .0258395
+      44516.00   -.020922   .348738   .0236201
+      44517.00   -.020573   .349238   .0213366
+      44518.00   -.020162   .349784   .0189812
+      44519.00   -.019683   .350378   .0165613
+      44520.00   -.019138   .351018   .0140960
+      44521.00   -.018535   .351705   .0116109
+      44522.00   -.017881   .352436   .0091350
+      44523.00   -.017190   .353206   .0066954
+      44524.00   -.016473   .354013   .0043126
+      44525.00   -.015748   .354848   .0019960
+      44526.00   -.015032   .355706  -.0002604
+      44527.00   -.014340   .356578  -.0024781
+      44528.00   -.013690   .357455  -.0046917
+      44529.00   -.013099   .358326  -.0069477
+      44530.00   -.012591   .359173  -.0093009
+      44531.00   -.012196   .359957  -.0118060
+      44532.00   -.011860   .360634  -.0145143
+      44533.00   -.011534   .361203  -.0174444
+      44534.00   -.011167   .361676  -.0205670
+      44535.00   -.010731   .362085  -.0237945
+      44536.00   -.010254   .362467  -.0270050
+      44537.00   -.009746   .362830  -.0300888
+      44538.00   -.009207   .363175  -.0329788
+      44539.00   -.008637   .363503  -.0356645
+      44540.00   -.008038   .363816  -.0381850
+      44541.00   -.007413   .364115  -.0406058
+      44542.00   -.006765   .364402  -.0429935
+      44543.00   -.006092   .364677  -.0453991
+      44544.00   -.005390   .364943  -.0478520
+      44545.00   -.004658   .365200  -.0503616
+      44546.00   -.003896   .365451  -.0529205
+      44547.00   -.003106   .365698  -.0555091
+      44548.00   -.002287   .365945  -.0581001
+      44549.00   -.001437   .366193  -.0606628
+      44550.00   -.000553   .366443  -.0631675
+      44551.00    .000371   .366696  -.0655907
+      44552.00    .001340   .366953  -.0679193
+      44553.00    .002361   .367214  -.0701540
+      44554.00    .003438   .367480  -.0723119
+      44555.00    .004576   .367750  -.0744269
+      44556.00    .005773   .368025  -.0765465
+      44557.00    .007027   .368305  -.0787259
+      44558.00    .008338   .368590  -.0810214
+      44559.00    .009704   .368879  -.0834809
+      44560.00    .011124   .369171  -.0861313
+      44561.00    .012595   .369466  -.0889644
+      44562.00    .014116   .369758  -.0919282
+      44563.00    .015682   .370042  -.0949346
+      44564.00    .017292   .370316  -.0978809
+      44565.00    .018944   .370574  -.1006828
+      44566.00    .020631   .370816  -.1033006
+      44567.00    .022349   .371039  -.1057468
+      44568.00    .024091   .371242  -.1080740
+      44569.00    .025851   .371423  -.1103500
+      44570.00    .027614   .371580  -.1126341
+      44571.00    .029368   .371712  -.1149645
+      44572.00    .031095   .371818  -.1173563
+      44573.00    .032776   .371896  -.1198056
+      44574.00    .034394   .371947  -.1222956
+      44575.00    .035930   .371968  -.1248005
+      44576.00    .037371   .371959  -.1272907
+      44577.00    .038728   .371917  -.1297379
+      44578.00    .040017   .371841  -.1321190
+      44579.00    .041254   .371728  -.1344185
+      44580.00    .042454   .371577  -.1366321
+      44581.00    .043634   .371385  -.1387701
+      44582.00    .044806   .371153  -.1408587
+      44583.00    .045978   .370882  -.1429387
+      44584.00    .047160   .370575  -.1450613
+      44585.00    .048360   .370233  -.1472792
+      44586.00    .049583   .369860  -.1496355
+      44587.00    .050829   .369458  -.1521542
+      44588.00    .052094   .369033  -.1548320
+      44589.00    .053373   .368587  -.1576339
+      44590.00    .054663   .368127  -.1604947
+      44591.00    .055958   .367656  -.1633315
+      44592.00    .057255   .367181  -.1660643
+      44593.00    .058546   .366708  -.1686409
+      44594.00    .059819   .366243  -.1710521
+      44595.00    .061068   .365777  -.1733318
+      44596.00    .062292   .365303  -.1755406
+      44597.00    .063487   .364811  -.1777423
+      44598.00    .064652   .364297  -.1799847
+      44599.00    .065782   .363758  -.1822914
+      44600.00    .066876   .363194  -.1846637
+      44601.00    .067929   .362608  -.1870873
+      44602.00    .068940   .362000  -.1895385
+      44603.00    .069905   .361371  -.1919885
+      44604.00    .070820   .360722  -.1944082
+      44605.00    .071683   .360054  -.1967724
+      44606.00    .072490   .359365  -.1990643
+      44607.00    .073235   .358658  -.2012778
+      44608.00    .073915   .357930  -.2034193
+      44609.00    .074525   .357183  -.2055098
+      44610.00    .075064   .356414  -.2075860
+      44611.00    .075536   .355623  -.2096986
+      44612.00    .075945   .354805  -.2119034
+      44613.00    .076296   .353958  -.2142488
+      44614.00    .076594   .353079  -.2167605
+      44615.00    .076842   .352166  -.2194331
+      44616.00    .077049   .351219  -.2222276
+      44617.00    .077220   .350241  -.2250792
+      44618.00    .077364   .349233  -.2279115
+      44619.00    .077487   .348200  -.2306522
+      44620.00    .077597   .347144  -.2332501
+      44621.00    .077698   .346074  -.2356873
+      44622.00    .077796   .345000  -.2379834
+      44623.00    .077897   .343929  -.2401875
+      44624.00    .078006   .342872  -.2423598
+      44625.00    .078128   .341837  -.2445519
+      44626.00    .078270   .340832  -.2467935
+      44627.00    .078438   .339867  -.2490897
+      44628.00    .078639   .338947  -.2514260
+      44629.00    .078874   .338070  -.2537780
+      44630.00    .079143   .337230  -.2561161
+      44631.00    .079447   .336422  -.2584095
+      44632.00    .079787   .335641  -.2606311
+      44633.00    .080160   .334884  -.2627623
+      44634.00    .080567   .334149  -.2647967
+      44635.00    .081002   .333433  -.2667414
+      44636.00    .081459   .332735  -.2686169
+      44637.00    .081926   .332049  -.2704577
+      44638.00    .082394   .331372  -.2723128
+      44639.00    .082853   .330701  -.2742421
+      44640.00    .083296   .330031  -.2763049
+      44641.00    .083721   .329357  -.2785419
+      44642.00    .084131   .328675  -.2809579
+      44643.00    .084534   .327978  -.2835154
+      44644.00    .084935   .327264  -.2861427
+      44645.00    .085339   .326526  -.2887526
+      44646.00    .085753   .325761  -.2912661
+      44647.00    .086171   .324966  -.2936321
+      44648.00    .086582   .324142  -.2958376
+      44649.00    .086975   .323288  -.2979063
+      44650.00    .087342   .322406  -.2998904
+      44651.00    .087683   .321500  -.3018556
+      44652.00    .087995   .320574  -.3038641
+      44653.00    .088275   .319631  -.3059601
+      44654.00    .088523   .318674  -.3081632
+      44655.00    .088735   .317707  -.3104694
+      44656.00    .088911   .316734  -.3128585
+      44657.00    .089055   .315759  -.3153014
+      44658.00    .089169   .314787  -.3177663
+      44659.00    .089258   .313822  -.3202234
+      44660.00    .089324   .312869  -.3226500
+      44661.00    .089374   .311931  -.3250343
+      44662.00    .089414   .311013  -.3273788
+      44663.00    .089444   .310118  -.3297000
+      44664.00    .089465   .309250  -.3320271
+      44665.00    .089485   .308410  -.3343997
+      44666.00    .089511   .307600  -.3368684
+      44667.00    .089556   .306819  -.3394912
+      44668.00    .089628   .306068  -.3423190
+      44669.00    .089735   .305347  -.3453741
+      44670.00    .089884   .304656  -.3486333
+      44671.00    .090081   .303995  -.3520246
+      44672.00    .090330   .303357  -.3554424
+      44673.00    .090635   .302736  -.3587773
+      44674.00    .090999   .302126  -.3619463
+      44675.00    .091420   .301521  -.3649125
+      44676.00    .091892   .300917  -.3676865
+      44677.00    .092409   .300309  -.3703147
+      44678.00    .092963   .299696  -.3728610
+      44679.00    .093548   .299077  -.3753878
+      44680.00    .094158   .298450  -.3779422
+      44681.00    .094786   .297814  -.3805484
+      44682.00    .095427   .297169  -.3832082
+      44683.00    .096077   .296513  -.3859045
+      44684.00    .096730   .295846  -.3886086
+      44685.00    .097382   .295168  -.3912862
+      44686.00    .098029   .294476  -.3939040
+      44687.00    .098666   .293764  -.3964337
+      44688.00    .099288   .293029  -.3988580
+      44689.00    .099892   .292266  -.4011740
+      44690.00    .100472   .291472  -.4033956
+      44691.00    .101022   .290643  -.4055526
+      44692.00    .101536   .289778  -.4076876
+      44693.00    .102008   .288877  -.4098543
+      44694.00    .102433   .287939  -.4121152
+      44695.00    .102804   .286963  -.4145355
+      44696.00    .103118   .285951  -.4171670
+      44697.00    .103374   .284904  -.4200277
+      44698.00    .103570   .283826  -.4230844
+      44699.00    .103706   .282720  -.4262527
+      44700.00    .103787   .281591  -.4294194
+      44701.00    .103815   .280444  -.4324794
+      44702.00    .103796   .279284  -.4353684
+      44703.00    .103731   .278118  -.4380784
+      44704.00    .103622   .276950  -.4406514
+      44705.00    .103472   .275789  -.4431571
+      44706.00    .103281   .274641  -.4456681
+      44707.00    .103048   .273513  -.4482414
+      44708.00    .102772   .272412  -.4509090
+      44709.00    .102451   .271342  -.4536782
+      44710.00    .102084   .270310  -.4565359
+      44711.00    .101671   .269319  -.4594538
+      44712.00    .101215   .268373  -.4623949
+      44713.00    .100723   .267472  -.4653187
+      44714.00    .100204   .266611  -.4681860
+      44715.00    .099670   .265784  -.4709654
+      44716.00    .099132   .264986  -.4736384
+      44717.00    .098598   .264212  -.4762027
+      44718.00    .098078   .263458  -.4786745
+      44719.00    .097577   .262721  -.4810851
+      44720.00    .097098   .262000  -.4834781
+      44721.00    .096643   .261292  -.4859053
+      44722.00    .096213   .260597  -.4884219
+      44723.00    .095810   .259912  -.4910793
+      44724.00    .095437   .259235  -.4939106
+      44725.00    .095099   .258566  -.4969117
+      44726.00    .094796   .257901  -.5000299
+      44727.00    .094526   .257240  -.5031687
+      44728.00    .094287   .256579  -.5062135
+      44729.00    .094077   .255917  -.5090697
+      44730.00    .093897   .255250  -.5116939
+      44731.00    .093746   .254576  -.5141026
+      44732.00    .093621   .253891  -.5163592
+      44733.00    .093517   .253193  -.5185444
+      44734.00    .093428   .252480  -.5207305
+      44735.00    .093349   .251752  -.5229648
+      44736.00    .093274   .251007  -.5252670
+      44737.00    .093197   .250245  -.5276341
+      44738.00    .093113   .249466  -.5300478
+      44739.00    .093014   .248669  -.5324811
+      44740.00    .092896   .247853  -.5349032
+      44741.00    .092753   .247018  -.5372836
+      44742.00    .092580   .246162  -.5395967
+      44743.00    .092374   .245286  -.5418269
+      44744.00    .092128   .244389  -.5439719
+      44745.00    .091841   .243473  -.5460448
+      44746.00    .091507   .242539  -.5480747
+      44747.00    .091128   .241590  -.5501027
+      44748.00    .090703   .240630  -.5521769
+      44749.00    .090233   .239660  -.5543473
+      44750.00    .089719   .238686  -.5566596
+      44751.00    .089165   .237709  -.5591475
+      44752.00    .088574   .236737  -.5618204
+      44753.00    .087953   .235775  -.5646512
+      44754.00    .087307   .234829  -.5675712
+      44755.00    .086642   .233906  -.5704801
+      44756.00    .085963   .233012  -.5732731
+      44757.00    .085277   .232152  -.5758756
+      44758.00    .084589   .231328  -.5782669
+      44759.00    .083908   .230536  -.5804817
+      44760.00    .083242   .229771  -.5825897
+      44761.00    .082595   .229030  -.5846656
+      44762.00    .081969   .228306  -.5867638
+      44763.00    .081359   .227593  -.5889077
+      44764.00    .080762   .226886  -.5910926
+      44765.00    .080177   .226178  -.5932950
+      44766.00    .079601   .225466  -.5954823
+      44767.00    .079033   .224744  -.5976188
+      44768.00    .078473   .224009  -.5996709
+      44769.00    .077923   .223258  -.6016105
+      44770.00    .077383   .222489  -.6034192
+      44771.00    .076854   .221699  -.6050920
+      44772.00    .076331   .220890  -.6066392
+      44773.00    .075810   .220065  -.6080868
+      44774.00    .075287   .219227  -.6094747
+      44775.00    .074760   .218381  -.6108528
+      44776.00    .074228   .217529  -.6122734
+      44777.00    .073692   .216671  -.6137833
+      44778.00    .073151   .215806  -.6154147
+      44779.00    .072607   .214934  -.6171786
+      44780.00    .072064   .214053  -.6190588
+      44781.00    .071529   .213163  -.6210088
+      44782.00    .071005   .212264  -.6229551
+      44783.00    .070500   .211356  -.6248128
+      44784.00    .070017   .210444  -.6265089
+      44785.00    .069562   .209527  -.6280070
+      44786.00    .069135   .208610   .3706787
+      44787.00    .068727   .207692   .3694899
+      44788.00    .068327   .206774   .3683480
+      44789.00    .067935   .205857   .3671843
+      44790.00    .067552   .204942   .3659587
+      44791.00    .067176   .204031   .3646653
+      44792.00    .066808   .203123   .3633237
+      44793.00    .066442   .202222   .3619672
+      44794.00    .066073   .201328   .3606327
+      44795.00    .065696   .200444   .3593538
+      44796.00    .065302   .199571   .3581575
+      44797.00    .064885   .198710   .3570599
+      44798.00    .064440   .197866   .3560642
+      44799.00    .063959   .197041   .3551590
+      44800.00    .063435   .196238   .3543187
+      44801.00    .062865   .195458   .3535035
+      44802.00    .062243   .194704   .3526621
+      44803.00    .061567   .193973   .3517366
+      44804.00    .060837   .193262   .3506726
+      44805.00    .060054   .192568   .3494308
+      44806.00    .059219   .191888   .3479970
+      44807.00    .058334   .191218   .3463884
+      44808.00    .057398   .190553   .3446521
+      44809.00    .056412   .189891   .3428561
+      44810.00    .055375   .189230   .3410767
+      44811.00    .054287   .188569   .3393814
+      44812.00    .053147   .187908   .3378102
+      44813.00    .051952   .187248   .3363637
+      44814.00    .050703   .186592   .3350022
+      44815.00    .049399   .185946   .3336592
+      44816.00    .048043   .185316   .3322658
+      44817.00    .046639   .184711   .3307738
+      44818.00    .045190   .184134   .3291684
+      44819.00    .043700   .183590   .3274667
+      44820.00    .042171   .183082   .3257067
+      44821.00    .040604   .182613   .3239344
+      44822.00    .039001   .182187   .3221940
+      44823.00    .037364   .181810   .3205223
+      44824.00    .035693   .181488   .3189449
+      44825.00    .033992   .181224   .3174735
+      44826.00    .032265   .181021   .3161045
+      44827.00    .030516   .180881   .3148191
+      44828.00    .028750   .180802   .3135857
+      44829.00    .026974   .180777   .3123613
+      44830.00    .025195   .180800   .3110942
+      44831.00    .023416   .180862   .3097288
+      44832.00    .021640   .180959   .3082181
+      44833.00    .019869   .181085   .3065392
+      44834.00    .018106   .181235   .3047050
+      44835.00    .016361   .181406   .3027657
+      44836.00    .014640   .181598   .3007986
+      44837.00    .012948   .181808   .2988884
+      44838.00    .011288   .182037   .2971055
+      44839.00    .009661   .182284   .2954891
+      44840.00    .008067   .182551   .2940387
+      44841.00    .006502   .182837   .2927164
+      44842.00    .004967   .183144   .2914576
+      44843.00    .003459   .183472   .2901894
+      44844.00    .001971   .183822   .2888507
+      44845.00    .000498   .184192   .2874083
+      44846.00   -.000964   .184580   .2858615
+      44847.00   -.002421   .184983   .2842370
+      44848.00   -.003878   .185399   .2825765
+      44849.00   -.005341   .185825   .2809244
+      44850.00   -.006820   .186262   .2793189
+      44851.00   -.008321   .186711   .2777869
+      44852.00   -.009847   .187177   .2763411
+      44853.00   -.011401   .187664   .2749774
+      44854.00   -.012986   .188175   .2736749
+      44855.00   -.014601   .188708   .2723988
+      44856.00   -.016248   .189263   .2711036
+      44857.00   -.017925   .189838   .2697354
+      44858.00   -.019633   .190433   .2682354
+      44859.00   -.021374   .191049   .2665468
+      44860.00   -.023145   .191686   .2646284
+      44861.00   -.024947   .192346   .2624718
+      44862.00   -.026777   .193028   .2601132
+      44863.00   -.028635   .193735   .2576309
+      44864.00   -.030519   .194466   .2551270
+      44865.00   -.032426   .195223   .2526969
+      44866.00   -.034352   .196006   .2504021
+      44867.00   -.036297   .196814   .2482567
+      44868.00   -.038258   .197645   .2462289
+      44869.00   -.040233   .198500   .2442564
+      44870.00   -.042219   .199377   .2422674
+      44871.00   -.044215   .200276   .2402008
+      44872.00   -.046217   .201196   .2380198
+      44873.00   -.048222   .202137   .2357184
+      44874.00   -.050225   .203100   .2333195
+      44875.00   -.052222   .204084   .2308657
+      44876.00   -.054203   .205092   .2284081
+      44877.00   -.056160   .206123   .2259958
+      44878.00   -.058084   .207180   .2236689
+      44879.00   -.059970   .208266   .2214526
+      44880.00   -.061812   .209382   .2193548
+      44881.00   -.063603   .210532   .2173644
+      44882.00   -.065341   .211718   .2154516
+      44883.00   -.067020   .212941   .2135733
+      44884.00   -.068636   .214202   .2116786
+      44885.00   -.070186   .215504   .2097112
+      44886.00   -.071670   .216846   .2076132
+      44887.00   -.073087   .218228   .2053325
+      44888.00   -.074442   .219649   .2028375
+      44889.00   -.075740   .221105   .2001341
+      44890.00   -.076987   .222593   .1972769
+      44891.00   -.078189   .224110   .1943629
+      44892.00   -.079350   .225653   .1915051
+      44893.00   -.080477   .227218   .1887956
+      44894.00   -.081573   .228801   .1862774
+      44895.00   -.082642   .230398   .1839350
+      44896.00   -.083687   .232006   .1817077
+      44897.00   -.084709   .233618   .1795157
+      44898.00   -.085710   .235233   .1772865
+      44899.00   -.086693   .236845   .1749720
+      44900.00   -.087659   .238452   .1725556
+      44901.00   -.088611   .240050   .1700496
+      44902.00   -.089553   .241637   .1674868
+      44903.00   -.090490   .243214   .1649119
+      44904.00   -.091427   .244778   .1623716
+      44905.00   -.092366   .246330   .1599077
+      44906.00   -.093305   .247871   .1575515
+      44907.00   -.094240   .249406   .1553197
+      44908.00   -.095166   .250935   .1532109
+      44909.00   -.096079   .252462   .1512050
+      44910.00   -.096977   .253991   .1492653
+      44911.00   -.097855   .255525   .1473445
+      44912.00   -.098712   .257066   .1453902
+      44913.00   -.099541   .258616   .1433488
+      44914.00   -.100337   .260174   .1411696
+      44915.00   -.101093   .261743   .1388120
+      44916.00   -.101804   .263326   .1362590
+      44917.00   -.102468   .264926   .1335327
+      44918.00   -.103083   .266547   .1307020
+      44919.00   -.103648   .268194   .1278706
+      44920.00   -.104163   .269872   .1251477
+      44921.00   -.104631   .271582   .1226108
+      44922.00   -.105057   .273331   .1202790
+      44923.00   -.105442   .275117   .1181126
+      44924.00   -.105788   .276940   .1160345
+      44925.00   -.106093   .278798   .1139627
+      44926.00   -.106359   .280687   .1118375
+      44927.00   -.106590   .282607   .1096341
+      44928.00   -.106792   .284556   .1073603
+      44929.00   -.106971   .286533   .1050456
+      44930.00   -.107133   .288535   .1027286
+      44931.00   -.107280   .290560   .1004497
+      44932.00   -.107416   .292608   .0982459
+      44933.00   -.107540   .294677   .0961454
+      44934.00   -.107648   .296764   .0941645
+      44935.00   -.107733   .298869   .0923040
+      44936.00   -.107791   .300991   .0905479
+      44937.00   -.107815   .303127   .0888633
+      44938.00   -.107800   .305278   .0872040
+      44939.00   -.107740   .307440   .0855165
+      44940.00   -.107632   .309614   .0837467
+      44941.00   -.107476   .311800   .0818456
+      44942.00   -.107274   .314001   .0797734
+      44943.00   -.107030   .316218   .0775061
+      44944.00   -.106757   .318450   .0750458
+      44945.00   -.106473   .320697   .0724298
+      44946.00   -.106199   .322958   .0697333
+      44947.00   -.105953   .325231   .0670535
+      44948.00   -.105744   .327514   .0644823
+      44949.00   -.105574   .329807   .0620725
+      44950.00   -.105442   .332106   .0598174
+      44951.00   -.105335   .334407   .0576587
+      44952.00   -.105240   .336708   .0555139
+      44953.00   -.105141   .339004   .0533108
+      44954.00   -.105022   .341291   .0510120
+      44955.00   -.104869   .343568   .0486201
+      44956.00   -.104667   .345832   .0461677
+      44957.00   -.104404   .348081   .0437014
+      44958.00   -.104069   .350313   .0412683
+      44959.00   -.103653   .352526   .0389087
+      44960.00   -.103155   .354720   .0366522
+      44961.00   -.102571   .356893   .0345166
+      44962.00   -.101899   .359045   .0325064
+      44963.00   -.101139   .361177   .0306103
+      44964.00   -.100290   .363287   .0288017
+      44965.00   -.099351   .365377   .0270397
+      44966.00   -.098323   .367444   .0252743
+      44967.00   -.097204   .369491   .0234518
+      44968.00   -.095993   .371516   .0215243
+      44969.00   -.094684   .373520   .0194563
+      44970.00   -.093270   .375504   .0172296
+      44971.00   -.091756   .377467   .0148474
+      44972.00   -.090151   .379406   .0123377
+      44973.00   -.088467   .381320   .0097557
+      44974.00   -.086713   .383207   .0071781
+      44975.00   -.084900   .385064   .0046864
+      44976.00   -.083037   .386892   .0023421
+      44977.00   -.081135   .388691   .0001620
+      44978.00   -.079203   .390460  -.0018896
+      44979.00   -.077248   .392198  -.0038869
+      44980.00   -.075276   .393905  -.0059126
+      44981.00   -.073292   .395579  -.0080250
+      44982.00   -.071301   .397219  -.0102397
+      44983.00   -.069308   .398823  -.0125318
+      44984.00   -.067313   .400393  -.0148514
+      44985.00   -.065316   .401928  -.0171431
+      44986.00   -.063321   .403428  -.0193587
+      44987.00   -.061331   .404895  -.0214634
+      44988.00   -.059352   .406328  -.0234369
+      44989.00   -.057388   .407730  -.0252742
+      44990.00   -.055443   .409100  -.0269851
+      44991.00   -.053521   .410441  -.0285942
+      44992.00   -.051625   .411754  -.0301393
+      44993.00   -.049757   .413040  -.0316687
+      44994.00   -.047923   .414302  -.0332374
+      44995.00   -.046124   .415539  -.0348993
+      44996.00   -.044360   .416754  -.0366974
+      44997.00   -.042622   .417944  -.0386546
+      44998.00   -.040900   .419110  -.0407674
+      44999.00   -.039185   .420248  -.0430055
+      45000.00   -.037469   .421359  -.0453154
+      45001.00   -.035743   .422440  -.0476297
+      45002.00   -.033998   .423491  -.0498798
+      45003.00   -.032228   .424510  -.0520130
+      45004.00   -.030426   .425498  -.0540096
+      45005.00   -.028587   .426453  -.0558938
+      45006.00   -.026708   .427377  -.0577298
+      45007.00   -.024782   .428269  -.0596014
+      45008.00   -.022809   .429130  -.0615825
+      45009.00   -.020783   .429960  -.0637115
+      45010.00   -.018701   .430758  -.0659818
+      45011.00   -.016564   .431527  -.0683497
+      45012.00   -.014371   .432269  -.0707537
+      45013.00   -.012124   .432987  -.0731338
+      45014.00   -.009825   .433684  -.0754433
+      45015.00   -.007476   .434361  -.0776534
+      45016.00   -.005079   .435019  -.0797529
+      45017.00   -.002636   .435659  -.0817487
+      45018.00   -.000144   .436282  -.0836642
+      45019.00    .002399   .436885  -.0855371
+      45020.00    .004994   .437468  -.0874157
+      45021.00    .007642   .438026  -.0893546
+      45022.00    .010346   .438557  -.0914086
+      45023.00    .013106   .439060  -.0936249
+      45024.00    .015915   .439529  -.0960319
+      45025.00    .018763   .439959  -.0986291
+      45026.00    .021638   .440346  -.1013812
+      45027.00    .024531   .440682  -.1042217
+      45028.00    .027431   .440966  -.1070648
+      45029.00    .030329   .441192  -.1098255
+      45030.00    .033215   .441358  -.1124409
+      45031.00    .036080   .441461  -.1148853
+      45032.00    .038915   .441502  -.1171751
+      45033.00    .041713   .441483  -.1193640
+      45034.00    .044468   .441406  -.1215290
+      45035.00    .047179   .441276  -.1237490
+      45036.00    .049845   .441095  -.1260787
+      45037.00    .052468   .440866  -.1285333
+      45038.00    .055050   .440593  -.1310860
+      45039.00    .057596   .440277  -.1336814
+      45040.00    .060110   .439922  -.1362541
+      45041.00    .062597   .439531  -.1387466
+      45042.00    .065059   .439108  -.1411186
+      45043.00    .067495   .438656  -.1433509
+      45044.00    .069900   .438180  -.1454461
+      45045.00    .072266   .437682  -.1474266
+      45046.00    .074588   .437168  -.1493315
+      45047.00    .076865   .436637  -.1512116
+      45048.00    .079099   .436091  -.1531232
+      45049.00    .081299   .435531  -.1551240
+      45050.00    .083474   .434956  -.1572687
+      45051.00    .085634   .434365  -.1596019
+      45052.00    .087787   .433758  -.1621463
+      45053.00    .089939   .433136  -.1648898
+      45054.00    .092088   .432499  -.1677794
+      45055.00    .094233   .431849  -.1707293
+      45056.00    .096372   .431186  -.1736428
+      45057.00    .098502   .430514  -.1764405
+      45058.00    .100624   .429830  -.1790828
+      45059.00    .102737   .429134  -.1815781
+      45060.00    .104842   .428425  -.1839775
+      45061.00    .106941   .427702  -.1863567
+      45062.00    .109031   .426961  -.1887936
+      45063.00    .111112   .426199  -.1913466
+      45064.00    .113181   .425415  -.1940409
+      45065.00    .115237   .424605  -.1968630
+      45066.00    .117279   .423766  -.1997669
+      45067.00    .119306   .422896  -.2026883
+      45068.00    .121322   .421994  -.2055617
+      45069.00    .123331   .421059  -.2083333
+      45070.00    .125337   .420090  -.2109687
+      45071.00    .127343   .419085  -.2134548
+      45072.00    .129354   .418044  -.2158001
+      45073.00    .131372   .416966  -.2180335
+      45074.00    .133400   .415850  -.2202005
+      45075.00    .135437   .414696  -.2223560
+      45076.00    .137486   .413503  -.2245576
+      45077.00    .139544   .412274  -.2268617
+      45078.00    .141609   .411007  -.2293184
+      45079.00    .143679   .409704  -.2319647
+      45080.00    .145750   .408365  -.2348120
+      45081.00    .147821   .406989  -.2378327
+      45082.00    .149889   .405577  -.2409566
+      45083.00    .151952   .404127  -.2440824
+      45084.00    .154008   .402641  -.2471068
+      45085.00    .156054   .401118  -.2499578
+      45086.00    .158087   .399556  -.2526180
+      45087.00    .160102   .397954  -.2551261
+      45088.00    .162096   .396311  -.2575582
+      45089.00    .164065   .394625  -.2599978
+      45090.00    .166004   .392896  -.2625100
+      45091.00    .167910   .391120  -.2651262
+      45092.00    .169780   .389297  -.2678408
+      45093.00    .171613   .387425  -.2706173
+      45094.00    .173407   .385501  -.2733995
+      45095.00    .175159   .383526  -.2761253
+      45096.00    .176870   .381499  -.2787385
+      45097.00    .178538   .379421  -.2811970
+      45098.00    .180164   .377297  -.2834795
+      45099.00    .181745   .375131  -.2855857
+      45100.00    .183283   .372928  -.2875363
+      45101.00    .184779   .370692  -.2893706
+      45102.00    .186242   .368423  -.2911426
+      45103.00    .187678   .366121  -.2929113
+      45104.00    .189092   .363786  -.2947347
+      45105.00    .190487   .361416  -.2966654
+      45106.00    .191868   .359012  -.2987462
+      45107.00    .193238   .356574  -.3010038
+      45108.00    .194605   .354105  -.3034383
+      45109.00    .195973   .351604  -.3060123
+      45110.00    .197343   .349077  -.3086493
+      45111.00    .198718   .346526  -.3112500
+      45112.00    .200099   .343956  -.3137251
+      45113.00    .201486   .341371  -.3160281
+      45114.00    .202880   .338771  -.3181723
+      45115.00    .204280   .336160  -.3202241
+      45116.00    .205687   .333541  -.3222740
+      45117.00    .207099   .330914  -.3244012
+      45118.00    .208516   .328282  -.3266486
+      45119.00    .209939   .325647  -.3290153
+      45120.00    .211368   .323011  -.3314653
+      45121.00    .212803   .320375  -.3339430
+      45122.00    .214243   .317740  -.3363887
+      45123.00    .215683   .315108  -.3387481
+      45124.00    .217119   .312481  -.3409797
+      45125.00    .218546   .309859  -.3430580
+      45126.00    .219954   .307245  -.3449760
+      45127.00    .221334   .304638  -.3467460
+      45128.00    .222672   .302037  -.3483989
+      45129.00    .223952   .299440  -.3499803
+      45130.00    .225160   .296844  -.3515439
+      45131.00    .226281   .294244  -.3531437
+      45132.00    .227300   .291637  -.3548271
+      45133.00    .228203   .289017  -.3566297
+      45134.00    .228977   .286377  -.3585730
+      45135.00    .229609   .283712  -.3606600
+      45136.00    .230087   .281016  -.3628686
+      45137.00    .230396   .278281  -.3651449
+      45138.00    .230535   .275502  -.3674097
+      45139.00    .230552   .272663  -.3695846
+      45140.00    .230505   .269756  -.3716098
+      45141.00    .230433   .266803  -.3734581
+      45142.00    .230327   .263830  -.3751547
+      45143.00    .230183   .260847  -.3767764
+      45144.00    .230002   .257860  -.3784170
+      45145.00    .229786   .254873  -.3801438
+      45146.00    .229539   .251890  -.3819751
+      45147.00    .229263   .248915  -.3838827
+      45148.00    .228962   .245950  -.3858102
+      45149.00    .228635   .242994  -.3876947
+      45150.00    .228282   .240048  -.3894825
+      45151.00    .227903   .237109   .6088635
+      45152.00    .227500   .234178   .6073635
+      45153.00    .227071   .231255   .6060205
+      45154.00    .226617   .228339   .6048210
+      45155.00    .226138   .225430   .6037356
+      45156.00    .225636   .222527   .6027209
+      45157.00    .225110   .219631   .6017239
+      45158.00    .224558   .216742   .6006889
+      45159.00    .223980   .213861   .5995655
+      45160.00    .223370   .210992   .5983163
+      45161.00    .222726   .208136   .5969212
+      45162.00    .222040   .205296   .5953796
+      45163.00    .221308   .202475   .5937112
+      45164.00    .220525   .199677   .5919581
+      45165.00    .219686   .196902   .5901832
+      45166.00    .218788   .194154   .5884624
+      45167.00    .217832   .191432   .5868650
+      45168.00    .216819   .188738   .5854280
+      45169.00    .215754   .186071   .5841359
+      45170.00    .214638   .183431   .5829209
+      45171.00    .213479   .180819   .5816866
+      45172.00    .212281   .178235   .5803469
+      45173.00    .211046   .175677   .5788593
+      45174.00    .209779   .173145   .5772372
+      45175.00    .208482   .170639   .5755388
+      45176.00    .207157   .168158   .5738419
+      45177.00    .205807   .165701   .5722188
+      45178.00    .204434   .163268   .5707209
+      45179.00    .203041   .160858   .5693752
+      45180.00    .201628   .158467   .5681868
+      45181.00    .200198   .156095   .5671419
+      45182.00    .198750   .153738   .5662108
+      45183.00    .197283   .151396   .5653507
+      45184.00    .195796   .149065   .5645097
+      45185.00    .194287   .146746   .5636315
+      45186.00    .192753   .144436   .5626608
+      45187.00    .191188   .142138   .5615525
+      45188.00    .189587   .139850   .5602790
+      45189.00    .187942   .137574   .5588353
+      45190.00    .186248   .135311   .5572413
+      45191.00    .184499   .133061   .5555391
+      45192.00    .182691   .130826   .5537867
+      45193.00    .180820   .128606   .5520488
+      45194.00    .178885   .126404   .5503848
+      45195.00    .176885   .124221   .5488306
+      45196.00    .174821   .122061   .5473828
+      45197.00    .172698   .119925   .5459912
+      45198.00    .170519   .117816   .5445700
+      45199.00    .168290   .115737   .5430252
+      45200.00    .166012   .113689   .5412908
+      45201.00    .163690   .111677   .5393529
+      45202.00    .161328   .109701   .5372528
+      45203.00    .158931   .107765   .5350698
+      45204.00    .156504   .105868   .5328919
+      45205.00    .154050   .104013   .5307914
+      45206.00    .151574   .102200   .5288123
+      45207.00    .149075   .100430   .5269696
+      45208.00    .146556   .098701   .5252541
+      45209.00    .144019   .097016   .5236373
+      45210.00    .141467   .095372   .5220765
+      45211.00    .138905   .093769   .5205198
+      45212.00    .136334   .092209   .5189112
+      45213.00    .133756   .090691   .5171961
+      45214.00    .131172   .089216   .5153275
+      45215.00    .128584   .087785   .5132734
+      45216.00    .125988   .086396   .5110245
+      45217.00    .123382   .085050   .5086007
+      45218.00    .120758   .083746   .5060521
+      45219.00    .118109   .082484   .5034506
+      45220.00    .115426   .081262   .5008748
+      45221.00    .112698   .080080   .4983934
+      45222.00    .109909   .078941   .4960501
+      45223.00    .107038   .077844   .4938502
+      45224.00    .104060   .076792   .4917594
+      45225.00    .100941   .075789   .4897097
+      45226.00    .097653   .074836   .4876187
+      45227.00    .094171   .073937   .4854146
+      45228.00    .090519   .073093   .4830529
+      45229.00    .086735   .072309   .4805389
+      45230.00    .082848   .071586   .4779277
+      45231.00    .078886   .070926   .4753023
+      45232.00    .074873   .070329   .4727448
+      45233.00    .070826   .069797   .4703178
+      45234.00    .066765   .069330   .4680526
+      45235.00    .062704   .068926   .4659500
+      45236.00    .058656   .068587   .4639867
+      45237.00    .054630   .068310   .4621210
+      45238.00    .050631   .068095   .4603001
+      45239.00    .046665   .067940   .4584668
+      45240.00    .042735   .067845   .4565644
+      45241.00    .038844   .067806   .4545431
+      45242.00    .034995   .067825   .4523646
+      45243.00    .031186   .067899   .4500084
+      45244.00    .027414   .068028   .4474796
+      45245.00    .023680   .068212   .4448154
+      45246.00    .019981   .068449   .4420846
+      45247.00    .016317   .068737   .4393739
+      45248.00    .012688   .069075   .4367670
+      45249.00    .009093   .069459   .4343200
+      45250.00    .005535   .069887   .4320443
+      45251.00    .002014   .070356   .4299041
+      45252.00   -.001469   .070862   .4278270
+      45253.00   -.004914   .071405   .4257247
+      45254.00   -.008321   .071980   .4235175
+      45255.00   -.011694   .072585   .4211563
+      45256.00   -.015035   .073219   .4186360
+      45257.00   -.018348   .073880   .4159972
+      45258.00   -.021639   .074564   .4133142
+      45259.00   -.024914   .075271   .4106733
+      45260.00   -.028185   .076001   .4081512
+      45261.00   -.031465   .076753   .4057997
+      45262.00   -.034762   .077527   .4036387
+      45263.00   -.038074   .078327   .4016561
+      45264.00   -.041396   .079157   .3998154
+      45265.00   -.044721   .080019   .3980639
+      45266.00   -.048047   .080921   .3963395
+      45267.00   -.051372   .081867   .3945793
+      45268.00   -.054691   .082863   .3927267
+      45269.00   -.058002   .083912   .3907363
+      45270.00   -.061300   .085016   .3885770
+      45271.00   -.064579   .086176   .3862366
+      45272.00   -.067838   .087394   .3837292
+      45273.00   -.071075   .088669   .3811019
+      45274.00   -.074288   .090002   .3784328
+      45275.00   -.077476   .091392   .3758140
+      45276.00   -.080641   .092837   .3733233
+      45277.00   -.083781   .094337   .3709964
+      45278.00   -.086897   .095891   .3688131
+      45279.00   -.089988   .097496   .3667045
+      45280.00   -.093053   .099153   .3645773
+      45281.00   -.096090   .100860   .3623449
+      45282.00   -.099097   .102619   .3599507
+      45283.00   -.102073   .104429   .3573813
+      45284.00   -.105017   .106290   .3546666
+      45285.00   -.107930   .108203   .3518680
+      45286.00   -.110814   .110166   .3490618
+      45287.00   -.113671   .112177   .3463220
+      45288.00   -.116507   .114233   .3437057
+      45289.00   -.119327   .116329   .3412446
+      45290.00   -.122137   .118463   .3389427
+      45291.00   -.124937   .120632   .3367799
+      45292.00   -.127729   .122834   .3347163
+      45293.00   -.130510   .125067   .3326984
+      45294.00   -.133273   .127330   .3306678
+      45295.00   -.136016   .129623   .3285691
+      45296.00   -.138730   .131948   .3263564
+      45297.00   -.141410   .134311   .3239977
+      45298.00   -.144048   .136713   .3214765
+      45299.00   -.146643   .139159   .3187951
+      45300.00   -.149194   .141652   .3159804
+      45301.00   -.151702   .144196   .3130895
+      45302.00   -.154167   .146794   .3102055
+      45303.00   -.156589   .149450   .3074182
+      45304.00   -.158966   .152166   .3047930
+      45305.00   -.161296   .154943   .3023427
+      45306.00   -.163575   .157781   .3000190
+      45307.00   -.165800   .160681   .2977304
+      45308.00   -.167968   .163642   .2953770
+      45309.00   -.170080   .166663   .2928865
+      45310.00   -.172133   .169742   .2902369
+      45311.00   -.174126   .172880   .2874545
+      45312.00   -.176059   .176075   .2845995
+      45313.00   -.177931   .179324   .2817447
+      45314.00   -.179743   .182626   .2789577
+      45315.00   -.181493   .185976   .2762903
+      45316.00   -.183181   .189370   .2737720
+      45317.00   -.184801   .192806   .2714093
+      45318.00   -.186349   .196277   .2691863
+      45319.00   -.187819   .199780   .2670684
+      45320.00   -.189206   .203308   .2650073
+      45321.00   -.190511   .206851   .2629497
+      45322.00   -.191733   .210394   .2608427
+      45323.00   -.192882   .213927   .2586404
+      45324.00   -.193966   .217450   .2563087
+      45325.00   -.194995   .220960   .2538298
+      45326.00   -.195974   .224458   .2512028
+      45327.00   -.196909   .227945   .2484449
+      45328.00   -.197805   .231421   .2455952
+      45329.00   -.198664   .234887   .2427162
+      45330.00   -.199490   .238344   .2398866
+      45331.00   -.200286   .241793   .2371797
+      45332.00   -.201053   .245236   .2346342
+      45333.00   -.201797   .248673   .2322319
+      45334.00   -.202517   .252106   .2298981
+      45335.00   -.203212   .255534   .2275282
+      45336.00   -.203881   .258959   .2250294
+      45337.00   -.204519   .262381   .2223567
+      45338.00   -.205125   .265800   .2195252
+      45339.00   -.205695   .269217   .2165984
+      45340.00   -.206227   .272632   .2136601
+      45341.00   -.206714   .276045   .2107876
+      45342.00   -.207150   .279453   .2080355
+      45343.00   -.207528   .282860   .2054302
+      45344.00   -.207840   .286269   .2029718
+      45345.00   -.208081   .289686   .2006395
+      45346.00   -.208244   .293116   .1983961
+      45347.00   -.208322   .296563   .1961929
+      45348.00   -.208311   .300030   .1939732
+      45349.00   -.208208   .303518   .1916788
+      45350.00   -.208010   .307029   .1892581
+      45351.00   -.207718   .310562   .1866722
+      45352.00   -.207328   .314118   .1839011
+      45353.00   -.206842   .317697   .1809453
+      45354.00   -.206262   .321296   .1778254
+      45355.00   -.205593   .324915   .1745799
+      45356.00   -.204842   .328552   .1712638
+      45357.00   -.204017   .332205   .1679448
+      45358.00   -.203126   .335874   .1646928
+      45359.00   -.202180   .339560   .1615602
+      45360.00   -.201190   .343261   .1585570
+      45361.00   -.200166   .346978   .1556373
+      45362.00   -.199118   .350711   .1527105
+      45363.00   -.198059   .354459   .1496744
+      45364.00   -.196995   .358220   .1464584
+      45365.00   -.195926   .361986   .1430533
+      45366.00   -.194851   .365751   .1395149
+      45367.00   -.193771   .369508   .1359409
+      45368.00   -.192684   .373250   .1324362
+      45369.00   -.191588   .376969   .1290835
+      45370.00   -.190484   .380659   .1259296
+      45371.00   -.189367   .384312   .1229869
+      45372.00   -.188234   .387921   .1202404
+      45373.00   -.187082   .391479   .1176558
+      45374.00   -.185908   .394981   .1151858
+      45375.00   -.184713   .398433   .1127737
+      45376.00   -.183498   .401844   .1103595
+      45377.00   -.182269   .405222   .1078857
+      45378.00   -.181029   .408577   .1053057
+      45379.00   -.179780   .411914   .1025905
+      45380.00   -.178518   .415234   .0997325
+      45381.00   -.177241   .418537   .0967476
+      45382.00   -.175944   .421823   .0936712
+      45383.00   -.174625   .425092   .0905532
+      45384.00   -.173282   .428344   .0874499
+      45385.00   -.171913   .431577   .0844157
+      45386.00   -.170518   .434794   .0814906
+      45387.00   -.169096   .437994   .0786836
+      45388.00   -.167646   .441179   .0759597
+      45389.00   -.166167   .444350   .0732408
+      45390.00   -.164660   .447507   .0704274
+      45391.00   -.163125   .450652   .0674296
+      45392.00   -.161563   .453782   .0642052
+      45393.00   -.159973   .456896   .0607805
+      45394.00   -.158356   .459991   .0572429
+      45395.00   -.156711   .463065   .0537102
+      45396.00   -.155027   .466114   .0502915
+      45397.00   -.153292   .469131   .0470614
+      45398.00   -.151495   .472111   .0440498
+      45399.00   -.149620   .475047   .0412480
+      45400.00   -.147661   .477937   .0386193
+      45401.00   -.145613   .480781   .0361107
+      45402.00   -.143471   .483580   .0336612
+      45403.00   -.141231   .486336   .0312083
+      45404.00   -.138889   .489050   .0286930
+      45405.00   -.136442   .491725   .0260663
+      45406.00   -.133885   .494364   .0232944
+      45407.00   -.131210   .496969   .0203649
+      45408.00   -.128410   .499543   .0172904
+      45409.00   -.125478   .502086   .0141085
+      45410.00   -.122418   .504602   .0108778
+      45411.00   -.119235   .507091   .0076674
+      45412.00   -.115937   .509555   .0045425
+      45413.00   -.112530   .511993   .0015490
+      45414.00   -.109022   .514404  -.0012990
+      45415.00   -.105420   .516789  -.0040274
+      45416.00   -.101731   .519147  -.0067025
+      45417.00   -.097962   .521477  -.0094192
+      45418.00   -.094119   .523776  -.0122760
+      45419.00   -.090209   .526043  -.0153433
+      45420.00   -.086237   .528276  -.0186359
+      45421.00   -.082209   .530471  -.0221034
+      45422.00   -.078130   .532621  -.0256461
+      45423.00   -.074009   .534721  -.0291468
+      45424.00   -.069850   .536763  -.0325059
+      45425.00   -.065659   .538743  -.0356630
+      45426.00   -.061440   .540657  -.0386029
+      45427.00   -.057195   .542501  -.0413476
+      45428.00   -.052928   .544268  -.0439429
+      45429.00   -.048642   .545956  -.0464476
+      45430.00   -.044341   .547559  -.0489244
+      45431.00   -.040027   .549075  -.0514330
+      45432.00   -.035702   .550499  -.0540247
+      45433.00   -.031369   .551829  -.0567364
+      45434.00   -.027031   .553065  -.0595887
+      45435.00   -.022693   .554205  -.0625809
+      45436.00   -.018358   .555249  -.0656872
+      45437.00   -.014034   .556197  -.0688558
+      45438.00   -.009727   .557050  -.0720153
+      45439.00   -.005446   .557808  -.0750885
+      45440.00   -.001195   .558473  -.0780126
+      45441.00    .003020   .559045  -.0807588
+      45442.00    .007198   .559527  -.0833430
+      45443.00    .011338   .559922  -.0858234
+      45444.00    .015440   .560231  -.0882865
+      45445.00    .019503   .560459  -.0908251
+      45446.00    .023529   .560610  -.0935121
+      45447.00    .027520   .560689  -.0963788
+      45448.00    .031477   .560698  -.0994022
+      45449.00    .035403   .560642  -.1025100
+      45450.00    .039300   .560525  -.1056022
+      45451.00    .043172   .560348  -.1085773
+      45452.00    .047021   .560116  -.1113600
+      45453.00    .050854   .559830  -.1139153
+      45454.00    .054675   .559493  -.1162496
+      45455.00    .058491   .559106  -.1184020
+      45456.00    .062309   .558672  -.1204319
+      45457.00    .066136   .558194  -.1224077
+      45458.00    .069979   .557674  -.1243973
+      45459.00    .073844   .557115  -.1264606
+      45460.00    .077738   .556519  -.1286443
+      45461.00    .081669   .555888  -.1309783
+      45462.00    .085642   .555220  -.1334714
+      45463.00    .089658   .554509  -.1361100
+      45464.00    .093715   .553751  -.1388562
+      45465.00    .097812   .552942  -.1416479
+      45466.00    .101946   .552078  -.1444055
+      45467.00    .106112   .551155  -.1470507
+      45468.00    .110302   .550170  -.1495316
+      45469.00    .114509   .549120  -.1518442
+      45470.00    .118726   .547998  -.1540358
+      45471.00    .122945   .546802  -.1561922
+      45472.00    .127159   .545527  -.1584097
+      45473.00    .131360   .544168  -.1607653
+      45474.00    .135539   .542719  -.1632953
+      45475.00    .139689   .541175  -.1659860
+      45476.00    .143801   .539534  -.1687803
+      45477.00    .147867   .537793  -.1715926
+      45478.00    .151878   .535950  -.1743313
+      45479.00    .155826   .534004  -.1769185
+      45480.00    .159706   .531958  -.1793060
+      45481.00    .163513   .529815  -.1814826
+      45482.00    .167243   .527577  -.1834712
+      45483.00    .170895   .525249  -.1853193
+      45484.00    .174469   .522836  -.1870888
+      45485.00    .177966   .520342  -.1888461
+      45486.00    .181388   .517771  -.1906526
+      45487.00    .184737   .515127  -.1925570
+      45488.00    .188016   .512417  -.1945898
+      45489.00    .191228   .509648  -.1967628
+      45490.00    .194379   .506829  -.1990697
+      45491.00    .197476   .503969  -.2014855
+      45492.00    .200525   .501077  -.2039651
+      45493.00    .203534   .498163  -.2064431
+      45494.00    .206511   .495238  -.2088431
+      45495.00    .209463   .492312  -.2110986
+      45496.00    .212398   .489397  -.2131805
+      45497.00    .215316   .486502  -.2151148
+      45498.00    .218216   .483639  -.2169799
+      45499.00    .221098   .480815  -.2188808
+      45500.00    .223959   .478037  -.2209105
+      45501.00    .226807   .475297  -.2231172
+      45502.00    .229649   .472583  -.2254904
+      45503.00    .232469   .469865  -.2279672
+      45504.00    .235245   .467113  -.2304555
+      45505.00    .237965   .464296  -.2328591
+      45506.00    .240656   .461383  -.2350984
+      45507.00    .243352   .458346  -.2371218
+      45508.00    .246079   .455162  -.2389102
+      45509.00    .248790   .451851  -.2404772
+      45510.00    .251403   .448455  -.2418619
+      45511.00    .253904   .444994  -.2431196
+      45512.00    .256323   .441473  -.2443137
+      45513.00    .258689   .437896  -.2455067
+      45514.00    .261034   .434269  -.2467514
+      45515.00    .263368   .430601  -.2480856
+      45516.00    .265685   .426907   .7504719
+      45517.00    .267977   .423195   .7489233
+      45518.00    .270239   .419450   .7472900
+      45519.00    .272465   .415657   .7456089
+      45520.00    .274650   .411797   .7439316
+      45521.00    .276789   .407855   .7423215
+      45522.00    .278877   .403817   .7408431
+      45523.00    .280924   .399698   .7395374
+      45524.00    .282943   .395528   .7383994
+      45525.00    .284950   .391334   .7373669
+      45526.00    .286959   .387145   .7363329
+      45527.00    .288985   .382991   .7351809
+      45528.00    .291042   .378900   .7338288
+      45529.00    .293139   .374884   .7322570
+      45530.00    .295275   .370936   .7305113
+      45531.00    .297449   .367044   .7286812
+      45532.00    .299642   .363202   .7268689
+      45533.00    .301814   .359408   .7251607
+      45534.00    .303922   .355660   .7236072
+      45535.00    .305929   .351954   .7222224
+      45536.00    .307817   .348280   .7209944
+      45537.00    .309571   .344626   .7198906
+      45538.00    .311184   .340978   .7188644
+      45539.00    .312662   .337319   .7178588
+      45540.00    .314018   .333629   .7168157
+      45541.00    .315265   .329890   .7156832
+      45542.00    .316426   .326094   .7144231
+      45543.00    .317524   .322234   .7130171
+      45544.00    .318573   .318298   .7114668
+      45545.00    .319575   .314267   .7097910
+      45546.00    .320531   .310123   .7080234
+      45547.00    .321434   .305872   .7062103
+      45548.00    .322273   .301533   .7044070
+      45549.00    .323036   .297129   .7026705
+      45550.00    .323703   .292676   .7010479
+      45551.00    .324245   .288185   .6995577
+      45552.00    .324630   .283662   .6981705
+      45553.00    .324867   .279123   .6968051
+      45554.00    .325008   .274583   .6953489
+      45555.00    .325109   .270061   .6936998
+      45556.00    .325220   .265574   .6918090
+      45557.00    .325345   .261129   .6897026
+      45558.00    .325442   .256722   .6874726
+      45559.00    .325463   .252350   .6852440
+      45560.00    .325347   .248012   .6831328
+      45561.00    .325027   .243710   .6812146
+      45562.00    .324439   .239444   .6795146
+      45563.00    .323570   .235203   .6780156
+      45564.00    .322552   .230949   .6766742
+      45565.00    .321508   .226648   .6754331
+      45566.00    .320461   .222306   .6742298
+      45567.00    .319418   .217934   .6730031
+      45568.00    .318373   .213545   .6716981
+      45569.00    .317312   .209152   .6702728
+      45570.00    .316217   .204768   .6687035
+      45571.00    .315057   .200403   .6669878
+      45572.00    .313769   .196072   .6651441
+      45573.00    .312292   .191785   .6632099
+      45574.00    .310611   .187543   .6612365
+      45575.00    .308761   .183334   .6592822
+      45576.00    .306780   .179145   .6574024
+      45577.00    .304707   .174963   .6556410
+      45578.00    .302568   .170795   .6540182
+      45579.00    .300382   .166667   .6525168
+      45580.00    .298158   .162606   .6510751
+      45581.00    .295874   .158623   .6495919
+      45582.00    .293495   .154721   .6479549
+      45583.00    .290991   .150908   .6460815
+      45584.00    .288340   .147183   .6439545
+      45585.00    .285620   .143517   .6416305
+      45586.00    .282932   .139868   .6392241
+      45587.00    .280329   .136199   .6368703
+      45588.00    .277835   .132485   .6346791
+      45589.00    .275415   .128738   .6327116
+      45590.00    .273024   .124983   .6309726
+      45591.00    .270614   .121243   .6294242
+      45592.00    .268140   .117541   .6280058
+      45593.00    .265569   .113896   .6266502
+      45594.00    .262872   .110324   .6252925
+      45595.00    .260033   .106829   .6238741
+      45596.00    .257047   .103408   .6223466
+      45597.00    .253908   .100056   .6206790
+      45598.00    .250619   .096769   .6188601
+      45599.00    .247218   .093546   .6169004
+      45600.00    .243752   .090388   .6148318
+      45601.00    .240255   .087290   .6127044
+      45602.00    .236747   .084238   .6105772
+      45603.00    .233246   .081217   .6085069
+      45604.00    .229770   .078212   .6065357
+      45605.00    .226324   .075212   .6046808
+      45606.00    .222887   .072205   .6029261
+      45607.00    .219443   .069196   .6012183
+      45608.00    .215995   .066215   .5994726
+      45609.00    .212552   .063299   .5975868
+      45610.00    .209116   .060476   .5954696
+      45611.00    .205677   .057756   .5930760
+      45612.00    .202226   .055143   .5904304
+      45613.00    .198751   .052641   .5876271
+      45614.00    .195241   .050236   .5848052
+      45615.00    .191681   .047915   .5821044
+      45616.00    .188069   .045677   .5796249
+      45617.00    .184406   .043530   .5774064
+      45618.00    .180694   .041484   .5754327
+      45619.00    .176934   .039547   .5736494
+      45620.00    .173127   .037715   .5719840
+      45621.00    .169272   .035973   .5703624
+      45622.00    .165367   .034308   .5687185
+      45623.00    .161397   .032717   .5669967
+      45624.00    .157343   .031201   .5651578
+      45625.00    .153187   .029760   .5631825
+      45626.00    .148934   .028382   .5610699
+      45627.00    .144606   .027048   .5588385
+      45628.00    .140224   .025746   .5565266
+      45629.00    .135800   .024495   .5541889
+      45630.00    .131340   .023320   .5518854
+      45631.00    .126852   .022244   .5496675
+      45632.00    .122332   .021273   .5475627
+      45633.00    .117777   .020411   .5455610
+      45634.00    .113183   .019661   .5436110
+      45635.00    .108558   .019010   .5416323
+      45636.00    .103917   .018434   .5395291
+      45637.00    .099285   .017915   .5372094
+      45638.00    .094682   .017444   .5346166
+      45639.00    .090127   .017010   .5317491
+      45640.00    .085635   .016605   .5286668
+      45641.00    .081180   .016226   .5254822
+      45642.00    .076707   .015875   .5223304
+      45643.00    .072188   .015555   .5193312
+      45644.00    .067650   .015274   .5165611
+      45645.00    .063133   .015041   .5140408
+      45646.00    .058673   .014863   .5117429
+      45647.00    .054298   .014750   .5096069
+      45648.00    .050016   .014711   .5075559
+      45649.00    .045825   .014760   .5055162
+      45650.00    .041690   .014919   .5034252
+      45651.00    .037570   .015212   .5012379
+      45652.00    .033436   .015651   .4989301
+      45653.00    .029287   .016216   .4964974
+      45654.00    .025129   .016880   .4939555
+      45655.00    .020959   .017618   .4913389
+      45656.00    .016746   .018418   .4887009
+      45657.00    .012470   .019266   .4861057
+      45658.00    .008132   .020152   .4836202
+      45659.00    .003743   .021065   .4812962
+      45660.00   -.000682   .021994   .4791497
+      45661.00   -.005128   .022932   .4771491
+      45662.00   -.009563   .023887   .4752188
+      45663.00   -.013953   .024877   .4732586
+      45664.00   -.018277   .025911   .4711735
+      45665.00   -.022529   .026991   .4689010
+      45666.00   -.026704   .028118   .4664286
+      45667.00   -.030799   .029291   .4637977
+      45668.00   -.034830   .030504   .4610947
+      45669.00   -.038822   .031742   .4584273
+      45670.00   -.042803   .032994   .4558981
+      45671.00   -.046774   .034259   .4535817
+      45672.00   -.050719   .035547   .4515093
+      45673.00   -.054619   .036867   .4496656
+      45674.00   -.058443   .038228   .4479977
+      45675.00   -.062153   .039638   .4464330
+      45676.00   -.065717   .041105   .4448954
+      45677.00   -.069128   .042651   .4433152
+      45678.00   -.072386   .044297   .4416385
+      45679.00   -.075499   .046056   .4398322
+      45680.00   -.078500   .047907   .4378858
+      45681.00   -.081426   .049824   .4358100
+      45682.00   -.084310   .051784   .4336338
+      45683.00   -.087163   .053773   .4313994
+      45684.00   -.089984   .055779   .4291600
+      45685.00   -.092784   .057796   .4269767
+      45686.00   -.095588   .059831   .4249091
+      45687.00   -.098428   .061893   .4229931
+      45688.00   -.101331   .063991   .4212216
+      45689.00   -.104285   .066120   .4195351
+      45690.00   -.107234   .068258   .4178346
+      45691.00   -.110135   .070392   .4160138
+      45692.00   -.112977   .072525   .4139933
+      45693.00   -.115751   .074659   .4117490
+      45694.00   -.118457   .076816   .4093198
+      45695.00   -.121102   .079021   .4067917
+      45696.00   -.123689   .081302   .4042707
+      45697.00   -.126226   .083687   .4018558
+      45698.00   -.128720   .086194   .3996181
+      45699.00   -.131198   .088822   .3975912
+      45700.00   -.133693   .091556   .3957700
+      45701.00   -.136248   .094364   .3941189
+      45702.00   -.138908   .097214   .3925820
+      45703.00   -.141713   .100076   .3910960
+      45704.00   -.144634   .102933   .3896011
+      45705.00   -.147567   .105787   .3880487
+      45706.00   -.150445   .108641   .3864062
+      45707.00   -.153237   .111497   .3846611
+      45708.00   -.155921   .114358   .3828226
+      45709.00   -.158475   .117229   .3809185
+      45710.00   -.160879   .120116   .3789884
+      45711.00   -.163135   .123034   .3770820
+      45712.00   -.165270   .125996   .3752552
+      45713.00   -.167340   .128998   .3735584
+      45714.00   -.169412   .132027   .3720280
+      45715.00   -.171529   .135077   .3706685
+      45716.00   -.173696   .138154   .3694355
+      45717.00   -.175913   .141261   .3682349
+      45718.00   -.178181   .144398   .3669465
+      45719.00   -.180499   .147546   .3654672
+      45720.00   -.182868   .150678   .3637489
+      45721.00   -.185285   .153776   .3618180
+      45722.00   -.187747   .156841   .3597665
+      45723.00   -.190250   .159874   .3577188
+      45724.00   -.192791   .162876   .3557903
+      45725.00   -.195341   .165856   .3540603
+      45726.00   -.197857   .168829   .3525635
+      45727.00   -.200310   .171811   .3512901
+      45728.00   -.202689   .174810   .3501969
+      45729.00   -.204988   .177835   .3492225
+      45730.00   -.207201   .180895   .3482974
+      45731.00   -.209302   .184010   .3473493
+      45732.00   -.211263   .187209   .3463147
+      45733.00   -.213058   .190510   .3451465
+      45734.00   -.214671   .193897   .3438190
+      45735.00   -.216102   .197345   .3423294
+      45736.00   -.217398   .200842   .3407013
+      45737.00   -.218614   .204396   .3389802
+      45738.00   -.219801   .208015   .3372199
+      45739.00   -.221010   .211703   .3354758
+      45740.00   -.222283   .215418   .3338026
+      45741.00   -.223623   .219088   .3322386
+      45742.00   -.225009   .222662   .3307985
+      45743.00   -.226395   .226137   .3294628
+      45744.00   -.227735   .229512   .3281652
+      45745.00   -.228996   .232798   .3267982
+      45746.00   -.230184   .236043   .3252405
+      45747.00   -.231313   .239301   .3234042
+      45748.00   -.232399   .242625   .3212741
+      45749.00   -.233470   .246041   .3189226
+      45750.00   -.234563   .249561   .3164862
+      45751.00   -.235703   .253172   .3141195
+      45752.00   -.236884   .256861   .3119521
+      45753.00   -.238091   .260612   .3100573
+      45754.00   -.239304   .264417   .3084469
+      45755.00   -.240498   .268293   .3070853
+      45756.00   -.241649   .272247   .3058959
+      45757.00   -.242735   .276271   .3047850
+      45758.00   -.243735   .280348   .3036583
+      45759.00   -.244627   .284464   .3024328
+      45760.00   -.245397   .288604   .3010452
+      45761.00   -.246066   .292756   .2994704
+      45762.00   -.246663   .296911   .2977127
+      45763.00   -.247186   .301065   .2957984
+      45764.00   -.247564   .305215   .2937702
+      45765.00   -.247740   .309367   .2916832
+      45766.00   -.247738   .313525   .2895946
+      45767.00   -.247545   .317689   .2875612
+      45768.00   -.247117   .321851   .2856316
+      45769.00   -.246412   .326007   .2838347
+      45770.00   -.245453   .330153   .2821681
+      45771.00   -.244301   .334287   .2805828
+      45772.00   -.243017   .338411   .2789864
+      45773.00   -.241646   .342540   .2772601
+      45774.00   -.240224   .346696   .2752929
+      45775.00   -.238804   .350899   .2730242
+      45776.00   -.237426   .355140   .2704742
+      45777.00   -.236099   .359395   .2677449
+      45778.00   -.234833   .363640   .2649881
+      45779.00   -.233638   .367852   .2623533
+      45780.00   -.232516   .372008   .2599421
+      45781.00   -.231434   .376092   .2577934
+      45782.00   -.230332   .380098   .2558878
+      45783.00   -.229142   .384027   .2541670
+      45784.00   -.227828   .387876   .2525587
+      45785.00   -.226424   .391632   .2509899
+      45786.00   -.224943   .395303   .2493888
+      45787.00   -.223387   .398901   .2476965
+      45788.00   -.221753   .402445   .2458792
+      45789.00   -.220027   .405961   .2439299
+      45790.00   -.218203   .409467   .2418646
+      45791.00   -.216277   .412970   .2397213
+      45792.00   -.214248   .416473   .2375544
+      45793.00   -.212116   .419980   .2354255
+      45794.00   -.209885   .423499   .2333936
+      45795.00   -.207558   .427047   .2315025
+      45796.00   -.205116   .430657   .2297717
+      45797.00   -.202564   .434329   .2281875
+      45798.00   -.199927   .438042   .2267002
+      45799.00   -.197234   .441776   .2252257
+      45800.00   -.194512   .445521   .2236558
+      45801.00   -.191747   .449274   .2218794
+      45802.00   -.188910   .453024   .2198122
+      45803.00   -.186018   .456733   .2174328
+      45804.00   -.183103   .460348   .2148017
+      45805.00   -.180195   .463824   .2120503
+      45806.00   -.177307   .467156   .2093423
+      45807.00   -.174447   .470354   .2068199
+      45808.00   -.171620   .473431   .2045618
+      45809.00   -.168823   .476398   .2025697
+      45810.00   -.166061   .479278   .2007854
+      45811.00   -.163372   .482112   .1991292
+      45812.00   -.160723   .484922   .1975172
+      45813.00   -.158061   .487723   .1958781
+      45814.00   -.155331   .490533   .1941616
+      45815.00   -.152483   .493366   .1923383
+      45816.00   -.149499   .496226   .1903968
+      45817.00   -.146378   .499108   .1883442
+      45818.00   -.143112   .502004   .1862065
+      45819.00   -.139694   .504907   .1840258
+      45820.00   -.136117   .507802   .1818567
+      45821.00   -.132404   .510670   .1797638
+      45822.00   -.128584   .513487   .1778052
+      45823.00   -.124685   .516235   .1760190
+      45824.00   -.120721   .518909   .1744128
+      45825.00   -.116696   .521516   .1729556
+      45826.00   -.112618   .524062   .1715775
+      45827.00   -.108541   .526540   .1701798
+      45828.00   -.104534   .528942   .1686564
+      45829.00   -.100665   .531257   .1669190
+      45830.00   -.096980   .533468   .1649239
+      45831.00   -.093484   .535562   .1626958
+      45832.00   -.090126   .537536   .1603279
+      45833.00   -.086832   .539392   .1579581
+      45834.00   -.083528   .541130   .1557314
+      45835.00   -.080144   .542753   .1537564
+      45836.00   -.076659   .544280   .1520742
+      45837.00   -.073068   .545737   .1506565
+      45838.00   -.069372   .547148   .1494269
+      45839.00   -.065593   .548539   .1482916
+      45840.00   -.061753   .549930   .1471636
+      45841.00   -.057842   .551303   .1459754
+      45842.00   -.053862   .552630   .1446855
+      45843.00   -.049830   .553883   .1432785
+      45844.00   -.045764   .555039   .1417625
+      45845.00   -.041679   .556087   .1401662
+      45846.00   -.037550   .557031   .1385293
+      45847.00   -.033346   .557886   .1368996
+      45848.00   -.029063   .558661   .1353285
+      45849.00   -.024702   .559368   .1338643
+      45850.00   -.020261   .560019   .1325442
+      45851.00   -.015736   .560616   .1313877
+      45852.00   -.011164   .561137   .1303775
+      45853.00   -.006584   .561557   .1294549
+      45854.00   -.002004   .561867   .1285322
+      45855.00    .002574   .562062   .1275139
+      45856.00    .007150   .562137   .1263199
+      45857.00    .011713   .562095   .1249107
+      45858.00    .016250   .561940   .1233020
+      45859.00    .020744   .561678   .1215661
+      45860.00    .025167   .561321   .1198165
+      45861.00    .029479   .560886   .1181750
+      45862.00    .033651   .560392   .1167397
+      45863.00    .037698   .559870   .1155606
+      45864.00    .041648   .559352   .1146282
+      45865.00    .045528   .558866   .1138831
+      45866.00    .049374   .558416   .1132413
+      45867.00    .053228   .557996   .1126155
+      45868.00    .057118   .557597   .1119315
+      45869.00    .061049   .557210   .1111373
+      45870.00    .065011   .556822   .1102061
+      45871.00    .068961   .556410   .1091371
+      45872.00    .072888   .555944   .1079499
+      45873.00    .076789   .555397   .1066807
+      45874.00    .080672   .554742   .1053753
+      45875.00    .084588   .553970   .1040846
+      45876.00    .088574   .553073   .1028675
+      45877.00    .092657   .552046   .1017801
+      45878.00    .096871   .550896   .1008610
+      45879.00    .101258   .549641   .1001166
+      45880.00    .105838   .548297   .0995091
+      45881.00    .110541   .546878   .0989598
+      45882.00    .115262   .545401   .0983676
+      45883.00    .119923   .543875   .0976423
+      45884.00    .124503   .542301   .0967379
+      45885.00    .128981   .540676   .0956692
+      45886.00    .133340   .538990   .0944962
+      45887.00    .137574   .537225   .0933116
+      45888.00    .141680   .535361   .0922166
+      45889.00    .145664   .533389   .0912929
+      45890.00    .149545   .531308   .0905856
+      45891.00    .153348   .529131   .0900997
+      45892.00    .157110   .526879   .0897970
+      45893.00    .160862   .524579   .0896094
+      45894.00    .164632   .522263   .0894579
+      45895.00    .168441   .519958   .0892686
+      45896.00    .172283   .517656   .0889796
+      45897.00    .176152   .515337   .0885517
+      45898.00    .180041   .512981   .0879727
+      45899.00    .183948   .510566   .0872532
+      45900.00    .187878   .508072   .0864211
+      45901.00    .191806   .505497   .0855229
+      45902.00    .195733   .502847   .0846132
+      45903.00    .199670   .500128   .0837447
+      45904.00    .203624   .497351   .0829616
+      45905.00    .207573   .494543   .0822899
+      45906.00    .211481   .491731   .0817349
+      45907.00    .215311   .488936   .0812672
+      45908.00    .219051   .486154   .0808141
+      45909.00    .222688   .483378   .0802680
+      45910.00    .226221   .480603   .0795154
+      45911.00    .229681   .477813   .0784771
+      45912.00    .233082   .474988   .0771460
+      45913.00    .236413   .472105   .0755994
+      45914.00    .239692   .469146   .0739710
+      45915.00    .242944   .466103   .0724111
+      45916.00    .246165   .462984   .0710446
+      45917.00    .249335   .459789   .0699438
+      45918.00    .252427   .456515   .0691185
+      45919.00    .255424   .453164   .0685157
+      45920.00    .258353   .449761   .0680443
+      45921.00    .261229   .446324   .0676057
+      45922.00    .264070   .442875   .0671077
+      45923.00    .266901   .439437   .0664755
+      45924.00    .269751   .436036   .0656580
+      45925.00    .272629   .432674   .0646337
+      45926.00    .275486   .429332   .0634174
+      45927.00    .278259   .425990   .0620488
+      45928.00    .280889   .422626   .0605835
+      45929.00    .283325   .419206   .0590876
+      45930.00    .285528   .415699   .0576264
+      45931.00    .287484   .412093   .0562564
+      45932.00    .289188   .408397   .0550201
+      45933.00    .290636   .404617   .0539412
+      45934.00    .291826   .400762   .0530166
+      45935.00    .292763   .396846   .0522015
+      45936.00    .293494   .392898   .0513881
+      45937.00    .294091   .388946   .0504355
+      45938.00    .294653   .385010   .0492161
+      45939.00    .295269   .381094   .0476622
+      45940.00    .295999   .377203   .0457925
+      45941.00    .296808   .373365   .0437138
+      45942.00    .297631   .369631   .0415824
+      45943.00    .298357   .366043   .0395489
+      45944.00    .298912   .362592   .0377174
+      45945.00    .299411   .359180   .0361407
+      45946.00    .299981   .355697   .0348172
+      45947.00    .300693   .352060   .0337007
+      45948.00    .301537   .348292   .0327062
+      45949.00    .302483   .344438   .0317496
+      45950.00    .303491   .340541   .0307616
+      45951.00    .304482   .336627   .0296857
+      45952.00    .305408   .332703   .0284850
+      45953.00    .306254   .328765   .0271466
+      45954.00    .307012   .324806   .0256802
+      45955.00    .307671   .320822   .0241161
+      45956.00    .308251   .316811   .0225070
+      45957.00    .308790   .312776   .0209113
+      45958.00    .309318   .308721   .0193787
+      45959.00    .309831   .304651   .0179451
+      45960.00    .310317   .300575   .0166281
+      45961.00    .310782   .296516   .0154253
+      45962.00    .311226   .292500   .0143055
+      45963.00    .311631   .288546   .0132022
+      45964.00    .311986   .284672   .0120182
+      45965.00    .312306   .280886   .0106403
+      45966.00    .312596   .277175   .0089703
+      45967.00    .312847   .273513   .0069740
+      45968.00    .313046   .269870   .0047065
+      45969.00    .313180   .266215   .0022988
+      45970.00    .313234   .262524  -.0000854
+      45971.00    .313173   .258798  -.0022935
+      45972.00    .312953   .255048  -.0042383
+      45973.00    .312541   .251287  -.0059163
+      45974.00    .311931   .247524  -.0073872
+      45975.00    .311122   .243769  -.0087419
+      45976.00    .310139   .240020  -.0100752
+      45977.00    .309014   .236272  -.0114658
+      45978.00    .307765   .232514  -.0129651
+      45979.00    .306411   .228737  -.0145974
+      45980.00    .304973   .224926  -.0163618
+      45981.00    .303439   .221082  -.0182367
+      45982.00    .301786   .217214  -.0201825
+      45983.00    .300011   .213339  -.0221498
+      45984.00    .298118   .209481  -.0240852
+      45985.00    .296138   .205665  -.0259385
+      45986.00    .294132   .201920  -.0276638
+      45987.00    .292159   .198270  -.0292338
+      45988.00    .290281   .194738  -.0306484
+      45989.00    .288571   .191344  -.0319410
+      45990.00    .287079   .188101  -.0331759
+      45991.00    .285717   .184988  -.0344489
+      45992.00    .284400   .181961  -.0358756
+      45993.00    .283074   .178971  -.0375672
+      45994.00    .281715   .175971  -.0395921
+      45995.00    .280336   .172924  -.0419415
+      45996.00    .278889   .169829  -.0445100
+      45997.00    .277303   .166697  -.0471278
+      45998.00    .275547   .163527  -.0496179
+      45999.00    .273605   .160317  -.0518502
+      46000.00    .271474   .157067  -.0537756
+      46001.00    .269197   .153794  -.0554279
+      46002.00    .266819   .150514  -.0568970
+      46003.00    .264389   .147245  -.0582891
+      46004.00    .261986   .144010  -.0596984
+      46005.00    .259695   .140827  -.0611907
+      46006.00    .257508   .137697  -.0628018
+      46007.00    .255389   .134606  -.0645409
+      46008.00    .253304   .131541  -.0663943
+      46009.00    .251214   .128501  -.0683312
+      46010.00    .249079   .125494  -.0703066
+      46011.00    .246833   .122520  -.0722578
+      46012.00    .244423   .119576  -.0741189
+      46013.00    .241881   .116679  -.0758335
+      46014.00    .239258   .113852  -.0773639
+      46015.00    .236613   .111116  -.0787022
+      46016.00    .233977   .108480  -.0798857
+      46017.00    .231360   .105945  -.0809883
+      46018.00    .228770   .103517  -.0821065
+      46019.00    .226210   .101208  -.0833444
+      46020.00    .223677   .099029  -.0847991
+      46021.00    .221139   .096966  -.0865409
+      46022.00    .218568   .094989  -.0885838
+      46023.00    .215938   .093066  -.0908741
+      46024.00    .213225   .091166  -.0932968
+      46025.00    .210406   .089264  -.0957003
+      46026.00    .207423   .087336  -.0979370
+      46027.00    .204236   .085360  -.0999119
+      46028.00    .200873   .083317  -.1016052
+      46029.00    .197372   .081189  -.1030670
+      46030.00    .193765   .078961  -.1043881
+      46031.00    .190075   .076633  -.1056759
+      46032.00    .186314   .074211  -.1070185
+      46033.00    .182505   .071705  -.1084686
+      46034.00    .178719   .069134  -.1100477
+      46035.00    .175026   .066518  -.1117507
+      46036.00    .171408   .063884  -.1135490
+      46037.00    .167834   .061277  -.1153998
+      46038.00    .164269   .058741  -.1172522
+      46039.00    .160686   .056322  -.1190543
+      46040.00    .157068   .054065  -.1207603
+      46041.00    .153378   .051970  -.1223307
+      46042.00    .149571   .050022  -.1237441
+      46043.00    .145616   .048212  -.1250117
+      46044.00    .141486   .046529  -.1261785
+      46045.00    .137154   .044964  -.1273183
+      46046.00    .132626   .043500  -.1285200
+      46047.00    .127941   .042103  -.1298686
+      46048.00    .123137   .040739  -.1314199
+      46049.00    .118217   .039369  -.1331843
+      46050.00    .113171   .037956  -.1351183
+      46051.00    .108005   .036506  -.1371294
+      46052.00    .102735   .035042  -.1390966
+      46053.00    .097379   .033587  -.1408996
+      46054.00    .091986   .032161  -.1424543
+      46055.00    .086657   .030775  -.1437381
+      46056.00    .081481   .029451  -.1447949
+      46057.00    .076553   .028198  -.1457150
+      46058.00    .071971   .027005  -.1466072
+      46059.00    .067706   .025917  -.1475790
+      46060.00    .063659   .024995  -.1487065
+      46061.00    .059795   .024242  -.1500226
+      46062.00    .056087   .023657  -.1515275
+      46063.00    .052510   .023235  -.1531963
+      46064.00    .049040   .022967  -.1549845
+      46065.00    .045647   .022839  -.1568370
+      46066.00    .042277   .022841  -.1586909
+      46067.00    .038867   .022960  -.1604870
+      46068.00    .035355   .023183  -.1621783
+      46069.00    .031690   .023492  -.1637360
+      46070.00    .027848   .023864  -.1651577
+      46071.00    .023839   .024297  -.1664779
+      46072.00    .019696   .024802  -.1677671
+      46073.00    .015499   .025390  -.1691195
+      46074.00    .011336   .026070  -.1706301
+      46075.00    .007290   .026845  -.1723661
+      46076.00    .003381   .027703  -.1743467
+      46077.00   -.000400   .028635  -.1765293
+      46078.00   -.004039   .029631  -.1788167
+      46079.00   -.007510   .030685  -.1810844
+      46080.00   -.010793   .031794  -.1832128
+      46081.00   -.013922   .032971  -.1851106
+      46082.00   -.016965   .034224  -.1867379
+      46083.00   -.019994   .035558  -.1881139
+      46084.00   -.023076   .036972  -.1893057
+      46085.00   -.026261   .038429  -.1904083
+      46086.00   -.029573   .039922  -.1915209
+      46087.00   -.033034   .041461  -.1927203
+      46088.00   -.036654   .043045  -.1940474
+      46089.00   -.040417   .044650  -.1955065
+      46090.00   -.044273   .046244  -.1970727
+      46091.00   -.048135   .047808  -.1987025
+      46092.00   -.051928   .049331  -.2003427
+      46093.00   -.055578   .050805  -.2019384
+      46094.00   -.059013   .052219  -.2034409
+      46095.00   -.062163   .053572  -.2048137
+      46096.00   -.065008   .054912  -.2060277
+      46097.00   -.067595   .056280  -.2070748
+      46098.00   -.069992   .057704  -.2079760
+      46099.00   -.072265   .059200  -.2087876
+      46100.00   -.074472   .060763  -.2096027
+      46101.00   -.076633   .062402  -.2105400
+      46102.00   -.078755   .064139  -.2117058
+      46103.00   -.080874   .066000  -.2131574
+      46104.00   -.083041   .068013  -.2148787
+      46105.00   -.085300   .070194  -.2167819
+      46106.00   -.087660   .072510  -.2187311
+      46107.00   -.090126   .074917  -.2205888
+      46108.00   -.092701   .077370  -.2222578
+      46109.00   -.095382   .079814  -.2237016
+      46110.00   -.098160   .082196  -.2249468
+      46111.00   -.101037   .084501  -.2260661
+      46112.00   -.104051   .086729  -.2271542
+      46113.00   -.107245   .088881  -.2283057
+      46114.00   -.110647   .090957  -.2295951
+      46115.00   -.114250   .092963  -.2310654
+      46116.00   -.118004   .094931  -.2327217
+      46117.00   -.121853   .096905  -.2345343
+      46118.00   -.125726   .098912  -.2364516
+      46119.00   -.129547   .100973  -.2384076
+      46120.00   -.133243   .103110  -.2403331
+      46121.00   -.136777   .105344  -.2421679
+      46122.00   -.140144   .107701  -.2438655
+      46123.00   -.143341   .110196  -.2453988
+      46124.00   -.146379   .112815  -.2467622
+      46125.00   -.149266   .115542  -.2479762
+      46126.00   -.152035   .118359  -.2490984
+      46127.00   -.154732   .121245  -.2502217
+      46128.00   -.157401   .124178  -.2514646
+      46129.00   -.160087   .127139  -.2529506
+      46130.00   -.162838   .130105  -.2547729
+      46131.00   -.165701   .133042  -.2569614
+      46132.00   -.168632   .135964  -.2594436
+      46133.00   -.171568   .138910  -.2620707
+      46134.00   -.174442   .141921  -.2646679
+      46135.00   -.177192   .145035  -.2670902
+      46136.00   -.179774   .148284  -.2692583
+      46137.00   -.182174   .151687  -.2711697
+      46138.00   -.184390   .155262  -.2728870
+      46139.00   -.186475   .159014  -.2745066
+      46140.00   -.188489   .162944  -.2761266
+      46141.00   -.190425   .167016  -.2778277
+      46142.00   -.192241   .171174  -.2796601
+      46143.00   -.193893   .175364  -.2816404
+      46144.00   -.195330   .179529  -.2837540
+      46145.00   -.196459   .183619  -.2859606
+      46146.00   -.197257   .187641  -.2882065
+      46147.00   -.197770   .191620  -.2904336
+      46148.00   -.198078   .195575  -.2925881
+      46149.00   -.198263   .199521  -.2946278
+      46150.00   -.198402   .203478  -.2965273
+      46151.00   -.198546   .207460  -.2982722
+      46152.00   -.198758   .211475  -.2998687
+      46153.00   -.199088   .215521  -.3013471
+      46154.00   -.199546   .219579  -.3027625
+      46155.00   -.200125   .223631  -.3041967
+      46156.00   -.200799   .227676  -.3057583
+      46157.00   -.201506   .231711  -.3075487
+      46158.00   -.202157   .235725  -.3096280
+      46159.00   -.202656   .239703  -.3119810
+      46160.00   -.202894   .243632  -.3145091
+      46161.00   -.202887   .247510  -.3170467
+      46162.00   -.202694   .251352  -.3194193
+      46163.00   -.202363   .255174  -.3215064
+      46164.00   -.201945   .258993  -.3232768
+      46165.00   -.201479   .262823  -.3247880
+      46166.00   -.200979   .266659  -.3261551
+      46167.00   -.200452   .270482  -.3275061
+      46168.00   -.199907   .274270  -.3289482
+      46169.00   -.199368   .277987  -.3305500
+      46170.00   -.198855   .281599  -.3323403
+      46171.00   -.198376   .285115  -.3343101
+      46172.00   -.197935   .288574  -.3364221
+      46173.00   -.197529   .292023  -.3386206
+      46174.00   -.197147   .295507  -.3408390
+      46175.00   -.196748   .299057  -.3430114
+      46176.00   -.196341   .302665  -.3450778
+      46177.00   -.195970   .306310  -.3469911
+      46178.00   -.195653   .309964  -.3487283
+      46179.00   -.195403   .313600  -.3502938
+      46180.00   -.195218   .317194  -.3517206
+      46181.00   -.195070   .320749  -.3530704
+      46182.00   -.194934   .324277  -.3544233
+      46183.00   -.194754   .327794  -.3558732
+      46184.00   -.194430   .331318  -.3575151
+      46185.00   -.193875   .334866  -.3594226
+      46186.00   -.193064   .338446  -.3616246
+      46187.00   -.192022   .342059  -.3640725
+      46188.00   -.190796   .345705  -.3666421
+      46189.00   -.189423   .349371  -.3691694
+      46190.00   -.187921   .353018  -.3715021
+      46191.00   -.186343   .356639  -.3735395
+      46192.00   -.184758   .360244  -.3752701
+      46193.00   -.183180   .363836  -.3767639
+      46194.00   -.181540   .367403  -.3781335
+      46195.00   -.179759   .370913  -.3794931
+      46196.00   -.177855   .374344  -.3809154
+      46197.00   -.175860   .377706  -.3824452
+      46198.00   -.173806   .381008  -.3840934
+      46199.00   -.171735   .384244  -.3858435
+      46200.00   -.169684   .387395  -.3876593
+      46201.00   -.167665   .390431  -.3894825
+      46202.00   -.165657   .393334  -.3912474
+      46203.00   -.163573   .396137  -.3928999
+      46204.00   -.161262   .398882  -.3943990
+      46205.00   -.158584   .401605  -.3957248
+      46206.00   -.155578   .404325  -.3968812
+      46207.00   -.152367   .407057  -.3978971
+      46208.00   -.149070   .409800  -.3988270
+      46209.00   -.145811   .412542  -.3997466
+      46210.00   -.142687   .415266  -.4007451
+      46211.00   -.139715   .417959  -.4019197
+      46212.00   -.136898   .420617  -.4033516
+      46213.00   -.134239   .423234  -.4050843
+      46214.00   -.131710   .425794  -.4071018
+      46215.00   -.129268   .428277  -.4093187
+      46216.00   -.126862   .430697  -.4115847
+      46217.00   -.124466   .433064  -.4137295
+      46218.00   -.122062   .435383  -.4156205
+      46219.00   -.119627   .437662  -.4172008
+      46220.00   -.117138   .439906  -.4185018
+      46221.00   -.114629   .442113  -.4196298
+      46222.00   -.112156   .444281  -.4207131
+      46223.00   -.109765   .446419  -.4218551
+      46224.00   -.107492   .448543  -.4231118
+      46225.00   -.105357   .450662  -.4244918
+      46226.00   -.103325   .452758  -.4259725
+      46227.00   -.101352   .454805  -.4275097
+      46228.00   -.099393   .456780  -.4290493
+      46229.00   -.097404   .458668  -.4305347
+      46230.00   -.095335   .460461  -.4319136
+      46231.00   -.093149   .462163  -.4331459
+      46232.00   -.090825   .463779  -.4342128
+      46233.00   -.088349   .465312  -.4351203
+      46234.00   -.085711   .466761  -.4359015
+      46235.00   -.082936   .468118  -.4366149
+      46236.00   -.080122   .469408  -.4373028
+      46237.00   -.077361   .470667  -.4380153
+      46238.00   -.074610   .471903  -.4388551
+      46239.00   -.071793   .473116  -.4399191
+      46240.00   -.068839   .474303  -.4412630
+      46241.00   -.065753   .475472  -.4428618
+      46242.00   -.062576   .476631  -.4446257
+      46243.00   -.059354   .477788  -.4464248
+      46244.00   -.056153   .478938  -.4481124
+      46245.00   -.053034   .480065  -.4495582
+      46246.00   -.050009   .481156  -.4506836
+      46247.00   -.047069   .482203   .5485152
+      46248.00   -.044201   .483202   .5479681
+      46249.00   -.041392   .484143   .5475631
+      46250.00   -.038612   .485025   .5471829
+      46251.00   -.035784   .485851   .5467352
+      46252.00   -.032827   .486625   .5461737
+      46253.00   -.029687   .487346   .5455003
+      46254.00   -.026333   .488016   .5447512
+      46255.00   -.022800   .488669   .5439789
+      46256.00   -.019130   .489314   .5432315
+      46257.00   -.015371   .489951   .5425526
+      46258.00   -.011572   .490575   .5419778
+      46259.00   -.007792   .491171   .5415318
+      46260.00   -.004082   .491721   .5412161
+      46261.00   -.000464   .492239   .5410125
+      46262.00    .003063   .492745   .5408855
+      46263.00    .006507   .493256   .5407766
+      46264.00    .009872   .493788   .5406063
+      46265.00    .013176   .494340   .5402860
+      46266.00    .016429   .494873   .5397323
+      46267.00    .019647   .495332   .5389012
+      46268.00    .022886   .495665   .5378134
+      46269.00    .026158   .495886   .5365587
+      46270.00    .029459   .496025   .5352637
+      46271.00    .032763   .496114   .5340619
+      46272.00    .036041   .496176   .5330642
+      46273.00    .039272   .496233   .5323336
+      46274.00    .042463   .496285   .5318666
+      46275.00    .045629   .496323   .5315935
+      46276.00    .048765   .496335   .5313965
+      46277.00    .051872   .496310   .5311553
+      46278.00    .054974   .496231   .5307762
+      46279.00    .058100   .496081   .5302084
+      46280.00    .061323   .495838   .5294499
+      46281.00    .064658   .495523   .5285432
+      46282.00    .068084   .495159   .5275565
+      46283.00    .071580   .494755   .5265648
+      46284.00    .075122   .494320   .5256392
+      46285.00    .078697   .493855   .5248374
+      46286.00    .082279   .493336   .5241943
+      46287.00    .085829   .492728   .5237231
+      46288.00    .089317   .491994   .5234146
+      46289.00    .092722   .491108   .5232339
+      46290.00    .096012   .490110   .5231072
+      46291.00    .099202   .489066   .5229433
+      46292.00    .102330   .488030   .5226398
+      46293.00    .105445   .487036   .5220976
+      46294.00    .108604   .486110   .5212499
+      46295.00    .111863   .485251   .5200893
+      46296.00    .115192   .484438   .5186855
+      46297.00    .118524   .483639   .5171687
+      46298.00    .121791   .482814   .5156920
+      46299.00    .124926   .481908   .5143879
+      46300.00    .127884   .480877   .5133339
+      46301.00    .130691   .479741   .5125465
+      46302.00    .133380   .478546   .5119814
+      46303.00    .136005   .477310   .5115435
+      46304.00    .138660   .475975   .5111038
+      46305.00    .141430   .474480   .5105460
+      46306.00    .144270   .472834   .5098009
+      46307.00    .147121   .471079   .5088480
+      46308.00    .149942   .469255   .5077043
+      46309.00    .152721   .467398   .5064174
+      46310.00    .155498   .465536   .5050530
+      46311.00    .158276   .463694   .5036912
+      46312.00    .161038   .461899   .5024070
+      46313.00    .163789   .460177   .5012528
+      46314.00    .166536   .458544   .5002573
+      46315.00    .169227   .456971   .4994287
+      46316.00    .171822   .455409   .4987417
+      46317.00    .174282   .453812   .4981437
+      46318.00    .176573   .452131   .4975589
+      46319.00    .178677   .450315   .4968903
+      46320.00    .180611   .448316   .4960317
+      46321.00    .182398   .446159   .4948855
+      46322.00    .184053   .443888   .4934018
+      46323.00    .185592   .441539   .4916065
+      46324.00    .187053   .439148   .4896077
+      46325.00    .188508   .436747   .4875697
+      46326.00    .189998   .434355   .4856603
+      46327.00    .191546   .431996   .4839986
+      46328.00    .193176   .429680   .4826222
+      46329.00    .194912   .427417   .4814891
+      46330.00    .196776   .425207   .4805008
+      46331.00    .198726   .423023   .4795289
+      46332.00    .200685   .420838   .4784586
+      46333.00    .202577   .418621   .4772123
+      46334.00    .204362   .416327   .4757559
+      46335.00    .206018   .413909   .4740976
+      46336.00    .207522   .411358   .4722834
+      46337.00    .208873   .408682   .4703842
+      46338.00    .210079   .405896   .4684802
+      46339.00    .211149   .403012   .4666470
+      46340.00    .212122   .400053   .4649418
+      46341.00    .213067   .397048   .4633893
+      46342.00    .214036   .394029   .4619896
+      46343.00    .215075   .391019   .4607163
+      46344.00    .216228   .388042   .4595225
+      46345.00    .217527   .385111   .4583458
+      46346.00    .218911   .382221   .4571011
+      46347.00    .220280   .379362   .4556925
+      46348.00    .221542   .376513   .4540317
+      46349.00    .222619   .373620   .4520607
+      46350.00    .223455   .370637   .4497784
+      46351.00    .224080   .367587   .4472576
+      46352.00    .224562   .364512   .4446451
+      46353.00    .224966   .361454   .4421210
+      46354.00    .225359   .358452   .4398379
+      46355.00    .225798   .355520   .4378696
+      46356.00    .226285   .352648   .4361921
+      46357.00    .226795   .349824   .4347040
+      46358.00    .227307   .347014   .4332664
+      46359.00    .227800   .344182   .4317540
+      46360.00    .228257   .341300   .4300833
+      46361.00    .228671   .338380   .4282195
+      46362.00    .229030   .335455   .4261722
+      46363.00    .229326   .332557   .4239808
+      46364.00    .229560   .329701   .4217036
+      46365.00    .229736   .326901   .4194097
+      46366.00    .229840   .324156   .4171761
+      46367.00    .229859   .321447   .4150728
+      46368.00    .229785   .318755   .4131510
+      46369.00    .229620   .316060   .4114356
+      46370.00    .229408   .313351   .4099157
+      46371.00    .229171   .310637   .4085510
+      46372.00    .228924   .307937   .4072826
+      46373.00    .228693   .305271   .4060380
+      46374.00    .228504   .302658   .4047364
+      46375.00    .228386   .300114   .4032939
+      46376.00    .228334   .297638   .4016286
+      46377.00    .228320   .295220   .3996907
+      46378.00    .228317   .292843   .3974904
+      46379.00    .228298   .290458   .3951109
+      46380.00    .228247   .288015   .3926938
+      46381.00    .228135   .285484   .3904061
+      46382.00    .227954   .282861   .3883798
+      46383.00    .227722   .280152   .3866578
+      46384.00    .227464   .277366   .3851853
+      46385.00    .227247   .274515   .3838348
+      46386.00    .227107   .271641   .3824592
+      46387.00    .227067   .268788   .3809433
+      46388.00    .227161   .265981   .3792292
+      46389.00    .227422   .263244   .3773162
+      46390.00    .227857   .260599   .3752469
+      46391.00    .228289   .258093   .3731068
+      46392.00    .228513   .255777   .3709919
+      46393.00    .228522   .253611   .3689618
+      46394.00    .228351   .251535   .3670608
+      46395.00    .228034   .249492   .3653185
+      46396.00    .227578   .247438   .3637506
+      46397.00    .226974   .245348   .3623496
+      46398.00    .226214   .243204   .3610822
+      46399.00    .225289   .240987   .3598928
+      46400.00    .224203   .238690   .3587090
+      46401.00    .222985   .236330   .3574534
+      46402.00    .221664   .233938   .3560531
+      46403.00    .220295   .231542   .3544448
+      46404.00    .218965   .229164   .3525858
+      46405.00    .217750   .226823   .3504737
+      46406.00    .216636   .224519   .3481682
+      46407.00    .215563   .222242   .3457903
+      46408.00    .214475   .219989   .3434927
+      46409.00    .213331   .217755   .3414142
+      46410.00    .212100   .215538   .3396322
+      46411.00    .210811   .213345   .3381405
+      46412.00    .209523   .211181   .3368527
+      46413.00    .208303   .209052   .3356368
+      46414.00    .207217   .206963   .3343657
+      46415.00    .206324   .204913   .3329571
+      46416.00    .205587   .202891   .3313867
+      46417.00    .204918   .200878   .3296829
+      46418.00    .204245   .198834   .3279056
+      46419.00    .203505   .196704   .3261229
+      46420.00    .202651   .194441   .3243953
+      46421.00    .201682   .192067   .3227800
+      46422.00    .200599   .189640   .3213244
+      46423.00    .199401   .187217   .3200557
+      46424.00    .198074   .184830   .3189776
+      46425.00    .196602   .182503   .3180691
+      46426.00    .194969   .180259   .3172844
+      46427.00    .193183   .178098   .3165573
+      46428.00    .191268   .176008   .3158105
+      46429.00    .189274   .173979   .3149682
+      46430.00    .187278   .172001   .3139669
+      46431.00    .185312   .170079   .3127601
+      46432.00    .183379   .168223   .3113387
+      46433.00    .181454   .166418   .3097389
+      46434.00    .179503   .164642   .3080397
+      46435.00    .177500   .162872   .3063498
+      46436.00    .175449   .161098   .3047858
+      46437.00    .173353   .159317   .3034362
+      46438.00    .171218   .157523   .3023221
+      46439.00    .169057   .155692   .3013826
+      46440.00    .166891   .153788   .3004973
+      46441.00    .164758   .151817   .2995308
+      46442.00    .162690   .149796   .2983744
+      46443.00    .160722   .147740   .2969782
+      46444.00    .158878   .145663   .2953575
+      46445.00    .157141   .143587   .2935775
+      46446.00    .155372   .141583   .2917394
+      46447.00    .153408   .139731   .2899452
+      46448.00    .151200   .138054   .2882630
+      46449.00    .148727   .136557   .2867365
+      46450.00    .145986   .135246   .2853861
+      46451.00    .143091   .134110   .2842001
+      46452.00    .140167   .133107   .2831507
+      46453.00    .137314   .132188   .2821915
+      46454.00    .134567   .131298   .2812568
+      46455.00    .131939   .130388   .2802680
+      46456.00    .129401   .129446   .2791405
+      46457.00    .126889   .128481   .2777997
+      46458.00    .124344   .127502   .2761995
+      46459.00    .121701   .126519   .2743377
+      46460.00    .118895   .125549   .2722597
+      46461.00    .115908   .124658   .2700604
+      46462.00    .112821   .123850   .2678653
+      46463.00    .109714   .123099   .2657978
+      46464.00    .106661   .122378   .2639515
+      46465.00    .103734   .121667   .2623630
+      46466.00    .100944   .121002   .2609992
+      46467.00    .098291   .120373   .2597681
+      46468.00    .095777   .119754   .2585474
+      46469.00    .093387   .119115   .2572194
+      46470.00    .091103   .118430   .2557082
+      46471.00    .088893   .117719   .2539971
+      46472.00    .086712   .117033   .2521272
+      46473.00    .084518   .116424   .2501744
+      46474.00    .082279   .115931   .2482237
+      46475.00    .080014   .115531   .2463535
+      46476.00    .077728   .115215   .2446300
+      46477.00    .075396   .114980   .2431000
+      46478.00    .072972   .114814   .2417861
+      46479.00    .070407   .114705   .2406830
+      46480.00    .067671   .114639   .2397571
+      46481.00    .064784   .114612   .2389393
+      46482.00    .061769   .114632   .2381421
+      46483.00    .058642   .114705   .2372709
+      46484.00    .055401   .114826   .2362378
+      46485.00    .052054   .114988   .2349740
+      46486.00    .048662   .115180   .2334475
+      46487.00    .045283   .115387   .2316829
+      46488.00    .041965   .115589   .2297646
+      46489.00    .038757   .115766   .2278141
+      46490.00    .035706   .115906   .2259578
+      46491.00    .032791   .116044   .2243030
+      46492.00    .029953   .116217   .2229021
+      46493.00    .027128   .116443   .2217315
+      46494.00    .024253   .116739   .2207104
+      46495.00    .021283   .117115   .2197275
+      46496.00    .018245   .117561   .2186638
+      46497.00    .015184   .118063   .2174311
+      46498.00    .012129   .118590   .2159936
+      46499.00    .009097   .119104   .2143741
+      46500.00    .006107   .119568   .2126434
+      46501.00    .003162   .119982   .2109038
+      46502.00    .000266   .120366   .2092616
+      46503.00   -.002553   .120732   .2078046
+      46504.00   -.005233   .121082   .2065820
+      46505.00   -.007745   .121426   .2055882
+      46506.00   -.010088   .121808   .2047961
+      46507.00   -.012282   .122274   .2041610
+      46508.00   -.014357   .122843   .2036164
+      46509.00   -.016346   .123521   .2030807
+      46510.00   -.018278   .124312   .2024589
+      46511.00   -.020183   .125208   .2016446
+      46512.00   -.022093   .126208   .2005405
+      46513.00   -.024062   .127293   .1990832
+      46514.00   -.026177   .128425   .1972693
+      46515.00   -.028501   .129563   .1951654
+      46516.00   -.030986   .130692   .1929143
+      46517.00   -.033545   .131826   .1906985
+      46518.00   -.036090   .132981   .1886785
+      46519.00   -.038555   .134187   .1869491
+      46520.00   -.040914   .135472   .1855148
+      46521.00   -.043172   .136853   .1842927
+      46522.00   -.045336   .138344   .1831580
+      46523.00   -.047454   .139934   .1819794
+      46524.00   -.049568   .141566   .1806466
+      46525.00   -.051700   .143185   .1790974
+      46526.00   -.053825   .144820   .1773314
+      46527.00   -.055874   .146521   .1754022
+      46528.00   -.057773   .148339   .1733924
+      46529.00   -.059477   .150309   .1713959
+      46530.00   -.060969   .152445   .1694985
+      46531.00   -.062290   .154704   .1677555
+      46532.00   -.063503   .157021   .1661917
+      46533.00   -.064673   .159335   .1648015
+      46534.00   -.065863   .161602   .1635526
+      46535.00   -.067116   .163798   .1623914
+      46536.00   -.068423   .165915   .1612565
+      46537.00   -.069777   .167954   .1600837
+      46538.00   -.071187   .169929   .1588076
+      46539.00   -.072663   .171851   .1573670
+      46540.00   -.074202   .173729   .1557132
+      46541.00   -.075759   .175573   .1538128
+      46542.00   -.077279   .177399   .1516836
+      46543.00   -.078707   .179220   .1494123
+      46544.00   -.080012   .181058   .1471433
+      46545.00   -.081171   .182934   .1450321
+      46546.00   -.082168   .184865   .1431903
+      46547.00   -.083015   .186866   .1416451
+      46548.00   -.083728   .188951   .1403312
+      46549.00   -.084328   .191137   .1391180
+      46550.00   -.084841   .193434   .1378587
+      46551.00   -.085302   .195807   .1364402
+      46552.00   -.085766   .198188   .1348073
+      46553.00   -.086310   .200499   .1329628
+      46554.00   -.087006   .202681   .1309539
+      46555.00   -.087865   .204743   .1288565
+      46556.00   -.088838   .206708   .1267570
+      46557.00   -.089873   .208598   .1247376
+      46558.00   -.090917   .210433   .1228653
+      46559.00   -.091923   .212232   .1211815
+      46560.00   -.092849   .214013   .1196996
+      46561.00   -.093688   .215808   .1184135
+      46562.00   -.094451   .217648   .1172924
+      46563.00   -.095149   .219567   .1162853
+      46564.00   -.095796   .221597   .1153295
+      46565.00   -.096430   .223764   .1143641
+      46566.00   -.097129   .226072   .1133334
+      46567.00   -.097864   .228443   .1121536
+      46568.00   -.098581   .230775   .1107561
+      46569.00   -.099267   .233012   .1091256
+      46570.00   -.099946   .235158   .1073146
+      46571.00   -.100619   .237225   .1054365
+      46572.00   -.101277   .239225   .1036423
+      46573.00   -.101901   .241178   .1020719
+      46574.00   -.102451   .243121   .1008047
+      46575.00   -.102876   .245094   .0998261
+      46576.00   -.103160   .247103   .0990329
+      46577.00   -.103325   .249134   .0982836
+      46578.00   -.103399   .251173   .0974527
+      46579.00   -.103404   .253206   .0964718
+      46580.00   -.103346   .255218   .0953424
+      46581.00   -.103243   .257218   .0941066
+      46582.00   -.103123   .259234   .0928334
+      46583.00   -.103011   .261304   .0915998
+      46584.00   -.102934   .263462   .0904755
+      46585.00   -.102910   .265735   .0895140
+      46586.00   -.102914   .268094   .0887517
+      46587.00   -.102903   .270487   .0882035
+      46588.00   -.102833   .272860   .0878589
+      46589.00   -.102660   .275152   .0876797
+      46590.00   -.102342   .277314   .0876058
+      46591.00   -.101845   .279349   .0875678
+      46592.00   -.101155   .281292   .0874923
+      46593.00   -.100277   .283176   .0873049
+      46594.00   -.099225   .285031   .0869416
+      46595.00   -.098024   .286885   .0863563
+      46596.00   -.096693   .288773   .0855339
+      46597.00   -.095276   .290712   .0844919
+      46598.00   -.093812   .292705   .0832929
+      46599.00   -.092335   .294749   .0820471
+      46600.00   -.090889   .296847   .0808817
+      46601.00   -.089542   .299006   .0799154
+      46602.00   -.088276   .301210   .0791929
+      46603.00   -.087034   .303439   .0786670
+      46604.00   -.085751   .305684   .0782238
+      46605.00   -.084370   .307936   .0777276
+      46606.00   -.082897   .310196   .0770662
+      46607.00   -.081352   .312466   .0761962
+      46608.00   -.079745   .314743   .0751471
+      46609.00   -.078095   .317015   .0739938
+      46610.00   -.076437   .319251   .0728272
+      46611.00   -.074819   .321453   .0717335
+      46612.00   -.073288   .323644   .0707726
+      46613.00   -.071864   .325834   .0699821
+      46614.00   -.070558   .328031   .0693782
+      46615.00   -.069363   .330236   .0689524
+      46616.00   -.068207   .332442   .0686737
+      46617.00   -.067004   .334648   .0684897
+      46618.00   -.065692   .336846   .0683299
+      46619.00   -.064318   .339016   .0681120
+      46620.00   -.062954   .341131   .0677608
+      46621.00   -.061644   .343144   .0672256
+      46622.00   -.060394   .344996   .0664822
+      46623.00   -.059201   .346626   .0655386
+      46624.00   -.057992   .348012   .0644446
+      46625.00   -.056638   .349195   .0632836
+      46626.00   -.055124   .350248   .0621501
+      46627.00   -.053477   .351247   .0611486
+      46628.00   -.051711   .352262   .0603652
+      46629.00   -.049825   .353364   .0598363
+      46630.00   -.047823   .354603   .0595248
+      46631.00   -.045742   .355959   .0593177
+      46632.00   -.043634   .357389   .0590660
+      46633.00   -.041552   .358849   .0586337
+      46634.00   -.039560   .360304   .0579461
+      46635.00   -.037728   .361725   .0570104
+      46636.00   -.036067   .363091   .0559092
+      46637.00   -.034531   .364382   .0547645
+      46638.00   -.033067   .365577   .0536947
+      46639.00   -.031637   .366669   .0527888
+      46640.00   -.030274   .367690   .0520890
+      46641.00   -.028996   .368666   .0516086
+      46642.00   -.027795   .369619   .0513373
+      46643.00   -.026634   .370570   .0512372
+      46644.00   -.025468   .371543   .0512451
+      46645.00   -.024242   .372545   .0512849
+      46646.00   -.022891   .373498   .0512841
+      46647.00   -.021434   .374402   .0511452
+      46648.00   -.019918   .375285   .0507817
+      46649.00   -.018396   .376154   .0501389
+      46650.00   -.016918   .377001   .0492042
+      46651.00   -.015510   .377825   .0480271
+      46652.00   -.014168   .378641   .0467073
+      46653.00   -.012882   .379462   .0453699
+      46654.00   -.011640   .380306   .0441420
+      46655.00   -.010403   .381186   .0431236
+      46656.00   -.009141   .382083   .0423668
+      46657.00   -.007839   .382970   .0418592
+      46658.00   -.006482   .383837   .0415167
+      46659.00   -.005055   .384681   .0412078
+      46660.00   -.003544   .385493   .0407924
+      46661.00   -.001936   .386285   .0401629
+      46662.00   -.000222   .387076   .0392789
+      46663.00    .001602   .387884   .0381772
+      46664.00    .003514   .388702   .0369529
+      46665.00    .005484   .389514   .0357240
+      46666.00    .007473   .390301   .0345931
+      46667.00    .009457   .391054   .0336291
+      46668.00    .011415   .391764   .0328618
+      46669.00    .013324   .392421   .0322875
+      46670.00    .015140   .393021   .0318770
+      46671.00    .016870   .393579   .0315836
+      46672.00    .018538   .394122   .0313464
+      46673.00    .020155   .394677   .0310971
+      46674.00    .021728   .395271   .0307690
+      46675.00    .023265   .395918   .0302994
+      46676.00    .024777   .396582   .0296206
+      46677.00    .026280   .397211   .0286889
+      46678.00    .027776   .397750   .0275048
+      46679.00    .029242   .398137   .0261182
+      46680.00    .030660   .398317   .0246201
+      46681.00    .032040   .398304   .0231308
+      46682.00    .033398   .398165   .0217642
+      46683.00    .034748   .397969   .0205972
+      46684.00    .036109   .397793   .0196517
+      46685.00    .037511   .397718   .0188843
+      46686.00    .038937   .397755   .0181818
+      46687.00    .040369   .397869   .0174055
+      46688.00    .041792   .398011   .0164323
+      46689.00    .043195   .398133   .0151853
+      46690.00    .044565   .398189   .0136551
+      46691.00    .045892   .398157   .0119068
+      46692.00    .047175   .398031   .0100508
+      46693.00    .048412   .397812   .0082069
+      46694.00    .049596   .397519   .0064771
+      46695.00    .050721   .397166   .0049286
+      46696.00    .051787   .396760   .0035841
+      46697.00    .052821   .396311   .0024267
+      46698.00    .053854   .395831   .0014112
+      46699.00    .054917   .395336   .0004703
+      46700.00    .056028   .394854  -.0004763
+      46701.00    .057188   .394417  -.0015092
+      46702.00    .058390   .394051  -.0027028
+      46703.00    .059614   .393782  -.0041178
+      46704.00    .060833   .393642  -.0057892
+      46705.00    .062023   .393644  -.0077152
+      46706.00    .063183   .393743  -.0098497
+      46707.00    .064319   .393870  -.0120944
+      46708.00    .065439   .393967  -.0143128
+      46709.00    .066561   .393983  -.0163691
+      46710.00    .067700   .393877  -.0181709
+      46711.00    .068857   .393644  -.0196953
+      46712.00    .070031   .393309  -.0209933
+      46713.00    .071220   .392901  -.0221744
+      46714.00    .072432   .392455  -.0233677
+      46715.00    .073692   .392017  -.0246816
+      46716.00    .075028   .391609  -.0261924
+      46717.00    .076466   .391242  -.0279202
+      46718.00    .078018   .390927  -.0298285
+      46719.00    .079677   .390666  -.0318410
+      46720.00    .081418   .390457  -.0338647
+      46721.00    .083132   .390277  -.0358018
+      46722.00    .084741   .390107  -.0375854
+      46723.00    .086193   .389931  -.0391847
+      46724.00    .087450   .389740  -.0406038
+      46725.00    .088503   .389529  -.0418764
+      46726.00    .089430   .389295  -.0430563
+      46727.00    .090340   .389034  -.0442099
+      46728.00    .091325   .388742  -.0454034
+      46729.00    .092387   .388414  -.0466797
+      46730.00    .093479   .388037  -.0480733
+      46731.00    .094579   .387595  -.0496329
+      46732.00    .095684   .387071  -.0513921
+      46733.00    .096822   .386457  -.0533440
+      46734.00    .098035   .385746  -.0554304
+      46735.00    .099348   .384936  -.0575419
+      46736.00    .100727   .384042  -.0595353
+      46737.00    .102130   .383079  -.0612828
+      46738.00    .103520   .382064  -.0627206
+      46739.00    .104920   .381025  -.0638732
+      46740.00    .106443   .380021  -.0648435
+      46741.00    .108160   .379146  -.0657776
+      46742.00    .110029   .378363  -.0668165
+      46743.00    .111974   .377602  -.0680527
+      46744.00    .113883   .376827  -.0695212
+      46745.00    .115670   .376009  -.0711957
+      46746.00    .117284   .375126  -.0730039
+      46747.00    .118681   .374161  -.0748528
+      46748.00    .119822   .373111  -.0766462
+      46749.00    .120675   .371975  -.0783024
+      46750.00    .121222   .370755  -.0797678
+      46751.00    .121525   .369473  -.0810249
+      46752.00    .121669   .368161  -.0820903
+      46753.00    .121731   .366845  -.0830098
+      46754.00    .121735   .365532  -.0838496
+      46755.00    .121695   .364223  -.0846851
+      46756.00    .121645   .362924  -.0855930
+      46757.00    .121615   .361638  -.0866396
+      46758.00    .121636   .360361  -.0878742
+      46759.00    .121737   .359088  -.0893248
+      46760.00    .121951   .357817  -.0909912
+      46761.00    .122300   .356546  -.0928325
+      46762.00    .122802   .355271  -.0947608
+      46763.00    .123482   .353996  -.0966481
+      46764.00    .124368   .352720  -.0983574
+      46765.00    .125479   .351444  -.0997919
+      46766.00    .126780   .350165  -.1009402
+      46767.00    .128205   .348882  -.1018824
+      46768.00    .129688   .347592  -.1027627
+      46769.00    .131165   .346274  -.1037358
+      46770.00    .132580   .344903  -.1049099
+      46771.00    .133924   .343466  -.1063124
+      46772.00    .135176   .341972  -.1079059
+      46773.00    .136306   .340435  -.1096072
+      46774.00    .137286   .338871  -.1113158
+      46775.00    .138103   .337292  -.1129402
+      46776.00    .138777   .335713  -.1144085
+      46777.00    .139334   .334158  -.1156739
+      46778.00    .139803   .332651  -.1167165
+      46779.00    .140216   .331220  -.1175448
+      46780.00    .140605   .329888  -.1182030
+      46781.00    .140997   .328664  -.1187732
+      46782.00    .141411   .327549  -.1193512
+      46783.00    .141868   .326542  -.1200310
+      46784.00    .142385   .325615  -.1208896
+      46785.00    .142978   .324735  -.1219795
+      46786.00    .143609   .323868  -.1233149
+      46787.00    .144204   .322977  -.1248792
+      46788.00    .144684   .322025  -.1266263
+      46789.00    .145013   .321001  -.1284839
+      46790.00    .145222   .319917  -.1303569
+      46791.00    .145351   .318788  -.1321329
+      46792.00    .145443   .317630  -.1337127
+      46793.00    .145537   .316458  -.1350465
+      46794.00    .145675   .315287  -.1361608
+      46795.00    .145891   .314129  -.1371607
+      46796.00    .146164   .312978  -.1381993
+      46797.00    .146446   .311819  -.1394157
+      46798.00    .146692   .310639  -.1408817
+      46799.00    .146854   .309420  -.1425808
+      46800.00    .146890   .308156  -.1444251
+      46801.00    .146762   .306858  -.1462932
+      46802.00    .146447   .305532  -.1480683
+      46803.00    .145930   .304171  -.1496648
+      46804.00    .145216   .302764  -.1510340
+      46805.00    .144363   .301309  -.1521611
+      46806.00    .143461   .299808  -.1530660
+      46807.00    .142592   .298270  -.1537942
+      46808.00    .141826   .296709  -.1544114
+      46809.00    .141231   .295141  -.1549984
+      46810.00    .140855   .293585  -.1556391
+      46811.00    .140624   .292056  -.1564038
+      46812.00    .140450   .290534  -.1573502
+      46813.00    .140262   .289004  -.1585097
+      46814.00    .139989   .287471  -.1598827
+      46815.00    .139575   .285944  -.1614379
+      46816.00    .139026   .284463  -.1631089
+      46817.00    .138418   .283070  -.1648016
+      46818.00    .137857   .281786  -.1664139
+      46819.00    .137431   .280616  -.1678506
+      46820.00    .137166   .279539  -.1690519
+      46821.00    .137038   .278561  -.1700244
+      46822.00    .137011   .277704  -.1708510
+      46823.00    .137001   .276949  -.1716741
+      46824.00    .136835   .276208  -.1726509
+      46825.00    .136335   .275387  -.1738984
+      46826.00    .135381   .274410  -.1754526
+      46827.00    .134106   .273266  -.1772565
+      46828.00    .132707   .271968  -.1791915
+      46829.00    .131373   .270544  -.1811235
+      46830.00    .130288   .269034  -.1829432
+      46831.00    .129572   .267504  -.1845796
+      46832.00    .129204   .266010  -.1860049
+      46833.00    .129075   .264586  -.1872302
+      46834.00    .129034   .263271  -.1882929
+      46835.00    .128903   .262120  -.1892463
+      46836.00    .128587   .261167  -.1901571
+      46837.00    .128150   .260373  -.1911065
+      46838.00    .127667   .259684  -.1921723
+      46839.00    .127184   .259047  -.1934137
+      46840.00    .126747   .258408  -.1948653
+      46841.00    .126370   .257736  -.1965376
+      46842.00    .126024   .257013  -.1984046
+      46843.00    .125673   .256225  -.2004034
+      46844.00    .125290   .255354  -.2024439
+      46845.00    .124857   .254391  -.2044244
+      46846.00    .124399   .253371  -.2062584
+      46847.00    .123945   .252313  -.2078958
+      46848.00    .123508   .251228  -.2093397
+      46849.00    .123087   .250117  -.2106572
+      46850.00    .122661   .248976  -.2119707
+      46851.00    .122246   .247844  -.2134289
+      46852.00    .121872   .246727  -.2151634
+      46853.00    .121495   .245613  -.2172400
+      46854.00    .121053   .244482  -.2196369
+      46855.00    .120474   .243307  -.2222510
+      46856.00    .119739   .242064  -.2249249
+      46857.00    .118859   .240737  -.2274987
+      46858.00    .117846   .239311  -.2298512
+      46859.00    .116699   .237782  -.2319140
+      46860.00    .115417   .236156  -.2336699
+      46861.00    .114084   .234471  -.2351542
+      46862.00    .112799   .232769  -.2364341
+      46863.00    .111657   .231094  -.2375923
+      46864.00    .110751   .229489  -.2387201
+      46865.00    .110161   .227994  -.2399098
+      46866.00    .109870   .226654  -.2412443
+      46867.00    .109779   .225503  -.2427787
+      46868.00    .109810   .224548  -.2445374
+      46869.00    .109899   .223794  -.2465079
+      46870.00    .109988   .223232  -.2486381
+      46871.00    .110020   .222818  -.2508431
+      46872.00    .109928   .222495  -.2530193
+      46873.00    .109637   .222199  -.2550668
+      46874.00    .109055   .221849  -.2569179
+      46875.00    .108093   .221367  -.2585563
+      46876.00    .106728   .220718  -.2600186
+      46877.00    .105080   .219945  -.2613939
+      46878.00    .103299   .219106  -.2628015
+      46879.00    .101537   .218262  -.2643567
+      46880.00    .099933   .217460  -.2661370
+      46881.00    .098585   .216712  -.2681613
+      46882.00    .097540   .216016  -.2703756
+      46883.00    .096745   .215368  -.2726712
+      46884.00    .096120   .214758  -.2749188
+      46885.00    .095597   .214178  -.2770051
+      46886.00    .095139   .213641  -.2788608
+      46887.00    .094713   .213178  -.2804693
+      46888.00    .094270   .212808  -.2818591
+      46889.00    .093722   .212509  -.2830897
+      46890.00    .092988   .212263  -.2842360
+      46891.00    .092064   .212060  -.2853731
+      46892.00    .090975   .211868  -.2865731
+      46893.00    .089743   .211650  -.2878977
+      46894.00    .088394   .211366  -.2893924
+      46895.00    .086971   .210974  -.2910801
+      46896.00    .085500   .210491  -.2929587
+      46897.00    .083991   .209938  -.2949955
+      46898.00    .082464   .209321  -.2971198
+      46899.00    .080935   .208641  -.2992297
+      46900.00    .079424   .207916  -.3012155
+      46901.00    .077952   .207220  -.3029897
+      46902.00    .076542   .206595  -.3045084
+      46903.00    .075219   .206060  -.3057977
+      46904.00    .074010   .205614  -.3069486
+      46905.00    .072932   .205255  -.3080894
+      46906.00    .071990   .204990  -.3093493
+      46907.00    .071179   .204811  -.3108178
+      46908.00    .070473   .204690  -.3125279
+      46909.00    .069810   .204601  -.3144718
+      46910.00    .069116   .204498  -.3165887
+      46911.00    .068329   .204384  -.3187598
+      46912.00    .067396   .204269  -.3208546
+      46913.00    .066290   .204134  -.3227685
+      46914.00    .064990   .203955  -.3244426
+      46915.00    .063489   .203714  -.3258673
+      46916.00    .061855   .203438  -.3270799
+      46917.00    .060205   .203149  -.3281429
+      46918.00    .058669   .202858  -.3291293
+      46919.00    .057350   .202549  -.3301078
+      46920.00    .056318   .202180  -.3311396
+      46921.00    .055534   .201759  -.3322852
+      46922.00    .054880   .201348  -.3335849
+      46923.00    .054226   .201005  -.3350588
+      46924.00    .053433   .200748  -.3367160
+      46925.00    .052428   .200544  -.3385294
+      46926.00    .051219   .200369  -.3404133
+      46927.00    .049840   .200207  -.3422469
+      46928.00    .048329   .200022  -.3439092
+      46929.00    .046729   .199778  -.3453195
+      46930.00    .045091   .199449  -.3464683
+      46931.00    .043468   .199072  -.3474324
+      46932.00    .041909   .198704  -.3483486
+      46933.00    .040463   .198405  -.3493633
+      46934.00    .039181   .198239  -.3505857
+      46935.00    .038100   .198265  -.3520593
+      46936.00    .037168   .198481  -.3537602
+      46937.00    .036280   .198815  -.3556124
+      46938.00    .035329   .199181  -.3575135
+      46939.00    .034223   .199476  -.3593644
+      46940.00    .032936   .199579  -.3610880
+      46941.00    .031586   .199492  -.3626238
+      46942.00    .030268   .199271  -.3639418
+      46943.00    .029042   .198973  -.3650490
+      46944.00    .027961   .198658  -.3659816
+      46945.00    .027069   .198384  -.3667955
+      46946.00    .026356   .198192  -.3675670
+      46947.00    .025775   .198083  -.3683667
+      46948.00    .025279   .198053  -.3692478
+      46949.00    .024820   .198093  -.3702416
+      46950.00    .024353   .198199  -.3713598
+      46951.00    .023855   .198360  -.3726176
+      46952.00    .023324   .198545  -.3740154
+      46953.00    .022759   .198715  -.3755227
+      46954.00    .022130   .198843  -.3770620
+      46955.00    .021384   .198929  -.3785134
+      46956.00    .020463   .198976  -.3797706
+      46957.00    .019334   .198993  -.3807825
+      46958.00    .018054   .199008  -.3815793
+      46959.00    .016708   .199060  -.3822681
+      46960.00    .015382   .199185  -.3829938
+      46961.00    .014115   .199396  -.3838894
+      46962.00    .012925   .199696  -.3850249
+      46963.00    .011828   .200086  -.3863871
+      46964.00    .010807   .200548  -.3878939
+      46965.00    .009827   .201057  -.3894316
+      46966.00    .008835   .201586  -.3908886
+      46967.00    .007817   .202110  -.3921712
+      46968.00    .006773   .202608  -.3932229
+      46969.00    .005702   .203054  -.3940250
+      46970.00    .004581   .203435  -.3945922
+      46971.00    .003328   .203807  -.3949640
+      46972.00    .001879   .204234  -.3952013
+      46973.00    .000318   .204697  -.3953915
+      46974.00   -.001239   .205162  -.3956235
+      46975.00   -.002680   .205607  -.3959716
+      46976.00   -.003968   .206069  -.3964826
+      46977.00   -.005103   .206556  -.3971767
+      46978.00   -.006110   .207053  -.3980465
+      46979.00   -.007044   .207548  -.3990551
+      46980.00   -.007966   .208033  -.4001420
+      46981.00   -.008911   .208509  -.4012269
+      46982.00   -.009909   .208988  -.4022166
+      46983.00   -.010986   .209478  -.4030268
+      46984.00   -.012169   .209989  -.4036106
+      46985.00   -.013472   .210517  -.4039816
+      46986.00   -.014873   .211044  -.4042189
+      46987.00   -.016356   .211553  -.4044596
+      46988.00   -.017869   .212064  -.4048559
+      46989.00   -.019344   .212606  -.4055222
+      46990.00   -.020705   .213196  -.4064820
+      46991.00   -.021913   .213841  -.4076496
+      46992.00   -.022946   .214544  -.4088811
+      46993.00   -.023784   .215306  -.4100321
+      46994.00   -.024434   .216111  -.4109970
+      46995.00   -.024929   .216938  -.4117266
+      46996.00   -.025340   .217783  -.4122057
+      46997.00   -.025680   .218647  -.4124557
+      46998.00   -.025937   .219537  -.4125270
+      46999.00   -.026102   .220452  -.4124929
+      47000.00   -.026180   .221376  -.4124338
+      47001.00   -.026210   .222271  -.4124291
+      47002.00   -.026216   .223132  -.4125424
+      47003.00   -.026225   .223964  -.4128161
+      47004.00   -.026262   .224772  -.4132713
+      47005.00   -.026357   .225559  -.4139051
+      47006.00   -.026538   .226339  -.4146832
+      47007.00   -.026828   .227130  -.4155480
+      47008.00   -.027249   .227951  -.4164262
+      47009.00   -.027824   .228830  -.4172396
+      47010.00   -.028553   .229784  -.4179193
+      47011.00   -.029366   .230769  -.4184132
+      47012.00   -.030185   .231733  -.4187114
+      47013.00   -.030950   .232651  -.4188688
+      47014.00   -.031605   .233510  -.4190079
+      47015.00   -.032125   .234318  -.4192911
+      47016.00   -.032557   .235103  -.4198449
+      47017.00   -.032972   .235882  -.4207195
+      47018.00   -.033433   .236668  -.4218732
+      47019.00   -.033981   .237483  -.4231936
+      47020.00   -.034635   .238350  -.4245314
+      47021.00   -.035353   .239274  -.4257428
+      47022.00   -.036075   .240246  -.4267350
+      47023.00   -.036740   .241261  -.4274817
+      47024.00   -.037298   .242313  -.4280123
+      47025.00   -.037712   .243403  -.4283918
+      47026.00   -.038015   .244553  -.4286951
+      47027.00   -.038232   .245777  -.4289996
+      47028.00   -.038367   .247084  -.4293826
+      47029.00   -.038417   .248479  -.4299181
+      47030.00   -.038349   .249945  -.4306659
+      47031.00   -.038177   .251444  -.4316518
+      47032.00   -.037996   .252925  -.4328582
+      47033.00   -.037882   .254343  -.4342427
+      47034.00   -.037847   .255669  -.4357424
+      47035.00   -.037895   .256887  -.4372807
+      47036.00   -.038023   .258032  -.4387741
+      47037.00   -.038225   .259111  -.4401286
+      47038.00   -.038498   .260125  -.4412756
+      47039.00   -.038840   .261097  -.4421910
+      47040.00   -.039245   .262047  -.4429115
+      47041.00   -.039685   .262965  -.4435399
+      47042.00   -.040124   .263832  -.4442230
+      47043.00   -.040523   .264630  -.4451130
+      47044.00   -.040855   .265354  -.4463229
+      47045.00   -.041118   .266020  -.4478847
+      47046.00   -.041363   .266679  -.4497182
+      47047.00   -.041653   .267387  -.4516703
+      47048.00   -.042021   .268187  -.4535705
+      47049.00   -.042457   .269114  -.4552813
+      47050.00   -.042953   .270192  -.4567302
+      47051.00   -.043493   .271416  -.4579047
+      47052.00   -.044063   .272731  -.4588415
+      47053.00   -.044648   .274073  -.4596119
+      47054.00   -.045227   .275365  -.4603080
+      47055.00   -.045787   .276532  -.4610335
+      47056.00   -.046373   .277570  -.4618809
+      47057.00   -.046997   .278534  -.4629139
+      47058.00   -.047655   .279488  -.4641732
+      47059.00   -.048324   .280493  -.4656749
+      47060.00   -.048973   .281599  -.4674083
+      47061.00   -.049614   .282841  -.4693152
+      47062.00   -.050272   .284240  -.4713061
+      47063.00   -.050944   .285787  -.4732788
+      47064.00   -.051614   .287435  -.4751360
+      47065.00   -.052266   .289135  -.4768015
+      47066.00   -.052910   .290855  -.4782346
+      47067.00   -.053555   .292544  -.4794534
+      47068.00   -.054200   .294149  -.4805379
+      47069.00   -.054800   .295654  -.4816162
+      47070.00   -.055299   .297063  -.4828365
+      47071.00   -.055709   .298407  -.4843190
+      47072.00   -.056069   .299702  -.4861217
+      47073.00   -.056419   .300959  -.4882227
+      47074.00   -.056798   .302186  -.4905233
+      47075.00   -.057215   .303393  -.4928758
+      47076.00   -.057662   .304588  -.4951190
+      47077.00   -.058140   .305779  -.4971304
+      47078.00   -.058658   .306976  -.4988550
+      47079.00   -.059234   .308184  -.5003025
+      47080.00   -.059879   .309408  -.5015304
+      47081.00   -.060578   .310627  -.5026280
+      47082.00   -.061318   .311812  -.5036915
+      47083.00   -.062070   .312940  -.5048089
+      47084.00   -.062740   .314034  -.5060519
+      47085.00   -.063223   .315126  -.5074719
+      47086.00   -.063481   .316244  -.5090887
+      47087.00   -.063542   .317388  -.5108898
+      47088.00   -.063443   .318552  -.5128381
+      47089.00   -.063229   .319720  -.5148723
+      47090.00   -.062982   .320871  -.5169156
+      47091.00   -.062783   .322005  -.5188895
+      47092.00   -.062657   .323114  -.5207186
+      47093.00   -.062589   .324213  -.5223417
+      47094.00   -.062553   .325320  -.5237487
+      47095.00   -.062531   .326452  -.5249939
+      47096.00   -.062507   .327621  -.5261949
+      47097.00   -.062459   .328833  -.5274888
+      47098.00   -.062370   .330089  -.5289897
+      47099.00   -.062261   .331385  -.5307583
+      47100.00   -.062173   .332711  -.5327890
+      47101.00   -.062171   .334055  -.5350140
+      47102.00   -.062204   .335394  -.5373157
+      47103.00   -.062184   .336699  -.5395601
+      47104.00   -.062019   .337962  -.5416347
+      47105.00   -.061613   .339246  -.5434731
+      47106.00   -.060956   .340659  -.5450545
+      47107.00   -.060130   .342210  -.5464189
+      47108.00   -.059246   .343883  -.5476474
+      47109.00   -.058418   .345665  -.5488370
+      47110.00   -.057743   .347539  -.5500785
+      47111.00   -.057237   .349460  -.5514459
+      47112.00   -.056859   .351377  -.5529858
+      47113.00   -.056557   .353241  -.5547122
+      47114.00   -.056266   .355008  -.5566074
+      47115.00   -.055923   .356643  -.5586307
+      47116.00   -.055519   .358163  -.5607359
+      47117.00   -.055096   .359613  -.5628610
+      47118.00   -.054714   .361041  -.5649276
+      47119.00   -.054428   .362491  -.5668549
+      47120.00   -.054270   .363988  -.5685829
+      47121.00   -.054283   .365542  -.5700928
+      47122.00   -.054500   .367150  -.5714266
+      47123.00   -.054941   .368800  -.5726827
+      47124.00   -.055621   .370474  -.5739870
+      47125.00   -.056525   .372135  -.5754571
+      47126.00   -.057559   .373744  -.5771728
+      47127.00   -.058610   .375255  -.5791443
+      47128.00   -.059560   .376646  -.5813132
+      47129.00   -.060283   .377940  -.5835738
+      47130.00   -.060669   .379173  -.5857988
+      47131.00   -.060705   .380381  -.5878707
+      47132.00   -.060455   .381576  -.5897125
+      47133.00   -.059990   .382762  -.5912961
+      47134.00   -.059370   .383937  -.5926399
+      47135.00   -.058644   .385103  -.5937993
+      47136.00   -.057828   .386266  -.5948576
+      47137.00   -.056931   .387435  -.5959009
+      47138.00   -.055941   .388625  -.5970021
+      47139.00   -.054829   .389872  -.5982189
+      47140.00   -.053586   .391201  -.5995910
+      47141.00   -.052243   .392604  -.6011298
+      47142.00   -.050835   .394060  -.6028227
+      47143.00   -.049410   .395542  -.6046343
+      47144.00   -.048052   .396989  -.6065087
+      47145.00   -.046844   .398339  -.6083731
+      47146.00   -.045784   .399552  -.6101502
+      47147.00   -.044816   .400625  -.6117713
+      47148.00   -.043878   .401565  -.6132009
+      47149.00   -.042903   .402385  -.6144610
+      47150.00   -.041828   .403123  -.6156405
+      47151.00   -.040607   .403827  -.6168739
+      47152.00   -.039281   .404537  -.6182946
+      47153.00   -.037899   .405269  -.6199903
+      47154.00   -.036458   .406039  -.6219738
+      47155.00   -.034936   .406865  -.6241775
+      47156.00   -.033335   .407754  -.6264776
+      47157.00   -.031657   .408711  -.6287351
+      47158.00   -.029907   .409744  -.6308325
+      47159.00   -.028088   .410856  -.6326933
+      47160.00   -.026206   .412048  -.6342906
+      47161.00   -.024282   .413287   .3643500
+      47162.00   -.022333   .414528   .3631681
+      47163.00   -.020379   .415724   .3620846
+      47164.00   -.018437   .416831   .3610156
+      47165.00   -.016529   .417809   .3598894
+      47166.00   -.014674   .418643   .3586506
+      47167.00   -.012861   .419338   .3572612
+      47168.00   -.011080   .419907   .3557089
+      47169.00   -.009315   .420360   .3540054
+      47170.00   -.007555   .420728   .3521806
+      47171.00   -.005836   .421099   .3502919
+      47172.00   -.004197   .421557   .3484143
+      47173.00   -.002659   .422118   .3466188
+      47174.00   -.001282   .422756   .3449689
+      47175.00   -.000119   .423392   .3435070
+      47176.00    .000915   .423966   .3422443
+      47177.00    .001971   .424454   .3411366
+      47178.00    .003149   .424857   .3400813
+      47179.00    .004431   .425192   .3389456
+      47180.00    .005795   .425472   .3376186
+      47181.00    .007263   .425747   .3360472
+      47182.00    .008856   .426060   .3342621
+      47183.00    .010591   .426454   .3323757
+      47184.00    .012479   .426949   .3305363
+      47185.00    .014531   .427485   .3288699
+      47186.00    .016729   .428019   .3274564
+      47187.00    .019043   .428523   .3263147
+      47188.00    .021473   .428978   .3254055
+      47189.00    .024050   .429387   .3246553
+      47190.00    .026750   .429743   .3239802
+      47191.00    .029541   .430052   .3232923
+      47192.00    .032380   .430341   .3225081
+      47193.00    .035225   .430638   .3215594
+      47194.00    .038029   .430972   .3204005
+      47195.00    .040717   .431369   .3190133
+      47196.00    .043197   .431846   .3174101
+      47197.00    .045436   .432383   .3156276
+      47198.00    .047417   .432934   .3137210
+      47199.00    .049127   .433448   .3117564
+      47200.00    .050562   .433883   .3098046
+      47201.00    .051772   .434212   .3079399
+      47202.00    .052828   .434415   .3062239
+      47203.00    .053789   .434472   .3046859
+      47204.00    .054660   .434371   .3033032
+      47205.00    .055477   .434080   .3019846
+      47206.00    .056309   .433626   .3005816
+      47207.00    .057220   .433069   .2989343
+      47208.00    .058272   .432465   .2969319
+      47209.00    .059504   .431860   .2945576
+      47210.00    .060894   .431273   .2919006
+      47211.00    .062344   .430743   .2891320
+      47212.00    .063722   .430316   .2864434
+      47213.00    .064928   .430027   .2839871
+      47214.00    .065945   .429861   .2818466
+      47215.00    .066799   .429796   .2800276
+      47216.00    .067596   .429844   .2784642
+      47217.00    .068476   .429993   .2770556
+      47218.00    .069557   .430227   .2756960
+      47219.00    .070903   .430544   .2742860
+      47220.00    .072553   .430941   .2727442
+      47221.00    .074468   .431406   .2710225
+      47222.00    .076565   .431907   .2691009
+      47223.00    .078739   .432401   .2669896
+      47224.00    .080892   .432834   .2647288
+      47225.00    .082956   .433137   .2623834
+      47226.00    .084978   .433274   .2600346
+      47227.00    .087034   .433225   .2577686
+      47228.00    .089182   .432984   .2556665
+      47229.00    .091479   .432548   .2537920
+      47230.00    .093968   .431925   .2521810
+      47231.00    .096616   .431178   .2508327
+      47232.00    .099373   .430378   .2496800
+      47233.00    .102178   .429573   .2485988
+      47234.00    .104954   .428784   .2474383
+      47235.00    .107628   .428032   .2460608
+      47236.00    .110146   .427325   .2443810
+      47237.00    .112463   .426598   .2424056
+      47238.00    .114535   .425771   .2402340
+      47239.00    .116348   .424764   .2380222
+      47240.00    .117957   .423510   .2359328
+      47241.00    .119427   .422058   .2340876
+      47242.00    .120827   .420480   .2325317
+      47243.00    .122229   .418839   .2312297
+      47244.00    .123705   .417199   .2300952
+      47245.00    .125305   .415613   .2290276
+      47246.00    .126960   .414115   .2279249
+      47247.00    .128550   .412734   .2267026
+      47248.00    .129982   .411461   .2252995
+      47249.00    .131179   .410263   .2236844
+      47250.00    .132077   .409106   .2218552
+      47251.00    .132689   .407969   .2198328
+      47252.00    .133060   .406819   .2176635
+      47253.00    .133242   .405621   .2154137
+      47254.00    .133291   .404331   .2131608
+      47255.00    .133276   .402927   .2109864
+      47256.00    .133296   .401435   .2089597
+      47257.00    .133451   .399885   .2071178
+      47258.00    .133796   .398302   .2054537
+      47259.00    .134366   .396706   .2039126
+      47260.00    .135164   .395107   .2023987
+      47261.00    .136105   .393495   .2007934
+      47262.00    .137096   .391851   .1989811
+      47263.00    .138122   .390169   .1968751
+      47264.00    .139252   .388462   .1944597
+      47265.00    .140573   .386753   .1918060
+      47266.00    .142124   .385078   .1890631
+      47267.00    .143839   .383464   .1864171
+      47268.00    .145638   .381931   .1840284
+      47269.00    .147446   .380503   .1819888
+      47270.00    .149227   .379205   .1803083
+      47271.00    .150923   .378018   .1789243
+      47272.00    .152480   .376907   .1777309
+      47273.00    .153883   .375832   .1766178
+      47274.00    .155182   .374728   .1754892
+      47275.00    .156463   .373523   .1742706
+      47276.00    .157752   .372218   .1729094
+      47277.00    .159044   .370851   .1713784
+      47278.00    .160340   .369461   .1696762
+      47279.00    .161671   .368081   .1678264
+      47280.00    .163064   .366725   .1658776
+      47281.00    .164477   .365389   .1639065
+      47282.00    .165855   .364063   .1620006
+      47283.00    .167147   .362735   .1602385
+      47284.00    .168285   .361394   .1586712
+      47285.00    .169162   .360021   .1573034
+      47286.00    .169788   .358587   .1560843
+      47287.00    .170224   .357071   .1549187
+      47288.00    .170572   .355490   .1536860
+      47289.00    .170939   .353873   .1522705
+      47290.00    .171422   .352246   .1505918
+      47291.00    .172031   .350624   .1486276
+      47292.00    .172740   .349018   .1464257
+      47293.00    .173522   .347441   .1440946
+      47294.00    .174315   .345886   .1417745
+      47295.00    .175061   .344342   .1396002
+      47296.00    .175731   .342790   .1376748
+      47297.00    .176269   .341207   .1360396
+      47298.00    .176616   .339565   .1346682
+      47299.00    .176737   .337839   .1334901
+      47300.00    .176689   .336003   .1324249
+      47301.00    .176571   .334072   .1313853
+      47302.00    .176472   .332078   .1302903
+      47303.00    .176453   .330055   .1290823
+      47304.00    .176504   .328048   .1277310
+      47305.00    .176508   .326097   .1262273
+      47306.00    .176371   .324224   .1245896
+      47307.00    .176036   .322405   .1228631
+      47308.00    .175458   .320609   .1211064
+      47309.00    .174650   .318806   .1193840
+      47310.00    .173647   .316974   .1177611
+      47311.00    .172508   .315109   .1163064
+      47312.00    .171313   .313217   .1150594
+      47313.00    .170143   .311304   .1140094
+      47314.00    .169074   .309379   .1130943
+      47315.00    .168160   .307456   .1122126
+      47316.00    .167385   .305554   .1112338
+      47317.00    .166735   .303687   .1100538
+      47318.00    .166213   .301859   .1086331
+      47319.00    .165809   .300064   .1070061
+      47320.00    .165500   .298286   .1052785
+      47321.00    .165260   .296515   .1035866
+      47322.00    .165075   .294741   .1020572
+      47323.00    .164939   .292954   .1007806
+      47324.00    .164891   .291145   .0997917
+      47325.00    .164964   .289308   .0990674
+      47326.00    .165103   .287445   .0985414
+      47327.00    .165220   .285551   .0981234
+      47328.00    .165235   .283612   .0977212
+      47329.00    .165078   .281610   .0972599
+      47330.00    .164740   .279509   .0966944
+      47331.00    .164408   .277292   .0960175
+      47332.00    .164308   .274976   .0952407
+      47333.00    .164459   .272627   .0943817
+      47334.00    .164844   .270336   .0934727
+      47335.00    .165440   .268181   .0925620
+      47336.00    .166198   .266171   .0917134
+      47337.00    .167033   .264291   .0909916
+      47338.00    .167857   .262495   .0904523
+      47339.00    .168577   .260716   .0901316
+      47340.00    .169078   .258899   .0900288
+      47341.00    .169346   .257053   .0900763
+      47342.00    .169407   .255191   .0901508
+      47343.00    .169293   .253312   .0901073
+      47344.00    .169043   .251413   .0898241
+      47345.00    .168718   .249492   .0892455
+      47346.00    .168392   .247551   .0883989
+      47347.00    .168128   .245587   .0873872
+      47348.00    .167947   .243581   .0863579
+      47349.00    .167849   .241539   .0854474
+      47350.00    .167747   .239484   .0847557
+      47351.00    .167560   .237432   .0843280
+      47352.00    .167240   .235399   .0841458
+      47353.00    .166830   .233390   .0841389
+      47354.00    .166361   .231408   .0842164
+      47355.00    .165858   .229461   .0842809
+      47356.00    .165381   .227575   .0842424
+      47357.00    .164937   .225745   .0840428
+      47358.00    .164436   .223927   .0836617
+      47359.00    .163829   .222063   .0831075
+      47360.00    .163209   .220095   .0824115
+      47361.00    .162581   .218034   .0816152
+      47362.00    .161910   .215909   .0807731
+      47363.00    .161156   .213768   .0799456
+      47364.00    .160277   .211659   .0791869
+      47365.00    .159233   .209618   .0785392
+      47366.00    .158046   .207629   .0780408
+      47367.00    .156759   .205662   .0777049
+      47368.00    .155411   .203688   .0775034
+      47369.00    .154067   .201711   .0773500
+      47370.00    .152797   .199746   .0771104
+      47371.00    .151642   .197803   .0766462
+      47372.00    .150613   .195889   .0758730
+      47373.00    .149680   .193991   .0748029
+      47374.00    .148737   .192093   .0735477
+      47375.00    .147679   .190193   .0722613
+      47376.00    .146460   .188283   .0710986
+      47377.00    .145064   .186359   .0701735
+      47378.00    .143549   .184427   .0695288
+      47379.00    .141975   .182503   .0691416
+      47380.00    .140372   .180588   .0689507
+      47381.00    .138711   .178690   .0688957
+      47382.00    .137032   .176831   .0688826
+      47383.00    .135399   .175036   .0688161
+      47384.00    .133883   .173345   .0686211
+      47385.00    .132534   .171798   .0682485
+      47386.00    .131275   .170397   .0676839
+      47387.00    .130008   .169109   .0669456
+      47388.00    .128643   .167903   .0660771
+      47389.00    .127093   .166742   .0651379
+      47390.00    .125331   .165595   .0641926
+      47391.00    .123406   .164434   .0633086
+      47392.00    .121374   .163241   .0625467
+      47393.00    .119274   .162008   .0619491
+      47394.00    .117135   .160741   .0615310
+      47395.00    .114975   .159443   .0612741
+      47396.00    .112786   .158136   .0611109
+      47397.00    .110555   .156842   .0609245
+      47398.00    .108275   .155581   .0605739
+      47399.00    .105966   .154361   .0599372
+      47400.00    .103668   .153183   .0589596
+      47401.00    .101413   .152048   .0576822
+      47402.00    .099179   .150947   .0562406
+      47403.00    .096931   .149870   .0548202
+      47404.00    .094639   .148808   .0535890
+      47405.00    .092289   .147762   .0526372
+      47406.00    .089921   .146743   .0519722
+      47407.00    .087577   .145762   .0515357
+      47408.00    .085267   .144806   .0512297
+      47409.00    .082984   .143851   .0509546
+      47410.00    .080727   .142877   .0506274
+      47411.00    .078490   .141894   .0501843
+      47412.00    .076267   .140924   .0495867
+      47413.00    .074057   .139990   .0488225
+      47414.00    .071886   .139112   .0479034
+      47415.00    .069777   .138302   .0468630
+      47416.00    .067686   .137557   .0457511
+      47417.00    .065546   .136864   .0446227
+      47418.00    .063293   .136209   .0435312
+      47419.00    .060869   .135577   .0425233
+      47420.00    .058265   .134961   .0416315
+      47421.00    .055502   .134348   .0408676
+      47422.00    .052603   .133723   .0402159
+      47423.00    .049581   .133086   .0396256
+      47424.00    .046436   .132471   .0390073
+      47425.00    .043170   .131913   .0382443
+      47426.00    .039824   .131419   .0372149
+      47427.00    .036435   .130977   .0358406
+      47428.00    .033043   .130578   .0341172
+      47429.00    .029697   .130234   .0321301
+      47430.00    .026438   .129962   .0300408
+      47431.00    .023217   .129768   .0280465
+      47432.00    .019958   .129647   .0263097
+      47433.00    .016604   .129578   .0249050
+      47434.00    .013117   .129525   .0238086
+      47435.00    .009537   .129435   .0229268
+      47436.00    .005981   .129326   .0221395
+      47437.00    .002559   .129250   .0213314
+      47438.00   -.000668   .129269   .0204069
+      47439.00   -.003644   .129446   .0193018
+      47440.00   -.006348   .129831   .0179812
+      47441.00   -.008941   .130419   .0164502
+      47442.00   -.011635   .131184   .0147438
+      47443.00   -.014534   .132069   .0129147
+      47444.00   -.017668   .132983   .0110303
+      47445.00   -.021041   .133834   .0091639
+      47446.00   -.024606   .134593   .0073898
+      47447.00   -.028288   .135265   .0057691
+      47448.00   -.031998   .135860   .0043350
+      47449.00   -.035649   .136389   .0030862
+      47450.00   -.039166   .136885   .0019811
+      47451.00   -.042495   .137399   .0009354
+      47452.00   -.045595   .137986  -.0001641
+      47453.00   -.048446   .138691  -.0014361
+      47454.00   -.051072   .139535  -.0029797
+      47455.00   -.053561   .140503  -.0048462
+      47456.00   -.056022   .141580  -.0069989
+      47457.00   -.058573   .142753  -.0093158
+      47458.00   -.061320   .144005  -.0116231
+      47459.00   -.064320   .145306  -.0137447
+      47460.00   -.067585   .146623  -.0155610
+      47461.00   -.071008   .147942  -.0170483
+      47462.00   -.074448   .149283  -.0182697
+      47463.00   -.077762   .150669  -.0193425
+      47464.00   -.080813   .152136  -.0203951
+      47465.00   -.083525   .153718  -.0215348
+      47466.00   -.086039   .155397  -.0228325
+      47467.00   -.088557   .157148  -.0243200
+      47468.00   -.091194   .158948  -.0259991
+      47469.00   -.093909   .160779  -.0278487
+      47470.00   -.096631   .162627  -.0298275
+      47471.00   -.099338   .164502  -.0318693
+      47472.00   -.102060   .166418  -.0338902
+      47473.00   -.104826   .168374  -.0358126
+      47474.00   -.107616   .170322  -.0375893
+      47475.00   -.110370   .172220  -.0391988
+      47476.00   -.112960   .174102  -.0406350
+      47477.00   -.115258   .176073  -.0419216
+      47478.00   -.117269   .178146  -.0431352
+      47479.00   -.119034   .180309  -.0443845
+      47480.00   -.120585   .182550  -.0457852
+      47481.00   -.121991   .184885  -.0474319
+      47482.00   -.123340   .187332  -.0493727
+      47483.00   -.124708   .189888  -.0515897
+      47484.00   -.126172   .192541  -.0539944
+      47485.00   -.127798   .195270  -.0564475
+      47486.00   -.129602   .198043  -.0587926
+      47487.00   -.131586   .200833  -.0609012
+      47488.00   -.133739   .203614  -.0627064
+      47489.00   -.135980   .206392  -.0642198
+      47490.00   -.138213   .209184  -.0655199
+      47491.00   -.140403   .212013  -.0667258
+      47492.00   -.142552   .214861  -.0679543
+      47493.00   -.144665   .217698  -.0692912
+      47494.00   -.146749   .220493  -.0707816
+      47495.00   -.148794   .223228  -.0724359
+      47496.00   -.150745   .225929  -.0742397
+      47497.00   -.152550   .228623  -.0761494
+      47498.00   -.154162   .231337  -.0781025
+      47499.00   -.155533   .234098  -.0800263
+      47500.00   -.156686   .236928  -.0818496
+      47501.00   -.157701   .239829  -.0835181
+      47502.00   -.158659   .242801  -.0849965
+      47503.00   -.159628   .245841  -.0862774
+      47504.00   -.160621   .248931  -.0873914
+      47505.00   -.161634   .252042  -.0884065
+      47506.00   -.162667   .255108  -.0894034
+      47507.00   -.163707   .258085  -.0904717
+      47508.00   -.164702   .260986  -.0917109
+      47509.00   -.165583   .263835  -.0931807
+      47510.00   -.166239   .266649  -.0948778
+      47511.00   -.166572   .269463  -.0967332
+      47512.00   -.166652   .272299  -.0986221
+      47513.00   -.166579   .275166  -.1004058
+      47514.00   -.166451   .278072  -.1019672
+      47515.00   -.166364   .281028  -.1032387
+      47516.00   -.166345   .284038  -.1042255
+      47517.00   -.166322   .287090  -.1049930
+      47518.00   -.166208   .290178  -.1056444
+      47519.00   -.165936   .293325  -.1062911
+      47520.00   -.165480   .296533  -.1070274
+      47521.00   -.164879   .299756  -.1079153
+      47522.00   -.164185   .302943  -.1089782
+      47523.00   -.163448   .306042  -.1102095
+      47524.00   -.162718   .309000  -.1115825
+      47525.00   -.162014   .311771  -.1130535
+      47526.00   -.161329   .314379  -.1145574
+      47527.00   -.160623   .316868  -.1160242
+      47528.00   -.159834   .319279  -.1173940
+      47529.00   -.158899   .321651  -.1186247
+      47530.00   -.157777   .324021  -.1196954
+      47531.00   -.156514   .326406  -.1206076
+      47532.00   -.155183   .328817  -.1213994
+      47533.00   -.153835   .331261  -.1221507
+      47534.00   -.152507   .333745  -.1229689
+      47535.00   -.151241   .336273  -.1239605
+      47536.00   -.150107   .338829  -.1252112
+      47537.00   -.149139   .341389  -.1267405
+      47538.00   -.148319   .343925  -.1284866
+      47539.00   -.147620   .346411  -.1303312
+      47540.00   -.146987   .348832  -.1321353
+      47541.00   -.146334   .351191  -.1337636
+      47542.00   -.145597   .353501  -.1351367
+      47543.00   -.144734   .355784  -.1362438
+      47544.00   -.143704   .358063  -.1371317
+      47545.00   -.142476   .360360  -.1378875
+      47546.00   -.141091   .362676  -.1386235
+      47547.00   -.139636   .364995  -.1394478
+      47548.00   -.138188   .367291  -.1404436
+      47549.00   -.136813   .369529  -.1416598
+      47550.00   -.135556   .371683  -.1431067
+      47551.00   -.134376   .373769  -.1447478
+      47552.00   -.133268   .375796  -.1465163
+      47553.00   -.132239   .377769  -.1483335
+      47554.00   -.131292   .379698  -.1501200
+      47555.00   -.130378   .381620  -.1518051
+      47556.00   -.129424   .383583  -.1533415
+      47557.00   -.128349   .385633  -.1547032
+      47558.00   -.127087   .387818  -.1558913
+      47559.00   -.125585   .390188  -.1569400
+      47560.00   -.123832   .392773  -.1579212
+      47561.00   -.121911   .395525  -.1589440
+      47562.00   -.119903   .398354  -.1601397
+      47563.00   -.117871   .401156  -.1616185
+      47564.00   -.115849   .403803  -.1634295
+      47565.00   -.113860   .406177  -.1655334
+      47566.00   -.111876   .408262  -.1678033
+      47567.00   -.109852   .410131  -.1700525
+      47568.00   -.107744   .411869  -.1721051
+      47569.00   -.105503   .413566  -.1738461
+      47570.00   -.103089   .415308  -.1752415
+      47571.00   -.100531   .417146  -.1763413
+      47572.00   -.097904   .419098  -.1772436
+      47573.00   -.095312   .421131  -.1780595
+      47574.00   -.092857   .423210  -.1788889
+      47575.00   -.090612   .425283  -.1798109
+      47576.00   -.088536   .427269  -.1808903
+      47577.00   -.086538   .429119  -.1821532
+      47578.00   -.084432   .430932  -.1835922
+      47579.00   -.082059   .432797  -.1851673
+      47580.00   -.079410   .434757  -.1868075
+      47581.00   -.076519   .436825  -.1884434
+      47582.00   -.073472   .438984  -.1900135
+      47583.00   -.070384   .441200  -.1914703
+      47584.00   -.067355   .443424  -.1927852
+      47585.00   -.064462   .445590  -.1939514
+      47586.00   -.061777   .447654  -.1949889
+      47587.00   -.059322   .449590  -.1959522
+      47588.00   -.057032   .451392  -.1969334
+      47589.00   -.054827   .453056  -.1980522
+      47590.00   -.052640   .454584  -.1994315
+      47591.00   -.050464   .455997  -.2011648
+      47592.00   -.048237   .457318  -.2032656
+      47593.00   -.045879   .458566  -.2056514
+      47594.00   -.043333   .459762  -.2081660
+      47595.00   -.040559   .460928  -.2106262
+      47596.00   -.037601   .462108  -.2128614
+      47597.00   -.034537   .463328  -.2147751
+      47598.00   -.031444   .464609  -.2163651
+      47599.00   -.028399   .465972  -.2176977
+      47600.00   -.025444   .467418  -.2188749
+      47601.00   -.022537   .468923  -.2200257
+      47602.00   -.019637   .470447  -.2212566
+      47603.00   -.016728   .471924  -.2226366
+      47604.00   -.013793   .473291  -.2242018
+      47605.00   -.010811   .474489  -.2259581
+      47606.00   -.007772   .475523  -.2278645
+      47607.00   -.004680   .476423  -.2298524
+      47608.00   -.001536   .477221  -.2318442
+      47609.00    .001662   .477931  -.2337629
+      47610.00    .004910   .478562  -.2355462
+      47611.00    .008163   .479117  -.2371585
+      47612.00    .011358   .479605  -.2385892
+      47613.00    .014456   .480025  -.2398493
+      47614.00    .017512   .480344  -.2409700
+      47615.00    .020572   .480580  -.2420101
+      47616.00    .023676   .480793  -.2430699
+      47617.00    .026828   .481018  -.2442733
+      47618.00    .030002   .481275  -.2457298
+      47619.00    .033252   .481540  -.2475001
+      47620.00    .036645   .481775  -.2495596
+      47621.00    .040156   .481968  -.2517880
+      47622.00    .043695   .482123  -.2540059
+      47623.00    .047168   .482245  -.2560372
+      47624.00    .050497   .482334  -.2577692
+      47625.00    .053617   .482389  -.2591858
+      47626.00    .056542   .482418  -.2603588
+      47627.00    .059357   .482421  -.2614125
+      47628.00    .062146   .482398  -.2624770
+      47629.00    .064996   .482348  -.2636536
+      47630.00    .067974   .482275  -.2650022
+      47631.00    .071056   .482182  -.2665444
+      47632.00    .074175   .482084  -.2682722
+      47633.00    .077261   .481993  -.2701558
+      47634.00    .080242   .481921  -.2721509
+      47635.00    .083051   .481881  -.2742048
+      47636.00    .085654   .481862  -.2762618
+      47637.00    .088070   .481819  -.2782747
+      47638.00    .090333   .481716  -.2802104
+      47639.00    .092486   .481533  -.2820442
+      47640.00    .094494   .481236  -.2837585
+      47641.00    .096371   .480834  -.2853637
+      47642.00    .098163   .480347  -.2869023
+      47643.00    .099938   .479781  -.2884530
+      47644.00    .101770   .479145  -.2901074
+      47645.00    .103681   .478475  -.2919493
+      47646.00    .105679   .477783  -.2940401
+      47647.00    .107778   .477063  -.2963841
+      47648.00    .110015   .476300  -.2989080
+      47649.00    .112428   .475470  -.3014717
+      47650.00    .115060   .474545  -.3039073
+      47651.00    .117874   .473559  -.3060707
+      47652.00    .120803   .472567  -.3078923
+      47653.00    .123774   .471615  -.3093978
+      47654.00    .126711   .470731  -.3106890
+      47655.00    .129543   .469925  -.3119010
+      47656.00    .132250   .469156  -.3131560
+      47657.00    .134873   .468363  -.3145339
+      47658.00    .137457   .467478  -.3160676
+      47659.00    .140051   .466439  -.3177515
+      47660.00    .142692   .465202  -.3195541
+      47661.00    .145352   .463771  -.3214257
+      47662.00    .147974   .462165  -.3233090
+      47663.00    .150536   .460428  -.3251465
+      47664.00    .153032   .458624  -.3268908
+      47665.00    .155458   .456813  -.3285086
+      47666.00    .157792   .455046  -.3299836
+      47667.00    .159992   .453368  -.3313262
+      47668.00    .161991   .451794  -.3325726
+      47669.00    .163797   .450258  -.3337839
+      47670.00    .165449   .448686  -.3350409
+      47671.00    .167014   .447059  -.3364270
+      47672.00    .168630   .445410  -.3380170
+      47673.00    .170353   .443761  -.3398651
+      47674.00    .172213   .442138  -.3419779
+      47675.00    .174223   .440579  -.3443007
+      47676.00    .176326   .439081  -.3467165
+      47677.00    .178441   .437618  -.3490693
+      47678.00    .180503   .436141  -.3512058
+      47679.00    .182458   .434592  -.3530186
+      47680.00    .184277   .432933  -.3544779
+      47681.00    .185968   .431184  -.3556373
+      47682.00    .187552   .429384  -.3566092
+      47683.00    .189112   .427581  -.3575300
+      47684.00    .190740   .425782  -.3585215
+      47685.00    .192506   .423983  -.3596579
+      47686.00    .194400   .422163  -.3609551
+      47687.00    .196393   .420297  -.3623900
+      47688.00    .198458   .418355  -.3639148
+      47689.00    .200570   .416317  -.3654695
+      47690.00    .202666   .414182  -.3669805
+      47691.00    .204677   .411958  -.3683846
+      47692.00    .206570   .409656  -.3696329
+      47693.00    .208381   .407288  -.3706947
+      47694.00    .210155   .404868  -.3715637
+      47695.00    .211929   .402408  -.3722632
+      47696.00    .213726   .399916  -.3728549
+      47697.00    .215569   .397397  -.3734306
+      47698.00    .217478   .394856  -.3740968
+      47699.00    .219460   .392288  -.3749524
+      47700.00    .221490   .389688  -.3760604
+      47701.00    .223484   .387050  -.3774185
+      47702.00    .225443   .384378  -.3789637
+      47703.00    .227389   .381680  -.3805834
+      47704.00    .229349   .378961  -.3821356
+      47705.00    .231358   .376225  -.3834821
+      47706.00    .233388   .373459  -.3845358
+      47707.00    .235346   .370661  -.3852727
+      47708.00    .237174   .367822  -.3857380
+      47709.00    .238840   .364929  -.3860344
+      47710.00    .240365   .361986  -.3862903
+      47711.00    .241816   .359017  -.3866311
+      47712.00    .243232   .356043  -.3871441
+      47713.00    .244637   .353083  -.3878642
+      47714.00    .246029   .350152  -.3887809
+      47715.00    .247390   .347247  -.3898499
+      47716.00    .248711   .344346  -.3910046
+      47717.00    .249981   .341423  -.3921652
+      47718.00    .251214   .338475  -.3932617
+      47719.00    .252378   .335505  -.3942564
+      47720.00    .253441   .332538  -.3951311
+      47721.00    .254448   .329617  -.3958903
+      47722.00    .255471   .326783  -.3965658
+      47723.00    .256523   .324049  -.3972030
+      47724.00    .257510   .321393  -.3978523
+      47725.00    .258280   .318751  -.3985792
+      47726.00    .258834   .316059  -.3994760
+      47727.00    .259242   .313273  -.4006205
+      47728.00    .259520   .310377  -.4020440
+      47729.00    .259677   .307373  -.4037092
+      47730.00    .259721   .304260  -.4055103
+      47731.00    .259656   .301045  -.4072883
+      47732.00    .259516   .297755  -.4088916
+      47733.00    .259411   .294397  -.4102297
+      47734.00    .259400   .290980  -.4112703
+      47735.00    .259475   .287550  -.4120367
+      47736.00    .259578   .284153  -.4126159
+      47737.00    .259598   .280826  -.4131170
+      47738.00    .259486   .277618  -.4136479
+      47739.00    .259283   .274517  -.4142997
+      47740.00    .259062   .271488  -.4151187
+      47741.00    .258932   .268482  -.4161049
+      47742.00    .258981   .265471  -.4172229
+      47743.00    .259177   .262452  -.4184194
+      47744.00    .259382   .259419  -.4196321
+      47745.00    .259502   .256372  -.4208062
+      47746.00    .259528   .253308  -.4218918
+      47747.00    .259514   .250247  -.4228527
+      47748.00    .259562   .247205  -.4236824
+      47749.00    .259708   .244204  -.4243916
+      47750.00    .259841   .241279  -.4250039
+      47751.00    .259861   .238419  -.4255850
+      47752.00    .259701   .235585  -.4262314
+      47753.00    .259331   .232721  -.4270534
+      47754.00    .258722   .229769  -.4281495
+      47755.00    .257874   .226673  -.4295740
+      47756.00    .256866   .223437  -.4313153
+      47757.00    .255786   .220100  -.4332828
+      47758.00    .254697   .216697  -.4353113
+      47759.00    .253687   .213255  -.4372182
+      47760.00    .252831   .209803  -.4388607
+      47761.00    .252154   .206380  -.4401749
+      47762.00    .251620   .203035  -.4411822
+      47763.00    .251154   .199820  -.4419658
+      47764.00    .250680   .196789  -.4426360
+      47765.00    .250131   .193995  -.4433011
+      47766.00    .249428   .191364  -.4440612
+      47767.00    .248493   .188770  -.4449861
+      47768.00    .247289   .186106  -.4461029
+      47769.00    .245810   .183287  -.4473984
+      47770.00    .244066   .180279  -.4488220
+      47771.00    .242130   .177130  -.4502998
+      47772.00    .240098   .173910  -.4517486
+      47773.00    .238027   .170686  -.4530928
+      47774.00    .235922   .167512  -.4542755
+      47775.00    .233773   .164445  -.4552687
+      47776.00    .231549   .161528  -.4560882
+      47777.00    .229223   .158754  -.4567806
+      47778.00    .226787   .156103  -.4574131
+      47779.00    .224295   .153554  -.4580653
+      47780.00    .221831   .151091  -.4588307
+      47781.00    .219415   .148691  -.4598036
+      47782.00    .217025   .146348  -.4610755
+      47783.00    .214648   .144057  -.4626902
+      47784.00    .212275   .141805  -.4646152
+      47785.00    .209901   .139576  -.4667389
+      47786.00    .207490   .137349  -.4688831
+      47787.00    .205003   .135107  -.4708694
+      47788.00    .202444   .132834  -.4725772
+      47789.00    .199818   .130546  -.4739759
+      47790.00    .197123   .128280  -.4751244
+      47791.00    .194319   .126036  -.4761386
+      47792.00    .191399   .123797  -.4771475
+      47793.00    .188364   .121549  -.4782554
+      47794.00    .185238   .119268  -.4795257
+      47795.00    .182078   .116925  -.4809871
+      47796.00    .178927   .114535  -.4826303
+      47797.00    .175801   .112143  -.4844125
+      47798.00    .172692   .109843  -.4862662
+      47799.00    .169578   .107752  -.4881118
+      47800.00    .166400   .105964  -.4898709
+      47801.00    .163140   .104437  -.4914920
+      47802.00    .159817   .103076  -.4929552
+      47803.00    .156445   .101784  -.4942671
+      47804.00    .153030   .100460  -.4954603
+      47805.00    .149568   .099020  -.4965907
+      47806.00    .146082   .097493  -.4977285
+      47807.00    .142608   .095962  -.4989574
+      47808.00    .139183   .094510  -.5003659
+      47809.00    .135807   .093205  -.5020325
+      47810.00    .132325   .092049  -.5040085
+      47811.00    .128573   .090993  -.5062987
+      47812.00    .124506   .089968  -.5088255
+      47813.00    .120219   .088938  -.5114430
+      47814.00    .115844   .087877  -.5139777
+      47815.00    .111554   .086777  -.5162918
+      47816.00    .107593   .085697  -.5183447
+      47817.00    .103907   .084674  -.5201702
+      47818.00    .100289   .083678  -.5218716
+      47819.00    .096530   .082687  -.5235770
+      47820.00    .092643   .081623  -.5253861
+      47821.00    .088758   .080515  -.5273585
+      47822.00    .084999   .079469  -.5295096
+      47823.00    .081461   .078569  -.5318132
+      47824.00    .078112   .077817  -.5342076
+      47825.00    .074806   .077207  -.5366070
+      47826.00    .071438   .076761  -.5389626
+      47827.00    .068006   .076490  -.5412601
+      47828.00    .064380   .076301  -.5434609
+      47829.00    .060604   .076052  -.5455241
+      47830.00    .056867   .075662  -.5474344
+      47831.00    .053306   .075251  -.5492010
+      47832.00    .049948   .074957  -.5508516
+      47833.00    .046609   .074778  -.5524322
+      47834.00    .043062   .074689  -.5540111
+      47835.00    .039172   .074657  -.5556779
+      47836.00    .034976   .074651  -.5575302
+      47837.00    .030594   .074651  -.5596418
+      47838.00    .026170   .074658  -.5620377
+      47839.00    .021873   .074685  -.5646849
+      47840.00    .017774   .074750  -.5674802
+      47841.00    .013797   .074867  -.5702598
+      47842.00    .009853   .075052  -.5728625
+      47843.00    .005935   .075329  -.5751842
+      47844.00    .002118   .075723  -.5772119
+      47845.00   -.001536   .076257  -.5790178
+      47846.00   -.005052   .076920  -.5807332
+      47847.00   -.008515   .077690  -.5824945
+      47848.00   -.011982   .078552  -.5844024
+      47849.00   -.015443   .079520  -.5865052
+      47850.00   -.018894   .080613  -.5887973
+      47851.00   -.022304   .081830  -.5912393
+      47852.00   -.025738   .083181  -.5937721
+      47853.00   -.029284   .084672  -.5963324
+      47854.00   -.032975   .086275  -.5988612
+      47855.00   -.036766   .087923  -.6013089
+      47856.00   -.040644   .089531  -.6036224
+      47857.00   -.044621   .091021  -.6057624
+      47858.00   -.048622   .092360  -.6077381
+      47859.00   -.052504   .093533  -.6095892
+      47860.00   -.056142   .094538  -.6113724
+      47861.00   -.059499   .095445  -.6131492
+      47862.00   -.062559   .096349  -.6149856
+      47863.00   -.065327   .097344  -.6169418
+      47864.00   -.067830   .098522  -.6190600
+      47865.00   -.070117   .099965  -.6213521
+      47866.00   -.072305   .101669  -.6238043
+      47867.00   -.074486   .103589  -.6263590
+      47868.00   -.076739   .105674  -.6289126
+      47869.00   -.079122   .107881  -.6313409
+      47870.00   -.081630   .110183  -.6335356
+      47871.00   -.084241   .112555  -.6354462
+      47872.00   -.086932   .114974  -.6371037
+      47873.00   -.089614   .117435  -.6386064
+      47874.00   -.092151   .119956  -.6400823
+      47875.00   -.094464   .122557  -.6416399
+      47876.00   -.096596   .125204  -.6433545
+      47877.00   -.098647   .127845  -.6452473
+      47878.00   -.100700   .130424  -.6472936
+      47879.00   -.102791   .132890  -.6494431
+      47880.00   -.104932   .135228  -.6516350
+      47881.00   -.107038   .137530  -.6537996
+      47882.00   -.109166   .139802  -.6558744
+      47883.00   -.111425   .142033  -.6578097
+      47884.00   -.113908   .144250  -.6595674
+      47885.00   -.116617   .146490  -.6611365
+      47886.00   -.119446   .148785  -.6625434
+      47887.00   -.122271   .151162  -.6638408
+      47888.00   -.124968   .153651  -.6650994
+      47889.00   -.127413   .156281  -.6663989
+      47890.00   -.129524   .159074  -.6678172
+      47891.00   -.131349   .161999  -.6694241
+      47892.00   -.132974   .164998   .3287404
+      47893.00   -.134485   .168017   .3266860
+      47894.00   -.135970   .170997   .3244717
+      47895.00   -.137516   .173884   .3221932
+      47896.00   -.139181   .176642   .3199771
+      47897.00   -.140984   .179271   .3179432
+      47898.00   -.142938   .181783   .3161659
+      47899.00   -.145050   .184190   .3146584
+      47900.00   -.147283   .186517   .3133695
+      47901.00   -.149527   .188891   .3121848
+      47902.00   -.151664   .191448   .3109700
+      47903.00   -.153666   .194203   .3096123
+      47904.00   -.155469   .197091   .3080493
+      47905.00   -.157038   .200038   .3062812
+      47906.00   -.158489   .203022   .3043732
+      47907.00   -.159972   .206036   .3024133
+      47908.00   -.161637   .209075   .3004836
+      47909.00   -.163648   .212119   .2986485
+      47910.00   -.166171   .215135   .2969497
+      47911.00   -.169172   .218109   .2953954
+      47912.00   -.172428   .221071   .2939803
+      47913.00   -.175694   .224056   .2926783
+      47914.00   -.178725   .227102   .2914388
+      47915.00   -.181309   .230256   .2901924
+      47916.00   -.183495   .233556   .2888525
+      47917.00   -.185427   .236998   .2873251
+      47918.00   -.187215   .240537   .2855331
+      47919.00   -.188973   .244118   .2834373
+      47920.00   -.190812   .247664   .2810477
+      47921.00   -.192611   .251151   .2784173
+      47922.00   -.194191   .254600   .2756436
+      47923.00   -.195576   .258070   .2728727
+      47924.00   -.196900   .261580   .2702385
+      47925.00   -.198266   .265115   .2678273
+      47926.00   -.199681   .268675   .2656487
+      47927.00   -.201065   .272274   .2636380
+      47928.00   -.202333   .275932   .2616887
+      47929.00   -.203403   .279667   .2596837
+      47930.00   -.204211   .283483   .2575309
+      47931.00   -.204694   .287359   .2551758
+      47932.00   -.204841   .291287   .2526216
+      47933.00   -.204676   .295263   .2499181
+      47934.00   -.204224   .299284   .2471377
+      47935.00   -.203533   .303354   .2443607
+      47936.00   -.202713   .307486   .2416612
+      47937.00   -.201903   .311642   .2390961
+      47938.00   -.201203   .315725   .2366996
+      47939.00   -.200751   .319639   .2344775
+      47940.00   -.200722   .323310   .2324294
+      47941.00   -.201068   .326771   .2305399
+      47942.00   -.201659   .330102   .2287872
+      47943.00   -.202289   .333378   .2271173
+      47944.00   -.202612   .336678   .2254160
+      47945.00   -.202312   .340074   .2235642
+      47946.00   -.201390   .343597   .2214781
+      47947.00   -.199994   .347250   .2191223
+      47948.00   -.198336   .351023   .2165307
+      47949.00   -.196637   .354907   .2138054
+      47950.00   -.195118   .358888   .2110894
+      47951.00   -.193973   .362910   .2085379
+      47952.00   -.193306   .366897   .2062554
+      47953.00   -.192965   .370776   .2042577
+      47954.00   -.192737   .374532   .2024849
+      47955.00   -.192439   .378169   .2008309
+      47956.00   -.192013   .381747   .1991734
+      47957.00   -.191447   .385333   .1973997
+      47958.00   -.190752   .388961   .1954329
+      47959.00   -.189934   .392658   .1932407
+      47960.00   -.188990   .396433   .1908357
+      47961.00   -.187975   .400222   .1882909
+      47962.00   -.186968   .403938   .1857013
+      47963.00   -.186071   .407506   .1831593
+      47964.00   -.185394   .410852   .1807412
+      47965.00   -.184985   .413929   .1784922
+      47966.00   -.184660   .416814   .1763986
+      47967.00   -.184220   .419631   .1744241
+      47968.00   -.183515   .422474   .1725242
+      47969.00   -.182424   .425419   .1706383
+      47970.00   -.180871   .428535   .1686948
+      47971.00   -.178945   .431863   .1666247
+      47972.00   -.176800   .435421   .1643610
+      47973.00   -.174577   .439208   .1618486
+      47974.00   -.172343   .443146   .1590562
+      47975.00   -.170198   .447045   .1559934
+      47976.00   -.168148   .450794   .1527522
+      47977.00   -.166137   .454332   .1494856
+      47978.00   -.164136   .457615   .1463661
+      47979.00   -.162161   .460647   .1435361
+      47980.00   -.160228   .463506   .1410660
+      47981.00   -.158241   .466349   .1389047
+      47982.00   -.156117   .469229   .1369332
+      47983.00   -.153796   .472157   .1350106
+      47984.00   -.151225   .475109   .1330082
+      47985.00   -.148374   .478055   .1308397
+      47986.00   -.145312   .480999   .1284925
+      47987.00   -.142123   .483957   .1260024
+      47988.00   -.138849   .486959   .1234139
+      47989.00   -.135526   .490037   .1207829
+      47990.00   -.132195   .493212   .1181738
+      47991.00   -.128937   .496456   .1156518
+      47992.00   -.125835   .499714   .1132670
+      47993.00   -.122922   .502925   .1110453
+      47994.00   -.120184   .506020   .1089861
+      47995.00   -.117489   .508907   .1070738
+      47996.00   -.114801   .511621   .1052702
+      47997.00   -.112127   .514204   .1035097
+      47998.00   -.109471   .516685   .1017159
+      47999.00   -.106858   .519103   .0998076
+      48000.00   -.104324   .521523   .0976962
+      48001.00   -.101893   .523999   .0953261
+      48002.00   -.099610   .526519   .0926861
+      48003.00   -.097463   .528988   .0898268
+      48004.00   -.095416   .531306   .0868628
+      48005.00   -.093418   .533400   .0839541
+      48006.00   -.091348   .535243   .0812546
+      48007.00   -.089161   .536945   .0788778
+      48008.00   -.086878   .538638   .0768512
+      48009.00   -.084572   .540379   .0751104
+      48010.00   -.082361   .542122   .0735487
+      48011.00   -.080182   .543839   .0720199
+      48012.00   -.077877   .545523   .0703975
+      48013.00   -.075287   .547166   .0686133
+      48014.00   -.072276   .548758   .0666583
+      48015.00   -.068759   .550281   .0645693
+      48016.00   -.064784   .551772   .0624088
+      48017.00   -.060468   .553258   .0602525
+      48018.00   -.055942   .554752   .0581712
+      48019.00   -.051343   .556267   .0562209
+      48020.00   -.046853   .557798   .0544325
+      48021.00   -.042609   .559319   .0527930
+      48022.00   -.038544   .560777   .0512772
+      48023.00   -.034545   .562139   .0498442
+      48024.00   -.030505   .563381   .0484348
+      48025.00   -.026329   .564505   .0469792
+      48026.00   -.022010   .565557   .0453965
+      48027.00   -.017588   .566569   .0436153
+      48028.00   -.013173   .567518   .0416069
+      48029.00   -.008793   .568420   .0393602
+      48030.00   -.004462   .569293   .0369007
+      48031.00   -.000214   .570103   .0342940
+      48032.00    .003913   .570813   .0316432
+      48033.00    .007879   .571392   .0290757
+      48034.00    .011670   .571830   .0267069
+      48035.00    .015380   .572205   .0246173
+      48036.00    .019079   .572518   .0228185
+      48037.00    .022725   .572767   .0212270
+      48038.00    .026334   .572981   .0196908
+      48039.00    .029941   .573192   .0180715
+      48040.00    .033584   .573433   .0162917
+      48041.00    .037283   .573697   .0143478
+      48042.00    .041030   .573946   .0122870
+      48043.00    .044816   .574165   .0101794
+      48044.00    .048642   .574355   .0080994
+      48045.00    .052531   .574522   .0061118
+      48046.00    .056477   .574617   .0042663
+      48047.00    .060427   .574560   .0025991
+      48048.00    .064325   .574288   .0011235
+      48049.00    .068136   .573790  -.0001825
+      48050.00    .071863   .573089  -.0013675
+      48051.00    .075621   .572246  -.0025001
+      48052.00    .079542   .571331  -.0036596
+      48053.00    .083643   .570420  -.0049200
+      48054.00    .087869   .569582  -.0063350
+      48055.00    .092108   .568860  -.0079295
+      48056.00    .096265   .568224  -.0097134
+      48057.00    .100309   .567608  -.0116770
+      48058.00    .104234   .566950  -.0137740
+      48059.00    .108071   .566198  -.0159224
+      48060.00    .111870   .565323  -.0180150
+      48061.00    .115674   .564316  -.0199498
+      48062.00    .119509   .563148  -.0216658
+      48063.00    .123347   .561823  -.0231539
+      48064.00    .127096   .560361  -.0244627
+      48065.00    .130620   .558791  -.0256832
+      48066.00    .134018   .557053  -.0269483
+      48067.00    .137425   .555162  -.0283598
+      48068.00    .140913   .553151  -.0299500
+      48069.00    .144519   .551067  -.0316821
+      48070.00    .148236   .549015  -.0334770
+      48071.00    .152136   .547071  -.0352622
+      48072.00    .156303   .545287  -.0369802
+      48073.00    .160777   .543635  -.0385964
+      48074.00    .165414   .542060  -.0400777
+      48075.00    .169947   .540503  -.0413918
+      48076.00    .174278   .538913  -.0425512
+      48077.00    .178387   .537236  -.0435793
+      48078.00    .182250   .535415  -.0445130
+      48079.00    .185852   .533390  -.0454012
+      48080.00    .189216   .531114  -.0462908
+      48081.00    .192463   .528646  -.0472579
+      48082.00    .195765   .526086  -.0483778
+      48083.00    .199218   .523520  -.0496942
+      48084.00    .202743   .521000  -.0512015
+      48085.00    .206192   .518522  -.0528385
+      48086.00    .209567   .516057  -.0545233
+      48087.00    .212890   .513585  -.0561489
+      48088.00    .216181   .511092  -.0576099
+      48089.00    .219452   .508596  -.0588309
+      48090.00    .222704   .506113  -.0597892
+      48091.00    .225900   .503614  -.0605297
+      48092.00    .229029   .501038  -.0611658
+      48093.00    .232094   .498320  -.0618410
+      48094.00    .235100   .495415  -.0626823
+      48095.00    .238069   .492348  -.0637592
+      48096.00    .241052   .489190  -.0650623
+      48097.00    .244089   .486004  -.0665222
+      48098.00    .247129   .482782  -.0680495
+      48099.00    .250068   .479505  -.0695657
+      48100.00    .252813   .476174  -.0710254
+      48101.00    .255333   .472800  -.0723894
+      48102.00    .257658   .469387  -.0736311
+      48103.00    .259827   .465943  -.0747407
+      48104.00    .261882   .462474  -.0757207
+      48105.00    .263860   .458987  -.0765851
+      48106.00    .265854   .455485  -.0773983
+      48107.00    .267940   .451994  -.0782502
+      48108.00    .270121   .448524  -.0792279
+      48109.00    .272360   .445084  -.0804064
+      48110.00    .274589   .441685  -.0818318
+      48111.00    .276741   .438343  -.0835090
+      48112.00    .278754   .435072  -.0853967
+      48113.00    .280596   .431901  -.0874084
+      48114.00    .282279   .428841  -.0894342
+      48115.00    .283818   .425877  -.0913622
+      48116.00    .285247   .422970  -.0931091
+      48117.00    .286585   .420014  -.0946352
+      48118.00    .287859   .416916  -.0959629
+      48119.00    .289172   .413704  -.0971804
+      48120.00    .290686   .410418  -.0984078
+      48121.00    .292427   .407051  -.0997677
+      48122.00    .294320   .403618  -.1013457
+      48123.00    .296284   .400149  -.1031677
+      48124.00    .298236   .396673  -.1051968
+      48125.00    .300054   .393217  -.1073506
+      48126.00    .301644   .389767  -.1095274
+      48127.00    .302975   .386306  -.1116384
+      48128.00    .304034   .382824  -.1136104
+      48129.00    .304812   .379313  -.1153995
+      48130.00    .305343   .375769  -.1169930
+      48131.00    .305706   .372194  -.1184076
+      48132.00    .305957   .368585  -.1196803
+      48133.00    .306169   .364943  -.1208648
+      48134.00    .306493   .361281  -.1220331
+      48135.00    .307079   .357616  -.1232639
+      48136.00    .307923   .353948  -.1246436
+      48137.00    .308928   .350259  -.1262465
+      48138.00    .309992   .346527  -.1281148
+      48139.00    .311003   .342728  -.1302441
+      48140.00    .311833   .338838  -.1325698
+      48141.00    .312470   .334859  -.1349571
+      48142.00    .312954   .330804  -.1372534
+      48143.00    .313259   .326689  -.1393367
+      48144.00    .313337   .322545  -.1411452
+      48145.00    .313177   .318438  -.1426925
+      48146.00    .312883   .314378  -.1440792
+      48147.00    .312523   .310356  -.1454500
+      48148.00    .312119   .306392  -.1469374
+      48149.00    .311661   .302501  -.1486353
+      48150.00    .311131   .298699  -.1505805
+      48151.00    .310531   .294983  -.1527464
+      48152.00    .309871   .291347  -.1550642
+      48153.00    .309160   .287783  -.1574408
+      48154.00    .308393   .284282  -.1597815
+      48155.00    .307506   .280822  -.1620083
+      48156.00    .306397   .277373  -.1640705
+      48157.00    .305056   .273887  -.1659581
+      48158.00    .303574   .270303  -.1676926
+      48159.00    .302063   .266557  -.1693171
+      48160.00    .300634   .262617  -.1708895
+      48161.00    .299388   .258587  -.1724761
+      48162.00    .298364   .254585  -.1741494
+      48163.00    .297561   .250709  -.1759802
+      48164.00    .296905   .247030  -.1780282
+      48165.00    .296302   .243594  -.1803265
+      48166.00    .295654   .240360  -.1828631
+      48167.00    .294851   .237241  -.1855792
+      48168.00    .293782   .234151  -.1883677
+      48169.00    .292376   .230984  -.1910975
+      48170.00    .290636   .227640  -.1936458
+      48171.00    .288711   .224110  -.1959332
+      48172.00    .286692   .220434  -.1979555
+      48173.00    .284630   .216660  -.1997832
+      48174.00    .282572   .212839  -.2015301
+      48175.00    .280541   .209022  -.2033154
+      48176.00    .278421   .205271  -.2052338
+      48177.00    .276142   .201622  -.2073263
+      48178.00    .273732   .198072  -.2095793
+      48179.00    .271236   .194613  -.2119396
+      48180.00    .268687   .191236  -.2143357
+      48181.00    .266124   .187938  -.2166969
+      48182.00    .263546   .184709  -.2189627
+      48183.00    .260909   .181498  -.2210914
+      48184.00    .258171   .178283  -.2230666
+      48185.00    .255334   .175151  -.2248874
+      48186.00    .252529   .172099  -.2265925
+      48187.00    .249944   .169070  -.2282489
+      48188.00    .247695   .166030  -.2299310
+      48189.00    .245667   .163016  -.2316994
+      48190.00    .243703   .160079  -.2336061
+      48191.00    .241754   .157249  -.2356992
+      48192.00    .239851   .154550  -.2380273
+      48193.00    .238015   .152003  -.2406142
+      48194.00    .236208   .149592  -.2434364
+      48195.00    .234410   .147255  -.2464136
+      48196.00    .232557   .144959  -.2494178
+      48197.00    .230548   .142681  -.2523024
+      48198.00    .228263   .140412  -.2549381
+      48199.00    .225562   .138140  -.2572554
+      48200.00    .222305   .135834  -.2592738
+      48201.00    .218641   .133500  -.2611209
+      48202.00    .214857   .131159  -.2629680
+      48203.00    .211202   .128824  -.2649608
+      48204.00    .207788   .126509  -.2671750
+      48205.00    .204666   .124230  -.2696089
+      48206.00    .201775   .121988  -.2721936
+      48207.00    .199017   .119764  -.2748376
+      48208.00    .196297   .117541  -.2774490
+      48209.00    .193519   .115309  -.2799492
+      48210.00    .190608   .113086  -.2822820
+      48211.00    .187568   .110916  -.2844222
+      48212.00    .184445   .108853  -.2863721
+      48213.00    .181286   .106953  -.2881592
+      48214.00    .178131   .105240  -.2898352
+      48215.00    .175047   .103600  -.2914843
+      48216.00    .172026   .102002  -.2931847
+      48217.00    .169017   .100466  -.2949979
+      48218.00    .165974   .098992  -.2969738
+      48219.00    .162854   .097582  -.2991467
+      48220.00    .159599   .096223  -.3015319
+      48221.00    .156136   .094901  -.3041180
+      48222.00    .152413   .093609  -.3068584
+      48223.00    .148427   .092345  -.3096706
+      48224.00    .144337   .091103  -.3124545
+      48225.00    .140317   .089885  -.3151098
+      48226.00    .136535   .088739  -.3175645
+      48227.00    .132960   .087668  -.3198018
+      48228.00    .129504   .086654  -.3218807
+      48229.00    .126079   .085679  -.3239147
+      48230.00    .122590   .084722  -.3260221
+      48231.00    .119050   .083780  -.3282816
+      48232.00    .115520   .082857  -.3307054
+      48233.00    .112032   .081940  -.3332465
+      48234.00    .108594   .081004  -.3358221
+      48235.00    .105159   .080000  -.3383410
+      48236.00    .101696   .078953  -.3407106
+      48237.00    .098177   .077921  -.3428633
+      48238.00    .094582   .076908  -.3447823
+      48239.00    .090989   .075839  -.3464901
+      48240.00    .087493   .074656  -.3480344
+      48241.00    .084124   .073460  -.3494722
+      48242.00    .080833   .072344  -.3508638
+      48243.00    .077561   .071380  -.3522759
+      48244.00    .074250   .070638  -.3537777
+      48245.00    .070866   .070146  -.3554434
+      48246.00    .067377   .069860  -.3573110
+      48247.00    .063775   .069730  -.3593874
+      48248.00    .060069   .069705  -.3616542
+      48249.00    .056270   .069732  -.3640664
+      48250.00    .052379   .069786  -.3665589
+      48251.00    .048355   .069869  -.3690509
+      48252.00    .044145   .069989  -.3714556
+      48253.00    .039730   .070144  -.3737009
+      48254.00    .035225   .070309  -.3757491
+      48255.00    .030776   .070470  -.3776271
+      48256.00    .026474   .070678  -.3794330
+      48257.00    .022389   .070986   .6186975
+      48258.00    .018591   .071447   .6166447
+      48259.00    .015151   .072113   .6143495
+      48260.00    .012118   .073018   .6118302
+      48261.00    .009382   .074132   .6091699
+      48262.00    .006782   .075384   .6064782
+      48263.00    .004177   .076691   .6038514
+      48264.00    .001418   .077970   .6013588
+      48265.00   -.001661   .079172   .5990451
+      48266.00   -.005050   .080296   .5969117
+      48267.00   -.008653   .081354   .5949329
+      48268.00   -.012377   .082340   .5930695
+      48269.00   -.016122   .083186   .5912743
+      48270.00   -.019806   .083830   .5894949
+      48271.00   -.023464   .084317   .5876705
+      48272.00   -.027175   .084736   .5857450
+      48273.00   -.031011   .085171   .5836807
+      48274.00   -.034995   .085646   .5814692
+      48275.00   -.039044   .086098   .5791302
+      48276.00   -.043017   .086553   .5766972
+      48277.00   -.046776   .087092   .5742211
+      48278.00   -.050215   .087788   .5717685
+      48279.00   -.053236   .088712   .5694044
+      48280.00   -.055812   .089927   .5671813
+      48281.00   -.058173   .091415   .5651398
+      48282.00   -.060588   .093097   .5632680
+      48283.00   -.063289   .094881   .5614935
+      48284.00   -.066451   .096671   .5597015
+      48285.00   -.070208   .098382   .5577729
+      48286.00   -.074442   .100022   .5556263
+      48287.00   -.078910   .101594   .5532423
+      48288.00   -.083389   .103081   .5506707
+      48289.00   -.087740   .104469   .5480040
+      48290.00   -.091885   .105752   .5453487
+      48291.00   -.095784   .106978   .5428091
+      48292.00   -.099377   .108224   .5404512
+      48293.00   -.102658   .109555   .5382971
+      48294.00   -.105703   .110999   .5363232
+      48295.00   -.108620   .112573   .5344856
+      48296.00   -.111491   .114302   .5327295
+      48297.00   -.114367   .116185   .5309856
+      48298.00   -.117315   .118198   .5291822
+      48299.00   -.120404   .120310   .5272551
+      48300.00   -.123664   .122513   .5251586
+      48301.00   -.126908   .124910   .5228707
+      48302.00   -.130112   .127563   .5203904
+      48303.00   -.133270   .130449   .5177638
+      48304.00   -.136368   .133521   .5150737
+      48305.00   -.139405   .136727   .5124253
+      48306.00   -.142389   .140004   .5099051
+      48307.00   -.145325   .143291   .5075665
+      48308.00   -.148250   .146514   .5054215
+      48309.00   -.151190   .149542   .5034249
+      48310.00   -.154175   .152268   .5014858
+      48311.00   -.157177   .154778   .4995116
+      48312.00   -.160098   .157240   .4974054
+      48313.00   -.162850   .159794   .4950844
+      48314.00   -.165376   .162467   .4925069
+      48315.00   -.167647   .165250   .4896908
+      48316.00   -.169720   .168114   .4867258
+      48317.00   -.171679   .171052   .4837438
+      48318.00   -.173596   .174060   .4808788
+      48319.00   -.175545   .177130   .4782346
+      48320.00   -.177585   .180250   .4758656
+      48321.00   -.179691   .183430   .4737648
+      48322.00   -.181814   .186689   .4718903
+      48323.00   -.183873   .190040   .4701765
+      48324.00   -.185715   .193494   .4685319
+      48325.00   -.187247   .197079   .4668623
+      48326.00   -.188552   .200801   .4650913
+      48327.00   -.189749   .204643   .4631528
+      48328.00   -.190961   .208577   .4610003
+      48329.00   -.192341   .212539   .4586217
+      48330.00   -.193994   .216441   .4560330
+      48331.00   -.195667   .220202   .4532397
+      48332.00   -.197292   .223842   .4503304
+      48333.00   -.198813   .227397   .4474393
+      48334.00   -.200148   .230902   .4446940
+      48335.00   -.201247   .234395   .4421798
+      48336.00   -.202195   .237934   .4399037
+      48337.00   -.203113   .241573   .4378071
+      48338.00   -.204155   .245328   .4357970
+      48339.00   -.205483   .249211   .4337687
+      48340.00   -.207237   .253232   .4316295
+      48341.00   -.209344   .257362   .4292805
+      48342.00   -.211542   .261519   .4266726
+      48343.00   -.213596   .265659   .4238689
+      48344.00   -.215298   .269752   .4209839
+      48345.00   -.216509   .273776   .4181445
+      48346.00   -.217320   .277756   .4154460
+      48347.00   -.217857   .281739   .4129329
+      48348.00   -.218249   .285770   .4106103
+      48349.00   -.218610   .289880   .4084511
+      48350.00   -.219006   .294038   .4064165
+      48351.00   -.219449   .298196   .4044592
+      48352.00   -.219906   .302322   .4025264
+      48353.00   -.220303   .306406   .4005663
+      48354.00   -.220558   .310445   .3985331
+      48355.00   -.220598   .314438   .3963880
+      48356.00   -.220373   .318404   .3940960
+      48357.00   -.219857   .322358   .3916419
+      48358.00   -.219056   .326309   .3890362
+      48359.00   -.218014   .330253   .3863229
+      48360.00   -.216806   .334184   .3835812
+      48361.00   -.215546   .338103   .3809266
+      48362.00   -.214356   .342027   .3784616
+      48363.00   -.213352   .345978   .3762352
+      48364.00   -.212598   .349971   .3742255
+      48365.00   -.212116   .353997   .3723417
+      48366.00   -.211712   .357991   .3704127
+      48367.00   -.211353   .361955   .3683187
+      48368.00   -.211093   .365896   .3660009
+      48369.00   -.210987   .369820   .3634567
+      48370.00   -.211028   .373708   .3607315
+      48371.00   -.211077   .377499   .3579095
+      48372.00   -.211001   .381195   .3550906
+      48373.00   -.210716   .384817   .3523675
+      48374.00   -.210235   .388395   .3498073
+      48375.00   -.209581   .391966   .3474433
+      48376.00   -.208780   .395564   .3452739
+      48377.00   -.207855   .399210   .3432674
+      48378.00   -.206791   .402890   .3413683
+      48379.00   -.205572   .406589   .3395114
+      48380.00   -.204205   .410310   .3376298
+      48381.00   -.202702   .414042   .3356575
+      48382.00   -.201075   .417773   .3335389
+      48383.00   -.199327   .421520   .3312343
+      48384.00   -.197475   .425296   .3287302
+      48385.00   -.195569   .429075   .3260494
+      48386.00   -.193643   .432845   .3232425
+      48387.00   -.191707   .436597   .3203892
+      48388.00   -.189725   .440306   .3175869
+      48389.00   -.187655   .443949   .3149288
+      48390.00   -.185453   .447502   .3124747
+      48391.00   -.183061   .450942   .3102256
+      48392.00   -.180442   .454273   .3081325
+      48393.00   -.177606   .457530   .3061030
+      48394.00   -.174586   .460741   .3040388
+      48395.00   -.171472   .463903   .3018647
+      48396.00   -.168371   .467004   .2995630
+      48397.00   -.165388   .470030   .2971748
+      48398.00   -.162556   .472974   .2947821
+      48399.00   -.159759   .475856   .2924858
+      48400.00   -.156924   .478719   .2903538
+      48401.00   -.154015   .481596   .2884229
+      48402.00   -.151055   .484485   .2866991
+      48403.00   -.148081   .487372   .2851582
+      48404.00   -.145115   .490241   .2837485
+      48405.00   -.142177   .493080   .2824062
+      48406.00   -.139273   .495891   .2810759
+      48407.00   -.136397   .498678   .2797012
+      48408.00   -.133530   .501446   .2782301
+      48409.00   -.130632   .504185   .2766170
+      48410.00   -.127650   .506887   .2748345
+      48411.00   -.124536   .509546   .2728759
+      48412.00   -.121236   .512145   .2707460
+      48413.00   -.117799   .514711   .2684654
+      48414.00   -.114309   .517299   .2660808
+      48415.00   -.110827   .519947   .2636634
+      48416.00   -.107321   .522631   .2613040
+      48417.00   -.103738   .525310   .2590792
+      48418.00   -.100023   .527945   .2570190
+      48419.00   -.096172   .530474   .2551011
+      48420.00   -.092407   .532808   .2532746
+      48421.00   -.088697   .534938   .2514330
+      48422.00   -.084948   .536894   .2494815
+      48423.00   -.081217   .538697   .2473810
+      48424.00   -.077580   .540381   .2451650
+      48425.00   -.074071   .542020   .2429220
+      48426.00   -.070701   .543663   .2407553
+      48427.00   -.067473   .545292   .2387508
+      48428.00   -.064420   .546876   .2369620
+      48429.00   -.061563   .548392   .2354087
+      48430.00   -.058826   .549874   .2340892
+      48431.00   -.056103   .551379   .2329812
+      48432.00   -.053290   .552965   .2320435
+      48433.00   -.050301   .554667   .2312179
+      48434.00   -.047131   .556431   .2304329
+      48435.00   -.043799   .558138   .2296136
+      48436.00   -.040312   .559642   .2286955
+      48437.00   -.036690   .560847   .2276412
+      48438.00   -.033013   .561856   .2264439
+      48439.00   -.029366   .562824   .2251163
+      48440.00   -.025727   .563843   .2236695
+      48441.00   -.021941   .564872   .2221343
+      48442.00   -.017994   .565876   .2205824
+      48443.00   -.013950   .566824   .2190993
+      48444.00   -.009878   .567683   .2177630
+      48445.00   -.005846   .568421   .2166216
+      48446.00   -.001914   .569021   .2156705
+      48447.00    .001903   .569477   .2148371
+      48448.00    .005725   .569812   .2139795
+      48449.00    .009670   .570109   .2129437
+      48450.00    .013729   .570442   .2116343
+      48451.00    .017946   .570858   .2100398
+      48452.00    .022375   .571352   .2082363
+      48453.00    .026968   .571904   .2063631
+      48454.00    .031649   .572418   .2045564
+      48455.00    .036358   .572701   .2029001
+      48456.00    .041044   .572782   .2014419
+      48457.00    .045589   .572739   .2002059
+      48458.00    .050029   .572650   .1991700
+      48459.00    .054497   .572540   .1982781
+      48460.00    .059109   .572417   .1974633
+      48461.00    .063817   .572247   .1966611
+      48462.00    .068502   .572009   .1958101
+      48463.00    .073105   .571718   .1948501
+      48464.00    .077590   .571383   .1937368
+      48465.00    .081901   .571007   .1924553
+      48466.00    .085971   .570583   .1910240
+      48467.00    .089710   .570085   .1895032
+      48468.00    .093032   .569494   .1879815
+      48469.00    .096042   .568777   .1865172
+      48470.00    .098933   .567909   .1851435
+      48471.00    .101871   .566886   .1838886
+      48472.00    .104958   .565705   .1827794
+      48473.00    .108217   .564427   .1818143
+      48474.00    .111662   .563106   .1809531
+      48475.00    .115248   .561778   .1801100
+      48476.00    .118816   .560444   .1791690
+      48477.00    .122395   .559084   .1780101
+      48478.00    .126042   .557680   .1765680
+      48479.00    .129721   .556237   .1748620
+      48480.00    .133366   .554770   .1729817
+      48481.00    .136914   .553290   .1710455
+      48482.00    .140316   .551783   .1691646
+      48483.00    .143560   .550210   .1674311
+      48484.00    .146642   .548540   .1658892
+      48485.00    .149543   .546773   .1645384
+      48486.00    .152226   .544914   .1633450
+      48487.00    .154714   .542974   .1622537
+      48488.00    .157052   .540992   .1612062
+      48489.00    .159312   .538993   .1601450
+      48490.00    .161609   .536939   .1590155
+      48491.00    .164054   .534799   .1577638
+      48492.00    .166659   .532583   .1563302
+      48493.00    .169344   .530338   .1546978
+      48494.00    .171997   .528109   .1528838
+      48495.00    .174560   .525956   .1509325
+      48496.00    .177137   .523935   .1489024
+      48497.00    .179726   .521986   .1468790
+      48498.00    .182299   .520033   .1449414
+      48499.00    .184849   .518012   .1431336
+      48500.00    .187398   .515918   .1414584
+      48501.00    .189978   .513764   .1398743
+      48502.00    .192616   .511566   .1383010
+      48503.00    .195337   .509352   .1366345
+      48504.00    .198209   .507148   .1347696
+      48505.00    .201270   .504976   .1326407
+      48506.00    .204388   .502847   .1302495
+      48507.00    .207393   .500743   .1276691
+      48508.00    .210161   .498606   .1250076
+      48509.00    .212566   .496400   .1223822
+      48510.00    .214480   .494106   .1198897
+      48511.00    .215997   .491708   .1175991
+      48512.00    .217312   .489190   .1155326
+      48513.00    .218598   .486539   .1136722
+      48514.00    .219935   .483763   .1119721
+      48515.00    .221414   .480892   .1103748
+      48516.00    .223135   .477963   .1088260
+      48517.00    .225137   .475008   .1072693
+      48518.00    .227290   .472047   .1056320
+      48519.00    .229438   .469103   .1038529
+      48520.00    .231466   .466196   .1018945
+      48521.00    .233424   .463342   .0997466
+      48522.00    .235406   .460554   .0974257
+      48523.00    .237502   .457846   .0949725
+      48524.00    .239748   .455199   .0924587
+      48525.00    .242034   .452492   .0899884
+      48526.00    .244219   .449613   .0876444
+      48527.00    .246208   .446617   .0854745
+      48528.00    .247973   .443544   .0834657
+      48529.00    .249478   .440410   .0815602
+      48530.00    .250664   .437218   .0796781
+      48531.00    .251533   .433958   .0777307
+      48532.00    .252261   .430611   .0756290
+      48533.00    .253026   .427190   .0733329
+      48534.00    .253919   .423732   .0708653
+      48535.00    .254908   .420246   .0683008
+      48536.00    .255934   .416738   .0657398
+      48537.00    .256938   .413216   .0632768
+      48538.00    .257857   .409694   .0609769
+      48539.00    .258653   .406205   .0588820
+      48540.00    .259307   .402771   .0569980
+      48541.00    .259816   .399401   .0552983
+      48542.00    .260215   .396078   .0537336
+      48543.00    .260541   .392784   .0522502
+      48544.00    .260834   .389497   .0508005
+      48545.00    .261131   .386204   .0493325
+      48546.00    .261471   .382917   .0477694
+      48547.00    .261748   .379673   .0460491
+      48548.00    .261878   .376475   .0441486
+      48549.00    .261867   .373298   .0420742
+      48550.00    .261762   .370065   .0398639
+      48551.00    .261585   .366705   .0375816
+      48552.00    .261298   .363280   .0353079
+      48553.00    .260952   .359926   .0331125
+      48554.00    .260565   .356662   .0310547
+      48555.00    .260157   .353463   .0291278
+      48556.00    .259771   .350310   .0272670
+      48557.00    .259457   .347183   .0253742
+      48558.00    .259269   .344065   .0233532
+      48559.00    .259278   .340934   .0211389
+      48560.00    .259575   .337805   .0187158
+      48561.00    .260184   .334747   .0160973
+      48562.00    .261067   .331831   .0133398
+      48563.00    .262021   .329086   .0105434
+      48564.00    .262838   .326446   .0078236
+      48565.00    .263316   .323824   .0052780
+      48566.00    .263351   .321155   .0029617
+      48567.00    .263058   .318417   .0008641
+      48568.00    .262580   .315600  -.0010654
+      48569.00    .262019   .312716  -.0028975
+      48570.00    .261375   .309796  -.0047002
+      48571.00    .260618   .306885  -.0065338
+      48572.00    .259733   .303992  -.0084483
+      48573.00    .258711   .301113  -.0104806
+      48574.00    .257557   .298217  -.0126521
+      48575.00    .256324   .295259  -.0149750
+      48576.00    .255081   .292194  -.0174429
+      48577.00    .253909   .289017  -.0200270
+      48578.00    .252920   .285821  -.0226646
+      48579.00    .252234   .282720  -.0252746
+      48580.00    .251872   .279772  -.0277784
+      48581.00    .251571   .276910  -.0301254
+      48582.00    .251059   .274132  -.0322901
+      48583.00    .250193   .271398  -.0343196
+      48584.00    .249052   .268621  -.0363251
+      48585.00    .247766   .265706  -.0384389
+      48586.00    .246464   .262558  -.0407691
+      48587.00    .245276   .259134  -.0433617
+      48588.00    .244270   .255563  -.0461708
+      48589.00    .243445   .251970  -.0491002
+      48590.00    .242748   .248441  -.0520428
+      48591.00    .242116   .245061  -.0548992
+      48592.00    .241483   .241909  -.0575943
+      48593.00    .240748   .239028  -.0600857
+      48594.00    .239785   .236379  -.0623717
+      48595.00    .238404   .233887  -.0644791
+      48596.00    .236477   .231434  -.0664603
+      48597.00    .234014   .228899  -.0683727
+      48598.00    .231202   .226236  -.0702803
+      48599.00    .228292   .223448  -.0722415
+      48600.00    .225542   .220545  -.0743029
+      48601.00    .223142   .217573  -.0764947
+      48602.00    .221062   .214672  -.0788245
+      48603.00    .219187   .211939  -.0812771
+      48604.00    .217366   .209355  -.0838232
+      48605.00    .215521   .206838  -.0864216
+      48606.00    .213630   .204303  -.0890221
+      48607.00    .211809   .201740  -.0915598
+      48608.00    .210191   .199201  -.0939742
+      48609.00    .208711   .196874  -.0962138
+      48610.00    .207235   .194795  -.0982561
+      48611.00    .205507   .192814  -.1001693
+      48612.00    .203369   .190776  -.1020840
+      48613.00    .200948   .188654  -.1041185
+      48614.00    .198454   .186472  -.1063444
+      48615.00    .196072   .184253  -.1087701
+      48616.00    .193885   .182012  -.1113399
+      48617.00    .191929   .179752  -.1139584
+      48618.00    .190212   .177484  -.1165251
+      48619.00    .188613   .175240  -.1189540
+      48620.00    .186972   .173043  -.1211998
+      48621.00    .185126   .170911  -.1232581
+      48622.00    .182965   .168856  -.1251559
+      48623.00    .180592   .166857  -.1269451
+      48624.00    .178161   .164885  -.1286896
+      48625.00    .175799   .162915  -.1304568
+      48626.00    .173506   .160942  -.1323066
+      48627.00    .171249   .158962  -.1342857
+      48628.00    .168993   .156979  -.1364224
+      48629.00    .166663   .155043  -.1387244
+      48630.00    .164123   .153294  -.1411761
+      48631.00    .161402   .151714  -.1437490
+      48632.00    .158585   .150245  -.1464011
+      48633.00    .155692   .148849  -.1490736
+      48634.00    .152741   .147494  -.1517024
+      48635.00    .149763   .146138  -.1542271
+      48636.00    .146774   .144772  -.1566078
+      48637.00    .143765   .143469  -.1588545
+      48638.00    .140654   .142244  -.1610204
+      48639.00    .137345   .141095  -.1632032
+      48640.00    .133813   .139997  -.1655276
+      48641.00    .130220   .138870  -.1680973
+      48642.00    .126773   .137616  -.1709548
+      48643.00    .123633   .136222  -.1740492
+      48644.00    .120838   .134840  -.1772390
+      48645.00    .118239   .133514  -.1803757
+      48646.00    .115660   .132246  -.1833389
+      48647.00    .113031   .131007  -.1860675
+      48648.00    .110308   .129756  -.1885557
+      48649.00    .107447   .128450  -.1908372
+      48650.00    .104483   .127120  -.1929756
+      48651.00    .101609   .125938  -.1950580
+      48652.00    .098935   .124947  -.1971464
+      48653.00    .096518   .124143  -.1992921
+      48654.00    .094302   .123506  -.2015317
+      48655.00    .092183   .123008  -.2038871
+      48656.00    .090027   .122615  -.2063606
+      48657.00    .087698   .122252  -.2089429
+      48658.00    .085120   .121749  -.2116347
+      48659.00    .082425   .121095  -.2143996
+      48660.00    .079747   .120336  -.2171790
+      48661.00    .077048   .119538  -.2198943
+      48662.00    .074254   .118767  -.2224826
+      48663.00    .071296   .118085  -.2249019
+      48664.00    .068126   .117511  -.2271426
+      48665.00    .064769   .117034  -.2292410
+      48666.00    .061346   .116670  -.2312755
+      48667.00    .057994   .116441  -.2333549
+      48668.00    .054803   .116362  -.2355963
+      48669.00    .051751   .116424  -.2380810
+      48670.00    .048799   .116604  -.2408220
+      48671.00    .045888   .116854  -.2437544
+      48672.00    .042907   .117120  -.2467553
+      48673.00    .039772   .117341  -.2496841
+      48674.00    .036468   .117447  -.2524364
+      48675.00    .033121   .117372  -.2549754
+      48676.00    .029796   .117134  -.2573113
+      48677.00    .026512   .116772  -.2594898
+      48678.00    .023303   .116361  -.2615661
+      48679.00    .020120   .116041  -.2635649
+      48680.00    .016870   .115871  -.2655401
+      48681.00    .013480   .115880  -.2675507
+      48682.00    .009978   .116087  -.2696648
+      48683.00    .006393   .116477  -.2719343
+      48684.00    .002747   .117026  -.2743831
+      48685.00   -.000960   .117699  -.2770061
+      48686.00   -.004773   .118416  -.2797652
+      48687.00   -.008589   .119105  -.2825980
+      48688.00   -.012262   .119710  -.2854369
+      48689.00   -.015689   .120230  -.2882203
+      48690.00   -.018919   .120750  -.2908904
+      48691.00   -.022035   .121373  -.2934116
+      48692.00   -.025117   .122197  -.2958109
+      48693.00   -.028234   .123272  -.2982033
+      48694.00   -.031378   .124589  -.3006878
+      48695.00   -.034530   .126117  -.3033568
+      48696.00   -.037731   .127806  -.3062763
+      48697.00   -.040970   .129629  -.3094750
+      48698.00   -.044230   .131570  -.3129125
+      48699.00   -.047505   .133592  -.3164823
+      48700.00   -.050798   .135598  -.3200428
+      48701.00   -.054100   .137506  -.3234626
+      48702.00   -.057350   .139342  -.3266588
+      48703.00   -.060446   .141156  -.3296001
+      48704.00   -.063319   .143002  -.3323193
+      48705.00   -.065917   .144942  -.3348843
+      48706.00   -.068216   .147021  -.3373685
+      48707.00   -.070314   .149236  -.3398287
+      48708.00   -.072339   .151570  -.3423103
+      48709.00   -.074391   .153996  -.3448509
+      48710.00   -.076467   .156449  -.3474917
+      48711.00   -.078543   .158854  -.3502571
+      48712.00   -.080594   .161135  -.3531461
+      48713.00   -.082596   .163229  -.3561338
+      48714.00   -.084556   .165149  -.3591684
+      48715.00   -.086492   .166920  -.3621836
+      48716.00   -.088401   .168583  -.3651128
+      48717.00   -.090251   .170205  -.3679050
+      48718.00   -.092014   .171858  -.3705355
+      48719.00   -.093706   .173611  -.3730152
+      48720.00   -.095351   .175516  -.3753975
+      48721.00   -.096976   .177569  -.3777761
+      48722.00   -.098597   .179745  -.3802556
+      48723.00   -.100207   .182020  -.3829267
+      48724.00   -.101809   .184383  -.3858506
+      48725.00   -.103423   .186819  -.3890352
+      48726.00   -.105076   .189311  -.3924319
+      48727.00   -.106793   .191842  -.3959418
+      48728.00   -.108599   .194378  -.3994216
+      48729.00   -.110484   .196883  -.4027295
+      48730.00   -.112402   .199323  -.4057833
+      48731.00   -.114309   .201692  -.4085627
+      48732.00   -.116160   .203983  -.4110990
+      48733.00   -.117913   .206196  -.4134536
+      48734.00   -.119538   .208379  -.4157038
+      48735.00   -.121032   .210673  -.4179446
+      48736.00   -.122480   .213058  -.4202420
+      48737.00   -.123975   .215479  -.4226378
+      48738.00   -.125501   .217910  -.4251565
+      48739.00   -.127017   .220342  -.4277973
+      48740.00   -.128494   .222791  -.4305358
+      48741.00   -.129927   .225263  -.4333245
+      48742.00   -.131420   .227741  -.4360890
+      48743.00   -.133096   .230149  -.4387615
+      48744.00   -.135028   .232420  -.4412846
+      48745.00   -.137123   .234572  -.4436273
+      48746.00   -.139228   .236665  -.4457947
+      48747.00   -.141185   .238758  -.4478320
+      48748.00   -.142849   .240919  -.4498196
+      48749.00   -.144143   .243238  -.4518569
+      48750.00   -.145138   .245766  -.4540441
+      48751.00   -.145941   .248520  -.4564424
+      48752.00   -.146679   .251420  -.4590478
+      48753.00   -.147478   .254362  -.4618024
+      48754.00   -.148460   .257247  -.4646084
+      48755.00   -.149655   .259981  -.4673633
+      48756.00   -.150888   .262487  -.4700007
+      48757.00   -.151944   .264796  -.4724541
+      48758.00   -.152674   .266971  -.4746929
+      48759.00   -.153100   .269090  -.4767418
+      48760.00   -.153324   .271238  -.4786626
+      48761.00   -.153492   .273491  -.4805333
+      48762.00   -.153702   .275896  -.4824287
+      48763.00   -.153937   .278419  -.4843968
+      48764.00   -.154207   .281007  -.4864569
+      48765.00   -.154584   .283623  -.4886033
+      48766.00   -.155104   .286252  -.4908421
+      48767.00   -.155760   .288822  -.4931589
+      48768.00   -.156535   .291241  -.4955207
+      48769.00   -.157366   .293461  -.4978772
+      48770.00   -.158048   .295568  -.5001556
+      48771.00   -.158364   .297671  -.5022890
+      48772.00   -.158224   .299872  -.5042519
+      48773.00   -.157794   .302214  -.5060354
+      48774.00   -.157251   .304723  -.5076563
+      48775.00   -.156693   .307325  -.5091858
+      48776.00   -.156213   .309905  -.5107243
+      48777.00   -.155865   .312371  -.5123786
+      48778.00   -.155629   .314694  -.5142194
+      48779.00   -.155420   .316894  -.5162500
+      48780.00   -.155182   .319021  -.5184166
+      48781.00   -.154897   .321135  -.5206263
+      48782.00   -.154597   .323300  -.5227758
+      48783.00   -.154299   .325574  -.5247841
+      48784.00   -.153976   .327985  -.5266096
+      48785.00   -.153631   .330557  -.5282452
+      48786.00   -.153301   .333315  -.5297193
+      48787.00   -.153029   .336272  -.5310856
+      48788.00   -.152876   .339376  -.5324041
+      48789.00   -.152878   .342509  -.5337292
+      48790.00   -.153016   .345557  -.5351059
+      48791.00   -.153169   .348440  -.5365664
+      48792.00   -.153196   .351097  -.5381314
+      48793.00   -.152947   .353491  -.5398079
+      48794.00   -.152328   .355688  -.5415918
+      48795.00   -.151443   .357814  -.5434488
+      48796.00   -.150489   .359987  -.5453287
+      48797.00   -.149658   .362268  -.5471758
+      48798.00   -.148926   .364635  -.5489337
+      48799.00   -.148103   .367069  -.5505592
+      48800.00   -.147055   .369542  -.5520272
+      48801.00   -.145800   .372031  -.5533401
+      48802.00   -.144519   .374531  -.5545415
+      48803.00   -.143342   .377023  -.5557122
+      48804.00   -.142256   .379477   .4430472
+      48805.00   -.141189   .381860   .4416753
+      48806.00   -.140045   .384172   .4401262
+      48807.00   -.138748   .386425   .4384135
+      48808.00   -.137348   .388614   .4366213
+      48809.00   -.135865   .390743   .4348628
+      48810.00   -.134255   .392840   .4332363
+      48811.00   -.132501   .394965   .4317956
+      48812.00   -.130806   .397220   .4305555
+      48813.00   -.129424   .399651   .4294993
+      48814.00   -.128330   .402171   .4285694
+      48815.00   -.127463   .404642   .4277093
+      48816.00   -.126732   .406920   .4268671
+      48817.00   -.126065   .408912   .4259970
+      48818.00   -.125322   .410633   .4250476
+      48819.00   -.124191   .412277   .4239735
+      48820.00   -.122472   .414066   .4227595
+      48821.00   -.120237   .416097   .4214188
+      48822.00   -.117661   .418425   .4199735
+      48823.00   -.114962   .420939   .4184560
+      48824.00   -.112339   .423477   .4169068
+      48825.00   -.110008   .425890   .4153668
+      48826.00   -.108033   .428109   .4138765
+      48827.00   -.106077   .430216   .4124657
+      48828.00   -.103972   .432230   .4111448
+      48829.00   -.101805   .434165   .4098930
+      48830.00   -.099751   .436034   .4086562
+      48831.00   -.097900   .437831   .4073690
+      48832.00   -.096176   .439589   .4059513
+      48833.00   -.094340   .441446   .4043197
+      48834.00   -.092328   .443549   .4024494
+      48835.00   -.090223   .445839   .4003910
+      48836.00   -.088082   .448188   .3982501
+      48837.00   -.085895   .450460   .3961543
+      48838.00   -.083755   .452563   .3942075
+      48839.00   -.081828   .454576   .3924681
+      48840.00   -.080003   .456571   .3909099
+      48841.00   -.078139   .458634   .3895165
+      48842.00   -.076208   .460875   .3882434
+      48843.00   -.074290   .463332   .3870412
+      48844.00   -.072315   .465924   .3858530
+      48845.00   -.070241   .468541   .3846145
+      48846.00   -.068261   .471062   .3832183
+      48847.00   -.066397   .473325   .3816262
+      48848.00   -.064466   .475307   .3798709
+      48849.00   -.062333   .477088   .3780113
+      48850.00   -.060005   .478776   .3761010
+      48851.00   -.057474   .480454   .3741898
+      48852.00   -.054730   .482120   .3723218
+      48853.00   -.051810   .483699   .3705234
+      48854.00   -.048783   .485162   .3687999
+      48855.00   -.045664   .486491   .3671538
+      48856.00   -.042499   .487683   .3655657
+      48857.00   -.039354   .488789   .3639866
+      48858.00   -.036252   .489888   .3623445
+      48859.00   -.033146   .491085   .3605595
+      48860.00   -.030036   .492464   .3585519
+      48861.00   -.026957   .493979   .3562597
+      48862.00   -.023903   .495593   .3536961
+      48863.00   -.020858   .497302   .3509702
+      48864.00   -.017903   .499041   .3482488
+      48865.00   -.015192   .500593   .3457035
+      48866.00   -.012886   .501710   .3434557
+      48867.00   -.010966   .502220   .3415326
+      48868.00   -.008939   .502278   .3398721
+      48869.00   -.006749   .502235   .3383956
+      48870.00   -.004454   .502390   .3370185
+      48871.00   -.002028   .502831   .3356478
+      48872.00    .000513   .503509   .3342017
+      48873.00    .003059   .504279   .3326178
+      48874.00    .005476   .504990   .3308625
+      48875.00    .007814   .505575   .3289492
+      48876.00    .010098   .506007   .3269116
+      48877.00    .012363   .506266   .3247966
+      48878.00    .014709   .506388   .3226585
+      48879.00    .017122   .506485   .3205567
+      48880.00    .019557   .506712   .3185458
+      48881.00    .022043   .507108   .3166597
+      48882.00    .024591   .507480   .3148939
+      48883.00    .027139   .507675   .3132183
+      48884.00    .029623   .507617   .3115916
+      48885.00    .032003   .507391   .3099566
+      48886.00    .034238   .507135   .3082435
+      48887.00    .036273   .507005   .3063870
+      48888.00    .038147   .507048   .3043250
+      48889.00    .040098   .507093   .3020052
+      48890.00    .042174   .507081   .2994677
+      48891.00    .044339   .506983   .2968178
+      48892.00    .046531   .506715   .2941925
+      48893.00    .048707   .506217   .2917083
+      48894.00    .050938   .505528   .2894253
+      48895.00    .053292   .504791   .2873458
+      48896.00    .055692   .504145   .2854308
+      48897.00    .058118   .503680   .2836186
+      48898.00    .060608   .503410   .2818446
+      48899.00    .063234   .503229   .2800370
+      48900.00    .066052   .503051   .2781375
+      48901.00    .069055   .502853   .2761060
+      48902.00    .072135   .502609   .2739224
+      48903.00    .075164   .502249   .2715976
+      48904.00    .078011   .501719   .2691643
+      48905.00    .080592   .500975   .2666714
+      48906.00    .082938   .500005   .2641812
+      48907.00    .085182   .498864   .2617535
+      48908.00    .087534   .497713   .2594361
+      48909.00    .090137   .496752   .2572455
+      48910.00    .092869   .496097   .2551454
+      48911.00    .095524   .495655   .2531016
+      48912.00    .097959   .495300   .2510598
+      48913.00    .100177   .494912   .2489308
+      48914.00    .102242   .494385   .2466266
+      48915.00    .104231   .493641   .2440833
+      48916.00    .106221   .492669   .2412656
+      48917.00    .108349   .491575   .2381997
+      48918.00    .110632   .490517   .2350047
+      48919.00    .112984   .489593   .2318337
+      48920.00    .115243   .488773   .2288108
+      48921.00    .117297   .487948   .2260199
+      48922.00    .119065   .486996   .2234917
+      48923.00    .120544   .485856   .2211912
+      48924.00    .121936   .484560   .2190355
+      48925.00    .123457   .483156   .2169378
+      48926.00    .125267   .481680   .2148240
+      48927.00    .127408   .480182   .2126421
+      48928.00    .129736   .478689   .2103838
+      48929.00    .132018   .477293   .2080688
+      48930.00    .134034   .476071   .2057129
+      48931.00    .135730   .474916   .2032926
+      48932.00    .137164   .473676   .2007989
+      48933.00    .138539   .472270   .1982865
+      48934.00    .140013   .470709   .1958095
+      48935.00    .141637   .469027   .1934112
+      48936.00    .143375   .467265   .1911216
+      48937.00    .145215   .465487   .1889393
+      48938.00    .147211   .463795   .1868318
+      48939.00    .149308   .462245   .1847543
+      48940.00    .151459   .460843   .1826347
+      48941.00    .153688   .459540   .1803904
+      48942.00    .155993   .458291   .1779453
+      48943.00    .158277   .457088   .1752648
+      48944.00    .160480   .455924   .1723679
+      48945.00    .162663   .454751   .1693369
+      48946.00    .164781   .453500   .1662885
+      48947.00    .166706   .452072   .1633407
+      48948.00    .168352   .450398   .1605728
+      48949.00    .169592   .448510   .1580229
+      48950.00    .170409   .446462   .1556831
+      48951.00    .170909   .444279   .1535019
+      48952.00    .171329   .441971   .1514019
+      48953.00    .171871   .439582   .1493071
+      48954.00    .172586   .437181   .1471611
+      48955.00    .173419   .434829   .1449299
+      48956.00    .174288   .432567   .1425977
+      48957.00    .175124   .430416   .1401658
+      48958.00    .175909   .428369   .1376364
+      48959.00    .176811   .426428   .1350035
+      48960.00    .178006   .424602   .1323019
+      48961.00    .179261   .422835   .1296009
+      48962.00    .180442   .421016   .1269445
+      48963.00    .181507   .419048   .1243624
+      48964.00    .182424   .416981   .1218870
+      48965.00    .183234   .414896   .1195148
+      48966.00    .184075   .412781   .1171967
+      48967.00    .185114   .410653   .1148636
+      48968.00    .186391   .408560   .1124375
+      48969.00    .187772   .406530   .1098522
+      48970.00    .189068   .404548   .1070804
+      48971.00    .190156   .402565   .1041438
+      48972.00    .190995   .400504   .1011071
+      48973.00    .191741   .398313   .0980773
+      48974.00    .192464   .395974   .0951610
+      48975.00    .193139   .393493   .0924394
+      48976.00    .193720   .390895   .0899542
+      48977.00    .194234   .388228   .0877011
+      48978.00    .194827   .385566   .0856314
+      48979.00    .195638   .382963   .0836635
+      48980.00    .196651   .380395   .0817043
+      48981.00    .197901   .377836   .0796786
+      48982.00    .199439   .375287   .0775356
+      48983.00    .201252   .372765   .0752484
+      48984.00    .203210   .370284   .0728132
+      48985.00    .205074   .367837   .0702468
+      48986.00    .206599   .365331   .0675835
+      48987.00    .207631   .362604   .0648749
+      48988.00    .208194   .359648   .0621615
+      48989.00    .208431   .356562   .0594783
+      48990.00    .208526   .353449   .0568545
+      48991.00    .208647   .350396   .0543068
+      48992.00    .208921   .347431   .0518327
+      48993.00    .209421   .344530   .0494074
+      48994.00    .210159   .341695   .0469999
+      48995.00    .211067   .338925   .0445590
+      48996.00    .212049   .336234   .0420253
+      48997.00    .213045   .333641   .0393377
+      48998.00    .213955   .331154   .0364839
+      48999.00    .214684   .328784   .0335118
+      49000.00    .215132   .326497   .0305107
+      49001.00    .215226   .324183   .0275822
+      49002.00    .214978   .321737   .0248090
+      49003.00    .214461   .319091   .0222319
+      49004.00    .213815   .316306   .0198540
+      49005.00    .213184   .313454   .0176442
+      49006.00    .212639   .310580   .0155523
+      49007.00    .212180   .307690   .0135130
+      49008.00    .211925   .304822   .0114464
+      49009.00    .211898   .302089   .0093022
+      49010.00    .211999   .299570   .0070530
+      49011.00    .212110   .297312   .0046827
+      49012.00    .212144   .295279   .0021893
+      49013.00    .212037   .293336  -.0004160
+      49014.00    .211751   .291318  -.0031141
+      49015.00    .211304   .289155  -.0058559
+      49016.00    .210612   .286843  -.0085770
+      49017.00    .209635   .284374  -.0112341
+      49018.00    .208394   .281767  -.0137992
+      49019.00    .207041   .279023  -.0162659
+      49020.00    .205890   .276161  -.0186504
+      49021.00    .205272   .273272  -.0210032
+      49022.00    .205181   .270501  -.0234080
+      49023.00    .205410   .267923  -.0259570
+      49024.00    .205674   .265552  -.0287298
+      49025.00    .205728   .263317  -.0317594
+      49026.00    .205400   .261104  -.0350095
+      49027.00    .204693   .258794  -.0383773
+      49028.00    .203779   .256316  -.0417285
+      49029.00    .202761   .253763  -.0449247
+      49030.00    .201616   .251195  -.0478655
+      49031.00    .200385   .248588  -.0505214
+      49032.00    .199315   .245908  -.0529393
+      49033.00    .198417   .243224  -.0552035
+      49034.00    .197692   .240590  -.0574059
+      49035.00    .197110   .238066  -.0596344
+      49036.00    .196581   .235758  -.0619457
+      49037.00    .195886   .233727  -.0643816
+      49038.00    .194803   .232000  -.0669627
+      49039.00    .193264   .230511  -.0696740
+      49040.00    .191321   .229092  -.0724767
+      49041.00    .189105   .227541  -.0753148
+      49042.00    .186790   .225705  -.0781292
+      49043.00    .184497   .223638  -.0808761
+      49044.00    .182313   .221451  -.0835222
+      49045.00    .180270   .219255  -.0860470
+      49046.00    .178323   .217119  -.0884464
+      49047.00    .176433   .215094  -.0907343
+      49048.00    .174589   .213215  -.0929467
+      49049.00    .172837   .211506  -.0951493
+      49050.00    .171272   .209920  -.0974343
+      49051.00    .169878   .208394  -.0998884
+      49052.00    .168575   .206865  -.1025715
+      49053.00    .167251   .205305  -.1055072
+      49054.00    .165878   .203710  -.1086556
+      49055.00    .164621   .202094  -.1119204
+      49056.00    .163704   .200494  -.1151810
+      49057.00    .163151   .198951  -.1183182
+      49058.00    .162596   .197466  -.1212618
+      49059.00    .161644   .196015  -.1240068
+      49060.00    .160152   .194585  -.1266037
+      49061.00    .158171   .193139  -.1291206
+      49062.00    .155860   .191669  -.1316158
+      49063.00    .153408   .190202  -.1341389
+      49064.00    .150961   .188755  -.1367249
+      49065.00    .148646   .187318  -.1393946
+      49066.00    .146522   .185882  -.1421530
+      49067.00    .144578   .184458  -.1449878
+      49068.00    .142711   .183056  -.1478704
+      49069.00    .140784   .181682  -.1507614
+      49070.00    .138650   .180349  -.1536223
+      49071.00    .136190   .179107  -.1564082
+      49072.00    .133300   .177912  -.1590735
+      49073.00    .130164   .176669  -.1616137
+      49074.00    .126954   .175365  -.1640387
+      49075.00    .123795   .174030  -.1663745
+      49076.00    .120808   .172734  -.1686651
+      49077.00    .118065   .171571  -.1709796
+      49078.00    .115461   .170608  -.1734106
+      49079.00    .112819   .169850  -.1760396
+      49080.00    .109985   .169234  -.1789125
+      49081.00    .106929   .168672  -.1820214
+      49082.00    .103742   .168107  -.1852993
+      49083.00    .100497   .167543  -.1886393
+      49084.00    .097190   .166999  -.1919310
+      49085.00    .093870   .166460  -.1950761
+      49086.00    .090617   .165924  -.1980306
+      49087.00    .087503   .165434  -.2008148
+      49088.00    .084599   .165031  -.2034890
+      49089.00    .081980   .164749  -.2061209
+      49090.00    .079691   .164583  -.2087601
+      49091.00    .077753   .164501  -.2114531
+      49092.00    .076037   .164432  -.2142464
+      49093.00    .074297   .164311  -.2171315
+      49094.00    .072364   .164130  -.2200758
+      49095.00    .070167   .163952  -.2230453
+      49096.00    .067678   .163854  -.2260020
+      49097.00    .064991   .163886  -.2289063
+      49098.00    .062269   .164046  -.2317394
+      49099.00    .059560   .164214  -.2345184
+      49100.00    .056815   .164291  -.2372510
+      49101.00    .054017   .164249  -.2399097
+      49102.00    .051235   .164158  -.2424968
+      49103.00    .048568   .164102  -.2450409
+      49104.00    .046083   .164147  -.2475844
+      49105.00    .043828   .164335  -.2502105
+      49106.00    .041787   .164665  -.2530275
+      49107.00    .039911   .165073  -.2560917
+      49108.00    .038162   .165485  -.2593800
+      49109.00    .036530   .165871  -.2628226
+      49110.00    .034937   .166200  -.2663070
+      49111.00    .033243   .166454  -.2696980
+      49112.00    .031379   .166619  -.2728791
+      49113.00    .029478   .166678  -.2758004
+      49114.00    .027545   .166609  -.2784700
+      49115.00    .025583   .166474  -.2809558
+      49116.00    .023567   .166356  -.2833422
+      49117.00    .021584   .166332  -.2857034
+      49118.00    .019770   .166462  -.2880885
+      49119.00    .018154   .166749  -.2905120
+      49120.00    .016659   .167191  -.2929677
+      49121.00    .015280   .167765  -.2954686
+      49122.00    .014000   .168440  -.2980239
+      49123.00    .012715   .169193  -.3006133
+      49124.00    .011395   .170002  -.3032040
+      49125.00    .010122   .170851  -.3057593
+      49126.00    .008962   .171744  -.3082467
+      49127.00    .007802   .172669  -.3106349
+      49128.00    .006488   .173605  -.3129097
+      49129.00    .004962   .174529  -.3150881
+      49130.00    .003180   .175435  -.3172081
+      49131.00    .001001   .176264  -.3193324
+      49132.00   -.001543   .176968  -.3215329
+      49133.00   -.004186   .177552  -.3238725
+      49134.00   -.006612   .178039  -.3263804
+      49135.00   -.008664   .178485  -.3290562
+      49136.00   -.010426   .178935  -.3318619
+      49137.00   -.012046   .179405  -.3347233
+      49138.00   -.013693   .179884  -.3375466
+      49139.00   -.015457   .180333  -.3402389
+      49140.00   -.017306   .180721  -.3427283
+      49141.00   -.019162   .181046  -.3449825
+      49142.00   -.020994   .181454  -.3470279
+      49143.00   -.022821   .182091  -.3489347
+      49144.00   -.024651   .182945  -.3507899
+      49145.00   -.026472   .183944  -.3526721
+      49146.00   -.028260   .184996  -.3546329
+      49147.00   -.029986   .186010  -.3566907
+      49148.00   -.031655   .186928  -.3588295
+      49149.00   -.033229   .187816  -.3610373
+      49150.00   -.034528   .188782  -.3632832
+      49151.00   -.035578   .189930  -.3655243
+      49152.00   -.036543   .191288  -.3677157
+      49153.00   -.037651   .192787  -.3698172
+      49154.00   -.039083   .194308  -.3718005
+      49155.00   -.040805   .195682  -.3736641
+      49156.00   -.042804   .196851  -.3754291
+      49157.00   -.045006   .197823  -.3771254
+      49158.00   -.047278   .198658  -.3788066
+      49159.00   -.049500   .199429  -.3805425
+      49160.00   -.051507   .200208  -.3823984
+      49161.00   -.053139   .201109  -.3844143
+      49162.00   -.054384   .202161  -.3865801
+      49163.00   -.055378   .203307  -.3888537
+      49164.00   -.056273   .204479  -.3911756
+      49165.00   -.057333   .205615  -.3934676
+      49166.00   -.058551   .206700  -.3956403
+      49167.00   -.059828   .207760  -.3976239
+      49168.00   -.061112   .208846  -.3993921
+      49169.00   -.062437   .210047   .5990240
+      49170.00   -.063739   .211328   .5975692
+      49171.00   -.064926   .212596   .5961771
+      49172.00   -.065948   .213794   .5947836
+      49173.00   -.066764   .214898   .5933425
+      49174.00   -.067351   .215906   .5918315
+      49175.00   -.067751   .216822   .5902532
+      49176.00   -.068022   .217671   .5886301
+      49177.00   -.068127   .218538   .5869959
+      49178.00   -.068091   .219466   .5853818
+      49179.00   -.068029   .220478   .5838113
+      49180.00   -.068167   .221597   .5822997
+      49181.00   -.068638   .222851   .5808530
+      49182.00   -.069396   .224261   .5794633
+      49183.00   -.070293   .225760   .5781232
+      49184.00   -.071136   .227328   .5768387
+      49185.00   -.071804   .228951   .5755861
+      49186.00   -.072163   .230617   .5743088
+      49187.00   -.072376   .232328   .5729212
+      49188.00   -.072659   .234071   .5713467
+      49189.00   -.073162   .235815   .5695413
+      49190.00   -.073761   .237549   .5674973
+      49191.00   -.074331   .239305   .5652901
+      49192.00   -.074925   .241023   .5630454
+      49193.00   -.075668   .242640   .5608853
+      49194.00   -.076631   .244148   .5588963
+      49195.00   -.077778   .245624   .5571142
+      49196.00   -.078981   .247191   .5555234
+      49197.00   -.080118   .248935   .5540600
+      49198.00   -.081227   .250760   .5526319
+      49199.00   -.082366   .252510   .5511802
+      49200.00   -.083461   .254212   .5496530
+      49201.00   -.084451   .255956   .5480175
+      49202.00   -.085351   .257807   .5462633
+      49203.00   -.086260   .259752   .5443991
+      49204.00   -.087499   .261732   .5424427
+      49205.00   -.089023   .263722   .5404353
+      49206.00   -.090640   .265695   .5384455
+      49207.00   -.092153   .267658   .5365244
+      49208.00   -.093437   .269647   .5347066
+      49209.00   -.094417   .271698   .5330118
+      49210.00   -.095113   .273838   .5314421
+      49211.00   -.095676   .276076   .5299608
+      49212.00   -.096200   .278363   .5285077
+      49213.00   -.096752   .280621   .5270114
+      49214.00   -.097412   .282790   .5253905
+      49215.00   -.098178   .284807   .5235760
+      49216.00   -.098964   .286624   .5215295
+      49217.00   -.099720   .288258   .5192544
+      49218.00   -.100408   .289796   .5167887
+      49219.00   -.101032   .291317   .5142204
+      49220.00   -.101549   .292889   .5116758
+      49221.00   -.101885   .294559   .5092718
+      49222.00   -.102012   .296341   .5070777
+      49223.00   -.101942   .298233   .5051082
+      49224.00   -.101719   .300269   .5033333
+      49225.00   -.101402   .302496   .5016905
+      49226.00   -.101072   .304851   .5001094
+      49227.00   -.100733   .307233   .4985168
+      49228.00   -.100362   .309577   .4968559
+      49229.00   -.099972   .311833   .4950917
+      49230.00   -.099671   .313947   .4932110
+      49231.00   -.099584   .315892   .4912200
+      49232.00   -.099550   .317749   .4891461
+      49233.00   -.099476   .319598   .4870423
+      49234.00   -.099417   .321454   .4849612
+      49235.00   -.099508   .323283   .4829426
+      49236.00   -.099829   .325038   .4810086
+      49237.00   -.100319   .326663   .4791607
+      49238.00   -.100783   .328160   .4773845
+      49239.00   -.101141   .329689   .4756590
+      49240.00   -.101269   .331310   .4739299
+      49241.00   -.101089   .333037   .4721218
+      49242.00   -.100565   .334903   .4701547
+      49243.00   -.099728   .336973   .4679612
+      49244.00   -.098778   .339250   .4655123
+      49245.00   -.097920   .341636   .4628345
+      49246.00   -.097307   .344011   .4600161
+      49247.00   -.096914   .346228   .4571881
+      49248.00   -.096709   .348151   .4544796
+      49249.00   -.096650   .349767   .4519736
+      49250.00   -.096757   .351130   .4496859
+      49251.00   -.096961   .352364   .4475688
+      49252.00   -.097137   .353660   .4455356
+      49253.00   -.097226   .355198   .4435103
+      49254.00   -.097154   .356944   .4414471
+      49255.00   -.096846   .358816   .4393042
+      49256.00   -.096384   .360749   .4370666
+      49257.00   -.095887   .362707   .4347408
+      49258.00   -.095487   .364679   .4323504
+      49259.00   -.095344   .366640   .4299340
+      49260.00   -.095565   .368552   .4275414
+      49261.00   -.095760   .370405   .4251976
+      49262.00   -.095500   .372243   .4229157
+      49263.00   -.094925   .374109   .4207044
+      49264.00   -.094225   .376028   .4185569
+      49265.00   -.093568   .377975   .4164492
+      49266.00   -.093027   .379897   .4143430
+      49267.00   -.092536   .381742   .4121963
+      49268.00   -.091935   .383500   .4099864
+      49269.00   -.091076   .385238   .4076651
+      49270.00   -.089912   .387006   .4051709
+      49271.00   -.088541   .388858   .4024546
+      49272.00   -.087093   .390877   .3995030
+      49273.00   -.085687   .393093   .3963491
+      49274.00   -.084433   .395382   .3930678
+      49275.00   -.083389   .397498   .3898032
+      49276.00   -.082597   .399324   .3866909
+      49277.00   -.082066   .400879   .3838085
+      49278.00   -.081697   .402206   .3811629
+      49279.00   -.081249   .403378   .3787015
+      49280.00   -.080501   .404517   .3763403
+      49281.00   -.079780   .405850   .3739861
+      49282.00   -.079255   .407354   .3715641
+      49283.00   -.078848   .408918   .3690462
+      49284.00   -.078395   .410502   .3664339
+      49285.00   -.077753   .412128   .3637438
+      49286.00   -.076914   .413836   .3610009
+      49287.00   -.076031   .415576   .3582377
+      49288.00   -.075370   .417185   .3554951
+      49289.00   -.074954   .418609   .3528138
+      49290.00   -.074635   .419832   .3502215
+      49291.00   -.074213   .420862   .3477349
+      49292.00   -.073492   .421760   .3453578
+      49293.00   -.072270   .422619   .3430772
+      49294.00   -.070455   .423522   .3408636
+      49295.00   -.068458   .424564   .3386838
+      49296.00   -.066409   .425838   .3364799
+      49297.00   -.064303   .427336   .3341689
+      49298.00   -.062188   .428971   .3316825
+      49299.00   -.060083   .430629   .3289829
+      49300.00   -.058051   .432202   .3260761
+      49301.00   -.056232   .433615   .3230175
+      49302.00   -.054719   .434848   .3199125
+      49303.00   -.053383   .435925   .3168850
+      49304.00   -.052073   .436873   .3140291
+      49305.00   -.050757   .437726   .3113888
+      49306.00   -.049472   .438542   .3089486
+      49307.00   -.048279   .439395   .3066469
+      49308.00   -.047288   .440342   .3044064
+      49309.00   -.046610   .441395   .3021613
+      49310.00   -.046115   .442500   .2998652
+      49311.00   -.045686   .443609   .2975016
+      49312.00   -.045176   .444669   .2950769
+      49313.00   -.044412   .445671   .2926107
+      49314.00   -.043359   .446638   .2901289
+      49315.00   -.042190   .447596   .2876619
+      49316.00   -.041254   .448548   .2852456
+      49317.00   -.040560   .449434   .2829184
+      49318.00   -.039980   .450216   .2806996
+      49319.00   -.039440   .450907   .2785978
+      49320.00   -.038813   .451524   .2766129
+      49321.00   -.037886   .452118   .2747398
+      49322.00   -.036491   .452767   .2729459
+      49323.00   -.035037   .453502   .2711337
+      49324.00   -.033629   .454320   .2692482
+      49325.00   -.032184   .455219   .2672266
+      49326.00   -.030695   .456183   .2650228
+      49327.00   -.029197   .457189   .2626230
+      49328.00   -.027689   .458224   .2600475
+      49329.00   -.026169   .459296   .2573503
+      49330.00   -.024876   .460349   .2546337
+      49331.00   -.023654   .461368   .2519902
+      49332.00   -.022373   .462389   .2494811
+      49333.00   -.021116   .463459   .2471210
+      49334.00   -.019978   .464619   .2448779
+      49335.00   -.018938   .465875   .2426803
+      49336.00   -.017978   .467130   .2404463
+      49337.00   -.016999   .468233   .2381032
+      49338.00   -.015881   .469162   .2356355
+      49339.00   -.014635   .469955   .2330778
+      49340.00   -.013258   .470683   .2304656
+      49341.00   -.011691   .471433   .2278282
+      49342.00   -.009752   .472284   .2251854
+      49343.00   -.007342   .473280   .2225628
+      49344.00   -.004758   .474365   .2200279
+      49345.00   -.002260   .475357   .2176001
+      49346.00   -.000079   .476105   .2152727
+      49347.00    .001645   .476538   .2130411
+      49348.00    .002979   .476647   .2108865
+      49349.00    .004130   .476509   .2087733
+      49350.00    .005326   .476268   .2066509
+      49351.00    .006736   .476099   .2044548
+      49352.00    .008448   .476147   .2020948
+      49353.00    .010488   .476399   .1995489
+      49354.00    .012823   .476816   .1968449
+      49355.00    .015382   .477358   .1940457
+      49356.00    .018130   .477976   .1912390
+      49357.00    .021020   .478639   .1885171
+      49358.00    .023887   .479288   .1859460
+      49359.00    .026706   .479806   .1835517
+      49360.00    .029429   .480131   .1813388
+      49361.00    .031915   .480235   .1792719
+      49362.00    .034135   .480135   .1772787
+      49363.00    .036207   .479908   .1752855
+      49364.00    .038357   .479664   .1732344
+      49365.00    .040806   .479395   .1710573
+      49366.00    .043564   .479149   .1687462
+      49367.00    .046270   .479033   .1663712
+      49368.00    .048614   .479092   .1640261
+      49369.00    .050696   .479199   .1617348
+      49370.00    .052590   .479158   .1594831
+      49371.00    .054280   .478859   .1572956
+      49372.00    .055909   .478392   .1552205
+      49373.00    .057689   .477780   .1532311
+      49374.00    .059822   .477049   .1512759
+      49375.00    .062349   .476481   .1493481
+      49376.00    .065142   .476263   .1474173
+      49377.00    .067938   .476205   .1454482
+      49378.00    .070662   .475982   .1433702
+      49379.00    .073391   .475402   .1410971
+      49380.00    .076083   .474665   .1386113
+      49381.00    .078769   .473851   .1359433
+      49382.00    .081448   .472951   .1331513
+      49383.00    .084148   .471983   .1303264
+      49384.00    .086895   .471012   .1275677
+      49385.00    .089671   .470130   .1249677
+      49386.00    .092442   .469412   .1225727
+      49387.00    .095098   .468762   .1203722
+      49388.00    .097505   .468057   .1183323
+      49389.00    .099674   .467277   .1163942
+      49390.00    .101698   .466450   .1144788
+      49391.00    .103663   .465580   .1125030
+      49392.00    .105628   .464636   .1104216
+      49393.00    .107685   .463574   .1082301
+      49394.00    .109662   .462451   .1059464
+      49395.00    .111429   .461331   .1036106
+      49396.00    .113118   .460239   .1012573
+      49397.00    .114866   .459172   .0989138
+      49398.00    .116741   .458065   .0966117
+      49399.00    .118747   .456839   .0943824
+      49400.00    .120837   .455491   .0922419
+      49401.00    .122767   .454064   .0901704
+      49402.00    .124543   .452625   .0881463
+      49403.00    .126444   .451326   .0861344
+      49404.00    .128682   .450311   .0840749
+      49405.00    .131239   .449616   .0819021
+      49406.00    .133898   .449154   .0795498
+      49407.00    .136340   .448793   .0769470
+      49408.00    .138371   .448401   .0740647
+      49409.00    .139965   .447866   .0709302
+      49410.00    .141211   .447137   .0676205
+      49411.00    .142256   .446175   .0642490
+      49412.00    .143219   .444899   .0609375
+      49413.00    .144190   .443314   .0577774
+      49414.00    .145240   .441509   .0548062
+      49415.00    .146278   .439625   .0520263
+      49416.00    .147211   .437777   .0494116
+      49417.00    .148071   .436001   .0469051
+      49418.00    .148970   .434307   .0444290
+      49419.00    .149918   .432679   .0419256
+      49420.00    .150889   .431067   .0393615
+      49421.00    .151945   .429415   .0367221
+      49422.00    .153095   .427708   .0340371
+      49423.00    .154380   .425975   .0313733
+      49424.00    .155842   .424297   .0287840
+      49425.00    .157393   .422761   .0262872
+      49426.00    .158931   .421377   .0238883
+      49427.00    .160366   .420007   .0215796
+      49428.00    .161723   .418500   .0193435
+      49429.00    .162780   .416933   .0171856
+      49430.00    .163469   .415334   .0150740
+      49431.00    .163895   .413673   .0129631
+      49432.00    .164155   .411919   .0107951
+      49433.00    .164345   .410066   .0085070
+      49434.00    .164664   .408178   .0060379
+      49435.00    .165351   .406360   .0033379
+      49436.00    .166358   .404603   .0004004
+      49437.00    .167468   .402813  -.0027475
+      49438.00    .168527   .400966  -.0060032
+      49439.00    .169439   .399053  -.0092285
+      49440.00    .170178   .397074  -.0122952
+      49441.00    .170917   .395070  -.0151299
+      49442.00    .172023   .393179  -.0177504
+      49443.00    .173479   .391451  -.0202159
+      49444.00    .175073   .389822  -.0225980
+      49445.00    .176575   .388195  -.0249739
+      49446.00    .177850   .386499  -.0273956
+      49447.00    .178909   .384736  -.0298724
+      49448.00    .179853   .382938  -.0323972
+      49449.00    .180783   .381137  -.0349731
+      49450.00    .181636   .379343  -.0375888
+      49451.00    .182329   .377572  -.0402176
+      49452.00    .182867   .375874  -.0428274
+      49453.00    .183229   .374257  -.0453837
+      49454.00    .183341   .372623  -.0478529
+      49455.00    .183248   .370836  -.0502164
+      49456.00    .183142   .368777  -.0524756
+      49457.00    .183089   .366542  -.0546441
+      49458.00    .183155   .364319  -.0567524
+      49459.00    .183364   .362224  -.0588633
+      49460.00    .183638   .360311  -.0610425
+      49461.00    .183851   .358589  -.0633504
+      49462.00    .183927   .357041  -.0658290
+      49463.00    .183893   .355593  -.0684853
+      49464.00    .183783   .354125  -.0713343
+      49465.00    .183580   .352535  -.0743644
+      49466.00    .183329   .350751  -.0775031
+      49467.00    .183076   .348730  -.0806300
+      49468.00    .182904   .346445  -.0836211
+      49469.00    .182861   .343925  -.0864020
+      49470.00    .182883   .341266  -.0889845
+      49471.00    .183010   .338645  -.0914518
+      49472.00    .183316   .336208  -.0938945
+      49473.00    .183751   .333988  -.0963720
+      49474.00    .184268   .331918  -.0989092
+      49475.00    .184802   .329910  -.1014984
+      49476.00    .185248   .327875  -.1041177
+      49477.00    .185493   .325771  -.1067517
+      49478.00    .185617   .323560  -.1093766
+      49479.00    .185787   .321227  -.1119535
+      49480.00    .186127   .318824  -.1144563
+      49481.00    .186656   .316455  -.1168720
+      49482.00    .187338   .314204  -.1191899
+      49483.00    .188084   .312099  -.1214190
+      49484.00    .188701   .310098  -.1236014
+      49485.00    .189149   .308105  -.1257618
+      49486.00    .189254   .306043  -.1279101
+      49487.00    .188985   .303929  -.1300973
+      49488.00    .188471   .301845  -.1323644
+      49489.00    .187907   .299837  -.1347430
+      49490.00    .187447   .297844  -.1372496
+      49491.00    .187258   .295802  -.1398852
+      49492.00    .187165   .293799  -.1426253
+      49493.00    .186911   .291936  -.1454033
+      49494.00    .186381   .290234  -.1481329
+      49495.00    .185530   .288644  -.1507284
+      49496.00    .184389   .287063  -.1531330
+      49497.00    .183055   .285359  -.1553305
+      49498.00    .181653   .283438  -.1573496
+      49499.00    .180293   .281331  -.1592708
+      49500.00    .179012   .279090  -.1611620
+      49501.00    .177800   .276742  -.1630720
+      49502.00    .176635   .274317  -.1650226
+      49503.00    .175513   .271880  -.1670147
+      49504.00    .174487   .269528  -.1690326
+      49505.00    .173610   .267345  -.1710389
+      49506.00    .172730   .265339  -.1729923
+      49507.00    .171669   .263474  -.1748627
+      49508.00    .170453   .261702  -.1766318
+      49509.00    .169134   .259973  -.1782903
+      49510.00    .167779   .258226  -.1798374
+      49511.00    .166542   .256394  -.1812913
+      49512.00    .165561   .254458  -.1826856
+      49513.00    .164659   .252447  -.1840720
+      49514.00    .163719   .250366  -.1855180
+      49515.00    .162763   .248207  -.1870737
+      49516.00    .161851   .245977  -.1887704
+      49517.00    .161026   .243751  -.1906238
+      49518.00    .160281   .241641  -.1926234
+      49519.00    .159534   .239746  -.1947203
+      49520.00    .158676   .237991  -.1968565
+      49521.00    .157611   .236226  -.1989637
+      49522.00    .156276   .234349  -.2009653
+      49523.00    .154689   .232316  -.2027923
+      49524.00    .152998   .230146  -.2044062
+      49525.00    .151432   .227937  -.2058193
+      49526.00    .149986   .225843  -.2071000
+      49527.00    .148533   .223884  -.2083200
+      49528.00    .146973   .222011  -.2095412
+      49529.00    .145298   .220177  -.2108058
+      49530.00    .143565   .218360  -.2121185
+      49531.00    .141813   .216582  -.2134590
+      49532.00    .140036   .214909  -.2147803
+      49533.00    .138313   .213438  -.2160203
+      49534.00    .136704   .212123   .7828134
+      49535.00    .135090   .210874   .7817000
+      49536.00    .133370   .209627   .7806540
+      49537.00    .131521   .208338   .7796814
+      49538.00    .129613   .206974   .7787730
+      49539.00    .127726   .205520   .7779060
+      49540.00    .125890   .203972   .7770472
+      49541.00    .124100   .202429   .7761321
+      49542.00    .122316   .200998   .7750765
+      49543.00    .120582   .199702   .7738352
+      49544.00    .118900   .198504   .7723924
+      49545.00    .117262   .197367   .7707577
+      49546.00    .115585   .196254   .7689693
+      49547.00    .113774   .195114   .7670815
+      49548.00    .111917   .193886   .7651629
+      49549.00    .110060   .192527   .7632581
+      49550.00    .108157   .191009   .7614317
+      49551.00    .106172   .189314   .7597348
+      49552.00    .104134   .187488   .7581907
+      49553.00    .102165   .185697   .7567906
+      49554.00    .100269   .184109   .7554917
+      49555.00    .098391   .182709   .7542115
+      49556.00    .096537   .181392   .7528672
+      49557.00    .094755   .180140   .7514222
+      49558.00    .092961   .178983   .7499005
+      49559.00    .091017   .177952   .7483472
+      49560.00    .088891   .177080   .7468139
+      49561.00    .086705   .176385   .7453424
+      49562.00    .084616   .175803   .7439290
+      49563.00    .082635   .175254   .7425566
+      49564.00    .080660   .174710   .7412436
+      49565.00    .078707   .174217   .7400066
+      49566.00    .076835   .173815   .7388476
+      49567.00    .075074   .173500   .7377391
+      49568.00    .073460   .173232   .7366003
+      49569.00    .071866   .172970   .7353776
+      49570.00    .070233   .172666   .7340370
+      49571.00    .068588   .172309   .7325559
+      49572.00    .067030   .171954   .7309394
+      49573.00    .065656   .171684   .7292203
+      49574.00    .064458   .171547   .7274593
+      49575.00    .063177   .171524   .7256921
+      49576.00    .061639   .171505   .7239814
+      49577.00    .059681   .171353   .7223951
+      49578.00    .057308   .170981   .7209662
+      49579.00    .054665   .170386   .7196757
+      49580.00    .052050   .169688   .7184603
+      49581.00    .049759   .169084   .7172468
+      49582.00    .047661   .168749   .7159904
+      49583.00    .045502   .168670   .7146430
+      49584.00    .043003   .168739   .7131745
+      49585.00    .040105   .168840   .7115798
+      49586.00    .036966   .168869   .7098798
+      49587.00    .033817   .168787   .7081159
+      49588.00    .030911   .168608   .7063369
+      49589.00    .028467   .168424   .7045966
+      49590.00    .026502   .168362   .7029378
+      49591.00    .024679   .168471   .7013413
+      49592.00    .022800   .168698   .6998036
+      49593.00    .020795   .169007   .6983214
+      49594.00    .018609   .169415   .6968824
+      49595.00    .016183   .169907   .6954573
+      49596.00    .013552   .170355   .6939768
+      49597.00    .010952   .170717   .6923683
+      49598.00    .008574   .171044   .6905787
+      49599.00    .006431   .171426   .6885696
+      49600.00    .004323   .171935   .6863372
+      49601.00    .002002   .172597   .6839238
+      49602.00   -.000616   .173385   .6814098
+      49603.00   -.003456   .174249   .6788784
+      49604.00   -.006148   .175135   .6763470
+      49605.00   -.008596   .176085   .6738930
+      49606.00   -.010833   .177119   .6715460
+      49607.00   -.013072   .178169   .6692901
+      49608.00   -.015556   .179143   .6670788
+      49609.00   -.018422   .179980   .6648563
+      49610.00   -.021599   .180790   .6625777
+      49611.00   -.024813   .181577   .6601997
+      49612.00   -.027798   .182332   .6576960
+      49613.00   -.030505   .183089   .6551011
+      49614.00   -.033007   .183934   .6524739
+      49615.00   -.035461   .184962   .6498753
+      49616.00   -.038015   .186147   .6473536
+      49617.00   -.040832   .187296   .6449207
+      49618.00   -.043818   .188375   .6426013
+      49619.00   -.046775   .189470   .6404117
+      49620.00   -.049585   .190626   .6383387
+      49621.00   -.052280   .191848   .6363505
+      49622.00   -.054909   .193105   .6344068
+      49623.00   -.057521   .194405   .6324646
+      49624.00   -.060233   .195865   .6304856
+      49625.00   -.062857   .197484   .6284157
+      49626.00   -.065164   .199217   .6261970
+      49627.00   -.067149   .201047   .6237941
+      49628.00   -.068989   .202944   .6212049
+      49629.00   -.070976   .204837   .6184532
+      49630.00   -.073424   .206629   .6155998
+      49631.00   -.076446   .208213   .6127461
+      49632.00   -.079838   .209601   .6100058
+      49633.00   -.083262   .210886   .6074385
+      49634.00   -.086479   .212130   .6050286
+      49635.00   -.089290   .213380   .6027164
+      49636.00   -.091505   .214693   .6004284
+      49637.00   -.093166   .216160   .5981027
+      49638.00   -.094538   .217881   .5957062
+      49639.00   -.095750   .219840   .5932373
+      49640.00   -.096889   .221990   .5907151
+      49641.00   -.098078   .224264   .5881772
+      49642.00   -.099501   .226604   .5856753
+      49643.00   -.101377   .228955   .5832655
+      49644.00   -.103841   .231268   .5809929
+      49645.00   -.106752   .233466   .5788597
+      49646.00   -.109750   .235599   .5768260
+      49647.00   -.112530   .237770   .5748551
+      49648.00   -.114973   .239947   .5729195
+      49649.00   -.117092   .242100   .5709849
+      49650.00   -.119084   .244217   .5690110
+      49651.00   -.121195   .246300   .5669543
+      49652.00   -.123525   .248390   .5647789
+      49653.00   -.125949   .250477   .5624625
+      49654.00   -.128152   .252528   .5599782
+      49655.00   -.130001   .254583   .5573138
+      49656.00   -.131520   .256710   .5544892
+      49657.00   -.132859   .258913   .5515578
+      49658.00   -.134179   .261087   .5485981
+      49659.00   -.135582   .263155   .5457003
+      49660.00   -.136997   .265187   .5429500
+      49661.00   -.138425   .267286   .5403769
+      49662.00   -.139887   .269503   .5379537
+      49663.00   -.141344   .271822   .5356169
+      49664.00   -.142740   .274220   .5333062
+      49665.00   -.143972   .276693   .5309772
+      49666.00   -.144804   .279285   .5285867
+      49667.00   -.145287   .281983   .5261314
+      49668.00   -.145653   .284744   .5236320
+      49669.00   -.146085   .287529   .5211225
+      49670.00   -.146623   .290267   .5186373
+      49671.00   -.147213   .292902   .5162031
+      49672.00   -.147808   .295464   .5138394
+      49673.00   -.148488   .298075   .5115623
+      49674.00   -.149331   .300760   .5093815
+      49675.00   -.150308   .303477   .5072894
+      49676.00   -.151335   .306191   .5052594
+      49677.00   -.152336   .308941   .5032454
+      49678.00   -.153136   .311793   .5011934
+      49679.00   -.153511   .314720   .4990493
+      49680.00   -.153354   .317579   .4967655
+      49681.00   -.152777   .320381   .4943244
+      49682.00   -.152113   .323160   .4917358
+      49683.00   -.151650   .325909   .4890285
+      49684.00   -.151460   .328635   .4862510
+      49685.00   -.151383   .331360   .4834753
+      49686.00   -.151275   .334074   .4807701
+      49687.00   -.151498   .336727   .4781455
+      49688.00   -.152003   .339262   .4756244
+      49689.00   -.152556   .341652   .4732183
+      49690.00   -.152865   .343888   .4708950
+      49691.00   -.152737   .346018   .4685954
+      49692.00   -.152319   .348133   .4662553
+      49693.00   -.151855   .350338   .4638417
+      49694.00   -.151502   .352762   .4613657
+      49695.00   -.151377   .355413   .4588597
+      49696.00   -.151519   .358227   .4563534
+      49697.00   -.152018   .361091   .4538684
+      49698.00   -.152813   .363880   .4514189
+      49699.00   -.153503   .366531   .4490111
+      49700.00   -.153781   .369106   .4466544
+      49701.00   -.153973   .371747   .4443857
+      49702.00   -.154240   .374469   .4421722
+      49703.00   -.154662   .377245   .4399678
+      49704.00   -.155272   .380014   .4377180
+      49705.00   -.156060   .382715   .4353743
+      49706.00   -.156932   .385263   .4328925
+      49707.00   -.157709   .387602   .4302489
+      49708.00   -.158271   .389863   .4274840
+      49709.00   -.158674   .392127   .4246131
+      49710.00   -.158946   .394483   .4216396
+      49711.00   -.159032   .397043   .4185905
+      49712.00   -.158912   .399861   .4155133
+      49713.00   -.158656   .402918   .4124665
+      49714.00   -.158336   .406112   .4095072
+      49715.00   -.157891   .409294   .4066683
+      49716.00   -.156905   .412426   .4039580
+      49717.00   -.155298   .415519   .4013094
+      49718.00   -.153189   .418559   .3986542
+      49719.00   -.150825   .421482   .3959327
+      49720.00   -.148493   .424222   .3931052
+      49721.00   -.146361   .426771   .3901717
+      49722.00   -.144479   .429174   .3871759
+      49723.00   -.142828   .431398   .3841933
+      49724.00   -.141374   .433434   .3812858
+      49725.00   -.140045   .435337   .3785005
+      49726.00   -.138689   .437218   .3758672
+      49727.00   -.137139   .439265   .3734000
+      49728.00   -.135392   .441655   .3710942
+      49729.00   -.133709   .444245   .3689076
+      49730.00   -.132167   .446876   .3667940
+      49731.00   -.130820   .449483   .3647144
+      49732.00   -.129771   .452053   .3626227
+      49733.00   -.129050   .454549   .3604814
+      49734.00   -.128552   .456895   .3582618
+      49735.00   -.128075   .459036   .3559323
+      49736.00   -.127274   .460979   .3534489
+      49737.00   -.126173   .462741   .3508263
+      49738.00   -.124927   .464397   .3480913
+      49739.00   -.123597   .466094   .3452808
+      49740.00   -.122176   .468000   .3424368
+      49741.00   -.120697   .470190   .3396079
+      49742.00   -.119243   .472586   .3368351
+      49743.00   -.117856   .475101   .3341227
+      49744.00   -.116658   .477515   .3314510
+      49745.00   -.115778   .479680   .3287997
+      49746.00   -.115216   .481614   .3261178
+      49747.00   -.114986   .483338   .3233651
+      49748.00   -.115087   .484913   .3205334
+      49749.00   -.115431   .486423   .3176520
+      49750.00   -.115770   .487929   .3147682
+      49751.00   -.115750   .489384   .3119068
+      49752.00   -.115037   .490757   .3090844
+      49753.00   -.113739   .492107   .3063359
+      49754.00   -.111844   .493562   .3036856
+      49755.00   -.109299   .495255   .3011561
+      49756.00   -.106276   .497280   .2987650
+      49757.00   -.103092   .499653   .2965034
+      49758.00   -.100159   .502148   .2943105
+      49759.00   -.097808   .504465   .2921455
+      49760.00   -.096094   .506447   .2899714
+      49761.00   -.094893   .508087   .2877376
+      49762.00   -.093920   .509472   .2853989
+      49763.00   -.092755   .510757   .2829181
+      49764.00   -.091000   .512165   .2802679
+      49765.00   -.088903   .513700   .2774850
+      49766.00   -.086820   .515241   .2746413
+      49767.00   -.084959   .516735   .2718026
+      49768.00   -.083343   .518078   .2690284
+      49769.00   -.081869   .519239   .2663575
+      49770.00   -.080396   .520331   .2637974
+      49771.00   -.078734   .521570   .2613248
+      49772.00   -.076638   .523062   .2588847
+      49773.00   -.073891   .524836   .2564009
+      49774.00   -.070608   .526809   .2538179
+      49775.00   -.067041   .528787   .2511060
+      49776.00   -.063404   .530614   .2482696
+      49777.00   -.059834   .532244   .2453351
+      49778.00   -.056421   .533667   .2423301
+      49779.00   -.053150   .534943   .2392855
+      49780.00   -.049859   .536159   .2362316
+      49781.00   -.046533   .537369   .2332219
+      49782.00   -.043210   .538620   .2303048
+      49783.00   -.039960   .539942   .2275100
+      49784.00   -.036857   .541301   .2248388
+      49785.00   -.034054   .542584   .2222167
+      49786.00   -.031586   .543697   .2195729
+      49787.00   -.029449   .544584   .2168735
+      49788.00   -.027596   .545229   .2141008
+      49789.00   -.025967   .545574   .2112397
+      49790.00   -.024318   .545700   .2082900
+      49791.00   -.022230   .545858   .2052493
+      49792.00   -.019570   .546291   .2020894
+      49793.00   -.016638   .547022   .1988327
+      49794.00   -.013712   .547927   .1955371
+      49795.00   -.010970   .548911   .1922824
+      49796.00   -.008609   .549912   .1891428
+      49797.00   -.006664   .550852   .1861914
+      49798.00   -.004915   .551625   .1834651
+      49799.00   -.003080   .552167   .1809253
+      49800.00   -.000718   .552558   .1784517
+      49801.00    .002665   .552945   .1759392
+      49802.00    .007068   .553526   .1733344
+      49803.00    .012125   .554424   .1706200
+      49804.00    .017209   .555609   .1678072
+      49805.00    .021783   .556881   .1649300
+      49806.00    .025737   .557853   .1620269
+      49807.00    .029145   .558411   .1591455
+      49808.00    .032223   .558606   .1563266
+      49809.00    .035253   .558563   .1535919
+      49810.00    .038395   .558415   .1509506
+      49811.00    .041610   .558191   .1484005
+      49812.00    .044799   .557877   .1459346
+      49813.00    .048055   .557657   .1435147
+      49814.00    .051330   .557646   .1410720
+      49815.00    .054471   .557796   .1385650
+      49816.00    .057417   .557972   .1359808
+      49817.00    .060287   .558056   .1333095
+      49818.00    .063186   .557998   .1305124
+      49819.00    .066106   .557795   .1275648
+      49820.00    .069162   .557477   .1244732
+      49821.00    .072319   .557059   .1213199
+      49822.00    .075646   .556623   .1181739
+      49823.00    .079115   .556274   .1150863
+      49824.00    .082588   .556036   .1120940
+      49825.00    .085904   .555871   .1092209
+      49826.00    .088995   .555759   .1064576
+      49827.00    .091859   .555687   .1037831
+      49828.00    .094840   .555488   .1011338
+      49829.00    .098282   .555027   .0984390
+      49830.00    .101923   .554313   .0956750
+      49831.00    .105677   .553421   .0928361
+      49832.00    .109648   .552409   .0899362
+      49833.00    .113828   .551295   .0870060
+      49834.00    .118052   .550083   .0841042
+      49835.00    .122201   .548781   .0812932
+      49836.00    .126200   .547400   .0786103
+      49837.00    .130004   .545963   .0760682
+      49838.00    .133625   .544472   .0736575
+      49839.00    .137151   .542978   .0713226
+      49840.00    .140652   .541540   .0689971
+      49841.00    .144150   .540101   .0666340
+      49842.00    .147689   .538598   .0642119
+      49843.00    .151386   .537040   .0617241
+      49844.00    .155353   .535497   .0591702
+      49845.00    .159560   .533999   .0565425
+      49846.00    .163824   .532527   .0538021
+      49847.00    .167886   .531033   .0509297
+      49848.00    .171598   .529473   .0479442
+      49849.00    .174931   .527820   .0449067
+      49850.00    .178042   .526120   .0419048
+      49851.00    .181104   .524458   .0389846
+      49852.00    .184123   .522872   .0361612
+      49853.00    .187027   .521341   .0334480
+      49854.00    .189688   .519782   .0308279
+      49855.00    .191958   .518055   .0282646
+      49856.00    .193890   .516107   .0257150
+      49857.00    .195623   .513903   .0231537
+      49858.00    .197336   .511469   .0205831
+      49859.00    .199225   .508960   .0180327
+      49860.00    .201339   .506500   .0155409
+      49861.00    .203530   .504116   .0131463
+      49862.00    .205615   .501788   .0108704
+      49863.00    .207613   .499451   .0086859
+      49864.00    .209581   .497026   .0065837
+      49865.00    .211530   .494489   .0045724
+      49866.00    .213501   .491824   .0026326
+      49867.00    .215531   .489023   .0007373
+      49868.00    .217624   .486128  -.0011437
+      49869.00    .219839   .483227  -.0030435
+      49870.00    .222301   .480281  -.0050071
+      49871.00    .225108   .477193  -.0070698
+      49872.00    .228205   .473977  -.0092459
+      49873.00    .231450   .470731  -.0115205
+      49874.00    .234633   .467602  -.0138775
+      49875.00    .237641   .464714  -.0162951
+      49876.00    .240594   .462046  -.0187550
+      49877.00    .243439   .459261  -.0212012
+      49878.00    .246051   .456323  -.0235719
+      49879.00    .248386   .453343  -.0258309
+      49880.00    .250452   .450340  -.0279733
+      49881.00    .252350   .447248  -.0300289
+      49882.00    .254267   .444027  -.0320660
+      49883.00    .256310   .440739  -.0341466
+      49884.00    .258509   .437481  -.0362715
+      49885.00    .260839   .434277  -.0384633
+      49886.00    .263215   .431106  -.0407064
+      49887.00    .265545   .427896  -.0429534
+      49888.00    .267697   .424553  -.0451547
+      49889.00    .269577   .421018  -.0472665
+      49890.00    .271154   .417398  -.0492487
+      49891.00    .272392   .413796  -.0510626
+      49892.00    .273290   .410267  -.0526763
+      49893.00    .273966   .406811  -.0540931
+      49894.00    .274637   .403337  -.0553614
+      49895.00    .275453   .399721  -.0565304
+      49896.00    .276446   .395963  -.0576556
+      49897.00    .277574   .392210  -.0588041
+      49898.00    .278839   .388463  -.0600344
+      49899.00    .280135   .384623  -.0613867
+      49900.00    .281307   .380660  -.0628822
+      49901.00    .282279   .376569  -.0645201
+      49902.00    .283155   .372366  -.0662537
+      49903.00    .284080   .368160  -.0680185
+      49904.00    .284998   .364071  -.0697585
+      49905.00    .285752   .360096  -.0714445
+      49906.00    .286264   .356144  -.0730519
+      49907.00    .286592   .352185  -.0745701
+      49908.00    .286847   .348271  -.0760160
+      49909.00    .287167   .344456  -.0774314
+      49910.00    .287522   .340770  -.0788750
+      49911.00    .287691   .337184  -.0803920
+      49912.00    .287724   .333635  -.0819965
+      49913.00    .287795   .330040  -.0836972
+      49914.00    .287949   .326344  -.0854542
+      49915.00    .288082   .322556  -.0872007
+      49916.00    .288062   .318743  -.0888665
+      49917.00    .287868   .314950  -.0904009
+      49918.00    .287689   .311145  -.0917787
+      49919.00    .287565   .307292  -.0929977
+      49920.00    .287387   .303396  -.0940641
+      49921.00    .287031   .299471  -.0950056
+      49922.00    .286566   .295521  -.0958652
+      49923.00    .286095   .291575  -.0966853
+      49924.00    .285505   .287660  -.0975064
+      49925.00    .284645   .283792  -.0983658
+      49926.00    .283658   .280001  -.0992918
+      49927.00    .282595   .276263  -.1003121
+      49928.00    .281448   .272477  -.1014508
+      49929.00    .280368   .268586  -.1027208
+      49930.00    .279541   .264644  -.1041002
+      49931.00    .278952   .260708  -.1055396
+      49932.00    .278360   .256799  -.1069717
+      49933.00    .277631   .252861  -.1083570
+      49934.00    .276791   .248912  -.1096881
+      49935.00    .275892   .245043  -.1109876
+      49936.00    .274915   .241303  -.1122929
+      49937.00    .273771   .237673  -.1136461
+      49938.00    .272359   .234099  -.1150900
+      49939.00    .270663   .230520  -.1166522
+      49940.00    .269001   .226934  -.1183333
+      49941.00    .267541   .223342  -.1200937
+      49942.00    .266166   .219764  -.1218769
+      49943.00    .264644   .216284  -.1236236
+      49944.00    .262691   .212933  -.1252897
+      49945.00    .260241   .209642  -.1268567
+      49946.00    .257691   .206449  -.1283241
+      49947.00    .255336   .203412  -.1296985
+      49948.00    .253179   .200506  -.1310131
+      49949.00    .251097   .197685  -.1323117
+      49950.00    .249107   .194904  -.1336314
+      49951.00    .247201   .192091  -.1350051
+      49952.00    .245183   .189208  -.1364567
+      49953.00    .242878   .186348  -.1379952
+      49954.00    .240438   .183450  -.1396425
+      49955.00    .238156   .180477  -.1414378
+      49956.00    .236101   .177546  -.1433880
+      49957.00    .234106   .174753  -.1454513
+      49958.00    .232124   .172120  -.1475858
+      49959.00    .229971   .169548  -.1496976
+      49960.00    .227437   .166958  -.1517621
+      49961.00    .224672   .164364  -.1537776
+      49962.00    .221943   .161813  -.1557561
+      49963.00    .219408   .159389  -.1577167
+      49964.00    .217128   .157140  -.1596912
+      49965.00    .215002   .155058  -.1617171
+      49966.00    .212740   .153069  -.1638234
+      49967.00    .210029   .151075  -.1660164
+      49968.00    .206969   .148852  -.1682977
+      49969.00    .203795   .146375  -.1706431
+      49970.00    .200570   .143742  -.1729846
+      49971.00    .197305   .140984  -.1752536
+      49972.00    .194074   .138110  -.1774091
+      49973.00    .191035   .135293  -.1794394
+      49974.00    .188269   .132860  -.1813611
+      49975.00    .185662   .130861  -.1832127
+      49976.00    .182997   .129117  -.1850363
+      49977.00    .180140   .127395  -.1868638
+      49978.00    .177142   .125569  -.1887169
+      49979.00    .174227   .123629  -.1906144
+      49980.00    .171426   .121661  -.1925842
+      49981.00    .168433   .119799  -.1946974
+      49982.00    .165227   .118066  -.1969832
+      49983.00    .161888   .116469  -.1994317
+      49984.00    .158666   .114917  -.2020139
+      49985.00    .155648   .113415  -.2046817
+      49986.00    .152758   .112022  -.2073726
+      49987.00    .149886   .110801  -.2100182
+      49988.00    .147073   .109840  -.2125541
+      49989.00    .144280   .108970  -.2149738
+      49990.00    .141336   .108038  -.2173092
+      49991.00    .138111   .107025  -.2196143
+      49992.00    .134567   .105987  -.2219501
+      49993.00    .130695   .105001  -.2243638
+      49994.00    .126575   .104045  -.2268727
+      49995.00    .122609   .103062  -.2294525
+      49996.00    .118773   .101939  -.2320905
+      49997.00    .114860   .100643  -.2347659
+      49998.00    .110837   .099201  -.2374358
+      49999.00    .106690   .097625  -.2400381
+      50000.00    .102471   .095946  -.2425086
+      50001.00    .098323   .094278  -.2448171
+      50002.00    .094472   .092742  -.2469890
+      50003.00    .090997   .091469  -.2490365
+      50004.00    .087895   .090594  -.2509869
+      50005.00    .084727   .090020  -.2528981
+      50006.00    .081140   .089428  -.2548170
+      50007.00    .077223   .088633  -.2567910
+      50008.00    .073319   .087696  -.2588592
+      50009.00    .069832   .086810  -.2610189
+      50010.00    .066975   .086104  -.2632595
+      50011.00    .064561   .085696  -.2656028
+      50012.00    .062087   .085544  -.2680337
+      50013.00    .059125   .085440  -.2705006
+      50014.00    .055535   .085180  -.2729630
+      50015.00    .051426   .084676  -.2753887
+      50016.00    .047101   .084034  -.2777537
+      50017.00    .042802   .083316  -.2800474
+      50018.00    .038761   .082671  -.2823000
+      50019.00    .035078   .082295  -.2845748
+      50020.00    .031665   .082253  -.2869319
+      50021.00    .028365   .082439  -.2894134
+      50022.00    .025113   .082725  -.2920343
+      50023.00    .021946   .083061  -.2947758
+      50024.00    .018673   .083419  -.2975496
+      50025.00    .015135   .083780  -.3002725
+      50026.00    .011387   .084118  -.3028973
+      50027.00    .007541   .084428  -.3053956
+      50028.00    .003739   .084751  -.3077684
+      50029.00    .000001   .085124  -.3100311
+      50030.00   -.003744   .085488  -.3121888
+      50031.00   -.007475   .085790  -.3142379
+      50032.00   -.011231   .086077  -.3162171
+      50033.00   -.014987   .086408  -.3181895
+      50034.00   -.018569   .086804  -.3202225
+      50035.00   -.021862   .087327  -.3223659
+      50036.00   -.025065   .088127  -.3246626
+      50037.00   -.028782   .089292  -.3271535
+      50038.00   -.033035   .090654  -.3298032
+      50039.00   -.037476   .092091  -.3325547
+      50040.00   -.041719   .093516  -.3353883
+      50041.00   -.045724   .094850  -.3382631
+      50042.00   -.049751   .096014  -.3411295
+      50043.00   -.053914   .096986  -.3439446
+      50044.00   -.057976   .097979  -.3466769
+      50045.00   -.061727   .099130  -.3493369
+      50046.00   -.065201   .100487  -.3519652
+      50047.00   -.068566   .102026  -.3546099
+      50048.00   -.071992   .103675  -.3573086
+      50049.00   -.075682   .105386  -.3600689
+      50050.00   -.079882   .107134  -.3628755
+      50051.00   -.084668   .108887  -.3656937
+      50052.00   -.089793   .110581  -.3684577
+      50053.00   -.094910   .112190  -.3711199
+      50054.00   -.099728   .113810  -.3736715
+      50055.00   -.104255   .115578  -.3761191
+      50056.00   -.108571   .117528  -.3784535
+      50057.00   -.112580   .119567  -.3806794
+      50058.00   -.116132   .121605  -.3828140
+      50059.00   -.119291   .123582  -.3849046
+      50060.00   -.122360   .125522  -.3870040
+      50061.00   -.125428   .127453  -.3891584
+      50062.00   -.128714   .129439  -.3913900
+      50063.00   -.132294   .131545  -.3937117
+      50064.00   -.135762   .133872  -.3961394
+      50065.00   -.138554   .136542  -.3986872
+      50066.00   -.140929   .139485  -.4013079
+      50067.00   -.143210   .142573  -.4039535
+      50068.00   -.145513   .145731  -.4066048
+      50069.00   -.147835   .148873  -.4092583
+      50070.00   -.150201   .151908  -.4118837
+      50071.00   -.152541   .154799  -.4144558
+      50072.00   -.154776   .157666  -.4169546
+      50073.00   -.156826   .160665  -.4193989
+      50074.00   -.158669   .163912  -.4218509
+      50075.00   -.160459   .167387  -.4243901
+      50076.00   -.162335   .170951  -.4270547
+      50077.00   -.164330   .174443  -.4298117
+      50078.00   -.166407   .177742  -.4325949
+      50079.00   -.168495   .180798  -.4353285
+      50080.00   -.170527   .183633  -.4379429
+      50081.00   -.172465   .186350  -.4403853
+      50082.00   -.174304   .189077  -.4426252
+      50083.00   -.175934   .191874   .5553429
+      50084.00   -.177203   .194733   .5534992
+      50085.00   -.178219   .197661   .5518040
+      50086.00   -.179271   .200769   .5502108
+      50087.00   -.180413   .204061   .5486679
+      50088.00   -.181716   .207436   .5471137
+      50089.00   -.183392   .210670   .5454827
+      50090.00   -.185233   .213575   .5437364
+      50091.00   -.186902   .216171   .5418803
+      50092.00   -.188610   .218633   .5399478
+      50093.00   -.190544   .221323   .5379721
+      50094.00   -.192621   .224329   .5359773
+      50095.00   -.194690   .227472   .5339774
+      50096.00   -.196600   .230482   .5319852
+      50097.00   -.198256   .233199   .5300178
+      50098.00   -.199573   .235746   .5280928
+      50099.00   -.200722   .238434   .5262338
+      50100.00   -.202042   .241575   .5244563
+      50101.00   -.203464   .245190   .5227037
+      50102.00   -.204972   .249073   .5208840
+      50103.00   -.206515   .252890   .5189387
+      50104.00   -.208097   .256437   .5168645
+      50105.00   -.209673   .259782   .5147185
+      50106.00   -.210988   .263176   .5125896
+      50107.00   -.211914   .266751   .5105347
+      50108.00   -.212703   .270456   .5085976
+      50109.00   -.213735   .274297   .5067973
+      50110.00   -.215159   .278183   .5051407
+      50111.00   -.216851   .281901   .5036132
+      50112.00   -.218493   .285363   .5021832
+      50113.00   -.219824   .288726   .5008057
+      50114.00   -.220800   .292186   .4994203
+      50115.00   -.221440   .295824   .4979729
+      50116.00   -.221815   .299586   .4964256
+      50117.00   -.222065   .303384   .4947668
+      50118.00   -.222381   .307187   .4930004
+      50119.00   -.222896   .310942   .4911259
+      50120.00   -.223554   .314574   .4891368
+      50121.00   -.224342   .318023   .4870476
+      50122.00   -.225044   .321171   .4849035
+      50123.00   -.225181   .323983   .4827588
+      50124.00   -.224580   .326681   .4806567
+      50125.00   -.223400   .329470   .4786206
+      50126.00   -.221975   .332497   .4766505
+      50127.00   -.220650   .335894   .4747223
+      50128.00   -.219519   .339747   .4727933
+      50129.00   -.218710   .344051   .4707968
+      50130.00   -.218381   .348607   .4686632
+      50131.00   -.218571   .353126   .4663566
+      50132.00   -.219284   .357369   .4638910
+      50133.00   -.220255   .361221   .4613243
+      50134.00   -.221031   .364694   .4587397
+      50135.00   -.221356   .367982   .4562191
+      50136.00   -.221356   .371356   .4538542
+      50137.00   -.221173   .375065   .4517135
+      50138.00   -.220760   .379108   .4497550
+      50139.00   -.220267   .383241   .4479084
+      50140.00   -.219849   .387230   .4461162
+      50141.00   -.219416   .391075   .4443430
+      50142.00   -.218720   .394877   .4425576
+      50143.00   -.217592   .398724   .4406961
+      50144.00   -.216046   .402709   .4387105
+      50145.00   -.214256   .406820   .4365826
+      50146.00   -.212377   .410989   .4343027
+      50147.00   -.210462   .415165   .4318862
+      50148.00   -.208540   .419342   .4293659
+      50149.00   -.206795   .423380   .4267812
+      50150.00   -.205259   .427213   .4241680
+      50151.00   -.203908   .430867   .4215619
+      50152.00   -.202582   .434377   .4189899
+      50153.00   -.201172   .437787   .4164748
+      50154.00   -.199681   .441159   .4140508
+      50155.00   -.198181   .444555   .4117438
+      50156.00   -.196547   .448062   .4095361
+      50157.00   -.194698   .451546   .4073526
+      50158.00   -.192737   .454954   .4051230
+      50159.00   -.190621   .458387   .4028131
+      50160.00   -.188103   .461977   .4004263
+      50161.00   -.185015   .465952   .3979922
+      50162.00   -.181736   .470274   .3955522
+      50163.00   -.178926   .474524   .3931553
+      50164.00   -.176775   .478401   .3908599
+      50165.00   -.175051   .481739   .3886987
+      50166.00   -.173268   .484606   .3866632
+      50167.00   -.171139   .487249   .3847174
+      50168.00   -.168588   .489916   .3828287
+      50169.00   -.165644   .492745   .3809636
+      50170.00   -.162586   .495671   .3790850
+      50171.00   -.159679   .498650   .3771505
+      50172.00   -.156908   .501603   .3751298
+      50173.00   -.154212   .504539   .3730040
+      50174.00   -.151663   .507519   .3707596
+      50175.00   -.149362   .510501   .3683888
+      50176.00   -.147360   .513289   .3659173
+      50177.00   -.145638   .515645   .3634127
+      50178.00   -.143920   .517579   .3609107
+      50179.00   -.142117   .519318   .3584370
+      50180.00   -.140191   .521063   .3560213
+      50181.00   -.137977   .522959   .3536761
+      50182.00   -.135234   .525188   .3513918
+      50183.00   -.132187   .527816   .3491286
+      50184.00   -.129341   .530702   .3468257
+      50185.00   -.126573   .533654   .3444367
+      50186.00   -.123540   .536510   .3419479
+      50187.00   -.120077   .539229   .3393835
+      50188.00   -.116351   .541835   .3367947
+      50189.00   -.112714   .544371   .3342362
+      50190.00   -.109479   .546890   .3317556
+      50191.00   -.106534   .549353   .3293821
+      50192.00   -.103718   .551690   .3271622
+      50193.00   -.100881   .553900   .3250953
+      50194.00   -.097922   .556020   .3231337
+      50195.00   -.094702   .558058   .3212225
+      50196.00   -.091203   .559985   .3193323
+      50197.00   -.087651   .561722   .3174315
+      50198.00   -.084232   .563198   .3154816
+      50199.00   -.080698   .564540   .3134595
+      50200.00   -.076772   .565959   .3113307
+      50201.00   -.072472   .567693   .3090793
+      50202.00   -.068033   .569841   .3067111
+      50203.00   -.063732   .572237   .3042392
+      50204.00   -.059829   .574547   .3016817
+      50205.00   -.056414   .576487   .2990626
+      50206.00   -.053179   .578097   .2964375
+      50207.00   -.049736   .579512   .2938736
+      50208.00   -.045973   .580829   .2914053
+      50209.00   -.042012   .582102   .2890282
+      50210.00   -.037918   .583347   .2866998
+      50211.00   -.033632   .584594   .2843591
+      50212.00   -.029180   .585848   .2819499
+      50213.00   -.024728   .587025   .2794478
+      50214.00   -.020330   .588093   .2768482
+      50215.00   -.015922   .589125   .2741811
+      50216.00   -.011521   .590154   .2715088
+      50217.00   -.007268   .591099   .2688973
+      50218.00   -.003399   .591911   .2663992
+      50219.00   -.000024   .592626   .2640413
+      50220.00    .003144   .593209   .2618504
+      50221.00    .006435   .593685   .2598275
+      50222.00    .009919   .594127   .2579410
+      50223.00    .013491   .594555   .2561562
+      50224.00    .017124   .594917   .2544473
+      50225.00    .020937   .595164   .2527826
+      50226.00    .025152   .595261   .2511090
+      50227.00    .029779   .595317   .2493911
+      50228.00    .034665   .595469   .2476132
+      50229.00    .039753   .595702   .2457632
+      50230.00    .044841   .595957   .2438479
+      50231.00    .049615   .596238   .2418917
+      50232.00    .053882   .596541   .2399269
+      50233.00    .057700   .596714   .2379830
+      50234.00    .061444   .596642   .2361074
+      50235.00    .065503   .596277   .2343259
+      50236.00    .069860   .595604   .2326331
+      50237.00    .074230   .594696   .2309860
+      50238.00    .078467   .593622   .2293212
+      50239.00    .082604   .592449   .2275791
+      50240.00    .086784   .591323   .2257463
+      50241.00    .090816   .590282   .2238242
+      50242.00    .094546   .589194   .2218261
+      50243.00    .098025   .587957   .2197756
+      50244.00    .101457   .586564   .2177168
+      50245.00    .105120   .585084   .2157148
+      50246.00    .109158   .583575   .2138240
+      50247.00    .113468   .581998   .2120760
+      50248.00    .117895   .580426   .2104819
+      50249.00    .122258   .578845   .2090393
+      50250.00    .126467   .577104   .2077336
+      50251.00    .130498   .575237   .2065038
+      50252.00    .134268   .573331   .2053055
+      50253.00    .137862   .571399   .2040955
+      50254.00    .141523   .569469   .2028277
+      50255.00    .145303   .567674   .2014758
+      50256.00    .149172   .566173   .2000356
+      50257.00    .153039   .564948   .1985142
+      50258.00    .156765   .563751   .1969418
+      50259.00    .160185   .562310   .1953602
+      50260.00    .163281   .560423   .1938095
+      50261.00    .166362   .558025   .1923025
+      50262.00    .169493   .555334   .1908709
+      50263.00    .172608   .552597   .1895423
+      50264.00    .175817   .549915   .1883068
+      50265.00    .179070   .547255   .1871278
+      50266.00    .182205   .544555   .1859475
+      50267.00    .185266   .541804   .1846984
+      50268.00    .188487   .539052   .1833305
+      50269.00    .191979   .536334   .1818802
+      50270.00    .195778   .533729   .1804193
+      50271.00    .199792   .531295   .1790079
+      50272.00    .203823   .528995   .1776848
+      50273.00    .207687   .526712   .1764712
+      50274.00    .211388   .524315   .1753711
+      50275.00    .215158   .521696   .1743692
+      50276.00    .218752   .518866   .1734575
+      50277.00    .221889   .515895   .1726196
+      50278.00    .224827   .512845   .1718092
+      50279.00    .227709   .509712   .1709819
+      50280.00    .230519   .506559   .1701089
+      50281.00    .233085   .503531   .1691727
+      50282.00    .235301   .500701   .1681581
+      50283.00    .237275   .497932   .1670524
+      50284.00    .238918   .495123   .1658696
+      50285.00    .240184   .492260   .1646247
+      50286.00    .241314   .489368   .1633338
+      50287.00    .242591   .486495   .1620133
+      50288.00    .244009   .483674   .1606780
+      50289.00    .245469   .480888   .1593401
+      50290.00    .247079   .478037   .1580361
+      50291.00    .248835   .475059   .1567921
+      50292.00    .250734   .472110   .1555719
+      50293.00    .252661   .469292   .1543073
+      50294.00    .254453   .466543   .1529305
+      50295.00    .256087   .463725   .1513964
+      50296.00    .257649   .460694   .1497082
+      50297.00    .259242   .457382   .1479439
+      50298.00    .260754   .453772   .1462136
+      50299.00    .262152   .449899   .1446201
+      50300.00    .263615   .445865   .1432182
+      50301.00    .265323   .441767   .1420121
+      50302.00    .267376   .437702   .1409883
+      50303.00    .269796   .433842   .1401274
+      50304.00    .272298   .430200   .1393817
+      50305.00    .274464   .426635   .1386936
+      50306.00    .276292   .423082   .1380287
+      50307.00    .278048   .419545   .1373368
+      50308.00    .279980   .416016   .1365864
+      50309.00    .282112   .412506   .1357628
+      50310.00    .284194   .409021   .1348547
+      50311.00    .285973   .405504   .1338546
+      50312.00    .287390   .401913   .1327661
+      50313.00    .288667   .398273   .1316146
+      50314.00    .290024   .394658   .1304407
+      50315.00    .291404   .391108   .1292722
+      50316.00    .292692   .387592   .1281259
+      50317.00    .293933   .384110   .1270006
+      50318.00    .295088   .380662   .1258849
+      50319.00    .296087   .377192   .1247746
+      50320.00    .296841   .373579   .1236414
+      50321.00    .297290   .369723   .1224278
+      50322.00    .297493   .365659   .1210837
+      50323.00    .297670   .361446   .1195813
+      50324.00    .298033   .357036   .1178957
+      50325.00    .298180   .352481   .1160999
+      50326.00    .297996   .347920   .1142992
+      50327.00    .297595   .343439   .1125912
+      50328.00    .297111   .339045   .1110459
+      50329.00    .296552   .334745   .1096902
+      50330.00    .295960   .330523   .1085160
+      50331.00    .295473   .326376   .1074717
+      50332.00    .294897   .322302   .1065122
+      50333.00    .294281   .318273   .1055830
+      50334.00    .293581   .314370   .1046463
+      50335.00    .292918   .310562   .1036476
+      50336.00    .292468   .306814   .1025295
+      50337.00    .292078   .303180   .1012360
+      50338.00    .291441   .299621   .0997288
+      50339.00    .290440   .295973   .0980515
+      50340.00    .289166   .292145   .0962769
+      50341.00    .287719   .288083   .0944635
+      50342.00    .286237   .283819   .0926574
+      50343.00    .284921   .279497   .0909065
+      50344.00    .283911   .275292   .0892429
+      50345.00    .283203   .271200   .0876477
+      50346.00    .282657   .267301   .0860787
+      50347.00    .282139   .263790   .0844801
+      50348.00    .281419   .260549   .0828080
+      50349.00    .280372   .257324   .0809917
+      50350.00    .278936   .253900   .0789841
+      50351.00    .277230   .250239   .0767836
+      50352.00    .275516   .246473   .0744490
+      50353.00    .273808   .242655   .0720875
+      50354.00    .272150   .238863   .0698002
+      50355.00    .270516   .235209   .0676504
+      50356.00    .268914   .231685   .0656491
+      50357.00    .267380   .228141   .0637705
+      50358.00    .265754   .224491   .0619873
+      50359.00    .263829   .220650   .0603299
+      50360.00    .261799   .216746   .0587553
+      50361.00    .259851   .213089   .0572015
+      50362.00    .257961   .209664   .0556113
+      50363.00    .256087   .206436   .0539591
+      50364.00    .254144   .203440   .0522227
+      50365.00    .252026   .200631   .0503866
+      50366.00    .249757   .197861   .0484432
+      50367.00    .247358   .194971   .0464105
+      50368.00    .244908   .191925   .0443206
+      50369.00    .242479   .188831   .0422045
+      50370.00    .239981   .185792   .0400921
+      50371.00    .237451   .182854   .0380178
+      50372.00    .235135   .180027   .0360083
+      50373.00    .232875   .177326   .0340670
+      50374.00    .230420   .174678   .0321772
+      50375.00    .227845   .172031   .0302706
+      50376.00    .225250   .169455   .0282566
+      50377.00    .222714   .166943   .0261129
+      50378.00    .220149   .164399   .0238554
+      50379.00    .217347   .161682   .0215014
+      50380.00    .214308   .158809   .0190585
+      50381.00    .211321   .155815   .0166062
+      50382.00    .208747   .152758   .0142398
+      50383.00    .206648   .149723   .0120193
+      50384.00    .204727   .146782   .0099692
+      50385.00    .202616   .143945   .0080787
+      50386.00    .200095   .141147   .0063248
+      50387.00    .197246   .138301   .0046700
+      50388.00    .194360   .135259   .0030512
+      50389.00    .191481   .132248   .0014209
+      50390.00    .188491   .129471  -.0002731
+      50391.00    .185317   .126988  -.0020740
+      50392.00    .181928   .124826  -.0040039
+      50393.00    .178262   .122939  -.0060643
+      50394.00    .174164   .121176  -.0082014
+      50395.00    .170037   .119377  -.0103803
+      50396.00    .166197   .117456  -.0125639
+      50397.00    .162466   .115589  -.0146986
+      50398.00    .158663   .113955  -.0167781
+      50399.00    .154633   .112544  -.0188187
+      50400.00    .150422   .111200  -.0208427
+      50401.00    .146079   .109862  -.0228148
+      50402.00    .141568   .108374  -.0246957
+      50403.00    .137457   .106632  -.0265370
+      50404.00    .134081   .104805  -.0284527
+      50405.00    .131054   .103105  -.0304736
+      50406.00    .128026   .101643  -.0325821
+      50407.00    .125019   .100437  -.0347399
+      50408.00    .122162   .099507  -.0369011
+      50409.00    .119269   .098733  -.0390000
+      50410.00    .116042   .097932  -.0409795
+      50411.00    .112575   .097007  -.0428249
+      50412.00    .108895   .096055  -.0445572
+      50413.00    .105076   .095273  -.0462060
+      50414.00    .101293   .094701  -.0478085
+      50415.00    .097465   .094238  -.0493838
+      50416.00    .093540   .093769  -.0509576
+      50417.00    .089593   .093199  -.0525574
+      50418.00    .085827   .092517  -.0542025
+      50419.00    .082281   .091772  -.0558923
+      50420.00    .078743   .091073  -.0576114
+      50421.00    .074984   .090512  -.0593535
+      50422.00    .070877   .089989  -.0611357
+      50423.00    .066593   .089367  -.0629445
+      50424.00    .062411   .088604  -.0647376
+      50425.00    .058416   .087729  -.0664852
+      50426.00    .054504   .086825  -.0681764
+      50427.00    .050574   .085999  -.0698227
+      50428.00    .046689   .085384  -.0714549
+      50429.00    .043010   .085082  -.0731165
+      50430.00    .039688   .085081  -.0748463
+      50431.00    .036684   .085362  -.0766865
+      50432.00    .033789   .085870  -.0786548
+      50433.00    .030822   .086510  -.0807293
+      50434.00    .027731   .087197  -.0828705
+      50435.00    .024552   .087895  -.0850383
+      50436.00    .021384   .088618  -.0871961
+      50437.00    .018204   .089314  -.0892816
+      50438.00    .015098   .089938  -.0912487
+      50439.00    .012264   .090507  -.0931030
+      50440.00    .009778   .091040  -.0948805
+      50441.00    .007387   .091534  -.0966031
+      50442.00    .004683   .091983  -.0982859
+      50443.00    .001482   .092365  -.0999606
+      50444.00   -.002138   .092697  -.1016613
+      50445.00   -.006054   .093050  -.1034141
+      50446.00   -.010233   .093503  -.1052325
+      50447.00   -.014631   .094090  -.1071181
+      50448.00   -.019065   .094720  -.1090616
+      50449.00   -.023125   .095292  -.1110467
+      50450.00   -.026846   .095921  -.1130512
+      50451.00   -.030356   .096804  -.1150536
+      50452.00   -.033659   .098009  -.1170274
+      50453.00   -.036894   .099459  -.1189536
+      50454.00   -.040341   .100969  -.1208302
+      50455.00   -.043963   .102347  -.1226704
+      50456.00   -.047384   .103560  -.1245101
+      50457.00   -.050363   .104719  -.1263955
+      50458.00   -.053191   .105897  -.1283614
+      50459.00   -.056069   .107078  -.1304323
+      50460.00   -.058933   .108271  -.1325930
+      50461.00   -.061619   .109534  -.1348093
+      50462.00   -.063963   .110918  -.1370449
+      50463.00   -.066046   .112506  -.1392469
+      50464.00   -.068034   .114400  -.1413615
+      50465.00   -.069960   .116470  -.1433426
+      50466.00   -.071941   .118545  -.1451623
+      50467.00   -.074152   .120610  -.1468202
+      50468.00   -.076773   .122686  -.1483487
+      50469.00   -.079660   .124753  -.1497922
+      50470.00   -.082335   .126769  -.1512048
+      50471.00   -.084929   .128732  -.1526485
+      50472.00   -.087687   .130552  -.1541269
+      50473.00   -.090542   .132279  -.1556175
+      50474.00   -.093642   .133992  -.1571430
+      50475.00   -.096798   .135756  -.1587242
+      50476.00   -.099828   .137597  -.1603627
+      50477.00   -.102756   .139487  -.1620217
+      50478.00   -.105545   .141428  -.1636253
+      50479.00   -.108317   .143490  -.1651635
+      50480.00   -.111349   .145610  -.1666459
+      50481.00   -.114391   .147746  -.1680324
+      50482.00   -.117215   .149884  -.1693291
+      50483.00   -.119869   .152077  -.1705907
+      50484.00   -.122471   .154427  -.1718955
+      50485.00   -.124786   .156838  -.1733379
+      50486.00   -.126743   .159259  -.1749635
+      50487.00   -.128511   .161777  -.1767825
+      50488.00   -.130350   .164433  -.1787477
+      50489.00   -.132250   .167200  -.1807865
+      50490.00   -.134165   .170000  -.1828595
+      50491.00   -.136191   .172752  -.1849226
+      50492.00   -.138295   .175444  -.1868678
+      50493.00   -.140379   .178160  -.1886653
+      50494.00   -.142530   .180941  -.1903477
+      50495.00   -.144884   .183697  -.1919402
+      50496.00   -.147478   .186326  -.1934698
+      50497.00   -.150122   .188791  -.1949925
+      50498.00   -.152594   .191120  -.1965482
+      50499.00   -.154965   .193390  -.1981573
+      50500.00   -.157097   .195697  -.1998452
+      50501.00   -.158915   .198140  -.2016223
+      50502.00   -.160453   .200800  -.2034968
+      50503.00   -.161818   .203733  -.2054597
+      50504.00   -.163299   .206941  -.2074795
+      50505.00   -.165215   .210308  -.2095110
+      50506.00   -.167652   .213624  -.2115238
+      50507.00   -.170138   .216857  -.2135309
+      50508.00   -.172256   .220043  -.2155422
+      50509.00   -.173879   .223231  -.2175595
+      50510.00   -.174995   .226453  -.2195849
+      50511.00   -.175740   .229709  -.2216355
+      50512.00   -.176415   .232987  -.2237518
+      50513.00   -.177300   .236295  -.2259897
+      50514.00   -.178558   .239568  -.2284127
+      50515.00   -.180253   .242757  -.2310411
+      50516.00   -.182213   .245858  -.2338346
+      50517.00   -.184152   .248905  -.2367006
+      50518.00   -.185660   .251986  -.2395438
+      50519.00   -.186433   .255167  -.2422867
+      50520.00   -.186654   .258479  -.2448840
+      50521.00   -.186547   .262016  -.2473473
+      50522.00   -.186532   .265890  -.2497212
+      50523.00   -.186927   .270001  -.2520565
+      50524.00   -.187669   .274026  -.2543915
+      50525.00   -.188374   .277782  -.2567473
+      50526.00   -.188751   .281365  -.2591447
+      50527.00   -.188948   .284964  -.2615966
+      50528.00   -.189277   .288636  -.2640664
+      50529.00   -.189584   .292340  -.2665641
+      50530.00   -.189715   .296049  -.2691041
+      50531.00   -.189650   .299799  -.2716708
+      50532.00   -.189501   .303650  -.2742439
+      50533.00   -.189576   .307593  -.2767977
+      50534.00   -.190011   .311542  -.2793072
+      50535.00   -.190465   .315430  -.2817635
+      50536.00   -.190817   .319244  -.2841799
+      50537.00   -.191111   .322923  -.2865724
+      50538.00   -.191277   .326401  -.2889662
+      50539.00   -.191095   .329761  -.2913990
+      50540.00   -.190396   .333126  -.2939066
+      50541.00   -.189369   .336798  -.2965213
+      50542.00   -.188326   .340644  -.2992707
+      50543.00   -.187324   .344421  -.3021543
+      50544.00   -.186426   .348044  -.3051186
+      50545.00   -.185573   .351535  -.3080759
+      50546.00   -.184596   .354973  -.3109377
+      50547.00   -.183491   .358473  -.3136437
+      50548.00   -.182447   .362076  -.3161928
+      50549.00   -.181423   .365823  -.3185995
+      50550.00   -.180458   .369697  -.3208959
+      50551.00   -.179741   .373586  -.3231184
+      50552.00   -.179301   .377335  -.3253059
+      50553.00   -.178935   .380843  -.3274896
+      50554.00   -.178449   .384082  -.3296974
+      50555.00   -.177770   .387200  -.3319711
+      50556.00   -.176894   .390339  -.3342906
+      50557.00   -.175898   .393568  -.3366294
+      50558.00   -.174918   .396920  -.3389891
+      50559.00   -.174074   .400408  -.3413517
+      50560.00   -.173393   .404014  -.3436733
+      50561.00   -.172759   .407606  -.3459204
+      50562.00   -.171839   .410966  -.3480859
+      50563.00   -.170499   .414152  -.3501739
+      50564.00   -.168831   .417314  -.3521945
+      50565.00   -.167106   .420468  -.3541611
+      50566.00   -.165634   .423541  -.3561064
+      50567.00   -.164540   .426430  -.3580823
+      50568.00   -.163574   .429110  -.3601397
+      50569.00   -.162447   .431668  -.3623133
+      50570.00   -.160959   .434208  -.3645947
+      50571.00   -.158952   .436863  -.3669830
+      50572.00   -.156442   .439744  -.3694605
+      50573.00   -.153614   .442881  -.3719702
+      50574.00   -.150798   .446180  -.3744440
+      50575.00   -.148127   .449423  -.3768402
+      50576.00   -.145405   .452426  -.3790965
+      50577.00   -.142482   .455307  -.3812199
+      50578.00   -.139426   .458227  -.3832642
+      50579.00   -.136461   .461179  -.3852533
+      50580.00   -.133867   .464047  -.3872115
+      50581.00   -.131687   .466720  -.3891616
+      50582.00   -.129668   .469178  -.3911154
+      50583.00   -.127578   .471457  -.3930758
+      50584.00   -.125217   .473621  -.3950526
+      50585.00   -.122492   .475779  -.3970639
+      50586.00   -.119535   .478059  -.3991144
+      50587.00   -.116559   .480544  -.4011911
+      50588.00   -.113641   .483188  -.4032818
+      50589.00   -.110776   .485865  -.4053710
+      50590.00   -.108256   .488391  -.4074257
+      50591.00   -.105963   .490720  -.4094314
+      50592.00   -.103700   .492983  -.4114046
+      50593.00   -.101447   .495252  -.4133742
+      50594.00   -.099172   .497478  -.4153798
+      50595.00   -.096785   .499650  -.4174722
+      50596.00   -.094267   .501741  -.4196953
+      50597.00   -.091850   .503791  -.4220672
+      50598.00   -.089584   .505799  -.4245581
+      50599.00   -.087350   .507760  -.4270965
+      50600.00   -.085071   .509688  -.4296072
+      50601.00   -.082698   .511540  -.4320282
+      50602.00   -.080141   .513310  -.4342951
+      50603.00   -.077450   .515008  -.4363661
+      50604.00   -.074955   .516512  -.4382224
+      50605.00   -.072662   .517746  -.4398921
+      50606.00   -.070423   .518722  -.4414443
+      50607.00   -.068053   .519422  -.4429291
+      50608.00   -.065268   .519887  -.4443891
+      50609.00   -.061898   .520349  -.4458636
+      50610.00   -.058127   .521097  -.4473822
+      50611.00   -.054367   .522302  -.4489535
+      50612.00   -.050642   .523897  -.4505582
+      50613.00   -.046970   .525560  -.4521676
+      50614.00   -.043365   .526958  -.4537530
+      50615.00   -.039765   .528003  -.4552828
+      50616.00   -.036136   .528829  -.4567309
+      50617.00   -.032476   .529592  -.4580759
+      50618.00   -.028867   .530411  -.4592748
+      50619.00   -.025152   .531246  -.4603396
+      50620.00   -.021281   .532003  -.4613282
+      50621.00   -.017250   .532620  -.4623065
+      50622.00   -.013076   .533105  -.4633442
+      50623.00   -.008959   .533538  -.4644849
+      50624.00   -.005037   .533969  -.4657361
+      50625.00   -.001305   .534422  -.4670736
+      50626.00    .002419   .534850  -.4684479
+      50627.00    .006322   .535197  -.4697869
+      50628.00    .010476   .535489  -.4710285
+      50629.00    .014809   .535883  -.4721332
+      50630.00    .019205   .536419   .5269220
+      50631.00    .023493   .536912   .5261374
+      50632.00    .027452   .537141   .5254967
+      50633.00    .031223   .537076   .5249515
+      50634.00    .034962   .536773   .5244340
+      50635.00    .038689   .536291   .5238814
+      50636.00    .042534   .535696   .5232476
+      50637.00    .046663   .535063   .5225157
+      50638.00    .050873   .534487   .5216906
+      50639.00    .054750   .534055   .5207857
+      50640.00    .058275   .533596   .5198074
+      50641.00    .061703   .532970   .5187691
+      50642.00    .065250   .532212   .5176801
+      50643.00    .068880   .531426   .5165642
+      50644.00    .072463   .530698   .5154546
+      50645.00    .075783   .530020   .5143902
+      50646.00    .078739   .529321   .5133592
+      50647.00    .081527   .528578   .5122953
+      50648.00    .084482   .527746   .5111334
+      50649.00    .087863   .526792   .5098259
+      50650.00    .091630   .525731   .5083296
+      50651.00    .095462   .524636   .5066364
+      50652.00    .099070   .523593   .5047789
+      50653.00    .102369   .522632   .5028128
+      50654.00    .105406   .521769   .5007884
+      50655.00    .108028   .520860   .4988149
+      50656.00    .110314   .519815   .4969636
+      50657.00    .112515   .518611   .4952704
+      50658.00    .114866   .517276   .4937342
+      50659.00    .117460   .515918   .4923373
+      50660.00    .120245   .514597   .4910524
+      50661.00    .123226   .513301   .4898217
+      50662.00    .126325   .512004   .4885897
+      50663.00    .129373   .510695   .4873339
+      50664.00    .132300   .509356   .4860454
+      50665.00    .135125   .507996   .4847079
+      50666.00    .137790   .506654   .4833214
+      50667.00    .140168   .505311   .4818941
+      50668.00    .142406   .503863   .4804318
+      50669.00    .144656   .502196   .4789539
+      50670.00    .146894   .500298   .4774990
+      50671.00    .149084   .498268   .4761027
+      50672.00    .151262   .496249   .4747824
+      50673.00    .153451   .494316   .4735354
+      50674.00    .155554   .492263   .4723490
+      50675.00    .157518   .490077   .4711881
+      50676.00    .159400   .487885   .4699843
+      50677.00    .161219   .485756   .4686609
+      50678.00    .163022   .483664   .4671734
+      50679.00    .164917   .481520   .4655203
+      50680.00    .166942   .479299   .4637208
+      50681.00    .169141   .476973   .4618231
+      50682.00    .171583   .474577   .4599375
+      50683.00    .174167   .472261   .4581597
+      50684.00    .176778   .470154   .4565369
+      50685.00    .179283   .468296   .4550755
+      50686.00    .181563   .466641   .4537300
+      50687.00    .183704   .465033   .4524304
+      50688.00    .185879   .463308   .4511285
+      50689.00    .188047   .461515   .4498180
+      50690.00    .190182   .459681   .4484854
+      50691.00    .192397   .457851   .4471108
+      50692.00    .194835   .456075   .4456687
+      50693.00    .197512   .454304   .4441490
+      50694.00    .200273   .452464   .4425676
+      50695.00    .202819   .450531   .4409528
+      50696.00    .204834   .448415   .4393440
+      50697.00    .206425   .446053   .4377641
+      50698.00    .207950   .443508   .4362179
+      50699.00    .209613   .440941   .4347090
+      50700.00    .211333   .438467   .4332717
+      50701.00    .212799   .435949   .4319120
+      50702.00    .214129   .433249   .4305354
+      50703.00    .215443   .430595   .4290757
+      50704.00    .216636   .428209   .4274979
+      50705.00    .217447   .426056   .4257653
+      50706.00    .217825   .423914   .4238243
+      50707.00    .217939   .421578   .4216578
+      50708.00    .218042   .419053   .4193071
+      50709.00    .218405   .416554   .4168661
+      50710.00    .219060   .414120   .4144571
+      50711.00    .219824   .411705   .4121859
+      50712.00    .220552   .409271   .4100988
+      50713.00    .221159   .406759   .4081784
+      50714.00    .221544   .404116   .4063782
+      50715.00    .221639   .401267   .4046411
+      50716.00    .221427   .398075   .4029151
+      50717.00    .221148   .394691   .4011444
+      50718.00    .220967   .391340   .3992871
+      50719.00    .220896   .388141   .3973575
+      50720.00    .220936   .385125   .3953779
+      50721.00    .221029   .382236   .3933771
+      50722.00    .221183   .379339   .3913652
+      50723.00    .221438   .376317   .3893063
+      50724.00    .221678   .373215   .3872347
+      50725.00    .221852   .370134   .3852065
+      50726.00    .222066   .367211   .3832492
+      50727.00    .222328   .364524   .3813624
+      50728.00    .222531   .362045   .3795218
+      50729.00    .222583   .359663   .3776878
+      50730.00    .222463   .357334   .3758081
+      50731.00    .222364   .354973   .3738415
+      50732.00    .222546   .352483   .3717573
+      50733.00    .223066   .349874   .3695248
+      50734.00    .223742   .347247   .3671319
+      50735.00    .224350   .344654   .3646101
+      50736.00    .224829   .342047   .3620202
+      50737.00    .225233   .339341   .3594312
+      50738.00    .225513   .336514   .3569238
+      50739.00    .225723   .333587   .3545707
+      50740.00    .226071   .330617   .3524006
+      50741.00    .226734   .327713   .3503925
+      50742.00    .227583   .324971   .3485072
+      50743.00    .228135   .322377   .3467023
+      50744.00    .228073   .319805   .3449452
+      50745.00    .227639   .317177   .3431894
+      50746.00    .227015   .314451   .3413928
+      50747.00    .226260   .311590   .3395366
+      50748.00    .225349   .308591   .3376163
+      50749.00    .224117   .305464   .3356391
+      50750.00    .222553   .302189   .3336090
+      50751.00    .220887   .298780   .3315353
+      50752.00    .219360   .295439   .3294279
+      50753.00    .218197   .292331   .3272972
+      50754.00    .217440   .289537   .3251797
+      50755.00    .216911   .287060   .3231026
+      50756.00    .216413   .284799   .3210639
+      50757.00    .215856   .282591   .3190230
+      50758.00    .215208   .280313   .3168940
+      50759.00    .214575   .278014   .3146522
+      50760.00    .213973   .275719   .3123008
+      50761.00    .213355   .273388   .3098278
+      50762.00    .212621   .271003   .3072218
+      50763.00    .211614   .268548   .3045421
+      50764.00    .210284   .266043   .3018805
+      50765.00    .208730   .263564   .2993329
+      50766.00    .207088   .261177   .2969961
+      50767.00    .205438   .258919   .2949190
+      50768.00    .203918   .256761   .2930689
+      50769.00    .202655   .254669   .2913779
+      50770.00    .201619   .252564   .2897821
+      50771.00    .200584   .250318   .2882163
+      50772.00    .199174   .247864   .2866280
+      50773.00    .197451   .245209   .2850227
+      50774.00    .195727   .242394   .2834162
+      50775.00    .194034   .239527   .2817959
+      50776.00    .192232   .236767   .2801566
+      50777.00    .190303   .234238   .2785077
+      50778.00    .188296   .231988   .2768699
+      50779.00    .186082   .230043   .2752722
+      50780.00    .183599   .228284   .2737303
+      50781.00    .180925   .226584   .2722504
+      50782.00    .178200   .224851   .2708259
+      50783.00    .175672   .223009   .2694351
+      50784.00    .173588   .221047   .2680505
+      50785.00    .171942   .219053   .2666417
+      50786.00    .170344   .217157   .2651830
+      50787.00    .168527   .215369   .2636186
+      50788.00    .166342   .213626   .2618905
+      50789.00    .163903   .211872   .2599495
+      50790.00    .161422   .210090   .2577994
+      50791.00    .159046   .208306   .2555327
+      50792.00    .157016   .206578   .2532611
+      50793.00    .155360   .204964   .2510794
+      50794.00    .153813   .203422   .2490314
+      50795.00    .151960   .201840   .2471484
+      50796.00    .149526   .200084   .2454378
+      50797.00    .146669   .198079   .2438609
+      50798.00    .143768   .195933   .2423544
+      50799.00    .141075   .193902   .2408754
+      50800.00    .138876   .192194   .2393864
+      50801.00    .137047   .190980   .2378658
+      50802.00    .134949   .190057   .2362873
+      50803.00    .132348   .189130   .2346470
+      50804.00    .129498   .188011   .2329639
+      50805.00    .126543   .186609   .2312498
+      50806.00    .123555   .184907   .2295451
+      50807.00    .120723   .183142   .2278943
+      50808.00    .118041   .181462   .2263238
+      50809.00    .115429   .179926   .2248520
+      50810.00    .112782   .178571   .2234795
+      50811.00    .110042   .177409   .2221795
+      50812.00    .107282   .176420   .2208913
+      50813.00    .104669   .175520   .2195567
+      50814.00    .102330   .174610   .2181268
+      50815.00    .100067   .173756   .2165474
+      50816.00    .097717   .173046   .2147880
+      50817.00    .095308   .172486   .2128524
+      50818.00    .092881   .172032   .2107892
+      50819.00    .090425   .171596   .2087156
+      50820.00    .087912   .171078   .2067344
+      50821.00    .085272   .170438   .2048885
+      50822.00    .082407   .169723   .2032072
+      50823.00    .079324   .169046   .2016899
+      50824.00    .076072   .168515   .2002746
+      50825.00    .072675   .168147   .1988820
+      50826.00    .069398   .167910   .1974576
+      50827.00    .066566   .167768   .1959508
+      50828.00    .063657   .167608   .1943544
+      50829.00    .060477   .167464   .1927001
+      50830.00    .057260   .167422   .1910127
+      50831.00    .054151   .167516   .1892952
+      50832.00    .051100   .167743   .1875474
+      50833.00    .047984   .167986   .1857901
+      50834.00    .044715   .168028   .1840492
+      50835.00    .041334   .167746   .1823291
+      50836.00    .037958   .167314   .1806273
+      50837.00    .034688   .166906   .1789316
+      50838.00    .031556   .166612   .1772322
+      50839.00    .028551   .166534   .1755271
+      50840.00    .025795   .166733   .1737632
+      50841.00    .023234   .167166   .1718530
+      50842.00    .020394   .167717   .1697221
+      50843.00    .017343   .168286   .1673762
+      50844.00    .014234   .168811   .1648804
+      50845.00    .011108   .169359   .1623325
+      50846.00    .007955   .170019   .1597821
+      50847.00    .004686   .170837   .1572725
+      50848.00    .001321   .171691   .1548339
+      50849.00   -.001925   .172410   .1524679
+      50850.00   -.004907   .173114   .1502065
+      50851.00   -.007577   .173869   .1480662
+      50852.00   -.010035   .174566   .1459967
+      50853.00   -.012460   .175079   .1439594
+      50854.00   -.015089   .175334   .1419780
+      50855.00   -.017954   .175401   .1400520
+      50856.00   -.020654   .175617   .1381159
+      50857.00   -.023038   .176036   .1361486
+      50858.00   -.025089   .176594   .1341574
+      50859.00   -.026885   .177371   .1321610
+      50860.00   -.028529   .178429   .1301747
+      50861.00   -.030138   .179743   .1282129
+      50862.00   -.032005   .181204   .1263079
+      50863.00   -.034594   .182632   .1244965
+      50864.00   -.037751   .183914   .1227247
+      50865.00   -.041186   .185022   .1209348
+      50866.00   -.044703   .185960   .1191234
+      50867.00   -.047998   .186807   .1172605
+      50868.00   -.050931   .187634   .1152941
+      50869.00   -.053569   .188438   .1131771
+      50870.00   -.055810   .189277   .1108978
+      50871.00   -.057486   .190283   .1084770
+      50872.00   -.058657   .191598   .1059310
+      50873.00   -.059602   .193205   .1032905
+      50874.00   -.060660   .194960   .1006586
+      50875.00   -.062008   .196729   .0981386
+      50876.00   -.063592   .198476   .0957946
+      50877.00   -.065267   .200360   .0936210
+      50878.00   -.066905   .202319   .0915841
+      50879.00   -.068490   .204312   .0896482
+      50880.00   -.070085   .206386   .0877786
+      50881.00   -.071696   .208509   .0859377
+      50882.00   -.073337   .210604   .0840788
+      50883.00   -.074912   .212602   .0821452
+      50884.00   -.076183   .214536   .0800910
+      50885.00   -.077239   .216649   .0779831
+      50886.00   -.078422   .218857   .0758586
+      50887.00   -.080159   .220952   .0737412
+      50888.00   -.082383   .222816   .0716611
+      50889.00   -.084734   .224483   .0696389
+      50890.00   -.086987   .226085   .0676945
+      50891.00   -.089008   .227692   .0658367
+      50892.00   -.090879   .229385   .0640498
+      50893.00   -.092870   .231116   .0623018
+      50894.00   -.094860   .232676   .0605486
+      50895.00   -.096558   .234047   .0587419
+      50896.00   -.097957   .235445   .0568313
+      50897.00   -.099289   .237069   .0547597
+      50898.00   -.100687   .238870   .0524515
+      50899.00   -.102256   .240823   .0499414
+      50900.00   -.104010   .242915   .0473499
+      50901.00   -.105925   .245145   .0447784
+      50902.00   -.107733   .247444   .0422919
+      50903.00   -.109077   .249741   .0399650
+      50904.00   -.109935   .252103   .0378239
+      50905.00   -.110527   .254548   .0358353
+      50906.00   -.111154   .256961   .0339580
+      50907.00   -.112007   .259254   .0321401
+      50908.00   -.112987   .261411   .0303301
+      50909.00   -.113778   .263513   .0284947
+      50910.00   -.114131   .265742   .0266181
+      50911.00   -.114147   .268209   .0246935
+      50912.00   -.113999   .270830   .0227298
+      50913.00   -.113829   .273649   .0207804
+      50914.00   -.113728   .276606   .0188422
+      50915.00   -.113850   .279529   .0168902
+      50916.00   -.114218   .282316   .0149437
+      50917.00   -.114694   .284973   .0130558
+      50918.00   -.115071   .287594   .0112541
+      50919.00   -.114962   .290211   .0095180
+      50920.00   -.114593   .292907   .0078497
+      50921.00   -.114123   .295738   .0061926
+      50922.00   -.113765   .298599   .0044955
+      50923.00   -.113651   .301376   .0027115
+      50924.00   -.113687   .304101   .0007922
+      50925.00   -.113745   .306874  -.0013031
+      50926.00   -.113785   .309763  -.0035829
+      50927.00   -.113731   .312527  -.0060392
+      50928.00   -.113542   .314955  -.0086030
+      50929.00   -.113192   .317088  -.0111380
+      50930.00   -.112849   .319179  -.0135214
+      50931.00   -.112779   .321423  -.0156958
+      50932.00   -.113003   .323784  -.0176699
+      50933.00   -.113272   .326044  -.0195105
+      50934.00   -.113419   .328142  -.0212989
+      50935.00   -.113532   .330140  -.0230801
+      50936.00   -.113724   .332146  -.0248627
+      50937.00   -.113999   .334250  -.0266435
+      50938.00   -.114283   .336511  -.0284218
+      50939.00   -.114503   .338910  -.0302130
+      50940.00   -.114596   .341219  -.0320567
+      50941.00   -.114527   .343367  -.0339048
+      50942.00   -.114308   .345406  -.0357187
+      50943.00   -.113923   .347417  -.0374953
+      50944.00   -.113420   .349476  -.0392108
+      50945.00   -.112913   .351594  -.0408403
+      50946.00   -.112428   .353738  -.0423730
+      50947.00   -.111946   .355832  -.0438200
+      50948.00   -.111435   .357812  -.0452267
+      50949.00   -.110968   .359665  -.0466667
+      50950.00   -.110639   .361433  -.0482169
+      50951.00   -.110376   .363189  -.0499317
+      50952.00   -.110102   .365018  -.0518421
+      50953.00   -.109967   .367001  -.0539483
+      50954.00   -.109945   .369171  -.0562109
+      50955.00   -.109673   .371698  -.0585571
+      50956.00   -.109234   .374455  -.0609492
+      50957.00   -.108731   .377218  -.0632756
+      50958.00   -.108142   .379851  -.0654284
+      50959.00   -.107668   .382295  -.0673610
+      50960.00   -.107472   .384492  -.0690754
+      50961.00   -.107423   .386358  -.0705961
+      50962.00   -.107151   .387984  -.0719801
+      50963.00   -.106549   .389639  -.0733016
+      50964.00   -.105883   .391519  -.0746174
+      50965.00   -.105316   .393568  -.0759485
+      50966.00   -.104823   .395623  -.0772754
+      50967.00   -.104525   .397545  -.0785861
+      50968.00   -.104589   .399252  -.0798820
+      50969.00   -.104719   .400837  -.0811497
+      50970.00   -.104591   .402402  -.0823602
+      50971.00   -.104185   .403981  -.0834622
+      50972.00   -.103655   .405577  -.0844369
+      50973.00   -.103042   .407182  -.0852883
+      50974.00   -.102217   .408801  -.0860368
+      50975.00   -.101272   .410408  -.0867308
+      50976.00   -.100513   .411926  -.0874101
+      50977.00   -.100010   .413302  -.0881062
+      50978.00   -.099407   .414567  -.0888650
+      50979.00   -.098389   .415830  -.0897238
+      50980.00   -.097022   .417175  -.0906571
+      50981.00   -.095357   .418640  -.0916396
+      50982.00   -.093646   .420329  -.0926459
+      50983.00   -.091783   .421990  -.0936208
+      50984.00   -.089921   .423490  -.0945457
+      50985.00   -.088168   .424852  -.0953771
+      50986.00   -.086454   .426143  -.0960672
+      50987.00   -.084694   .427473  -.0966007
+      50988.00   -.082934   .428940  -.0970187
+      50989.00   -.081371   .430507  -.0974038
+      50990.00   -.079860   .431951  -.0977963
+      50991.00   -.078218   .433227  -.0982229
+      50992.00   -.076251   .434408  -.0986901
+      50993.00   -.073849   .435647  -.0992107
+      50994.00   -.071100   .437082  -.0997910
+      50995.00   -.068239   .438694  -.1004131
+      50996.00   -.065567   .440347  -.1010373
+      50997.00   -.063009   .441996  -.1016024
+      50998.00   -.060511   .443674  -.1020711
+      50999.00   -.057993   .445381  -.1024447
+      51000.00   -.055404   .447048  -.1027229
+      51001.00   -.052822   .448568  -.1029010
+      51002.00   -.050272   .449909  -.1029867
+      51003.00   -.047789   .451171  -.1030078
+      51004.00   -.045284   .452559  -.1030458
+      51005.00   -.042770   .454154  -.1031990
+      51006.00   -.040237   .455835  -.1035270
+      51007.00   -.037743   .457466  -.1040342
+      51008.00   -.035317   .458998  -.1046856
+      51009.00   -.032985   .460388  -.1054234
+      51010.00   -.030768   .461506  -.1061780
+      51011.00   -.028607   .462383  -.1068703
+      51012.00   -.026513   .463176  -.1074437
+      51013.00   -.024528   .463998  -.1078768
+      51014.00   -.022578   .464858  -.1081687
+      51015.00   -.020654   .465732  -.1083355
+      51016.00   -.018742   .466609  -.1084270
+      51017.00   -.016591   .467461  -.1085268
+      51018.00   -.014288   .468234  -.1086888
+      51019.00   -.011898   .468963  -.1089490
+      51020.00   -.009354   .469790  -.1093187
+      51021.00   -.006753   .470803  -.1097667
+      51022.00   -.004257   .471952  -.1102513
+      51023.00   -.001928   .473168  -.1107348
+      51024.00    .000141   .474366  -.1111979
+      51025.00    .002045   .475412  -.1116748
+      51026.00    .003902   .476287  -.1121413
+      51027.00    .005810   .476934  -.1125566
+      51028.00    .007707   .477354  -.1129220
+      51029.00    .009695   .477689  -.1132513
+      51030.00    .011888   .478048  -.1135649
+      51031.00    .014036   .478378  -.1138882
+      51032.00    .016013   .478564  -.1142787
+      51033.00    .017857   .478532  -.1147998
+      51034.00    .019846   .478394  -.1154884
+      51035.00    .022136   .478349  -.1163435
+      51036.00    .024683   .478428  -.1173135
+      51037.00    .027507   .478537  -.1183214
+      51038.00    .030469   .478490  -.1192916
+      51039.00    .033161   .478373  -.1201373
+      51040.00    .035385   .478230  -.1208043
+      51041.00    .037338   .477954  -.1212799
+      51042.00    .039383   .477571  -.1215970
+      51043.00    .041616   .477282  -.1218310
+      51044.00    .043877   .477170  -.1220399
+      51045.00    .046118   .477172  -.1222411
+      51046.00    .048308   .477138  -.1224999
+      51047.00    .050364   .476926  -.1228631
+      51048.00    .052280   .476613  -.1233193
+      51049.00    .054145   .476412  -.1238454
+      51050.00    .056077   .476410  -.1244283
+      51051.00    .058154   .476479  -.1250667
+      51052.00    .060476   .476406  -.1257468
+      51053.00    .063022   .476301  -.1263679
+      51054.00    .065457   .476258  -.1269255
+      51055.00    .067554   .476216  -.1274719
+      51056.00    .069401   .476025  -.1280318
+      51057.00    .071120   .475561  -.1286135
+      51058.00    .072844   .474730  -.1292386
+      51059.00    .074764   .473551  -.1299286
+      51060.00    .077100   .472242  -.1307263
+      51061.00    .079771   .471042  -.1316873
+      51062.00    .082436   .470009  -.1328413
+      51063.00    .084904   .469113  -.1341544
+      51064.00    .087182   .468379  -.1355772
+      51065.00    .089300   .467798  -.1370359
+      51066.00    .091338   .467196  -.1384475
+      51067.00    .093191   .466586  -.1397068
+      51068.00    .094945   .466045  -.1407607
+      51069.00    .096838   .465596  -.1416295
+      51070.00    .099104   .465229  -.1423579
+      51071.00    .101649   .464944  -.1430406
+      51072.00    .104134   .464679  -.1437528
+      51073.00    .106262   .464282  -.1445295
+      51074.00    .107886   .463595  -.1453877
+      51075.00    .109157   .462458  -.1463485
+      51076.00    .110451   .461014  -.1474139
+      51077.00    .112012   .459494  -.1485386
+      51078.00    .113860   .457995  -.1496770
+      51079.00    .115813   .456545  -.1507847
+      51080.00    .117554   .455099  -.1518337
+      51081.00    .119055   .453760  -.1528303
+      51082.00    .120278   .452516  -.1537788
+      51083.00    .121282   .451171  -.1546743
+      51084.00    .122230   .449599  -.1555100
+      51085.00    .123196   .447930  -.1563226
+      51086.00    .124155   .446382  -.1571765
+      51087.00    .125228   .445043  -.1581667
+      51088.00    .126461   .443833  -.1593503
+      51089.00    .128001   .442525  -.1607548
+      51090.00    .129722   .441128  -.1623864
+      51091.00    .131406   .439608  -.1642040
+      51092.00    .132907   .437892  -.1661050
+      51093.00    .134223   .435948  -.1679813
+      51094.00    .135605   .433878  -.1697762
+      51095.00    .137157   .431974  -.1714343
+      51096.00    .138748   .430520  -.1729566
+      51097.00    .140117   .429469  -.1743488
+      51098.00    .141200   .428517  -.1756317
+      51099.00    .142006   .427407  -.1768635
+      51100.00    .142798   .426003  -.1781129
+      51101.00    .143900   .424493  -.1794441
+      51102.00    .145221   .423152  -.1808316
+      51103.00    .146618   .422003  -.1822482
+      51104.00    .147994   .420910  -.1836933
+      51105.00    .149208   .419738  -.1851581
+      51106.00    .150207   .418399  -.1866206
+      51107.00    .151112   .416821  -.1880692
+      51108.00    .151751   .414917  -.1894838
+      51109.00    .152151   .412904  -.1908182
+      51110.00    .152450   .411039  -.1920780
+      51111.00    .152867   .409395  -.1933079
+      51112.00    .153419   .407837  -.1945276
+      51113.00    .154100   .406206  -.1957206
+      51114.00    .154951   .404482  -.1969058
+      51115.00    .155988   .402752  -.1981645
+      51116.00    .157099   .401147  -.1995944
+      51117.00    .158205   .399656  -.2012498
+      51118.00    .159372   .398227  -.2031347
+      51119.00    .160608   .396796  -.2051970
+      51120.00    .161800   .395350  -.2073295
+      51121.00    .162759   .393866  -.2094137
+      51122.00    .163186   .392206  -.2113694
+      51123.00    .163127   .390338  -.2131451
+      51124.00    .163177   .388193  -.2147595
+      51125.00    .163540   .385840  -.2162531
+      51126.00    .164135   .383444  -.2176863
+      51127.00    .164793   .381095  -.2191246
+      51128.00    .165431   .378844  -.2205953
+      51129.00    .166094   .376752  -.2220940
+      51130.00    .166560   .374724  -.2236125
+      51131.00    .166577   .372674  -.2251363
+      51132.00    .166129   .370621  -.2266458
+      51133.00    .165389   .368567  -.2281187
+      51134.00    .164616   .366565  -.2295496
+      51135.00    .164092   .364644  -.2309382
+      51136.00    .163768   .362711  -.2322849
+      51137.00    .163194   .360797  -.2335826
+      51138.00    .161963   .358907  -.2348381
+      51139.00    .160085   .356946  -.2360666
+      51140.00    .158115   .354896  -.2372925
+      51141.00    .156354   .352913  -.2385373
+      51142.00    .154814   .351026  -.2398232
+      51143.00    .153691   .349091  -.2412084
+      51144.00    .152791   .347042  -.2427449
+      51145.00    .151834   .344872  -.2444448
+      51146.00    .150915   .342720  -.2462737
+      51147.00    .150141   .340779  -.2481367
+      51148.00    .149184   .339098  -.2499346
+      51149.00    .147951   .337562  -.2515983
+      51150.00    .147004   .336146  -.2531202
+      51151.00    .146455   .335017  -.2544842
+      51152.00    .145863   .334151  -.2557114
+      51153.00    .144933   .333320  -.2568539
+      51154.00    .143695   .332385  -.2579548
+      51155.00    .142269   .331265  -.2590365
+      51156.00    .140845   .329776  -.2601098
+      51157.00    .139654   .327889  -.2612229
+      51158.00    .138670   .325829  -.2623954
+      51159.00    .137880   .323810  -.2635872
+      51160.00    .137344   .321899  -.2647402
+      51161.00    .137118   .320090  -.2658320
+      51162.00    .137191   .318439  -.2668510
+      51163.00    .137482   .317021  -.2677836
+      51164.00    .137993   .315738  -.2686203
+      51165.00    .138867   .314494  -.2693765
+      51166.00    .140070   .313420  -.2700640
+      51167.00    .141362   .312536  -.2707054
+      51168.00    .142330   .311541  -.2713404
+      51169.00    .142795   .310097  -.2720051
+      51170.00    .142988   .308356  -.2727487
+      51171.00    .143090   .306710  -.2736544
+      51172.00    .143080   .305222  -.2747547
+      51173.00    .142815   .303796  -.2760051
+      51174.00    .142282   .302444  -.2773357
+      51175.00    .141721   .301186  -.2786798
+      51176.00    .141207   .299985  -.2799819
+      51177.00    .140598   .298726  -.2812143
+      51178.00    .139675   .297292  -.2823385
+      51179.00    .138577   .295556   .7166587
+      51180.00    .137785   .293577   .7157494
+      51181.00    .137421   .291696   .7148885
+      51182.00    .137132   .290124   .7140379
+      51183.00    .136733   .288814   .7131775
+      51184.00    .136397   .287754   .7122751
+      51185.00    .136247   .287027   .7112608
+      51186.00    .136118   .286554   .7101793
+      51187.00    .135752   .286182   .7091003
+      51188.00    .134909   .285701   .7080310
+      51189.00    .133471   .284873   .7069893
+      51190.00    .131464   .283567   .7060440
+      51191.00    .129180   .281889   .7052302
+      51192.00    .126962   .279990   .7044958
+      51193.00    .124851   .277989   .7038139
+      51194.00    .122714   .276071   .7032033
+      51195.00    .120630   .274356   .7026480
+      51196.00    .118887   .272823   .7021026
+      51197.00    .117525   .271405   .7014865
+      51198.00    .116539   .270022   .7007330
+      51199.00    .116083   .268687   .6997928
+      51200.00    .116118   .267493   .6986675
+      51201.00    .116223   .266420   .6973983
+      51202.00    .115937   .265363   .6960300
+      51203.00    .115117   .264256   .6946208
+      51204.00    .113991   .263174   .6932696
+      51205.00    .112826   .262237   .6920205
+      51206.00    .111620   .261398   .6908379
+      51207.00    .110525   .260526   .6896941
+      51208.00    .109379   .259573   .6885405
+      51209.00    .108080   .258531   .6873571
+      51210.00    .106598   .257341   .6861313
+      51211.00    .105004   .256005   .6848593
+      51212.00    .103396   .254659   .6835503
+      51213.00    .101922   .253439   .6822214
+      51214.00    .100916   .252566   .6808880
+      51215.00    .100335   .252224   .6795667
+      51216.00    .099624   .252238   .6782837
+      51217.00    .098384   .252265   .6770716
+      51218.00    .096675   .252190   .6759507
+      51219.00    .094706   .251925   .6749074
+      51220.00    .092622   .251225   .6739383
+      51221.00    .090736   .250235   .6730319
+      51222.00    .089163   .249217   .6721348
+      51223.00    .087881   .248238   .6711759
+      51224.00    .086783   .247431   .6701095
+      51225.00    .085708   .246965   .6689138
+      51226.00    .084445   .246805   .6675690
+      51227.00    .082689   .246707   .6660476
+      51228.00    .080806   .246425   .6643896
+      51229.00    .079313   .245935   .6626922
+      51230.00    .078445   .245457   .6610367
+      51231.00    .078153   .245134   .6594679
+      51232.00    .078078   .244906   .6580462
+      51233.00    .077632   .244669   .6568065
+      51234.00    .076472   .244314   .6557266
+      51235.00    .074875   .243781   .6547633
+      51236.00    .073082   .243098   .6538706
+      51237.00    .071378   .242384   .6529831
+      51238.00    .069983   .241806   .6520627
+      51239.00    .068909   .241487   .6511207
+      51240.00    .068114   .241469   .6501709
+      51241.00    .067407   .241688   .6491932
+      51242.00    .066561   .242023   .6481793
+      51243.00    .065483   .242354   .6471690
+      51244.00    .064348   .242547   .6462538
+      51245.00    .063278   .242556   .6454247
+      51246.00    .062192   .242377   .6446631
+      51247.00    .061032   .242009   .6439529
+      51248.00    .059969   .241610   .6432600
+      51249.00    .058807   .241239   .6425445
+      51250.00    .057514   .240861   .6417607
+      51251.00    .056092   .240433   .6408596
+      51252.00    .054562   .239984   .6397960
+      51253.00    .052907   .239553   .6385563
+      51254.00    .051136   .239142   .6371559
+      51255.00    .049793   .238932   .6356238
+      51256.00    .048941   .239050   .6340022
+      51257.00    .048186   .239430   .6323403
+      51258.00    .047327   .239931   .6306782
+      51259.00    .046514   .240468   .6290778
+      51260.00    .045565   .240966   .6276165
+      51261.00    .044085   .241305   .6263131
+      51262.00    .042017   .241415   .6251109
+      51263.00    .039295   .241416   .6239616
+      51264.00    .036347   .241357   .6227854
+      51265.00    .033747   .241145   .6215430
+      51266.00    .031676   .240915   .6202226
+      51267.00    .029843   .240902   .6188504
+      51268.00    .027952   .241025   .6174612
+      51269.00    .025972   .240966   .6160514
+      51270.00    .023889   .240663   .6146313
+      51271.00    .021820   .240215   .6132443
+      51272.00    .020052   .239794   .6119391
+      51273.00    .018652   .239541   .6107150
+      51274.00    .017384   .239548   .6095457
+      51275.00    .015829   .239833   .6084018
+      51276.00    .013791   .240165   .6072974
+      51277.00    .012055   .240386   .6062115
+      51278.00    .010998   .240635   .6050749
+      51279.00    .010475   .241143   .6038335
+      51280.00    .010119   .241969   .6024322
+      51281.00    .009565   .242944   .6008268
+      51282.00    .008800   .243956   .5990280
+      51283.00    .008074   .245070   .5971222
+      51284.00    .007323   .246324   .5951849
+      51285.00    .006257   .247512   .5932963
+      51286.00    .004782   .248353   .5915380
+      51287.00    .003071   .248755   .5899323
+      51288.00    .001508   .248848   .5884751
+      51289.00    .000190   .248839   .5871312
+      51290.00   -.001057   .248911   .5858655
+      51291.00   -.002271   .249270   .5846479
+      51292.00   -.003651   .249966   .5834051
+      51293.00   -.005339   .250849   .5820993
+      51294.00   -.006985   .251766   .5807227
+      51295.00   -.008027   .252694   .5792838
+      51296.00   -.008362   .253742   .5778108
+      51297.00   -.008472   .255001   .5763380
+      51298.00   -.008673   .256408   .5749065
+      51299.00   -.009270   .257734   .5735522
+      51300.00   -.010432   .258759   .5722963
+      51301.00   -.011958   .259424   .5711562
+      51302.00   -.013543   .259790   .5701485
+      51303.00   -.014882   .260006   .5692803
+      51304.00   -.015809   .260357   .5685207
+      51305.00   -.016511   .260980   .5677978
+      51306.00   -.017204   .261793   .5670197
+      51307.00   -.017955   .262620   .5661215
+      51308.00   -.018562   .263437   .5650617
+      51309.00   -.018908   .264417   .5638338
+      51310.00   -.019144   .265626   .5624372
+      51311.00   -.019272   .267017   .5608976
+      51312.00   -.019234   .268489   .5593032
+      51313.00   -.019058   .270015   .5577666
+      51314.00   -.019061   .271612   .5563793
+      51315.00   -.019409   .273248   .5551731
+      51316.00   -.019872   .274767   .5541002
+      51317.00   -.020213   .275981   .5530726
+      51318.00   -.020417   .276839   .5520267
+      51319.00   -.020523   .277505   .5509281
+      51320.00   -.020535   .278185   .5497378
+      51321.00   -.020552   .278928   .5484707
+      51322.00   -.020768   .279657   .5471797
+      51323.00   -.021347   .280333   .5458784
+      51324.00   -.022250   .280942   .5446124
+      51325.00   -.023138   .281436   .5434745
+      51326.00   -.023752   .281994   .5424832
+      51327.00   -.024118   .282646   .5416162
+      51328.00   -.024418   .283263   .5408527
+      51329.00   -.024737   .283829   .5401746
+      51330.00   -.025164   .284461   .5395663
+      51331.00   -.025839   .285250   .5389945
+      51332.00   -.026663   .286131   .5384164
+      51333.00   -.027370   .287157   .5377925
+      51334.00   -.027956   .288463   .5370730
+      51335.00   -.028608   .290007   .5362194
+      51336.00   -.029271   .291489   .5352299
+      51337.00   -.029839   .292673   .5340830
+      51338.00   -.030385   .293489   .5327898
+      51339.00   -.030823   .293963   .5314166
+      51340.00   -.031123   .294357   .5300536
+      51341.00   -.031394   .294908   .5287990
+      51342.00   -.031599   .295656   .5277405
+      51343.00   -.031741   .296616   .5268796
+      51344.00   -.032060   .297675   .5261601
+      51345.00   -.032633   .298575   .5255218
+      51346.00   -.033005   .299226   .5249077
+      51347.00   -.033064   .299759   .5242518
+      51348.00   -.032912   .300307   .5235385
+      51349.00   -.032633   .301003   .5227939
+      51350.00   -.032416   .301872   .5220497
+      51351.00   -.032382   .302784   .5213298
+      51352.00   -.032414   .303630   .5206856
+      51353.00   -.032237   .304449   .5201823
+      51354.00   -.032009   .305351   .5198199
+      51355.00   -.032072   .306343   .5195874
+      51356.00   -.032424   .307330   .5194846
+      51357.00   -.032681   .308172   .5194888
+      51358.00   -.032643   .308831   .5195759
+      51359.00   -.032439   .309415   .5196994
+      51360.00   -.032311   .310020   .5198139
+      51361.00   -.032153   .310745   .5198820
+      51362.00   -.031784   .311739   .5198545
+      51363.00   -.031170   .313045   .5196951
+      51364.00   -.030442   .314529   .5193487
+      51365.00   -.029704   .315956   .5188292
+      51366.00   -.028910   .317201   .5181918
+      51367.00   -.027983   .318324   .5175273
+      51368.00   -.027037   .319481   .5169244
+      51369.00   -.026224   .320703   .5164345
+      51370.00   -.025557   .321908   .5160590
+      51371.00   -.025019   .323101   .5157613
+      51372.00   -.024667   .324344   .5154946
+      51373.00   -.024535   .325578   .5152068
+      51374.00   -.024744   .326635   .5148456
+      51375.00   -.025238   .327339   .5144052
+      51376.00   -.025708   .327855   .5138917
+      51377.00   -.025892   .328401   .5133447
+      51378.00   -.025770   .329054   .5128171
+      51379.00   -.025384   .329837   .5123367
+      51380.00   -.024803   .330652   .5119213
+      51381.00   -.024166   .331389   .5115879
+      51382.00   -.023612   .332029   .5113555
+      51383.00   -.023436   .332554   .5112222
+      51384.00   -.023690   .332988   .5111749
+      51385.00   -.023985   .333417   .5111988
+      51386.00   -.024026   .333921   .5112401
+      51387.00   -.023857   .334593   .5112419
+      51388.00   -.023510   .335462   .5111595
+      51389.00   -.023000   .336427   .5109628
+      51390.00   -.022362   .337453   .5105973
+      51391.00   -.021640   .338517   .5100551
+      51392.00   -.020859   .339539   .5093789
+      51393.00   -.019878   .340497   .5085788
+      51394.00   -.018583   .341387   .5077202
+      51395.00   -.017112   .342266   .5069471
+      51396.00   -.015757   .343305   .5063317
+      51397.00   -.014781   .344488   .5058809
+      51398.00   -.014169   .345595   .5055680
+      51399.00   -.013827   .346439   .5053520
+      51400.00   -.013570   .347008   .5051508
+      51401.00   -.013229   .347413   .5048772
+      51402.00   -.012743   .347767   .5044897
+      51403.00   -.012239   .348141   .5040260
+      51404.00   -.011835   .348680   .5034709
+      51405.00   -.011719   .349523   .5028289
+      51406.00   -.011590   .350631   .5021460
+      51407.00   -.011034   .351884   .5014710
+      51408.00   -.010319   .353153   .5008619
+      51409.00   -.009797   .354359   .5003492
+      51410.00   -.009297   .355503   .4999451
+      51411.00   -.008671   .356678   .4996400
+      51412.00   -.008248   .357883   .4993711
+      51413.00   -.008243   .358996   .4991033
+      51414.00   -.008483   .359983   .4988082
+      51415.00   -.008694   .360823   .4984339
+      51416.00   -.008598   .361514   .4978839
+      51417.00   -.008393   .362115   .4971095
+      51418.00   -.008182   .362641   .4961321
+      51419.00   -.007823   .363098   .4950086
+      51420.00   -.007289   .363548   .4937904
+      51421.00   -.006771   .364020   .4925551
+      51422.00   -.006488   .364447   .4913924
+      51423.00   -.006386   .364778   .4903690
+      51424.00   -.006220   .365077   .4894913
+      51425.00   -.005751   .365411   .4887284
+      51426.00   -.004880   .365869   .4880370
+      51427.00   -.003703   .366428   .4873721
+      51428.00   -.002464   .367003   .4866972
+      51429.00   -.001309   .367620   .4859923
+      51430.00   -.000411   .368267   .4852548
+      51431.00    .000061   .368863   .4844846
+      51432.00    .000383   .369397   .4836996
+      51433.00    .000863   .369937   .4829502
+      51434.00    .001600   .370608   .4822679
+      51435.00    .002414   .371490   .4816712
+      51436.00    .003040   .372432   .4811759
+      51437.00    .003503   .373142   .4807967
+      51438.00    .003889   .373599   .4805028
+      51439.00    .004184   .373979   .4802355
+      51440.00    .004345   .374430   .4799329
+      51441.00    .004513   .374913   .4795506
+      51442.00    .004887   .375305   .4790321
+      51443.00    .005344   .375576   .4783296
+      51444.00    .005458   .375778   .4774428
+      51445.00    .005210   .375829   .4763994
+      51446.00    .004983   .375759   .4752638
+      51447.00    .005018   .375787   .4740970
+      51448.00    .005262   .376086   .4729339
+      51449.00    .005564   .376625   .4718474
+      51450.00    .005826   .377307   .4708876
+      51451.00    .006099   .378097   .4700343
+      51452.00    .006366   .378984   .4692888
+      51453.00    .006616   .379890   .4686406
+      51454.00    .007091   .380748   .4679841
+      51455.00    .007760   .381484   .4671962
+      51456.00    .008441   .382034   .4662445
+      51457.00    .009156   .382437   .4651338
+      51458.00    .009792   .382579   .4638922
+      51459.00    .010453   .382483   .4625759
+      51460.00    .011302   .382442   .4612270
+      51461.00    .012327   .382576   .4598931
+      51462.00    .013291   .382712   .4586308
+      51463.00    .013933   .382739   .4574905
+      51464.00    .014160   .382696   .4564699
+      51465.00    .014011   .382620   .4555245
+      51466.00    .013764   .382574   .4546679
+      51467.00    .013723   .382518   .4539027
+      51468.00    .013998   .382379   .4531777
+      51469.00    .014481   .382265   .4524251
+      51470.00    .015066   .382334   .4515871
+      51471.00    .015704   .382570   .4505951
+      51472.00    .016335   .382806   .4493644
+      51473.00    .016759   .382957   .4478747
+      51474.00    .017150   .383056   .4461607
+      51475.00    .017702   .383229   .4442931
+      51476.00    .018291   .383481   .4423756
+      51477.00    .018863   .383621   .4405168
+      51478.00    .019452   .383532   .4388010
+      51479.00    .019978   .383305   .4372960
+      51480.00    .020327   .383128   .4359633
+      51481.00    .020502   .383004   .4347173
+      51482.00    .020765   .382805   .4334775
+      51483.00    .021271   .382449   .4321898
+      51484.00    .021918   .381946   .4308357
+      51485.00    .022609   .381443   .4294020
+      51486.00    .023219   .380905   .4278975
+      51487.00    .023757   .380406   .4263817
+      51488.00    .024151   .380035   .4248891
+      51489.00    .024358   .379606   .4234446
+      51490.00    .024501   .378912   .4220772
+      51491.00    .024892   .378025   .4207713
+      51492.00    .025657   .377145   .4195125
+      51493.00    .026741   .376460   .4183198
+      51494.00    .027764   .376262   .4171923
+      51495.00    .028474   .376609   .4160811
+      51496.00    .028809   .377310   .4149095
+      51497.00    .028761   .377949   .4136514
+      51498.00    .028712   .378224   .4123109
+      51499.00    .029229   .378250   .4108591
+      51500.00    .030311   .378225   .4092440
+      51501.00    .031599   .378298   .4075068
+      51502.00    .032630   .378479   .4057008
+      51503.00    .033130   .378618   .4038769
+      51504.00    .033152   .378618   .4021328
+      51505.00    .032879   .378417   .4005584
+      51506.00    .032516   .378016   .3991948
+      51507.00    .032158   .377578   .3980249
+      51508.00    .031840   .377205   .3969956
+      51509.00    .031731   .376900   .3960227
+      51510.00    .032013   .376716   .3950159
+      51511.00    .032624   .376739   .3939021
+      51512.00    .033305   .377007   .3926455
+      51513.00    .033866   .377511   .3912784
+      51514.00    .034243   .378168   .3898971
+      51515.00    .034482   .378767   .3885654
+      51516.00    .034712   .379145   .3873141
+      51517.00    .034806   .379274   .3861571
+      51518.00    .034636   .379187   .3851032
+      51519.00    .034509   .378991   .3841467
+      51520.00    .034839   .378900   .3832822
+      51521.00    .035705   .379108   .3824822
+      51522.00    .036626   .379542   .3816877
+      51523.00    .037157   .379986   .3808536
+      51524.00    .037313   .380340   .3799565
+      51525.00    .037388   .380650   .3789967
+      51526.00    .037709   .381013   .3779240
+      51527.00    .038233   .381469   .3767143
+      51528.00    .038411   .381831   .3753863
+      51529.00    .038307   .381983   .3739443
+      51530.00    .038151   .382020   .3724233
+      51531.00    .037966   .382019   .3708867
+      51532.00    .037613   .381863   .3694136
+      51533.00    .037076   .381420   .3680734
+      51534.00    .036608   .380682   .3668939
+      51535.00    .036570   .379666   .3658297
+      51536.00    .037112   .378618   .3648087
+      51537.00    .038004   .377845   .3637629
+      51538.00    .039000   .377510   .3626369
+      51539.00    .040049   .377548   .3614129
+      51540.00    .041137   .377788   .3601152
+      51541.00    .042052   .378106   .3588103
+      51542.00    .042547   .378200   .3575773
+      51543.00    .042890   .377991   .3564633
+      51544.00    .043215   .377697   .3554732
+      51545.00    .043455   .377468   .3545966
+      51546.00    .043512   .377238   .3538464
+      51547.00    .043363   .376945   .3532360
+      51548.00    .043134   .376623   .3527537
+      51549.00    .043149   .376297   .3523431
+      51550.00    .043422   .376104   .3519484
+      51551.00    .043659   .375969   .3515404
+      51552.00    .043675   .375686   .3510966
+      51553.00    .043604   .375254   .3505534
+      51554.00    .043745   .374881   .3498790
+      51555.00    .044251   .374731   .3490532
+      51556.00    .045178   .374726   .3480742
+      51557.00    .046378   .374757   .3469483
+      51558.00    .047518   .374783   .3457480
+      51559.00    .048487   .374789   .3445662
+      51560.00    .049484   .374848   .3434739
+      51561.00    .050671   .375099   .3424895
+      51562.00    .051944   .375468   .3415968
+      51563.00    .053115   .375682   .3407635
+      51564.00    .054190   .375869   .3399193
+      51565.00    .055094   .376229   .3390041
+      51566.00    .055780   .376695   .3379742
+      51567.00    .056228   .377100   .3368184
+      51568.00    .056440   .377321   .3355604
+      51569.00    .056569   .377302   .3342584
+      51570.00    .056930   .377024   .3329659
+      51571.00    .057279   .376691   .3317549
+      51572.00    .057260   .376406   .3306897
+      51573.00    .057053   .376159   .3297764
+      51574.00    .056920   .375899   .3289928
+      51575.00    .056955   .375515   .3283083
+      51576.00    .057214   .374985   .3276983
+      51577.00    .057620   .374341   .3271605
+      51578.00    .058222   .373714   .3266641
+      51579.00    .058993   .373135   .3261312
+      51580.00    .059938   .372624   .3254829
+      51581.00    .061017   .372235   .3246859
+      51582.00    .062195   .371971   .3237181
+      51583.00    .063502   .371823   .3225902
+      51584.00    .064771   .371580   .3213657
+      51585.00    .065761   .371153   .3201477
+      51586.00    .066202   .370649   .3190448
+      51587.00    .066157   .370171   .3181117
+      51588.00    .066000   .369722   .3173178
+      51589.00    .066136   .369254   .3166298
+      51590.00    .066699   .368822   .3159886
+      51591.00    .067329   .368509   .3153378
+      51592.00    .067939   .368369   .3146275
+      51593.00    .068516   .368291   .3137951
+      51594.00    .069027   .368146   .3127835
+      51595.00    .069214   .367844   .3116045
+      51596.00    .069035   .367356   .3103486
+      51597.00    .068730   .366746   .3091149
+      51598.00    .068361   .366024   .3079714
+      51599.00    .067890   .365197   .3069563
+      51600.00    .067390   .364288   .3060864
+      51601.00    .066951   .363382   .3053466
+      51602.00    .066617   .362566   .3047064
+      51603.00    .066422   .361905   .3041427
+      51604.00    .066401   .361388   .3036098
+      51605.00    .066648   .360890   .3030436
+      51606.00    .067130   .360477   .3024079
+      51607.00    .067620   .360236   .3016646
+      51608.00    .067948   .360099   .3007691
+      51609.00    .068216   .359961   .2996940
+      51610.00    .068525   .359801   .2984518
+      51611.00    .068828   .359586   .2970918
+      51612.00    .069387   .359217   .2956919
+      51613.00    .070402   .358866   .2943263
+      51614.00    .071773   .358686   .2930544
+      51615.00    .073083   .358599   .2919128
+      51616.00    .073990   .358364   .2909174
+      51617.00    .074480   .357854   .2900542
+      51618.00    .074671   .357111   .2892761
+      51619.00    .074758   .356241   .2884848
+      51620.00    .074596   .355401   .2876281
+      51621.00    .074245   .354616   .2867043
+      51622.00    .073913   .353859   .2857300
+      51623.00    .073747   .353172   .2847254
+      51624.00    .073826   .352606   .2836875
+      51625.00    .073986   .352100   .2826302
+      51626.00    .073990   .351575   .2816146
+      51627.00    .073949   .351028   .2807146
+      51628.00    .073762   .350394   .2799580
+      51629.00    .073420   .349596   .2793488
+      51630.00    .073080   .348740   .2788852
+      51631.00    .072772   .347935   .2784878
+      51632.00    .072757   .347135   .2780890
+      51633.00    .073380   .346415   .2776678
+      51634.00    .074374   .345977   .2771617
+      51635.00    .075198   .345904   .2764928
+      51636.00    .075808   .346131   .2756134
+      51637.00    .076481   .346510   .2745277
+      51638.00    .076985   .346828   .2732774
+      51639.00    .077059   .346914   .2719400
+      51640.00    .077093   .346707   .2706251
+      51641.00    .077296   .346262   .2694147
+      51642.00    .077573   .345685   .2683416
+      51643.00    .077806   .345015   .2674068
+      51644.00    .078238   .344262   .2665760
+      51645.00    .079142   .343638   .2657834
+      51646.00    .080330   .343365   .2649542
+      51647.00    .081333   .343380   .2640252
+      51648.00    .081906   .343576   .2629513
+      51649.00    .082086   .343849   .2617145
+      51650.00    .082136   .344069   .2603384
+      51651.00    .082226   .344150   .2588795
+      51652.00    .082276   .344044   .2574198
+      51653.00    .082219   .343715   .2560309
+      51654.00    .082294   .343161   .2547592
+      51655.00    .082424   .342461   .2536047
+      51656.00    .082541   .341696   .2525701
+      51657.00    .082838   .340923   .2516714
+      51658.00    .083396   .340229   .2509021
+      51659.00    .084129   .339694   .2502312
+      51660.00    .084942   .339305   .2496080
+      51661.00    .085776   .338979   .2489548
+      51662.00    .086596   .338677   .2481768
+      51663.00    .087438   .338335   .2472104
+      51664.00    .088310   .337912   .2460469
+      51665.00    .089074   .337501   .2447165
+      51666.00    .089646   .337119   .2432550
+      51667.00    .089943   .336653   .2417404
+      51668.00    .089876   .335967   .2402498
+      51669.00    .089512   .335028   .2388797
+      51670.00    .089040   .333967   .2376950
+      51671.00    .088496   .332907   .2366841
+      51672.00    .087926   .331857   .2357910
+      51673.00    .087469   .330886   .2349382
+      51674.00    .087221   .330148   .2340443
+      51675.00    .087388   .329677   .2330322
+      51676.00    .088025   .329575   .2319108
+      51677.00    .088812   .329617   .2307012
+      51678.00    .089475   .329668   .2294361
+      51679.00    .090028   .329588   .2281687
+      51680.00    .090488   .329187   .2269698
+      51681.00    .090846   .328477   .2258826
+      51682.00    .091393   .327755   .2248928
+      51683.00    .092217   .327154   .2240194
+      51684.00    .093187   .326636   .2232798
+      51685.00    .093994   .326187   .2226631
+      51686.00    .094457   .325675   .2221314
+      51687.00    .094541   .324805   .2216301
+      51688.00    .094765   .323507   .2211125
+      51689.00    .095304   .322391   .2205648
+      51690.00    .096112   .321571   .2199668
+      51691.00    .097312   .320835   .2192941
+      51692.00    .098918   .320093   .2185232
+      51693.00    .100678   .319359   .2176552
+      51694.00    .102331   .318691   .2167245
+      51695.00    .103800   .318055   .2157888
+      51696.00    .105087   .317341   .2149209
+      51697.00    .106400   .316492   .2141761
+      51698.00    .107684   .315507   .2135716
+      51699.00    .108770   .314486   .2130846
+      51700.00    .109818   .313510   .2126473
+      51701.00    .110928   .312639   .2121691
+      51702.00    .111937   .311860   .2115752
+      51703.00    .112461   .311070   .2108262
+      51704.00    .112535   .310143   .2099522
+      51705.00    .112490   .308914   .2090299
+      51706.00    .112729   .307475   .2081422
+      51707.00    .113194   .306099   .2073506
+      51708.00    .113500   .304864   .2067048
+      51709.00    .113577   .303639   .2062475
+      51710.00    .113645   .302472   .2060009
+      51711.00    .113161   .301332   .2059520
+      51712.00    .112189   .300267   .2060449
+      51713.00    .110999   .299135   .2062115
+      51714.00    .109831   .297643   .2064062
+      51715.00    .108880   .295971   .2065859
+      51716.00    .108124   .294316   .2066983
+      51717.00    .107741   .292556   .2067001
+      51718.00    .107635   .290771   .2065948
+      51719.00    .107822   .289158   .2063949
+      51720.00    .108185   .287884   .2061000
+      51721.00    .108554   .286664   .2057138
+      51722.00    .108995   .285324   .2052783
+      51723.00    .109531   .283989   .2048415
+      51724.00    .110044   .282821   .2044716
+      51725.00    .110221   .281535   .2042304
+      51726.00    .110169   .280039   .2041293
+      51727.00    .109967   .278617   .2041166
+      51728.00    .109546   .277387   .2040917
+      51729.00    .108963   .276322   .2039568
+      51730.00    .108195   .275448   .2036533
+      51731.00    .107386   .274682   .2031755
+      51732.00    .107012   .273910   .2025619
+      51733.00    .106830   .273235   .2018964
+      51734.00    .106345   .272676   .2012574
+      51735.00    .105472   .272081   .2006965
+      51736.00    .104471   .271366   .2002445
+      51737.00    .103658   .270383   .1999051
+      51738.00    .102881   .269207   .1996952
+      51739.00    .102127   .268078   .1996037
+      51740.00    .101213   .266972   .1996296
+      51741.00    .100163   .265843   .1997601
+      51742.00    .099235   .264837   .1999437
+      51743.00    .098285   .263948   .2001382
+      51744.00    .097161   .262947   .2003128
+      51745.00    .096019   .261634   .2004413
+      51746.00    .094818   .260257   .2005212
+      51747.00    .093439   .259074   .2005555
+      51748.00    .092112   .258017   .2005297
+      51749.00    .091249   .256975   .2004521
+      51750.00    .090774   .256140   .2003567
+      51751.00    .090467   .255547   .2002801
+      51752.00    .090291   .255049   .2002659
+      51753.00    .089877   .254516   .2003391
+      51754.00    .089117   .253907   .2004866
+      51755.00    .088353   .253164   .2006483
+      51756.00    .087624   .252369   .2007368
+      51757.00    .086922   .251692   .2006819
+      51758.00    .086416   .251127   .2004629
+      51759.00    .085879   .250675   .2001140
+      51760.00    .085277   .250228   .1997081
+      51761.00    .084583   .249655   .1993192
+      51762.00    .083909   .249042   .1990109
+      51763.00    .083208   .248525   .1988276
+      51764.00    .082305   .248115   .1987890
+      51765.00    .081267   .247773   .1988874
+      51766.00    .079976   .247487   .1990782
+      51767.00    .078346   .247089   .1993185
+      51768.00    .076607   .246398   .1995682
+      51769.00    .075050   .245638   .1997864
+      51770.00    .073685   .245040   .1999357
+      51771.00    .072650   .244535   .1999812
+      51772.00    .071939   .244191   .1998923
+      51773.00    .071315   .244107   .1996358
+      51774.00    .070374   .244145   .1992137
+      51775.00    .069083   .244139   .1986598
+      51776.00    .067529   .244006   .1980179
+      51777.00    .065843   .243813   .1973375
+      51778.00    .063909   .243619   .1966686
+      51779.00    .062076   .243350   .1960529
+      51780.00    .060596   .243028   .1955095
+      51781.00    .059118   .242771   .1950637
+      51782.00    .057453   .242702   .1946679
+      51783.00    .055584   .242638   .1942311
+      51784.00    .053762   .242461   .1936784
+      51785.00    .052242   .242168   .1929644
+      51786.00    .051091   .241829   .1920968
+      51787.00    .050026   .241689   .1911429
+      51788.00    .049004   .241787   .1901885
+      51789.00    .047868   .241878   .1893152
+      51790.00    .046627   .241895   .1885815
+      51791.00    .045163   .241966   .1880169
+      51792.00    .043394   .242041   .1876245
+      51793.00    .041253   .242044   .1873924
+      51794.00    .038987   .241874   .1872994
+      51795.00    .036646   .241519   .1873119
+      51796.00    .034228   .241045   .1873757
+      51797.00    .031863   .240490   .1874162
+      51798.00    .029800   .240042   .1873909
+      51799.00    .027756   .239711   .1872765
+      51800.00    .025131   .239553   .1870392
+      51801.00    .022100   .239613   .1866261
+      51802.00    .019235   .239702   .1860446
+      51803.00    .016892   .239768   .1853451
+      51804.00    .015146   .239926   .1846132
+      51805.00    .013673   .240390   .1839280
+      51806.00    .012234   .241177   .1833480
+      51807.00    .010639   .242107   .1828855
+      51808.00    .008784   .242995   .1824901
+      51809.00    .006877   .243489   .1821322
+      51810.00    .005374   .243521   .1817526
+      51811.00    .004180   .243406   .1812846
+      51812.00    .002961   .243379   .1806641
+      51813.00    .001685   .243522   .1798529
+      51814.00    .000637   .243908   .1788651
+      51815.00   -.000618   .244567   .1777557
+      51816.00   -.002327   .245461   .1766239
+      51817.00   -.004224   .246291   .1755666
+      51818.00   -.005825   .246948   .1746510
+      51819.00   -.007317   .247621   .1739216
+      51820.00   -.009224   .248297   .1733949
+      51821.00   -.011143   .248950   .1730499
+      51822.00   -.013069   .249438   .1728087
+      51823.00   -.014665   .249912   .1725813
+      51824.00   -.016139   .250291   .1722903
+      51825.00   -.017636   .250548   .1718754
+      51826.00   -.019065   .250992   .1712972
+      51827.00   -.020494   .251829   .1705340
+      51828.00   -.021762   .253062   .1695809
+      51829.00   -.022955   .254629   .1684621
+      51830.00   -.024334   .256374   .1672188
+      51831.00   -.026199   .257929   .1659060
+      51832.00   -.028276   .259197   .1645897
+      51833.00   -.030364   .260226   .1633355
+      51834.00   -.032237   .261068   .1621903
+      51835.00   -.034006   .261825   .1611638
+      51836.00   -.035697   .262610   .1602119
+      51837.00   -.037440   .263490   .1592914
+      51838.00   -.039119   .264415   .1583268
+      51839.00   -.040594   .265452   .1572384
+      51840.00   -.041999   .266789   .1559864
+      51841.00   -.043325   .268351   .1545737
+      51842.00   -.044307   .269937   .1530409
+      51843.00   -.045559   .271645   .1514582
+      51844.00   -.046947   .273406   .1499040
+      51845.00   -.048312   .274938   .1484473
+      51846.00   -.049258   .276441   .1471312
+      51847.00   -.050029   .278336   .1459646
+      51848.00   -.051245   .280534   .1449376
+      51849.00   -.052365   .282579   .1440273
+      51850.00   -.053768   .284278   .1432139
+      51851.00   -.055168   .285920   .1424100
+      51852.00   -.056466   .287605   .1415673
+      51853.00   -.057701   .289318   .1406684
+      51854.00   -.059197   .291235   .1396914
+      51855.00   -.060735   .293436   .1386201
+      51856.00   -.062207   .295705   .1374452
+      51857.00   -.063703   .297752   .1361688
+      51858.00   -.065070   .299403   .1348301
+      51859.00   -.065971   .300644   .1335009
+      51860.00   -.066267   .301799   .1322709
+      51861.00   -.066492   .303333   .1312182
+      51862.00   -.067493   .305215   .1303689
+      51863.00   -.069107   .306966   .1296774
+      51864.00   -.071252   .308424   .1290646
+      51865.00   -.073154   .309840   .1284567
+      51866.00   -.074727   .311485   .1277697
+      51867.00   -.075653   .313425   .1269444
+      51868.00   -.075902   .315632   .1259690
+      51869.00   -.075832   .317969   .1248704
+      51870.00   -.075847   .320194   .1236988
+      51871.00   -.076126   .322251   .1225155
+      51872.00   -.076569   .324131   .1214167
+      51873.00   -.077090   .325916   .1204631
+      51874.00   -.077734   .327749   .1196786
+      51875.00   -.078464   .329650   .1190476
+      51876.00   -.079156   .331507   .1185260
+      51877.00   -.079387   .333385   .1180405
+      51878.00   -.079572   .335195   .1175256
+      51879.00   -.080077   .336962   .1169465
+      51880.00   -.080633   .338725   .1162730
+      51881.00   -.080874   .340453   .1154659
+      51882.00   -.080959   .342134   .1145151
+      51883.00   -.081277   .343792   .1134289
+      51884.00   -.081778   .345435   .1122263
+      51885.00   -.082321   .347178   .1109317
+      51886.00   -.082764   .349073   .1095995
+      51887.00   -.083349   .350969   .1083132
+      51888.00   -.083714   .352612   .1071406
+      51889.00   -.083829   .353999   .1061295
+      51890.00   -.083649   .355350   .1052914
+      51891.00   -.082749   .357031   .1045855
+      51892.00   -.081454   .359066   .1039318
+      51893.00   -.080187   .361234   .1032411
+      51894.00   -.079088   .363461   .1024684
+      51895.00   -.078140   .365712   .1016101
+      51896.00   -.077838   .367832   .1006813
+      51897.00   -.078183   .369725   .0997235
+      51898.00   -.078693   .371616   .0987847
+      51899.00   -.078656   .373822   .0979190
+      51900.00   -.078397   .376311   .0971744
+      51901.00   -.078015   .378911   .0965589
+      51902.00   -.077568   .381524   .0960664
+      51903.00   -.077052   .384097   .0956855
+      51904.00   -.076627   .386538   .0953894
+      51905.00   -.076313   .388743   .0951401
+      51906.00   -.076058   .390710   .0948989
+      51907.00   -.075340   .392637   .0946252
+      51908.00   -.074867   .394535   .0942721
+      51909.00   -.074232   .396311   .0938013
+      51910.00   -.073475   .398000   .0932012
+      51911.00   -.072616   .399776   .0924807
+      51912.00   -.071574   .401696   .0916585
+      51913.00   -.071043   .403552   .0907643
+      51914.00   -.070727   .405169   .0898571
+      51915.00   -.070375   .406607   .0890085
+      51916.00   -.070175   .407955   .0882806
+      51917.00   -.070202   .409286   .0876993
+      51918.00   -.070110   .410656   .0872305
+      51919.00   -.069867   .412121   .0868107
+      51920.00   -.069253   .413913   .0863871
+      51921.00   -.068491   .415946   .0858811
+      51922.00   -.067476   .418035   .0852171
+      51923.00   -.066439   .420036   .0843862
+      51924.00   -.065330   .421837   .0834544
+      51925.00   -.063996   .423433   .0825093
+      51926.00   -.062707   .424929   .0816517
+      51927.00   -.061468   .426305   .0809688
+      51928.00   -.060311   .427747   .0804814
+      51929.00   -.059229   .429112   .0801680
+      51930.00   -.058108   .430179   .0800094
+      51931.00   -.056802   .431143   .0799699
+      51932.00   -.055433   .432399   .0800133
+      51933.00   -.054105   .434088   .0800967
+      51934.00   -.052244   .435907   .0801067
+      51935.00   -.050480   .437795   .0799898
+      51936.00   -.049071   .439653   .0797378
+      51937.00   -.047516   .441457   .0793490
+      51938.00   -.045591   .443202   .0788464
+      51939.00   -.043693   .444798   .0782754
+      51940.00   -.042033   .446206   .0776959
+      51941.00   -.040636   .447190   .0771815
+      51942.00   -.039126   .447931   .0767659
+      51943.00   -.037703   .448626   .0764797
+      51944.00   -.036061   .449368   .0763355
+      51945.00   -.034020   .450341   .0762962
+      51946.00   -.032180   .451589   .0762796
+      51947.00   -.030365   .453000   .0761678
+      51948.00   -.028369   .454523   .0758262
+      51949.00   -.026513   .456074   .0752100
+      51950.00   -.024700   .457538   .0743443
+      51951.00   -.023433   .458809   .0733026
+      51952.00   -.022363   .459792   .0721740
+      51953.00   -.020906   .460725   .0710272
+      51954.00   -.019204   .461937   .0699186
+      51955.00   -.017628   .463232   .0689386
+      51956.00   -.015910   .464556   .0681089
+      51957.00   -.014070   .465865   .0674058
+      51958.00   -.012282   .467076   .0667945
+      51959.00   -.010501   .468197   .0662114
+      51960.00   -.008318   .469373   .0656072
+      51961.00   -.005520   .470698   .0649585
+      51962.00   -.002296   .472165   .0642607
+      51963.00    .000948   .473902   .0634634
+      51964.00    .004069   .475723   .0625081
+      51965.00    .006803   .477346   .0613757
+      51966.00    .009390   .478757   .0600802
+      51967.00    .011992   .479986   .0586678
+      51968.00    .014200   .481045   .0572087
+      51969.00    .016153   .481998   .0557767
+      51970.00    .017276   .482700   .0544494
+      51971.00    .018496   .483232   .0532711
+      51972.00    .020341   .483840   .0522268
+      51973.00    .022588   .484558   .0512724
+      51974.00    .024503   .485112   .0503386
+      51975.00    .026284   .485380   .0493333
+      51976.00    .028795   .485434   .0481232
+      51977.00    .031018   .485399   .0466901
+      51978.00    .033359   .485373   .0451120
+      51979.00    .035564   .485413   .0434664
+      51980.00    .038022   .485524   .0418693
+      51981.00    .040915   .485734   .0404265
+      51982.00    .043874   .486103   .0392186
+      51983.00    .046406   .486377   .0382843
+      51984.00    .048681   .486655   .0375617
+      51985.00    .050978   .487043   .0369778
+      51986.00    .053555   .487408   .0364941
+      51987.00    .056329   .487821   .0360676
+      51988.00    .059135   .488394   .0356430
+      51989.00    .061688   .488864   .0351568
+      51990.00    .064613   .489050   .0345635
+      51991.00    .067318   .489461   .0338698
+      51992.00    .070277   .490025   .0330839
+      51993.00    .073332   .490497   .0321623
+      51994.00    .076391   .490842   .0311235
+      51995.00    .079270   .491052   .0300255
+      51996.00    .081797   .491117   .0289424
+      51997.00    .084181   .491078   .0279322
+      51998.00    .086363   .490780   .0270475
+      51999.00    .088580   .490263   .0262681
+      52000.00    .090657   .489693   .0255680
+      52001.00    .092713   .489218   .0248977
+      52002.00    .094742   .488819   .0241865
+      52003.00    .096970   .488212   .0233415
+      52004.00    .099146   .487316   .0222831
+      52005.00    .101639   .486689   .0210200
+      52006.00    .104372   .486451   .0196018
+      52007.00    .106684   .486230   .0181065
+      52008.00    .108446   .485677   .0167021
+      52009.00    .110408   .484787   .0155036
+      52010.00    .112966   .483921   .0145483
+      52011.00    .115877   .483273   .0138282
+      52012.00    .118552   .482764   .0133060
+      52013.00    .120993   .482036   .0129373
+      52014.00    .123648   .481138   .0126343
+      52015.00    .126521   .480220   .0122983
+      52016.00    .129576   .479260   .0118375
+      52017.00    .132758   .478579   .0112160
+      52018.00    .136404   .478052   .0104241
+      52019.00    .139400   .477581   .0095180
+      52020.00    .142322   .476918   .0085454
+      52021.00    .144945   .476117   .0075411
+      52022.00    .147340   .475404   .0065665
+      52023.00    .149333   .474680   .0056600
+      52024.00    .151014   .473687   .0048331
+      52025.00    .153471   .472377   .0040681
+      52026.00    .155789   .471026   .0033913
+      52027.00    .157806   .469570   .0028082
+      52028.00    .159603   .467985   .0022319
+      52029.00    .161444   .466243   .0015624
+      52030.00    .163356   .464304   .0007169
+      52031.00    .164950   .462522  -.0003369
+      52032.00    .167277   .461283  -.0016044
+      52033.00    .169451   .460079  -.0030462
+      52034.00    .171731   .458504  -.0046043
+      52035.00    .173634   .456540  -.0061441
+      52036.00    .175770   .454417  -.0075479
+      52037.00    .178361   .452275  -.0087514
+      52038.00    .181152   .450055  -.0097479
+      52039.00    .183899   .447804  -.0105429
+      52040.00    .186558   .445713  -.0111874
+      52041.00    .189162   .444034  -.0117606
+      52042.00    .191399   .442523  -.0123357
+      52043.00    .193310   .440749  -.0129715
+      52044.00    .194797   .438595  -.0137153
+      52045.00    .196885   .436321  -.0145805
+      52046.00    .198612   .433526  -.0155485
+      52047.00    .200793   .430724  -.0166117
+      52048.00    .203161   .427891  -.0177380
+      52049.00    .205174   .425164  -.0188736
+      52050.00    .206955   .422557  -.0199526
+      52051.00    .208746   .420125  -.0209135
+      52052.00    .210426   .417989  -.0216892
+      52053.00    .212039   .415612  -.0222479
+      52054.00    .213256   .413088  -.0226142
+      52055.00    .214679   .410347  -.0228347
+      52056.00    .215942   .407372  -.0230140
+      52057.00    .217326   .404456  -.0232574
+      52058.00    .219019   .401751  -.0236287
+      52059.00    .220923   .399153  -.0241428
+      52060.00    .222844   .396603  -.0247593
+      52061.00    .224462   .394024  -.0254085
+      52062.00    .225856   .391301  -.0260285
+      52063.00    .227208   .388448  -.0265294
+      52064.00    .228755   .385506  -.0268396
+      52065.00    .230305   .382461  -.0269233
+      52066.00    .232394   .379951  -.0267701
+      52067.00    .234494   .377269  -.0264129
+      52068.00    .236427   .374759  -.0259398
+      52069.00    .238000   .372435  -.0254444
+      52070.00    .239149   .370013  -.0250118
+      52071.00    .240122   .367384  -.0247004
+      52072.00    .241075   .364662  -.0245354
+      52073.00    .241862   .361668  -.0245107
+      52074.00    .243205   .358359  -.0245966
+      52075.00    .244809   .355242  -.0247260
+      52076.00    .246266   .352304  -.0248955
+      52077.00    .247366   .349444  -.0250968
+      52078.00    .248189   .346490  -.0252880
+      52079.00    .248439   .343539  -.0254205
+      52080.00    .248322   .340726  -.0254431
+      52081.00    .248209   .337798  -.0253430
+      52082.00    .248422   .334848  -.0251893
+      52083.00    .248662   .331828  -.0250212
+      52084.00    .248931   .328775  -.0249081
+      52085.00    .249514   .325692  -.0249313
+      52086.00    .250305   .322581  -.0251681
+      52087.00    .251263   .319736  -.0256329
+      52088.00    .252011   .317012  -.0262455
+      52089.00    .252360   .313934  -.0268484
+      52090.00    .252992   .310715  -.0273415
+      52091.00    .253731   .307575  -.0276738
+      52092.00    .253964   .304394  -.0278178
+      52093.00    .253753   .301145  -.0277834
+      52094.00    .254215   .298188  -.0276027
+      52095.00    .254232   .295468  -.0273324
+      52096.00    .253911   .292761  -.0270278
+      52097.00    .253524   .290040  -.0267282
+      52098.00    .252708   .287256  -.0264986
+      52099.00    .251813   .284150  -.0263669
+      52100.00    .251686   .280793  -.0263067
+      52101.00    .251944   .277620  -.0263047
+      52102.00    .251507   .274653  -.0263530
+      52103.00    .250977   .271726  -.0264534
+      52104.00    .250420   .268800  -.0265857
+      52105.00    .249489   .265680  -.0266888
+      52106.00    .248487   .262337  -.0267108
+      52107.00    .248045   .259044  -.0266166
+      52108.00    .247899   .255898  -.0263879
+      52109.00    .247886   .252693  -.0260054
+      52110.00    .247644   .249621  -.0255194
+      52111.00    .247124   .246549  -.0250172
+      52112.00    .246308   .243497  -.0246244
+      52113.00    .245303   .240604  -.0244283
+      52114.00    .244181   .237844  -.0244490
+      52115.00    .243624   .235369  -.0246366
+      52116.00    .242989   .232644  -.0248666
+      52117.00    .242022   .229827  -.0250474
+      52118.00    .240668   .226879  -.0250822
+      52119.00    .239018   .223779  -.0249085
+      52120.00    .237308   .220720  -.0245315
+      52121.00    .235872   .217961  -.0239862
+      52122.00    .234708   .215461  -.0233285
+      52123.00    .233413   .213496  -.0226143
+      52124.00    .230934   .211330  -.0219419
+      52125.00    .228252   .208668  -.0213853
+      52126.00    .225848   .205783  -.0209760
+      52127.00    .223854   .203137  -.0207247
+      52128.00    .221846   .200695  -.0206206
+      52129.00    .219641   .198602  -.0206566
+      52130.00    .217156   .196301  -.0208393
+      52131.00    .214270   .194048  -.0211293
+      52132.00    .211292   .191558  -.0214996
+      52133.00    .208443   .188809  -.0218695
+      52134.00    .205986   .186155  -.0221796
+      52135.00    .203661   .183652  -.0223872
+      52136.00    .201030   .181204  -.0224832
+      52137.00    .198726   .178978  -.0225064
+      52138.00    .195935   .176831  -.0225537
+      52139.00    .193417   .174597  -.0227462
+      52140.00    .190985   .172340  -.0231581
+      52141.00    .188799   .170234  -.0238223
+      52142.00    .186205   .168172  -.0246828
+      52143.00    .183852   .165911  -.0256448
+      52144.00    .181210   .163907  -.0265834
+      52145.00    .178677   .162045  -.0273417
+      52146.00    .176475   .160131  -.0278971
+      52147.00    .174361   .158092  -.0282024
+      52148.00    .172421   .156000  -.0282814
+      52149.00    .170433   .153890  -.0281922
+      52150.00    .168322   .152401  -.0279987
+      52151.00    .166083   .150982  -.0277811
+      52152.00    .163282   .149983  -.0276358
+      52153.00    .160290   .149077  -.0275677
+      52154.00    .157071   .147756  -.0276349
+      52155.00    .153925   .146230  -.0278569
+      52156.00    .150804   .144646  -.0282213
+      52157.00    .147452   .142777  -.0286907
+      52158.00    .144611   .140770  -.0292332
+      52159.00    .141812   .139100  -.0297340
+      52160.00    .139469   .137762  -.0301363
+      52161.00    .137173   .136680  -.0304103
+      52162.00    .134793   .135598  -.0305519
+      52163.00    .131937   .134534  -.0305697
+      52164.00    .128799   .133191  -.0305005
+      52165.00    .125569   .132151  -.0304014
+      52166.00    .122462   .130991  -.0303880
+      52167.00    .118823   .129921  -.0305704
+      52168.00    .115134   .129008  -.0310339
+      52169.00    .111702   .128161  -.0317828
+      52170.00    .108312   .127305  -.0327193
+      52171.00    .104560   .126560  -.0336945
+      52172.00    .101202   .125935  -.0345894
+      52173.00    .097832   .125409  -.0353300
+      52174.00    .094515   .124864  -.0358762
+      52175.00    .091429   .124165  -.0362401
+      52176.00    .088536   .123182  -.0364427
+      52177.00    .085411   .122051  -.0365260
+      52178.00    .082376   .120940  -.0365832
+      52179.00    .078852   .119978  -.0366762
+      52180.00    .075375   .119070  -.0368739
+      52181.00    .071799   .118503  -.0372183
+      52182.00    .068626   .118099  -.0376932
+      52183.00    .065428   .117780  -.0382971
+      52184.00    .061701   .117636  -.0390380
+      52185.00    .057927   .117397  -.0398955
+      52186.00    .054765   .117299  -.0407777
+      52187.00    .052007   .117381  -.0416711
+      52188.00    .048970   .117600  -.0425184
+      52189.00    .045981   .117726  -.0432326
+      52190.00    .043041   .117743  -.0438207
+      52191.00    .039838   .117721  -.0443233
+      52192.00    .036029   .117573  -.0448060
+      52193.00    .031916   .117281  -.0453585
+      52194.00    .027453   .117238  -.0460502
+      52195.00    .023095   .117487  -.0469466
+      52196.00    .019346   .117756  -.0481163
+      52197.00    .015946   .118233  -.0495361
+      52198.00    .012831   .118897  -.0511037
+      52199.00    .009771   .119369  -.0526870
+      52200.00    .006624   .119915  -.0541499
+      52201.00    .003117   .120419  -.0553755
+      52202.00   -.000633   .121004  -.0563214
+      52203.00   -.004548   .121787  -.0570287
+      52204.00   -.008592   .122717  -.0575979
+      52205.00   -.012764   .123691  -.0581052
+      52206.00   -.016471   .124646  -.0586147
+      52207.00   -.020057   .125720  -.0591595
+      52208.00   -.023592   .126873  -.0598171
+      52209.00   -.027016   .128062  -.0606384
+      52210.00   -.030363   .129127  -.0616118
+      52211.00   -.033489   .130207  -.0626844
+      52212.00   -.036312   .131409  -.0638054
+      52213.00   -.039723   .132495  -.0649117
+      52214.00   -.042998   .133687  -.0659738
+      52215.00   -.046638   .134773  -.0669227
+      52216.00   -.050417   .135809  -.0676901
+      52217.00   -.053930   .136813  -.0683200
+      52218.00   -.056874   .137877  -.0688598
+      52219.00   -.059567   .139242  -.0693496
+      52220.00   -.061636   .140902  -.0698298
+      52221.00   -.063465   .142802  -.0704038
+      52222.00   -.065483   .144986  -.0712220
+      52223.00   -.067793   .147468  -.0723560
+      52224.00   -.069810   .149958  -.0737262
+      52225.00   -.071468   .152519  -.0752515
+      52226.00   -.073350   .155089  -.0768355
+      52227.00   -.075332   .157245  -.0783711
+      52228.00   -.077750   .159099  -.0796914
+      52229.00   -.080457   .160740  -.0807265
+      52230.00   -.082630   .162556  -.0815412
+      52231.00   -.084537   .164432  -.0821981
+      52232.00   -.086599   .166367  -.0827684
+      52233.00   -.088961   .168447  -.0833152
+      52234.00   -.091666   .170548  -.0838756
+      52235.00   -.094439   .172912  -.0844874
+      52236.00   -.097417   .175528  -.0852001
+      52237.00   -.100610   .178082  -.0860027
+      52238.00   -.103621   .180536  -.0868873
+      52239.00   -.106097   .183056  -.0878437
+      52240.00   -.108161   .185529  -.0888340
+      52241.00   -.110184   .187897  -.0898046
+      52242.00   -.112626   .190242  -.0906958
+      52243.00   -.115319   .192771  -.0914748
+      52244.00   -.118472   .195444  -.0921087
+      52245.00   -.121686   .197956  -.0925504
+      52246.00   -.124538   .200158  -.0928592
+      52247.00   -.127367   .202499  -.0931227
+      52248.00   -.129424   .205211  -.0934180
+      52249.00   -.131746   .208532  -.0938524
+      52250.00   -.134559   .211661  -.0944922
+      52251.00   -.137796   .214373  -.0953455
+      52252.00   -.140993   .216887  -.0963972
+      52253.00   -.143845   .219614  -.0975759
+      52254.00   -.146663   .222530  -.0987595
+      52255.00   -.149955   .225288  -.0998250
+      52256.00   -.152619   .227892  -.1007198
+      52257.00   -.155312   .230578  -.1014175
+      52258.00   -.157721   .233138  -.1018974
+      52259.00   -.159985   .235805  -.1022319
+      52260.00   -.161987   .238560  -.1025397
+      52261.00   -.163912   .241535  -.1029096
+      52262.00   -.165861   .244801  -.1033804
+      52263.00   -.167850   .248402  -.1039633
+      52264.00   -.169230   .251819  -.1047528
+      52265.00   -.170330   .255332  -.1057456
+      52266.00   -.171339   .258892  -.1068441
+      52267.00   -.172082   .262522  -.1080049
+      52268.00   -.172610   .266399  -.1091917
+      52269.00   -.173029   .270501  -.1103666
+      52270.00   -.173564   .274604  -.1114947
+      52271.00   -.174569   .278560  -.1125366
+      52272.00   -.175316   .282350  -.1134552
+      52273.00   -.175984   .286373  -.1142677
+      52274.00   -.176653   .290272  -.1150324
+      52275.00   -.177016   .293921  -.1158152
+      52276.00   -.177495   .297612  -.1166808
+      52277.00   -.178336   .300810  -.1177100
+      52278.00   -.179101   .303585  -.1189101
+      52279.00   -.179532   .306461  -.1202228
+      52280.00   -.180020   .309511  -.1215588
+      52281.00   -.180675   .312707  -.1228480
+      52282.00   -.181819   .315313  -.1239725
+      52283.00   -.182661   .318169  -.1248182
+      52284.00   -.183034   .321152  -.1254127
+      52285.00   -.183124   .324202  -.1258003
+      52286.00   -.182606   .327370  -.1260104
+      52287.00   -.182290   .330466  -.1260705
+      52288.00   -.181735   .333568  -.1260606
+      52289.00   -.181305   .336868  -.1260645
+      52290.00   -.180666   .339816  -.1261542
+      52291.00   -.179799   .342945  -.1263182
+      52292.00   -.179235   .346080  -.1265902
+      52293.00   -.178756   .349176  -.1270231
+      52294.00   -.178420   .352206  -.1275466
+      52295.00   -.178175   .355254  -.1281161
+      52296.00   -.177717   .358445  -.1287129
+      52297.00   -.177120   .361868  -.1293129
+      52298.00   -.176579   .365288  -.1298667
+      52299.00   -.175468   .368698  -.1303104
+      52300.00   -.174998   .372115  -.1306448
+      52301.00   -.174316   .375411  -.1309512
+      52302.00   -.173598   .378730  -.1313384
+      52303.00   -.172607   .382056  -.1319137
+      52304.00   -.172389   .385066  -.1327493
+      52305.00   -.170719   .388310  -.1338791
+      52306.00   -.168875   .391546  -.1351973
+      52307.00   -.167477   .394739  -.1366556
+      52308.00   -.166425   .397897  -.1381554
+      52309.00   -.165568   .400893  -.1395328
+      52310.00   -.164218   .403149  -.1407285
+      52311.00   -.163276   .406446  -.1417207
+      52312.00   -.162284   .409364  -.1424592
+      52313.00   -.161022   .412491  -.1430272
+      52314.00   -.159842   .415394  -.1434514
+      52315.00   -.157943   .418781  -.1438265
+      52316.00   -.156070   .422412  -.1442607
+      52317.00   -.154331   .425633  -.1448045
+      52318.00   -.153348   .428706  -.1454279
+      52319.00   -.152471   .431713  -.1461593
+      52320.00   -.151431   .434433  -.1469919
+      52321.00   -.150089   .437078  -.1479225
+      52322.00   -.148485   .439730  -.1489536
+      52323.00   -.146818   .442441  -.1500204
+      52324.00   -.145248   .445256  -.1510529
+      52325.00   -.143908   .447804  -.1520116
+      52326.00   -.142017   .450844  -.1528875
+      52327.00   -.140236   .453903  -.1536583
+      52328.00   -.138470   .457214  -.1543530
+      52329.00   -.136564   .460595  -.1550116
+      52330.00   -.134094   .463762  -.1557661
+      52331.00   -.131075   .466899  -.1567270
+      52332.00   -.128411   .470196  -.1579544
+      52333.00   -.125976   .473454  -.1594256
+      52334.00   -.123473   .476420  -.1610247
+      52335.00   -.120773   .479750  -.1626879
+      52336.00   -.118537   .482904  -.1642927
+      52337.00   -.116662   .485901  -.1656830
+      52338.00   -.114402   .488895  -.1668039
+      52339.00   -.111601   .491674  -.1677040
+      52340.00   -.108721   .494389  -.1684320
+      52341.00   -.105539   .497043  -.1690387
+      52342.00   -.102297   .499702  -.1695899
+      52343.00   -.099240   .502427  -.1701263
+      52344.00   -.096907   .505134  -.1707381
+      52345.00   -.095010   .507537  -.1714858
+      52346.00   -.092703   .509844  -.1723819
+      52347.00   -.090280   .512133  -.1733703
+      52348.00   -.087647   .514321  -.1743650
+      52349.00   -.084887   .516458  -.1753014
+      52350.00   -.081872   .518429  -.1761905
+      52351.00   -.078750   .520307  -.1770307
+      52352.00   -.075580   .522229  -.1777808
+      52353.00   -.072564   .523982  -.1783793
+      52354.00   -.069255   .525681  -.1788451
+      52355.00   -.065799   .527523  -.1792335
+      52356.00   -.062329   .529144  -.1796148
+      52357.00   -.058837   .530650  -.1800603
+      52358.00   -.055246   .532291  -.1806694
+      52359.00   -.051312   .534075  -.1815255
+      52360.00   -.048010   .535792  -.1826741
+      52361.00   -.045031   .537281  -.1841051
+      52362.00   -.041718   .538545  -.1856662
+      52363.00   -.038236   .539546  -.1871407
+      52364.00   -.034512   .540256  -.1884214
+      52365.00   -.030784   .540741  -.1894701
+      52366.00   -.027006   .541124  -.1902749
+      52367.00   -.022763   .541626  -.1908693
+      52368.00   -.018616   .542855  -.1913055
+      52369.00   -.014936   .544230  -.1916850
+      52370.00   -.011584   .545683  -.1920849
+      52371.00   -.008818   .546912  -.1925759
+      52372.00   -.006177   .547837  -.1931609
+      52373.00   -.003471   .548651  -.1938494
+      52374.00   -.001639   .549319  -.1946504
+      52375.00    .000751   .549735  -.1955552
+      52376.00    .003786   .550390  -.1965192
+      52377.00    .006859   .551221  -.1974561
+      52378.00    .009914   .551919  -.1983019
+      52379.00    .012891   .552556  -.1990194
+      52380.00    .015666   .553134  -.1995747
+      52381.00    .018798   .553633  -.1999273
+      52382.00    .022135   .554122  -.2002060
+      52383.00    .025465   .554554  -.2004662
+      52384.00    .028893   .554819  -.2006861
+      52385.00    .032006   .554948  -.2009777
+      52386.00    .034837   .554923  -.2014742
+      52387.00    .037858   .554783  -.2022657
+      52388.00    .041216   .554620  -.2033246
+      52389.00    .044875   .554471  -.2045984
+      52390.00    .048626   .554293  -.2060056
+      52391.00    .052514   .553903  -.2073772
+      52392.00    .056207   .553344  -.2085449
+      52393.00    .059895   .552842  -.2094192
+      52394.00    .063457   .552433  -.2100075
+      52395.00    .066763   .552386  -.2103409
+      52396.00    .069968   .552234  -.2105649
+      52397.00    .073288   .551921  -.2107657
+      52398.00    .076875   .551796  -.2110038
+      52399.00    .080648   .551735  -.2113748
+      52400.00    .084621   .551579  -.2119226
+      52401.00    .088539   .551194  -.2126279
+      52402.00    .091562   .550682  -.2134579
+      52403.00    .094243   .549881  -.2143723
+      52404.00    .097639   .549119  -.2153390
+      52405.00    .101069   .548815  -.2163055
+      52406.00    .103917   .548350  -.2172079
+      52407.00    .106766   .547632  -.2180235
+      52408.00    .109822   .546781  -.2187407
+      52409.00    .112006   .545573  -.2193284
+      52410.00    .114375   .544014  -.2198677
+      52411.00    .116538   .542416  -.2203632
+      52412.00    .119081   .541230  -.2208752
+      52413.00    .121980   .540478  -.2215514
+      52414.00    .125203   .539959  -.2224608
+      52415.00    .128372   .539462  -.2236311
+      52416.00    .131149   .538798  -.2249998
+      52417.00    .133610   .537948  -.2264286
+      52418.00    .135820   .537054  -.2278096
+      52419.00    .138173   .536021  -.2290156
+      52420.00    .140457   .534941  -.2299334
+      52421.00    .143105   .533782  -.2305356
+      52422.00    .146195   .532652  -.2308616
+      52423.00    .148920   .531341  -.2309940
+      52424.00    .151861   .529999  -.2310346
+      52425.00    .154660   .528524  -.2310732
+      52426.00    .157254   .526992  -.2311274
+      52427.00    .159754   .525267  -.2312328
+      52428.00    .162414   .523380  -.2313968
+      52429.00    .165131   .521795  -.2316129
+      52430.00    .168230   .520114  -.2318286
+      52431.00    .171414   .518441  -.2319476
+      52432.00    .174114   .516725  -.2319645
+      52433.00    .177634   .515071  -.2318775
+      52434.00    .180641   .513456  -.2316492
+      52435.00    .183530   .511787  -.2312677
+      52436.00    .186077   .509890  -.2307375
+      52437.00    .188424   .507805  -.2300812
+      52438.00    .190960   .505694  -.2294015
+      52439.00    .193075   .503992  -.2287126
+      52440.00    .195887   .502180  -.2281968
+      52441.00    .199050   .500101  -.2279198
+      52442.00    .202216   .497766  -.2279049
+      52443.00    .204825   .495346  -.2280920
+      52444.00    .207395   .492822  -.2283708
+      52445.00    .210129   .490564  -.2286949
+      52446.00    .212475   .488780  -.2289991
+      52447.00    .214565   .486718  -.2292301
+      52448.00    .216538   .484377  -.2293139
+      52449.00    .218215   .481849  -.2292565
+      52450.00    .219488   .479106  -.2291217
+      52451.00    .220855   .476274  -.2289744
+      52452.00    .222495   .473233  -.2288397
+      52453.00    .224475   .470176  -.2287886
+      52454.00    .225974   .467245  -.2288471
+      52455.00    .227145   .464496  -.2289808
+      52456.00    .228085   .461571  -.2292183
+      52457.00    .228670   .458420  -.2295755
+      52458.00    .229477   .455657  -.2300230
+      52459.00    .229929   .452705  -.2304413
+      52460.00    .230325   .449629  -.2307979
+      52461.00    .230813   .446335  -.2310385
+      52462.00    .231538   .442868  -.2311346
+      52463.00    .232357   .439566  -.2310913
+      52464.00    .233101   .436299  -.2309258
+      52465.00    .234036   .433127  -.2306797
+      52466.00    .235477   .430263  -.2304023
+      52467.00    .236735   .427399  -.2301805
+      52468.00    .238121   .424430  -.2301960
+      52469.00    .239167   .421365  -.2304459
+      52470.00    .240194   .418308  -.2309062
+      52471.00    .241186   .415505  -.2314847
+      52472.00    .241880   .412784  -.2320585
+      52473.00    .242880   .410344  -.2325272
+      52474.00    .244016   .408159  -.2328183
+      52475.00    .244296   .405615  -.2328375
+      52476.00    .244742   .402725  -.2325613
+      52477.00    .245495   .399749  -.2320551
+      52478.00    .246117   .396855  -.2314115
+      52479.00    .246666   .394095  -.2307041
+      52480.00    .246900   .391189  -.2299998
+      52481.00    .246744   .387877  -.2294179
+      52482.00    .246820   .384346  -.2289761
+      52483.00    .247096   .380592  -.2286673
+      52484.00    .247619   .376810  -.2284689
+      52485.00    .248459   .373119  -.2283114
+      52486.00    .249767   .369842  -.2281178
+      52487.00    .251195   .366848  -.2278583
+      52488.00    .252209   .364110  -.2275238
+      52489.00    .252951   .361548  -.2271092
+      52490.00    .253921   .358980  -.2265683
+      52491.00    .254925   .356325  -.2259038
+      52492.00    .255633   .353419  -.2251723
+      52493.00    .256726   .350230  -.2244566
+      52494.00    .257858   .347410  -.2238681
+      52495.00    .259013   .344903  -.2235232
+      52496.00    .259881   .342253  -.2234895
+      52497.00    .260387   .339692  -.2237494
+      52498.00    .260493   .336844  -.2242302
+      52499.00    .260687   .333646  -.2248094
+      52500.00    .260828   .330859  -.2253333
+      52501.00    .260774   .328167  -.2257140
+      52502.00    .260540   .325597  -.2258714
+      52503.00    .260229   .322975  -.2257922
+      52504.00    .259728   .320286  -.2255360
+      52505.00    .259106   .317546  -.2251760
+      52506.00    .258503   .314720  -.2247865
+      52507.00    .257794   .311720  -.2244519
+      52508.00    .257201   .308634  -.2242797
+      52509.00    .256792   .305386  -.2242788
+      52510.00    .256222   .302075  -.2243658
+      52511.00    .255523   .298675  -.2245688
+      52512.00    .254858   .295170  -.2248545
+      52513.00    .254463   .291714  -.2251742
+      52514.00    .254529   .288453  -.2254807
+      52515.00    .254519   .285396  -.2257157
+      52516.00    .254091   .282309  -.2258262
+      52517.00    .253545   .279192  -.2258030
+      52518.00    .252756   .276056  -.2256657
+      52519.00    .251578   .272855  -.2254402
+      52520.00    .250129   .269689  -.2251797
+      52521.00    .248953   .266676  -.2249860
+      52522.00    .248303   .263660  -.2249649
+      52523.00    .247358   .260693  -.2251708
+      52524.00    .246202   .258028  -.2257018
+      52525.00    .244623   .255658  -.2265511
+      52526.00    .242763   .253201  -.2275770
+      52527.00    .241036   .250576  -.2285921
+      52528.00    .239272   .248027  -.2294206
+      52529.00    .237442   .245443  -.2299704
+      52530.00    .235727   .242781  -.2303005
+      52531.00    .234195   .239697  -.2304384
+      52532.00    .232872   .236809  -.2304447
+      52533.00    .231666   .234534  -.2304053
+      52534.00    .230134   .232605  -.2303821
+      52535.00    .227992   .230846  -.2304091
+      52536.00    .225292   .229151  -.2305297
+      52537.00    .222316   .227178  -.2307597
+      52538.00    .219435   .224964  -.2310915
+      52539.00    .216745   .222702  -.2315018
+      52540.00    .214368   .220362  -.2319528
+      52541.00    .212100   .217747  -.2323967
+      52542.00    .210452   .215446  -.2327672
+      52543.00    .208767   .213100  -.2330159
+      52544.00    .206775   .210842  -.2331152
+      52545.00    .204745   .208471  -.2331567
+      52546.00    .202677   .205888  -.2330781
+      52547.00    .200592   .203187  -.2329247
+      52548.00    .198430   .200445  -.2327953
+      52549.00    .196564   .198099  -.2328142
+      52550.00    .194659   .195695  -.2330134
+      52551.00    .192452   .193467  -.2334663
+      52552.00    .189854   .191374  -.2342676
+      52553.00    .187313   .189304  -.2353188
+      52554.00    .184951   .187197  -.2364692
+      52555.00    .182522   .185011  -.2375451
+      52556.00    .180036   .182676  -.2384155
+      52557.00    .177936   .180677  -.2390205
+      52558.00    .175524   .178743  -.2393753
+      52559.00    .173126   .176892  -.2395524
+      52560.00    .170913   .175068  -.2396689
+      52561.00    .168481   .173411  -.2398339
+      52562.00    .165852   .171533  -.2401034
+      52563.00    .163384   .170132  -.2404951
+      52564.00    .161183   .168869  -.2410285
+      52565.00    .158396   .167813  -.2417084
+      52566.00    .154524   .166697  -.2424420
+      52567.00    .150245   .165404  -.2432013
+      52568.00    .146611   .163868  -.2439578
+      52569.00    .143148   .162588  -.2446889
+      52570.00    .139888   .161306  -.2453597
+      52571.00    .136555   .160043  -.2459212
+      52572.00    .132959   .158365  -.2463482
+      52573.00    .129479   .156684  -.2466410
+      52574.00    .125826   .155193  -.2468584
+      52575.00    .122277   .154017  -.2470415
+      52576.00    .118729   .152877  -.2472156
+      52577.00    .115378   .152147  -.2475286
+      52578.00    .111554   .151452  -.2480936
+      52579.00    .107456   .150724  -.2489322
+      52580.00    .103551   .149991  -.2500339
+      52581.00    .099863   .149384  -.2512752
+      52582.00    .096363   .148926  -.2525032
+      52583.00    .092454   .148083  -.2535988
+      52584.00    .088989   .147567  -.2544123
+      52585.00    .084733   .146842  -.2549895
+      52586.00    .080605   .146169  -.2553384
+      52587.00    .076653   .145400  -.2555385
+      52588.00    .072792   .144872  -.2556375
+      52589.00    .069204   .144512  -.2557455
+      52590.00    .065865   .144240  -.2559352
+      52591.00    .062931   .143850  -.2562653
+      52592.00    .059962   .143707  -.2567568
+      52593.00    .056305   .143674  -.2573501
+      52594.00    .052983   .143654  -.2579905
+      52595.00    .049731   .143605  -.2586403
+      52596.00    .046266   .143164  -.2592524
+      52597.00    .042668   .142504  -.2597790
+      52598.00    .039023   .142080  -.2601516
+      52599.00    .035643   .141645  -.2603927
+      52600.00    .032382   .141439  -.2605844
+      52601.00    .029455   .141705  -.2607451
+      52602.00    .026278   .141919  -.2609050
+      52603.00    .023146   .142072  -.2611561
+      52604.00    .020419   .142111  -.2615777
+      52605.00    .017702   .141972  -.2622236
+      52606.00    .014598   .141668  -.2631419
+      52607.00    .011103   .141506  -.2642958
+      52608.00    .007579   .141384  -.2656414
+      52609.00    .004190   .141181  -.2670650
+      52610.00    .000976   .141175  -.2684199
+      52611.00   -.002188   .141366  -.2695781
+      52612.00   -.005190   .142182  -.2704599
+      52613.00   -.008410   .143068  -.2710687
+      52614.00   -.012360   .144207  -.2714357
+      52615.00   -.016720   .145538  -.2717517
+      52616.00   -.020888   .146709  -.2721330
+      52617.00   -.024269   .147737  -.2726535
+      52618.00   -.027099   .149028  -.2733480
+      52619.00   -.030097   .150624  -.2742030
+      52620.00   -.032910   .152253  -.2751980
+      52621.00   -.036521   .153643  -.2762097
+      52622.00   -.040135   .154901  -.2772696
+      52623.00   -.044170   .155905  -.2782719
+      52624.00   -.048085   .156669  -.2791553
+      52625.00   -.051623   .157274  -.2798786
+      52626.00   -.054557   .158497  -.2804448
+      52627.00   -.056950   .159883  -.2808192
+      52628.00   -.059147   .161774  -.2810419
+      52629.00   -.061584   .164084  -.2812224
+      52630.00   -.064259   .166441  -.2813994
+      52631.00   -.066758   .168646  -.2816508
+      52632.00   -.069104   .170874  -.2820935
+      52633.00   -.071648   .173153  -.2828125
+      52634.00   -.074203   .175133  -.2837772
+      52635.00   -.076492   .176860  -.2849084
+      52636.00   -.078749   .178859  -.2860947
+      52637.00   -.081140   .181116  -.2872199
+      52638.00   -.083425   .183254  -.2881773
+      52639.00   -.085587   .185612  -.2889136
+      52640.00   -.088506   .187936  -.2894400
+      52641.00   -.091525   .190250  -.2897971
+      52642.00   -.094535   .192681  -.2901029
+      52643.00   -.097547   .195185  -.2904422
+      52644.00   -.100674   .197402  -.2908236
+      52645.00   -.103497   .199315  -.2913364
+      52646.00   -.105918   .201164  -.2920312
+      52647.00   -.108609   .203326  -.2928525
+      52648.00   -.111066   .205508  -.2937266
+      52649.00   -.113231   .207881  -.2946374
+      52650.00   -.115263   .210338  -.2955678
+      52651.00   -.117288   .212631  -.2964717
+      52652.00   -.118995   .214760  -.2972660
+      52653.00   -.120321   .216851  -.2979152
+      52654.00   -.121679   .219146  -.2984219
+      52655.00   -.122808   .221634  -.2987735
+      52656.00   -.124297   .224033  -.2990067
+      52657.00   -.126047   .226509  -.2992149
+      52658.00   -.127673   .228811  -.2994968
+      52659.00   -.128873   .231030  -.2999075
+      52660.00   -.129940   .233478  -.3004639
+      52661.00   -.131006   .236356  -.3011699
+      52662.00   -.132220   .239582  -.3019920
+      52663.00   -.133567   .242395  -.3028736
+      52664.00   -.135144   .244806  -.3037659
+      52665.00   -.136792   .247042  -.3045278
+      52666.00   -.138126   .249381  -.3050546
+      52667.00   -.138992   .252107  -.3053340
+      52668.00   -.139269   .255088  -.3054123
+      52669.00   -.139478   .258219  -.3054011
+      52670.00   -.139794   .261292  -.3053653
+      52671.00   -.141155   .264059  -.3053500
+      52672.00   -.142642   .266788  -.3054336
+      52673.00   -.144127   .269650  -.3056955
+      52674.00   -.145231   .272399  -.3061850
+      52675.00   -.146060   .275320  -.3068810
+      52676.00   -.147316   .277939  -.3076581
+      52677.00   -.148426   .280393  -.3084369
+      52678.00   -.149667   .283189  -.3091443
+      52679.00   -.151304   .285945  -.3097464
+      52680.00   -.152949   .288612  -.3102376
+      52681.00   -.154297   .291302  -.3106009
+      52682.00   -.155365   .294094  -.3108547
+      52683.00   -.155875   .296851  -.3110916
+      52684.00   -.156091   .299473  -.3113852
+      52685.00   -.156343   .302128  -.3117429
+      52686.00   -.156302   .304583  -.3121947
+      52687.00   -.155862   .307063  -.3128650
+      52688.00   -.155323   .310072  -.3137985
+      52689.00   -.154911   .313488  -.3149478
+      52690.00   -.154784   .317584  -.3161986
+      52691.00   -.155311   .321366  -.3174385
+      52692.00   -.155475   .324475  -.3185303
+      52693.00   -.155454   .327396  -.3193753
+      52694.00   -.155123   .330443  -.3199700
+      52695.00   -.154614   .333493  -.3203602
+      52696.00   -.154637   .336386  -.3206182
+      52697.00   -.154656   .339306  -.3208399
+      52698.00   -.154375   .342141  -.3210741
+      52699.00   -.153841   .344649  -.3213467
+      52700.00   -.153198   .347240  -.3217410
+      52701.00   -.152880   .350202  -.3222894
+      52702.00   -.153092   .353080  -.3229464
+      52703.00   -.153422   .355842  -.3236106
+      52704.00   -.153763   .358316  -.3242961
+      52705.00   -.154354   .360787  -.3250005
+      52706.00   -.154534   .363477  -.3256463
+      52707.00   -.154768   .366339  -.3262172
+      52708.00   -.154911   .369337  -.3267117
+      52709.00   -.155587   .372368  -.3271255
+      52710.00   -.156437   .375474  -.3274535
+      52711.00   -.157026   .378713  -.3277792
+      52712.00   -.157691   .381330  -.3281342
+      52713.00   -.157076   .384012  -.3286353
+      52714.00   -.156943   .386870  -.3293660
+      52715.00   -.156743   .389761  -.3303950
+      52716.00   -.155936   .392624  -.3317189
+      52717.00   -.154945   .395674  -.3332271
+      52718.00   -.153875   .399566  -.3347675
+      52719.00   -.153268   .403517  -.3361673
+      52720.00   -.152322   .406664  -.3373037
+      52721.00   -.151525   .409589  -.3381325
+      52722.00   -.150576   .412494  -.3386755
+      52723.00   -.148982   .415439  -.3390145
+      52724.00   -.147578   .418309  -.3392556
+      52725.00   -.145779   .421212  -.3395425
+      52726.00   -.143452   .424036  -.3399480
+      52727.00   -.140613   .426885  -.3404906
+      52728.00   -.137880   .429885  -.3411865
+      52729.00   -.135448   .432832  -.3420147
+      52730.00   -.133253   .435574  -.3429313
+      52731.00   -.131337   .438596  -.3438876
+      52732.00   -.129096   .441736  -.3448712
+      52733.00   -.127130   .444678  -.3458013
+      52734.00   -.124629   .447542  -.3466152
+      52735.00   -.122177   .450759  -.3473352
+      52736.00   -.119826   .454061  -.3479283
+      52737.00   -.117581   .456994  -.3483759
+      52738.00   -.116238   .459671  -.3487087
+      52739.00   -.114690   .462343  -.3490285
+      52740.00   -.113539   .464834  -.3494229
+      52741.00   -.111408   .467511  -.3499690
+      52742.00   -.109399   .470304  -.3507694
+      52743.00   -.107268   .472883  -.3518708
+      52744.00   -.105224   .475253  -.3532336
+      52745.00   -.103976   .477415  -.3547178
+      52746.00   -.102241   .479238  -.3561391
+      52747.00   -.100347   .481207  -.3573084
+      52748.00   -.098110   .483411  -.3581655
+      52749.00   -.095579   .485678  -.3586492
+      52750.00   -.093129   .487711  -.3588349
+      52751.00   -.090755   .489518  -.3588929
+      52752.00   -.088601   .491625  -.3589248
+      52753.00   -.086073   .493677  -.3590416
+      52754.00   -.082835   .495853  -.3593016
+      52755.00   -.080055   .497996  -.3596948
+      52756.00   -.077683   .500185  -.3602410
+      52757.00   -.075264   .502396  -.3609113
+      52758.00   -.072945   .504336  -.3616574
+      52759.00   -.070452   .506168  -.3624152
+      52760.00   -.066884   .508018  -.3631068
+      52761.00   -.063134   .509849  -.3636406
+      52762.00   -.059460   .511574  -.3639858
+      52763.00   -.056188   .513428  -.3641403
+      52764.00   -.053251   .515445  -.3641271
+      52765.00   -.050102   .517481  -.3640312
+      52766.00   -.047177   .519684  -.3639292
+      52767.00   -.044759   .521707  -.3638449
+      52768.00   -.042316   .523206  -.3639183
+      52769.00   -.039744   .525015  -.3642129
+      52770.00   -.037767   .526629  -.3647435
+      52771.00   -.036128   .527945  -.3655317
+      52772.00   -.034478   .529264  -.3665666
+      52773.00   -.032655   .530583  -.3677702
+      52774.00   -.030523   .531887  -.3689547
+      52775.00   -.028293   .533225  -.3699223
+      52776.00   -.025981   .534353  -.3705531
+      52777.00   -.023693   .535468  -.3709000
+      52778.00   -.021358   .536500  -.3710701
+      52779.00   -.018620   .537522  -.3712217
+      52780.00   -.015410   .538602  -.3714380
+      52781.00   -.012603   .539688  -.3717551
+      52782.00   -.009866   .540575  -.3722105
+      52783.00   -.007004   .540972  -.3727809
+      52784.00   -.004106   .541211  -.3734260
+      52785.00   -.001056   .541528  -.3740728
+      52786.00    .002298   .541977  -.3746654
+      52787.00    .005837   .542598  -.3751705
+      52788.00    .009260   .543591  -.3755531
+      52789.00    .012429   .544507  -.3757844
+      52790.00    .015576   .545546  -.3758359
+      52791.00    .018416   .546437  -.3756855
+      52792.00    .021231   .547100  -.3753793
+      52793.00    .024311   .547652  -.3749825
+      52794.00    .027719   .547855  -.3745271
+      52795.00    .031430   .547882  -.3740730
+      52796.00    .034917   .547818  -.3737576
+      52797.00    .038130   .547817  -.3736737
+      52798.00    .041333   .547855  -.3738447
+      52799.00    .044736   .547922  -.3742503
+      52800.00    .048281   .548027  -.3747833
+      52801.00    .051673   .548061  -.3752832
+      52802.00    .055139   .547756  -.3756082
+      52803.00    .058556   .547201  -.3756412
+      52804.00    .062094   .546689  -.3753452
+      52805.00    .065802   .546171  -.3747957
+      52806.00    .069733   .545588  -.3741172
+      52807.00    .074052   .545079  -.3734464
+      52808.00    .078547   .544862  -.3728845
+      52809.00    .082892   .544756  -.3724844
+      52810.00    .087700   .544532  -.3722530
+      52811.00    .091956   .544384  -.3721348
+      52812.00    .095888   .544085  -.3720627
+      52813.00    .099772   .543616  -.3719772
+      52814.00    .103554   .542996  -.3718238
+      52815.00    .107221   .542491  -.3715540
+      52816.00    .110928   .542076  -.3711389
+      52817.00    .114722   .541683  -.3705786
+      52818.00    .118619   .541064  -.3698746
+      52819.00    .122623   .540447  -.3690496
+      52820.00    .126689   .539883  -.3681479
+      52821.00    .130468   .539313  -.3672420
+      52822.00    .133821   .538582  -.3664106
+      52823.00    .136813   .537563  -.3657010
+      52824.00    .139880   .535923  -.3651475
+      52825.00    .143073   .534157  -.3647861
+      52826.00    .146403   .532623  -.3645739
+      52827.00    .149616   .531187  -.3644331
+      52828.00    .153014   .529717  -.3642754
+      52829.00    .156652   .528214  -.3640177
+      52830.00    .160400   .526692  -.3635461
+      52831.00    .163893   .525208  -.3628283
+      52832.00    .167447   .523922  -.3619299
+      52833.00    .170540   .522624  -.3609656
+      52834.00    .173119   .521200  -.3600377
+      52835.00    .175615   .519726  -.3592355
+      52836.00    .178216   .518207  -.3586320
+      52837.00    .180961   .516617  -.3582506
+      52838.00    .183442   .514713  -.3580347
+      52839.00    .186304   .512678  -.3579064
+      52840.00    .189291   .510645  -.3577985
+      52841.00    .191970   .508531  -.3576469
+      52842.00    .194308   .506211  -.3574124
+      52843.00    .197124   .503868  -.3570731
+      52844.00    .199921   .501622  -.3566195
+      52845.00    .202476   .499419  -.3560571
+      52846.00    .204685   .497220  -.3554030
+      52847.00    .206809   .494817  -.3547428
+      52848.00    .208980   .492100  -.3541361
+      52849.00    .211303   .489142  -.3536200
+      52850.00    .213815   .486413  -.3532271
+      52851.00    .216500   .483887  -.3530459
+      52852.00    .219112   .481538  -.3531033
+      52853.00    .221386   .479513  -.3533306
+      52854.00    .223071   .477318  -.3536689
+      52855.00    .224748   .474861  -.3540496
+      52856.00    .226443   .472367  -.3543334
+      52857.00    .228150   .469614  -.3543726
+      52858.00    .230141   .466612  -.3541745
+      52859.00    .232124   .463704  -.3537567
+      52860.00    .234060   .461100  -.3531909
+      52861.00    .235882   .458865  -.3526009
+      52862.00    .237707   .456702  -.3521001
+      52863.00    .239487   .454309  -.3517812
+      52864.00    .241314   .452088  -.3516894
+      52865.00    .243093   .449784  -.3517784
+      52866.00    .244570   .447324  -.3520012
+      52867.00    .246011   .444752  -.3523064
+      52868.00    .247532   .441804  -.3526161
+      52869.00    .249124   .438677  -.3528512
+      52870.00    .250680   .435417  -.3529173
+      52871.00    .252254   .432462  -.3527417
+      52872.00    .253774   .429753  -.3523732
+      52873.00    .254928   .427262  -.3518548
+      52874.00    .255947   .424872  -.3512339
+      52875.00    .256958   .422061  -.3505935
+      52876.00    .258249   .418880  -.3499998
+      52877.00    .259210   .415542  -.3495442
+      52878.00    .260146   .412296  -.3493055
+      52879.00    .261170   .409038  -.3494278
+      52880.00    .262134   .406067  -.3498745
+      52881.00    .263337   .403308  -.3505380
+      52882.00    .264430   .400496  -.3512890
+      52883.00    .265244   .397526  -.3519601
+      52884.00    .265514   .394414  -.3524292
+      52885.00    .265529   .391195  -.3526473
+      52886.00    .265386   .387938  -.3525985
+      52887.00    .265113   .384441  -.3523713
+      52888.00    .265182   .380910  -.3520822
+      52889.00    .265053   .377505  -.3517877
+      52890.00    .264911   .374278  -.3515887
+      52891.00    .264699   .371156  -.3515693
+      52892.00    .264511   .367894  -.3517499
+      52893.00    .264605   .364586  -.3520732
+      52894.00    .264519   .361280  -.3524733
+      52895.00    .264233   .357987  -.3528459
+      52896.00    .264223   .354809  -.3531448
+      52897.00    .264230   .351772  -.3533557
+      52898.00    .264141   .348778  -.3534664
+      52899.00    .264034   .345932  -.3534705
+      52900.00    .264003   .342995  -.3533594
+      52901.00    .263699   .339808  -.3531016
+      52902.00    .263057   .336422  -.3528096
+      52903.00    .262536   .332948  -.3525464
+      52904.00    .262588   .329728  -.3524015
+      52905.00    .262483   .326855  -.3524815
+      52906.00    .261881   .324088  -.3528272
+      52907.00    .260919   .320822  -.3534321
+      52908.00    .260058   .317272  -.3542544
+      52909.00    .259522   .314021  -.3551846
+      52910.00    .259354   .311099  -.3560733
+      52911.00    .259186   .308482  -.3567895
+      52912.00    .259199   .306212  -.3572758
+      52913.00    .258446   .304036  -.3575077
+      52914.00    .257373   .301433  -.3575563
+      52915.00    .256284   .298629  -.3575382
+      52916.00    .254925   .296135  -.3575692
+      52917.00    .253564   .293452  -.3577244
+      52918.00    .252217   .290461  -.3580632
+      52919.00    .250916   .287405  -.3586134
+      52920.00    .249548   .284675  -.3593205
+      52921.00    .248049   .282079  -.3600671
+      52922.00    .246399   .279260  -.3607698
+      52923.00    .244458   .276479  -.3614181
+      52924.00    .242041   .273677  -.3619580
+      52925.00    .239770   .270720  -.3623574
+      52926.00    .237782   .267465  -.3626070
+      52927.00    .235760   .264252  -.3627098
+      52928.00    .233828   .261079  -.3626966
+      52929.00    .231726   .257910  -.3626117
+      52930.00    .229788   .255053  -.3625381
+      52931.00    .227911   .252528  -.3625861
+      52932.00    .225989   .250050  -.3628492
+      52933.00    .224050   .247358  -.3633940
+      52934.00    .221858   .244719  -.3642305
+      52935.00    .220267   .242197  -.3653286
+      52936.00    .219367   .239953  -.3666147
+      52937.00    .218599   .237824  -.3679262
+      52938.00    .218068   .235794  -.3690870
+      52939.00    .217046   .233766  -.3699470
+      52940.00    .215529   .231563  -.3704375
+      52941.00    .213730   .229233  -.3705941
+      52942.00    .212408   .226978  -.3705533
+      52943.00    .210965   .225003  -.3704455
+      52944.00    .209202   .223344  -.3703748
+      52945.00    .207198   .221632  -.3704382
+      52946.00    .205026   .219556  -.3706830
+      52947.00    .202693   .217022  -.3711065
+      52948.00    .200301   .214160  -.3716507
+      52949.00    .198096   .211227  -.3722245
+      52950.00    .196256   .208248  -.3727506
+      52951.00    .194561   .205709  -.3731858
+      52952.00    .192665   .203467  -.3735243
+      52953.00    .190182   .201124  -.3737455
+      52954.00    .187191   .198488  -.3738187
+      52955.00    .184483   .196120  -.3737645
+      52956.00    .182109   .193783  -.3737076
+      52957.00    .179892   .191375  -.3737002
+      52958.00    .177373   .189100  -.3737560
+      52959.00    .175135   .187125  -.3739256
+      52960.00    .172811   .185478  -.3742828
+      52961.00    .170301   .183783  -.3748732
+      52962.00    .167255   .181967  -.3756701
+      52963.00    .164407   .180384  -.3766149
+      52964.00    .161871   .179057  -.3776704
+      52965.00    .159315   .178382  -.3787681
+      52966.00    .156598   .177794  -.3797096
+      52967.00    .153411   .176861  -.3803632
+      52968.00    .149829   .175601  -.3807043
+      52969.00    .145159   .174197  -.3807785
+      52970.00    .141261   .172966  -.3807255
+      52971.00    .137856   .171859  -.3806939
+      52972.00    .134327   .170606  -.3807906
+      52973.00    .130325   .169150  -.3810472
+      52974.00    .126424   .167828  -.3814438
+      52975.00    .123273   .166663  -.3819391
+      52976.00    .120088   .165470  -.3824681
+      52977.00    .116990   .164469  -.3829558
+      52978.00    .113970   .163757  -.3833545
+      52979.00    .111335   .163476  -.3836462
+      52980.00    .108466   .163098  -.3838085
+      52981.00    .105420   .162535  -.3837934
+      52982.00    .102491   .162009  -.3835759
+      52983.00    .099884   .161513  -.3832108
+      52984.00    .096736   .160989  -.3828200
+      52985.00    .093238   .160263  -.3824450
+      52986.00    .089737   .159501  -.3821565
+      52987.00    .086417   .158868  -.3819878
+      52988.00    .083454   .158563  -.3820082
+      52989.00    .080534   .158331  -.3822631
+      52990.00    .077537   .158131  -.3827676
+      52991.00    .074455   .157692  -.3834652
+      52992.00    .071386   .157191  -.3842398
+      52993.00    .068869   .156874  -.3850195
+      52994.00    .066299   .156453  -.3856933
+      52995.00    .063459   .155926  -.3861387
+      52996.00    .060462   .155491  -.3863147
+      52997.00    .056600   .155110  -.3863313
+      52998.00    .052596   .154775  -.3863873
+      52999.00    .048916   .154525  -.3865594
+      53000.00    .045817   .154540  -.3868836
+      53001.00    .042882   .154743  -.3873512
+      53002.00    .039839   .154760  -.3879174
+      53003.00    .037049   .154451  -.3885246
+      53004.00    .034038   .154141  -.3891136
+      53005.00    .031243   .153836  -.3896476
+      53006.00    .028845   .153671  -.3901039
+      53007.00    .026638   .153848  -.3904342
+      53008.00    .024195   .154295  -.3905978
+      53009.00    .021490   .154845  -.3906122
+      53010.00    .018789   .155467  -.3905340
+      53011.00    .015861   .156209  -.3904593
+      53012.00    .012902   .156907  -.3904692
+      53013.00    .010072   .157332  -.3906221
+      53014.00    .007588   .157654  -.3909924
+      53015.00    .005350   .157928  -.3916090
+      53016.00    .003047   .158344  -.3924797
+      53017.00    .001080   .159023  -.3935837
+      53018.00   -.001154   .160078  -.3948469
+      53019.00   -.003301   .161382  -.3961148
+      53020.00   -.005375   .162622  -.3972758
+      53021.00   -.007599   .163770  -.3982441
+      53022.00   -.010223   .165081  -.3989457
+      53023.00   -.013233   .166330  -.3993949
+      53024.00   -.016197   .167243  -.3996602
+      53025.00   -.018658   .168258  -.3998530
+      53026.00   -.021139   .169988  -.4000827
+      53027.00   -.024162   .171751  -.4004467
+      53028.00   -.026309   .173183  -.4009745
+      53029.00   -.027928   .174510  -.4016567
+      53030.00   -.029159   .175921  -.4024644
+      53031.00   -.030234   .177464  -.4033160
+      53032.00   -.031666   .179219  -.4040869
+      53033.00   -.033515   .181091  -.4046819
+      53034.00   -.036001   .182952  -.4050549
+      53035.00   -.038965   .184614  -.4051878
+      53036.00   -.042056   .185945  -.4051408
+      53037.00   -.045030   .187071  -.4049664
+      53038.00   -.047780   .188139  -.4047150
+      53039.00   -.051232   .189043  -.4044364
+      53040.00   -.054195   .189858  -.4042062
+      53041.00   -.056738   .190689  -.4041262
+      53042.00   -.058821   .192020  -.4042553
+      53043.00   -.060682   .193628  -.4046569
+      53044.00   -.062590   .195344  -.4053066
+      53045.00   -.064870   .197068  -.4061326
+      53046.00   -.067746   .199078  -.4070517
+      53047.00   -.070770   .200926  -.4079707
+      53048.00   -.073863   .202589  -.4087685
+      53049.00   -.076809   .204460  -.4093573
+      53050.00   -.079498   .206272  -.4097155
+      53051.00   -.081563   .208061  -.4098881
+      53052.00   -.082858   .210006  -.4099668
+      53053.00   -.084378   .212353  -.4100719
+      53054.00   -.086640   .214811  -.4103323
+      53055.00   -.090048   .217043  -.4108259
+      53056.00   -.093073   .219531  -.4115704
+      53057.00   -.095702   .222041  -.4125003
+      53058.00   -.097955   .224286  -.4135463
+      53059.00   -.099789   .226364  -.4146110
+      53060.00   -.101338   .228642  -.4155850
+      53061.00   -.102537   .231016  -.4163810
+      53062.00   -.104291   .233424  -.4169806
+      53063.00   -.105954   .235830  -.4173787
+      53064.00   -.108397   .237913  -.4175324
+      53065.00   -.110491   .239912  -.4174875
+      53066.00   -.112159   .242099  -.4173486
+      53067.00   -.114042   .244217  -.4172252
+      53068.00   -.115336   .246373  -.4171986
+      53069.00   -.117603   .248810  -.4173536
+      53070.00   -.118999   .251503  -.4177371
+      53071.00   -.120336   .254069  -.4183644
+      53072.00   -.121594   .256227  -.4191954
+      53073.00   -.122122   .258077  -.4201289
+      53074.00   -.123028   .260069  -.4210231
+      53075.00   -.123778   .262111  -.4217423
+      53076.00   -.124453   .264041  -.4222139
+      53077.00   -.125195   .266227  -.4224543
+      53078.00   -.126023   .268480  -.4225155
+      53079.00   -.126916   .270668  -.4224794
+      53080.00   -.128139   .272811  -.4224683
+      53081.00   -.129178   .274874  -.4225790
+      53082.00   -.130049   .277122  -.4229104
+      53083.00   -.131304   .279565  -.4235105
+      53084.00   -.131697   .281978  -.4243780
+      53085.00   -.131870   .284727  -.4254451
+      53086.00   -.131969   .287888  -.4265916
+      53087.00   -.131752   .291271  -.4277318
+      53088.00   -.132110   .294885  -.4288185
+      53089.00   -.132884   .298383  -.4297922
+      53090.00   -.134150   .301745  -.4306106
+      53091.00   -.135581   .305184  -.4312531
+      53092.00   -.136937   .308389  -.4317347
+      53093.00   -.137966   .311513  -.4321212
+      53094.00   -.138634   .314635  -.4325099
+      53095.00   -.139515   .317748  -.4329864
+      53096.00   -.140248   .320643  -.4336295
+      53097.00   -.140804   .323365  -.4344855
+      53098.00   -.140861   .326042  -.4355652
+      53099.00   -.141000   .328657  -.4368965
+      53100.00   -.141192   .331008  -.4384084
+      53101.00   -.140714   .333326  -.4399626
+      53102.00   -.140149   .336180  -.4414172
+      53103.00   -.139967   .339273  -.4426289
+      53104.00   -.139743   .342518  -.4435322
+      53105.00   -.139228   .345818  -.4441832
+      53106.00   -.138787   .349170  -.4446215
+      53107.00   -.138905   .352330  -.4449578
+      53108.00   -.139082   .355170  -.4453570
+      53109.00   -.139115   .357994  -.4459439
+      53110.00   -.138580   .360790  -.4467417
+      53111.00   -.137662   .363695  -.4476964
+      53112.00   -.135955   .367039  -.4487422
+      53113.00   -.134731   .370453  -.4497902
+      53114.00   -.133524   .373815  -.4507553
+      53115.00   -.132568   .377234  -.4515622
+      53116.00   -.132997   .380324  -.4521541
+      53117.00   -.133111   .382857  -.4525177
+      53118.00   -.132957   .385157  -.4526419
+      53119.00   -.132759   .387283  -.4525565
+      53120.00   -.132086   .389107  -.4523604
+      53121.00   -.130578   .390893  -.4521354
+      53122.00   -.128362   .392863  -.4519818
+      53123.00   -.126734   .395216  -.4519886
+      53124.00   -.125093   .398005  -.4522144
+      53125.00   -.123717   .401060  -.4526883
+      53126.00   -.121531   .404238  -.4534459
+      53127.00   -.119766   .407433  -.4544442
+      53128.00   -.118495   .410523  -.4555747
+      53129.00   -.117063   .413497  -.4567189
+      53130.00   -.115916   .416444  -.4577677
+      53131.00   -.115002   .419218  -.4586251
+      53132.00   -.113991   .421556  -.4592559
+      53133.00   -.112547   .423888  -.4596849
+      53134.00   -.111160   .426264  -.4600193
+      53135.00   -.109687   .428824  -.4603924
+      53136.00   -.107952   .431626  -.4608927
+      53137.00   -.106062   .434487  -.4615510
+      53138.00   -.103997   .437286  -.4623751
+      53139.00   -.102431   .440008  -.4633384
+      53140.00   -.101285   .442347  -.4643778
+      53141.00   -.100663   .444171  -.4654145
+      53142.00   -.100222   .445634  -.4663622
+      53143.00   -.099643   .446834  -.4671623
+      53144.00   -.098872   .448195  -.4677718
+      53145.00   -.097892   .449518  -.4681787
+      53146.00   -.096351   .451032  -.4683770
+      53147.00   -.095216   .452371  -.4684214
+      53148.00   -.094283   .453634  -.4683734
+      53149.00   -.093244   .455065  -.4683010
+      53150.00   -.091746   .456635  -.4682783
+      53151.00   -.090929   .458356  -.4683310
+      53152.00   -.090161   .459926  -.4685068
+      53153.00   -.089505   .461504  -.4688631
+      53154.00   -.088327   .463072  -.4693344
+      53155.00   -.087159   .464429  -.4698815
+      53156.00   -.085652   .465710  -.4704374
+      53157.00   -.083861   .467217  -.4708996
+      53158.00   -.081805   .468919  -.4711655
+      53159.00   -.079966   .470697  -.4711933
+      53160.00   -.077622   .472199  -.4710285
+      53161.00   -.075844   .473768  -.4707260
+      53162.00   -.074538   .475431  -.4704486
+      53163.00   -.073384   .476953  -.4703249
+      53164.00   -.071790   .478291  -.4703857
+      53165.00   -.070023   .479927  -.4706120
+      53166.00   -.068415   .481560  -.4709900
+      53167.00   -.066916   .483053  -.4714385
+      53168.00   -.064946   .484490  -.4719083
+      53169.00   -.062809   .485929  -.4723215
+      53170.00   -.060448   .487271  -.4725890
+      53171.00   -.057872   .488518  -.4726355
+      53172.00   -.054925   .489957  -.4724252
+      53173.00   -.051591   .491565  -.4720151
+      53174.00   -.048338   .493356  -.4714770
+      53175.00   -.045151   .495324  -.4708767
+      53176.00   -.041917   .497013  -.4702972
+      53177.00   -.038587   .498380  -.4697795
+      53178.00   -.035038   .499642  -.4693810
+      53179.00   -.031932   .500942  -.4691325
+      53180.00   -.028534   .502083  -.4690415
+      53181.00   -.025193   .503189  -.4691332
+      53182.00   -.022008   .504710  -.4693442
+      53183.00   -.019193   .506084  -.4695550
+      53184.00   -.016272   .507094  -.4696938
+      53185.00   -.013092   .507954  -.4696846
+      53186.00   -.010372   .509048  -.4694788
+      53187.00   -.007575   .510126  -.4690288
+      53188.00   -.004600   .510900  -.4683871
+      53189.00   -.001920   .511647  -.4676191
+      53190.00    .000401   .512396  -.4669017
+      53191.00    .002673   .513106  -.4663809
+      53192.00    .005049   .513764  -.4660892
+      53193.00    .007454   .514361  -.4659612
+      53194.00    .009556   .514766  -.4658828
+      53195.00    .012039   .515216  -.4657611
+      53196.00    .015246   .516120  -.4655330
+      53197.00    .018248   .517022  -.4651594
+      53198.00    .021364   .517837  -.4646179
+      53199.00    .024113   .518714  -.4638838
+      53200.00    .026250   .519365  -.4629601
+      53201.00    .028217   .519926  -.4619325
+      53202.00    .030203   .520327  -.4608838
+      53203.00    .032705   .520670  -.4598706
+      53204.00    .035672   .520840  -.4589705
+      53205.00    .038660   .520771  -.4582343
+      53206.00    .041511   .520529  -.4576796
+      53207.00    .043961   .520203  -.4573299
+      53208.00    .046939   .519847  -.4571998
+      53209.00    .049952   .519564  -.4572198
+      53210.00    .053021   .519248  -.4573009
+      53211.00    .056051   .519070  -.4573547
+      53212.00    .059028   .519102  -.4572835
+      53213.00    .061412   .519119  -.4570009
+      53214.00    .063962   .518775  -.4564814
+      53215.00    .066369   .518305  -.4557825
+      53216.00    .068319   .517607  -.4550403
+      53217.00    .070361   .516935  -.4543862
+      53218.00    .072781   .516275  -.4539457
+      53219.00    .075510   .515710  -.4538001
+      53220.00    .078334   .515337  -.4539125
+      53221.00    .081083   .515209  -.4541573
+      53222.00    .083897   .515109  -.4544068
+      53223.00    .086289   .514972  -.4545710
+      53224.00    .088893   .514756  -.4546235
+      53225.00    .091703   .514261  -.4545264
+      53226.00    .094703   .513748  -.4542593
+      53227.00    .097328   .513284  -.4538279
+      53228.00    .099793   .512913  -.4532509
+      53229.00    .102671   .512912  -.4526176
+      53230.00    .105716   .513243  -.4519727
+      53231.00    .108723   .513578  -.4513936
+      53232.00    .111601   .513710  -.4509461
+      53233.00    .114518   .513525  -.4506962
+      53234.00    .117350   .513055  -.4506875
+      53235.00    .119692   .512403  -.4509139
+      53236.00    .122032   .511787  -.4513301
+      53237.00    .124064   .511184  -.4518682
+      53238.00    .126381   .510397  -.4524049
+      53239.00    .128317   .509289  -.4528121
+      53240.00    .130124   .507871  -.4530115
+      53241.00    .132327   .506361  -.4529954
+      53242.00    .134350   .504927  -.4528134
+      53243.00    .136176   .503711  -.4524934
+      53244.00    .138473   .502455  -.4521208
+      53245.00    .141017   .501217  -.4518467
+      53246.00    .143724   .499942  -.4518233
+      53247.00    .146735   .498642  -.4520879
+      53248.00    .149528   .497266  -.4525797
+      53249.00    .152127   .495657  -.4531729
+      53250.00    .154737   .493902  -.4537242
+      53251.00    .157024   .491950  -.4541177
+      53252.00    .159212   .489734  -.4542779
+      53253.00    .161557   .487316  -.4541614
+      53254.00    .163658   .484857  -.4537921
+      53255.00    .165419   .482637  -.4532001
+      53256.00    .167322   .480727  -.4524551
+      53257.00    .169420   .478990  -.4516544
+      53258.00   0.171467 0.477353   -.4509247
+      53259.00   0.173411 0.475723   -.4503884
+      53260.00   0.175264 0.474087   -.4501214
+      53261.00   0.177037 0.472436   -.4501491
+      53262.00   0.178738 0.470764   -.4504461
+      53263.00   0.180376 0.469070   -0.4509294
+      53264.00   0.181956 0.467351   -0.4514721
+      53265.00   0.183483 0.465607   -0.4519581
+      53266.00   0.184961 0.463838   -0.4523358
+      53267.00   0.186394 0.462044   -0.4525694
+      53268.00   0.187784 0.460226   -0.4526379
+      53269.00   0.189133 0.458385   -0.4525611
+      53270.00   0.190444 0.456520   -0.4524069
+      53271.00   0.191717 0.454633   -0.4522814
+      53272.00   0.192953 0.452724   -0.4523216
+      53273.00   0.194154 0.450794   -0.4526384
+      53274.00   0.195320 0.448843   -0.4532626
+      53275.00   0.196451 0.446873   -0.4541610
+      53276.00   0.197548 0.444882   -0.4552339
+      53277.00   0.198610 0.442876   -0.4563520
+      53278.00   0.199639 0.440847   -0.4573954
+      53279.00   0.200633 0.438801   -0.4582793
+      53280.00   0.201593 0.436738   -0.4589605
+      53281.00   0.202519 0.434658   -0.4594370
+      53282.00   0.203410 0.432562   -0.4597357
+      53283.00   0.204268 0.430450   -0.4599121
+      53284.00   0.205090 0.428324   -0.4600421
+      53285.00   0.205879 0.426182   -0.4602003
+      53286.00   0.206632 0.424026   -0.4604591
+      53287.00   0.207351 0.421857   -0.4608814
+      53288.00   0.208034 0.419674   -0.4615152
+      53289.00   0.208683 0.417479   -0.4623817
+      53290.00   0.209297 0.415272   -0.4634664
+      53291.00   0.209875 0.413054   -0.4647095
+      53292.00   0.210419 0.410825   -0.4660094
+      53293.00   0.210927 0.408585   -0.4672379
+      53294.00   0.211399 0.406335   -0.4682771
+      53295.00   0.211837 0.404076   -0.4690588
+      53296.00   0.212239 0.401809   -0.4695842
+      53297.00   0.212606 0.399533   -0.4699288
+      53298.00   0.212937 0.397249   -0.4702173
+      53299.00   0.213233 0.394959   -0.4705836
+      53300.00   0.213494 0.392661   -0.4711389
+      53301.00   0.213720 0.390358   -0.4719346
+      53302.00   0.213911 0.388050   -0.4729557
+      53303.00   0.214067 0.385736   -0.4741376
+      53304.00   0.214188 0.383419   -0.4753802
+      53305.00   0.214244 0.381097   -0.4765759
+      53306.00   0.214299 0.378772   -0.4776326
+      53307.00   0.214319 0.376445   -0.4784898
+      53308.00   0.214305 0.374115   -0.4791295
+      53309.00   0.214256 0.371785   -0.4795725
+      53310.00   0.214173 0.369453   -0.4798642
+      53311.00   0.214056 0.367120   -0.4800693
+      53312.00   0.213905 0.364788   -0.4802650
+      53313.00   0.213721 0.362456   -0.4805271
+      53314.00   0.213503 0.360126   -0.4809198
+      53315.00   0.213252 0.357798   -0.4814890
+      53316.00   0.212968 0.355472   -0.4822615
+      53317.00   0.212652 0.353148   -0.4832419
+      53318.00   0.212303 0.350829   -0.4844015
+      53319.00   0.211922 0.348513   -0.4856693
+      53320.00   0.211509 0.346202   -0.4869359
+      53321.00   0.211064 0.343895   -0.4880774
+      53322.00   0.210588 0.341595   -0.4889940
+      53323.00   0.210080 0.339300   -0.4896480
+      53324.00   0.209542 0.337013   -0.4900829
+      53325.00   0.208973 0.334732   -0.4904113
+      53326.00   0.208374 0.332459   -0.4907765
+      53327.00   0.207745 0.330195   -0.4913008
+      53328.00   0.207086 0.327939   -0.4920473
+      53329.00   0.206397 0.325692   -0.4930066
+      53330.00   0.205680 0.323456   -0.4941120
+      53331.00   0.204933 0.321229   -0.4952659
+      53332.00   0.204158 0.319013   -0.4963647
+      53333.00   0.203355 0.316809   -0.4973191
+      53334.00   0.202524 0.314617   -0.4980683
+      53335.00   0.201665 0.312436   -0.4985873
+      53336.00   0.200779 0.310269   -0.4988853
+      53337.00   0.199866 0.308115   -0.4990014
+      53338.00   0.198926 0.305974   -0.4989981
+      53339.00   0.197960 0.303848   -0.4989511
+      53340.00   0.196967 0.301736   -0.4989372
+      53341.00   0.195949 0.299639   -0.4990270
+      53342.00   0.194906 0.297558   -0.4992734
+      53343.00   0.193837 0.295494   -0.4997076
+      53344.00   0.192744 0.293445   -0.5003367
+      53345.00   0.191626 0.291413   -0.5011417
+      53346.00   0.190485 0.289399   -0.5020732
+      53347.00   0.189319 0.287403   -0.5030459
+      53348.00   0.188130 0.285424   -0.5039492
+      53349.00   0.186918 0.283464   -0.5046735
+      53350.00   0.185683 0.281523   -0.5051471
+      53351.00   0.184425 0.279602   -0.5053720
+      53352.00   0.183146 0.277700   -0.5054332
+      53353.00   0.181844 0.275819   -0.5054706
+      53354.00   0.180522 0.273958   -0.5056282
+      53355.00   0.179178 0.272118   -0.5059987
+      53356.00   0.177813 0.270299   -0.5065953
+      53357.00   0.176428 0.268502   -0.5073581
+      53358.00   0.175023 0.266726   -0.5081832
+      53359.00   0.173598 0.264974   -0.5089593
+      53360.00   0.172153 0.263243   -0.5095954
+      53361.00   0.170690 0.261536   -0.5100343
+      53362.00   0.169208 0.259852   -0.5102545
+      53363.00   0.167707 0.258192   -0.5103288
+      53364.00   0.166188 0.256555   -0.5102251
+      53365.00   0.164651 0.254943   -0.5099981
+      53366.00   0.163097 0.253355   -0.5097180
+      53367.00   0.161526 0.251792   -0.5094608
+      53368.00   0.159938 0.250255   -0.5092973
+      53369.00   0.158334 0.248742   -0.5092826
+      53370.00   0.156714 0.247255   -0.5094488
+      53371.00   0.155077 0.245794   -0.5098034
+      53372.00   0.153426 0.244359   -0.5103293
+      53373.00   0.151759 0.242950   -0.5109851
+      53374.00   0.150077 0.241568   -0.5117037
+      53375.00   0.148381 0.240213   -0.5123955
+      53376.00   0.146671 0.238885   -0.5129620
+      53377.00   0.144947 0.237584   -0.5133239
+      53378.00   0.143210 0.236310   -0.5134554
+      53379.00   0.141459 0.235064   -0.5134074
+      53380.00   0.139696 0.233845   -0.5133019
+      53381.00   0.137920 0.232655   -0.5132921
+      53382.00   0.136132 0.231492   -0.5135043
+      53383.00   0.134333 0.230358   -0.5139901
+      53384.00   0.132521 0.229252   -0.5147105
+      53385.00   0.130699 0.228175   -0.5155576
+      53386.00   0.128866 0.227126   -0.5163974
+      53387.00   0.127022 0.226107   -0.5171127
+      53388.00   0.125168 0.225116   -0.5176277
+      53389.00   0.123305 0.224154   -0.5179132
+      53390.00   0.121431 0.223221   -0.5179776
+      53391.00   0.119549 0.222318   -0.5178570
+      53392.00   0.117658 0.221444   -0.5176063
+      53393.00   0.115758 0.220599   -0.5172938
+      53394.00   0.113850 0.219783   -0.5169945
+      53395.00   0.111934 0.218998   -0.5167813
+      53396.00   0.110011 0.218241   -0.5167145
+      53397.00   0.108080 0.217515   -0.5168331
+      53398.00   0.106142 0.216818   -0.5171485
+      53399.00   0.104198 0.216151   -0.5176434
+      53400.00   0.102248 0.215513   -0.5182740
+      53401.00   0.100292 0.214906   -0.5189751
+      53402.00   0.098330 0.214328   -0.5196660
+      53403.00   0.096363 0.213780   -0.5202611
+      53404.00   0.094391 0.213261   -0.5206869
+      53405.00   0.092415 0.212773   -0.5209070
+      53406.00   0.090434 0.212314   -0.5209454
+      53407.00   0.088449 0.211885   -0.5208947
+      53408.00   0.086461 0.211486   -0.5208967
+      53409.00   0.084470 0.211116   -0.5210965
+      53410.00   0.082475 0.210776   -0.5215885
+      53411.00   0.080479 0.210465   -0.5223791
+      53412.00   0.078480 0.210184   -0.5233845
+      53413.00   0.076479 0.209933   -0.5244640
+      53414.00   0.074476 0.209711   -0.5254701
+      53415.00   0.072473 0.209518   -0.5262913
+      53416.00   0.070468 0.209355   -0.5268723
+      53417.00   0.068463 0.209221   -0.5272107
+      53418.00   0.066458 0.209116   -0.5273423
+      53419.00   0.064453 0.209039   -0.5273257
+      53420.00   0.062449 0.208992   -0.5272315
+      53421.00   0.060445 0.208974   -0.5271361
+      53422.00   0.058443 0.208984   -0.5271148
+      53423.00   0.056442 0.209023   -0.5272339
+      53424.00   0.054443 0.209090   -0.5275409
+      53425.00   0.052447 0.209186   -0.5280573
+      53426.00   0.050453 0.209309   -0.5287729
+      53427.00   0.048462 0.209461   -0.5296448
+      53428.00   0.046475 0.209641   -0.5306033
+      53429.00   0.044491 0.209848   -0.5315616
+      53430.00   0.042511 0.210083   -0.5324305
+      53431.00   0.040536 0.210346   -0.5331361
+      53432.00   0.038565 0.210636   -0.5336392
+      53433.00   0.036600 0.210953   -0.5339518
+      53434.00   0.034640 0.211297   -0.5341455
+      53435.00   0.032686 0.211667   -0.5343417
+      53436.00   0.030739 0.212065   -0.5346819
+      53437.00   0.028797 0.212488   -0.5352835
+      53438.00   0.026863 0.212938   -0.5361962
+      53439.00   0.024936 0.213414   -0.5373812
+      53440.00   0.023017 0.213916   -0.5387212
+      53441.00   0.021106 0.214444   -0.5400604
+      53442.00   0.019204 0.214997   -0.5412527
+      53443.00   0.017310 0.215575   -0.5421992
+      53444.00   0.015425 0.216178   -0.5428621
+      53445.00   0.013550 0.216807   -0.5432584
+      53446.00   0.011684 0.217459   -0.5434432
+      53447.00   0.009829 0.218137   -0.5434936
+      53448.00   0.008012 0.218824   -0.5434951
+      53449.00   0.006205 0.219536   -0.5435302
+      53450.00   0.004410 0.220271   -0.5436681
+      53451.00   0.002626 0.221030   -0.5439554
+      53452.00   0.000854 0.221812   -0.5444110
+      53453.00  -0.000905 0.222617   -0.5450251
+      53454.00  -0.002651 0.223445   -0.5457597
+      53455.00  -0.004384 0.224295   -0.5465522
+      53456.00  -0.006103 0.225168   -0.5473227
+      53457.00  -0.007809 0.226063   -0.5479887
+      53458.00  -0.009500 0.226979   -0.5484844
+      53459.00  -0.011177 0.227918   -0.5487794
+      53460.00  -0.012839 0.228877   -0.5488933
+      53461.00  -0.014485 0.229858   -0.5488997
+      53462.00  -0.016115 0.230860   -0.5489169
+      53463.00  -0.017730 0.231882   -0.5490819
+      53464.00  -0.019328 0.232924   -0.5495117
+      53465.00  -0.020909 0.233987   -0.5502646
+      53466.00  -0.022474 0.235069   -0.5513150
+      53467.00  -0.024020 0.236171   -0.5525573
+      53468.00  -0.025549 0.237292   -0.5538381
+      53469.00  -0.027060 0.238432   -0.5550027
+      53470.00  -0.028552 0.239591   -0.5559384
+      53471.00  -0.030026 0.240768   -0.5565964
+      53472.00  -0.031480 0.241963   -0.5569916
+      53473.00  -0.032915 0.243176   -0.5571830
+      53474.00  -0.034331 0.244407   -0.5572454
+      53475.00  -0.035726 0.245656   -0.5572518
+      53476.00  -0.037100 0.246921   -0.5572716
+      53477.00  -0.038454 0.248203   -0.5573643
+      53478.00  -0.039787 0.249501   -0.5575677
+      53479.00  -0.041099 0.250816   -0.5579013
+      53480.00  -0.042388 0.252147   -0.5583943
+      53481.00  -0.043656 0.253493   -0.5590472
+      53482.00  -0.044902 0.254855   -0.5598039
+      53483.00  -0.046125 0.256232   -0.5605783
+      53484.00  -0.047326 0.257623   -0.5613063
+      53485.00  -0.048503 0.259029   -0.5618863
+      53486.00  -0.049657 0.260450   -0.5622709
+      53487.00  -0.050788 0.261884   -0.5624379
+      53488.00  -0.051894 0.263332   -0.5624141
+      53489.00  -0.052977 0.264793   -0.5622979
+      53490.00  -0.054035 0.266267   -0.5622364
+      53491.00  -0.055069 0.267754   -0.5623966
+      53492.00  -0.056077 0.269253   -0.5628463
+      53493.00  -0.057061 0.270764   -0.5635855
+      53494.00  -0.058019 0.272287   -0.5645240
+      53495.00  -0.058952 0.273822   -0.5655133
+      53496.00  -0.059860 0.275368   -0.5664359
+      53497.00  -0.060741 0.276925   -0.5672243
+      53498.00  -0.061597 0.278493   -0.5678252
+      53499.00  -0.062426 0.280071   -0.5682104
+      53500.00  -0.063228 0.281658   -0.5684041
+      53501.00  -0.064004 0.283256   -0.5684424
+      53502.00  -0.064754 0.284863   -0.5683919
+      53503.00  -0.065476 0.286479   -0.5683328
+      53504.00  -0.066171 0.288104   -0.5683574
+      53505.00  -0.066840 0.289738   -0.5685207
+      53506.00  -0.067480 0.291379   -0.5688847
+      53507.00  -0.068094 0.293029   -0.5694687
+      53508.00  -0.068680 0.294686   -0.5702051
+      53509.00  -0.069238 0.296350   -0.5710462
+      53510.00  -0.069768 0.298021   -0.5719304
+      53511.00  -0.070271 0.299699   -0.5727614
+      53512.00  -0.070745 0.301383   -0.5734194
+      53513.00  -0.071192 0.303073   -0.5738198
+      53514.00  -0.071610 0.304769   -0.5738968
+      53515.00  -0.072001 0.306470   -0.5736789
+      53516.00  -0.072363 0.308177   -0.5732932
+      53517.00  -0.072697 0.309888   -0.5728922
+      53518.00  -0.073003 0.311603   -0.5726124
+      53519.00  -0.073281 0.313323   -0.5725106
+      53520.00  -0.073530 0.315046   -0.5725870
+      53521.00  -0.073751 0.316773   -0.5728159
+      53522.00  -0.073944 0.318504   -0.5731251
+      53523.00  -0.074109 0.320237   -0.5734127
+      53524.00  -0.074245 0.321972   -0.5735879
+      53525.00  -0.074354 0.323710   -0.5735794
+      53526.00  -0.074434 0.325450   -0.5733438
+      53527.00  -0.074486 0.327191   -0.5728598
+      53528.00  -0.074510 0.328933   -0.5721281
+      53529.00  -0.074506 0.330677   -0.5712797
+      53530.00  -0.074475 0.332421   -0.5704031
+      53531.00  -0.074416 0.334166   -0.5695097
+      53532.00  -0.074329 0.335910   -0.5686014
+      53533.00  -0.074214 0.337654   -0.5677307
+      53534.00  -0.074072 0.339398   -0.5669817
+      53535.00  -0.073903 0.341141   -0.5663464
+      53536.00  -0.073707 0.342882   -0.5658082
+      53537.00  -0.073484 0.344622   -0.5653532
+      53538.00  -0.073233 0.346360   -0.5649379
+      53539.00  -0.072956 0.348095   -0.5644983
+      53540.00  -0.072653 0.349828   -0.5639137
+      53541.00  -0.072323 0.351559   -0.5631150
+      53542.00  -0.071967 0.353286   -0.5620583
+      53543.00  -0.071585 0.355009   -0.5608633
+      53544.00  -0.071178 0.356729   -0.5596658
+      53545.00  -0.070745 0.358445   -0.5585709
+      53546.00  -0.070286 0.360156   -0.5576565
+      53547.00  -0.069802 0.361863   -0.5569753
+      53548.00  -0.069294 0.363565   -0.5565155
+      53549.00  -0.068761 0.365261   -0.5561814
+      53550.00  -0.068203 0.366951   -0.5558311
+      53551.00  -0.067621 0.368636   -0.5553461
+      53552.00  -0.067016 0.370314   -0.5546563
+      53553.00  -0.066386 0.371986   -0.5537249
+      53554.00  -0.065734 0.373650   -0.5525553
+      53555.00  -0.065058 0.375308   -0.5511996
+      53556.00  -0.064360 0.376958   -0.5497363
+      53557.00  -0.063639 0.378600   -0.5482537
+      53558.00  -0.062895 0.380234   -0.5468062
+      53559.00  -0.062130 0.381860   -0.5454592
+      53560.00  -0.061344 0.383477   -0.5442381
+      53561.00  -0.060536 0.385084   -0.5431233
+      53562.00  -0.059707 0.386683   -0.5421922
+      53563.00  -0.058858 0.388272   -0.5414819
+      53564.00  -0.057988 0.389851   -0.5409254
+      53565.00  -0.057099 0.391419   -0.5404186
+      53566.00  -0.056189 0.392978   -0.5398830
+      53567.00  -0.055261 0.394525   -0.5392463
+      53568.00  -0.054313 0.396062   -0.5384172
+      53569.00  -0.053347 0.397587   -0.5373040
+      53570.00  -0.052363 0.399100   -0.5359209
+      53571.00  -0.051361 0.400601   -0.5344400
+      53572.00  -0.050342 0.402091   -0.5330005
+      53573.00  -0.049305 0.403567   -0.5317176
+      53574.00  -0.048252 0.405031   -0.5306862
+      53575.00  -0.047182 0.406482   -0.5299442
+      53576.00  -0.046096 0.407920   -0.5294145
+      53577.00  -0.044994 0.409344   -0.5289379
+      53578.00  -0.043878 0.410755   -0.5283369
+      53579.00  -0.042746 0.412151   -0.5274951
+      53580.00  -0.041600 0.413533   -0.5263843
+      53581.00  -0.040439 0.414900   -0.5250389
+      53582.00  -0.039265 0.416252   -0.5235308
+      53583.00  -0.038078 0.417590   -0.5219161
+      53584.00  -0.036877 0.418912   -0.5202708
+      53585.00  -0.035664 0.420218   -0.5187071
+      53586.00  -0.034439 0.421509   -0.5173021
+      53587.00  -0.033202 0.422783   -0.5161053
+      53588.00  -0.031953 0.424042   -0.5151366
+      53589.00  -0.030693 0.425283   -0.5143909
+      53590.00  -0.029423 0.426508   -0.5138229
+      53591.00  -0.028142 0.427717   -0.5133909
+      53592.00  -0.026852 0.428907   -0.5130107
+      53593.00  -0.025551 0.430081   -0.5125769
+      53594.00  -0.024242 0.431237   -0.5120121
+      53595.00  -0.022924 0.432375   -0.5112680
+      53596.00  -0.021597 0.433495   -0.5103416
+      53597.00  -0.020262 0.434597   -0.5092561
+      53598.00  -0.018920 0.435680   -0.5080685
+      53599.00  -0.017570 0.436745   -0.5068980
+      53600.00  -0.016213 0.437791   -0.5058864
+      53601.00  -0.014850 0.438819   -0.5051650
+      53602.00  -0.013480 0.439827   -0.5047915
+      53603.00  -0.012105 0.440815   -0.5047204
+      53604.00  -0.010724 0.441785   -0.5048754
+      53605.00  -0.009338 0.442734   -0.5050711
+      53606.00  -0.007947 0.443664   -0.5050958
+      53607.00  -0.006551 0.444574   -0.5048353
+      53608.00  -0.005151 0.445464   -0.5042904
+      53609.00  -0.003748 0.446334   -0.5035055
+      53610.00  -0.002341 0.447183   -0.5025326
+      53611.00  -0.000930 0.448012   -0.5014525
+      53612.00   0.000483 0.448820   -0.5003552
+      53613.00   0.001898 0.449608   -0.4993236
+      53614.00   0.003316 0.450374   -0.4984066
+      53615.00   0.004736 0.451120   -0.4976803
+      53616.00   0.006157 0.451845   -0.4971752
+      53617.00   0.007580 0.452548   -0.4968823
+      53618.00   0.009004 0.453230   -0.4967654
+      53619.00   0.010428 0.453891   -0.4967675
+      53620.00   0.011853 0.454530   -0.4967874
+      53621.00   0.013278 0.455148   -0.4967251
+      53622.00   0.014703 0.455744   -0.4965391
+      53623.00   0.016128 0.456319   -0.4961973
+      53624.00   0.017552 0.456871   -0.4956907
+      53625.00   0.018975 0.457402   -0.4951242
+      53626.00   0.020397 0.457911   -0.4945260
+      53627.00   0.021817 0.458399   -0.4940029
+
Index: /tags/ipp-1-X/bug123/psLib/share/pslib/finals_all.raw
===================================================================
--- /tags/ipp-1-X/bug123/psLib/share/pslib/finals_all.raw	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/share/pslib/finals_all.raw	(revision 22331)
@@ -0,0 +1,11994 @@
+73 1 2 41684.00 I   .120724  .009786   .137066  .015902  I  .8084319  .0002710  0.0000 0.1916  P    44.969     .500     2.839     .300   .143000   .137000   .8075000      .000      .000  
+73 1 3 41685.00 I   .118971  .011039   .135756  .013616  I  .8056304  .0002710  3.5563 0.1916  P    45.005     .500     2.762     .300   .141000   .134000   .8044000      .000      .000  
+73 1 4 41686.00 I   .117218  .011039   .134448  .013616  I  .8028036  .0002710  2.6599 0.1916  P    45.122     .500     2.851     .300   .139000   .131000   .8012000      .000      .000  
+73 1 5 41687.00 I   .115464  .009743   .133144  .013089  I  .7998870  .0002710  3.0344 0.1916  P    45.344     .500     3.020     .300   .137000   .128000   .7981000      .000      .000  
+73 1 6 41688.00 I   .113708  .011236   .131846  .009898  I  .7968285  .0002710  3.1276 0.1916  P    45.623     .500     3.115     .300   .136000   .126000   .7949000      .000      .000  
+73 1 7 41689.00 I   .111948  .012506   .130558  .009144  I  .7935963  .0002710  3.3271 0.1916  P    45.812     .500     3.086     .300   .134000   .123000   .7918000      .000      .000  
+73 1 8 41690.00 I   .110180  .012042   .129282  .008563  I  .7901851  .0002710  3.4940 0.1916  P    45.804     .500     3.014     .300   .132000   .122000   .7887000      .000      .000  
+73 1 9 41691.00 I   .108401  .011753   .128020  .007670  I  .7866194  .0002710  3.6275 0.1916  P    45.647     .500     2.993     .300   .130000   .120000   .7855000      .000      .000  
+73 110 41692.00 I   .106607  .011233   .126775  .007850  I  .7829530  .0002710  3.6924 0.2189  P    45.466     .500     3.049     .300   .128000   .119000   .7824000      .000      .000  
+73 111 41693.00 I   .104795  .010595   .125551  .006952  I  .7792628  .0003439  3.6729 0.2373  P    45.326     .500     3.164     .300   .126000   .117000   .7792000      .000      .000  
+73 112 41694.00 I   .102960  .012040   .124351  .004628  I  .7756359  .0003895  3.5674 0.2632  P    45.177     .500     3.328     .300   .124000   .116000   .7761000      .000      .000  
+73 113 41695.00 I   .101103  .017283   .123180  .014244  I  .7721500  .0003986  3.3960 0.2787  P    44.931     .500     3.504     .300   .122000   .114000   .7730000      .000      .000  
+73 114 41696.00 I   .099219  .017776   .122040  .016032  I  .7688519  .0003986  3.2007 0.2819  P    44.607     .500     3.585     .300   .120000   .113000   .7698000      .000      .000  
+73 115 41697.00 I   .097304  .020404   .120936  .014510  I  .7657376  .0003986  3.0383 0.2819  P    44.381     .500     3.456     .300   .118000   .111000   .7667000      .000      .000  
+73 116 41698.00 I   .095355  .022714   .119870  .016602  I  .7627466  .0003986  2.9620 0.2917  P    44.444     .500     3.159     .300   .116000   .110000   .7635000      .000      .000  
+73 117 41699.00 I   .093368  .024425   .118846  .015222  I  .7597749  .0004261  3.0019 0.3035  P    44.789     .500     2.911     .300   .114000   .108000   .7604000      .000      .000  
+73 118 41700.00 I   .091341  .027783   .117865  .017497  I  .7567072  .0004579  3.1486 0.3214  P    45.213     .500     2.902     .300   .112000   .106000   .7573000      .000      .000  
+73 119 41701.00 I   .089273  .027006   .116926  .020543  I  .7534582  .0004814  3.3540 0.3322  P    45.571     .500     3.082     .300   .110000   .105000   .7541000      .000      .000  
+73 120 41702.00 I   .087167  .026817   .116031  .017708  I  .7500021  .0004814  3.5509 0.3404  P    45.880     .500     3.232     .300   .107000   .103000   .7510000      .000      .000  
+73 121 41703.00 I   .085025  .023253   .115178  .016235  I  .7463792  .0004814  3.6794 0.3404  P    46.144     .500     3.212     .300   .105000   .102000   .7478000      .000      .000  
+73 122 41704.00 I   .082853  .021951   .114370  .018104  I  .7426762  .0004814  3.7090 0.2762  P    46.215     .500     3.080     .300   .103000   .100000   .7447000      .000      .000  
+73 123 41705.00 I   .080657  .020859   .113605  .016592  I  .7389931  .0002710  3.6428 0.2762  P    45.986     .500     2.953     .300   .101000   .098000   .7415000      .000      .000  
+73 124 41706.00 I   .078440  .017339   .112884  .018269  I  .7354139  .0002710  3.5067 0.1916  P    45.602     .500     2.872     .300   .099000   .097000   .7383000      .000      .000  
+73 125 41707.00 I   .076205  .015190   .112202  .018414  I  .7319919  .0002710  3.3338 0.1916  P    45.321     .500     2.830     .300   .096000   .095000   .7352000      .000      .000  
+73 126 41708.00 I   .073954  .010350   .111559  .013984  I  .7287489  .0002710  3.1530 0.1916  P    45.204     .500     2.845     .300   .094000   .094000   .7320000      .000      .000  
+73 127 41709.00 I   .071691  .011387   .110952  .013008  I  .7256811  .0002710  2.9868 0.1916  P    45.127     .500     2.911     .300   .092000   .092000   .7288000      .000      .000  
+73 128 41710.00 I   .069420  .013080   .110378  .013702  I  .7227643  .0002710  2.8538 0.1916  P    45.037     .500     2.932     .300   .090000   .091000   .7256000      .000      .000  
+73 129 41711.00 I   .067147  .011392   .109836  .011893  I  .7199568  .0002710  2.7710 0.1916  P    45.034     .500     2.807     .300   .088000   .089000   .7224000      .000      .000  
+73 130 41712.00 I   .064874  .008644   .109325  .012216  I  .7172012  .0002710  2.7515 0.1916  P    45.159     .500     2.575     .300   .086000   .088000   .7193000      .000      .000  
+73 131 41713.00 I   .062607  .007486   .108846  .010740  I  .7144307  .0002710  2.8012 0.1916  P    45.302     .500     2.396     .300   .084000   .087000   .7161000      .000      .000  
+73 2 1 41714.00 I   .060349  .008228   .108400  .005952  I  .7115769  .0002710  2.9167 0.1916  P    45.368     .500     2.374     .300   .082000   .086000   .7129000      .000      .000  
+73 2 2 41715.00 I   .058100  .008273   .107987  .006132  I  .7085797  .0002710  3.0849 0.1916  P    45.424     .500     2.457     .300   .079000   .084000   .7096000      .000      .000  
+73 2 3 41716.00 I   .055865  .005051   .107608  .004481  I  .7053972  .0002710  3.2828 0.1916  P    45.573     .500     2.528     .300   .077000   .083000   .7063000      .000      .000  
+73 2 4 41717.00 I   .053644  .005684   .107263  .004652  I  .7020146  .0002710  3.4793 0.1916  P    45.777     .500     2.546     .300   .075000   .082000   .7031000      .000      .000  
+73 2 5 41718.00 I   .051441  .006413   .106954  .005294  I  .6984511  .0002710  3.6385 0.1916  P    45.873     .500     2.551     .300   .073000   .080000   .6998000      .000      .000  
+73 2 6 41719.00 I   .049257  .009371   .106681  .005496  I  .6947614  .0002710  3.7265 0.1916  P    45.754     .500     2.591     .300   .071000   .079000   .6965000      .000      .000  
+73 2 7 41720.00 I   .047093  .010820   .106442  .005977  I  .6910290  .0002710  3.7218 0.1916  P    45.463     .500     2.668     .300   .069000   .080000   .6932000      .000      .000  
+73 2 8 41721.00 I   .044951  .009430   .106239  .005536  I  .6873489  .0002710  3.6237 0.1916  P    45.133     .500     2.756     .300   .067000   .081000   .6899000      .000      .000  
+73 2 9 41722.00 I   .042831  .009747   .106070  .005115  I  .6838052  .0002710  3.4547 0.1916  P    44.868     .500     2.829     .300   .066000   .082000   .6866000      .000      .000  
+73 210 41723.00 I   .040732  .009517   .105935  .009579  I  .6804490  .0002710  3.2572 0.1916  P    44.688     .500     2.858     .300   .064000   .083000   .6833000      .000      .000  
+73 211 41724.00 I   .038653  .010158   .105832  .010657  I  .6772827  .0002710  3.0839 0.1916  P    44.561     .500     2.796     .300   .062000   .085000   .6800000      .000      .000  
+73 212 41725.00 I   .036593  .008858   .105760  .010542  I  .6742568  .0002710  2.9836 0.2290  P    44.488     .500     2.592     .300   .060000   .086000   .6767000      .000      .000  
+73 213 41726.00 I   .034550  .005354   .105717  .011659  I  .6712808  .0003693  2.9872 0.2290  P    44.523     .500     2.256     .300   .058000   .087000   .6734000      .000      .000  
+73 214 41727.00 I   .032521  .014261   .105702  .013368  I  .6682469  .0003693  3.0973 0.2611  P    44.706     .500     1.910     .300   .057000   .088000   .6701000      .000      .000  
+73 215 41728.00 I   .030505  .016421   .105715  .015269  I  .6650607  .0003693  3.2841 0.2611  P    45.014     .500     1.740     .300   .055000   .089000   .6668000      .000      .000  
+73 216 41729.00 I   .028503  .014294   .105755  .013263  I  .6616712  .0003693  3.4936 0.2611  P    45.369     .500     1.834     .300   .053000   .090000   .6635000      .000      .000  
+73 217 41730.00 I   .026512  .015706   .105824  .011762  I  .6580860  .0003693  3.6657 0.2611  P    45.690     .500     2.090     .300   .051000   .091000   .6601000      .000      .000  
+73 218 41731.00 I   .024531  .020115   .105922  .013465  I  .6543676  .0003693  3.7543 0.2290  P    45.896     .500     2.292     .300   .049000   .092000   .6568000      .000      .000  
+73 219 41732.00 I   .022556  .023196   .106048  .014393  I  .6506111  .0002710  3.7418 0.2290  P    45.915     .500     2.292     .300   .047000   .093000   .6534000      .000      .000  
+73 220 41733.00 I   .020582  .020204   .106203  .013455  I  .6469136  .0002710  3.6403 0.1916  P    45.743     .500     2.108     .300   .045000   .094000   .6501000      .000      .000  
+73 221 41734.00 I   .018606  .017371   .106384  .011791  I  .6433499  .0002710  3.4804 0.1916  P    45.478     .500     1.871     .300   .044000   .095000   .6467000      .000      .000  
+73 222 41735.00 I   .016623  .015060   .106592  .011458  I  .6399606  .0002710  3.2971 0.1916  P    45.236     .500     1.717     .300   .042000   .096000   .6433000      .000      .000  
+73 223 41736.00 I   .014632  .017310   .106828  .013177  I  .6367535  .0002710  3.1203 0.1916  P    45.062     .500     1.699     .300   .040000   .097000   .6400000      .000      .000  
+73 224 41737.00 I   .012634  .015302   .107093  .012172  I  .6337102  .0002710  2.9728 0.1916  P    44.960     .500     1.744     .300   .038000   .098000   .6366000      .000      .000  
+73 225 41738.00 I   .010628  .004408   .107386  .009703  I  .6307923  .0002710  2.8720 0.1916  P    44.978     .500     1.702     .300   .036000   .099000   .6333000      .000      .000  
+73 226 41739.00 I   .008615  .006024   .107709  .009450  I  .6279462  .0002710  2.8311 0.1916  P    45.179     .500     1.485     .300   .034000   .100000   .6299000      .000      .000  
+73 227 41740.00 I   .006593  .006496   .108060  .009211  I  .6251074  .0002710  2.8582 0.1916  P    45.518     .500     1.180     .300   .032000   .101000   .6265000      .000      .000  
+73 228 41741.00 I   .004564  .012724   .108438  .011717  I  .6222069  .0002710  2.9540 0.1916  P    45.826     .500      .966     .300   .030000   .102000   .6232000      .000      .000  
+73 3 1 41742.00 I   .002526  .014671   .108842  .012126  I  .6191790  .0002710  3.1108 0.1916  P    45.957     .500      .925     .300   .028000   .102000   .6198000      .000      .000  
+73 3 2 41743.00 I   .000479  .013161   .109270  .011853  I  .6159706  .0002710  3.3115 0.1916  P    45.948     .500      .981     .300   .026000   .103000   .6165000      .000      .000  
+73 3 3 41744.00 I  -.001578  .014776   .109721  .012783  I  .6125505  .0002710  3.5288 0.1916  P    45.972     .500     1.036     .300   .024000   .104000   .6131000      .000      .000  
+73 3 4 41745.00 I  -.003643  .012867   .110195  .012062  I  .6089196  .0002710  3.7263 0.1916  P    46.134     .500     1.098     .300   .022000   .105000   .6097000      .000      .000  
+73 3 5 41746.00 I  -.005713  .013849   .110692  .013003  I  .6051180  .0002710  3.8634 0.1916  P    46.333     .500     1.230     .300   .020000   .106000   .6063000      .000      .000  
+73 3 6 41747.00 I  -.007786  .018598   .111214  .011377  I  .6012241  .0002710  3.9064 0.1916  P    46.349     .500     1.411     .300   .018000   .106000   .6030000      .000      .000  
+73 3 7 41748.00 I  -.009857  .016956   .111761  .008623  I  .5973410  .0002710  3.8419 0.1916  P    46.073     .500     1.530     .300   .016000   .107000   .5996000      .000      .000  
+73 3 8 41749.00 I  -.011922  .014730   .112336  .010019  I  .5935706  .0002710  3.6865 0.1916  P    45.630     .500     1.491     .300   .014000   .108000   .5962000      .000      .000  
+73 3 9 41750.00 I  -.013977  .016541   .112940  .009673  I  .5899833  .0002710  3.4851 0.1916  P    45.282     .500     1.305     .300   .012000   .109000   .5928000      .000      .000  
+73 310 41751.00 I  -.016019  .027845   .113573  .009673  I  .5865962  .0002710  3.2964 0.1916  P    45.200     .500     1.053     .300   .009000   .109000   .5893000      .000      .000  
+73 311 41752.00 I  -.018040  .032115   .114237  .009720  I  .5833682  .0002710  3.1747 0.4760  P    45.348     .500      .809     .300   .007000   .110000   .5859000      .000      .000  
+73 312 41753.00 I  -.020032  .035235   .114933  .012152  I  .5802133  .0009126  3.1535 0.4760  P    45.567     .500      .583     .300   .004000   .111000   .5824000      .000      .000  
+73 313 41754.00 I  -.021990  .037228   .115661  .014705  I  .5770261  .0009126  3.2375 0.6453  P    45.749     .500      .342     .300   .002000   .112000   .5790000      .000      .000  
+73 314 41755.00 I  -.023907  .032343   .116421  .014705  I  .5737111  .0009126  3.4032 0.6453  P    45.908     .500      .085     .300   .000000   .112000   .5755000      .000      .000  
+73 315 41756.00 I  -.025780  .037323   .117212  .015938  I  .5702072  .0009126  3.6066 0.6453  P    46.111     .500     -.101     .300  -.003000   .113000   .5720000      .000      .000  
+73 316 41757.00 I  -.027610  .033991   .118036  .018578  I  .5665027  .0009126  3.7956 0.6453  P    46.359     .500     -.097     .300  -.005000   .114000   .5685000      .000      .000  
+73 317 41758.00 I  -.029400  .027934   .118890  .018578  I  .5626361  .0009126  3.9242 0.4760  P    46.565     .500      .113     .300  -.008000   .114000   .5650000      .000      .000  
+73 318 41759.00 I  -.031155  .024244   .119773  .016207  I  .5586838  .0002710  3.9642 0.4760  P    46.646     .500      .377     .300  -.010000   .115000   .5615000      .000      .000  
+73 319 41760.00 I  -.032878  .012640   .120683  .016340  I  .5547386  .0002710  3.9115 0.1916  P    46.625     .500      .491     .300  -.012000   .116000   .5579000      .000      .000  
+73 320 41761.00 I  -.034573  .013809   .121619  .013403  I  .5508857  .0002710  3.7840 0.1916  P    46.599     .500      .371     .300  -.015000   .117000   .5544000      .000      .000  
+73 321 41762.00 I  -.036242  .015665   .122582  .013403  I  .5471853  .0002710  3.6125 0.1916  P    46.602     .500      .123     .300  -.017000   .118000   .5508000      .000      .000  
+73 322 41763.00 I  -.037885  .014168   .123571  .012131  I  .5436641  .0002710  3.4307 0.1916  P    46.573     .500     -.074     .300  -.020000   .119000   .5473000      .000      .000  
+73 323 41764.00 I  -.039504  .010960   .124588  .007128  I  .5403179  .0002710  3.2668 0.1916  P    46.479     .500     -.128     .300  -.022000   .120000   .5437000      .000      .000  
+73 324 41765.00 I  -.041099  .009572   .125635  .010385  I  .5371173  .0002710  3.1424 0.1916  P    46.407     .500     -.113     .300  -.024000   .120000   .5401000      .000      .000  
+73 325 41766.00 I  -.042673  .010897   .126712  .010546  I  .5340153  .0002710  3.0715 0.4939  P    46.482     .500     -.191     .300  -.027000   .121000   .5365000      .000      .000  
+73 326 41767.00 I  -.044229  .010997   .127821  .009188  I  .5309537  .0009499  3.0626 0.4939  P    46.738     .500     -.435     .300  -.029000   .122000   .5330000      .000      .000  
+73 327 41768.00 I  -.045771  .008170   .128964  .010531  I  .5278687  .0009499  3.1181 0.6717  P    47.096     .500     -.719     .300  -.032000   .123000   .5294000      .000      .000  
+73 328 41769.00 I  -.047302  .008769   .130142  .009502  I  .5246976  .0009499  3.2334 0.6717  P    47.439     .500     -.841     .300  -.034000   .124000   .5258000      .000      .000  
+73 329 41770.00 I  -.048828  .008961   .131356  .010189  I  .5213856  .0009499  3.3975 0.6717  P    47.660     .500     -.755     .300  -.036000   .125000   .5222000      .000      .000  
+73 330 41771.00 I  -.050351  .008871   .132605  .008830  I  .5178924  .0009499  3.5920 0.6717  P    47.708     .500     -.619     .300  -.039000   .127000   .5186000      .000      .000  
+73 331 41772.00 I  -.051875  .010144   .133891  .003313  I  .5142009  .0009499  3.7884 0.4939  P    47.656     .500     -.586     .300  -.041000   .128000   .5149000      .000      .000  
+73 4 1 41773.00 I  -.053404  .027169   .135214  .005442  I  .5103278  .0002710  3.9482 0.4939  P    47.657     .500     -.594     .300  -.044000   .129000   .5113000      .000      .000  
+73 4 2 41774.00 I  -.054940  .030688   .136573  .006176  I  .5063304  .0002710  4.0304 0.1916  P    47.755     .500     -.472     .300  -.046000   .131000   .5077000      .000      .000  
+73 4 3 41775.00 I  -.056488  .027434   .137969  .013677  I  .5023026  .0002710  4.0058 0.1916  P    47.777     .500     -.208     .300  -.048000   .132000   .5041000      .000      .000  
+73 4 4 41776.00 I  -.058053  .031109   .139402  .015490  I  .4983553  .0002710  3.8718 0.1916  P    47.525     .500     -.014     .300  -.051000   .133000   .5006000      .000      .000  
+73 4 5 41777.00 I  -.059639  .027250   .140872  .029276  I  .4945843  .0002710  3.6619 0.1916  P    47.067     .500     -.098     .300  -.053000   .134000   .4970000      .000      .000  
+73 4 6 41778.00 I  -.061247  .031072   .142377  .033803  I  .4910366  .0002710  3.4367 0.1916  P    46.721     .500     -.445     .300  -.056000   .136000   .4935000      .000      .000  
+73 4 7 41779.00 I  -.062874  .029203   .143917  .029521  I  .4876939  .0002710  3.2625 0.1355  P    46.735     .500     -.857     .300  -.058000   .137000   .4899000      .000      .000  
+73 4 8 41780.00 I  -.064517  .015992   .145494  .033667  I  .4844787  .0000063  3.1868 0.1368  P    47.048     .500    -1.157     .300  -.061000   .139000   .4864000      .000      .000  
+73 4 9 41781.00 I  -.066174  .014330   .147108  .030260  I  .4812836  .0000370  3.2211 0.0188  P    47.407     .500    -1.310     .300  -.063000   .141000   .4829000      .000      .000  
+73 410 41782.00 I  -.067840  .014560   .148757  .031775  I  .4780073  .0000370  3.3431 0.0262  P    47.621     .500    -1.381     .300  -.066000   .143000   .4794000      .000      .000  
+73 411 41783.00 I  -.069512  .016351   .150437  .027523  I  .4745829  .0000370  3.5087 0.0262  P    47.697     .500    -1.438     .300  -.068000   .145000   .4759000      .000      .000  
+73 412 41784.00 I  -.071188  .018280   .152143  .010351  I  .4709918  .0000370  3.6687 0.0262  P    47.760     .500    -1.487     .300  -.071000   .147000   .4724000      .000      .000  
+73 413 41785.00 I  -.072868  .016606   .153873  .013467  I  .4672608  .0000370  3.7828 0.0319  P    47.893     .500    -1.478     .300  -.073000   .148000   .4689000      .000      .000  
+73 414 41786.00 I  -.074547  .014003   .155619  .014917  I  .4634499  .0000519  3.8256 0.1368  P    48.042     .500    -1.369     .300  -.076000   .150000   .4655000      .000      .000  
+73 415 41787.00 I  -.076226  .012772   .157377  .015513  I  .4596361  .0002710  3.7888 0.1380  P    48.110     .500    -1.192     .300  -.078000   .152000   .4620000      .000      .000  
+73 416 41788.00 I  -.077898  .014123   .159141  .015277  I  .4558961  .0002710  3.6806 0.1916  P    48.103     .500    -1.063     .300  -.081000   .154000   .4586000      .000      .000  
+73 417 41789.00 I  -.079559  .013893   .160904  .013978  I  .4522916  .0002710  3.5222 0.2293  P    48.130     .500    -1.090     .300  -.083000   .156000   .4551000      .000      .000  
+73 418 41790.00 I  -.081206  .010623   .162664  .016129  I  .4488589  .0003700  3.3421 0.2293  P    48.230     .500    -1.274     .300  -.085000   .158000   .4517000      .000      .000  
+73 419 41791.00 I  -.082836  .009813   .164416  .022876  I  .4456047  .0003700  3.1700 0.2320  P    48.307     .500    -1.497     .300  -.086000   .160000   .4483000      .000      .000  
+73 420 41792.00 I  -.084445  .009740   .166159  .023729  I  .4425079  .0002801  3.0308 0.2893  P    48.285     .500    -1.633     .300  -.088000   .162000   .4448000      .000      .000  
+73 421 41793.00 I  -.086031  .008672   .167888  .020834  I  .4395262  .0004449  2.9421 0.2779  P    48.252     .500    -1.673     .300  -.090000   .164000   .4414000      .000      .000  
+73 422 41794.00 I  -.087594  .008879   .169602  .021918  I  .4366037  .0004801  2.9133 0.3093  P    48.328     .500    -1.729     .300  -.092000   .166000   .4380000      .000      .000  
+73 423 41795.00 I  -.089132  .007702   .171299  .022632  I  .4336788  .0004298  2.9468 0.3268  P    48.496     .500    -1.890     .300  -.093000   .168000   .4346000      .000      .000  
+73 424 41796.00 I  -.090646  .004604   .172977  .025609  I  .4306908  .0004434  3.0381 0.3088  P    48.672     .500    -2.069     .300  -.095000   .170000   .4312000      .000      .000  
+73 425 41797.00 I  -.092135  .013391   .174637  .022861  I  .4275866  .0004434  3.1773 0.3362  P    48.855     .500    -2.076     .300  -.097000   .172000   .4277000      .000      .000  
+73 426 41798.00 I  -.093600  .014952   .176280  .016101  I  .4243250  .0005055  3.3502 0.3006  P    49.072     .500    -1.865     .300  -.098000   .174000   .4243000      .000      .000  
+73 427 41799.00 I  -.095039  .017996   .177908  .016389  I  .4208818  .0004060  3.5365 0.2535  P    49.227     .500    -1.639     .300  -.100000   .176000   .4209000      .000      .000  
+73 428 41800.00 I  -.096452  .020007   .179524  .018068  I  .4172571  .0000402  3.7076 0.2441  P    49.192     .500    -1.624     .300  -.101000   .178000   .4175000      .000      .000  
+73 429 41801.00 I  -.097839  .022840   .181129  .016125  I  .4134837  .0002710  3.8275 0.1370  P    49.002     .500    -1.766     .300  -.102000   .180000   .4141000      .000      .000  
+73 430 41802.00 I  -.099202  .024995   .182728  .013615  I  .4096311  .0002710  3.8605 0.1916  P    48.804     .500    -1.785     .300  -.103000   .181000   .4108000      .000      .000  
+73 5 1 41803.00 I  -.100543  .024464   .184322  .016261  I  .4057984  .0002710  3.7865 0.1916  P    48.609     .500    -1.553     .300  -.104000   .183000   .4074000      .000      .000  
+73 5 2 41804.00 I  -.101860  .024278   .185910  .017034  I  .4020902  .0002710  3.6163 0.1916  P    48.303     .500    -1.283     .300  -.106000   .185000   .4040000      .000      .000  
+73 5 3 41805.00 I  -.103149  .023618   .187492  .015012  I  .3985825  .0002710  3.3961 0.1916  P    47.912     .500    -1.272     .300  -.107000   .187000   .4006000      .000      .000  
+73 5 4 41806.00 I  -.104401  .024214   .189067  .014347  I  .3952917  .0002710  3.1948 0.1916  P    47.676     .500    -1.556     .300  -.108000   .189000   .3972000      .000      .000  
+73 5 5 41807.00 I  -.105607  .021898   .190634  .012515  I  .3921651  .0002710  3.0767 0.1916  P    47.783     .500    -1.901     .300  -.109000   .190000   .3939000      .000      .000  
+73 5 6 41808.00 I  -.106760  .019623   .192195  .012981  I  .3891000  .0002710  3.0734 0.1916  P    48.144     .500    -2.105     .300  -.110000   .192000   .3905000      .000      .000  
+73 5 7 41809.00 I  -.107853  .019807   .193751  .012218  I  .3859841  .0002710  3.1727 0.1916  P    48.506     .500    -2.159     .300  -.111000   .194000   .3871000      .000      .000  
+73 5 8 41810.00 I  -.108882  .018586   .195303  .006619  I  .3827358  .0002710  3.3283 0.1423  P    48.682     .500    -2.135     .300  -.112000   .196000   .3838000      .000      .000  
+73 5 9 41811.00 I  -.109843  .017897   .196854  .007580  I  .3793280  .0000870  3.4823 0.1423  P    48.646     .500    -2.059     .300  -.112000   .198000   .3805000      .000      .000  
+73 510 41812.00 I  -.110735  .016515   .198402  .008142  I  .3757875  .0000870  3.5875 0.0615  P    48.495     .500    -1.934     .300  -.113000   .200000   .3771000      .000      .000  
+73 511 41813.00 I  -.111557  .014604   .199950  .020486  I  .3721774  .0000870  3.6195 0.0615  P    48.380     .500    -1.805     .300  -.113000   .202000   .3738000      .000      .000  
+73 512 41814.00 I  -.112313  .015209   .201499  .023592  I  .3685739  .0000870  3.5752 0.0615  P    48.391     .500    -1.724     .300  -.114000   .204000   .3705000      .000      .000  
+73 513 41815.00 I  -.113006  .013690   .203052  .025493  I  .3650488  .0000870  3.4653 0.0615  P    48.470     .500    -1.681     .300  -.114000   .205000   .3672000      .000      .000  
+73 514 41816.00 I  -.113643  .010576   .204611  .028913  I  .3616590  .0000870  3.3082 0.1423  P    48.493     .500    -1.642     .300  -.115000   .207000   .3640000      .000      .000  
+73 515 41817.00 I  -.114229  .015352   .206179  .026139  I  .3584406  .0002710  3.1264 0.1274  P    48.429     .500    -1.642     .300  -.115000   .209000   .3607000      .000      .000  
+73 516 41818.00 I  -.114769  .015251   .207756  .029634  I  .3554062  .0002395  2.9444 0.1808  P    48.338     .500    -1.764     .300  -.116000   .211000   .3575000      .000      .000  
+73 517 41819.00 I  -.115267  .018306   .209342  .025695  I  .3525437  .0002395  2.7866 0.1694  P    48.257     .500    -2.005     .300  -.116000   .213000   .3542000      .000      .000  
+73 518 41820.00 I  -.115729  .020861   .210937  .019673  I  .3498182  .0002395  2.6733 0.1694  P    48.190     .500    -2.232     .300  -.116000   .214000   .3510000      .000      .000  
+73 519 41821.00 I  -.116160  .018243   .212543  .019925  I  .3471778  .0002395  2.6178 0.1694  P    48.184     .500    -2.313     .300  -.116000   .216000   .3479000      .000      .000  
+73 520 41822.00 I  -.116560  .020619   .214161  .014814  I  .3445621  .0002395  2.6239 0.1694  P    48.271     .500    -2.270     .300  -.116000   .217000   .3447000      .000      .000  
+73 521 41823.00 I  -.116928  .025576   .215794  .012854  I  .3419107  .0002395  2.6878 0.1808  P    48.355     .500    -2.237     .300  -.116000   .219000   .3416000      .000      .000  
+73 522 41824.00 I  -.117260  .025880   .217446  .012054  I  .3391710  .0002710  2.7983 0.1808  P    48.321     .500    -2.263     .300  -.117000   .220000   .3384000      .000      .000  
+73 523 41825.00 I  -.117551  .022418   .219118  .011225  I  .3363033  .0002710  2.9411 0.1916  P    48.237     .500    -2.235     .300  -.117000   .221000   .3353000      .000      .000  
+73 524 41826.00 I  -.117796  .021351   .220811  .012878  I  .3332839  .0002710  3.0985 0.1916  P    48.279     .500    -2.059     .300  -.117000   .223000   .3321000      .000      .000  
+73 525 41827.00 I  -.117988  .024367   .222526  .012677  I  .3301084  .0002710  3.2495 0.1916  P    48.438     .500    -1.855     .300  -.117000   .224000   .3290000      .000      .000  
+73 526 41828.00 I  -.118122  .027985   .224260  .008483  I  .3267957  .0002710  3.3681 0.1916  P    48.477     .500    -1.837     .300  -.117000   .226000   .3258000      .000      .000  
+73 527 41829.00 I  -.118191  .025031   .226015  .010133  I  .3233929  .0002710  3.4247 0.1916  P    48.233     .500    -2.004     .300  -.117000   .227000   .3227000      .000      .000  
+73 528 41830.00 I  -.118187  .019707   .227791  .011665  I  .3199751  .0002710  3.3949 0.1916  P    47.789     .500    -2.097     .300  -.117000   .228000   .3196000      .000      .000  
+73 529 41831.00 I  -.118104  .017895   .229587  .015466  I  .3166341  .0002710  3.2722 0.1916  P    47.316     .500    -1.928     .300  -.117000   .230000   .3166000      .000      .000  
+73 530 41832.00 I  -.117943  .020656   .231402  .017212  I  .3134538  .0002710  3.0804 0.1916  P    46.906     .500    -1.643     .300  -.117000   .231000   .3135000      .000      .000  
+73 531 41833.00 I  -.117703  .017892   .233238  .016251  I  .3104780  .0002710  2.8745 0.1916  P    46.634     .500    -1.536     .300  -.117000   .233000   .3105000      .000      .000  
+73 6 1 41834.00 I  -.117388  .009540   .235091  .017428  I  .3076868  .0002710  2.7224 0.1916  P    46.601     .500    -1.673     .300  -.117000   .234000   .3074000      .000      .000  
+73 6 2 41835.00 I  -.117002  .008392   .236962  .015311  I  .3049978  .0002710  2.6763 0.1916  P    46.812     .500    -1.851     .300  -.117000   .235000   .3044000      .000      .000  
+73 6 3 41836.00 I  -.116549  .006454   .238846  .015736  I  .3022950  .0002710  2.7478 0.1916  P    47.124     .500    -1.909     .300  -.117000   .237000   .3014000      .000      .000  
+73 6 4 41837.00 I  -.116036  .013487   .240738  .014724  I  .2994746  .0002710  2.9021 0.1916  P    47.384     .500    -1.899     .300  -.117000   .238000   .2984000      .000      .000  
+73 6 5 41838.00 I  -.115466  .014280   .242636  .010305  I  .2964846  .0002710  3.0751 0.1916  P    47.513     .500    -1.906     .300  -.117000   .240000   .2954000      .000      .000  
+73 6 6 41839.00 I  -.114846  .019850   .244536  .009134  I  .2933393  .0002710  3.2035 0.2630  P    47.430     .500    -1.863     .300  -.117000   .241000   .2924000      .000      .000  
+73 6 7 41840.00 I  -.114180  .022917   .246436  .007441  I  .2901054  .0004509  3.2485 0.2630  P    47.075     .500    -1.675     .300  -.117000   .243000   .2895000      .000      .000  
+73 6 8 41841.00 I  -.113474  .022825   .248333  .011421  I  .2868723  .0004509  3.2035 0.3188  P    46.583     .500    -1.423     .300  -.116000   .245000   .2865000      .000      .000  
+73 6 9 41842.00 I  -.112728  .026302   .250227  .012847  I  .2837227  .0004509  3.0857 0.3188  P    46.250     .500    -1.296     .300  -.116000   .246000   .2836000      .000      .000  
+73 610 41843.00 I  -.111943  .023501   .252117  .012077  I  .2807165  .0004509  2.9212 0.3188  P    46.209     .500    -1.348     .300  -.116000   .248000   .2806000      .000      .000  
+73 611 41844.00 I  -.111124  .023142   .254000  .012371  I  .2778874  .0004509  2.7353 0.3188  P    46.255     .500    -1.447     .300  -.116000   .250000   .2777000      .000      .000  
+73 612 41845.00 I  -.110279  .021487   .255878  .017632  I  .2752458  .0004509  2.5498 0.2630  P    46.116     .500    -1.494     .300  -.115000   .252000   .2748000      .000      .000  
+73 613 41846.00 I  -.109416  .017151   .257745  .020236  I  .2727809  .0002710  2.3851 0.2630  P    45.778     .500    -1.564     .300  -.115000   .254000   .2720000      .000      .000  
+73 614 41847.00 I  -.108543  .016601   .259600  .018843  I  .2704624  .0002710  2.2600 0.3157  P    45.432     .500    -1.753     .300  -.115000   .255000   .2691000      .000      .000  
+73 615 41848.00 I  -.107669  .014071   .261438  .018838  I  .2682428  .0005702  2.1893 0.3157  P    45.234     .500    -1.978     .300  -.114000   .257000   .2663000      .000      .000  
+73 616 41849.00 I  -.106798  .025101   .263258  .017549  I  .2660632  .0005702  2.1806 0.4032  P    45.208     .500    -2.043     .300  -.114000   .259000   .2634000      .000      .000  
+73 617 41850.00 I  -.105935  .028203   .265060  .019524  I  .2638618  .0005702  2.2315 0.4032  P    45.288     .500    -1.886     .300  -.113000   .261000   .2607000      .000      .000  
+73 618 41851.00 I  -.105082  .027314   .266846  .017249  I  .2615839  .0005702  2.3313 0.4032  P    45.332     .500    -1.668     .300  -.112000   .263000   .2580000      .000      .000  
+73 619 41852.00 I  -.104241  .030244   .268620  .011627  I  .2591881  .0005702  2.4643 0.4032  P    45.194     .500    -1.573     .300  -.111000   .264000   .2552000      .000      .000  
+73 620 41853.00 I  -.103414  .026380   .270385  .014594  I  .2566509  .0005702  2.6107 0.3157  P    44.903     .500    -1.600     .300  -.110000   .266000   .2525000      .000      .000  
+73 621 41854.00 I  -.102602  .029233   .272147  .014833  I  .2539691  .0002710  2.7501 0.3157  P    44.673     .500    -1.617     .300  -.110000   .268000   .2498000      .000      .000  
+73 622 41855.00 I  -.101802  .026309   .273910  .014971  I  .2511601  .0002710  2.8613 0.1784  P    44.646     .500    -1.579     .300  -.109000   .270000   .2472000      .000      .000  
+73 623 41856.00 I  -.101014  .016756   .275678  .015592  I  .2482631  .0002321  2.9228 0.2197  P    44.685     .500    -1.573     .300  -.108000   .272000   .2446000      .000      .000  
+73 624 41857.00 I  -.100233  .014869   .277455  .016456  I  .2453372  .0003459  2.9161 0.2083  P    44.530     .500    -1.640     .300  -.107000   .273000   .2421000      .000      .000  
+73 625 41858.00 I  -.099456  .009771   .279243  .018589  I  .2424569  .0003459  2.8314 0.2446  P    44.084     .500    -1.662     .300  -.106000   .275000   .2395000      .000      .000  
+73 626 41859.00 I  -.098677  .014683   .281043  .020595  I  .2396968  .0003459  2.6795 0.2446  P    43.488     .500    -1.528     .300  -.105000   .277000   .2369000      .000      .000  
+73 627 41860.00 I  -.097889  .016561   .282855  .020415  I  .2371084  .0003459  2.4962 0.2446  P    42.990     .500    -1.336     .300  -.103000   .279000   .2344000      .000      .000  
+73 628 41861.00 I  -.097085  .019212   .284679  .018761  I  .2346963  .0003459  2.3374 0.2762  P    42.793     .500    -1.289     .300  -.102000   .281000   .2320000      .000      .000  
+73 629 41862.00 I  -.096256  .020588   .286516  .019760  I  .2324062  .0004307  2.2610 0.2197  P    42.935     .500    -1.412     .300  -.100000   .282000   .2295000      .000      .000  
+73 630 41863.00 I  -.095395  .021457   .288366  .017237  I  .2301356  .0002710  2.3006 0.2544  P    43.238     .500    -1.515     .300  -.099000   .284000   .2271000      .000      .000  
+73 7 1 41864.00 I  -.094499  .024493   .290226  .016679  I  .2277697  .0002710  2.4460 0.1916  P    43.467     .500    -1.477     .300  -.097000   .286000   .2246000      .000      .000  
+73 7 2 41865.00 I  -.093566  .021929   .292091  .016416  I  .2252259  .0002710  2.6446 0.1916  P    43.568     .500    -1.406     .300  -.095000   .288000   .2223000      .000      .000  
+73 7 3 41866.00 I  -.092596  .021194   .293957  .011802  I  .2224869  .0002710  2.8242 0.1916  P    43.619     .500    -1.435     .300  -.094000   .290000   .2200000      .000      .000  
+73 7 4 41867.00 I  -.091588  .019350   .295818  .011256  I  .2196042  .0002710  2.9239 0.1916  P    43.555     .500    -1.481     .300  -.092000   .291000   .2177000      .000      .000  
+73 7 5 41868.00 I  -.090547  .016774   .297669  .010791  I  .2166747  .0002710  2.9169 0.1916  P    43.148     .500    -1.365     .300  -.091000   .293000   .2154000      .000      .000  
+73 7 6 41869.00 I  -.089478  .016849   .299504  .009358  I  .2138025  .0002710  2.8135 0.1916  P    42.410     .500    -1.110     .300  -.089000   .295000   .2131000      .000      .000  
+73 7 7 41870.00 I  -.088387  .013730   .301319  .010540  I  .2110689  .0002710  2.6464 0.1916  P    41.750     .500     -.951     .300  -.087000   .296000   .2108000      .000      .000  
+73 7 8 41871.00 I  -.087280  .019979   .303108  .012764  I  .2085187  .0002710  2.4524 0.1916  P    41.540     .500    -1.025     .300  -.085000   .298000   .2085000      .000      .000  
+73 7 9 41872.00 I  -.086167  .022157   .304868  .011666  I  .2061633  .0002710  2.2609 0.1916  P    41.654     .500    -1.203     .300  -.083000   .299000   .2062000      .000      .000  
+73 710 41873.00 I  -.085056  .020893   .306592  .015599  I  .2039890  .0002710  2.0931 0.1916  P    41.661     .500    -1.301     .300  -.081000   .300000   .2039000      .000      .000  
+73 711 41874.00 I  -.083952  .023481   .308278  .017434  I  .2019641  .0002710  1.9644 0.1916  P    41.377     .500    -1.323     .300  -.080000   .302000   .2016000      .000      .000  
+73 712 41875.00 I  -.082861  .021541   .309919  .015936  I  .2000425  .0002710  1.8887 0.1916  P    41.003     .500    -1.397     .300  -.078000   .303000   .1993000      .000      .000  
+73 713 41876.00 I  -.081780  .023470   .311513  .019360  I  .1981661  .0002710  1.8749 0.1916  P    40.774     .500    -1.523     .300  -.076000   .304000   .1970000      .000      .000  
+73 714 41877.00 I  -.080706  .021516   .313057  .017777  I  .1962715  .0002710  1.9246 0.1916  P    40.719     .500    -1.543     .300  -.074000   .305000   .1947000      .000      .000  
+73 715 41878.00 I  -.079639  .008902   .314550  .017736  I  .1942984  .0002710  2.0297 0.1916  P    40.750     .500    -1.368     .300  -.072000   .307000   .1924000      .000      .000  
+73 716 41879.00 I  -.078576  .013383   .315992  .015590  I  .1921991  .0002710  2.1738 0.1916  P    40.772     .500    -1.121     .300  -.070000   .308000   .1901000      .000      .000  
+73 717 41880.00 I  -.077516  .014265   .317382  .006845  I  .1899451  .0002710  2.3351 0.1916  P    40.683     .500    -1.011     .300  -.068000   .309000   .1877000      .000      .000  
+73 718 41881.00 I  -.076456  .012458   .318721  .007667  I  .1875310  .0002710  2.4900 0.1916  P    40.421     .500    -1.103     .300  -.066000   .310000   .1854000      .000      .000  
+73 719 41882.00 I  -.075393  .014120   .320007  .008445  I  .1849750  .0002710  2.6151 0.1916  P    40.073     .500    -1.280     .300  -.064000   .311000   .1830000      .000      .000  
+73 720 41883.00 I  -.074324  .012666   .321240  .007383  I  .1823177  .0002710  2.6896 0.1916  P    39.825     .500    -1.400     .300  -.062000   .312000   .1807000      .000      .000  
+73 721 41884.00 I  -.073249  .013325   .322420  .006510  I  .1796175  .0002710  2.6990 0.1916  P    39.743     .500    -1.425     .300  -.061000   .314000   .1783000      .000      .000  
+73 722 41885.00 I  -.072165  .011720   .323546  .005658  I  .1769433  .0002710  2.6378 0.1916  P    39.684     .500    -1.388     .300  -.059000   .315000   .1759000      .000      .000  
+73 723 41886.00 I  -.071074  .004857   .324618  .005761  I  .1743623  .0002710  2.5156 0.1916  P    39.458     .500    -1.310     .300  -.057000   .316000   .1735000      .000      .000  
+73 724 41887.00 I  -.069974  .007184   .325637  .005914  I  .1719236  .0002710  2.3591 0.1916  P    39.044     .500    -1.212     .300  -.055000   .317000   .1712000      .000      .000  
+73 725 41888.00 I  -.068865  .008084   .326605  .003889  I  .1696410  .0002710  2.2120 0.1916  P    38.635     .500    -1.178     .300  -.053000   .318000   .1688000      .000      .000  
+73 726 41889.00 I  -.067746  .007905   .327521  .003722  I  .1674796  .0002710  2.1251 0.1916  P    38.475     .500    -1.300     .300  -.051000   .319000   .1664000      .000      .000  
+73 727 41890.00 I  -.066615  .008293   .328385  .004136  I  .1653574  .0002710  2.1386 0.1916  P    38.632     .500    -1.529     .300  -.049000   .320000   .1639000      .000      .000  
+73 728 41891.00 I  -.065470  .007735   .329200  .014973  I  .1631654  .0002710  2.2632 0.1916  P    38.911     .500    -1.670     .300  -.047000   .321000   .1615000      .000      .000  
+73 729 41892.00 I  -.064308  .008613   .329966  .017281  I  .1608038  .0002710  2.4692 0.1916  P    39.057     .500    -1.601     .300  -.046000   .322000   .1590000      .000      .000  
+73 730 41893.00 I  -.063127  .009939   .330684  .016150  I  .1582205  .0002710  2.6945 0.1916  P    39.048     .500    -1.422     .300  -.044000   .323000   .1566000      .000      .000  
+73 731 41894.00 I  -.061922  .009300   .331356  .018284  I  .1554320  .0002710  2.8682 0.1916  P    39.042     .500    -1.320     .300  -.042000   .325000   .1541000      .000      .000  
+73 8 1 41895.00 I  -.060690  .008717   .331984  .020554  I  .1525183  .0002710  2.9394 0.1916  P    39.030     .500    -1.312     .300  -.040000   .326000   .1516000      .000      .000  
+73 8 2 41896.00 I  -.059426  .009129   .332571  .023664  I  .1495917  .0002710  2.8952 0.1916  P    38.750     .500    -1.259     .300  -.038000   .327000   .1491000      .000      .000  
+73 8 3 41897.00 I  -.058129  .011588   .333123  .021583  I  .1467587  .0002710  2.7584 0.1916  P    38.079     .500    -1.104     .300  -.037000   .328000   .1467000      .000      .000  
+73 8 4 41898.00 I  -.056796  .012963   .333641  .018419  I  .1440916  .0002710  2.5713 0.1916  P    37.356     .500     -.980     .300  -.035000   .329000   .1442000      .000      .000  
+73 8 5 41899.00 I  -.055426  .012045   .334129  .016004  I  .1416190  .0002710  2.3756 0.1916  P    37.053     .500    -1.016     .300  -.033000   .330000   .1417000      .000      .000  
+73 8 6 41900.00 I  -.054018  .011657   .334587  .017099  I  .1393332  .0002710  2.2017 0.1916  P    37.223     .500    -1.147     .300  -.031000   .331000   .1392000      .000      .000  
+73 8 7 41901.00 I  -.052571  .013442   .335018  .014829  I  .1372021  .0002710  2.0684 0.1916  P    37.493     .500    -1.221     .300  -.030000   .331000   .1368000      .000      .000  
+73 8 8 41902.00 I  -.051087  .015037   .335422  .008011  I  .1351788  .0002710  1.9877 0.1916  P    37.566     .500    -1.207     .300  -.028000   .332000   .1343000      .000      .000  
+73 8 9 41903.00 I  -.049566  .014660   .335801  .007393  I  .1332063  .0002710  1.9680 0.1916  P    37.487     .500    -1.200     .300  -.027000   .333000   .1319000      .000      .000  
+73 810 41904.00 I  -.048009  .013814   .336158  .003430  I  .1312213  .0002710  2.0127 0.1432  P    37.412     .500    -1.241     .300  -.025000   .334000   .1294000      .000      .000  
+73 811 41905.00 I  -.046418  .020502   .336495  .003133  I  .1291610  .0000927  2.1172 0.1747  P    37.363     .500    -1.248     .300  -.023000   .334000   .1269000      .000      .000  
+73 812 41906.00 I  -.044793  .023132   .336814  .003291  I  .1269711  .0002206  2.2690 0.1196  P    37.300     .500    -1.156     .300  -.022000   .335000   .1244000      .000      .000  
+73 813 41907.00 I  -.043138  .020037   .337117  .003063  I  .1246142  .0002206  2.4472 0.1660  P    37.253     .500    -1.025     .300  -.020000   .336000   .1219000      .000      .000  
+73 814 41908.00 I  -.041457  .020744   .337408  .003419  I  .1220762  .0002482  2.6269 0.1660  P    37.235     .500     -.981     .300  -.019000   .336000   .1194000      .000      .000  
+73 815 41909.00 I  -.039753  .019112   .337689  .006789  I  .1193688  .0002482  2.7814 0.1653  P    37.148     .500    -1.064     .300  -.017000   .337000   .1169000      .000      .000  
+73 816 41910.00 I  -.038027  .020655   .337962  .007263  I  .1165303  .0002183  2.8853 0.1749  P    36.897     .500    -1.202     .300  -.016000   .337000   .1144000      .000      .000  
+73 817 41911.00 I  -.036279  .018781   .338231  .008496  I  .1136211  .0002464  2.9204 0.1536  P    36.550     .500    -1.292     .300  -.014000   .337000   .1118000      .000      .000  
+73 818 41912.00 I  -.034509  .010034   .338497  .009743  I  .1107146  .0002161  2.8803 0.1639  P    36.278     .500    -1.285     .300  -.013000   .338000   .1093000      .000      .000  
+73 819 41913.00 I  -.032716  .010358   .338764  .015201  I  .1078820  .0002161  2.7757 0.5275  P    36.167     .500    -1.206     .300  -.011000   .338000   .1067000      .000      .000  
+73 820 41914.00 I  -.030904  .011949   .339034  .017505  I  .1051753  .0010326  2.6347 0.4683  P    36.149     .500    -1.113     .300  -.010000   .338000   .1042000      .000      .000  
+73 821 41915.00 I  -.029072  .010447   .339312  .024151  I  .1026111  .0009113  2.4982 0.7598  P    36.119     .500    -1.077     .300  -.009000   .338000   .1016000      .000      .000  
+73 822 41916.00 I  -.027225  .009422   .339599  .026980  I  .1001622  .0011148  2.4117 0.7199  P    36.066     .500    -1.158     .300  -.007000   .338000   .0990000      .000      .000  
+73 823 41917.00 I  -.025364  .008885   .339898  .024179  I  .0977587  .0011148  2.4123 0.7883  P    36.072     .500    -1.377     .300  -.006000   .339000   .0965000      .000      .000  
+73 824 41918.00 I  -.023491  .007846   .340210  .027130  I  .0953036  .0011148  2.5151 0.7883  P    36.178     .500    -1.657     .300  -.004000   .339000   .0939000      .000      .000  
+73 825 41919.00 I  -.021609  .006916   .340534  .023659  I  .0926991  .0011148  2.7061 0.6328  P    36.302     .500    -1.839     .300  -.003000   .339000   .0913000      .000      .000  
+73 826 41920.00 I  -.019719  .004628   .340866  .023091  I  .0898766  .0005990  2.9415 0.5736  P    36.331     .500    -1.793     .300  -.002000   .339000   .0887000      .000      .000  
+73 827 41921.00 I  -.017823  .009660   .341204  .020004  I  .0868220  .0002710  3.1591 0.3287  P    36.274     .500    -1.543     .300  -.001000   .339000   .0860000      .000      .000  
+73 828 41922.00 I  -.015923  .011031   .341546  .007889  I  .0835842  .0002710  3.2991 0.1916  P    36.251     .500    -1.253     .300   .000000   .339000   .0834000      .000      .000  
+73 829 41923.00 I  -.014024  .013022   .341889  .007631  I  .0802614  .0002710  3.3262 0.1916  P    36.267     .500    -1.065     .300   .001000   .339000   .0807000      .000      .000  
+73 830 41924.00 I  -.012126  .014478   .342230  .005104  I  .0769694  .0002710  3.2406 0.1916  P    36.134     .500     -.987     .300   .003000   .340000   .0781000      .000      .000  
+73 831 41925.00 I  -.010233  .012716   .342570  .006431  I  .0738075  .0002710  3.0733 0.1916  P    35.708     .500     -.958     .300   .004000   .340000   .0754000      .000      .000  
+73 9 1 41926.00 I  -.008345  .014608   .342904  .006697  I  .0708351  .0002710  2.8693 0.3603  P    35.162     .500     -.955     .300   .005000   .340000   .0727000      .000      .000  
+73 9 2 41927.00 I  -.006462  .019669   .343233  .006730  I  .0680673  .0006676  2.6701 0.3603  P    34.859     .500     -.990     .300   .006000   .340000   .0699000      .000      .000  
+73 9 3 41928.00 I  -.004582  .020318   .343554  .007748  I  .0654838  .0006676  2.5044 0.4181  P    34.981     .500    -1.038     .300   .007000   .340000   .0672000      .000      .000  
+73 9 4 41929.00 I  -.002703  .017699   .343867  .007243  I  .0630419  .0005035  2.3887 0.4181  P    35.383     .500    -1.053     .300   .008000   .340000   .0645000      .000      .000  
+73 9 5 41930.00 I  -.000823  .017699   .344170  .007386  I  .0606870  .0005035  2.3314 0.4917  P    35.812     .500    -1.041     .300   .010000   .340000   .0617000      .000      .000  
+73 9 6 41931.00 I   .001061  .015526   .344464  .014265  I  .0583584  .0008448  2.3363 0.4621  P    36.129     .500    -1.055     .300   .011000   .340000   .0589000      .000      .000  
+73 9 7 41932.00 I   .002946  .017760   .344750  .015563  I  .0559943  .0007750  2.4016 0.5844  P    36.294     .500    -1.103     .300   .013000   .341000   .0561000      .000      .000  
+73 9 8 41933.00 I   .004833  .015493   .345026  .013573  I  .0535381  .0008076  2.5182 0.5597  P    36.287     .500    -1.135     .300   .015000   .341000   .0533000      .000      .000  
+73 9 9 41934.00 I   .006719  .004197   .345293  .015169  I  .0509461  .0008076  2.6702 0.6324  P    36.140     .500    -1.123     .300   .017000   .341000   .0505000      .000      .000  
+73 910 41935.00 I   .008606  .003692   .345551  .013815  I  .0481927  .0009735  2.8370 0.6324  P    35.984     .500    -1.115     .300   .018000   .341000   .0476000      .000      .000  
+73 911 41936.00 I   .010491  .003652   .345797  .015639  I  .0452758  .0009735  2.9925 0.5498  P    35.929     .500    -1.153     .300   .020000   .341000   .0447000      .000      .000  
+73 912 41937.00 I   .012375  .007163   .346029  .016450  I  .0422207  .0005113  3.1088 0.5053  P    35.930     .500    -1.203     .300   .022000   .342000   .0418000      .000      .000  
+73 913 41938.00 I   .014258  .007764   .346244  .012001  I  .0390798  .0002710  3.1602 0.3320  P    35.836     .500    -1.194     .300   .023000   .342000   .0389000      .000      .000  
+73 914 41939.00 I   .016138  .006751   .346440  .011191  I  .0359271  .0004237  3.1313 0.3320  P    35.575     .500    -1.110     .300   .025000   .342000   .0360000      .000      .000  
+73 915 41940.00 I   .018015  .007492   .346613  .012790  I  .0328428  .0006062  3.0258 0.3698  P    35.255     .500     -.996     .300   .027000   .342000   .0331000      .000      .000  
+73 916 41941.00 I   .019888  .014443   .346762  .012607  I  .0298925  .0006062  2.8694 0.4286  P    35.063     .500     -.901     .300   .028000   .343000   .0301000      .000      .000  
+73 917 41942.00 I   .021754  .016660   .346884  .013693  I  .0271064  .0006062  2.7058 0.4286  P    35.106     .500     -.851     .300   .030000   .343000   .0272000      .000      .000  
+73 918 41943.00 I   .023611  .015938   .346978  .012071  I  .0244669  .0006062  2.5841 0.4286  P    35.349     .500     -.862     .300   .031000   .344000   .0242000      .000      .000  
+73 919 41944.00 I   .025456  .016842   .347042  .008835  I  .0219114  .0006062  2.5428 0.4803  P    35.671     .500     -.950     .300   .033000   .344000   .0213000      .000      .000  
+73 920 41945.00 I   .027289  .015226   .347074  .009369  I  .0193484  .0007452  2.6000 0.3320  P    35.952     .500    -1.113     .300   .035000   .344000   .0183000      .000      .000  
+73 921 41946.00 I   .029108  .017568   .347072  .009699  I  .0166814  .0002710  2.7470 0.3965  P    36.134     .500    -1.315     .300   .036000   .345000   .0153000      .000      .000  
+73 922 41947.00 I   .030916  .015327   .347036  .010335  I  .0138355  .0002710  2.9505 0.1916  P    36.213     .500    -1.471     .300   .038000   .345000   .0123000      .000      .000  
+73 923 41948.00 I   .032711  .009551   .346966  .009700  I  .0107781  .0002710  3.1609 0.1916  P    36.226     .500    -1.476     .300   .039000   .346000   .0093000      .000      .000  
+73 924 41949.00 I   .034492  .008391   .346860  .011018  I  .0075291  .0002710  3.3253 0.1916  P    36.225     .500    -1.273     .300   .041000   .346000   .0063000      .000      .000  
+73 925 41950.00 I   .036259  .005722   .346719  .012453  I  .0041565  .0002710  3.4029 0.1916  P    36.241     .500     -.933     .300   .042000   .346000   .0033000      .000      .000  
+73 926 41951.00 I   .038008  .005853   .346543  .013390  I  .0007577  .0002710  3.3773 0.1916  P    36.243     .500     -.625     .300   .044000   .346000   .0002000      .000      .000  
+73 927 41952.00 I   .039739  .004493   .346333  .014145  I -.0025677  .0002710  3.2604 0.1916  P    36.159     .500     -.491     .300   .045000   .347000  -.0028000      .000      .000  
+73 928 41953.00 I   .041450  .011754   .346086  .014431  I -.0057439  .0002710  3.0858 0.1916  P    35.950     .500     -.542     .300   .047000   .347000  -.0059000      .000      .000  
+73 929 41954.00 I   .043140  .013403   .345801  .015144  I -.0087342  .0002710  2.8958 0.1916  P    35.683     .500     -.681     .300   .048000   .347000  -.0089000      .000      .000  
+73 930 41955.00 I   .044808  .012719   .345476  .014070  I -.0115428  .0002710  2.7276 0.1916  P    35.517     .500     -.796     .300   .049000   .347000  -.0120000      .000      .000  
+7310 1 41956.00 I   .046453  .014596   .345111  .014007  I -.0142048  .0002710  2.6057 0.1916  P    35.609     .500     -.833     .300   .051000   .347000  -.0151000      .000      .000  
+7310 2 41957.00 I   .048076  .018419   .344705  .012204  I -.0167739  .0002710  2.5431 0.1916  P    36.017     .500     -.814     .300   .052000   .348000  -.0181000      .000      .000  
+7310 3 41958.00 I   .049673  .020963   .344259  .010706  I -.0193120  .0002710  2.5437 0.1916  P    36.629     .500     -.805     .300   .054000   .348000  -.0212000      .000      .000  
+7310 4 41959.00 I   .051242  .019970   .343773  .016288  I -.0218818  .0002710  2.6058 0.1916  P    37.213     .500     -.849     .300   .055000   .348000  -.0243000      .000      .000  
+7310 5 41960.00 I   .052777  .024885   .343248  .021259  I -.0245414  .0002710  2.7215 0.1916  P    37.556     .500     -.911     .300   .057000   .348000  -.0274000      .000      .000  
+7310 6 41961.00 I   .054276  .023456   .342684  .023115  I -.0273383  .0002710  2.8779 0.1916  P    37.600     .500     -.920     .300   .058000   .348000  -.0305000      .000      .000  
+7310 7 41962.00 I   .055736  .021473   .342080  .022267  I -.0303046  .0002710  3.0567 0.1916  P    37.446     .500     -.881     .300   .060000   .347000  -.0336000      .000      .000  
+7310 8 41963.00 I   .057156  .020400   .341436  .021453  I -.0334515  .0002710  3.2351 0.1916  P    37.245     .500     -.885     .300   .061000   .347000  -.0367000      .000      .000  
+7310 9 41964.00 I   .058539  .017609   .340754  .020681  I -.0367661  .0002710  3.3876 0.1916  P    37.102     .500     -.977     .300   .063000   .347000  -.0398000      .000      .000  
+731010 41965.00 I   .059888  .017199   .340035  .024914  I -.0402090  .0002710  3.4871 0.3006  P    37.042     .500    -1.063     .300   .065000   .347000  -.0429000      .000      .000  
+731011 41966.00 I   .061203  .018154   .339282  .022836  I -.0437149  .0005367  3.5103 0.3006  P    37.031     .500    -1.003     .300   .066000   .347000  -.0460000      .000      .000  
+731012 41967.00 I   .062488  .013776   .338497  .020474  I -.0472011  .0005367  3.4479 0.3293  P    37.007     .500     -.791     .300   .068000   .346000  -.0492000      .000      .000  
+731013 41968.00 I   .063742  .014686   .337684  .025127  I -.0505867  .0003817  3.3136 0.3293  P    36.954     .500     -.561     .300   .069000   .346000  -.0523000      .000      .000  
+731014 41969.00 I   .064969  .015228   .336845  .025892  I -.0538171  .0003817  3.1459 0.3118  P    36.937     .500     -.429     .300   .071000   .346000  -.0554000      .000      .000  
+731015 41970.00 I   .066169  .018441   .335980  .025066  I -.0568853  .0004931  2.9987 0.3239  P    37.043     .500     -.391     .300   .072000   .346000  -.0586000      .000      .000  
+731016 41971.00 I   .067343  .019432   .335085  .026019  I -.0598382  .0005235  2.9225 0.3539  P    37.283     .500     -.383     .300   .074000   .345000  -.0618000      .000      .000  
+731017 41972.00 I   .068487  .019507   .334159  .024326  I -.0627630  .0005078  2.9444 0.3950  P    37.574     .500     -.385     .300   .075000   .345000  -.0650000      .000      .000  
+731018 41973.00 I   .069599  .018037   .333202  .025205  I -.0657581  .0005916  3.0595 0.4113  P    37.828     .500     -.427     .300   .077000   .344000  -.0682000      .000      .000  
+731019 41974.00 I   .070676  .018253   .332213  .026705  I -.0689022  .0006471  3.2354 0.4384  P    38.023     .500     -.522     .300   .078000   .344000  -.0714000      .000      .000  
+731020 41975.00 I   .071714  .017726   .331195  .018646  I -.0722334  .0006471  3.4250 0.4562  P    38.185     .500     -.620     .300   .079000   .343000  -.0746000      .000      .000  
+731021 41976.00 I   .072709  .018911   .330147  .019479  I -.0757409  .0006433  3.5806 0.4605  P    38.342     .500     -.634     .300   .081000   .343000  -.0779000      .000      .000  
+731022 41977.00 I   .073660  .017522   .329075  .019560  I -.0793711  .0006554  3.6657 0.4865  P    38.486     .500     -.494     .300   .082000   .342000  -.0811000      .000      .000  
+731023 41978.00 I   .074564  .018102   .327981  .021186  I -.0830434  .0007299  3.6640 0.4405  P    38.559     .500     -.216     .300   .084000   .342000  -.0844000      .000      .000  
+731024 41979.00 I   .075421  .018676   .326871  .008742  I -.0866712  .0005887  3.5787 0.3893  P    38.511     .500      .080     .300   .085000   .341000  -.0876000      .000      .000  
+731025 41980.00 I   .076229  .021565   .325751  .006749  I -.0901797  .0002710  3.4303 0.3240  P    38.369     .500      .243     .300   .086000   .340000  -.0909000      .000      .000  
+731026 41981.00 I   .076990  .019107   .324625  .017092  I -.0935217  .0002710  3.2517 0.1916  P    38.235     .500      .206     .300   .088000   .339000  -.0941000      .000      .000  
+731027 41982.00 I   .077706  .020657   .323499  .018931  I -.0966847  .0002710  3.0779 0.1916  P    38.179     .500      .031     .300   .089000   .339000  -.0974000      .000      .000  
+731028 41983.00 I   .078381  .018058   .322377  .018836  I -.0996889  .0002710  2.9383 0.1916  P    38.212     .500     -.141     .300   .091000   .338000  -.1006000      .000      .000  
+731029 41984.00 I   .079016  .011901   .321265  .021443  I -.1025792  .0002710  2.8522 0.1916  P    38.373     .500     -.207     .300   .092000   .337000  -.1039000      .000      .000  
+731030 41985.00 I   .079614  .010319   .320168  .018574  I -.1054139  .0002710  2.8278 0.1916  P    38.756     .500     -.167     .300   .093000   .336000  -.1072000      .000      .000  
+731031 41986.00 I   .080175  .005485   .319086  .021421  I -.1082551  .0002710  2.8645 0.1916  P    39.353     .500     -.103     .300   .095000   .335000  -.1105000      .000      .000  
+7311 1 41987.00 I   .080703  .006708   .318022  .018887  I -.1111607  .0002710  2.9548 0.1916  P    39.940     .500     -.083     .300   .096000   .335000  -.1139000      .000      .000  
+7311 2 41988.00 I   .081201  .006187   .316975  .011474  I -.1141787  .0002710  3.0870 0.1916  P    40.252     .500     -.079     .300   .098000   .334000  -.1172000      .000      .000  
+7311 3 41989.00 I   .081671  .010329   .315947  .010024  I -.1173433  .0002710  3.2450 0.2907  P    40.248     .500     -.008     .300   .099000   .333000  -.1205000      .000      .000  
+7311 4 41990.00 I   .082118  .011584   .314936  .004394  I -.1206712  .0005143  3.4103 0.2538  P    40.092     .500      .127     .300   .100000   .332000  -.1238000      .000      .000  
+7311 5 41991.00 I   .082543  .010808   .313944  .007728  I -.1241596  .0004293  3.5625 0.3350  P    39.917     .500      .188     .300   .101000   .331000  -.1271000      .000      .000  
+7311 6 41992.00 I   .082951  .012467   .312970  .008912  I -.1277842  .0004293  3.6787 0.3854  P    39.731     .500      .072     .300   .101000   .330000  -.1305000      .000      .000  
+7311 7 41993.00 I   .083347  .014222   .312016  .009978  I -.1314973  .0006403  3.7357 0.3854  P    39.552     .500     -.116     .300   .102000   .329000  -.1338000      .000      .000  
+7311 8 41994.00 I   .083732  .015484   .311082  .010767  I -.1352296  .0006403  3.7148 0.4528  P    39.482     .500     -.147     .300   .103000   .328000  -.1371000      .000      .000  
+7311 9 41995.00 I   .084109  .013649   .310169  .009652  I -.1389005  .0006403  3.6146 0.4348  P    39.596     .500      .060     .300   .104000   .326000  -.1404000      .000      .000  
+731110 41996.00 I   .084479  .012018   .309275  .011041  I -.1424400  .0005883  3.4579 0.4872  P    39.861     .500      .336     .300   .105000   .325000  -.1437000      .000      .000  
+731111 41997.00 I   .084843  .016474   .308399  .010225  I -.1458132  .0007344  3.2918 0.4705  P    40.194     .500      .487     .300   .105000   .324000  -.1470000      .000      .000  
+731112 41998.00 I   .085205  .018447   .307541  .008893  I -.1490397  .0007344  3.1738 0.4760  P    40.509     .500      .512     .300   .106000   .323000  -.1503000      .000      .000  
+731113 41999.00 I   .085567  .016377   .306698  .017613  I -.1521912  .0006057  3.1469 0.4760  P    40.699     .500      .533     .300   .107000   .322000  -.1536000      .000      .000  
+731114 42000.00 I   .085934  .015599   .305868  .018983  I -.1553673  .0006057  3.2212 0.4283  P    40.689     .500      .589     .300   .108000   .321000  -.1569000      .000      .000  
+731115 42001.00 I   .086310  .014034   .305050  .020813  I -.1586579  .0006057  3.3683 0.4692  P    40.555     .500      .593     .300   .108000   .320000  -.1603000      .000      .000  
+731116 42002.00 I   .086696  .015936   .304242  .023860  I -.1621106  .0007168  3.5353 0.4215  P    40.495     .500      .499     .300   .109000   .318000  -.1636000      .000      .000  
+731117 42003.00 I   .087092  .013880   .303442  .021493  I -.1657170  .0005864  3.6676 0.4631  P    40.625     .500      .398     .300   .109000   .317000  -.1670000      .000      .000  
+731118 42004.00 I   .087500  .006283   .302650  .024463  I -.1694219  .0005864  3.7280 0.3230  P    40.870     .500      .418     .300   .110000   .316000  -.1703000      .000      .000  
+731119 42005.00 I   .087923  .005441   .301867  .023066  I -.1731446  .0002710  3.7030 0.3230  P    41.069     .500      .588     .300   .110000   .315000  -.1736000      .000      .000  
+731120 42006.00 I   .088360  .004710   .301092  .019360  I -.1768022  .0002710  3.6008 0.1916  P    41.114     .500      .828     .300   .111000   .314000  -.1768000      .000      .000  
+731121 42007.00 I   .088813  .014519   .300322  .016766  I -.1803275  .0002710  3.4424 0.1916  P    40.995     .500     1.040     .300   .111000   .312000  -.1801000      .000      .000  
+731122 42008.00 I   .089282  .016180   .299559  .012552  I -.1836772  .0002710  3.2544 0.1916  P    40.787     .500     1.161     .300   .112000   .311000  -.1833000      .000      .000  
+731123 42009.00 I   .089767  .014146   .298800  .011093  I -.1868358  .0002710  3.0648 0.1916  P    40.620     .500     1.162     .300   .112000   .310000  -.1866000      .000      .000  
+731124 42010.00 I   .090270  .016245   .298044  .010837  I -.1898150  .0002710  2.8998 0.1916  P    40.598     .500     1.053     .300   .113000   .309000  -.1898000      .000      .000  
+731125 42011.00 I   .090789  .014532   .297288  .009837  I -.1926504  .0002710  2.7800 0.1916  P    40.715     .500      .905     .300   .113000   .308000  -.1930000      .000      .000  
+731126 42012.00 I   .091322  .016780   .296531  .004253  I -.1953941  .0002710  2.7177 0.1916  P    40.934     .500      .829     .300   .114000   .307000  -.1963000      .000      .000  
+731127 42013.00 I   .091866  .014929   .295769  .005106  I -.1981060  .0002710  2.7160 0.1916  P    41.279     .500      .889     .300   .114000   .306000  -.1995000      .000      .000  
+731128 42014.00 I   .092419  .006188   .295002  .005895  I -.2008443  .0002710  2.7689 0.1916  P    41.744     .500     1.032     .300   .115000   .305000  -.2027000      .000      .000  
+731129 42015.00 I   .092978  .006391   .294225  .005109  I -.2036580  .0002710  2.8644 0.1916  P    42.157     .500     1.153     .300   .116000   .303000  -.2059000      .000      .000  
+731130 42016.00 I   .093541  .007031   .293436  .005320  I -.2065818  .0002710  2.9861 0.1916  P    42.298     .500     1.218     .300   .116000   .302000  -.2090000      .000      .000  
+7312 1 42017.00 I   .094106  .009172   .292631  .005126  I -.2096332  .0002710  3.1166 0.1916  P    42.167     .500     1.301     .300   .117000   .301000  -.2122000      .000      .000  
+7312 2 42018.00 I   .094671  .009720   .291809  .004844  I -.2128122  .0002710  3.2385 0.3071  P    41.979     .500     1.442     .300   .117000   .300000  -.2153000      .000      .000  
+7312 3 42019.00 I   .095233  .009484   .290966  .005468  I -.2161014  .0005511  3.3340 0.3071  P    41.860     .500     1.532     .300   .118000   .299000  -.2185000      .000      .000  
+7312 4 42020.00 I   .095789  .010215   .290100  .004816  I -.2194657  .0005511  3.3858 0.3656  P    41.731     .500     1.430     .300   .119000   .298000  -.2217000      .000      .000  
+7312 5 42021.00 I   .096336  .008982   .289208  .010398  I -.2228531  .0004805  3.3777 0.3634  P    41.515     .500     1.201     .300   .120000   .296000  -.2248000      .000      .000  
+7312 6 42022.00 I   .096871  .009560   .288288  .012004  I -.2261984  .0004739  3.3013 0.3374  P    41.311     .500     1.094     .300   .120000   .295000  -.2280000      .000      .000  
+7312 7 42023.00 I   .097393  .011093   .287336  .010844  I -.2294359  .0004739  3.1654 0.4072  P    41.281     .500     1.245     .300   .121000   .293000  -.2311000      .000      .000  
+7312 8 42024.00 I   .097902  .010067   .286351  .012250  I -.2325201  .0006623  3.0022 0.4372  P    41.489     .500     1.491     .300   .122000   .292000  -.2343000      .000      .000  
+7312 9 42025.00 I   .098396  .008771   .285330  .012807  I -.2354485  .0007348  2.8637 0.4946  P    41.900     .500     1.585     .300   .123000   .291000  -.2374000      .000      .000  
+731210 42026.00 I   .098876  .008782   .284272  .014222  I -.2382734  .0007348  2.8029 0.5603  P    42.391     .500     1.508     .300   .124000   .289000  -.2405000      .000      .000  
+731211 42027.00 I   .099341  .012400   .283177  .020406  I -.2410897  .0008460  2.8481 0.7522  P    42.740     .500     1.444     .300   .124000   .288000  -.2436000      .000      .000  
+731212 42028.00 I   .099789  .014205   .282043  .020838  I -.2440007  .0013128  2.9865 0.7558  P    42.751     .500     1.474     .300   .125000   .286000  -.2467000      .000      .000  
+731213 42029.00 I   .100218  .012509   .280870  .021160  I -.2470769  .0012528  3.1677 0.7808  P    42.499     .500     1.469     .300   .126000   .285000  -.2498000      .000      .000  
+731214 42030.00 I   .100626  .011661   .279656  .024172  I -.2503280  .0008456  3.3248 0.7557  P    42.301     .500     1.330     .300   .127000   .283000  -.2528000      .000      .000  
+731215 42031.00 I   .101013  .015848   .278397  .021122  I -.2537002  .0008456  3.4030 0.5979  P    42.358     .500     1.184     .300   .127000   .282000  -.2558000      .000      .000  
+731216 42032.00 I   .101377  .018266   .277095  .022939  I -.2570999  .0008456  3.3791 0.5979  P    42.537     .500     1.228     .300   .128000   .280000  -.2589000      .000      .000  
+731217 42033.00 I   .101720  .016975   .275751  .021608  I -.2604279  .0008456  3.2639 0.5979  P    42.603     .500     1.462     .300   .128000   .279000  -.2619000      .000      .000  
+731218 42034.00 I   .102043  .016009   .274366  .016421  I -.2636073  .0008456  3.0877 0.4271  P    42.509     .500     1.696     .300   .129000   .277000  -.2649000      .000      .000  
+731219 42035.00 I   .102347  .014896   .272944  .016593  I -.2665943  .0001206  2.8847 0.4440  P    42.350     .500     1.793     .300   .129000   .275000  -.2678000      .000      .000  
+731220 42036.00 I   .102630  .017000   .271487  .014296  I -.2693777  .0002710  2.6847 0.1483  P    42.178     .500     1.784     .300   .130000   .274000  -.2708000      .000      .000  
+731221 42037.00 I   .102890  .015245   .270000  .017143  I -.2719721  .0002710  2.5099 0.1916  P    42.000     .500     1.749     .300   .130000   .272000  -.2737000      .000      .000  
+731222 42038.00 I   .103124  .010535   .268487  .019527  I -.2744117  .0002710  2.3775 0.1916  P    41.879     .500     1.690     .300   .131000   .271000  -.2767000      .000      .000  
+731223 42039.00 I   .103328  .009394   .266952  .017178  I -.2767452  .0002710  2.2993 0.1916  P    41.897     .500     1.591     .300   .131000   .269000  -.2796000      .000      .000  
+731224 42040.00 I   .103502  .008193   .265400  .017236  I -.2790302  .0002710  2.2810 0.1916  P    42.071     .500     1.522     .300   .131000   .267000  -.2823000      .000      .000  
+731225 42041.00 I   .103641  .007382   .263832  .015412  I -.2813262  .0002710  2.3199 0.1916  P    42.365     .500     1.587     .300   .131000   .265000  -.2850000      .000      .000  
+731226 42042.00 I   .103746  .005753   .262251  .014806  I -.2836854  .0002710  2.4051 0.1916  P    42.717     .500     1.779     .300   .131000   .263000  -.2876000      .000      .000  
+731227 42043.00 I   .103816  .007123   .260657  .019758  I -.2861463  .0002710  2.5200 0.1916  P    42.993     .500     1.955     .300   .131000   .261000  -.2903000      .000      .000  
+731228 42044.00 I   .103849  .006838   .259051  .018249  I -.2887288  .0002710  2.6451 0.1916  P    43.040     .500     2.006     .300   .131000   .260000  -.2930000      .000      .000  
+731229 42045.00 I   .103845  .006838   .257437  .018249  I -.2914337  .0002710  2.7618 0.1916  P    42.865     .500     1.983     .300   .131000   .258000  -.2952000      .000      .000  
+731230 42046.00 I   .103805  .007755   .255813  .021940  I -.2942442  .0002710  2.8538 0.1916  P    42.663     .500     2.001     .300   .131000   .256000  -.2974000      .000      .000  
+731231 42047.00 I   .103728  .011371   .254183  .021829  I -.2971285  .0002710  2.9073 0.1916  P    42.577     .500     2.053     .300   .131000   .254000  -.2997000      .000      .000  
+74 1 1 42048.00 I   .103613  .013626   .252548  .026179  I  .6999577  .0002710  2.9112 0.1916  P    42.536     .500     2.028     .300   .131000   .252000   .6981000      .000      .000  
+74 1 2 42049.00 I   .103459  .012568   .250912  .023301  I  .6970678  .0002710  2.8589 0.1916  P    42.386     .500     1.917     .300   .131000   .250000   .6959000      .000      .000  
+74 1 3 42050.00 I   .103264  .013605   .249280  .019039  I  .6942575  .0002710  2.7537 0.1916  P    42.104     .500     1.876     .300   .130000   .248000   .6934000      .000      .000  
+74 1 4 42051.00 I   .103028  .012300   .247655  .015546  I  .6915715  .0002710  2.6152 0.1916  P    41.796     .500     2.011     .300   .129000   .246000   .6909000      .000      .000  
+74 1 5 42052.00 I   .102751  .012300   .246038  .015546  I  .6890254  .0002710  2.4818 0.1916  P    41.601     .500     2.176     .300   .129000   .243000   .6885000      .000      .000  
+74 1 6 42053.00 I   .102434  .016881   .244432  .013563  I  .6865897  .0002710  2.4028 0.1916  P    41.651     .500     2.135     .300   .128000   .241000   .6860000      .000      .000  
+74 1 7 42054.00 I   .102077  .017052   .242835  .009469  I  .6841878  .0002710  2.4196 0.1916  P    41.997     .500     1.890     .300   .127000   .239000   .6835000      .000      .000  
+74 1 8 42055.00 I   .101678  .014768   .241249  .009766  I  .6817150  .0002710  2.5430 0.1916  P    42.478     .500     1.691     .300   .126000   .237000   .6807000      .000      .000  
+74 1 9 42056.00 I   .101236  .016019   .239674  .006413  I  .6790766  .0002710  2.7420 0.1916  P    42.808     .500     1.697     .300   .125000   .235000   .6778000      .000      .000  
+74 110 42057.00 I   .100750  .014258   .238110  .011625  I  .6762273  .0002710  2.9521 0.1916  P    42.893     .500     1.772     .300   .125000   .232000   .6750000      .000      .000  
+74 111 42058.00 I   .100222  .015593   .236557  .013423  I  .6731927  .0002710  3.1015 0.1916  P    42.921     .500     1.726     .300   .124000   .230000   .6721000      .000      .000  
+74 112 42059.00 I   .099653  .014280   .235016  .011750  I  .6700606  .0002710  3.1421 0.1916  P    43.036     .500     1.610     .300   .123000   .228000   .6693000      .000      .000  
+74 113 42060.00 I   .099045  .006574   .233489  .013433  I  .6669475  .0002710  3.0656 0.1916  P    43.106     .500     1.629     .300   .122000   .226000   .6666000      .000      .000  
+74 114 42061.00 I   .098399  .006909   .231975  .012772  I  .6639589  .0002710  2.9004 0.1916  P    42.960     .500     1.814     .300   .120000   .224000   .6639000      .000      .000  
+74 115 42062.00 I   .097719  .007977   .230476  .013416  I  .6611611  .0002710  2.6920 0.1916  P    42.702     .500     1.961     .300   .119000   .222000   .6611000      .000      .000  
+74 116 42063.00 I   .097006  .014655   .228990  .012698  I  .6585751  .0002710  2.4830 0.1916  P    42.551     .500     1.913     .300   .118000   .220000   .6584000      .000      .000  
+74 117 42064.00 I   .096261  .016490   .227517  .008714  I  .6561854  .0002710  2.3030 0.1916  P    42.501     .500     1.745     .300   .117000   .218000   .6557000      .000      .000  
+74 118 42065.00 I   .095487  .016116   .226057  .011481  I  .6539538  .0002710  2.1687 0.1916  P    42.372     .500     1.610     .300   .115000   .216000   .6534000      .000      .000  
+74 119 42066.00 I   .094684  .017820   .224609  .013110  I  .6518298  .0002710  2.0890 0.1916  P    42.140     .500     1.530     .300   .114000   .214000   .6511000      .000      .000  
+74 120 42067.00 I   .093852  .019242   .223173  .011397  I  .6497560  .0002710  2.0688 0.1916  P    42.000     .500     1.434     .300   .113000   .212000   .6489000      .000      .000  
+74 121 42068.00 I   .092995  .021755   .221752  .011668  I  .6476724  .0002710  2.1080 0.1916  P    42.095     .500     1.347     .300   .111000   .210000   .6466000      .000      .000  
+74 122 42069.00 I   .092117  .020908   .220345  .012296  I  .6455229  .0002710  2.1986 0.1916  P    42.370     .500     1.385     .300   .110000   .208000   .6443000      .000      .000  
+74 123 42070.00 I   .091222  .018977   .218956  .012906  I  .6432632  .0002710  2.3253 0.1916  P    42.684     .500     1.572     .300   .109000   .207000   .6420000      .000      .000  
+74 124 42071.00 I   .090317  .016800   .217587  .013798  I  .6408669  .0002710  2.4681 0.1916  P    42.926     .500     1.757     .300   .108000   .205000   .6397000      .000      .000  
+74 125 42072.00 I   .089404  .017376   .216242  .012412  I  .6383288  .0002710  2.6054 0.1916  P    43.013     .500     1.775     .300   .106000   .204000   .6375000      .000      .000  
+74 126 42073.00 I   .088485  .015051   .214922  .011651  I  .6356643  .0002710  2.7180 0.1916  P    42.924     .500     1.642     .300   .105000   .202000   .6352000      .000      .000  
+74 127 42074.00 I   .087567  .011222   .213632  .013404  I  .6329062  .0002710  2.7905 0.1916  P    42.756     .500     1.513     .300   .104000   .201000   .6329000      .000      .000  
+74 128 42075.00 I   .086653  .018446   .212376  .011610  I  .6301000  .0002710  2.8129 0.1916  P    42.646     .500     1.491     .300   .103000   .200000   .6302000      .000      .000  
+74 129 42076.00 I   .085750  .018549   .211155  .010691  I  .6272985  .0002710  2.7812 0.1916  P    42.608     .500     1.536     .300   .102000   .198000   .6276000      .000      .000  
+74 130 42077.00 I   .084863  .026563   .209973  .014861  I  .6245540  .0002710  2.7005 0.1715  P    42.526     .500     1.583     .300   .100000   .197000   .6249000      .000      .000  
+74 131 42078.00 I   .083998  .030407   .208833  .014393  I  .6219084  .0002104  2.5873 0.1715  P    42.286     .500     1.647     .300   .099000   .195000   .6223000      .000      .000  
+74 2 1 42079.00 I   .083160  .026385   .207738  .012579  I  .6193803  .0002104  2.4714 0.1488  P    41.889     .500     1.741     .300   .098000   .194000   .6196000      .000      .000  
+74 2 2 42080.00 I   .082351  .030465   .206691  .013566  I  .6169531  .0002104  2.3930 0.1488  P    41.451     .500     1.752     .300   .097000   .193000   .6167000      .000      .000  
+74 2 3 42081.00 I   .081573  .027073   .205695  .015200  I  .6145682  .0002104  2.3930 0.1488  P    41.179     .500     1.531     .300   .096000   .193000   .6139000      .000      .000  
+74 2 4 42082.00 I   .080822  .025486   .204752  .017550  I  .6121330  .0002104  2.4954 0.1488  P    41.248     .500     1.134     .300   .095000   .192000   .6110000      .000      .000  
+74 2 5 42083.00 I   .080096  .022442   .203862  .015936  I  .6095460  .0002104  2.6918 0.1715  P    41.620     .500      .845     .300   .094000   .192000   .6082000      .000      .000  
+74 2 6 42084.00 I   .079390  .008650   .203027  .012589  I  .6067332  .0002710  2.9366 0.1280  P    42.053     .500      .877     .300   .093000   .191000   .6053000      .000      .000  
+74 2 7 42085.00 I   .078702  .009398   .202247  .012669  I  .6036800  .0001457  3.1598 0.1538  P    42.366     .500     1.122     .300   .092000   .190000   .6024000      .000      .000  
+74 2 8 42086.00 I   .078027  .010682   .201524  .014497  I  .6004433  .0001457  3.2939 0.1030  P    42.585     .500     1.301     .300   .091000   .190000   .5996000      .000      .000  
+74 2 9 42087.00 I   .077360  .016646   .200856  .012674  I  .5971340  .0001457  3.3026 0.1030  P    42.752     .500     1.300     .300   .090000   .189000   .5967000      .000      .000  
+74 210 42088.00 I   .076698  .017896   .200241  .009496  I  .5938779  .0001457  3.1920 0.0910  P    42.759     .500     1.237     .300   .089000   .189000   .5939000      .000      .000  
+74 211 42089.00 I   .076036  .015542   .199679  .011080  I  .5907764  .0001091  3.0024 0.0910  P    42.532     .500     1.215     .300   .088000   .188000   .5910000      .000      .000  
+74 212 42090.00 I   .075371  .017324   .199166  .011534  I  .5878817  .0001091  2.7871 0.0601  P    42.258     .500     1.163     .300   .087000   .188000   .5883000      .000      .000  
+74 213 42091.00 I   .074696  .015656   .198701  .010084  I  .5851957  .0000506  2.5912 0.0601  P    42.183     .500      .995     .300   .086000   .187000   .5856000      .000      .000  
+74 214 42092.00 I   .074011  .016848   .198281  .008948  I  .5826839  .0000506  2.4415 0.0358  P    42.254     .500      .768     .300   .086000   .187000   .5830000      .000      .000  
+74 215 42093.00 I   .073312  .017627   .197903  .008805  I  .5802936  .0000506  2.3492 0.0358  P    42.200     .500      .601     .300   .085000   .186000   .5803000      .000      .000  
+74 216 42094.00 I   .072601  .012607   .197565  .009969  I  .5779652  .0000506  2.3177 0.1378  P    41.966     .500      .495     .300   .084000   .186000   .5776000      .000      .000  
+74 217 42095.00 I   .071874  .011069   .197261  .008685  I  .5756383  .0002710  2.3459 0.1378  P    41.819     .500      .369     .300   .083000   .186000   .5750000      .000      .000  
+74 218 42096.00 I   .071131  .012710   .196990  .005202  I  .5732552  .0002710  2.4287 0.1916  P    41.977     .500      .235     .300   .082000   .185000   .5724000      .000      .000  
+74 219 42097.00 I   .070373  .011307   .196746  .005272  I  .5707666  .0002710  2.5544 0.1916  P    42.344     .500      .216     .300   .082000   .185000   .5697000      .000      .000  
+74 220 42098.00 I   .069596  .011991   .196527  .005875  I  .5681383  .0002710  2.7045 0.1916  P    42.693     .500      .359     .300   .081000   .184000   .5671000      .000      .000  
+74 221 42099.00 I   .068798  .010419   .196328  .014712  I  .5653568  .0002710  2.8570 0.1916  P    42.928     .500      .533     .300   .080000   .184000   .5645000      .000      .000  
+74 222 42100.00 I   .067976  .003786   .196145  .016288  I  .5624308  .0002710  2.9898 0.1916  P    43.065     .500      .565     .300   .079000   .184000   .5617000      .000      .000  
+74 223 42101.00 I   .067127  .013875   .195974  .014403  I  .5593901  .0002710  3.0837 0.1916  P    43.098     .500      .431     .300   .078000   .183000   .5589000      .000      .000  
+74 224 42102.00 I   .066248  .015883   .195811  .016595  I  .5562812  .0002710  3.1243 0.1916  P    43.020     .500      .263     .300   .077000   .183000   .5562000      .000      .000  
+74 225 42103.00 I   .065336  .013868   .195653  .014379  I  .5531613  .0002710  3.1056 0.1916  P    42.899     .500      .188     .300   .076000   .182000   .5534000      .000      .000  
+74 226 42104.00 I   .064391  .015732   .195500  .016299  I  .5500884  .0002710  3.0318 0.1916  P    42.814     .500      .218     .300   .076000   .182000   .5506000      .000      .000  
+74 227 42105.00 I   .063408  .015506   .195349  .015008  I  .5471104  .0002710  2.9198 0.1916  P    42.760     .500      .287     .300   .075000   .182000   .5476000      .000      .000  
+74 228 42106.00 I   .062390  .017878   .195202  .006799  I  .5442519  .0002710  2.7986 0.1916  P    42.654     .500      .333     .300   .074000   .181000   .5446000      .000      .000  
+74 3 1 42107.00 I   .061338  .016163   .195056  .007013  I  .5415040  .0002710  2.7050 0.1916  P    42.447     .500      .309     .300   .073000   .181000   .5416000      .000      .000  
+74 3 2 42108.00 I   .060251  .010292   .194913  .007368  I  .5388205  .0002710  2.6756 0.1916  P    42.193     .500      .150     .300   .072000   .180000   .5386000      .000      .000  
+74 3 3 42109.00 I   .059132  .027041   .194771  .018143  I  .5361227  .0002710  2.7367 0.1916  P    42.030     .500     -.189     .300   .071000   .180000   .5356000      .000      .000  
+74 3 4 42110.00 I   .057982  .031158   .194630  .020943  I  .5333157  .0002710  2.8922 0.1916  P    42.079     .500     -.620     .300   .070000   .180000   .5325000      .000      .000  
+74 3 5 42111.00 I   .056803  .038096   .194488  .020943  I  .5303155  .0002710  3.1162 0.1916  P    42.323     .500     -.906     .300   .068000   .180000   .5293000      .000      .000  
+74 3 6 42112.00 I   .055601  .043151   .194343  .024615  I  .5270781  .0002710  3.3558 0.1916  P    42.607     .500     -.845     .300   .067000   .180000   .5262000      .000      .000  
+74 3 7 42113.00 I   .054379  .037704   .194194  .024615  I  .5236205  .0002710  3.5456 0.1916  P    42.798     .500     -.495     .300   .066000   .180000   .5230000      .000      .000  
+74 3 8 42114.00 I   .053147  .043206   .194042  .033967  I  .5200213  .0002710  3.6321 0.1916  P    42.895     .500     -.139     .300   .065000   .180000   .5199000      .000      .000  
+74 3 9 42115.00 I   .051913  .037538   .193888  .024077  I  .5163977  .0002710  3.5942 0.1916  P    42.943     .500     -.023     .300   .063000   .179000   .5166000      .000      .000  
+74 310 42116.00 I   .050682  .031778   .193733  .002379  I  .5128685  .0002710  3.4494 0.1916  P    42.915     .500     -.159     .300   .062000   .179000   .5134000      .000      .000  
+74 311 42117.00 I   .049458  .027521   .193578  .005314  I  .5095191  .0002710  3.2440 0.1916  P    42.797     .500     -.399     .300   .061000   .179000   .5101000      .000      .000  
+74 312 42118.00 I   .048242  .006752   .193426  .005314  I  .5063829  .0002710  3.0313 0.1916  P    42.704     .500     -.623     .300   .059000   .179000   .5069000      .000      .000  
+74 313 42119.00 I   .047038  .013642   .193276  .004602  I  .5034451  .0002710  2.8527 0.1916  P    42.750     .500     -.791     .300   .058000   .179000   .5036000      .000      .000  
+74 314 42120.00 I   .045847  .014652   .193131  .004602  I  .5006586  .0002710  2.7308 0.1916  P    42.845     .500     -.893     .300   .056000   .179000   .5004000      .000      .000  
+74 315 42121.00 I   .044672  .012816   .192991  .004964  I  .4979625  .0002710  2.6719 0.1916  P    42.795     .500     -.943     .300   .055000   .179000   .4972000      .000      .000  
+74 316 42122.00 I   .043517  .014384   .192859  .005565  I  .4952943  .0002710  2.6744 0.1916  P    42.620     .500    -1.011     .300   .053000   .180000   .4940000      .000      .000  
+74 317 42123.00 I   .042385  .015412   .192733  .020190  I  .4925950  .0002710  2.7329 0.1916  P    42.601     .500    -1.158     .300   .052000   .180000   .4908000      .000      .000  
+74 318 42124.00 I   .041274  .017795   .192617  .022947  I  .4898130  .0002710  2.8379 0.1916  P    42.912     .500    -1.331     .300   .050000   .180000   .4876000      .000      .000  
+74 319 42125.00 I   .040185  .017050   .192508  .024768  I  .4869085  .0002710  2.9749 0.1916  P    43.394     .500    -1.393     .300   .048000   .180000   .4846000      .000      .000  
+74 320 42126.00 I   .039119  .013603   .192409  .028558  I  .4838591  .0002710  3.1242 0.1916  P    43.753     .500    -1.298     .300   .047000   .180000   .4815000      .000      .000  
+74 321 42127.00 I   .038076  .011800   .192317  .027239  I  .4806634  .0002710  3.2638 0.1916  P    43.896     .500    -1.153     .300   .045000   .181000   .4785000      .000      .000  
+74 322 42128.00 I   .037057  .013467   .192231  .031267  I  .4773418  .0002710  3.3726 0.1916  P    43.931     .500    -1.099     .300   .044000   .181000   .4754000      .000      .000  
+74 323 42129.00 I   .036067  .013705   .192146  .027163  I  .4739344  .0002710  3.4327 0.1916  P    43.944     .500    -1.155     .300   .042000   .181000   .4724000      .000      .000  
+74 324 42130.00 I   .035104  .011859   .192061  .021708  I  .4704966  .0002710  3.4322 0.1916  P    43.909     .500    -1.236     .300   .040000   .182000   .4695000      .000      .000  
+74 325 42131.00 I   .034171  .010731   .191977  .018931  I  .4670908  .0002710  3.3694 0.1916  P    43.802     .500    -1.277     .300   .039000   .182000   .4666000      .000      .000  
+74 326 42132.00 I   .033267  .009089   .191893  .013656  I  .4637744  .0002710  3.2569 0.1916  P    43.678     .500    -1.290     .300   .037000   .183000   .4636000      .000      .000  
+74 327 42133.00 I   .032395  .008238   .191811  .012197  I  .4605841  .0002710  3.1231 0.1916  P    43.611     .500    -1.327     .300   .036000   .183000   .4607000      .000      .000  
+74 328 42134.00 I   .031552  .009470   .191732  .004136  I  .4575226  .0002710  3.0061 0.1916  P    43.617     .500    -1.415     .300   .034000   .184000   .4578000      .000      .000  
+74 329 42135.00 I   .030738  .009314   .191656  .007292  I  .4545535  .0002710  2.9443 0.1916  P    43.662     .500    -1.559     .300   .032000   .184000   .4549000      .000      .000  
+74 330 42136.00 I   .029953  .006876   .191584  .008136  I  .4516067  .0002710  2.9645 0.1916  P    43.720     .500    -1.767     .300   .031000   .185000   .4520000      .000      .000  
+74 331 42137.00 I   .029197  .005985   .191517  .008342  I  .4485951  .0002710  3.0730 0.1916  P    43.804     .500    -2.037     .300   .029000   .185000   .4491000      .000      .000  
+74 4 1 42138.00 I   .028470  .005907   .191456  .009467  I  .4454372  .0002710  3.2520 0.1916  P    43.947     .500    -2.323     .300   .028000   .186000   .4462000      .000      .000  
+74 4 2 42139.00 I   .027772  .005426   .191399  .008635  I  .4420806  .0002710  3.4624 0.1916  P    44.140     .500    -2.508     .300   .026000   .186000   .4433000      .000      .000  
+74 4 3 42140.00 I   .027104  .005567   .191349  .009764  I  .4385193  .0002710  3.6522 0.1916  P    44.313     .500    -2.462     .300   .024000   .187000   .4404000      .000      .000  
+74 4 4 42141.00 I   .026463  .015459   .191303  .009925  I  .4347997  .0002710  3.7714 0.1916  P    44.379     .500    -2.172     .300   .023000   .187000   .4375000      .000      .000  
+74 4 5 42142.00 I   .025851  .017106   .191261  .008521  I  .4310112  .0002710  3.7866 0.1916  P    44.321     .500    -1.813     .300   .021000   .188000   .4347000      .000      .000  
+74 4 6 42143.00 I   .025266  .014854   .191223  .007498  I  .4272623  .0002710  3.6944 0.1916  P    44.201     .500    -1.636     .300   .020000   .188000   .4318000      .000      .000  
+74 4 7 42144.00 I   .024707  .017135   .191187  .006940  I  .4236496  .0002710  3.5208 0.1916  P    44.112     .500    -1.758     .300   .018000   .189000   .4289000      .000      .000  
+74 4 8 42145.00 I   .024174  .015766   .191153  .013682  I  .4202328  .0002710  3.3111 0.1916  P    44.124     .500    -2.066     .300   .016000   .190000   .4259000      .000      .000  
+74 4 9 42146.00 I   .023660  .018085   .191121  .015486  I  .4170238  .0002710  3.1123 0.1916  P    44.244     .500    -2.336     .300   .015000   .190000   .4229000      .000      .000  
+74 410 42147.00 I   .023163  .018826   .191091  .017114  I  .4139931  .0002710  2.9587 0.1916  P    44.388     .500    -2.424     .300   .013000   .191000   .4199000      .000      .000  
+74 411 42148.00 I   .022678  .013599   .191064  .018829  I  .4110859  .0002710  2.8666 0.1916  P    44.422     .500    -2.349     .300   .012000   .191000   .4169000      .000      .000  
+74 412 42149.00 I   .022199  .014932   .191040  .017408  I  .4082387  .0002710  2.8380 0.1916  P    44.295     .500    -2.249     .300   .010000   .192000   .4139000      .000      .000  
+74 413 42150.00 I   .021724  .017196   .191017  .020043  I  .4053908  .0002710  2.8667 0.1916  P    44.145     .500    -2.268     .300   .009000   .193000   .4106000      .000      .000  
+74 414 42151.00 I   .021250  .018893   .190994  .019873  I  .4024893  .0002710  2.9434 0.1916  P    44.197     .500    -2.435     .300   .008000   .193000   .4074000      .000      .000  
+74 415 42152.00 I   .020770  .020931   .190971  .018032  I  .3994923  .0002710  3.0552 0.1916  P    44.526     .500    -2.632     .300   .006000   .194000   .4041000      .000      .000  
+74 416 42153.00 I   .020280  .018912   .190949  .017368  I  .3963728  .0002710  3.1853 0.1916  P    44.958     .500    -2.704     .300   .005000   .194000   .4009000      .000      .000  
+74 417 42154.00 I   .019776  .018203   .190925  .015858  I  .3931219  .0002710  3.3148 0.1916  P    45.229     .500    -2.623     .300   .004000   .195000   .3976000      .000      .000  
+74 418 42155.00 I   .019254  .023277   .190901  .014414  I  .3897500  .0002710  3.4239 0.1916  P    45.224     .500    -2.516     .300   .003000   .196000   .3941000      .000      .000  
+74 419 42156.00 I   .018715  .024700   .190875  .015083  I  .3862870  .0002710  3.4942 0.1916  P    45.042     .500    -2.495     .300   .002000   .196000   .3906000      .000      .000  
+74 420 42157.00 I   .018156  .021552   .190850  .017211  I  .3827794  .0002710  3.5110 0.1916  P    44.843     .500    -2.528     .300   .000000   .197000   .3872000      .000      .000  
+74 421 42158.00 I   .017577  .020955   .190827  .016434  I  .3792856  .0002710  3.4661 0.1916  P    44.693     .500    -2.507     .300  -.001000   .197000   .3837000      .000      .000  
+74 422 42159.00 I   .016976  .022133   .190808  .014292  I  .3758664  .0002710  3.3637 0.1916  P    44.557     .500    -2.427     .300  -.002000   .198000   .3802000      .000      .000  
+74 423 42160.00 I   .016356  .024787   .190795  .013974  I  .3725704  .0002710  3.2247 0.1916  P    44.413     .500    -2.400     .300  -.003000   .198000   .3767000      .000      .000  
+74 424 42161.00 I   .015719  .021688   .190790  .016509  I  .3694168  .0002710  3.0862 0.1916  P    44.330     .500    -2.516     .300  -.004000   .199000   .3732000      .000      .000  
+74 425 42162.00 I   .015068  .015365   .190796  .018381  I  .3663835  .0002710  2.9912 0.1916  P    44.397     .500    -2.735     .300  -.005000   .199000   .3696000      .000      .000  
+74 426 42163.00 I   .014407  .013327   .190812  .016118  I  .3634087  .0002710  2.9734 0.1916  P    44.612     .500    -2.942     .300  -.006000   .200000   .3661000      .000      .000  
+74 427 42164.00 I   .013735  .015084   .190839  .013376  I  .3604073  .0002710  3.0437 0.1916  P    44.856     .500    -3.060     .300  -.007000   .200000   .3626000      .000      .000  
+74 428 42165.00 I   .013053  .014065   .190877  .012786  I  .3572975  .0002710  3.1853 0.1916  P    45.006     .500    -3.102     .300  -.007000   .200000   .3592000      .000      .000  
+74 429 42166.00 I   .012362  .007053   .190927  .014687  I  .3540256  .0002710  3.3603 0.1916  P    45.051     .500    -3.122     .300  -.008000   .201000   .3558000      .000      .000  
+74 430 42167.00 I   .011662  .011509   .190986  .013042  I  .3505813  .0002710  3.5220 0.1425  P    45.085     .500    -3.140     .300  -.009000   .201000   .3524000      .000      .000  
+74 5 1 42168.00 I   .010954  .012799   .191053  .007661  I  .3470003  .0000881  3.6277 0.1425  P    45.178     .500    -3.110     .300  -.010000   .202000   .3490000      .000      .000  
+74 5 2 42169.00 I   .010240  .018678   .191129  .007753  I  .3433539  .0000881  3.6495 0.0623  P    45.285     .500    -2.968     .300  -.011000   .202000   .3456000      .000      .000  
+74 5 3 42170.00 I   .009519  .021551   .191213  .008464  I  .3397321  .0000881  3.5789 0.0623  P    45.283     .500    -2.742     .300  -.012000   .202000   .3424000      .000      .000  
+74 5 4 42171.00 I   .008791  .021913   .191305  .008412  I  .3362223  .0000881  3.4296 0.0623  P    45.127     .500    -2.576     .300  -.013000   .203000   .3392000      .000      .000  
+74 5 5 42172.00 I   .008058  .024577   .191406  .007435  I  .3328887  .0000881  3.2328 0.0623  P    44.938     .500    -2.611     .300  -.014000   .203000   .3359000      .000      .000  
+74 5 6 42173.00 I   .007323  .021470   .191517  .007172  I  .3297594  .0000881  3.0277 0.1425  P    44.900     .500    -2.829     .300  -.015000   .203000   .3327000      .000      .000  
+74 5 7 42174.00 I   .006592  .022085   .191636  .007583  I  .3268237  .0002710  2.8512 0.1425  P    45.050     .500    -3.057     .300  -.016000   .204000   .3295000      .000      .000  
+74 5 8 42175.00 I   .005869  .019262   .191765  .010305  I  .3240393  .0002710  2.7278 0.1916  P    45.225     .500    -3.122     .300  -.016000   .204000   .3264000      .000      .000  
+74 5 9 42176.00 I   .005159  .013904   .191901  .010960  I  .3213473  .0002710  2.6669 0.1916  P    45.247     .500    -3.008     .300  -.017000   .204000   .3233000      .000      .000  
+74 510 42177.00 I   .004465  .014818   .192046  .010584  I  .3186855  .0002710  2.6660 0.1916  P    45.125     .500    -2.860     .300  -.018000   .204000   .3201000      .000      .000  
+74 511 42178.00 I   .003788  .010815   .192197  .011254  I  .3159986  .0002710  2.7151 0.1916  P    45.019     .500    -2.846     .300  -.019000   .205000   .3170000      .000      .000  
+74 512 42179.00 I   .003132  .011523   .192354  .010429  I  .3132432  .0002710  2.8005 0.1916  P    45.046     .500    -2.998     .300  -.020000   .205000   .3139000      .000      .000  
+74 513 42180.00 I   .002499  .012901   .192516  .011476  I  .3103906  .0002710  2.9068 0.1916  P    45.195     .500    -3.182     .300  -.021000   .205000   .3109000      .000      .000  
+74 514 42181.00 I   .001889  .011268   .192683  .011647  I  .3074284  .0002710  3.0167 0.1916  P    45.385     .500    -3.228     .300  -.021000   .206000   .3079000      .000      .000  
+74 515 42182.00 I   .001303  .012742   .192856  .009837  I  .3043618  .0002710  3.1127 0.1916  P    45.511     .500    -3.119     .300  -.022000   .206000   .3050000      .000      .000  
+74 516 42183.00 I   .000740  .016443   .193037  .009532  I  .3012128  .0002710  3.1791 0.1916  P    45.452     .500    -3.010     .300  -.022000   .206000   .3020000      .000      .000  
+74 517 42184.00 I   .000202  .016157   .193225  .009587  I  .2980181  .0002710  3.2019 0.1916  P    45.147     .500    -3.032     .300  -.023000   .207000   .2990000      .000      .000  
+74 518 42185.00 I  -.000310  .014963   .193423  .008862  I  .2948268  .0002710  3.1711 0.1916  P    44.695     .500    -3.108     .300  -.023000   .207000   .2960000      .000      .000  
+74 519 42186.00 I  -.000794  .015442   .193631  .009292  I  .2916945  .0002710  3.0844 0.1916  P    44.289     .500    -3.055     .300  -.024000   .207000   .2930000      .000      .000  
+74 520 42187.00 I  -.001250  .013655   .193850  .008115  I  .2886731  .0002710  2.9525 0.1916  P    44.030     .500    -2.848     .300  -.024000   .207000   .2900000      .000      .000  
+74 521 42188.00 I  -.001679  .015677   .194079  .006217  I  .2857950  .0002710  2.8040 0.1916  P    43.889     .500    -2.686     .300  -.025000   .208000   .2870000      .000      .000  
+74 522 42189.00 I  -.002080  .014529   .194321  .015539  I  .2830565  .0002710  2.6813 0.1916  P    43.849     .500    -2.760     .300  -.025000   .208000   .2840000      .000      .000  
+74 523 42190.00 I  -.002456  .009128   .194577  .017250  I  .2804098  .0002710  2.6265 0.1916  P    43.978     .500    -3.022     .300  -.025000   .208000   .2810000      .000      .000  
+74 524 42191.00 I  -.002805  .016048   .194845  .017075  I  .2777733  .0002710  2.6625 0.1916  P    44.281     .500    -3.240     .300  -.026000   .209000   .2779000      .000      .000  
+74 525 42192.00 I  -.003130  .017490   .195128  .019389  I  .2750574  .0002710  2.7807 0.1916  P    44.586     .500    -3.251     .300  -.026000   .209000   .2749000      .000      .000  
+74 526 42193.00 I  -.003430  .017449   .195427  .017028  I  .2721975  .0002710  2.9419 0.1916  P    44.673     .500    -3.086     .300  -.026000   .209000   .2718000      .000      .000  
+74 527 42194.00 I  -.003708  .019894   .195744  .019625  I  .2691772  .0002710  3.0922 0.1916  P    44.498     .500    -2.882     .300  -.027000   .210000   .2688000      .000      .000  
+74 528 42195.00 I  -.003966  .017240   .196082  .019346  I  .2660328  .0002710  3.1835 0.1916  P    44.226     .500    -2.737     .300  -.027000   .210000   .2659000      .000      .000  
+74 529 42196.00 I  -.004202  .018990   .196445  .014688  I  .2628389  .0002710  3.1888 0.1916  P    44.069     .500    -2.659     .300  -.027000   .210000   .2630000      .000      .000  
+74 530 42197.00 I  -.004414  .016925   .196839  .019995  I  .2596849  .0002710  3.1052 0.1916  P    44.081     .500    -2.607     .300  -.027000   .210000   .2600000      .000      .000  
+74 531 42198.00 I  -.004600  .011040   .197266  .021022  I  .2566525  .0002710  2.9497 0.1916  P    44.123     .500    -2.544     .300  -.028000   .211000   .2571000      .000      .000  
+74 6 1 42199.00 I  -.004756  .010111   .197730  .018305  I  .2538000  .0002710  2.7507 0.1916  P    44.013     .500    -2.486     .300  -.028000   .211000   .2542000      .000      .000  
+74 6 2 42200.00 I  -.004877  .006021   .198235  .020882  I  .2511548  .0002710  2.5405 0.1916  P    43.737     .500    -2.491     .300  -.028000   .211000   .2515000      .000      .000  
+74 6 3 42201.00 I  -.004960  .010249   .198781  .018236  I  .2487125  .0002710  2.3498 0.1916  P    43.476     .500    -2.592     .300  -.027000   .211000   .2488000      .000      .000  
+74 6 4 42202.00 I  -.005000  .011813   .199370  .018152  I  .2464406  .0002710  2.2030 0.1916  P    43.390     .500    -2.748     .300  -.027000   .212000   .2462000      .000      .000  
+74 6 5 42203.00 I  -.004992  .011720   .200001  .018491  I  .2442871  .0002710  2.1143 0.1916  P    43.438     .500    -2.852     .300  -.027000   .212000   .2435000      .000      .000  
+74 6 6 42204.00 I  -.004932  .012721   .200676  .011772  I  .2421917  .0002710  2.0864 0.1916  P    43.475     .500    -2.829     .300  -.027000   .212000   .2408000      .000      .000  
+74 6 7 42205.00 I  -.004816  .014625   .201393  .017165  I  .2400963  .0002710  2.1123 0.1755  P    43.459     .500    -2.712     .300  -.026000   .212000   .2384000      .000      .000  
+74 6 8 42206.00 I  -.004643  .016455   .202153  .019698  I  .2379537  .0002230  2.1782 0.2303  P    43.439     .500    -2.624     .300  -.026000   .212000   .2359000      .000      .000  
+74 6 9 42207.00 I  -.004410  .022004   .202956  .018278  I  .2357321  .0003724  2.2674 0.2236  P    43.400     .500    -2.659     .300  -.026000   .213000   .2335000      .000      .000  
+74 610 42208.00 I  -.004117  .023275   .203801  .020931  I  .2334170  .0003877  2.3623 0.2688  P    43.285     .500    -2.770     .300  -.025000   .213000   .2310000      .000      .000  
+74 611 42209.00 I  -.003764  .020291   .204685  .026681  I  .2310113  .0003877  2.4459 0.2741  P    43.153     .500    -2.811     .300  -.025000   .213000   .2286000      .000      .000  
+74 612 42210.00 I  -.003348  .021673   .205605  .025030  I  .2285338  .0003877  2.5038 0.2741  P    43.119     .500    -2.716     .300  -.024000   .213000   .2264000      .000      .000  
+74 613 42211.00 I  -.002866  .019413   .206557  .022434  I  .2260158  .0003877  2.5254 0.2962  P    43.109     .500    -2.602     .300  -.024000   .213000   .2242000      .000      .000  
+74 614 42212.00 I  -.002321  .021726   .207536  .023739  I  .2234977  .0004478  2.5030 0.2845  P    42.864     .500    -2.623     .300  -.023000   .214000   .2220000      .000      .000  
+74 615 42213.00 I  -.001713  .025217   .208538  .021821  I  .2210256  .0004166  2.4333 0.2617  P    42.283     .500    -2.735     .300  -.023000   .214000   .2198000      .000      .000  
+74 616 42214.00 I  -.001045  .021277   .209555  .023255  I  .2186454  .0002710  2.3207 0.2485  P    41.601     .500    -2.723     .300  -.022000   .214000   .2176000      .000      .000  
+74 617 42215.00 I  -.000315  .019995   .210579  .026815  I  .2163925  .0002710  2.1832 0.1916  P    41.133     .500    -2.496     .300  -.021000   .214000   .2155000      .000      .000  
+74 618 42216.00 I   .000476  .022788   .211604  .023660  I  .2142759  .0002710  2.0550 0.1916  P    40.981     .500    -2.251     .300  -.021000   .214000   .2135000      .000      .000  
+74 619 42217.00 I   .001331  .021696   .212624  .024142  I  .2122651  .0002710  1.9791 0.1916  P    41.067     .500    -2.249     .300  -.020000   .215000   .2114000      .000      .000  
+74 620 42218.00 I   .002251  .021628   .213636  .026501  I  .2102885  .0002710  1.9910 0.1916  P    41.313     .500    -2.484     .300  -.020000   .215000   .2094000      .000      .000  
+74 621 42219.00 I   .003234  .018701   .214635  .023710  I  .2082511  .0002710  2.0991 0.1916  P    41.637     .500    -2.689     .300  -.019000   .215000   .2073000      .000      .000  
+74 622 42220.00 I   .004277  .013963   .215616  .024857  I  .2060678  .0002710  2.2747 0.1916  P    41.876     .500    -2.659     .300  -.018000   .215000   .2053000      .000      .000  
+74 623 42221.00 I   .005373  .013889   .216573  .029033  I  .2036984  .0002710  2.4600 0.1916  P    41.859     .500    -2.437     .300  -.017000   .215000   .2032000      .000      .000  
+74 624 42222.00 I   .006518  .015027   .217503  .027734  I  .2011655  .0002710  2.5921 0.1916  P    41.552     .500    -2.187     .300  -.016000   .215000   .2012000      .000      .000  
+74 625 42223.00 I   .007703  .010841   .218405  .026756  I  .1985464  .0002710  2.6277 0.1416  P    41.071     .500    -1.986     .300  -.015000   .215000   .1991000      .000      .000  
+74 626 42224.00 I   .008924  .015788   .219276  .027568  I  .1959452  .0000821  2.5579 0.1788  P    40.592     .500    -1.838     .300  -.014000   .216000   .1971000      .000      .000  
+74 627 42225.00 I   .010171  .016579   .220115  .025758  I  .1934584  .0002334  2.4047 0.1237  P    40.266     .500    -1.767     .300  -.013000   .216000   .1951000      .000      .000  
+74 628 42226.00 I   .011437  .016493   .220919  .027148  I  .1911510  .0002334  2.2059 0.1817  P    40.148     .500    -1.819     .300  -.012000   .216000   .1930000      .000      .000  
+74 629 42227.00 I   .012711  .015665   .221686  .026593  I  .1890489  .0002785  2.0003 0.1817  P    40.115     .500    -1.959     .300  -.011000   .216000   .1910000      .000      .000  
+74 630 42228.00 I   .013984  .019691   .222416  .020071  I  .1871428  .0002785  1.8176 0.1969  P    39.970     .500    -2.094     .300  -.010000   .216000   .1889000      .000      .000  
+74 7 1 42229.00 I   .015250  .022024   .223106  .014871  I  .1853992  .0002785  1.6782 0.2182  P    39.657     .500    -2.176     .300  -.009000   .216000   .1869000      .000      .000  
+74 7 2 42230.00 I   .016503  .021654   .223758  .015564  I  .1837679  .0003361  1.5941 0.2243  P    39.329     .500    -2.247     .300  -.008000   .216000   .1848000      .000      .000  
+74 7 3 42231.00 I   .017736  .018392   .224372  .016211  I  .1821913  .0003518  1.5691 0.2433  P    39.149     .500    -2.332     .300  -.007000   .216000   .1827000      .000      .000  
+74 7 4 42232.00 I   .018940  .022670   .224947  .020112  I  .1806110  .0003518  1.6001 0.2220  P    39.134     .500    -2.365     .300  -.006000   .216000   .1805000      .000      .000  
+74 7 5 42233.00 I   .020113  .023557   .225484  .019281  I  .1789761  .0002710  1.6760 0.2220  P    39.202     .500    -2.263     .300  -.005000   .216000   .1784000      .000      .000  
+74 7 6 42234.00 I   .021252  .023881   .225982  .020073  I  .1772496  .0002710  1.7801 0.1916  P    39.257     .500    -2.069     .300  -.004000   .216000   .1763000      .000      .000  
+74 7 7 42235.00 I   .022358  .020722   .226444  .020776  I  .1754130  .0002710  1.8931 0.2576  P    39.185     .500    -1.942     .300  -.002000   .216000   .1742000      .000      .000  
+74 7 8 42236.00 I   .023430  .019542   .226867  .021383  I  .1734666  .0004381  1.9967 0.2576  P    38.916     .500    -1.978     .300  -.001000   .216000   .1721000      .000      .000  
+74 7 9 42237.00 I   .024465  .019545   .227255  .021367  I  .1714277  .0004381  2.0760 0.2723  P    38.579     .500    -2.095     .300   .000000   .216000   .1699000      .000      .000  
+74 710 42238.00 I   .025459  .023284   .227607  .022373  I  .1693264  .0003235  2.1200 0.2723  P    38.425     .500    -2.147     .300   .001000   .216000   .1678000      .000      .000  
+74 711 42239.00 I   .026407  .018951   .227925  .019316  I  .1672016  .0003235  2.1224 0.2287  P    38.479     .500    -2.122     .300   .002000   .216000   .1657000      .000      .000  
+74 712 42240.00 I   .027305  .019040   .228211  .018536  I  .1650959  .0003235  2.0819 0.2287  P    38.418     .500    -2.139     .300   .003000   .216000   .1636000      .000      .000  
+74 713 42241.00 I   .028151  .020244   .228464  .016780  I  .1630508  .0003235  2.0025 0.1747  P    37.945     .500    -2.237     .300   .004000   .216000   .1616000      .000      .000  
+74 714 42242.00 I   .028942  .020973   .228683  .016039  I  .1610997  .0001319  1.8967 0.1747  P    37.181     .500    -2.280     .300   .005000   .216000   .1595000      .000      .000  
+74 715 42243.00 I   .029674  .018768   .228869  .016737  I  .1592580  .0001319  1.7890 0.1507  P    36.551     .500    -2.161     .300   .006000   .216000   .1575000      .000      .000  
+74 716 42244.00 I   .030340  .019179   .229023  .022235  I  .1575102  .0002710  1.7157 0.1507  P    36.355     .500    -2.000     .300   .007000   .217000   .1554000      .000      .000  
+74 717 42245.00 I   .030935  .014328   .229145  .022155  I  .1558022  .0002710  1.7156 0.1916  P    36.571     .500    -2.015     .300   .007000   .217000   .1534000      .000      .000  
+74 718 42246.00 I   .031459  .014630   .229236  .021440  I  .1540466  .0002710  1.8127 0.1916  P    36.975     .500    -2.212     .300   .008000   .217000   .1515000      .000      .000  
+74 719 42247.00 I   .031910  .013291   .229297  .020905  I  .1521472  .0002710  1.9987 0.1916  P    37.310     .500    -2.356     .300   .009000   .217000   .1495000      .000      .000  
+74 720 42248.00 I   .032289  .014634   .229326  .021094  I  .1500348  .0002710  2.2280 0.1916  P    37.402     .500    -2.274     .300   .010000   .217000   .1476000      .000      .000  
+74 721 42249.00 I   .032598  .014228   .229326  .021864  I  .1476996  .0002710  2.4321 0.1916  P    37.243     .500    -2.058     .300   .011000   .217000   .1456000      .000      .000  
+74 722 42250.00 I   .032838  .014040   .229296  .021349  I  .1452006  .0002710  2.5464 0.1916  P    36.943     .500    -1.879     .300   .012000   .217000   .1437000      .000      .000  
+74 723 42251.00 I   .033012  .016313   .229237  .014736  I  .1426478  .0002710  2.5378 0.1916  P    36.550     .500    -1.748     .300   .012000   .217000   .1418000      .000      .000  
+74 724 42252.00 I   .033124  .019029   .229150  .009664  I  .1401629  .0002710  2.4154 0.1916  P    36.020     .500    -1.579     .300   .013000   .218000   .1399000      .000      .000  
+74 725 42253.00 I   .033179  .021126   .229032  .009283  I  .1378411  .0002710  2.2206 0.1916  P    35.445     .500    -1.427     .300   .013000   .218000   .1380000      .000      .000  
+74 726 42254.00 I   .033183  .021243   .228884  .011548  I  .1357282  .0002710  2.0061 0.1916  P    35.112     .500    -1.465     .300   .014000   .218000   .1361000      .000      .000  
+74 727 42255.00 I   .033140  .018248   .228705  .013064  I  .1338212  .0002710  1.8146 0.1916  P    35.180     .500    -1.731     .300   .015000   .218000   .1342000      .000      .000  
+74 728 42256.00 I   .033052  .017860   .228495  .013045  I  .1320826  .0002710  1.6722 0.1916  P    35.413     .500    -2.030     .300   .015000   .218000   .1323000      .000      .000  
+74 729 42257.00 I   .032919  .017940   .228251  .012110  I  .1304569  .0002710  1.5895 0.1916  P    35.435     .500    -2.161     .300   .016000   .219000   .1305000      .000      .000  
+74 730 42258.00 I   .032742  .016762   .227975  .016195  I  .1288833  .0002710  1.5678 0.1916  P    35.179     .500    -2.138     .300   .016000   .219000   .1286000      .000      .000  
+74 731 42259.00 I   .032525  .018798   .227666  .016409  I  .1273020  .0002710  1.6040 0.3212  P    34.905     .500    -2.096     .300   .017000   .219000   .1267000      .000      .000  
+74 8 1 42260.00 I   .032268  .018396   .227323  .020372  I  .1256589  .0005824  1.6895 0.3212  P    34.827     .500    -2.062     .300   .017000   .219000   .1247000      .000      .000  
+74 8 2 42261.00 I   .031975  .018801   .226948  .020518  I  .1239113  .0005824  1.8101 0.4118  P    34.913     .500    -1.938     .300   .017000   .219000   .1227000      .000      .000  
+74 8 3 42262.00 I   .031645  .019145   .226540  .020465  I  .1220332  .0005824  1.9470 0.4118  P    34.999     .500    -1.700     .300   .017000   .220000   .1206000      .000      .000  
+74 8 4 42263.00 I   .031279  .019682   .226103  .019788  I  .1200186  .0005824  2.0798 0.4118  P    34.949     .500    -1.504     .300   .017000   .220000   .1186000      .000      .000  
+74 8 5 42264.00 I   .030879  .019654   .225640  .020278  I  .1178811  .0005824  2.1901 0.3899  P    34.709     .500    -1.521     .300   .017000   .220000   .1166000      .000      .000  
+74 8 6 42265.00 I   .030451  .019101   .225155  .018481  I  .1156503  .0005186  2.2649 0.3667  P    34.374     .500    -1.735     .300   .017000   .220000   .1143000      .000      .000  
+74 8 7 42266.00 I   .029999  .013944   .224651  .018267  I  .1133655  .0004457  2.2972 0.3419  P    34.161     .500    -1.957     .300   .017000   .220000   .1121000      .000      .000  
+74 8 8 42267.00 I   .029528  .010255   .224133  .014559  I  .1110705  .0004457  2.2856 0.3152  P    34.188     .500    -2.055     .300   .017000   .221000   .1098000      .000      .000  
+74 8 9 42268.00 I   .029038  .009143   .223605  .014356  I  .1088073  .0004457  2.2348 0.3152  P    34.267     .500    -2.070     .300   .017000   .221000   .1076000      .000      .000  
+74 810 42269.00 I   .028531  .007967   .223069  .013214  I  .1066102  .0004457  2.1559 0.3152  P    34.080     .500    -2.100     .300   .017000   .221000   .1053000      .000      .000  
+74 811 42270.00 I   .028009  .009880   .222528  .020923  I  .1044981  .0004457  2.0690 0.2608  P    33.561     .500    -2.146     .300   .017000   .221000   .1029000      .000      .000  
+74 812 42271.00 I   .027475  .010686   .221983  .021551  I  .1024651  .0002710  2.0032 0.2608  P    33.005     .500    -2.159     .300   .018000   .220000   .1005000      .000      .000  
+74 813 42272.00 I   .026931  .009509   .221433  .022808  I  .1004733  .0002710  1.9925 0.1916  P    32.777     .500    -2.181     .300   .018000   .220000   .0980000      .000      .000  
+74 814 42273.00 I   .026380  .010620   .220880  .023672  I  .0984520  .0002710  2.0660 0.1916  P    32.986     .500    -2.301     .300   .019000   .220000   .0956000      .000      .000  
+74 815 42274.00 I   .025824  .010394   .220324  .023604  I  .0963103  .0002710  2.2324 0.1916  P    33.422     .500    -2.475     .300   .019000   .220000   .0932000      .000      .000  
+74 816 42275.00 I   .025264  .011064   .219770  .023051  I  .0939641  .0002710  2.4680 0.1916  P    33.721     .500    -2.510     .300   .019000   .219000   .0908000      .000      .000  
+74 817 42276.00 I   .024699  .011121   .219221  .024604  I  .0913700  .0002710  2.7166 0.1916  P    33.663     .500    -2.309     .300   .020000   .219000   .0884000      .000      .000  
+74 818 42277.00 I   .024131  .010702   .218679  .019065  I  .0885501  .0002710  2.9077 0.1916  P    33.364     .500    -2.032     .300   .020000   .219000   .0860000      .000      .000  
+74 819 42278.00 I   .023558  .011811   .218150  .018781  I  .0855929  .0002710  2.9839 0.1916  P    33.119     .500    -1.890     .300   .021000   .218000   .0836000      .000      .000  
+74 820 42279.00 I   .022981  .012083   .217635  .019144  I  .0826272  .0002710  2.9253 0.1916  P    32.997     .500    -1.863     .300   .021000   .218000   .0812000      .000      .000  
+74 821 42280.00 I   .022400  .011322   .217136  .019905  I  .0797792  .0002710  2.7559 0.1916  P    32.754     .500    -1.769     .300   .021000   .218000   .0789000      .000      .000  
+74 822 42281.00 I   .021818  .012378   .216657  .019415  I  .0771343  .0002710  2.5296 0.1916  P    32.259     .500    -1.581     .300   .021000   .218000   .0766000      .000      .000  
+74 823 42282.00 I   .021237  .024803   .216199  .019773  I  .0747195  .0002710  2.3047 0.1916  P    31.830     .500    -1.506     .300   .020000   .218000   .0743000      .000      .000  
+74 824 42283.00 I   .020664  .025425   .215762  .018400  I  .0725103  .0002710  2.1236 0.1916  P    31.882     .500    -1.688     .300   .020000   .218000   .0720000      .000      .000  
+74 825 42284.00 I   .020105  .024355   .215347  .021438  I  .0704511  .0002710  2.0060 0.1916  P    32.354     .500    -1.987     .300   .020000   .218000   .0697000      .000      .000  
+74 826 42285.00 I   .019567  .023519   .214953  .023762  I  .0684765  .0002710  1.9538 0.1916  P    32.762     .500    -2.140     .300   .020000   .218000   .0675000      .000      .000  
+74 827 42286.00 I   .019055  .023334   .214582  .021494  I  .0665239  .0002710  1.9606 0.7695  P    32.811     .500    -2.079     .300   .020000   .218000   .0653000      .000      .000  
+74 828 42287.00 I   .018573  .023669   .214234  .019573  I  .0645387  .0015149  2.0173 0.7695  P    32.675     .500    -1.945     .300   .019000   .218000   .0632000      .000      .000  
+74 829 42288.00 I   .018120  .023046   .213910  .021051  I  .0624767  .0015149  2.1118 1.0712  P    32.641     .500    -1.847     .300   .019000   .218000   .0610000      .000      .000  
+74 830 42289.00 I   .017700  .008170   .213614  .020349  I  .0603081  .0015149  2.2273 0.9339  P    32.732     .500    -1.744     .300   .019000   .218000   .0588000      .000      .000  
+74 831 42290.00 I   .017314  .007840   .213344  .019573  I  .0580213  .0010926  2.3453 0.9339  P    32.797     .500    -1.590     .300   .019000   .218000   .0566000      .000      .000  
+74 9 1 42291.00 I   .016963  .008178   .213104  .021503  I  .0556227  .0010926  2.4477 0.7066  P    32.753     .500    -1.470     .300   .019000   .218000   .0543000      .000      .000  
+74 9 2 42292.00 I   .016648  .008503   .212894  .017844  I  .0531363  .0008964  2.5188 0.5617  P    32.606     .500    -1.516     .300   .018000   .218000   .0521000      .000      .000  
+74 9 3 42293.00 I   .016370  .011932   .212717  .017893  I  .0505988  .0002616  2.5487 0.4691  P    32.381     .500    -1.725     .300   .018000   .218000   .0498000      .000      .000  
+74 9 4 42294.00 I   .016129  .013144   .212577  .018114  I  .0480536  .0002772  2.5344 0.1906  P    32.152     .500    -1.944     .300   .018000   .218000   .0476000      .000      .000  
+74 9 5 42295.00 I   .015927  .015742   .212477  .017267  I  .0455436  .0002772  2.4794 0.2929  P    32.043     .500    -2.035     .300   .018000   .218000   .0452000      .000      .000  
+74 9 6 42296.00 I   .015762  .015177   .212418  .019806  I  .0431045  .0005161  2.3953 0.2692  P    32.090     .500    -2.002     .300   .018000   .218000   .0428000      .000      .000  
+74 9 7 42297.00 I   .015632  .017581   .212401  .021649  I  .0407563  .0004616  2.3013 0.3629  P    32.160     .500    -1.949     .300   .018000   .218000   .0403000      .000      .000  
+74 9 8 42298.00 I   .015532  .018825   .212427  .015538  I  .0384965  .0005104  2.2236 0.3643  P    32.098     .500    -1.957     .300   .018000   .218000   .0379000      .000      .000  
+74 9 9 42299.00 I   .015456  .019919   .212495  .017464  I  .0362936  .0005636  2.1923 0.4141  P    31.934     .500    -2.042     .300   .018000   .218000   .0355000      .000      .000  
+74 910 42300.00 I   .015400  .020041   .212606  .018153  I  .0340879  .0006522  2.2330 0.4310  P    31.865     .500    -2.204     .300   .018000   .218000   .0330000      .000      .000  
+74 911 42301.00 I   .015358  .020773   .212761  .019557  I  .0317988  .0006522  2.3600 0.3261  P    32.036     .500    -2.418     .300   .018000   .218000   .0304000      .000      .000  
+74 912 42302.00 I   .015324  .018865   .212960  .019760  I  .0293420  .0000072  2.5648 0.3531  P    32.361     .500    -2.583     .300   .019000   .218000   .0279000      .000      .000  
+74 913 42303.00 I   .015293  .021151   .213203  .020303  I  .0266552  .0002710  2.8116 0.1355  P    32.561     .500    -2.543     .300   .019000   .218000   .0253000      .000      .000  
+74 914 42304.00 I   .015256  .018523   .213488  .019536  I  .0237243  .0002710  3.0420 0.1916  P    32.438     .500    -2.256     .300   .019000   .218000   .0228000      .000      .000  
+74 915 42305.00 I   .015206  .019698   .213815  .022084  I  .0205976  .0002710  3.1934 0.1916  P    32.118     .500    -1.903     .300   .019000   .218000   .0201000      .000      .000  
+74 916 42306.00 I   .015133  .019916   .214184  .020900  I  .0173782  .0002710  3.2229 0.1916  P    31.946     .500    -1.726     .300   .019000   .218000   .0175000      .000      .000  
+74 917 42307.00 I   .015032  .020853   .214591  .023551  I  .0141941  .0002710  3.1256 0.1916  P    32.054     .500    -1.762     .300   .020000   .219000   .0148000      .000      .000  
+74 918 42308.00 I   .014897  .020123   .215036  .025793  I  .0111579  .0002710  2.9358 0.1916  P    32.171     .500    -1.814     .300   .020000   .219000   .0122000      .000      .000  
+74 919 42309.00 I   .014725  .020191   .215514  .025145  I  .0083342  .0002710  2.7111 0.1916  P    32.000     .500    -1.735     .300   .020000   .219000   .0095000      .000      .000  
+74 920 42310.00 I   .014510  .021988   .216019  .026337  I  .0057286  .0002710  2.5078 0.1916  P    31.682     .500    -1.606     .300   .020000   .219000   .0068000      .000      .000  
+74 921 42311.00 I   .014246  .022170   .216544  .036599  I  .0032992  .0002710  2.3628 0.1916  P    31.644     .500    -1.598     .300   .020000   .220000   .0041000      .000      .000  
+74 922 42312.00 I   .013932  .019840   .217082  .040434  I  .0009794  .0002710  2.2886 0.1916  P    32.035     .500    -1.718     .300   .019000   .220000   .0013000      .000      .000  
+74 923 42313.00 I   .013565  .024273   .217628  .040316  I -.0013001  .0002710  2.2806 0.1916  P    32.555     .500    -1.817     .300   .019000   .221000  -.0014000      .000      .000  
+74 924 42314.00 I   .013142  .022758   .218176  .039421  I -.0036001  .0002710  2.3274 0.3591  P    32.888     .500    -1.805     .300   .019000   .221000  -.0041000      .000      .000  
+74 925 42315.00 I   .012664  .022647   .218720  .037207  I -.0059688  .0006651  2.4157 0.3591  P    33.047     .500    -1.740     .300   .019000   .222000  -.0068000      .000      .000  
+74 926 42316.00 I   .012129  .024434   .219255  .038349  I -.0084405  .0006651  2.5308 0.4703  P    33.191     .500    -1.701     .300   .019000   .222000  -.0095000      .000      .000  
+74 927 42317.00 I   .011540  .021385   .219774  .036125  I -.0110335  .0006651  2.6552 0.4703  P    33.322     .500    -1.682     .300   .018000   .223000  -.0122000      .000      .000  
+74 928 42318.00 I   .010901  .021482   .220274  .027141  I -.0137479  .0006651  2.7706 0.4703  P    33.336     .500    -1.655     .300   .018000   .223000  -.0149000      .000      .000  
+74 929 42319.00 I   .010218  .023056   .220751  .018389  I -.0165659  .0006651  2.8596 0.4101  P    33.242     .500    -1.647     .300   .018000   .224000  -.0176000      .000      .000  
+74 930 42320.00 I   .009497  .016849   .221202  .019571  I -.0194541  .0004800  2.9096 0.3394  P    33.135     .500    -1.698     .300   .018000   .225000  -.0203000      .000      .000  
+7410 1 42321.00 I   .008739  .016810   .221628  .019070  I -.0223698  .0001360  2.9138 0.2494  P    33.024     .500    -1.776     .300   .018000   .225000  -.0230000      .000      .000  
+7410 2 42322.00 I   .007946  .021855   .222027  .020845  I -.0252664  .0001360  2.8722 0.2058  P    32.856     .500    -1.794     .300   .017000   .226000  -.0258000      .000      .000  
+7410 3 42323.00 I   .007119  .024480   .222401  .021298  I -.0281018  .0003884  2.7934 0.2058  P    32.676     .500    -1.713     .300   .017000   .226000  -.0285000      .000      .000  
+7410 4 42324.00 I   .006262  .026627   .222753  .026640  I -.0308468  .0003884  2.6952 0.2746  P    32.634     .500    -1.580     .300   .017000   .227000  -.0312000      .000      .000  
+7410 5 42325.00 I   .005380  .026705   .223082  .026249  I -.0334946  .0003884  2.6041 0.3201  P    32.805     .500    -1.479     .300   .016000   .228000  -.0341000      .000      .000  
+7410 6 42326.00 I   .004477  .027347   .223392  .028180  I -.0360675  .0005089  2.5504 0.3201  P    33.102     .500    -1.466     .300   .016000   .229000  -.0370000      .000      .000  
+7410 7 42327.00 I   .003560  .027406   .223685  .028061  I -.0386168  .0005089  2.5607 0.3599  P    33.393     .500    -1.554     .300   .015000   .230000  -.0398000      .000      .000  
+7410 8 42328.00 I   .002633  .028959   .223963  .029114  I -.0412151  .0005091  2.6495 0.3557  P    33.640     .500    -1.722     .300   .015000   .231000  -.0427000      .000      .000  
+7410 9 42329.00 I   .001704  .031157   .224230  .028425  I -.0439406  .0004972  2.8127 0.3558  P    33.881     .500    -1.911     .300   .014000   .232000  -.0456000      .000      .000  
+741010 42330.00 I   .000778  .029067   .224491  .028453  I -.0468567  .0004972  3.0247 0.3516  P    34.116     .500    -2.027     .300   .013000   .233000  -.0487000      .000      .000  
+741011 42331.00 I  -.000138  .024667   .224747  .019351  I -.0499919  .0004972  3.2426 0.3560  P    34.245     .500    -1.963     .300   .012000   .234000  -.0518000      .000      .000  
+741012 42332.00 I  -.001038  .028001   .225001  .015849  I -.0533268  .0005096  3.4152 0.3560  P    34.178     .500    -1.693     .300   .012000   .236000  -.0548000      .000      .000  
+741013 42333.00 I  -.001917  .024583   .225253  .014307  I -.0567922  .0005096  3.4976 0.2886  P    33.988     .500    -1.340     .300   .011000   .237000  -.0579000      .000      .000  
+741014 42334.00 I  -.002775  .028298   .225504  .013369  I -.0602843  .0002710  3.4671 0.2886  P    33.896     .500    -1.110     .300   .010000   .238000  -.0610000      .000      .000  
+741015 42335.00 I  -.003611  .028052   .225755  .014799  I -.0636919  .0002710  3.3332 0.1916  P    34.031     .500    -1.114     .300   .009000   .239000  -.0641000      .000      .000  
+741016 42336.00 I  -.004427  .016520   .226006  .013857  I -.0669295  .0002710  3.1357 0.1916  P    34.266     .500    -1.259     .300   .008000   .240000  -.0673000      .000      .000  
+741017 42337.00 I  -.005222  .014475   .226259  .014188  I -.0699599  .0002710  2.9279 0.1916  P    34.370     .500    -1.351     .300   .007000   .242000  -.0704000      .000      .000  
+741018 42338.00 I  -.005998  .016631   .226515  .014539  I -.0727978  .0002710  2.7575 0.1916  P    34.319     .500    -1.298     .300   .006000   .243000  -.0736000      .000      .000  
+741019 42339.00 I  -.006755  .016868   .226777  .012659  I -.0754965  .0002710  2.6520 0.1916  P    34.331     .500    -1.169     .300   .005000   .244000  -.0767000      .000      .000  
+741020 42340.00 I  -.007498  .018912   .227044  .013854  I -.0781253  .0002710  2.6170 0.1916  P    34.583     .500    -1.071     .300   .004000   .245000  -.0798000      .000      .000  
+741021 42341.00 I  -.008231  .016527   .227318  .012244  I -.0807508  .0002710  2.6428 0.1916  P    35.022     .500    -1.042     .300   .003000   .246000  -.0830000      .000      .000  
+741022 42342.00 I  -.008959  .010758   .227600  .009307  I -.0834263  .0002710  2.7146 0.1916  P    35.482     .500    -1.066     .300   .002000   .247000  -.0861000      .000      .000  
+741023 42343.00 I  -.009685  .011828   .227891  .009580  I -.0861902  .0002710  2.8169 0.1916  P    35.866     .500    -1.121     .300   .001000   .248000  -.0893000      .000      .000  
+741024 42344.00 I  -.010412  .013420   .228192  .006781  I -.0890648  .0002710  2.9334 0.1916  P    36.134     .500    -1.181     .300   .000000   .249000  -.0924000      .000      .000  
+741025 42345.00 I  -.011141  .012912   .228506  .006374  I -.0920563  .0002710  3.0476 0.1916  P    36.232     .500    -1.215     .300  -.001000   .250000  -.0955000      .000      .000  
+741026 42346.00 I  -.011873  .010931   .228834  .007203  I -.0951537  .0002710  3.1427 0.1916  P    36.132     .500    -1.223     .300  -.002000   .251000  -.0986000      .000      .000  
+741027 42347.00 I  -.012609  .016719   .229178  .006323  I -.0983305  .0002710  3.2043 0.1916  P    35.930     .500    -1.238     .300  -.003000   .252000  -.1017000      .000      .000  
+741028 42348.00 I  -.013350  .019137   .229538  .006734  I -.1015481  .0002710  3.2233 0.1916  P    35.772     .500    -1.259     .300  -.004000   .253000  -.1048000      .000      .000  
+741029 42349.00 I  -.014093  .016633   .229916  .009104  I -.1047621  .0002710  3.1972 0.1916  P    35.697     .500    -1.210     .300  -.005000   .254000  -.1079000      .000      .000  
+741030 42350.00 I  -.014838  .017265   .230312  .008647  I -.1079286  .0002710  3.1295 0.1916  P    35.635     .500    -1.031     .300  -.006000   .255000  -.1110000      .000      .000  
+741031 42351.00 I  -.015582  .017431   .230727  .007820  I -.1110115  .0002710  3.0331 0.2168  P    35.555     .500     -.777     .300  -.007000   .256000  -.1140000      .000      .000  
+7411 1 42352.00 I  -.016326  .019051   .231161  .008565  I -.1139930  .0003384  2.9314 0.2168  P    35.548     .500     -.580     .300  -.008000   .256000  -.1171000      .000      .000  
+7411 2 42353.00 I  -.017073  .016536   .231616  .007419  I -.1168828  .0003384  2.8552 0.2393  P    35.724     .500     -.519     .300  -.009000   .257000  -.1201000      .000      .000  
+7411 3 42354.00 I  -.017822  .010554   .232090  .008483  I -.1197222  .0003384  2.8354 0.2393  P    36.079     .500     -.567     .300  -.010000   .258000  -.1232000      .000      .000  
+7411 4 42355.00 I  -.018574  .010175   .232584  .008942  I -.1225786  .0003384  2.8906 0.2393  P    36.484     .500     -.651     .300  -.011000   .259000  -.1262000      .000      .000  
+7411 5 42356.00 I  -.019330  .011635   .233097  .006439  I -.1255277  .0003384  3.0187 0.2393  P    36.804     .500     -.726     .300  -.012000   .259000  -.1293000      .000      .000  
+7411 6 42357.00 I  -.020086  .010298   .233628  .006083  I -.1286323  .0003384  3.1958 0.2168  P    36.995     .500     -.776     .300  -.012000   .260000  -.1323000      .000      .000  
+7411 7 42358.00 I  -.020843  .005859   .234176  .006523  I -.1319226  .0002710  3.3827 0.2168  P    37.092     .500     -.780     .300  -.013000   .260000  -.1354000      .000      .000  
+7411 8 42359.00 I  -.021598  .019559   .234741  .012920  I -.1353865  .0002710  3.5358 0.1916  P    37.136     .500     -.700     .300  -.014000   .261000  -.1384000      .000      .000  
+7411 9 42360.00 I  -.022348  .022548   .235320  .014917  I -.1389706  .0002710  3.6179 0.1916  P    37.135     .500     -.509     .300  -.015000   .261000  -.1415000      .000      .000  
+741110 42361.00 I  -.023091  .019937   .235914  .012975  I -.1425916  .0002710  3.6078 0.1916  P    37.085     .500     -.240     .300  -.015000   .262000  -.1445000      .000      .000  
+741111 42362.00 I  -.023823  .022435   .236519  .013778  I -.1461556  .0002710  3.5061 0.1916  P    37.016     .500     -.005     .300  -.016000   .262000  -.1476000      .000      .000  
+741112 42363.00 I  -.024543  .024254   .237136  .022801  I -.1495809  .0002710  3.3359 0.1916  P    36.982     .500      .067     .300  -.016000   .263000  -.1506000      .000      .000  
+741113 42364.00 I  -.025251  .027899   .237761  .026178  I -.1528176  .0002710  3.1363 0.1916  P    37.025     .500     -.047     .300  -.017000   .263000  -.1537000      .000      .000  
+741114 42365.00 I  -.025948  .024211   .238390  .022738  I -.1558584  .0002710  2.9512 0.1916  P    37.146     .500     -.221     .300  -.018000   .263000  -.1568000      .000      .000  
+741115 42366.00 I  -.026638  .017488   .239023  .022569  I -.1587363  .0002710  2.8149 0.1916  P    37.319     .500     -.280     .300  -.018000   .264000  -.1599000      .000      .000  
+741116 42367.00 I  -.027322  .015223   .239655  .021575  I -.1615100  .0002710  2.7439 0.1916  P    37.523     .500     -.160     .300  -.019000   .264000  -.1629000      .000      .000  
+741117 42368.00 I  -.027999  .016952   .240288  .024873  I -.1642452  .0002710  2.7364 0.1916  P    37.778     .500      .047     .300  -.019000   .265000  -.1660000      .000      .000  
+741118 42369.00 I  -.028670  .015219   .240920  .021700  I -.1669996  .0002710  2.7795 0.1916  P    38.116     .500      .197     .300  -.020000   .265000  -.1691000      .000      .000  
+741119 42370.00 I  -.029332  .005271   .241553  .011159  I -.1698154  .0002710  2.8561 0.1916  P    38.519     .500      .215     .300  -.021000   .265000  -.1722000      .000      .000  
+741120 42371.00 I  -.029984  .007877   .242187  .009697  I -.1727172  .0002710  2.9489 0.1916  P    38.874     .500      .129     .300  -.021000   .266000  -.1753000      .000      .000  
+741121 42372.00 I  -.030624  .008918   .242822  .011014  I -.1757133  .0002710  3.0422 0.1916  P    39.038     .500      .037     .300  -.022000   .266000  -.1783000      .000      .000  
+741122 42373.00 I  -.031252  .007784   .243455  .011306  I -.1787966  .0002710  3.1207 0.1916  P    38.959     .500      .013     .300  -.022000   .267000  -.1814000      .000      .000  
+741123 42374.00 I  -.031866  .008811   .244087  .007691  I -.1819454  .0002710  3.1714 0.1916  P    38.721     .500      .042     .300  -.023000   .267000  -.1845000      .000      .000  
+741124 42375.00 I  -.032463  .008922   .244716  .016418  I -.1851271  .0002710  3.1852 0.2967  P    38.457     .500      .046     .300  -.024000   .267000  -.1876000      .000      .000  
+741125 42376.00 I  -.033043  .009202   .245339  .018715  I -.1883019  .0005279  3.1574 0.2967  P    38.251     .500      .007     .300  -.025000   .268000  -.1906000      .000      .000  
+741126 42377.00 I  -.033605  .011661   .245957  .018537  I -.1914286  .0005279  3.0896 0.3733  P    38.129     .500      .026     .300  -.025000   .268000  -.1937000      .000      .000  
+741127 42378.00 I  -.034149  .011242   .246568  .021384  I -.1944705  .0005279  2.9898 0.3733  P    38.095     .500      .205     .300  -.026000   .269000  -.1967000      .000      .000  
+741128 42379.00 I  -.034674  .010017   .247172  .018721  I -.1974034  .0005279  2.8754 0.3733  P    38.147     .500      .477     .300  -.027000   .269000  -.1998000      .000      .000  
+741129 42380.00 I  -.035178  .011512   .247771  .020449  I -.2002257  .0005279  2.7742 0.3733  P    38.287     .500      .641     .300  -.028000   .269000  -.2029000      .000      .000  
+741130 42381.00 I  -.035660  .011259   .248366  .019127  I -.2029672  .0005279  2.7191 0.2967  P    38.522     .500      .578     .300  -.029000   .270000  -.2059000      .000      .000  
+7412 1 42382.00 I  -.036119  .011855   .248959  .013694  I -.2056880  .0002710  2.7362 0.2967  P    38.831     .500      .381     .300  -.029000   .270000  -.2090000      .000      .000  
+7412 2 42383.00 I  -.036555  .014117   .249549  .011865  I -.2084660  .0002710  2.8324 0.1916  P    39.120     .500      .242     .300  -.030000   .271000  -.2120000      .000      .000  
+7412 3 42384.00 I  -.036969  .013003   .250136  .008934  I -.2113722  .0002710  2.9868 0.1916  P    39.263     .500      .251     .300  -.031000   .271000  -.2151000      .000      .000  
+7412 4 42385.00 I  -.037360  .011264   .250720  .008184  I -.2144449  .0002710  3.1571 0.1916  P    39.218     .500      .355     .300  -.031000   .271000  -.2180000      .000      .000  
+7412 5 42386.00 I  -.037727  .012718   .251301  .008905  I -.2176753  .0002710  3.2941 0.1916  P    39.079     .500      .466     .300  -.032000   .272000  -.2210000      .000      .000  
+7412 6 42387.00 I  -.038067  .013288   .251878  .018719  I -.2210090  .0002710  3.3588 0.1916  P    38.979     .500      .560     .300  -.032000   .272000  -.2239000      .000      .000  
+7412 7 42388.00 I  -.038382  .014103   .252448  .019939  I -.2243632  .0002710  3.3343 0.1916  P    38.961     .500      .669     .300  -.033000   .273000  -.2269000      .000      .000  
+7412 8 42389.00 I  -.038673  .015565   .253012  .017587  I -.2276498  .0002710  3.2262 0.1916  P    38.957     .500      .815     .300  -.033000   .273000  -.2298000      .000      .000  
+7412 9 42390.00 I  -.038940  .014067   .253568  .020304  I -.2307956  .0002710  3.0579 0.1916  P    38.867     .500      .961     .300  -.033000   .273000  -.2326000      .000      .000  
+741210 42391.00 I  -.039184  .014547   .254115  .018221  I -.2337566  .0002710  2.8625 0.1916  P    38.676     .500     1.027     .300  -.034000   .274000  -.2354000      .000      .000  
+741211 42392.00 I  -.039408  .016796   .254656  .020813  I -.2365234  .0002710  2.6754 0.1916  P    38.495     .500      .963     .300  -.034000   .274000  -.2381000      .000      .000  
+741212 42393.00 I  -.039614  .016993   .255193  .025832  I -.2391202  .0002710  2.5268 0.1916  P    38.486     .500      .819     .300  -.035000   .275000  -.2409000      .000      .000  
+741213 42394.00 I  -.039809  .017645   .255726  .022401  I -.2415963  .0002710  2.4361 0.1916  P    38.704     .500      .724     .300  -.035000   .275000  -.2437000      .000      .000  
+741214 42395.00 I  -.039996  .015983   .256257  .019487  I -.2440136  .0002710  2.4090 0.1916  P    39.036     .500      .776     .300  -.035000   .275000  -.2463000      .000      .000  
+741215 42396.00 I  -.040178  .014713   .256789  .022169  I -.2464328  .0002710  2.4375 0.1916  P    39.343     .500      .954     .300  -.035000   .276000  -.2490000      .000      .000  
+741216 42397.00 I  -.040360  .014467   .257323  .021215  I -.2489018  .0002710  2.5056 0.1916  P    39.606     .500     1.142     .300  -.036000   .276000  -.2516000      .000      .000  
+741217 42398.00 I  -.040542  .013955   .257858  .023867  I -.2514511  .0002710  2.5949 0.1916  P    39.857     .500     1.228     .300  -.036000   .277000  -.2543000      .000      .000  
+741218 42399.00 I  -.040724  .012341   .258394  .021131  I -.2540928  .0002710  2.6877 0.1916  P    40.025     .500     1.194     .300  -.036000   .277000  -.2569000      .000      .000  
+741219 42400.00 I  -.040910  .010006   .258930  .011782  I -.2568225  .0002710  2.7686 0.1916  P    39.984     .500     1.121     .300  -.036000   .277000  -.2595000      .000      .000  
+741220 42401.00 I  -.041101  .011267   .259466  .012572  I -.2596221  .0002710  2.8257 0.1916  P    39.751     .500     1.100     .300  -.036000   .278000  -.2621000      .000      .000  
+741221 42402.00 I  -.041297  .011834   .260000  .014361  I -.2624630  .0002710  2.8502 0.1916  P    39.503     .500     1.135     .300  -.037000   .278000  -.2648000      .000      .000  
+741222 42403.00 I  -.041498  .012767   .260534  .013773  I -.2653103  .0002710  2.8382 0.1916  P    39.346     .500     1.128     .300  -.037000   .279000  -.2674000      .000      .000  
+741223 42404.00 I  -.041705  .012439   .261069  .012013  I -.2681275  .0002710  2.7907 0.1916  P    39.210     .500     1.013     .300  -.037000   .279000  -.2700000      .000      .000  
+741224 42405.00 I  -.041917  .016573   .261606  .010522  I -.2708818  .0002710  2.7137 0.1916  P    39.019     .500      .889     .300  -.037000   .279000  -.2726000      .000      .000  
+741225 42406.00 I  -.042136  .018919   .262144  .011042  I -.2735492  .0002710  2.6195 0.1916  P    38.851     .500      .924     .300  -.037000   .279000  -.2752000      .000      .000  
+741226 42407.00 I  -.042362  .021855   .262684  .009594  I -.2761222  .0002710  2.5293 0.1916  P    38.830     .500     1.117     .300  -.038000   .280000  -.2777000      .000      .000  
+741227 42408.00 I  -.042596  .023827   .263227  .007128  I -.2786190  .0002710  2.4727 0.1916  P    38.977     .500     1.240     .300  -.038000   .280000  -.2803000      .000      .000  
+741228 42409.00 I  -.042837  .023827   .263773  .007128  I -.2810892  .0002710  2.4807 0.1916  P    39.237     .500     1.096     .300  -.038000   .280000  -.2829000      .000      .000  
+741229 42410.00 I  -.043081  .027122   .264322  .002483  I -.2836080  .0002710  2.5713 0.1916  P    39.556     .500      .777     .300  -.038000   .280000  -.2855000      .000      .000  
+741230 42411.00 I  -.043325  .028310   .264876  .023533  I -.2862566  .0002710  2.7363 0.1916  P    39.851     .500      .568     .300  -.038000   .280000  -.2882000      .000      .000  
+741231 42412.00 I  -.043569  .029749   .265436  .028736  I -.2890927  .0002710  2.9375 0.1916  P    39.981     .500      .627     .300  -.039000   .281000  -.2908000      .000      .000  
+75 1 1 42413.00 I  -.043813  .024593   .266001  .023470  I  .7078756  .0002710  3.1172 0.1916  P    39.881     .500      .847     .300  -.039000   .281000   .7065000      .000      .000  
+75 1 2 42414.00 I  -.044056  .022109   .266573  .028724  I  .7046980  .0002710  3.2216 0.1916  P    39.658     .500     1.037     .300  -.039000   .281000   .7039000      .000      .000  
+75 1 3 42415.00 I  -.044299  .018390   .267153  .024374  I  .7014674  .0002710  3.2212 0.1916  P    39.483     .500     1.129     .300  -.039000   .281000   .7012000      .000      .000  
+75 1 4 42416.00 I  -.044538  .018390   .267744  .024374  I  .6982891  .0002710  3.1205 0.1916  P    39.405     .500     1.174     .300  -.039000   .282000   .6986000      .000      .000  
+75 1 5 42417.00 I  -.044768  .020644   .268350  .029016  I  .6952497  .0002710  2.9500 0.1916  P    39.348     .500     1.204     .300  -.040000   .282000   .6959000      .000      .000  
+75 1 6 42418.00 I  -.044988  .016038   .268975  .023935  I  .6923984  .0002710  2.7517 0.1916  P    39.226     .500     1.192     .300  -.040000   .283000   .6933000      .000      .000  
+75 1 7 42419.00 I  -.045193  .015936   .269624  .020759  I  .6897425  .0002710  2.5648 0.1916  P    39.023     .500     1.112     .300  -.040000   .283000   .6906000      .000      .000  
+75 1 8 42420.00 I  -.045381  .017994   .270298  .023963  I  .6872556  .0002710  2.4175 0.1916  P    38.799     .500      .992     .300  -.040000   .283000   .6879000      .000      .000  
+75 1 9 42421.00 I  -.045545  .016918   .271002  .020839  I  .6848888  .0002710  2.3263 0.1916  P    38.672     .500      .884     .300  -.040000   .284000   .6853000      .000      .000  
+75 110 42422.00 I  -.045681  .017869   .271735  .020617  I  .6825825  .0002710  2.2967 0.1916  P    38.736     .500      .825     .300  -.039000   .284000   .6826000      .000      .000  
+75 111 42423.00 I  -.045780  .016065   .272497  .018874  I  .6802763  .0002710  2.3246 0.1916  P    38.961     .500      .838     .300  -.039000   .285000   .6800000      .000      .000  
+75 112 42424.00 I  -.045838  .011104   .273288  .007385  I  .6779183  .0002710  2.3977 0.1916  P    39.219     .500      .932     .300  -.039000   .285000   .6773000      .000      .000  
+75 113 42425.00 I  -.045849  .017543   .274108  .008335  I  .6754717  .0002710  2.4984 0.1916  P    39.431     .500     1.082     .300  -.039000   .286000   .6746000      .000      .000  
+75 114 42426.00 I  -.045810  .018481   .274956  .009561  I  .6729187  .0002710  2.6074 0.1916  P    39.588     .500     1.210     .300  -.038000   .286000   .6719000      .000      .000  
+75 115 42427.00 I  -.045718  .017283   .275833  .009310  I  .6702599  .0002710  2.7072 0.1916  P    39.642     .500     1.239     .300  -.038000   .287000   .6691000      .000      .000  
+75 116 42428.00 I  -.045572  .017033   .276739  .010330  I  .6675120  .0002710  2.7838 0.1916  P    39.522     .500     1.167     .300  -.037000   .287000   .6664000      .000      .000  
+75 117 42429.00 I  -.045372  .018276   .277675  .012408  I  .6647030  .0002710  2.8284 0.1916  P    39.297     .500     1.079     .300  -.037000   .288000   .6637000      .000      .000  
+75 118 42430.00 I  -.045120  .019795   .278643  .014775  I  .6618672  .0002710  2.8371 0.3211  P    39.166     .500     1.035     .300  -.036000   .289000   .6610000      .000      .000  
+75 119 42431.00 I  -.044818  .022021   .279643  .014884  I  .6590403  .0005823  2.8112 0.3211  P    39.193     .500      .979     .300  -.036000   .289000   .6582000      .000      .000  
+75 120 42432.00 I  -.044467  .019029   .280677  .014510  I  .6562544  .0005823  2.7565 0.4117  P    39.185     .500      .819     .300  -.035000   .290000   .6555000      .000      .000  
+75 121 42433.00 I  -.044070  .018518   .281746  .013774  I  .6535334  .0005823  2.6836 0.4117  P    38.957     .500      .601     .300  -.035000   .290000   .6527000      .000      .000  
+75 122 42434.00 I  -.043628  .019424   .282851  .014309  I  .6508876  .0005823  2.6093 0.4117  P    38.595     .500      .511     .300  -.034000   .291000   .6500000      .000      .000  
+75 123 42435.00 I  -.043138  .019011   .283988  .015448  I  .6483073  .0005823  2.5573 0.4117  P    38.326     .500      .626     .300  -.033000   .292000   .6472000      .000      .000  
+75 124 42436.00 I  -.042603  .023491   .285155  .013692  I  .6457559  .0005823  2.5567 0.3211  P    38.256     .500      .752     .300  -.032000   .292000   .6443000      .000      .000  
+75 125 42437.00 I  -.042021  .022965   .286350  .010985  I  .6431682  .0002710  2.6332 0.3211  P    38.354     .500      .637     .300  -.032000   .293000   .6415000      .000      .000  
+75 126 42438.00 I  -.041394  .027165   .287570  .009970  I  .6404612  .0002710  2.7945 0.1916  P    38.593     .500      .314     .300  -.031000   .293000   .6386000      .000      .000  
+75 127 42439.00 I  -.040726  .026099   .288813  .009830  I  .6375585  .0002710  3.0179 0.1916  P    38.925     .500      .093     .300  -.030000   .294000   .6358000      .000      .000  
+75 128 42440.00 I  -.040018  .025657   .290078  .012892  I  .6344222  .0002710  3.2507 0.1916  P    39.206     .500      .188     .300  -.029000   .295000   .6328000      .000      .000  
+75 129 42441.00 I  -.039271  .024739   .291366  .011992  I  .6310758  .0002710  3.4272 0.1916  P    39.306     .500      .475     .300  -.028000   .295000   .6299000      .000      .000  
+75 130 42442.00 I  -.038487  .027779   .292676  .010691  I  .6276040  .0002710  3.4949 0.1916  P    39.260     .500      .689     .300  -.026000   .296000   .6269000      .000      .000  
+75 131 42443.00 I  -.037672  .023350   .294007  .018348  I  .6241280  .0002710  3.4366 0.1916  P    39.181     .500      .734     .300  -.025000   .296000   .6240000      .000      .000  
+75 2 1 42444.00 I  -.036831  .022707   .295362  .018633  I  .6207651  .0002710  3.2755 0.1916  P    39.094     .500      .697     .300  -.024000   .297000   .6210000      .000      .000  
+75 2 2 42445.00 I  -.035972  .014775   .296738  .019207  I  .6175948  .0002710  3.0610 0.1916  P    38.964     .500      .628     .300  -.023000   .298000   .6181000      .000      .000  
+75 2 3 42446.00 I  -.035098  .017407   .298134  .019805  I  .6146428  .0002710  2.8472 0.1916  P    38.826     .500      .468     .300  -.022000   .299000   .6151000      .000      .000  
+75 2 4 42447.00 I  -.034215  .016949   .299551  .018489  I  .6118869  .0002710  2.6737 0.1916  P    38.736     .500      .203     .300  -.022000   .300000   .6122000      .000      .000  
+75 2 5 42448.00 I  -.033323  .020700   .300984  .018641  I  .6092753  .0002710  2.5603 0.1916  P    38.642     .500     -.053     .300  -.021000   .301000   .6092000      .000      .000  
+75 2 6 42449.00 I  -.032428  .016985   .302432  .017931  I  .6067448  .0002710  2.5112 0.1916  P    38.471     .500     -.185     .300  -.020000   .302000   .6063000      .000      .000  
+75 2 7 42450.00 I  -.031533  .016188   .303890  .013287  I  .6042334  .0002710  2.5205 0.1916  P    38.296     .500     -.206     .300  -.019000   .303000   .6034000      .000      .000  
+75 2 8 42451.00 I  -.030641  .016046   .305355  .012596  I  .6016879  .0002710  2.5775 0.1916  P    38.280     .500     -.197     .300  -.018000   .304000   .6005000      .000      .000  
+75 2 9 42452.00 I  -.029752  .021826   .306822  .014655  I  .5990674  .0002710  2.6675 0.1916  P    38.470     .500     -.171     .300  -.018000   .306000   .5975000      .000      .000  
+75 210 42453.00 I  -.028867  .019896   .308289  .014059  I  .5963479  .0002710  2.7723 0.1916  P    38.756     .500     -.075     .300  -.017000   .307000   .5946000      .000      .000  
+75 211 42454.00 I  -.027985  .020009   .309752  .013988  I  .5935241  .0002710  2.8730 0.1916  P    39.002     .500      .075     .300  -.016000   .308000   .5917000      .000      .000  
+75 212 42455.00 I  -.027107  .017072   .311208  .013989  I  .5906088  .0002710  2.9528 0.1916  P    39.124     .500      .152     .300  -.015000   .309000   .5888000      .000      .000  
+75 213 42456.00 I  -.026233  .017678   .312651  .016142  I  .5876293  .0002710  3.0001 0.1916  P    39.092     .500      .059     .300  -.014000   .310000   .5859000      .000      .000  
+75 214 42457.00 I  -.025359  .018935   .314078  .014714  I  .5846213  .0002710  3.0094 0.1916  P    38.986     .500     -.146     .300  -.014000   .312000   .5830000      .000      .000  
+75 215 42458.00 I  -.024481  .020649   .315489  .017452  I  .5816232  .0002710  2.9808 0.1916  P    38.969     .500     -.328     .300  -.013000   .313000   .5801000      .000      .000  
+75 216 42459.00 I  -.023595  .014177   .316880  .015465  I  .5786704  .0002710  2.9202 0.1916  P    39.099     .500     -.448     .300  -.012000   .314000   .5772000      .000      .000  
+75 217 42460.00 I  -.022698  .014375   .318250  .015363  I  .5757901  .0002710  2.8377 0.1916  P    39.194     .500     -.588     .300  -.011000   .315000   .5743000      .000      .000  
+75 218 42461.00 I  -.021785  .015949   .319596  .014755  I  .5729971  .0002710  2.7488 0.1916  P    39.041     .500     -.782     .300  -.011000   .316000   .5714000      .000      .000  
+75 219 42462.00 I  -.020854  .017702   .320913  .014759  I  .5702878  .0002710  2.6741 0.1916  P    38.674     .500     -.915     .300  -.010000   .318000   .5686000      .000      .000  
+75 220 42463.00 I  -.019901  .018204   .322199  .013429  I  .5676357  .0002710  2.6390 0.1916  P    38.323     .500     -.883     .300  -.010000   .319000   .5657000      .000      .000  
+75 221 42464.00 I  -.018922  .017853   .323451  .014297  I  .5649878  .0002710  2.6697 0.1916  P    38.140     .500     -.796     .300  -.009000   .320000   .5628000      .000      .000  
+75 222 42465.00 I  -.017916  .015959   .324668  .011230  I  .5622687  .0002710  2.7831 0.4960  P    38.127     .500     -.867     .300  -.008000   .321000   .5600000      .000      .000  
+75 223 42466.00 I  -.016879  .016534   .325847  .010394  I  .5593957  .0009542  2.9744 0.4960  P    38.252     .500    -1.110     .300  -.008000   .322000   .5572000      .000      .000  
+75 224 42467.00 I  -.015812  .016512   .326987  .012503  I  .5563054  .0009542  3.2094 0.6747  P    38.485     .500    -1.267     .300  -.007000   .323000   .5543000      .000      .000  
+75 225 42468.00 I  -.014712  .027310   .328087  .013680  I  .5529823  .0009542  3.4284 0.6747  P    38.732     .500    -1.130     .300  -.007000   .324000   .5515000      .000      .000  
+75 226 42469.00 I  -.013581  .026073   .329149  .015755  I  .5494757  .0009542  3.5663 0.6747  P    38.893     .500     -.821     .300  -.006000   .325000   .5487000      .000      .000  
+75 227 42470.00 I  -.012420  .025357   .330173  .014861  I  .5458914  .0009542  3.5793 0.5872  P    38.975     .500     -.635     .300  -.006000   .326000   .5459000      .000      .000  
+75 228 42471.00 I  -.011231  .024959   .331158  .012962  I  .5423600  .0006845  3.4636 0.4840  P    39.018     .500     -.681     .300  -.005000   .327000   .5432000      .000      .000  
+75 3 1 42472.00 I  -.010016  .025611   .332105  .014933  I  .5389947  .0001625  3.2562 0.3518  P    38.985     .500     -.828     .300  -.005000   .327000   .5404000      .000      .000  
+75 3 2 42473.00 I  -.008773  .026568   .333012  .014809  I  .5358580  .0001625  3.0174 0.1472  P    38.853     .500     -.969     .300  -.004000   .328000   .5377000      .000      .000  
+75 3 3 42474.00 I  -.007500  .026451   .333880  .013388  I  .5329514  .0002456  2.8042 0.1472  P    38.758     .500    -1.159     .300  -.004000   .329000   .5349000      .000      .000  
+75 3 4 42475.00 I  -.006197  .015960   .334705  .012026  I  .5302293  .0002456  2.6521 0.1737  P    38.824     .500    -1.454     .300  -.004000   .330000   .5321000      .000      .000  
+75 3 5 42476.00 I  -.004863  .017065   .335489  .009368  I  .5276233  .0002456  2.5719 0.1965  P    38.914     .500    -1.745     .300  -.003000   .331000   .5292000      .000      .000  
+75 3 6 42477.00 I  -.003500  .023307   .336232  .009321  I  .5250636  .0003069  2.5574 0.1965  P    38.778     .500    -1.889     .300  -.003000   .331000   .5264000      .000      .000  
+75 3 7 42478.00 I  -.002108  .029753   .336934  .009360  I  .5224911  .0003069  2.5950 0.2170  P    38.452     .500    -1.896     .300  -.002000   .332000   .5235000      .000      .000  
+75 3 8 42479.00 I  -.000692  .029555   .337597  .005197  I  .5198611  .0003069  2.6700 0.2047  P    38.286     .500    -1.890     .300  -.002000   .333000   .5207000      .000      .000  
+75 3 9 42480.00 I   .000744  .028481   .338223  .005257  I  .5171438  .0002710  2.7668 0.2047  P    38.513     .500    -1.901     .300  -.002000   .334000   .5178000      .000      .000  
+75 310 42481.00 I   .002194  .028602   .338812  .010660  I  .5143260  .0002710  2.8681 0.1916  P    38.986     .500    -1.835     .300  -.001000   .334000   .5149000      .000      .000  
+75 311 42482.00 I   .003653  .028150   .339365  .010763  I  .5114119  .0002710  2.9564 0.1916  P    39.396     .500    -1.665     .300  -.001000   .335000   .5121000      .000      .000  
+75 312 42483.00 I   .005126  .026852   .339885  .010375  I  .5084225  .0002710  3.0167 0.1916  P    39.591     .500    -1.533     .300   .000000   .335000   .5092000      .000      .000  
+75 313 42484.00 I   .006613  .021501   .340372  .011366  I  .5053905  .0002710  3.0408 0.1916  P    39.605     .500    -1.605     .300   .000000   .336000   .5063000      .000      .000  
+75 314 42485.00 I   .008116  .009967   .340829  .013656  I  .5023538  .0002710  3.0262 0.1916  P    39.548     .500    -1.867     .300   .001000   .337000   .5033000      .000      .000  
+75 315 42486.00 I   .009635  .010404   .341255  .014170  I  .4993497  .0002710  2.9769 0.1916  P    39.541     .500    -2.147     .300   .001000   .337000   .5003000      .000      .000  
+75 316 42487.00 I   .011171  .014487   .341651  .014443  I  .4964084  .0002710  2.9024 0.1916  P    39.650     .500    -2.319     .300   .002000   .338000   .4974000      .000      .000  
+75 317 42488.00 I   .012726  .015678   .342017  .010889  I  .4935487  .0002710  2.8166 0.1916  P    39.795     .500    -2.415     .300   .002000   .338000   .4944000      .000      .000  
+75 318 42489.00 I   .014304  .014246   .342352  .011073  I  .4907725  .0002710  2.7389 0.1916  P    39.814     .500    -2.520     .300   .003000   .339000   .4914000      .000      .000  
+75 319 42490.00 I   .015905  .014675   .342660  .011739  I  .4880607  .0002710  2.6919 0.1916  P    39.657     .500    -2.629     .300   .004000   .340000   .4883000      .000      .000  
+75 320 42491.00 I   .017531  .014824   .342942  .013082  I  .4853706  .0002710  2.6993 0.1916  P    39.464     .500    -2.682     .300   .005000   .340000   .4852000      .000      .000  
+75 321 42492.00 I   .019180  .018094   .343198  .011215  I  .4826378  .0002710  2.7795 0.1916  P    39.396     .500    -2.701     .300   .005000   .341000   .4821000      .000      .000  
+75 322 42493.00 I   .020849  .018025   .343430  .011563  I  .4797859  .0002710  2.9369 0.2593  P    39.488     .500    -2.786     .300   .006000   .341000   .4790000      .000      .000  
+75 323 42494.00 I   .022537  .015014   .343638  .011325  I  .4767436  .0004421  3.1554 0.2593  P    39.668     .500    -2.936     .300   .007000   .342000   .4759000      .000      .000  
+75 324 42495.00 I   .024242  .013963   .343820  .013510  I  .4734686  .0004421  3.3932 0.3126  P    39.827     .500    -2.979     .300   .008000   .342000   .4727000      .000      .000  
+75 325 42496.00 I   .025962  .015343   .343976  .014857  I  .4699702  .0004421  3.5919 0.3126  P    39.877     .500    -2.780     .300   .009000   .343000   .4695000      .000      .000  
+75 326 42497.00 I   .027694  .014774   .344104  .017618  I  .4663166  .0004421  3.6952 0.3126  P    39.812     .500    -2.461     .300   .010000   .343000   .4664000      .000      .000  
+75 327 42498.00 I   .029437  .015044   .344201  .016367  I  .4626221  .0004421  3.6715 0.3126  P    39.733     .500    -2.302     .300   .011000   .344000   .4632000      .000      .000  
+75 328 42499.00 I   .031187  .016712   .344266  .015578  I  .4590129  .0004421  3.5298 0.2593  P    39.715     .500    -2.422     .300   .012000   .344000   .4600000      .000      .000  
+75 329 42500.00 I   .032941  .015697   .344294  .015187  I  .4555869  .0002710  3.3150 0.2932  P    39.702     .500    -2.665     .300   .013000   .344000   .4569000      .000      .000  
+75 330 42501.00 I   .034696  .015756   .344283  .015494  I  .4523866  .0003853  3.0890 0.2355  P    39.636     .500    -2.841     .300   .015000   .344000   .4538000      .000      .000  
+75 331 42502.00 I   .036448  .019185   .344232  .013966  I  .4493950  .0003853  2.9046 0.2724  P    39.626     .500    -2.938     .300   .016000   .344000   .4507000      .000      .000  
+75 4 1 42503.00 I   .038197  .018087   .344141  .012700  I  .4465544  .0003853  2.7893 0.2724  P    39.785     .500    -3.052     .300   .018000   .344000   .4476000      .000      .000  
+75 4 2 42504.00 I   .039936  .018807   .344009  .008052  I  .4437925  .0003853  2.7456 0.2724  P    39.958     .500    -3.190     .300   .019000   .344000   .4445000      .000      .000  
+75 4 3 42505.00 I   .041661  .018590   .343836  .007529  I  .4410437  .0003853  2.7603 0.2724  P    39.852     .500    -3.280     .300   .020000   .344000   .4415000      .000      .000  
+75 4 4 42506.00 I   .043367  .015648   .343622  .008367  I  .4382584  .0003853  2.8156 0.2355  P    39.493     .500    -3.320     .300   .021000   .344000   .4386000      .000      .000  
+75 4 5 42507.00 I   .045053  .015515   .343367  .008001  I  .4354043  .0002710  2.8954 0.2355  P    39.294     .500    -3.379     .300   .023000   .345000   .4356000      .000      .000  
+75 4 6 42508.00 I   .046719  .017748   .343070  .008399  I  .4324646  .0002710  2.9843 0.1916  P    39.556     .500    -3.449     .300   .024000   .345000   .4327000      .000      .000  
+75 4 7 42509.00 I   .048364  .013572   .342730  .011161  I  .4294378  .0002710  3.0668 0.1916  P    40.091     .500    -3.423     .300   .025000   .345000   .4297000      .000      .000  
+75 4 8 42510.00 I   .049985  .017553   .342348  .011085  I  .4263381  .0002710  3.1278 0.1916  P    40.474     .500    -3.259     .300   .026000   .345000   .4268000      .000      .000  
+75 4 9 42511.00 I   .051578  .018329   .341921  .010870  I  .4231931  .0002710  3.1560 0.1916  P    40.524     .500    -3.090     .300   .027000   .345000   .4239000      .000      .000  
+75 410 42512.00 I   .053137  .022640   .341449  .010892  I  .4200387  .0002710  3.1464 0.1916  P    40.372     .500    -3.094     .300   .029000   .345000   .4211000      .000      .000  
+75 411 42513.00 I   .054661  .023079   .340931  .010201  I  .4169125  .0002710  3.1004 0.1916  P    40.203     .500    -3.293     .300   .030000   .345000   .4182000      .000      .000  
+75 412 42514.00 I   .056146  .024106   .340369  .012818  I  .4138476  .0002710  3.0255 0.1916  P    40.109     .500    -3.548     .300   .031000   .345000   .4153000      .000      .000  
+75 413 42515.00 I   .057593  .022407   .339764  .011848  I  .4108669  .0002710  2.9344 0.1916  P    40.136     .500    -3.724     .300   .032000   .345000   .4124000      .000      .000  
+75 414 42516.00 I   .058999  .022761   .339119  .009958  I  .4079785  .0002710  2.8443 0.1916  P    40.285     .500    -3.809     .300   .033000   .345000   .4095000      .000      .000  
+75 415 42517.00 I   .060367  .019979   .338435  .010111  I  .4051706  .0002710  2.7773 0.1916  P    40.460     .500    -3.869     .300   .035000   .344000   .4065000      .000      .000  
+75 416 42518.00 I   .061701  .019270   .337716  .010759  I  .4024088  .0002710  2.7557 0.1916  P    40.538     .500    -3.941     .300   .036000   .344000   .4036000      .000      .000  
+75 417 42519.00 I   .063009  .019183   .336966  .020934  I  .3996382  .0002710  2.7970 0.1916  P    40.515     .500    -4.017     .300   .037000   .344000   .4007000      .000      .000  
+75 418 42520.00 I   .064296  .016990   .336186  .021301  I  .3967917  .0002710  2.9075 0.1356  P    40.515     .500    -4.089     .300   .038000   .343000   .3977000      .000      .000  
+75 419 42521.00 I   .065567  .015814   .335382  .019725  I  .3938035  .0000076  3.0772 0.1356  P    40.648     .500    -4.168     .300   .039000   .343000   .3947000      .000      .000  
+75 420 42522.00 I   .066826  .019725   .334554  .019875  I  .3906270  .0000076  3.2780 0.0054  P    40.892     .500    -4.224     .300   .041000   .342000   .3917000      .000      .000  
+75 421 42523.00 I   .068077  .020744   .333704  .019108  I  .3872515  .0000076  3.4669 0.1804  P    41.099     .500    -4.160     .300   .042000   .342000   .3887000      .000      .000  
+75 422 42524.00 I   .069321  .023399   .332833  .021009  I  .3837133  .0003608  3.5956 0.1804  P    41.112     .500    -3.916     .300   .043000   .341000   .3857000      .000      .000  
+75 423 42525.00 I   .070557  .023884   .331940  .020543  I  .3800930  .0003608  3.6261 0.2551  P    40.908     .500    -3.593     .300   .044000   .340000   .3826000      .000      .000  
+75 424 42526.00 I   .071788  .020385   .331024  .011059  I  .3764981  .0003608  3.5455 0.3124  P    40.627     .500    -3.417     .300   .045000   .339000   .3796000      .000      .000  
+75 425 42527.00 I   .073014  .021086   .330086  .021849  I  .3730323  .0005102  3.3741 0.3124  P    40.429     .500    -3.518     .300   .046000   .338000   .3765000      .000      .000  
+75 426 42528.00 I   .074238  .022092   .329124  .022757  I  .3697646  .0005102  3.1587 0.3157  P    40.357     .500    -3.783     .300   .047000   .337000   .3735000      .000      .000  
+75 427 42529.00 I   .075463  .023969   .328141  .022638  I  .3667112  .0003719  2.9545 0.2630  P    40.374     .500    -3.977     .300   .048000   .336000   .3704000      .000      .000  
+75 428 42530.00 I   .076690  .024582   .327137  .023180  I  .3638376  .0001276  2.8041 0.1935  P    40.490     .500    -3.987     .300   .049000   .335000   .3674000      .000      .000  
+75 429 42531.00 I   .077921  .021790   .326113  .021730  I  .3610792  .0001069  2.7249 0.0832  P    40.706     .500    -3.887     .300   .050000   .334000   .3643000      .000      .000  
+75 430 42532.00 I   .079157  .020791   .325068  .023010  I  .3583660  .0001069  2.7111 0.0771  P    40.870     .500    -3.810     .300   .051000   .332000   .3613000      .000      .000  
+75 5 1 42533.00 I   .080398  .020809   .324001  .022596  I  .3556415  .0001112  2.7439 0.0771  P    40.772     .500    -3.829     .300   .052000   .331000   .3582000      .000      .000  
+75 5 2 42534.00 I   .081641  .025199   .322911  .014921  I  .3528694  .0001112  2.8032 0.2490  P    40.455     .500    -3.952     .300   .053000   .330000   .3552000      .000      .000  
+75 5 3 42535.00 I   .082882  .025309   .321798  .013709  I  .3500319  .0004854  2.8721 0.2490  P    40.256     .500    -4.145     .300   .054000   .329000   .3522000      .000      .000  
+75 5 4 42536.00 I   .084121  .023017   .320663  .017797  I  .3471267  .0004854  2.9364 0.3827  P    40.414     .500    -4.312     .300   .055000   .327000   .3492000      .000      .000  
+75 5 5 42537.00 I   .085356  .020825   .319504  .017220  I  .3441649  .0005918  2.9832 0.3827  P    40.754     .500    -4.337     .300   .055000   .326000   .3462000      .000      .000  
+75 5 6 42538.00 I   .086586  .021746   .318325  .016862  I  .3411700  .0005918  3.0010 0.5090  P    40.897     .500    -4.200     .300   .056000   .324000   .3432000      .000      .000  
+75 5 7 42539.00 I   .087811  .021790   .317127  .021524  I  .3381746  .0008283  2.9837 0.5090  P    40.691     .500    -4.027     .300   .057000   .323000   .3402000      .000      .000  
+75 5 8 42540.00 I   .089031  .024637   .315913  .021903  I  .3352143  .0008283  2.9312 0.4358  P    40.305     .500    -3.963     .300   .058000   .322000   .3373000      .000      .000  
+75 5 9 42541.00 I   .090241  .019422   .314689  .020433  I  .3323221  .0002710  2.8489 0.4358  P    39.960     .500    -4.026     .300   .059000   .321000   .3344000      .000      .000  
+75 510 42542.00 I   .091439  .019385   .313459  .021471  I  .3295229  .0002710  2.7474 0.1916  P    39.749     .500    -4.136     .300   .059000   .319000   .3314000      .000      .000  
+75 511 42543.00 I   .092621  .016215   .312226  .020481  I  .3268285  .0002710  2.6424 0.1916  P    39.691     .500    -4.231     .300   .060000   .318000   .3285000      .000      .000  
+75 512 42544.00 I   .093786  .025007   .310993  .021438  I  .3242325  .0002710  2.5543 0.1916  P    39.806     .500    -4.320     .300   .061000   .317000   .3256000      .000      .000  
+75 513 42545.00 I   .094932  .024534   .309761  .021070  I  .3217068  .0002710  2.5056 0.1916  P    40.054     .500    -4.417     .300   .062000   .316000   .3228000      .000      .000  
+75 514 42546.00 I   .096058  .025432   .308531  .015751  I  .3192016  .0002710  2.5159 0.1916  P    40.291     .500    -4.493     .300   .063000   .314000   .3200000      .000      .000  
+75 515 42547.00 I   .097163  .022993   .307303  .016795  I  .3166529  .0002710  2.5924 0.1916  P    40.377     .500    -4.511     .300   .064000   .313000   .3172000      .000      .000  
+75 516 42548.00 I   .098247  .023162   .306076  .018229  I  .3139979  .0002710  2.7256 0.1916  P    40.308     .500    -4.470     .300   .065000   .311000   .3144000      .000      .000  
+75 517 42549.00 I   .099311  .022905   .304848  .018864  I  .3111915  .0002710  2.8895 0.1916  P    40.209     .500    -4.401     .300   .066000   .310000   .3116000      .000      .000  
+75 518 42550.00 I   .100359  .023467   .303619  .016544  I  .3082210  .0002710  3.0471 0.1485  P    40.208     .500    -4.319     .300   .067000   .309000   .3089000      .000      .000  
+75 519 42551.00 I   .101397  .013929   .302388  .015767  I  .3051124  .0001217  3.1593 0.1485  P    40.312     .500    -4.196     .300   .068000   .308000   .3061000      .000      .000  
+75 520 42552.00 I   .102426  .013407   .301158  .018793  I  .3019278  .0001217  3.1951 0.0861  P    40.399     .500    -3.995     .300   .069000   .306000   .3034000      .000      .000  
+75 521 42553.00 I   .103450  .015856   .299929  .017598  I  .2987524  .0001217  3.1401 0.0861  P    40.331     .500    -3.742     .300   .070000   .305000   .3006000      .000      .000  
+75 522 42554.00 I   .104473  .016796   .298699  .016208  I  .2956753  .0001217  3.0020 0.0861  P    40.074     .500    -3.556     .300   .071000   .304000   .2979000      .000      .000  
+75 523 42555.00 I   .105500  .016462   .297467  .016761  I  .2927661  .0001217  2.8107 0.0810  P    39.733     .500    -3.562     .300   .072000   .303000   .2952000      .000      .000  
+75 524 42556.00 I   .106539  .015430   .296233  .017860  I  .2900570  .0001068  2.6099 0.0755  P    39.479     .500    -3.748     .300   .073000   .302000   .2926000      .000      .000  
+75 525 42557.00 I   .107595  .016900   .294997  .017778  I  .2875349  .0000895  2.4433 0.0697  P    39.434     .500    -3.941     .300   .074000   .300000   .2899000      .000      .000  
+75 526 42558.00 I   .108671  .017884   .293758  .017764  I  .2851496  .0000895  2.3392 0.0633  P    39.610     .500    -3.962     .300   .075000   .299000   .2873000      .000      .000  
+75 527 42559.00 I   .109773  .017986   .292518  .014607  I  .2828336  .0000895  2.3039 0.0633  P    39.883     .500    -3.800     .300   .076000   .298000   .2846000      .000      .000  
+75 528 42560.00 I   .110906  .014728   .291275  .015041  I  .2805229  .0000895  2.3253 0.1133  P    40.054     .500    -3.609     .300   .077000   .297000   .2820000      .000      .000  
+75 529 42561.00 I   .112075  .013825   .290031  .014718  I  .2781713  .0002081  2.3819 0.1937  P    39.990     .500    -3.564     .300   .079000   .295000   .2795000      .000      .000  
+75 530 42562.00 I   .113283  .016841   .288785  .014134  I  .2757543  .0003770  2.4529 0.3109  P    39.751     .500    -3.721     .300   .080000   .294000   .2769000      .000      .000  
+75 531 42563.00 I   .114533  .016471   .287537  .012143  I  .2732663  .0005859  2.5216 0.3490  P    39.531     .500    -3.991     .300   .082000   .292000   .2744000      .000      .000  
+75 6 1 42564.00 I   .115825  .018141   .286288  .011891  I  .2707160  .0005875  2.5757 0.4149  P    39.455     .500    -4.207     .300   .083000   .291000   .2718000      .000      .000  
+75 6 2 42565.00 I   .117160  .021320   .285035  .012244  I  .2681232  .0005875  2.6050 0.4154  P    39.452     .500    -4.244     .300   .084000   .290000   .2693000      .000      .000  
+75 6 3 42566.00 I   .118536  .022033   .283780  .019172  I  .2655170  .0005875  2.6015 0.4414  P    39.340     .500    -4.116     .300   .086000   .289000   .2668000      .000      .000  
+75 6 4 42567.00 I   .119950  .022356   .282521  .020437  I  .2629321  .0006588  2.5624 0.4726  P    39.017     .500    -3.955     .300   .087000   .287000   .2643000      .000      .000  
+75 6 5 42568.00 I   .121398  .024367   .281258  .020572  I  .2604028  .0007404  2.4916 0.4429  P    38.532     .500    -3.872     .300   .089000   .286000   .2618000      .000      .000  
+75 6 6 42569.00 I   .122879  .022303   .279990  .019558  I  .2579562  .0005922  2.3988 0.3942  P    38.028     .500    -3.851     .300   .090000   .285000   .2593000      .000      .000  
+75 6 7 42570.00 I   .124388  .025349   .278717  .018663  I  .2556079  .0002710  2.2978 0.3256  P    37.638     .500    -3.820     .300   .092000   .284000   .2568000      .000      .000  
+75 6 8 42571.00 I   .125921  .027449   .277438  .019318  I  .2533572  .0002710  2.2069 0.1916  P    37.447     .500    -3.788     .300   .093000   .282000   .2544000      .000      .000  
+75 6 9 42572.00 I   .127474  .024856   .276154  .026624  I  .2511834  .0002710  2.1481 0.1916  P    37.489     .500    -3.842     .300   .095000   .281000   .2519000      .000      .000  
+75 610 42573.00 I   .129037  .027006   .274864  .021990  I  .2490428  .0002710  2.1437 0.1916  P    37.726     .500    -3.999     .300   .096000   .279000   .2495000      .000      .000  
+75 611 42574.00 I   .130603  .029281   .273567  .021064  I  .2468736  .0002710  2.2063 0.1916  P    38.032     .500    -4.133     .300   .098000   .278000   .2470000      .000      .000  
+75 612 42575.00 I   .132165  .026834   .272260  .021442  I  .2446096  .0002710  2.3307 0.1916  P    38.207     .500    -4.097     .300   .100000   .277000   .2446000      .000      .000  
+75 613 42576.00 I   .133713  .029198   .270945  .023301  I  .2422005  .0002710  2.4903 0.1916  P    38.093     .500    -3.870     .300   .101000   .275000   .2422000      .000      .000  
+75 614 42577.00 I   .135237  .026775   .269625  .026334  I  .2396310  .0002710  2.6440 0.5153  P    37.703     .500    -3.571     .300   .103000   .274000   .2398000      .000      .000  
+75 615 42578.00 I   .136725  .026548   .268302  .026009  I  .2369286  .0009943  2.7494 0.4036  P    37.236     .500    -3.338     .300   .104000   .272000   .2374000      .000      .000  
+75 616 42579.00 I   .138167  .025969   .266980  .023202  I  .2341584  .0007603  2.7764 0.6258  P    36.936     .500    -3.225     .300   .106000   .271000   .2350000      .000      .000  
+75 617 42580.00 I   .139554  .025914   .265660  .026829  I  .2314051  .0007603  2.7156 0.5376  P    36.893     .500    -3.183     .300   .108000   .270000   .2326000      .000      .000  
+75 618 42581.00 I   .140882  .023994   .264345  .028703  I  .2287524  .0007603  2.5790 0.5376  P    36.960     .500    -3.137     .300   .109000   .268000   .2303000      .000      .000  
+75 619 42582.00 I   .142146  .030650   .263038  .031243  I  .2262630  .0007603  2.3945 0.5350  P    36.889     .500    -3.073     .300   .111000   .267000   .2279000      .000      .000  
+75 620 42583.00 I   .143336  .029711   .261738  .029269  I  .2239675  .0007530  2.1975 0.4833  P    36.559     .500    -3.057     .300   .112000   .265000   .2256000      .000      .000  
+75 621 42584.00 I   .144446  .029705   .260444  .026524  I  .2218601  .0005969  2.0240 0.5272  P    36.107     .500    -3.149     .300   .114000   .264000   .2232000      .000      .000  
+75 622 42585.00 I   .145469  .025687   .259152  .026820  I  .2199022  .0007382  1.9022 0.4747  P    35.815     .500    -3.303     .300   .115000   .263000   .2209000      .000      .000  
+75 623 42586.00 I   .146405  .027583   .257856  .024668  I  .2180341  .0007382  1.8450 0.5220  P    35.839     .500    -3.385     .300   .117000   .261000   .2187000      .000      .000  
+75 624 42587.00 I   .147255  .026242   .256553  .021921  I  .2161921  .0007382  1.8480 0.5220  P    36.067     .500    -3.310     .300   .118000   .260000   .2164000      .000      .000  
+75 625 42588.00 I   .148021  .030116   .255237  .019152  I  .2143237  .0007382  1.8943 0.5840  P    36.253     .500    -3.142     .300   .120000   .258000   .2142000      .000      .000  
+75 626 42589.00 I   .148702  .023205   .253903  .014634  I  .2123966  .0009052  1.9615 0.5840  P    36.257     .500    -3.036     .300   .121000   .257000   .2119000      .000      .000  
+75 627 42590.00 I   .149300  .024080   .252549  .018273  I  .2104005  .0009052  2.0293 0.6401  P    36.105     .500    -3.092     .300   .122000   .255000   .2098000      .000      .000  
+75 628 42591.00 I   .149817  .024227   .251173  .019908  I  .2083430  .0009052  2.0820 0.6401  P    35.867     .500    -3.276     .300   .123000   .254000   .2077000      .000      .000  
+75 629 42592.00 I   .150256  .026242   .249773  .027163  I  .2062449  .0009052  2.1096 0.6401  P    35.587     .500    -3.452     .300   .125000   .252000   .2055000      .000      .000  
+75 630 42593.00 I   .150620  .024327   .248350  .025556  I  .2041341  .0009052  2.1064 0.6401  P    35.326     .500    -3.499     .300   .126000   .251000   .2034000      .000      .000  
+75 7 1 42594.00 I   .150907  .022889   .246906  .024865  I  .2020430  .0009052  2.0704 0.4724  P    35.137     .500    -3.419     .300   .127000   .249000   .2013000      .000      .000  
+75 7 2 42595.00 I   .151121  .023680   .245438  .026638  I  .2000033  .0002710  2.0044 0.4724  P    34.943     .500    -3.326     .300   .128000   .247000   .1993000      .000      .000  
+75 7 3 42596.00 I   .151264  .026477   .243945  .026940  I  .1980417  .0002710  1.9160 0.1916  P    34.572     .500    -3.321     .300   .129000   .246000   .1973000      .000      .000  
+75 7 4 42597.00 I   .151341  .024358   .242428  .024600  I  .1961746  .0002710  1.8178 0.1916  P    33.978     .500    -3.360     .300   .129000   .244000   .1953000      .000      .000  
+75 7 5 42598.00 I   .151357  .025867   .240886  .024994  I  .1944039  .0002710  1.7261 0.1916  P    33.370     .500    -3.330     .300   .130000   .243000   .1933000      .000      .000  
+75 7 6 42599.00 I   .151316  .026980   .239321  .021832  I  .1927134  .0002710  1.6612 0.1916  P    33.030     .500    -3.230     .300   .131000   .241000   .1913000      .000      .000  
+75 7 7 42600.00 I   .151218  .027831   .237734  .022291  I  .1910650  .0002710  1.6456 0.1916  P    33.057     .500    -3.206     .300   .131000   .239000   .1893000      .000      .000  
+75 7 8 42601.00 I   .151067  .028588   .236130  .022331  I  .1893995  .0002710  1.6979 0.1916  P    33.337     .500    -3.350     .300   .132000   .238000   .1874000      .000      .000  
+75 7 9 42602.00 I   .150864  .023536   .234510  .022270  I  .1876449  .0002710  1.8229 0.1916  P    33.678     .500    -3.532     .300   .132000   .236000   .1854000      .000      .000  
+75 710 42603.00 I   .150608  .020407   .232880  .025206  I  .1857359  .0002710  2.0013 0.1916  P    33.892     .500    -3.509     .300   .133000   .235000   .1835000      .000      .000  
+75 711 42604.00 I   .150303  .020456   .231240  .025791  I  .1836383  .0002710  2.1915 0.1916  P    33.802     .500    -3.201     .300   .133000   .233000   .1815000      .000      .000  
+75 712 42605.00 I   .149951  .019155   .229592  .024384  I  .1813664  .0002710  2.3410 0.1916  P    33.336     .500    -2.778     .300   .133000   .231000   .1796000      .000      .000  
+75 713 42606.00 I   .149556  .021203   .227935  .019476  I  .1789845  .0002710  2.4060 0.1916  P    32.638     .500    -2.481     .300   .133000   .230000   .1777000      .000      .000  
+75 714 42607.00 I   .149123  .020441   .226270  .018441  I  .1765882  .0002710  2.3696 0.1916  P    32.010     .500    -2.412     .300   .134000   .228000   .1758000      .000      .000  
+75 715 42608.00 I   .148659  .023203   .224596  .018318  I  .1742749  .0002710  2.2444 0.1916  P    31.697     .500    -2.514     .300   .134000   .227000   .1739000      .000      .000  
+75 716 42609.00 I   .148167  .022357   .222915  .016658  I  .1721174  .0002710  2.0650 0.1916  P    31.705     .500    -2.672     .300   .134000   .225000   .1720000      .000      .000  
+75 717 42610.00 I   .147651  .022529   .221225  .011073  I  .1701488  .0002710  1.8737 0.1916  P    31.813     .500    -2.809     .300   .134000   .223000   .1702000      .000      .000  
+75 718 42611.00 I   .147119  .022850   .219529  .011508  I  .1683616  .0002710  1.7076 0.1916  P    31.758     .500    -2.908     .300   .134000   .221000   .1683000      .000      .000  
+75 719 42612.00 I   .146579  .022336   .217826  .010793  I  .1667168  .0002710  1.5920 0.1916  P    31.465     .500    -2.988     .300   .135000   .220000   .1665000      .000      .000  
+75 720 42613.00 I   .146036  .015432   .216118  .012428  I  .1651568  .0002710  1.5390 0.1916  P    31.118     .500    -3.063     .300   .135000   .218000   .1646000      .000      .000  
+75 721 42614.00 I   .145495  .017941   .214404  .014705  I  .1636182  .0002710  1.5479 0.1916  P    30.958     .500    -3.114     .300   .135000   .216000   .1628000      .000      .000  
+75 722 42615.00 I   .144958  .015196   .212684  .014862  I  .1620442  .0002710  1.6071 0.1916  P    31.029     .500    -3.095     .300   .135000   .214000   .1610000      .000      .000  
+75 723 42616.00 I   .144430  .015453   .210958  .013235  I  .1603935  .0002710  1.6977 0.1916  P    31.170     .500    -2.985     .300   .135000   .213000   .1592000      .000      .000  
+75 724 42617.00 I   .143917  .015271   .209226  .014678  I  .1586456  .0002710  1.7979 0.1916  P    31.223     .500    -2.825     .300   .135000   .211000   .1573000      .000      .000  
+75 725 42618.00 I   .143422  .017232   .207487  .013351  I  .1568008  .0002710  1.8887 0.4314  P    31.149     .500    -2.704     .300   .135000   .210000   .1555000      .000      .000  
+75 726 42619.00 I   .142948  .017121   .205744  .013281  I  .1548759  .0008191  1.9565 0.4314  P    30.942     .500    -2.698     .300   .135000   .208000   .1537000      .000      .000  
+75 727 42620.00 I   .142495  .020242   .203995  .011738  I  .1528981  .0008191  1.9936 0.5792  P    30.617     .500    -2.799     .300   .135000   .206000   .1518000      .000      .000  
+75 728 42621.00 I   .142061  .020845   .202241  .008943  I  .1508998  .0008191  1.9975 0.5792  P    30.316     .500    -2.919     .300   .135000   .204000   .1499000      .000      .000  
+75 729 42622.00 I   .141647  .019441   .200481  .010228  I  .1489135  .0008191  1.9702 0.5792  P    30.229     .500    -2.988     .300   .136000   .203000   .1480000      .000      .000  
+75 730 42623.00 I   .141250  .019943   .198715  .009985  I  .1469678  .0008191  1.9178 0.5792  P    30.303     .500    -3.042     .300   .136000   .201000   .1461000      .000      .000  
+75 731 42624.00 I   .140866  .020137   .196941  .009761  I  .1450827  .0008191  1.8512 0.4314  P    30.190     .500    -3.161     .300   .136000   .199000   .1442000      .000      .000  
+75 8 1 42625.00 I   .140495  .018143   .195159  .009683  I  .1432652  .0002710  1.7852 0.4314  P    29.655     .500    -3.324     .300   .136000   .197000   .1422000      .000      .000  
+75 8 2 42626.00 I   .140131  .021024   .193370  .010410  I  .1415062  .0002710  1.7375 0.1916  P    28.937     .500    -3.394     .300   .136000   .195000   .1402000      .000      .000  
+75 8 3 42627.00 I   .139771  .018077   .191574  .012753  I  .1397771  .0002710  1.7291 0.1916  P    28.525     .500    -3.304     .300   .136000   .194000   .1383000      .000      .000  
+75 8 4 42628.00 I   .139409  .017944   .189773  .012977  I  .1380281  .0002710  1.7806 0.1916  P    28.634     .500    -3.183     .300   .136000   .192000   .1363000      .000      .000  
+75 8 5 42629.00 I   .139043  .017124   .187967  .013652  I  .1361916  .0002710  1.9052 0.1916  P    29.054     .500    -3.205     .300   .136000   .190000   .1343000      .000      .000  
+75 8 6 42630.00 I   .138669  .022640   .186160  .013717  I  .1341949  .0002710  2.0981 0.1916  P    29.439     .500    -3.327     .300   .136000   .188000   .1322000      .000      .000  
+75 8 7 42631.00 I   .138283  .022450   .184355  .014082  I  .1319829  .0002710  2.3283 0.1916  P    29.583     .500    -3.320     .300   .136000   .186000   .1301000      .000      .000  
+75 8 8 42632.00 I   .137886  .022251   .182552  .014325  I  .1295436  .0002710  2.5426 0.1916  P    29.436     .500    -3.059     .300   .137000   .185000   .1279000      .000      .000  
+75 8 9 42633.00 I   .137474  .022840   .180753  .013750  I  .1269223  .0002710  2.6831 0.1916  P    29.046     .500    -2.692     .300   .137000   .183000   .1258000      .000      .000  
+75 810 42634.00 I   .137044  .022963   .178960  .011623  I  .1242150  .0002710  2.7107 0.1916  P    28.527     .500    -2.455     .300   .137000   .181000   .1237000      .000      .000  
+75 811 42635.00 I   .136594  .020171   .177173  .011802  I  .1215397  .0002710  2.6219 0.1916  P    28.016     .500    -2.414     .300   .137000   .179000   .1215000      .000      .000  
+75 812 42636.00 I   .136127  .025956   .175389  .012163  I  .1189993  .0002710  2.4488 0.1916  P    27.617     .500    -2.481     .300   .137000   .178000   .1193000      .000      .000  
+75 813 42637.00 I   .135643  .020715   .173609  .012551  I  .1166529  .0002710  2.2434 0.1916  P    27.419     .500    -2.591     .300   .137000   .176000   .1172000      .000      .000  
+75 814 42638.00 I   .135138  .020951   .171833  .010654  I  .1145063  .0002710  2.0566 0.1916  P    27.478     .500    -2.759     .300   .137000   .175000   .1150000      .000      .000  
+75 815 42639.00 I   .134611  .020805   .170059  .010889  I  .1125222  .0002710  1.9222 0.1916  P    27.724     .500    -2.968     .300   .137000   .173000   .1128000      .000      .000  
+75 816 42640.00 I   .134057  .017200   .168287  .010837  I  .1106400  .0002710  1.8535 0.1916  P    27.938     .500    -3.119     .300   .137000   .172000   .1106000      .000      .000  
+75 817 42641.00 I   .133477  .017380   .166517  .010796  I  .1087940  .0002710  1.8483 0.1916  P    27.962     .500    -3.138     .300   .137000   .170000   .1084000      .000      .000  
+75 818 42642.00 I   .132872  .017505   .164748  .010647  I  .1069262  .0002710  1.8947 0.1916  P    27.861     .500    -3.062     .300   .136000   .169000   .1063000      .000      .000  
+75 819 42643.00 I   .132241  .006851   .162980  .007233  I  .1049929  .0002710  1.9761 0.1916  P    27.810     .500    -2.969     .300   .136000   .167000   .1041000      .000      .000  
+75 820 42644.00 I   .131582  .008878   .161210  .006966  I  .1029686  .0002710  2.0736 0.1916  P    27.857     .500    -2.863     .300   .136000   .166000   .1019000      .000      .000  
+75 821 42645.00 I   .130895  .016443   .159439  .006546  I  .1008470  .0002710  2.1674 0.1916  P    27.903     .500    -2.693     .300   .136000   .165000   .0998000      .000      .000  
+75 822 42646.00 I   .130180  .019536   .157663  .013390  I  .0986407  .0002710  2.2407 0.1916  P    27.854     .500    -2.477     .300   .136000   .163000   .0976000      .000      .000  
+75 823 42647.00 I   .129438  .019720   .155884  .013430  I  .0963759  .0002710  2.2830 0.3416  P    27.677     .500    -2.344     .300   .135000   .162000   .0955000      .000      .000  
+75 824 42648.00 I   .128669  .019531   .154099  .020073  I  .0940867  .0006271  2.2893 0.3416  P    27.403     .500    -2.405     .300   .135000   .160000   .0933000      .000      .000  
+75 825 42649.00 I   .127872  .019371   .152307  .020009  I  .0918087  .0006271  2.2614 0.4434  P    27.172     .500    -2.623     .300   .135000   .159000   .0912000      .000      .000  
+75 826 42650.00 I   .127042  .020107   .150509  .020119  I  .0895730  .0006271  2.2060 0.3942  P    27.183     .500    -2.857     .300   .134000   .158000   .0890000      .000      .000  
+75 827 42651.00 I   .126175  .021462   .148704  .020071  I  .0874023  .0004778  2.1336 0.3766  P    27.423     .500    -3.033     .300   .134000   .156000   .0869000      .000      .000  
+75 828 42652.00 I   .125270  .020517   .146895  .020025  I  .0853067  .0004173  2.0585 0.3172  P    27.550     .500    -3.201     .300   .133000   .155000   .0847000      .000      .000  
+75 829 42653.00 I   .124326  .021597   .145082  .015990  I  .0832809  .0004173  1.9967 0.2443  P    27.248     .500    -3.396     .300   .133000   .153000   .0826000      .000      .000  
+75 830 42654.00 I   .123343  .023402   .143270  .016835  I  .0813027  .0002541  1.9667 0.2443  P    26.664     .500    -3.527     .300   .132000   .152000   .0804000      .000      .000  
+75 831 42655.00 I   .122316  .024394   .141461  .009961  I  .0793306  .0002541  1.9876 0.1797  P    26.303     .500    -3.484     .300   .131000   .151000   .0781000      .000      .000  
+75 9 1 42656.00 I   .121242  .025299   .139659  .010617  I  .0773052  .0002541  2.0756 0.1806  P    26.468     .500    -3.325     .300   .130000   .149000   .0758000      .000      .000  
+75 9 2 42657.00 I   .120119  .026575   .137868  .010905  I  .0751549  .0002566  2.2370 0.1857  P    26.965     .500    -3.221     .300   .128000   .148000   .0735000      .000      .000  
+75 9 3 42658.00 I   .118946  .024728   .136090  .014194  I  .0728116  .0002710  2.4572 0.1866  P    27.361     .500    -3.219     .300   .127000   .146000   .0712000      .000      .000  
+75 9 4 42659.00 I   .117724  .021603   .134331  .014060  I  .0702342  .0002710  2.6963 0.1916  P    27.395     .500    -3.177     .300   .126000   .145000   .0689000      .000      .000  
+75 9 5 42660.00 I   .116450  .018392   .132594  .019354  I  .0674318  .0002710  2.8969 0.1916  P    27.125     .500    -2.992     .300   .125000   .144000   .0665000      .000      .000  
+75 9 6 42661.00 I   .115122  .015947   .130881  .018430  I  .0644718  .0002710  3.0031 0.1916  P    26.806     .500    -2.774     .300   .123000   .143000   .0641000      .000      .000  
+75 9 7 42662.00 I   .113735  .021923   .129198  .019283  I  .0614672  .0002710  2.9843 0.1916  P    26.652     .500    -2.685     .300   .122000   .141000   .0618000      .000      .000  
+75 9 8 42663.00 I   .112285  .021763   .127549  .018556  I  .0585415  .0002710  2.8505 0.1916  P    26.621     .500    -2.694     .300   .120000   .140000   .0594000      .000      .000  
+75 9 9 42664.00 I   .110770  .019606   .125938  .018569  I  .0557892  .0002710  2.6476 0.1916  P    26.478     .500    -2.635     .300   .119000   .139000   .0570000      .000      .000  
+75 910 42665.00 I   .109188  .020552   .124368  .016534  I  .0532491  .0002710  2.4364 0.1916  P    26.144     .500    -2.494     .300   .117000   .138000   .0546000      .000      .000  
+75 911 42666.00 I   .107540  .020747   .122843  .016919  I  .0509018  .0002710  2.2689 0.1916  P    25.913     .500    -2.458     .300   .116000   .137000   .0521000      .000      .000  
+75 912 42667.00 I   .105831  .021163   .121362  .023017  I  .0486878  .0002710  2.1719 0.1916  P    26.119     .500    -2.640     .300   .114000   .135000   .0497000      .000      .000  
+75 913 42668.00 I   .104064  .022424   .119928  .023663  I  .0465338  .0002710  2.1474 0.1916  P    26.679     .500    -2.891     .300   .113000   .134000   .0472000      .000      .000  
+75 914 42669.00 I   .102244  .021471   .118541  .022066  I  .0443734  .0002710  2.1816 0.2164  P    27.169     .500    -2.977     .300   .111000   .133000   .0448000      .000      .000  
+75 915 42670.00 I   .100377  .023134   .117203  .022328  I  .0421573  .0003375  2.2557 0.2164  P    27.340     .500    -2.860     .300   .109000   .132000   .0423000      .000      .000  
+75 916 42671.00 I   .098468  .022834   .115914  .022023  I  .0398549  .0003375  2.3512 0.2386  P    27.333     .500    -2.689     .300   .107000   .131000   .0398000      .000      .000  
+75 917 42672.00 I   .096524  .022272   .114671  .021669  I  .0374535  .0003375  2.4507 0.2386  P    27.363     .500    -2.566     .300   .106000   .130000   .0374000      .000      .000  
+75 918 42673.00 I   .094556  .021722   .113472  .021296  I  .0349574  .0003375  2.5383 0.2386  P    27.426     .500    -2.442     .300   .104000   .129000   .0349000      .000      .000  
+75 919 42674.00 I   .092568  .020850   .112315  .009853  I  .0323854  .0003375  2.6005 0.2386  P    27.398     .500    -2.269     .300   .102000   .128000   .0324000      .000      .000  
+75 920 42675.00 I   .090562  .020559   .111197  .008617  I  .0297676  .0003375  2.6293 0.1691  P    27.245     .500    -2.138     .300   .100000   .127000   .0298000      .000      .000  
+75 921 42676.00 I   .088541  .015420   .110116  .009317  I  .0271382  .0000206  2.6241 0.1691  P    27.039     .500    -2.181     .300   .098000   .126000   .0272000      .000      .000  
+75 922 42677.00 I   .086507  .011918   .109068  .009059  I  .0245291  .0000206  2.5899 0.0146  P    26.888     .500    -2.395     .300   .097000   .124000   .0247000      .000      .000  
+75 923 42678.00 I   .084463  .016149   .108051  .010960  I  .0219647  .0000206  2.5367 0.2542  P    26.908     .500    -2.632     .300   .095000   .123000   .0221000      .000      .000  
+75 924 42679.00 I   .082411  .016596   .107063  .010773  I  .0194578  .0005080  2.4773 0.2398  P    27.127     .500    -2.776     .300   .093000   .122000   .0195000      .000      .000  
+75 925 42680.00 I   .080351  .023567   .106103  .012355  I  .0170073  .0004791  2.4265 0.3491  P    27.376     .500    -2.859     .300   .091000   .121000   .0168000      .000      .000  
+75 926 42681.00 I   .078281  .023322   .105169  .009325  I  .0145964  .0004791  2.4010 0.3787  P    27.412     .500    -2.962     .300   .089000   .120000   .0141000      .000      .000  
+75 927 42682.00 I   .076200  .023726   .104262  .010817  I  .0121912  .0005866  2.4178 0.3787  P    27.224     .500    -3.069     .300   .087000   .119000   .0114000      .000      .000  
+75 928 42683.00 I   .074109  .022409   .103379  .012421  I  .0097417  .0005866  2.4917 0.4148  P    27.096     .500    -3.086     .300   .085000   .118000   .0087000      .000      .000  
+75 929 42684.00 I   .072008  .022385   .102523  .012949  I  .0071859  .0005866  2.6311 0.3594  P    27.287     .500    -2.990     .300   .083000   .117000   .0060000      .000      .000  
+75 930 42685.00 I   .069891  .019461   .101693  .014099  I  .0044591  .0004154  2.8318 0.3231  P    27.730     .500    -2.870     .300   .081000   .116000   .0032000      .000      .000  
+7510 1 42686.00 I   .067753  .019003   .100891  .016291  I  .0015094  .0002710  3.0713 0.2480  P    28.100     .500    -2.778     .300   .079000   .115000   .0004000      .000      .000  
+7510 2 42687.00 I   .065591  .009604   .100115  .015106  I -.0016819  .0002710  3.3061 0.1916  P    28.134     .500    -2.657     .300   .077000   .114000  -.0023000      .000      .000  
+7510 3 42688.00 I   .063400  .014906   .099364  .015200  I -.0050831  .0002710  3.4819 0.1916  P    27.870     .500    -2.469     .300   .075000   .113000  -.0051000      .000      .000  
+7510 4 42689.00 I   .061177  .013008   .098637  .014220  I -.0086107  .0002710  3.5527 0.1916  P    27.631     .500    -2.328     .300   .073000   .112000  -.0079000      .000      .000  
+7510 5 42690.00 I   .058918  .013185   .097935  .013350  I -.0121475  .0002710  3.5005 0.1916  P    27.737     .500    -2.357     .300   .071000   .111000  -.0108000      .000      .000  
+7510 6 42691.00 I   .056619  .014942   .097260  .012933  I -.0155777  .0002710  3.3464 0.1916  P    28.141     .500    -2.465     .300   .069000   .110000  -.0137000      .000      .000  
+7510 7 42692.00 I   .054278  .015263   .096614  .011629  I -.0188238  .0002710  3.1428 0.1916  P    28.408     .500    -2.407     .300   .066000   .110000  -.0167000      .000      .000  
+7510 8 42693.00 I   .051893  .016599   .095998  .012287  I -.0218672  .0002710  2.9508 0.1916  P    28.222     .500    -2.123     .300   .064000   .109000  -.0196000      .000      .000  
+7510 9 42694.00 I   .049466  .017675   .095416  .012491  I -.0247445  .0002710  2.8161 0.1916  P    27.839     .500    -1.865     .300   .062000   .108000  -.0225000      .000      .000  
+751010 42695.00 I   .046997  .013812   .094868  .013567  I -.0275243  .0002710  2.7562 0.3300  P    27.822     .500    -1.894     .300   .060000   .107000  -.0255000      .000      .000  
+751011 42696.00 I   .044489  .018819   .094358  .015391  I -.0302791  .0006019  2.7629 0.2532  P    28.345     .500    -2.158     .300   .057000   .107000  -.0285000      .000      .000  
+751012 42697.00 I   .041945  .019113   .093886  .015401  I -.0330653  .0004277  2.8150 0.3692  P    29.005     .500    -2.373     .300   .055000   .106000  -.0315000      .000      .000  
+751013 42698.00 I   .039363  .021381   .093452  .015620  I -.0359169  .0004277  2.8904 0.3024  P    29.382     .500    -2.375     .300   .052000   .106000  -.0345000      .000      .000  
+751014 42699.00 I   .036746  .021577   .093054  .014291  I -.0388482  .0004277  2.9720 0.3024  P    29.494     .500    -2.249     .300   .050000   .105000  -.0375000      .000      .000  
+751015 42700.00 I   .034093  .020685   .092693  .012976  I -.0418584  .0004277  3.0460 0.3024  P    29.578     .500    -2.132     .300   .047000   .105000  -.0406000      .000      .000  
+751016 42701.00 I   .031402  .020663   .092367  .015041  I -.0449336  .0004277  3.1000 0.2160  P    29.679     .500    -2.038     .300   .045000   .104000  -.0437000      .000      .000  
+751017 42702.00 I   .028671  .022301   .092077  .014046  I -.0480485  .0000606  3.1241 0.2532  P    29.671     .500    -1.920     .300   .042000   .104000  -.0469000      .000      .000  
+751018 42703.00 I   .025899  .018015   .091825  .012042  I -.0511704  .0002710  3.1140 0.1388  P    29.538     .500    -1.810     .300   .040000   .103000  -.0500000      .000      .000  
+751019 42704.00 I   .023088  .025107   .091609  .011344  I -.0542659  .0002710  3.0722 0.1916  P    29.396     .500    -1.786     .300   .037000   .103000  -.0531000      .000      .000  
+751020 42705.00 I   .020236  .022015   .091433  .011044  I -.0573070  .0002710  3.0072 0.1916  P    29.319     .500    -1.848     .300   .034000   .103000  -.0563000      .000      .000  
+751021 42706.00 I   .017343  .024763   .091295  .020572  I -.0602766  .0002710  2.9313 0.1916  P    29.308     .500    -1.903     .300   .032000   .103000  -.0594000      .000      .000  
+751022 42707.00 I   .014408  .024511   .091196  .020956  I -.0631707  .0002710  2.8586 0.1916  P    29.393     .500    -1.888     .300   .029000   .102000  -.0626000      .000      .000  
+751023 42708.00 I   .011430  .024041   .091136  .022092  I -.0660001  .0002710  2.8046 0.1457  P    29.600     .500    -1.846     .300   .027000   .102000  -.0657000      .000      .000  
+751024 42709.00 I   .008415  .022281   .091113  .023521  I -.0687916  .0001072  2.7857 0.1457  P    29.863     .500    -1.857     .300   .024000   .102000  -.0689000      .000      .000  
+751025 42710.00 I   .005366  .025589   .091128  .023675  I -.0715879  .0001072  2.8162 0.1656  P    30.073     .500    -1.929     .300   .021000   .102000  -.0721000      .000      .000  
+751026 42711.00 I   .002284  .018221   .091180  .024643  I -.0744434  .0003134  2.9050 0.1656  P    30.229     .500    -1.990     .300   .018000   .102000  -.0753000      .000      .000  
+751027 42712.00 I  -.000828  .020257   .091271  .024852  I -.0774171  .0003134  3.0513 0.2216  P    30.428     .500    -1.982     .300   .016000   .102000  -.0785000      .000      .000  
+751028 42713.00 I  -.003970  .016502   .091400  .017716  I -.0805602  .0003134  3.2403 0.2216  P    30.714     .500    -1.903     .300   .013000   .102000  -.0817000      .000      .000  
+751029 42714.00 I  -.007140  .020348   .091566  .016086  I -.0839023  .0003134  3.4430 0.2449  P    30.982     .500    -1.764     .300   .010000   .102000  -.0849000      .000      .000  
+751030 42715.00 I  -.010330  .020296   .091769  .012218  I -.0874367  .0003763  3.6172 0.2449  P    31.066     .500    -1.546     .300   .007000   .102000  -.0881000      .000      .000  
+751031 42716.00 I  -.013536  .020907   .092013  .015480  I -.0911128  .0003763  3.7198 0.2319  P    30.926     .500    -1.273     .300   .004000   .102000  -.0913000      .000      .000  
+7511 1 42717.00 I  -.016752  .016677   .092297  .015355  I -.0948426  .0002710  3.7213 0.2319  P    30.755     .500    -1.077     .300   .001000   .103000  -.0945000      .000      .000  
+7511 2 42718.00 I  -.019973  .016852   .092625  .013346  I -.0985208  .0002710  3.6191 0.1916  P    30.838     .500    -1.097     .300  -.002000   .103000  -.0977000      .000      .000  
+7511 3 42719.00 I  -.023191  .014464   .092996  .013846  I -.1020561  .0002710  3.4428 0.1916  P    31.237     .500    -1.281     .300  -.005000   .103000  -.1009000      .000      .000  
+7511 4 42720.00 I  -.026399  .019220   .093412  .013924  I -.1053988  .0002710  3.2437 0.1916  P    31.649     .500    -1.381     .300  -.008000   .104000  -.1041000      .000      .000  
+7511 5 42721.00 I  -.029590  .016092   .093876  .017300  I -.1085538  .0002710  3.0754 0.1916  P    31.733     .500    -1.225     .300  -.011000   .105000  -.1073000      .000      .000  
+7511 6 42722.00 I  -.032760  .019046   .094391  .017656  I -.1115712  .0002710  2.9720 0.1916  P    31.560     .500     -.937     .300  -.013000   .105000  -.1106000      .000      .000  
+7511 7 42723.00 I  -.035902  .022159   .094961  .012633  I -.1145216  .0002710  2.9400 0.1916  P    31.549     .500     -.794     .300  -.016000   .106000  -.1138000      .000      .000  
+7511 8 42724.00 I  -.039010  .022266   .095587  .014269  I -.1174698  .0002710  2.9637 0.1916  P    31.932     .500     -.909     .300  -.019000   .107000  -.1170000      .000      .000  
+7511 9 42725.00 I  -.042077  .022402   .096271  .016171  I -.1204590  .0002710  3.0175 0.1916  P    32.475     .500    -1.133     .300  -.022000   .108000  -.1202000      .000      .000  
+751110 42726.00 I  -.045090  .022756   .097017  .015950  I -.1235075  .0002710  3.0793 0.1916  P    32.824     .500    -1.274     .300  -.025000   .110000  -.1234000      .000      .000  
+751111 42727.00 I  -.048044  .018617   .097829  .016001  I -.1266150  .0002710  3.1334 0.1584  P    32.930     .500    -1.283     .300  -.027000   .111000  -.1266000      .000      .000  
+751112 42728.00 I  -.050932  .019412   .098710  .012043  I -.1297683  .0001642  3.1694 0.1584  P    32.958     .500    -1.220     .300  -.030000   .113000  -.1298000      .000      .000  
+751113 42729.00 I  -.053751  .020194   .099660  .013092  I -.1329450  .0001642  3.1790 0.1035  P    32.967     .500    -1.125     .300  -.033000   .114000  -.1330000      .000      .000  
+751114 42730.00 I  -.056499  .016215   .100680  .016603  I -.1361156  .0001262  3.1566 0.1036  P    32.886     .500    -1.006     .300  -.036000   .116000  -.1362000      .000      .000  
+751115 42731.00 I  -.059173  .016433   .101771  .016948  I -.1392475  .0001265  3.1021 0.0893  P    32.735     .500     -.890     .300  -.039000   .117000  -.1393000      .000      .000  
+751116 42732.00 I  -.061773  .017450   .102933  .015413  I -.1423112  .0001265  3.0217 0.0894  P    32.641     .500     -.802     .300  -.041000   .119000  -.1425000      .000      .000  
+751117 42733.00 I  -.064300  .017370   .104164  .017321  I -.1452861  .0001265  2.9268 0.0815  P    32.635     .500     -.723     .300  -.044000   .120000  -.1456000      .000      .000  
+751118 42734.00 I  -.066758  .024230   .105465  .017692  I -.1481645  .0001027  2.8311 0.0769  P    32.626     .500     -.618     .300  -.047000   .122000  -.1488000      .000      .000  
+751119 42735.00 I  -.069154  .023483   .106830  .018050  I -.1509530  .0000876  2.7496 0.0700  P    32.596     .500     -.512     .300  -.050000   .124000  -.1519000      .000      .000  
+751120 42736.00 I  -.071496  .026012   .108256  .017179  I -.1536738  .0000951  2.6984 0.2431  P    32.670     .500     -.476     .300  -.053000   .126000  -.1550000      .000      .000  
+751121 42737.00 I  -.073792  .027358   .109737  .013581  I -.1563645  .0004782  2.6915 0.2438  P    32.934     .500     -.540     .300  -.055000   .127000  -.1582000      .000      .000  
+751122 42738.00 I  -.076051  .027336   .111268  .011999  I -.1590747  .0004782  2.7385 0.3381  P    33.292     .500     -.650     .300  -.058000   .129000  -.1613000      .000      .000  
+751123 42739.00 I  -.078276  .030164   .112848  .011354  I -.1618592  .0004782  2.8387 0.3381  P    33.569     .500     -.722     .300  -.061000   .131000  -.1644000      .000      .000  
+751124 42740.00 I  -.080474  .030179   .114472  .011018  I -.1647655  .0004782  2.9789 0.4136  P    33.697     .500     -.709     .300  -.064000   .133000  -.1674000      .000      .000  
+751125 42741.00 I  -.082652  .025827   .116140  .015525  I -.1678220  .0006749  3.1339 0.4136  P    33.739     .500     -.613     .300  -.066000   .135000  -.1705000      .000      .000  
+751126 42742.00 I  -.084820  .025313   .117848  .015519  I -.1710272  .0006749  3.2706 0.3636  P    33.773     .500     -.438     .300  -.069000   .136000  -.1735000      .000      .000  
+751127 42743.00 I  -.086983  .019199   .119596  .015388  I -.1743461  .0002710  3.3559 0.3636  P    33.791     .500     -.186     .300  -.071000   .138000  -.1766000      .000      .000  
+751128 42744.00 I  -.089145  .017040   .121384  .019244  I -.1777136  .0002710  3.3649 0.1916  P    33.735     .500      .112     .300  -.074000   .140000  -.1796000      .000      .000  
+751129 42745.00 I  -.091308  .017353   .123210  .020907  I -.1810477  .0002710  3.2894 0.1916  P    33.609     .500      .348     .300  -.077000   .142000  -.1826000      .000      .000  
+751130 42746.00 I  -.093472  .010537   .125073  .021761  I -.1842687  .0002710  3.1430 0.1916  P    33.523     .500      .389     .300  -.079000   .144000  -.1855000      .000      .000  
+7512 1 42747.00 I  -.095638  .013659   .126970  .020126  I -.1873216  .0002710  2.9604 0.1916  P    33.583     .500      .209     .300  -.082000   .145000  -.1885000      .000      .000  
+7512 2 42748.00 I  -.097804  .011946   .128899  .016733  I -.1901925  .0002710  2.7867 0.1916  P    33.763     .500     -.037     .300  -.084000   .147000  -.1914000      .000      .000  
+7512 3 42749.00 I  -.099969  .011717   .130854  .017512  I -.1929110  .0002710  2.6611 0.1916  P    33.946     .500     -.121     .300  -.087000   .149000  -.1944000      .000      .000  
+7512 4 42750.00 I  -.102128  .011789   .132833  .020827  I -.1955375  .0002710  2.6039 0.1916  P    34.104     .500      .028     .300  -.089000   .151000  -.1972000      .000      .000  
+7512 5 42751.00 I  -.104281  .011812   .134833  .017899  I -.1981401  .0002710  2.6107 0.1916  P    34.334     .500      .264     .300  -.091000   .152000  -.2000000      .000      .000  
+7512 6 42752.00 I  -.106423  .012843   .136852  .016085  I -.2007731  .0002710  2.6601 0.1916  P    34.688     .500      .380     .300  -.093000   .154000  -.2029000      .000      .000  
+7512 7 42753.00 I  -.108550  .011600   .138887  .015526  I -.2034657  .0002710  2.7256 0.1916  P    35.044     .500      .309     .300  -.095000   .155000  -.2057000      .000      .000  
+7512 8 42754.00 I  -.110656  .014017   .140936  .017409  I -.2062227  .0002710  2.7862 0.1916  P    35.233     .500      .144     .300  -.097000   .157000  -.2085000      .000      .000  
+7512 9 42755.00 I  -.112735  .019088   .142996  .017600  I -.2090323  .0002710  2.8293 0.1916  P    35.220     .500      .012     .300  -.099000   .159000  -.2113000      .000      .000  
+751210 42756.00 I  -.114783  .019234   .145066  .016374  I -.2118730  .0002710  2.8477 0.2693  P    35.090     .500     -.023     .300  -.100000   .160000  -.2141000      .000      .000  
+751211 42757.00 I  -.116794  .019189   .147142  .012163  I -.2147182  .0004655  2.8378 0.2693  P    34.915     .500      .034     .300  -.102000   .162000  -.2168000      .000      .000  
+751212 42758.00 I  -.118762  .019864   .149221  .011741  I -.2175390  .0004655  2.7991 0.3292  P    34.726     .500      .128     .300  -.103000   .163000  -.2196000      .000      .000  
+751213 42759.00 I  -.120682  .019543   .151303  .010811  I -.2203080  .0004655  2.7353 0.3292  P    34.587     .500      .196     .300  -.105000   .165000  -.2224000      .000      .000  
+751214 42760.00 I  -.122549  .020240   .153388  .014069  I -.2230042  .0004655  2.6554 0.3292  P    34.567     .500      .232     .300  -.107000   .167000  -.2252000      .000      .000  
+751215 42761.00 I  -.124360  .018935   .155474  .011612  I -.2256178  .0004655  2.5725 0.3292  P    34.630     .500      .288     .300  -.108000   .169000  -.2279000      .000      .000  
+751216 42762.00 I  -.126111  .017967   .157562  .014048  I -.2281532  .0004655  2.5014 0.2693  P    34.658     .500      .392     .300  -.110000   .170000  -.2307000      .000      .000  
+751217 42763.00 I  -.127800  .017891   .159653  .014440  I -.2306297  .0002710  2.4574 0.2693  P    34.618     .500      .466     .300  -.111000   .172000  -.2334000      .000      .000  
+751218 42764.00 I  -.129423  .019098   .161749  .014423  I -.2330821  .0002710  2.4556 0.1916  P    34.630     .500      .399     .300  -.113000   .174000  -.2362000      .000      .000  
+751219 42765.00 I  -.130977  .021330   .163852  .013762  I -.2355587  .0002710  2.5073 0.1916  P    34.823     .500      .196     .300  -.114000   .176000  -.2389000      .000      .000  
+751220 42766.00 I  -.132461  .020970   .165965  .015005  I -.2381153  .0002710  2.6150 0.1916  P    35.160     .500      .004     .300  -.116000   .178000  -.2416000      .000      .000  
+751221 42767.00 I  -.133879  .020276   .168089  .019798  I -.2408033  .0002710  2.7667 0.1916  P    35.443     .500     -.031     .300  -.117000   .180000  -.2444000      .000      .000  
+751222 42768.00 I  -.135231  .017999   .170225  .020846  I -.2436542  .0002710  2.9350 0.1916  P    35.502     .500      .108     .300  -.119000   .182000  -.2471000      .000      .000  
+751223 42769.00 I  -.136520  .015591   .172373  .021188  I -.2466668  .0002710  3.0837 0.1916  P    35.340     .500      .328     .300  -.120000   .184000  -.2498000      .000      .000  
+751224 42770.00 I  -.137749  .017060   .174535  .021074  I -.2498037  .0002710  3.1786 0.1916  P    35.106     .500      .535     .300  -.121000   .186000  -.2525000      .000      .000  
+751225 42771.00 I  -.138922  .016117   .176708  .023143  I -.2529990  .0002710  3.1985 0.1916  P    34.943     .500      .706     .300  -.122000   .188000  -.2551000      .000      .000  
+751226 42772.00 I  -.140046  .011635   .178891  .023424  I -.2561747  .0002710  3.1404 0.1916  P    34.869     .500      .856     .300  -.123000   .191000  -.2578000      .000      .000  
+751227 42773.00 I  -.141125  .013889   .181081  .023376  I -.2592587  .0002710  3.0189 0.1916  P    34.796     .500      .972     .300  -.124000   .193000  -.2604000      .000      .000  
+751228 42774.00 I  -.142162  .017653   .183277  .017474  I -.2622010  .0002710  2.8628 0.1916  P    34.646     .500      .995     .300  -.125000   .195000  -.2631000      .000      .000  
+751229 42775.00 I  -.143157  .024671   .185479  .022726  I -.2649847  .0002710  2.7081 0.1916  P    34.452     .500      .864     .300  -.126000   .197000  -.2657000      .000      .000  
+751230 42776.00 I  -.144114  .024174   .187689  .020654  I -.2676290  .0002710  2.5890 0.1916  P    34.340     .500      .618     .300  -.127000   .199000  -.2683000      .000      .000  
+751231 42777.00 I  -.145035  .026013   .189909  .024262  I -.2701822  .0002710  2.5284 0.1916  P    34.425     .500      .421     .300  -.128000   .202000  -.2710000      .000      .000  
+76 1 1 42778.00 I  -.145922  .027744   .192143  .023998  I  .7272928  .0002710  2.5319 0.1916  P    34.708     .500      .435     .300  -.129000   .204000   .7264000      .000      .000  
+76 1 2 42779.00 I  -.146779  .031985   .194393  .023882  I  .7247370  .0002710  2.5864 0.1916  P    35.073     .500      .657     .300  -.130000   .206000   .7238000      .000      .000  
+76 1 3 42780.00 I  -.147599  .035403   .196662  .022891  I  .7221112  .0002710  2.6674 0.1916  P    35.373     .500      .909     .300  -.131000   .208000   .7211000      .000      .000  
+76 1 4 42781.00 I  -.148380  .033483   .198951  .024308  I  .7194019  .0002710  2.7494 0.1916  P    35.531     .500     1.005     .300  -.131000   .210000   .7185000      .000      .000  
+76 1 5 42782.00 I  -.149117  .028982   .201257  .017352  I  .7166183  .0002710  2.8136 0.1916  P    35.547     .500      .908     .300  -.132000   .213000   .7158000      .000      .000  
+76 1 6 42783.00 I  -.149810  .029323   .203580  .021269  I  .7137839  .0002710  2.8500 0.1916  P    35.439     .500      .728     .300  -.132000   .215000   .7132000      .000      .000  
+76 1 7 42784.00 I  -.150451  .031620   .205917  .016665  I  .7109287  .0002710  2.8551 0.1916  P    35.221     .500      .594     .300  -.133000   .217000   .7105000      .000      .000  
+76 1 8 42785.00 I  -.151041  .029530   .208267  .015592  I  .7080839  .0002710  2.8296 0.1916  P    34.957     .500      .551     .300  -.133000   .219000   .7078000      .000      .000  
+76 1 9 42786.00 I  -.151577  .025456   .210631  .016068  I  .7052786  .0002710  2.7770 0.1916  P    34.765     .500      .540     .300  -.134000   .221000   .7051000      .000      .000  
+76 110 42787.00 I  -.152057  .019713   .213008  .017090  I  .7025362  .0002710  2.7056 0.3409  P    34.716     .500      .476     .300  -.134000   .224000   .7024000      .000      .000  
+76 111 42788.00 I  -.152481  .019619   .215400  .014602  I  .6998696  .0006256  2.6275 0.3409  P    34.767     .500      .353     .300  -.135000   .226000   .6997000      .000      .000  
+76 112 42789.00 I  -.152852  .018850   .217808  .018479  I  .6972785  .0006256  2.5574 0.4424  P    34.811     .500      .267     .300  -.135000   .228000   .6970000      .000      .000  
+76 113 42790.00 I  -.153173  .019967   .220234  .014358  I  .6947468  .0006256  2.5111 0.4424  P    34.794     .500      .300     .300  -.135000   .230000   .6942000      .000      .000  
+76 114 42791.00 I  -.153446  .013855   .222679  .014233  I  .6922431  .0006256  2.5043 0.4211  P    34.754     .500      .377     .300  -.135000   .232000   .6915000      .000      .000  
+76 115 42792.00 I  -.153675  .013816   .225144  .014771  I  .6897202  .0005639  2.5514 0.4641  P    34.769     .500      .325     .300  -.136000   .235000   .6887000      .000      .000  
+76 116 42793.00 I  -.153862  .013765   .227632  .014258  I  .6871198  .0006856  2.6599 0.4548  P    34.906     .500      .089     .300  -.136000   .237000   .6860000      .000      .000  
+76 117 42794.00 I  -.154011  .013716   .230140  .015580  I  .6843817  .0007137  2.8244 0.4948  P    35.170     .500     -.155     .300  -.136000   .239000   .6832000      .000      .000  
+76 118 42795.00 I  -.154124  .015049   .232668  .020301  I  .6814605  .0007137  3.0204 0.5047  P    35.454     .500     -.171     .300  -.136000   .241000   .6803000      .000      .000  
+76 119 42796.00 I  -.154204  .018636   .235217  .016831  I  .6783439  .0007137  3.2073 0.5047  P    35.579     .500      .086     .300  -.136000   .243000   .6775000      .000      .000  
+76 120 42797.00 I  -.154253  .016248   .237786  .017702  I  .6750641  .0007137  3.3396 0.5664  P    35.440     .500      .431     .300  -.137000   .246000   .6746000      .000      .000  
+76 121 42798.00 I  -.154273  .014295   .240376  .017099  I  .6716935  .0008798  3.3855 0.3817  P    35.124     .500      .646     .300  -.137000   .248000   .6718000      .000      .000  
+76 122 42799.00 I  -.154264  .014284   .242988  .016999  I  .6683242  .0002710  3.3379 0.4603  P    34.836     .500      .665     .300  -.137000   .250000   .6689000      .000      .000  
+76 123 42800.00 I  -.154226  .016091   .245617  .016843  I  .6650428  .0002710  3.2149 0.1916  P    34.694     .500      .568     .300  -.137000   .252000   .6660000      .000      .000  
+76 124 42801.00 I  -.154162  .022566   .248261  .015025  I  .6619076  .0002710  3.0523 0.2230  P    34.641     .500      .454     .300  -.137000   .255000   .6630000      .000      .000  
+76 125 42802.00 I  -.154076  .022431   .250916  .010501  I  .6589383  .0003543  2.8895 0.2230  P    34.536     .500      .352     .300  -.138000   .257000   .6601000      .000      .000  
+76 126 42803.00 I  -.153970  .019010   .253580  .013465  I  .6561175  .0003543  2.7601 0.2505  P    34.323     .500      .228     .300  -.138000   .260000   .6571000      .000      .000  
+76 127 42804.00 I  -.153848  .018940   .256250  .014309  I  .6533998  .0003543  2.6856 0.2505  P    34.108     .500      .060     .300  -.138000   .262000   .6542000      .000      .000  
+76 128 42805.00 I  -.153715  .019674   .258922  .015134  I  .6507259  .0003543  2.6724 0.2505  P    34.068     .500     -.096     .300  -.138000   .264000   .6512000      .000      .000  
+76 129 42806.00 I  -.153574  .020069   .261594  .016652  I  .6480368  .0003543  2.7138 0.2505  P    34.263     .500     -.133     .300  -.138000   .267000   .6482000      .000      .000  
+76 130 42807.00 I  -.153428  .027449   .264265  .017661  I  .6452861  .0003543  2.7916 0.2230  P    34.553     .500     -.010     .300  -.138000   .269000   .6453000      .000      .000  
+76 131 42808.00 I  -.153279  .022599   .266934  .017278  I  .6424496  .0002710  2.8812 0.2230  P    34.735     .500      .192     .300  -.138000   .272000   .6423000      .000      .000  
+76 2 1 42809.00 I  -.153131  .024773   .269604  .018088  I  .6395274  .0002710  2.9598 0.1916  P    34.750     .500      .323     .300  -.138000   .274000   .6393000      .000      .000  
+76 2 2 42810.00 I  -.152986  .024613   .272274  .016586  I  .6365390  .0002710  3.0115 0.1916  P    34.685     .500      .294     .300  -.138000   .277000   .6363000      .000      .000  
+76 2 3 42811.00 I  -.152842  .027576   .274945  .015890  I  .6335159  .0002710  3.0288 0.1916  P    34.593     .500      .135     .300  -.138000   .279000   .6333000      .000      .000  
+76 2 4 42812.00 I  -.152695  .027962   .277617  .015073  I  .6304930  .0002710  3.0114 0.1475  P    34.446     .500     -.061     .300  -.138000   .282000   .6302000      .000      .000  
+76 2 5 42813.00 I  -.152540  .029022   .280290  .022401  I  .6275034  .0001165  2.9633 0.1475  P    34.274     .500     -.229     .300  -.138000   .284000   .6272000      .000      .000  
+76 2 6 42814.00 I  -.152375  .020871   .282961  .021750  I  .6245740  .0001165  2.8924 0.0824  P    34.208     .500     -.383     .300  -.138000   .287000   .6242000      .000      .000  
+76 2 7 42815.00 I  -.152197  .022280   .285628  .021834  I  .6217225  .0001165  2.8096 0.0824  P    34.293     .500     -.590     .300  -.138000   .290000   .6213000      .000      .000  
+76 2 8 42816.00 I  -.152000  .020205   .288288  .019899  I  .6189541  .0001165  2.7288 0.0824  P    34.380     .500     -.858     .300  -.138000   .292000   .6184000      .000      .000  
+76 2 9 42817.00 I  -.151781  .024814   .290936  .019500  I  .6162592  .0001165  2.6652 0.3020  P    34.325     .500    -1.072     .300  -.137000   .295000   .6155000      .000      .000  
+76 210 42818.00 I  -.151533  .021592   .293573  .019727  I  .6136127  .0005927  2.6346 0.4191  P    34.190     .500    -1.078     .300  -.137000   .297000   .6126000      .000      .000  
+76 211 42819.00 I  -.151251  .022318   .296199  .019903  I  .6109741  .0008300  2.6517 0.5099  P    34.139     .500     -.896     .300  -.137000   .300000   .6097000      .000      .000  
+76 212 42820.00 I  -.150933  .023046   .298814  .008227  I  .6082897  .0008300  2.7278 0.5515  P    34.206     .500     -.757     .300  -.137000   .302000   .6069000      .000      .000  
+76 213 42821.00 I  -.150575  .023444   .301418  .009201  I  .6054976  .0007263  2.8667 0.5515  P    34.312     .500     -.860     .300  -.136000   .305000   .6040000      .000      .000  
+76 214 42822.00 I  -.150174  .022883   .304014  .010289  I  .6025395  .0007263  3.0558 0.5136  P    34.448     .500    -1.114     .300  -.136000   .307000   .6012000      .000      .000  
+76 215 42823.00 I  -.149726  .022415   .306599  .013488  I  .5993805  .0007263  3.2612 0.4399  P    34.660     .500    -1.217     .300  -.135000   .310000   .5983000      .000      .000  
+76 216 42824.00 I  -.149229  .019353   .309176  .013318  I  .5960279  .0004964  3.4343 0.4593  P    34.884     .500    -1.014     .300  -.135000   .312000   .5955000      .000      .000  
+76 217 42825.00 I  -.148684  .020516   .311742  .012157  I  .5925383  .0005623  3.5283 0.3750  P    34.957     .500     -.678     .300  -.134000   .314000   .5927000      .000      .000  
+76 218 42826.00 I  -.148094  .018395   .314296  .012154  I  .5890064  .0005623  3.5170 0.3897  P    34.822     .500     -.500     .300  -.134000   .317000   .5899000      .000      .000  
+76 219 42827.00 I  -.147460  .027753   .316836  .011996  I  .5855373  .0005398  3.4066 0.3897  P    34.595     .500     -.593     .300  -.133000   .319000   .5871000      .000      .000  
+76 220 42828.00 I  -.146784  .027597   .319360  .012263  I  .5822144  .0005398  3.2327 0.3817  P    34.424     .500     -.844     .300  -.133000   .322000   .5843000      .000      .000  
+76 221 42829.00 I  -.146073  .027579   .321867  .011442  I  .5790765  .0005398  3.0449 0.4322  P    34.339     .500    -1.102     .300  -.132000   .324000   .5815000      .000      .000  
+76 222 42830.00 I  -.145331  .028228   .324357  .008838  I  .5761146  .0006751  2.8872 0.3020  P    34.283     .500    -1.312     .300  -.131000   .326000   .5787000      .000      .000  
+76 223 42831.00 I  -.144566  .027037   .326827  .010557  I  .5732827  .0002710  2.7875 0.3637  P    34.198     .500    -1.485     .300  -.131000   .328000   .5759000      .000      .000  
+76 224 42832.00 I  -.143778  .026292   .329279  .014138  I  .5705177  .0002710  2.7533 0.1916  P    34.084     .500    -1.619     .300  -.130000   .331000   .5731000      .000      .000  
+76 225 42833.00 I  -.142971  .028828   .331710  .016565  I  .5677568  .0002710  2.7771 0.1916  P    34.017     .500    -1.698     .300  -.130000   .333000   .5703000      .000      .000  
+76 226 42834.00 I  -.142145  .019992   .334119  .016758  I  .5649494  .0002710  2.8431 0.1916  P    34.082     .500    -1.716     .300  -.129000   .335000   .5675000      .000      .000  
+76 227 42835.00 I  -.141302  .021732   .336505  .015875  I  .5620635  .0002710  2.9305 0.1916  P    34.266     .500    -1.682     .300  -.128000   .337000   .5646000      .000      .000  
+76 228 42836.00 I  -.140442  .021616   .338863  .015840  I  .5590883  .0002710  3.0182 0.1916  P    34.445     .500    -1.606     .300  -.128000   .339000   .5617000      .000      .000  
+76 229 42837.00 I  -.139563  .023839   .341194  .015307  I  .5560332  .0002710  3.0876 0.1916  P    34.527     .500    -1.516     .300  -.127000   .341000   .5589000      .000      .000  
+76 3 1 42838.00 I  -.138660  .025223   .343496  .016603  I  .5529235  .0002710  3.1259 0.1916  P    34.541     .500    -1.471     .300  -.127000   .343000   .5560000      .000      .000  
+76 3 2 42839.00 I  -.137733  .026716   .345769  .017604  I  .5497932  .0002710  3.1287 0.1916  P    34.536     .500    -1.539     .300  -.126000   .345000   .5531000      .000      .000  
+76 3 3 42840.00 I  -.136781  .025231   .348013  .017350  I  .5466772  .0002710  3.0982 0.1916  P    34.508     .500    -1.735     .300  -.125000   .347000   .5501000      .000      .000  
+76 3 4 42841.00 I  -.135807  .022954   .350227  .017060  I  .5436056  .0002710  3.0415 0.1916  P    34.481     .500    -2.002     .300  -.124000   .349000   .5471000      .000      .000  
+76 3 5 42842.00 I  -.134811  .021359   .352411  .017042  I  .5405995  .0002710  2.9690 0.1916  P    34.561     .500    -2.272     .300  -.124000   .350000   .5441000      .000      .000  
+76 3 6 42843.00 I  -.133796  .020792   .354565  .017960  I  .5376686  .0002710  2.8934 0.1916  P    34.759     .500    -2.538     .300  -.123000   .352000   .5411000      .000      .000  
+76 3 7 42844.00 I  -.132760  .016235   .356692  .017907  I  .5348089  .0002710  2.8292 0.1916  P    34.880     .500    -2.824     .300  -.122000   .354000   .5381000      .000      .000  
+76 3 8 42845.00 I  -.131707  .013653   .358793  .015608  I  .5320016  .0002710  2.7909 0.1916  P    34.772     .500    -3.058     .300  -.121000   .356000   .5350000      .000      .000  
+76 3 9 42846.00 I  -.130636  .011786   .360869  .015417  I  .5292134  .0002710  2.7936 0.1916  P    34.585     .500    -3.076     .300  -.120000   .358000   .5319000      .000      .000  
+76 310 42847.00 I  -.129551  .018724   .362923  .013113  I  .5263966  .0002710  2.8498 0.1916  P    34.595     .500    -2.822     .300  -.120000   .359000   .5288000      .000      .000  
+76 311 42848.00 I  -.128452  .018696   .364956  .013617  I  .5234931  .0002710  2.9680 0.1916  P    34.818     .500    -2.505     .300  -.119000   .361000   .5257000      .000      .000  
+76 312 42849.00 I  -.127341  .020624   .366971  .013536  I  .5204408  .0002710  3.1456 0.1916  P    35.016     .500    -2.426     .300  -.118000   .363000   .5226000      .000      .000  
+76 313 42850.00 I  -.126221  .020315   .368970  .013093  I  .5171889  .0002710  3.3623 0.1916  P    35.059     .500    -2.626     .300  -.117000   .365000   .5194000      .000      .000  
+76 314 42851.00 I  -.125094  .024892   .370954  .013170  I  .5137165  .0002710  3.5783 0.1916  P    35.068     .500    -2.830     .300  -.116000   .367000   .5163000      .000      .000  
+76 315 42852.00 I  -.123959  .025303   .372922  .013194  I  .5100498  .0002710  3.7419 0.1916  P    35.167     .500    -2.783     .300  -.116000   .368000   .5131000      .000      .000  
+76 316 42853.00 I  -.122815  .026578   .374874  .015764  I  .5062651  .0002710  3.8081 0.1916  P    35.289     .500    -2.563     .300  -.115000   .370000   .5100000      .000      .000  
+76 317 42854.00 I  -.121658  .021103   .376808  .016142  I  .5024721  .0002710  3.7586 0.1916  P    35.306     .500    -2.443     .300  -.114000   .372000   .5068000      .000      .000  
+76 318 42855.00 I  -.120484  .022236   .378726  .016388  I  .4987803  .0002710  3.6120 0.1916  P    35.190     .500    -2.552     .300  -.113000   .374000   .5036000      .000      .000  
+76 319 42856.00 I  -.119284  .019972   .380628  .016285  I  .4952644  .0002710  3.4166 0.1916  P    35.006     .500    -2.776     .300  -.112000   .376000   .5003000      .000      .000  
+76 320 42857.00 I  -.118052  .021091   .382514  .015835  I  .4919446  .0002710  3.2289 0.1916  P    34.848     .500    -2.980     .300  -.112000   .377000   .4971000      .000      .000  
+76 321 42858.00 I  -.116778  .016806   .384388  .015902  I  .4887897  .0002710  3.0921 0.1916  P    34.805     .500    -3.161     .300  -.111000   .379000   .4938000      .000      .000  
+76 322 42859.00 I  -.115450  .019674   .386253  .015930  I  .4857373  .0002710  3.0246 0.1916  P    34.892     .500    -3.358     .300  -.110000   .381000   .4906000      .000      .000  
+76 323 42860.00 I  -.114059  .017426   .388112  .021129  I  .4827192  .0002710  3.0210 0.1916  P    34.984     .500    -3.521     .300  -.109000   .383000   .4873000      .000      .000  
+76 324 42861.00 I  -.112595  .018859   .389968  .022575  I  .4796800  .0002710  3.0635 0.1916  P    34.953     .500    -3.577     .300  -.108000   .385000   .4839000      .000      .000  
+76 325 42862.00 I  -.111052  .017496   .391823  .023131  I  .4765838  .0002710  3.1314 0.1916  P    34.861     .500    -3.551     .300  -.107000   .386000   .4806000      .000      .000  
+76 326 42863.00 I  -.109424  .017660   .393681  .024201  I  .4734152  .0002710  3.2053 0.1916  P    34.903     .500    -3.524     .300  -.106000   .388000   .4772000      .000      .000  
+76 327 42864.00 I  -.107709  .016876   .395542  .023938  I  .4701765  .0002710  3.2692 0.1916  P    35.128     .500    -3.502     .300  -.105000   .390000   .4739000      .000      .000  
+76 328 42865.00 I  -.105906  .019459   .397406  .024321  I  .4668847  .0002710  3.3096 0.1916  P    35.376     .500    -3.418     .300  -.104000   .392000   .4705000      .000      .000  
+76 329 42866.00 I  -.104018  .020254   .399271  .024936  I  .4635681  .0002710  3.3178 0.1916  P    35.485     .500    -3.279     .300  -.103000   .394000   .4671000      .000      .000  
+76 330 42867.00 I  -.102047  .020075   .401134  .015593  I  .4602603  .0002710  3.2924 0.1916  P    35.452     .500    -3.219     .300  -.102000   .395000   .4638000      .000      .000  
+76 331 42868.00 I  -.099995  .019682   .402994  .013104  I  .4569929  .0002710  3.2381 0.1916  P    35.370     .500    -3.366     .300  -.101000   .397000   .4604000      .000      .000  
+76 4 1 42869.00 I  -.097866  .022869   .404852  .010940  I  .4537904  .0002710  3.1647 0.1916  P    35.343     .500    -3.687     .300  -.100000   .399000   .4570000      .000      .000  
+76 4 2 42870.00 I  -.095669  .023134   .406706  .009676  I  .4506658  .0002710  3.0843 0.1916  P    35.454     .500    -4.023     .300  -.099000   .401000   .4536000      .000      .000  
+76 4 3 42871.00 I  -.093413  .029528   .408553  .010259  I  .4476198  .0002710  3.0098 0.1916  P    35.683     .500    -4.271     .300  -.097000   .403000   .4502000      .000      .000  
+76 4 4 42872.00 I  -.091109  .027848   .410392  .013521  I  .4446395  .0002710  2.9552 0.1916  P    35.842     .500    -4.453     .300  -.096000   .405000   .4467000      .000      .000  
+76 4 5 42873.00 I  -.088767  .027254   .412218  .015908  I  .4416984  .0002710  2.9334 0.1916  P    35.769     .500    -4.601     .300  -.094000   .407000   .4433000      .000      .000  
+76 4 6 42874.00 I  -.086392  .027282   .414029  .016508  I  .4387576  .0002710  2.9567 0.1916  P    35.592     .500    -4.633     .300  -.093000   .409000   .4399000      .000      .000  
+76 4 7 42875.00 I  -.083990  .026590   .415821  .016570  I  .4357669  .0002710  3.0343 0.1916  P    35.623     .500    -4.456     .300  -.091000   .411000   .4366000      .000      .000  
+76 4 8 42876.00 I  -.081562  .025638   .417591  .016427  I  .4326701  .0002710  3.1686 0.1916  P    35.957     .500    -4.164     .300  -.090000   .413000   .4332000      .000      .000  
+76 4 9 42877.00 I  -.079110  .025479   .419335  .018981  I  .4294138  .0002710  3.3508 0.1916  P    36.333     .500    -3.998     .300  -.088000   .415000   .4299000      .000      .000  
+76 410 42878.00 I  -.076635  .017470   .421048  .018549  I  .4259609  .0002710  3.5560 0.1364  P    36.470     .500    -4.066     .300  -.087000   .417000   .4265000      .000      .000  
+76 411 42879.00 I  -.074138  .017454   .422728  .016428  I  .4223079  .0000313  3.7430 0.1364  P    36.362     .500    -4.200     .300  -.085000   .419000   .4232000      .000      .000  
+76 412 42880.00 I  -.071621  .013801   .424368  .013859  I  .4184967  .0000313  3.8647 0.0221  P    36.184     .500    -4.178     .300  -.083000   .421000   .4199000      .000      .000  
+76 413 42881.00 I  -.069088  .019246   .425965  .012853  I  .4146124  .0000313  3.8848 0.0221  P    36.049     .500    -4.022     .300  -.081000   .423000   .4166000      .000      .000  
+76 414 42882.00 I  -.066544  .021378   .427516  .012722  I  .4107633  .0000313  3.7961 0.0221  P    35.947     .500    -3.945     .300  -.080000   .424000   .4132000      .000      .000  
+76 415 42883.00 I  -.063992  .021303   .429019  .019956  I  .4070470  .0000313  3.6268 0.0221  P    35.821     .500    -4.045     .300  -.078000   .426000   .4099000      .000      .000  
+76 416 42884.00 I  -.061439  .021056   .430471  .017183  I  .4035190  .0000313  3.4296 0.0909  P    35.634     .500    -4.194     .300  -.076000   .428000   .4066000      .000      .000  
+76 417 42885.00 I  -.058886  .024179   .431870  .017536  I  .4001787  .0001791  3.2597 0.0702  P    35.448     .500    -4.264     .300  -.074000   .430000   .4033000      .000      .000  
+76 418 42886.00 I  -.056337  .023067   .433213  .017025  I  .3969785  .0001368  3.1529 0.1078  P    35.437     .500    -4.314     .300  -.072000   .431000   .4000000      .000      .000  
+76 419 42887.00 I  -.053792  .023358   .434496  .017256  I  .3938495  .0001202  3.1162 0.0911  P    35.686     .500    -4.457     .300  -.071000   .433000   .3968000      .000      .000  
+76 420 42888.00 I  -.051253  .018740   .435720  .017254  I  .3907280  .0001202  3.1339 0.0850  P    35.980     .500    -4.652     .300  -.069000   .434000   .3935000      .000      .000  
+76 421 42889.00 I  -.048720  .017063   .436883  .017983  I  .3875718  .0001202  3.1813 0.0850  P    35.988     .500    -4.762     .300  -.067000   .436000   .3902000      .000      .000  
+76 422 42890.00 I  -.046197  .015392   .437983  .009674  I  .3843629  .0001202  3.2364 0.0709  P    35.700     .500    -4.754     .300  -.065000   .437000   .3870000      .000      .000  
+76 423 42891.00 I  -.043688  .019258   .439018  .009643  I  .3811017  .0000752  3.2836 0.0714  P    35.482     .500    -4.722     .300  -.063000   .439000   .3837000      .000      .000  
+76 424 42892.00 I  -.041199  .019207   .439986  .009190  I  .3778019  .0000770  3.3122 0.1406  P    35.596     .500    -4.700     .300  -.061000   .440000   .3805000      .000      .000  
+76 425 42893.00 I  -.038736  .022299   .440883  .012492  I  .3744861  .0002710  3.3145 0.1409  P    35.865     .500    -4.608     .300  -.059000   .442000   .3772000      .000      .000  
+76 426 42894.00 I  -.036303  .021863   .441706  .010986  I  .3711830  .0002710  3.2866 0.1916  P    35.938     .500    -4.418     .300  -.057000   .443000   .3740000      .000      .000  
+76 427 42895.00 I  -.033903  .023053   .442451  .010729  I  .3679226  .0002710  3.2298 0.1916  P    35.729     .500    -4.275     .300  -.055000   .444000   .3707000      .000      .000  
+76 428 42896.00 I  -.031534  .022153   .443115  .010928  I  .3647305  .0002710  3.1517 0.1916  P    35.441     .500    -4.356     .300  -.053000   .445000   .3675000      .000      .000  
+76 429 42897.00 I  -.029191  .023138   .443696  .011384  I  .3616222  .0002710  3.0645 0.1916  P    35.289     .500    -4.659     .300  -.050000   .446000   .3642000      .000      .000  
+76 430 42898.00 I  -.026867  .024223   .444191  .012930  I  .3586003  .0002710  2.9810 0.1916  P    35.342     .500    -4.994     .300  -.048000   .447000   .3610000      .000      .000  
+76 5 1 42899.00 I  -.024555  .021533   .444600  .014059  I  .3556546  .0002710  2.9143 0.1916  P    35.544     .500    -5.191     .300  -.046000   .448000   .3577000      .000      .000  
+76 5 2 42900.00 I  -.022248  .019638   .444920  .010883  I  .3527621  .0002710  2.8764 0.1916  P    35.744     .500    -5.254     .300  -.044000   .449000   .3545000      .000      .000  
+76 5 3 42901.00 I  -.019943  .019551   .445150  .010874  I  .3498887  .0002710  2.8779 0.1916  P    35.771     .500    -5.278     .300  -.042000   .450000   .3512000      .000      .000  
+76 5 4 42902.00 I  -.017638  .019515   .445288  .010778  I  .3469905  .0002710  2.9269 0.1916  P    35.618     .500    -5.294     .300  -.039000   .450000   .3480000      .000      .000  
+76 5 5 42903.00 I  -.015335  .029887   .445331  .014184  I  .3440182  .0002710  3.0261 0.1916  P    35.509     .500    -5.242     .300  -.037000   .451000   .3447000      .000      .000  
+76 5 6 42904.00 I  -.013036  .032615   .445276  .013640  I  .3409233  .0002710  3.1702 0.1916  P    35.660     .500    -5.106     .300  -.035000   .452000   .3415000      .000      .000  
+76 5 7 42905.00 I  -.010745  .031145   .445122  .015107  I  .3376682  .0002710  3.3430 0.1916  P    36.018     .500    -4.963     .300  -.032000   .452000   .3381000      .000      .000  
+76 5 8 42906.00 I  -.008465  .032311   .444867  .014822  I  .3342371  .0002710  3.5165 0.1361  P    36.316     .500    -4.873     .300  -.030000   .453000   .3347000      .000      .000  
+76 5 9 42907.00 I  -.006202  .031974   .444511  .015973  I  .3306472  .0000251  3.6541 0.1361  P    36.340     .500    -4.773     .300  -.027000   .453000   .3314000      .000      .000  
+76 510 42908.00 I  -.003954  .031749   .444053  .015863  I  .3269529  .0000251  3.7198 0.0177  P    36.081     .500    -4.577     .300  -.025000   .454000   .3280000      .000      .000  
+76 511 42909.00 I  -.001718  .034863   .443494  .018669  I  .3232386  .0000251  3.6924 0.0177  P    35.686     .500    -4.353     .300  -.022000   .454000   .3246000      .000      .000  
+76 512 42910.00 I   .000512  .027128   .442837  .015306  I  .3195973  .0000251  3.5774 0.0177  P    35.326     .500    -4.278     .300  -.019000   .454000   .3212000      .000      .000  
+76 513 42911.00 I   .002734  .023574   .442084  .016928  I  .3161017  .0000251  3.4087 0.0177  P    35.081     .500    -4.407     .300  -.017000   .454000   .3177000      .000      .000  
+76 514 42912.00 I   .004949  .022560   .441237  .018179  I  .3127807  .0000251  3.2374 0.1361  P    34.920     .500    -4.573     .300  -.014000   .454000   .3143000      .000      .000  
+76 515 42913.00 I   .007154  .025115   .440300  .017685  I  .3096121  .0002710  3.1103 0.1361  P    34.829     .500    -4.601     .300  -.012000   .454000   .3108000      .000      .000  
+76 516 42914.00 I   .009354  .025886   .439276  .017374  I  .3065373  .0002710  3.0514 0.5838  P    34.921     .500    -4.531     .300  -.009000   .454000   .3074000      .000      .000  
+76 517 42915.00 I   .011554  .015228   .438172  .024085  I  .3034880  .0011357  3.0564 0.5838  P    35.272     .500    -4.538     .300  -.006000   .454000   .3041000      .000      .000  
+76 518 42916.00 I   .013761  .013212   .436993  .021861  I  .3004110  .0011357  3.1018 0.8031  P    35.653     .500    -4.680     .300  -.003000   .454000   .3007000      .000      .000  
+76 519 42917.00 I   .015983  .012736   .435748  .023128  I  .2972803  .0011357  3.1595 0.7826  P    35.662     .500    -4.847     .300   .002000   .453000   .2940000      .000      .000  
+76 520 42918.00 I   .018227  .011988   .434445  .021843  I  .2940956  .0010770  3.2064 0.7826  P    35.218     .500    -4.940     .300   .002000   .453000   .2940000      .000      .000  
+76 521 42919.00 I   .020497  .013350   .433093  .019769  I  .2908756  .0010770  3.2288 0.7616  P    34.722     .500    -4.973     .300   .005000   .453000   .2907000      .000      .000  
+76 522 42920.00 I   .022791  .010961   .431707  .020316  I  .2876480  .0010770  3.2211 0.7112  P    34.569     .500    -4.973     .300   .008000   .452000   .2876000      .000      .000  
+76 523 42921.00 I   .025112  .017028   .430297  .025592  I  .2844442  .0009290  3.1811 0.7112  P    34.662     .500    -4.898     .300   .011000   .452000   .2845000      .000      .000  
+76 524 42922.00 I   .027462  .018765   .428878  .021431  I  .2812960  .0009290  3.1104 0.6569  P    34.604     .500    -4.727     .300   .014000   .451000   .2813000      .000      .000  
+76 525 42923.00 I   .029845  .021464   .427465  .023084  I  .2782318  .0009290  3.0144 0.4839  P    34.243     .500    -4.571     .300   .017000   .451000   .2782000      .000      .000  
+76 526 42924.00 I   .032266  .021326   .426071  .026544  I  .2752722  .0002710  2.9034 0.5321  P    33.798     .500    -4.578     .300   .020000   .450000   .2751000      .000      .000  
+76 527 42925.00 I   .034735  .019010   .424714  .031487  I  .2724254  .0005192  2.7911 0.2928  P    33.522     .500    -4.764     .300   .023000   .449000   .2721000      .000      .000  
+76 528 42926.00 I   .037259  .017697   .423411  .032194  I  .2696860  .0005192  2.6909 0.3671  P    33.468     .500    -4.989     .300   .026000   .448000   .2692000      .000      .000  
+76 529 42927.00 I   .039850  .017832   .422181  .032774  I  .2670353  .0005192  2.6155 0.3671  P    33.572     .500    -5.113     .300   .029000   .447000   .2662000      .000      .000  
+76 530 42928.00 I   .042519  .018091   .421041  .032189  I  .2644432  .0005192  2.5754 0.3671  P    33.756     .500    -5.119     .300   .032000   .446000   .2633000      .000      .000  
+76 531 42929.00 I   .045268  .017790   .419990  .032522  I  .2618698  .0005192  2.5793 0.3671  P    33.886     .500    -5.076     .300   .035000   .445000   .2603000      .000      .000  
+76 6 1 42930.00 I   .048095  .016824   .419011  .032820  I  .2592691  .0005192  2.6297 0.2928  P    33.816     .500    -5.034     .300   .038000   .444000   .2575000      .000      .000  
+76 6 2 42931.00 I   .050998  .029671   .418092  .038316  I  .2565967  .0002710  2.7211 0.2928  P    33.554     .500    -4.990     .300   .041000   .443000   .2547000      .000      .000  
+76 6 3 42932.00 I   .053973  .014562   .417222  .032233  I  .2538185  .0002710  2.8377 0.1916  P    33.306     .500    -4.919     .300   .044000   .441000   .2518000      .000      .000  
+76 6 4 42933.00 I   .057023  .016750   .416390  .030196  I  .2509208  .0002710  2.9557 0.2772  P    33.274     .500    -4.811     .300   .047000   .440000   .2490000      .000      .000  
+76 6 5 42934.00 I   .060145  .010769   .415586  .026172  I  .2479160  .0004837  3.0468 0.2772  P    33.439     .500    -4.650     .300   .050000   .439000   .2462000      .000      .000  
+76 6 6 42935.00 I   .063339  .010144   .414802  .024184  I  .2448453  .0004837  3.0834 0.3156  P    33.580     .500    -4.407     .300   .053000   .438000   .2436000      .000      .000  
+76 6 7 42936.00 I   .066601  .010178   .414032  .026245  I  .2417737  .0004054  3.0464 0.3173  P    33.474     .500    -4.092     .300   .056000   .436000   .2411000      .000      .000  
+76 6 8 42937.00 I   .069929  .009029   .413270  .024375  I  .2387777  .0004107  2.9338 0.2885  P    33.081     .500    -3.817     .300   .060000   .435000   .2385000      .000      .000  
+76 6 9 42938.00 I   .073319  .008816   .412510  .021824  I  .2359248  .0004107  2.7650 0.2904  P    32.557     .500    -3.744     .300   .063000   .433000   .2360000      .000      .000  
+76 610 42939.00 I   .076764  .009057   .411747  .019391  I  .2332542  .0004107  2.5767 0.2562  P    32.112     .500    -3.916     .300   .066000   .432000   .2334000      .000      .000  
+76 611 42940.00 I   .080261  .026762   .410977  .017018  I  .2307632  .0003065  2.4129 0.2562  P    31.856     .500    -4.169     .300   .069000   .430000   .2310000      .000      .000  
+76 612 42941.00 I   .083804  .023827   .410197  .019613  I  .2284091  .0003065  2.3070 0.2631  P    31.804     .500    -4.279     .300   .072000   .428000   .2286000      .000      .000  
+76 613 42942.00 I   .087388  .020718   .409404  .020443  I  .2261262  .0004277  2.2700 0.2046  P    31.968     .500    -4.188     .300   .076000   .427000   .2262000      .000      .000  
+76 614 42943.00 I   .091007  .023104   .408596  .014955  I  .2238509  .0002710  2.2876 0.2532  P    32.315     .500    -4.048     .300   .079000   .425000   .2238000      .000      .000  
+76 615 42944.00 I   .094657  .020057   .407772  .016181  I  .2215422  .0002710  2.3315 0.5257  P    32.631     .500    -4.035     .300   .082000   .423000   .2214000      .000      .000  
+76 616 42945.00 I   .098336  .010221   .406929  .008280  I  .2191885  .0010159  2.3734 0.5257  P    32.594     .500    -4.168     .300   .085000   .421000   .2192000      .000      .000  
+76 617 42946.00 I   .102046  .010927   .406065  .008886  I  .2168023  .0010159  2.3945 0.7183  P    32.118     .500    -4.349     .300   .089000   .419000   .2170000      .000      .000  
+76 618 42947.00 I   .105785  .006070   .405180  .009023  I  .2144087  .0010159  2.3878 0.7183  P    31.502     .500    -4.488     .300   .092000   .417000   .2147000      .000      .000  
+76 619 42948.00 I   .109553  .006764   .404273  .010024  I  .2120361  .0010159  2.3528 0.7183  P    31.108     .500    -4.546     .300   .096000   .415000   .2125000      .000      .000  
+76 620 42949.00 I   .113344  .006896   .403338  .008907  I  .2097117  .0010159  2.2918 0.7183  P    30.959     .500    -4.508     .300   .099000   .413000   .2103000      .000      .000  
+76 621 42950.00 I   .117150  .006919   .402367  .008774  I  .2074596  .0010159  2.2093 0.5257  P    30.791     .500    -4.394     .300   .102000   .411000   .2082000      .000      .000  
+76 622 42951.00 I   .120965  .014599   .401350  .016242  I  .2052974  .0002710  2.1139 0.5257  P    30.440     .500    -4.282     .300   .106000   .409000   .2060000      .000      .000  
+76 623 42952.00 I   .124783  .014148   .400278  .018873  I  .2032318  .0002710  2.0184 0.1916  P    30.009     .500    -4.253     .300   .109000   .407000   .2039000      .000      .000  
+76 624 42953.00 I   .128599  .011801   .399142  .019498  I  .2012559  .0002710  1.9371 0.2842  P    29.662     .500    -4.305     .300   .113000   .405000   .2017000      .000      .000  
+76 625 42954.00 I   .132409  .009464   .397934  .013822  I  .1993482  .0004996  1.8840 0.2842  P    29.449     .500    -4.373     .300   .116000   .403000   .1996000      .000      .000  
+76 626 42955.00 I   .136210  .009118   .396646  .013289  I  .1974747  .0004996  1.8704 0.3533  P    29.376     .500    -4.417     .300   .119000   .401000   .1974000      .000      .000  
+76 627 42956.00 I   .139998  .010044   .395270  .013855  I  .1955915  .0004996  1.9044 0.3533  P    29.465     .500    -4.443     .300   .123000   .399000   .1952000      .000      .000  
+76 628 42957.00 I   .143772  .010177   .393797  .014147  I  .1936489  .0004996  1.9894 0.3533  P    29.664     .500    -4.447     .300   .126000   .396000   .1931000      .000      .000  
+76 629 42958.00 I   .147529  .009946   .392219  .014527  I  .1915975  .0004996  2.1200 0.3533  P    29.768     .500    -4.392     .300   .130000   .394000   .1909000      .000      .000  
+76 630 42959.00 I   .151267  .009767   .390543  .013771  I  .1893993  .0004996  2.2795 0.2842  P    29.579     .500    -4.262     .300   .133000   .392000   .1887000      .000      .000  
+76 7 1 42960.00 I   .154984  .019830   .388776  .017706  I  .1870376  .0002710  2.4419 0.2842  P    29.122     .500    -4.100     .300   .136000   .390000   .1865000      .000      .000  
+76 7 2 42961.00 I   .158679  .012035   .386923  .018126  I  .1845248  .0002710  2.5765 0.1916  P    28.647     .500    -3.961     .300   .140000   .387000   .1843000      .000      .000  
+76 7 3 42962.00 I   .162352  .025314   .384992  .017509  I  .1819028  .0002710  2.6567 0.1916  P    28.398     .500    -3.850     .300   .143000   .385000   .1821000      .000      .000  
+76 7 4 42963.00 I   .166004  .026766   .382986  .015606  I  .1792345  .0002710  2.6678 0.1916  P    28.401     .500    -3.727     .300   .147000   .382000   .1799000      .000      .000  
+76 7 5 42964.00 I   .169636  .023622   .380910  .013515  I  .1765898  .0002710  2.6111 0.1916  P    28.460     .500    -3.574     .300   .150000   .380000   .1777000      .000      .000  
+76 7 6 42965.00 I   .173247  .027171   .378770  .010076  I  .1740294  .0002710  2.5031 0.4874  P    28.341     .500    -3.441     .300   .153000   .378000   .1753000      .000      .000  
+76 7 7 42966.00 I   .176837  .023531   .376569  .010530  I  .1715909  .0009363  2.3731 0.4874  P    27.962     .500    -3.432     .300   .156000   .376000   .1730000      .000      .000  
+76 7 8 42967.00 I   .180401  .027149   .374315  .011249  I  .1692790  .0009363  2.2558 0.6621  P    27.439     .500    -3.606     .300   .159000   .373000   .1706000      .000      .000  
+76 7 9 42968.00 I   .183934  .023688   .372014  .012146  I  .1670645  .0009363  2.1828 0.6621  P    26.996     .500    -3.885     .300   .162000   .371000   .1683000      .000      .000  
+76 710 42969.00 I   .187428  .006215   .369671  .010793  I  .1648930  .0009363  2.1709 0.6621  P    26.810     .500    -4.080     .300   .165000   .369000   .1659000      .000      .000  
+76 711 42970.00 I   .190877  .013048   .367294  .021545  I  .1627037  .0009363  2.2161 0.6621  P    26.920     .500    -4.053     .300   .168000   .367000   .1635000      .000      .000  
+76 712 42971.00 I   .194274  .014123   .364887  .024878  I  .1604486  .0009363  2.2978 0.4874  P    27.202     .500    -3.857     .300   .171000   .365000   .1611000      .000      .000  
+76 713 42972.00 I   .197611  .012369   .362456  .021578  I  .1581059  .0002710  2.3862 0.4874  P    27.424     .500    -3.682     .300   .173000   .362000   .1586000      .000      .000  
+76 714 42973.00 I   .200882  .014282   .360005  .023968  I  .1556828  .0002710  2.4549 0.1916  P    27.379     .500    -3.672     .300   .176000   .360000   .1562000      .000      .000  
+76 715 42974.00 I   .204078  .012459   .357538  .021185  I  .1532076  .0002710  2.4891 0.1916  P    27.028     .500    -3.813     .300   .179000   .358000   .1538000      .000      .000  
+76 716 42975.00 I   .207189  .013996   .355057  .022984  I  .1507172  .0002710  2.4854 0.1916  P    26.525     .500    -3.987     .300   .182000   .356000   .1514000      .000      .000  
+76 717 42976.00 I   .210205  .013428   .352562  .022192  I  .1482482  .0002710  2.4474 0.1916  P    26.082     .500    -4.096     .300   .184000   .354000   .1489000      .000      .000  
+76 718 42977.00 I   .213113  .007213   .350055  .012419  I  .1458315  .0002710  2.3820 0.2024  P    25.800     .500    -4.114     .300   .187000   .351000   .1465000      .000      .000  
+76 719 42978.00 I   .215903  .011449   .347537  .011023  I  .1434907  .0003008  2.2972 0.2024  P    25.637     .500    -4.084     .300   .189000   .349000   .1440000      .000      .000  
+76 720 42979.00 I   .218565  .011737   .345008  .012654  I  .1412396  .0003008  2.2047 0.2127  P    25.480     .500    -4.067     .300   .192000   .347000   .1416000      .000      .000  
+76 721 42980.00 I   .221086  .013109   .342468  .011130  I  .1390792  .0003008  2.1183 0.2127  P    25.243     .500    -4.085     .300   .194000   .345000   .1392000      .000      .000  
+76 722 42981.00 I   .223456  .013457   .339916  .011884  I  .1369961  .0003008  2.0527 0.2127  P    24.912     .500    -4.097     .300   .197000   .343000   .1368000      .000      .000  
+76 723 42982.00 I   .225666  .014000   .337350  .010613  I  .1349622  .0003008  2.0218 0.2127  P    24.574     .500    -4.063     .300   .199000   .340000   .1343000      .000      .000  
+76 724 42983.00 I   .227725  .014125   .334770  .004666  I  .1329375  .0003008  2.0358 0.2024  P    24.377     .500    -4.020     .300   .202000   .338000   .1319000      .000      .000  
+76 725 42984.00 I   .229645  .018683   .332174  .004836  I  .1308736  .0002710  2.1007 0.2024  P    24.427     .500    -4.043     .300   .204000   .336000   .1295000      .000      .000  
+76 726 42985.00 I   .231435  .021550   .329559  .004837  I  .1287194  .0002710  2.2157 0.1916  P    24.679     .500    -4.122     .300   .206000   .334000   .1271000      .000      .000  
+76 727 42986.00 I   .233101  .018726   .326925  .006796  I  .1264293  .0002710  2.3694 0.1916  P    24.928     .500    -4.128     .300   .209000   .332000   .1247000      .000      .000  
+76 728 42987.00 I   .234651  .014478   .324267  .007520  I  .1239761  .0002710  2.5366 0.1916  P    24.933     .500    -3.959     .300   .211000   .329000   .1223000      .000      .000  
+76 729 42988.00 I   .236088  .014191   .321585  .008238  I  .1213634  .0002710  2.6819 0.1916  P    24.587     .500    -3.672     .300   .214000   .327000   .1199000      .000      .000  
+76 730 42989.00 I   .237420  .010745   .318877  .009031  I  .1186313  .0002710  2.7702 0.1916  P    24.008     .500    -3.435     .300   .216000   .325000   .1175000      .000      .000  
+76 731 42990.00 I   .238655  .009757   .316140  .017333  I  .1158493  .0002710  2.7796 0.1916  P    23.474     .500    -3.362     .300   .218000   .323000   .1151000      .000      .000  
+76 8 1 42991.00 I   .239798  .008575   .313373  .019777  I  .1130985  .0002710  2.7097 0.1916  P    23.222     .500    -3.427     .300   .220000   .320000   .1128000      .000      .000  
+76 8 2 42992.00 I   .240858  .015887   .310575  .021115  I  .1104494  .0002710  2.5814 0.5479  P    23.278     .500    -3.528     .300   .223000   .318000   .1104000      .000      .000  
+76 8 3 42993.00 I   .241840  .018258   .307745  .023586  I  .1079439  .0010618  2.4286 0.4141  P    23.444     .500    -3.601     .300   .225000   .315000   .1081000      .000      .000  
+76 8 4 42994.00 I   .242751  .017501   .304881  .020428  I  .1055884  .0007826  2.2872 0.6595  P    23.466     .500    -3.664     .300   .227000   .313000   .1057000      .000      .000  
+76 8 5 42995.00 I   .243595  .018695   .301983  .022857  I  .1033558  .0007826  2.1868 0.5638  P    23.237     .500    -3.774     .300   .229000   .310000   .1034000      .000      .000  
+76 8 6 42996.00 I   .244380  .016191   .299052  .020758  I  .1011959  .0008117  2.1431 0.5368  P    22.881     .500    -3.946     .300   .231000   .308000   .1011000      .000      .000  
+76 8 7 42997.00 I   .245108  .018386   .296091  .015984  I  .0990505  .0007349  2.1567 0.5328  P    22.645     .500    -4.097     .300   .233000   .305000   .0989000      .000      .000  
+76 8 8 42998.00 I   .245781  .018222   .293101  .014653  I  .0968681  .0006904  2.2136 0.4648  P    22.668     .500    -4.107     .300   .235000   .303000   .0966000      .000      .000  
+76 8 9 42999.00 I   .246402  .013405   .290085  .009107  I  .0946168  .0005694  2.2900 0.4437  P    22.859     .500    -3.942     .300   .237000   .300000   .0943000      .000      .000  
+76 810 43000.00 I   .246970  .013248   .287047  .008296  I  .0922901  .0005576  2.3605 0.3884  P    23.000     .500    -3.703     .300   .239000   .297000   .0921000      .000      .000  
+76 811 43001.00 I   .247487  .012610   .283988  .009573  I  .0899044  .0005284  2.4052 0.3624  P    22.955     .500    -3.540     .300   .241000   .294000   .0898000      .000      .000  
+76 812 43002.00 I   .247953  .010924   .280913  .012004  I  .0874919  .0004629  2.4132 0.3405  P    22.739     .500    -3.523     .300   .242000   .292000   .0876000      .000      .000  
+76 813 43003.00 I   .248371  .012612   .277825  .011836  I  .0850903  .0004295  2.3843 0.3379  P    22.425     .500    -3.612     .300   .244000   .289000   .0853000      .000      .000  
+76 814 43004.00 I   .248745  .013997   .274725  .010724  I  .0827333  .0004923  2.3255 0.3486  P    22.079     .500    -3.732     .300   .246000   .286000   .0831000      .000      .000  
+76 815 43005.00 I   .249075  .012514   .271617  .011071  I  .0804458  .0005491  2.2472 0.3934  P    21.816     .500    -3.839     .300   .248000   .283000   .0809000      .000      .000  
+76 816 43006.00 I   .249363  .013555   .268503  .010565  I  .0782417  .0006137  2.1605 0.4251  P    21.756     .500    -3.934     .300   .249000   .280000   .0786000      .000      .000  
+76 817 43007.00 I   .249611  .013808   .265386  .011833  I  .0761236  .0006492  2.0775 0.4414  P    21.858     .500    -4.040     .300   .251000   .278000   .0764000      .000      .000  
+76 818 43008.00 I   .249819  .012405   .262269  .010582  I  .0740805  .0006345  2.0131 0.4272  P    21.880     .500    -4.150     .300   .252000   .275000   .0741000      .000      .000  
+76 819 43009.00 I   .249988  .014321   .259157  .006985  I  .0720864  .0005554  1.9818 0.4157  P    21.641     .500    -4.205     .300   .254000   .272000   .0719000      .000      .000  
+76 820 43010.00 I   .250115  .013783   .256052  .007315  I  .0701021  .0005373  1.9951 0.3826  P    21.274     .500    -4.142     .300   .255000   .269000   .0696000      .000      .000  
+76 821 43011.00 I   .250199  .012293   .252957  .007622  I  .0680790  .0005263  2.0602 0.3761  P    21.091     .500    -4.001     .300   .256000   .266000   .0673000      .000      .000  
+76 822 43012.00 I   .250237  .011947   .249874  .007182  I  .0659637  .0005263  2.1795 0.3886  P    21.229     .500    -3.918     .300   .258000   .263000   .0649000      .000      .000  
+76 823 43013.00 I   .250226  .010096   .246806  .006520  I  .0637037  .0005719  2.3479 0.2960  P    21.531     .500    -3.972     .300   .259000   .260000   .0626000      .000      .000  
+76 824 43014.00 I   .250164  .009780   .243753  .007338  I  .0612575  .0002710  2.5476 0.3164  P    21.749     .500    -4.050     .300   .260000   .257000   .0603000      .000      .000  
+76 825 43015.00 I   .250047  .010630   .240718  .007907  I  .0586089  .0002710  2.7460 0.1916  P    21.756     .500    -3.960     .300   .261000   .254000   .0579000      .000      .000  
+76 826 43016.00 I   .249873  .014868   .237703  .007438  I  .0557798  .0002710  2.9015 0.1916  P    21.547     .500    -3.674     .300   .262000   .251000   .0555000      .000      .000  
+76 827 43017.00 I   .249635  .015702   .234708  .007157  I  .0528321  .0002710  2.9783 0.1916  P    21.178     .500    -3.375     .300   .263000   .248000   .0530000      .000      .000  
+76 828 43018.00 I   .249330  .014287   .231736  .009845  I  .0498545  .0002710  2.9610 0.1916  P    20.757     .500    -3.256     .300   .264000   .245000   .0506000      .000      .000  
+76 829 43019.00 I   .248952  .015263   .228790  .010887  I  .0469369  .0002710  2.8632 0.1916  P    20.435     .500    -3.331     .300   .265000   .242000   .0482000      .000      .000  
+76 830 43020.00 I   .248499  .013659   .225872  .013501  I  .0441424  .0002710  2.7223 0.1916  P    20.321     .500    -3.468     .300   .266000   .239000   .0456000      .000      .000  
+76 831 43021.00 I   .247962  .014938   .222984  .014621  I  .0414915  .0002710  2.5836 0.1916  P    20.414     .500    -3.565     .300   .266000   .236000   .0431000      .000      .000  
+76 9 1 43022.00 I   .247335  .014419   .220128  .012947  I  .0389619  .0002710  2.4848 0.1916  P    20.621     .500    -3.626     .300   .267000   .233000   .0405000      .000      .000  
+76 9 2 43023.00 I   .246611  .009771   .217308  .014569  I  .0365018  .0002710  2.4465 0.1916  P    20.817     .500    -3.692     .300   .267000   .230000   .0380000      .000      .000  
+76 9 3 43024.00 I   .245781  .009661   .214527  .012626  I  .0340482  .0002710  2.4705 0.1916  P    20.930     .500    -3.767     .300   .268000   .227000   .0354000      .000      .000  
+76 9 4 43025.00 I   .244837  .009943   .211786  .011600  I  .0315440  .0002710  2.5449 0.1865  P    20.991     .500    -3.811     .300   .268000   .224000   .0326000      .000      .000  
+76 9 5 43026.00 I   .243773  .012131   .209088  .010047  I  .0289484  .0002564  2.6494 0.1802  P    21.076     .500    -3.777     .300   .268000   .222000   .0299000      .000      .000  
+76 9 6 43027.00 I   .242580  .012361   .206434  .003174  I  .0262430  .0002377  2.7604 0.1748  P    21.182     .500    -3.653     .300   .267000   .219000   .0271000      .000      .000  
+76 9 7 43028.00 I   .241249  .013597   .203825  .003342  I  .0234329  .0002377  2.8554 0.1681  P    21.213     .500    -3.465     .300   .267000   .217000   .0244000      .000      .000  
+76 9 8 43029.00 I   .239773  .013644   .201263  .002271  I  .0205429  .0002377  2.9183 0.1681  P    21.109     .500    -3.267     .300   .267000   .214000   .0216000      .000      .000  
+76 9 9 43030.00 I   .238153  .013768   .198749  .002677  I  .0176095  .0002377  2.9418 0.1829  P    20.922     .500    -3.125     .300   .266000   .212000   .0186000      .000      .000  
+76 910 43031.00 I   .236405  .013977   .196285  .003042  I  .0146718  .0002781  2.9279 0.2098  P    20.716     .500    -3.095     .300   .266000   .209000   .0157000      .000      .000  
+76 911 43032.00 I   .234546  .015939   .193873  .014380  I  .0117630  .0003457  2.8860 0.2444  P    20.512     .500    -3.195     .300   .265000   .207000   .0127000      .000      .000  
+76 912 43033.00 I   .232589  .018403   .191512  .016603  I  .0089050  .0004019  2.8285 0.2651  P    20.385     .500    -3.388     .300   .265000   .204000   .0098000      .000      .000  
+76 913 43034.00 I   .230549  .017623   .189206  .016110  I  .0061070  .0004019  2.7681 0.2842  P    20.482     .500    -3.603     .300   .264000   .202000   .0068000      .000      .000  
+76 914 43035.00 I   .228436  .012796   .186953  .018473  I  .0033653  .0004019  2.7183 0.2842  P    20.795     .500    -3.791     .300   .263000   .200000   .0037000      .000      .000  
+76 915 43036.00 I   .226262  .011136   .184756  .018093  I  .0006625  .0004019  2.6923 0.2911  P    21.035     .500    -3.944     .300   .262000   .197000   .0006000      .000      .000  
+76 916 43037.00 I   .224040  .009070   .182613  .020786  I -.0020313  .0004212  2.7022 0.2424  P    20.940     .500    -4.032     .300   .262000   .195000  -.0024000      .000      .000  
+76 917 43038.00 I   .221780  .009682   .180523  .018237  I -.0047568  .0002710  2.7569 0.2504  P    20.654     .500    -3.981     .300   .261000   .192000  -.0055000      .000      .000  
+76 918 43039.00 I   .219493  .010943   .178483  .013304  I -.0075618  .0002710  2.8618 0.1916  P    20.582     .500    -3.778     .300   .260000   .190000  -.0086000      .000      .000  
+76 919 43040.00 I   .217189  .011320   .176491  .017030  I -.0104971  .0002710  3.0170 0.1916  P    20.877     .500    -3.559     .300   .259000   .187000  -.0118000      .000      .000  
+76 920 43041.00 I   .214879  .009769   .174542  .017785  I -.0136096  .0002710  3.2136 0.1916  P    21.259     .500    -3.495     .300   .258000   .185000  -.0150000      .000      .000  
+76 921 43042.00 I   .212572  .010696   .172634  .017341  I -.0169307  .0002710  3.4292 0.1916  P    21.396     .500    -3.579     .300   .257000   .182000  -.0183000      .000      .000  
+76 922 43043.00 I   .210280  .012285   .170763  .017485  I -.0204622  .0002710  3.6272 0.1916  P    21.270     .500    -3.611     .300   .256000   .180000  -.0215000      .000      .000  
+76 923 43044.00 I   .208015  .029307   .168926  .028284  I -.0241649  .0002710  3.7647 0.1916  P    21.096     .500    -3.456     .300   .255000   .177000  -.0247000      .000      .000  
+76 924 43045.00 I   .205788  .033204   .167116  .032485  I -.0279605  .0002710  3.8090 0.1916  P    21.034     .500    -3.213     .300   .254000   .175000  -.0280000      .000      .000  
+76 925 43046.00 I   .203607  .035532   .165330  .028962  I -.0317496  .0002710  3.7533 0.2476  P    21.062     .500    -3.065     .300   .252000   .172000  -.0313000      .000      .000  
+76 926 43047.00 I   .201482  .018900   .163560  .012018  I -.0354420  .0004145  3.6223 0.2476  P    21.047     .500    -3.041     .300   .251000   .170000  -.0345000      .000      .000  
+76 927 43048.00 I   .199423  .018532   .161799  .012591  I -.0389851  .0004145  3.4638 0.2931  P    20.891     .500    -3.023     .300   .249000   .167000  -.0378000      .000      .000  
+76 928 43049.00 I   .197443  .018794   .160038  .012397  I -.0423772  .0004145  3.3279 0.2931  P    20.665     .500    -2.964     .300   .248000   .165000  -.0411000      .000      .000  
+76 929 43050.00 I   .195556  .019277   .158267  .012136  I -.0456595  .0004145  3.2478 0.2541  P    20.606     .500    -2.958     .300   .246000   .163000  -.0444000      .000      .000  
+76 930 43051.00 I   .193761  .012188   .156476  .007973  I -.0488942  .0002940  3.2319 0.2541  P    20.896     .500    -3.072     .300   .245000   .161000  -.0477000      .000      .000  
+7610 1 43052.00 I   .192049  .012048   .154657  .009238  I -.0521409  .0002940  3.2687 0.1479  P    21.436     .500    -3.219     .300   .243000   .158000  -.0509000      .000      .000  
+7610 2 43053.00 I   .190412  .009765   .152802  .012088  I -.0554420  .0000331  3.3368 0.1479  P    21.930     .500    -3.253     .300   .242000   .156000  -.0542000      .000      .000  
+7610 3 43054.00 I   .188844  .009539   .150901  .013958  I -.0588172  .0000331  3.4131 0.4891  P    22.190     .500    -3.150     .300   .240000   .154000  -.0575000      .000      .000  
+7610 4 43055.00 I   .187338  .009510   .148947  .013512  I -.0622645  .0009776  3.4782 0.4891  P    22.245     .500    -2.998     .300   .238000   .152000  -.0609000      .000      .000  
+7610 5 43056.00 I   .185878  .013209   .146941  .013651  I -.0657649  .0009776  3.5171 0.7151  P    22.189     .500    -2.862     .300   .236000   .150000  -.0642000      .000      .000  
+7610 6 43057.00 I   .184444  .014620   .144886  .011245  I -.0692867  .0010440  3.5200 0.6729  P    22.062     .500    -2.722     .300   .233000   .147000  -.0676000      .000      .000  
+7610 7 43058.00 I   .183018  .014982   .142781  .011933  I -.0727925  .0009248  3.4858 0.6845  P    21.900     .500    -2.563     .300   .231000   .145000  -.0709000      .000      .000  
+7610 8 43059.00 I   .181581  .015335   .140626  .010248  I -.0762483  .0008855  3.4215 0.5864  P    21.769     .500    -2.455     .300   .229000   .143000  -.0743000      .000      .000  
+7610 9 43060.00 I   .180116  .012133   .138420  .011026  I -.0796288  .0007212  3.3370 0.4895  P    21.712     .500    -2.490     .300   .227000   .141000  -.0777000      .000      .000  
+761010 43061.00 I   .178626  .012302   .136163  .009655  I -.0829199  .0004176  3.2451 0.4167  P    21.765     .500    -2.662     .300   .224000   .139000  -.0811000      .000      .000  
+761011 43062.00 I   .177119  .012169   .133857  .009566  I -.0861213  .0004176  3.1599 0.2917  P    21.997     .500    -2.862     .300   .222000   .137000  -.0846000      .000      .000  
+761012 43063.00 I   .175602  .008273   .131502  .012266  I -.0892462  .0004073  3.0942 0.2998  P    22.391     .500    -2.999     .300   .219000   .135000  -.0880000      .000      .000  
+761013 43064.00 I   .174075  .008049   .129107  .013162  I -.0923197  .0004302  3.0585 0.2558  P    22.727     .500    -3.081     .300   .217000   .133000  -.0914000      .000      .000  
+761014 43065.00 I   .172531  .006712   .126686  .012604  I -.0953760  .0003097  3.0613 0.2580  P    22.777     .500    -3.141     .300   .214000   .131000  -.0948000      .000      .000  
+761015 43066.00 I   .170964  .003370   .124257  .008581  I -.0984571  .0002851  3.1086 0.2105  P    22.640     .500    -3.124     .300   .212000   .129000  -.0982000      .000      .000  
+761016 43067.00 I   .169366  .003350   .121837  .008654  I -.1016087  .0002851  3.2025 0.2016  P    22.677     .500    -2.955     .300   .209000   .128000  -.1017000      .000      .000  
+761017 43068.00 I   .167730  .005942   .119440  .008450  I -.1048764  .0002851  3.3393 0.2016  P    23.050     .500    -2.691     .300   .207000   .126000  -.1051000      .000      .000  
+761018 43069.00 I   .166052  .005904   .117081  .008576  I -.1082973  .0002851  3.5062 0.2016  P    23.493     .500    -2.506     .300   .204000   .124000  -.1085000      .000      .000  
+761019 43070.00 I   .164323  .007678   .114771  .008591  I -.1118907  .0002851  3.6790 0.2016  P    23.650     .500    -2.486     .300   .201000   .122000  -.1119000      .000      .000  
+761020 43071.00 I   .162540  .007891   .112517  .006782  I -.1156453  .0002851  3.8219 0.1967  P    23.501     .500    -2.509     .300   .198000   .121000  -.1153000      .000      .000  
+761021 43072.00 I   .160699  .020995   .110324  .007254  I -.1195118  .0002710  3.8967 0.2557  P    23.339     .500    -2.429     .300   .196000   .119000  -.1188000      .000      .000  
+761022 43073.00 I   .158798  .009683   .108199  .012443  I -.1234077  .0004246  3.8784 0.2519  P    23.443     .500    -2.279     .300   .193000   .118000  -.1222000      .000      .000  
+761023 43074.00 I   .156836  .009738   .106147  .013048  I -.1272383  .0004246  3.7691 0.3002  P    23.824     .500    -2.196     .300   .190000   .116000  -.1256000      .000      .000  
+761024 43075.00 I   .154807  .008609   .104176  .013369  I -.1309265  .0004246  3.6016 0.3002  P    24.216     .500    -2.181     .300   .187000   .114000  -.1290000      .000      .000  
+761025 43076.00 I   .152708  .008552   .102291  .013094  I -.1344389  .0004246  3.4264 0.3002  P    24.282     .500    -2.095     .300   .184000   .113000  -.1324000      .000      .000  
+761026 43077.00 I   .150532  .007060   .100493  .013272  I -.1377922  .0004246  3.2899 0.3822  P    23.954     .500    -1.914     .300   .181000   .111000  -.1358000      .000      .000  
+761027 43078.00 I   .148275  .006551   .098774  .010333  I -.1410399  .0006357  3.2169 0.4495  P    23.600     .500    -1.829     .300   .178000   .110000  -.1392000      .000      .000  
+761028 43079.00 I   .145933  .006382   .097124  .007214  I -.1442462  .0007924  3.2046 0.4807  P    23.695     .500    -1.992     .300   .175000   .108000  -.1426000      .000      .000  
+761029 43080.00 I   .143504  .005654   .095532  .007883  I -.1474621  .0007213  3.2313 0.5358  P    24.277     .500    -2.275     .300   .172000   .106000  -.1459000      .000      .000  
+761030 43081.00 I   .140986  .005425   .093990  .007130  I -.1507129  .0007213  3.2704 0.5100  P    24.901     .500    -2.404     .300   .169000   .104000  -.1492000      .000      .000  
+761031 43082.00 I   .138378  .005348   .092491  .007074  I -.1540004  .0007213  3.3022 0.5100  P    25.164     .500    -2.280     .300   .165000   .103000  -.1526000      .000      .000  
+7611 1 43083.00 I   .135685  .005270   .091033  .007118  I -.1573108  .0007213  3.3147 0.4368  P    25.097     .500    -2.055     .300   .162000   .101000  -.1559000      .000      .000  
+7611 2 43084.00 I   .132909  .004707   .089609  .007308  I -.1606205  .0004930  3.2995 0.4354  P    24.967     .500    -1.893     .300   .159000   .099000  -.1592000      .000      .000  
+7611 3 43085.00 I   .130046  .003837   .088210  .007363  I -.1638992  .0004879  3.2527 0.2975  P    24.889     .500    -1.793     .300   .156000   .097000  -.1624000      .000      .000  
+7611 4 43086.00 I   .127091  .002721   .086820  .008642  I -.1671159  .0003330  3.1761 0.3158  P    24.821     .500    -1.676     .300   .152000   .096000  -.1656000      .000      .000  
+7611 5 43087.00 I   .124040  .008496   .085427  .009488  I -.1702435  .0004012  3.0760 0.2607  P    24.763     .500    -1.551     .300   .149000   .094000  -.1687000      .000      .000  
+7611 6 43088.00 I   .120887  .008986   .084023  .010297  I -.1732639  .0004012  2.9639 0.2837  P    24.785     .500    -1.504     .300   .145000   .093000  -.1719000      .000      .000  
+7611 7 43089.00 I   .117629  .009121   .082602  .010409  I -.1761719  .0004012  2.8536 0.2728  P    24.913     .500    -1.554     .300   .142000   .091000  -.1751000      .000      .000  
+7611 8 43090.00 I   .114259  .010208   .081160  .010291  I -.1789766  .0003698  2.7597 0.2663  P    25.125     .500    -1.616     .300   .139000   .090000  -.1782000      .000      .000  
+7611 9 43091.00 I   .110789  .010174   .079701  .010405  I -.1817006  .0003503  2.6938 0.2579  P    25.391     .500    -1.620     .300   .135000   .088000  -.1813000      .000      .000  
+761110 43092.00 I   .107237  .010159   .078236  .010538  I -.1843763  .0003596  2.6642 0.2061  P    25.640     .500    -1.606     .300   .132000   .087000  -.1843000      .000      .000  
+761111 43093.00 I   .103622  .008311   .076775  .008726  I -.1870431  .0002171  2.6768 0.2100  P    25.763     .500    -1.642     .300   .128000   .085000  -.1874000      .000      .000  
+761112 43094.00 I   .099976  .008401   .075327  .009751  I -.1897447  .0002171  2.7336 0.1535  P    25.770     .500    -1.696     .300   .125000   .084000  -.1905000      .000      .000  
+761113 43095.00 I   .096332  .007855   .073900  .008875  I -.1925243  .0002171  2.8322 0.4672  P    25.843     .500    -1.655     .300   .122000   .083000  -.1935000      .000      .000  
+761114 43096.00 I   .092723  .014996   .072502  .010644  I -.1954200  .0009088  2.9635 0.4672  P    26.113     .500    -1.472     .300   .118000   .081000  -.1965000      .000      .000  
+761115 43097.00 I   .089176  .015215   .071137  .010295  I -.1984565  .0009088  3.1102 0.6426  P    26.458     .500    -1.241     .300   .115000   .080000  -.1995000      .000      .000  
+761116 43098.00 I   .085713  .015082   .069805  .010457  I -.2016370  .0009088  3.2465 0.6716  P    26.637     .500    -1.063     .300   .111000   .078000  -.2025000      .000      .000  
+761117 43099.00 I   .082352  .014765   .068506  .008835  I -.2049362  .0009891  3.3429 0.6716  P    26.571     .500     -.922     .300   .108000   .077000  -.2055000      .000      .000  
+761118 43100.00 I   .079093  .015244   .067245  .010547  I -.2083012  .0009891  3.3745 0.6994  P    26.419     .500     -.764     .300   .105000   .076000  -.2085000      .000      .000  
+761119 43101.00 I   .075922  .015359   .066036  .009630  I -.2116598  .0009891  3.3297 0.5968  P    26.418     .500     -.646     .300   .101000   .075000  -.2115000      .000      .000  
+761120 43102.00 I   .072820  .007022   .064892  .011208  I -.2149386  .0006682  3.2187 0.5968  P    26.677     .500     -.685     .300   .098000   .073000  -.2145000      .000      .000  
+761121 43103.00 I   .069783  .006899   .063821  .011310  I -.2180867  .0006682  3.0762 0.4313  P    27.070     .500     -.844     .300   .094000   .072000  -.2175000      .000      .000  
+761122 43104.00 I   .066805  .005955   .062834  .009785  I -.2210963  .0005456  2.9497 0.4169  P    27.292     .500     -.914     .300   .091000   .071000  -.2205000      .000      .000  
+761123 43105.00 I   .063885  .005695   .061943  .011439  I -.2240040  .0004988  2.8768 0.3696  P    27.163     .500     -.789     .300   .088000   .070000  -.2235000      .000      .000  
+761124 43106.00 I   .061019  .005783   .061152  .012820  I -.2268716  .0004988  2.8689 0.3527  P    26.907     .500     -.636     .300   .084000   .070000  -.2265000      .000      .000  
+761125 43107.00 I   .058197  .003590   .060458  .011516  I -.2297588  .0004988  2.9118 0.2713  P    26.960     .500     -.697     .300   .081000   .069000  -.2294000      .000      .000  
+761126 43108.00 I   .055414  .006921   .059859  .008629  I -.2327027  .0002136  2.9770 0.2713  P    27.420     .500     -.954     .300   .077000   .069000  -.2324000      .000      .000  
+761127 43109.00 I   .052661  .006979   .059348  .007629  I -.2357106  .0002136  3.0356 0.1849  P    27.886     .500    -1.144     .300   .074000   .068000  -.2354000      .000      .000  
+761128 43110.00 I   .049933  .010931   .058916  .010545  I -.2387657  .0003018  3.0698 0.1511  P    27.954     .500    -1.089     .300   .071000   .068000  -.2384000      .000      .000  
+761129 43111.00 I   .047221  .008194   .058557  .008893  I -.2418399  .0002137  3.0733 0.1849  P    27.696     .500     -.881     .300   .068000   .067000  -.2414000      .000      .000  
+761130 43112.00 I   .044512  .008211   .058263  .010860  I -.2449021  .0002137  3.0462 0.1560  P    27.472     .500     -.710     .300   .064000   .067000  -.2444000      .000      .000  
+7612 1 43113.00 I   .041779  .009528   .058026  .007925  I -.2479232  .0002273  2.9918 0.1393  P    27.432     .500     -.632     .300   .061000   .066000  -.2474000      .000      .000  
+7612 2 43114.00 I   .038999  .009757   .057837  .009928  I -.2508785  .0001788  2.9156 0.1446  P    27.453     .500     -.578     .300   .058000   .066000  -.2504000      .000      .000  
+7612 3 43115.00 I   .036147  .009663   .057695  .009980  I -.2537501  .0001788  2.8264 0.1264  P    27.450     .500     -.507     .300   .054000   .066000  -.2534000      .000      .000  
+7612 4 43116.00 I   .033197  .009538   .057603  .010269  I -.2565310  .0001788  2.7365 0.1775  P    27.491     .500     -.453     .300   .051000   .066000  -.2564000      .000      .000  
+7612 5 43117.00 I   .030129  .012103   .057561  .009428  I -.2592275  .0003067  2.6600 0.1775  P    27.602     .500     -.428     .300   .047000   .066000  -.2595000      .000      .000  
+7612 6 43118.00 I   .026940  .012277   .057570  .010037  I -.2618595  .0003067  2.6090 0.2337  P    27.705     .500     -.394     .300   .044000   .066000  -.2625000      .000      .000  
+7612 7 43119.00 I   .023629  .012729   .057629  .009892  I -.2644568  .0003528  2.5918 0.2178  P    27.768     .500     -.342     .300   .040000   .066000  -.2655000      .000      .000  
+7612 8 43120.00 I   .020197  .010318   .057738  .007337  I -.2670559  .0003092  2.6129 0.2346  P    27.862     .500     -.330     .300   .036000   .066000  -.2685000      .000      .000  
+7612 9 43121.00 I   .016660  .010332   .057894  .006445  I -.2696957  .0003092  2.6731 0.2186  P    28.020     .500     -.410     .300   .033000   .066000  -.2715000      .000      .000  
+761210 43122.00 I   .013042  .010437   .058091  .006756  I -.2724142  .0003092  2.7694 0.1936  P    28.177     .500     -.537     .300   .029000   .066000  -.2745000      .000      .000  
+761211 43123.00 I   .009367  .009044   .058325  .006742  I -.2752438  .0002330  2.8934 0.1936  P    28.281     .500     -.597     .300   .026000   .066000  -.2775000      .000      .000  
+761212 43124.00 I   .005650  .008907   .058591  .007972  I -.2782053  .0002330  3.0302 0.1648  P    28.363     .500     -.511     .300   .022000   .066000  -.2805000      .000      .000  
+761213 43125.00 I   .001900  .008537   .058889  .007119  I -.2813018  .0002330  3.1596 0.1549  P    28.457     .500     -.303     .300   .018000   .066000  -.2834000      .000      .000  
+761214 43126.00 I  -.001873  .011472   .059217  .009787  I -.2845144  .0002043  3.2585 0.1402  P    28.527     .500     -.040     .300   .015000   .066000  -.2864000      .000      .000  
+761215 43127.00 I  -.005671  .008470   .059580  .008588  I -.2878015  .0001561  3.3053 0.1286  P    28.505     .500      .238     .300   .011000   .067000  -.2893000      .000      .000  
+761216 43128.00 I  -.009501  .008367   .059986  .008573  I -.2911032  .0001561  3.2867 0.0886  P    28.376     .500      .488     .300   .008000   .067000  -.2923000      .000      .000  
+761217 43129.00 I  -.013371  .006129   .060446  .009323  I -.2943538  .0000838  3.2049 0.0886  P    28.200     .500      .605     .300   .004000   .067000  -.2952000      .000      .000  
+761218 43130.00 I  -.017289  .006035   .060970  .009173  I -.2974989  .0000838  3.0808 0.0593  P    28.088     .500      .475     .300   .000000   .067000  -.2981000      .000      .000  
+761219 43131.00 I  -.021259  .006203   .061568  .007193  I -.3005132  .0000838  2.9502 0.2498  P    28.099     .500      .143     .300  -.003000   .068000  -.3010000      .000      .000  
+761220 43132.00 I  -.025285  .004932   .062241  .005312  I -.3034101  .0004926  2.8521 0.3483  P    28.163     .500     -.144     .300  -.007000   .068000  -.3038000      .000      .000  
+761221 43133.00 I  -.029368  .003025   .062994  .002563  I -.3062365  .0006916  2.8114 0.4245  P    28.178     .500     -.162     .300  -.010000   .069000  -.3067000      .000      .000  
+761222 43134.00 I  -.033512  .005234   .063830  .004679  I -.3090520  .0006916  2.8281 0.4890  P    28.196     .500      .045     .300  -.014000   .069000  -.3096000      .000      .000  
+761223 43135.00 I  -.037719  .005306   .064751  .004444  I -.3119048  .0006916  2.8811 0.4573  P    28.399     .500      .220     .300  -.018000   .070000  -.3124000      .000      .000  
+761224 43136.00 I  -.041989  .006582   .065763  .009015  I -.3148158  .0005986  2.9390 0.4573  P    28.792     .500      .197     .300  -.021000   .070000  -.3153000      .000      .000  
+761225 43137.00 I  -.046322  .006645   .066870  .009093  I -.3177753  .0005986  2.9745 0.3862  P    29.086     .500      .057     .300  -.025000   .071000  -.3181000      .000      .000  
+761226 43138.00 I  -.050717  .008696   .068076  .012141  I -.3207530  .0004882  2.9745 0.3862  P    29.013     .500     -.023     .300  -.028000   .071000  -.3210000      .000      .000  
+761227 43139.00 I  -.055176  .008729   .069388  .012427  I -.3237125  .0004882  2.9390 0.3452  P    28.672     .500      .007     .300  -.032000   .072000  -.3238000      .000      .000  
+761228 43140.00 I  -.059698  .011773   .070808  .012281  I -.3266212  .0004882  2.8741 0.3452  P    28.384     .500      .065     .300  -.035000   .073000  -.3265000      .000      .000  
+761229 43141.00 I  -.064273  .011254   .072331  .011917  I -.3294534  .0004882  2.7873 0.2792  P    28.294     .500      .083     .300  -.039000   .074000  -.3293000      .000      .000  
+761230 43142.00 I  -.068888  .020907   .073951  .015322  I -.3321916  .0002710  2.6878 0.2792  P    28.296     .500      .066     .300  -.042000   .074000  -.3320000      .000      .000  
+761231 43143.00 I  -.073529  .020756   .075660  .007038  I -.3348284  .0002710  2.5865 0.1916  P    28.308     .500      .040     .300  -.046000   .075000  -.3348000      .000      .000  
+77 1 1 43144.00 I  -.078182  .020756   .077451  .007038  I  .6626318  .0002710  2.4961 0.1916  P    28.381     .500      .022     .300  -.049000   .076000   .6625000      .000      .000  
+77 1 2 43145.00 I  -.082831  .024669   .079316  .005364  I  .6601714  .0002710  2.4297 0.1916  P    28.520     .500      .028     .300  -.052000   .077000   .6597000      .000      .000  
+77 1 3 43146.00 I  -.087456  .026664   .081248  .004964  I  .6577609  .0002710  2.3977 0.1916  P    28.608     .500      .065     .300  -.056000   .079000   .6569000      .000      .000  
+77 1 4 43147.00 I  -.092040  .023122   .083241  .002516  I  .6553626  .0002710  2.4058 0.1916  P    28.591     .500      .088     .300  -.059000   .080000   .6542000      .000      .000  
+77 1 5 43148.00 I  -.096564  .021201   .085288  .007954  I  .6529353  .0002710  2.4559 0.1916  P    28.606     .500      .025     .300  -.063000   .082000   .6514000      .000      .000  
+77 1 6 43149.00 I  -.101010  .021201   .087382  .007954  I  .6504376  .0002710  2.5457 0.1916  P    28.788     .500     -.122     .300  -.066000   .083000   .6486000      .000      .000  
+77 1 7 43150.00 I  -.105357  .021200   .089515  .017413  I  .6478336  .0002710  2.6665 0.1916  P    29.069     .500     -.260     .300  -.069000   .085000   .6458000      .000      .000  
+77 1 8 43151.00 I  -.109588  .021200   .091680  .017413  I  .6450997  .0002710  2.8020 0.1916  P    29.249     .500     -.289     .300  -.073000   .087000   .6430000      .000      .000  
+77 1 9 43152.00 I  -.113685  .022765   .093870  .021309  I  .6422322  .0002710  2.9297 0.1358  P    29.230     .500     -.188     .300  -.076000   .088000   .6403000      .000      .000  
+77 110 43153.00 I  -.117633  .019540   .096076  .012970  I  .6392508  .0000175  3.0258 0.1358  P    29.088     .500     -.007     .300  -.080000   .090000   .6375000      .000      .000  
+77 111 43154.00 I  -.121416  .021251   .098289  .012654  I  .6361975  .0000175  3.0710 0.0124  P    28.954     .500      .201     .300  -.083000   .092000   .6347000      .000      .000  
+77 112 43155.00 I  -.125019  .021592   .100498  .012505  I  .6331285  .0000175  3.0571 0.0124  P    28.867     .500      .410     .300  -.086000   .094000   .6319000      .000      .000  
+77 113 43156.00 I  -.128428  .022678   .102693  .012348  I  .6301016  .0000175  2.9885 0.0124  P    28.767     .500      .582     .300  -.090000   .096000   .6291000      .000      .000  
+77 114 43157.00 I  -.131651  .023308   .104872  .010561  I  .6271638  .0000175  2.8831 0.0124  P    28.577     .500      .633     .300  -.093000   .098000   .6264000      .000      .000  
+77 115 43158.00 I  -.134713  .022823   .107036  .013000  I  .6243384  .0000175  2.7688 0.1358  P    28.301     .500      .473     .300  -.097000   .100000   .6236000      .000      .000  
+77 116 43159.00 I  -.137636  .032519   .109191  .021442  I  .6216184  .0002710  2.6778 0.1358  P    28.032     .500      .121     .300  -.100000   .102000   .6208000      .000      .000  
+77 117 43160.00 I  -.140438  .029047   .111338  .028518  I  .6189663  .0002710  2.6363 0.1916  P    27.867     .500     -.236     .300  -.103000   .104000   .6180000      .000      .000  
+77 118 43161.00 I  -.143137  .023743   .113481  .032929  I  .6163259  .0002710  2.6544 0.1866  P    27.845     .500     -.354     .300  -.106000   .107000   .6152000      .000      .000  
+77 119 43162.00 I  -.145749  .011772   .115623  .014238  I  .6136413  .0002567  2.7210 0.1866  P    27.959     .500     -.157     .300  -.110000   .109000   .6125000      .000      .000  
+77 120 43163.00 I  -.148288  .008320   .117769  .014462  I  .6108770  .0002567  2.8081 0.1815  P    28.187     .500      .173     .300  -.113000   .112000   .6097000      .000      .000  
+77 121 43164.00 I  -.150769  .009529   .119923  .014441  I  .6080291  .0002567  2.8830 0.1815  P    28.445     .500      .361     .300  -.116000   .114000   .6069000      .000      .000  
+77 122 43165.00 I  -.153209  .009424   .122089  .012373  I  .6051233  .0002567  2.9210 0.1815  P    28.582     .500      .293     .300  -.119000   .117000   .6042000      .000      .000  
+77 123 43166.00 I  -.155619  .013496   .124269  .013654  I  .6022025  .0002567  2.9129 0.1815  P    28.498     .500      .069     .300  -.122000   .120000   .6015000      .000      .000  
+77 124 43167.00 I  -.158001  .013453   .126466  .010047  I  .5993115  .0002567  2.8629 0.1866  P    28.252     .500     -.145     .300  -.126000   .122000   .5987000      .000      .000  
+77 125 43168.00 I  -.160358  .024519   .128681  .025391  I  .5964868  .0002710  2.7825 0.1866  P    27.995     .500     -.276     .300  -.129000   .125000   .5960000      .000      .000  
+77 126 43169.00 I  -.162693  .027971   .130919  .023779  I  .5937527  .0002710  2.6836 0.1916  P    27.810     .500     -.353     .300  -.132000   .128000   .5933000      .000      .000  
+77 127 43170.00 I  -.165008  .024230   .133184  .028017  I  .5911218  .0002710  2.5782 0.3047  P    27.702     .500     -.435     .300  -.135000   .131000   .5906000      .000      .000  
+77 128 43171.00 I  -.167302  .011592   .135480  .012220  I  .5885942  .0005459  2.4791 0.3047  P    27.693     .500     -.542     .300  -.138000   .134000   .5879000      .000      .000  
+77 129 43172.00 I  -.169575  .011391   .137814  .012965  I  .5861572  .0005459  2.3992 0.3623  P    27.829     .500     -.641     .300  -.142000   .137000   .5853000      .000      .000  
+77 130 43173.00 I  -.171822  .005783   .140189  .011568  I  .5837852  .0004765  2.3510 0.3623  P    28.064     .500     -.672     .300  -.145000   .140000   .5826000      .000      .000  
+77 131 43174.00 I  -.174043  .008497   .142610  .012645  I  .5814415  .0004765  2.3440 0.3369  P    28.252     .500     -.625     .300  -.148000   .143000   .5799000      .000      .000  
+77 2 1 43175.00 I  -.176244  .008584   .145082  .011611  I  .5790819  .0004765  2.3831 0.3369  P    28.313     .500     -.591     .300  -.151000   .146000   .5773000      .000      .000  
+77 2 2 43176.00 I  -.178434  .009857   .147612  .013004  I  .5766600  .0004765  2.4681 0.2700  P    28.338     .500     -.679     .300  -.154000   .149000   .5746000      .000      .000  
+77 2 3 43177.00 I  -.180620  .020941   .150203  .026200  I  .5741326  .0002541  2.5925 0.2700  P    28.479     .500     -.874     .300  -.157000   .153000   .5720000      .000      .000  
+77 2 4 43178.00 I  -.182809  .018695   .152861  .023468  I  .5714666  .0002541  2.7421 0.1601  P    28.750     .500    -1.022     .300  -.160000   .156000   .5693000      .000      .000  
+77 2 5 43179.00 I  -.185006  .010647   .155592  .013575  I  .5686478  .0001950  2.8934 0.1601  P    28.993     .500     -.992     .300  -.163000   .159000   .5667000      .000      .000  
+77 2 6 43180.00 I  -.187216  .010921   .158401  .014592  I  .5656889  .0001950  3.0173 0.1307  P    29.049     .500     -.811     .300  -.166000   .162000   .5641000      .000      .000  
+77 2 7 43181.00 I  -.189444  .009120   .161298  .013766  I  .5626312  .0001741  3.0872 0.1307  P    28.902     .500     -.629     .300  -.169000   .166000   .5614000      .000      .000  
+77 2 8 43182.00 I  -.191697  .008975   .164290  .013470  I  .5595370  .0001741  3.0894 0.1231  P    28.679     .500     -.551     .300  -.172000   .169000   .5588000      .000      .000  
+77 2 9 43183.00 I  -.193973  .007492   .167373  .012156  I  .5564734  .0001741  3.0285 0.1231  P    28.516     .500     -.575     .300  -.175000   .173000   .5561000      .000      .000  
+77 210 43184.00 I  -.196266  .007294   .170544  .011866  I  .5534939  .0001741  2.9260 0.1036  P    28.433     .500     -.641     .300  -.178000   .176000   .5535000      .000      .000  
+77 211 43185.00 I  -.198571  .009297   .173796  .016363  I  .5506249  .0001125  2.8130 0.2395  P    28.350     .500     -.730     .300  -.181000   .180000   .5509000      .000      .000  
+77 212 43186.00 I  -.200881  .007912   .177122  .006975  I  .5478609  .0004462  2.7210 0.2708  P    28.185     .500     -.876     .300  -.184000   .183000   .5482000      .000      .000  
+77 213 43187.00 I  -.203191  .007313   .180515  .003420  I  .5451674  .0005297  2.6754 0.3463  P    27.964     .500    -1.107     .300  -.186000   .187000   .5456000      .000      .000  
+77 214 43188.00 I  -.205494  .010447   .183966  .003672  I  .5424907  .0005297  2.6880 0.3746  P    27.807     .500    -1.365     .300  -.189000   .190000   .5429000      .000      .000  
+77 215 43189.00 I  -.207785  .010649   .187470  .003611  I  .5397734  .0005297  2.7545 0.3746  P    27.820     .500    -1.502     .300  -.192000   .194000   .5403000      .000      .000  
+77 216 43190.00 I  -.210053  .012242   .191017  .003705  I  .5369705  .0005297  2.8545 0.3746  P    27.986     .500    -1.407     .300  -.194000   .198000   .5376000      .000      .000  
+77 217 43191.00 I  -.212281  .012580   .194602  .003778  I  .5340632  .0005297  2.9582 0.2975  P    28.176     .500    -1.146     .300  -.197000   .201000   .5349000      .000      .000  
+77 218 43192.00 I  -.214452  .025281   .198216  .009410  I  .5310624  .0002710  3.0370 0.2975  P    28.270     .500     -.943     .300  -.199000   .205000   .5322000      .000      .000  
+77 219 43193.00 I  -.216553  .025418   .201853  .007189  I  .5280040  .0002710  3.0714 0.1916  P    28.258     .500     -.986     .300  -.202000   .208000   .5295000      .000      .000  
+77 220 43194.00 I  -.218572  .024741   .205506  .006873  I  .5249359  .0002710  3.0568 0.1916  P    28.206     .500    -1.260     .300  -.204000   .212000   .5268000      .000      .000  
+77 221 43195.00 I  -.220498  .021266   .209170  .006837  I  .5219041  .0002710  3.0009 0.1916  P    28.145     .500    -1.593     .300  -.206000   .216000   .5240000      .000      .000  
+77 222 43196.00 I  -.222323  .019259   .212838  .009589  I  .5189433  .0002710  2.9172 0.1916  P    28.031     .500    -1.837     .300  -.208000   .219000   .5212000      .000      .000  
+77 223 43197.00 I  -.224035  .015166   .216503  .010653  I  .5160743  .0002710  2.8197 0.1916  P    27.853     .500    -1.978     .300  -.210000   .223000   .5185000      .000      .000  
+77 224 43198.00 I  -.225626  .013190   .220158  .027018  I  .5133038  .0002710  2.7224 0.2912  P    27.705     .500    -2.092     .300  -.212000   .226000   .5157000      .000      .000  
+77 225 43199.00 I  -.227088  .009991   .223796  .013388  I  .5106251  .0005156  2.6382 0.2912  P    27.713     .500    -2.234     .300  -.214000   .230000   .5129000      .000      .000  
+77 226 43200.00 I  -.228413  .010191   .227410  .013740  I  .5080187  .0005156  2.5801 0.3401  P    27.903     .500    -2.371     .300  -.216000   .234000   .5100000      .000      .000  
+77 227 43201.00 I  -.229592  .008990   .230994  .014023  I  .5054527  .0004438  2.5586 0.3401  P    28.188     .500    -2.407     .300  -.217000   .237000   .5071000      .000      .000  
+77 228 43202.00 I  -.230618  .008921   .234542  .015210  I  .5028868  .0004438  2.5812 0.3138  P    28.465     .500    -2.296     .300  -.219000   .241000   .5041000      .000      .000  
+77 3 1 43203.00 I  -.231493  .008770   .238056  .015216  I  .5002744  .0004438  2.6514 0.3138  P    28.675     .500    -2.144     .300  -.220000   .244000   .5012000      .000      .000  
+77 3 2 43204.00 I  -.232225  .009383   .241545  .014921  I  .4975693  .0004438  2.7658 0.2430  P    28.796     .500    -2.137     .300  -.222000   .248000   .4983000      .000      .000  
+77 3 3 43205.00 I  -.232824  .013131   .245014  .021137  I  .4947312  .0001982  2.9150 0.2430  P    28.857     .500    -2.334     .300  -.223000   .252000   .4954000      .000      .000  
+77 3 4 43206.00 I  -.233299  .014034   .248473  .018665  I  .4917340  .0001982  3.0799 0.1679  P    28.937     .500    -2.567     .300  -.224000   .256000   .4925000      .000      .000  
+77 3 5 43207.00 I  -.233660  .014292   .251931  .018405  I  .4885759  .0002710  3.2312 0.1679  P    29.093     .500    -2.604     .300  -.226000   .259000   .4895000      .000      .000  
+77 3 6 43208.00 I  -.233915  .012379   .255398  .016966  I  .4852872  .0002710  3.3356 0.1916  P    29.261     .500    -2.412     .300  -.227000   .263000   .4866000      .000      .000  
+77 3 7 43209.00 I  -.234077  .013604   .258884  .008857  I  .4819292  .0002710  3.3666 0.1916  P    29.307     .500    -2.195     .300  -.228000   .267000   .4837000      .000      .000  
+77 3 8 43210.00 I  -.234156  .016745   .262400  .007705  I  .4785808  .0002710  3.3173 0.2889  P    29.187     .500    -2.172     .300  -.229000   .271000   .4807000      .000      .000  
+77 3 9 43211.00 I  -.234164  .007237   .265954  .012964  I  .4753155  .0005102  3.2052 0.2889  P    29.005     .500    -2.365     .300  -.230000   .275000   .4777000      .000      .000  
+77 310 43212.00 I  -.234116  .007071   .269558  .013246  I  .4721797  .0005102  3.0652 0.3608  P    28.887     .500    -2.630     .300  -.231000   .278000   .4748000      .000      .000  
+77 311 43213.00 I  -.234025  .006124   .273222  .013477  I  .4691810  .0005102  2.9373 0.3608  P    28.848     .500    -2.826     .300  -.232000   .282000   .4718000      .000      .000  
+77 312 43214.00 I  -.233903  .009348   .276956  .013689  I  .4662904  .0005102  2.8533 0.3125  P    28.811     .500    -2.931     .300  -.233000   .286000   .4688000      .000      .000  
+77 313 43215.00 I  -.233757  .010982   .280757  .010289  I  .4634546  .0003610  2.8287 0.3125  P    28.743     .500    -3.005     .300  -.234000   .290000   .4658000      .000      .000  
+77 314 43216.00 I  -.233593  .010816   .284619  .010199  I  .4606137  .0003610  2.8620 0.1808  P    28.716     .500    -3.095     .300  -.235000   .294000   .4627000      .000      .000  
+77 315 43217.00 I  -.233417  .013554   .288535  .006243  I  .4577165  .0000194  2.9377 0.1808  P    28.835     .500    -3.172     .300  -.235000   .297000   .4597000      .000      .000  
+77 316 43218.00 I  -.233234  .013247   .292501  .006631  I  .4547318  .0000194  3.0329 0.0137  P    29.092     .500    -3.168     .300  -.236000   .301000   .4566000      .000      .000  
+77 317 43219.00 I  -.233050  .013600   .296512  .005470  I  .4516527  .0000194  3.1221 0.3554  P    29.335     .500    -3.069     .300  -.237000   .305000   .4536000      .000      .000  
+77 318 43220.00 I  -.232852  .013934   .300562  .009396  I  .4484970  .0007106  3.1831 0.5025  P    29.406     .500    -2.961     .300  -.237000   .309000   .4505000      .000      .000  
+77 319 43221.00 I  -.232628  .011358   .304642  .012115  I  .4453000  .0010048  3.2037 0.6153  P    29.323     .500    -2.962     .300  -.237000   .313000   .4474000      .000      .000  
+77 320 43222.00 I  -.232363  .010448   .308747  .012000  I  .4421034  .0010048  3.1831 0.7105  P    29.246     .500    -3.111     .300  -.238000   .316000   .4444000      .000      .000  
+77 321 43223.00 I  -.232043  .012063   .312871  .012224  I  .4389447  .0010048  3.1300 0.7105  P    29.252     .500    -3.341     .300  -.238000   .320000   .4413000      .000      .000  
+77 322 43224.00 I  -.231654  .010611   .317004  .012224  I  .4358503  .0010048  3.0564 0.7105  P    29.254     .500    -3.559     .300  -.238000   .324000   .4382000      .000      .000  
+77 323 43225.00 I  -.231184  .011834   .321135  .012239  I  .4328343  .0010048  2.9756 0.5204  P    29.177     .500    -3.724     .300  -.238000   .328000   .4350000      .000      .000  
+77 324 43226.00 I  -.230620  .020829   .325247  .029484  I  .4298967  .0002710  2.9018 0.5204  P    29.111     .500    -3.862     .300  -.238000   .332000   .4319000      .000      .000  
+77 325 43227.00 I  -.229953  .021438   .329327  .007713  I  .4270241  .0002710  2.8476 0.3225  P    29.180     .500    -4.007     .300  -.237000   .335000   .4287000      .000      .000  
+77 326 43228.00 I  -.229171  .010363   .333361  .013201  I  .4241914  .0005852  2.8237 0.3073  P    29.347     .500    -4.144     .300  -.237000   .339000   .4256000      .000      .000  
+77 327 43229.00 I  -.228262  .010520   .337335  .013372  I  .4213638  .0005517  2.8385 0.4021  P    29.515     .500    -4.188     .300  -.237000   .343000   .4224000      .000      .000  
+77 328 43230.00 I  -.227216  .011487   .341235  .014594  I  .4184999  .0005517  2.8967 0.3901  P    29.708     .500    -4.053     .300  -.237000   .347000   .4192000      .000      .000  
+77 329 43231.00 I  -.226025  .011775   .345047  .014594  I  .4155560  .0005517  2.9981 0.3901  P    30.002     .500    -3.795     .300  -.236000   .351000   .4160000      .000      .000  
+77 330 43232.00 I  -.224684  .011524   .348760  .014261  I  .4124907  .0005517  3.1386 0.3901  P    30.295     .500    -3.633     .300  -.236000   .354000   .4129000      .000      .000  
+77 331 43233.00 I  -.223197  .008112   .352373  .014566  I  .4092696  .0005517  3.3068 0.3611  P    30.373     .500    -3.746     .300  -.235000   .358000   .4097000      .000      .000  
+77 4 1 43234.00 I  -.221567  .015056   .355890  .025045  I  .4058751  .0004660  3.4809 0.3073  P    30.223     .500    -4.042     .300  -.235000   .362000   .4065000      .000      .000  
+77 4 2 43235.00 I  -.219801  .013625   .359314  .017534  I  .4023164  .0002710  3.6292 0.2472  P    30.088     .500    -4.219     .300  -.234000   .365000   .4033000      .000      .000  
+77 4 3 43236.00 I  -.217905  .010485   .362650  .009604  I  .3986364  .0001649  3.7182 0.1522  P    30.143     .500    -4.103     .300  -.234000   .369000   .4000000      .000      .000  
+77 4 4 43237.00 I  -.215888  .009349   .365903  .007328  I  .3949074  .0001386  3.7249 0.2105  P    30.266     .500    -3.853     .300  -.233000   .372000   .3968000      .000      .000  
+77 4 5 43238.00 I  -.213757  .009523   .369077  .007233  I  .3912141  .0003873  3.6493 0.2057  P    30.238     .500    -3.769     .300  -.233000   .376000   .3935000      .000      .000  
+77 4 6 43239.00 I  -.211521  .009703   .372177  .007365  I  .3876271  .0003873  3.5190 0.2611  P    30.031     .500    -3.961     .300  -.232000   .379000   .3903000      .000      .000  
+77 4 7 43240.00 I  -.209204  .016548   .375211  .009990  I  .3841797  .0003502  3.3780 0.2611  P    29.805     .500    -4.268     .300  -.231000   .382000   .3870000      .000      .000  
+77 4 8 43241.00 I  -.206833  .016784   .378192  .010051  I  .3808609  .0003502  3.2677 0.2820  P    29.696     .500    -4.487     .300  -.230000   .385000   .3838000      .000      .000  
+77 4 9 43242.00 I  -.204436  .020317   .381129  .013166  I  .3776260  .0004421  3.2124 0.3223  P    29.703     .500    -4.562     .300  -.228000   .389000   .3805000      .000      .000  
+77 410 43243.00 I  -.202037  .020762   .384034  .012049  I  .3744170  .0005411  3.2144 0.2242  P    29.750     .500    -4.563     .300  -.227000   .392000   .3773000      .000      .000  
+77 411 43244.00 I  -.199634  .020225   .386910  .011755  I  .3711831  .0000743  3.2586 0.2759  P    29.790     .500    -4.552     .300  -.226000   .395000   .3740000      .000      .000  
+77 412 43245.00 I  -.197223  .015223   .389761  .009177  I  .3678933  .0001081  3.3222 0.0705  P    29.848     .500    -4.544     .300  -.224000   .398000   .3707000      .000      .000  
+77 413 43246.00 I  -.194800  .009539   .392590  .009871  I  .3645398  .0001199  3.3825 0.0807  P    29.978     .500    -4.535     .300  -.222000   .401000   .3674000      .000      .000  
+77 414 43247.00 I  -.192364  .002535   .395402  .004852  I  .3611356  .0001199  3.4210 0.0848  P    30.160     .500    -4.521     .300  -.221000   .405000   .3641000      .000      .000  
+77 415 43248.00 I  -.189909  .006708   .398198  .008110  I  .3577092  .0001199  3.4255 0.0848  P    30.269     .500    -4.491     .300  -.219000   .408000   .3608000      .000      .000  
+77 416 43249.00 I  -.187432  .006883   .400979  .007774  I  .3542975  .0001199  3.3914 0.0848  P    30.213     .500    -4.440     .300  -.217000   .411000   .3575000      .000      .000  
+77 417 43250.00 I  -.184928  .006859   .403743  .008093  I  .3509383  .0001199  3.3217 0.2928  P    30.054     .500    -4.400     .300  -.215000   .414000   .3542000      .000      .000  
+77 418 43251.00 I  -.182393  .006948   .406489  .007601  I  .3476626  .0005731  3.2266 0.2928  P    29.923     .500    -4.434     .300  -.213000   .417000   .3509000      .000      .000  
+77 419 43252.00 I  -.179824  .006793   .409217  .011127  I  .3444889  .0005731  3.1202 0.4052  P    29.860     .500    -4.576     .300  -.210000   .420000   .3476000      .000      .000  
+77 420 43253.00 I  -.177220  .006631   .411927  .011266  I  .3414210  .0005731  3.0172 0.4052  P    29.846     .500    -4.787     .300  -.208000   .423000   .3443000      .000      .000  
+77 421 43254.00 I  -.174581  .007115   .414621  .012381  I  .3384487  .0005731  2.9314 0.3698  P    29.908     .500    -4.982     .300  -.206000   .426000   .3410000      .000      .000  
+77 422 43255.00 I  -.171908  .006734   .417300  .008576  I  .3355486  .0004675  2.8745 0.3698  P    30.055     .500    -5.120     .300  -.204000   .429000   .3377000      .000      .000  
+77 423 43256.00 I  -.169202  .010042   .419965  .008512  I  .3326873  .0004675  2.8548 0.2788  P    30.160     .500    -5.222     .300  -.201000   .432000   .3345000      .000      .000  
+77 424 43257.00 I  -.166465  .013233   .422621  .010330  I  .3298248  .0003038  2.8776 0.2788  P    30.111     .500    -5.286     .300  -.199000   .435000   .3312000      .000      .000  
+77 425 43258.00 I  -.163700  .014531   .425272  .012124  I  .3269178  .0003038  2.9435 0.2148  P    30.061     .500    -5.235     .300  -.196000   .438000   .3280000      .000      .000  
+77 426 43259.00 I  -.160921  .014745   .427918  .010578  I  .3239247  .0003038  3.0489 0.2148  P    30.276     .500    -5.026     .300  -.194000   .441000   .3247000      .000      .000  
+77 427 43260.00 I  -.158151  .014698   .430559  .010746  I  .3208092  .0003038  3.1866 0.2208  P    30.714     .500    -4.790     .300  -.191000   .444000   .3215000      .000      .000  
+77 428 43261.00 I  -.155409  .013458   .433193  .009807  I  .3175457  .0003205  3.3417 0.2208  P    30.982     .500    -4.741     .300  -.189000   .446000   .3183000      .000      .000  
+77 429 43262.00 I  -.152699  .015055   .435805  .009703  I  .3141276  .0003205  3.4913 0.3197  P    30.823     .500    -4.916     .300  -.186000   .449000   .3150000      .000      .000  
+77 430 43263.00 I  -.150019  .013703   .438383  .010901  I  .3105747  .0005533  3.6059 0.3197  P    30.438     .500    -5.080     .300  -.184000   .451000   .3118000      .000      .000  
+77 5 1 43264.00 I  -.147367  .013764   .440911  .010825  I  .3069376  .0005533  3.6550 0.3912  P    30.183     .500    -5.000     .300  -.181000   .454000   .3086000      .000      .000  
+77 5 2 43265.00 I  -.144737  .011059   .443377  .008722  I  .3032920  .0005533  3.6221 0.3912  P    30.125     .500    -4.748     .300  -.178000   .457000   .3054000      .000      .000  
+77 5 3 43266.00 I  -.142125  .020285   .445774  .008722  I  .2997180  .0005533  3.5155 0.3757  P    30.058     .500    -4.613     .300  -.175000   .459000   .3022000      .000      .000  
+77 5 4 43267.00 I  -.139531  .020968   .448096  .008363  I  .2962739  .0005084  3.3701 0.3757  P    29.841     .500    -4.743     .300  -.173000   .462000   .2991000      .000      .000  
+77 5 5 43268.00 I  -.136957  .021823   .450348  .008539  I  .2929751  .0005084  3.2327 0.3003  P    29.561     .500    -4.998     .300  -.170000   .464000   .2959000      .000      .000  
+77 5 6 43269.00 I  -.134402  .020176   .452536  .004878  I  .2897933  .0003199  3.1410 0.3104  P    29.403     .500    -5.171     .300  -.167000   .467000   .2927000      .000      .000  
+77 5 7 43270.00 I  -.131868  .015461   .454667  .005910  I  .2866728  .0003562  3.1101 0.2394  P    29.463     .500    -5.225     .300  -.164000   .469000   .2896000      .000      .000  
+77 5 8 43271.00 I  -.129341  .015481   .456743  .005856  I  .2835566  .0003562  3.1288 0.2519  P    29.663     .500    -5.242     .300  -.161000   .471000   .2865000      .000      .000  
+77 5 9 43272.00 I  -.126805  .016083   .458766  .006168  I  .2804070  .0003562  3.1720 0.2688  P    29.784     .500    -5.249     .300  -.158000   .474000   .2833000      .000      .000  
+77 510 43273.00 I  -.124248  .012527   .460739  .007725  I  .2772138  .0004026  3.2116 0.2634  P    29.666     .500    -5.211     .300  -.155000   .476000   .2802000      .000      .000  
+77 511 43274.00 I  -.121648  .012635   .462667  .008167  I  .2739915  .0003881  3.2280 0.2796  P    29.409     .500    -5.147     .300  -.152000   .478000   .2771000      .000      .000  
+77 512 43275.00 I  -.118986  .011396   .464559  .007977  I  .2707687  .0003881  3.2115 0.2691  P    29.264     .500    -5.124     .300  -.149000   .480000   .2741000      .000      .000  
+77 513 43276.00 I  -.116243  .014237   .466423  .010539  I  .2675802  .0003730  3.1597 0.2691  P    29.312     .500    -5.141     .300  -.145000   .482000   .2710000      .000      .000  
+77 514 43277.00 I  -.113404  .013935   .468267  .009643  I  .2644600  .0003730  3.0757 0.2638  P    29.349     .500    -5.110     .300  -.142000   .483000   .2680000      .000      .000  
+77 515 43278.00 I  -.110466  .015815   .470091  .009597  I  .2614370  .0003730  2.9669 0.2638  P    29.175     .500    -4.999     .300  -.138000   .485000   .2649000      .000      .000  
+77 516 43279.00 I  -.107435  .014657   .471893  .009386  I  .2585308  .0003730  2.8442 0.2305  P    28.849     .500    -4.918     .300  -.135000   .487000   .2619000      .000      .000  
+77 517 43280.00 I  -.104316  .029701   .473673  .016075  I  .2557486  .0002710  2.7213 0.2305  P    28.587     .500    -5.003     .300  -.131000   .488000   .2590000      .000      .000  
+77 518 43281.00 I  -.101114  .024953   .475428  .014447  I  .2530837  .0002710  2.6117 0.1916  P    28.527     .500    -5.236     .300  -.128000   .490000   .2560000      .000      .000  
+77 519 43282.00 I  -.097835  .024953   .477158  .014447  I  .2505171  .0002710  2.5264 0.1916  P    28.662     .500    -5.456     .300  -.124000   .491000   .2531000      .000      .000  
+77 520 43283.00 I  -.094479  .035178   .478858  .008647  I  .2480201  .0002710  2.4734 0.1916  P    28.875     .500    -5.542     .300  -.121000   .493000   .2501000      .000      .000  
+77 521 43284.00 I  -.091047  .035178   .480525  .008647  I  .2455580  .0002710  2.4573 0.1916  P    28.964     .500    -5.539     .300  -.117000   .494000   .2472000      .000      .000  
+77 522 43285.00 I  -.087541  .003310   .482158  .002690  I  .2430929  .0002710  2.4792 0.1916  P    28.791     .500    -5.558     .300  -.113000   .495000   .2444000      .000      .000  
+77 523 43286.00 I  -.083960  .003310   .483754  .002690  I  .2405877  .0002710  2.5369 0.1916  P    28.503     .500    -5.599     .300  -.109000   .496000   .2416000      .000      .000  
+77 524 43287.00 I  -.080306  .003310   .485308  .002690  I  .2380093  .0002710  2.6241 0.1916  P    28.458     .500    -5.552     .300  -.105000   .497000   .2388000      .000      .000  
+77 525 43288.00 I  -.076579  .003310   .486820  .002690  I  .2353333  .0002710  2.7299 0.1916  P    28.791     .500    -5.382     .300  -.101000   .498000   .2360000      .000      .000  
+77 526 43289.00 I  -.072781  .003310   .488284  .002690  I  .2325485  .0002710  2.8386 0.3725  P    29.185     .500    -5.204     .300  -.097000   .499000   .2332000      .000      .000  
+77 527 43290.00 I  -.068911  .003525   .489700  .000995  I  .2296621  .0006939  2.9291 0.3725  P    29.219     .500    -5.118     .300  -.093000   .500000   .2305000      .000      .000  
+77 528 43291.00 I  -.064971  .003525   .491064  .000995  I  .2267043  .0006939  2.9774 0.4907  P    28.839     .500    -5.056     .300  -.089000   .500000   .2278000      .000      .000  
+77 529 43292.00 I  -.060961  .003525   .492372  .000995  I  .2237282  .0006939  2.9631 0.4907  P    28.339     .500    -4.892     .300  -.084000   .501000   .2251000      .000      .000  
+77 530 43293.00 I  -.056883  .003525   .493623  .000995  I  .2208005  .0006939  2.8818 0.4907  P    27.967     .500    -4.673     .300  -.080000   .501000   .2224000      .000      .000  
+77 531 43294.00 I  -.052743  .003525   .494815  .000995  I  .2179811  .0006939  2.7511 0.4907  P    27.728     .500    -4.602     .300  -.076000   .502000   .2197000      .000      .000  
+77 6 1 43295.00 I  -.048549  .003525   .495946  .000995  I  .2153028  .0006939  2.6069 0.3725  P    27.514     .500    -4.759     .300  -.072000   .503000   .2172000      .000      .000  
+77 6 2 43296.00 I  -.044308  .003310   .497014  .002690  I  .2127578  .0002710  2.4912 0.3725  P    27.293     .500    -4.979     .300  -.067000   .503000   .2146000      .000      .000  
+77 6 3 43297.00 I  -.040027  .003310   .498019  .002690  I  .2103014  .0002710  2.4325 0.1916  P    27.156     .500    -5.066     .300  -.063000   .504000   .2121000      .000      .000  
+77 6 4 43298.00 I  -.035714  .003310   .498957  .002690  I  .2078726  .0002710  2.4343 0.4973  P    27.237     .500    -5.035     .300  -.058000   .504000   .2095000      .000      .000  
+77 6 5 43299.00 I  -.031377  .002283   .499829  .000094  I  .2054199  .0009569  2.4749 0.4651  P    27.520     .500    -5.035     .300  -.054000   .505000   .2070000      .000      .000  
+77 6 6 43300.00 I  -.027023  .002283   .500632  .000094  I  .2029206  .0008898  2.5220 0.6533  P    27.719     .500    -5.097     .300  -.050000   .505000   .2046000      .000      .000  
+77 6 7 43301.00 I  -.022658  .002283   .501365  .000094  I  .2003829  .0008898  2.5481 0.6292  P    27.497     .500    -5.117     .300  -.045000   .506000   .2021000      .000      .000  
+77 6 8 43302.00 I  -.018292  .002283   .502026  .000094  I  .1978364  .0008898  2.5384 0.5611  P    26.888     .500    -5.058     .300  -.041000   .506000   .1997000      .000      .000  
+77 6 9 43303.00 I  -.013929  .002274   .502613  .004000  I  .1953189  .0006838  2.4905 0.5611  P    26.346     .500    -5.015     .300  -.036000   .507000   .1972000      .000      .000  
+77 610 43304.00 I  -.009571  .002274   .503126  .004000  I  .1928660  .0006838  2.4107 0.3948  P    26.217     .500    -5.058     .300  -.032000   .507000   .1948000      .000      .000  
+77 611 43305.00 I  -.005223  .002264   .503562  .005656  I  .1905050  .0003948  2.3083 0.3955  P    26.322     .500    -5.108     .300  -.027000   .507000   .1925000      .000      .000  
+77 612 43306.00 I  -.000887  .002913   .503920  .004782  I  .1882536  .0003978  2.1931 0.2802  P    26.229     .500    -5.068     .300  -.023000   .507000   .1902000      .000      .000  
+77 613 43307.00 I   .003430  .002913   .504204  .004782  I  .1861192  .0003978  2.0765 0.2813  P    25.824     .500    -4.992     .300  -.018000   .508000   .1878000      .000      .000  
+77 614 43308.00 I   .007721  .002913   .504419  .004782  I  .1840966  .0003978  1.9718 0.3438  P    25.389     .500    -5.022     .300  -.014000   .508000   .1855000      .000      .000  
+77 615 43309.00 I   .011979  .003442   .504571  .003709  I  .1821681  .0005608  1.8897 0.3496  P    25.207     .500    -5.179     .300  -.009000   .508000   .1832000      .000      .000  
+77 616 43310.00 I   .016202  .003297   .504661  .005862  I  .1803069  .0005751  1.8384 0.4016  P    25.294     .500    -5.320     .300  -.004000   .508000   .1810000      .000      .000  
+77 617 43311.00 I   .020388  .003297   .504691  .005862  I  .1784795  .0005751  1.8225 0.4116  P    25.485     .500    -5.314     .300   .000000   .508000   .1788000      .000      .000  
+77 618 43312.00 I   .024538  .003145   .504661  .007414  I  .1766499  .0005890  1.8427 0.4116  P    25.593     .500    -5.203     .300   .005000   .508000   .1765000      .000      .000  
+77 619 43313.00 I   .028650  .003145   .504573  .007414  I  .1747829  .0005890  1.8966 0.4165  P    25.475     .500    -5.137     .300   .009000   .508000   .1743000      .000      .000  
+77 620 43314.00 I   .032724  .003145   .504425  .007414  I  .1728472  .0005890  1.9789 0.3835  P    25.145     .500    -5.184     .300   .014000   .508000   .1721000      .000      .000  
+77 621 43315.00 I   .036766  .002336   .504209  .005245  I  .1708190  .0004913  2.0795 0.3474  P    24.834     .500    -5.257     .300   .018000   .507000   .1700000      .000      .000  
+77 622 43316.00 I   .040780  .001011   .503916  .000238  I  .1686870  .0003686  2.1837 0.3095  P    24.795     .500    -5.233     .300   .023000   .507000   .1679000      .000      .000  
+77 623 43317.00 I   .044771  .001011   .503537  .000238  I  .1664562  .0003765  2.2740 0.3442  P    25.004     .500    -5.082     .300   .027000   .506000   .1658000      .000      .000  
+77 624 43318.00 I   .048745  .004864   .503064  .000406  I  .1641497  .0005813  2.3320 0.3463  P    25.155     .500    -4.860     .300   .032000   .506000   .1637000      .000      .000  
+77 625 43319.00 I   .052704  .004864   .502488  .000406  I  .1618082  .0005813  2.3419 0.4110  P    24.986     .500    -4.612     .300   .036000   .505000   .1616000      .000      .000  
+77 626 43320.00 I   .056653  .004864   .501798  .000406  I  .1594844  .0005813  2.2964 0.4518  P    24.508     .500    -4.373     .300   .040000   .504000   .1596000      .000      .000  
+77 627 43321.00 I   .060594  .006804   .500987  .000522  I  .1572312  .0006917  2.2034 0.4186  P    23.933     .500    -4.239     .300   .045000   .503000   .1576000      .000      .000  
+77 628 43322.00 I   .064541  .008208   .500045  .007675  I  .1550854  .0006025  2.0870 0.4709  P    23.461     .500    -4.329     .300   .049000   .503000   .1556000      .000      .000  
+77 629 43323.00 I   .068508  .008208   .498965  .007675  I  .1530532  .0006391  1.9825 0.3742  P    23.157     .500    -4.613     .300   .054000   .502000   .1536000      .000      .000  
+77 630 43324.00 I   .072512  .009404   .497736  .010841  I  .1511055  .0004439  1.9227 0.4782  P    22.968     .500    -4.869     .300   .058000   .501000   .1516000      .000      .000  
+77 7 1 43325.00 I   .076569  .009404   .496352  .010841  I  .1491874  .0007116  1.9240 0.4194  P    22.854     .500    -4.890     .300   .062000   .500000   .1497000      .000      .000  
+77 7 2 43326.00 I   .080691  .009404   .494806  .010841  I  .1472403  .0007116  1.9768 0.4898  P    22.878     .500    -4.726     .300   .067000   .498000   .1478000      .000      .000  
+77 7 3 43327.00 I   .084878  .009155   .493103  .010095  I  .1452269  .0006731  2.0504 0.4981  P    23.087     .500    -4.606     .300   .071000   .497000   .1458000      .000      .000  
+77 7 4 43328.00 I   .089128  .008899   .491249  .009289  I  .1431446  .0006971  2.1088 0.4388  P    23.282     .500    -4.652     .300   .076000   .495000   .1439000      .000      .000  
+77 7 5 43329.00 I   .093441  .006458   .489249  .007229  I  .1410233  .0005631  2.1253 0.4404  P    23.101     .500    -4.759     .300   .080000   .494000   .1420000      .000      .000  
+77 7 6 43330.00 I   .097811  .006458   .487111  .007229  I  .1389103  .0005385  2.0929 0.3415  P    22.459     .500    -4.794     .300   .084000   .493000   .1401000      .000      .000  
+77 7 7 43331.00 I   .102226  .006458   .484849  .007229  I  .1368509  .0003865  2.0202 0.3314  P    21.758     .500    -4.779     .300   .089000   .491000   .1382000      .000      .000  
+77 7 8 43332.00 I   .106665  .006458   .482482  .007229  I  .1348787  .0003865  1.9211 0.2169  P    21.455     .500    -4.809     .300   .093000   .490000   .1364000      .000      .000  
+77 7 9 43333.00 I   .111111  .002892   .480027  .003875  I  .1330132  .0001971  1.8087 0.2200  P    21.511     .500    -4.884     .300   .098000   .488000   .1345000      .000      .000  
+77 710 43334.00 I   .115549  .002892   .477496  .003875  I  .1312618  .0002104  1.6949 0.1684  P    21.501     .500    -4.925     .300   .102000   .487000   .1326000      .000      .000  
+77 711 43335.00 I   .119963  .003538   .474902  .003434  I  .1296198  .0002732  1.5918 0.1501  P    21.196     .500    -4.906     .300   .106000   .485000   .1307000      .000      .000  
+77 712 43336.00 I   .124338  .008811   .472259  .004510  I  .1280705  .0002142  1.5118 0.1736  P    20.794     .500    -4.894     .300   .111000   .483000   .1289000      .000      .000  
+77 713 43337.00 I   .128654  .008811   .469581  .004510  I  .1265848  .0002142  1.4661 0.1515  P    20.574     .500    -4.922     .300   .115000   .482000   .1270000      .000      .000  
+77 714 43338.00 I   .132889  .008811   .466887  .004510  I  .1251247  .0002142  1.4613 0.1256  P    20.569     .500    -4.938     .300   .120000   .480000   .1252000      .000      .000  
+77 715 43339.00 I   .137022  .008773   .464193  .007298  I  .1236482  .0001313  1.4986 0.1256  P    20.660     .500    -4.885     .300   .124000   .478000   .1233000      .000      .000  
+77 716 43340.00 I   .141046  .008773   .461511  .007298  I  .1221143  .0001313  1.5754 0.0928  P    20.764     .500    -4.786     .300   .128000   .476000   .1215000      .000      .000  
+77 717 43341.00 I   .144961  .008773   .458851  .007298  I  .1204865  .0001313  1.6849 0.2357  P    20.810     .500    -4.717     .300   .132000   .474000   .1196000      .000      .000  
+77 718 43342.00 I   .148769  .002495   .456223  .006823  I  .1187374  .0004528  1.8158 0.2357  P    20.686     .500    -4.720     .300   .137000   .472000   .1178000      .000      .000  
+77 719 43343.00 I   .152475  .002495   .453630  .006823  I  .1168530  .0004528  1.9523 0.2925  P    20.370     .500    -4.765     .300   .141000   .470000   .1159000      .000      .000  
+77 720 43344.00 I   .156086  .003354   .451069  .005733  I  .1148374  .0003704  2.0750 0.3202  P    20.040     .500    -4.791     .300   .145000   .468000   .1141000      .000      .000  
+77 721 43345.00 I   .159611  .003359   .448538  .003239  I  .1127143  .0004529  2.1639 0.2913  P    19.913     .500    -4.744     .300   .149000   .466000   .1123000      .000      .000  
+77 722 43346.00 I   .163059  .003359   .446031  .003239  I  .1105254  .0004496  2.2053 0.3086  P    19.993     .500    -4.607     .300   .153000   .464000   .1105000      .000      .000  
+77 723 43347.00 I   .166440  .003359   .443541  .003239  I  .1083208  .0004192  2.1955 0.2518  P    20.061     .500    -4.408     .300   .157000   .461000   .1086000      .000      .000  
+77 724 43348.00 I   .169759  .004615   .441062  .002345  I  .1061490  .0002267  2.1419 0.2383  P    19.897     .500    -4.232     .300   .161000   .459000   .1068000      .000      .000  
+77 725 43349.00 I   .173020  .004615   .438590  .002345  I  .1040455  .0002267  2.0626 0.1999  P    19.477     .500    -4.202     .300   .165000   .457000   .1050000      .000      .000  
+77 726 43350.00 I   .176223  .003310   .436122  .002690  I  .1020235  .0003293  1.9840 0.2457  P    18.967     .500    -4.397     .300   .169000   .454000   .1031000      .000      .000  
+77 727 43351.00 I   .179368  .001299   .433652  .005142  I  .1000677  .0004360  1.9348 0.2734  P    18.552     .500    -4.749     .300   .172000   .452000   .1012000      .000      .000  
+77 728 43352.00 I   .182457  .001299   .431178  .005142  I  .0981372  .0004365  1.9359 0.3851  P    18.297     .500    -5.033     .300   .176000   .449000   .0994000      .000      .000  
+77 729 43353.00 I   .185491  .001299   .428696  .005142  I  .0961782  .0006348  1.9903 0.3584  P    18.170     .500    -5.041     .300   .179000   .447000   .0975000      .000      .000  
+77 730 43354.00 I   .188469  .001873   .426202  .003945  I  .0941448  .0005685  2.0800 0.4211  P    18.158     .500    -4.792     .300   .183000   .444000   .0956000      .000      .000  
+77 731 43355.00 I   .191393  .001873   .423697  .003945  I  .0920173  .0005536  2.1723 0.3968  P    18.280     .500    -4.525     .300   .186000   .441000   .0937000      .000      .000  
+77 8 1 43356.00 I   .194260  .001873   .421184  .003945  I  .0898110  .0005536  2.2323 0.3686  P    18.439     .500    -4.453     .300   .190000   .439000   .0918000      .000      .000  
+77 8 2 43357.00 I   .197068  .002767   .418666  .004987  I  .0875704  .0004869  2.2392 0.3686  P    18.387     .500    -4.562     .300   .193000   .436000   .0900000      .000      .000  
+77 8 3 43358.00 I   .199812  .002767   .416148  .004987  I  .0853505  .0004869  2.1925 0.3161  P    17.984     .500    -4.682     .300   .197000   .434000   .0881000      .000      .000  
+77 8 4 43359.00 I   .202487  .002767   .413635  .004987  I  .0831987  .0004033  2.1058 0.2811  P    17.416     .500    -4.714     .300   .200000   .431000   .0862000      .000      .000  
+77 8 5 43360.00 I   .205086  .002292   .411134  .005120  I  .0811463  .0002812  1.9968 0.2324  P    17.021     .500    -4.698     .300   .203000   .428000   .0843000      .000      .000  
+77 8 6 43361.00 I   .207607  .002292   .408645  .005120  I  .0792069  .0002312  1.8822 0.1820  P    16.907     .500    -4.707     .300   .207000   .425000   .0824000      .000      .000  
+77 8 7 43362.00 I   .210050  .002292   .406167  .005120  I  .0773793  .0002312  1.7753 0.2785  P    16.893     .500    -4.744     .300   .210000   .422000   .0804000      .000      .000  
+77 8 8 43363.00 I   .212415  .007256   .403695  .002685  I  .0756495  .0005068  1.6887 0.2785  P    16.806     .500    -4.770     .300   .214000   .419000   .0785000      .000      .000  
+77 8 9 43364.00 I   .214700  .007256   .401224  .002685  I  .0739912  .0005068  1.6342 0.3584  P    16.673     .500    -4.762     .300   .217000   .416000   .0766000      .000      .000  
+77 810 43365.00 I   .216906  .007256   .398749  .002685  I  .0723674  .0005068  1.6207 0.4170  P    16.589     .500    -4.724     .300   .220000   .413000   .0746000      .000      .000  
+77 811 43366.00 I   .219033  .010236   .396262  .002654  I  .0707352  .0006624  1.6508 0.3794  P    16.550     .500    -4.672     .300   .223000   .410000   .0726000      .000      .000  
+77 812 43367.00 I   .221096  .009367   .393754  .005785  I  .0690521  .0005648  1.7219 0.4353  P    16.522     .500    -4.641     .300   .227000   .406000   .0705000      .000      .000  
+77 813 43368.00 I   .223113  .009367   .391214  .005785  I  .0672798  .0005648  1.8280 0.3599  P    16.551     .500    -4.654     .300   .230000   .403000   .0685000      .000      .000  
+77 814 43369.00 I   .225102  .008408   .388632  .007738  I  .0653877  .0004463  1.9595 0.3599  P    16.664     .500    -4.681     .300   .233000   .400000   .0665000      .000      .000  
+77 815 43370.00 I   .227082  .008408   .385999  .007738  I  .0633572  .0004463  2.1017 0.3156  P    16.737     .500    -4.656     .300   .236000   .397000   .0644000      .000      .000  
+77 816 43371.00 I   .229062  .008408   .383309  .007738  I  .0611873  .0004463  2.2348 0.3156  P    16.599     .500    -4.555     .300   .239000   .393000   .0622000      .000      .000  
+77 817 43372.00 I   .231045  .008408   .380563  .007738  I  .0588980  .0004463  2.3365 0.2611  P    16.261     .500    -4.439     .300   .241000   .390000   .0601000      .000      .000  
+77 818 43373.00 I   .233032  .003310   .377760  .002690  I  .0565309  .0002710  2.3882 0.2611  P    15.942     .500    -4.372     .300   .244000   .386000   .0579000      .000      .000  
+77 819 43374.00 I   .235027  .003310   .374900  .002690  I  .0541403  .0002710  2.3837 0.1916  P    15.845     .500    -4.351     .300   .247000   .383000   .0558000      .000      .000  
+77 820 43375.00 I   .237031  .003310   .371983  .002690  I  .0517795  .0002710  2.3314 0.1750  P    15.961     .500    -4.328     .300   .250000   .380000   .0536000      .000      .000  
+77 821 43376.00 I   .239047  .009904   .369011  .003391  I  .0494863  .0002215  2.2529 0.1750  P    16.094     .500    -4.298     .300   .252000   .377000   .0514000      .000      .000  
+77 822 43377.00 I   .241077  .009904   .365981  .003391  I  .0472730  .0002215  2.1765 0.1566  P    16.061     .500    -4.324     .300   .255000   .373000   .0491000      .000      .000  
+77 823 43378.00 I   .243123  .009904   .362896  .003391  I  .0451234  .0002215  2.1298 0.1566  P    15.837     .500    -4.470     .300   .257000   .370000   .0469000      .000      .000  
+77 824 43379.00 I   .245184  .009904   .359754  .003391  I  .0429967  .0002215  2.1332 0.1566  P    15.536     .500    -4.713     .300   .260000   .367000   .0447000      .000      .000  
+77 825 43380.00 I   .247249  .009904   .356560  .003391  I  .0408378  .0002215  2.1942 0.1566  P    15.302     .500    -4.922     .300   .262000   .364000   .0423000      .000      .000  
+77 826 43381.00 I   .249300  .009904   .353319  .003391  I  .0385923  .0002215  2.3033 0.2772  P    15.206     .500    -4.939     .300   .265000   .360000   .0400000      .000      .000  
+77 827 43382.00 I   .251321  .003466   .350034  .002468  I  .0362236  .0005082  2.4353 0.2772  P    15.240     .500    -4.726     .300   .267000   .357000   .0376000      .000      .000  
+77 828 43383.00 I   .253295  .003466   .346710  .002468  I  .0337251  .0005082  2.5571 0.3594  P    15.354     .500    -4.423     .300   .270000   .353000   .0353000      .000      .000  
+77 829 43384.00 I   .255206  .003466   .343352  .002468  I  .0311225  .0005082  2.6394 0.3594  P    15.465     .500    -4.240     .300   .272000   .350000   .0329000      .000      .000  
+77 830 43385.00 I   .257037  .003466   .339965  .002468  I  .0284644  .0005082  2.6673 0.3594  P    15.470     .500    -4.258     .300   .274000   .346000   .0304000      .000      .000  
+77 831 43386.00 I   .258773  .003466   .336553  .002468  I  .0258056  .0005082  2.6422 0.4092  P    15.298     .500    -4.371     .300   .276000   .343000   .0279000      .000      .000  
+77 9 1 43387.00 I   .260403  .003466   .333124  .002468  I  .0231927  .0006414  2.5791 0.3341  P    14.974     .500    -4.433     .300   .278000   .339000   .0254000      .000      .000  
+77 9 2 43388.00 I   .261918  .010931   .329686  .016021  I  .0206533  .0004339  2.4984 0.3872  P    14.625     .500    -4.409     .300   .280000   .336000   .0229000      .000      .000  
+77 9 3 43389.00 I   .263308  .010931   .326247  .016021  I  .0181958  .0004339  2.4181 0.3068  P    14.398     .500    -4.377     .300   .282000   .332000   .0204000      .000      .000  
+77 9 4 43390.00 I   .264561  .010931   .322814  .016021  I  .0158123  .0004339  2.3522 0.3068  P    14.379     .500    -4.401     .300   .283000   .329000   .0177000      .000      .000  
+77 9 5 43391.00 I   .265669  .010931   .319396  .016021  I  .0134830  .0004339  2.3115 0.2987  P    14.547     .500    -4.468     .300   .285000   .325000   .0150000      .000      .000  
+77 9 6 43392.00 I   .266628  .010931   .315994  .016021  I  .0111780  .0004106  2.3048 0.2338  P    14.777     .500    -4.517     .300   .286000   .322000   .0123000      .000      .000  
+77 9 7 43393.00 I   .267445  .010931   .312596  .016021  I  .0088600  .0001741  2.3383 0.2515  P    14.924     .500    -4.507     .300   .288000   .318000   .0096000      .000      .000  
+77 9 8 43394.00 I   .268133  .003310   .309189  .002690  I  .0064876  .0002905  2.4132 0.1401  P    14.926     .500    -4.459     .300   .289000   .315000   .0069000      .000      .000  
+77 9 9 43395.00 I   .268701  .005556   .305760  .015372  I  .0040210  .0002195  2.5258 0.1821  P    14.854     .500    -4.448     .300   .290000   .311000   .0041000      .000      .000  
+77 910 43396.00 I   .269160  .005556   .302295  .015372  I  .0014261  .0002195  2.6682 0.1552  P    14.824     .500    -4.529     .300   .291000   .308000   .0013000      .000      .000  
+77 911 43397.00 I   .269522  .005556   .298782  .015372  I -.0013213  .0002195  2.8284 0.1419  P    14.877     .500    -4.641     .300   .292000   .304000  -.0015000      .000      .000  
+77 912 43398.00 I   .269796  .005556   .295208  .015372  I -.0042306  .0001799  2.9881 0.1419  P    14.937     .500    -4.634     .300   .293000   .301000  -.0043000      .000      .000  
+77 913 43399.00 I   .269986  .005556   .291573  .015372  I -.0072892  .0001799  3.1227 0.1272  P    14.900     .500    -4.427     .300   .294000   .297000  -.0071000      .000      .000  
+77 914 43400.00 I   .270092  .005556   .287884  .015372  I -.0104594  .0001799  3.2074 0.1626  P    14.738     .500    -4.120     .300   .295000   .293000  -.0100000      .000      .000  
+77 915 43401.00 I   .270114  .003310   .284148  .002690  I -.0136818  .0002710  3.2254 0.1626  P    14.527     .500    -3.911     .300   .296000   .289000  -.0129000      .000      .000  
+77 916 43402.00 I   .270054  .003310   .280373  .002690  I -.0168882  .0002710  3.1773 0.1916  P    14.387     .500    -3.895     .300   .296000   .286000  -.0157000      .000      .000  
+77 917 43403.00 I   .269909  .003310   .276564  .002690  I -.0200210  .0002710  3.0829 0.3706  P    14.390     .500    -3.997     .300   .297000   .282000  -.0186000      .000      .000  
+77 918 43404.00 I   .269682  .002806   .272729  .006509  I -.0230495  .0006899  2.9749 0.3706  P    14.505     .500    -4.089     .300   .298000   .278000  -.0215000      .000      .000  
+77 919 43405.00 I   .269372  .002806   .268874  .006509  I -.0259776  .0006899  2.8872 0.4878  P    14.640     .500    -4.125     .300   .298000   .274000  -.0244000      .000      .000  
+77 920 43406.00 I   .268979  .002806   .265007  .006509  I -.0288387  .0006899  2.8439 0.4878  P    14.717     .500    -4.148     .300   .298000   .271000  -.0274000      .000      .000  
+77 921 43407.00 I   .268504  .002806   .261134  .006509  I -.0316835  .0006899  2.8549 0.4878  P    14.737     .500    -4.204     .300   .299000   .267000  -.0303000      .000      .000  
+77 922 43408.00 I   .267952  .002806   .257254  .006509  I -.0345648  .0006899  2.9148 0.4309  P    14.764     .500    -4.273     .300   .299000   .264000  -.0333000      .000      .000  
+77 923 43409.00 I   .267328  .004994   .253366  .006890  I -.0375231  .0005166  3.0046 0.3653  P    14.858     .500    -4.277     .300   .299000   .260000  -.0362000      .000      .000  
+77 924 43410.00 I   .266637  .006481   .249467  .007251  I -.0405750  .0002405  3.0974 0.2849  P    15.015     .500    -4.160     .300   .299000   .256000  -.0392000      .000      .000  
+77 925 43411.00 I   .265886  .006481   .245557  .007251  I -.0437097  .0002405  3.1657 0.1701  P    15.153     .500    -3.956     .300   .299000   .252000  -.0422000      .000      .000  
+77 926 43412.00 I   .265079  .006481   .241635  .007251  I -.0468915  .0002405  3.1892 0.1701  P    15.196     .500    -3.779     .300   .299000   .249000  -.0451000      .000      .000  
+77 927 43413.00 I   .264214  .006481   .237704  .007251  I -.0500708  .0002405  3.1608 0.2556  P    15.146     .500    -3.714     .300   .299000   .245000  -.0481000      .000      .000  
+77 928 43414.00 I   .263284  .005080   .233771  .005733  I -.0531981  .0004510  3.0874 0.3731  P    15.070     .500    -3.741     .300   .299000   .241000  -.0511000      .000      .000  
+77 929 43415.00 I   .262283  .003100   .229846  .003625  I -.0562362  .0007063  2.9857 0.3685  P    14.988     .500    -3.771     .300   .298000   .237000  -.0541000      .000      .000  
+77 930 43416.00 I   .261204  .008030   .225936  .007837  I -.0591666  .0005828  2.8753 0.4579  P    14.877     .500    -3.768     .300   .298000   .233000  -.0571000      .000      .000  
+7710 1 43417.00 I   .260040  .008030   .222048  .007837  I -.0619897  .0005828  2.7735 0.4121  P    14.800     .500    -3.768     .300   .297000   .230000  -.0601000      .000      .000  
+7710 2 43418.00 I   .258791  .008030   .218186  .007837  I -.0647210  .0005828  2.6939 0.4121  P    14.924     .500    -3.819     .300   .297000   .226000  -.0631000      .000      .000  
+7710 3 43419.00 I   .257454  .008030   .214353  .007837  I -.0673890  .0005828  2.6487 0.3989  P    15.321     .500    -3.911     .300   .296000   .222000  -.0661000      .000      .000  
+7710 4 43420.00 I   .256033  .007860   .210549  .007426  I -.0700321  .0005447  2.6447 0.3364  P    15.803     .500    -3.993     .300   .295000   .218000  -.0692000      .000      .000  
+7710 5 43421.00 I   .254546  .007860   .206766  .007426  I -.0726932  .0003362  2.6851 0.3469  P    16.099     .500    -4.018     .300   .294000   .214000  -.0723000      .000      .000  
+7710 6 43422.00 I   .253012  .002056   .202993  .000778  I -.0754167  .0004298  2.7688 0.5658  P    16.159     .500    -3.975     .300   .293000   .211000  -.0755000      .000      .000  
+7710 7 43423.00 I   .251451  .012307   .199220  .007154  I -.0782432  .0010804  2.8899 0.5814  P    16.166     .500    -3.913     .300   .292000   .207000  -.0786000      .000      .000  
+7710 8 43424.00 I   .249883  .012307   .195435  .007154  I -.0812060  .0010804  3.0397 0.7640  P    16.242     .500    -3.911     .300   .291000   .203000  -.0817000      .000      .000  
+7710 9 43425.00 I   .248334  .012307   .191630  .007154  I -.0843280  .0010804  3.2057 0.9106  P    16.310     .500    -3.978     .300   .289000   .199000  -.0849000      .000      .000  
+771010 43426.00 I   .246824  .017283   .187794  .010087  I -.0876157  .0014662  3.3664 0.7496  P    16.275     .500    -3.990     .300   .288000   .195000  -.0881000      .000      .000  
+771011 43427.00 I   .245357  .012486   .183928  .007458  I -.0910496  .0010395  3.4933 0.8987  P    16.203     .500    -3.803     .300   .286000   .192000  -.0912000      .000      .000  
+771012 43428.00 I   .243924  .012486   .180034  .007458  I -.0945828  .0010395  3.5615 0.5225  P    16.224     .500    -3.445     .300   .285000   .188000  -.0944000      .000      .000  
+771013 43429.00 I   .242517  .003619   .176116  .003080  I -.0981487  .0001064  3.5579 0.5225  P    16.342     .500    -3.139     .300   .283000   .184000  -.0976000      .000      .000  
+771014 43430.00 I   .241125  .003619   .172177  .003080  I -.1016771  .0001064  3.4897 0.1951  P    16.450     .500    -3.076     .300   .281000   .180000  -.1009000      .000      .000  
+771015 43431.00 I   .239742  .010825   .168223  .004041  I -.1051158  .0003754  3.3848 0.1951  P    16.462     .500    -3.218     .300   .279000   .177000  -.1041000      .000      .000  
+771016 43432.00 I   .238365  .010825   .164261  .004041  I -.1084474  .0003754  3.2822 0.3207  P    16.392     .500    -3.368     .300   .277000   .173000  -.1074000      .000      .000  
+771017 43433.00 I   .236992  .014874   .160299  .004814  I -.1116924  .0005201  3.2161 0.3207  P    16.318     .500    -3.396     .300   .275000   .170000  -.1106000      .000      .000  
+771018 43434.00 I   .235622  .014874   .156343  .004814  I -.1148973  .0005201  3.2030 0.3201  P    16.332     .500    -3.337     .300   .273000   .166000  -.1139000      .000      .000  
+771019 43435.00 I   .234244  .011193   .152405  .005267  I -.1181151  .0003732  3.2401 0.3201  P    16.487     .500    -3.282     .300   .271000   .163000  -.1172000      .000      .000  
+771020 43436.00 I   .232834  .011193   .148495  .005267  I -.1213882  .0003732  3.3094 0.1920  P    16.752     .500    -3.254     .300   .268000   .159000  -.1204000      .000      .000  
+771021 43437.00 I   .231360  .005414   .144629  .005683  I -.1247362  .0000904  3.3857 0.2110  P    17.032     .500    -3.211     .300   .266000   .156000  -.1237000      .000      .000  
+771022 43438.00 I   .229791  .004175   .140821  .004043  I -.1281541  .0001971  3.4456 0.1084  P    17.238     .500    -3.125     .300   .263000   .152000  -.1269000      .000      .000  
+771023 43439.00 I   .228100  .004175   .137082  .004043  I -.1316161  .0001971  3.4715 0.1330  P    17.321     .500    -3.018     .300   .261000   .149000  -.1302000      .000      .000  
+771024 43440.00 I   .226268  .004175   .133418  .004043  I -.1350826  .0001786  3.4538 0.1331  P    17.276     .500    -2.930     .300   .258000   .146000  -.1334000      .000      .000  
+771025 43441.00 I   .224273  .009785   .129837  .000726  I -.1385092  .0001789  3.3924 0.1264  P    17.170     .500    -2.864     .300   .256000   .142000  -.1367000      .000      .000  
+771026 43442.00 I   .222098  .009785   .126344  .000726  I -.1418558  .0001789  3.2961 0.1265  P    17.123     .500    -2.800     .300   .253000   .139000  -.1399000      .000      .000  
+771027 43443.00 I   .219726  .009785   .122945  .000726  I -.1450950  .0001789  3.1806 0.0974  P    17.199     .500    -2.729     .300   .251000   .135000  -.1432000      .000      .000  
+771028 43444.00 I   .217146  .013637   .119647  .000809  I -.1482166  .0000769  3.0638 0.2663  P    17.342     .500    -2.681     .300   .248000   .132000  -.1464000      .000      .000  
+771029 43445.00 I   .214360  .016366   .116453  .007386  I -.1512272  .0005016  2.9609 0.2751  P    17.510     .500    -2.686     .300   .245000   .129000  -.1496000      .000      .000  
+771030 43446.00 I   .211380  .016366   .113368  .007386  I -.1541470  .0005447  2.8838 0.4327  P    17.780     .500    -2.737     .300   .242000   .126000  -.1528000      .000      .000  
+771031 43447.00 I   .208216  .018702   .110397  .010414  I -.1570059  .0007052  2.8401 0.4455  P    18.214     .500    -2.798     .300   .240000   .122000  -.1559000      .000      .000  
+7711 1 43448.00 I   .204878  .018702   .107544  .010414  I -.1598398  .0007052  2.8343 0.4987  P    18.658     .500    -2.850     .300   .237000   .119000  -.1591000      .000      .000  
+7711 2 43449.00 I   .201393  .018702   .104809  .010414  I -.1626876  .0007052  2.8678 0.4598  P    18.882     .500    -2.875     .300   .234000   .116000  -.1623000      .000      .000  
+7711 3 43450.00 I   .197804  .017105   .102181  .007368  I -.1655874  .0005903  2.9373 0.3975  P    18.912     .500    -2.837     .300   .231000   .113000  -.1654000      .000      .000  
+7711 4 43451.00 I   .194157  .015343   .099653  .000364  I -.1685717  .0003669  3.0353 0.3475  P    19.006     .500    -2.712     .300   .228000   .110000  -.1685000      .000      .000  
+7711 5 43452.00 I   .190500  .015343   .097216  .000364  I -.1716640  .0003669  3.1513 0.2594  P    19.255     .500    -2.559     .300   .226000   .108000  -.1716000      .000      .000  
+7711 6 43453.00 I   .186872  .015343   .094859  .000364  I -.1748758  .0003669  3.2718 0.2249  P    19.438     .500    -2.478     .300   .223000   .105000  -.1747000      .000      .000  
+7711 7 43454.00 I   .183296  .015307   .092575  .000364  I -.1782032  .0002603  3.3790 0.2249  P    19.362     .500    -2.456     .300   .220000   .102000  -.1778000      .000      .000  
+7711 8 43455.00 I   .179789  .015307   .090356  .000364  I -.1816217  .0002603  3.4500 0.1310  P    19.183     .500    -2.354     .300   .217000   .099000  -.1809000      .000      .000  
+7711 9 43456.00 I   .176367  .015270   .088191  .002690  I -.1850845  .0000303  3.4648 0.1310  P    19.208     .500    -2.099     .300   .214000   .097000  -.1840000      .000      .000  
+771110 43457.00 I   .173044  .015270   .086073  .002690  I -.1885299  .0000303  3.4154 0.0214  P    19.508     .500    -1.837     .300   .212000   .094000  -.1870000      .000      .000  
+771111 43458.00 I   .169819  .015270   .083993  .002690  I -.1918985  .0000303  3.3154 0.0214  P    19.863     .500    -1.785     .300   .209000   .092000  -.1901000      .000      .000  
+771112 43459.00 I   .166678  .015270   .081943  .002690  I -.1951549  .0000303  3.1978 0.1363  P    20.019     .500    -1.953     .300   .206000   .089000  -.1932000      .000      .000  
+771113 43460.00 I   .163610  .003310   .079914  .002690  I -.1983014  .0002710  3.1021 0.1394  P    19.895     .500    -2.131     .300   .203000   .087000  -.1963000      .000      .000  
+771114 43461.00 I   .160601  .001793   .077898  .009681  I -.2013761  .0002771  3.0573 0.1938  P    19.608     .500    -2.148     .300   .200000   .084000  -.1994000      .000      .000  
+771115 43462.00 I   .157639  .001793   .075885  .009681  I -.2044350  .0002771  3.0694 0.1959  P    19.395     .500    -2.056     .300   .198000   .082000  -.2024000      .000      .000  
+771116 43463.00 I   .154712  .001793   .073867  .009681  I -.2075283  .0002771  3.1217 0.1744  P    19.442     .500    -1.988     .300   .195000   .079000  -.2055000      .000      .000  
+771117 43464.00 I   .151806  .001272   .071837  .006865  I -.2106822  .0002117  3.1855 0.1744  P    19.708     .500    -1.958     .300   .192000   .077000  -.2086000      .000      .000  
+771118 43465.00 I   .148908  .001272   .069796  .006865  I -.2138939  .0002117  3.2333 0.1436  P    19.954     .500    -1.884     .300   .189000   .075000  -.2117000      .000      .000  
+771119 43466.00 I   .146001  .001272   .067748  .006865  I -.2171378  .0001942  3.2482 0.1176  P    20.005     .500    -1.753     .300   .186000   .073000  -.2148000      .000      .000  
+771120 43467.00 I   .143069  .000144   .065696  .000735  I -.2203774  .0001026  3.2243 0.1361  P    19.906     .500    -1.659     .300   .184000   .070000  -.2178000      .000      .000  
+771121 43468.00 I   .140096  .012232   .063645  .004452  I -.2235741  .0001907  3.1634 0.1083  P    19.796     .500    -1.657     .300   .181000   .068000  -.2209000      .000      .000  
+771122 43469.00 I   .137068  .012232   .061601  .004452  I -.2266946  .0001907  3.0736 0.1460  P    19.743     .500    -1.679     .300   .178000   .066000  -.2240000      .000      .000  
+771123 43470.00 I   .133967  .017298   .059568  .006253  I -.2297155  .0002211  2.9663 0.1613  P    19.756     .500    -1.626     .300   .175000   .064000  -.2271000      .000      .000  
+771124 43471.00 I   .130783  .012959   .057551  .004867  I -.2326260  .0002603  2.8554 0.1776  P    19.850     .500    -1.493     .300   .172000   .062000  -.2302000      .000      .000  
+771125 43472.00 I   .127525  .012959   .055548  .004867  I -.2354300  .0002780  2.7556 0.1904  P    20.022     .500    -1.374     .300   .169000   .060000  -.2332000      .000      .000  
+771126 43473.00 I   .124210  .012959   .053556  .004867  I -.2381449  .0002780  2.6789 0.2060  P    20.229     .500    -1.331     .300   .166000   .058000  -.2363000      .000      .000  
+771127 43474.00 I   .120857  .006052   .051573  .002877  I -.2407984  .0003040  2.6340 0.1849  P    20.458     .500    -1.338     .300   .163000   .056000  -.2394000      .000      .000  
+771128 43475.00 I   .117476  .005817   .049596  .002041  I -.2434254  .0002440  2.6266 0.1949  P    20.722     .500    -1.348     .300   .160000   .054000  -.2424000      .000      .000  
+771129 43476.00 I   .114076  .005817   .047626  .002041  I -.2460646  .0002440  2.6583 0.1340  P    20.952     .500    -1.369     .300   .157000   .052000  -.2455000      .000      .000  
+771130 43477.00 I   .110660  .005571   .045664  .000242  I -.2487541  .0001108  2.7264 0.1340  P    21.035     .500    -1.426     .300   .153000   .051000  -.2485000      .000      .000  
+7712 1 43478.00 I   .107236  .005571   .043711  .000242  I -.2515275  .0001108  2.8249 0.0783  P    21.023     .500    -1.466     .300   .150000   .049000  -.2516000      .000      .000  
+7712 2 43479.00 I   .103810  .005571   .041766  .000242  I -.2544109  .0001108  2.9445 0.1077  P    21.134     .500    -1.387     .300   .147000   .047000  -.2546000      .000      .000  
+7712 3 43480.00 I   .100399  .005206   .039832  .006273  I -.2574196  .0001848  3.0734 0.1306  P    21.426     .500    -1.184     .300   .143000   .045000  -.2577000      .000      .000  
+7712 4 43481.00 I   .097018  .004815   .037907  .008868  I -.2605561  .0002366  3.1976 0.1501  P    21.652     .500     -.985     .300   .140000   .043000  -.2608000      .000      .000  
+7712 5 43482.00 I   .093685  .004815   .035992  .008868  I -.2638080  .0002366  3.3013 0.2804  P    21.575     .500     -.889     .300   .136000   .042000  -.2640000      .000      .000  
+7712 6 43483.00 I   .090413  .003622   .034089  .006659  I -.2671458  .0005084  3.3664 0.2804  P    21.310     .500     -.833     .300   .133000   .040000  -.2671000      .000      .000  
+7712 7 43484.00 I   .087214  .003622   .032206  .006659  I -.2705236  .0005084  3.3798 0.4687  P    21.178     .500     -.707     .300   .129000   .038000  -.2702000      .000      .000  
+7712 8 43485.00 I   .084094  .003411   .030357  .005560  I -.2738882  .0007876  3.3414 0.5387  P    21.308     .500     -.569     .300   .125000   .036000  -.2734000      .000      .000  
+7712 9 43486.00 I   .081061  .002421   .028552  .002656  I -.2771957  .0009500  3.2709 0.6170  P    21.537     .500     -.595     .300   .121000   .035000  -.2766000      .000      .000  
+771210 43487.00 I   .078120  .002421   .026806  .002656  I -.2804311  .0009500  3.2038 0.6135  P    21.638     .500     -.809     .300   .117000   .033000  -.2797000      .000      .000  
+771211 43488.00 I   .075273  .002604   .025137  .007517  I -.2836161  .0007764  3.1752 0.6277  P    21.523     .500    -1.002     .300   .113000   .032000  -.2829000      .000      .000  
+771212 43489.00 I   .072525  .002940   .023559  .008929  I -.2867999  .0008208  3.2018 0.5649  P    21.276     .500     -.988     .300   .109000   .030000  -.2861000      .000      .000  
+771213 43490.00 I   .069874  .002940   .022086  .008929  I -.2900354  .0008208  3.2754 0.4114  P    21.109     .500     -.838     .300   .105000   .029000  -.2893000      .000      .000  
+771214 43491.00 I   .067317  .002937   .020731  .012466  I -.2933573  .0000587  3.3686 0.4110  P    21.205     .500     -.746     .300   .101000   .028000  -.2925000      .000      .000  
+771215 43492.00 I   .064853  .010476   .019504  .009938  I -.2967677  .0000428  3.4469 0.0363  P    21.494     .500     -.746     .300   .096000   .026000  -.2957000      .000      .000  
+771216 43493.00 I   .062474  .010476   .018405  .009938  I -.3002377  .0000428  3.4849 0.0226  P    21.663     .500     -.703     .300   .092000   .025000  -.2989000      .000      .000  
+771217 43494.00 I   .060173  .014522   .017429  .006491  I -.3037211  .0000143  3.4736 0.0226  P    21.518     .500     -.559     .300   .088000   .024000  -.3021000      .000      .000  
+771218 43495.00 I   .057942  .014522   .016575  .006491  I -.3071703  .0000143  3.4184 0.0101  P    21.229     .500     -.443     .300   .084000   .023000  -.3053000      .000      .000  
+771219 43496.00 I   .055757  .014522   .015844  .006491  I -.3105474  .0000143  3.3318 0.0101  P    21.094     .500     -.480     .300   .080000   .022000  -.3086000      .000      .000  
+771220 43497.00 I   .053585  .014522   .015243  .006491  I -.3138279  .0000143  3.2274 0.0839  P    21.163     .500     -.610     .300   .075000   .021000  -.3118000      .000      .000  
+771221 43498.00 I   .051390  .021222   .014776  .011623  I -.3170006  .0001672  3.1183 0.0839  P    21.256     .500     -.672     .300   .071000   .020000  -.3151000      .000      .000  
+771222 43499.00 I   .049138  .021222   .014450  .011623  I -.3200671  .0001672  3.0171 0.1182  P    21.280     .500     -.607     .300   .067000   .019000  -.3183000      .000      .000  
+771223 43500.00 I   .046792  .021222   .014270  .011623  I -.3230414  .0001672  2.9357 0.1182  P    21.309     .500     -.502     .300   .063000   .018000  -.3215000      .000      .000  
+771224 43501.00 I   .044321  .021222   .014241  .011623  I -.3259482  .0001672  2.8833 0.1182  P    21.402     .500     -.441     .300   .058000   .018000  -.3248000      .000      .000  
+771225 43502.00 I   .041712  .021222   .014360  .011623  I -.3288195  .0001672  2.8654 0.1182  P    21.527     .500     -.417     .300   .054000   .017000  -.3280000      .000      .000  
+771226 43503.00 I   .038970  .021222   .014618  .011623  I -.3316910  .0001672  2.8834 0.1592  P    21.649     .500     -.399     .300   .049000   .017000  -.3313000      .000      .000  
+771227 43504.00 I   .036101  .003310   .015005  .002690  I -.3345972  .0002710  2.9342 0.1592  P    21.769     .500     -.424     .300   .045000   .016000  -.3345000      .000      .000  
+771228 43505.00 I   .033110  .003310   .015512  .002690  I -.3375686  .0002710  3.0125 0.1916  P    21.867     .500     -.535     .300   .041000   .016000  -.3377000      .000      .000  
+771229 43506.00 I   .030003  .003310   .016128  .002690  I -.3406283  .0002710  3.1092 0.1916  P    21.936     .500     -.679     .300   .036000   .016000  -.3410000      .000      .000  
+771230 43507.00 I   .026786  .003310   .016844  .002690  I -.3437893  .0002710  3.2129 0.1916  P    22.033     .500     -.718     .300   .032000   .015000  -.3442000      .000      .000  
+771231 43508.00 I   .023463  .003310   .017651  .002690  I -.3470520  .0002710  3.3102 0.1916  P    22.183     .500     -.586     .300   .027000   .015000  -.3475000      .000      .000  
+78 1 1 43509.00 I   .020040  .003310   .018540  .002690  I  .6495968  .0002710  3.3879 0.1916  P    22.271     .500     -.376     .300   .023000   .015000   .6493000      .000      .000  
+78 1 2 43510.00 I   .016522  .003310   .019499  .002690  I  .6461826  .0002710  3.4342 0.1916  P    22.160     .500     -.223     .300   .019000   .015000   .6461000      .000      .000  
+78 1 3 43511.00 I   .012916  .003310   .020520  .002690  I  .6427420  .0002710  3.4396 0.1916  P    21.900     .500     -.148     .300   .015000   .015000   .6429000      .000      .000  
+78 1 4 43512.00 I   .009227  .003310   .021594  .002690  I  .6393177  .0002710  3.4021 0.1916  P    21.668     .500     -.089     .300   .011000   .015000   .6398000      .000      .000  
+78 1 5 43513.00 I   .005460  .003310   .022710  .002690  I  .6359491  .0002710  3.3308 0.1916  P    21.535     .500     -.063     .300   .007000   .015000   .6366000      .000      .000  
+78 1 6 43514.00 I   .001620  .003310   .023858  .002690  I  .6326596  .0002710  3.2488 0.3493  P    21.412     .500     -.176     .300   .003000   .015000   .6334000      .000      .000  
+78 1 7 43515.00 I  -.002286  .000685   .025031  .007140  I  .6294446  .0006439  3.1873 0.3493  P    21.213     .500     -.431     .300  -.001000   .016000   .6303000      .000      .000  
+78 1 8 43516.00 I  -.006254  .000685   .026216  .007140  I  .6262694  .0006439  3.1726 0.4553  P    20.960     .500     -.624     .300  -.005000   .016000   .6271000      .000      .000  
+78 1 9 43517.00 I  -.010278  .000685   .027406  .007140  I  .6230813  .0006439  3.2121 0.4553  P    20.763     .500     -.565     .300  -.008000   .017000   .6240000      .000      .000  
+78 110 43518.00 I  -.014352  .000685   .028591  .007140  I  .6198327  .0006439  3.2892 0.4553  P    20.769     .500     -.324     .300  -.012000   .017000   .6208000      .000      .000  
+78 111 43519.00 I  -.018472  .000685   .029769  .007140  I  .6165018  .0006439  3.3698 0.4553  P    21.062     .500     -.155     .300  -.016000   .018000   .6177000      .000      .000  
+78 112 43520.00 I  -.022634  .000685   .030938  .007140  I  .6131041  .0006439  3.4175 0.3493  P    21.495     .500     -.169     .300  -.020000   .019000   .6146000      .000      .000  
+78 113 43521.00 I  -.026834  .003310   .032100  .002690  I  .6096852  .0002710  3.4101 0.3493  P    21.719     .500     -.232     .300  -.024000   .020000   .6115000      .000      .000  
+78 114 43522.00 I  -.031067  .003310   .033253  .002690  I  .6063026  .0002710  3.3466 0.1916  P    21.535     .500     -.203     .300  -.027000   .021000   .6083000      .000      .000  
+78 115 43523.00 I  -.035329  .003310   .034397  .002690  I  .6030057  .0002710  3.2419 0.1916  P    21.165     .500     -.136     .300  -.031000   .022000   .6052000      .000      .000  
+78 116 43524.00 I  -.039617  .003310   .035533  .002690  I  .5998260  .0002710  3.1156 0.1916  P    20.984     .500     -.177     .300  -.035000   .023000   .6021000      .000      .000  
+78 117 43525.00 I  -.043925  .003310   .036659  .002690  I  .5967754  .0002710  2.9865 0.1916  P    21.054     .500     -.342     .300  -.039000   .024000   .5990000      .000      .000  
+78 118 43526.00 I  -.048250  .003310   .037777  .002690  I  .5938494  .0002710  2.8683 0.1916  P    21.131     .500     -.503     .300  -.042000   .026000   .5960000      .000      .000  
+78 119 43527.00 I  -.052587  .003310   .038885  .002690  I  .5910312  .0002710  2.7728 0.1373  P    21.080     .500     -.569     .300  -.046000   .027000   .5929000      .000      .000  
+78 120 43528.00 I  -.056933  .003644   .039983  .004005  I  .5882930  .0000447  2.7096 0.1373  P    21.041     .500     -.567     .300  -.049000   .029000   .5899000      .000      .000  
+78 121 43529.00 I  -.061283  .003644   .041071  .004005  I  .5855990  .0000447  2.6852 0.0316  P    21.149     .500     -.552     .300  -.053000   .030000   .5868000      .000      .000  
+78 122 43530.00 I  -.065632  .003644   .042149  .004005  I  .5829089  .0000447  2.7018 0.0316  P    21.333     .500     -.537     .300  -.057000   .032000   .5838000      .000      .000  
+78 123 43531.00 I  -.069978  .003644   .043217  .004005  I  .5801827  .0000447  2.7566 0.0316  P    21.483     .500     -.528     .300  -.060000   .033000   .5807000      .000      .000  
+78 124 43532.00 I  -.074314  .003644   .044276  .004005  I  .5773848  .0000447  2.8441 0.0316  P    21.623     .500     -.570     .300  -.064000   .035000   .5777000      .000      .000  
+78 125 43533.00 I  -.078629  .003644   .045329  .004005  I  .5744866  .0000447  2.9553 0.1373  P    21.814     .500     -.698     .300  -.067000   .036000   .5746000      .000      .000  
+78 126 43534.00 I  -.082914  .003310   .046382  .002690  I  .5714703  .0002710  3.0781 0.1373  P    22.007     .500     -.860     .300  -.071000   .038000   .5716000      .000      .000  
+78 127 43535.00 I  -.087156  .003310   .047440  .002690  I  .5683313  .0002710  3.1981 0.1916  P    22.102     .500     -.947     .300  -.075000   .040000   .5685000      .000      .000  
+78 128 43536.00 I  -.091345  .003310   .048508  .002690  I  .5650802  .0002710  3.2998 0.4703  P    22.073     .500     -.902     .300  -.079000   .042000   .5654000      .000      .000  
+78 129 43537.00 I  -.095469  .003457   .049592  .000177  I  .5617421  .0009008  3.3704 0.4703  P    21.961     .500     -.776     .300  -.082000   .045000   .5623000      .000      .000  
+78 130 43538.00 I  -.099518  .003457   .050695  .000177  I  .5583520  .0009008  3.4032 0.6370  P    21.805     .500     -.660     .300  -.086000   .047000   .5592000      .000      .000  
+78 131 43539.00 I  -.103479  .003457   .051823  .000177  I  .5549479  .0009008  3.3994 0.6370  P    21.635     .500     -.596     .300  -.090000   .049000   .5561000      .000      .000  
+78 2 1 43540.00 I  -.107343  .003457   .052982  .000177  I  .5515624  .0009008  3.3679 0.6370  P    21.479     .500     -.580     .300  -.094000   .051000   .5529000      .000      .000  
+78 2 2 43541.00 I  -.111101  .003457   .054176  .000177  I  .5482159  .0009008  3.3250 0.6370  P    21.316     .500     -.635     .300  -.097000   .054000   .5497000      .000      .000  
+78 2 3 43542.00 I  -.114749  .003457   .055410  .000177  I  .5449082  .0009008  3.2948 0.4703  P    21.088     .500     -.813     .300  -.101000   .056000   .5465000      .000      .000  
+78 2 4 43543.00 I  -.118282  .003310   .056689  .002690  I  .5416135  .0002710  3.3029 0.4703  P    20.784     .500    -1.087     .300  -.104000   .059000   .5433000      .000      .000  
+78 2 5 43544.00 I  -.121695  .003310   .058017  .002690  I  .5382847  .0002710  3.3642 0.1916  P    20.482     .500    -1.282     .300  -.108000   .061000   .5401000      .000      .000  
+78 2 6 43545.00 I  -.124985  .003310   .059400  .002690  I  .5348688  .0002710  3.4743 0.1916  P    20.298     .500    -1.222     .300  -.111000   .063000   .5367000      .000      .000  
+78 2 7 43546.00 I  -.128145  .003310   .060842  .002690  I  .5313286  .0002710  3.6067 0.1916  P    20.338     .500     -.955     .300  -.114000   .066000   .5333000      .000      .000  
+78 2 8 43547.00 I  -.131173  .003310   .062348  .002690  I  .5276610  .0002710  3.7223 0.1916  P    20.638     .500     -.739     .300  -.118000   .068000   .5300000      .000      .000  
+78 2 9 43548.00 I  -.134063  .003310   .063923  .002690  I  .5239011  .0002710  3.7865 0.2103  P    21.060     .500     -.771     .300  -.121000   .071000   .5266000      .000      .000  
+78 210 43549.00 I  -.136811  .010342   .065571  .010800  I  .5201109  .0003216  3.7820 0.2103  P    21.321     .500     -.984     .300  -.124000   .073000   .5232000      .000      .000  
+78 211 43550.00 I  -.139412  .010342   .067299  .010800  I  .5163583  .0003216  3.7140 0.2274  P    21.242     .500    -1.172     .300  -.127000   .076000   .5197000      .000      .000  
+78 212 43551.00 I  -.141862  .010342   .069109  .010800  I  .5126973  .0003216  3.6030 0.2274  P    20.955     .500    -1.244     .300  -.130000   .078000   .5162000      .000      .000  
+78 213 43552.00 I  -.144157  .010342   .071007  .010800  I  .5091584  .0003216  3.4739 0.2274  P    20.740     .500    -1.279     .300  -.133000   .081000   .5128000      .000      .000  
+78 214 43553.00 I  -.146306  .010342   .072987  .010800  I  .5057484  .0003216  3.3481 0.2274  P    20.680     .500    -1.371     .300  -.136000   .083000   .5093000      .000      .000  
+78 215 43554.00 I  -.148325  .010342   .075040  .010800  I  .5024562  .0003216  3.2402 0.2103  P    20.642     .500    -1.512     .300  -.139000   .086000   .5058000      .000      .000  
+78 216 43555.00 I  -.150229  .003310   .077157  .002690  I  .4992585  .0002710  3.1608 0.2103  P    20.588     .500    -1.643     .300  -.142000   .089000   .5023000      .000      .000  
+78 217 43556.00 I  -.152032  .003310   .079328  .002690  I  .4961223  .0002710  3.1183 0.2583  P    20.682     .500    -1.728     .300  -.145000   .091000   .4988000      .000      .000  
+78 218 43557.00 I  -.153750  .000711   .081544  .010230  I  .4930084  .0004399  3.1165 0.2583  P    21.016     .500    -1.762     .300  -.148000   .094000   .4952000      .000      .000  
+78 219 43558.00 I  -.155398  .000711   .083795  .010230  I  .4898759  .0004399  3.1551 0.3111  P    21.422     .500    -1.760     .300  -.151000   .096000   .4917000      .000      .000  
+78 220 43559.00 I  -.156991  .000711   .086073  .010230  I  .4866864  .0004399  3.2291 0.3111  P    21.685     .500    -1.766     .300  -.154000   .099000   .4882000      .000      .000  
+78 221 43560.00 I  -.158545  .000711   .088367  .010230  I  .4834090  .0004399  3.3292 0.3111  P    21.815     .500    -1.830     .300  -.157000   .102000   .4847000      .000      .000  
+78 222 43561.00 I  -.160073  .000711   .090673  .010230  I  .4800234  .0004399  3.4430 0.3924  P    21.962     .500    -1.949     .300  -.160000   .104000   .4812000      .000      .000  
+78 223 43562.00 I  -.161591  .002779   .092993  .007757  I  .4765236  .0006499  3.5549 0.4596  P    22.154     .500    -2.048     .300  -.162000   .107000   .4776000      .000      .000  
+78 224 43563.00 I  -.163112  .003866   .095331  .003961  I  .4729200  .0008070  3.6476 0.5181  P    22.267     .500    -2.064     .300  -.165000   .109000   .4741000      .000      .000  
+78 225 43564.00 I  -.164649  .003866   .097691  .003961  I  .4692407  .0008070  3.7035 0.5706  P    22.224     .500    -2.018     .300  -.168000   .112000   .4706000      .000      .000  
+78 226 43565.00 I  -.166217  .003866   .100078  .003961  I  .4655291  .0008070  3.7113 0.5706  P    22.088     .500    -1.983     .300  -.171000   .115000   .4671000      .000      .000  
+78 227 43566.00 I  -.167826  .003866   .102497  .003961  I  .4618338  .0008070  3.6722 0.5706  P    21.968     .500    -1.998     .300  -.174000   .118000   .4636000      .000      .000  
+78 228 43567.00 I  -.169483  .003866   .104958  .003961  I  .4581963  .0008070  3.5985 0.4256  P    21.902     .500    -2.045     .300  -.176000   .120000   .4602000      .000      .000  
+78 3 1 43568.00 I  -.171196  .003310   .107469  .002690  I  .4546412  .0002710  3.5116 0.4256  P    21.862     .500    -2.101     .300  -.179000   .123000   .4567000      .000      .000  
+78 3 2 43569.00 I  -.172969  .003310   .110041  .002690  I  .4511691  .0002710  3.4368 0.1916  P    21.804     .500    -2.186     .300  -.182000   .126000   .4532000      .000      .000  
+78 3 3 43570.00 I  -.174810  .003310   .112681  .002690  I  .4477555  .0002710  3.3983 0.2620  P    21.717     .500    -2.341     .300  -.185000   .129000   .4498000      .000      .000  
+78 3 4 43571.00 I  -.176725  .014722   .115401  .010929  I  .4443550  .0004485  3.4124 0.2620  P    21.632     .500    -2.554     .300  -.187000   .132000   .4464000      .000      .000  
+78 3 5 43572.00 I  -.178721  .014722   .118208  .010929  I  .4409123  .0004485  3.4816 0.3171  P    21.597     .500    -2.714     .300  -.190000   .136000   .4429000      .000      .000  
+78 3 6 43573.00 I  -.180803  .014722   .121112  .010929  I  .4373785  .0004485  3.5908 0.3171  P    21.640     .500    -2.692     .300  -.192000   .139000   .4395000      .000      .000  
+78 3 7 43574.00 I  -.182979  .014722   .124123  .010929  I  .4337276  .0004485  3.7094 0.3171  P    21.757     .500    -2.489     .300  -.195000   .142000   .4361000      .000      .000  
+78 3 8 43575.00 I  -.185247  .014722   .127245  .010929  I  .4299692  .0004485  3.7996 0.3171  P    21.925     .500    -2.292     .300  -.197000   .146000   .4328000      .000      .000  
+78 3 9 43576.00 I  -.187587  .014722   .130475  .010929  I  .4261477  .0004485  3.8318 0.2268  P    22.100     .500    -2.316     .300  -.199000   .149000   .4294000      .000      .000  
+78 310 43577.00 I  -.189978  .002182   .133808  .002690  I  .4223286  .0000680  3.7951 0.2268  P    22.209     .500    -2.585     .300  -.202000   .153000   .4261000      .000      .000  
+78 311 43578.00 I  -.192398  .002182   .137237  .002690  I  .4185771  .0000680  3.6997 0.0481  P    22.202     .500    -2.908     .300  -.204000   .156000   .4227000      .000      .000  
+78 312 43579.00 I  -.194826  .002182   .140760  .002690  I  .4149412  .0000680  3.5683 0.0481  P    22.099     .500    -3.088     .300  -.206000   .160000   .4194000      .000      .000  
+78 313 43580.00 I  -.197240  .002182   .144369  .002690  I  .4114441  .0000680  3.4262 0.0481  P    21.959     .500    -3.101     .300  -.208000   .164000   .4161000      .000      .000  
+78 314 43581.00 I  -.199617  .002182   .148061  .002690  I  .4080856  .0000680  3.2937 0.3286  P    21.809     .500    -3.069     .300  -.210000   .168000   .4128000      .000      .000  
+78 315 43582.00 I  -.201929  .008840   .151830  .004015  I  .4048488  .0006536  3.1848 0.4622  P    21.670     .500    -3.102     .300  -.212000   .172000   .4096000      .000      .000  
+78 316 43583.00 I  -.204152  .012310   .155670  .004015  I  .4017049  .0009218  3.1091 0.5650  P    21.649     .500    -3.207     .300  -.214000   .176000   .4063000      .000      .000  
+78 317 43584.00 I  -.206260  .012310   .159578  .004015  I  .3986177  .0009218  3.0722 0.6518  P    21.885     .500    -3.318     .300  -.216000   .180000   .4030000      .000      .000  
+78 318 43585.00 I  -.208229  .012310   .163547  .004015  I  .3955460  .0009218  3.0786 0.6518  P    22.368     .500    -3.368     .300  -.218000   .184000   .3997000      .000      .000  
+78 319 43586.00 I  -.210050  .012310   .167578  .004015  I  .3924463  .0009218  3.1274 0.6208  P    22.875     .500    -3.353     .300  -.220000   .188000   .3964000      .000      .000  
+78 320 43587.00 I  -.211723  .010773   .171670  .006169  I  .3892796  .0008318  3.2111 0.5882  P    23.167     .500    -3.344     .300  -.222000   .192000   .3930000      .000      .000  
+78 321 43588.00 I  -.213243  .008977   .175824  .007745  I  .3860160  .0007308  3.3191 0.5536  P    23.209     .500    -3.415     .300  -.224000   .196000   .3897000      .000      .000  
+78 322 43589.00 I  -.214610  .008977   .180039  .007745  I  .3826376  .0007308  3.4384 0.5168  P    23.155     .500    -3.539     .300  -.226000   .200000   .3864000      .000      .000  
+78 323 43590.00 I  -.215820  .008977   .184315  .007745  I  .3791411  .0007308  3.5520 0.5168  P    23.148     .500    -3.599     .300  -.228000   .204000   .3830000      .000      .000  
+78 324 43591.00 I  -.216879  .008977   .188649  .007745  I  .3755424  .0007308  3.6391 0.5168  P    23.197     .500    -3.520     .300  -.229000   .208000   .3796000      .000      .000  
+78 325 43592.00 I  -.217801  .008977   .193031  .007745  I  .3718781  .0007308  3.6804 0.4053  P    23.236     .500    -3.384     .300  -.231000   .212000   .3762000      .000      .000  
+78 326 43593.00 I  -.218600  .001138   .197451  .000868  I  .3681999  .0003505  3.6666 0.4053  P    23.223     .500    -3.352     .300  -.232000   .216000   .3728000      .000      .000  
+78 327 43594.00 I  -.219292  .001138   .201898  .000868  I  .3645615  .0003505  3.6029 0.2478  P    23.173     .500    -3.486     .300  -.234000   .220000   .3694000      .000      .000  
+78 328 43595.00 I  -.219892  .001138   .206364  .000868  I  .3610038  .0003505  3.5100 0.2975  P    23.110     .500    -3.699     .300  -.235000   .224000   .3660000      .000      .000  
+78 329 43596.00 I  -.220414  .000902   .210837  .008212  I  .3575414  .0004807  3.4175 0.2975  P    23.037     .500    -3.862     .300  -.236000   .228000   .3625000      .000      .000  
+78 330 43597.00 I  -.220871  .000902   .215307  .008212  I  .3541595  .0004807  3.3531 0.3399  P    22.950     .500    -3.926     .300  -.238000   .232000   .3591000      .000      .000  
+78 331 43598.00 I  -.221278  .000902   .219764  .008212  I  .3508197  .0004807  3.3354 0.3776  P    22.876     .500    -3.942     .300  -.239000   .236000   .3556000      .000      .000  
+78 4 1 43599.00 I  -.221646  .000576   .224195  .011581  I  .3474716  .0005825  3.3692 0.3629  P    22.887     .500    -3.972     .300  -.240000   .240000   .3522000      .000      .000  
+78 4 2 43600.00 I  -.221987  .010198   .228597  .008229  I  .3440670  .0005437  3.4459 0.3984  P    23.052     .500    -4.020     .300  -.241000   .244000   .3487000      .000      .000  
+78 4 3 43601.00 I  -.222313  .010198   .232972  .008229  I  .3405726  .0005437  3.5440 0.3700  P    23.356     .500    -4.021     .300  -.242000   .248000   .3452000      .000      .000  
+78 4 4 43602.00 I  -.222636  .014410   .237325  .001150  I  .3369818  .0005020  3.6336 0.3664  P    23.669     .500    -3.927     .300  -.242000   .253000   .3416000      .000      .000  
+78 4 5 43603.00 I  -.222965  .010405   .241659  .002529  I  .3333181  .0004912  3.6851 0.3512  P    23.827     .500    -3.797     .300  -.243000   .257000   .3381000      .000      .000  
+78 4 6 43604.00 I  -.223290  .010405   .245977  .002529  I  .3296311  .0004912  3.6782 0.3473  P    23.771     .500    -3.770     .300  -.244000   .261000   .3346000      .000      .000  
+78 4 7 43605.00 I  -.223596  .010405   .250283  .002529  I  .3259824  .0004912  3.6094 0.3435  P    23.608     .500    -3.924     .300  -.245000   .265000   .3311000      .000      .000  
+78 4 8 43606.00 I  -.223867  .002983   .254578  .003386  I  .3224283  .0004802  3.4926 0.3435  P    23.502     .500    -4.168     .300  -.245000   .269000   .3276000      .000      .000  
+78 4 9 43607.00 I  -.224091  .002983   .258862  .003386  I  .3190052  .0004802  3.3517 0.3564  P    23.503     .500    -4.332     .300  -.246000   .274000   .3240000      .000      .000  
+78 410 43608.00 I  -.224257  .010007   .263134  .004621  I  .3157250  .0005268  3.2104 0.3725  P    23.508     .500    -4.338     .300  -.246000   .278000   .3205000      .000      .000  
+78 411 43609.00 I  -.224355  .013835   .267391  .005589  I  .3125785  .0005695  3.0869 0.3879  P    23.417     .500    -4.271     .300  -.247000   .282000   .3170000      .000      .000  
+78 412 43610.00 I  -.224376  .013835   .271631  .005589  I  .3095413  .0005695  2.9932 0.4819  P    23.290     .500    -4.260     .300  -.247000   .286000   .3135000      .000      .000  
+78 413 43611.00 I  -.224308  .011313   .275854  .004613  I  .3065796  .0007776  2.9370 0.4819  P    23.284     .500    -4.351     .300  -.247000   .290000   .3101000      .000      .000  
+78 414 43612.00 I  -.224149  .011313   .280058  .004613  I  .3036531  .0007776  2.9235 0.5498  P    23.476     .500    -4.483     .300  -.248000   .293000   .3066000      .000      .000  
+78 415 43613.00 I  -.223913  .011313   .284249  .004613  I  .3007180  .0007776  2.9537 0.6102  P    23.800     .500    -4.564     .300  -.248000   .297000   .3032000      .000      .000  
+78 416 43614.00 I  -.223616  .008036   .288433  .003364  I  .2977329  .0009407  3.0222 0.5117  P    24.131     .500    -4.553     .300  -.248000   .301000   .2997000      .000      .000  
+78 417 43615.00 I  -.223270  .008171   .292613  .007570  I  .2946647  .0006652  3.1175 0.5761  P    24.361     .500    -4.511     .300  -.248000   .305000   .2964000      .000      .000  
+78 418 43616.00 I  -.222878  .008171   .296791  .007570  I  .2914932  .0006652  3.2269 0.3340  P    24.408     .500    -4.537     .300  -.248000   .309000   .2930000      .000      .000  
+78 419 43617.00 I  -.222440  .008304   .300969  .010164  I  .2882108  .0000621  3.3367 0.3340  P    24.247     .500    -4.649     .300  -.247000   .313000   .2897000      .000      .000  
+78 420 43618.00 I  -.221956  .008304   .305144  .010164  I  .2848250  .0000621  3.4308 0.1241  P    23.983     .500    -4.723     .300  -.247000   .317000   .2863000      .000      .000  
+78 421 43619.00 I  -.221413  .006931   .309310  .007190  I  .2813607  .0002404  3.4902 0.1436  P    23.805     .500    -4.626     .300  -.247000   .321000   .2830000      .000      .000  
+78 422 43620.00 I  -.220797  .006931   .313452  .007190  I  .2778616  .0002805  3.4984 0.2065  P    23.798     .500    -4.406     .300  -.246000   .325000   .2798000      .000      .000  
+78 423 43621.00 I  -.220093  .005209   .317558  .000296  I  .2743831  .0003357  3.4490 0.2187  P    23.859     .500    -4.285     .300  -.246000   .328000   .2765000      .000      .000  
+78 424 43622.00 I  -.219285  .005209   .321617  .000296  I  .2709789  .0003357  3.3537 0.2494  P    23.832     .500    -4.429     .300  -.245000   .332000   .2733000      .000      .000  
+78 425 43623.00 I  -.218367  .005209   .325616  .000296  I  .2676812  .0003689  3.2417 0.2494  P    23.689     .500    -4.757     .300  -.245000   .335000   .2700000      .000      .000  
+78 426 43624.00 I  -.217331  .005209   .329543  .000296  I  .2644895  .0003689  3.1475 0.2382  P    23.510     .500    -5.028     .300  -.244000   .339000   .2668000      .000      .000  
+78 427 43625.00 I  -.216175  .009203   .333387  .014647  I  .2613712  .0003013  3.0981 0.2074  P    23.351     .500    -5.074     .300  -.243000   .342000   .2636000      .000      .000  
+78 428 43626.00 I  -.214891  .009203   .337134  .014647  I  .2582750  .0001898  3.1034 0.1780  P    23.208     .500    -4.933     .300  -.242000   .346000   .2605000      .000      .000  
+78 429 43627.00 I  -.213476  .009203   .340775  .014647  I  .2551491  .0001898  3.1544 0.1342  P    23.102     .500    -4.758     .300  -.241000   .349000   .2573000      .000      .000  
+78 430 43628.00 I  -.211925  .009203   .344296  .014647  I  .2519580  .0001898  3.2299 0.1342  P    23.124     .500    -4.668     .300  -.240000   .353000   .2542000      .000      .000  
+78 5 1 43629.00 I  -.210242  .009203   .347698  .014647  I  .2486897  .0001898  3.3043 0.1222  P    23.344     .500    -4.669     .300  -.239000   .356000   .2510000      .000      .000  
+78 5 2 43630.00 I  -.208441  .006650   .350988  .010457  I  .2453578  .0001540  3.3536 0.1089  P    23.682     .500    -4.691     .300  -.238000   .359000   .2478000      .000      .000  
+78 5 3 43631.00 I  -.206533  .001935   .354173  .002038  I  .2419965  .0001067  3.3609 0.0937  P    23.915     .500    -4.678     .300  -.237000   .363000   .2446000      .000      .000  
+78 5 4 43632.00 I  -.204531  .001935   .357260  .002038  I  .2386522  .0001067  3.3195 0.0754  P    23.857     .500    -4.645     .300  -.235000   .366000   .2415000      .000      .000  
+78 5 5 43633.00 I  -.202448  .001935   .360257  .002038  I  .2353720  .0001067  3.2344 0.0754  P    23.555     .500    -4.642     .300  -.234000   .370000   .2383000      .000      .000  
+78 5 6 43634.00 I  -.200298  .001935   .363172  .002038  I  .2321928  .0001067  3.1211 0.3062  P    23.260     .500    -4.683     .300  -.233000   .373000   .2351000      .000      .000  
+78 5 7 43635.00 I  -.198095  .004273   .366014  .002267  I  .2291324  .0006030  3.0002 0.4264  P    23.160     .500    -4.736     .300  -.232000   .376000   .2319000      .000      .000  
+78 5 8 43636.00 I  -.195857  .005724   .368795  .002474  I  .2261885  .0008460  2.8911 0.5195  P    23.206     .500    -4.770     .300  -.230000   .380000   .2287000      .000      .000  
+78 5 9 43637.00 I  -.193599  .005724   .371523  .002474  I  .2233411  .0008460  2.8091 0.5982  P    23.250     .500    -4.800     .300  -.229000   .383000   .2256000      .000      .000  
+78 510 43638.00 I  -.191337  .005724   .374210  .002474  I  .2205588  .0008460  2.7614 0.5250  P    23.266     .500    -4.858     .300  -.227000   .387000   .2224000      .000      .000  
+78 511 43639.00 I  -.189077  .008974   .376868  .002554  I  .2178060  .0006220  2.7506 0.5250  P    23.319     .500    -4.958     .300  -.226000   .390000   .2192000      .000      .000  
+78 512 43640.00 I  -.186824  .008974   .379510  .002554  I  .2150448  .0006220  2.7780 0.3335  P    23.388     .500    -5.083     .300  -.224000   .393000   .2160000      .000      .000  
+78 513 43641.00 I  -.184585  .011327   .382150  .002630  I  .2122382  .0002408  2.8406 0.3252  P    23.402     .500    -5.189     .300  -.222000   .396000   .2128000      .000      .000  
+78 514 43642.00 I  -.182362  .008262   .384800  .005647  I  .2093543  .0001901  2.9309 0.1534  P    23.423     .500    -5.217     .300  -.220000   .399000   .2095000      .000      .000  
+78 515 43643.00 I  -.180143  .008262   .387471  .005647  I  .2063708  .0001901  3.0379 0.1330  P    23.583     .500    -5.156     .300  -.218000   .402000   .2063000      .000      .000  
+78 516 43644.00 I  -.177914  .008262   .390173  .005647  I  .2032768  .0001862  3.1499 0.1168  P    23.796     .500    -5.083     .300  -.216000   .405000   .2031000      .000      .000  
+78 517 43645.00 I  -.175657  .002870   .392915  .007541  I  .2000735  .0001357  3.2543 0.1137  P    23.764     .500    -5.088     .300  -.214000   .408000   .2000000      .000      .000  
+78 518 43646.00 I  -.173361  .004343   .395700  .008610  I  .1967754  .0001305  3.3369 0.0941  P    23.364     .500    -5.132     .300  -.212000   .410000   .1969000      .000      .000  
+78 519 43647.00 I  -.171014  .004343   .398527  .008610  I  .1934123  .0001305  3.3816 0.0948  P    22.868     .500    -5.063     .300  -.210000   .413000   .1937000      .000      .000  
+78 520 43648.00 I  -.168606  .005431   .401396  .009560  I  .1900291  .0001376  3.3757 0.0948  P    22.612     .500    -4.827     .300  -.208000   .415000   .1906000      .000      .000  
+78 521 43649.00 I  -.166125  .005431   .404308  .009560  I  .1866781  .0001376  3.3183 0.0922  P    22.600     .500    -4.609     .300  -.206000   .418000   .1875000      .000      .000  
+78 522 43650.00 I  -.163564  .005431   .407259  .009560  I  .1834043  .0001228  3.2256 0.0922  P    22.571     .500    -4.650     .300  -.203000   .420000   .1845000      .000      .000  
+78 523 43651.00 I  -.160919  .005431   .410238  .009560  I  .1802282  .0001228  3.1290 0.1416  P    22.389     .500    -4.954     .300  -.201000   .422000   .1815000      .000      .000  
+78 524 43652.00 I  -.158192  .010862   .413233  .001924  I  .1771364  .0002552  3.0621 0.1416  P    22.164     .500    -5.251     .300  -.198000   .425000   .1786000      .000      .000  
+78 525 43653.00 I  -.155381  .010862   .416231  .001924  I  .1740874  .0002552  3.0451 0.2477  P    22.028     .500    -5.291     .300  -.196000   .427000   .1756000      .000      .000  
+78 526 43654.00 I  -.152485  .010862   .419219  .001924  I  .1710302  .0004246  3.0761 0.2477  P    21.956     .500    -5.079     .300  -.193000   .429000   .1726000      .000      .000  
+78 527 43655.00 I  -.149505  .010862   .422184  .001924  I  .1679265  .0004246  3.1330 0.3341  P    21.840     .500    -4.815     .300  -.190000   .431000   .1697000      .000      .000  
+78 528 43656.00 I  -.146444  .010862   .425115  .001924  I  .1647655  .0005159  3.1858 0.4782  P    21.660     .500    -4.666     .300  -.187000   .433000   .1669000      .000      .000  
+78 529 43657.00 I  -.143321  .009179   .428001  .005834  I  .1615647  .0008569  3.2090 0.5826  P    21.518     .500    -4.663     .300  -.185000   .435000   .1640000      .000      .000  
+78 530 43658.00 I  -.140155  .007109   .430832  .008023  I  .1583622  .0010447  3.1881 0.6756  P    21.532     .500    -4.750     .300  -.182000   .437000   .1612000      .000      .000  
+78 531 43659.00 I  -.136967  .007109   .433598  .008023  I  .1552040  .0010447  3.1207 0.7713  P    21.675     .500    -4.858     .300  -.179000   .439000   .1583000      .000      .000  
+78 6 1 43660.00 I  -.133776  .007109   .436289  .008023  I  .1521349  .0011351  3.0110 0.7713  P    21.748     .500    -4.924     .300  -.176000   .440000   .1556000      .000      .000  
+78 6 2 43661.00 I  -.130589  .007109   .438906  .008023  I  .1491926  .0011351  2.8695 0.8515  P    21.568     .500    -4.905     .300  -.173000   .442000   .1530000      .000      .000  
+78 6 3 43662.00 I  -.127415  .007109   .441447  .008023  I  .1464011  .0012695  2.7122 0.5835  P    21.184     .500    -4.824     .300  -.170000   .443000   .1503000      .000      .000  
+78 6 4 43663.00 I  -.124258  .003310   .443914  .002690  I  .1437676  .0002710  2.5565 0.9577  P    20.832     .500    -4.767     .300  -.167000   .445000   .1477000      .000      .000  
+78 6 5 43664.00 I  -.121127  .008912   .446307  .002690  I  .1412826  .0014344  2.4174 0.7299  P    20.687     .500    -4.810     .300  -.164000   .446000   .1450000      .000      .000  
+78 6 6 43665.00 I  -.118027  .008912   .448625  .002690  I  .1389238  .0014344  2.3054 1.0143  P    20.735     .500    -4.938     .300  -.161000   .448000   .1424000      .000      .000  
+78 6 7 43666.00 I  -.114966  .008912   .450871  .002690  I  .1366611  .0014344  2.2257 1.0143  P    20.881     .500    -5.055     .300  -.158000   .450000   .1399000      .000      .000  
+78 6 8 43667.00 I  -.111946  .008912   .453043  .002690  I  .1344602  .0014344  2.1827 1.0143  P    21.029     .500    -5.100     .300  -.154000   .451000   .1373000      .000      .000  
+78 6 9 43668.00 I  -.108962  .008912   .455143  .002690  I  .1322833  .0014344  2.1770 0.8794  P    21.041     .500    -5.111     .300  -.151000   .453000   .1348000      .000      .000  
+78 610 43669.00 I  -.106002  .008541   .457171  .000301  I  .1300956  .0010179  2.2031 0.7198  P    20.838     .500    -5.161     .300  -.148000   .455000   .1322000      .000      .000  
+78 611 43670.00 I  -.103056  .008154   .459126  .000301  I  .1278696  .0001211  2.2517 0.5125  P    20.593     .500    -5.230     .300  -.144000   .457000   .1298000      .000      .000  
+78 612 43671.00 I  -.100114  .008154   .461011  .000301  I  .1255884  .0001211  2.3115 0.0753  P    20.612     .500    -5.220     .300  -.141000   .458000   .1274000      .000      .000  
+78 613 43672.00 I  -.097167  .006486   .462824  .001917  I  .1232466  .0000895  2.3711 0.0753  P    20.898     .500    -5.104     .300  -.137000   .460000   .1250000      .000      .000  
+78 614 43673.00 I  -.094212  .006486   .464567  .001917  I  .1208500  .0000895  2.4192 0.0633  P    21.022     .500    -4.984     .300  -.134000   .461000   .1226000      .000      .000  
+78 615 43674.00 I  -.091255  .006486   .466241  .001917  I  .1184157  .0000895  2.4446 0.0484  P    20.623     .500    -4.936     .300  -.130000   .463000   .1202000      .000      .000  
+78 616 43675.00 I  -.088300  .004203   .467846  .002695  I  .1159719  .0000370  2.4367 0.0487  P    19.883     .500    -4.882     .300  -.126000   .464000   .1179000      .000      .000  
+78 617 43676.00 I  -.085345  .003000   .469387  .002130  I  .1135555  .0000382  2.3894 0.0266  P    19.302     .500    -4.713     .300  -.122000   .466000   .1156000      .000      .000  
+78 618 43677.00 I  -.082389  .003000   .470867  .002130  I  .1112044  .0000382  2.3084 0.0274  P    19.093     .500    -4.503     .300  -.118000   .467000   .1134000      .000      .000  
+78 619 43678.00 I  -.079428  .000578   .472291  .001346  I  .1089430  .0000393  2.2146 0.0274  P    19.043     .500    -4.466     .300  -.114000   .469000   .1111000      .000      .000  
+78 620 43679.00 I  -.076459  .000578   .473663  .001346  I  .1067689  .0000393  2.1397 0.1773  P    18.901     .500    -4.663     .300  -.110000   .470000   .1088000      .000      .000  
+78 621 43680.00 I  -.073480  .000578   .474988  .001346  I  .1046477  .0003525  2.1125 0.1773  P    18.682     .500    -4.883     .300  -.106000   .471000   .1066000      .000      .000  
+78 622 43681.00 I  -.070485  .000578   .476267  .001346  I  .1025246  .0003525  2.1433 0.3638  P    18.545     .500    -4.892     .300  -.102000   .473000   .1044000      .000      .000  
+78 623 43682.00 I  -.067473  .003310   .477504  .002690  I  .1003467  .0006365  2.2175 0.2808  P    18.544     .500    -4.698     .300  -.098000   .474000   .1023000      .000      .000  
+78 624 43683.00 I  -.064438  .000423   .478702  .003672  I  .0980864  .0004371  2.3014 0.3861  P    18.553     .500    -4.502     .300  -.094000   .476000   .1001000      .000      .000  
+78 625 43684.00 I  -.061377  .000423   .479862  .003672  I  .0957528  .0004371  2.3586 0.3091  P    18.388     .500    -4.428     .300  -.090000   .477000   .0979000      .000      .000  
+78 626 43685.00 I  -.058285  .000423   .480987  .003672  I  .0933861  .0004371  2.3651 0.2686  P    17.998     .500    -4.445     .300  -.086000   .478000   .0958000      .000      .000  
+78 627 43686.00 I  -.055159  .000423   .482079  .003672  I  .0910414  .0003122  2.3153 0.2686  P    17.580     .500    -4.503     .300  -.082000   .479000   .0937000      .000      .000  
+78 628 43687.00 I  -.051996  .000423   .483137  .003672  I  .0887710  .0003122  2.2192 0.1916  P    17.420     .500    -4.616     .300  -.077000   .480000   .0916000      .000      .000  
+78 629 43688.00 I  -.048792  .000459   .484159  .002611  I  .0866126  .0002221  2.0943 0.1571  P    17.548     .500    -4.775     .300  -.073000   .481000   .0895000      .000      .000  
+78 630 43689.00 I  -.045544  .000493   .485142  .000392  I  .0845858  .0000354  1.9591 0.1125  P    17.649     .500    -4.884     .300  -.069000   .482000   .0874000      .000      .000  
+78 7 1 43690.00 I  -.042250  .000493   .486085  .000392  I  .0826924  .0000354  1.8300 0.0250  P    17.420     .500    -4.868     .300  -.065000   .483000   .0854000      .000      .000  
+78 7 2 43691.00 I  -.038905  .000493   .486984  .000392  I  .0809192  .0000354  1.7207 0.0250  P    16.936     .500    -4.798     .300  -.061000   .484000   .0834000      .000      .000  
+78 7 3 43692.00 I  -.035507  .000493   .487837  .000392  I  .0792409  .0000354  1.6418 0.1836  P    16.544     .500    -4.810     .300  -.056000   .484000   .0814000      .000      .000  
+78 7 4 43693.00 I  -.032052  .000356   .488642  .002848  I  .0776234  .0003654  1.5996 0.2584  P    16.467     .500    -4.924     .300  -.052000   .485000   .0794000      .000      .000  
+78 7 5 43694.00 I  -.028535  .000102   .489396  .004008  I  .0760289  .0005156  1.5957 0.3160  P    16.642     .500    -5.004     .300  -.048000   .486000   .0774000      .000      .000  
+78 7 6 43695.00 I  -.024953  .000102   .490096  .004008  I  .0744199  .0005156  1.6280 0.3236  P    16.858     .500    -4.940     .300  -.044000   .486000   .0755000      .000      .000  
+78 7 7 43696.00 I  -.021301  .004578   .490739  .003196  I  .0727630  .0003913  1.6900 0.3236  P    16.909     .500    -4.799     .300  -.039000   .486000   .0736000      .000      .000  
+78 7 8 43697.00 I  -.017575  .004578   .491319  .003196  I  .0710331  .0003913  1.7724 0.2767  P    16.701     .500    -4.747     .300  -.035000   .487000   .0718000      .000      .000  
+78 7 9 43698.00 I  -.013772  .004578   .491827  .003196  I  .0692151  .0003913  1.8642 0.2448  P    16.367     .500    -4.838     .300  -.030000   .487000   .0699000      .000      .000  
+78 710 43699.00 I  -.009888  .004872   .492256  .005841  I  .0673059  .0002942  1.9525 0.2448  P    16.204     .500    -4.943     .300  -.026000   .487000   .0680000      .000      .000  
+78 711 43700.00 I  -.005928  .004872   .492599  .005841  I  .0653151  .0002942  2.0257 0.1989  P    16.336     .500    -4.926     .300  -.022000   .487000   .0662000      .000      .000  
+78 712 43701.00 I  -.001900  .004483   .492850  .004874  I  .0632630  .0002677  2.0735 0.2085  P    16.474     .500    -4.807     .300  -.017000   .487000   .0644000      .000      .000  
+78 713 43702.00 I   .002188  .003031   .493007  .005784  I  .0611786  .0002955  2.0897 0.1994  P    16.214     .500    -4.703     .300  -.013000   .487000   .0626000      .000      .000  
+78 714 43703.00 I   .006322  .003031   .493071  .005784  I  .0590949  .0002955  2.0718 0.2090  P    15.538     .500    -4.648     .300  -.008000   .487000   .0608000      .000      .000  
+78 715 43704.00 I   .010492  .003031   .493048  .005784  I  .0570456  .0002955  2.0221 0.1798  P    14.839     .500    -4.581     .300  -.004000   .487000   .0590000      .000      .000  
+78 716 43705.00 I   .014681  .003580   .492942  .001737  I  .0550569  .0002049  1.9537 0.2609  P    14.448     .500    -4.503     .300   .000000   .487000   .0572000      .000      .000  
+78 717 43706.00 I   .018873  .007094   .492757  .003159  I  .0531365  .0004300  1.8903 0.3041  P    14.327     .500    -4.521     .300   .005000   .487000   .0554000      .000      .000  
+78 718 43707.00 I   .023046  .009372   .492495  .004115  I  .0512652  .0005726  1.8602 0.3580  P    14.242     .500    -4.665     .300   .009000   .486000   .0537000      .000      .000  
+78 719 43708.00 I   .027181  .009372   .492160  .004115  I  .0493981  .0005726  1.8839 0.4049  P    14.073     .500    -4.783     .300   .014000   .486000   .0519000      .000      .000  
+78 720 43709.00 I   .031258  .009372   .491754  .004115  I  .0474797  .0005726  1.9605 0.4049  P    13.895     .500    -4.718     .300   .018000   .486000   .0501000      .000      .000  
+78 721 43710.00 I   .035262  .009372   .491279  .004115  I  .0454676  .0005726  2.0655 0.3879  P    13.840     .500    -4.534     .300   .022000   .485000   .0483000      .000      .000  
+78 722 43711.00 I   .039190  .008265   .490733  .002933  I  .0433524  .0005233  2.1592 0.3715  P    13.919     .500    -4.436     .300   .027000   .485000   .0465000      .000      .000  
+78 723 43712.00 I   .043039  .006986   .490114  .000523  I  .0411655  .0004734  2.2039 0.3528  P    13.925     .500    -4.489     .300   .031000   .484000   .0447000      .000      .000  
+78 724 43713.00 I   .046808  .006986   .489419  .000523  I  .0389671  .0004734  2.1811 0.3047  P    13.607     .500    -4.548     .300   .036000   .484000   .0429000      .000      .000  
+78 725 43714.00 I   .050496  .004993   .488646  .004001  I  .0368240  .0003836  2.0964 0.3047  P    13.009     .500    -4.505     .300   .040000   .483000   .0411000      .000      .000  
+78 726 43715.00 I   .054113  .004993   .487792  .004001  I  .0347876  .0003836  1.9720 0.2564  P    12.544     .500    -4.453     .300   .044000   .482000   .0392000      .000      .000  
+78 727 43716.00 I   .057670  .006109   .486857  .003612  I  .0328847  .0003404  1.8335 0.2347  P    12.545     .500    -4.534     .300   .049000   .482000   .0374000      .000      .000  
+78 728 43717.00 I   .061179  .005619   .485838  .004408  I  .0311179  .0002706  1.7029 0.1962  P    12.822     .500    -4.719     .300   .053000   .481000   .0355000      .000      .000  
+78 729 43718.00 I   .064651  .005619   .484736  .004408  I  .0294711  .0001952  1.5955 0.1653  P    12.890     .500    -4.855     .300   .058000   .481000   .0337000      .000      .000  
+78 730 43719.00 I   .068101  .004589   .483559  .003602  I  .0279158  .0001898  1.5214 0.1359  P    12.577     .500    -4.881     .300   .062000   .480000   .0318000      .000      .000  
+78 731 43720.00 I   .071536  .005573   .482311  .001896  I  .0264152  .0001890  1.4867 0.1339  P    12.193     .500    -4.878     .300   .066000   .479000   .0298000      .000      .000  
+78 8 1 43721.00 I   .074958  .005573   .481001  .001896  I  .0249285  .0001890  1.4936 0.1143  P    12.081     .500    -4.908     .300   .071000   .478000   .0278000      .000      .000  
+78 8 2 43722.00 I   .078364  .001100   .479640  .004737  I  .0234147  .0001285  1.5403 0.1143  P    12.240     .500    -4.905     .300   .075000   .477000   .0259000      .000      .000  
+78 8 3 43723.00 I   .081753  .001100   .478236  .004737  I  .0218367  .0001285  1.6206 0.0909  P    12.449     .500    -4.785     .300   .080000   .476000   .0239000      .000      .000  
+78 8 4 43724.00 I   .085123  .001100   .476798  .004737  I  .0201654  .0001285  1.7254 0.0666  P    12.539     .500    -4.596     .300   .084000   .475000   .0219000      .000      .000  
+78 8 5 43725.00 I   .088473  .001544   .475336  .006694  I  .0183812  .0000351  1.8445 0.0666  P    12.458     .500    -4.486     .300   .088000   .474000   .0197000      .000      .000  
+78 8 6 43726.00 I   .091802  .001544   .473857  .006694  I  .0164758  .0000351  1.9654 0.1333  P    12.237     .500    -4.536     .300   .092000   .472000   .0175000      .000      .000  
+78 8 7 43727.00 I   .095104  .001520   .472363  .004827  I  .0144542  .0002642  2.0749 0.1868  P    12.007     .500    -4.668     .300   .097000   .471000   .0154000      .000      .000  
+78 8 8 43728.00 I   .098376  .001496   .470854  .001335  I  .0123337  .0003719  2.1613 0.2281  P    11.923     .500    -4.743     .300   .101000   .469000   .0132000      .000      .000  
+78 8 9 43729.00 I   .101614  .001496   .469331  .001335  I  .0101418  .0003719  2.2169 0.2630  P    11.968     .500    -4.709     .300   .105000   .468000   .0110000      .000      .000  
+78 810 43730.00 I   .104814  .001496   .467794  .001335  I  .0079106  .0003719  2.2403 0.2630  P    11.924     .500    -4.624     .300   .109000   .466000   .0087000      .000      .000  
+78 811 43731.00 I   .107971  .001496   .466245  .001335  I  .0056707  .0003719  2.2353 0.2323  P    11.626     .500    -4.563     .300   .113000   .465000   .0063000      .000      .000  
+78 812 43732.00 I   .111084  .003483   .464682  .003795  I  .0034456  .0002783  2.2134 0.1968  P    11.162     .500    -4.550     .300   .116000   .463000   .0040000      .000      .000  
+78 813 43733.00 I   .114151  .004693   .463104  .005198  I  .0012434  .0001287  2.1930 0.1533  P    10.759     .500    -4.599     .300   .120000   .462000   .0016000      .000      .000  
+78 814 43734.00 I   .117171  .004693   .461510  .005198  I -.0009488  .0001287  2.1976 0.0795  P    10.541     .500    -4.729     .300   .124000   .460000  -.0007000      .000      .000  
+78 815 43735.00 I   .120145  .003439   .459899  .004155  I -.0031673  .0000932  2.2485 0.0795  P    10.451     .500    -4.894     .300   .127000   .458000  -.0031000      .000      .000  
+78 816 43736.00 I   .123077  .003439   .458278  .004155  I -.0054643  .0000932  2.3548 0.0659  P    10.363     .500    -4.949     .300   .131000   .457000  -.0055000      .000      .000  
+78 817 43737.00 I   .125976  .003439   .456650  .004155  I -.0078913  .0000932  2.5043 0.1075  P    10.226     .500    -4.799     .300   .134000   .455000  -.0080000      .000      .000  
+78 818 43738.00 I   .128849  .000906   .455022  .002419  I -.0104762  .0001938  2.6636 0.1863  P    10.132     .500    -4.556     .300   .138000   .454000  -.0104000      .000      .000  
+78 819 43739.00 I   .131701  .000906   .453397  .002419  I -.0132074  .0003607  2.7897 0.2505  P    10.195     .500    -4.450     .300   .141000   .452000  -.0128000      .000      .000  
+78 820 43740.00 I   .134538  .000906   .451778  .002419  I -.0160330  .0004620  2.8479 0.2960  P    10.330     .500    -4.546     .300   .144000   .450000  -.0153000      .000      .000  
+78 821 43741.00 I   .137366  .000655   .450165  .002675  I -.0188762  .0004694  2.8252 0.3293  P    10.244     .500    -4.648     .300   .147000   .448000  -.0178000      .000      .000  
+78 822 43742.00 I   .140189  .000655   .448559  .002675  I -.0216605  .0004694  2.7339 0.3215  P     9.784     .500    -4.557     .300   .151000   .447000  -.0202000      .000      .000  
+78 823 43743.00 I   .143012  .002346   .446960  .002612  I -.0243301  .0004393  2.6010 0.3371  P     9.223     .500    -4.334     .300   .154000   .445000  -.0227000      .000      .000  
+78 824 43744.00 I   .145841  .002873   .445366  .002853  I -.0268586  .0004840  2.4564 0.2943  P     9.000     .500    -4.218     .300   .157000   .443000  -.0252000      .000      .000  
+78 825 43745.00 I   .148680  .002873   .443773  .002853  I -.0292468  .0003917  2.3236 0.2709  P     9.183     .500    -4.329     .300   .160000   .441000  -.0277000      .000      .000  
+78 826 43746.00 I   .151531  .002873   .442177  .002853  I -.0315147  .0002437  2.2175 0.2582  P     9.420     .500    -4.554     .300   .163000   .439000  -.0302000      .000      .000  
+78 827 43747.00 I   .154396  .005558   .440571  .001798  I -.0336935  .0003364  2.1466 0.2077  P     9.440     .500    -4.726     .300   .166000   .437000  -.0326000      .000      .000  
+78 828 43748.00 I   .157271  .005558   .438948  .001798  I -.0358210  .0003364  2.1150 0.2374  P     9.353     .500    -4.793     .300   .169000   .435000  -.0351000      .000      .000  
+78 829 43749.00 I   .160151  .006792   .437299  .000551  I -.0379363  .0003352  2.1218 0.2374  P     9.387     .500    -4.798     .300   .172000   .433000  -.0376000      .000      .000  
+78 830 43750.00 I   .163031  .006792   .435617  .000551  I -.0400759  .0003352  2.1626 0.4673  P     9.535     .500    -4.767     .300   .175000   .431000  -.0401000      .000      .000  
+78 831 43751.00 I   .165899  .005469   .433894  .007063  I -.0422703  .0008724  2.2297 0.4673  P     9.641     .500    -4.692     .300   .177000   .428000  -.0426000      .000      .000  
+78 9 1 43752.00 I   .168737  .005469   .432123  .007063  I -.0445405  .0008724  2.3122 0.7300  P     9.664     .500    -4.584     .300   .180000   .426000  -.0452000      .000      .000  
+78 9 2 43753.00 I   .171528  .003701   .430297  .009973  I -.0468958  .0011706  2.3978 0.7300  P     9.660     .500    -4.480     .300   .182000   .423000  -.0477000      .000      .000  
+78 9 3 43754.00 I   .174256  .003701   .428408  .009973  I -.0493332  .0011706  2.4746 0.8277  P     9.614     .500    -4.409     .300   .185000   .421000  -.0502000      .000      .000  
+78 9 4 43755.00 I   .176908  .003701   .426457  .009973  I -.0518383  .0011706  2.5314 0.7554  P     9.467     .500    -4.375     .300   .188000   .419000  -.0527000      .000      .000  
+78 9 5 43756.00 I   .179473  .009571   .424449  .008102  I -.0543860  .0009551  2.5581 0.6754  P     9.284     .500    -4.366     .300   .191000   .417000  -.0552000      .000      .000  
+78 9 6 43757.00 I   .181941  .013020   .422390  .005642  I -.0569425  .0006740  2.5489 0.5413  P     9.212     .500    -4.367     .300   .193000   .414000  -.0577000      .000      .000  
+78 9 7 43758.00 I   .184304  .009207   .420286  .005266  I -.0594734  .0005095  2.5086 0.4225  P     9.280     .500    -4.357     .300   .196000   .412000  -.0602000      .000      .000  
+78 9 8 43759.00 I   .186550  .009207   .418143  .005266  I -.0619536  .0005095  2.4502 0.3603  P     9.343     .500    -4.336     .300   .199000   .410000  -.0627000      .000      .000  
+78 9 9 43760.00 I   .188684  .009207   .415963  .005266  I -.0643739  .0005095  2.3923 0.3364  P     9.258     .500    -4.336     .300   .202000   .408000  -.0652000      .000      .000  
+78 910 43761.00 I   .190718  .009270   .413744  .004782  I -.0667459  .0004394  2.3575 0.2838  P     9.047     .500    -4.406     .300   .205000   .406000  -.0677000      .000      .000  
+78 911 43762.00 I   .192669  .006644   .411482  .004287  I -.0691035  .0002500  2.3666 0.2528  P     8.850     .500    -4.556     .300   .207000   .403000  -.0703000      .000      .000  
+78 912 43763.00 I   .194550  .006644   .409169  .004287  I -.0714977  .0002500  2.4316 0.1751  P     8.777     .500    -4.714     .300   .210000   .401000  -.0728000      .000      .000  
+78 913 43764.00 I   .196378  .009395   .406797  .003623  I -.0739843  .0002453  2.5495 0.1528  P     8.809     .500    -4.740     .300   .213000   .399000  -.0753000      .000      .000  
+78 914 43765.00 I   .198163  .006744   .404359  .003863  I -.0766076  .0001757  2.7001 0.1509  P     8.848     .500    -4.556     .300   .216000   .397000  -.0779000      .000      .000  
+78 915 43766.00 I   .199903  .006744   .401853  .003863  I -.0793833  .0001757  2.8472 0.0901  P     8.867     .500    -4.262     .300   .218000   .394000  -.0805000      .000      .000  
+78 916 43767.00 I   .201596  .001640   .399274  .004088  I -.0822877  .0000398  2.9513 0.0901  P     8.934     .500    -4.077     .300   .221000   .392000  -.0831000      .000      .000  
+78 917 43768.00 I   .203239  .001640   .396620  .004088  I -.0852623  .0000398  2.9845 0.0281  P     9.074     .500    -4.113     .300   .223000   .389000  -.0857000      .000      .000  
+78 918 43769.00 I   .204826  .001640   .393892  .004088  I -.0882315  .0000398  2.9420 0.2303  P     9.144     .500    -4.239     .300   .226000   .387000  -.0883000      .000      .000  
+78 919 43770.00 I   .206351  .004235   .391093  .002912  I -.0911272  .0004589  2.8421 0.3245  P     8.975     .500    -4.224     .300   .228000   .384000  -.0910000      .000      .000  
+78 920 43771.00 I   .207809  .005760   .388224  .000489  I -.0939069  .0006478  2.7158 0.3969  P     8.630     .500    -4.015     .300   .230000   .382000  -.0937000      .000      .000  
+78 921 43772.00 I   .209195  .005760   .385287  .000489  I -.0965604  .0006478  2.5943 0.4581  P     8.387     .500    -3.803     .300   .233000   .379000  -.0964000      .000      .000  
+78 922 43773.00 I   .210502  .005760   .382285  .000489  I -.0991042  .0006478  2.4990 0.4069  P     8.436     .500    -3.796     .300   .235000   .377000  -.0991000      .000      .000  
+78 923 43774.00 I   .211732  .005337   .379220  .002204  I -.1015708  .0004925  2.4410 0.4069  P     8.708     .500    -4.002     .300   .237000   .374000  -.1018000      .000      .000  
+78 924 43775.00 I   .212889  .005337   .376092  .002204  I -.1040003  .0004925  2.4254 0.2776  P     9.031     .500    -4.261     .300   .239000   .371000  -.1046000      .000      .000  
+78 925 43776.00 I   .213980  .004878   .372904  .003079  I -.1064361  .0002561  2.4533 0.2776  P     9.336     .500    -4.428     .300   .241000   .369000  -.1074000      .000      .000  
+78 926 43777.00 I   .215010  .004878   .369658  .003079  I -.1089203  .0002561  2.5213 0.2022  P     9.609     .500    -4.477     .300   .243000   .366000  -.1101000      .000      .000  
+78 927 43778.00 I   .215989  .004846   .366356  .003526  I -.1114893  .0003130  2.6210 0.2022  P     9.780     .500    -4.465     .300   .245000   .364000  -.1129000      .000      .000  
+78 928 43779.00 I   .216932  .004846   .363006  .003526  I -.1141692  .0003130  2.7412 0.2389  P     9.795     .500    -4.447     .300   .247000   .361000  -.1157000      .000      .000  
+78 929 43780.00 I   .217853  .004814   .359612  .003922  I -.1169746  .0003610  2.8699 0.2389  P     9.736     .500    -4.416     .300   .249000   .358000  -.1186000      .000      .000  
+78 930 43781.00 I   .218767  .004814   .356179  .003922  I -.1199073  .0003610  2.9936 0.2553  P     9.732     .500    -4.315     .300   .250000   .356000  -.1214000      .000      .000  
+7810 1 43782.00 I   .219684  .004814   .352717  .003922  I -.1229554  .0003610  3.0983 0.2239  P     9.780     .500    -4.097     .300   .252000   .353000  -.1243000      .000      .000  
+7810 2 43783.00 I   .220609  .007654   .349234  .006082  I -.1260928  .0002649  3.1699 0.1873  P     9.760     .500    -3.813     .300   .253000   .351000  -.1271000      .000      .000  
+7810 3 43784.00 I   .221550  .009695   .345743  .007655  I -.1292806  .0000999  3.1978 0.1416  P     9.639     .500    -3.603     .300   .255000   .348000  -.1300000      .000      .000  
+7810 4 43785.00 I   .222509  .009695   .342253  .007655  I -.1324730  .0000999  3.1796 0.0706  P     9.543     .500    -3.570     .300   .256000   .345000  -.1329000      .000      .000  
+7810 5 43786.00 I   .223491  .009695   .338774  .007655  I -.1356278  .0000999  3.1253 0.2062  P     9.593     .500    -3.671     .300   .257000   .342000  -.1359000      .000      .000  
+7810 6 43787.00 I   .224485  .007366   .335309  .005525  I -.1387186  .0004002  3.0561 0.2062  P     9.743     .500    -3.779     .300   .259000   .340000  -.1388000      .000      .000  
+7810 7 43788.00 I   .225478  .007366   .331858  .005525  I -.1417440  .0004002  2.9990 0.3429  P     9.843     .500    -3.814     .300   .260000   .337000  -.1418000      .000      .000  
+7810 8 43789.00 I   .226457  .003813   .328422  .001570  I -.1447283  .0005570  2.9770 0.3429  P     9.815     .500    -3.807     .300   .261000   .334000  -.1447000      .000      .000  
+7810 9 43790.00 I   .227409  .003813   .325001  .001570  I -.1477144  .0005570  3.0041 0.3423  P     9.738     .500    -3.821     .300   .262000   .331000  -.1477000      .000      .000  
+781010 43791.00 I   .228323  .006141   .321596  .001802  I -.1507530  .0003980  3.0808 0.3714  P     9.750     .500    -3.852     .300   .263000   .328000  -.1507000      .000      .000  
+781011 43792.00 I   .229191  .006141   .318206  .001802  I -.1538881  .0004914  3.1937 0.2966  P     9.906     .500    -3.825     .300   .263000   .324000  -.1536000      .000      .000  
+781012 43793.00 I   .230008  .007802   .314828  .002008  I -.1571436  .0004399  3.3161 0.3525  P    10.132     .500    -3.675     .300   .264000   .321000  -.1566000      .000      .000  
+781013 43794.00 I   .230768  .006157   .311463  .004014  I -.1605123  .0005055  3.4143 0.3351  P    10.314     .500    -3.432     .300   .265000   .318000  -.1596000      .000      .000  
+781014 43795.00 I   .231468  .006157   .308107  .004014  I -.1639545  .0005055  3.4592 0.3918  P    10.403     .500    -3.231     .300   .265000   .315000  -.1626000      .000      .000  
+781015 43796.00 I   .232115  .006157   .304757  .004014  I -.1674075  .0005988  3.4345 0.4855  P    10.440     .500    -3.193     .300   .266000   .311000  -.1656000      .000      .000  
+781016 43797.00 I   .232718  .003407   .301409  .009129  I -.1708012  .0008291  3.3431 0.5074  P    10.477     .500    -3.288     .300   .266000   .308000  -.1687000      .000      .000  
+781017 43798.00 I   .233283  .003407   .298057  .009129  I -.1740780  .0008193  3.2048 0.5828  P    10.514     .500    -3.351     .300   .267000   .304000  -.1717000      .000      .000  
+781018 43799.00 I   .233814  .003407   .294691  .009129  I -.1772045  .0008193  3.0477 0.6091  P    10.529     .500    -3.260     .300   .267000   .301000  -.1747000      .000      .000  
+781019 43800.00 I   .234310  .002876   .291299  .011768  I -.1801762  .0009014  2.8989 0.6091  P    10.545     .500    -3.085     .300   .267000   .297000  -.1778000      .000      .000  
+781020 43801.00 I   .234773  .002876   .287874  .011768  I -.1830117  .0009014  2.7784 0.6842  P    10.648     .500    -3.007     .300   .267000   .294000  -.1809000      .000      .000  
+781021 43802.00 I   .235200  .002056   .284417  .009204  I -.1857462  .0010296  2.6976 0.7179  P    10.924     .500    -3.116     .300   .268000   .290000  -.1839000      .000      .000  
+781022 43803.00 I   .235586  .000423   .280934  .005562  I -.1884211  .0011175  2.6593 0.8119  P    11.378     .500    -3.327     .300   .268000   .287000  -.1870000      .000      .000  
+781023 43804.00 I   .235928  .000423   .277428  .005562  I -.1910785  .0012556  2.6622 0.8404  P    11.889     .500    -3.494     .300   .268000   .283000  -.1901000      .000      .000  
+781024 43805.00 I   .236222  .000423   .273904  .005562  I -.1937577  .0012556  2.7019 0.8878  P    12.283     .500    -3.548     .300   .268000   .279000  -.1932000      .000      .000  
+781025 43806.00 I   .236463  .000423   .270369  .005562  I -.1964924  .0012556  2.7720 0.7598  P    12.465     .500    -3.521     .300   .268000   .276000  -.1963000      .000      .000  
+781026 43807.00 I   .236650  .001163   .266835  .005621  I -.1993084  .0008558  2.8622 0.6766  P    12.479     .500    -3.475     .300   .267000   .272000  -.1994000      .000      .000  
+781027 43808.00 I   .236778  .001590   .263312  .005679  I -.2022192  .0005045  2.9596 0.4967  P    12.444     .500    -3.422     .300   .267000   .269000  -.2025000      .000      .000  
+781028 43809.00 I   .236845  .001590   .259814  .005679  I -.2052260  .0005045  3.0522 0.3326  P    12.426     .500    -3.296     .300   .267000   .265000  -.2056000      .000      .000  
+781029 43810.00 I   .236847  .002330   .256349  .005552  I -.2083172  .0004335  3.1257 0.3326  P    12.414     .500    -3.017     .300   .267000   .261000  -.2087000      .000      .000  
+781030 43811.00 I   .236778  .002330   .252925  .005552  I -.2114663  .0004335  3.1660 0.3065  P    12.383     .500    -2.619     .300   .266000   .258000  -.2118000      .000      .000  
+781031 43812.00 I   .236632  .002330   .249544  .005552  I -.2146351  .0004335  3.1642 0.2541  P    12.351     .500    -2.287     .300   .266000   .254000  -.2149000      .000      .000  
+7811 1 43813.00 I   .236404  .002886   .246213  .005422  I -.2177810  .0002653  3.1215 0.2418  P    12.358     .500    -2.216     .300   .265000   .251000  -.2180000      .000      .000  
+7811 2 43814.00 I   .236086  .002886   .242932  .005422  I -.2208692  .0002145  3.0523 0.1706  P    12.415     .500    -2.416     .300   .265000   .247000  -.2211000      .000      .000  
+7811 3 43815.00 I   .235680  .002886   .239702  .005422  I -.2238856  .0002145  2.9831 0.1227  P    12.482     .500    -2.683     .300   .264000   .243000  -.2243000      .000      .000  
+7811 4 43816.00 I   .235182  .003310   .236519  .002690  I -.2268452  .0001193  2.9432 0.1227  P    12.503     .500    -2.792     .300   .264000   .240000  -.2274000      .000      .000  
+7811 5 43817.00 I   .234594  .003310   .233379  .002690  I -.2297885  .0001193  2.9526 0.0844  P    12.451     .500    -2.693     .300   .263000   .236000  -.2306000      .000      .000  
+7811 6 43818.00 I   .233914  .003310   .230281  .002690  I -.2327680  .0001193  3.0148 0.0852  P    12.373     .500    -2.499     .300   .263000   .233000  -.2337000      .000      .000  
+7811 7 43819.00 I   .233142  .003310   .227222  .002690  I -.2358311  .0001218  3.1161 0.0817  P    12.365     .500    -2.337     .300   .262000   .229000  -.2369000      .000      .000  
+7811 8 43820.00 I   .232276  .003310   .224198  .002690  I -.2390052  .0001117  3.2323 0.0826  P    12.490     .500    -2.240     .300   .261000   .225000  -.2401000      .000      .000  
+7811 9 43821.00 I   .231317  .003310   .221208  .002690  I -.2422912  .0001117  3.3350 0.1462  P    12.709     .500    -2.166     .300   .260000   .222000  -.2432000      .000      .000  
+781110 43822.00 I   .230263  .003809   .218247  .001759  I -.2456624  .0002702  3.3992 0.1462  P    12.898     .500    -2.078     .300   .259000   .218000  -.2464000      .000      .000  
+781111 43823.00 I   .229114  .003809   .215313  .001759  I -.2490712  .0002702  3.4084 0.1911  P    12.945     .500    -1.998     .300   .258000   .215000  -.2495000      .000      .000  
+781112 43824.00 I   .227870  .003809   .212404  .001759  I -.2524596  .0002702  3.3590 0.2021  P    12.853     .500    -1.978     .300   .257000   .211000  -.2527000      .000      .000  
+781113 43825.00 I   .226529  .003809   .209516  .001759  I -.2557732  .0003006  3.2615 0.2230  P    12.753     .500    -2.025     .300   .256000   .207000  -.2559000      .000      .000  
+781114 43826.00 I   .225095  .003809   .206646  .001759  I -.2589735  .0003548  3.1365 0.2325  P    12.796     .500    -2.061     .300   .255000   .204000  -.2590000      .000      .000  
+781115 43827.00 I   .223575  .003809   .203788  .001759  I -.2620454  .0003548  3.0091 0.2134  P    12.999     .500    -2.005     .300   .253000   .200000  -.2622000      .000      .000  
+781116 43828.00 I   .221976  .003310   .200937  .002690  I -.2649981  .0002374  2.9010 0.2695  P    13.240     .500    -1.876     .300   .252000   .197000  -.2653000      .000      .000  
+781117 43829.00 I   .220303  .003310   .198088  .002690  I -.2678583  .0004058  2.8257 0.1941  P    13.430     .500    -1.785     .300   .251000   .193000  -.2685000      .000      .000  
+781118 43830.00 I   .218564  .000942   .195236  .005539  I -.2706623  .0003072  2.7889 0.2545  P    13.644     .500    -1.811     .300   .249000   .190000  -.2716000      .000      .000  
+781119 43831.00 I   .216764  .000942   .192375  .005539  I -.2734491  .0003072  2.7911 0.2172  P    13.988     .500    -1.918     .300   .248000   .186000  -.2748000      .000      .000  
+781120 43832.00 I   .214912  .000942   .189501  .005539  I -.2762562  .0003072  2.8285 0.2172  P    14.399     .500    -2.012     .300   .246000   .183000  -.2779000      .000      .000  
+781121 43833.00 I   .213012  .000942   .186609  .005539  I -.2791156  .0003072  2.8943 0.2238  P    14.697     .500    -2.033     .300   .245000   .179000  -.2811000      .000      .000  
+781122 43834.00 I   .211071  .000942   .183701  .005539  I -.2820508  .0003255  2.9782 0.1784  P    14.825     .500    -1.983     .300   .243000   .176000  -.2842000      .000      .000  
+781123 43835.00 I   .209093  .000942   .180776  .005539  I -.2850740  .0001816  3.0681 0.3488  P    14.898     .500    -1.893     .300   .241000   .173000  -.2873000      .000      .000  
+781124 43836.00 I   .207082  .003725   .177839  .000902  I -.2881851  .0006169  3.1522 0.3215  P    14.978     .500    -1.794     .300   .239000   .169000  -.2904000      .000      .000  
+781125 43837.00 I   .205044  .003725   .174892  .000902  I -.2913729  .0006169  3.2199 0.4362  P    14.963     .500    -1.683     .300   .238000   .166000  -.2936000      .000      .000  
+781126 43838.00 I   .202984  .003725   .171935  .000902  I -.2946162  .0006169  3.2614 0.4362  P    14.780     .500    -1.509     .300   .236000   .162000  -.2967000      .000      .000  
+781127 43839.00 I   .200905  .003725   .168972  .000902  I -.2978839  .0006169  3.2674 0.4362  P    14.562     .500    -1.233     .300   .234000   .159000  -.2998000      .000      .000  
+781128 43840.00 I   .198815  .003725   .166005  .000902  I -.3011377  .0006169  3.2336 0.4362  P    14.505     .500     -.942     .300   .232000   .156000  -.3029000      .000      .000  
+781129 43841.00 I   .196725  .003725   .163037  .000902  I -.3043399  .0006169  3.1663 0.3369  P    14.620     .500     -.836     .300   .230000   .153000  -.3060000      .000      .000  
+781130 43842.00 I   .194646  .003310   .160071  .002690  I -.3074654  .0002710  3.0844 0.3369  P    14.744     .500    -1.024     .300   .228000   .149000  -.3091000      .000      .000  
+7812 1 43843.00 I   .192590  .003310   .157112  .002690  I -.3105135  .0002710  3.0170 0.1916  P    14.760     .500    -1.356     .300   .226000   .146000  -.3122000      .000      .000  
+7812 2 43844.00 I   .190570  .003310   .154161  .002690  I -.3135135  .0002710  2.9921 0.1728  P    14.688     .500    -1.534     .300   .224000   .143000  -.3153000      .000      .000  
+7812 3 43845.00 I   .188596  .010013   .151222  .001921  I -.3165158  .0002144  3.0217 0.1728  P    14.593     .500    -1.404     .300   .222000   .140000  -.3184000      .000      .000  
+7812 4 43846.00 I   .186681  .010013   .148300  .001921  I -.3195721  .0002144  3.0969 0.1516  P    14.513     .500    -1.082     .300   .220000   .137000  -.3214000      .000      .000  
+7812 5 43847.00 I   .184837  .010013   .145396  .001921  I -.3227160  .0002144  3.1912 0.1516  P    14.472     .500     -.795     .300   .217000   .134000  -.3245000      .000      .000  
+7812 6 43848.00 I   .183075  .010013   .142515  .001921  I -.3259501  .0002144  3.2721 0.1516  P    14.488     .500     -.663     .300   .215000   .131000  -.3275000      .000      .000  
+7812 7 43849.00 I   .181394  .010013   .139662  .001921  I -.3292471  .0002144  3.3135 0.1516  P    14.541     .500     -.656     .300   .213000   .128000  -.3306000      .000      .000  
+7812 8 43850.00 I   .179786  .010013   .136842  .001921  I -.3325594  .0002144  3.3018 0.2269  P    14.574     .500     -.707     .300   .211000   .125000  -.3336000      .000      .000  
+7812 9 43851.00 I   .178245  .003110   .134062  .002384  I -.3358331  .0004000  3.2372 0.2533  P    14.537     .500     -.785     .300   .209000   .122000  -.3366000      .000      .000  
+781210 43852.00 I   .176763  .003110   .131326  .002384  I -.3390196  .0004589  3.1300 0.3044  P    14.428     .500     -.878     .300   .206000   .120000  -.3397000      .000      .000  
+781211 43853.00 I   .175333  .003110   .128642  .002384  I -.3420848  .0004589  2.9978 0.3245  P    14.314     .500     -.945     .300   .204000   .117000  -.3427000      .000      .000  
+781212 43854.00 I   .173948  .003110   .126014  .002384  I -.3450138  .0004589  2.8613 0.3245  P    14.308     .500     -.933     .300   .202000   .114000  -.3457000      .000      .000  
+781213 43855.00 I   .172598  .003110   .123448  .002384  I -.3478125  .0004589  2.7400 0.3245  P    14.459     .500     -.835     .300   .200000   .112000  -.3487000      .000      .000  
+781214 43856.00 I   .171269  .003110   .120945  .002384  I -.3505033  .0004589  2.6473 0.3832  P    14.676     .500     -.714     .300   .198000   .109000  -.3517000      .000      .000  
+781215 43857.00 I   .169949  .003310   .118509  .002690  I -.3531192  .0006139  2.5909 0.3497  P    14.832     .500     -.651     .300   .195000   .107000  -.3547000      .000      .000  
+781216 43858.00 I   .168623  .005190   .116141  .006718  I -.3556976  .0005278  2.5721 0.4048  P    14.937     .500     -.670     .300   .193000   .104000  -.3577000      .000      .000  
+781217 43859.00 I   .167280  .005190   .113846  .006718  I -.3582751  .0005278  2.5884 0.3732  P    15.096     .500     -.727     .300   .191000   .102000  -.3607000      .000      .000  
+781218 43860.00 I   .165906  .005190   .111626  .006718  I -.3608843  .0005278  2.6342 0.3732  P    15.313     .500     -.777     .300   .189000   .100000  -.3637000      .000      .000  
+781219 43861.00 I   .164489  .005190   .109482  .006718  I -.3635510  .0005278  2.7024 0.3732  P    15.469     .500     -.805     .300   .187000   .098000  -.3667000      .000      .000  
+781220 43862.00 I   .163023  .005190   .107410  .006718  I -.3662935  .0005278  2.7839 0.3732  P    15.545     .500     -.799     .300   .184000   .096000  -.3696000      .000      .000  
+781221 43863.00 I   .161506  .005190   .105405  .006718  I -.3691193  .0005278  2.8670 0.2967  P    15.659     .500     -.740     .300   .182000   .094000  -.3726000      .000      .000  
+781222 43864.00 I   .159933  .003310   .103460  .002690  I -.3720247  .0002710  2.9416 0.2967  P    15.812     .500     -.654     .300   .180000   .092000  -.3756000      .000      .000  
+781223 43865.00 I   .158303  .003310   .101569  .002690  I -.3749969  .0002710  2.9995 0.1916  P    15.782     .500     -.608     .300   .178000   .090000  -.3786000      .000      .000  
+781224 43866.00 I   .156610  .003310   .099725  .002690  I -.3780160  .0002710  3.0344 0.1916  P    15.448     .500     -.609     .300   .176000   .088000  -.3815000      .000      .000  
+781225 43867.00 I   .154854  .003310   .097924  .002690  I -.3810565  .0002710  3.0416 0.1916  P    15.042     .500     -.554     .300   .173000   .087000  -.3845000      .000      .000  
+781226 43868.00 I   .153029  .003310   .096158  .002690  I -.3840898  .0002710  3.0207 0.5804  P    14.892     .500     -.375     .300   .171000   .085000  -.3874000      .000      .000  
+781227 43869.00 I   .151133  .000746   .094422  .009705  I -.3870918  .0011288  2.9814 0.5804  P    14.995     .500     -.196     .300   .169000   .083000  -.3904000      .000      .000  
+781228 43870.00 I   .149163  .000746   .092709  .009705  I -.3900537  .0011288  2.9453 0.7063  P    15.069     .500     -.222     .300   .167000   .082000  -.3933000      .000      .000  
+781229 43871.00 I   .147115  .000746   .091014  .009705  I -.3929930  .0008494  2.9410 0.7063  P    14.958     .500     -.461     .300   .164000   .080000  -.3962000      .000      .000  
+781230 43872.00 I   .144987  .000746   .089332  .009705  I -.3959529  .0008494  2.9883 0.6006  P    14.798     .500     -.658     .300   .162000   .079000  -.3992000      .000      .000  
+781231 43873.00 I   .142776  .000746   .087666  .009705  I -.3989868  .0008494  3.0871 0.6006  P    14.781     .500     -.583     .300   .159000   .077000  -.4021000      .000      .000  
+79 1 1 43874.00 I   .140480  .000746   .086025  .009705  I  .5978633  .0008494  3.2148 0.4248  P    14.925     .500     -.286     .300   .157000   .076000   .5950000      .000      .000  
+79 1 2 43875.00 I   .138099  .003310   .084414  .002690  I  .5945863  .0000180  3.3343 0.4248  P    15.115     .500     -.007     .300   .155000   .075000   .5921000      .000      .000  
+79 1 3 43876.00 I   .135629  .003310   .082840  .002690  I  .5912098  .0000180  3.4086 0.1358  P    15.221     .500      .113     .300   .152000   .074000   .5892000      .000      .000  
+79 1 4 43877.00 I   .133069  .003310   .081309  .002690  I  .5877910  .0002710  3.4172 0.1358  P    15.172     .500      .114     .300   .150000   .072000   .5863000      .000      .000  
+79 1 5 43878.00 I   .130417  .003310   .079829  .002690  I  .5843976  .0002710  3.3593 0.2373  P    15.003     .500      .067     .300   .147000   .071000   .5834000      .000      .000  
+79 1 6 43879.00 I   .127672  .006757   .078406  .008005  I  .5810892  .0003897  3.2510 0.2373  P    14.845     .500     -.040     .300   .145000   .070000   .5805000      .000      .000  
+79 1 7 43880.00 I   .124831  .006757   .077047  .008005  I  .5779048  .0003897  3.1151 0.2756  P    14.795     .500     -.219     .300   .143000   .069000   .5776000      .000      .000  
+79 1 8 43881.00 I   .121894  .006757   .075758  .008005  I  .5748607  .0003897  2.9740 0.2756  P    14.818     .500     -.390     .300   .140000   .068000   .5747000      .000      .000  
+79 1 9 43882.00 I   .118858  .006757   .074545  .008005  I  .5719519  .0003897  2.8474 0.2756  P    14.832     .500     -.443     .300   .138000   .067000   .5719000      .000      .000  
+79 110 43883.00 I   .115732  .006757   .073408  .008005  I  .5691563  .0003897  2.7494 0.2756  P    14.836     .500     -.374     .300   .135000   .066000   .5690000      .000      .000  
+79 111 43884.00 I   .112525  .006757   .072343  .008005  I  .5664409  .0003897  2.6879 0.2373  P    14.878     .500     -.289     .300   .133000   .065000   .5661000      .000      .000  
+79 112 43885.00 I   .109250  .003310   .071345  .002690  I  .5637676  .0002710  2.6651 0.2373  P    14.957     .500     -.277     .300   .131000   .064000   .5632000      .000      .000  
+79 113 43886.00 I   .105917  .003310   .070411  .002690  I  .5610988  .0002710  2.6781 0.1916  P    15.047     .500     -.322     .300   .128000   .063000   .5604000      .000      .000  
+79 114 43887.00 I   .102538  .003310   .069537  .002690  I  .5584014  .0002710  2.7212 0.1916  P    15.168     .500     -.362     .300   .126000   .063000   .5575000      .000      .000  
+79 115 43888.00 I   .099123  .003310   .068719  .002690  I  .5556491  .0002710  2.7864 0.1916  P    15.321     .500     -.392     .300   .123000   .062000   .5547000      .000      .000  
+79 116 43889.00 I   .095684  .003310   .067954  .002690  I  .5528245  .0002710  2.8639 0.1916  P    15.441     .500     -.450     .300   .121000   .061000   .5518000      .000      .000  
+79 117 43890.00 I   .092231  .003310   .067237  .002690  I  .5499209  .0002710  2.9425 0.1916  P    15.501     .500     -.529     .300   .118000   .060000   .5489000      .000      .000  
+79 118 43891.00 I   .088776  .003310   .066565  .002690  I  .5469430  .0002710  3.0107 0.1916  P    15.561     .500     -.563     .300   .116000   .060000   .5461000      .000      .000  
+79 119 43892.00 I   .085330  .003310   .065933  .002690  I  .5439059  .0002710  3.0596 0.1916  P    15.613     .500     -.537     .300   .113000   .059000   .5432000      .000      .000  
+79 120 43893.00 I   .081903  .003310   .065338  .002690  I  .5408321  .0002710  3.0836 0.1400  P    15.489     .500     -.541     .300   .111000   .059000   .5404000      .000      .000  
+79 121 43894.00 I   .078507  .006923   .064776  .005908  I  .5377474  .0000706  3.0814 0.1400  P    15.107     .500     -.639     .300   .108000   .058000   .5375000      .000      .000  
+79 122 43895.00 I   .075153  .006923   .064243  .005908  I  .5346777  .0000706  3.0541 0.0499  P    14.700     .500     -.733     .300   .105000   .057000   .5346000      .000      .000  
+79 123 43896.00 I   .071853  .006923   .063735  .005908  I  .5316455  .0000706  3.0081 0.0499  P    14.567     .500     -.660     .300   .102000   .057000   .5318000      .000      .000  
+79 124 43897.00 I   .068616  .006923   .063248  .005908  I  .5286629  .0000706  2.9580 0.0499  P    14.653     .500     -.448     .300   .100000   .056000   .5289000      .000      .000  
+79 125 43898.00 I   .065446  .006923   .062784  .005908  I  .5257234  .0000706  2.9264 0.0499  P    14.607     .500     -.324     .300   .097000   .056000   .5261000      .000      .000  
+79 126 43899.00 I   .062342  .006923   .062344  .005908  I  .5227957  .0000706  2.9381 0.1400  P    14.276     .500     -.433     .300   .094000   .055000   .5232000      .000      .000  
+79 127 43900.00 I   .059301  .003310   .061935  .002690  I  .5198283  .0002710  3.0067 0.1400  P    13.919     .500     -.628     .300   .091000   .055000   .5203000      .000      .000  
+79 128 43901.00 I   .056322  .003310   .061559  .002690  I  .5167664  .0002710  3.1231 0.1916  P    13.885     .500     -.664     .300   .088000   .054000   .5175000      .000      .000  
+79 129 43902.00 I   .053402  .003310   .061220  .002690  I  .5135772  .0002710  3.2541 0.2257  P    14.245     .500     -.510     .300   .085000   .054000   .5146000      .000      .000  
+79 130 43903.00 I   .050539  .001000   .060923  .004615  I  .5102684  .0003611  3.3545 0.2257  P    14.767     .500     -.354     .300   .082000   .053000   .5118000      .000      .000  
+79 131 43904.00 I   .047732  .001000   .060670  .004615  I  .5068909  .0003611  3.3869 0.2553  P    15.125     .500     -.312     .300   .079000   .053000   .5089000      .000      .000  
+79 2 1 43905.00 I   .044977  .001000   .060467  .004615  I  .5035221  .0003611  3.3368 0.2211  P    15.115     .500     -.313     .300   .076000   .053000   .5060000      .000      .000  
+79 2 2 43906.00 I   .042272  .000786   .060316  .004555  I  .5002411  .0002553  3.2154 0.2211  P    14.803     .500     -.278     .300   .073000   .053000   .5031000      .000      .000  
+79 2 3 43907.00 I   .039616  .000786   .060220  .004555  I  .4971054  .0002553  3.0519 0.1805  P    14.502     .500     -.286     .300   .070000   .052000   .5003000      .000      .000  
+79 2 4 43908.00 I   .037003  .000786   .060177  .004555  I  .4941406  .0002553  2.8786 0.1277  P    14.473     .500     -.449     .300   .067000   .052000   .4974000      .000      .000  
+79 2 5 43909.00 I   .034431  .002510   .060183  .005218  I  .4913431  .0000077  2.7208 0.1277  P    14.640     .500     -.721     .300   .064000   .052000   .4945000      .000      .000  
+79 2 6 43910.00 I   .031894  .002510   .060235  .005218  I  .4886884  .0000077  2.5950 0.0054  P    14.731     .500     -.937     .300   .061000   .052000   .4916000      .000      .000  
+79 2 7 43911.00 I   .029391  .002510   .060324  .005218  I  .4861395  .0000077  2.5099 0.0058  P    14.659     .500    -1.017     .300   .058000   .053000   .4887000      .000      .000  
+79 2 8 43912.00 I   .026917  .003516   .060443  .005852  I  .4836543  .0000088  2.4676 0.0464  P    14.607     .500    -1.030     .300   .054000   .053000   .4859000      .000      .000  
+79 2 9 43913.00 I   .024464  .004495   .060590  .004142  I  .4811906  .0000924  2.4662 0.0464  P    14.735     .500    -1.060     .300   .051000   .054000   .4830000      .000      .000  
+79 210 43914.00 I   .022021  .004495   .060766  .004142  I  .4787103  .0000924  2.4995 0.0799  P    14.988     .500    -1.092     .300   .048000   .054000   .4801000      .000      .000  
+79 211 43915.00 I   .019579  .005296   .060969  .000260  I  .4761830  .0001304  2.5587 0.0799  P    15.238     .500    -1.077     .300   .044000   .055000   .4772000      .000      .000  
+79 212 43916.00 I   .017129  .005296   .061199  .000260  I  .4735876  .0001304  2.6339 0.0922  P    15.439     .500    -1.046     .300   .041000   .055000   .4743000      .000      .000  
+79 213 43917.00 I   .014664  .005296   .061456  .000260  I  .4709136  .0001304  2.7140 0.0922  P    15.584     .500    -1.081     .300   .037000   .056000   .4714000      .000      .000  
+79 214 43918.00 I   .012186  .005296   .061739  .000260  I  .4681619  .0001304  2.7874 0.1504  P    15.645     .500    -1.193     .300   .034000   .056000   .4685000      .000      .000  
+79 215 43919.00 I   .009695  .003310   .062047  .002690  I  .4653447  .0002710  2.8431 0.1504  P    15.611     .500    -1.300     .300   .030000   .057000   .4656000      .000      .000  
+79 216 43920.00 I   .007190  .003310   .062380  .002690  I  .4624842  .0002710  2.8731 0.2580  P    15.492     .500    -1.344     .300   .026000   .058000   .4627000      .000      .000  
+79 217 43921.00 I   .004672  .001796   .062736  .000100  I  .4596078  .0004390  2.8750 0.2580  P    15.275     .500    -1.376     .300   .023000   .058000   .4598000      .000      .000  
+79 218 43922.00 I   .002142  .001796   .063115  .000100  I  .4567426  .0004390  2.8516 0.3104  P    14.975     .500    -1.477     .300   .019000   .059000   .4569000      .000      .000  
+79 219 43923.00 I  -.000401  .001796   .063517  .000100  I  .4539100  .0004390  2.8118 0.3104  P    14.755     .500    -1.605     .300   .016000   .059000   .4540000      .000      .000  
+79 220 43924.00 I  -.002956  .001796   .063940  .000100  I  .4511200  .0004390  2.7689 0.3104  P    14.791     .500    -1.625     .300   .012000   .060000   .4511000      .000      .000  
+79 221 43925.00 I  -.005524  .001796   .064384  .000100  I  .4483673  .0004390  2.7405 0.3104  P    14.998     .500    -1.509     .300   .008000   .061000   .4482000      .000      .000  
+79 222 43926.00 I  -.008108  .001796   .064848  .000100  I  .4456269  .0004390  2.7482 0.2580  P    15.060     .500    -1.412     .300   .005000   .062000   .4453000      .000      .000  
+79 223 43927.00 I  -.010711  .003310   .065332  .002690  I  .4428528  .0002710  2.8101 0.3388  P    14.807     .500    -1.483     .300   .001000   .062000   .4423000      .000      .000  
+79 224 43928.00 I  -.013336  .002521   .065834  .010697  I  .4399875  .0005162  2.9296 0.2915  P    14.447     .500    -1.657     .300  -.002000   .063000   .4394000      .000      .000  
+79 225 43929.00 I  -.015987  .002521   .066356  .010697  I  .4369807  .0005162  3.0877 0.3650  P    14.336     .500    -1.743     .300  -.006000   .064000   .4365000      .000      .000  
+79 226 43930.00 I  -.018666  .002521   .066895  .010697  I  .4338127  .0005162  3.2439 0.3650  P    14.622     .500    -1.695     .300  -.010000   .065000   .4336000      .000      .000  
+79 227 43931.00 I  -.021378  .002521   .067451  .010697  I  .4305092  .0005162  3.3512 0.3650  P    15.137     .500    -1.657     .300  -.014000   .066000   .4306000      .000      .000  
+79 228 43932.00 I  -.024122  .002521   .068028  .010697  I  .4271378  .0005162  3.3762 0.3650  P    15.544     .500    -1.728     .300  -.017000   .068000   .4277000      .000      .000  
+79 3 1 43933.00 I  -.026899  .002521   .068637  .010697  I  .4237864  .0005162  3.3125 0.2915  P    15.574     .500    -1.808     .300  -.021000   .069000   .4247000      .000      .000  
+79 3 2 43934.00 I  -.029706  .003310   .069293  .002690  I  .4205356  .0002710  3.1802 0.2772  P    15.252     .500    -1.774     .300  -.025000   .070000   .4218000      .000      .000  
+79 3 3 43935.00 I  -.032543  .003063   .070009  .006290  I  .4174369  .0002023  3.0150 0.1691  P    14.917     .500    -1.692     .300  -.029000   .072000   .4189000      .000      .000  
+79 3 4 43936.00 I  -.035406  .003063   .070797  .006290  I  .4145046  .0002023  2.8527 0.1430  P    14.896     .500    -1.750     .300  -.032000   .073000   .4159000      .000      .000  
+79 3 5 43937.00 I  -.038296  .003063   .071672  .006290  I  .4117220  .0002023  2.7191 0.1551  P    15.130     .500    -2.004     .300  -.036000   .075000   .4130000      .000      .000  
+79 3 6 43938.00 I  -.041208  .003977   .072647  .009776  I  .4090524  .0002352  2.6277 0.1551  P    15.287     .500    -2.314     .300  -.039000   .076000   .4100000      .000      .000  
+79 3 7 43939.00 I  -.044139  .003977   .073730  .009776  I  .4064513  .0002352  2.5823 0.1663  P    15.239     .500    -2.529     .300  -.043000   .078000   .4071000      .000      .000  
+79 3 8 43940.00 I  -.047081  .003977   .074925  .009776  I  .4038728  .0002352  2.5819 0.1737  P    15.231     .500    -2.627     .300  -.046000   .080000   .4041000      .000      .000  
+79 3 9 43941.00 I  -.050025  .004716   .076239  .012312  I  .4012742  .0002556  2.6215 0.1737  P    15.501     .500    -2.654     .300  -.050000   .082000   .4012000      .000      .000  
+79 310 43942.00 I  -.052969  .004716   .077670  .012312  I  .3986191  .0002556  2.6933 0.1807  P    15.948     .500    -2.622     .300  -.053000   .083000   .3982000      .000      .000  
+79 311 43943.00 I  -.055911  .004716   .079210  .012312  I  .3958803  .0002556  2.7869 0.1863  P    16.305     .500    -2.525     .300  -.057000   .085000   .3953000      .000      .000  
+79 312 43944.00 I  -.058854  .003310   .080847  .002690  I  .3930421  .0002710  2.8900 0.6688  P    16.484     .500    -2.410     .300  -.060000   .087000   .3923000      .000      .000  
+79 313 43945.00 I  -.061800  .008930   .082570  .000884  I  .3901010  .0013130  2.9909 0.6703  P    16.567     .500    -2.360     .300  -.063000   .089000   .3893000      .000      .000  
+79 314 43946.00 I  -.064750  .008930   .084368  .000884  I  .3870650  .0013130  3.0778 0.9284  P    16.592     .500    -2.402     .300  -.066000   .091000   .3863000      .000      .000  
+79 315 43947.00 I  -.067704  .008930   .086231  .000884  I  .3839535  .0013130  3.1403 0.9284  P    16.514     .500    -2.489     .300  -.070000   .093000   .3834000      .000      .000  
+79 316 43948.00 I  -.070664  .008930   .088147  .000884  I  .3807956  .0013130  3.1692 0.9284  P    16.332     .500    -2.572     .300  -.073000   .095000   .3804000      .000      .000  
+79 317 43949.00 I  -.073618  .008930   .090106  .000884  I  .3776271  .0013130  3.1620 0.9284  P    16.126     .500    -2.654     .300  -.076000   .097000   .3774000      .000      .000  
+79 318 43950.00 I  -.076549  .008930   .092098  .000884  I  .3744811  .0013130  3.1263 0.6697  P    15.965     .500    -2.761     .300  -.079000   .099000   .3744000      .000      .000  
+79 319 43951.00 I  -.079444  .010706   .094114  .008790  I  .3713788  .0002644  3.0778 0.6697  P    15.904     .500    -2.874     .300  -.082000   .101000   .3714000      .000      .000  
+79 320 43952.00 I  -.082286  .010706   .096143  .008790  I  .3683230  .0002644  3.0367 0.1708  P    15.990     .500    -2.939     .300  -.084000   .104000   .3683000      .000      .000  
+79 321 43953.00 I  -.085059  .008098   .098177  .006523  I  .3652961  .0002163  3.0235 0.1708  P    16.209     .500    -2.944     .300  -.087000   .106000   .3653000      .000      .000  
+79 322 43954.00 I  -.087749  .008098   .100204  .006523  I  .3622606  .0002163  3.0563 0.1529  P    16.442     .500    -2.956     .300  -.090000   .108000   .3623000      .000      .000  
+79 323 43955.00 I  -.090350  .008098   .102221  .006523  I  .3591650  .0002163  3.1445 0.1529  P    16.574     .500    -3.034     .300  -.093000   .110000   .3592000      .000      .000  
+79 324 43956.00 I  -.092865  .008098   .104229  .006523  I  .3559556  .0002163  3.2808 0.1327  P    16.610     .500    -3.124     .300  -.096000   .113000   .3562000      .000      .000  
+79 325 43957.00 I  -.095296  .004064   .106231  .002797  I  .3525963  .0001538  3.4382 0.4103  P    16.648     .500    -3.117     .300  -.098000   .115000   .3531000      .000      .000  
+79 326 43958.00 I  -.097642  .004889   .108233  .002308  I  .3490860  .0007915  3.5750 0.5597  P    16.753     .500    -3.014     .300  -.101000   .118000   .3501000      .000      .000  
+79 327 43959.00 I  -.099898  .005593   .110239  .001682  I  .3454675  .0011088  3.6483 0.6812  P    16.895     .500    -2.964     .300  -.104000   .120000   .3470000      .000      .000  
+79 328 43960.00 I  -.102064  .005593   .112255  .001682  I  .3418196  .0011088  3.6312 0.7840  P    16.969     .500    -3.080     .300  -.106000   .123000   .3439000      .000      .000  
+79 329 43961.00 I  -.104136  .005593   .114286  .001682  I  .3382344  .0011088  3.5262 0.7840  P    16.872     .500    -3.273     .300  -.109000   .125000   .3409000      .000      .000  
+79 330 43962.00 I  -.106120  .005593   .116336  .001682  I  .3347871  .0011088  3.3615 0.7840  P    16.630     .500    -3.355     .300  -.111000   .128000   .3378000      .000      .000  
+79 331 43963.00 I  -.108024  .005593   .118409  .001682  I  .3315186  .0011088  3.1751 0.5707  P    16.440     .500    -3.290     .300  -.114000   .130000   .3348000      .000      .000  
+79 4 1 43964.00 I  -.109856  .003310   .120506  .002690  I  .3284323  .0002710  3.0024 0.5853  P    16.487     .500    -3.238     .300  -.116000   .133000   .3317000      .000      .000  
+79 4 2 43965.00 I  -.111624  .004700   .122632  .003826  I  .3255016  .0003754  2.8664 0.2315  P    16.698     .500    -3.352     .300  -.118000   .136000   .3286000      .000      .000  
+79 4 3 43966.00 I  -.113335  .004700   .124790  .003826  I  .3226839  .0003754  2.7773 0.2654  P    16.815     .500    -3.605     .300  -.120000   .139000   .3255000      .000      .000  
+79 4 4 43967.00 I  -.114998  .004700   .126982  .003826  I  .3199310  .0003754  2.7364 0.2654  P    16.762     .500    -3.853     .300  -.123000   .141000   .3223000      .000      .000  
+79 4 5 43968.00 I  -.116619  .004700   .129213  .003826  I  .3171962  .0003754  2.7404 0.2654  P    16.775     .500    -3.993     .300  -.125000   .144000   .3192000      .000      .000  
+79 4 6 43969.00 I  -.118202  .004700   .131482  .003826  I  .3144374  .0003754  2.7830 0.2447  P    17.069     .500    -4.014     .300  -.127000   .147000   .3161000      .000      .000  
+79 4 7 43970.00 I  -.119746  .004700   .133788  .003826  I  .3116208  .0003141  2.8539 0.2407  P    17.518     .500    -3.947     .300  -.129000   .150000   .3130000      .000      .000  
+79 4 8 43971.00 I  -.121251  .003106   .136129  .000016  I  .3087243  .0003015  2.9407 0.2177  P    17.817     .500    -3.826     .300  -.131000   .153000   .3099000      .000      .000  
+79 4 9 43972.00 I  -.122714  .003106   .138504  .000016  I  .3057383  .0003015  3.0308 0.2132  P    17.856     .500    -3.697     .300  -.133000   .155000   .3068000      .000      .000  
+79 410 43973.00 I  -.124135  .003106   .140910  .000016  I  .3026656  .0003015  3.1123 0.2132  P    17.769     .500    -3.594     .300  -.135000   .158000   .3037000      .000      .000  
+79 411 43974.00 I  -.125512  .003106   .143345  .000016  I  .2995202  .0003015  3.1743 0.2728  P    17.678     .500    -3.526     .300  -.137000   .161000   .3006000      .000      .000  
+79 412 43975.00 I  -.126849  .003106   .145809  .000016  I  .2963268  .0004548  3.2068 0.3663  P    17.569     .500    -3.504     .300  -.139000   .164000   .2975000      .000      .000  
+79 413 43976.00 I  -.128150  .003106   .148298  .000016  I  .2931183  .0006677  3.2042 0.5035  P    17.426     .500    -3.558     .300  -.141000   .166000   .2943000      .000      .000  
+79 414 43977.00 I  -.129419  .003310   .150811  .002690  I  .2899290  .0008985  3.1698 0.4876  P    17.309     .500    -3.702     .300  -.142000   .169000   .2912000      .000      .000  
+79 415 43978.00 I  -.130661  .004198   .153347  .002319  I  .2867850  .0007109  3.1164 0.5729  P    17.260     .500    -3.888     .300  -.144000   .171000   .2880000      .000      .000  
+79 416 43979.00 I  -.131882  .004198   .155903  .002319  I  .2836958  .0007109  3.0640 0.5027  P    17.229     .500    -4.029     .300  -.146000   .174000   .2849000      .000      .000  
+79 417 43980.00 I  -.133085  .004198   .158477  .002319  I  .2806490  .0007109  3.0354 0.4443  P    17.165     .500    -4.083     .300  -.148000   .177000   .2818000      .000      .000  
+79 418 43981.00 I  -.134274  .003059   .161067  .002158  I  .2776110  .0005331  3.0486 0.3960  P    17.119     .500    -4.081     .300  -.149000   .179000   .2787000      .000      .000  
+79 419 43982.00 I  -.135449  .003059   .163669  .002158  I  .2745349  .0003493  3.1123 0.3187  P    17.205     .500    -4.086     .300  -.151000   .182000   .2755000      .000      .000  
+79 420 43983.00 I  -.136606  .003059   .166279  .002158  I  .2713707  .0003493  3.2229 0.1779  P    17.483     .500    -4.111     .300  -.152000   .184000   .2724000      .000      .000  
+79 421 43984.00 I  -.137741  .002933   .168891  .004908  I  .2680793  .0000678  3.3628 0.1779  P    17.885     .500    -4.101     .300  -.154000   .187000   .2693000      .000      .000  
+79 422 43985.00 I  -.138853  .002933   .171502  .004908  I  .2646455  .0000678  3.5016 0.0479  P    18.239     .500    -3.988     .300  -.155000   .190000   .2662000      .000      .000  
+79 423 43986.00 I  -.139941  .002933   .174110  .004908  I  .2610886  .0000678  3.6027 0.3528  P    18.370     .500    -3.795     .300  -.157000   .192000   .2631000      .000      .000  
+79 424 43987.00 I  -.141004  .005579   .176715  .006599  I  .2574631  .0007023  3.6346 0.3528  P    18.217     .500    -3.659     .300  -.158000   .195000   .2601000      .000      .000  
+79 425 43988.00 I  -.142046  .005579   .179318  .006599  I  .2538475  .0007023  3.5823 0.4966  P    17.874     .500    -3.714     .300  -.160000   .197000   .2570000      .000      .000  
+79 426 43989.00 I  -.143074  .005579   .181927  .006599  I  .2503237  .0007023  3.4544 0.6068  P    17.521     .500    -3.929     .300  -.161000   .200000   .2539000      .000      .000  
+79 427 43990.00 I  -.144092  .006793   .184548  .006546  I  .2469541  .0009898  3.2804 0.4967  P    17.320     .500    -4.122     .300  -.162000   .203000   .2506000      .000      .000  
+79 428 43991.00 I  -.145100  .005079   .187182  .004675  I  .2437655  .0007025  3.0986 0.6069  P    17.344     .500    -4.153     .300  -.163000   .205000   .2473000      .000      .000  
+79 429 43992.00 I  -.146089  .005079   .189825  .004675  I  .2407493  .0007025  2.9397 0.3539  P    17.534     .500    -4.077     .300  -.164000   .208000   .2440000      .000      .000  
+79 430 43993.00 I  -.147054  .002334   .192477  .000929  I  .2378725  .0000862  2.8217 0.3539  P    17.721     .500    -4.064     .300  -.165000   .210000   .2407000      .000      .000  
+79 5 1 43994.00 I  -.147988  .002334   .195134  .000929  I  .2350903  .0000862  2.7506 0.0610  P    17.755     .500    -4.198     .300  -.142000   .213000   .2374000      .000      .000  
+79 5 2 43995.00 I  -.148886  .002334   .197796  .000929  I  .2323562  .0000862  2.7248 0.0610  P    17.658     .500    -4.409     .300  -.143000   .215000   .2344000      .000      .000  
+79 5 3 43996.00 I  -.149745  .002334   .200461  .000929  I  .2296276  .0000862  2.7383 0.2460  P    17.615     .500    -4.573     .300  -.143000   .218000   .2314000      .000      .000  
+79 5 4 43997.00 I  -.150564  .003310   .203128  .002690  I  .2268695  .0004843  2.7822 0.1781  P    17.765     .500    -4.628     .300  -.144000   .220000   .2283000      .000      .000  
+79 5 5 43998.00 I  -.151339  .001531   .205796  .000143  I  .2240570  .0003456  2.8447 0.2915  P    18.027     .500    -4.594     .300  -.144000   .223000   .2253000      .000      .000  
+79 5 6 43999.00 I  -.152070  .001531   .208464  .000143  I  .2211782  .0003245  2.9127 0.2489  P    18.196     .500    -4.521     .300  -.145000   .225000   .2223000      .000      .000  
+79 5 7 44000.00 I  -.152753  .001531   .211131  .000143  I  .2182336  .0003584  2.9745 0.2417  P    18.152     .500    -4.440     .300  -.145000   .227000   .2194000      .000      .000  
+79 5 8 44001.00 I  -.153387  .001531   .213797  .000143  I  .2152346  .0003584  3.0199 0.2534  P    17.938     .500    -4.343     .300  -.146000   .230000   .2164000      .000      .000  
+79 5 9 44002.00 I  -.153973  .001531   .216460  .000143  I  .2122023  .0003584  3.0398 0.2433  P    17.668     .500    -4.200     .300  -.146000   .232000   .2135000      .000      .000  
+79 510 44003.00 I  -.154510  .001531   .219120  .000143  I  .2091655  .0003292  3.0282 0.3234  P    17.430     .500    -4.039     .300  -.147000   .235000   .2105000      .000      .000  
+79 511 44004.00 I  -.154999  .000312   .221774  .002626  I  .2061571  .0005385  2.9830 0.3439  P    17.280     .500    -3.969     .300  -.147000   .237000   .2076000      .000      .000  
+79 512 44005.00 I  -.155442  .000312   .224422  .002626  I  .2032085  .0006039  2.9106 0.4196  P    17.239     .500    -4.081     .300  -.147000   .239000   .2047000      .000      .000  
+79 513 44006.00 I  -.155839  .000312   .227063  .002626  I  .2003390  .0006437  2.8287 0.4413  P    17.267     .500    -4.329     .300  -.148000   .242000   .2019000      .000      .000  
+79 514 44007.00 I  -.156190  .000312   .229696  .002626  I  .1975461  .0006437  2.7619 0.3991  P    17.257     .500    -4.539     .300  -.148000   .244000   .1990000      .000      .000  
+79 515 44008.00 I  -.156498  .000222   .232317  .002459  I  .1948025  .0004720  2.7332 0.3991  P    17.119     .500    -4.575     .300  -.149000   .247000   .1962000      .000      .000  
+79 516 44009.00 I  -.156760  .000222   .234922  .002459  I  .1920627  .0004720  2.7555 0.2673  P    16.876     .500    -4.455     .300  -.149000   .249000   .1933000      .000      .000  
+79 517 44010.00 I  -.156979  .001591   .237507  .007610  I  .1892751  .0002512  2.8271 0.2673  P    16.676     .500    -4.300     .300  -.149000   .251000   .1905000      .000      .000  
+79 518 44011.00 I  -.157154  .001591   .240066  .007610  I  .1863978  .0002512  2.9307 0.1776  P    16.693     .500    -4.203     .300  -.149000   .253000   .1878000      .000      .000  
+79 519 44012.00 I  -.157284  .001591   .242593  .007610  I  .1834122  .0002512  3.0386 0.1776  P    16.984     .500    -4.158     .300  -.149000   .256000   .1850000      .000      .000  
+79 520 44013.00 I  -.157372  .001591   .245080  .007610  I  .1803290  .0002512  3.1211 0.1970  P    17.407     .500    -4.098     .300  -.149000   .258000   .1823000      .000      .000  
+79 521 44014.00 I  -.157415  .001962   .247523  .007616  I  .1771873  .0003035  3.1516 0.1970  P    17.678     .500    -3.985     .300  -.149000   .260000   .1795000      .000      .000  
+79 522 44015.00 I  -.157410  .001962   .249924  .007616  I  .1740488  .0003035  3.1133 0.2128  P    17.565     .500    -3.866     .300  -.149000   .262000   .1768000      .000      .000  
+79 523 44016.00 I  -.157353  .001625   .252291  .002321  I  .1709837  .0002984  3.0062 0.2128  P    17.079     .500    -3.841     .300  -.149000   .264000   .1742000      .000      .000  
+79 524 44017.00 I  -.157240  .001625   .254629  .002321  I  .1680538  .0002984  2.8470 0.2110  P    16.499     .500    -3.953     .300  -.149000   .267000   .1715000      .000      .000  
+79 525 44018.00 I  -.157071  .001625   .256943  .002321  I  .1652975  .0002984  2.6643 0.3381  P    16.161     .500    -4.121     .300  -.149000   .269000   .1689000      .000      .000  
+79 526 44019.00 I  -.156842  .002407   .259234  .002062  I  .1627230  .0006069  2.4881 0.4291  P    16.197     .500    -4.217     .300  -.149000   .271000   .1662000      .000      .000  
+79 527 44020.00 I  -.156555  .002991   .261507  .001764  I  .1603115  .0008047  2.3412 0.5040  P    16.450     .500    -4.209     .300  -.149000   .273000   .1637000      .000      .000  
+79 528 44021.00 I  -.156206  .002991   .263765  .001764  I  .1580270  .0008047  2.2350 0.5575  P    16.656     .500    -4.185     .300  -.149000   .275000   .1611000      .000      .000  
+79 529 44022.00 I  -.155797  .002821   .266011  .001362  I  .1558269  .0007719  2.1725 0.5575  P    16.690     .500    -4.236     .300  -.148000   .278000   .1586000      .000      .000  
+79 530 44023.00 I  -.155330  .002821   .268245  .001362  I  .1536684  .0007719  2.1509 0.5458  P    16.608     .500    -4.356     .300  -.148000   .280000   .1560000      .000      .000  
+79 531 44024.00 I  -.154810  .002821   .270470  .001362  I  .1515140  .0007719  2.1627 0.5339  P    16.509     .500    -4.476     .300  -.148000   .282000   .1535000      .000      .000  
+79 6 1 44025.00 I  -.154242  .002639   .272685  .000771  I  .1493351  .0007377  2.1983 0.5339  P    16.445     .500    -4.546     .300  -.147000   .284000   .1511000      .000      .000  
+79 6 2 44026.00 I  -.153628  .002639   .274892  .000771  I  .1471131  .0007377  2.2470 0.5216  P    16.437     .500    -4.562     .300  -.147000   .286000   .1486000      .000      .000  
+79 6 3 44027.00 I  -.152969  .002639   .277094  .000771  I  .1448408  .0007377  2.2968 0.3930  P    16.474     .500    -4.542     .300  -.146000   .289000   .1462000      .000      .000  
+79 6 4 44028.00 I  -.152263  .003310   .279291  .002690  I  .1425226  .0002710  2.3373 0.4250  P    16.448     .500    -4.499     .300  -.146000   .291000   .1437000      .000      .000  
+79 6 5 44029.00 I  -.151511  .003310   .281486  .002690  I  .1401719  .0004222  2.3607 0.3096  P    16.196     .500    -4.419     .300  -.145000   .293000   .1413000      .000      .000  
+79 6 6 44030.00 I  -.150712  .003618   .283680  .001226  I  .1378086  .0005568  2.3620 0.3494  P    15.694     .500    -4.266     .300  -.144000   .295000   .1389000      .000      .000  
+79 6 7 44031.00 I  -.149866  .003618   .285876  .001226  I  .1354564  .0005568  2.3380 0.3937  P    15.157     .500    -4.032     .300  -.143000   .298000   .1365000      .000      .000  
+79 6 8 44032.00 I  -.148972  .003618   .288076  .001226  I  .1331408  .0005568  2.2894 0.3937  P    14.844     .500    -3.813     .300  -.142000   .300000   .1341000      .000      .000  
+79 6 9 44033.00 I  -.148031  .003618   .290280  .001226  I  .1308829  .0005568  2.2248 0.3937  P    14.802     .500    -3.765     .300  -.141000   .303000   .1317000      .000      .000  
+79 610 44034.00 I  -.147047  .003618   .292494  .001226  I  .1286901  .0005568  2.1634 0.4116  P    14.870     .500    -3.941     .300  -.140000   .305000   .1293000      .000      .000  
+79 611 44035.00 I  -.146027  .003618   .294720  .001226  I  .1265461  .0006064  2.1320 0.3350  P    14.886     .500    -4.183     .300  -.139000   .307000   .1270000      .000      .000  
+79 612 44036.00 I  -.144979  .001747   .296961  .005060  I  .1244090  .0003725  2.1519 0.3643  P    14.804     .500    -4.255     .300  -.138000   .310000   .1246000      .000      .000  
+79 613 44037.00 I  -.143907  .001747   .299222  .005060  I  .1222235  .0004038  2.2280 0.2747  P    14.634     .500    -4.078     .300  -.137000   .312000   .1223000      .000      .000  
+79 614 44038.00 I  -.142819  .001747   .301505  .005060  I  .1199394  .0004038  2.3447 0.2855  P    14.393     .500    -3.792     .300  -.136000   .315000   .1199000      .000      .000  
+79 615 44039.00 I  -.141721  .001747   .303814  .005060  I  .1175309  .0004038  2.4711 0.2855  P    14.146     .500    -3.603     .300  -.135000   .317000   .1176000      .000      .000  
+79 616 44040.00 I  -.140619  .001747   .306150  .005060  I  .1150055  .0004038  2.5727 0.2855  P    14.028     .500    -3.593     .300  -.134000   .319000   .1154000      .000      .000  
+79 617 44041.00 I  -.139515  .001747   .308510  .005060  I  .1124028  .0004038  2.6226 0.2438  P    14.118     .500    -3.693     .300  -.133000   .321000   .1131000      .000      .000  
+79 618 44042.00 I  -.138413  .003956   .310891  .003754  I  .1097815  .0002732  2.6090 0.2090  P    14.316     .500    -3.789     .300  -.132000   .324000   .1109000      .000      .000  
+79 619 44043.00 I  -.137315  .003956   .313290  .003754  I  .1072050  .0001084  2.5348 0.1470  P    14.369     .500    -3.826     .300  -.131000   .326000   .1086000      .000      .000  
+79 620 44044.00 I  -.136226  .003956   .315703  .003754  I  .1047273  .0001084  2.4145 0.0767  P    14.079     .500    -3.828     .300  -.130000   .328000   .1064000      .000      .000  
+79 621 44045.00 I  -.135149  .003956   .318127  .003754  I  .1023839  .0001084  2.2707 0.0666  P    13.513     .500    -3.851     .300  -.129000   .330000   .1042000      .000      .000  
+79 622 44046.00 I  -.134082  .003280   .320558  .005181  I  .1001851  .0000773  2.1294 0.0666  P    12.983     .500    -3.917     .300  -.128000   .332000   .1020000      .000      .000  
+79 623 44047.00 I  -.133023  .003280   .322987  .005181  I  .0981170  .0000773  2.0124 0.0393  P    12.767     .500    -4.005     .300  -.126000   .335000   .0997000      .000      .000  
+79 624 44048.00 I  -.131967  .002422   .325406  .006292  I  .0961475  .0000140  1.9337 0.0393  P    12.865     .500    -4.084     .300  -.125000   .337000   .0975000      .000      .000  
+79 625 44049.00 I  -.130909  .002422   .327807  .006292  I  .0942354  .0000140  1.8975 0.0899  P    13.061     .500    -4.139     .300  -.124000   .339000   .0953000      .000      .000  
+79 626 44050.00 I  -.129846  .002407   .330183  .004512  I  .0923394  .0001792  1.9007 0.0899  P    13.187     .500    -4.159     .300  -.123000   .341000   .0932000      .000      .000  
+79 627 44051.00 I  -.128778  .002407   .332535  .004512  I  .0904232  .0001792  1.9364 0.1551  P    13.209     .500    -4.140     .300  -.122000   .343000   .0910000      .000      .000  
+79 628 44052.00 I  -.127706  .002392   .334862  .001059  I  .0884588  .0002531  1.9954 0.1551  P    13.114     .500    -4.110     .300  -.120000   .345000   .0889000      .000      .000  
+79 629 44053.00 I  -.126628  .002392   .337163  .001059  I  .0864284  .0002531  2.0663 0.1559  P    12.886     .500    -4.119     .300  -.119000   .347000   .0867000      .000      .000  
+79 630 44054.00 I  -.125542  .002155   .339439  .000950  I  .0843264  .0001821  2.1365 0.1559  P    12.635     .500    -4.176     .300  -.118000   .349000   .0846000      .000      .000  
+79 7 1 44055.00 I  -.124442  .002155   .341688  .000950  I  .0821596  .0001821  2.1941 0.0941  P    12.542     .500    -4.232     .300  -.117000   .351000   .0825000      .000      .000  
+79 7 2 44056.00 I  -.123326  .001888   .343909  .000826  I  .0799453  .0000477  2.2306 0.0941  P    12.554     .500    -4.237     .300  -.116000   .353000   .0805000      .000      .000  
+79 7 3 44057.00 I  -.122188  .001888   .346100  .000826  I  .0777069  .0000477  2.2417 0.0337  P    12.335     .500    -4.194     .300  -.114000   .355000   .0784000      .000      .000  
+79 7 4 44058.00 I  -.121023  .001888   .348261  .000826  I  .0754707  .0000477  2.2263 0.0337  P    11.678     .500    -4.108     .300  -.113000   .357000   .0764000      .000      .000  
+79 7 5 44059.00 I  -.119823  .001888   .350392  .000826  I  .0732628  .0000477  2.1852 0.0244  P    10.853     .500    -3.942     .300  -.112000   .359000   .0743000      .000      .000  
+79 7 6 44060.00 I  -.118580  .003037   .352492  .002178  I  .0711070  .0000099  2.1238 0.0244  P    10.345     .500    -3.697     .300  -.111000   .361000   .0723000      .000      .000  
+79 7 7 44061.00 I  -.117286  .003037   .354562  .002178  I  .0690175  .0000099  2.0555 0.0070  P    10.295     .500    -3.506     .300  -.109000   .363000   .0703000      .000      .000  
+79 7 8 44062.00 I  -.115933  .003037   .356601  .002178  I  .0669908  .0000099  2.0028 0.0070  P    10.425     .500    -3.526     .300  -.108000   .364000   .0684000      .000      .000  
+79 7 9 44063.00 I  -.114514  .003037   .358609  .002178  I  .0649984  .0000099  1.9908 0.0070  P    10.456     .500    -3.727     .300  -.106000   .366000   .0664000      .000      .000  
+79 710 44064.00 I  -.113023  .003037   .360584  .002178  I  .0629905  .0000099  2.0351 0.2899  P    10.384     .500    -3.876     .300  -.105000   .368000   .0644000      .000      .000  
+79 711 44065.00 I  -.111458  .002152   .362525  .002131  I  .0609115  .0005797  2.1296 0.4099  P    10.318     .500    -3.790     .300  -.103000   .370000   .0624000      .000      .000  
+79 712 44066.00 I  -.109817  .000193   .364427  .002082  I  .0587243  .0008197  2.2451 0.5020  P    10.231     .500    -3.546     .300  -.101000   .371000   .0605000      .000      .000  
+79 713 44067.00 I  -.108098  .000193   .366288  .002082  I  .0564281  .0008197  2.3401 0.5796  P    10.016     .500    -3.371     .300  -.100000   .373000   .0585000      .000      .000  
+79 714 44068.00 I  -.106300  .000193   .368105  .002082  I  .0540628  .0008197  2.3790 0.5796  P     9.674     .500    -3.389     .300  -.098000   .374000   .0566000      .000      .000  
+79 715 44069.00 I  -.104419  .000193   .369877  .002082  I  .0516943  .0008197  2.3452 0.5796  P     9.359     .500    -3.533     .300  -.096000   .376000   .0546000      .000      .000  
+79 716 44070.00 I  -.102454  .000193   .371605  .002082  I  .0493954  .0008197  2.2423 0.4196  P     9.234     .500    -3.688     .300  -.094000   .377000   .0527000      .000      .000  
+79 717 44071.00 I  -.100404  .005905   .373287  .005117  I  .0472259  .0001794  2.0909 0.4196  P     9.299     .500    -3.811     .300  -.092000   .379000   .0507000      .000      .000  
+79 718 44072.00 I  -.098267  .005905   .374923  .005117  I  .0452206  .0001794  1.9187 0.1269  P     9.356     .500    -3.913     .300  -.090000   .380000   .0488000      .000      .000  
+79 719 44073.00 I  -.096040  .005905   .376514  .005117  I  .0433866  .0001794  1.7523 0.1269  P     9.183     .500    -3.994     .300  -.088000   .382000   .0468000      .000      .000  
+79 720 44074.00 I  -.093725  .005905   .378060  .005117  I  .0417069  .0001794  1.6132 0.1269  P     8.783     .500    -4.049     .300  -.086000   .383000   .0449000      .000      .000  
+79 721 44075.00 I  -.091327  .005905   .379565  .005117  I  .0401465  .0001794  1.5153 0.1269  P     8.405     .500    -4.110     .300  -.084000   .384000   .0430000      .000      .000  
+79 722 44076.00 I  -.088856  .005905   .381037  .005117  I  .0386609  .0001794  1.4637 0.1190  P     8.286     .500    -4.208     .300  -.081000   .386000   .0410000      .000      .000  
+79 723 44077.00 I  -.086321  .001209   .382482  .000154  I  .0372045  .0001564  1.4560 0.1190  P     8.427     .500    -4.304     .300  -.079000   .387000   .0391000      .000      .000  
+79 724 44078.00 I  -.083733  .001209   .383905  .000154  I  .0357367  .0001564  1.4850 0.1106  P     8.660     .500    -4.293     .300  -.075990   .389000   .0371000      .000      .000  
+79 725 44079.00 I  -.081101  .001209   .385315  .000154  I  .0342253  .0001564  1.5416 0.1106  P     8.822     .500    -4.127     .300  -.074000   .390000   .0352000      .000      .000  
+79 726 44080.00 I  -.078433  .001209   .386717  .000154  I  .0326479  .0001564  1.6152 0.1106  P     8.799     .500    -3.905     .300  -.071000   .391000   .0333000      .000      .000  
+79 727 44081.00 I  -.075739  .001209   .388117  .000154  I  .0309929  .0001564  1.6950 0.1320  P     8.553     .500    -3.801     .300  -.069000   .392000   .0313990      .000      .000  
+79 728 44082.00 I  -.073026  .002451   .389522  .006269  I  .0292595  .0002128  1.7700 0.1505  P     8.225     .500    -3.882     .300  -.066000   .394000   .0294000      .000      .000  
+79 729 44083.00 I  -.070302  .003248   .390939  .008864  I  .0274579  .0002571  1.8300 0.1669  P     8.073     .500    -4.039     .300  -.064000   .395000   .0275000      .000      .000  
+79 730 44084.00 I  -.067573  .003248   .392373  .008864  I  .0256065  .0002571  1.8692 0.2934  P     8.128     .500    -4.130     .300  -.061000   .396000   .0256000      .000      .000  
+79 731 44085.00 I  -.064847  .002315   .393830  .006471  I  .0237269  .0005275  1.8863 0.2934  P     8.041     .500    -4.142     .300  -.058000   .397000   .0236000      .000      .000  
+79 8 1 44086.00 I  -.062126  .002315   .395308  .006471  I  .0218404  .0005275  1.8838 0.3730  P     7.489     .500    -4.138     .300  -.055000   .398000   .0216000      .000      .000  
+79 8 2 44087.00 I  -.059411  .002315   .396802  .006471  I  .0199639  .0005275  1.8676 0.4383  P     6.665     .500    -4.105     .300  -.053000   .400000   .0197000      .000      .000  
+79 8 3 44088.00 I  -.056703  .000406   .398306  .002277  I  .0181066  .0007002  1.8473 0.4475  P     6.111     .500    -3.972     .300  -.050000   .401000   .0177000      .000      .000  
+79 8 4 44089.00 I  -.054003  .000406   .399814  .002277  I  .0162656  .0007231  1.8379 0.5617  P     6.076     .500    -3.777     .300  -.047000   .402000   .0156990      .000      .000  
+79 8 5 44090.00 I  -.051312  .000406   .401319  .002277  I  .0144201  .0008785  1.8604 0.6357  P     6.280     .500    -3.693     .300  -.044000   .403000   .0137000      .000      .000  
+79 8 6 44091.00 I  -.048629  .003310   .402812  .002690  I  .0125271  .0010458  1.9359 0.6903  P     6.349     .500    -3.803     .300  -.041000   .404000   .0117000      .000      .000  
+79 8 7 44092.00 I  -.045956  .007342   .404284  .001414  I  .0105286  .0010651  2.0705 0.7463  P     6.239     .500    -3.963     .300  -.039000   .405000   .0096000      .000      .000  
+79 8 8 44093.00 I  -.043291  .007342   .405727  .001414  I  .0083720  .0010651  2.2473 0.7531  P     6.139     .500    -3.973     .300  -.035990   .406000   .0076000      .000      .000  
+79 8 9 44094.00 I  -.040636  .007342   .407132  .001414  I  .0060328  .0010651  2.4276 0.7798  P     6.130     .500    -3.837     .300  -.033000   .407000   .0056000      .000      .000  
+79 810 44095.00 I  -.037989  .007342   .408492  .001414  I  .0035321  .0011392  2.5620 0.7590  P     6.091     .500    -3.730     .300  -.030000   .408000   .0035000      .000      .000  
+79 811 44096.00 I  -.035345  .007342   .409799  .001414  I  .0009371  .0010817  2.6115 0.7855  P     5.853     .500    -3.731     .300  -.027000   .409000   .0015000      .000      .000  
+79 812 44097.00 I  -.032689  .007342   .411047  .001414  I -.0016589  .0010817  2.5651 0.7414  P     5.401     .500    -3.746     .300  -.025000   .409000  -.0006000      .000      .000  
+79 813 44098.00 I  -.030008  .013625   .412228  .008250  I -.0041672  .0010141  2.4411 0.7414  P     4.945     .500    -3.700     .300  -.022000   .410000  -.0026000      .000      .000  
+79 814 44099.00 I  -.027287  .013625   .413337  .008250  I -.0065267  .0010141  2.2741 0.7171  P     4.781     .500    -3.683     .300  -.018990   .411000  -.0047000      .000      .000  
+79 815 44100.00 I  -.024514  .013625   .414367  .008250  I -.0087132  .0010141  2.1006 0.7171  P     4.988     .500    -3.813     .300  -.016000   .412000  -.0068000      .000      .000  
+79 816 44101.00 I  -.021675  .013625   .415312  .008250  I -.0107356  .0010141  1.9502 0.7171  P     5.287     .500    -4.058     .300  -.013000   .413000  -.0089000      .000      .000  
+79 817 44102.00 I  -.018775  .013625   .416172  .008250  I -.0126275  .0010141  1.8416 0.7171  P     5.326     .500    -4.268     .300  -.011000   .413000  -.0110000      .000      .000  
+79 818 44103.00 I  -.015826  .013625   .416953  .008250  I -.0144346  .0010141  1.7805 0.5248  P     5.090     .500    -4.374     .300  -.008000   .414000  -.0131000      .000      .000  
+79 819 44104.00 I  -.012839  .003310   .417659  .002690  I -.0162036  .0002710  1.7647 0.5248  P     4.893     .500    -4.427     .300  -.005000   .415000  -.0152000      .000      .000  
+79 820 44105.00 I  -.009828  .003310   .418293  .002690  I -.0179767  .0002710  1.7869 0.1916  P     4.971     .500    -4.455     .300  -.002000   .416000  -.0173000      .000      .000  
+79 821 44106.00 I  -.006804  .003310   .418860  .002690  I -.0197865  .0002710  1.8365 0.1916  P     5.245     .500    -4.378     .300   .000000   .416000  -.0194000      .000      .000  
+79 822 44107.00 I  -.003779  .003310   .419365  .002690  I -.0216552  .0002710  1.9025 0.1916  P     5.486     .500    -4.127     .300   .003000   .417000  -.0215000      .000      .000  
+79 823 44108.00 I  -.000767  .003310   .419812  .002690  I -.0235931  .0002710  1.9731 0.4315  P     5.543     .500    -3.798     .300   .005000   .417000  -.0236000      .000      .000  
+79 824 44109.00 I   .002222  .007366   .420205  .003760  I -.0255994  .0008193  2.0375 0.4315  P     5.404     .500    -3.604     .300   .008000   .418000  -.0257000      .000      .000  
+79 825 44110.00 I   .005175  .007366   .420548  .003760  I -.0276627  .0008193  2.0856 0.5793  P     5.182     .500    -3.653     .300   .011000   .418000  -.0278000      .000      .000  
+79 826 44111.00 I   .008079  .007366   .420847  .003760  I -.0297624  .0008193  2.1091 0.5793  P     5.069     .500    -3.841     .300   .013000   .419000  -.0300000      .000      .000  
+79 827 44112.00 I   .010923  .007366   .421105  .003760  I -.0318720  .0008193  2.1059 0.5793  P     5.142     .500    -3.984     .300   .016000   .419000  -.0321000      .000      .000  
+79 828 44113.00 I   .013703  .007366   .421323  .003760  I -.0339667  .0008193  2.0803 0.5793  P     5.199     .500    -4.027     .300   .017990   .420000  -.0343000      .000      .000  
+79 829 44114.00 I   .016420  .007366   .421501  .003760  I -.0360279  .0008193  2.0405 0.4315  P     4.952     .500    -4.047     .300   .021000   .420000  -.0364000      .000      .000  
+79 830 44115.00 I   .019077  .003310   .421639  .002690  I -.0380466  .0002710  1.9975 0.5166  P     4.426     .500    -4.087     .300   .024000   .420000  -.0386000      .000      .000  
+79 831 44116.00 I   .021674  .003310   .421735  .002690  I -.0400268  .0006294  1.9662 0.3426  P     3.990     .500    -4.086     .300   .026000   .420000  -.0407000      .000      .000  
+79 9 1 44117.00 I   .024215  .003310   .421790  .002690  I -.0419887  .0006294  1.9641 0.4451  P     3.920     .500    -4.009     .300   .029000   .420000  -.0429000      .000      .000  
+79 9 2 44118.00 I   .026700  .003310   .421802  .002690  I -.0439715  .0006294  2.0113 0.3967  P     4.098     .500    -3.943     .300   .031000   .420000  -.0450000      .000      .000  
+79 9 3 44119.00 I   .029132  .001039   .421771  .000637  I -.0460322  .0004830  2.1210 0.3828  P     4.224     .500    -3.970     .300   .034000   .420000  -.0472000      .000      .000  
+79 9 4 44120.00 I   .031511  .001039   .421697  .000637  I -.0482331  .0004360  2.2896 0.3535  P     4.180     .500    -4.024     .300   .037000   .420000  -.0494000      .000      .000  
+79 9 5 44121.00 I   .033842  .001039   .421579  .000637  I -.0506223  .0005163  2.4909 0.3147  P     4.083     .500    -3.977     .300   .039000   .420000  -.0516000      .000      .000  
+79 9 6 44122.00 I   .036124  .001039   .421415  .000637  I -.0532098  .0004540  2.6771 0.3438  P     4.068     .500    -3.844     .300   .042000   .419000  -.0539000      .000      .000  
+79 9 7 44123.00 I   .038362  .001039   .421208  .000637  I -.0559546  .0004540  2.7978 0.3137  P     4.134     .500    -3.770     .300   .044000   .419000  -.0561000      .000      .000  
+79 9 8 44124.00 I   .040559  .001039   .420956  .000637  I -.0587727  .0004329  2.8205 0.2920  P     4.123     .500    -3.780     .300   .047000   .419000  -.0583000      .000      .000  
+79 9 9 44125.00 I   .042720  .001895   .420659  .004941  I -.0615625  .0003672  2.7438 0.2940  P     3.855     .500    -3.719     .300   .049000   .419000  -.0606000      .000      .000  
+79 910 44126.00 I   .044847  .001895   .420319  .004941  I -.0642366  .0003979  2.5961 0.2403  P     3.364     .500    -3.491     .300   .052000   .419000  -.0627990      .000      .000  
+79 911 44127.00 I   .046946  .003521   .419936  .003727  I -.0667455  .0003102  2.4210 0.2582  P     2.996     .500    -3.273     .300   .054000   .418000  -.0651000      .000      .000  
+79 912 44128.00 I   .049019  .003521   .419508  .003727  I -.0690829  .0003293  2.2589 0.2262  P     3.090     .500    -3.333     .300   .057000   .418000  -.0673000      .000      .000  
+79 913 44129.00 I   .051074  .003521   .419032  .003727  I -.0712768  .0003293  2.1372 0.2366  P     3.552     .500    -3.698     .300   .059000   .418000  -.0696000      .000      .000  
+79 914 44130.00 I   .053117  .003521   .418502  .003727  I -.0733744  .0003397  2.0668 0.3102  P     3.930     .500    -4.120     .300   .061000   .418000  -.0720000      .000      .000  
+79 915 44131.00 I   .055153  .003632   .417912  .005270  I -.0754270  .0005259  2.0462 0.3237  P     3.963     .500    -4.359     .300   .063000   .418000  -.0743000      .000      .000  
+79 916 44132.00 I   .057180  .003632   .417258  .005270  I -.0774808  .0005511  2.0676 0.4205  P     3.858     .500    -4.392     .300   .066000   .417000  -.0767000      .000      .000  
+79 917 44133.00 I   .059199  .002276   .416536  .007223  I -.0795726  .0006562  2.1202 0.3791  P     3.938     .500    -4.314     .300   .068000   .417000  -.0790000      .000      .000  
+79 918 44134.00 I   .061206  .001611   .415743  .005343  I -.0817274  .0005207  2.1915 0.4188  P     4.217     .500    -4.163     .300   .070000   .417000  -.0814000      .000      .000  
+79 919 44135.00 I   .063200  .001611   .414878  .005343  I -.0839581  .0005207  2.2703 0.3682  P     4.478     .500    -3.911     .300   .071990   .416000  -.0838000      .000      .000  
+79 920 44136.00 I   .065176  .001611   .413944  .005343  I -.0862669  .0005207  2.3458 0.3309  P     4.594     .500    -3.602     .300   .074000   .416000  -.0863000      .000      .000  
+79 921 44137.00 I   .067126  .000173   .412949  .001668  I -.0886452  .0004086  2.4079 0.3309  P     4.603     .500    -3.367     .300   .075990   .415000  -.0887000      .000      .000  
+79 922 44138.00 I   .069047  .000173   .411900  .001668  I -.0910757  .0004086  2.4489 0.2889  P     4.566     .500    -3.305     .300   .078000   .415000  -.0912000      .000      .000  
+79 923 44139.00 I   .070931  .000173   .410806  .001668  I -.0935341  .0004086  2.4632 0.2895  P     4.529     .500    -3.379     .300   .080000   .414000  -.0936000      .000      .000  
+79 924 44140.00 I   .072773  .003214   .409675  .002695  I -.0959929  .0004103  2.4499 0.2895  P     4.554     .500    -3.472     .300   .082000   .413000  -.0961000      .000      .000  
+79 925 44141.00 I   .074567  .003214   .408515  .002695  I -.0984269  .0004103  2.4156 0.3003  P     4.637     .500    -3.519     .300   .083000   .412000  -.0987000      .000      .000  
+79 926 44142.00 I   .076307  .002742   .407335  .003737  I -.1008215  .0004387  2.3734 0.2952  P     4.656     .500    -3.547     .300   .085000   .412000  -.1012000      .000      .000  
+79 927 44143.00 I   .077989  .003355   .406142  .004542  I -.1031763  .0004245  2.3391 0.3052  P     4.516     .500    -3.594     .300   .086000   .411000  -.1038000      .000      .000  
+79 928 44144.00 I   .079608  .003355   .404944  .004542  I -.1055084  .0004245  2.3308 0.3002  P     4.301     .500    -3.649     .300   .088000   .410000  -.1063000      .000      .000  
+79 929 44145.00 I   .081169  .003355   .403754  .004542  I -.1078519  .0004245  2.3645 0.2806  P     4.197     .500    -3.676     .300   .089000   .409000  -.1089000      .000      .000  
+79 930 44146.00 I   .082675  .002602   .402580  .006364  I -.1102558  .0003670  2.4532 0.2806  P     4.278     .500    -3.677     .300   .091000   .408000  -.1116000      .000      .000  
+7910 1 44147.00 I   .084132  .002602   .401428  .006364  I -.1127779  .0003670  2.6005 0.1858  P     4.464     .500    -3.653     .300   .092000   .408000  -.1142000      .000      .000  
+7910 2 44148.00 I   .085546  .002654   .400303  .005275  I -.1154722  .0000578  2.7938 0.1858  P     4.628     .500    -3.551     .300   .094000   .407000  -.1169000      .000      .000  
+7910 3 44149.00 I   .086922  .002654   .399210  .005275  I -.1183698  .0000578  3.0000 0.0409  P     4.709     .500    -3.330     .300   .095000   .406000  -.1195000      .000      .000  
+7910 4 44150.00 I   .088261  .002654   .398147  .005275  I -.1214611  .0000578  3.1727 0.0409  P     4.736     .500    -3.081     .300   .096000   .405000  -.1222000      .000      .000  
+7910 5 44151.00 I   .089562  .002654   .397110  .005275  I -.1246893  .0000578  3.2675 0.1876  P     4.787     .500    -2.976     .300   .097000   .404000  -.1249000      .000      .000  
+7910 6 44152.00 I   .090826  .002995   .396094  .001458  I -.1279624  .0003707  3.2612 0.1876  P     4.870     .500    -3.047     .300   .098000   .404000  -.1275000      .000      .000  
+7910 7 44153.00 I   .092056  .002995   .395093  .001458  I -.1311808  .0003707  3.1622 0.3034  P     4.861     .500    -3.100     .300   .099000   .403000  -.1302000      .000      .000  
+7910 8 44154.00 I   .093254  .003937   .394100  .001496  I -.1342675  .0004805  3.0054 0.2817  P     4.659     .500    -2.948     .300   .100000   .402000  -.1329000      .000      .000  
+7910 9 44155.00 I   .094421  .003937   .393111  .001496  I -.1371874  .0004242  2.8360 0.3205  P     4.418     .500    -2.693     .300   .101000   .401000  -.1356000      .000      .000  
+791010 44156.00 I   .095564  .003937   .392119  .001496  I -.1399479  .0004242  2.6916 0.2743  P     4.450     .500    -2.643     .300   .102000   .400000  -.1383000      .000      .000  
+791011 44157.00 I   .096691  .003162   .391120  .001447  I -.1425862  .0003480  2.5938 0.2187  P     4.829     .500    -2.943     .300   .103000   .400000  -.1409000      .000      .000  
+791012 44158.00 I   .097813  .002121   .390111  .001397  I -.1451529  .0001063  2.5481 0.1819  P     5.266     .500    -3.407     .300   .104000   .399000  -.1436000      .000      .000  
+791013 44159.00 I   .098939  .002121   .389088  .001397  I -.1476981  .0001063  2.5495 0.0776  P     5.486     .500    -3.723     .300   .105000   .398000  -.1463000      .000      .000  
+791014 44160.00 I   .100079  .002121   .388046  .001397  I -.1502641  .0001131  2.5875 0.0840  P     5.558     .500    -3.764     .300   .106000   .397000  -.1490000      .000      .000  
+791015 44161.00 I   .101241  .001834   .386981  .001811  I -.1528811  .0001301  2.6495 0.0862  P     5.720     .500    -3.616     .300   .107000   .396000  -.1517000      .000      .000  
+791016 44162.00 I   .102432  .001834   .385888  .001811  I -.1555665  .0001301  2.7217 0.2196  P     6.001     .500    -3.406     .300   .108000   .395000  -.1545000      .000      .000  
+791017 44163.00 I   .103656  .005483   .384759  .002324  I -.1583234  .0004194  2.7906 0.2196  P     6.238     .500    -3.179     .300   .109000   .394000  -.1572000      .000      .000  
+791018 44164.00 I   .104919  .005483   .383589  .002324  I -.1611426  .0004194  2.8443 0.2966  P     6.353     .500    -2.930     .300   .110000   .393000  -.1599000      .000      .000  
+791019 44165.00 I   .106230  .005483   .382375  .002324  I -.1640036  .0004194  2.8729 0.3108  P     6.416     .500    -2.673     .300   .111000   .392000  -.1626000      .000      .000  
+791020 44166.00 I   .107594  .005483   .381114  .002324  I -.1668783  .0004587  2.8713 0.3119  P     6.458     .500    -2.455     .300   .112000   .391000  -.1653000      .000      .000  
+791021 44167.00 I   .109010  .005398   .379805  .002210  I -.1697354  .0004618  2.8374 0.3254  P     6.423     .500    -2.328     .300   .113000   .389000  -.1681000      .000      .000  
+791022 44168.00 I   .110472  .005398   .378448  .002210  I -.1725428  .0004618  2.7727 0.3337  P     6.334     .500    -2.314     .300   .114000   .388000  -.1708000      .000      .000  
+791023 44169.00 I   .111973  .001530   .377043  .001906  I -.1752734  .0004817  2.6858 0.3337  P     6.317     .500    -2.392     .300   .115000   .387000  -.1735000      .000      .000  
+791024 44170.00 I   .113508  .001530   .375592  .001906  I -.1779123  .0004817  2.5927 0.3406  P     6.422     .500    -2.497     .300   .116000   .386000  -.1762000      .000      .000  
+791025 44171.00 I   .115071  .001530   .374096  .001906  I -.1804638  .0004817  2.5146 0.3406  P     6.533     .500    -2.569     .300   .117000   .385000  -.1790000      .000      .000  
+791026 44172.00 I   .116658  .001530   .372558  .001906  I -.1829532  .0004817  2.4715 0.3485  P     6.520     .500    -2.592     .300   .117000   .383000  -.1817000      .000      .000  
+791027 44173.00 I   .118264  .002580   .370981  .001917  I -.1854237  .0005037  2.4791 0.3485  P     6.423     .500    -2.591     .300   .118000   .382000  -.1845000      .000      .000  
+791028 44174.00 I   .119881  .002580   .369370  .001917  I -.1879304  .0005037  2.5438 0.2691  P     6.402     .500    -2.578     .300   .119000   .381000  -.1872000      .000      .000  
+791029 44175.00 I   .121499  .002312   .367730  .001860  I -.1905278  .0001894  2.6580 0.2691  P     6.568     .500    -2.513     .300   .120000   .380000  -.1899000      .000      .000  
+791030 44176.00 I   .123110  .002312   .366067  .001860  I -.1932557  .0001894  2.8001 0.1339  P     6.860     .500    -2.329     .300   .121000   .378000  -.1927000      .000      .000  
+791031 44177.00 I   .124704  .002312   .364386  .001860  I -.1961259  .0001894  2.9361 0.1339  P     7.101     .500    -2.019     .300   .121000   .377000  -.1954000      .000      .000  
+7911 1 44178.00 I   .126267  .002312   .362696  .001860  I -.1991127  .0001894  3.0267 0.1310  P     7.157     .500    -1.706     .300   .122000   .375000  -.1982000      .000      .000  
+7911 2 44179.00 I   .127786  .002905   .361002  .002850  I -.2021533  .0001811  3.0395 0.1310  P     7.065     .500    -1.576     .300   .123000   .374000  -.2009000      .000      .000  
+7911 3 44180.00 I   .129247  .002905   .359310  .002850  I -.2051622  .0001811  2.9638 0.1568  P     6.971     .500    -1.696     .300   .124000   .372000  -.2036000      .000      .000  
+7911 4 44181.00 I   .130640  .003898   .357627  .003603  I -.2080566  .0002561  2.8153 0.1285  P     6.958     .500    -1.906     .300   .125000   .370000  -.2063000      .000      .000  
+7911 5 44182.00 I   .131952  .003677   .355957  .003851  I -.2107808  .0001823  2.6308 0.1572  P     6.990     .500    -1.963     .300   .126000   .369000  -.2090000      .000      .000  
+7911 6 44183.00 I   .133174  .003677   .354305  .003851  I -.2133200  .0001823  2.4518 0.1289  P     7.040     .500    -1.814     .300   .127000   .367000  -.2117000      .000      .000  
+7911 7 44184.00 I   .134298  .003677   .352671  .003851  I -.2156970  .0001823  2.3106 0.0924  P     7.178     .500    -1.669     .300   .128000   .365000  -.2144000      .000      .000  
+7911 8 44185.00 I   .135323  .003442   .351057  .004083  I -.2179589  .0000301  2.2226 0.0924  P     7.454     .500    -1.745     .300   .128990   .363000  -.2170000      .000      .000  
+7911 9 44186.00 I   .136248  .003442   .349458  .004083  I -.2201601  .0000301  2.1883 0.0450  P     7.786     .500    -2.017     .300   .130000   .361000  -.2197000      .000      .000  
+791110 44187.00 I   .137075  .002449   .347869  .003046  I -.2223508  .0000849  2.1998 0.0600  P     8.056     .500    -2.260     .300   .131000   .358000  -.2223000      .000      .000  
+791111 44188.00 I   .137808  .000384   .346286  .001372  I -.2245710  .0001162  2.2452 0.0720  P     8.269     .500    -2.296     .300   .132000   .356000  -.2250000      .000      .000  
+791112 44189.00 I   .138446  .000384   .344704  .001372  I -.2268483  .0001162  2.3118 0.1840  P     8.495     .500    -2.148     .300   .133000   .354000  -.2276000      .000      .000  
+791113 44190.00 I   .138994  .002275   .343119  .001146  I -.2291972  .0003491  2.3861 0.1840  P     8.715     .500    -1.941     .300   .134000   .352000  -.2302000      .000      .000  
+791114 44191.00 I   .139451  .002275   .341524  .001146  I -.2316187  .0003491  2.4551 0.2469  P     8.840     .500    -1.758     .300   .135000   .350000  -.2328000      .000      .000  
+791115 44192.00 I   .139821  .002275   .339914  .001146  I -.2341023  .0003491  2.5090 0.2967  P     8.850     .500    -1.578     .300   .135000   .347000  -.2355000      .000      .000  
+791116 44193.00 I   .140103  .003195   .338282  .000863  I -.2366291  .0004799  2.5403 0.2564  P     8.811     .500    -1.341     .300   .136000   .345000  -.2381000      .000      .000  
+791117 44194.00 I   .140302  .002377   .336622  .002374  I -.2391737  .0003756  2.5441 0.3047  P     8.744     .500    -1.044     .300   .136990   .343000  -.2407000      .000      .000  
+791118 44195.00 I   .140426  .002377   .334928  .002374  I -.2417079  .0003756  2.5196 0.2103  P     8.607     .500     -.783     .300   .138000   .341000  -.2433000      .000      .000  
+791119 44196.00 I   .140482  .001435   .333196  .002297  I -.2442046  .0001892  2.4702 0.2103  P     8.429     .500     -.697     .300   .138000   .339000  -.2459000      .000      .000  
+791120 44197.00 I   .140477  .001435   .331420  .002297  I -.2466437  .0001892  2.4071 0.1261  P     8.351     .500     -.835     .300   .139000   .336000  -.2485000      .000      .000  
+791121 44198.00 I   .140419  .001435   .329595  .002297  I -.2490207  .0001669  2.3498 0.1261  P     8.464     .500    -1.080     .300   .139000   .334000  -.2511000      .000      .000  
+791122 44199.00 I   .140318  .001435   .327721  .002297  I -.2513531  .0001669  2.3218 0.0850  P     8.669     .500    -1.238     .300   .140000   .332000  -.2536990      .000      .000  
+791123 44200.00 I   .140180  .000510   .325795  .001795  I -.2536803  .0000325  2.3419 0.0873  P     8.780     .500    -1.219     .300   .140000   .330000  -.2563000      .000      .000  
+791124 44201.00 I   .140012  .000510   .323818  .001795  I -.2560557  .0000510  2.4183 0.0278  P     8.730     .500    -1.087     .300   .140000   .328000  -.2588990      .000      .000  
+791125 44202.00 I   .139821  .000184   .321787  .001899  I -.2585334  .0000451  2.5441 0.0345  P     8.640     .500     -.952     .300   .141000   .324990  -.2615000      .000      .000  
+791126 44203.00 I   .139611  .000704   .319701  .002263  I -.2611536  .0000466  2.6990 0.0319  P     8.674     .500     -.845     .300   .141000   .323000  -.2641000      .000      .000  
+791127 44204.00 I   .139390  .000704   .317562  .002263  I -.2639311  .0000452  2.8530 0.0393  P     8.863     .500     -.719     .300   .141000   .321000  -.2667000      .000      .000  
+791128 44205.00 I   .139167  .000772   .315386  .003455  I -.2668483  .0000632  2.9732 0.0388  P     9.060     .500     -.540     .300   .141000   .319000  -.2693000      .000      .000  
+791129 44206.00 I   .138953  .000772   .313192  .003455  I -.2698572  .0000632  3.0325 0.0981  P     9.075     .500     -.363     .300   .141000   .316000  -.2718000      .000      .000  
+791130 44207.00 I   .138753  .002006   .310995  .006822  I -.2728880  .0001857  3.0158 0.0981  P     8.850     .500     -.306     .300   .141000   .314000  -.2744000      .000      .000  
+7912 1 44208.00 I   .138573  .002006   .308809  .006822  I -.2758646  .0001857  2.9266 0.1813  P     8.526     .500     -.436     .300   .141000   .310990  -.2769000      .000      .000  
+7912 2 44209.00 I   .138418  .001687   .306639  .006543  I -.2787243  .0003114  2.7869 0.1813  P     8.316     .500     -.670     .300   .141000   .308990  -.2795000      .000      .000  
+7912 3 44210.00 I   .138289  .001687   .304489  .006543  I -.2814329  .0003114  2.6309 0.2203  P     8.335     .500     -.819     .300   .141000   .307000  -.2821000      .000      .000  
+7912 4 44211.00 I   .138190  .002264   .302360  .002854  I -.2839919  .0003116  2.4925 0.2203  P     8.530     .500     -.763     .300   .141000   .305000  -.2846000      .000      .000  
+7912 5 44212.00 I   .138124  .002264   .300255  .002854  I -.2864315  .0003116  2.3949 0.2119  P     8.772     .500     -.586     .300   .140000   .303000  -.2872000      .000      .000  
+7912 6 44213.00 I   .138091  .002264   .298174  .002854  I -.2887981  .0002872  2.3466 0.2051  P     8.983     .500     -.484     .300   .140000   .301000  -.2897000      .000      .000  
+7912 7 44214.00 I   .138089  .002264   .296114  .002854  I -.2911396  .0002669  2.3432 0.1763  P     9.180     .500     -.545     .300   .140000   .299000  -.2923000      .000      .000  
+7912 8 44215.00 I   .138117  .002089   .294075  .001784  I -.2934961  .0002045  2.3748 0.1681  P     9.411     .500     -.670     .300   .140000   .297000  -.2949000      .000      .000  
+7912 9 44216.00 I   .138168  .002089   .292058  .001784  I -.2958970  .0002045  2.4299 0.1655  P     9.671     .500     -.711     .300   .140000   .294990  -.2974000      .000      .000  
+791210 44217.00 I   .138238  .001369   .290066  .002530  I -.2983595  .0002603  2.4959 0.1655  P     9.884     .500     -.636     .300   .139000   .293000  -.3000000      .000      .000  
+791211 44218.00 I   .138320  .001369   .288099  .002530  I -.3008881  .0002603  2.5600 0.1894  P     9.982     .500     -.520     .300   .139000   .291000  -.3025000      .000      .000  
+791212 44219.00 I   .138410  .001369   .286159  .002530  I -.3034748  .0002751  2.6102 0.1972  P     9.963     .500     -.433     .300   .139000   .289000  -.3051000      .000      .000  
+791213 44220.00 I   .138505  .001369   .284248  .002530  I -.3061010  .0002962  2.6381 0.2368  P     9.862     .500     -.359     .300   .139000   .287000  -.3076000      .000      .000  
+791214 44221.00 I   .138603  .001227   .282368  .003533  I -.3087421  .0003856  2.6395 0.2431  P     9.698     .500     -.227     .300   .138000   .285000  -.3102000      .000      .000  
+791215 44222.00 I   .138703  .001227   .280516  .003533  I -.3113708  .0003856  2.6135 0.2269  P     9.476     .500      .004     .300   .138000   .283000  -.3127000      .000      .000  
+791216 44223.00 I   .138805  .002109   .278690  .000876  I -.3139607  .0002392  2.5624 0.2269  P     9.245     .500      .271     .300   .136990   .280990  -.3153000      .000      .000  
+791217 44224.00 I   .138909  .002109   .276887  .000876  I -.3164895  .0002392  2.4929 0.2904  P     9.098     .500      .417     .300   .136990   .279000  -.3178000      .000      .000  
+791218 44225.00 I   .139014  .002109   .275106  .000876  I -.3189447  .0005293  2.4179 0.3238  P     9.097     .500      .316     .300   .136990   .277000  -.3203000      .000      .000  
+791219 44226.00 I   .139120  .001512   .273342  .001091  I -.3213305  .0006018  2.3584 0.4007  P     9.230     .500      .024     .300   .136000   .275000  -.3229000      .000      .000  
+791220 44227.00 I   .139225  .001512   .271595  .001091  I -.3236743  .0006018  2.3374 0.4255  P     9.429     .500     -.230     .300   .136000   .273990  -.3254000      .000      .000  
+791221 44228.00 I   .139326  .001512   .269861  .001091  I -.3260234  .0006018  2.3707 0.4735  P     9.610     .500     -.242     .300   .135000   .272000  -.3280000      .000      .000  
+791222 44229.00 I   .139418  .000357   .268135  .001271  I -.3284335  .0007313  2.4576 0.4735  P     9.711     .500     -.017     .300   .135000   .270000  -.3305000      .000      .000  
+791223 44230.00 I   .139498  .000357   .266416  .001271  I -.3309502  .0007313  2.5794 0.5104  P     9.722     .500      .264     .300   .134000   .268000  -.3330000      .000      .000  
+791224 44231.00 I   .139560  .000357   .264700  .001271  I -.3335935  .0007121  2.7046 0.3989  P     9.694     .500      .434     .300   .134000   .266000  -.3355000      .000      .000  
+791225 44232.00 I   .139603  .003310   .262986  .002690  I -.3363494  .0003188  2.7996 0.3794  P     9.686     .500      .468     .300   .133000   .264000  -.3380000      .000      .000  
+791226 44233.00 I   .139621  .001759   .261273  .003757  I -.3391744  .0002620  2.8398 0.1984  P     9.689     .500      .434     .300   .133000   .262000  -.3405000      .000      .000  
+791227 44234.00 I   .139611  .001759   .259557  .003757  I -.3420076  .0002363  2.8158 0.1764  P     9.614     .500      .385     .300   .132000   .260000  -.3430000      .000      .000  
+791228 44235.00 I   .139569  .001759   .257838  .003757  I -.3447863  .0002363  2.7328 0.1666  P     9.389     .500      .313     .300   .131000   .257990  -.3455000      .000      .000  
+791229 44236.00 I   .139492  .001759   .256114  .003757  I -.3474594  .0002349  2.6083 0.1666  P     9.058     .500      .190     .300   .131000   .256000  -.3480000      .000      .000  
+791230 44237.00 I   .139373  .001759   .254387  .003757  I -.3499978  .0002349  2.4684 0.1398  P     8.791     .500      .041     .300   .130000   .255000  -.3506000      .000      .000  
+791231 44238.00 I   .139205  .002692   .252659  .002880  I -.3524007  .0001516  2.3421 0.1471  P     8.751     .500     -.051     .300   .130000   .253000  -.3531000      .000      .000  
+80 1 1 44239.00 I   .138980  .003377   .250935  .001572  I  .6453058  .0001770  2.2525 0.1299  P     8.940     .500     -.017     .300   .128990   .250990   .6444000      .000      .000  
+80 1 2 44240.00 I   .138693  .003377   .249216  .001572  I  .6430784  .0002110  2.2106 0.1797  P     9.190     .500      .106     .300   .128000   .249000   .6419000      .000      .000  
+80 1 3 44241.00 I   .138335  .003377   .247506  .001572  I  .6408691  .0003129  2.2154 0.1982  P     9.345     .500      .200     .300   .127000   .247000   .6394000      .000      .000  
+80 1 4 44242.00 I   .137902  .003377   .245807  .001572  I  .6386352  .0003355  2.2576 0.2294  P     9.427     .500      .185     .300   .127000   .246000   .6368000      .000      .000  
+80 1 5 44243.00 I   .137395  .003377   .244120  .001572  I  .6363457  .0003355  2.3246 0.2104  P     9.562     .500      .103     .300   .126000   .244000   .6343000      .000      .000  
+80 1 6 44244.00 I   .136811  .005031   .242446  .000749  I  .6339818  .0002540  2.4042 0.2104  P     9.761     .500      .041     .300   .125000   .242000   .6318000      .000      .000  
+80 1 7 44245.00 I   .136151  .005031   .240786  .000749  I  .6315374  .0002540  2.4836 0.1796  P     9.887     .500      .030     .300   .124000   .240000   .6293000      .000      .000  
+80 1 8 44246.00 I   .135413  .005031   .239142  .000749  I  .6290184  .0002540  2.5516 0.1793  P     9.853     .500      .029     .300   .123000   .239000   .6267000      .000      .000  
+80 1 9 44247.00 I   .134598  .003779   .237513  .001582  I  .6264412  .0002531  2.5988 0.1691  P     9.728     .500      .005     .300   .122000   .237000   .6242000      .000      .000  
+80 110 44248.00 I   .133709  .003779   .235902  .001582  I  .6238294  .0002232  2.6204 0.1687  P     9.586     .500     -.031     .300   .121000   .236000   .6216000      .000      .000  
+80 111 44249.00 I   .132757  .003779   .234310  .001582  I  .6212086  .0002232  2.6173 0.1867  P     9.381     .500     -.038     .300   .120000   .234000   .6191000      .000      .000  
+80 112 44250.00 I   .131748  .001806   .232740  .002108  I  .6186020  .0002993  2.5926 0.1714  P     9.088     .500      .037     .300   .119000   .232000   .6166000      .000      .000  
+80 113 44251.00 I   .130692  .001323   .231191  .001528  I  .6160289  .0002601  2.5513 0.1983  P     8.847     .500      .223     .300   .118000   .231000   .6141000      .000      .000  
+80 114 44252.00 I   .129593  .001323   .229665  .001528  I  .6135018  .0002601  2.5026 0.1474  P     8.811     .500      .449     .300   .116000   .229000   .6115000      .000      .000  
+80 115 44253.00 I   .128457  .002049   .228159  .000338  I  .6110210  .0001389  2.4619 0.1521  P     8.917     .500      .539     .300   .115000   .228000   .6090000      .000      .000  
+80 116 44254.00 I   .127290  .002049   .226672  .000338  I  .6085683  .0001579  2.4503 0.1051  P     8.977     .500      .376     .300   .114000   .226000   .6065000      .000      .000  
+80 117 44255.00 I   .126096  .002049   .225205  .000338  I  .6061039  .0001579  2.4882 0.1117  P     8.964     .500      .074     .300   .113000   .224000   .6040000      .000      .000  
+80 118 44256.00 I   .124881  .002049   .223755  .000338  I  .6035730  .0001579  2.5829 0.2100  P     9.054     .500     -.093     .300   .111000   .223000   .6015000      .000      .000  
+80 119 44257.00 I   .123646  .003572   .222321  .000859  I  .6009239  .0003892  2.7203 0.2100  P     9.340     .500      .037     .300   .110000   .221000   .5989000      .000      .000  
+80 120 44258.00 I   .122392  .003572   .220902  .000859  I  .5981297  .0003892  2.8658 0.3292  P     9.674     .500      .347     .300   .108000   .220000   .5964000      .000      .000  
+80 121 44259.00 I   .121118  .004167   .219496  .001213  I  .5952043  .0005311  2.9755 0.2738  P     9.832     .500      .585     .300   .107000   .218000   .5939000      .000      .000  
+80 122 44260.00 I   .119821  .003819   .218103  .001099  I  .5922023  .0003852  3.0145 0.3027  P     9.750     .500      .620     .300   .106000   .216000   .5914000      .000      .000  
+80 123 44261.00 I   .118501  .003819   .216720  .001099  I  .5892033  .0002905  2.9693 0.2374  P     9.532     .500      .504     .300   .104000   .215000   .5889000      .000      .000  
+80 124 44262.00 I   .117150  .003819   .215348  .001099  I  .5862886  .0002777  2.8492 0.1871  P     9.301     .500      .348     .300   .103000   .213000   .5863000      .000      .000  
+80 125 44263.00 I   .115758  .003435   .213987  .000970  I  .5835214  .0002360  2.6796 0.1786  P     9.107     .500      .196     .300   .101000   .212000   .5838000      .000      .000  
+80 126 44264.00 I   .114323  .003435   .212638  .000970  I  .5809352  .0002247  2.4926 0.1571  P     8.949     .500      .046     .300   .100000   .210000   .5813000      .000      .000  
+80 127 44265.00 I   .112841  .002468   .211304  .001808  I  .5785319  .0002074  2.3185 0.1574  P     8.845     .500     -.083     .300   .099000   .209000   .5788000      .000      .000  
+80 128 44266.00 I   .111310  .000614   .209984  .002365  I  .5762861  .0002206  2.1806 0.1663  P     8.849     .500     -.149     .300   .097000   .207000   .5764000      .000      .000  
+80 129 44267.00 I   .109728  .000614   .208682  .002365  I  .5741545  .0002601  2.0915 0.1617  P     8.993     .500     -.145     .300   .096000   .206000   .5739000      .000      .000  
+80 130 44268.00 I   .108092  .004099   .207398  .002045  I  .5720865  .0002364  2.0524 0.1392  P     9.205     .500     -.124     .300   .094000   .204000   .5715000      .000      .000  
+80 131 44269.00 I   .106402  .004099   .206132  .002045  I  .5700354  .0000992  2.0561 0.1366  P     9.365     .500     -.147     .300   .093000   .203000   .5690000      .000      .000  
+80 2 1 44270.00 I   .104655  .004099   .204884  .002045  I  .5679641  .0001369  2.0903 0.1554  P     9.447     .500     -.215     .300   .092000   .202000   .5665000      .000      .000  
+80 2 2 44271.00 I   .102851  .005765   .203651  .001665  I  .5658492  .0002945  2.1415 0.1471  P     9.533     .500     -.280     .300   .090000   .201000   .5641000      .000      .000  
+80 2 3 44272.00 I   .100993  .005130   .202433  .001274  I  .5636796  .0002604  2.1974 0.1912  P     9.645     .500     -.312     .300   .089000   .199000   .5616000      .000      .000  
+80 2 4 44273.00 I   .099091  .005130   .201231  .001274  I  .5614565  .0002440  2.2469 0.1956  P     9.674     .500     -.344     .300   .087000   .198000   .5592000      .000      .000  
+80 2 5 44274.00 I   .097155  .004404   .200045  .000689  I  .5591909  .0002919  2.2809 0.1751  P     9.553     .500     -.413     .300   .086000   .197000   .5567000      .000      .000  
+80 2 6 44275.00 I   .095195  .003150   .198875  .000981  I  .5569018  .0002511  2.2934 0.1929  P     9.380     .500     -.508     .300   .085000   .196000   .5543000      .000      .000  
+80 2 7 44276.00 I   .093226  .003150   .197723  .000981  I  .5546116  .0002522  2.2834 0.1433  P     9.239     .500     -.605     .300   .084000   .195000   .5519000      .000      .000  
+80 2 8 44277.00 I   .091266  .003150   .196591  .000981  I  .5523411  .0001381  2.2550 0.2027  P     9.059     .500     -.706     .300   .083000   .193000   .5494000      .000      .000  
+80 2 9 44278.00 I   .089333  .008667   .195479  .001230  I  .5501051  .0003175  2.2160 0.1876  P     8.803     .500     -.787     .300   .082000   .192000   .5470000      .000      .000  
+80 210 44279.00 I   .087446  .008667   .194388  .001230  I  .5479092  .0003489  2.1766 0.2488  P     8.657     .500     -.748     .300   .081000   .191000   .5446000      .000      .000  
+80 211 44280.00 I   .085620  .007085   .193319  .001032  I  .5457478  .0003831  2.1494 0.3863  P     8.806     .500     -.528     .300   .080000   .190000   .5422000      .000      .000  
+80 212 44281.00 I   .083873  .008664   .192271  .000934  I  .5436007  .0006894  2.1513 0.3943  P     9.070     .500     -.271     .300   .079000   .189000   .5397000      .000      .000  
+80 213 44282.00 I   .082218  .008664   .191244  .000934  I  .5414283  .0006894  2.2039 0.4875  P     9.070     .500     -.245     .300   .079000   .188000   .5373000      .000      .000  
+80 214 44283.00 I   .080651  .008664   .190240  .000934  I  .5391704  .0006894  2.3241 0.5040  P     8.773     .500     -.538     .300   .078000   .187000   .5348000      .000      .000  
+80 215 44284.00 I   .079166  .000589   .189260  .000412  I  .5367591  .0007355  2.5074 0.5040  P     8.600     .500     -.902     .300   .077000   .186000   .5324000      .000      .000  
+80 216 44285.00 I   .077756  .000589   .188305  .000412  I  .5341446  .0007355  2.7237 0.5100  P     8.907     .500    -1.017     .300   .075990   .185000   .5300000      .000      .000  
+80 217 44286.00 I   .076414  .000053   .187376  .001721  I  .5313165  .0007068  2.9257 0.3822  P     9.531     .500     -.834     .300   .075000   .184000   .5276000      .000      .000  
+80 218 44287.00 I   .075131  .000053   .186474  .001721  I  .5283146  .0002082  3.0635 0.3684  P     9.988     .500     -.589     .300   .075000   .184000   .5251000      .000      .000  
+80 219 44288.00 I   .073900  .000053   .185601  .001721  I  .5252221  .0002082  3.1034 0.1693  P     9.984     .500     -.494     .300   .074000   .183000   .5227000      .000      .000  
+80 220 44289.00 I   .072715  .000611   .184756  .001318  I  .5221418  .0002671  3.0412 0.1627  P     9.620     .500     -.546     .300   .073000   .182000   .5202990      .000      .000  
+80 221 44290.00 I   .071567  .000611   .183944  .001318  I  .5191657  .0002501  2.9011 0.1843  P     9.213     .500     -.653     .300   .071990   .181000   .5179000      .000      .000  
+80 222 44291.00 I   .070449  .000611   .183165  .001318  I  .5163523  .0002541  2.7231 0.1788  P     9.023     .500     -.799     .300   .071000   .180000   .5155000      .000      .000  
+80 223 44292.00 I   .069354  .000863   .182425  .000714  I  .5137186  .0002557  2.5479 0.1843  P     9.088     .500    -1.012     .300   .071000   .180000   .5130000      .000      .000  
+80 224 44293.00 I   .068273  .000614   .181726  .001319  I  .5112459  .0002669  2.4044 0.1848  P     9.253     .500    -1.247     .300   .070000   .179000   .5105990      .000      .000  
+80 225 44294.00 I   .067199  .000614   .181072  .001319  I  .5088943  .0002669  2.3073 0.1808  P     9.363     .500    -1.406     .300   .069000   .178000   .5082000      .000      .000  
+80 226 44295.00 I   .066122  .000099   .180469  .001723  I  .5066145  .0002439  2.2604 0.2011  P     9.428     .500    -1.462     .300   .068000   .177000   .5058000      .000      .000  
+80 227 44296.00 I   .065033  .002118   .179919  .001673  I  .5043588  .0003008  2.2575 0.2012  P     9.567     .500    -1.485     .300   .067000   .177000   .5034000      .000      .000  
+80 228 44297.00 I   .063923  .002118   .179427  .001673  I  .5020888  .0003201  2.2868 0.2254  P     9.807     .500    -1.531     .300   .067000   .176000   .5010000      .000      .000  
+80 229 44298.00 I   .062782  .002118   .178993  .001673  I  .4997791  .0003359  2.3343 0.2170  P    10.059     .500    -1.561     .300   .066000   .176000   .4986000      .000      .000  
+80 3 1 44299.00 I   .061603  .002628   .178619  .002590  I  .4974185  .0002932  2.3868 0.2229  P    10.245     .500    -1.512     .300   .065000   .175000   .4962000      .000      .000  
+80 3 2 44300.00 I   .060380  .002628   .178307  .002590  I  .4950075  .0002932  2.4334 0.2101  P    10.341     .500    -1.411     .300   .064000   .175000   .4938000      .000      .000  
+80 3 3 44301.00 I   .059110  .002628   .178054  .002590  I  .4925570  .0003011  2.4642 0.2117  P    10.322     .500    -1.368     .300   .063000   .175000   .4913000      .000      .000  
+80 3 4 44302.00 I   .057789  .002398   .177863  .002360  I  .4900871  .0003054  2.4712 0.2144  P    10.183     .500    -1.438     .300   .062000   .175000   .4889000      .000      .000  
+80 3 5 44303.00 I   .056416  .002398   .177730  .002360  I  .4876240  .0003054  2.4501 0.2160  P    10.003     .500    -1.566     .300   .061000   .175000   .4864000      .000      .000  
+80 3 6 44304.00 I   .054990  .002398   .177653  .002360  I  .4851957  .0003054  2.4025 0.2769  P     9.859     .500    -1.683     .300   .060000   .175000   .4840000      .000      .000  
+80 3 7 44305.00 I   .053512  .002132   .177625  .002369  I  .4828251  .0004620  2.3367 0.2769  P     9.709     .500    -1.805     .300   .059000   .175000   .4815000      .000      .000  
+80 3 8 44306.00 I   .051987  .002132   .177643  .002369  I  .4805241  .0004620  2.2657 0.3389  P     9.529     .500    -1.967     .300   .057000   .175000   .4790000      .000      .000  
+80 3 9 44307.00 I   .050421  .002132   .177702  .002369  I  .4782909  .0004960  2.2033 0.3425  P     9.501     .500    -2.083     .300   .056000   .176000   .4766000      .000      .000  
+80 310 44308.00 I   .048818  .001193   .177795  .002528  I  .4761094  .0005057  2.1652 0.3542  P     9.821     .500    -2.009     .300   .054000   .176000   .4741000      .000      .000  
+80 311 44309.00 I   .047184  .001193   .177919  .002528  I  .4739461  .0005057  2.1703 0.3576  P    10.311     .500    -1.778     .300   .053000   .176000   .4716000      .000      .000  
+80 312 44310.00 I   .045521  .001193   .178073  .002528  I  .4717485  .0005057  2.2364 0.3351  P    10.511     .500    -1.652     .300   .052000   .176000   .4691000      .000      .000  
+80 313 44311.00 I   .043833  .000463   .178255  .001422  I  .4694499  .0004397  2.3726 0.3351  P    10.260     .500    -1.839     .300   .050000   .177000   .4666000      .000      .000  
+80 314 44312.00 I   .042121  .000463   .178468  .001422  I  .4669834  .0004397  2.5685 0.3109  P     9.959     .500    -2.210     .300   .049000   .177000   .4641000      .000      .000  
+80 315 44313.00 I   .040391  .000463   .178710  .001422  I  .4643042  .0004397  2.7904 0.3098  P    10.086     .500    -2.436     .300   .047000   .178000   .4616000      .000      .000  
+80 316 44314.00 I   .038646  .001144   .178983  .001158  I  .4614115  .0004365  2.9856 0.3098  P    10.612     .500    -2.372     .300   .046000   .178000   .4591000      .000      .000  
+80 317 44315.00 I   .036890  .001144   .179286  .001158  I  .4583594  .0004365  3.1018 0.3199  P    11.062     .500    -2.187     .300   .044000   .179000   .4566000      .000      .000  
+80 318 44316.00 I   .035126  .001327   .179618  .000964  I  .4552437  .0004678  3.1108 0.3196  P    11.045     .500    -2.093     .300   .042000   .179000   .4541000      .000      .000  
+80 319 44317.00 I   .033358  .001622   .179979  .000571  I  .4521716  .0004669  3.0185 0.3305  P    10.598     .500    -2.105     .300   .041000   .180000   .4515000      .000      .000  
+80 320 44318.00 I   .031588  .001622   .180365  .000571  I  .4492286  .0004669  2.8605 0.3301  P    10.098     .500    -2.141     .300   .039000   .180000   .4490000      .000      .000  
+80 321 44319.00 I   .029816  .001622   .180776  .000571  I  .4464563  .0004669  2.6855 0.3097  P     9.936     .500    -2.226     .300   .037000   .181000   .4465000      .000      .000  
+80 322 44320.00 I   .028044  .001737   .181209  .000946  I  .4438491  .0004069  2.5361 0.3097  P    10.203     .500    -2.450     .300   .035000   .182000   .4439000      .000      .000  
+80 323 44321.00 I   .026277  .001737   .181661  .000946  I  .4413673  .0004069  2.4373 0.2352  P    10.612     .500    -2.780     .300   .033000   .182000   .4413000      .000      .000  
+80 324 44322.00 I   .024517  .001836   .182131  .001299  I  .4389552  .0002361  2.3965 0.2421  P    10.790     .500    -3.045     .300   .032000   .183000   .4388000      .000      .000  
+80 325 44323.00 I   .022769  .002040   .182616  .001004  I  .4365571  .0002624  2.4074 0.1765  P    10.696     .500    -3.135     .300   .030000   .183000   .4362000      .000      .000  
+80 326 44324.00 I   .021032  .002040   .183114  .001004  I  .4341277  .0002624  2.4566 0.1829  P    10.646     .500    -3.102     .300   .028000   .184000   .4336000      .000      .000  
+80 327 44325.00 I   .019308  .002851   .183625  .001550  I  .4316361  .0002549  2.5292 0.1860  P    10.888     .500    -3.033     .300   .026000   .185000   .4310000      .000      .000  
+80 328 44326.00 I   .017596  .003241   .184149  .001661  I  .4290667  .0002638  2.6095 0.1834  P    11.307     .500    -2.922     .300   .024000   .186000   .4284000      .000      .000  
+80 329 44327.00 I   .015900  .003241   .184683  .001661  I  .4264192  .0002638  2.6834 0.1865  P    11.621     .500    -2.720     .300   .021000   .186000   .4258000      .000      .000  
+80 330 44328.00 I   .014225  .003241   .185227  .001661  I  .4237058  .0002638  2.7396 0.2025  P    11.707     .500    -2.479     .300   .018990   .187000   .4232000      .000      .000  
+80 331 44329.00 I   .012573  .002856   .185779  .001611  I  .4209487  .0003074  2.7698 0.2025  P    11.627     .500    -2.341     .300   .017000   .188000   .4206000      .000      .000  
+80 4 1 44330.00 I   .010942  .002856   .186341  .001611  I  .4181764  .0003074  2.7693 0.2349  P    11.467     .500    -2.383     .300   .014000   .189000   .4180000      .000      .000  
+80 4 2 44331.00 I   .009330  .000378   .186913  .000975  I  .4154210  .0003552  2.7362 0.2349  P    11.284     .500    -2.532     .300   .012000   .190000   .4154000      .000      .000  
+80 4 3 44332.00 I   .007732  .000378   .187499  .000975  I  .4127132  .0003552  2.6754 0.2468  P    11.125     .500    -2.677     .300   .008990   .191000   .4127000      .000      .000  
+80 4 4 44333.00 I   .006145  .000378   .188098  .000975  I  .4100757  .0003428  2.5979 0.2468  P    10.989     .500    -2.801     .300   .007000   .192000   .4101000      .000      .000  
+80 4 5 44334.00 I   .004564  .000378   .188713  .000975  I  .4075181  .0003428  2.5183 0.2629  P    10.859     .500    -2.962     .300   .004000   .193000   .4075000      .000      .000  
+80 4 6 44335.00 I   .002985  .000116   .189344  .001015  I  .4050339  .0003987  2.4542 0.2629  P    10.829     .500    -3.143     .300   .002000   .194000   .4049000      .000      .000  
+80 4 7 44336.00 I   .001404  .000116   .189993  .001015  I  .4025986  .0003987  2.4232 0.2630  P    11.067     .500    -3.227     .300   .000000   .195000   .4022000      .000      .000  
+80 4 8 44337.00 I  -.000184  .003244   .190657  .000441  I  .4001715  .0003431  2.4401 0.2630  P    11.551     .500    -3.157     .300  -.003000   .196000   .3996000      .000      .000  
+80 4 9 44338.00 I  -.001784  .003244   .191338  .000441  I  .3976986  .0003431  2.5164 0.2470  P    11.991     .500    -3.051     .300  -.005000   .197000   .3969000      .000      .000  
+80 410 44339.00 I  -.003399  .003244   .192036  .000441  I  .3951184  .0003555  2.6537 0.2470  P    12.138     .500    -3.067     .300  -.007000   .198000   .3943000      .000      .000  
+80 411 44340.00 I  -.005035  .003244   .192749  .000441  I  .3923766  .0003555  2.8348 0.1860  P    12.078     .500    -3.185     .300  -.008990   .199000   .3916000      .000      .000  
+80 412 44341.00 I  -.006693  .003553   .193480  .000840  I  .3894468  .0001094  3.0217 0.1860  P    12.069     .500    -3.228     .300  -.011000   .200000   .3889000      .000      .000  
+80 413 44342.00 I  -.008371  .003553   .194228  .000840  I  .3863481  .0001094  3.1638 0.0630  P    12.169     .500    -3.123     .300  -.012000   .202000   .3863000      .000      .000  
+80 414 44343.00 I  -.010064  .002050   .194996  .001089  I  .3831491  .0000624  3.2162 0.0627  P    12.176     .500    -3.007     .300  -.014000   .203000   .3836000      .000      .000  
+80 415 44344.00 I  -.011767  .002405   .195783  .000950  I  .3799519  .0000613  3.1599 0.0437  P    11.904     .500    -3.031     .300  -.016000   .204000   .3809000      .000      .000  
+80 416 44345.00 I  -.013473  .002405   .196591  .000950  I  .3768602  .0000613  3.0107 0.1356  P    11.408     .500    -3.148     .300  -.017990   .205000   .3782000      .000      .000  
+80 417 44346.00 I  -.015173  .002923   .197424  .002939  I  .3739470  .0002642  2.8119 0.1632  P    10.976     .500    -3.216     .300  -.018990   .206000   .3756000      .000      .000  
+80 418 44347.00 I  -.016861  .003274   .198283  .003516  I  .3712357  .0003205  2.6154 0.2077  P    10.925     .500    -3.240     .300  -.021000   .208000   .3729000      .000      .000  
+80 419 44348.00 I  -.018531  .003274   .199172  .003516  I  .3687020  .0003205  2.4617 0.2070  P    11.322     .500    -3.367     .300  -.022000   .209000   .3703000      .000      .000  
+80 420 44349.00 I  -.020180  .003395   .200093  .003038  I  .3662917  .0002621  2.3699 0.2258  P    11.839     .500    -3.647     .300  -.024000   .210000   .3676000      .000      .000  
+80 421 44350.00 I  -.021803  .003688   .201050  .003679  I  .3639420  .0003181  2.3389 0.2061  P    12.018     .500    -3.925     .300  -.025000   .211000   .3650000      .000      .000  
+80 422 44351.00 I  -.023391  .003688   .202038  .003679  I  .3615979  .0003181  2.3561 0.2047  P    11.772     .500    -4.027     .300  -.027000   .213000   .3623000      .000      .000  
+80 423 44352.00 I  -.024933  .003606   .203054  .002158  I  .3592189  .0002576  2.4060 0.2047  P    11.503     .500    -3.946     .300  -.028000   .214000   .3597000      .000      .000  
+80 424 44353.00 I  -.026421  .003606   .204098  .002158  I  .3567803  .0002576  2.4727 0.1822  P    11.610     .500    -3.787     .300  -.030000   .216000   .3570000      .000      .000  
+80 425 44354.00 I  -.027852  .003606   .205166  .002158  I  .3542727  .0002576  2.5417 0.2268  P    12.018     .500    -3.604     .300  -.031000   .217000   .3544000      .000      .000  
+80 426 44355.00 I  -.029222  .003588   .206260  .002519  I  .3517004  .0003733  2.6001 0.2268  P    12.332     .500    -3.379     .300  -.032000   .218000   .3518000      .000      .000  
+80 427 44356.00 I  -.030530  .003588   .207376  .002519  I  .3490794  .0003733  2.6376 0.2640  P    12.341     .500    -3.135     .300  -.033000   .220000   .3492000      .000      .000  
+80 428 44357.00 I  -.031780  .003588   .208512  .002519  I  .3464344  .0003733  2.6474 0.2186  P    12.156     .500    -2.967     .300  -.035000   .221000   .3465000      .000      .000  
+80 429 44358.00 I  -.032974  .000383   .209662  .001127  I  .3437946  .0002276  2.6273 0.2186  P    11.947     .500    -2.950     .300  -.035990   .223000   .3439000      .000      .000  
+80 430 44359.00 I  -.034117  .000383   .210823  .001127  I  .3411890  .0002276  2.5795 0.1609  P    11.769     .500    -3.060     .300  -.037000   .224000   .3413000      .000      .000  
+80 5 1 44360.00 I  -.035211  .000383   .211990  .001127  I  .3386427  .0002276  2.5105 0.1207  P    11.635     .500    -3.213     .300  -.037990   .225000   .3387000      .000      .000  
+80 5 2 44361.00 I  -.036260  .000383   .213160  .001127  I  .3361710  .0000802  2.4327 0.1896  P    11.567     .500    -3.356     .300  -.039000   .226000   .3362000      .000      .000  
+80 5 3 44362.00 I  -.037268  .000710   .214328  .001256  I  .3337745  .0003033  2.3633 0.1569  P    11.534     .500    -3.489     .300  -.040000   .228000   .3336000      .000      .000  
+80 5 4 44363.00 I  -.038237  .000710   .215493  .001256  I  .3314354  .0003033  2.3209 0.2468  P    11.476     .500    -3.617     .300  -.041000   .229000   .3311000      .000      .000  
+80 5 5 44364.00 I  -.039170  .000929   .216651  .001372  I  .3291184  .0003893  2.3215 0.2247  P    11.438     .500    -3.710     .300  -.042000   .230000   .3285000      .000      .000  
+80 5 6 44365.00 I  -.040070  .002420   .217799  .001039  I  .3267747  .0003316  2.3753 0.2557  P    11.552     .500    -3.734     .300  -.043000   .231000   .3260000      .000      .000  
+80 5 7 44366.00 I  -.040940  .002420   .218938  .001039  I  .3243499  .0003316  2.4829 0.2675  P    11.871     .500    -3.689     .300  -.044000   .232000   .3235000      .000      .000  
+80 5 8 44367.00 I  -.041786  .002115   .220064  .000854  I  .3217946  .0004199  2.6335 0.2757  P    12.282     .500    -3.599     .300  -.044000   .234000   .3210000      .000      .000  
+80 5 9 44368.00 I  -.042610  .002505   .221179  .000392  I  .3190770  .0004406  2.8018 0.3043  P    12.601     .500    -3.453     .300  -.045000   .235000   .3185000      .000      .000  
+80 510 44369.00 I  -.043412  .002505   .222281  .000392  I  .3161979  .0004406  2.9492 0.2980  P    12.684     .500    -3.232     .300  -.046000   .236000   .3160000      .000      .000  
+80 511 44370.00 I  -.044191  .002781   .223371  .000980  I  .3131995  .0004013  3.0338 0.3204  P    12.464     .500    -3.001     .300  -.047000   .237000   .3135000      .000      .000  
+80 512 44371.00 I  -.044944  .002485   .224447  .001141  I  .3101614  .0004652  3.0253 0.3072  P    11.970     .500    -2.918     .300  -.047000   .238000   .3111000      .000      .000  
+80 513 44372.00 I  -.045667  .002485   .225511  .001141  I  .3071817  .0004652  2.9186 0.2686  P    11.347     .500    -3.075     .300  -.048000   .240000   .3086000      .000      .000  
+80 514 44373.00 I  -.046356  .002451   .226563  .001650  I  .3043487  .0002685  2.7383 0.2686  P    10.806     .500    -3.353     .300  -.048000   .241000   .3062000      .000      .000  
+80 515 44374.00 I  -.047008  .002451   .227603  .001650  I  .3017146  .0002685  2.5295 0.1899  P    10.542     .500    -3.528     .300  -.049000   .242000   .3037000      .000      .000  
+80 516 44375.00 I  -.047627  .002451   .228634  .001650  I  .2992833  .0002685  2.3399 0.1743  P    10.660     .500    -3.527     .300  -.050000   .243000   .3014000      .000      .000  
+80 517 44376.00 I  -.048213  .001173   .229657  .001694  I  .2970177  .0002223  2.2016 0.1556  P    11.099     .500    -3.498     .300  -.050000   .244000   .2990000      .000      .000  
+80 518 44377.00 I  -.048768  .001357   .230674  .001407  I  .2948597  .0001572  2.1246 0.1361  P    11.564     .500    -3.596     .300  -.051000   .245000   .2967000      .000      .000  
+80 519 44378.00 I  -.049291  .001357   .231685  .001407  I  .2927505  .0001572  2.1018 0.0803  P    11.695     .500    -3.784     .300  -.051000   .246000   .2943000      .000      .000  
+80 520 44379.00 I  -.049783  .001641   .232689  .001000  I  .2906432  .0000329  2.1179 0.0803  P    11.414     .500    -3.897     .300  -.052000   .247000   .2920000      .000      .000  
+80 521 44380.00 I  -.050242  .001641   .233687  .001000  I  .2885074  .0000329  2.1559 0.0233  P    11.044     .500    -3.859     .300  -.052000   .248000   .2897000      .000      .000  
+80 522 44381.00 I  -.050670  .001641   .234679  .001000  I  .2863292  .0000329  2.2004 0.0447  P    10.958     .500    -3.738     .300  -.052000   .249000   .2874000      .000      .000  
+80 523 44382.00 I  -.051071  .001641   .235667  .001000  I  .2841089  .0000832  2.2380 0.0860  P    11.144     .500    -3.616     .300  -.053000   .250000   .2852000      .000      .000  
+80 524 44383.00 I  -.051448  .001657   .236653  .000683  I  .2818591  .0001688  2.2579 0.0941  P    11.281     .500    -3.499     .300  -.053000   .250990   .2829000      .000      .000  
+80 525 44384.00 I  -.051806  .001657   .237638  .000683  I  .2796014  .0001688  2.2529 0.1186  P    11.158     .500    -3.354     .300  -.053000   .252000   .2806000      .000      .000  
+80 526 44385.00 I  -.052152  .003978   .238627  .000900  I  .2773624  .0001667  2.2206 0.1186  P    10.860     .500    -3.186     .300  -.053000   .253000   .2784000      .000      .000  
+80 527 44386.00 I  -.052492  .003978   .239621  .000900  I  .2751687  .0001667  2.1628 0.1179  P    10.559     .500    -3.045     .300  -.053000   .254000   .2762000      .000      .000  
+80 528 44387.00 I  -.052829  .003978   .240622  .000900  I  .2730435  .0001667  2.0849 0.1167  P    10.331     .500    -2.990     .300  -.054000   .255000   .2741000      .000      .000  
+80 529 44388.00 I  -.053166  .003978   .241634  .000900  I  .2710025  .0001635  1.9961 0.1250  P    10.201     .500    -3.048     .300  -.054000   .256000   .2719000      .000      .000  
+80 530 44389.00 I  -.053503  .004237   .242657  .001801  I  .2690501  .0001863  1.9107 0.1239  P    10.206     .500    -3.188     .300  -.054000   .257000   .2697000      .000      .000  
+80 531 44390.00 I  -.053835  .004237   .243694  .001801  I  .2671735  .0001863  1.8479 0.1851  P    10.305     .500    -3.328     .300  -.054000   .257990   .2676000      .000      .000  
+80 6 1 44391.00 I  -.054155  .002580   .244745  .002210  I  .2653405  .0003200  1.8264 0.1609  P    10.330     .500    -3.394     .300  -.054000   .259000   .2655000      .000      .000  
+80 6 2 44392.00 I  -.054454  .002290   .245810  .001568  I  .2635027  .0002624  1.8589 0.2069  P    10.163     .500    -3.384     .300  -.054000   .260000   .2634000      .000      .000  
+80 6 3 44393.00 I  -.054729  .002290   .246888  .001568  I  .2616043  .0002624  1.9465 0.1695  P     9.916     .500    -3.348     .300  -.054000   .261000   .2613000      .000      .000  
+80 6 4 44394.00 I  -.054978  .002256   .247978  .001657  I  .2595953  .0002145  2.0772 0.1634  P     9.844     .500    -3.314     .300  -.054000   .262000   .2592000      .000      .000  
+80 6 5 44395.00 I  -.055198  .002074   .249076  .001294  I  .2574431  .0001947  2.2282 0.1448  P    10.078     .500    -3.245     .300  -.054000   .263000   .2572000      .000      .000  
+80 6 6 44396.00 I  -.055390  .002074   .250181  .001294  I  .2551422  .0001947  2.3692 0.1125  P    10.469     .500    -3.083     .300  -.054000   .264000   .2551000      .000      .000  
+80 6 7 44397.00 I  -.055555  .002074   .251291  .001294  I  .2527187  .0001129  2.4681 0.1774  P    10.684     .500    -2.835     .300  -.054000   .264000   .2531000      .000      .000  
+80 6 8 44398.00 I  -.055697  .004688   .252403  .001294  I  .2502291  .0002966  2.4977 0.1587  P    10.457     .500    -2.607     .300  -.054000   .264990   .2509990      .000      .000  
+80 6 9 44399.00 I  -.055819  .004688   .253518  .001294  I  .2477506  .0002966  2.4454 0.2197  P     9.787     .500    -2.552     .300  -.054000   .266000   .2490000      .000      .000  
+80 610 44400.00 I  -.055929  .004586   .254635  .001408  I  .2453624  .0003241  2.3207 0.2197  P     8.946     .500    -2.741     .300  -.054000   .266990   .2470000      .000      .000  
+80 611 44401.00 I  -.056030  .004586   .255754  .001408  I  .2431236  .0003241  2.1528 0.2292  P     8.299     .500    -3.070     .300  -.054000   .268000   .2451000      .000      .000  
+80 612 44402.00 I  -.056121  .004586   .256876  .001408  I  .2410578  .0003241  1.9819 0.2292  P     8.073     .500    -3.317     .300  -.053000   .268000   .2431000      .000      .000  
+80 613 44403.00 I  -.056197  .004586   .258000  .001408  I  .2391486  .0003241  1.8446 0.1662  P     8.267     .500    -3.350     .300  -.053000   .269000   .2412000      .000      .000  
+80 614 44404.00 I  -.056252  .002177   .259130  .001585  I  .2373506  .0000740  1.7614 0.1662  P     8.683     .500    -3.247     .300  -.053000   .270000   .2392000      .000      .000  
+80 615 44405.00 I  -.056283  .002177   .260267  .001585  I  .2356071  .0000740  1.7341 0.0445  P     9.045     .500    -3.188     .300  -.053000   .271000   .2373000      .000      .000  
+80 616 44406.00 I  -.056288  .001876   .261414  .001590  I  .2338680  .0000494  1.7498 0.0445  P     9.135     .500    -3.248     .300  -.053000   .271000   .2355000      .000      .000  
+80 617 44407.00 I  -.056263  .001876   .262575  .001590  I  .2320990  .0000494  1.7910 0.0349  P     8.920     .500    -3.340     .300  -.052000   .272000   .2336000      .000      .000  
+80 618 44408.00 I  -.056206  .001876   .263751  .001590  I  .2302829  .0000494  1.8415 0.1129  P     8.566     .500    -3.371     .300  -.052000   .272000   .2318000      .000      .000  
+80 619 44409.00 I  -.056120  .001783   .264944  .001318  I  .2284177  .0002204  1.8870 0.1350  P     8.280     .500    -3.351     .300  -.052000   .273000   .2299000      .000      .000  
+80 620 44410.00 I  -.056007  .001211   .266154  .001435  I  .2265144  .0002654  1.9161 0.1725  P     8.121     .500    -3.343     .300  -.051000   .273990   .2281000      .000      .000  
+80 621 44411.00 I  -.055869  .001211   .267379  .001435  I  .2245938  .0002654  1.9203 0.1906  P     7.988     .500    -3.349     .300  -.051000   .273990   .2263000      .000      .000  
+80 622 44412.00 I  -.055710  .004611   .268620  .000645  I  .2226833  .0002737  1.8958 0.1906  P     7.765     .500    -3.300     .300  -.050000   .275000   .2245000      .000      .000  
+80 623 44413.00 I  -.055531  .004611   .269874  .000645  I  .2208110  .0002737  1.8448 0.1935  P     7.422     .500    -3.137     .300  -.050000   .275000   .2227000      .000      .000  
+80 624 44414.00 I  -.055334  .004611   .271140  .000645  I  .2190006  .0002737  1.7731 0.1448  P     7.010     .500    -2.883     .300  -.049000   .276000   .2209000      .000      .000  
+80 625 44415.00 I  -.055118  .006326   .272416  .000823  I  .2172690  .0000947  1.6887 0.2162  P     6.629     .500    -2.646     .300  -.048000   .277000   .2192000      .000      .000  
+80 626 44416.00 I  -.054881  .005269   .273700  .000678  I  .2156238  .0003348  1.6024 0.1740  P     6.395     .500    -2.556     .300  -.048000   .277000   .2175000      .000      .000  
+80 627 44417.00 I  -.054612  .005269   .274989  .000678  I  .2140596  .0003348  1.5299 0.2861  P     6.382     .500    -2.662     .300  -.047000   .278000   .2157000      .000      .000  
+80 628 44418.00 I  -.054299  .003938   .276282  .000493  I  .2125530  .0004640  1.4905 0.2413  P     6.533     .500    -2.864     .300  -.047000   .278000   .2140000      .000      .000  
+80 629 44419.00 I  -.053930  .011309   .277574  .003053  I  .2110616  .0003477  1.5022 0.2899  P     6.666     .500    -2.992     .300  -.046000   .279000   .2123000      .000      .000  
+80 630 44420.00 I  -.053497  .011309   .278865  .003053  I  .2095287  .0003477  1.5736 0.2904  P     6.614     .500    -2.956     .300  -.045000   .280000   .2106000      .000      .000  
+80 7 1 44421.00 I  -.052996  .011321   .280150  .003820  I  .2078977  .0004653  1.6952 0.2907  P     6.375     .500    -2.827     .300  -.044000   .280000   .2089000      .000      .000  
+80 7 2 44422.00 I  -.052422  .013582   .281429  .004665  I  .2061299  .0004659  1.8419 0.3292  P     6.114     .500    -2.732     .300  -.044000   .280990   .2073000      .000      .000  
+80 7 3 44423.00 I  -.051780  .013582   .282702  .004665  I  .2042170  .0004659  1.9794 0.3294  P     6.016     .500    -2.716     .300  -.043000   .280990   .2056000      .000      .000  
+80 7 4 44424.00 I  -.051095  .013582   .283971  .004665  I  .2021850  .0004659  2.0751 0.3591  P     6.120     .500    -2.723     .300  -.042000   .282000   .2039000      .000      .000  
+80 7 5 44425.00 I  -.050384  .008098   .285238  .003602  I  .2000888  .0005465  2.1048 0.3591  P     6.263     .500    -2.691     .300  -.041000   .283000   .2022000      .000      .000  
+80 7 6 44426.00 I  -.049652  .008098   .286501  .003602  I  .1980003  .0005465  2.0600 0.3730  P     6.193     .500    -2.637     .300  -.041000   .283000   .2006000      .000      .000  
+80 7 7 44427.00 I  -.048902  .004104   .287755  .003600  I  .1959907  .0005077  1.9497 0.3730  P     5.761     .500    -2.644     .300  -.040000   .284000   .1989000      .000      .000  
+80 7 8 44428.00 I  -.048137  .004104   .288998  .003600  I  .1941150  .0005077  1.7970 0.3590  P     5.068     .500    -2.776     .300  -.040000   .284000   .1973000      .000      .000  
+80 7 9 44429.00 I  -.047357  .004104   .290226  .003600  I  .1924001  .0005077  1.6340 0.3590  P     4.420     .500    -3.011     .300  -.039000   .285000   .1956000      .000      .000  
+80 710 44430.00 I  -.046564  .004104   .291435  .003600  I  .1908393  .0005077  1.4941 0.3638  P     4.120     .500    -3.234     .300  -.037990   .286000   .1939000      .000      .000  
+80 711 44431.00 I  -.045762  .005388   .292623  .003541  I  .1893957  .0005212  1.4027 0.3638  P     4.256     .500    -3.328     .300  -.037990   .287000   .1923000      .000      .000  
+80 712 44432.00 I  -.044962  .005388   .293793  .003541  I  .1880149  .0005212  1.3683 0.3127  P     4.644     .500    -3.288     .300  -.037000   .287000   .1906000      .000      .000  
+80 713 44433.00 I  -.044175  .004264   .294946  .001270  I  .1866427  .0003457  1.3831 0.3127  P     5.002     .500    -3.203     .300  -.037000   .287990   .1890000      .000      .000  
+80 714 44434.00 I  -.043412  .004264   .296085  .001270  I  .1852377  .0003457  1.4310 0.2444  P     5.152     .500    -3.154     .300  -.035990   .289000   .1873000      .000      .000  
+80 715 44435.00 I  -.042680  .004264   .297212  .001270  I  .1837753  .0003457  1.4952 0.2444  P     5.073     .500    -3.137     .300  -.035000   .290000   .1857000      .000      .000  
+80 716 44436.00 I  -.041982  .004264   .298330  .001270  I  .1822469  .0003457  1.5607 0.2423  P     4.808     .500    -3.125     .300  -.035000   .291000   .1841000      .000      .000  
+80 717 44437.00 I  -.041317  .004120   .299440  .002369  I  .1806576  .0003396  1.6153 0.2423  P     4.418     .500    -3.142     .300  -.034000   .291000   .1824000      .000      .000  
+80 718 44438.00 I  -.040682  .004120   .300543  .002369  I  .1790231  .0003396  1.6496 0.2386  P     4.024     .500    -3.220     .300  -.034000   .292000   .1808000      .000      .000  
+80 719 44439.00 I  -.040070  .003623   .301639  .002290  I  .1773670  .0003352  1.6582 0.2386  P     3.763     .500    -3.320     .300  -.033000   .293000   .1792000      .000      .000  
+80 720 44440.00 I  -.039481  .003623   .302728  .002290  I  .1757154  .0003352  1.6408 0.2370  P     3.629     .500    -3.341     .300  -.032000   .294000   .1776000      .000      .000  
+80 721 44441.00 I  -.038915  .003623   .303805  .002290  I  .1740930  .0003352  1.6006 0.2274  P     3.428     .500    -3.218     .300  -.032000   .294000   .1760000      .000      .000  
+80 722 44442.00 I  -.038378  .004011   .304868  .002431  I  .1725194  .0003074  1.5448 0.3275  P     3.007     .500    -2.976     .300  -.031000   .294990   .1743000      .000      .000  
+80 723 44443.00 I  -.037876  .003453   .305911  .002205  I  .1710052  .0005628  1.4835 0.1701  P     2.484     .500    -2.713     .300  -.031000   .294990   .1727000      .000      .000  
+80 724 44444.00 I  -.037416  .001017   .306930  .000822  I  .1695499  .0001457  1.4295 0.2870  P     2.138     .500    -2.558     .300  -.030000   .296000   .1711000      .000      .000  
+80 725 44445.00 I  -.037005  .000753   .307918  .001028  I  .1681384  .0001127  1.3988 0.0923  P     2.101     .500    -2.609     .300  -.030000   .297000   .1695000      .000      .000  
+80 726 44446.00 I  -.036652  .000749   .308869  .001035  I  .1667384  .0001133  1.4097 0.0798  P     2.251     .500    -2.840     .300  -.029000   .297000   .1679000      .000      .000  
+80 727 44447.00 I  -.036373  .000749   .309774  .001035  I  .1653007  .0001129  1.4755 0.0795  P     2.396     .500    -3.078     .300  -.029000   .298000   .1662000      .000      .000  
+80 728 44448.00 I  -.036176  .000571   .310620  .001099  I  .1637689  .0001116  1.5970 0.0587  P     2.457     .500    -3.132     .300  -.028000   .298000   .1646000      .000      .000  
+80 729 44449.00 I  -.036043  .000571   .311387  .001099  I  .1620941  .0000322  1.7564 0.0603  P     2.433     .500    -2.977     .300  -.028000   .299000   .1630000      .000      .000  
+80 730 44450.00 I  -.035959  .000571   .312081  .001099  I  .1602557  .0000457  1.9169 0.0441  P     2.307     .500    -2.780     .300  -.028000   .299000   .1614000      .000      .000  
+80 731 44451.00 I  -.035911  .000476   .312715  .001427  I  .1582745  .0000822  2.0349 0.1115  P     2.085     .500    -2.715     .300  -.027000   .300000   .1598000      .000      .000  
+80 8 1 44452.00 I  -.035885  .002027   .313299  .003060  I  .1562108  .0002183  2.0783 0.1242  P     1.853     .500    -2.803     .300  -.027000   .300000   .1581000      .000      .000  
+80 8 2 44453.00 I  -.035873  .002027   .313843  .003060  I  .1541461  .0002343  2.0372 0.1779  P     1.712     .500    -2.935     .300  -.026000   .301000   .1565000      .000      .000  
+80 8 3 44454.00 I  -.035866  .001859   .314353  .001591  I  .1521605  .0002809  1.9239 0.1829  P     1.663     .500    -3.022     .300  -.026000   .301000   .1549000      .000      .000  
+80 8 4 44455.00 I  -.035856  .001859   .314838  .001591  I  .1503126  .0002809  1.7676 0.1897  P     1.582     .500    -3.072     .300  -.026000   .301990   .1533000      .000      .000  
+80 8 5 44456.00 I  -.035834  .001859   .315303  .001591  I  .1486280  .0002549  1.6034 0.1619  P     1.357     .500    -3.143     .300  -.025000   .301990   .1517000      .000      .000  
+80 8 6 44457.00 I  -.035796  .002414   .315753  .001929  I  .1470977  .0001612  1.4637 0.1603  P     1.028     .500    -3.262     .300  -.025000   .303000   .1500000      .000      .000  
+80 8 7 44458.00 I  -.035736  .002722   .316194  .001863  I  .1456845  .0001945  1.3722 0.1263  P      .797     .500    -3.398     .300  -.024000   .303000   .1484000      .000      .000  
+80 8 8 44459.00 I  -.035652  .002722   .316631  .001863  I  .1443340  .0001945  1.3386 0.0999  P      .852     .500    -3.500     .300  -.024000   .303990   .1468000      .000      .000  
+80 8 9 44460.00 I  -.035543  .003253   .317071  .002470  I  .1429894  .0000461  1.3586 0.1023  P     1.178     .500    -3.533     .300  -.024000   .305000   .1451000      .000      .000  
+80 810 44461.00 I  -.035410  .002307   .317518  .001896  I  .1416036  .0000636  1.4181 0.0393  P     1.569     .500    -3.487     .300  -.023000   .305000   .1435000      .000      .000  
+80 811 44462.00 I  -.035258  .002307   .317974  .001896  I  .1401463  .0000636  1.4984 0.0533  P     1.827     .500    -3.358     .300  -.023000   .306000   .1418000      .000      .000  
+80 812 44463.00 I  -.035091  .000542   .318443  .001027  I  .1386056  .0000855  1.5823 0.0533  P     1.881     .500    -3.163     .300  -.022000   .306000   .1402000      .000      .000  
+80 813 44464.00 I  -.034914  .000542   .318927  .001027  I  .1369849  .0000855  1.6566 0.0605  P     1.728     .500    -2.979     .300  -.022000   .307000   .1385000      .000      .000  
+80 814 44465.00 I  -.034730  .000542   .319428  .001027  I  .1352991  .0000855  1.7110 0.0605  P     1.393     .500    -2.921     .300  -.022000   .308000   .1368000      .000      .000  
+80 815 44466.00 I  -.034545  .000542   .319948  .001027  I  .1335716  .0000855  1.7394 0.0978  P     1.033     .500    -3.029     .300  -.021000   .308000   .1351000      .000      .000  
+80 816 44467.00 I  -.034361  .000944   .320488  .001281  I  .1318295  .0001759  1.7401 0.0978  P      .895     .500    -3.205     .300  -.021000   .308990   .1333000      .000      .000  
+80 817 44468.00 I  -.034185  .000944   .321048  .001281  I  .1300996  .0001759  1.7162 0.1451  P     1.017     .500    -3.297     .300  -.020000   .308990   .1316000      .000      .000  
+80 818 44469.00 I  -.034021  .001122   .321629  .001503  I  .1284021  .0002307  1.6772 0.1201  P     1.082     .500    -3.255     .300  -.020000   .310000   .1298990      .000      .000  
+80 819 44470.00 I  -.033876  .001473   .322231  .002151  I  .1267463  .0001635  1.6349 0.1414  P      .771     .500    -3.136     .300  -.020000   .310990   .1280990      .000      .000  
+80 820 44471.00 I  -.033753  .001473   .322852  .002151  I  .1251295  .0001635  1.6011 0.1082  P      .200     .500    -3.009     .300  -.020000   .310990   .1263000      .000      .000  
+80 821 44472.00 I  -.033655  .002643   .323491  .001843  I  .1235369  .0001418  1.5891 0.0870  P     -.191     .500    -2.910     .300  -.018990   .312000   .1244000      .000      .000  
+80 822 44473.00 I  -.033585  .003139   .324146  .001991  I  .1219387  .0000597  1.6150 0.0769  P     -.189     .500    -2.895     .300  -.018990   .312000   .1226000      .000      .000  
+80 823 44474.00 I  -.033544  .003139   .324811  .001991  I  .1202889  .0000597  1.6951 0.0422  P      .000     .500    -3.025     .300  -.018990   .313000   .1208000      .000      .000  
+80 824 44475.00 I  -.033532  .003139   .325482  .001991  I  .1185273  .0000597  1.8389 0.0595  P      .109     .500    -3.242     .300  -.018990   .313000   .1189000      .000      .000  
+80 825 44476.00 I  -.033545  .003095   .326154  .002490  I  .1165928  .0001030  2.0377 0.0595  P      .140     .500    -3.348     .300  -.018990   .314000   .1170000      .000      .000  
+80 826 44477.00 I  -.033575  .003095   .326823  .002490  I  .1144442  .0001030  2.2596 0.0760  P      .207     .500    -3.213     .300  -.017990   .314000   .1151000      .000      .000  
+80 827 44478.00 I  -.033616  .002868   .327484  .002436  I  .1120823  .0001117  2.4553 0.0760  P      .265     .500    -2.945     .300  -.017990   .315000   .1132000      .000      .000  
+80 828 44479.00 I  -.033658  .002868   .328135  .002436  I  .1095587  .0001117  2.5758 0.0790  P      .145     .500    -2.779     .300  -.017990   .315000   .1113000      .000      .000  
+80 829 44480.00 I  -.033692  .002868   .328774  .002436  I  .1069650  .0001117  2.5933 0.0790  P     -.195     .500    -2.809     .300  -.017990   .315000   .1093000      .000      .000  
+80 830 44481.00 I  -.033706  .002868   .329403  .002436  I  .1044053  .0001117  2.5113 0.0703  P     -.591     .500    -2.925     .300  -.017990   .316000   .1073000      .000      .000  
+80 831 44482.00 I  -.033692  .002928   .330022  .000447  I  .1019650  .0000854  2.3616 0.0703  P     -.829     .500    -2.997     .300  -.017000   .316000   .1052000      .000      .000  
+80 9 1 44483.00 I  -.033648  .002928   .330632  .000447  I  .0996895  .0000854  2.1897 0.0456  P     -.830     .500    -3.032     .300  -.017000   .317000   .1032000      .000      .000  
+80 9 2 44484.00 I  -.033568  .001883   .331235  .000068  I  .0975787  .0000320  2.0384 0.0456  P     -.689     .500    -3.114     .300  -.017000   .317000   .1012000      .000      .000  
+80 9 3 44485.00 I  -.033449  .001883   .331832  .000068  I  .0955965  .0000320  1.9358 0.0226  P     -.583     .500    -3.254     .300  -.017000   .317990   .0991000      .000      .000  
+80 9 4 44486.00 I  -.033291  .001883   .332424  .000068  I  .0936871  .0000320  1.8934 0.0226  P     -.580     .500    -3.380     .300  -.016000   .317990   .0969000      .000      .000  
+80 9 5 44487.00 I  -.033093  .001883   .333013  .000068  I  .0917909  .0000320  1.9076 0.0192  P     -.562     .500    -3.445     .300  -.016000   .319000   .0948000      .000      .000  
+80 9 6 44488.00 I  -.032856  .001388   .333598  .000202  I  .0898578  .0000212  1.9643 0.0192  P     -.375     .500    -3.457     .300  -.015000   .319000   .0926000      .000      .000  
+80 9 7 44489.00 I  -.032585  .001388   .334183  .000202  I  .0878542  .0000212  2.0453 0.0157  P     -.035     .500    -3.409     .300  -.015000   .320000   .0905000      .000      .000  
+80 9 8 44490.00 I  -.032281  .000025   .334766  .000279  I  .0857654  .0000231  2.1318 0.0464  P      .288     .500    -3.246     .300  -.015000   .321000   .0883000      .000      .000  
+80 9 9 44491.00 I  -.031950  .000932   .335350  .000197  I  .0835940  .0000903  2.2082 0.0466  P      .450     .500    -2.942     .300  -.014000   .321000   .0861000      .000      .000  
+80 910 44492.00 I  -.031593  .000932   .335936  .000197  I  .0813562  .0000903  2.2632 0.0998  P      .421     .500    -2.612     .300  -.014000   .322000   .0838000      .000      .000  
+80 911 44493.00 I  -.031215  .000901   .336526  .000813  I  .0790771  .0001779  2.2898 0.1177  P      .264     .500    -2.449     .300  -.013000   .322000   .0816000      .000      .000  
+80 912 44494.00 I  -.030818  .001104   .337119  .000976  I  .0767870  .0002173  2.2852 0.1404  P      .133     .500    -2.537     .300  -.013000   .323000   .0794000      .000      .000  
+80 913 44495.00 I  -.030404  .001104   .337719  .000976  I  .0745165  .0002173  2.2511 0.1751  P      .227     .500    -2.753     .300  -.013000   .324000   .0771000      .000      .000  
+80 914 44496.00 I  -.029974  .000902   .338327  .001336  I  .0722922  .0002747  2.1948 0.1953  P      .562     .500    -2.904     .300  -.012000   .324000   .0748000      .000      .000  
+80 915 44497.00 I  -.029527  .000594   .338943  .001637  I  .0701300  .0003245  2.1293 0.2219  P      .823     .500    -2.937     .300  -.012000   .324990   .0724000      .000      .000  
+80 916 44498.00 I  -.029065  .000594   .339567  .001637  I  .0680318  .0003485  2.0693 0.2334  P      .659     .500    -2.944     .300  -.011000   .324990   .0701000      .000      .000  
+80 917 44499.00 I  -.028584  .002438   .340199  .002022  I  .0659849  .0003355  2.0289 0.2381  P      .159     .500    -2.978     .300  -.011000   .326000   .0678000      .000      .000  
+80 918 44500.00 I  -.028086  .002438   .340837  .002022  I  .0639626  .0003246  2.0227 0.2277  P     -.207     .500    -2.983     .300  -.011000   .327000   .0653990      .000      .000  
+80 919 44501.00 I  -.027570  .002438   .341480  .002022  I  .0619229  .0003079  2.0662 0.2126  P     -.154     .500    -2.921     .300  -.010000   .327000   .0630000      .000      .000  
+80 920 44502.00 I  -.027034  .002693   .342124  .004047  I  .0598094  .0002745  2.1721 0.1997  P      .119     .500    -2.873     .300  -.010000   .328000   .0607000      .000      .000  
+80 921 44503.00 I  -.026481  .002693   .342766  .004047  I  .0575568  .0002544  2.3439 0.1775  P      .289     .500    -2.903     .300  -.008990   .328000   .0583000      .000      .000  
+80 922 44504.00 I  -.025918  .002693   .343399  .004047  I  .0551051  .0002252  2.5654 0.1603  P      .329     .500    -2.918     .300  -.008990   .329000   .0559000      .000      .000  
+80 923 44505.00 I  -.025350  .001619   .344019  .005294  I  .0524227  .0001951  2.7968 0.1311  P      .411     .500    -2.770     .300  -.008990   .330000   .0534000      .000      .000  
+80 924 44506.00 I  -.024784  .000801   .344617  .001255  I  .0495267  .0001342  2.9828 0.1101  P      .563     .500    -2.503     .300  -.008000   .331000   .0510000      .000      .000  
+80 925 44507.00 I  -.024228  .000543   .345183  .001540  I  .0464885  .0001023  3.0748 0.0822  P      .623     .500    -2.327     .300  -.008000   .332000   .0485000      .000      .000  
+80 926 44508.00 I  -.023692  .000467   .345704  .001118  I  .0434152  .0000950  3.0524 0.0700  P      .467     .500    -2.344     .300  -.007000   .333000   .0461000      .000      .000  
+80 927 44509.00 I  -.023185  .000570   .346167  .001768  I  .0404165  .0000956  2.9316 0.0660  I     -.660    1.471    -2.476     .528  -.007000   .334000   .0436000      .000      .000  
+80 928 44510.00 I  -.022722  .000515   .346558  .001644  I  .0375738  .0000917  2.7456 0.0680  I     -.993    1.386    -2.515     .626  -.007000   .335000   .0411000      .000      .000  
+80 929 44511.00 I  -.022320  .000514   .346877  .001673  I  .0349343  .0000966  2.5328 0.0661  I    -1.152    1.658    -2.512     .660  -.007000   .336000   .0385000      .000      .000  
+80 930 44512.00 I  -.021988  .000499   .347173  .001613  I  .0324995  .0000951  2.3463 0.0637  I    -1.074    1.927    -2.591     .647  -.006000   .337000   .0360000      .000      .000  
+8010 1 44513.00 I  -.021717  .000547   .347498  .001781  I  .0302196  .0000831  2.2263 0.0661  I     -.882    1.882    -2.771     .648  -.006000   .338000   .0334000      .000      .000  
+8010 2 44514.00 I  -.021472  .000633   .347867  .001801  I  .0280224  .0000919  2.1799 0.0644  I     -.806    1.681    -2.929     .620  -.006000   .339000   .0309000      .000      .000  
+8010 3 44515.00 I  -.021217  .001128   .348281  .002333  I  .0258395  .0000985  2.1946 0.0666  I     -.930    2.409    -2.945     .977  -.006000   .340000   .0283000      .000      .000  
+8010 4 44516.00 I  -.020922  .001231   .348738  .000922  I  .0236201  .0000965  2.2486 0.0740  I    -1.047    2.764    -2.867     .787  -.006000   .341000   .0258000      .000      .000  
+8010 5 44517.00 I  -.020573  .002357   .349238  .001086  I  .0213366  .0001105  2.3195 0.0734  I     -.949    2.622    -2.792     .618  -.005000   .341000   .0232000      .000      .000  
+8010 6 44518.00 I  -.020162  .002357   .349784  .001086  I  .0189812  .0001105  2.3900 0.1465  I     -.721    1.266    -2.706     .792  -.005000   .342000   .0207000      .000      .000  
+8010 7 44519.00 I  -.019683  .005552   .350378  .002087  I  .0165613  .0002714  2.4464 0.1954  I     -.580    1.982    -2.539     .868  -.005000   .343000   .0181000      .000      .000  
+8010 8 44520.00 I  -.019138  .004820   .351018  .002289  I  .0140960  .0003749  2.4799 0.2553  I     -.600    1.982    -2.332     .868  -.005000   .344000   .0155000      .000      .000  
+8010 9 44521.00 I  -.018535  .003477   .351705  .002418  I  .0116109  .0004325  2.4853 0.2862  I     -.682    1.982    -2.248     .868  -.005000   .345000   .0129000      .000      .000  
+801010 44522.00 I  -.017881  .003477   .352436  .002418  I  .0091350  .0004325  2.4618 0.3161  I     -.679    1.982    -2.389     .868  -.004000   .345000   .0103000      .000      .000  
+801011 44523.00 I  -.017190  .002022   .353206  .003017  I  .0066954  .0004610  2.4138 0.3161  I     -.488    1.982    -2.663     .868  -.004000   .346000   .0077000      .000      .000  
+801012 44524.00 I  -.016473  .002022   .354013  .003017  I  .0043126  .0004610  2.3501 0.3260  I     -.112    1.982    -2.889     .868  -.004000   .347000   .0051000      .000      .000  
+801013 44525.00 I  -.015748  .002022   .354848  .003017  I  .0019960  .0004610  2.2842 0.2345  I      .270    1.982    -2.996     .868  -.004000   .348000   .0025000      .000      .000  
+801014 44526.00 I  -.015032  .000542   .355706  .001021  I -.0002604  .0000860  2.2323 0.2344  I      .426    1.982    -3.053     .868  -.004000   .349000  -.0002000      .000      .000  
+801015 44527.00 I  -.014340  .001289   .356578  .000752  I -.0024781  .0000855  2.2089 0.0589  I      .377    1.428    -3.098     .685  -.004000   .349000  -.0028000      .000      .000  
+801016 44528.00 I  -.013690  .001154   .357455  .001460  I -.0046917  .0000804  2.2261 0.0557  I      .448    1.401    -3.038     .727  -.004000   .350000  -.0055000      .000      .000  
+801017 44529.00 I  -.013099  .001067   .358326  .001278  I -.0069477  .0000715  2.2954 0.0538  I      .914    1.613    -2.765     .714  -.004000   .351000  -.0081000      .000      .000  
+801018 44530.00 I  -.012591  .000945   .359173  .001190  I -.0093009  .0000716  2.4198 0.0501  I     1.707    1.554    -2.315     .717  -.004000   .352000  -.0108000      .000      .000  
+801019 44531.00 I  -.012196  .001057   .359957  .001123  I -.0118060  .0000702  2.6002 0.0460  I     2.454    1.415    -1.924     .606  -.004000   .353000  -.0135000      .000      .000  
+801020 44532.00 I  -.011860  .000983   .360634  .001100  I -.0145143  .0000577  2.8197 0.0470  I     2.932    1.617    -1.681     .569  -.004000   .353000  -.0161000      .000      .000  
+801021 44533.00 I  -.011534  .001043   .361203  .001153  I -.0174444  .0000626  3.0362 0.0400  I     3.217    1.901    -1.473     .482  -.004000   .354000  -.0188000      .000      .000  
+801022 44534.00 I  -.011167  .000798   .361676  .001287  I -.0205670  .0000553  3.1937 0.0420  I     3.424    2.029    -1.304     .346  -.004000   .355000  -.0215000      .000      .000  
+801023 44535.00 I  -.010731  .000829   .362085  .000778  I -.0237945  .0000559  3.2395 0.0421  I     3.623    1.954    -1.282     .349  -.004000   .356000  -.0242000      .000      .000  
+801024 44536.00 I  -.010254  .000889   .362467  .000840  I -.0270050  .0000635  3.1625 0.0405  I     3.776    2.014    -1.448     .327  -.004000   .357000  -.0268000      .000      .000  
+801025 44537.00 I  -.009746  .001057   .362830  .000886  I -.0300888  .0000587  2.9935 0.0428  I     3.846    2.362    -1.637     .369  -.005000   .358000  -.0295000      .000      .000  
+801026 44538.00 I  -.009207  .000638   .363175  .001019  I -.0329788  .0000575  2.7850 0.1426  I     3.880    2.538    -1.654     .296  -.005000   .359000  -.0321000      .000      .000  
+801027 44539.00 I  -.008637  .002485   .363503  .000490  I -.0356645  .0002791  2.5936 0.1425  I     3.991    1.982    -1.576     .868  -.005000   .360000  -.0348000      .000      .000  
+801028 44540.00 I  -.008038  .002485   .363816  .000490  I -.0381850  .0002791  2.4590 0.1804  I     4.303    1.982    -1.656     .868  -.005000   .361000  -.0375000      .000      .000  
+801029 44541.00 I  -.007413  .002371   .364115  .000823  I -.0406058  .0002287  2.3941 0.1435  I     4.754    1.982    -1.974     .868  -.006000   .362000  -.0402000      .000      .000  
+801030 44542.00 I  -.006765  .002722   .364402  .000935  I -.0429935  .0000669  2.3899 0.1191  I     5.083    1.982    -2.304     .868  -.006000   .363000  -.0428000      .000      .000  
+801031 44543.00 I  -.006092  .002722   .364677  .000935  I -.0453991  .0000669  2.4261 0.0473  I     5.150    1.982    -2.395     .868  -.007000   .364000  -.0455000      .000      .000  
+8011 1 44544.00 I  -.005390  .002722   .364943  .000935  I -.0478520  .0000669  2.4812 0.0724  I     5.151    1.982    -2.247     .868  -.007000   .365000  -.0482000      .000      .000  
+8011 2 44545.00 I  -.004658  .002255   .365200  .001130  I -.0503616  .0001285  2.5366 0.0724  I     5.359    1.982    -2.037     .868  -.007000   .366000  -.0508000      .000      .000  
+8011 3 44546.00 I  -.003896  .002255   .365451  .001130  I -.0529205  .0001285  2.5778 0.1866  I     5.749    1.982    -1.870     .868  -.007000   .366000  -.0534000      .000      .000  
+8011 4 44547.00 I  -.003106  .001864   .365698  .000858  I -.0555091  .0003503  2.5948 0.1866  I     6.058    1.982    -1.705     .868  -.006000   .367000  -.0560000      .000      .000  
+8011 5 44548.00 I  -.002287  .001864   .365945  .000858  I -.0581001  .0003503  2.5820 0.2477  I     6.152    1.982    -1.504     .868  -.006000   .367000  -.0586000      .000      .000  
+8011 6 44549.00 I  -.001437  .001864   .366193  .000858  I -.0606628  .0003503  2.5383 0.2477  I     6.138    1.982    -1.333     .868  -.006000   .368000  -.0612000      .000      .000  
+8011 7 44550.00 I  -.000553  .001864   .366443  .000858  I -.0631675  .0003503  2.4671 0.2490  I     6.149    1.982    -1.285     .868  -.006000   .369000  -.0638000      .000      .000  
+8011 8 44551.00 I   .000371  .002807   .366696  .000524  I -.0655907  .0003539  2.3770 0.2490  I     6.215    1.982    -1.363     .868  -.005000   .369000  -.0664000      .000      .000  
+8011 9 44552.00 I   .001340  .002807   .366953  .000524  I -.0679193  .0003539  2.2802 0.2014  I     6.325    1.982    -1.489     .868  -.005000   .370000  -.0689000      .000      .000  
+801110 44553.00 I   .002361  .003802   .367214  .000272  I -.0701540  .0001923  2.1920 0.1896  I     6.457    1.982    -1.602     .868  -.004000   .370000  -.0715000      .000      .000  
+801111 44554.00 I   .003438  .002688   .367480  .000333  I -.0723119  .0001360  2.1295 0.1178  I     6.532    1.982    -1.710     .868  -.004000   .371000  -.0741000      .000      .000  
+801112 44555.00 I   .004576  .002688   .367750  .000333  I -.0744269  .0001360  2.1086 0.0962  I     6.468    1.982    -1.825     .868  -.003000   .371000  -.0767000      .000      .000  
+801113 44556.00 I   .005773  .002688   .368025  .000333  I -.0765465  .0001360  2.1400 0.1146  I     6.313    1.982    -1.899     .868  -.002000   .372000  -.0792000      .000      .000  
+801114 44557.00 I   .007027  .000517   .368305  .002281  I -.0787259  .0001846  2.2285 0.1146  I     6.222    1.982    -1.867     .868  -.002000   .372000  -.0818000      .000      .000  
+801115 44558.00 I   .008338  .000517   .368590  .002281  I -.0810214  .0001846  2.3709 0.1305  I     6.284    1.982    -1.724     .868  -.001000   .373000  -.0843000      .000      .000  
+801116 44559.00 I   .009704  .000517   .368879  .002281  I -.0834809  .0001846  2.5530 0.1482  I     6.454    1.982    -1.520     .868   .000000   .373000  -.0869000      .000      .000  
+801117 44560.00 I   .011124  .000573   .369171  .002338  I -.0861313  .0002319  2.7467 0.1482  I     6.627    1.982    -1.287     .868   .001000   .373000  -.0894000      .000      .000  
+801118 44561.00 I   .012595  .000573   .369466  .002338  I -.0889644  .0002319  2.9105 0.1531  I     6.698    1.982    -1.036     .868   .002000   .374000  -.0919000      .000      .000  
+801119 44562.00 I   .014116  .001322   .369758  .002084  I -.0919282  .0002000  3.0018 0.1543  I     6.591    1.982     -.847     .868   .004000   .374000  -.0945000      .000      .000  
+801120 44563.00 I   .015682  .001534   .370042  .001178  I -.0949346  .0002036  2.9928 0.1427  I     6.321    1.982     -.861     .868   .005000   .375000  -.0970000      .000      .000  
+801121 44564.00 I   .017292  .001534   .370316  .001178  I -.0978809  .0002036  2.8849 0.1440  I     6.026    1.982    -1.095     .868   .006000   .375000  -.0995000      .000      .000  
+801122 44565.00 I   .018944  .001534   .370574  .001178  I -.1006828  .0002036  2.7120 0.1311  I     5.843    1.982    -1.340     .868   .007000   .375000  -.1020000      .000      .000  
+801123 44566.00 I   .020631  .003481   .370816  .001025  I -.1033006  .0001652  2.5260 0.1311  I     5.802    1.982    -1.351     .868   .008000   .376000  -.1045000      .000      .000  
+801124 44567.00 I   .022349  .003481   .371039  .001025  I -.1057468  .0001652  2.3759 0.1161  I     5.887    1.982    -1.149     .868   .010000   .376000  -.1069000      .000      .000  
+801125 44568.00 I   .024091  .003403   .371242  .000366  I -.1080740  .0001633  2.2905 0.0905  I     6.122    1.982    -1.010     .868   .011000   .377000  -.1094000      .000      .000  
+801126 44569.00 I   .025851  .003403   .371423  .000366  I -.1103500  .0000740  2.2717 0.0896  I     6.463    1.982    -1.120     .868   .012000   .377000  -.1119000      .000      .000  
+801127 44570.00 I   .027614  .003403   .371580  .000366  I -.1126341  .0000740  2.3029 0.0523  I     6.723    1.982    -1.343     .868   .013000   .377000  -.1143000      .000      .000  
+801128 44571.00 I   .029368  .003403   .371712  .000366  I -.1149645  .0000740  2.3603 0.0427  I     6.755    1.982    -1.404     .868   .014000   .377000  -.1168000      .000      .000  
+801129 44572.00 I   .031095  .002329   .371818  .000982  I -.1173563  .0000428  2.4224 0.0427  I     6.668    1.982    -1.216     .868   .016000   .378000  -.1192000      .000      .000  
+801130 44573.00 I   .032776  .002329   .371896  .000982  I -.1198056  .0000428  2.4733 0.0286  I     6.682    1.982     -.931     .868   .017000   .378000  -.1217000      .000      .000  
+8012 1 44574.00 I   .034394  .002365   .371947  .001015  I -.1222956  .0000378  2.5022 0.0288  I     6.810    1.982     -.720     .868   .018000   .378000  -.1241000      .000      .000  
+8012 2 44575.00 I   .035930  .002270   .371968  .000974  I -.1248005  .0000384  2.5025 0.0269  I     6.859    1.982     -.593     .868   .019000   .378000  -.1265000      .000      .000  
+8012 3 44576.00 I   .037371  .002270   .371959  .000974  I -.1272907  .0000384  2.4731 0.0272  I     6.738    1.982     -.464     .868   .021000   .378000  -.1289000      .000      .000  
+8012 4 44577.00 I   .038728  .002270   .371917  .000974  I -.1297379  .0000384  2.4174 0.0472  I     6.567    1.982     -.297     .868   .022000   .377000  -.1314000      .000      .000  
+8012 5 44578.00 I   .040017  .002221   .371841  .000850  I -.1321190  .0000863  2.3421 0.1378  I     6.467    1.982     -.144     .868   .024000   .377000  -.1338000      .000      .000  
+8012 6 44579.00 I   .041254  .002669   .371728  .001991  I -.1344185  .0002729  2.2561 0.1431  I     6.424    1.982     -.084     .868   .025000   .377000  -.1362000      .000      .000  
+8012 7 44580.00 I   .042454  .002669   .371577  .001991  I -.1366321  .0002729  2.1728 0.1968  I     6.414    1.982     -.147     .868   .026000   .377000  -.1386000      .000      .000  
+8012 8 44581.00 I   .043634  .002673   .371385  .002008  I -.1387701  .0002835  2.1076 0.1968  I     6.513    1.982     -.292     .868   .028000   .376000  -.1410000      .000      .000  
+8012 9 44582.00 I   .044806  .002673   .371153  .002008  I -.1408587  .0002835  2.0765 0.1881  I     6.753    1.982     -.430     .868   .029000   .376000  -.1434000      .000      .000  
+801210 44583.00 I   .045978  .004254   .370882  .001797  I -.1429387  .0002474  2.0923 0.1573  I     7.011    1.982     -.487     .868   .031000   .375000  -.1458000      .000      .000  
+801211 44584.00 I   .047160  .004480   .370575  .000960  I -.1450613  .0001363  2.1620 0.1412  I     7.125    1.982     -.447     .868   .032000   .375000  -.1482000      .000      .000  
+801212 44585.00 I   .048360  .004480   .370233  .000960  I -.1472792  .0001363  2.2813 0.0964  I     7.097    1.982     -.348     .868   .033000   .374000  -.1506000      .000      .000  
+801213 44586.00 I   .049583  .004480   .369860  .000960  I -.1496355  .0001363  2.4356 0.0944  I     7.073    1.982     -.226     .868   .034000   .374000  -.1530000      .000      .000  
+801214 44587.00 I   .050829  .004472   .369458  .001345  I -.1521542  .0001305  2.6014 0.1027  I     7.173    1.982     -.082     .868   .036000   .373000  -.1553000      .000      .000  
+801215 44588.00 I   .052094  .004472   .369033  .001345  I -.1548320  .0001536  2.7484 0.0906  I     7.355    1.982      .104     .868   .037000   .373000  -.1577000      .000      .000  
+801216 44589.00 I   .053373  .003725   .368587  .001228  I -.1576339  .0001256  2.8442 0.0801  I     7.447    1.982      .314     .868   .038000   .372000  -.1601000      .000      .000  
+801217 44590.00 I   .054663  .001492   .368127  .001099  I -.1604947  .0000456  2.8631 0.0668  I     7.287    1.982      .459     .868   .039000   .371000  -.1625000      .000      .000  
+801218 44591.00 I   .055958  .001492   .367656  .001099  I -.1633315  .0000456  2.7964 0.0322  I     6.876    1.982      .426     .868   .040000   .371000  -.1649000      .000      .000  
+801219 44592.00 I   .057255  .001492   .367181  .001099  I -.1660643  .0000456  2.6600 0.0339  I     6.414    1.982      .208     .868   .042000   .370000  -.1672000      .000      .000  
+801220 44593.00 I   .058546  .001492   .366708  .001261  I -.1686409  .0000502  2.4916 0.0291  I     6.137    1.982     -.028     .868   .043000   .370000  -.1696000      .000      .000  
+801221 44594.00 I   .059819  .001492   .366243  .001261  I -.1710521  .0000363  2.3370 0.0302  I     6.146    1.982     -.061     .868   .044000   .369000  -.1720000      .000      .000  
+801222 44595.00 I   .061068  .000472   .365777  .001847  I -.1733318  .0000336  2.2332 0.0247  I     6.389    1.982      .151     .868   .045000   .368000  -.1744000      .000      .000  
+801223 44596.00 I   .062292  .000472   .365303  .001847  I -.1755406  .0000336  2.1956 0.0526  I     6.780    1.982      .399     .868   .046000   .368000  -.1768000      .000      .000  
+801224 44597.00 I   .063487  .000121   .364811  .004080  I -.1777423  .0000997  2.2160 0.0526  I     7.231    1.982      .452     .868   .048000   .367000  -.1791000      .000      .000  
+801225 44598.00 I   .064652  .000121   .364297  .004080  I -.1799847  .0000997  2.2726 0.0505  I     7.625    1.982      .317     .868   .049000   .367000  -.1815000      .000      .000  
+801226 44599.00 I   .065782  .000172   .363758  .005104  I -.1822914  .0000163  2.3408 0.0505  I     7.853    1.982      .204     .868   .050000   .366000  -.1839000      .000      .000  
+801227 44600.00 I   .066876  .000172   .363194  .005104  I -.1846637  .0000163  2.4013 0.0261  I     7.910    1.982      .267     .868   .051000   .365000  -.1863000      .000      .000  
+801228 44601.00 I   .067929  .000629   .362608  .000838  I -.1870873  .0000496  2.4419 0.0261  I     7.867    1.982      .445     .868   .052000   .364000  -.1886000      .000      .000  
+801229 44602.00 I   .068940  .000629   .362000  .000838  I -.1895385  .0000496  2.4556 0.0351  I     7.749    1.982      .587     .868   .053000   .364000  -.1910000      .000      .000  
+801230 44603.00 I   .069905  .000629   .361371  .000838  I -.1919885  .0000496  2.4395 0.0351  I     7.536    1.982      .639     .868   .054000   .363000  -.1933000      .000      .000  
+801231 44604.00 I   .070820  .000629   .360722  .000838  I -.1944082  .0000496  2.3955 0.0351  I     7.275    1.982      .677     .868   .055000   .362000  -.1957000      .000      .000  
+81 1 1 44605.00 I   .071683  .000629   .360054  .000838  I -.1967724  .0000496  2.3300 0.0306  I     7.091    1.982      .780     .868   .056000   .361000  -.1981000      .000      .000  
+81 1 2 44606.00 I   .072490  .003327   .359365  .001604  I -.1990643  .0000357  2.2527 0.0252  I     7.042    1.982      .932     .868   .057000   .360000  -.2004000      .000      .000  
+81 1 3 44607.00 I   .073235  .004662   .358658  .002109  I -.2012778  .0000091  2.1753 0.0184  I     7.058    1.982     1.024     .868   .057000   .360000  -.2028000      .000      .000  
+81 1 4 44608.00 I   .073915  .004662   .357930  .002109  I -.2034193  .0000091  2.1112 0.0064  I     7.082    1.982      .949     .868   .058000   .359000  -.2051000      .000      .000  
+81 1 5 44609.00 I   .074525  .004662   .357183  .002109  I -.2055098  .0000091  2.0759 0.0064  I     7.173    1.982      .707     .868   .059000   .358000  -.2075000      .000      .000  
+81 1 6 44610.00 I   .075064  .004662   .356414  .002109  I -.2075860  .0000091  2.0852 0.0064  I     7.410    1.982      .436     .868   .060000   .357000  -.2099000      .000      .000  
+81 1 7 44611.00 I   .075536  .004662   .355623  .002109  I -.2096986  .0000091  2.1496 0.2433  I     7.738    1.982      .309     .868   .060000   .356000  -.2122000      .000      .000  
+81 1 8 44612.00 I   .075945  .001337   .354805  .004055  I -.2119034  .0004866  2.2686 0.2433  I     7.998    1.982      .377     .868   .061000   .355000  -.2146000      .000      .000  
+81 1 9 44613.00 I   .076296  .001337   .353958  .004055  I -.2142488  .0004866  2.4267 0.3441  I     8.095    1.982      .534     .868   .061000   .354000  -.2169000      .000      .000  
+81 110 44614.00 I   .076594  .001337   .353079  .004055  I -.2167605  .0004866  2.5959 0.3441  I     8.075    1.982      .642     .868   .062000   .353000  -.2193000      .000      .000  
+81 111 44615.00 I   .076842  .001337   .352166  .004055  I -.2194331  .0004866  2.7425 0.3119  I     8.039    1.982      .663     .868   .062000   .352000  -.2216000      .000      .000  
+81 112 44616.00 I   .077049  .001157   .351219  .004521  I -.2222276  .0003903  2.8352 0.3119  I     8.014    1.982      .650     .868   .063000   .351000  -.2239000      .000      .000  
+81 113 44617.00 I   .077220  .001157   .350241  .004521  I -.2250792  .0003903  2.8548 0.2347  I     7.922    1.982      .651     .868   .063000   .350000  -.2263000      .000      .000  
+81 114 44618.00 I   .077364  .000943   .349233  .004943  I -.2279115  .0002606  2.7972 0.2347  I     7.666    1.982      .642     .868   .064000   .349000  -.2286000      .000      .000  
+81 115 44619.00 I   .077487  .000943   .348200  .004943  I -.2306522  .0002606  2.6753 0.1843  I     7.246    1.982      .563     .868   .064000   .348000  -.2309000      .000      .000  
+81 116 44620.00 I   .077597  .000943   .347144  .004943  I -.2332501  .0002606  2.5174 0.1843  I     6.809    1.982      .392     .868   .064000   .347000  -.2332000      .000      .000  
+81 117 44621.00 I   .077698  .000943   .346074  .004943  I -.2356873  .0002606  2.3605 0.1507  I     6.555    1.982      .207     .868   .065000   .346000  -.2355000      .000      .000  
+81 118 44622.00 I   .077796  .001051   .345000  .000397  I -.2379834  .0001514  2.2404 0.1507  I     6.596    1.982      .130     .868   .065000   .346000  -.2379000      .000      .000  
+81 119 44623.00 I   .077897  .001051   .343929  .000397  I -.2401875  .0001514  2.1784 0.0818  I     6.874    1.982      .209     .868   .066000   .345000  -.2402000      .000      .000  
+81 120 44624.00 I   .078006  .000865   .342872  .001453  I -.2423598  .0000620  2.1752 0.0949  I     7.240    1.982      .336     .868   .066000   .344000  -.2425000      .000      .000  
+81 121 44625.00 I   .078128  .000973   .341837  .001453  I -.2445519  .0001145  2.2140 0.0651  I     7.575    1.982      .340     .868   .066000   .343000  -.2448000      .000      .000  
+81 122 44626.00 I   .078270  .000973   .340832  .001453  I -.2467935  .0001145  2.2699 0.0810  I     7.843    1.982      .174     .868   .067000   .342000  -.2471000      .000      .000  
+81 123 44627.00 I   .078438  .000973   .339867  .001453  I -.2490897  .0001145  2.3197 0.0798  I     8.038    1.982     -.033     .868   .067000   .342000  -.2493000      .000      .000  
+81 124 44628.00 I   .078639  .000961   .338947  .001529  I -.2514260  .0001111  2.3487 0.0784  I     8.108    1.982     -.131     .868   .068000   .341000  -.2516000      .000      .000  
+81 125 44629.00 I   .078874  .000996   .338070  .001649  I -.2537780  .0001070  2.3502 0.0791  I     7.982    1.982     -.106     .868   .068000   .340000  -.2539000      .000      .000  
+81 126 44630.00 I   .079143  .000996   .337230  .001649  I -.2561161  .0001127  2.3207 0.0722  I     7.664    1.982     -.062     .868   .068000   .339000  -.2562000      .000      .000  
+81 127 44631.00 I   .079447  .003128   .336422  .001942  I -.2584095  .0000969  2.2614 0.0743  I     7.283    1.982     -.065     .868   .069000   .339000  -.2584000      .000      .000  
+81 128 44632.00 I   .079787  .003128   .335641  .001942  I -.2606311  .0000969  2.1786 0.0685  I     7.014    1.982     -.078     .868   .069000   .338000  -.2607000      .000      .000  
+81 129 44633.00 I   .080160  .003128   .334884  .001942  I -.2627623  .0000969  2.0827 0.0685  I     6.942    1.982     -.036     .868   .070000   .338000  -.2629000      .000      .000  
+81 130 44634.00 I   .080567  .003128   .334149  .001942  I -.2647967  .0000969  1.9873 0.0707  I     7.028    1.982      .070     .868   .070000   .337000  -.2652000      .000      .000  
+81 131 44635.00 I   .081002  .003175   .333433  .001215  I -.2667414  .0001030  1.9055 0.0523  I     7.181    1.982      .164     .868   .070000   .336000  -.2674000      .000      .000  
+81 2 1 44636.00 I   .081459  .003175   .332735  .001215  I -.2686169  .0000394  1.8512 0.1544  I     7.331    1.982      .130     .868   .071000   .335000  -.2697000      .000      .000  
+81 2 2 44637.00 I   .081926  .004944   .332049  .000859  I -.2704577  .0002912  1.8387 0.1469  I     7.448    1.982     -.091     .868   .071000   .335000  -.2719000      .000      .000  
+81 2 3 44638.00 I   .082394  .004944   .331372  .000859  I -.2723128  .0002912  1.8818 0.2059  I     7.552    1.982     -.421     .868   .072000   .334000  -.2742000      .000      .000  
+81 2 4 44639.00 I   .082853  .004944   .330701  .000859  I -.2742421  .0002912  1.9872 0.2059  I     7.718    1.982     -.665     .868   .072000   .333000  -.2764000      .000      .000  
+81 2 5 44640.00 I   .083296  .004944   .330031  .000859  I -.2763049  .0002912  2.1457 0.2323  I     8.005    1.982     -.668     .868   .073000   .332000  -.2787000      .000      .000  
+81 2 6 44641.00 I   .083721  .006842   .329357  .000263  I -.2785419  .0003620  2.3293 0.2323  I     8.358    1.982     -.470     .868   .073000   .331000  -.2810000      .000      .000  
+81 2 7 44642.00 I   .084131  .006842   .328675  .000263  I -.2809579  .0003620  2.4962 0.3602  I     8.617    1.982     -.271     .868   .074000   .330000  -.2833000      .000      .000  
+81 2 8 44643.00 I   .084534  .009490   .327978  .003544  I -.2835154  .0006228  2.6063 0.3602  I     8.647    1.982     -.236     .868   .074000   .329000  -.2856000      .000      .000  
+81 2 9 44644.00 I   .084935  .009490   .327264  .003544  I -.2861427  .0006228  2.6331 0.4404  I     8.459    1.982     -.366     .868   .075000   .328000  -.2879000      .000      .000  
+81 210 44645.00 I   .085339  .009490   .326526  .003544  I -.2887526  .0006228  2.5730 0.3814  I     8.165    1.982     -.551     .868   .076000   .327000  -.2902000      .000      .000  
+81 211 44646.00 I   .085753  .007697   .325761  .003145  I -.2912661  .0004404  2.4452 0.3814  I     7.869    1.982     -.700     .868   .076000   .326000  -.2925000      .000      .000  
+81 212 44647.00 I   .086171  .007697   .324966  .003145  I -.2936321  .0004404  2.2847 0.3114  I     7.620    1.982     -.801     .868   .077000   .325000  -.2949000      .000      .000  
+81 213 44648.00 I   .086582  .007697   .324142  .003145  I -.2958376  .0004404  2.1304 0.2202  I     7.469    1.982     -.885     .868   .077000   .324000  -.2972000      .000      .000  
+81 214 44649.00 I   .086975  .005331   .323288  .002687  I -.2979063  .0000014  2.0161 0.2202  I     7.494    1.982     -.968     .868   .078000   .323000  -.2995000      .000      .000  
+81 215 44650.00 I   .087342  .005331   .322406  .002687  I -.2998904  .0000014  1.9635 0.0010  I     7.751    1.982    -1.034     .868   .079000   .322000  -.3019000      .000      .000  
+81 216 44651.00 I   .087683  .005331   .321500  .002687  I -.3018556  .0000014  1.9777 0.1176  I     8.178    1.982    -1.070     .868   .079000   .321000  -.3043000      .000      .000  
+81 217 44652.00 I   .087995  .002863   .320574  .000780  I -.3038641  .0002351  2.0469 0.1176  I     8.604    1.982    -1.112     .868   .080000   .320000  -.3066000      .000      .000  
+81 218 44653.00 I   .088275  .002863   .319631  .000780  I -.3059601  .0002351  2.1484 0.1662  I     8.878    1.982    -1.220     .868   .080000   .319000  -.3090000      .000      .000  
+81 219 44654.00 I   .088523  .002863   .318674  .000780  I -.3081632  .0002351  2.2569 0.1662  I     9.003    1.982    -1.401     .868   .081000   .318000  -.3114000      .000      .000  
+81 220 44655.00 I   .088735  .002863   .317707  .000780  I -.3104694  .0002351  2.3519 0.2364  I     9.078    1.982    -1.577     .868   .082000   .317000  -.3138000      .000      .000  
+81 221 44656.00 I   .088911  .002312   .316734  .000681  I -.3128585  .0004103  2.4212 0.2364  I     9.115    1.982    -1.662     .868   .082000   .316000  -.3162000      .000      .000  
+81 222 44657.00 I   .089055  .002312   .315759  .000681  I -.3153014  .0004103  2.4592 0.3354  I     9.008    1.982    -1.663     .868   .083000   .315000  -.3187000      .000      .000  
+81 223 44658.00 I   .089169  .001579   .314787  .000566  I -.3177663  .0005306  2.4655 0.3067  I     8.725    1.982    -1.653     .868   .083000   .314000  -.3211000      .000      .000  
+81 224 44659.00 I   .089258  .003146   .313822  .000451  I -.3202234  .0004560  2.4448 0.3498  I     8.427    1.982    -1.678     .868   .084000   .313000  -.3235000      .000      .000  
+81 225 44660.00 I   .089324  .003146   .312869  .000451  I -.3226500  .0004560  2.4063 0.4189  I     8.301    1.982    -1.722     .868   .084000   .312000  -.3260000      .000      .000  
+81 226 44661.00 I   .089374  .004341   .311931  .001623  I -.3250343  .0007029  2.3628 0.4496  I     8.363    1.982    -1.757     .868   .085000   .311000  -.3285000      .000      .000  
+81 227 44662.00 I   .089414  .005198   .311013  .001947  I -.3273788  .0007749  2.3290 0.5231  I     8.520    1.982    -1.768     .868   .085000   .311000  -.3309000      .000      .000  
+81 228 44663.00 I   .089444  .005198   .310118  .001947  I -.3297000  .0007749  2.3184 0.5132  I     8.753    1.982    -1.751     .868   .086000   .310000  -.3334000      .000      .000  
+81 3 1 44664.00 I   .089465  .004331   .309250  .001603  I -.3320271  .0006730  2.3423 0.5506  I     9.072    1.982    -1.734     .868   .086000   .309000  -.3359000      .000      .000  
+81 3 2 44665.00 I   .089485  .004414   .308410  .001952  I -.3343997  .0007824  2.4114 0.5160  I     9.347    1.982    -1.809     .868   .086000   .308000  -.3384000      .000      .000  
+81 3 3 44666.00 I   .089511  .004414   .307600  .001952  I -.3368684  .0007824  2.5361 0.4387  I     9.410    1.982    -2.049     .868   .087000   .307000  -.3410000      .000      .000  
+81 3 4 44667.00 I   .089556  .001491   .306819  .000351  I -.3394912  .0003972  2.7186 0.4156  I     9.351    1.982    -2.368     .868   .087000   .307000  -.3435000      .000      .000  
+81 3 5 44668.00 I   .089628  .001760   .306068  .003608  I -.3423190  .0002809  2.9412 0.2432  I     9.494    1.982    -2.537     .868   .088000   .306000  -.3461000      .000      .000  
+81 3 6 44669.00 I   .089735  .001760   .305347  .003608  I -.3453741  .0002809  3.1652 0.1406  I     9.979    1.982    -2.422     .868   .088000   .305000  -.3486000      .000      .000  
+81 3 7 44670.00 I   .089884  .001992   .304656  .005090  I -.3486333  .0000108  3.3407 0.1889  I    10.513    1.982    -2.158     .868   .088000   .304000  -.3512000      .000      .000  
+81 3 8 44671.00 I   .090081  .003957   .303995  .003771  I -.3520246  .0002526  3.4234 0.1264  I    10.673    1.982    -2.024     .868   .088000   .303000  -.3537000      .000      .000  
+81 3 9 44672.00 I   .090330  .003957   .303357  .003771  I -.3554424  .0002526  3.3931 0.2131  I    10.361    1.982    -2.153     .868   .089000   .303000  -.3563000      .000      .000  
+81 310 44673.00 I   .090635  .003231   .302736  .003399  I -.3587773  .0003434  3.2622 0.2453  I     9.865    1.982    -2.435     .868   .089000   .302000  -.3588000      .000      .000  
+81 311 44674.00 I   .090999  .003698   .302126  .002091  I -.3619463  .0004205  3.0696 0.2715  I     9.521    1.982    -2.679     .868   .089000   .301000  -.3614000      .000      .000  
+81 312 44675.00 I   .091420  .003698   .301521  .002091  I -.3649125  .0004205  2.8649 0.2973  I     9.448    1.982    -2.802     .868   .089000   .300000  -.3640000      .000      .000  
+81 313 44676.00 I   .091892  .003698   .300917  .002091  I -.3676865  .0004205  2.6914 0.3380  I     9.568    1.982    -2.843     .868   .089000   .299000  -.3666000      .000      .000  
+81 314 44677.00 I   .092409  .000511   .300309  .001763  I -.3703147  .0005293  2.5763 0.3380  I     9.786    1.982    -2.862     .868   .089000   .299000  -.3691000      .000      .000  
+81 315 44678.00 I   .092963  .000511   .299696  .001763  I -.3728610  .0005293  2.5271 0.3759  I    10.086    1.982    -2.887     .868   .089000   .298000  -.3717000      .000      .000  
+81 316 44679.00 I   .093548  .000549   .299077  .000556  I -.3753878  .0005339  2.5346 0.3759  I    10.482    1.982    -2.933     .868   .089000   .297000  -.3743000      .000      .000  
+81 317 44680.00 I   .094158  .000549   .298450  .000556  I -.3779422  .0005339  2.5782 0.3775  I    10.910    1.982    -3.018     .868   .089000   .296000  -.3769000      .000      .000  
+81 318 44681.00 I   .094786  .000549   .297814  .000556  I -.3805484  .0005339  2.6344 0.3582  I    11.232    1.982    -3.130     .868   .089000   .296000  -.3795000      .000      .000  
+81 319 44682.00 I   .095427  .000455   .297169  .002017  I -.3832082  .0004776  2.6821 0.3392  I    11.369    1.982    -3.209     .868   .089000   .295000  -.3821000      .000      .000  
+81 320 44683.00 I   .096077  .000226   .296513  .002470  I -.3859045  .0004184  2.7056 0.3175  I    11.377    1.982    -3.191     .868   .089000   .295000  -.3847000      .000      .000  
+81 321 44684.00 I   .096730  .000226   .295846  .002470  I -.3886086  .0004184  2.6966 0.2689  I    11.335    1.982    -3.088     .868   .089000   .294000  -.3873000      .000      .000  
+81 322 44685.00 I   .097382  .000129   .295168  .003403  I -.3912862  .0003380  2.6530 0.2446  I    11.230    1.982    -2.995     .868   .089000   .293000  -.3899000      .000      .000  
+81 323 44686.00 I   .098029  .000731   .294476  .002657  I -.3939040  .0002536  2.5777 0.2113  I    11.045    1.982    -2.988     .868   .089000   .292000  -.3926000      .000      .000  
+81 324 44687.00 I   .098666  .000731   .293764  .002657  I -.3964337  .0002536  2.4788 0.1337  I    10.884    1.982    -3.060     .868   .089000   .292000  -.3952000      .000      .000  
+81 325 44688.00 I   .099288  .000762   .293029  .001538  I -.3988580  .0000847  2.3693 0.1337  I    10.855    1.982    -3.161     .868   .089000   .291000  -.3979000      .000      .000  
+81 326 44689.00 I   .099892  .000762   .292266  .001538  I -.4011740  .0000847  2.2651 0.0599  I    10.907    1.982    -3.285     .868   .089000   .290000  -.4005000      .000      .000  
+81 327 44690.00 I   .100472  .000762   .291472  .001538  I -.4033956  .0000847  2.1832 0.0599  I    10.952    1.982    -3.444     .868   .089000   .289000  -.4031000      .000      .000  
+81 328 44691.00 I   .101022  .000762   .290643  .001538  I -.4055526  .0000847  2.1379 0.0467  I    11.097    1.982    -3.573     .868   .089000   .288000  -.4058000      .000      .000  
+81 329 44692.00 I   .101536  .001438   .289778  .001910  I -.4076876  .0000394  2.1411 0.0467  I    11.502    1.982    -3.573     .868   .088000   .288000  -.4084000      .000      .000  
+81 330 44693.00 I   .102008  .001438   .288877  .001910  I -.4098543  .0000394  2.2029 0.0341  I    12.021    1.982    -3.482     .868   .088000   .287000  -.4111000      .000      .000  
+81 331 44694.00 I   .102433  .002007   .287939  .002259  I -.4121152  .0000556  2.3303 0.1498  I    12.267    1.982    -3.493     .868   .088000   .286000  -.4137000      .000      .000  
+81 4 1 44695.00 I   .102804  .002506   .286963  .002112  I -.4145355  .0002970  2.5195 0.1511  I    12.143    1.982    -3.708     .868   .088000   .285000  -.4164000      .000      .000  
+81 4 2 44696.00 I   .103118  .002506   .285951  .002112  I -.4171670  .0002970  2.7471 0.2100  I    12.038    1.982    -3.955     .868   .088000   .284000  -.4191000      .000      .000  
+81 4 3 44697.00 I   .103374  .002506   .284904  .002112  I -.4200277  .0002970  2.9688 0.2232  I    12.305    1.982    -3.967     .868   .087000   .283000  -.4217000      .000      .000  
+81 4 4 44698.00 I   .103570  .002105   .283826  .001456  I -.4230844  .0003333  3.1299 0.2232  I    12.740    1.982    -3.735     .868   .087000   .282000  -.4244000      .000      .000  
+81 4 5 44699.00 I   .103706  .002105   .282720  .001456  I -.4262527  .0003333  3.1867 0.2357  I    12.817    1.982    -3.539     .868   .087000   .281000  -.4271000      .000      .000  
+81 4 6 44700.00 I   .103787  .002105   .281591  .001456  I -.4294194  .0003333  3.1282 0.2039  I    12.349    1.982    -3.610     .868   .087000   .280000  -.4298000      .000      .000  
+81 4 7 44701.00 I   .103815  .000740   .280444  .001019  I -.4324794  .0002351  2.9807 0.2039  I    11.686    1.982    -3.883     .868   .087000   .279000  -.4326000      .000      .000  
+81 4 8 44702.00 I   .103796  .000740   .279284  .001019  I -.4353684  .0002351  2.7962 0.2191  I    11.319    1.982    -4.131     .868   .087000   .279000  -.4353000      .000      .000  
+81 4 9 44703.00 I   .103731  .001025   .278118  .001173  I -.4380784  .0003698  2.6315 0.2429  I    11.417    1.982    -4.246     .868   .087000   .278000  -.4381000      .000      .000  
+81 410 44704.00 I   .103622  .001187   .276950  .001361  I -.4406514  .0004251  2.5269 0.2817  I    11.779    1.982    -4.286     .868   .087000   .277000  -.4408000      .000      .000  
+81 411 44705.00 I   .103472  .001187   .275789  .001361  I -.4431571  .0004251  2.4972 0.3006  I    12.088    1.982    -4.313     .868   .087000   .276000  -.4435000      .000      .000  
+81 412 44706.00 I   .103281  .001187   .274641  .001361  I -.4456681  .0004251  2.5346 0.3033  I    12.198    1.982    -4.317     .868   .087000   .276000  -.4462000      .000      .000  
+81 413 44707.00 I   .103048  .001773   .273513  .001374  I -.4482414  .0004328  2.6173 0.3033  I    12.231    1.982    -4.291     .868   .087000   .275000  -.4490000      .000      .000  
+81 414 44708.00 I   .102772  .001773   .272412  .001374  I -.4509090  .0004328  2.7190 0.3431  I    12.391    1.982    -4.274     .868   .087000   .275000  -.4517000      .000      .000  
+81 415 44709.00 I   .102451  .003506   .271342  .005022  I -.4536782  .0005325  2.8171 0.3431  I    12.692    1.982    -4.275     .868   .087000   .274000  -.4544000      .000      .000  
+81 416 44710.00 I   .102084  .003506   .270310  .005022  I -.4565359  .0005325  2.8934 0.3765  I    12.941    1.982    -4.214     .868   .087000   .273000  -.4571000      .000      .000  
+81 417 44711.00 I   .101671  .003506   .269319  .005022  I -.4594538  .0005325  2.9361 0.3765  I    12.972    1.982    -4.018     .868   .087000   .273000  -.4598000      .000      .000  
+81 418 44712.00 I   .101215  .003506   .268373  .005022  I -.4623949  .0005325  2.9393 0.3930  I    12.813    1.982    -3.749     .868   .087000   .272000  -.4626000      .000      .000  
+81 419 44713.00 I   .100723  .003367   .267472  .004999  I -.4653187  .0005781  2.9016 0.3930  I    12.589    1.982    -3.577     .868   .087000   .272000  -.4653000      .000      .000  
+81 420 44714.00 I   .100204  .003367   .266611  .004999  I -.4681860  .0005781  2.8276 0.3869  I    12.391    1.982    -3.604     .868   .087000   .271000  -.4680000      .000      .000  
+81 421 44715.00 I   .099670  .002566   .265784  .001453  I -.4709654  .0005144  2.7280 0.3869  I    12.277    1.982    -3.762     .868   .087000   .270000  -.4707000      .000      .000  
+81 422 44716.00 I   .099132  .002566   .264986  .001453  I -.4736384  .0005144  2.6175 0.3637  I    12.253    1.982    -3.930     .868   .087000   .270000  -.4734000      .000      .000  
+81 423 44717.00 I   .098598  .002566   .264212  .001453  I -.4762027  .0005144  2.5140 0.3637  I    12.221    1.982    -4.089     .868   .087000   .269000  -.4761000      .000      .000  
+81 424 44718.00 I   .098078  .002566   .263458  .001453  I -.4786745  .0005144  2.4349 0.3930  I    12.100    1.982    -4.295     .868   .087000   .269000  -.4788000      .000      .000  
+81 425 44719.00 I   .097577  .003294   .262721  .001723  I -.4810851  .0005942  2.3937 0.3459  I    12.031    1.982    -4.510     .868   .087000   .268000  -.4815000      .000      .000  
+81 426 44720.00 I   .097098  .002585   .262000  .001247  I -.4834781  .0004626  2.4010 0.3271  I    12.278    1.982    -4.572     .868   .087000   .267000  -.4841000      .000      .000  
+81 427 44721.00 I   .096643  .001585   .261292  .000374  I -.4859053  .0002739  2.4627 0.3155  I    12.818    1.982    -4.416     .868   .087000   .266000  -.4868000      .000      .000  
+81 428 44722.00 I   .096213  .002760   .260597  .000294  I -.4884219  .0004291  2.5795 0.2545  I    13.242    1.982    -4.213     .868   .087000   .266000  -.4894000      .000      .000  
+81 429 44723.00 I   .095810  .002760   .259912  .000294  I -.4910793  .0004291  2.7415 0.3034  I    13.240    1.982    -4.179     .868   .087000   .265000  -.4921000      .000      .000  
+81 430 44724.00 I   .095437  .002760   .259235  .000294  I -.4939106  .0004291  2.9208 0.2888  I    12.987    1.982    -4.292     .868   .087000   .264000  -.4947000      .000      .000  
+81 5 1 44725.00 I   .095099  .002331   .258566  .000634  I -.4969117  .0003865  3.0725 0.3044  I    12.840    1.982    -4.323     .868   .087000   .263000  -.4973000      .000      .000  
+81 5 2 44726.00 I   .094796  .002625   .257901  .000731  I -.5000299  .0004319  3.1470 0.2898  I    12.801    1.982    -4.175     .868   .087000   .263000  -.4999000      .000      .000  
+81 5 3 44727.00 I   .094526  .002625   .257240  .000731  I -.5031687  .0004319  3.1103 0.2500  I    12.536    1.982    -4.030     .868   .086000   .262000  -.5025000      .000      .000  
+81 5 4 44728.00 I   .094287  .001886   .256579  .000760  I -.5062135  .0002520  2.9626 0.2500  I    11.898    1.982    -4.094     .868   .086000   .262000  -.5051000      .000      .000  
+81 5 5 44729.00 I   .094077  .001886   .255917  .000760  I -.5090697  .0002520  2.7424 0.1738  I    11.189    1.982    -4.313     .868   .086000   .261000  -.5077000      .000      .000  
+81 5 6 44730.00 I   .093897  .001559   .255250  .001048  I -.5116939  .0002393  2.5091 0.1655  I    10.860    1.982    -4.477     .868   .086000   .260000  -.5102000      .000      .000  
+81 5 7 44731.00 I   .093746  .001765   .254576  .001064  I -.5141026  .0002146  2.3198 0.1607  I    11.088    1.982    -4.511     .868   .086000   .259000  -.5127000      .000      .000  
+81 5 8 44732.00 I   .093621  .001765   .253891  .001064  I -.5163592  .0002146  2.2075 0.1517  I    11.638    1.982    -4.530     .868   .086000   .259000  -.5153000      .000      .000  
+81 5 9 44733.00 I   .093517  .001765   .253193  .001064  I -.5185444  .0002146  2.1754 0.1337  I    12.052    1.982    -4.604     .868   .086000   .258000  -.5178000      .000      .000  
+81 510 44734.00 I   .093428  .000332   .252480  .001047  I -.5207305  .0001594  2.2047 0.1337  I    12.015    1.982    -4.650     .868   .086000   .257000  -.5203000      .000      .000  
+81 511 44735.00 I   .093349  .000332   .251752  .001047  I -.5229648  .0001594  2.2670 0.0886  I    11.639    1.982    -4.579     .868   .086000   .256000  -.5227000      .000      .000  
+81 512 44736.00 I   .093274  .000202   .251007  .000219  I -.5252670  .0000774  2.3366 0.2351  I    11.356    1.982    -4.441     .868   .086000   .255000  -.5251000      .000      .000  
+81 513 44737.00 I   .093197  .000563   .250245  .000270  I -.5276341  .0004424  2.3943 0.2037  I    11.432    1.982    -4.330     .868   .086000   .255000  -.5276000      .000      .000  
+81 514 44738.00 I   .093113  .000563   .249466  .000270  I -.5300478  .0003999  2.4284 0.2982  I    11.674    1.982    -4.222     .868   .086000   .254000  -.5300000      .000      .000  
+81 515 44739.00 I   .093014  .000563   .248669  .000270  I -.5324811  .0003999  2.4329 0.3179  I    11.700    1.982    -4.027     .868   .086000   .253000  -.5324000      .000      .000  
+81 516 44740.00 I   .092896  .000652   .247853  .001354  I -.5349032  .0004944  2.4061 0.3179  I    11.398    1.982    -3.762     .868   .086000   .252000  -.5348000      .000      .000  
+81 517 44741.00 I   .092753  .000652   .247018  .001354  I -.5372836  .0004944  2.3503 0.3496  I    10.979    1.982    -3.586     .868   .086000   .251000  -.5371000      .000      .000  
+81 518 44742.00 I   .092580  .000652   .246162  .001354  I -.5395967  .0004944  2.2732 0.3149  I    10.670    1.982    -3.616     .868   .086000   .251000  -.5395000      .000      .000  
+81 519 44743.00 I   .092374  .001741   .245286  .001547  I -.5418269  .0003903  2.1868 0.3277  I    10.523    1.982    -3.792     .868   .086000   .250000  -.5418000      .000      .000  
+81 520 44744.00 I   .092128  .001741   .244389  .001547  I -.5439719  .0004304  2.1054 0.2905  I    10.471    1.982    -3.961     .868   .086000   .249000  -.5442000      .000      .000  
+81 521 44745.00 I   .091841  .001741   .243473  .001547  I -.5460448  .0004304  2.0454 0.2810  I    10.403    1.982    -4.067     .868   .086000   .248000  -.5465000      .000      .000  
+81 522 44746.00 I   .091507  .002409   .242539  .001103  I -.5480747  .0003615  2.0214 0.2510  I    10.221    1.982    -4.171     .868   .086000   .247000  -.5488000      .000      .000  
+81 523 44747.00 I   .091128  .002447   .241590  .001791  I -.5501027  .0002582  2.0428 0.2221  I     9.963    1.982    -4.305     .868   .086000   .246000  -.5511000      .000      .000  
+81 524 44748.00 I   .090703  .002447   .240630  .001791  I -.5521769  .0002582  2.1141 0.1316  I     9.834    1.982    -4.371     .868   .086000   .245000  -.5534000      .000      .000  
+81 525 44749.00 I   .090233  .002485   .239660  .002280  I -.5543473  .0000510  2.2345 0.1316  I     9.977    1.982    -4.259     .868   .086000   .244000  -.5557000      .000      .000  
+81 526 44750.00 I   .089719  .002485   .238686  .002280  I -.5566596  .0000510  2.3961 0.0361  I    10.240    1.982    -4.015     .868   .086000   .243000  -.5580000      .000      .000  
+81 527 44751.00 I   .089165  .002485   .237709  .002280  I -.5591475  .0000510  2.5816 0.0361  I    10.320    1.982    -3.798     .868   .086000   .242000  -.5602000      .000      .000  
+81 528 44752.00 I   .088574  .002485   .236737  .002280  I -.5618204  .0000510  2.7599 0.1674  I    10.094    1.982    -3.684     .868   .085000   .241000  -.5625000      .000      .000  
+81 529 44753.00 I   .087953  .003310   .235775  .002690  I -.5646512  .0003308  2.8900 0.1119  I     9.659    1.982    -3.604     .868   .085000   .240000  -.5647000      .000      .000  
+81 530 44754.00 I   .087307  .001168   .234829  .007887  I -.5675712  .0002180  2.9325 0.1981  I     9.099    1.982    -3.510     .868   .085000   .239000  -.5670000      .000      .000  
+81 531 44755.00 I   .086642  .001168   .233906  .007887  I -.5704801  .0002180  2.8668 0.1541  I     8.398    1.982    -3.492     .868   .085000   .238000  -.5692000      .000      .000  
+81 6 1 44756.00 I   .085963  .001168   .233012  .007887  I -.5732731  .0002180  2.7061 0.1541  I     7.611    1.982    -3.636     .868   .085000   .237000  -.5713000      .000      .000  
+81 6 2 44757.00 I   .085277  .001168   .232152  .007887  I -.5758756  .0002180  2.4954 0.1575  I     6.967    1.982    -3.838     .868   .085000   .236000  -.5735000      .000      .000  
+81 6 3 44758.00 I   .084589  .004077   .231328  .005654  I -.5782669  .0002274  2.2936 0.1388  I     6.715    1.982    -3.902     .868   .085000   .235000  -.5756000      .000      .000  
+81 6 4 44759.00 I   .083908  .004077   .230536  .005654  I -.5804817  .0001720  2.1485 0.1664  I     6.930    1.982    -3.808     .868   .085000   .234000  -.5778000      .000      .000  
+81 6 5 44760.00 I   .083242  .005646   .229771  .001316  I -.5825897  .0002430  2.0807 0.1219  I     7.427    1.982    -3.743     .868   .085000   .233000  -.5799000      .000      .000  
+81 6 6 44761.00 I   .082595  .004014   .229030  .001189  I -.5846656  .0001729  2.0805 0.1491  I     7.812    1.982    -3.829     .868   .085000   .232000  -.5819000      .000      .000  
+81 6 7 44762.00 I   .081969  .004014   .228306  .001189  I -.5867638  .0001729  2.1197 0.1122  I     7.712    1.982    -3.947     .868   .084000   .232000  -.5840000      .000      .000  
+81 6 8 44763.00 I   .081359  .003385   .227593  .001213  I -.5889077  .0001430  2.1670 0.0881  I     7.121    1.982    -3.918     .868   .084000   .231000  -.5860000      .000      .000  
+81 6 9 44764.00 I   .080762  .001117   .226886  .001159  I -.5910926  .0000341  2.1985 0.0735  I     6.457    1.982    -3.744     .868   .084000   .230000  -.5881000      .000      .000  
+81 610 44765.00 I   .080177  .001117   .226178  .001159  I -.5932950  .0000341  2.2007 0.0241  I     6.132    1.982    -3.579     .868   .084000   .229000  -.5900000      .000      .000  
+81 611 44766.00 I   .079601  .001117   .225466  .001159  I -.5954823  .0000341  2.1678 0.0861  I     6.094    1.982    -3.497     .868   .083000   .228000  -.5920000      .000      .000  
+81 612 44767.00 I   .079033  .002493   .224744  .003089  I -.5976188  .0001687  2.0995 0.0861  I     5.952    1.982    -3.419     .868   .083000   .227000  -.5939000      .000      .000  
+81 613 44768.00 I   .078473  .002493   .224009  .003089  I -.5996709  .0001687  1.9998 0.1343  I     5.503    1.982    -3.267     .868   .082000   .226000  -.5959000      .000      .000  
+81 614 44769.00 I   .077923  .003206   .223258  .004183  I -.6016105  .0002090  1.8762 0.1310  I     4.929    1.982    -3.098     .868   .082000   .225000  -.5978000      .000      .000  
+81 615 44770.00 I   .077383  .002495   .222489  .003090  I -.6034192  .0002004  1.7403 0.1448  I     4.485    1.982    -3.030     .868   .082000   .224000  -.5996000      .000      .000  
+81 616 44771.00 I   .076854  .002495   .221699  .003090  I -.6050920  .0002004  1.6070 0.1327  I     4.218    1.982    -3.088     .868   .081000   .223000  -.6014000      .000      .000  
+81 617 44772.00 I   .076331  .002196   .220890  .003278  I -.6066392  .0001739  1.4918 0.1210  I     4.044    1.982    -3.193     .868   .081000   .223000  -.6033000      .000      .000  
+81 618 44773.00 I   .075810  .001446   .220065  .002716  I -.6080868  .0001356  1.4101 0.1103  I     3.901    1.982    -3.259     .868   .080000   .222000  -.6051000      .000      .000  
+81 619 44774.00 I   .075287  .001446   .219227  .002716  I -.6094747  .0001356  1.3743 0.0949  I     3.722    1.982    -3.272     .868   .080000   .221000  -.6069000      .000      .000  
+81 620 44775.00 I   .074760  .001901   .218381  .002219  I -.6108528  .0001328  1.3908 0.0856  I     3.418    1.982    -3.268     .868   .080000   .220000  -.6086000      .000      .000  
+81 621 44776.00 I   .074228  .002082   .217529  .002566  I -.6122734  .0001045  1.4584 0.0845  I     3.002    1.982    -3.254     .868   .079000   .219000  -.6103000      .000      .000  
+81 622 44777.00 I   .073692  .002082   .216671  .002566  I -.6137833  .0001045  1.5669 0.0829  I     2.643    1.982    -3.198     .868   .079000   .218000  -.6120000      .000      .000  
+81 623 44778.00 I   .073151  .002581   .215806  .000137  I -.6154147  .0001287  1.6979 0.1435  I     2.482    1.982    -3.070     .868   .078000   .217000  -.6137000      .000      .000  
+81 624 44779.00 I   .072607  .001826   .214934  .001702  I -.6171786  .0002672  1.8272 0.1483  I     2.444    1.982    -2.886     .868   .078000   .216000  -.6154000      .000      .000  
+81 625 44780.00 I   .072064  .001826   .214053  .001702  I -.6190588  .0002672  1.9254 0.2353  I     2.289    1.982    -2.686     .868   .078000   .215000  -.6170000      .000      .000  
+81 626 44781.00 I   .071529  .000076   .213163  .002404  I -.6210088  .0003875  1.9619 0.2172  I     1.816    1.982    -2.515     .868   .077000   .214000  -.6186000      .000      .000  
+81 627 44782.00 I   .071005  .005605   .212264  .001880  I -.6229551  .0003425  1.9159 0.2586  I     1.002    1.982    -2.437     .868   .077000   .213000  -.6201000      .000      .000  
+81 628 44783.00 I   .070500  .005605   .211356  .001880  I -.6248128  .0003425  1.7866 0.2422  I      .012    1.982    -2.522     .868   .076000   .212000  -.6217000      .000      .000  
+81 629 44784.00 I   .070017  .005605   .210444  .001880  I -.6265089  .0003425  1.5991 0.2157  I     -.884    1.982    -2.761     .868   .076000   .211000  -.6233000      .000      .000  
+81 630 44785.00 I   .069562  .006753   .209527  .000803  I -.6280070  .0002624  1.3997 0.2157  I    -1.453    1.982    -2.995     .868   .076000   .210000  -.6248000      .000      .000  
+81 7 1 44786.00 I   .069135  .006753   .208610  .000803  I  .3706787  .0002624  1.2393 0.1855  I    -1.627    1.982    -3.033     .868   .075000   .209000   .3738000      .000      .000  
+81 7 2 44787.00 I   .068727  .006753   .207692  .000803  I  .3694899  .0002624  1.1523 0.1598  I    -1.491    1.982    -2.871     .868   .075000   .208000   .3723000      .000      .000  
+81 7 3 44788.00 I   .068327  .004254   .206774  .000564  I  .3683480  .0001826  1.1434 0.1598  I    -1.212    1.982    -2.716     .868   .074000   .207000   .3709000      .000      .000  
+81 7 4 44789.00 I   .067935  .004254   .205857  .000564  I  .3671843  .0001826  1.1909 0.1291  I    -1.024    1.982    -2.743     .868   .074000   .206000   .3694000      .000      .000  
+81 7 5 44790.00 I   .067552  .004254   .204942  .000564  I  .3659587  .0001826  1.2610 0.1121  I    -1.184    1.982    -2.885     .868   .073000   .205000   .3680000      .000      .000  
+81 7 6 44791.00 I   .067176  .002161   .204031  .000663  I  .3646653  .0001301  1.3222 0.1121  I    -1.778    1.982    -2.932     .868   .073000   .204000   .3666000      .000      .000  
+81 7 7 44792.00 I   .066808  .002161   .203123  .000663  I  .3633237  .0001301  1.3551 0.1057  I    -2.583    1.982    -2.810     .868   .072000   .204000   .3651000      .000      .000  
+81 7 8 44793.00 I   .066442  .001782   .202222  .000960  I  .3619672  .0001666  1.3515 0.1138  I    -3.251    1.982    -2.653     .868   .072000   .203000   .3637000      .000      .000  
+81 7 9 44794.00 I   .066073  .000926   .201328  .001032  I  .3606327  .0001868  1.3119 0.1251  I    -3.671    1.982    -2.597     .868   .071000   .202000   .3623000      .000      .000  
+81 710 44795.00 I   .065696  .000926   .200444  .001032  I  .3593538  .0001868  1.2413 0.1321  I    -4.022    1.982    -2.603     .868   .070000   .201000   .3609000      .000      .000  
+81 711 44796.00 I   .065302  .000926   .199571  .001032  I  .3581575  .0001868  1.1486 0.1223  I    -4.472    1.982    -2.541     .868   .069000   .200000   .3596000      .000      .000  
+81 712 44797.00 I   .064885  .000683   .198710  .001549  I  .3570599  .0001580  1.0460 0.1223  I    -4.978    1.982    -2.366     .868   .069000   .200000   .3582000      .000      .000  
+81 713 44798.00 I   .064440  .000683   .197866  .001549  I  .3560642  .0001580  0.9474 0.1063  I    -5.431    1.982    -2.175     .868   .068000   .199000   .3569000      .000      .000  
+81 714 44799.00 I   .063959  .002177   .197041  .002598  I  .3551590  .0001421  0.8673 0.1063  I    -5.825    1.982    -2.097     .868   .067000   .198000   .3555000      .000      .000  
+81 715 44800.00 I   .063435  .002177   .196238  .002598  I  .3543187  .0001421  0.8201 0.1005  I    -6.181    1.982    -2.168     .868   .066000   .197000   .3542000      .000      .000  
+81 716 44801.00 I   .062865  .002177   .195458  .002598  I  .3535035  .0001421  0.8190 0.1015  I    -6.448    1.982    -2.309     .868   .065000   .196000   .3529000      .000      .000  
+81 717 44802.00 I   .062243  .002177   .194704  .002598  I  .3526621  .0001451  0.8738 0.1851  I    -6.597    1.982    -2.393     .868   .064000   .196000   .3515000      .000      .000  
+81 718 44803.00 I   .061567  .002092   .193973  .002319  I  .3517366  .0003418  0.9866 0.1857  I    -6.749    1.982    -2.353     .868   .063000   .195000   .3502000      .000      .000  
+81 719 44804.00 I   .060837  .002092   .193262  .002319  I  .3506726  .0003418  1.1482 0.2633  I    -7.057    1.982    -2.232     .868   .062000   .194000   .3489000      .000      .000  
+81 720 44805.00 I   .060054  .000154   .192568  .000416  I  .3494308  .0004005  1.3380 0.2766  I    -7.495    1.982    -2.129     .868   .061000   .193000   .3476000      .000      .000  
+81 721 44806.00 I   .059219  .000603   .191888  .001887  I  .3479970  .0004350  1.5267 0.2956  I    -7.868    1.982    -2.086     .868   .060000   .193000   .3462000      .000      .000  
+81 722 44807.00 I   .058334  .000603   .191218  .001887  I  .3463884  .0004350  1.6823 0.3324  I    -8.062    1.982    -2.051     .868   .059000   .192000   .3449000      .000      .000  
+81 723 44808.00 I   .057398  .000603   .190553  .001887  I  .3446521  .0005028  1.7786 0.2763  I    -8.198    1.982    -1.963     .868   .058000   .192000   .3435000      .000      .000  
+81 724 44809.00 I   .056412  .000604   .189891  .003506  I  .3428561  .0003407  1.8002 0.3037  I    -8.523    1.982    -1.839     .868   .057000   .191000   .3422000      .000      .000  
+81 725 44810.00 I   .055375  .000604   .189230  .003506  I  .3410767  .0003407  1.7468 0.2409  I    -9.169    1.982    -1.774     .868   .056000   .190000   .3408000      .000      .000  
+81 726 44811.00 I   .054287  .000604   .188569  .003506  I  .3393814  .0003407  1.6368 0.2073  I   -10.015    1.982    -1.854     .868   .055000   .190000   .3394000      .000      .000  
+81 727 44812.00 I   .053147  .002078   .187908  .003162  I  .3378102  .0002363  1.5054 0.2073  I   -10.769    1.982    -2.063     .868   .054000   .189000   .3380000      .000      .000  
+81 728 44813.00 I   .051952  .002078   .187248  .003162  I  .3363637  .0002363  1.3946 0.1603  I   -11.185    1.982    -2.267     .868   .053000   .189000   .3366000      .000      .000  
+81 729 44814.00 I   .050703  .001805   .186592  .003082  I  .3350022  .0002166  1.3403 0.1926  I   -11.222    1.982    -2.316     .868   .052000   .188000   .3352000      .000      .000  
+81 730 44815.00 I   .049399  .002208   .185946  .002330  I  .3336592  .0003043  1.3579 0.1619  I   -11.029    1.982    -2.180     .868   .051000   .187000   .3337000      .000      .000  
+81 731 44816.00 I   .048043  .002208   .185316  .002330  I  .3322658  .0002407  1.4373 0.1940  I   -10.802    1.982    -1.997     .868   .050000   .187000   .3323000      .000      .000  
+81 8 1 44817.00 I   .046639  .002208   .184711  .002330  I  .3307738  .0002407  1.5491 0.1586  I   -10.691    1.982    -1.930     .868   .049000   .186000   .3308000      .000      .000  
+81 8 2 44818.00 I   .045190  .000952   .184134  .002538  I  .3291684  .0002066  1.6585 0.1586  I   -10.809    1.982    -1.983     .868   .048000   .186000   .3294000      .000      .000  
+81 8 3 44819.00 I   .043700  .000952   .183590  .002538  I  .3274667  .0002066  1.7382 0.1508  I   -11.207    1.982    -2.018     .868   .047000   .185000   .3279000      .000      .000  
+81 8 4 44820.00 I   .042171  .000819   .183082  .002095  I  .3257067  .0002196  1.7739 0.1089  I   -11.829    1.982    -1.944     .868   .046000   .185000   .3264000      .000      .000  
+81 8 5 44821.00 I   .040604  .001400   .182613  .002322  I  .3239344  .0000688  1.7632 0.1108  I   -12.498    1.982    -1.835     .868   .045000   .184000   .3250000      .000      .000  
+81 8 6 44822.00 I   .039001  .001400   .182187  .002322  I  .3221940  .0000302  1.7113 0.0376  I   -13.030    1.982    -1.807     .868   .043000   .184000   .3235000      .000      .000  
+81 8 7 44823.00 I   .037364  .001400   .181810  .002322  I  .3205223  .0000302  1.6277 0.0158  I   -13.351    1.982    -1.847     .868   .042000   .183000   .3221000      .000      .000  
+81 8 8 44824.00 I   .035693  .001624   .181488  .005717  I  .3189449  .0000091  1.5251 0.0158  I   -13.520    1.982    -1.826     .868   .041000   .183000   .3206000      .000      .000  
+81 8 9 44825.00 I   .033992  .001624   .181224  .005717  I  .3174735  .0000091  1.4183 0.0064  I   -13.674    1.982    -1.670     .868   .040000   .183000   .3191000      .000      .000  
+81 810 44826.00 I   .032265  .001624   .181021  .005717  I  .3161045  .0000091  1.3229 0.1604  I   -13.941    1.982    -1.459     .868   .038000   .183000   .3176000      .000      .000  
+81 811 44827.00 I   .030516  .002006   .180881  .005495  I  .3148191  .0003207  1.2531 0.1604  I   -14.349    1.982    -1.356     .868   .037000   .182000   .3161000      .000      .000  
+81 812 44828.00 I   .028750  .002006   .180802  .005495  I  .3135857  .0003207  1.2209 0.2268  I   -14.780    1.982    -1.455     .868   .035000   .182000   .3146000      .000      .000  
+81 813 44829.00 I   .026974  .002006   .180777  .005495  I  .3123613  .0003207  1.2366 0.2561  I   -15.058    1.982    -1.692     .868   .034000   .182000   .3131000      .000      .000  
+81 814 44830.00 I   .025195  .002714   .180800  .002200  I  .3110942  .0003995  1.3073 0.2561  I   -15.112    1.982    -1.888     .868   .033000   .182000   .3116000      .000      .000  
+81 815 44831.00 I   .023416  .002714   .180862  .002200  I  .3097288  .0003995  1.4318 0.2825  I   -15.047    1.982    -1.880     .868   .031000   .182000   .3100000      .000      .000  
+81 816 44832.00 I   .021640  .002714   .180959  .002200  I  .3082181  .0003995  1.5938 0.2329  I   -15.044    1.982    -1.668     .868   .030000   .181000   .3085000      .000      .000  
+81 817 44833.00 I   .019869  .002573   .181085  .002192  I  .3065392  .0002396  1.7619 0.2329  I   -15.192    1.982    -1.420     .868   .028000   .181000   .3069000      .000      .000  
+81 818 44834.00 I   .018106  .002573   .181235  .002192  I  .3047050  .0002396  1.8978 0.1555  I   -15.445    1.982    -1.312     .868   .027000   .181000   .3054000      .000      .000  
+81 819 44835.00 I   .016361  .002595   .181406  .001884  I  .3027657  .0001984  1.9673 0.1222  I   -15.702    1.982    -1.367     .868   .025000   .181000   .3038000      .000      .000  
+81 820 44836.00 I   .014640  .002398   .181598  .001087  I  .3007986  .0000480  1.9521 0.1021  I   -15.925    1.982    -1.466     .868   .024000   .181000   .3022000      .000      .000  
+81 821 44837.00 I   .012948  .002398   .181808  .001087  I  .2988884  .0000480  1.8561 0.0339  I   -16.160    1.982    -1.501     .868   .022000   .181000   .3006000      .000      .000  
+81 822 44838.00 I   .011288  .002398   .182037  .001087  I  .2971055  .0000480  1.7030 0.0961  I   -16.474    1.982    -1.473     .868   .021000   .181000   .2990000      .000      .000  
+81 823 44839.00 I   .009661  .002387   .182284  .000767  I  .2954891  .0001861  1.5300 0.0961  I   -16.855    1.982    -1.456     .868   .019000   .181000   .2974000      .000      .000  
+81 824 44840.00 I   .008067  .002387   .182551  .000767  I  .2940387  .0001861  1.3774 0.1577  I   -17.191    1.982    -1.495     .868   .017000   .181000   .2958000      .000      .000  
+81 825 44841.00 I   .006502  .001489   .182837  .001621  I  .2927164  .0002546  1.2785 0.1577  I   -17.331    1.982    -1.561     .868   .016000   .181000   .2941000      .000      .000  
+81 826 44842.00 I   .004967  .001489   .183144  .001621  I  .2914576  .0002546  1.2518 0.1800  I   -17.205    1.982    -1.584     .868   .014000   .182000   .2925000      .000      .000  
+81 827 44843.00 I   .003459  .001489   .183472  .001621  I  .2901894  .0002546  1.2953 0.1800  I   -16.882    1.982    -1.519     .868   .013000   .182000   .2908000      .000      .000  
+81 828 44844.00 I   .001971  .001489   .183822  .001621  I  .2888507  .0002546  1.3877 0.1700  I   -16.534    1.982    -1.399     .868   .011000   .182000   .2892000      .000      .000  
+81 829 44845.00 I   .000498  .001452   .184192  .002333  I  .2874083  .0002253  1.4970 0.1700  I   -16.316    1.982    -1.290     .868   .009000   .182000   .2875000      .000      .000  
+81 830 44846.00 I  -.000964  .001452   .184580  .002333  I  .2858615  .0002253  1.5917 0.1378  I   -16.283    1.982    -1.215     .868   .008000   .182000   .2858000      .000      .000  
+81 831 44847.00 I  -.002421  .002707   .184983  .002725  I  .2842370  .0001589  1.6500 0.1378  I   -16.412    1.982    -1.135     .868   .006000   .183000   .2841000      .000      .000  
+81 9 1 44848.00 I  -.003878  .002707   .185399  .002725  I  .2825765  .0001589  1.6634 0.1124  I   -16.670    1.982    -1.035     .868   .005000   .183000   .2824000      .000      .000  
+81 9 2 44849.00 I  -.005341  .002707   .185825  .002725  I  .2809244  .0001589  1.6343 0.1205  I   -17.002    1.982     -.980     .868   .003000   .183000   .2807000      .000      .000  
+81 9 3 44850.00 I  -.006820  .002371   .186262  .003254  I  .2793189  .0001813  1.5721 0.1179  I   -17.260    1.982    -1.033     .868   .001000   .183000   .2789000      .000      .000  
+81 9 4 44851.00 I  -.008321  .002515   .186711  .003605  I  .2777869  .0001742  1.4897 0.1257  I   -17.259    1.982    -1.147     .868   .000000   .184000   .2771000      .000      .000  
+81 9 5 44852.00 I  -.009847  .002515   .187177  .003605  I  .2763411  .0001742  1.4026 0.1400  I   -16.985    1.982    -1.195     .868  -.002000   .184000   .2754000      .000      .000  
+81 9 6 44853.00 I  -.011401  .001488   .187664  .004112  I  .2749774  .0002192  1.3284 0.1241  I   -16.700    1.982    -1.121     .868  -.003000   .185000   .2736000      .000      .000  
+81 9 7 44854.00 I  -.012986  .001062   .188175  .003021  I  .2736749  .0001768  1.2825 0.1408  I   -16.698    1.982    -1.009     .868  -.005000   .185000   .2718000      .000      .000  
+81 9 8 44855.00 I  -.014601  .001062   .188708  .003021  I  .2723988  .0001768  1.2773 0.1513  I   -16.980    1.982     -.988     .868  -.007000   .186000   .2699000      .000      .000  
+81 9 9 44856.00 I  -.016248  .000659   .189263  .000854  I  .2711036  .0002456  1.3222 0.1513  I   -17.252    1.982    -1.106     .868  -.008000   .186000   .2681000      .000      .000  
+81 910 44857.00 I  -.017925  .000659   .189838  .000854  I  .2697354  .0002456  1.4242 0.1737  I   -17.272    1.982    -1.306     .868  -.010000   .187000   .2662000      .000      .000  
+81 911 44858.00 I  -.019633  .000659   .190433  .000854  I  .2682354  .0002456  1.5857 0.1737  I   -17.063    1.982    -1.463     .868  -.011000   .187000   .2644000      .000      .000  
+81 912 44859.00 I  -.021374  .000659   .191049  .000854  I  .2665468  .0002456  1.7989 0.2203  I   -16.790    1.982    -1.446     .868  -.013000   .188000   .2625000      .000      .000  
+81 913 44860.00 I  -.023145  .000878   .191686  .000257  I  .2646284  .0003657  2.0397 0.2203  I   -16.550    1.982    -1.211     .868  -.015000   .189000   .2606000      .000      .000  
+81 914 44861.00 I  -.024947  .000878   .192346  .000257  I  .2624718  .0003657  2.2674 0.2742  I   -16.371    1.982     -.880     .868  -.016000   .190000   .2586000      .000      .000  
+81 915 44862.00 I  -.026777  .000666   .193028  .000960  I  .2601132  .0004086  2.4362 0.2742  I   -16.300    1.982     -.683     .868  -.018000   .191000   .2567000      .000      .000  
+81 916 44863.00 I  -.028635  .000666   .193735  .000960  I  .2576309  .0004086  2.5104 0.2889  I   -16.378    1.982     -.758     .868  -.019000   .192000   .2547000      .000      .000  
+81 917 44864.00 I  -.030519  .000666   .194466  .000960  I  .2551270  .0004086  2.4807 0.2889  I   -16.544    1.982    -1.015     .868  -.021000   .193000   .2528000      .000      .000  
+81 918 44865.00 I  -.032426  .000666   .195223  .000960  I  .2526969  .0004086  2.3689 0.2687  I   -16.666    1.982    -1.233     .868  -.023000   .194000   .2508000      .000      .000  
+81 919 44866.00 I  -.034352  .000382   .196006  .001011  I  .2504021  .0003491  2.2184 0.2687  I   -16.666    1.982    -1.274     .868  -.024000   .195000   .2488000      .000      .000  
+81 920 44867.00 I  -.036297  .000382   .196814  .001011  I  .2482567  .0003491  2.0782 0.2196  I   -16.562    1.982    -1.181     .868  -.026000   .197000   .2467000      .000      .000  
+81 921 44868.00 I  -.038258  .000344   .197645  .000477  I  .2462289  .0002666  1.9884 0.1986  I   -16.403    1.982    -1.081     .868  -.027000   .198000   .2447000      .000      .000  
+81 922 44869.00 I  -.040233  .000507   .198500  .000453  I  .2442564  .0001896  1.9692 0.1636  I   -16.184    1.982    -1.045     .868  -.029000   .199000   .2427000      .000      .000  
+81 923 44870.00 I  -.042219  .000507   .199377  .000453  I  .2422674  .0001896  2.0194 0.1417  I   -15.851    1.982    -1.061     .868  -.031000   .200000   .2406000      .000      .000  
+81 924 44871.00 I  -.044215  .001548   .200276  .000552  I  .2402008  .0002107  2.1202 0.1294  I   -15.377    1.982    -1.086     .868  -.033000   .201000   .2385000      .000      .000  
+81 925 44872.00 I  -.046217  .001880   .201196  .000586  I  .2380198  .0001761  2.2428 0.1373  I   -14.834    1.982    -1.092     .868  -.034000   .203000   .2365000      .000      .000  
+81 926 44873.00 I  -.048222  .001880   .202137  .000586  I  .2357184  .0001761  2.3559 0.1874  I   -14.361    1.982    -1.057     .868  -.036000   .204000   .2344000      .000      .000  
+81 927 44874.00 I  -.050225  .001755   .203100  .000936  I  .2333195  .0003308  2.4345 0.2206  I   -14.040    1.982     -.956     .868  -.038000   .205000   .2323000      .000      .000  
+81 928 44875.00 I  -.052222  .002103   .204084  .001106  I  .2308657  .0004046  2.4643 0.2613  I   -13.835    1.982     -.787     .868  -.040000   .206000   .2301000      .000      .000  
+81 929 44876.00 I  -.054203  .002103   .205092  .001106  I  .2284081  .0004046  2.4426 0.3443  I   -13.666    1.982     -.622     .868  -.042000   .207000   .2279000      .000      .000  
+81 930 44877.00 I  -.056160  .001213   .206123  .001181  I  .2259958  .0005573  2.3752 0.3443  I   -13.482    1.982     -.587     .868  -.043000   .209000   .2258000      .000      .000  
+8110 1 44878.00 I  -.058084  .001213   .207180  .001181  I  .2236689  .0005573  2.2744 0.3941  I   -13.205    1.982     -.736     .868  -.045000   .210000   .2236000      .000      .000  
+8110 2 44879.00 I  -.059970  .001213   .208266  .001181  I  .2214526  .0005573  2.1568 0.4079  I   -12.702    1.982     -.969     .868  -.047000   .211000   .2214000      .000      .000  
+8110 3 44880.00 I  -.061812  .000881   .209382  .000922  I  .2193548  .0005958  2.0406 0.3575  I   -11.976    1.982    -1.126     .868  -.049000   .212000   .2192000      .000      .000  
+8110 4 44881.00 I  -.063603  .001432   .210532  .000926  I  .2173644  .0004478  1.9453 0.3727  I   -11.306    1.982    -1.161     .868  -.050000   .213000   .2169000      .000      .000  
+8110 5 44882.00 I  -.065341  .001432   .211718  .000926  I  .2154516  .0004478  1.8876 0.2483  I   -11.003    1.982    -1.168     .868  -.052000   .215000   .2147000      .000      .000  
+8110 6 44883.00 I  -.067020  .001824   .212941  .000929  I  .2135733  .0002146  1.8775 0.2397  I   -10.996    1.982    -1.230     .868  -.053000   .216000   .2124000      .000      .000  
+8110 7 44884.00 I  -.068636  .002727   .214202  .001927  I  .2116786  .0001712  1.9214 0.1373  I   -10.879    1.982    -1.314     .868  -.055000   .217000   .2102000      .000      .000  
+8110 8 44885.00 I  -.070186  .002727   .215504  .001927  I  .2097112  .0001712  2.0232 0.1211  I   -10.405    1.982    -1.349     .868  -.056000   .218000   .2079000      .000      .000  
+8110 9 44886.00 I  -.071670  .002727   .216846  .001927  I  .2076132  .0001712  2.1819 0.1727  I    -9.746    1.982    -1.327     .868  -.058000   .219000   .2056000      .000      .000  
+811010 44887.00 I  -.073087  .002406   .218228  .001834  I  .2053325  .0002999  2.3853 0.1727  I    -9.179    1.982    -1.255     .868  -.059000   .221000   .2032000      .000      .000  
+811011 44888.00 I  -.074442  .002406   .219649  .001834  I  .2028375  .0002999  2.6041 0.2121  I    -8.722    1.982    -1.096     .868  -.061000   .222000   .2009000      .000      .000  
+811012 44889.00 I  -.075740  .002406   .221105  .001834  I  .2001341  .0002999  2.7934 0.2243  I    -8.238    1.982     -.850     .868  -.062000   .223000   .1986000      .000      .000  
+811013 44890.00 I  -.076987  .000538   .222593  .000475  I  .1972769  .0003337  2.9041 0.2243  I    -7.731    1.982     -.667     .868  -.063000   .224000   .1962000      .000      .000  
+811014 44891.00 I  -.078189  .000538   .224110  .000475  I  .1943629  .0003337  2.9040 0.2203  I    -7.332    1.982     -.740     .868  -.064000   .226000   .1939000      .000      .000  
+811015 44892.00 I  -.079350  .000836   .225653  .000388  I  .1915051  .0002878  2.7955 0.1949  I    -7.055    1.982    -1.057     .868  -.066000   .227000   .1915000      .000      .000  
+811016 44893.00 I  -.080477  .001017   .227218  .000378  I  .1887956  .0002015  2.6161 0.1757  I    -6.750    1.982    -1.370     .868  -.067000   .229000   .1892000      .000      .000  
+811017 44894.00 I  -.081573  .001017   .228801  .000378  I  .1862774  .0002015  2.4233 0.1335  I    -6.302    1.982    -1.455     .868  -.068000   .230000   .1868000      .000      .000  
+811018 44895.00 I  -.082642  .000922   .230398  .000536  I  .1839350  .0001752  2.2724 0.1214  I    -5.734    1.982    -1.343     .868  -.069000   .231000   .1844000      .000      .000  
+811019 44896.00 I  -.083687  .001000   .232006  .000536  I  .1817077  .0001355  2.1963 0.1107  I    -5.134    1.982    -1.234     .868  -.070000   .233000   .1820000      .000      .000  
+811020 44897.00 I  -.084709  .001000   .233618  .000536  I  .1795157  .0001355  2.2002 0.0843  I    -4.548     .110    -1.249     .868  -.072000   .234000   .1797000      .000      .000  
+811021 44898.00 I  -.085710  .000797   .235233  .001396  I  .1772865  .0001003  2.2664 0.0843  I    -3.957     .110    -1.347     .868  -.073000   .236000   .1773000      .000      .000  
+811022 44899.00 I  -.086693  .000797   .236845  .001396  I  .1749720  .0001003  2.3653 0.0709  I    -3.296     .110    -1.445     .868  -.074000   .237000   .1749000      .000      .000  
+811023 44900.00 I  -.087659  .000797   .238452  .001396  I  .1725556  .0001003  2.4652 0.0694  I    -2.525     .110    -1.525     .868  -.075000   .239000   .1725000      .000      .000  
+811024 44901.00 I  -.088611  .000888   .240050  .001823  I  .1700496  .0000960  2.5411 0.0608  I    -1.709     .110    -1.585     .868  -.076000   .240000   .1700000      .000      .000  
+811025 44902.00 I  -.089553  .003430   .241637  .002271  I  .1674868  .0000687  2.5767 0.0590  I     -.980     .110    -1.570     .868  -.078000   .242000   .1676000      .000      .000  
+811026 44903.00 I  -.090490  .003430   .243214  .002271  I  .1649119  .0000687  2.5651 0.0352  I     -.394    1.982    -1.436     .868  -.079000   .243000   .1651000      .000      .000  
+811027 44904.00 I  -.091427  .004769   .244778  .002643  I  .1623716  .0000150  2.5083 0.1127  I      .130    1.982    -1.258     .868  -.080000   .245000   .1627000      .000      .000  
+811028 44905.00 I  -.092366  .003412   .246330  .001888  I  .1599077  .0002146  2.4142 0.1076  I      .702    1.982    -1.208     .868  -.081000   .247000   .1603000      .000      .000  
+811029 44906.00 I  -.093305  .003412   .247871  .001888  I  .1575515  .0002146  2.2953 0.1517  I     1.390    1.982    -1.377     .868  -.082000   .248000   .1579000      .000      .000  
+811030 44907.00 I  -.094240  .003412   .249406  .001888  I  .1553197  .0002146  2.1685 0.1857  I     2.224    1.982    -1.659     .868  -.083000   .250000   .1554000      .000      .000  
+811031 44908.00 I  -.095166  .000738   .250935  .000375  I  .1532109  .0003031  2.0525 0.1887  I     3.143    1.982    -1.868     .868  -.084000   .251000   .1530000      .000      .000  
+8111 1 44909.00 I  -.096079  .001179   .252462  .001699  I  .1512050  .0003104  1.9656 0.2169  I     3.925    1.982    -1.946     .868  -.085000   .253000   .1506000      .000      .000  
+8111 2 44910.00 I  -.096977  .001179   .253991  .001699  I  .1492653  .0003104  1.9218 0.1993  I     4.339    1.982    -1.982     .868  -.086000   .255000   .1482000      .000      .000  
+8111 3 44911.00 I  -.097855  .001057   .255525  .002302  I  .1473445  .0002502  1.9286 0.1993  I     4.467    1.982    -2.035     .868  -.087000   .257000   .1459000      .000      .000  
+8111 4 44912.00 I  -.098712  .001057   .257066  .002302  I  .1453902  .0002502  1.9890 0.1630  I     4.675    1.982    -2.028     .868  -.087000   .258000   .1435000      .000      .000  
+8111 5 44913.00 I  -.099541  .001668   .258616  .001938  I  .1433488  .0002090  2.1024 0.1630  I     5.169    1.982    -1.878     .868  -.088000   .260000   .1412000      .000      .000  
+8111 6 44914.00 I  -.100337  .001668   .260174  .001938  I  .1411696  .0002090  2.2632 0.1212  I     5.739    1.982    -1.652     .868  -.089000   .262000   .1388000      .000      .000  
+8111 7 44915.00 I  -.101093  .001748   .261743  .001679  I  .1388120  .0001228  2.4553 0.1477  I     6.083    1.982    -1.478     .868  -.090000   .264000   .1365000      .000      .000  
+8111 8 44916.00 I  -.101804  .002179   .263326  .001374  I  .1362590  .0002089  2.6473 0.1307  I     6.200    1.982    -1.350     .868  -.090000   .266000   .1342000      .000      .000  
+8111 9 44917.00 I  -.102468  .002669   .264926  .000590  I  .1335327  .0002308  2.7935 0.1557  I     6.278    1.982    -1.160     .868  -.091000   .268000   .1319000      .000      .000  
+811110 44918.00 I  -.103083  .002669   .266547  .000590  I  .1307020  .0002308  2.8498 0.2266  I     6.344    1.982     -.924     .868  -.091000   .270000   .1296000      .000      .000  
+811111 44919.00 I  -.103648  .002515   .268194  .003197  I  .1278706  .0003900  2.7937 0.2266  I     6.262    1.982     -.814     .868  -.092000   .272000   .1273000      .000      .000  
+811112 44920.00 I  -.104163  .002515   .269872  .003197  I  .1251477  .0003900  2.6384 0.2758  I     6.013    1.982     -.901     .868  -.093000   .274000   .1250000      .000      .000  
+811113 44921.00 I  -.104631  .002515   .271582  .003197  I  .1226108  .0003900  2.4323 0.2982  I     5.748    1.982     -.992     .868  -.093000   .276000   .1228000      .000      .000  
+811114 44922.00 I  -.105057  .002127   .273331  .004518  I  .1202790  .0004512  2.2386 0.2637  I     5.557    1.982     -.852     .868  -.094000   .278000   .1205000      .000      .000  
+811115 44923.00 I  -.105442  .002864   .275117  .003202  I  .1181126  .0003550  2.1081 0.2871  I     5.364    1.982     -.511     .868  -.094000   .280000   .1183000      .000      .000  
+811116 44924.00 I  -.105788  .002864   .276940  .003202  I  .1160345  .0003550  2.0626 0.1789  I     5.046    1.982     -.211     .868  -.095000   .282000   .1160000      .000      .000  
+811117 44925.00 I  -.106093  .000562   .278798  .000100  I  .1139627  .0000454  2.0913 0.1789  I     4.531     .905     -.080     .113  -.096000   .284000   .1138000      .000      .000  
+811118 44926.00 I  -.106359  .000562   .280687  .000100  I  .1118375  .0000454  2.1631 0.0321  I     3.789     .921      .007     .102  -.096000   .286000   .1115000      .000      .000  
+811119 44927.00 I  -.106590  .000562   .282607  .000100  I  .1096341  .0000454  2.2421 0.0321  I     2.864     .921      .220     .102  -.097000   .288000   .1093000      .000      .000  
+811120 44928.00 I  -.106792  .000562   .284556  .000100  I  .1073603  .0000454  2.3002 0.0262  I     1.890     .921      .546     .102  -.097000   .290000   .1070000      .000      .000  
+811121 44929.00 I  -.106971  .000678   .286533  .000095  I  .1050456  .0000261  2.3226 0.0262  I     1.018     .921      .857     .102  -.098000   .292000   .1048000      .000      .000  
+811122 44930.00 I  -.107133  .000678   .288535  .000095  I  .1027286  .0000261  2.3046 0.0161  I      .179     .921     1.130     .102  -.099000   .294000   .1026000      .000      .000  
+811123 44931.00 I  -.107280  .000579   .290560  .000056  I  .1004497  .0000189  2.2469 0.0590  I     -.792     .936     1.452     .868  -.099000   .296000   .1004000      .000      .000  
+811124 44932.00 I  -.107416  .004625   .292608  .000273  I  .0982459  .0001151  2.1560 0.0583  I    -1.873    1.982     1.837     .868  -.100000   .299000   .0982000      .000      .000  
+811125 44933.00 I  -.107540  .004625   .294677  .000273  I  .0961454  .0001151  2.0422 0.0814  I    -2.879    1.982     2.155     .868  -.100000   .301000   .0960000      .000      .000  
+811126 44934.00 I  -.107648  .004625   .296764  .000273  I  .0941645  .0001151  1.9195 0.1472  I    -3.679    1.982     2.291     .868  -.101000   .303000   .0938000      .000      .000  
+811127 44935.00 I  -.107733  .003310   .298869  .002690  I  .0923040  .0002710  1.8042 0.0628  I    -4.285    1.982     2.297     .868  -.101000   .305000   .0916000      .000      .000  
+811128 44936.00 I  -.107791  .004135   .300991  .002312  I  .0905479  .0000501  1.7136 0.1378  I    -4.795    1.982     2.328     .868  -.102000   .307000   .0894000      .000      .000  
+811129 44937.00 I  -.107815  .004135   .303127  .002312  I  .0888633  .0000501  1.6635 0.0354  I    -5.338    1.982     2.460     .868  -.102000   .310000   .0872000      .000      .000  
+811130 44938.00 I  -.107800  .004135   .305278  .002312  I  .0872040  .0000501  1.6643 0.0354  I    -6.041    1.982     2.629     .868  -.103000   .312000   .0850000      .000      .000  
+8112 1 44939.00 I  -.107740  .004135   .307440  .002312  I  .0855165  .0000501  1.7199 0.0385  I    -6.891    1.982     2.779     .868  -.103000   .314000   .0828000      .000      .000  
+8112 2 44940.00 I  -.107632  .007051   .309614  .002234  I  .0837467  .0000586  1.8279 0.0385  I    -7.700    1.982     2.968     .868  -.103000   .314000   .0806000      .000      .000  
+8112 3 44941.00 I  -.107476  .007051   .311800  .002234  I  .0818456  .0000586  1.9811 0.0441  I    -8.322    1.982     3.266     .868  -.103000   .314000   .0785000      .000      .000  
+8112 4 44942.00 I  -.107274  .009073   .314001  .002153  I  .0797734  .0000660  2.1676 0.0441  I    -8.835    1.982     3.608     .868  -.104000   .314000   .0763000      .000      .000  
+8112 5 44943.00 I  -.107030  .009073   .316218  .002153  I  .0775061  .0000660  2.3669 0.3207  I    -9.399    1.982     3.858     .868  -.104000   .314000   .0742000      .000      .000  
+8112 6 44944.00 I  -.106757  .009266   .318450  .001575  I  .0750458  .0006380  2.5477 0.3207  I   -10.018    1.982     4.003     .868  -.104000   .314000   .0720000      .000      .000  
+8112 7 44945.00 I  -.106473  .009266   .320697  .001575  I  .0724298  .0006380  2.6712 0.5516  I   -10.612    1.982     4.174     .868  -.104000   .318000   .0699000      .000      .000  
+8112 8 44946.00 I  -.106199  .009455   .322958  .000569  I  .0697333  .0008999  2.7048 0.4686  I   -11.231    1.982     4.430     .868  -.104000   .323000   .0677000      .000      .000  
+8112 9 44947.00 I  -.105953  .009107   .325231  .001187  I  .0670535  .0006864  2.6384 0.5659  I   -11.999    1.982     4.641     .868  -.104000   .327000   .0656000      .000      .000  
+811210 44948.00 I  -.105744  .009107   .327514  .001187  I  .0644823  .0006864  2.4945 0.4854  I   -12.839    1.982     4.690     .868  -.104000   .332000   .0634000      .000      .000  
+811211 44949.00 I  -.105574  .009107   .329807  .001187  I  .0620725  .0006864  2.3265 0.3667  I   -13.484    1.982     4.686     .868  -.104000   .336000   .0613000      .000      .000  
+811212 44950.00 I  -.105442  .006184   .332106  .001657  I  .0598174  .0002584  2.1942 0.3667  I   -13.767    1.982     4.833     .868  -.104000   .338000   .0592000      .000      .000  
+811213 44951.00 I  -.105335  .006184   .334407  .001657  I  .0576587  .0002584  2.1380 0.1827  I   -13.762    1.982     5.121     .868  -.104000   .340000   .0570000      .000      .000  
+811214 44952.00 I  -.105240  .006184   .336708  .001657  I  .0555139  .0002584  2.1644 0.1349  I   -13.655    1.982     5.314     .868  -.103000   .342000   .0549000      .000      .000  
+811215 44953.00 I  -.105141  .001281   .339004  .001285  I  .0533108  .0000774  2.2482 0.1672  I   -13.612    1.982     5.283     .868  -.103000   .344000   .0527000      .000      .000  
+811216 44954.00 I  -.105022  .001281   .341291  .001285  I  .0510120  .0002121  2.3487 0.1577  I   -13.767    1.982     5.201     .868  -.103000   .346000   .0506000      .000      .000  
+811217 44955.00 I  -.104869  .002934   .343568  .001323  I  .0486201  .0003057  2.4292 0.2072  I   -14.153    1.982     5.309     .868  -.102000   .348000   .0485000      .000      .000  
+811218 44956.00 I  -.104667  .003592   .345832  .001062  I  .0461677  .0003560  2.4674 0.2346  I   -14.622    1.982     5.604     .868  -.102000   .350000   .0463000      .000      .000  
+811219 44957.00 I  -.104404  .003592   .348081  .001062  I  .0437014  .0003560  2.4571 0.2517  I   -14.989    1.982     5.872     .868  -.101000   .352000   .0442000      .000      .000  
+811220 44958.00 I  -.104069  .003592   .350313  .001062  I  .0412683  .0003560  2.4022 0.2540  I   -15.283    1.982     5.981     .868  -.101000   .354000   .0420000      .000      .000  
+811221 44959.00 I  -.103653  .003435   .352526  .001021  I  .0389087  .0003623  2.3120 0.2510  I   -15.681    1.982     6.003     .868  -.100000   .356000   .0399000      .000      .000  
+811222 44960.00 I  -.103155  .003435   .354720  .001021  I  .0366522  .0003540  2.1980 0.1965  I   -16.206    1.982     6.050     .868  -.099000   .358000   .0378000      .000      .000  
+811223 44961.00 I  -.102571  .001027   .356893  .000364  I  .0345166  .0001521  2.0724 0.1926  I   -16.649    1.982     6.108     .868  -.099000   .360000   .0357000      .000      .000  
+811224 44962.00 I  -.101899  .001027   .359045  .000364  I  .0325064  .0001521  1.9500 0.1076  I   -16.839    1.982     6.083     .868  -.098000   .362000   .0335000      .000      .000  
+811225 44963.00 I  -.101139  .001027   .361177  .000364  I  .0306103  .0001521  1.8466 0.1648  I   -16.827    1.982     5.958     .868  -.098000   .364000   .0314000      .000      .000  
+811226 44964.00 I  -.100290  .002534   .363287  .000530  I  .0288017  .0002923  1.7776 0.2067  I   -16.746    1.982     5.823     .868  -.097000   .366000   .0293000      .000      .000  
+811227 44965.00 I  -.099351  .003433   .365377  .000655  I  .0270397  .0003844  1.7548 0.2415  I   -16.654    1.982     5.756     .868  -.096000   .368000   .0271000      .000      .000  
+811228 44966.00 I  -.098323  .003433   .367444  .000655  I  .0252743  .0003844  1.7852 0.2461  I   -16.581    1.982     5.752     .868  -.095000   .370000   .0249000      .000      .000  
+811229 44967.00 I  -.097204  .006823   .369491  .001586  I  .0234518  .0003073  1.8679 0.2461  I   -16.589    1.982     5.769     .868  -.094000   .372000   .0228000      .000      .000  
+811230 44968.00 I  -.095993  .006823   .371516  .001586  I  .0215243  .0003073  1.9931 0.2173  I   -16.706    1.982     5.798     .868  -.093000   .374000   .0206000      .000      .000  
+811231 44969.00 I  -.094684  .006823   .373520  .001586  I  .0194563  .0003073  2.1460 0.1841  I   -16.873    1.982     5.852     .868  -.092000   .376000   .0184000      .000      .000  
+82 1 1 44970.00 I  -.093270  .009017   .375504  .002146  I  .0172296  .0002029  2.3070 0.2160  I   -17.013    1.982     5.904     .868  -.091000   .378000   .0163000      .000      .000  
+82 1 2 44971.00 I  -.091756  .006377   .377467  .001876  I  .0148474  .0003035  2.4529 0.1825  I   -17.095    1.982     5.903     .868  -.090000   .380000   .0141000      .000      .000  
+82 1 3 44972.00 I  -.090151  .006377   .379406  .001876  I  .0123377  .0003035  2.5572 0.2425  I   -17.120    1.982     5.863     .868  -.089000   .382000   .0120000      .000      .000  
+82 1 4 44973.00 I  -.088467  .000096   .381320  .001559  I  .0097557  .0003782  2.5936 0.2120  I   -17.145    1.982     5.867     .868  -.088000   .384000   .0098000      .000      .000  
+82 1 5 44974.00 I  -.086713  .000784   .383207  .001120  I  .0071781  .0002961  2.5473 0.2424  I   -17.319    1.982     5.947     .868  -.087000   .386000   .0077000      .000      .000  
+82 1 6 44975.00 I  -.084900  .001117   .385064  .000992  I  .0046864  .0003034  2.4250 0.2120  I   -17.752    1.982     6.005     .868  -.086000   .388000   .0052000      .000      .000  
+82 1 7 44976.00 I  -.083037  .001117   .386892  .000992  I  .0023421  .0003034  2.2605 0.2069  I   -18.316    1.982     5.936     .868  -.085000   .390000   .0028000      .000      .000  
+82 1 8 44977.00 I  -.081135  .001366   .388691  .000510  I  .0001620  .0002814  2.1060 0.2069  I   -18.684    1.982     5.800     .868  -.084000   .391000   .0003000      .000      .000  
+82 1 9 44978.00 I  -.079203  .001366   .390460  .000510  I -.0018896  .0002814  2.0104 0.1886  I   -18.614    1.982     5.759     .868  -.083000   .393000  -.0021000      .000      .000  
+82 110 44979.00 I  -.077248  .001907   .392198  .000759  I -.0038869  .0002513  1.9990 0.1937  I   -18.119    1.982     5.834     .868  -.082000   .395000  -.0046000      .000      .000  
+82 111 44980.00 I  -.075276  .002201   .393905  .000908  I -.0059126  .0002664  2.0627 0.1257  I   -17.380    1.982     5.843     .868  -.081000   .396000  -.0071000      .000      .000  
+82 112 44981.00 I  -.073292  .002678   .395579  .001099  I -.0080250  .0000029  2.1646 0.1500  I   -16.626    1.982     5.660     .868  -.080000   .398000  -.0096000      .000      .000  
+82 113 44982.00 I  -.071301  .002587   .397219  .000823  I -.0102397  .0001380  2.2602 0.0690  I   -16.081    1.982     5.423     .868  -.078000   .399000  -.0121000      .000      .000  
+82 114 44983.00 I  -.069308  .002587   .398823  .000823  I -.0125318  .0001380  2.3151 0.0976  I   -15.882    1.982     5.383     .868  -.077000   .401000  -.0146000      .000      .000  
+82 115 44984.00 I  -.067313  .002587   .400393  .000823  I -.0148514  .0001380  2.3145 0.0993  I   -15.953    1.982     5.587     .868  -.076000   .402000  -.0171000      .000      .000  
+82 116 44985.00 I  -.065316  .001850   .401928  .000494  I -.0171431  .0001428  2.2607 0.0993  I   -16.090    1.982     5.816     .868  -.074000   .403000  -.0192000      .000      .000  
+82 117 44986.00 I  -.063321  .001850   .403428  .000494  I -.0193587  .0001428  2.1648 0.1010  I   -16.205    1.982     5.859     .868  -.073000   .404000  -.0213000      .000      .000  
+82 118 44987.00 I  -.061331  .001850   .404895  .000494  I -.0214634  .0001428  2.0412 0.0760  I   -16.350    1.982     5.725     .868  -.071000   .406000  -.0235000      .000      .000  
+82 119 44988.00 I  -.059352  .000794   .406328  .000583  I -.0234369  .0000519  1.9050 0.0760  I   -16.501    1.982     5.560     .868  -.070000   .407000  -.0256000      .000      .000  
+82 120 44989.00 I  -.057388  .000794   .407730  .000583  I -.0252742  .0000519  1.7712 0.2480  I   -16.468    1.982     5.440     .868  -.068000   .408000  -.0277000      .000      .000  
+82 121 44990.00 I  -.055443  .000794   .409100  .000583  I -.0269851  .0004932  1.6547 0.3741  I   -16.135    1.982     5.317     .868  -.066000   .409000  -.0289000      .000      .000  
+82 122 44991.00 I  -.053521  .003310   .410441  .002690  I -.0285942  .0007463  1.5698 0.3496  I   -15.627    1.982     5.127     .868  -.064000   .410000  -.0301000      .000      .000  
+82 123 44992.00 I  -.051625  .007194   .411754  .002014  I -.0301393  .0004955  1.5285 0.4479  I   -15.135    1.982     4.888     .868  -.062000   .412000  -.0313000      .000      .000  
+82 124 44993.00 I  -.049757  .007194   .413040  .002014  I -.0316687  .0004955  1.5397 0.3504  I   -14.689    1.982     4.679     .868  -.060000   .413000  -.0325000      .000      .000  
+82 125 44994.00 I  -.047923  .007194   .414302  .002014  I -.0332374  .0004955  1.6070 0.3174  I   -14.220    1.982     4.568     .868  -.058000   .414000  -.0337000      .000      .000  
+82 126 44995.00 I  -.046124  .005135   .415539  .001426  I -.0348993  .0003967  1.7243 0.2499  I   -13.760    1.982     4.555     .868  -.056000   .415000  -.0357000      .000      .000  
+82 127 44996.00 I  -.044360  .005135   .416754  .001426  I -.0366974  .0000647  1.8759 0.2010  I   -13.430    1.982     4.572     .868  -.054000   .416000  -.0378000      .000      .000  
+82 128 44997.00 I  -.042622  .005135   .417944  .001426  I -.0386546  .0000647  2.0379 0.0381  I   -13.265    1.982     4.534     .868  -.051000   .417000  -.0398000      .000      .000  
+82 129 44998.00 I  -.040900  .000989   .419110  .000107  I -.0407674  .0000403  2.1826 0.0625  I   -13.161    1.982     4.403     .868  -.049000   .418000  -.0419000      .000      .000  
+82 130 44999.00 I  -.039185  .001420   .420248  .000744  I -.0430055  .0001070  2.2844 0.0572  I   -13.006    1.982     4.219     .868  -.047000   .419000  -.0439000      .000      .000  
+82 131 45000.00 I  -.037469  .001420   .421359  .000744  I -.0453154  .0001070  2.3239 0.0905  I   -12.789    1.982     4.062     .868  -.045000   .420000  -.0462000      .000      .000  
+82 2 1 45001.00 I  -.035743  .001747   .422440  .001046  I -.0476297  .0001459  2.2928 0.0905  I   -12.590    1.982     3.982     .868  -.043000   .421000  -.0485000      .000      .000  
+82 2 2 45002.00 I  -.033998  .001747   .423491  .001046  I -.0498798  .0001459  2.1981 0.1033  I   -12.514    1.982     3.955     .868  -.040000   .422000  -.0507000      .000      .000  
+82 2 3 45003.00 I  -.032228  .001382   .424510  .000741  I -.0520130  .0001462  2.0647 0.1033  I   -12.588    1.982     3.892     .868  -.038000   .423000  -.0530000      .000      .000  
+82 2 4 45004.00 I  -.030426  .001382   .425498  .000741  I -.0540096  .0001462  1.9327 0.1035  I   -12.694    1.982     3.728     .868  -.036000   .424000  -.0553000      .000      .000  
+82 2 5 45005.00 I  -.028587  .000876   .426453  .000053  I -.0558938  .0001466  1.8470 0.0954  I   -12.625    1.982     3.501     .868  -.034000   .425000  -.0574000      .000      .000  
+82 2 6 45006.00 I  -.026708  .000876   .427377  .000053  I -.0577298  .0001226  1.8398 0.0893  I   -12.250    1.982     3.322     .868  -.032000   .426000  -.0596000      .000      .000  
+82 2 7 45007.00 I  -.024782  .001713   .428269  .001486  I -.0596014  .0001019  1.9165 0.0797  I   -11.600    1.982     3.225     .868  -.029000   .426000  -.0617000      .000      .000  
+82 2 8 45008.00 I  -.022809  .001713   .429130  .001486  I -.0615825  .0001019  2.0524 0.0602  I   -10.801    1.982     3.104     .868  -.027000   .427000  -.0639000      .000      .000  
+82 2 9 45009.00 I  -.020783  .002259   .429960  .002101  I -.0637115  .0000640  2.2043 0.0617  I    -9.992    1.982     2.850     .868  -.025000   .428000  -.0660000      .000      .000  
+82 210 45010.00 I  -.018701  .001677   .430758  .001618  I -.0659818  .0000697  2.3285 0.0715  I    -9.307    1.982     2.530     .868  -.023000   .429000  -.0686000      .000      .000  
+82 211 45011.00 I  -.016564  .001677   .431527  .001618  I -.0683497  .0001279  2.3965 0.0760  I    -8.860    1.982     2.346     .868  -.021000   .430000  -.0711000      .000      .000  
+82 212 45012.00 I  -.014371  .001677   .432269  .001618  I -.0707537  .0001351  2.4012 0.0928  I    -8.680    1.982     2.391     .868  -.018000   .430000  -.0737000      .000      .000  
+82 213 45013.00 I  -.012124  .001763   .432987  .001385  I -.0731338  .0001344  2.3511 0.0953  I    -8.688    1.982     2.530     .868  -.016000   .431000  -.0762000      .000      .000  
+82 214 45014.00 I  -.009825  .001763   .433684  .001385  I -.0754433  .0001344  2.2631 0.0975  I    -8.782    1.982     2.559     .868  -.014000   .432000  -.0788000      .000      .000  
+82 215 45015.00 I  -.007476  .001459   .434361  .001395  I -.0776534  .0001414  2.1552 0.1019  I    -8.864    1.982     2.423     .868  -.012000   .433000  -.0809000      .000      .000  
+82 216 45016.00 I  -.005079  .001712   .435019  .001584  I -.0797529  .0001532  2.0451 0.0929  I    -8.799    1.982     2.228     .868  -.010000   .433000  -.0830000      .000      .000  
+82 217 45017.00 I  -.002636  .001712   .435659  .001584  I -.0817487  .0001204  1.9505 0.1114  I    -8.435    1.982     2.072     .868  -.007000   .434000  -.0852000      .000      .000  
+82 218 45018.00 I  -.000144  .001712   .436282  .001584  I -.0836642  .0001617  1.8869 0.2000  I    -7.754    1.982     1.943     .868  -.005000   .434000  -.0873000      .000      .000  
+82 219 45019.00 I   .002399  .000413   .436885  .001416  I -.0855371  .0003814  1.8670 0.1932  I    -6.945    1.982     1.769     .868  -.003000   .435000  -.0894000      .000      .000  
+82 220 45020.00 I   .004994  .004493   .437468  .001830  I -.0874157  .0003509  1.8994 0.2713  I    -6.239    1.982     1.526     .868  -.001000   .435000  -.0915000      .000      .000  
+82 221 45021.00 I   .007642  .006341   .438026  .002166  I -.0893546  .0003858  1.9877 0.2608  I    -5.696    1.982     1.275     .868   .001000   .436000  -.0935000      .000      .000  
+82 222 45022.00 I   .010346  .006341   .438557  .002166  I -.0914086  .0003858  2.1285 0.2728  I    -5.220    1.982     1.121     .868   .004000   .436000  -.0956000      .000      .000  
+82 223 45023.00 I   .013106  .006341   .439060  .002166  I -.0936249  .0003858  2.3091 0.3136  I    -4.739    1.982     1.122     .868   .006000   .437000  -.0976000      .000      .000  
+82 224 45024.00 I   .015915  .004499   .439529  .001870  I -.0960319  .0004946  2.5050 0.2589  I    -4.281    1.982     1.212     .868   .008000   .437000  -.0997000      .000      .000  
+82 225 45025.00 I   .018763  .004499   .439959  .001870  I -.0986291  .0003454  2.6834 0.4592  I    -3.909    1.982     1.240     .868   .010000   .437000  -.1023000      .000      .000  
+82 226 45026.00 I   .021638  .000528   .440346  .001519  I -.1013812  .0007739  2.8095 0.4237  I    -3.639    1.982     1.098     .868   .012000   .438000  -.1049000      .000      .000  
+82 227 45027.00 I   .024531  .000528   .440682  .001519  I -.1042217  .0007739  2.8566 0.4982  I    -3.454    1.982      .826     .868   .015000   .438000  -.1075000      .000      .000  
+82 228 45028.00 I   .027431  .000722   .440966  .003324  I -.1070648  .0006275  2.8148 0.4982  I    -3.341    1.982      .558     .868   .017000   .439000  -.1101000      .000      .000  
+82 3 1 45029.00 I   .030329  .000722   .441192  .003324  I -.1098255  .0006275  2.6957 0.4394  I    -3.284    1.982      .397     .868   .019000   .439000  -.1127000      .000      .000  
+82 3 2 45030.00 I   .033215  .003015   .441358  .003167  I -.1124409  .0006153  2.5307 0.4498  I    -3.235    1.982      .332     .868   .021000   .439000  -.1149000      .000      .000  
+82 3 3 45031.00 I   .036080  .003015   .441461  .003167  I -.1148853  .0006447  2.3610 0.3782  I    -3.108    1.982      .282     .868   .023000   .439000  -.1170000      .000      .000  
+82 3 4 45032.00 I   .038915  .003015   .441502  .003167  I -.1171751  .0004401  2.2280 0.3903  I    -2.811    1.982      .183     .868   .026000   .440000  -.1192000      .000      .000  
+82 3 5 45033.00 I   .041713  .003015   .441483  .003167  I -.1193640  .0004401  2.1632 0.3100  I    -2.293    1.982      .031     .868   .028000   .440000  -.1213000      .000      .000  
+82 3 6 45034.00 I   .044468  .003593   .441406  .000566  I -.1215290  .0004368  2.1807 0.3100  I    -1.605    1.982     -.129     .868   .030000   .440000  -.1235000      .000      .000  
+82 3 7 45035.00 I   .047179  .003593   .441276  .000566  I -.1237490  .0004368  2.2688 0.2990  I     -.894    1.982     -.266     .868   .024000   .446000  -.1259000      .000      .000  
+82 3 8 45036.00 I   .049845  .002240   .441095  .000834  I -.1260787  .0004083  2.3933 0.2509  I     -.304    1.982     -.412     .868   .026000   .445000  -.1282000      .000      .000  
+82 3 9 45037.00 I   .052468  .002240   .440866  .000834  I -.1285333  .0002470  2.5110 0.2386  I      .118    1.982     -.618     .868   .028000   .445000  -.1306000      .000      .000  
+82 310 45038.00 I   .055050  .002240   .440593  .000834  I -.1310860  .0002470  2.5847 0.1761  I      .433    1.982     -.858     .868   .030000   .445000  -.1329000      .000      .000  
+82 311 45039.00 I   .057596  .003482   .440277  .000681  I -.1336814  .0002511  2.5947 0.1894  I      .698    1.982    -1.018     .868   .042000   .440000  -.1353000      .000      .000  
+82 312 45040.00 I   .060110  .003740   .439922  .000713  I -.1362541  .0002873  2.5409 0.1908  I      .888    1.982    -1.015     .868   .045000   .440000  -.1376000      .000      .000  
+82 313 45041.00 I   .062597  .003740   .439531  .000713  I -.1387466  .0002873  2.4373 0.1935  I      .922    1.982     -.910     .868   .047000   .440000  -.1399000      .000      .000  
+82 314 45042.00 I   .065059  .005133   .439108  .000033  I -.1411186  .0002593  2.3035 0.1479  I      .794    1.982     -.848     .868   .050000   .439000  -.1423000      .000      .000  
+82 315 45043.00 I   .067495  .001797   .438656  .000634  I -.1433509  .0000701  2.1616 0.1343  I      .644    1.982     -.899     .868   .052000   .439000  -.1446000      .000      .000  
+82 316 45044.00 I   .069900  .001797   .438180  .000634  I -.1454461  .0000701  2.0326 0.0432  I      .680    1.982    -1.011     .868   .055000   .439000  -.1469000      .000      .000  
+82 317 45045.00 I   .072266  .001105   .437682  .000749  I -.1474266  .0000505  1.9350 0.0432  I     1.020    1.982    -1.114     .868   .057000   .439000  -.1489000      .000      .000  
+82 318 45046.00 I   .074588  .001105   .437168  .000749  I -.1493315  .0000505  1.8834 0.0357  I     1.624    1.982    -1.198     .868   .060000   .438000  -.1509000      .000      .000  
+82 319 45047.00 I   .076865  .001105   .436637  .000749  I -.1512116  .0000505  1.8862 0.0357  I     2.346    1.982    -1.297     .868   .062000   .438000  -.1529000      .000      .000  
+82 320 45048.00 I   .079099  .001105   .436091  .000749  I -.1531232  .0000505  1.9467 0.0349  I     3.017    1.982    -1.425     .868   .065000   .437000  -.1549000      .000      .000  
+82 321 45049.00 I   .081299  .001979   .435531  .000561  I -.1551240  .0000482  2.0642 0.0664  I     3.496    1.982    -1.558     .868   .067000   .437000  -.1569000      .000      .000  
+82 322 45050.00 I   .083474  .004444   .434956  .001274  I -.1572687  .0001229  2.2330 0.0393  I     3.743    1.982    -1.648     .868   .069000   .437000  -.1595000      .000      .000  
+82 323 45051.00 I   .085634  .005848   .434365  .001265  I -.1596019  .0000622  2.4376 0.0706  I     3.857    1.982    -1.636     .868   .072000   .436000  -.1621000      .000      .000  
+82 324 45052.00 I   .087787  .005848   .433758  .001265  I -.1621463  .0000696  2.6494 0.0467  I     4.009    1.982    -1.511     .868   .074000   .436000  -.1646000      .000      .000  
+82 325 45053.00 I   .089939  .005848   .433136  .001265  I -.1648898  .0000696  2.8286 0.0676  I     4.250    1.982    -1.368     .868   .077000   .435000  -.1672000      .000      .000  
+82 326 45054.00 I   .092088  .004256   .432499  .001672  I -.1677794  .0001159  2.9357 0.1516  I     4.443    1.982    -1.361     .868   .079000   .435000  -.1698000      .000      .000  
+82 327 45055.00 I   .094233  .001421   .431849  .001998  I -.1707293  .0002952  2.9471 0.1586  I     4.410    1.982    -1.558     .868   .081000   .434000  -.1725000      .000      .000  
+82 328 45056.00 I   .096372  .001421   .431186  .001998  I -.1736428  .0002952  2.8660 0.2087  I     4.147    1.982    -1.856     .868   .084000   .434000  -.1752000      .000      .000  
+82 329 45057.00 I   .098502  .001421   .430514  .001998  I -.1764405  .0002952  2.7226 0.2320  I     3.827    1.982    -2.077     .868   .086000   .433000  -.1778000      .000      .000  
+82 330 45058.00 I   .100624  .001344   .429830  .001622  I -.1790828  .0003580  2.5635 0.2320  I     3.644    1.982    -2.124     .868   .089000   .433000  -.1805000      .000      .000  
+82 331 45059.00 I   .102737  .001344   .429134  .001622  I -.1815781  .0003580  2.4362 0.2770  I     3.680    1.982    -2.037     .868   .091000   .432000  -.1832000      .000      .000  
+82 4 1 45060.00 I   .104842  .001262   .428425  .001125  I -.1839775  .0004228  2.3759 0.2059  I     3.930    1.982    -1.926     .868   .093000   .431000  -.1857000      .000      .000  
+82 4 2 45061.00 I   .106941  .001262   .427702  .001125  I -.1863567  .0002037  2.3962 0.2347  I     4.362    1.982    -1.876     .868   .096000   .430000  -.1881000      .000      .000  
+82 4 3 45062.00 I   .109031  .001262   .426961  .001125  I -.1887936  .0002037  2.4877 0.1629  I     4.912    1.982    -1.902     .868   .098000   .430000  -.1906000      .000      .000  
+82 4 4 45063.00 I   .111112  .002211   .426199  .001229  I -.1913466  .0002542  2.6227 0.1798  I     5.442    1.982    -1.976     .868   .101000   .429000  -.1930000      .000      .000  
+82 4 5 45064.00 I   .113181  .002860   .425415  .001326  I -.1940409  .0002963  2.7635 0.2270  I     5.772    1.982    -2.060     .868   .103000   .428000  -.1955000      .000      .000  
+82 4 6 45065.00 I   .115237  .002860   .424605  .001326  I -.1968630  .0003762  2.8727 0.2394  I     5.807    1.982    -2.127     .868   .105000   .427000  -.1981000      .000      .000  
+82 4 7 45066.00 I   .117279  .002860   .423766  .001326  I -.1997669  .0003762  2.9239 0.2660  I     5.636    1.982    -2.146     .868   .107000   .426000  -.2009000      .000      .000  
+82 4 8 45067.00 I   .119306  .002860   .422896  .001326  I -.2026883  .0003762  2.9076 0.2660  I     5.453    1.982    -2.084     .868   .110000   .426000  -.2038000      .000      .000  
+82 4 9 45068.00 I   .121322  .002860   .421994  .001326  I -.2055617  .0003762  2.8300 0.2249  I     5.351    1.982    -1.949     .868   .112000   .425000  -.2066000      .000      .000  
+82 410 45069.00 I   .123331  .003310   .421059  .002690  I -.2083333  .0002466  2.7075 0.2435  I     5.237    1.982    -1.814     .868   .114000   .424000  -.2093000      .000      .000  
+82 411 45070.00 I   .125337  .001441   .420090  .000690  I -.2109687  .0003094  2.5611 0.1777  I     5.011    1.982    -1.762     .868   .116000   .423000  -.2118000      .000      .000  
+82 412 45071.00 I   .127343  .001441   .419085  .000690  I -.2134548  .0002560  2.4125 0.2008  I     4.740    1.982    -1.807     .868   .118000   .422000  -.2143000      .000      .000  
+82 413 45072.00 I   .129354  .001441   .418044  .000690  I -.2158001  .0002560  2.2830 0.1821  I     4.590    1.982    -1.895     .868   .121000   .422000  -.2165000      .000      .000  
+82 414 45073.00 I   .131372  .001624   .416966  .000642  I -.2180335  .0002590  2.1916 0.1821  I     4.623    1.982    -1.987     .868   .123000   .421000  -.2187000      .000      .000  
+82 415 45074.00 I   .133400  .001624   .415850  .000642  I -.2202005  .0002590  2.1517 0.2226  I     4.795    1.982    -2.084     .868   .125000   .420000  -.2209000      .000      .000  
+82 416 45075.00 I   .135437  .001624   .414696  .000642  I -.2223560  .0003620  2.1689 0.2027  I     5.101    1.982    -2.166     .868   .127000   .419000  -.2230000      .000      .000  
+82 417 45076.00 I   .137486  .001267   .413503  .000742  I -.2245576  .0003120  2.2438 0.2389  I     5.541    1.982    -2.188     .868   .130000   .418000  -.2252000      .000      .000  
+82 418 45077.00 I   .139544  .001267   .412274  .000742  I -.2268617  .0003120  2.3729 0.2206  I     5.936    1.982    -2.151     .868   .132000   .416000  -.2274000      .000      .000  
+82 419 45078.00 I   .141609  .001267   .411007  .000742  I -.2293184  .0003120  2.5471 0.2740  I     5.998    1.982    -2.129     .868   .135000   .415000  -.2299000      .000      .000  
+82 420 45079.00 I   .143679  .000337   .409704  .000824  I -.2319647  .0004505  2.7479 0.2740  I     5.685    1.982    -2.155     .868   .137000   .414000  -.2325000      .000      .000  
+82 421 45080.00 I   .145750  .000337   .408365  .000824  I -.2348120  .0004505  2.9422 0.3166  I     5.308    1.982    -2.147     .868   .139000   .413000  -.2353000      .000      .000  
+82 422 45081.00 I   .147821  .000656   .406989  .001036  I -.2378327  .0004450  3.0872 0.3311  I     5.144    1.982    -2.031     .868   .141000   .411000  -.2383000      .000      .000  
+82 423 45082.00 I   .149889  .000799   .405577  .001111  I -.2409566  .0004853  3.1428 0.3292  I     5.065    1.982    -1.898     .868   .143000   .410000  -.2415000      .000      .000  
+82 424 45083.00 I   .151952  .000799   .404127  .001111  I -.2440824  .0004853  3.0906 0.3432  I     4.745    1.982    -1.932     .868   .145000   .408000  -.2446000      .000      .000  
+82 425 45084.00 I   .154008  .000799   .402641  .001111  I -.2471068  .0004853  2.9455 0.3016  I     4.135    1.982    -2.176     .868   .147000   .407000  -.2476000      .000      .000  
+82 426 45085.00 I   .156054  .000794   .401118  .000971  I -.2499578  .0003581  2.7536 0.3016  I     3.551    1.982    -2.449     .868   .149000   .406000  -.2504000      .000      .000  
+82 427 45086.00 I   .158087  .000794   .399556  .000971  I -.2526180  .0003581  2.5738 0.2015  I     3.295    1.982    -2.541     .868   .151000   .404000  -.2531000      .000      .000  
+82 428 45087.00 I   .160102  .001001   .397954  .000177  I -.2551261  .0001847  2.4560 0.2015  I     3.354    1.982    -2.423     .868   .153000   .403000  -.2556000      .000      .000  
+82 429 45088.00 I   .162096  .001001   .396311  .000177  I -.2575582  .0001847  2.4229 0.1306  I     3.508    1.982    -2.239     .868   .155000   .401000  -.2580000      .000      .000  
+82 430 45089.00 I   .164065  .001001   .394625  .000177  I -.2599978  .0001847  2.4676 0.1306  I     3.610    1.982    -2.129     .868   .157000   .400000  -.2604000      .000      .000  
+82 5 1 45090.00 I   .166004  .001001   .392896  .000177  I -.2625100  .0001847  2.5621 0.1125  I     3.683    1.982    -2.123     .868   .159000   .398000  -.2628000      .000      .000  
+82 5 2 45091.00 I   .167910  .001034   .391120  .001044  I -.2651262  .0001284  2.6692 0.1125  I     3.795    1.982    -2.180     .868   .161000   .397000  -.2653000      .000      .000  
+82 5 3 45092.00 I   .169780  .001034   .389297  .001044  I -.2678408  .0001284  2.7536 0.1763  I     3.901    1.982    -2.240     .868   .163000   .395000  -.2680000      .000      .000  
+82 5 4 45093.00 I   .171613  .000431   .387425  .002773  I -.2706173  .0003284  2.7896 0.1463  I     3.845    1.982    -2.244     .868   .165000   .394000  -.2706000      .000      .000  
+82 5 5 45094.00 I   .173407  .000431   .385501  .002773  I -.2733995  .0002630  2.7641 0.2104  I     3.538    1.982    -2.138     .868   .167000   .392000  -.2733000      .000      .000  
+82 5 6 45095.00 I   .175159  .000431   .383526  .002773  I -.2761253  .0002630  2.6779 0.1860  I     3.079    1.982    -1.920     .868   .169000   .390000  -.2759000      .000      .000  
+82 5 7 45096.00 I   .176870  .000431   .381499  .002773  I -.2787385  .0002630  2.5412 0.2724  I     2.657    1.982    -1.688     .868   .171000   .388000  -.2784000      .000      .000  
+82 5 8 45097.00 I   .178538  .003207   .379421  .003546  I -.2811970  .0004772  2.3723 0.2724  I     2.348    1.982    -1.583     .868   .173000   .387000  -.2807000      .000      .000  
+82 5 9 45098.00 I   .180164  .003207   .377297  .003546  I -.2834795  .0004772  2.1926 0.3236  I     2.102    1.982    -1.664     .868   .175000   .385000  -.2829000      .000      .000  
+82 510 45099.00 I   .181745  .003659   .375131  .002548  I -.2855857  .0004371  2.0233 0.3914  I     1.894    1.982    -1.848     .868   .177000   .383000  -.2849000      .000      .000  
+82 511 45100.00 I   .183283  .003659   .372928  .002548  I -.2875363  .0006205  1.8845 0.3795  I     1.747    1.982    -2.008     .868   .179000   .381000  -.2868000      .000      .000  
+82 512 45101.00 I   .184779  .003659   .370692  .002548  I -.2893706  .0006205  1.7935 0.4108  I     1.624    1.982    -2.115     .868   .181000   .379000  -.2885000      .000      .000  
+82 513 45102.00 I   .186242  .003044   .368423  .002281  I -.2911426  .0005386  1.7605 0.3681  I     1.471    1.982    -2.224     .868   .183000   .377000  -.2901000      .000      .000  
+82 514 45103.00 I   .187678  .001907   .366121  .001359  I -.2929113  .0003962  1.7867 0.3343  I     1.397    1.982    -2.327     .868   .185000   .375000  -.2918000      .000      .000  
+82 515 45104.00 I   .189092  .001907   .363786  .001359  I -.2947347  .0003962  1.8690 0.3087  I     1.589    1.982    -2.320     .868   .187000   .373000  -.2936000      .000      .000  
+82 516 45105.00 I   .190487  .001007   .361416  .001618  I -.2966654  .0004735  1.9997 0.2556  I     1.948    1.982    -2.170     .868   .189000   .371000  -.2954000      .000      .000  
+82 517 45106.00 I   .191868  .001637   .359012  .002112  I -.2987462  .0003231  2.1666 0.2866  I     2.051    1.982    -2.026     .868   .191000   .369000  -.2975000      .000      .000  
+82 518 45107.00 I   .193238  .001637   .356574  .002112  I -.3010038  .0003231  2.3489 0.2458  I     1.647    1.982    -2.047     .868   .192000   .366000  -.2997000      .000      .000  
+82 519 45108.00 I   .194605  .001510   .354105  .002059  I -.3034383  .0003704  2.5139 0.2458  I     1.008    1.982    -2.166     .868   .194000   .364000  -.3021000      .000      .000  
+82 520 45109.00 I   .195973  .001510   .351604  .002059  I -.3060123  .0003704  2.6209 0.2760  I      .566    1.982    -2.165     .868   .196000   .362000  -.3046000      .000      .000  
+82 521 45110.00 I   .197343  .001510   .349077  .002059  I -.3086493  .0004092  2.6356 0.2691  I      .336    1.982    -1.992     .868   .198000   .360000  -.3072000      .000      .000  
+82 522 45111.00 I   .198718  .001510   .346526  .002059  I -.3112500  .0003905  2.5500 0.2762  I     -.016    1.982    -1.857     .868   .200000   .357000  -.3098000      .000      .000  
+82 523 45112.00 I   .200099  .000681   .343956  .001076  I -.3137251  .0003712  2.3920 0.2694  I     -.591    1.982    -1.947     .868   .201000   .355000  -.3121000      .000      .000  
+82 524 45113.00 I   .201486  .000681   .341371  .001076  I -.3160281  .0003712  2.2164 0.2682  I    -1.049    1.982    -2.173     .868   .203000   .352000  -.3144000      .000      .000  
+82 525 45114.00 I   .202880  .000845   .338771  .000374  I -.3181723  .0003871  2.0839 0.2613  I    -1.033    1.982    -2.294     .868   .205000   .350000  -.3164000      .000      .000  
+82 526 45115.00 I   .204280  .001049   .336160  .000299  I -.3202241  .0003679  2.0358 0.2453  I     -.595    1.982    -2.234     .868   .206000   .348000  -.3184000      .000      .000  
+82 527 45116.00 I   .205687  .001049   .333541  .000299  I -.3222740  .0003015  2.0779 0.2269  I     -.118    1.982    -2.129     .868   .208000   .345000  -.3204000      .000      .000  
+82 528 45117.00 I   .207099  .001679   .330914  .000328  I -.3244012  .0002656  2.1838 0.1875  I      .080    1.982    -2.104     .868   .209000   .343000  -.3225000      .000      .000  
+82 529 45118.00 I   .208516  .001968   .328282  .000302  I -.3266486  .0002231  2.3105 0.1734  I     -.009    1.982    -2.130     .868   .211000   .340000  -.3247000      .000      .000  
+82 530 45119.00 I   .209939  .001968   .325647  .000302  I -.3290153  .0002231  2.4164 0.1578  I     -.151    1.982    -2.127     .868   .212000   .338000  -.3270000      .000      .000  
+82 531 45120.00 I   .211368  .001968   .323011  .000302  I -.3314653  .0002231  2.4738 0.1644  I     -.128    1.982    -2.086     .868   .213000   .335000  -.3294000      .000      .000  
+82 6 1 45121.00 I   .212803  .002515   .320375  .000366  I -.3339430  .0002416  2.4714 0.1644  I      .030    1.982    -2.033     .868   .214000   .332000  -.3318000      .000      .000  
+82 6 2 45122.00 I   .214243  .002515   .317740  .000366  I -.3363887  .0002416  2.4107 0.2165  I      .080    1.982    -1.932     .868   .216000   .330000  -.3342000      .000      .000  
+82 6 3 45123.00 I   .215683  .002974   .315108  .002232  I -.3387481  .0003594  2.3012 0.2165  I     -.132    1.982    -1.739     .868   .217000   .327000  -.3365000      .000      .000  
+82 6 4 45124.00 I   .217119  .002974   .312481  .002232  I -.3409797  .0003594  2.1577 0.2541  I     -.484    1.982    -1.527     .868   .218000   .324000  -.3387000      .000      .000  
+82 6 5 45125.00 I   .218546  .002974   .309859  .002232  I -.3430580  .0003594  1.9977 0.2541  I     -.716    1.982    -1.464     .868   .219000   .321000  -.3408000      .000      .000  
+82 6 6 45126.00 I   .219954  .002974   .307245  .002232  I -.3449760  .0003594  1.8403 0.2442  I     -.705    1.982    -1.624     .868   .220000   .318000  -.3427000      .000      .000  
+82 6 7 45127.00 I   .221334  .002377   .304638  .002653  I -.3467460  .0003308  1.7049 0.2442  I     -.509    1.982    -1.877     .868   .221000   .315000  -.3445000      .000      .000  
+82 6 8 45128.00 I   .222672  .002377   .302037  .002653  I -.3483989  .0003308  1.6087 0.1872  I     -.251    1.982    -2.030     .868   .222000   .312000  -.3461000      .000      .000  
+82 6 9 45129.00 I   .223952  .000704   .299440  .001543  I -.3499803  .0001753  1.5633 0.1872  I     -.066    1.982    -2.039     .868   .223000   .309000  -.3477000      .000      .000  
+82 610 45130.00 I   .225160  .000704   .296844  .001543  I -.3515439  .0001753  1.5731 0.1240  I     -.030    1.982    -2.022     .868   .224000   .306000  -.3492000      .000      .000  
+82 611 45131.00 I   .226281  .000704   .294244  .001543  I -.3531437  .0001753  1.6346 0.1240  I     -.037    1.982    -2.051     .868   .225000   .303000  -.3507000      .000      .000  
+82 612 45132.00 I   .227300  .000704   .291637  .001543  I -.3548271  .0001753  1.7382 0.0903  I      .165    1.982    -2.031     .868   .225000   .300000  -.3523000      .000      .000  
+82 613 45133.00 I   .228203  .000898   .289017  .000653  I -.3566297  .0000434  1.8708 0.0993  I      .637    1.982    -1.869     .868   .226000   .297000  -.3541000      .000      .000  
+82 614 45134.00 I   .228977  .001650   .286377  .000446  I -.3585730  .0000934  2.0165 0.0520  I     1.066    1.982    -1.662     .868   .227000   .294000  -.3559000      .000      .000  
+82 615 45135.00 I   .229609  .001409   .283712  .000369  I -.3606600  .0000946  2.1541 0.0617  I     1.111     .329    -1.606     .211   .227000   .291000  -.3579000      .000      .000  
+82 616 45136.00 I   .230087  .000999   .281016  .000910  I -.3628686  .0000806  2.2541 0.0619  I      .844     .329    -1.717     .211   .228000   .288000  -.3600000      .000      .000  
+82 617 45137.00 I   .230396  .001374   .278281  .000807  I -.3651449  .0000799  2.2844 0.0530  I      .631     .217    -1.788     .868   .228000   .284000  -.3620000      .000      .000  
+82 618 45138.00 I   .230535  .001074   .275502  .000751  I -.3674097  .0000688  2.2317 0.0531  I      .622     .217    -1.683     .868   .229000   .281000  -.3642000      .000      .000  
+82 619 45139.00 I   .230552  .001067   .272663  .000766  I -.3695846  .0000699  2.1078 0.0490  I      .644     .548    -1.526     .235   .229000   .278000  -.3663000      .000      .000  
+82 620 45140.00 I   .230505  .001067   .269756  .000766  I -.3716098  .0000699  1.9373 0.0476  I      .590     .862    -1.512     .239   .229000   .275000  -.3682000      .000      .000  
+82 621 45141.00 I   .230433  .000930   .266803  .000796  I -.3734581  .0000646  1.7634 0.0473  I      .653     .892    -1.599     .240   .230000   .272000  -.3699000      .000      .000  
+82 622 45142.00 I   .230327  .000956   .263830  .000753  I -.3751547  .0000636  1.6437 0.0439  I     1.058     .892    -1.570     .240   .230000   .268000  -.3716000      .000      .000  
+82 623 45143.00 I   .230183  .001111   .260847  .000596  I -.3767764  .0000594  1.6167 0.0417  I     1.797    1.064    -1.400     .288   .231000   .265000  -.3732000      .000      .000  
+82 624 45144.00 I   .230002  .000615   .257860  .000830  I -.3784170  .0000541  1.6763 0.0454  I     2.571    1.064    -1.255     .288   .231000   .262000  -.3748000      .000      .000  
+82 625 45145.00 I   .229786  .000436   .254873  .000890  I -.3801438  .0000686  1.7802 0.0580  I     3.028    1.239    -1.219     .248   .231000   .259000  -.3766000      .000      .000  
+82 626 45146.00 I   .229539  .001290   .251890  .002389  I -.3819751  .0001025  1.8771 0.0617  I     3.035    1.982    -1.165     .868   .231000   .255000  -.3784000      .000      .000  
+82 627 45147.00 I   .229263  .001290   .248915  .002389  I -.3838827  .0001025  1.9280 0.0797  I     2.772    1.982     -.945     .868   .231000   .252000  -.3804000      .000      .000  
+82 628 45148.00 I   .228962  .001214   .245950  .002294  I -.3858102  .0001222  1.9160 0.0797  I     2.601    1.982     -.617     .868   .231000   .248000  -.3824000      .000      .000  
+82 629 45149.00 I   .228635  .001214   .242994  .002294  I -.3876947  .0001222  1.8438 0.0892  I     2.729    1.982     -.363     .868   .231000   .245000  -.3843000      .000      .000  
+82 630 45150.00 I   .228282  .000158   .240048  .000278  I -.3894825  .0001300  1.7257 0.0892  I     2.979    1.982     -.237     .868   .231000   .242000  -.3860000      .000      .000  
+82 7 1 45151.00 I   .227903  .000158   .237109  .000278  I  .6088635  .0001300  1.5789 0.0919  I     3.013    1.982     -.130     .868   .231000   .239000   .6123000      .000      .000  
+82 7 2 45152.00 I   .227500  .000158   .234178  .000278  I  .6073635  .0001300  1.4206 0.0919  I     2.769    1.982      .029     .868   .230000   .235000   .6110000      .000      .000  
+82 7 3 45153.00 I   .227071  .000158   .231255  .000278  I  .6060205  .0001300  1.2676 0.0845  I     2.524    1.982      .152     .868   .230000   .232000   .6097000      .000      .000  
+82 7 4 45154.00 I   .226617  .001194   .228339  .001166  I  .6048210  .0001081  1.1363 0.0845  I     2.531    1.982      .134     .868   .230000   .229000   .6085000      .000      .000  
+82 7 5 45155.00 I   .226138  .001194   .225430  .001166  I  .6037356  .0001081  1.0419 0.0795  I     2.763    1.982      .036     .868   .230000   .226000   .6074000      .000      .000  
+82 7 6 45156.00 I   .225636  .001673   .222527  .001641  I  .6027209  .0001165  0.9966 0.0763  I     3.038    1.982      .032     .868   .229000   .223000   .6063000      .000      .000  
+82 7 7 45157.00 I   .225110  .001580   .219631  .001335  I  .6017239  .0001077  1.0069 0.0793  I     3.216    1.982      .196     .868   .229000   .220000   .6053000      .000      .000  
+82 7 8 45158.00 I   .224558  .001580   .216742  .001335  I  .6006889  .0001077  1.0717 0.0762  I     3.242    1.982      .421     .868   .228000   .217000   .6042000      .000      .000  
+82 7 9 45159.00 I   .223980  .001580   .213861  .001335  I  .5995655  .0001077  1.1814 0.0772  I     3.147    1.982      .577     .868   .228000   .214000   .6031000      .000      .000  
+82 710 45160.00 I   .223370  .001116   .210992  .000785  I  .5983163  .0001105  1.3204 0.0772  I     3.069    1.982      .674     .868   .227000   .211000   .6018000      .000      .000  
+82 711 45161.00 I   .222726  .001116   .208136  .000785  I  .5969212  .0001105  1.4699 0.0781  I     3.146    1.982      .810     .868   .227000   .208000   .6003000      .000      .000  
+82 712 45162.00 I   .222040  .001116   .205296  .000785  I  .5953796  .0001105  1.6101 0.0764  I     3.308    1.982     1.000     .868   .226000   .206000   .5988000      .000      .000  
+82 713 45163.00 I   .221308  .002457   .202475  .001012  I  .5937112  .0001055  1.7196 0.0764  I     3.322    1.982     1.143     .868   .226000   .203000   .5971000      .000      .000  
+82 714 45164.00 I   .220525  .002457   .199677  .001012  I  .5919581  .0001055  1.7759 0.1431  I     3.066    1.982     1.174     .868   .225000   .200000   .5953000      .000      .000  
+82 715 45165.00 I   .219686  .002178   .196902  .000868  I  .5901832  .0002660  1.7606 0.2385  I     2.652    1.982     1.165     .868   .224000   .197000   .5934000      .000      .000  
+82 716 45166.00 I   .218788  .002640   .194154  .000974  I  .5884624  .0004651  1.6687 0.2679  I     2.252    1.982     1.201     .868   .223000   .194000   .5917000      .000      .000  
+82 717 45167.00 I   .217832  .002640   .191432  .000974  I  .5868650  .0004651  1.5193 0.3289  I     1.939    1.982     1.243     .868   .223000   .192000   .5900000      .000      .000  
+82 718 45168.00 I   .216819  .002640   .188738  .000974  I  .5854280  .0004651  1.3573 0.3300  I     1.762    1.982     1.202     .868   .222000   .189000   .5885000      .000      .000  
+82 719 45169.00 I   .215754  .001276   .186071  .000411  I  .5841359  .0004682  1.2389 0.3300  I     1.809    1.982     1.124     .868   .221000   .186000   .5872000      .000      .000  
+82 720 45170.00 I   .214638  .001276   .183431  .000411  I  .5829209  .0004682  1.2083 0.3101  I     2.115    1.982     1.140     .868   .220000   .183000   .5859000      .000      .000  
+82 721 45171.00 I   .213479  .000775   .180819  .000252  I  .5816866  .0004068  1.2756 0.2523  I     2.576    1.982     1.251     .868   .219000   .181000   .5846000      .000      .000  
+82 722 45172.00 I   .212281  .000775   .178235  .000252  I  .5803469  .0001881  1.4112 0.2241  I     3.015    1.982     1.289     .868   .219000   .178000   .5833000      .000      .000  
+82 723 45173.00 I   .211046  .000775   .175677  .000252  I  .5788593  .0001881  1.5614 0.1330  I     3.258    1.982     1.167     .868   .218000   .176000   .5817000      .000      .000  
+82 724 45174.00 I   .209779  .000775   .173145  .000252  I  .5772372  .0001881  1.6723 0.1353  I     3.166    1.982     1.055     .868   .217000   .173000   .5801000      .000      .000  
+82 725 45175.00 I   .208482  .000244   .170639  .000799  I  .5755388  .0001944  1.7107 0.1353  I     2.752    1.982     1.168     .868   .216000   .170000   .5783000      .000      .000  
+82 726 45176.00 I   .207157  .000244   .168158  .000799  I  .5738419  .0001944  1.6706 0.1711  I     2.278    1.982     1.463     .868   .215000   .168000   .5765000      .000      .000  
+82 727 45177.00 I   .205807  .001130   .165701  .000804  I  .5722188  .0002815  1.5670 0.1711  I     2.060    1.982     1.665     .868   .213000   .165000   .5749000      .000      .000  
+82 728 45178.00 I   .204434  .001130   .163268  .000804  I  .5707209  .0002815  1.4244 0.1991  I     2.120    1.982     1.610     .868   .212000   .163000   .5733000      .000      .000  
+82 729 45179.00 I   .203041  .001130   .160858  .000804  I  .5693752  .0002815  1.2662 0.1991  I     2.177    1.982     1.421     .868   .211000   .160000   .5719000      .000      .000  
+82 730 45180.00 I   .201628  .001130   .158467  .000804  I  .5681868  .0002815  1.1129 0.2433  I     2.038    1.982     1.305     .868   .210000   .157000   .5706000      .000      .000  
+82 731 45181.00 I   .200198  .001716   .156095  .001069  I  .5671419  .0003969  0.9819 0.2433  I     1.831    1.982     1.304     .868   .209000   .155000   .5695000      .000      .000  
+82 8 1 45182.00 I   .198750  .001716   .153738  .001069  I  .5662108  .0003969  0.8876 0.2885  I     1.765    1.982     1.300     .868   .207000   .152000   .5685000      .000      .000  
+82 8 2 45183.00 I   .197283  .001830   .151396  .001507  I  .5653507  .0004187  0.8414 0.2538  I     1.839    1.982     1.224     .868   .206000   .150000   .5675000      .000      .000  
+82 8 3 45184.00 I   .195796  .001531   .149065  .001119  I  .5645097  .0003165  0.8501 0.2624  I     1.923    1.982     1.147     .868   .205000   .147000   .5666000      .000      .000  
+82 8 4 45185.00 I   .194287  .001531   .146746  .001119  I  .5636315  .0003165  0.9158 0.2238  I     1.976    1.982     1.174     .868   .203000   .145000   .5656000      .000      .000  
+82 8 5 45186.00 I   .192753  .001531   .144436  .001119  I  .5626608  .0003165  1.0333 0.1965  I     2.028    1.982     1.306     .868   .202000   .142000   .5646000      .000      .000  
+82 8 6 45187.00 I   .191188  .001198   .142138  .000404  I  .5615525  .0002331  1.1881 0.1965  I     2.047    1.982     1.448     .868   .200000   .140000   .5634000      .000      .000  
+82 8 7 45188.00 I   .189587  .001198   .139850  .000404  I  .5602790  .0002331  1.3598 0.2013  I     1.981    1.982     1.514     .868   .199000   .137000   .5620000      .000      .000  
+82 8 8 45189.00 I   .187942  .001332   .137574  .000538  I  .5588353  .0003283  1.5241 0.2255  I     1.883    1.982     1.505     .868   .197000   .135000   .5605000      .000      .000  
+82 8 9 45190.00 I   .186248  .001411   .135311  .000563  I  .5572413  .0003862  1.6567 0.2534  I     1.849    1.982     1.474     .868   .195000   .133000   .5589000      .000      .000  
+82 810 45191.00 I   .184499  .001411   .133061  .000563  I  .5555391  .0003862  1.7378 0.4669  I     1.848    1.982     1.461     .868   .193000   .130000   .5572000      .000      .000  
+82 811 45192.00 I   .182691  .001985   .130826  .000497  I  .5537867  .0008502  1.7559 0.5414  I     1.724    1.982     1.462     .868   .191000   .128000   .5556000      .000      .000  
+82 812 45193.00 I   .180820  .002268   .128606  .000570  I  .5520488  .0010115  1.7094 0.6574  I     1.381    1.982     1.448     .868   .189000   .125000   .5538000      .000      .000  
+82 813 45194.00 I   .178885  .002268   .126404  .000570  I  .5503848  .0010029  1.6122 0.7031  I      .904    1.982     1.384     .868   .187000   .123000   .5522000      .000      .000  
+82 814 45195.00 I   .176885  .001987   .124221  .000267  I  .5488306  .0009770  1.4965 0.7001  I      .507    1.982     1.249     .868   .185000   .121000   .5506000      .000      .000  
+82 815 45196.00 I   .174821  .001987   .122061  .000267  I  .5473828  .0009770  1.4078 0.6908  I      .384    1.982     1.071     .868   .182000   .119000   .5492000      .000      .000  
+82 816 45197.00 I   .172698  .001987   .119925  .000267  I  .5459912  .0009770  1.3905 0.5194  I      .570    1.982      .959     .868   .180000   .116000   .5479000      .000      .000  
+82 817 45198.00 I   .170519  .000566   .117816  .000723  I  .5445700  .0003531  1.4687 0.5194  I      .904    1.982     1.019     .868   .177000   .114000   .5464000      .000      .000  
+82 818 45199.00 I   .168290  .000566   .115737  .000723  I  .5430252  .0003531  1.6326 0.2296  I     1.170    1.982     1.205     .868   .175000   .112000   .5448000      .000      .000  
+82 819 45200.00 I   .166012  .000566   .113689  .000723  I  .5412908  .0002937  1.8386 0.2226  I     1.277    1.982     1.320     .868   .172000   .110000   .5430000      .000      .000  
+82 820 45201.00 I   .163690  .000762   .111677  .001006  I  .5393529  .0002710  2.0298 0.1754  I     1.264    1.982     1.234     .868   .169000   .108000   .5409000      .000      .000  
+82 821 45202.00 I   .161328  .001474   .109701  .000929  I  .5372528  .0001917  2.1563 0.1660  I     1.135    1.982     1.063     .868   .167000   .106000   .5386000      .000      .000  
+82 822 45203.00 I   .158931  .001474   .107765  .000929  I  .5350698  .0001917  2.1943 0.0959  I      .830    1.982     1.033     .868   .164000   .104000   .5363000      .000      .000  
+82 823 45204.00 I   .156504  .001940   .105868  .000846  I  .5328919  .0000039  2.1491 0.1284  I      .396    1.982     1.178     .868   .161000   .102000   .5340000      .000      .000  
+82 824 45205.00 I   .154050  .001642   .104013  .000741  I  .5307914  .0001708  2.0446 0.0854  I      .036    1.982     1.281     .868   .158000   .100000   .5318000      .000      .000  
+82 825 45206.00 I   .151574  .001642   .102200  .000741  I  .5288123  .0001708  1.9112 0.1152  I     -.097    1.982     1.151     .868   .155000   .098000   .5297000      .000      .000  
+82 826 45207.00 I   .149075  .001458   .100430  .000762  I  .5269696  .0001545  1.7758 0.1274  I     -.065    1.982      .861     .868   .153000   .097000   .5277000      .000      .000  
+82 827 45208.00 I   .146556  .001144   .098701  .000715  I  .5252541  .0001892  1.6601 0.1221  I     -.017    1.982      .643     .868   .150000   .095000   .5259000      .000      .000  
+82 828 45209.00 I   .144019  .001144   .097016  .000715  I  .5236373  .0001892  1.5808 0.1338  I      .000    1.982      .609     .868   .147000   .093000   .5243000      .000      .000  
+82 829 45210.00 I   .141467  .001144   .095372  .000715  I  .5220765  .0001892  1.5496 0.1378  I      .012    1.982      .649     .868   .144000   .091000   .5228000      .000      .000  
+82 830 45211.00 I   .138905  .001461   .093769  .000676  I  .5205198  .0002005  1.5733 0.1378  I     -.004    1.982      .607     .868   .141000   .090000   .5213000      .000      .000  
+82 831 45212.00 I   .136334  .001461   .092209  .000676  I  .5189112  .0002005  1.6532 0.2503  I     -.075    1.982      .462     .868   .139000   .088000   .5198000      .000      .000  
+82 9 1 45213.00 I   .133756  .002642   .090691  .000457  I  .5171961  .0004587  1.7851 0.2503  I     -.127    1.982      .337     .868   .136000   .087000   .5182000      .000      .000  
+82 9 2 45214.00 I   .131172  .002642   .089216  .000457  I  .5153275  .0004587  1.9577 0.3243  I     -.065    1.982      .355     .868   .133000   .085000   .5165000      .000      .000  
+82 9 3 45215.00 I   .128584  .002642   .087785  .000457  I  .5132734  .0004587  2.1523 0.3243  I      .056    1.982      .510     .868   .130000   .083000   .5145000      .000      .000  
+82 9 4 45216.00 I   .125988  .002642   .086396  .000457  I  .5110245  .0004587  2.3423 0.3803  I      .077    1.982      .668     .868   .127000   .082000   .5124000      .000      .000  
+82 9 5 45217.00 I   .123382  .004241   .085050  .000935  I  .5086007  .0006068  2.4967 0.3803  I     -.056    1.982      .683     .868   .124000   .080000   .5101000      .000      .000  
+82 9 6 45218.00 I   .120758  .004241   .083746  .000935  I  .5060521  .0006068  2.5881 0.4333  I     -.235    1.982      .538     .868   .121000   .079000   .5077000      .000      .000  
+82 9 7 45219.00 I   .118109  .005028   .082484  .001266  I  .5034506  .0006186  2.6014 0.4044  I     -.366    1.982      .350     .868   .118000   .077000   .5052000      .000      .000  
+82 9 8 45220.00 I   .115426  .006145   .081262  .001327  I  .5008748  .0005347  2.5384 0.4088  I     -.506    1.982      .246     .868   .115000   .076000   .5027000      .000      .000  
+82 9 9 45221.00 I   .112698  .006145   .080080  .001327  I  .4983934  .0005347  2.4166 0.3781  I     -.771    1.982      .237     .868   .112000   .074000   .5003000      .000      .000  
+82 910 45222.00 I   .109909  .006145   .078941  .001327  I  .4960501  .0005347  2.2691 0.3644  I    -1.150    1.982      .232     .868   .108000   .073000   .4980000      .000      .000  
+82 911 45223.00 I   .107038  .008720   .077844  .000983  I  .4938502  .0004952  2.1365 0.3644  I    -1.461    1.982      .159     .868   .105000   .071000   .4959000      .000      .000  
+82 912 45224.00 I   .104060  .008720   .076792  .000983  I  .4917594  .0004952  2.0570 0.3502  I    -1.508    1.982      .046     .868   .102000   .070000   .4939000      .000      .000  
+82 913 45225.00 I   .100941  .008720   .075789  .000983  I  .4897097  .0004952  2.0570 0.3808  I    -1.266    1.982     -.001     .868   .099000   .069000   .4919000      .000      .000  
+82 914 45226.00 I   .097653  .008554   .074836  .000519  I  .4876187  .0005787  2.1373 0.3808  I     -.933    1.982      .100     .868   .095000   .068000   .4899000      .000      .000  
+82 915 45227.00 I   .094171  .008554   .073937  .000519  I  .4854146  .0005787  2.2792 0.4202  I     -.758    1.982      .311     .868   .092000   .067000   .4877000      .000      .000  
+82 916 45228.00 I   .090519  .008190   .073093  .000848  I  .4830529  .0006094  2.4432 0.4135  I     -.827    1.982      .484     .868   .088000   .066000   .4854000      .000      .000  
+82 917 45229.00 I   .086735  .008106   .072309  .001035  I  .4805389  .0005909  2.5749 0.6037  I    -1.028    1.982      .493     .868   .085000   .065000   .4828000      .000      .000  
+82 918 45230.00 I   .082848  .005251   .071586  .001035  I  .4779277  .0010424  2.6327 0.5991  I    -1.222    1.982      .368     .868   .082000   .064000   .4802000      .000      .000  
+82 919 45231.00 I   .078886  .005251   .070926  .001035  I  .4753023  .0010424  2.6039 0.6181  I    -1.398    1.982      .256     .868   .078000   .064000   .4775000      .000      .000  
+82 920 45232.00 I   .074873  .004731   .070329  .001050  I  .4727448  .0006647  2.5002 0.6181  I    -1.624    1.982      .231     .868   .075000   .063000   .4750000      .000      .000  
+82 921 45233.00 I   .070826  .004731   .069797  .001050  I  .4703178  .0006647  2.3486 0.3553  I    -1.892    1.982      .198     .868   .071000   .063000   .4725000      .000      .000  
+82 922 45234.00 I   .066765  .003617   .069330  .000592  I  .4680526  .0002512  2.1819 0.3553  I    -2.087    1.982      .037     .868   .068000   .062000   .4702000      .000      .000  
+82 923 45235.00 I   .062704  .003617   .068926  .000592  I  .4659500  .0002512  2.0274 0.1737  I    -2.092    1.982     -.209     .868   .064000   .062000   .4680000      .000      .000  
+82 924 45236.00 I   .058656  .003617   .068587  .000592  I  .4639867  .0002401  1.9064 0.1737  I    -1.916    1.982     -.369     .868   .061000   .062000   .4660000      .000      .000  
+82 925 45237.00 I   .054630  .003617   .068310  .000592  I  .4621210  .0002401  1.8340 0.1633  I    -1.687    1.982     -.357     .868   .057000   .061000   .4640000      .000      .000  
+82 926 45238.00 I   .050631  .002748   .068095  .000548  I  .4603001  .0002213  1.8174 0.1633  I    -1.556    1.982     -.277     .868   .054000   .061000   .4622000      .000      .000  
+82 927 45239.00 I   .046665  .002748   .067940  .000548  I  .4584668  .0002213  1.8588 0.1423  I    -1.582    1.982     -.292     .868   .050000   .061000   .4602000      .000      .000  
+82 928 45240.00 I   .042735  .002986   .067845  .000701  I  .4565644  .0001789  1.9544 0.1335  I    -1.693    1.982     -.439     .868   .046000   .061000   .4583000      .000      .000  
+82 929 45241.00 I   .038844  .002146   .067806  .000721  I  .4545431  .0001493  2.0948 0.1047  I    -1.764    1.982     -.591     .868   .043000   .061000   .4562000      .000      .000  
+82 930 45242.00 I   .034995  .002146   .067825  .000721  I  .4523646  .0001088  2.2659 0.1299  I    -1.750    1.982     -.588     .868   .039000   .060000   .4539000      .000      .000  
+8210 1 45243.00 I   .031186  .002146   .067899  .000721  I  .4500084  .0002126  2.4459 0.1095  I    -1.725    1.982     -.385     .868   .036000   .060000   .4514000      .000      .000  
+8210 2 45244.00 I   .027414  .000673   .068028  .000997  I  .4474796  .0001901  2.6055 0.1426  I    -1.793    1.982     -.107     .868   .032000   .060000   .4488000      .000      .000  
+8210 3 45245.00 I   .023680  .000673   .068212  .000997  I  .4448154  .0001901  2.7110 0.1344  I    -1.973    1.982      .036     .868   .028000   .060000   .4461000      .000      .000  
+8210 4 45246.00 I   .019981  .000673   .068449  .000997  I  .4420846  .0001901  2.7356 0.1335  I    -2.195    1.982     -.075     .868   .025000   .060000   .4433000      .000      .000  
+8210 5 45247.00 I   .016317  .000606   .068737  .000859  I  .4393739  .0001875  2.6711 0.1335  I    -2.395    1.982     -.355     .868   .021000   .061000   .4406000      .000      .000  
+8210 6 45248.00 I   .012688  .000606   .069075  .000859  I  .4367670  .0001875  2.5329 0.1024  I    -2.569    1.982     -.591     .868   .018000   .061000   .4379000      .000      .000  
+8210 7 45249.00 I   .009093  .001205   .069459  .000726  I  .4343200  .0000822  2.3592 0.0939  I    -2.756    1.982     -.641     .868   .014000   .061000   .4354000      .000      .000  
+8210 8 45250.00 I   .005535  .001369   .069887  .000268  I  .4320443  .0000090  2.1985 0.0413  I    -2.958    1.982     -.535     .868   .010000   .062000   .4331000      .000      .000  
+8210 9 45251.00 I   .002014  .001369   .070356  .000268  I  .4299041  .0000090  2.0946 0.0064  I    -3.107    1.982     -.404     .868   .007000   .062000   .4310000      .000      .000  
+821010 45252.00 I  -.001469  .001369   .070862  .000268  I  .4278270  .0000090  2.0750 0.0510  I    -3.109    1.982     -.327     .868   .003000   .063000   .4288000      .000      .000  
+821011 45253.00 I  -.004914  .001869   .071405  .000349  I  .4257247  .0001017  2.1435 0.0510  I    -2.946    1.982     -.287     .868   .000000   .063000   .4267000      .000      .000  
+821012 45254.00 I  -.008321  .001869   .071980  .000349  I  .4235175  .0001017  2.2795 0.0878  I    -2.724    1.982     -.228     .868  -.004000   .064000   .4245000      .000      .000  
+821013 45255.00 I  -.011694  .002787   .072585  .000965  I  .4211563  .0001431  2.4439 0.0878  I    -2.612    1.982     -.132     .868  -.008000   .065000   .4221000      .000      .000  
+821014 45256.00 I  -.015035  .002787   .073219  .000965  I  .4186360  .0001431  2.5896 0.1012  I    -2.717    1.982     -.039     .868  -.011000   .066000   .4196000      .000      .000  
+821015 45257.00 I  -.018348  .002787   .073880  .000965  I  .4159972  .0001431  2.6749 0.0759  I    -2.995    1.982      .004     .868  -.015000   .067000   .4169000      .000      .000  
+821016 45258.00 I  -.021639  .000799   .074564  .000314  I  .4133142  .0000504  2.6761 0.0751  I    -3.294    1.982     -.010     .868  -.018000   .068000   .4142000      .000      .000  
+821017 45259.00 I  -.024914  .000893   .075271  .000788  I  .4106733  .0000454  2.5925 0.0339  I    -3.496     .841     -.038     .224  -.022000   .069000   .4115000      .000      .000  
+821018 45260.00 I  -.028185  .000893   .076001  .000788  I  .4081512  .0000454  2.4429 0.0299  I    -3.609     .841     -.063     .224  -.025000   .070000   .4089000      .000      .000  
+821019 45261.00 I  -.031465  .000657   .076753  .000749  I  .4057997  .0000390  2.2568 0.0299  I    -3.720     .841     -.132     .224  -.029000   .072000   .4065000      .000      .000  
+821020 45262.00 I  -.034762  .000697   .077527  .000798  I  .4036387  .0000388  2.0675 0.0275  I    -3.832     .841     -.279     .224  -.032000   .073000   .4042000      .000      .000  
+821021 45263.00 I  -.038074  .000697   .078327  .000798  I  .4016561  .0000388  1.9040 0.0274  I    -3.830     .841     -.435     .224  -.036000   .075000   .4022000      .000      .000  
+821022 45264.00 I  -.041396  .000697   .079157  .000798  I  .3998154  .0000388  1.7863 0.0709  I    -3.641     .841     -.470     .224  -.039000   .076000   .4002000      .000      .000  
+821023 45265.00 I  -.044721  .001303   .080019  .002444  I  .3980639  .0001364  1.7273 0.0709  I    -3.387    1.982     -.352     .868  -.042000   .078000   .3984000      .000      .000  
+821024 45266.00 I  -.048047  .001303   .080921  .002444  I  .3963395  .0001364  1.7322 0.0964  I    -3.281    1.982     -.199     .868  -.046000   .079000   .3965000      .000      .000  
+821025 45267.00 I  -.051372  .001303   .081867  .002444  I  .3945793  .0001364  1.7978 0.1180  I    -3.367    1.982     -.142     .868  -.049000   .081000   .3947000      .000      .000  
+821026 45268.00 I  -.054691  .001285   .082863  .002297  I  .3927267  .0001927  1.9150 0.1180  I    -3.488    1.982     -.180     .868  -.053000   .082000   .3927000      .000      .000  
+821027 45269.00 I  -.058002  .001285   .083912  .002297  I  .3907363  .0001927  2.0711 0.1277  I    -3.532    1.982     -.197     .868  -.056000   .084000   .3906000      .000      .000  
+821028 45270.00 I  -.061300  .001192   .085016  .002031  I  .3885770  .0001676  2.2498 0.1236  I    -3.589    1.982     -.089     .868  -.059000   .086000   .3884000      .000      .000  
+821029 45271.00 I  -.064579  .001231   .086176  .001103  I  .3862366  .0001548  2.4289 0.1141  I    -3.792    1.982      .167     .868  -.063000   .088000   .3860000      .000      .000  
+821030 45272.00 I  -.067838  .001231   .087394  .001103  I  .3837292  .0001548  2.5780 0.1095  I    -4.107    1.982      .510     .868  -.066000   .090000   .3834000      .000      .000  
+821031 45273.00 I  -.071075  .001231   .088669  .001103  I  .3811019  .0001548  2.6631 0.1458  I    -4.388    1.982      .810     .868  -.070000   .092000   .3807000      .000      .000  
+8211 1 45274.00 I  -.074288  .000701   .090002  .000960  I  .3784328  .0002472  2.6590 0.1458  I    -4.575    1.982      .915     .868  -.073000   .094000   .3780000      .000      .000  
+8211 2 45275.00 I  -.077476  .000701   .091392  .000960  I  .3758140  .0002472  2.5648 0.2268  I    -4.717    1.982      .790     .868  -.076000   .096000   .3754000      .000      .000  
+8211 3 45276.00 I  -.080641  .000628   .092837  .000722  I  .3733233  .0003804  2.4102 0.1895  I    -4.839    1.982      .589     .868  -.080000   .097000   .3729000      .000      .000  
+8211 4 45277.00 I  -.083781  .000628   .094337  .000722  I  .3709964  .0002872  2.2472 0.2383  I    -4.908    1.982      .543     .868  -.083000   .099000   .3706000      .000      .000  
+8211 5 45278.00 I  -.086897  .000628   .095891  .000722  I  .3688131  .0002872  2.1316 0.2206  I    -4.922    1.982      .748     .868  -.087000   .100000   .3685000      .000      .000  
+8211 6 45279.00 I  -.089988  .000917   .097496  .000589  I  .3667045  .0003350  2.1021 0.2207  I    -4.938    1.982     1.082     .868  -.090000   .102000   .3663000      .000      .000  
+8211 7 45280.00 I  -.093053  .001118   .099153  .000717  I  .3645773  .0003351  2.1674 0.2249  I    -4.983    1.982     1.351     .868  -.093000   .104000   .3642000      .000      .000  
+8211 8 45281.00 I  -.096090  .001118   .100860  .000717  I  .3623449  .0003003  2.3073 0.2110  I    -5.018    1.982     1.471     .868  -.097000   .105000   .3619000      .000      .000  
+8211 9 45282.00 I  -.099097  .001318   .102619  .000016  I  .3599507  .0002564  2.4834 0.2041  I    -5.008    1.982     1.494     .868  -.100000   .107000   .3594000      .000      .000  
+821110 45283.00 I  -.102073  .001950   .104429  .001924  I  .3573813  .0002764  2.6501 0.1885  I    -4.993    1.982     1.506     .868  -.104000   .108000   .3568000      .000      .000  
+821111 45284.00 I  -.105017  .001950   .106290  .001924  I  .3546666  .0002764  2.7686 0.1605  I    -5.075    1.982     1.546     .868  -.107000   .110000   .3541000      .000      .000  
+821112 45285.00 I  -.107930  .002422   .108203  .002721  I  .3518680  .0001631  2.8154 0.1605  I    -5.314    1.982     1.621     .868  -.110000   .112000   .3513000      .000      .000  
+821113 45286.00 I  -.110814  .002422   .110166  .002721  I  .3490618  .0001631  2.7843 0.1205  I    -5.654    1.982     1.740     .868  -.114000   .114000   .3485000      .000      .000  
+821114 45287.00 I  -.113671  .002190   .112177  .002052  I  .3463220  .0001774  2.6856 0.1205  I    -5.943    1.982     1.898     .868  -.117000   .116000   .3457000      .000      .000  
+821115 45288.00 I  -.116507  .002190   .114233  .002052  I  .3437057  .0001774  2.5416 0.1276  I    -6.068    1.982     2.039     .868  -.121000   .118000   .3431000      .000      .000  
+821116 45289.00 I  -.119327  .002593   .116329  .000879  I  .3412446  .0001834  2.3800 0.1276  I    -6.049    1.982     2.077     .868  -.124000   .120000   .3407000      .000      .000  
+821117 45290.00 I  -.122137  .002593   .118463  .000879  I  .3389427  .0001834  2.2272 0.1485  I    -5.965    1.982     1.994     .868  -.127000   .122000   .3384000      .000      .000  
+821118 45291.00 I  -.124937  .002223   .120632  .002259  I  .3367799  .0002336  2.1052 0.1485  I    -5.818    1.982     1.901     .868  -.130000   .124000   .3362000      .000      .000  
+821119 45292.00 I  -.127729  .002223   .122834  .002259  I  .3347163  .0002336  2.0312 0.1791  I    -5.576    1.982     1.941     .868  -.134000   .126000   .3342000      .000      .000  
+821120 45293.00 I  -.130510  .002356   .125067  .002673  I  .3326984  .0002716  2.0146 0.1791  I    -5.332    1.982     2.130     .868  -.137000   .128000   .3322000      .000      .000  
+821121 45294.00 I  -.133273  .002356   .127330  .002673  I  .3306678  .0002716  2.0560 0.1963  I    -5.247    1.982     2.332     .868  -.140000   .130000   .3302000      .000      .000  
+821122 45295.00 I  -.136016  .002729   .129623  .002623  I  .3285691  .0002835  2.1491 0.1781  I    -5.301    1.982     2.436     .868  -.143000   .132000   .3281000      .000      .000  
+821123 45296.00 I  -.138730  .002729   .131948  .002623  I  .3263564  .0002306  2.2816 0.1609  I    -5.281    1.982     2.475     .868  -.146000   .135000   .3259000      .000      .000  
+821124 45297.00 I  -.141410  .003676   .134311  .000025  I  .3239977  .0001524  2.4386 0.1382  I    -5.094    1.982     2.547     .868  -.150000   .137000   .3236000      .000      .000  
+821125 45298.00 I  -.144048  .003676   .136713  .000025  I  .3214765  .0001524  2.6035 0.1123  I    -4.936    1.982     2.672     .868  -.153000   .140000   .3211000      .000      .000  
+821126 45299.00 I  -.146643  .003676   .139159  .000025  I  .3187951  .0001650  2.7550 0.1092  I    -5.003    1.982     2.816     .868  -.156000   .142000   .3184000      .000      .000  
+821127 45300.00 I  -.149194  .002929   .141652  .001571  I  .3159804  .0001564  2.8648 0.1199  I    -5.185    1.982     3.002     .868  -.159000   .144000   .3156000      .000      .000  
+821128 45301.00 I  -.151702  .001908   .144196  .002222  I  .3130895  .0001739  2.9026 0.1197  I    -5.231    1.982     3.272     .868  -.162000   .147000   .3128000      .000      .000  
+821129 45302.00 I  -.154167  .001908   .146794  .002222  I  .3102055  .0001813  2.8495 0.1310  I    -5.108    1.982     3.537     .868  -.165000   .149000   .3099000      .000      .000  
+821130 45303.00 I  -.156589  .001536   .149450  .001790  I  .3074182  .0001960  2.7133 0.1335  I    -4.961    1.982     3.616     .868  -.168000   .152000   .3071000      .000      .000  
+8212 1 45304.00 I  -.158966  .001536   .152166  .001790  I  .3047930  .0001960  2.5347 0.1577  I    -4.801    1.982     3.471     .868  -.171000   .154000   .3045000      .000      .000  
+8212 2 45305.00 I  -.161296  .001536   .154943  .001790  I  .3023427  .0002472  2.3745 0.1681  I    -4.454    1.982     3.306     .868  -.173000   .157000   .3021000      .000      .000  
+8212 3 45306.00 I  -.163575  .001039   .157781  .001214  I  .3000190  .0002732  2.2891 0.1867  I    -3.859    1.982     3.343     .868  -.175000   .159000   .2997000      .000      .000  
+8212 4 45307.00 I  -.165800  .001039   .160681  .001214  I  .2977304  .0002799  2.3058 0.1827  I    -3.200    1.982     3.557     .868  -.177000   .162000   .2974000      .000      .000  
+8212 5 45308.00 I  -.167968  .000889   .163642  .000878  I  .2953770  .0002426  2.4138 0.1816  I    -2.684    1.982     3.729     .868  -.179000   .164000   .2950000      .000      .000  
+8212 6 45309.00 I  -.170080  .000513   .166663  .001080  I  .2928865  .0002316  2.5707 0.1677  I    -2.326    1.982     3.721     .868  -.181000   .167000   .2925000      .000      .000  
+8212 7 45310.00 I  -.172133  .000513   .169742  .001080  I  .2902369  .0002316  2.7237 0.1357  I    -2.005    1.982     3.607     .868  -.183000   .170000   .2899000      .000      .000  
+8212 8 45311.00 I  -.174126  .000513   .172880  .001080  I  .2874545  .0001413  2.8304 0.1342  I    -1.641    1.982     3.517     .868  -.185000   .173000   .2872000      .000      .000  
+8212 9 45312.00 I  -.176059  .001548   .176075  .001061  I  .2845995  .0001355  2.8670 0.1003  I    -1.257    1.982     3.475     .868  -.186000   .175000   .2844000      .000      .000  
+821210 45313.00 I  -.177931  .001548   .179324  .001061  I  .2817447  .0001425  2.8311 0.1042  I     -.929    1.982     3.433     .868  -.188000   .178000   .2816000      .000      .000  
+821211 45314.00 I  -.179743  .001828   .182626  .001286  I  .2789577  .0001583  2.7341 0.1010  I     -.697    1.982     3.388     .868  -.190000   .181000   .2789000      .000      .000  
+821212 45315.00 I  -.181493  .002581   .185976  .001021  I  .2762903  .0001433  2.5958 0.0833  I     -.486    1.982     3.378     .868  -.191000   .184000   .2764000      .000      .000  
+821213 45316.00 I  -.183181  .000447   .189370  .000527  I  .2737720  .0000521  2.4397 0.0743  I     -.134    1.982     3.370     .868  -.193000   .187000   .2740000      .000      .000  
+821214 45317.00 I  -.184801  .000323   .192806  .000496  I  .2714093  .0000395  2.2885 0.0320  I      .468     .515     3.255     .367  -.194000   .190000   .2719000      .000      .000  
+821215 45318.00 I  -.186349  .000171   .196277  .000497  I  .2691863  .0000370  2.1633 0.0261  I     1.276     .509     2.983     .264  -.196000   .193000   .2698000      .000      .000  
+821216 45319.00 I  -.187819  .000150   .199780  .000514  I  .2670684  .0000340  2.0808 0.0251  I     2.180     .509     2.663     .264  -.197000   .196000   .2678000      .000      .000  
+821217 45320.00 I  -.189206  .000150   .203308  .000514  I  .2650073  .0000338  2.0503 0.0240  I     3.089     .509     2.463     .264  -.198000   .199000   .2658000      .000      .000  
+821218 45321.00 I  -.190511  .000150   .206851  .000514  I  .2629497  .0000338  2.0739 0.0238  I     3.871     .509     2.424     .264  -.199000   .202000   .2638000      .000      .000  
+821219 45322.00 I  -.191733  .000235   .210394  .000528  I  .2608427  .0000334  2.1478 0.0235  I     4.429     .509     2.414     .264  -.201000   .205000   .2617000      .000      .000  
+821220 45323.00 I  -.192882  .000275   .213927  .000542  I  .2586404  .0000326  2.2626 0.0261  I     4.819     .502     2.320     .868  -.202000   .208000   .2596000      .000      .000  
+821221 45324.00 I  -.193966  .000387   .217450  .000551  I  .2563087  .0000400  2.4037 0.0286  I     5.242    1.982     2.183     .868  -.203000   .211000   .2572000      .000      .000  
+821222 45325.00 I  -.194995  .000423   .220960  .000574  I  .2538298  .0000471  2.5542 0.0255  I     5.787    1.982     2.088     .868  -.204000   .214000   .2547000      .000      .000  
+821223 45326.00 I  -.195974  .001580   .224458  .000675  I  .2512028  .0000317  2.6970 0.0284  I     6.278    1.982     2.012     .868  -.205000   .218000   .2521000      .000      .000  
+821224 45327.00 I  -.196909  .001580   .227945  .000675  I  .2484449  .0000317  2.8123 0.0239  I     6.528    1.982     1.880     .868  -.206000   .221000   .2493000      .000      .000  
+821225 45328.00 I  -.197805  .001166   .231421  .000526  I  .2455952  .0000357  2.8765 0.0239  I     6.624    1.982     1.758     .868  -.207000   .225000   .2464000      .000      .000  
+821226 45329.00 I  -.198664  .001166   .234887  .000526  I  .2427162  .0000357  2.8677 0.0877  I     6.753    1.982     1.819     .868  -.208000   .228000   .2434000      .000      .000  
+821227 45330.00 I  -.199490  .002915   .238344  .000515  I  .2398866  .0001717  2.7784 0.0877  I     6.848    1.982     2.070     .868  -.209000   .231000   .2404000      .000      .000  
+821228 45331.00 I  -.200286  .002915   .241793  .000515  I  .2371797  .0001717  2.6283 0.1214  I     6.705    1.982     2.253     .868  -.209000   .235000   .2376000      .000      .000  
+821229 45332.00 I  -.201053  .002915   .245236  .000515  I  .2346342  .0001717  2.4658 0.1214  I     6.417    1.982     2.141     .868  -.210000   .238000   .2347000      .000      .000  
+821230 45333.00 I  -.201797  .002915   .248673  .000515  I  .2322319  .0001717  2.3521 0.1012  I     6.398    1.982     1.833     .868  -.210000   .242000   .2321000      .000      .000  
+821231 45334.00 I  -.202517  .002915   .252106  .000515  I  .2298981  .0001072  2.3342 0.1012  I     6.899    1.982     1.624     .868  -.211000   .245000   .2295000      .000      .000  
+83 1 1 45335.00 I  -.203212  .002915   .255534  .000515  I  .2275282  .0001072  2.4222 0.1100  I     7.695    1.982     1.630     .868  -.211000   .249000   .2269000      .000      .000  
+83 1 2 45336.00 I  -.203881  .002158   .258959  .001033  I  .2250294  .0001922  2.5833 0.1100  I     8.358    1.982     1.688     .868  -.212000   .252000   .2242000      .000      .000  
+83 1 3 45337.00 I  -.204519  .002158   .262381  .001033  I  .2223567  .0001922  2.7593 0.1359  I     8.666    1.982     1.656     .868  -.212000   .256000   .2222000      .000      .000  
+83 1 4 45338.00 I  -.205125  .002158   .265800  .001033  I  .2195252  .0001922  2.8923 0.1526  I     8.662    1.982     1.614     .868  -.213000   .259000   .2194000      .000      .000  
+83 1 5 45339.00 I  -.205695  .001526   .269217  .003380  I  .2165984  .0002370  2.9466 0.1595  I     8.483    1.982     1.702     .868  -.213000   .263000   .2150000      .000      .000  
+83 1 6 45340.00 I  -.206227  .001526   .272632  .003380  I  .2136601  .0002547  2.9167 0.1740  I     8.244    1.982     1.872     .868  -.213000   .267000   .2120000      .000      .000  
+83 1 7 45341.00 I  -.206714  .001526   .276045  .003380  I  .2107876  .0002547  2.8191 0.1705  I     7.987    1.982     1.950     .868  -.213000   .271000   .2092000      .000      .000  
+83 1 8 45342.00 I  -.207150  .003310   .279453  .004667  I  .2080355  .0002267  2.6808 0.1961  I     7.667    1.982     1.869     .868  -.212000   .275000   .2068000      .000      .000  
+83 1 9 45343.00 I  -.207528  .000663   .282860  .003542  I  .2054302  .0002982  2.5300 0.1873  I     7.247    1.982     1.739     .868  -.212000   .279000   .2044000      .000      .000  
+83 110 45344.00 I  -.207840  .000663   .286269  .003542  I  .2029718  .0002982  2.3904 0.2236  I     6.840    1.982     1.654     .868  -.212000   .283000   .2021000      .000      .000  
+83 111 45345.00 I  -.208081  .001547   .289686  .001815  I  .2006395  .0003333  2.2806 0.2570  I     6.649    1.982     1.567     .868  -.212000   .287000   .2000000      .000      .000  
+83 112 45346.00 I  -.208244  .001547   .293116  .001815  I  .1983961  .0004186  2.2144 0.2675  I     6.733    1.982     1.401     .868  -.212000   .291000   .1980000      .000      .000  
+83 113 45347.00 I  -.208322  .001547   .296563  .001815  I  .1961929  .0004186  2.2017 0.2960  I     6.936    1.982     1.211     .868  -.211000   .295000   .1962000      .000      .000  
+83 114 45348.00 I  -.208311  .001547   .300030  .001815  I  .1939732  .0004186  2.2477 0.3748  I     7.065    1.982     1.140     .868  -.211000   .299000   .1943000      .000      .000  
+83 115 45349.00 I  -.208208  .002241   .303518  .001940  I  .1916788  .0006219  2.3498 0.3748  I     7.029    1.982     1.229     .868  -.211000   .303000   .1923000      .000      .000  
+83 116 45350.00 I  -.208010  .002241   .307029  .001940  I  .1892581  .0006219  2.4983 0.4537  I     6.829    1.982     1.357     .868  -.210000   .307000   .1901000      .000      .000  
+83 117 45351.00 I  -.207718  .002337   .310562  .001588  I  .1866722  .0006608  2.6769 0.4537  I     6.521    1.982     1.397     .868  -.210000   .311000   .1879000      .000      .000  
+83 118 45352.00 I  -.207328  .002337   .314118  .001588  I  .1839011  .0006608  2.8653 0.4673  I     6.219    1.982     1.362     .868  -.209000   .315000   .1855000      .000      .000  
+83 119 45353.00 I  -.206842  .002337   .317697  .001588  I  .1809453  .0006608  3.0428 0.4294  I     6.003    1.982     1.332     .868  -.209000   .319000   .1829000      .000      .000  
+83 120 45354.00 I  -.206262  .002068   .321296  .001369  I  .1778254  .0005486  3.1905 0.3802  I     5.817    1.982     1.307     .868  -.208000   .323000   .1800000      .000      .000  
+83 121 45355.00 I  -.205593  .001829   .324915  .000826  I  .1745799  .0003761  3.2912 0.3482  I     5.568    1.982     1.223     .868  -.207000   .327000   .1771000      .000      .000  
+83 122 45356.00 I  -.204842  .001829   .328552  .000826  I  .1712638  .0004289  3.3294 0.2325  I     5.290    1.982     1.128     .868  -.207000   .331000   .1740000      .000      .000  
+83 123 45357.00 I  -.204017  .001379   .332205  .000756  I  .1679448  .0002736  3.2964 0.2522  I     5.029    1.982     1.193     .868  -.206000   .335000   .1710000      .000      .000  
+83 124 45358.00 I  -.203126  .001079   .335874  .000535  I  .1646928  .0002654  3.1981 0.1906  I     4.633    1.982     1.467     .868  -.206000   .339000   .1679000      .000      .000  
+83 125 45359.00 I  -.202180  .001079   .339560  .000535  I  .1615602  .0002654  3.0650 0.1864  I     3.886    1.982     1.732     .868  -.205000   .343000   .1649000      .000      .000  
+83 126 45360.00 I  -.201190  .004400   .343261  .003693  I  .1585570  .0002618  2.9494 0.1785  I     2.925    1.982     1.715     .868  -.204000   .347000   .1619000      .000      .000  
+83 127 45361.00 I  -.200166  .004400   .346978  .003693  I  .1556373  .0002389  2.9060 0.1527  I     2.273    1.982     1.438     .868  -.204000   .351000   .1589000      .000      .000  
+83 128 45362.00 I  -.199118  .004400   .350711  .003693  I  .1527105  .0001573  2.9659 0.1513  I     2.332    1.982     1.183     .868  -.203000   .354000   .1558000      .000      .000  
+83 129 45363.00 I  -.198059  .004400   .354459  .003693  I  .1496744  .0001857  3.1189 0.1111  I     2.972    1.982     1.139     .868  -.203000   .358000   .1526000      .000      .000  
+83 130 45364.00 I  -.196995  .004394   .358220  .003694  I  .1464584  .0001570  3.3147 0.1216  I     3.714    1.982     1.214     .868  -.202000   .362000   .1491000      .000      .000  
+83 131 45365.00 I  -.195926  .004394   .361986  .003694  I  .1430533  .0001570  3.4854 0.1127  I     4.169    1.982     1.269     .868  -.201000   .366000   .1455000      .000      .000  
+83 2 1 45366.00 I  -.194851  .000566   .365751  .000131  I  .1395149  .0001618  3.5740 0.0963  I     4.222    1.982     1.363     .868  -.200000   .369000   .1416000      .000      .000  
+83 2 2 45367.00 I  -.193771  .000890   .369508  .000155  I  .1359409  .0001114  3.5556 0.1255  I     3.959    1.982     1.628     .868  -.199000   .373000   .1374000      .000      .000  
+83 2 3 45368.00 I  -.192684  .000890   .373250  .000155  I  .1324362  .0001918  3.4396 0.1135  I     3.572    1.982     1.993     .868  -.198000   .376000   .1335000      .000      .000  
+83 2 4 45369.00 I  -.191588  .000890   .376969  .000155  I  .1290835  .0001979  3.2581 0.1238  I     3.240    1.982     2.200     .868  -.197000   .380000   .1298000      .000      .000  
+83 2 5 45370.00 I  -.190484  .000629   .380659  .002277  I  .1259296  .0001566  3.0479 0.1262  I     2.983    1.982     2.117     .868  -.196000   .383000   .1264000      .000      .000  
+83 2 6 45371.00 I  -.189367  .000629   .384312  .002277  I  .1229869  .0001566  2.8403 0.1190  I     2.712     .115     1.881     .868  -.195000   .386000   .1233000      .000      .000  
+83 2 7 45372.00 I  -.188234  .000795   .387921  .002104  I  .1202404  .0001792  2.6586 0.1199  I     2.474     .115     1.704     .868  -.193000   .390000   .1205000      .000      .000  
+83 2 8 45373.00 I  -.187082  .000765   .391479  .002278  I  .1176558  .0001815  2.5185 0.1236  I     2.501     .115     1.638     .868  -.192000   .393000   .1178000      .000      .000  
+83 2 9 45374.00 I  -.185908  .000765   .394981  .002278  I  .1151858  .0001704  2.4312 0.1204  I     2.928     .115     1.601     .868  -.191000   .396000   .1152000      .000      .000  
+83 210 45375.00 I  -.184713  .001330   .398433  .003276  I  .1127737  .0001582  2.4032 0.1047  I     3.581     .115     1.571     .868  -.190000   .399000   .1127000      .000      .000  
+83 211 45376.00 I  -.183498  .001263   .401844  .003426  I  .1103595  .0001217  2.4351 0.1560  I     4.159     .115     1.624     .868  -.188000   .402000   .1103000      .000      .000  
+83 212 45377.00 I  -.182269  .003306   .405222  .004628  I  .1078857  .0002689  2.5205 0.0718  I     4.536    1.982     1.808     .868  -.187000   .406000   .1079000      .000      .000  
+83 213 45378.00 I  -.181029  .004242   .408577  .006541  I  .1053057  .0000762  2.6445 0.1387  I     4.766    1.982     2.038     .868  -.185000   .409000   .1053000      .000      .000  
+83 214 45379.00 I  -.179780  .003088   .411914  .004643  I  .1025905  .0000680  2.7873 0.0511  I     4.919    1.982     2.186     .868  -.184000   .412000   .1025000      .000      .000  
+83 215 45380.00 I  -.178518  .003088   .415234  .004643  I  .0997325  .0000680  2.9259 0.1113  I     5.026    1.982     2.203     .868  -.182000   .415000   .0996000      .000      .000  
+83 216 45381.00 I  -.177241  .000821   .418537  .000936  I  .0967476  .0002120  3.0379 0.1113  I     5.132    1.982     2.140     .868  -.181000   .418000   .0965000      .000      .000  
+83 217 45382.00 I  -.175944  .000821   .421823  .000936  I  .0936712  .0002120  3.1063 0.1499  I     5.281    1.982     2.053     .868  -.179000   .421000   .0934000      .000      .000  
+83 218 45383.00 I  -.174625  .000821   .425092  .000936  I  .0905532  .0002120  3.1201 0.1545  I     5.469    1.982     1.959     .868  -.178000   .424000   .0902000      .000      .000  
+83 219 45384.00 I  -.173282  .000821   .428344  .000936  I  .0874499  .0002249  3.0770 0.2929  I     5.676    1.982     1.888     .868  -.176000   .427000   .0870000      .000      .000  
+83 220 45385.00 I  -.171913  .000524   .431577  .000847  I  .0844157  .0005460  2.9842 0.2953  I     5.865    1.982     1.908     .868  -.174000   .430000   .0840000      .000      .000  
+83 221 45386.00 I  -.170518  .000524   .434794  .000847  I  .0814906  .0005460  2.8641 0.4075  I     5.933    1.982     2.024     .868  -.172000   .433000   .0810000      .000      .000  
+83 222 45387.00 I  -.169096  .000524   .437994  .000092  I  .0786836  .0006050  2.7557 0.3876  I     5.770    1.982     2.106     .868  -.171000   .436000   .0782000      .000      .000  
+83 223 45388.00 I  -.167646  .000383   .441179  .001618  I  .0759597  .0005503  2.7058 0.4089  I     5.459    1.982     1.996     .868  -.169000   .439000   .0755000      .000      .000  
+83 224 45389.00 I  -.166167  .000383   .444350  .001618  I  .0732408  .0005503  2.7493 0.3891  I     5.311    1.982     1.711     .868  -.167000   .442000   .0728000      .000      .000  
+83 225 45390.00 I  -.164660  .000383   .447507  .001618  I  .0704274  .0005503  2.8937 0.2792  I     5.580    1.982     1.453     .868  -.165000   .445000   .0700000      .000      .000  
+83 226 45391.00 I  -.163125  .000542   .450652  .000761  I  .0674296  .0000950  3.1096 0.2792  I     6.197    1.982     1.363     .868  -.163000   .448000   .0670000      .000      .000  
+83 227 45392.00 I  -.161563  .000542   .453782  .000761  I  .0642052  .0000950  3.3346 0.0672  I     6.862     .187     1.369     .868  -.162000   .451000   .0637000      .000      .000  
+83 228 45393.00 I  -.159973  .000542   .456896  .000761  I  .0607805  .0000950  3.4993 0.0656  I     7.307     .187     1.338     .868  -.160000   .454000   .0603000      .000      .000  
+83 3 1 45394.00 I  -.158356  .000625   .459991  .000572  I  .0572429  .0000905  3.5550 0.0656  I     7.414     .187     1.296     .868  -.158000   .457000   .0567000      .000      .000  
+83 3 2 45395.00 I  -.156711  .000625   .463065  .000572  I  .0537102  .0000905  3.4915 0.0727  I     7.194     .187     1.378     .868  -.156000   .460000   .0531000      .000      .000  
+83 3 3 45396.00 I  -.155027  .001403   .466114  .001870  I  .0502915  .0001139  3.3331 0.0736  I     6.767     .187     1.568     .868  -.154000   .463000   .0496000      .000      .000  
+83 3 4 45397.00 I  -.153292  .001410   .469131  .001955  I  .0470614  .0001162  3.1223 0.1340  I     6.298     .187     1.650     .868  -.152000   .466000   .0462000      .000      .000  
+83 3 5 45398.00 I  -.151495  .003480   .472111  .004355  I  .0440498  .0002426  2.9026 0.1345  I     5.851    1.982     1.462     .868  -.150000   .469000   .0431000      .000      .000  
+83 3 6 45399.00 I  -.149620  .003480   .475047  .004355  I  .0412480  .0002426  2.7075 0.1533  I     5.385    1.982     1.098     .868  -.148000   .472000   .0403000      .000      .000  
+83 3 7 45400.00 I  -.147661  .003431   .477937  .004401  I  .0386193  .0001876  2.5590 0.1533  I     4.949    1.982      .789     .868  -.146000   .475000   .0376000      .000      .000  
+83 3 8 45401.00 I  -.145613  .003431   .480781  .004401  I  .0361107  .0001876  2.4686 0.1434  I     4.763    1.982      .637     .868  -.144000   .478000   .0351000      .000      .000  
+83 3 9 45402.00 I  -.143471  .002039   .483580  .001492  I  .0336612  .0002170  2.4409 0.1434  I     4.963    1.982      .572     .868  -.141000   .481000   .0326000      .000      .000  
+83 310 45403.00 I  -.141231  .002039   .486336  .001492  I  .0312083  .0002170  2.4749 0.1534  I     5.363    1.982      .510     .868  -.139000   .484000   .0302000      .000      .000  
+83 311 45404.00 I  -.138889  .002039   .489050  .001492  I  .0286930  .0002170  2.5639 0.1144  I     5.604    1.982      .472     .868  -.137000   .487000   .0277000      .000      .000  
+83 312 45405.00 I  -.136442  .001122   .491725  .000702  I  .0260663  .0000726  2.6953 0.1160  I     5.520    1.982      .516     .868  -.134000   .490000   .0251000      .000      .000  
+83 313 45406.00 I  -.133885  .001107   .494364  .000579  I  .0232944  .0000819  2.8507 0.0547  I     5.211     .120      .628     .868  -.132000   .493000   .0224000      .000      .000  
+83 314 45407.00 I  -.131210  .001107   .496969  .000579  I  .0203649  .0000819  3.0062 0.0468  I     4.824     .120      .709     .868  -.129000   .496000   .0197000      .000      .000  
+83 315 45408.00 I  -.128410  .000742   .499543  .000606  I  .0172904  .0000455  3.1364 0.0468  I     4.419     .120      .656     .868  -.127000   .499000   .0167000      .000      .000  
+83 316 45409.00 I  -.125478  .000742   .502086  .000606  I  .0141085  .0000455  3.2173 0.0322  I     4.034     .120      .448     .868  -.124000   .502000   .0136000      .000      .000  
+83 317 45410.00 I  -.122418  .000742   .504602  .000606  I  .0108778  .0000455  3.2322 0.0322  I     3.722     .120      .156     .868  -.121000   .505000   .0104000      .000      .000  
+83 318 45411.00 I  -.119235  .000742   .507091  .000606  I  .0076674  .0000455  3.1773 0.0574  I     3.482     .120     -.105     .868  -.118000   .507000   .0073000      .000      .000  
+83 319 45412.00 I  -.115937  .000322   .509555  .000960  I  .0045425  .0001053  3.0645 0.0574  I     3.245    1.982     -.262     .868  -.115000   .510000   .0043000      .000      .000  
+83 320 45413.00 I  -.112530  .000322   .511993  .000960  I  .0015490  .0001053  2.9199 0.0862  I     2.965    1.982     -.321     .868  -.112000   .512000   .0014000      .000      .000  
+83 321 45414.00 I  -.109022  .000050   .514404  .000777  I -.0012990  .0001364  2.7804 0.0915  I     2.690    1.982     -.350     .868  -.109000   .515000  -.0014000      .000      .000  
+83 322 45415.00 I  -.105420  .000646   .516789  .000796  I -.0040274  .0001497  2.6878 0.1319  I     2.519    1.982     -.435     .868  -.106000   .517000  -.0041000      .000      .000  
+83 323 45416.00 I  -.101731  .000646   .519147  .000796  I -.0067025  .0002259  2.6790 0.1260  I     2.531    1.982     -.609     .868  -.102000   .519000  -.0068000      .000      .000  
+83 324 45417.00 I  -.097962  .000656   .521477  .001889  I -.0094192  .0002028  2.7718 0.1564  I     2.738    1.982     -.816     .868  -.099000   .522000  -.0095000      .000      .000  
+83 325 45418.00 I  -.094119  .000802   .523776  .002247  I -.0122760  .0002164  2.9544 0.1483  I     3.049    1.982     -.948     .868  -.095000   .524000  -.0124000      .000      .000  
+83 326 45419.00 I  -.090209  .000802   .526043  .002247  I -.0153433  .0002164  3.1830 0.1530  I     3.301    1.982     -.955     .868  -.092000   .526000  -.0154000      .000      .000  
+83 327 45420.00 I  -.086237  .000802   .528276  .002247  I -.0186359  .0002164  3.3933 0.1479  I     3.380    1.982     -.916     .868  -.088000   .528000  -.0187000      .000      .000  
+83 328 45421.00 I  -.082209  .001142   .530471  .002405  I -.0221034  .0002018  3.5242 0.1105  I     3.304    1.982     -.942     .868  -.084000   .530000  -.0222000      .000      .000  
+83 329 45422.00 I  -.078130  .001142   .532621  .002405  I -.0256461  .0000450  3.5406 0.1034  I     3.171    1.982    -1.028     .868  -.081000   .532000  -.0257000      .000      .000  
+83 330 45423.00 I  -.074009  .001062   .534721  .001033  I -.0291468  .0000448  3.4436 0.0317  I     3.035    1.982    -1.055     .868  -.077000   .534000  -.0292000      .000      .000  
+83 331 45424.00 I  -.069850  .001062   .536763  .001033  I -.0325059  .0000448  3.2644 0.0317  I     2.891    1.982     -.968     .868  -.073000   .536000  -.0326000      .000      .000  
+83 4 1 45425.00 I  -.065659  .001062   .538743  .001033  I -.0356630  .0000448  3.0476 0.0317  I     2.723    1.982     -.881     .868  -.069000   .538000  -.0358000      .000      .000  
+83 4 2 45426.00 I  -.061440  .001062   .540657  .001033  I -.0386029  .0000448  2.8363 0.0940  I     2.532    1.982     -.931     .868  -.065000   .539000  -.0387000      .000      .000  
+83 4 3 45427.00 I  -.057195  .000454   .542501  .000976  I -.0413476  .0001825  2.6610 0.0940  I     2.344    1.982    -1.100     .868  -.060000   .541000  -.0415000      .000      .000  
+83 4 4 45428.00 I  -.052928  .000454   .544268  .000976  I -.0439429  .0001825  2.5396 0.1565  I     2.274    1.982    -1.238     .868  -.056000   .542000  -.0441000      .000      .000  
+83 4 5 45429.00 I  -.048642  .000555   .545956  .001380  I -.0464476  .0002542  2.4804 0.1404  I     2.501    1.982    -1.256     .868  -.052000   .544000  -.0466000      .000      .000  
+83 4 6 45430.00 I  -.044341  .000911   .547559  .001490  I -.0489244  .0002133  2.4833 0.1659  I     3.093    1.982    -1.208     .868  -.048000   .545000  -.0491000      .000      .000  
+83 4 7 45431.00 I  -.040027  .000911   .549075  .001490  I -.0514330  .0002133  2.5427 0.1508  I     3.864    1.982    -1.184     .868  -.044000   .547000  -.0516000      .000      .000  
+83 4 8 45432.00 I  -.035702  .000911   .550499  .001490  I -.0540247  .0002133  2.6468 0.1398  I     4.481    1.982    -1.184     .868  -.040000   .548000  -.0542000      .000      .000  
+83 4 9 45433.00 I  -.031369  .001542   .551829  .001346  I -.0567364  .0001807  2.7802 0.1398  I     4.733    1.982    -1.138     .868  -.036000   .550000  -.0568000      .000      .000  
+83 410 45434.00 I  -.027031  .001542   .553065  .001346  I -.0595887  .0001807  2.9244 0.1287  I     4.664    1.982    -1.005     .868  -.032000   .551000  -.0596000      .000      .000  
+83 411 45435.00 I  -.022693  .001542   .554205  .001346  I -.0625809  .0001833  3.0558 0.1308  I     4.461    1.982     -.834     .868  -.028000   .552000  -.0625000      .000      .000  
+83 412 45436.00 I  -.018358  .001890   .555249  .000766  I -.0656872  .0001891  3.1480 0.1317  I     4.290    1.982     -.733     .868  -.024000   .553000  -.0656000      .000      .000  
+83 413 45437.00 I  -.014034  .001890   .556197  .000766  I -.0688558  .0001891  3.1769 0.1457  I     4.235    1.982     -.790     .868  -.020000   .555000  -.0686000      .000      .000  
+83 414 45438.00 I  -.009727  .001920   .557050  .000941  I -.0720153  .0002217  3.1286 0.1532  I     4.287    1.982     -.994     .868  -.016000   .556000  -.0716000      .000      .000  
+83 415 45439.00 I  -.005446  .001957   .557808  .000886  I -.0750885  .0002410  3.0067 0.1637  I     4.358    1.982    -1.231     .868  -.012000   .557000  -.0746000      .000      .000  
+83 416 45440.00 I  -.001195  .001957   .558473  .000886  I -.0780126  .0002410  2.8363 0.1670  I     4.341    1.982    -1.372     .868  -.008000   .558000  -.0774000      .000      .000  
+83 417 45441.00 I   .003020  .001691   .559045  .001048  I -.0807588  .0002313  2.6588 0.1652  I     4.226    1.982    -1.383     .868  -.004000   .559000  -.0800000      .000      .000  
+83 418 45442.00 I   .007198  .001556   .559527  .001266  I -.0833430  .0002261  2.5197 0.1617  I     4.150    1.982    -1.340     .868   .001000   .559000  -.0825000      .000      .000  
+83 419 45443.00 I   .011338  .001556   .559922  .001266  I -.0858234  .0002261  2.4561 0.1139  I     4.301    1.982    -1.327     .868   .005000   .560000  -.0849000      .000      .000  
+83 420 45444.00 I   .015440  .000805   .560231  .001116  I -.0882865  .0000283  2.4863 0.2799  I     4.772    1.982    -1.361     .868   .009000   .561000  -.0873000      .000      .000  
+83 421 45445.00 I   .019503  .000805   .560459  .001116  I -.0908251  .0005120  2.6036 0.2564  I     5.469    1.982    -1.391     .868   .013000   .561000  -.0897000      .000      .000  
+83 422 45446.00 I   .023529  .000805   .560610  .001116  I -.0935121  .0005120  2.7760 0.3891  I     6.141    1.982    -1.364     .868   .017000   .562000  -.0924000      .000      .000  
+83 423 45447.00 I   .027520  .000608   .560689  .000875  I -.0963788  .0005860  2.9534 0.3632  I     6.524    1.982    -1.273     .868   .022000   .562000  -.0952000      .000      .000  
+83 424 45448.00 I   .031477  .001150   .560698  .000944  I -.0994022  .0005154  3.0807 0.3902  I     6.510    1.982    -1.164     .868   .026000   .563000  -.0982000      .000      .000  
+83 425 45449.00 I   .035403  .001150   .560642  .000944  I -.1025100  .0005154  3.1176 0.3916  I     6.219    1.982    -1.098     .868   .030000   .563000  -.1013000      .000      .000  
+83 426 45450.00 I   .039300  .001509   .560525  .001009  I -.1056022  .0005898  3.0490 0.2662  I     5.910    1.982    -1.088     .868   .034000   .563000  -.1044000      .000      .000  
+83 427 45451.00 I   .043172  .001177   .560348  .000745  I -.1085773  .0001333  2.8883 0.3023  I     5.781    1.982    -1.080     .868   .038000   .563000  -.1074000      .000      .000  
+83 428 45452.00 I   .047021  .001177   .560116  .000745  I -.1113600  .0001333  2.6713 0.0943  I     5.828    1.982    -1.028     .868   .043000   .564000  -.1102000      .000      .000  
+83 429 45453.00 I   .050854  .001177   .559830  .000745  I -.1139153  .0001333  2.4407 0.0973  I     5.897    1.982     -.971     .868   .047000   .564000  -.1128000      .000      .000  
+83 430 45454.00 I   .054675  .000704   .559493  .000304  I -.1162496  .0001417  2.2348 0.0973  I     5.863    1.982     -.981     .868   .051000   .564000  -.1153000      .000      .000  
+83 5 1 45455.00 I   .058491  .000704   .559106  .000304  I -.1184020  .0001417  2.0802 0.1276  I     5.755    1.982    -1.059     .868   .055000   .564000  -.1175000      .000      .000  
+83 5 2 45456.00 I   .062309  .000649   .558672  .000671  I -.1204319  .0002123  1.9913 0.0757  I     5.725    1.982    -1.129     .868   .059000   .564000  -.1197000      .000      .000  
+83 5 3 45457.00 I   .066136  .000165   .558194  .000379  I -.1224077  .0000536  1.9719 0.1095  I     5.902    1.982    -1.151     .868   .064000   .564000  -.1219000      .000      .000  
+83 5 4 45458.00 I   .069979  .000165   .557674  .000379  I -.1243973  .0000536  2.0175 0.0405  I     6.293    1.982    -1.169     .868   .068000   .564000  -.1240000      .000      .000  
+83 5 5 45459.00 I   .073844  .000700   .557115  .000397  I -.1264606  .0000608  2.1170 0.0405  I     6.795    1.982    -1.234     .868   .072000   .564000  -.1262000      .000      .000  
+83 5 6 45460.00 I   .077738  .000700   .556519  .000397  I -.1286443  .0000608  2.2555 0.0430  I     7.231    1.982    -1.316     .868   .076000   .563000  -.1285000      .000      .000  
+83 5 7 45461.00 I   .081669  .000700   .555888  .000397  I -.1309783  .0000608  2.4139 0.0347  I     7.403    1.982    -1.342     .868   .080000   .563000  -.1310000      .000      .000  
+83 5 8 45462.00 I   .085642  .000705   .555220  .000356  I -.1334714  .0000336  2.5701 0.0449  I     7.199    1.982    -1.282     .868   .085000   .562000  -.1336000      .000      .000  
+83 5 9 45463.00 I   .089658  .000942   .554509  .000366  I -.1361100  .0000662  2.7008 0.1815  I     6.714    1.982    -1.164     .868   .089000   .562000  -.1363000      .000      .000  
+83 510 45464.00 I   .093715  .003000   .553751  .000610  I -.1388562  .0003615  2.7811 0.1858  I     6.220    1.982    -1.041     .868   .093000   .561000  -.1392000      .000      .000  
+83 511 45465.00 I   .097812  .002066   .552942  .000645  I -.1416479  .0003656  2.7885 0.2571  I     5.938    1.982     -.976     .868   .097000   .560000  -.1421000      .000      .000  
+83 512 45466.00 I   .101946  .002066   .552078  .000645  I -.1444055  .0003656  2.7130 0.2585  I     5.837    1.982    -1.031     .868   .101000   .559000  -.1450000      .000      .000  
+83 513 45467.00 I   .106112  .002066   .551155  .000645  I -.1470507  .0003656  2.5681 0.2585  I     5.722    1.982    -1.214     .868   .105000   .559000  -.1478000      .000      .000  
+83 514 45468.00 I   .110302  .002066   .550170  .000645  I -.1495316  .0003656  2.3930 0.2062  I     5.489    1.982    -1.438     .868   .109000   .558000  -.1504000      .000      .000  
+83 515 45469.00 I   .114509  .000312   .549120  .000770  I -.1518442  .0001910  2.2404 0.2062  I     5.232    1.982    -1.581     .868   .113000   .557000  -.1528000      .000      .000  
+83 516 45470.00 I   .118726  .000312   .547998  .000770  I -.1540358  .0001910  2.1580 0.1081  I     5.105    1.982    -1.601     .868   .117000   .556000  -.1551000      .000      .000  
+83 517 45471.00 I   .122945  .000361   .546802  .000799  I -.1561922  .0001015  2.1718 0.1425  I     5.172    1.982    -1.554     .868   .121000   .555000  -.1573000      .000      .000  
+83 518 45472.00 I   .127159  .000272   .545527  .002039  I -.1584097  .0002116  2.2767 0.1173  I     5.391    1.982    -1.518     .868   .125000   .554000  -.1597000      .000      .000  
+83 519 45473.00 I   .131360  .000272   .544168  .002039  I -.1607653  .0002116  2.4409 0.1564  I     5.686    1.982    -1.512     .868   .129000   .553000  -.1621000      .000      .000  
+83 520 45474.00 I   .135539  .000272   .542719  .002039  I -.1632953  .0002304  2.6166 0.2434  I     5.960    1.982    -1.509     .868   .133000   .552000  -.1647000      .000      .000  
+83 521 45475.00 I   .139689  .001183   .541175  .003105  I -.1659860  .0004384  2.7549 0.2226  I     6.076    1.982    -1.476     .868   .137000   .551000  -.1675000      .000      .000  
+83 522 45476.00 I   .143801  .001183   .539534  .003105  I -.1687803  .0003810  2.8187 0.2904  I     5.901    1.982    -1.406     .868   .141000   .549000  -.1704000      .000      .000  
+83 523 45477.00 I   .147867  .001183   .537793  .003105  I -.1715926  .0003810  2.7901 0.2700  I     5.417    1.982    -1.308     .868   .144000   .548000  -.1733000      .000      .000  
+83 524 45478.00 I   .151878  .001630   .535950  .002590  I -.1743313  .0003828  2.6738 0.2700  I     4.793    1.982    -1.199     .868   .148000   .546000  -.1760000      .000      .000  
+83 525 45479.00 I   .155826  .001630   .534004  .002590  I -.1769185  .0003828  2.4924 0.2717  I     4.289    1.982    -1.104     .868   .152000   .545000  -.1787000      .000      .000  
+83 526 45480.00 I   .159706  .001776   .531958  .002117  I -.1793060  .0003856  2.2809 0.1973  I     4.048    1.982    -1.058     .868   .156000   .543000  -.1811000      .000      .000  
+83 527 45481.00 I   .163513  .001827   .529815  .000960  I -.1814826  .0000959  2.0764 0.1964  I     3.977    1.982    -1.099     .868   .159000   .541000  -.1833000      .000      .000  
+83 528 45482.00 I   .167243  .001827   .527577  .000960  I -.1834712  .0000752  1.9090 0.0609  I     3.888    1.982    -1.223     .868   .163000   .540000  -.1852000      .000      .000  
+83 529 45483.00 I   .170895  .001827   .525249  .000960  I -.1853193  .0000752  1.7978 0.0457  I     3.710    1.982    -1.360     .868   .166000   .538000  -.1871000      .000      .000  
+83 530 45484.00 I   .174469  .001582   .522836  .001735  I -.1870888  .0000520  1.7525 0.1181  I     3.515    1.982    -1.429     .868   .170000   .536000  -.1889000      .000      .000  
+83 531 45485.00 I   .177966  .001582   .520342  .001735  I -.1888461  .0002240  1.7725 0.1155  I     3.361    1.982    -1.439     .868   .174000   .534000  -.1906000      .000      .000  
+83 6 1 45486.00 I   .181388  .001512   .517771  .002038  I -.1906526  .0002251  1.8488 0.1588  I     3.238    1.982    -1.472     .868   .177000   .532000  -.1924000      .000      .000  
+83 6 2 45487.00 I   .184737  .001512   .515127  .002038  I -.1925570  .0002251  1.9651 0.1592  I     3.174    1.982    -1.561     .868   .181000   .529000  -.1942000      .000      .000  
+83 6 3 45488.00 I   .188016  .001512   .512417  .002038  I -.1945898  .0002251  2.1024 0.1592  I     3.220    1.982    -1.625     .868   .184000   .527000  -.1962000      .000      .000  
+83 6 4 45489.00 I   .191228  .001512   .509648  .002038  I -.1967628  .0002251  2.2425 0.1966  I     3.258    1.982    -1.583     .868   .188000   .525000  -.1984000      .000      .000  
+83 6 5 45490.00 I   .194379  .001406   .506829  .001455  I -.1990697  .0003223  2.3671 0.1787  I     2.994    1.982    -1.463     .868   .191000   .522000  -.2007000      .000      .000  
+83 6 6 45491.00 I   .197476  .001406   .503969  .001455  I -.2014855  .0002775  2.4570 0.2532  I     2.308    1.982    -1.346     .868   .195000   .520000  -.2032000      .000      .000  
+83 6 7 45492.00 I   .200525  .000482   .501077  .001388  I -.2039651  .0003907  2.4910 0.2022  I     1.481    1.982    -1.231     .868   .198000   .517000  -.2058000      .000      .000  
+83 6 8 45493.00 I   .203534  .003437   .498163  .001262  I -.2064431  .0002943  2.4516 0.2446  I      .902    1.982    -1.065     .868   .202000   .515000  -.2083000      .000      .000  
+83 6 9 45494.00 I   .206511  .003437   .495238  .001262  I -.2088431  .0002943  2.3364 0.2081  I      .616    1.982     -.892     .868   .205000   .512000  -.2107000      .000      .000  
+83 610 45495.00 I   .209463  .003437   .492312  .001262  I -.2110986  .0002943  2.1692 0.1495  I      .368    1.982     -.857     .868   .208000   .509000  -.2129000      .000      .000  
+83 611 45496.00 I   .212398  .002297   .489397  .002117  I -.2131805  .0000532  1.9990 0.1495  I      .041    1.982    -1.014     .868   .212000   .506000  -.2150000      .000      .000  
+83 612 45497.00 I   .215316  .002297   .486502  .002117  I -.2151148  .0000532  1.8834 0.0376  I     -.175    1.982    -1.218     .868   .215000   .503000  -.2169000      .000      .000  
+83 613 45498.00 I   .218216  .002297   .483639  .002117  I -.2169799  .0000532  1.8654 0.0399  I     -.095    1.982    -1.275     .868   .219000   .500000  -.2188000      .000      .000  
+83 614 45499.00 I   .221098  .000931   .480815  .001173  I -.2188808  .0000596  1.9529 0.0399  I      .171    1.982    -1.159     .868   .222000   .497000  -.2206000      .000      .000  
+83 615 45500.00 I   .223959  .000931   .478037  .001173  I -.2209105  .0000596  2.1150 0.0387  I      .351    1.982     -.995     .868   .225000   .494000  -.2226000      .000      .000  
+83 616 45501.00 I   .226807  .000896   .475297  .000881  I -.2231172  .0000494  2.2965 0.0389  I      .322    1.982     -.882     .868   .228000   .490000  -.2247000      .000      .000  
+83 617 45502.00 I   .229649  .000766   .472583  .000824  I -.2254904  .0000500  2.4386 0.0372  I      .179    1.982     -.795     .868   .232000   .487000  -.2270000      .000      .000  
+83 618 45503.00 I   .232469  .000690   .469865  .000451  I -.2279672  .0000557  2.4989 0.0374  I      .052    1.982     -.673     .868   .235000   .483000  -.2294000      .000      .000  
+83 619 45504.00 I   .235245  .000690   .467113  .000451  I -.2304555  .0000557  2.4611 0.0510  I     -.072    1.982     -.500     .868   .238000   .480000  -.2318000      .000      .000  
+83 620 45505.00 I   .237965  .001422   .464296  .001535  I -.2328591  .0000855  2.3326 0.0510  I     -.322    1.982     -.303     .868   .241000   .476000  -.2340000      .000      .000  
+83 621 45506.00 I   .240656  .001422   .461383  .001535  I -.2350984  .0000855  2.1373 0.0611  I     -.773    1.982     -.093     .868   .244000   .473000  -.2361000      .000      .000  
+83 622 45507.00 I   .243352  .001795   .458346  .001746  I -.2371218  .0000873  1.9063 0.0611  I    -1.306    1.982      .107     .868   .246000   .469000  -.2380000      .000      .000  
+83 623 45508.00 I   .246079  .001795   .455162  .001746  I -.2389102  .0000873  1.6730 0.0617  I    -1.693    1.982      .232     .868   .249000   .466000  -.2397000      .000      .000  
+83 624 45509.00 I   .248790  .001795   .451851  .001746  I -.2404772  .0000873  1.4677 0.0617  I    -1.824    1.982      .204     .868   .252000   .462000  -.2411000      .000      .000  
+83 625 45510.00 I   .251403  .001795   .448455  .001746  I -.2418619  .0000873  1.3111 0.0539  I    -1.806    1.982      .051     .868   .255000   .458000  -.2424000      .000      .000  
+83 626 45511.00 I   .253904  .001314   .444994  .000863  I -.2431196  .0000633  1.2151 0.0539  I    -1.807    1.982     -.077     .868   .257000   .455000  -.2435000      .000      .000  
+83 627 45512.00 I   .256323  .001314   .441473  .000863  I -.2443137  .0000633  1.1837 0.0554  I    -1.913    1.982     -.039     .868   .260000   .451000  -.2446000      .000      .000  
+83 628 45513.00 I   .258689  .000409   .437896  .000709  I -.2455067  .0000910  1.2112 0.0554  I    -2.152    1.982      .137     .868   .262000   .448000  -.2458000      .000      .000  
+83 629 45514.00 I   .261034  .000409   .434269  .000709  I -.2467514  .0000910  1.2846 0.0643  I    -2.517    1.982      .286     .868   .265000   .444000  -.2470000      .000      .000  
+83 630 45515.00 I   .263368  .000409   .430601  .000709  I -.2480856  .0000910  1.3870 0.0643  I    -2.883    1.982      .325     .868   .267000   .440000  -.2483000      .000      .000  
+83 7 1 45516.00 I   .265685  .000409   .426907  .000709  I  .7504719  .0000910  1.4976 0.0662  I    -3.047    1.982      .353     .868   .269000   .436000   .7503000      .000      .000  
+83 7 2 45517.00 I   .267977  .000035   .423195  .000953  I  .7489233  .0000961  1.5959 0.0662  I    -3.031    1.982      .491     .868   .272000   .433000   .7487000      .000      .000  
+83 7 3 45518.00 I   .270239  .000035   .419450  .000953  I  .7472900  .0000961  1.6646 0.0788  I    -3.200    1.982      .682     .868   .274000   .429000   .7470000      .000      .000  
+83 7 4 45519.00 I   .272465  .000302   .415657  .001360  I  .7456089  .0001250  1.6889 0.0788  I    -3.864    1.982      .772     .868   .276000   .425000   .7453000      .000      .000  
+83 7 5 45520.00 I   .274650  .000302   .411797  .001360  I  .7439316  .0001250  1.6549 0.0911  I    -4.842    1.982      .749     .868   .278000   .421000   .7436000      .000      .000  
+83 7 6 45521.00 I   .276789  .000302   .407855  .001360  I  .7423215  .0001325  1.5538 0.0911  I    -5.649    1.982      .771     .868   .280000   .417000   .7419000      .000      .000  
+83 7 7 45522.00 I   .278877  .000302   .403817  .001360  I  .7408431  .0001325  1.3956 0.0937  I    -6.088    1.982      .904     .868   .283000   .413000   .7403000      .000      .000  
+83 7 8 45523.00 I   .280924  .000302   .399698  .001360  I  .7395374  .0001325  1.2163 0.0937  I    -6.368    1.982      .986     .868   .285000   .409000   .7389000      .000      .000  
+83 7 9 45524.00 I   .282943  .000302   .395528  .001360  I  .7383994  .0001325  1.0705 0.0814  I    -6.657    1.982      .846     .868   .287000   .405000   .7376000      .000      .000  
+83 710 45525.00 I   .284950  .000235   .391334  .001169  I  .7373669  .0000947  1.0134 0.0814  I    -6.806    1.982      .570     .868   .289000   .401000   .7365000      .000      .000  
+83 711 45526.00 I   .286959  .000235   .387145  .001169  I  .7363329  .0000947  1.0754 0.0630  I    -6.648    1.982      .403     .868   .291000   .397000   .7353000      .000      .000  
+83 712 45527.00 I   .288985  .000235   .382991  .001169  I  .7351809  .0000832  1.2431 0.0883  I    -6.338    1.982      .433     .868   .294000   .392000   .7340000      .000      .000  
+83 713 45528.00 I   .291042  .000467   .378900  .000847  I  .7338288  .0001491  1.4644 0.1302  I    -6.223    1.982      .515     .868   .296000   .388000   .7325000      .000      .000  
+83 714 45529.00 I   .293139  .000467   .374884  .000847  I  .7322570  .0002468  1.6708 0.1455  I    -6.469    1.982      .521     .868   .298000   .384000   .7309000      .000      .000  
+83 715 45530.00 I   .295275  .000467   .370936  .000847  I  .7305113  .0002498  1.8047 0.2106  I    -6.938    1.982      .507     .868   .300000   .380000   .7290000      .000      .000  
+83 716 45531.00 I   .297449  .000618   .367044  .000258  I  .7286812  .0003414  1.8376 0.1846  I    -7.368    1.982      .577     .868   .302000   .376000   .7271000      .000      .000  
+83 717 45532.00 I   .299642  .000535   .363202  .000284  I  .7268689  .0002718  1.7720 0.2182  I    -7.596    1.982      .692     .868   .305000   .371000   .7253000      .000      .000  
+83 718 45533.00 I   .301814  .000535   .359408  .000284  I  .7251607  .0002718  1.6360 0.2140  I    -7.668    1.982      .726     .868   .307000   .367000   .7236000      .000      .000  
+83 719 45534.00 I   .303922  .000437   .355660  .000307  I  .7236072  .0003305  1.4691 0.1573  I    -7.777    1.982      .651     .868   .309000   .363000   .7221000      .000      .000  
+83 720 45535.00 I   .305929  .000410   .351954  .000268  I  .7222224  .0001583  1.3025 0.1820  I    -8.041    1.982      .552     .868   .311000   .359000   .7208000      .000      .000  
+83 721 45536.00 I   .307817  .000410   .348280  .000268  I  .7209944  .0001527  1.1592 0.1014  I    -8.338    1.982      .465     .868   .313000   .354000   .7197000      .000      .000  
+83 722 45537.00 I   .309571  .000347   .344626  .000305  I  .7198906  .0001267  1.0562 0.1278  I    -8.428    1.982      .317     .868   .315000   .350000   .7188000      .000      .000  
+83 723 45538.00 I   .311184  .000291   .340978  .000304  I  .7188644  .0002050  1.0061 0.1456  I    -8.230    1.982      .073     .868   .317000   .345000   .7179000      .000      .000  
+83 724 45539.00 I   .312662  .000291   .337319  .000304  I  .7178588  .0002621  1.0150 0.1515  I    -7.898     .184     -.142     .868   .319000   .341000   .7171000      .000      .000  
+83 725 45540.00 I   .314018  .000305   .333629  .000322  I  .7168157  .0002231  1.0801 0.1836  I    -7.626     .184     -.156     .868   .320000   .337000   .7163000      .000      .000  
+83 726 45541.00 I   .315265  .000260   .329890  .000362  I  .7156832  .0002572  1.1915 0.1702  I    -7.490     .184      .029     .868   .322000   .332000   .7153000      .000      .000  
+83 727 45542.00 I   .316426  .000260   .326094  .000362  I  .7144231  .0002572  1.3317 0.1872  I    -7.454     .184      .215     .868   .323000   .328000   .7143000      .000      .000  
+83 728 45543.00 I   .317524  .000270   .322234  .000897  I  .7130171  .0002720  1.4799 0.1640  I    -7.386     .184      .246     .868   .325000   .323000   .7131000      .000      .000  
+83 729 45544.00 I   .318573  .000270   .318298  .000897  I  .7114668  .0002035  1.6175 0.1486  I    -7.111     .184      .186     .868   .326000   .319000   .7117000      .000      .000  
+83 730 45545.00 I   .319575  .000270   .314267  .000897  I  .7097910  .0001200  1.7284 0.1125  I    -6.616    1.982      .188     .868   .327000   .315000   .7101000      .000      .000  
+83 731 45546.00 I   .320531  .000247   .310123  .000903  I  .7080234  .0000962  1.7990 0.0883  I    -6.190    1.982      .250     .868   .328000   .311000   .7085000      .000      .000  
+83 8 1 45547.00 I   .321434  .000247   .305872  .000903  I  .7062103  .0001297  1.8178 0.0807  I    -6.177    1.982      .209     .868   .328000   .306000   .7067000      .000      .000  
+83 8 2 45548.00 I   .322273  .000247   .301533  .000903  I  .7044070  .0001297  1.7790 0.0800  I    -6.542    1.982     -.001     .868   .329000   .302000   .7050000      .000      .000  
+83 8 3 45549.00 I   .323036  .000945   .297129  .000334  I  .7026705  .0000937  1.6856 0.0800  I    -6.882    1.982     -.229     .868   .330000   .298000   .7033000      .000      .000  
+83 8 4 45550.00 I   .323703  .000945   .292676  .000334  I  .7010479  .0000937  1.5559 0.0663  I    -6.892    1.982     -.322     .868   .331000   .294000   .7017000      .000      .000  
+83 8 5 45551.00 I   .324245  .000945   .288185  .000334  I  .6995577  .0000937  1.4293 0.0792  I    -6.628    1.982     -.342     .868   .331000   .290000   .7003000      .000      .000  
+83 8 6 45552.00 I   .324630  .001304   .283662  .000274  I  .6981705  .0001278  1.3592 0.0572  I    -6.264    1.982     -.443     .868   .332000   .285000   .6989000      .000      .000  
+83 8 7 45553.00 I   .324867  .001395   .279123  .000493  I  .6968051  .0000656  1.3916 0.0718  I    -5.827     .210     -.602     .868   .332000   .281000   .6975000      .000      .000  
+83 8 8 45554.00 I   .325008  .001395   .274583  .000493  I  .6953489  .0000656  1.5391 0.0913  I    -5.313     .210     -.642     .868   .333000   .277000   .6960000      .000      .000  
+83 8 9 45555.00 I   .325109  .001481   .270061  .000642  I  .6936998  .0001704  1.7679 0.0707  I    -4.876     .210     -.522     .868   .333000   .273000   .6943000      .000      .000  
+83 810 45556.00 I   .325220  .001076   .265574  .000463  I  .6918090  .0001252  2.0091 0.1057  I    -4.724     .210     -.418     .868   .333000   .269000   .6923000      .000      .000  
+83 811 45557.00 I   .325345  .001076   .261129  .000463  I  .6897026  .0001252  2.1874 0.0885  I    -4.903     .210     -.461     .868   .333000   .264000   .6901000      .000      .000  
+83 812 45558.00 I   .325442  .001076   .256722  .000463  I  .6874726  .0001252  2.2505 0.0846  I    -5.306     .210     -.527     .868   .333000   .260000   .6878000      .000      .000  
+83 813 45559.00 I   .325463  .002327   .252350  .000924  I  .6852440  .0001139  2.1865 0.0846  I    -5.779    1.982     -.436     .868   .333000   .256000   .6854000      .000      .000  
+83 814 45560.00 I   .325347  .002327   .248012  .000924  I  .6831328  .0001139  2.0231 0.0610  I    -6.162    1.982     -.247     .868   .333000   .252000   .6832000      .000      .000  
+83 815 45561.00 I   .325027  .002287   .243710  .001216  I  .6812146  .0000435  1.8094 0.0607  I    -6.358    1.982     -.203     .868   .332000   .248000   .6812000      .000      .000  
+83 816 45562.00 I   .324439  .002790   .239444  .001487  I  .6795146  .0000421  1.5940 0.0303  I    -6.459    1.982     -.398     .868   .332000   .243000   .6794000      .000      .000  
+83 817 45563.00 I   .323570  .002790   .235203  .001487  I  .6780156  .0000421  1.4115 0.0512  I    -6.683    1.982     -.653     .868   .331000   .239000   .6778000      .000      .000  
+83 818 45564.00 I   .322552  .002285   .230949  .001487  I  .6766742  .0000933  1.2811 0.1399  I    -7.100    1.982     -.762     .868   .331000   .235000   .6764000      .000      .000  
+83 819 45565.00 I   .321508  .001576   .226648  .001653  I  .6754331  .0002767  1.2117 0.1460  I    -7.513    1.982     -.734     .868   .330000   .231000   .6751000      .000      .000  
+83 820 45566.00 I   .320461  .001576   .222306  .001653  I  .6742298  .0002767  1.2052 0.1973  I    -7.732    1.982     -.703     .868   .330000   .227000   .6739000      .000      .000  
+83 821 45567.00 I   .319418  .000555   .217934  .002690  I  .6730031  .0002814  1.2576 0.1973  I    -7.819    1.982     -.687     .868   .329000   .222000   .6726000      .000      .000  
+83 822 45568.00 I   .318373  .000555   .213545  .002690  I  .6716981  .0002814  1.3596 0.1990  I    -7.973    1.982     -.566     .868   .329000   .218000   .6713000      .000      .000  
+83 823 45569.00 I   .317312  .000555   .209152  .002690  I  .6702728  .0002814  1.4951 0.1725  I    -8.275    1.982     -.282     .868   .328000   .214000   .6698000      .000      .000  
+83 824 45570.00 I   .316217  .001200   .204768  .000753  I  .6687035  .0001995  1.6439 0.1481  I    -8.654    1.982      .039     .868   .327000   .210000   .6682000      .000      .000  
+83 825 45571.00 I   .315057  .001200   .200403  .000753  I  .6669878  .0000927  1.7845 0.1188  I    -9.026    1.982      .229     .868   .326000   .206000   .6665000      .000      .000  
+83 826 45572.00 I   .313769  .001200   .196072  .000753  I  .6651441  .0001292  1.8965 0.1000  I    -9.346    1.982      .270     .868   .324000   .201000   .6646000      .000      .000  
+83 827 45573.00 I   .312292  .001538   .191785  .000753  I  .6632099  .0001772  1.9632 0.0924  I    -9.614    1.982      .285     .868   .323000   .197000   .6627000      .000      .000  
+83 828 45574.00 I   .310611  .001111   .187543  .001035  I  .6612365  .0001320  1.9736 0.1105  I    -9.938    1.982      .341     .868   .322000   .193000   .6608000      .000      .000  
+83 829 45575.00 I   .308761  .001111   .183334  .001035  I  .6592822  .0001320  1.9256 0.0990  I   -10.500    1.982      .368     .868   .320000   .189000   .6590000      .000      .000  
+83 830 45576.00 I   .306780  .000322   .179145  .001254  I  .6574024  .0001477  1.8263 0.0857  I   -11.346    1.982      .286     .868   .319000   .185000   .6572000      .000      .000  
+83 831 45577.00 I   .304707  .000572   .174963  .001020  I  .6556410  .0001094  1.6927 0.0802  I   -12.265    1.982      .144     .868   .317000   .180000   .6556000      .000      .000  
+83 9 1 45578.00 I   .302568  .000572   .170795  .001020  I  .6540182  .0000624  1.5556 0.0601  I   -12.966    1.982      .058     .868   .316000   .176000   .6541000      .000      .000  
+83 9 2 45579.00 I   .300382  .000572   .166667  .001020  I  .6525168  .0000499  1.4575 0.0381  I   -13.323    1.982      .065     .868   .314000   .172000   .6528000      .000      .000  
+83 9 3 45580.00 I   .298158  .000742   .162606  .000711  I  .6510751  .0000436  1.4436 0.0778  I   -13.395    1.982      .129     .868   .312000   .168000   .6514000      .000      .000  
+83 9 4 45581.00 I   .295874  .001655   .158623  .001131  I  .6495919  .0001473  1.5427 0.0778  I   -13.328    1.982      .271     .868   .310000   .164000   .6501000      .000      .000  
+83 9 5 45582.00 I   .293495  .001655   .154721  .001131  I  .6479549  .0001494  1.7462 0.1130  I   -13.320    1.982      .558     .868   .308000   .159000   .6486000      .000      .000  
+83 9 6 45583.00 I   .290991  .001770   .150908  .001023  I  .6460815  .0001713  2.0036 0.1148  I   -13.546    1.982      .923     .868   .306000   .155000   .6468000      .000      .000  
+83 9 7 45584.00 I   .288340  .001622   .147183  .001320  I  .6439545  .0001744  2.2405 0.1222  I   -14.009    1.982     1.136     .868   .304000   .151000   .6448000      .000      .000  
+83 9 8 45585.00 I   .285620  .001622   .143517  .001320  I  .6416305  .0001744  2.3873 0.1233  I   -14.524    1.982     1.062     .868   .302000   .147000   .6425000      .000      .000  
+83 9 9 45586.00 I   .282932  .001622   .139868  .001320  I  .6392241  .0001744  2.4015 0.1177  I   -14.948    1.982      .868     .868   .300000   .143000   .6402000      .000      .000  
+83 910 45587.00 I   .280329  .001218   .136199  .001260  I  .6368703  .0001580  2.2872 0.1170  I   -15.305    1.982      .822     .868   .297000   .139000   .6380000      .000      .000  
+83 911 45588.00 I   .277835  .001218   .132485  .001260  I  .6346791  .0001561  2.0847 0.1016  I   -15.634    1.982      .936     .868   .295000   .135000   .6359000      .000      .000  
+83 912 45589.00 I   .275415  .000920   .128738  .001259  I  .6327116  .0001277  1.8499 0.0781  I   -15.836    1.982      .950     .868   .293000   .131000   .6340000      .000      .000  
+83 913 45590.00 I   .273024  .000249   .124983  .000181  I  .6309726  .0000052  1.6350 0.0795  I   -15.828    1.982      .695     .868   .290000   .127000   .6323000      .000      .000  
+83 914 45591.00 I   .270614  .000321   .121243  .000478  I  .6294242  .0000946  1.4724 0.0474  I   -15.706    1.982      .335     .868   .288000   .123000   .6308000      .000      .000  
+83 915 45592.00 I   .268140  .000321   .117541  .000478  I  .6280058  .0000946  1.3758 0.0669  I   -15.598    1.982      .157     .868   .285000   .120000   .6295000      .000      .000  
+83 916 45593.00 I   .265569  .000321   .113896  .000478  I  .6266502  .0000946  1.3463 0.0714  I   -15.453    1.982      .226     .868   .283000   .116000   .6282000      .000      .000  
+83 917 45594.00 I   .262872  .000321   .110324  .000478  I  .6252925  .0001069  1.3790 0.0724  I   -15.133    1.982      .358     .868   .280000   .112000   .6268000      .000      .000  
+83 918 45595.00 I   .260033  .000612   .106829  .000472  I  .6238741  .0001097  1.4662 0.0766  I   -14.655    1.982      .394     .868   .277000   .109000   .6254000      .000      .000  
+83 919 45596.00 I   .257047  .000612   .103408  .000472  I  .6223466  .0001097  1.5940 0.0637  I   -14.168    1.982      .371     .868   .274000   .105000   .6238000      .000      .000  
+83 920 45597.00 I   .253908  .000630   .100056  .000330  I  .6206790  .0000647  1.7432 0.1082  I   -13.710    1.982      .412     .868   .271000   .102000   .6221000      .000      .000  
+83 921 45598.00 I   .250619  .000630   .096769  .000330  I  .6188601  .0001866  1.8929 0.0987  I   -13.188     .720      .531     .234   .268000   .098000   .6202000      .000      .000  
+83 922 45599.00 I   .247218  .000630   .093546  .000330  I  .6169004  .0001866  2.0212 0.1301  I   -12.558     .720      .618     .234   .265000   .095000   .6181000      .000      .000  
+83 923 45600.00 I   .243752  .000630   .090388  .000330  I  .6148318  .0001814  2.1074 0.1305  I   -11.888     .720      .566     .234   .262000   .092000   .6159000      .000      .000  
+83 924 45601.00 I   .240255  .000546   .087290  .000334  I  .6127044  .0001825  2.1373 0.1287  I   -11.219     .720      .383     .234   .259000   .089000   .6136000      .000      .000  
+83 925 45602.00 I   .236747  .000546   .084238  .000334  I  .6105772  .0001825  2.1073 0.1346  I   -10.540     .720      .159     .234   .255000   .086000   .6112000      .000      .000  
+83 926 45603.00 I   .233246  .000564   .081217  .000958  I  .6085069  .0001978  2.0260 0.1025  I    -9.876     .722     -.035     .270   .252000   .083000   .6090000      .000      .000  
+83 927 45604.00 I   .229770  .000564   .078212  .000958  I  .6065357  .0000932  1.9133 0.1093  I    -9.313     .724     -.193     .301   .249000   .080000   .6069000      .000      .000  
+83 928 45605.00 I   .226324  .000564   .075212  .000958  I  .6046808  .0000930  1.7990 0.0610  I    -8.870     .724     -.335     .301   .245000   .077000   .6049000      .000      .000  
+83 929 45606.00 I   .222887  .000486   .072205  .000942  I  .6029261  .0000787  1.7195 0.0638  I    -8.422     .724     -.457     .301   .242000   .074000   .6031000      .000      .000  
+83 930 45607.00 I   .219443  .000387   .069196  .001148  I  .6012183  .0000874  1.7106 0.0588  I    -7.793     .724     -.523     .301   .238000   .072000   .6012000      .000      .000  
+8310 1 45608.00 I   .215995  .000387   .066215  .001148  I  .5994726  .0000874  1.7987 0.0493  I    -6.930     .724     -.475     .301   .235000   .069000   .5995000      .000      .000  
+8310 2 45609.00 I   .212552  .000191   .063299  .000780  I  .5975868  .0000456  1.9893 0.0488  I    -5.999    1.982     -.251     .868   .231000   .066000   .5976000      .000      .000  
+8310 3 45610.00 I   .209116  .000191   .060476  .000780  I  .5954696  .0000433  2.2533 0.0336  I    -5.303    1.982      .157     .868   .227000   .064000   .5955000      .000      .000  
+8310 4 45611.00 I   .205677  .000191   .057756  .000780  I  .5930760  .0000494  2.5298 0.0579  I    -5.058    1.982      .620     .868   .223000   .061000   .5931000      .000      .000  
+8310 5 45612.00 I   .202226  .000161   .055143  .000678  I  .5904304  .0001075  2.7449 0.0592  I    -5.177    1.982      .900     .868   .219000   .059000   .5905000      .000      .000  
+8310 6 45613.00 I   .198751  .000161   .052641  .000678  I  .5876271  .0001075  2.8371 0.0760  I    -5.331    1.982      .866     .868   .215000   .056000   .5878000      .000      .000  
+8310 7 45614.00 I   .195241  .000161   .050236  .000678  I  .5848052  .0001075  2.7822 0.0892  I    -5.286    1.982      .651     .868   .211000   .054000   .5851000      .000      .000  
+8310 8 45615.00 I   .191681  .000225   .047915  .000728  I  .5821044  .0001423  2.6020 0.0755  I    -5.122    1.982      .527     .868   .207000   .052000   .5825000      .000      .000  
+8310 9 45616.00 I   .188069  .000162   .045677  .000709  I  .5796249  .0001060  2.3506 0.0880  I    -5.047    1.982      .595     .868   .202000   .050000   .5800000      .000      .000  
+831010 45617.00 I   .184406  .000162   .043530  .000709  I  .5774064  .0001036  2.0897 0.0723  I    -5.099    1.982      .687     .868   .198000   .047000   .5779000      .000      .000  
+831011 45618.00 I   .180694  .000043   .041484  .000689  I  .5754327  .0000983  1.8674 0.0858  I    -5.137    1.982      .623     .124   .193000   .045000   .5760000      .000      .000  
+831012 45619.00 I   .176934  .000201   .039547  .000579  I  .5736494  .0001369  1.7118 0.0843  I    -5.069    1.982      .474     .124   .189000   .043000   .5742000      .000      .000  
+831013 45620.00 I   .173127  .000201   .037715  .000579  I  .5719840  .0001369  1.6317 0.0968  I    -4.933    1.982      .464     .124   .185000   .041000   .5726000      .000      .000  
+831014 45621.00 I   .169272  .000201   .035973  .000579  I  .5703624  .0001369  1.6225 0.1072  I    -4.785    1.982      .667     .124   .180000   .039000   .5710000      .000      .000  
+831015 45622.00 I   .165367  .000498   .034308  .000537  I  .5687185  .0001650  1.6748 0.1072  I    -4.643    1.982      .916     .124   .176000   .038000   .5693000      .000      .000  
+831016 45623.00 I   .161397  .000498   .032717  .000537  I  .5669967  .0001650  1.7755 0.1126  I    -4.559    1.982     1.020     .124   .171000   .036000   .5675000      .000      .000  
+831017 45624.00 I   .157343  .000498   .031201  .000537  I  .5651578  .0001534  1.9054 0.1116  I    -4.605    1.982      .984     .868   .167000   .034000   .5656000      .000      .000  
+831018 45625.00 I   .153187  .000483   .029760  .001069  I  .5631825  .0001502  2.0454 0.1093  I    -4.766    1.982      .977     .868   .163000   .033000   .5635000      .000      .000  
+831019 45626.00 I   .148934  .000483   .028382  .001069  I  .5610699  .0001556  2.1768 0.1004  I    -4.944    1.982     1.123     .868   .158000   .031000   .5612000      .000      .000  
+831020 45627.00 I   .144606  .000409   .027048  .000953  I  .5588385  .0001332  2.2796 0.1016  I    -5.109    1.982     1.374     .868   .154000   .030000   .5588000      .000      .000  
+831021 45628.00 I   .140224  .000206   .025746  .001083  I  .5565266  .0001306  2.3347 0.0933  I    -5.325    1.982     1.562     .868   .149000   .028000   .5563000      .000      .000  
+831022 45629.00 I   .135800  .000206   .024495  .001083  I  .5541889  .0001306  2.3303 0.0923  I    -5.613    1.982     1.561     .868   .145000   .027000   .5537000      .000      .000  
+831023 45630.00 I   .131340  .000206   .023320  .001083  I  .5518854  .0001306  2.2677 0.1070  I    -5.883    1.982     1.395     .868   .141000   .026000   .5513000      .000      .000  
+831024 45631.00 I   .126852  .000228   .022244  .000758  I  .5496675  .0001696  2.1631 0.0890  I    -6.047    1.982     1.211     .868   .136000   .025000   .5489000      .000      .000  
+831025 45632.00 I   .122332  .000249   .021273  .000737  I  .5475627  .0001208  2.0480 0.1110  I    -6.141    1.982     1.135     .868   .132000   .024000   .5467000      .000      .000  
+831026 45633.00 I   .117777  .000242   .020411  .000617  I  .5455610  .0001434  1.9645 0.0937  I    -6.246    1.982     1.169     .868   .127000   .023000   .5447000      .000      .000  
+831027 45634.00 I   .113183  .000242   .019661  .000617  I  .5436110  .0001434  1.9493 0.1014  I    -6.334    1.982     1.230     .868   .123000   .022000   .5427000      .000      .000  
+831028 45635.00 I   .108558  .000242   .019010  .000617  I  .5416323  .0001434  2.0245 0.1014  I    -6.275    1.982     1.268     .868   .118000   .021000   .5407000      .000      .000  
+831029 45636.00 I   .103917  .000242   .018434  .000617  I  .5395291  .0001434  2.1983 0.0897  I    -5.994    1.982     1.331     .868   .114000   .020000   .5386000      .000      .000  
+831030 45637.00 I   .099285  .000685   .017915  .000351  I  .5372094  .0001079  2.4511 0.0893  I    -5.605    1.982     1.503     .868   .109000   .020000   .5364000      .000      .000  
+831031 45638.00 I   .094682  .000685   .017444  .000351  I  .5346166  .0001064  2.7350 0.0681  I    -5.371    1.982     1.804     .868   .105000   .019000   .5339000      .000      .000  
+8311 1 45639.00 I   .090127  .001256   .017010  .000275  I  .5317491  .0000832  2.9898 0.0913  I    -5.491    1.982     2.140     .868   .100000   .018000   .5311000      .000      .000  
+8311 2 45640.00 I   .085635  .001256   .016605  .000275  I  .5286668  .0001485  3.1551 0.0910  I    -5.903    1.982     2.359     .868   .095000   .018000   .5282000      .000      .000  
+8311 3 45641.00 I   .081180  .001256   .016226  .000275  I  .5254822  .0001618  3.1904 0.1098  I    -6.312    1.982     2.371     .868   .091000   .018000   .5252000      .000      .000  
+8311 4 45642.00 I   .076707  .001256   .015875  .000275  I  .5223304  .0001618  3.0924 0.1374  I    -6.449    1.982     2.236     .868   .086000   .017000   .5222000      .000      .000  
+8311 5 45643.00 I   .072188  .001035   .015555  .000140  I  .5193312  .0002222  2.8928 0.1374  I    -6.303    1.982     2.120     .868   .082000   .017000   .5194000      .000      .000  
+8311 6 45644.00 I   .067650  .001035   .015274  .000140  I  .5165611  .0002222  2.6443 0.1574  I    -6.073    1.982     2.122     .868   .077000   .017000   .5167000      .000      .000  
+8311 7 45645.00 I   .063133  .000605   .015041  .000302  I  .5140408  .0002230  2.4013 0.1451  I    -5.911    1.982     2.184     .868   .073000   .017000   .5143000      .000      .000  
+8311 8 45646.00 I   .058673  .000605   .014863  .000302  I  .5117429  .0001868  2.2049 0.1419  I    -5.773    1.982     2.201     .868   .068000   .017000   .5121000      .000      .000  
+8311 9 45647.00 I   .054298  .000605   .014750  .000302  I  .5096069  .0001755  2.0806 0.1222  I    -5.517    1.982     2.193     .868   .064000   .018000   .5099000      .000      .000  
+831110 45648.00 I   .050016  .000631   .014711  .000904  I  .5075559  .0001576  2.0338 0.1000  I    -5.078    1.982     2.275     .868   .059000   .018000   .5079000      .000      .000  
+831111 45649.00 I   .045825  .000703   .014760  .001107  I  .5055162  .0000959  2.0562 0.0922  I    -4.537    1.982     2.479     .868   .055000   .018000   .5058000      .000      .000  
+831112 45650.00 I   .041690  .000703   .014919  .001107  I  .5034252  .0000959  2.1334 0.0751  I    -4.027    1.982     2.667     .868   .051000   .018000   .5037000      .000      .000  
+831113 45651.00 I   .037570  .000679   .015212  .001507  I  .5012379  .0001155  2.2452 0.0740  I    -3.631    1.982     2.698     .868   .046000   .018000   .5015000      .000      .000  
+831114 45652.00 I   .033436  .000724   .015651  .001011  I  .4989301  .0001128  2.3712 0.0808  I    -3.335    1.982     2.603     .868   .042000   .019000   .4991000      .000      .000  
+831115 45653.00 I   .029287  .000724   .016216  .001011  I  .4964974  .0001129  2.4915 0.0782  I    -3.084     .510     2.560     .284   .037000   .019000   .4966000      .000      .000  
+831116 45654.00 I   .025129  .000652   .016880  .000328  I  .4939555  .0001082  2.5867 0.0779  I    -2.850     .510     2.708     .284   .033000   .019000   .4940000      .000      .000  
+831117 45655.00 I   .020959  .000652   .017618  .000328  I  .4913389  .0001075  2.6373 0.0783  I    -2.642     .510     3.014     .284   .029000   .020000   .4913000      .000      .000  
+831118 45656.00 I   .016746  .000652   .018418  .000328  I  .4887009  .0001133  2.6279 0.0782  I    -2.452     .510     3.303     .284   .025000   .020000   .4887000      .000      .000  
+831119 45657.00 I   .012470  .000652   .019266  .000328  I  .4861057  .0001136  2.5508 0.0654  I    -2.233     .510     3.392     .284   .020000   .021000   .4861000      .000      .000  
+831120 45658.00 I   .008132  .000478   .020152  .000519  I  .4836202  .0000652  2.4109 0.0717  I    -1.918     .670     3.227     .305   .016000   .021000   .4836000      .000      .000  
+831121 45659.00 I   .003743  .000380   .021065  .000573  I  .4812962  .0000876  2.2341 0.0444  I    -1.491     .798     2.924     .325   .012000   .022000   .4812000      .000      .000  
+831122 45660.00 I  -.000682  .000397   .021994  .000661  I  .4791497  .0000604  2.0643 0.0531  I    -1.004     .798     2.688     .325   .008000   .023000   .4790000      .000      .000  
+831123 45661.00 I  -.005128  .000397   .022932  .000661  I  .4771491  .0000599  1.9501 0.0331  I     -.538     .798     2.643     .325   .004000   .024000   .4770000      .000      .000  
+831124 45662.00 I  -.009563  .000397   .023887  .000661  I  .4752188  .0000270  1.9281 0.0367  I     -.136     .798     2.751     .325  -.001000   .024000   .4749000      .000      .000  
+831125 45663.00 I  -.013953  .000397   .024877  .000661  I  .4732586  .0000425  2.0089 0.0258  I      .206     .798     2.886     .325  -.005000   .025000   .4729000      .000      .000  
+831126 45664.00 I  -.018277  .000472   .025911  .000445  I  .4711735  .0000439  2.1723 0.0901  I      .500    1.982     2.984     .868  -.009000   .026000   .4707000      .000      .000  
+831127 45665.00 I  -.022529  .000472   .026991  .000445  I  .4689010  .0001751  2.3749 0.1223  I      .717    1.982     3.070     .868  -.013000   .027000   .4684000      .000      .000  
+831128 45666.00 I  -.026704  .000480   .028118  .000421  I  .4664286  .0002407  2.5628 0.1265  I      .771    1.982     3.192     .868  -.017000   .028000   .4659000      .000      .000  
+831129 45667.00 I  -.030799  .000587   .029291  .000575  I  .4637977  .0001827  2.6839 0.1511  I      .573    1.982     3.349     .868  -.021000   .030000   .4633000      .000      .000  
+831130 45668.00 I  -.034830  .000587   .030504  .000575  I  .4610947  .0001827  2.7034 0.1286  I      .138     .371     3.504     .868  -.025000   .031000   .4606000      .000      .000  
+8312 1 45669.00 I  -.038822  .000587   .031742  .000575  I  .4584273  .0001809  2.6136 0.1806  I     -.374     .371     3.619     .868  -.029000   .032000   .4579000      .000      .000  
+8312 2 45670.00 I  -.042803  .000524   .032994  .000495  I  .4558981  .0003115  2.4319 0.1610  I     -.740     .371     3.696     .868  -.033000   .033000   .4554000      .000      .000  
+8312 3 45671.00 I  -.046774  .000524   .034259  .000495  I  .4535817  .0002663  2.1956 0.2049  I     -.826     .371     3.762     .868  -.036000   .035000   .4531000      .000      .000  
+8312 4 45672.00 I  -.050719  .000524   .035547  .000495  I  .4515093  .0002663  1.9520 0.1881  I     -.682     .371     3.829     .868  -.040000   .036000   .4511000      .000      .000  
+8312 5 45673.00 I  -.054619  .000447   .036867  .000332  I  .4496656  .0002657  1.7448 0.1881  I     -.472     .371     3.872     .868  -.043000   .038000   .4493000      .000      .000  
+8312 6 45674.00 I  -.058443  .000447   .038228  .000332  I  .4479977  .0002657  1.6036 0.1716  I     -.302    1.982     3.875     .868  -.047000   .039000   .4476000      .000      .000  
+8312 7 45675.00 I  -.062153  .000487   .039638  .000873  I  .4464330  .0002172  1.5387 0.1354  I     -.132    1.982     3.890     .868  -.050000   .041000   .4461000      .000      .000  
+8312 8 45676.00 I  -.065717  .000558   .041105  .001068  I  .4448954  .0000522  1.5484 0.1302  I      .122    1.982     3.994     .868  -.054000   .042000   .4446000      .000      .000  
+8312 9 45677.00 I  -.069128  .000558   .042651  .001068  I  .4433152  .0001438  1.6211 0.0765  I      .432    1.982     4.171     .868  -.057000   .044000   .4431000      .000      .000  
+831210 45678.00 I  -.072386  .000558   .044297  .001068  I  .4416385  .0001438  1.7379 0.0987  I      .678    1.982     4.300     .868  -.061000   .045000   .4414000      .000      .000  
+831211 45679.00 I  -.075499  .000546   .046056  .001059  I  .4398322  .0001353  1.8764 0.0987  I      .821    1.982     4.289     .868  -.064000   .047000   .4395000      .000      .000  
+831212 45680.00 I  -.078500  .000546   .047907  .001059  I  .4378858  .0001353  2.0145 0.1043  I      .948    1.982     4.206     .868  -.067000   .049000   .4375000      .000      .000  
+831213 45681.00 I  -.081426  .000484   .049824  .000522  I  .4358100  .0001589  2.1320 0.1045  I     1.109    1.982     4.207     .868  -.070000   .051000   .4354000      .000      .000  
+831214 45682.00 I  -.084310  .000484   .051784  .000522  I  .4336338  .0001592  2.2133 0.0909  I     1.200    1.982     4.376     .868  -.074000   .052000   .4331000      .000      .000  
+831215 45683.00 I  -.087163  .000484   .053773  .000522  I  .4313994  .0000885  2.2466 0.0922  I     1.110    1.982     4.663     .868  -.077000   .054000   .4307000      .000      .000  
+831216 45684.00 I  -.089984  .000484   .055779  .000522  I  .4291600  .0000929  2.2219 0.0668  I      .904    1.982     4.956     .868  -.080000   .056000   .4284000      .000      .000  
+831217 45685.00 I  -.092784  .000988   .057796  .000774  I  .4269767  .0001000  2.1340 0.0682  I      .748    1.982     5.139     .868  -.083000   .058000   .4261000      .000      .000  
+831218 45686.00 I  -.095588  .000988   .059831  .000774  I  .4249091  .0001000  1.9946 0.0667  I      .708    1.982     5.107     .868  -.086000   .060000   .4240000      .000      .000  
+831219 45687.00 I  -.098428  .000964   .061893  .000745  I  .4229931  .0000882  1.8382 0.0664  I      .744    1.982     4.827     .868  -.089000   .062000   .4219000      .000      .000  
+831220 45688.00 I  -.101331  .000964   .063991  .000745  I  .4212216  .0000875  1.7151 0.0621  I      .883     .207     4.420     .234  -.092000   .064000   .4201000      .000      .000  
+831221 45689.00 I  -.104285  .000964   .066120  .000745  I  .4195351  .0000874  1.6754 0.0591  I     1.220     .207     4.106     .234  -.095000   .066000   .4183000      .000      .000  
+831222 45690.00 I  -.107234  .000817   .068258  .000743  I  .4178346  .0000796  1.7443 0.0607  I     1.725     .207     4.012     .234  -.098000   .068000   .4165000      .000      .000  
+831223 45691.00 I  -.110135  .000447   .070392  .000658  I  .4160138  .0000843  1.9115 0.0580  I     2.184     .207     4.053     .234  -.101000   .070000   .4147000      .000      .000  
+831224 45692.00 I  -.112977  .000447   .072525  .000658  I  .4139933  .0000843  2.1338 0.0665  I     2.392     .207     4.045     .234  -.103000   .072000   .4125000      .000      .000  
+831225 45693.00 I  -.115751  .000249   .074659  .000635  I  .4117490  .0001028  2.3478 0.0683  I     2.331     .207     3.903     .234  -.106000   .074000   .4102000      .000      .000  
+831226 45694.00 I  -.118457  .000287   .076816  .000885  I  .4093198  .0001076  2.4954 0.0744  I     2.113    1.982     3.682     .868  -.109000   .076000   .4078000      .000      .000  
+831227 45695.00 I  -.121102  .000287   .079021  .000885  I  .4067917  .0001077  2.5423 0.0835  I     1.810    1.982     3.480     .868  -.112000   .078000   .4053000      .000      .000  
+831228 45696.00 I  -.123689  .000298   .081302  .000891  I  .4042707  .0001278  2.4825 0.0836  I     1.414    1.982     3.336     .868  -.114000   .080000   .4029000      .000      .000  
+831229 45697.00 I  -.126226  .000298   .083687  .000891  I  .4018558  .0001278  2.3352 0.0904  I      .937    1.982     3.242     .868  -.117000   .083000   .4005000      .000      .000  
+831230 45698.00 I  -.128720  .000298   .086194  .000891  I  .3996181  .0001278  2.1346 0.0820  I      .478    1.982     3.184     .868  -.119000   .085000   .3984000      .000      .000  
+831231 45699.00 I  -.131198  .000298   .088822  .000891  I  .3975912  .0001028  1.9204 0.0774  I      .198    1.982     3.150     .868  -.122000   .087000   .3966000      .000      .000  
+84 1 1 45700.00 I  -.133693  .001671   .091556  .000915  I  .3957700  .0000875  1.7282 0.0674  I      .182    1.982     3.101     .868  -.125000   .089000   .3950000      .000      .000  
+84 1 2 45701.00 I  -.136248  .001671   .094364  .000915  I  .3941189  .0000873  1.5837 0.0540  I      .347     .791     2.996     .298  -.127000   .092000   .3937000      .000      .000  
+84 1 3 45702.00 I  -.138908  .001885   .097214  .001002  I  .3925820  .0000633  1.5009 0.0521  I      .515     .791     2.862     .298  -.130000   .091000   .3928000      .000      .000  
+84 1 4 45703.00 I  -.141713  .001538   .100076  .000736  I  .3910960  .0000568  1.4813 0.0425  I      .586     .791     2.816     .298  -.132000   .094000   .3908000      .000      .000  
+84 1 5 45704.00 I  -.144634  .001538   .102933  .000736  I  .3896011  .0000568  1.5168 0.0402  I      .598     .791     2.975     .298  -.135000   .099000   .3900000      .000      .000  
+84 1 6 45705.00 I  -.147567  .001538   .105787  .000736  I  .3880487  .0000568  1.5936 0.0380  I      .606     .791     3.323     .298  -.137000   .102000   .3886000      .000      .000  
+84 1 7 45706.00 I  -.150445  .000712   .108641  .000327  I  .3864062  .0000506  1.6935 0.0362  I      .619     .791     3.691     .298  -.140000   .104000   .3871000      .000      .000  
+84 1 8 45707.00 I  -.153237  .000804   .111497  .000278  I  .3846611  .0000450  1.7951 0.0324  I      .701     .791     3.943     .298  -.142000   .107000   .3854000      .000      .000  
+84 1 9 45708.00 I  -.155921  .000698   .114358  .000261  I  .3828226  .0000406  1.8770 0.0398  I      .998     .111     4.102     .298  -.145000   .110000   .3836000      .000      .000  
+84 110 45709.00 I  -.158475  .000772   .117229  .000521  I  .3809185  .0000657  1.9246 0.0389  I     1.545     .111     4.239     .298  -.147000   .113000   .3816000      .000      .000  
+84 111 45710.00 I  -.160879  .000772   .120116  .000521  I  .3789884  .0000663  1.9273 0.0467  I     2.145     .111     4.321     .298  -.150000   .116000   .3797000      .000      .000  
+84 112 45711.00 I  -.163135  .000834   .123034  .000517  I  .3770820  .0000663  1.8757 0.0459  I     2.564     .111     4.283     .298  -.152000   .119000   .3777000      .000      .000  
+84 113 45712.00 I  -.165270  .000920   .125996  .000535  I  .3752552  .0000636  1.7694 0.0805  I     2.823     .119     4.147     .298  -.154000   .122000   .3757000      .000      .000  
+84 114 45713.00 I  -.167340  .000871   .128998  .000709  I  .3735584  .0001467  1.6176 0.0799  I     3.075     .126     4.000     .298  -.157000   .125000   .3739000      .000      .000  
+84 115 45714.00 I  -.169412  .000871   .132027  .000709  I  .3720280  .0001467  1.4419 0.0947  I     3.274     .126     3.828     .298  -.159000   .128000   .3722000      .000      .000  
+84 116 45715.00 I  -.171529  .000709   .135077  .000742  I  .3706685  .0001198  1.2844 0.0940  I     3.245     .126     3.487     .298  -.161000   .131000   .3707000      .000      .000  
+84 117 45716.00 I  -.173696  .000709   .138154  .000742  I  .3694355  .0001177  1.1979 0.0809  I     3.103     .126     2.931     .298  -.164000   .134000   .3693000      .000      .000  
+84 118 45717.00 I  -.175913  .000035   .141261  .000872  I  .3682349  .0001088  1.2247 0.0801  I     3.236     .126     2.387     .298  -.166000   .138000   .3679000      .000      .000  
+84 119 45718.00 I  -.178181  .000035   .144398  .000872  I  .3669465  .0001088  1.3704 0.0780  I     3.792     .791     2.171     .298  -.168000   .141000   .3664000      .000      .000  
+84 120 45719.00 I  -.180499  .000035   .147546  .000872  I  .3654672  .0001119  1.5968 0.1337  I     4.429     .791     2.340     .298  -.171000   .144000   .3648000      .000      .000  
+84 121 45720.00 I  -.182868  .000035   .150678  .000872  I  .3637489  .0002443  1.8351 0.0879  I     4.676     .791     2.656     .298  -.173000   .147000   .3629000      .000      .000  
+84 122 45721.00 I  -.185285  .000652   .153776  .000605  I  .3618180  .0001355  2.0104 0.1298  I     4.420     .791     2.896     .298  -.175000   .150000   .3609000      .000      .000  
+84 123 45722.00 I  -.187747  .000576   .156841  .000501  I  .3597665  .0000880  2.0706 0.0808  I     3.921     .791     3.067     .298  -.177000   .153000   .3589000      .000      .000  
+84 124 45723.00 I  -.190250  .000624   .159874  .000315  I  .3577188  .0000879  2.0048 0.0622  I     3.467     .791     3.301     .298  -.180000   .157000   .3567000      .000      .000  
+84 125 45724.00 I  -.192791  .000624   .162876  .000315  I  .3557903  .0000879  1.8388 0.0619  I     3.155     .791     3.642     .298  -.182000   .160000   .3548000      .000      .000  
+84 126 45725.00 I  -.195341  .000624   .165856  .000315  I  .3540603  .0000873  1.6153 0.0467  I     2.967     .791     4.032     .298  -.184000   .163000   .3530000      .000      .000  
+84 127 45726.00 I  -.197857  .000603   .168829  .000302  I  .3525635  .0000316  1.3803 0.0476  I     2.892     .791     4.395     .298  -.186000   .166000   .3515000      .000      .000  
+84 128 45727.00 I  -.200310  .000434   .171811  .000261  I  .3512901  .0000382  1.1742 0.0294  I     3.013     .121     4.698     .298  -.189000   .169000   .3501000      .000      .000  
+84 129 45728.00 I  -.202689  .000468   .174810  .000301  I  .3501969  .0000497  1.0227 0.0321  I     3.459     .165     4.876     .298  -.191000   .173000   .3490000      .000      .000  
+84 130 45729.00 I  -.204988  .000474   .177835  .000320  I  .3492225  .0000517  0.9377 0.0352  I     4.264     .165     4.798     .298  -.193000   .176000   .3481000      .000      .000  
+84 131 45730.00 I  -.207201  .000425   .180895  .000889  I  .3482974  .0000499  0.9250 0.0347  I     5.271     .165     4.396     .298  -.195000   .179000   .3472000      .000      .000  
+84 2 1 45731.00 I  -.209302  .000487   .184010  .000856  I  .3473493  .0000464  0.9820 0.0407  I     6.169     .165     3.835     .298  -.197000   .183000   .3464000      .000      .000  
+84 2 2 45732.00 I  -.211263  .000694   .187209  .000841  I  .3463147  .0000642  1.0953 0.0496  I     6.729     .380     3.352     .298  -.200000   .186000   .3457000      .000      .000  
+84 2 3 45733.00 I  -.213058  .000813   .190510  .001115  I  .3451465  .0000876  1.2454 0.0543  I     6.862     .511     3.040     .298  -.202000   .189000   .3446000      .000      .000  
+84 2 4 45734.00 I  -.214671  .000813   .193897  .001115  I  .3438190  .0000876  1.4102 0.0619  I     6.524     .511     2.835     .298  -.204000   .193000   .3434000      .000      .000  
+84 2 5 45735.00 I  -.216102  .000813   .197345  .001115  I  .3423294  .0000876  1.5649 0.0657  I     5.700     .511     2.706     .298  -.206000   .196000   .3420000      .000      .000  
+84 2 6 45736.00 I  -.217398  .000838   .200842  .001302  I  .3407013  .0000980  1.6832 0.0644  I     4.621     .511     2.704     .298  -.208000   .200000   .3404000      .000      .000  
+84 2 7 45737.00 I  -.218614  .000911   .204396  .001220  I  .3389802  .0000943  1.7498 0.0691  I     3.543     .571     2.888     .298  -.210000   .203000   .3387000      .000      .000  
+84 2 8 45738.00 I  -.219801  .000740   .208015  .001808  I  .3372199  .0000975  1.7617 0.0663  I     2.534     .626     3.189     .298  -.212000   .207000   .3370000      .000      .000  
+84 2 9 45739.00 I  -.221010  .000740   .211703  .001808  I  .3354758  .0000933  1.7168 0.0685  I     1.682     .626     3.454     .298  -.214000   .210000   .3354000      .000      .000  
+84 210 45740.00 I  -.222283  .000740   .215418  .001808  I  .3338026  .0000962  1.6232 0.0661  I     1.311     .626     3.656     .298  -.216000   .214000   .3337000      .000      .000  
+84 211 45741.00 I  -.223623  .000791   .219088  .001758  I  .3322386  .0000937  1.5020 0.0625  I     1.545     .626     3.921     .298  -.217000   .217000   .3322000      .000      .000  
+84 212 45742.00 I  -.225009  .000927   .222662  .001651  I  .3307985  .0000798  1.3809 0.0674  I     2.123     .534     4.256     .298  -.219000   .221000   .3307000      .000      .000  
+84 213 45743.00 I  -.226395  .000748   .226137  .001946  I  .3294628  .0000968  1.3017 0.0679  I     2.619     .423     4.401     .298  -.221000   .225000   .3294000      .000      .000  
+84 214 45744.00 I  -.227735  .000913   .229512  .001604  I  .3281652  .0001100  1.3121 0.0773  I     2.911     .423     4.101     .298  -.223000   .228000   .3281000      .000      .000  
+84 215 45745.00 I  -.228996  .000691   .232798  .001413  I  .3267982  .0001206  1.4436 0.0687  I     3.276     .423     3.457     .298  -.224000   .232000   .3268000      .000      .000  
+84 216 45746.00 I  -.230184  .000651   .236043  .001426  I  .3252405  .0000823  1.6876 0.0699  I     3.991     .423     2.879     .298  -.226000   .236000   .3252000      .000      .000  
+84 217 45747.00 I  -.231313  .000291   .239301  .001397  I  .3234042  .0000708  1.9881 0.0677  I     4.812     .315     2.613     .298  -.227000   .239000   .3234000      .000      .000  
+84 218 45748.00 I  -.232399  .000440   .242625  .001108  I  .3212741  .0001076  2.2593 0.0644  I     5.195     .140     2.518     .298  -.229000   .243000   .3213000      .000      .000  
+84 219 45749.00 I  -.233470  .000440   .246041  .001108  I  .3189226  .0001076  2.4195 0.0761  I     4.947     .140     2.357     .298  -.230000   .247000   .3190000      .000      .000  
+84 220 45750.00 I  -.234563  .000440   .249561  .001108  I  .3164862  .0001076  2.4263 0.0656  I     4.377     .140     2.144     .298  -.231000   .250000   .3167000      .000      .000  
+84 221 45751.00 I  -.235703  .000396   .253172  .001015  I  .3141195  .0000752  2.2845 0.0654  I     3.871     .140     2.033     .298  -.233000   .254000   .3144000      .000      .000  
+84 222 45752.00 I  -.236884  .000361   .256861  .001018  I  .3119521  .0000744  2.0379 0.0644  I     3.602     .615     2.053     .298  -.234000   .258000   .3123000      .000      .000  
+84 223 45753.00 I  -.238091  .000393   .260612  .000772  I  .3100573  .0001045  1.7504 0.0593  I     3.549    1.090     2.085     .100  -.235000   .261000   .3105000      .000      .000  
+84 224 45754.00 I  -.239304  .000214   .264417  .000864  I  .3084469  .0000924  1.4762 0.0697  I     3.615    1.090     2.083     .100  -.236000   .265000   .3089000      .000      .000  
+84 225 45755.00 I  -.240498  .000214   .268293  .000864  I  .3070853  .0000924  1.2607 0.0694  I     3.700    1.090     2.145     .100  -.237000   .269000   .3075000      .000      .000  
+84 226 45756.00 I  -.241649  .000346   .272247  .000772  I  .3058959  .0001036  1.1341 0.0705  I     3.473    1.090     2.222     .100  -.238000   .273000   .3063000      .000      .000  
+84 227 45757.00 I  -.242735  .000404   .276271  .000588  I  .3047850  .0001065  1.1038 0.0936  I     3.065     .924     2.233     .298  -.238000   .277000   .3051000      .000      .000  
+84 228 45758.00 I  -.243735  .000505   .280348  .000358  I  .3036583  .0001558  1.1634 0.0821  I     2.748     .956     2.146     .298  -.239000   .280000   .3039000      .000      .000  
+84 229 45759.00 I  -.244627  .001082   .284464  .000348  I  .3024328  .0001251  1.2990 0.0992  I     2.557     .460     2.054     .298  -.240000   .284000   .3026000      .000      .000  
+84 3 1 45760.00 I  -.245397  .001082   .288604  .000348  I  .3010452  .0001228  1.4798 0.0796  I     2.482     .460     2.132     .298  -.241000   .288000   .3011000      .000      .000  
+84 3 2 45761.00 I  -.246066  .001240   .292756  .000428  I  .2994704  .0000983  1.6690 0.0737  I     2.507     .460     2.395     .298  -.241000   .292000   .2996000      .000      .000  
+84 3 3 45762.00 I  -.246663  .001315   .296911  .000448  I  .2977127  .0000816  1.8419 0.0685  I     2.658     .347     2.659     .298  -.241000   .296000   .2978000      .000      .000  
+84 3 4 45763.00 I  -.247186  .001483   .301065  .000415  I  .2957984  .0000953  1.9796 0.0627  I     2.971     .170     2.740     .298  -.242000   .300000   .2959000      .000      .000  
+84 3 5 45764.00 I  -.247564  .001483   .305215  .000415  I  .2937702  .0000953  2.0671 0.0675  I     3.409     .170     2.639     .298  -.242000   .304000   .2939000      .000      .000  
+84 3 6 45765.00 I  -.247740  .001431   .309367  .000454  I  .2916832  .0000956  2.0974 0.0648  I     3.855     .170     2.468     .298  -.242000   .308000   .2919000      .000      .000  
+84 3 7 45766.00 I  -.247738  .001409   .313525  .000369  I  .2895946  .0000879  2.0701 0.0632  I     4.170     .170     2.284     .298  -.242000   .312000   .2899000      .000      .000  
+84 3 8 45767.00 I  -.247545  .001359   .317689  .000353  I  .2875612  .0000828  1.9883 0.0771  I     4.258     .121     2.043     .298  -.242000   .316000   .2880000      .000      .000  
+84 3 9 45768.00 I  -.247117  .001390   .321851  .000256  I  .2856316  .0001267  1.8659 0.0511  I     4.195     .791     1.769     .298  -.241000   .320000   .2861000      .000      .000  
+84 310 45769.00 I  -.246412  .001014   .326007  .000431  I  .2838347  .0000600  1.7277 0.0701  I     4.164     .791     1.629     .298  -.241000   .324000   .2844000      .000      .000  
+84 311 45770.00 I  -.245453  .001014   .330153  .000431  I  .2821681  .0000600  1.6139 0.0385  I     4.182     .791     1.733     .298  -.240000   .328000   .2827000      .000      .000  
+84 312 45771.00 I  -.244301  .001366   .334287  .000376  I  .2805828  .0000483  1.5725 0.0348  I     4.088     .791     1.910     .298  -.240000   .332000   .2811000      .000      .000  
+84 313 45772.00 I  -.243017  .001325   .338411  .000602  I  .2789864  .0000351  1.6411 0.0280  I     3.894     .143     1.892     .159  -.239000   .336000   .2795000      .000      .000  
+84 314 45773.00 I  -.241646  .001446   .342540  .000659  I  .2772601  .0000283  1.8313 0.0198  I     3.940     .176     1.660     .199  -.239000   .340000   .2777000      .000      .000  
+84 315 45774.00 I  -.240224  .001446   .346696  .000659  I  .2752929  .0000183  2.1141 0.0276  I     4.510     .176     1.460     .199  -.238000   .344000   .2757000      .000      .000  
+84 316 45775.00 I  -.238804  .001672   .350899  .000642  I  .2730242  .0000475  2.4200 0.0240  I     5.415     .176     1.448     .199  -.237000   .347000   .2733000      .000      .000  
+84 317 45776.00 I  -.237426  .001540   .355140  .000594  I  .2704742  .0000444  2.6621 0.0321  I     6.114     .176     1.493     .199  -.236000   .351000   .2706000      .000      .000  
+84 318 45777.00 I  -.236099  .001073   .359395  .000609  I  .2677449  .0000433  2.7697 0.0412  I     6.267     .963     1.367     .162  -.235000   .355000   .2677000      .000      .000  
+84 319 45778.00 I  -.234833  .000504   .363640  .000346  I  .2649881  .0000694  2.7176 0.0464  I     5.933    1.350     1.060     .113  -.234000   .359000   .2649000      .000      .000  
+84 320 45779.00 I  -.233638  .000504   .367852  .000346  I  .2623533  .0000820  2.5348 0.0567  I     5.325    1.350      .756     .113  -.233000   .363000   .2621000      .000      .000  
+84 321 45780.00 I  -.232516  .001037   .372008  .000403  I  .2599421  .0000898  2.2812 0.0523  I     4.562    1.350      .530     .113  -.231000   .367000   .2596000      .000      .000  
+84 322 45781.00 I  -.231434  .000996   .376092  .000507  I  .2577934  .0000649  2.0200 0.0545  I     3.727    1.350      .259     .113  -.230000   .371000   .2574000      .000      .000  
+84 323 45782.00 I  -.230332  .000908   .380098  .000475  I  .2558878  .0000617  1.8017 0.0495  I     2.824     .972     -.121     .220  -.228000   .375000   .2554000      .000      .000  
+84 324 45783.00 I  -.229142  .001034   .384027  .000547  I  .2541670  .0000747  1.6523 0.0574  I     1.819     .257     -.434     .290  -.227000   .379000   .2536000      .000      .000  
+84 325 45784.00 I  -.227828  .001019   .387876  .000520  I  .2525587  .0000968  1.5763 0.0580  I      .843     .257     -.457     .290  -.225000   .383000   .2520000      .000      .000  
+84 326 45785.00 I  -.226424  .001019   .391632  .000520  I  .2509899  .0000888  1.5736 0.0629  I      .230     .257     -.167     .290  -.223000   .387000   .2503000      .000      .000  
+84 327 45786.00 I  -.224943  .000382   .395303  .000553  I  .2493888  .0000803  1.6388 0.0597  I      .162     .257      .266     .290  -.221000   .390000   .2487000      .000      .000  
+84 328 45787.00 I  -.223387  .000382   .398901  .000553  I  .2476965  .0000799  1.7515 0.0991  I      .455     .257      .734     .290  -.219000   .394000   .2469000      .000      .000  
+84 329 45788.00 I  -.221753  .000192   .402445  .000510  I  .2458792  .0001811  1.8841 0.1014  I      .741     .791     1.270     .298  -.218000   .398000   .2450000      .000      .000  
+84 330 45789.00 I  -.220027  .000192   .405961  .000510  I  .2439299  .0001863  2.0119 0.0953  I      .859     .791     1.874     .298  -.216000   .402000   .2430000      .000      .000  
+84 331 45790.00 I  -.218203  .000167   .409467  .000497  I  .2418646  .0000596  2.1122 0.0960  I      .942     .791     2.386     .298  -.213000   .406000   .2409000      .000      .000  
+84 4 1 45791.00 I  -.216277  .000369   .412970  .000787  I  .2397213  .0000461  2.1650 0.0353  I     1.186     .791     2.587     .298  -.211000   .410000   .2386000      .000      .000  
+84 4 2 45792.00 I  -.214248  .000673   .416473  .000865  I  .2375544  .0000377  2.1583 0.0412  I     1.668     .116     2.395     .298  -.209000   .414000   .2363000      .000      .000  
+84 4 3 45793.00 I  -.212116  .000791   .419980  .001333  I  .2354255  .0000682  2.0893 0.0383  I     2.373     .116     1.886     .298  -.206000   .417000   .2341000      .000      .000  
+84 4 4 45794.00 I  -.209885  .000791   .423499  .001333  I  .2333936  .0000667  1.9670 0.0517  I     3.241     .116     1.144     .298  -.204000   .421000   .2320000      .000      .000  
+84 4 5 45795.00 I  -.207558  .000791   .427047  .001333  I  .2315025  .0000776  1.8116 0.0557  I     4.171     .116      .165     .298  -.202000   .425000   .2301000      .000      .000  
+84 4 6 45796.00 I  -.205116  .000828   .430657  .001285  I  .2297717  .0000893  1.6522 0.0563  I     5.044     .116     -.964     .298  -.199000   .428000   .2283000      .000      .000  
+84 4 7 45797.00 I  -.202564  .000936   .434329  .001211  I  .2281875  .0000817  1.5245 0.0689  I     5.821     .247    -2.041     .298  -.197000   .432000   .2268000      .000      .000  
+84 4 8 45798.00 I  -.199927  .000914   .438042  .001183  I  .2267002  .0001049  1.4644 0.0729  I     6.491     .330    -2.846     .114  -.195000   .436000   .2252000      .000      .000  
+84 4 9 45799.00 I  -.197234  .000940   .441776  .000921  I  .2252257  .0001207  1.5032 0.0805  I     6.949     .330    -3.227     .114  -.192000   .439000   .2238000      .000      .000  
+84 410 45800.00 I  -.194512  .000940   .445521  .000921  I  .2236558  .0001221  1.6559 0.0833  I     7.063     .330    -3.109     .114  -.190000   .443000   .2222000      .000      .000  
+84 411 45801.00 I  -.191747  .000878   .449274  .000963  I  .2218794  .0001148  1.9121 0.0768  I     6.909     .330    -2.583     .114  -.187000   .446000   .2204000      .000      .000  
+84 412 45802.00 I  -.188910  .000824   .453024  .000984  I  .2198122  .0000933  2.2264 0.0836  I     6.623     .349    -1.726     .114  -.185000   .450000   .2184000      .000      .000  
+84 413 45803.00 I  -.186018  .000629   .456733  .001073  I  .2174328  .0001216  2.5220 0.0770  I     6.224     .367     -.678     .113  -.182000   .453000   .2161000      .000      .000  
+84 414 45804.00 I  -.183103  .000629   .460348  .001073  I  .2148017  .0001224  2.7172 0.0803  I     5.713     .367      .222     .113  -.179000   .457000   .2136000      .000      .000  
+84 415 45805.00 I  -.180195  .000231   .463824  .000725  I  .2120503  .0001050  2.7566 0.0736  I     5.247     .367      .592     .113  -.177000   .460000   .2109000      .000      .000  
+84 416 45806.00 I  -.177307  .000309   .467156  .000706  I  .2093423  .0000816  2.6344 0.0580  I     4.967     .367      .474     .113  -.174000   .463000   .2084000      .000      .000  
+84 417 45807.00 I  -.174447  .000774   .470354  .000769  I  .2068199  .0000493  2.3969 0.0574  I     4.911     .809      .194     .219  -.171000   .466000   .2061000      .000      .000  
+84 418 45808.00 I  -.171620  .000899   .473431  .000726  I  .2045618  .0000808  2.1195 0.0430  I     5.012    1.044     -.006     .271  -.168000   .469000   .2039000      .000      .000  
+84 419 45809.00 I  -.168823  .000899   .476398  .000726  I  .2025697  .0000705  1.8759 0.0536  I     5.125    1.044     -.070     .271  -.165000   .473000   .2020000      .000      .000  
+84 420 45810.00 I  -.166061  .000899   .479278  .000726  I  .2007854  .0000704  1.7062 0.0484  I     5.088    1.044      .016     .271  -.162000   .475000   .2003000      .000      .000  
+84 421 45811.00 I  -.163372  .000905   .482112  .000731  I  .1991292  .0000662  1.6208 0.0475  I     5.144    1.044      .005     .271  -.159000   .479000   .1987000      .000      .000  
+84 422 45812.00 I  -.160723  .000936   .484922  .000740  I  .1975172  .0000638  1.6153 0.0549  I     5.455     .957     -.128     .231  -.156000   .481000   .1970000      .000      .000  
+84 423 45813.00 I  -.158061  .001071   .487723  .000472  I  .1958781  .0000875  1.6712 0.0402  I     5.953     .951     -.199     .194  -.153000   .484000   .1953000      .000      .000  
+84 424 45814.00 I  -.155331  .000641   .490533  .000480  I  .1941616  .0000489  1.7665 0.0499  I     6.565     .650     -.198     .298  -.150000   .488000   .1936000      .000      .000  
+84 425 45815.00 I  -.152483  .000641   .493366  .000480  I  .1923383  .0000482  1.8820 0.0326  I     6.994     .761     -.115     .298  -.146000   .490000   .1917000      .000      .000  
+84 426 45816.00 I  -.149499  .000549   .496226  .000477  I  .1903968  .0000432  1.9998 0.0306  I     7.055     .761      .066     .298  -.143000   .493000   .1898000      .000      .000  
+84 427 45817.00 I  -.146378  .000598   .499108  .000487  I  .1883442  .0000378  2.1009 0.0307  I     6.831     .688      .348     .298  -.140000   .496000   .1876000      .000      .000  
+84 428 45818.00 I  -.143112  .000309   .502004  .000338  I  .1862065  .0000435  2.1673 0.0273  I     6.676     .707      .616     .298  -.136000   .499000   .1854000      .000      .000  
+84 429 45819.00 I  -.139694  .000309   .504907  .000338  I  .1840258  .0000393  2.1851 0.0359  I     6.677     .707      .723     .298  -.133000   .501000   .1832000      .000      .000  
+84 430 45820.00 I  -.136117  .000374   .507802  .000566  I  .1818567  .0000571  2.1417 0.0366  I     6.634     .707      .603     .298  -.129000   .504000   .1810000      .000      .000  
+84 5 1 45821.00 I  -.132404  .000374   .510670  .000566  I  .1797638  .0000617  2.0341 0.0444  I     6.501     .521      .310     .298  -.126000   .506000   .1788000      .000      .000  
+84 5 2 45822.00 I  -.128584  .000563   .513487  .000626  I  .1778052  .0000681  1.8765 0.0609  I     6.311     .521     -.013     .298  -.122000   .509000   .1767000      .000      .000  
+84 5 3 45823.00 I  -.124685  .000857   .516235  .000741  I  .1760190  .0001050  1.6944 0.0620  I     6.039     .791     -.240     .298  -.119000   .511000   .1749000      .000      .000  
+84 5 4 45824.00 I  -.120721  .000857   .518909  .000741  I  .1744128  .0001036  1.5232 0.0736  I     5.620     .791     -.352     .298  -.115000   .514000   .1732000      .000      .000  
+84 5 5 45825.00 I  -.116696  .000857   .521516  .000741  I  .1729556  .0001031  1.4031 0.0628  I     5.087     .791     -.411     .298  -.112000   .516000   .1717000      .000      .000  
+84 5 6 45826.00 I  -.112618  .000835   .524062  .000475  I  .1715775  .0000711  1.3702 0.0594  I     4.643     .791     -.481     .298  -.108000   .518000   .1703000      .000      .000  
+84 5 7 45827.00 I  -.108541  .000895   .526540  .000422  I  .1701798  .0000589  1.4436 0.0440  I     4.535     .250     -.569     .171  -.104000   .521000   .1689000      .000      .000  
+84 5 8 45828.00 I  -.104534  .000873   .528942  .000373  I  .1686564  .0000519  1.6186 0.0460  I     4.848     .250     -.625     .171  -.101000   .523000   .1673000      .000      .000  
+84 5 9 45829.00 I  -.100665  .000806   .531257  .000295  I  .1669190  .0000706  1.8643 0.0592  I     5.448     .250     -.578     .171  -.097000   .525000   .1655000      .000      .000  
+84 510 45830.00 I  -.096980  .000806   .533468  .000295  I  .1649239  .0001065  2.1218 0.0601  I     6.096     .250     -.386     .171  -.094000   .527000   .1635000      .000      .000  
+84 511 45831.00 I  -.093484  .000857   .535562  .000330  I  .1626958  .0000973  2.3181 0.0692  I     6.529     .250     -.088     .171  -.090000   .529000   .1612000      .000      .000  
+84 512 45832.00 I  -.090126  .000861   .537536  .000351  I  .1603279  .0000883  2.3936 0.0734  I     6.635     .325      .192     .178  -.086000   .531000   .1587000      .000      .000  
+84 513 45833.00 I  -.086832  .000810   .539392  .000396  I  .1579581  .0001100  2.3205 0.0733  I     6.526     .386      .329     .186  -.083000   .533000   .1563000      .000      .000  
+84 514 45834.00 I  -.083528  .000737   .541130  .000408  I  .1557314  .0001171  2.1138 0.0744  I     6.352     .386      .310     .186  -.079000   .535000   .1541000      .000      .000  
+84 515 45835.00 I  -.080144  .000670   .542753  .000339  I  .1537564  .0001002  1.8293 0.0637  I     6.125     .386      .229     .186  -.075000   .537000   .1521000      .000      .000  
+84 516 45836.00 I  -.076659  .000688   .544280  .000343  I  .1520742  .0000503  1.5404 0.0557  I     5.837     .386      .153     .186  -.071000   .538000   .1504000      .000      .000  
+84 517 45837.00 I  -.073068  .000773   .545737  .000735  I  .1506565  .0000488  1.3086 0.0382  I     5.497     .522      .028     .134  -.067000   .540000   .1490000      .000      .000  
+84 518 45838.00 I  -.069372  .000812   .547148  .000804  I  .1494269  .0000575  1.1669 0.0375  I     5.139     .629     -.219     .298  -.064000   .542000   .1477000      .000      .000  
+84 519 45839.00 I  -.065593  .000812   .548539  .000804  I  .1482916  .0000569  1.1185 0.0406  I     4.810     .629     -.520     .298  -.060000   .544000   .1466000      .000      .000  
+84 520 45840.00 I  -.061753  .000812   .549930  .000804  I  .1471636  .0000572  1.1489 0.0374  I     4.588     .629     -.705     .298  -.056000   .545000   .1454000      .000      .000  
+84 521 45841.00 I  -.057842  .000767   .551303  .000815  I  .1459754  .0000487  1.2344 0.0364  I     4.521     .629     -.714     .298  -.052000   .546000   .1442000      .000      .000  
+84 522 45842.00 I  -.053862  .000893   .552630  .000787  I  .1446855  .0000449  1.3479 0.0349  I     4.632     .705     -.650     .298  -.048000   .548000   .1429000      .000      .000  
+84 523 45843.00 I  -.049830  .000803   .553883  .000425  I  .1432785  .0000499  1.4648 0.0305  I     4.820     .774     -.620     .298  -.044000   .549000   .1416000      .000      .000  
+84 524 45844.00 I  -.045764  .000793   .555039  .000445  I  .1417625  .0000413  1.5620 0.0340  I     4.832     .774     -.590     .298  -.040000   .550000   .1401000      .000      .000  
+84 525 45845.00 I  -.041679  .000793   .556087  .000445  I  .1401662  .0000463  1.6240 0.0333  I     4.443     .774     -.459     .298  -.036000   .552000   .1385000      .000      .000  
+84 526 45846.00 I  -.037550  .000745   .557031  .000428  I  .1385293  .0000522  1.6417 0.0336  I     3.700     .774     -.213     .298  -.032000   .553000   .1368000      .000      .000  
+84 527 45847.00 I  -.033346  .000963   .557886  .000765  I  .1368996  .0000488  1.6089 0.0409  I     2.843     .591      .023     .298  -.028000   .554000   .1352000      .000      .000  
+84 528 45848.00 I  -.029063  .000865   .558661  .000818  I  .1353285  .0000631  1.5249 0.0395  I     2.126     .315      .099     .298  -.024000   .555000   .1337000      .000      .000  
+84 529 45849.00 I  -.024702  .000946   .559368  .000991  I  .1338643  .0000622  1.3973 0.0451  I     1.736     .315     -.034     .298  -.020000   .556000   .1322000      .000      .000  
+84 530 45850.00 I  -.020261  .000861   .560019  .000901  I  .1325442  .0000644  1.2389 0.0414  I     1.760     .315     -.289     .298  -.016000   .557000   .1310000      .000      .000  
+84 531 45851.00 I  -.015736  .000784   .560616  .000824  I  .1313877  .0000546  1.0769 0.0393  I     2.069     .315     -.516     .298  -.012000   .557000   .1299000      .000      .000  
+84 6 1 45852.00 I  -.011164  .000661   .561137  .000700  I  .1303775  .0000450  0.9537 0.0403  I     2.429     .333     -.606     .298  -.007000   .558000   .1289000      .000      .000  
+84 6 2 45853.00 I  -.006584  .000375   .561557  .000428  I  .1294549  .0000594  0.9068 0.0360  I     2.681     .350     -.562     .298  -.003000   .559000   .1280000      .000      .000  
+84 6 3 45854.00 I  -.002004  .000375   .561867  .000428  I  .1285322  .0000562  0.9552 0.0434  I     2.810     .350     -.462     .298   .001000   .559000   .1272000      .000      .000  
+84 6 4 45855.00 I   .002574  .000375   .562062  .000428  I  .1275139  .0000633  1.0956 0.0390  I     2.870     .350     -.354     .298   .005000   .560000   .1262000      .000      .000  
+84 6 5 45856.00 I   .007150  .000282   .562137  .000244  I  .1263199  .0000540  1.2994 0.0407  I     2.931     .350     -.229     .298   .009000   .560000   .1250000      .000      .000  
+84 6 6 45857.00 I   .011713  .000288   .562095  .000238  I  .1249107  .0000512  1.5165 0.0486  I     2.935     .293     -.057     .551   .014000   .560000   .1236000      .000      .000  
+84 6 7 45858.00 I   .016250  .000380   .561940  .000202  I  .1233020  .0000808  1.6885 0.0589  I     2.720     .223      .139     .778   .018000   .560000   .1220000      .000      .000  
+84 6 8 45859.00 I   .020744  .000652   .561678  .000281  I  .1215661  .0001060  1.7633 0.0665  I     2.185     .223      .264     .778   .022000   .560000   .1203000      .000      .000  
+84 6 9 45860.00 I   .025167  .000652   .561321  .000281  I  .1198165  .0001056  1.7147 0.0678  I     1.416     .223      .209     .778   .026000   .560000   .1185000      .000      .000  
+84 610 45861.00 I   .029479  .000526   .560886  .000441  I  .1181750  .0000846  1.5513 0.0649  I      .642     .223     -.027     .778   .030000   .560000   .1169000      .000      .000  
+84 611 45862.00 I   .033651  .000595   .560392  .000571  I  .1167397  .0000755  1.3106 0.0636  I      .129     .506     -.356     .690   .035000   .560000   .1154000      .000      .000  
+84 612 45863.00 I   .037698  .000634   .559870  .000680  I  .1155606  .0000949  1.0494 0.0581  I      .024     .679     -.653     .588   .039000   .560000   .1142000      .000      .000  
+84 613 45864.00 I   .041648  .000630   .559352  .000595  I  .1146282  .0000884  0.8261 0.0550  I      .278     .679     -.799     .588   .043000   .560000   .1132000      .000      .000  
+84 614 45865.00 I   .045528  .000467   .558866  .000641  I  .1138831  .0000558  0.6787 0.0501  I      .686     .679     -.800     .588   .047000   .559000   .1125000      .000      .000  
+84 615 45866.00 I   .049374  .000533   .558416  .000569  I  .1132413  .0000471  0.6200 0.0344  I     1.028     .679     -.827     .588   .052000   .559000   .1118000      .000      .000  
+84 616 45867.00 I   .053228  .000711   .557996  .000563  I  .1126155  .0000401  0.6442 0.0334  I     1.229     .575     -.861     .421   .056000   .558000   .1112000      .000      .000  
+84 617 45868.00 I   .057118  .000775   .557597  .000272  I  .1119315  .0000473  0.7325 0.0278  I     1.293     .448     -.847     .298   .060000   .558000   .1105000      .000      .000  
+84 618 45869.00 I   .061049  .000775   .557210  .000272  I  .1111373  .0000384  0.8605 0.0274  I     1.249     .448     -.799     .298   .064000   .557000   .1097000      .000      .000  
+84 619 45870.00 I   .065011  .000824   .556822  .000312  I  .1102061  .0000275  1.0018 0.0243  I     1.124     .448     -.817     .298   .069000   .556000   .1088000      .000      .000  
+84 620 45871.00 I   .068961  .000944   .556410  .000475  I  .1091371  .0000299  1.1329 0.0270  I      .980     .448     -.935     .298   .073000   .555000   .1077000      .000      .000  
+84 621 45872.00 I   .072888  .000886   .555944  .000440  I  .1079499  .0000464  1.2352 0.0405  I      .849     .958    -1.046     .167   .077000   .555000   .1066000      .000      .000  
+84 622 45873.00 I   .076789  .000955   .555397  .000557  I  .1066807  .0000752  1.2953 0.0437  I      .654    1.279    -1.009     .219   .081000   .554000   .1053000      .000      .000  
+84 623 45874.00 I   .080672  .000808   .554742  .000625  I  .1053753  .0000740  1.3073 0.0532  I      .256    1.279     -.800     .219   .086000   .553000   .1041000      .000      .000  
+84 624 45875.00 I   .084588  .000808   .553970  .000625  I  .1040846  .0000754  1.2639 0.0495  I     -.363    1.279     -.521     .219   .090000   .552000   .1029000      .000      .000  
+84 625 45876.00 I   .088574  .000919   .553073  .000580  I  .1028675  .0000658  1.1605 0.0492  I     -.993    1.279     -.319     .219   .094000   .551000   .1017000      .000      .000  
+84 626 45877.00 I   .092657  .000791   .552046  .000377  I  .1017801  .0000633  1.0074 0.0503  I    -1.337    1.223     -.268     .164   .098000   .549000   .1006000      .000      .000  
+84 627 45878.00 I   .096871  .000826   .550896  .000421  I  .1008610  .0000760  0.8293 0.0461  I    -1.273    1.165     -.359     .298   .102000   .548000   .0998000      .000      .000  
+84 628 45879.00 I   .101258  .000957   .549641  .000433  I  .1001166  .0000671  0.6659 0.0512  I     -.893    1.165     -.549     .298   .107000   .547000   .0991000      .000      .000  
+84 629 45880.00 I   .105838  .001070   .548297  .000287  I  .0995091  .0000685  0.5627 0.0470  I     -.328    1.165     -.761     .298   .111000   .546000   .0986000      .000      .000  
+84 630 45881.00 I   .110541  .000967   .546878  .000287  I  .0989598  .0000657  0.5538 0.0457  I      .317    1.165     -.897     .298   .115000   .544000   .0981000      .000      .000  
+84 7 1 45882.00 I   .115262  .000814   .545401  .000256  I  .0983676  .0000604  0.6466 0.0484  I      .940    1.001     -.925     .298   .119000   .543000   .0975000      .000      .000  
+84 7 2 45883.00 I   .119923  .000701   .543875  .000300  I  .0976423  .0000710  0.8123 0.0392  I     1.377     .804     -.895     .298   .123000   .541000   .0967000      .000      .000  
+84 7 3 45884.00 I   .124503  .000701   .542301  .000300  I  .0967379  .0000501  0.9932 0.0471  I     1.422     .804     -.855     .298   .128000   .540000   .0957000      .000      .000  
+84 7 4 45885.00 I   .128981  .000284   .540676  .000360  I  .0956692  .0000618  1.1340 0.0375  I      .940     .804     -.777     .298   .132000   .538000   .0946000      .000      .000  
+84 7 5 45886.00 I   .133340  .000404   .538990  .000311  I  .0944962  .0000557  1.1958 0.0438  I      .045     .804     -.625     .298   .136000   .536000   .0932000      .000      .000  
+84 7 6 45887.00 I   .137574  .000526   .537225  .000437  I  .0933116  .0000621  1.1557 0.0451  I    -1.071    1.211     -.404     .189   .140000   .535000   .0919000      .000      .000  
+84 7 7 45888.00 I   .141680  .000673   .535361  .000562  I  .0922166  .0000709  1.0201 0.0482  I    -2.249    1.423     -.166     .245   .145000   .533000   .0907000      .000      .000  
+84 7 8 45889.00 I   .145664  .000601   .533389  .000529  I  .0912929  .0000737  0.8198 0.0511  I    -3.299    1.423      .021     .245   .149000   .531000   .0897000      .000      .000  
+84 7 9 45890.00 I   .149545  .000601   .531308  .000529  I  .0905856  .0000737  0.5937 0.0490  I    -3.991    1.423      .091     .245   .153000   .529000   .0889000      .000      .000  
+84 710 45891.00 I   .153348  .000587   .529131  .000651  I  .0900997  .0000646  0.3849 0.0468  I    -4.274    1.423      .014     .245   .157000   .527000   .0884000      .000      .000  
+84 711 45892.00 I   .157110  .000551   .526879  .000668  I  .0897970  .0000577  0.2324 0.0439  I    -4.148    1.105     -.212     .223   .161000   .525000   .0881000      .000      .000  
+84 712 45893.00 I   .160862  .000330   .524579  .000742  I  .0896094  .0000594  0.1565 0.0414  I    -3.775     .182     -.546     .187   .165000   .523000   .0880000      .000      .000  
+84 713 45894.00 I   .164632  .000330   .522263  .000742  I  .0894579  .0000594  0.1589 0.0449  I    -3.430     .182     -.882     .187   .169000   .521000   .0878000      .000      .000  
+84 714 45895.00 I   .168441  .000362   .519958  .000714  I  .0892686  .0000674  0.2305 0.0420  I    -3.330     .182    -1.071     .187   .173000   .518000   .0877000      .000      .000  
+84 715 45896.00 I   .172283  .000505   .517656  .000661  I  .0889796  .0000593  0.3542 0.0422  I    -3.470     .182    -1.037     .187   .177000   .516000   .0874000      .000      .000  
+84 716 45897.00 I   .176152  .000446   .515337  .000729  I  .0885517  .0000507  0.5035 0.0415  I    -3.744     .172     -.851     .132   .181000   .514000   .0870000      .000      .000  
+84 717 45898.00 I   .180041  .000577   .512981  .000366  I  .0879727  .0000580  0.6525 0.0365  I    -4.050     .161     -.669     .298   .185000   .511000   .0865000      .000      .000  
+84 718 45899.00 I   .183948  .000577   .510566  .000366  I  .0872532  .0000526  0.7821 0.0464  I    -4.238     .161     -.566     .298   .189000   .509000   .0858000      .000      .000  
+84 719 45900.00 I   .187878  .000536   .508072  .000708  I  .0864211  .0000725  0.8739 0.0442  I    -4.150     .149     -.465     .298   .193000   .507000   .0850000      .000      .000  
+84 720 45901.00 I   .191806  .000536   .505497  .000707  I  .0855229  .0000711  0.9131 0.0508  I    -3.888     .130     -.259     .298   .197000   .504000   .0842000      .000      .000  
+84 721 45902.00 I   .195733  .000536   .502847  .000707  I  .0846132  .0000711  0.8974 0.0609  I    -3.829     .130      .007     .298   .201000   .502000   .0834000      .000      .000  
+84 722 45903.00 I   .199670  .000477   .500128  .000832  I  .0837447  .0000990  0.8318 0.0620  I    -4.258     .791      .174     .298   .204000   .499000   .0826000      .000      .000  
+84 723 45904.00 I   .203624  .000413   .497351  .000935  I  .0829616  .0001016  0.7302 0.0709  I    -5.006     .791      .163     .298   .208000   .496000   .0819000      .000      .000  
+84 724 45905.00 I   .207573  .000413   .494543  .000935  I  .0822899  .0001016  0.6118 0.0735  I    -5.582     .791      .027     .298   .212000   .494000   .0813000      .000      .000  
+84 725 45906.00 I   .211481  .000481   .491731  .001050  I  .0817349  .0001061  0.5029 0.0534  I    -5.734     .791     -.150     .298   .215000   .491000   .0808000      .000      .000  
+84 726 45907.00 I   .215311  .000821   .488936  .000509  I  .0812672  .0000332  0.4448 0.0561  I    -5.627     .506     -.379     .489   .219000   .488000   .0804000      .000      .000  
+84 727 45908.00 I   .219051  .000743   .486154  .000467  I  .0808141  .0000363  0.4802 0.0252  I    -5.503     .506     -.684     .489   .223000   .485000   .0801000      .000      .000  
+84 728 45909.00 I   .222688  .000809   .483378  .000147  I  .0802680  .0000379  0.6321 0.0290  I    -5.402     .417     -.991     .439   .226000   .483000   .0796000      .000      .000  
+84 729 45910.00 I   .226221  .000787   .480603  .000226  I  .0795154  .0000453  0.8874 0.0275  I    -5.267     .417    -1.153     .439   .230000   .479000   .0789000      .000      .000  
+84 730 45911.00 I   .229681  .000767   .477813  .000285  I  .0784771  .0000398  1.1908 0.0286  I    -5.078     .417     -.887     .439   .233000   .476000   .0780000      .000      .000  
+84 731 45912.00 I   .233082  .000724   .474988  .000321  I  .0771460  .0000349  1.4575 0.0267  I    -5.046     .542     -.715     .342   .236000   .473000   .0768000      .000      .000  
+84 8 1 45913.00 I   .236413  .000584   .472105  .000381  I  .0755994  .0000357  1.6124 0.0267  I    -5.231     .565     -.787     .176   .240000   .470000   .0753000      .000      .000  
+84 8 2 45914.00 I   .239692  .000370   .469146  .000344  I  .0739710  .0000405  1.6181 0.0262  I    -5.508     .515     -.933     .161   .243000   .467000   .0737000      .000      .000  
+84 8 3 45915.00 I   .242944  .000551   .466103  .000484  I  .0724111  .0000383  1.4801 0.0273  I    -5.788     .592     -.954     .298   .246000   .464000   .0722000      .000      .000  
+84 8 4 45916.00 I   .246165  .000556   .462984  .000571  I  .0710446  .0000365  1.2407 0.0256  I    -6.044     .840     -.811     .185   .249000   .461000   .0708000      .000      .000  
+84 8 5 45917.00 I   .249335  .000543   .459789  .000560  I  .0699438  .0000341  0.9591 0.0268  I    -6.298     .996     -.586     .220   .252000   .458000   .0695000      .000      .000  
+84 8 6 45918.00 I   .252427  .000553   .456515  .000564  I  .0691185  .0000392  0.7011 0.0258  I    -6.455    1.122     -.274     .263   .255000   .454000   .0686000      .000      .000  
+84 8 7 45919.00 I   .255424  .000556   .453164  .000533  I  .0685157  .0000388  0.5207 0.0272  I    -6.273    1.122      .211     .263   .258000   .451000   .0679000      .000      .000  
+84 8 8 45920.00 I   .258353  .000556   .449761  .000533  I  .0680443  .0000378  0.4388 0.0316  I    -6.014    1.278      .447     .294   .261000   .448000   .0674000      .000      .000  
+84 8 9 45921.00 I   .261229  .000753   .446324  .000711  I  .0676057  .0000498  0.4541 0.0358  I    -5.757    1.278      .300     .294   .264000   .444000   .0669000      .000      .000  
+84 810 45922.00 I   .264070  .000677   .442875  .000615  I  .0671077  .0000607  0.5545 0.0479  I    -5.544     .921     -.069     .236   .266000   .441000   .0666000      .000      .000  
+84 811 45923.00 I   .266901  .000813   .439437  .000718  I  .0664755  .0000819  0.7186 0.0510  I    -5.493     .385     -.405     .194   .269000   .438000   .0660000      .000      .000  
+84 812 45924.00 I   .269751  .000813   .436036  .000718  I  .0656580  .0000819  0.9204 0.0663  I    -5.615     .385     -.498     .194   .272000   .434000   .0652000      .000      .000  
+84 813 45925.00 I   .272629  .000818   .432674  .000749  I  .0646337  .0001043  1.1252 0.0560  I    -5.804     .385     -.337     .194   .274000   .431000   .0642000      .000      .000  
+84 814 45926.00 I   .275486  .000727   .429332  .000693  I  .0634174  .0000764  1.3005 0.0601  I    -5.989     .385     -.125     .194   .276000   .427000   .0631000      .000      .000  
+84 815 45927.00 I   .278259  .000678   .425990  .000514  I  .0620488  .0000596  1.4273 0.0493  I    -6.126     .908     -.019     .212   .279000   .424000   .0619000      .000      .000  
+84 816 45928.00 I   .280889  .000312   .422626  .000500  I  .0605835  .0000622  1.4919 0.0431  I    -6.173    1.225      .040     .229   .281000   .420000   .0605000      .000      .000  
+84 817 45929.00 I   .283325  .000312   .419206  .000500  I  .0590876  .0000622  1.4889 0.0440  I    -6.253    1.225      .169     .229   .283000   .417000   .0591000      .000      .000  
+84 818 45930.00 I   .285528  .000312   .415699  .000500  I  .0576264  .0000622  1.4240 0.0447  I    -6.727    1.225      .311     .229   .285000   .413000   .0578000      .000      .000  
+84 819 45931.00 I   .287484  .000327   .412093  .000452  I  .0562564  .0000641  1.3088 0.0459  I    -7.793    1.225      .277     .229   .287000   .410000   .0565000      .000      .000  
+84 820 45932.00 I   .289188  .000370   .408397  .000433  I  .0550201  .0000674  1.1596 0.0588  I    -9.128    1.042      .015     .289   .289000   .406000   .0552000      .000      .000  
+84 821 45933.00 I   .290636  .000409   .404617  .000298  I  .0539412  .0000986  0.9985 0.0496  I   -10.055     .819     -.290     .339   .291000   .403000   .0541000      .000      .000  
+84 822 45934.00 I   .291826  .000646   .400762  .000402  I  .0530166  .0000729  0.8571 0.0618  I   -10.135     .819     -.452     .339   .293000   .399000   .0531000      .000      .000  
+84 823 45935.00 I   .292763  .000646   .396846  .000402  I  .0522015  .0000746  0.7923 0.0491  I    -9.488     .749     -.505     .286   .295000   .395000   .0521000      .000      .000  
+84 824 45936.00 I   .293494  .000855   .392898  .000372  I  .0513881  .0000658  0.8593 0.0474  I    -8.615     .749     -.559     .286   .297000   .392000   .0511000      .000      .000  
+84 825 45937.00 I   .294091  .000860   .388946  .000500  I  .0504355  .0000585  1.0687 0.0359  I    -7.887     .894     -.571     .283   .298000   .388000   .0499000      .000      .000  
+84 826 45938.00 I   .294653  .000954   .385010  .000524  I  .0492161  .0000289  1.3821 0.0326  I    -7.502     .942     -.390     .235   .300000   .384000   .0485000      .000      .000  
+84 827 45939.00 I   .295269  .000954   .381094  .000524  I  .0476622  .0000289  1.7228 0.0157  I    -7.558     .824     -.050     .212   .301000   .380000   .0468000      .000      .000  
+84 828 45940.00 I   .295999  .000598   .377203  .000502  I  .0457925  .0000122  1.9976 0.0151  I    -7.946     .827      .174     .199   .303000   .377000   .0448000      .000      .000  
+84 829 45941.00 I   .296808  .000574   .373365  .000490  I  .0437138  .0000091  2.1321 0.0085  I    -8.531     .877      .097     .219   .304000   .373000   .0426000      .000      .000  
+84 830 45942.00 I   .297631  .000579   .369631  .000475  I  .0415824  .0000119  2.1042 0.0064  I    -9.160    1.224     -.179     .205   .305000   .369000   .0404000      .000      .000  
+84 831 45943.00 I   .298357  .000367   .366043  .000423  I  .0395489  .0000089  1.9456 0.0074  I    -9.733    1.262     -.343     .139   .307000   .365000   .0384000      .000      .000  
+84 9 1 45944.00 I   .298912  .000367   .362592  .000423  I  .0377174  .0000089  1.7082 0.0063  I   -10.120    1.262     -.286     .139   .308000   .362000   .0367000      .000      .000  
+84 9 2 45945.00 I   .299411  .000325   .359180  .000427  I  .0361407  .0000090  1.4460 0.0074  I    -9.912    1.405     -.294     .146   .309000   .358000   .0353000      .000      .000  
+84 9 3 45946.00 I   .299981  .000327   .355697  .000346  I  .0348172  .0000118  1.2084 0.0094  I    -9.420    1.543     -.451     .152   .310000   .354000   .0341000      .000      .000  
+84 9 4 45947.00 I   .300693  .000302   .352060  .000375  I  .0337007  .0000165  1.0405 0.0097  I    -9.152    1.250     -.597     .153   .311000   .350000   .0330000      .000      .000  
+84 9 5 45948.00 I   .301537  .000380   .348292  .000425  I  .0327062  .0000153  0.9628 0.0113  I    -9.011     .801     -.637     .133   .312000   .346000   .0321000      .000      .000  
+84 9 6 45949.00 I   .302483  .000380   .344438  .000425  I  .0317496  .0000153  0.9618 0.0252  I    -8.773     .594     -.620     .154   .313000   .342000   .0312000      .000      .000  
+84 9 7 45950.00 I   .303491  .000732   .340541  .000565  I  .0307616  .0000481  1.0240 0.0242  I    -8.330     .594     -.622     .154   .313000   .338000   .0302000      .000      .000  
+84 9 8 45951.00 I   .304482  .000639   .336627  .000503  I  .0296857  .0000459  1.1341 0.0305  I    -7.829     .594     -.574     .154   .314000   .334000   .0291000      .000      .000  
+84 9 9 45952.00 I   .305408  .000598   .332703  .000457  I  .0284850  .0000374  1.2694 0.0284  I    -7.469     .479     -.330     .160   .314000   .331000   .0279000      .000      .000  
+84 910 45953.00 I   .306254  .000631   .328765  .000411  I  .0271466  .0000336  1.4057 0.0296  I    -7.296     .327      .104     .166   .315000   .327000   .0266000      .000      .000  
+84 911 45954.00 I   .307012  .000467   .324806  .000190  I  .0256802  .0000458  1.5224 0.0284  I    -7.257     .327      .526     .166   .315000   .323000   .0251000      .000      .000  
+84 912 45955.00 I   .307671  .000467   .320822  .000190  I  .0241161  .0000458  1.5964 0.0326  I    -7.313     .327      .762     .166   .316000   .319000   .0236000      .000      .000  
+84 913 45956.00 I   .308251  .000495   .316811  .000433  I  .0225070  .0000463  1.6116 0.0326  I    -7.402     .327      .844     .166   .316000   .315000   .0220000      .000      .000  
+84 914 45957.00 I   .308790  .000495   .312776  .000433  I  .0209113  .0000463  1.5714 0.0462  I    -7.512     .300      .922     .269   .316000   .311000   .0206000      .000      .000  
+84 915 45958.00 I   .309318  .000660   .308721  .000581  I  .0193787  .0000800  1.4876 0.0462  I    -7.751     .269     1.025     .343   .317000   .307000   .0192000      .000      .000  
+84 916 45959.00 I   .309831  .000660   .304651  .000581  I  .0179451  .0000800  1.3767 0.0483  I    -8.202     .269     1.015     .343   .317000   .303000   .0179000      .000      .000  
+84 917 45960.00 I   .310317  .000533   .300575  .000744  I  .0166281  .0000540  1.2574 0.0826  I    -8.658     .269      .826     .343   .317000   .299000   .0168000      .000      .000  
+84 918 45961.00 I   .310782  .000630   .296516  .000644  I  .0154253  .0001445  1.1532 0.0661  I    -8.740     .269      .627     .343   .317000   .295000   .0157000      .000      .000  
+84 919 45962.00 I   .311226  .000623   .292500  .000651  I  .0143055  .0001206  1.0976 0.0968  I    -8.267     .266      .637     .272   .317000   .291000   .0147000      .000      .000  
+84 920 45963.00 I   .311631  .000529   .288546  .000455  I  .0132022  .0001288  1.1255 0.0901  I    -7.486     .260      .851     .298   .317000   .288000   .0137000      .000      .000  
+84 921 45964.00 I   .311986  .000562   .284672  .000503  I  .0120182  .0001340  1.2621 0.0929  I    -6.863     .260     1.096     .298   .317000   .284000   .0126000      .000      .000  
+84 922 45965.00 I   .312306  .000562   .280886  .000503  I  .0106403  .0001340  1.5117 0.0848  I    -6.709     .260     1.288     .298   .317000   .280000   .0112000      .000      .000  
+84 923 45966.00 I   .312596  .000475   .277175  .000506  I  .0089703  .0001038  1.8347 0.0722  I    -7.026     .260     1.483     .298   .317000   .276000   .0095000      .000      .000  
+84 924 45967.00 I   .312847  .000368   .273513  .000497  I  .0069740  .0000537  2.1483 0.0573  I    -7.703     .236     1.659     .287   .317000   .272000   .0075000      .000      .000  
+84 925 45968.00 I   .313046  .000305   .269870  .000409  I  .0047065  .0000487  2.3634 0.0373  I    -8.540     .223     1.623     .361   .316000   .268000   .0052000      .000      .000  
+84 926 45969.00 I   .313180  .000420   .266215  .000388  I  .0022988  .0000519  2.4238 0.0356  I    -9.191     .223     1.280     .361   .316000   .265000   .0028000      .000      .000  
+84 927 45970.00 I   .313234  .000420   .262524  .000388  I -.0000854  .0000519  2.3173 0.0349  I    -9.381     .223      .844     .361   .315000   .261000   .0004000      .000      .000  
+84 928 45971.00 I   .313173  .000387   .258798  .000357  I -.0022935  .0000468  2.0839 0.0341  I    -9.212     .223      .631     .361   .315000   .257000  -.0017000      .000      .000  
+84 929 45972.00 I   .312953  .000435   .255048  .000355  I -.0042383  .0000441  1.8059 0.0302  I    -8.964    1.208      .665     .256   .314000   .253000  -.0037000      .000      .000  
+84 930 45973.00 I   .312541  .000490   .251287  .000203  I -.0059163  .0000382  1.5610 0.0292  I    -8.751    1.694      .678     .298   .314000   .249000  -.0052000      .000      .000  
+8410 1 45974.00 I   .311931  .000490   .247524  .000203  I -.0073872  .0000382  1.3967 0.0254  I    -8.525    1.694      .506     .298   .313000   .246000  -.0066000      .000      .000  
+8410 2 45975.00 I   .311122  .000435   .243769  .000231  I -.0087419  .0000336  1.3291 0.0239  I    -8.289    1.694      .320     .298   .312000   .242000  -.0079000      .000      .000  
+8410 3 45976.00 I   .310139  .000355   .240020  .000347  I -.0100752  .0000286  1.3510 0.0209  I    -8.079    1.694      .362     .298   .311000   .238000  -.0091000      .000      .000  
+8410 4 45977.00 I   .309014  .000401   .236272  .000342  I -.0114658  .0000249  1.4387 0.0217  I    -7.847    1.259      .627     .298   .311000   .234000  -.0105000      .000      .000  
+8410 5 45978.00 I   .307765  .000364   .232514  .000373  I -.0129651  .0000326  1.5639 0.0241  I    -7.518     .549      .914     .298   .310000   .231000  -.0119000      .000      .000  
+8410 6 45979.00 I   .306411  .000392   .228737  .000430  I -.0145974  .0000412  1.7003 0.0263  I    -7.137     .549     1.104     .298   .309000   .227000  -.0135000      .000      .000  
+8410 7 45980.00 I   .304973  .000392   .224926  .000430  I -.0163618  .0000412  1.8249 0.0304  I    -6.826     .549     1.264     .298   .308000   .223000  -.0152000      .000      .000  
+8410 8 45981.00 I   .303439  .000612   .221082  .000434  I -.0182367  .0000446  1.9180 0.0304  I    -6.608     .549     1.481     .298   .307000   .219000  -.0170000      .000      .000  
+8410 9 45982.00 I   .301786  .000657   .217214  .000452  I -.0201825  .0000447  1.9653 0.0394  I    -6.383     .511     1.674     .298   .305000   .216000  -.0189000      .000      .000  
+841010 45983.00 I   .300011  .000761   .213339  .000447  I -.0221498  .0000650  1.9601 0.0396  I    -6.093     .470     1.690     .298   .304000   .212000  -.0208000      .000      .000  
+841011 45984.00 I   .298118  .000674   .209481  .000398  I -.0240852  .0000655  1.9026 0.0557  I    -5.789     .470     1.517     .298   .303000   .209000  -.0227000      .000      .000  
+841012 45985.00 I   .296138  .000726   .205665  .000388  I -.0259385  .0000904  1.7958 0.0557  I    -5.533     .470     1.310     .298   .302000   .205000  -.0245000      .000      .000  
+841013 45986.00 I   .294132  .000826   .201920  .000444  I -.0276638  .0000900  1.6501 0.0627  I    -5.362     .470     1.184     .298   .300000   .201000  -.0261000      .000      .000  
+841014 45987.00 I   .292159  .000940   .198270  .000484  I -.0292338  .0000868  1.4896 0.0824  I    -5.302     .362     1.110     .298   .299000   .198000  -.0276000      .000      .000  
+841015 45988.00 I   .290281  .001187   .194738  .000490  I -.0306484  .0001380  1.3454 0.0895  I    -5.324     .201     1.029     .107   .298000   .194000  -.0290000      .000      .000  
+841016 45989.00 I   .288571  .001187   .191344  .000490  I -.0319410  .0001565  1.2503 0.1038  I    -5.304     .201      .982     .107   .296000   .191000  -.0303000      .000      .000  
+841017 45990.00 I   .287079  .001315   .188101  .000490  I -.0331759  .0001552  1.2358 0.1016  I    -5.132     .201     1.071     .107   .294000   .187000  -.0316000      .000      .000  
+841018 45991.00 I   .285717  .001189   .184988  .000599  I -.0344489  .0001296  1.3300 0.0937  I    -4.843     .201     1.312     .107   .293000   .184000  -.0329000      .000      .000  
+841019 45992.00 I   .284400  .001115   .181961  .000576  I -.0358756  .0001050  1.5431 0.0915  I    -4.601     .397     1.610     .113   .291000   .180000  -.0343000      .000      .000  
+841020 45993.00 I   .283074  .001041   .178971  .000558  I -.0375672  .0001292  1.8524 0.0681  I    -4.567     .524     1.903     .119   .290000   .177000  -.0361000      .000      .000  
+841021 45994.00 I   .281715  .000863   .175971  .000577  I -.0395921  .0000869  2.1968 0.0683  I    -4.839     .524     2.207     .119   .288000   .174000  -.0381000      .000      .000  
+841022 45995.00 I   .280336  .000863   .172924  .000577  I -.0419415  .0000446  2.4833 0.0483  I    -5.427     .524     2.483     .119   .286000   .170000  -.0405000      .000      .000  
+841023 45996.00 I   .278889  .001057   .169829  .000586  I -.0445100  .0000420  2.6237 0.0286  I    -6.147     .524     2.569     .119   .284000   .167000  -.0431000      .000      .000  
+841024 45997.00 I   .277303  .000961   .166697  .000529  I -.0471278  .0000358  2.5808 0.0264  I    -6.646     .536     2.373     .195   .282000   .164000  -.0457000      .000      .000  
+841025 45998.00 I   .275547  .001119   .163527  .000391  I -.0496179  .0000321  2.3767 0.0240  I    -6.695     .548     2.076     .249   .280000   .160000  -.0482000      .000      .000  
+841026 45999.00 I   .273605  .001119   .160317  .000391  I -.0518502  .0000321  2.0797 0.0273  I    -6.431     .548     1.974     .249   .279000   .157000  -.0504000      .000      .000  
+841027 46000.00 I   .271474  .001101   .157067  .000338  I -.0537756  .0000442  1.7775 0.0260  I    -6.145     .548     2.113     .249   .277000   .154000  -.0524000      .000      .000  
+841028 46001.00 I   .269197  .001105   .153794  .000347  I -.0554279  .0000410  1.5434 0.0273  I    -5.933     .548     2.219     .249   .274000   .151000  -.0541000      .000      .000  
+841029 46002.00 I   .266819  .000730   .150514  .000346  I -.0568970  .0000322  1.4133 0.0292  I    -5.653     .409     2.076     .238   .272000   .148000  -.0557000      .000      .000  
+841030 46003.00 I   .264389  .000850   .147245  .000367  I -.0582891  .0000417  1.3871 0.0263  I    -5.232     .183     1.817     .226   .270000   .145000  -.0571000      .000      .000  
+841031 46004.00 I   .261986  .000850   .144010  .000367  I -.0596984  .0000417  1.4424 0.0338  I    -4.804     .183     1.741     .226   .268000   .142000  -.0586000      .000      .000  
+8411 1 46005.00 I   .259695  .000762   .140827  .000456  I -.0611907  .0000533  1.5480 0.0316  I    -4.514     .183     1.923     .226   .266000   .139000  -.0602000      .000      .000  
+8411 2 46006.00 I   .257508  .000720   .137697  .000470  I -.0628018  .0000475  1.6756 0.0347  I    -4.335     .183     2.161     .226   .264000   .136000  -.0619000      .000      .000  
+8411 3 46007.00 I   .255389  .000726   .134606  .000511  I -.0645409  .0000443  1.8001 0.0387  I    -4.220     .498     2.271     .161   .261000   .133000  -.0638000      .000      .000  
+8411 4 46008.00 I   .253304  .001183   .131541  .000705  I -.0663943  .0000610  1.9014 0.0377  I    -4.192     .680     2.299     .298   .259000   .130000  -.0657000      .000      .000  
+8411 5 46009.00 I   .251214  .001183   .128501  .000705  I -.0683312  .0000610  1.9653 0.0431  I    -4.222     .680     2.398     .298   .257000   .127000  -.0678000      .000      .000  
+8411 6 46010.00 I   .249079  .001183   .125494  .000705  I -.0703066  .0000610  1.9745 0.0390  I    -4.185     .680     2.588     .298   .254000   .124000  -.0698000      .000      .000  
+8411 7 46011.00 I   .246833  .001205   .122520  .000562  I -.0722578  .0000487  1.9166 0.0397  I    -4.051     .680     2.727     .298   .252000   .121000  -.0719000      .000      .000  
+8411 8 46012.00 I   .244423  .001180   .119576  .000530  I -.0741189  .0000509  1.7959 0.0354  I    -3.927     .502     2.691     .214   .249000   .119000  -.0738000      .000      .000  
+8411 9 46013.00 I   .241881  .001272   .116679  .000525  I -.0758335  .0000514  1.6268 0.0368  I    -3.887     .206     2.512     .302   .246000   .116000  -.0756000      .000      .000  
+841110 46014.00 I   .239258  .000963   .113852  .000300  I -.0773639  .0000532  1.4320 0.0427  I    -3.862     .206     2.322     .302   .244000   .113000  -.0771000      .000      .000  
+841111 46015.00 I   .236613  .000839   .111116  .000319  I -.0787022  .0000683  1.2512 0.0405  I    -3.758     .206     2.226     .302   .241000   .110000  -.0786000      .000      .000  
+841112 46016.00 I   .233977  .000784   .108480  .000308  I -.0798857  .0000610  1.1284 0.0472  I    -3.560     .206     2.234     .302   .238000   .108000  -.0798000      .000      .000  
+841113 46017.00 I   .231360  .000684   .105945  .000566  I -.0809883  .0000653  1.0933 0.0473  I    -3.311     .269     2.304     .344   .235000   .105000  -.0810000      .000      .000  
+841114 46018.00 I   .228770  .000527   .103517  .000641  I -.0821065  .0000722  1.1609 0.0487  I    -3.016     .319     2.405     .382   .233000   .103000  -.0822000      .000      .000  
+841115 46019.00 I   .226210  .000527   .101208  .000641  I -.0833444  .0000722  1.3316 0.0511  I    -2.634     .319     2.536     .382   .230000   .100000  -.0835000      .000      .000  
+841116 46020.00 I   .223677  .000527   .099029  .000641  I -.0847991  .0000722  1.5906 0.0509  I    -2.166     .319     2.706     .382   .227000   .098000  -.0850000      .000      .000  
+841117 46021.00 I   .221139  .000527   .096966  .000573  I -.0865409  .0000718  1.8956 0.0468  I    -1.726     .319     2.936     .382   .224000   .095000  -.0868000      .000      .000  
+841118 46022.00 I   .218568  .000528   .094989  .000508  I -.0885838  .0000595  2.1811 0.0505  I    -1.495     .588     3.230     .276   .221000   .092000  -.0888000      .000      .000  
+841119 46023.00 I   .215938  .000908   .093066  .000193  I -.0908741  .0000709  2.3796 0.0463  I    -1.585     .768     3.521     .298   .218000   .090000  -.0911000      .000      .000  
+841120 46024.00 I   .213225  .000908   .091166  .000193  I -.0932968  .0000709  2.4394 0.0501  I    -1.905     .768     3.660     .298   .215000   .088000  -.0934000      .000      .000  
+841121 46025.00 I   .210406  .000908   .089264  .000193  I -.0957003  .0000709  2.3414 0.0476  I    -2.181     .768     3.544     .298   .211000   .085000  -.0957000      .000      .000  
+841122 46026.00 I   .207423  .000845   .087336  .000204  I -.0979370  .0000636  2.1156 0.0444  I    -2.179     .768     3.270     .298   .208000   .083000  -.0978000      .000      .000  
+841123 46027.00 I   .204236  .001016   .085360  .000274  I -.0999119  .0000536  1.8310 0.0473  I    -1.952     .556     3.062     .184   .205000   .081000  -.0996000      .000      .000  
+841124 46028.00 I   .200873  .001212   .083317  .000313  I -.1016052  .0000699  1.5651 0.0399  I    -1.733     .165     3.023     .246   .202000   .078000  -.1012000      .000      .000  
+841125 46029.00 I   .197372  .001027   .081189  .000345  I -.1030670  .0000590  1.3741 0.0465  I    -1.593     .165     3.036     .246   .198000   .076000  -.1026000      .000      .000  
+841126 46030.00 I   .193765  .001048   .078961  .000378  I -.1043881  .0000613  1.2873 0.0424  I    -1.371     .165     2.976     .246   .195000   .074000  -.1039000      .000      .000  
+841127 46031.00 I   .190075  .001002   .076633  .000340  I -.1056759  .0000608  1.3034 0.0396  I     -.975     .165     2.906     .246   .192000   .072000  -.1052000      .000      .000  
+841128 46032.00 I   .186314  .000933   .074211  .000457  I -.1070185  .0000500  1.3904 0.0367  I     -.532     .230     3.015     .232   .188000   .069000  -.1066000      .000      .000  
+841129 46033.00 I   .182505  .000851   .071705  .000523  I -.1084686  .0000411  1.5133 0.0330  I     -.244     .280     3.343     .217   .185000   .067000  -.1081000      .000      .000  
+841130 46034.00 I   .178719  .000851   .069134  .000523  I -.1100477  .0000431  1.6440 0.0298  I     -.202     .280     3.690     .217   .181000   .065000  -.1098000      .000      .000  
+8412 1 46035.00 I   .175026  .000851   .066518  .000523  I -.1117507  .0000431  1.7568 0.0278  I     -.402     .280     3.842     .217   .178000   .063000  -.1117000      .000      .000  
+8412 2 46036.00 I   .171408  .000625   .063884  .000573  I -.1135490  .0000351  1.8325 0.0277  I     -.783     .280     3.831     .217   .174000   .061000  -.1136000      .000      .000  
+8412 3 46037.00 I   .167834  .000603   .061277  .000614  I -.1153998  .0000349  1.8604 0.0309  I    -1.250     .215     3.845     .157   .170000   .059000  -.1156000      .000      .000  
+8412 4 46038.00 I   .164269  .000368   .058741  .000617  I -.1172522  .0000509  1.8355 0.0309  I    -1.696     .118     3.975     .298   .166000   .057000  -.1176000      .000      .000  
+8412 5 46039.00 I   .160686  .000368   .056322  .000617  I -.1190543  .0000509  1.7613 0.0354  I    -2.072     .118     4.128     .298   .163000   .055000  -.1194000      .000      .000  
+8412 6 46040.00 I   .157068  .000368   .054065  .000617  I -.1207603  .0000491  1.6437 0.0335  I    -2.405     .118     4.148     .298   .159000   .053000  -.1211000      .000      .000  
+8412 7 46041.00 I   .153378  .000333   .051970  .000571  I -.1223307  .0000436  1.4930 0.0367  I    -2.710     .118     3.973     .298   .155000   .051000  -.1227000      .000      .000  
+8412 8 46042.00 I   .149571  .000630   .050022  .000637  I -.1237441  .0000545  1.3357 0.0380  I    -2.885     .408     3.696     .211   .151000   .050000  -.1241000      .000      .000  
+8412 9 46043.00 I   .145616  .000737   .048212  .000521  I -.1250117  .0000623  1.2070 0.0411  I    -2.802     .565     3.480     .295   .147000   .048000  -.1253000      .000      .000  
+841210 46044.00 I   .141486  .000811   .046529  .000582  I -.1261785  .0000615  1.1393 0.0455  I    -2.482     .565     3.418     .295   .143000   .046000  -.1265000      .000      .000  
+841211 46045.00 I   .137154  .000815   .044964  .000523  I -.1273183  .0000662  1.1556 0.0433  I    -2.088     .565     3.464     .295   .139000   .045000  -.1276000      .000      .000  
+841212 46046.00 I   .132626  .000739   .043500  .000605  I -.1285200  .0000610  1.2628 0.0433  I    -1.747     .565     3.503     .295   .135000   .043000  -.1287000      .000      .000  
+841213 46047.00 I   .127941  .000629   .042103  .000657  I -.1298686  .0000559  1.4441 0.0395  I    -1.474     .418     3.474     .214   .131000   .042000  -.1300000      .000      .000  
+841214 46048.00 I   .123137  .000426   .040739  .000717  I -.1314199  .0000502  1.6605 0.0415  I    -1.242     .173     3.420     .298   .126000   .040000  -.1315000      .000      .000  
+841215 46049.00 I   .118217  .000426   .039369  .000717  I -.1331843  .0000614  1.8609 0.0382  I    -1.064     .173     3.434     .298   .122000   .039000  -.1333000      .000      .000  
+841216 46050.00 I   .113171  .000691   .037956  .000670  I -.1351183  .0000577  1.9910 0.0384  I     -.995     .173     3.574     .298   .118000   .037000  -.1352000      .000      .000  
+841217 46051.00 I   .108005  .000605   .036506  .000689  I -.1371294  .0000461  2.0102 0.0357  I    -1.081     .173     3.798     .298   .114000   .036000  -.1372000      .000      .000  
+841218 46052.00 I   .102735  .000618   .035042  .000658  I -.1390966  .0000419  1.9030 0.0353  I    -1.250     .329     4.011     .108   .110000   .035000  -.1392000      .000      .000  
+841219 46053.00 I   .097379  .000828   .033587  .000777  I -.1408996  .0000536  1.6882 0.0327  I    -1.317     .431     4.124     .137   .106000   .034000  -.1410000      .000      .000  
+841220 46054.00 I   .091986  .000703   .032161  .000668  I -.1424543  .0000501  1.4172 0.0307  I    -1.119     .431     4.119     .137   .102000   .033000  -.1426000      .000      .000  
+841221 46055.00 I   .086657  .000877   .030775  .000768  I -.1437381  .0000299  1.1583 0.0358  I     -.658     .360     4.044     .227   .097000   .032000  -.1439000      .000      .000  
+841222 46056.00 I   .081481  .000953   .029451  .001247  I -.1447949  .0000511  0.9712 0.0296  I     -.104     .360     3.958     .227   .093000   .031000  -.1449000      .000      .000  
+841223 46057.00 I   .076553  .000953   .028198  .001247  I -.1457150  .0000511  0.8874 0.0381  I      .385     .360     3.861     .227   .089000   .030000  -.1458000      .000      .000  
+841224 46058.00 I   .071971  .001038   .027005  .001380  I -.1466072  .0000566  0.9160 0.0405  I      .772     .270     3.742     .290   .085000   .029000  -.1468000      .000      .000  
+841225 46059.00 I   .067706  .001017   .025917  .001285  I -.1475790  .0000629  1.0406 0.0423  I     1.096     .270     3.661     .290   .081000   .028000  -.1478000      .000      .000  
+841226 46060.00 I   .063659  .001017   .024995  .001285  I -.1487065  .0000629  1.2194 0.0816  I     1.344     .270     3.718     .290   .076000   .028000  -.1489000      .000      .000  
+841227 46061.00 I   .059795  .001196   .024242  .001751  I -.1500226  .0001505  1.4127 0.0693  I     1.428     .791     3.920     .298   .072000   .027000  -.1503000      .000      .000  
+841228 46062.00 I   .056087  .000649   .023657  .000210  I -.1515275  .0001235  1.5929 0.0973  I     1.300     .791     4.137     .286   .068000   .026000  -.1517000      .000      .000  
+841229 46063.00 I   .052510  .000649   .023235  .000210  I -.1531963  .0001235  1.7369 0.0873  I     1.033     .791     4.246     .286   .064000   .026000  -.1533000      .000      .000  
+841230 46064.00 I   .049040  .000649   .022967  .000210  I -.1549845  .0001235  1.8304 0.0786  I      .766     .791     4.277     .286   .060000   .025000  -.1550000      .000      .000  
+841231 46065.00 I   .045647  .000773   .022839  .000394  I -.1568370  .0000972  1.8637 0.0705  I      .603     .791     4.351     .286   .055000   .025000  -.1568000      .000      .000  
+85 1 1 46066.00 I   .042277  .000661   .022841  .000334  I -.1586909  .0000681  1.8340 0.0537  I      .541     .791     4.509     .286   .051000   .025000  -.1585000      .000      .000  
+85 1 2 46067.00 I   .038867  .000583   .022960  .000652  I -.1604870  .0000457  1.7502 0.0353  I      .515     .868     4.639     .202   .047000   .025000  -.1601000      .000      .000  
+85 1 3 46068.00 I   .035355  .000649   .023183  .000627  I -.1621783  .0000189  1.6274 0.0247  I      .487    1.227     4.588     .298   .043000   .025000  -.1617000      .000      .000  
+85 1 4 46069.00 I   .031690  .000649   .023492  .000627  I -.1637360  .0000189  1.4872 0.0134  I      .490    1.227     4.301     .298   .039000   .025000  -.1631000      .000      .000  
+85 1 5 46070.00 I   .027848  .000649   .023864  .000627  I -.1651577  .0000189  1.3620 0.0152  I      .604    1.227     3.862     .298   .035000   .025000  -.1645000      .000      .000  
+85 1 6 46071.00 I   .023839  .000506   .024297  .000743  I -.1664779  .0000238  1.2905 0.0134  I      .873    1.227     3.451     .298   .030000   .025000  -.1657000      .000      .000  
+85 1 7 46072.00 I   .019696  .000554   .024802  .000650  I -.1677671  .0000191  1.3043 0.0150  I     1.278     .897     3.244     .298   .026000   .025000  -.1670000      .000      .000  
+85 1 8 46073.00 I   .015499  .000605   .025390  .000580  I -.1691195  .0000184  1.4173 0.0150  I     1.721     .323     3.317     .298   .022000   .025000  -.1683000      .000      .000  
+85 1 9 46074.00 I   .011336  .000467   .026070  .000580  I -.1706301  .0000231  1.6156 0.0148  I     2.021     .323     3.607     .298   .018000   .025000  -.1699000      .000      .000  
+85 110 46075.00 I   .007290  .000467   .026845  .000580  I -.1723661  .0000231  1.8601 0.0225  I     1.970     .323     3.983     .298   .014000   .026000  -.1716000      .000      .000  
+85 111 46076.00 I   .003381  .000603   .027703  .000682  I -.1743467  .0000386  2.0938 0.0231  I     1.522     .323     4.333     .298   .010000   .027000  -.1736000      .000      .000  
+85 112 46077.00 I  -.000400  .000734   .028635  .000648  I -.1765293  .0000399  2.2544 0.0401  I      .800     .297     4.626     .298   .006000   .027000  -.1758000      .000      .000  
+85 113 46078.00 I  -.004039  .000966   .029631  .000929  I -.1788167  .0000702  2.2987 0.0404  I      .003     .242     4.884     .298   .003000   .028000  -.1781000      .000      .000  
+85 114 46079.00 I  -.007510  .000966   .030685  .000929  I -.1810844  .0000702  2.2163 0.0504  I     -.671     .242     5.090     .298  -.001000   .029000  -.1804000      .000      .000  
+85 115 46080.00 I  -.010793  .001151   .031794  .001180  I -.1832128  .0000723  2.0245 0.0473  I    -1.063     .242     5.179     .298  -.005000   .029000  -.1825000      .000      .000  
+85 116 46081.00 I  -.013922  .000977   .032971  .001407  I -.1851106  .0000634  1.7642 0.0417  I    -1.137     .242     5.122     .298  -.009000   .030000  -.1844000      .000      .000  
+85 117 46082.00 I  -.016965  .000806   .034224  .001224  I -.1867379  .0000415  1.4940 0.0348  I     -.903     .840     4.914     .298  -.013000   .031000  -.1861000      .000      .000  
+85 118 46083.00 I  -.019994  .000510   .035558  .001247  I -.1881139  .0000287  1.2698 0.0258  I     -.402    1.022     4.564     .115  -.016000   .032000  -.1875000      .000      .000  
+85 119 46084.00 I  -.023076  .000534   .036972  .001211  I -.1893057  .0000307  1.1303 0.0210  I      .239    1.022     4.119     .115  -.020000   .033000  -.1888000      .000      .000  
+85 120 46085.00 I  -.026261  .000534   .038429  .001211  I -.1904083  .0000307  1.0923 0.0215  I      .831    1.022     3.671     .115  -.024000   .034000  -.1900000      .000      .000  
+85 121 46086.00 I  -.029573  .000969   .039922  .001113  I -.1915209  .0000300  1.1460 0.0178  I     1.249    1.022     3.320     .115  -.027000   .035000  -.1912000      .000      .000  
+85 122 46087.00 I  -.033034  .001011   .041461  .000798  I -.1927203  .0000180  1.2596 0.0168  I     1.475     .991     3.169     .235  -.031000   .036000  -.1925000      .000      .000  
+85 123 46088.00 I  -.036654  .001179   .043045  .000730  I -.1940474  .0000153  1.3951 0.0361  I     1.548     .838     3.278     .283  -.034000   .037000  -.1939000      .000      .000  
+85 124 46089.00 I  -.040417  .001179   .044650  .000730  I -.1955065  .0000699  1.5186 0.0378  I     1.472     .838     3.607     .283  -.037000   .039000  -.1955000      .000      .000  
+85 125 46090.00 I  -.044273  .001357   .046244  .000554  I -.1970727  .0000741  1.6063 0.0486  I     1.226     .838     4.012     .283  -.041000   .040000  -.1971000      .000      .000  
+85 126 46091.00 I  -.048135  .001206   .047808  .000669  I -.1987025  .0000676  1.6442 0.0465  I      .992     .838     4.190     .283  -.044000   .041000  -.1987000      .000      .000  
+85 127 46092.00 I  -.051928  .000513   .049331  .000692  I -.2003427  .0000561  1.6268 0.0515  I      .912     .658     4.128     .266  -.047000   .043000  -.2003000      .000      .000  
+85 128 46093.00 I  -.055578  .000601   .050805  .000943  I -.2019384  .0000776  1.5561 0.0479  I      .963     .322     4.026     .228  -.050000   .044000  -.2018000      .000      .000  
+85 129 46094.00 I  -.059013  .000601   .052219  .000943  I -.2034409  .0000776  1.4432 0.0500  I      .991     .190     3.978     .240  -.053000   .046000  -.2032000      .000      .000  
+85 130 46095.00 I  -.062163  .000541   .053572  .000990  I -.2048137  .0000631  1.2969 0.0507  I      .832     .190     3.961     .240  -.056000   .048000  -.2044000      .000      .000  
+85 131 46096.00 I  -.065008  .000600   .054912  .000960  I -.2060277  .0000652  1.1296 0.0414  I      .549     .190     3.906     .240  -.060000   .049000  -.2055000      .000      .000  
+85 2 1 46097.00 I  -.067595  .000540   .056280  .000887  I -.2070748  .0000537  0.9678 0.0470  I      .323     .281     3.793     .190  -.063000   .051000  -.2064000      .000      .000  
+85 2 2 46098.00 I  -.069992  .000651   .057704  .000975  I -.2079760  .0000677  0.8439 0.0381  I      .225     .348     3.626     .120  -.066000   .053000  -.2072000      .000      .000  
+85 2 3 46099.00 I  -.072265  .000521   .059200  .000715  I -.2087876  .0000541  0.7950 0.0433  I      .241     .348     3.383     .120  -.068000   .055000  -.2080000      .000      .000  
+85 2 4 46100.00 I  -.074472  .000521   .060763  .000715  I -.2096027  .0000541  0.8563 0.0335  I      .467     .348     3.090     .120  -.072000   .057000  -.2089000      .000      .000  
+85 2 5 46101.00 I  -.076633  .000541   .062402  .000671  I -.2105400  .0000395  1.0370 0.0317  I     1.034     .348     2.895     .120  -.075000   .059000  -.2101000      .000      .000  
+85 2 6 46102.00 I  -.078755  .000458   .064139  .000570  I -.2117058  .0000331  1.3049 0.0242  I     1.873     .268     2.916     .313  -.078000   .061000  -.2115000      .000      .000  
+85 2 7 46103.00 I  -.080874  .000425   .066000  .000564  I -.2131574  .0000278  1.5955 0.0256  I     2.619     .150     3.081     .426  -.082000   .063000  -.2132000      .000      .000  
+85 2 8 46104.00 I  -.083041  .000425   .068013  .000564  I -.2148787  .0000390  1.8319 0.0291  I     2.885     .150     3.215     .426  -.085000   .065000  -.2151000      .000      .000  
+85 2 9 46105.00 I  -.085300  .000318   .070194  .000588  I -.2167819  .0000511  1.9503 0.0300  I     2.599     .150     3.245     .426  -.088000   .067000  -.2172000      .000      .000  
+85 210 46106.00 I  -.087660  .000368   .072510  .000552  I -.2187311  .0000455  1.9239 0.0316  I     2.041     .150     3.244     .426  -.091000   .069000  -.2193000      .000      .000  
+85 211 46107.00 I  -.090126  .000423   .074917  .000406  I -.2205888  .0000373  1.7748 0.0338  I     1.506     .252     3.328     .394  -.094000   .071000  -.2212000      .000      .000  
+85 212 46108.00 I  -.092701  .000453   .077370  .000500  I -.2222578  .0000500  1.5570 0.0312  I     1.084     .323     3.526     .360  -.097000   .073000  -.2230000      .000      .000  
+85 213 46109.00 I  -.095382  .000453   .079814  .000500  I -.2237016  .0000500  1.3356 0.0326  I      .759     .323     3.752     .360  -.100000   .075000  -.2244000      .000      .000  
+85 214 46110.00 I  -.098160  .000487   .082196  .000461  I -.2249468  .0000417  1.1676 0.0278  I      .557     .323     3.889     .360  -.103000   .077000  -.2258000      .000      .000  
+85 215 46111.00 I  -.101037  .000553   .084501  .000414  I -.2260661  .0000244  1.0873 0.0243  I      .559     .323     3.866     .360  -.106000   .080000  -.2269000      .000      .000  
+85 216 46112.00 I  -.104051  .000488   .086729  .000436  I -.2271542  .0000248  1.1053 0.0201  I      .807     .234     3.671     .308  -.109000   .082000  -.2280000      .000      .000  
+85 217 46113.00 I  -.107245  .000471   .088881  .000469  I -.2283057  .0000319  1.2104 0.0202  I     1.223     .791     3.349     .246  -.112000   .084000  -.2291000      .000      .000  
+85 218 46114.00 I  -.110647  .000471   .090957  .000469  I -.2295951  .0000319  1.3758 0.0226  I     1.638     .791     3.020     .246  -.114000   .086000  -.2304000      .000      .000  
+85 219 46115.00 I  -.114250  .000471   .092963  .000469  I -.2310654  .0000319  1.5656 0.0225  I     1.941     .791     2.836     .246  -.117000   .088000  -.2316000      .000      .000  
+85 220 46116.00 I  -.118004  .000441   .094931  .000468  I -.2327217  .0000318  1.7415 0.0211  I     2.152     .791     2.870     .246  -.119000   .091000  -.2331000      .000      .000  
+85 221 46117.00 I  -.121853  .000475   .096905  .000480  I -.2345343  .0000275  1.8750 0.0208  I     2.339     .132     3.038     .214  -.122000   .093000  -.2347000      .000      .000  
+85 222 46118.00 I  -.125726  .000498   .098912  .000533  I -.2364516  .0000267  1.9483 0.0176  I     2.508     .172     3.169     .176  -.125000   .096000  -.2364000      .000      .000  
+85 223 46119.00 I  -.129547  .000486   .100973  .000651  I -.2384076  .0000221  1.9518 0.0173  I     2.621     .172     3.173     .176  -.127000   .098000  -.2382000      .000      .000  
+85 224 46120.00 I  -.133243  .000486   .103110  .000651  I -.2403331  .0000221  1.8892 0.0161  I     2.680     .172     3.124     .176  -.130000   .101000  -.2400000      .000      .000  
+85 225 46121.00 I  -.136777  .000479   .105344  .000595  I -.2421679  .0000235  1.7725 0.0148  I     2.716     .172     3.115     .176  -.132000   .103000  -.2418000      .000      .000  
+85 226 46122.00 I  -.140144  .000505   .107701  .000510  I -.2438655  .0000196  1.6182 0.0146  I     2.673     .404     3.108     .219  -.135000   .106000  -.2435000      .000      .000  
+85 227 46123.00 I  -.143341  .000496   .110196  .000553  I -.2453988  .0000173  1.4474 0.0132  I     2.520     .544     2.986     .255  -.138000   .109000  -.2450000      .000      .000  
+85 228 46124.00 I  -.146379  .000496   .112815  .000553  I -.2467622  .0000177  1.2824 0.0124  I     2.441     .544     2.741     .255  -.140000   .111000  -.2464000      .000      .000  
+85 3 1 46125.00 I  -.149266  .000524   .115542  .000292  I -.2479762  .0000177  1.1554 0.0170  I     2.681     .544     2.498     .255  -.143000   .114000  -.2477000      .000      .000  
+85 3 2 46126.00 I  -.152035  .000502   .118359  .000316  I -.2490984  .0000291  1.1048 0.0163  I     3.134     .544     2.321     .255  -.145000   .117000  -.2489000      .000      .000  
+85 3 3 46127.00 I  -.154732  .000553   .121245  .000525  I -.2502217  .0000274  1.1621 0.0224  I     3.441    1.297     2.091     .324  -.148000   .119000  -.2501000      .000      .000  
+85 3 4 46128.00 I  -.157401  .000540   .124178  .000659  I -.2514646  .0000341  1.3455 0.0219  I     3.475    1.464     1.706     .320  -.150000   .122000  -.2514000      .000      .000  
+85 3 5 46129.00 I  -.160087  .000540   .127139  .000659  I -.2529506  .0000341  1.6427 0.0240  I     3.458    1.464     1.324     .320  -.153000   .125000  -.2530000      .000      .000  
+85 3 6 46130.00 I  -.162838  .000540   .130105  .000659  I -.2547729  .0000339  2.0087 0.0240  I     3.513    1.464     1.232     .320  -.155000   .128000  -.2549000      .000      .000  
+85 3 7 46131.00 I  -.165701  .000540   .133042  .000659  I -.2569614  .0000339  2.3551 0.0293  I     3.527    1.464     1.484     .320  -.158000   .131000  -.2572000      .000      .000  
+85 3 8 46132.00 I  -.168632  .000605   .135964  .000693  I -.2594436  .0000478  2.5832 0.0306  I     3.198    1.464     1.803     .320  -.160000   .134000  -.2597000      .000      .000  
+85 3 9 46133.00 I  -.171568  .000606   .138910  .000651  I -.2620707  .0000509  2.6402 0.1376  I     2.450     .454     1.910     .298  -.162000   .137000  -.2623000      .000      .000  
+85 310 46134.00 I  -.174442  .000781   .141921  .000640  I -.2646679  .0002710  2.5291 0.1002  I     1.659     .791     1.807     .298  -.164000   .141000  -.2649000      .000      .000  
+85 311 46135.00 I  -.177192  .001034   .145035  .000541  I -.2670902  .0001939  2.3020 0.1438  I     1.208     .791     1.694     .298  -.166000   .144000  -.2673000      .000      .000  
+85 312 46136.00 I  -.179774  .000885   .148284  .000459  I -.2692583  .0000962  2.0341 0.1015  I     1.145     .791     1.676     .298  -.168000   .147000  -.2693000      .000      .000  
+85 313 46137.00 I  -.182174  .000916   .151687  .000516  I -.2711697  .0000602  1.8001 0.0516  I     1.296    1.168     1.687     .482  -.170000   .150000  -.2712000      .000      .000  
+85 314 46138.00 I  -.184390  .000946   .155262  .000486  I -.2728870  .0000372  1.6515 0.0354  I     1.542    1.168     1.644     .482  -.172000   .154000  -.2728000      .000      .000  
+85 315 46139.00 I  -.186475  .000946   .159014  .000486  I -.2745066  .0000372  1.6045 0.0200  I     1.916    1.168     1.546     .482  -.174000   .157000  -.2743000      .000      .000  
+85 316 46140.00 I  -.188489  .000946   .162944  .000486  I -.2761266  .0000147  1.6494 0.0202  I     2.525    1.168     1.418     .482  -.176000   .161000  -.2759000      .000      .000  
+85 317 46141.00 I  -.190425  .000893   .167016  .000559  I -.2778277  .0000159  1.7612 0.0102  I     3.359    1.168     1.263     .482  -.178000   .164000  -.2775000      .000      .000  
+85 318 46142.00 I  -.192241  .000921   .171174  .000579  I -.2796601  .0000141  1.9063 0.0186  I     4.232    1.031     1.117     .342  -.179000   .168000  -.2793000      .000      .000  
+85 319 46143.00 I  -.193893  .000979   .175364  .000601  I -.2816404  .0000336  2.0518 0.0182  I     4.892     .872     1.094     .298  -.181000   .171000  -.2813000      .000      .000  
+85 320 46144.00 I  -.195330  .000979   .179529  .000601  I -.2837540  .0000336  2.1683 0.0238  I     5.209     .872     1.287     .298  -.182000   .175000  -.2834000      .000      .000  
+85 321 46145.00 I  -.196459  .000979   .183619  .000601  I -.2859606  .0000336  2.2358 0.0364  I     5.231     .872     1.619     .298  -.184000   .178000  -.2856000      .000      .000  
+85 322 46146.00 I  -.197257  .000809   .187641  .000525  I -.2882065  .0000645  2.2460 0.0361  I     5.113     .872     1.860     .298  -.185000   .182000  -.2879000      .000      .000  
+85 323 46147.00 I  -.197770  .000660   .191620  .000547  I -.2904336  .0000640  2.1990 0.0608  I     4.972     .761     1.862     .162  -.187000   .186000  -.2901000      .000      .000  
+85 324 46148.00 I  -.198078  .000525   .195575  .000323  I -.2925881  .0001032  2.1027 0.0572  I     4.868     .630     1.700     .227  -.188000   .189000  -.2923000      .000      .000  
+85 325 46149.00 I  -.198263  .000527   .199521  .000490  I -.2946278  .0000948  1.9730 0.0732  I     4.822     .630     1.537     .227  -.189000   .193000  -.2944000      .000      .000  
+85 326 46150.00 I  -.198402  .000527   .203478  .000490  I -.2965273  .0001039  1.8231 0.0624  I     4.771     .630     1.408     .227  -.190000   .197000  -.2963000      .000      .000  
+85 327 46151.00 I  -.198546  .000463   .207460  .000447  I -.2982722  .0000813  1.6677 0.0585  I     4.651     .630     1.217     .227  -.192000   .200000  -.2980000      .000      .000  
+85 328 46152.00 I  -.198758  .000420   .211475  .000404  I -.2998687  .0000538  1.5303 0.0501  I     4.587     .499      .966     .276  -.192000   .204000  -.2996000      .000      .000  
+85 329 46153.00 I  -.199088  .000586   .215521  .000492  I -.3013471  .0000585  1.4357 0.0500  I     4.795     .317      .815     .318  -.193000   .208000  -.3011000      .000      .000  
+85 330 46154.00 I  -.199546  .000586   .219579  .000492  I -.3027625  .0000843  1.4084 0.0525  I     5.236     .317      .840     .318  -.194000   .212000  -.3026000      .000      .000  
+85 331 46155.00 I  -.200125  .000475   .223631  .000373  I -.3041967  .0000871  1.4794 0.0541  I     5.587     .317      .850     .318  -.195000   .216000  -.3041000      .000      .000  
+85 4 1 46156.00 I  -.200799  .000464   .227676  .000321  I -.3057583  .0000679  1.6615 0.0522  I     5.687     .317      .609     .318  -.196000   .220000  -.3057000      .000      .000  
+85 4 2 46157.00 I  -.201506  .000725   .231711  .000349  I -.3075487  .0000574  1.9305 0.0463  I     5.794     .575      .202     .228  -.197000   .223000  -.3077000      .000      .000  
+85 4 3 46158.00 I  -.202157  .000859   .235725  .000364  I -.3096280  .0000629  2.2257 0.0429  I     6.171     .748     -.010     .298  -.197000   .227000  -.3099000      .000      .000  
+85 4 4 46159.00 I  -.202656  .000848   .239703  .000316  I -.3119810  .0000639  2.4636 0.0367  I     6.598     .748      .176     .298  -.198000   .231000  -.3124000      .000      .000  
+85 4 5 46160.00 I  -.202894  .000848   .243632  .000316  I -.3145091  .0000378  2.5631 0.0359  I     6.582     .748      .542     .298  -.198000   .235000  -.3151000      .000      .000  
+85 4 6 46161.00 I  -.202887  .000768   .247510  .000284  I -.3170467  .0000326  2.4811 0.0226  I     6.007     .748      .734     .298  -.198000   .239000  -.3177000      .000      .000  
+85 4 7 46162.00 I  -.202694  .000661   .251352  .000454  I -.3194193  .0000249  2.2430 0.0211  I     5.270     .583      .674     .298  -.198000   .243000  -.3202000      .000      .000  
+85 4 8 46163.00 I  -.202363  .000391   .255174  .000517  I -.3215064  .0000268  1.9261 0.0191  I     4.817     .346      .549     .113  -.198000   .247000  -.3224000      .000      .000  
+85 4 9 46164.00 I  -.201945  .000312   .258993  .000556  I -.3232768  .0000291  1.6252 0.0190  I     4.747     .346      .484     .113  -.198000   .251000  -.3242000      .000      .000  
+85 410 46165.00 I  -.201479  .000312   .262823  .000556  I -.3247880  .0000268  1.4177 0.0187  I     4.879     .346      .410     .113  -.198000   .255000  -.3258000      .000      .000  
+85 411 46166.00 I  -.200979  .000347   .266659  .000499  I -.3261551  .0000235  1.3387 0.0179  I     5.000     .346      .264     .113  -.198000   .259000  -.3272000      .000      .000  
+85 412 46167.00 I  -.200452  .000335   .270482  .000554  I -.3275061  .0000237  1.3817 0.0176  I     5.018     .552      .147     .106  -.198000   .263000  -.3286000      .000      .000  
+85 413 46168.00 I  -.199907  .000346   .274270  .000588  I -.3289482  .0000261  1.5139 0.0175  I     5.002     .700      .178     .298  -.198000   .267000  -.3300000      .000      .000  
+85 414 46169.00 I  -.199368  .000346   .277987  .000588  I -.3305500  .0000258  1.6946 0.0194  I     5.118     .700      .305     .298  -.198000   .271000  -.3316000      .000      .000  
+85 415 46170.00 I  -.198855  .000438   .281599  .000559  I -.3323403  .0000288  1.8842 0.0184  I     5.435     .700      .385     .298  -.198000   .275000  -.3333000      .000      .000  
+85 416 46171.00 I  -.198376  .000412   .285115  .000517  I -.3343101  .0000263  2.0489 0.0197  I     5.792     .700      .427     .298  -.198000   .279000  -.3352000      .000      .000  
+85 417 46172.00 I  -.197935  .000555   .288574  .000471  I -.3364221  .0000268  2.1657 0.0209  I     5.963     .504      .559     .125  -.197000   .283000  -.3372000      .000      .000  
+85 418 46173.00 I  -.197529  .000627   .292023  .000397  I -.3386206  .0000324  2.2197 0.0212  I     5.914     .138      .798     .147  -.197000   .286000  -.3393000      .000      .000  
+85 419 46174.00 I  -.197147  .000661   .295507  .000319  I -.3408390  .0000329  2.2060 0.0237  I     5.798     .138      .988     .147  -.197000   .290000  -.3414000      .000      .000  
+85 420 46175.00 I  -.196748  .000661   .299057  .000319  I -.3430114  .0000346  2.1286 0.0223  I     5.751     .138      .996     .147  -.196000   .294000  -.3434000      .000      .000  
+85 421 46176.00 I  -.196341  .000625   .302665  .000300  I -.3450778  .0000301  1.9959 0.0224  I     5.808     .138      .823     .147  -.196000   .298000  -.3454000      .000      .000  
+85 422 46177.00 I  -.195970  .000611   .306310  .000325  I -.3469911  .0000284  1.8268 0.0213  I     5.945     .405      .577     .279  -.195000   .302000  -.3472000      .000      .000  
+85 423 46178.00 I  -.195653  .000572   .309964  .000314  I -.3487283  .0000302  1.6483 0.0269  I     6.100     .606      .270     .424  -.194000   .305000  -.3489000      .000      .000  
+85 424 46179.00 I  -.195403  .000682   .313600  .000313  I -.3502938  .0000457  1.4881 0.0327  I     6.220     .606     -.280     .424  -.193000   .309000  -.3504000      .000      .000  
+85 425 46180.00 I  -.195218  .000682   .317194  .000313  I -.3517206  .0000579  1.3763 0.0354  I     6.345     .606    -1.178     .424  -.193000   .313000  -.3518000      .000      .000  
+85 426 46181.00 I  -.195070  .000684   .320749  .000304  I -.3530704  .0000542  1.3367 0.0397  I     6.419     .606    -1.710     .424  -.192000   .316000  -.3532000      .000      .000  
+85 427 46182.00 I  -.194934  .000684   .324277  .000304  I -.3544233  .0000542  1.3851 0.0592  I     6.466     .537    -1.571     .332  -.191000   .320000  -.3546000      .000      .000  
+85 428 46183.00 I  -.194754  .000908   .327794  .000206  I -.3558732  .0001053  1.5313 0.0602  I     6.454     .524    -1.093     .306  -.190000   .324000  -.3561000      .000      .000  
+85 429 46184.00 I  -.194430  .000908   .331318  .000206  I -.3575151  .0001074  1.7653 0.0692  I     6.334     .415     -.701     .111  -.189000   .327000  -.3578000      .000      .000  
+85 430 46185.00 I  -.193875  .000747   .334866  .000814  I -.3594226  .0000898  2.0558 0.0617  I     6.266     .415     -.602     .111  -.188000   .331000  -.3599000      .000      .000  
+85 5 1 46186.00 I  -.193064  .000678   .338446  .000829  I -.3616246  .0000609  2.3399 0.0533  I     6.366     .415     -.563     .111  -.187000   .335000  -.3622000      .000      .000  
+85 5 2 46187.00 I  -.192022  .000675   .342059  .000767  I -.3640725  .0000575  2.5341 0.0458  I     6.471     .304     -.335     .162  -.185000   .338000  -.3648000      .000      .000  
+85 5 3 46188.00 I  -.190796  .000665   .345705  .000873  I -.3666421  .0000684  2.5761 0.0413  I     6.279     .115     -.010     .200  -.184000   .342000  -.3675000      .000      .000  
+85 5 4 46189.00 I  -.189423  .001150   .349371  .000892  I -.3691694  .0000594  2.4522 0.0462  I     5.732     .115      .155     .200  -.183000   .345000  -.3702000      .000      .000  
+85 5 5 46190.00 I  -.187921  .001056   .353018  .001040  I -.3715021  .0000621  2.1949 0.0403  I     5.101     .115      .103     .200  -.181000   .349000  -.3725000      .000      .000  
+85 5 6 46191.00 I  -.186343  .001073   .356639  .000803  I -.3735395  .0000546  1.8783 0.0383  I     4.715     .116     -.028     .188  -.180000   .352000  -.3745000      .000      .000  
+85 5 7 46192.00 I  -.184758  .000881   .360244  .000583  I -.3752701  .0000448  1.5959 0.0344  I     4.668     .697     -.177     .291  -.178000   .355000  -.3761000      .000      .000  
+85 5 8 46193.00 I  -.183180  .000955   .363836  .000547  I -.3767639  .0000419  1.4114 0.0300  I     4.843     .855     -.456     .314  -.177000   .359000  -.3775000      .000      .000  
+85 5 9 46194.00 I  -.181540  .000955   .367403  .000547  I -.3781335  .0000399  1.3487 0.0290  I     5.042     .855     -.895     .314  -.175000   .362000  -.3788000      .000      .000  
+85 510 46195.00 I  -.179759  .000595   .370913  .000608  I -.3794931  .0000400  1.3814 0.0273  I     5.124     .855    -1.102     .314  -.174000   .365000  -.3801000      .000      .000  
+85 511 46196.00 I  -.177855  .000610   .374344  .000604  I -.3809154  .0000372  1.4713 0.0263  I     5.190     .855     -.987     .314  -.172000   .369000  -.3815000      .000      .000  
+85 512 46197.00 I  -.175860  .000566   .377706  .000403  I -.3824452  .0000342  1.5898 0.0242  I     5.403     .891     -.726     .327  -.170000   .372000  -.3830000      .000      .000  
+85 513 46198.00 I  -.173806  .000324   .381008  .000453  I -.3840934  .0000309  1.7035 0.0217  I     5.748     .728     -.464     .270  -.169000   .375000  -.3847000      .000      .000  
+85 514 46199.00 I  -.171735  .000345   .384244  .000490  I -.3858435  .0000268  1.7909 0.0205  I     5.977     .662     -.260     .251  -.167000   .378000  -.3864000      .000      .000  
+85 515 46200.00 I  -.169684  .000495   .387395  .000472  I -.3876593  .0000270  1.8304 0.0191  I     5.669     .662      .011     .251  -.165000   .382000  -.3883000      .000      .000  
+85 516 46201.00 I  -.167665  .000623   .390431  .000483  I -.3894825  .0000271  1.8043 0.0191  I     4.864     .662      .368     .251  -.163000   .385000  -.3901000      .000      .000  
+85 517 46202.00 I  -.165657  .000812   .393334  .000462  I -.3912474  .0000270  1.7167 0.0191  I     4.003     .530      .615     .198  -.161000   .388000  -.3918000      .000      .000  
+85 518 46203.00 I  -.163573  .000909   .396137  .000483  I -.3928999  .0000268  1.5811 0.0196  I     3.394     .319      .551     .298  -.159000   .391000  -.3935000      .000      .000  
+85 519 46204.00 I  -.161262  .000865   .398882  .000537  I -.3943990  .0000284  1.4138 0.0231  I     3.070     .319      .192     .298  -.157000   .394000  -.3950000      .000      .000  
+85 520 46205.00 I  -.158584  .001205   .401605  .000631  I -.3957248  .0000377  1.2384 0.0271  I     2.955     .219     -.236     .298  -.155000   .397000  -.3964000      .000      .000  
+85 521 46206.00 I  -.155578  .001130   .404325  .000641  I -.3968812  .0000461  1.0792 0.0269  I     2.968     .219     -.514     .298  -.153000   .400000  -.3975000      .000      .000  
+85 522 46207.00 I  -.152367  .001011   .407057  .000637  I -.3978971  .0000385  0.9618 0.0326  I     3.020     .160     -.613     .298  -.151000   .403000  -.3986000      .000      .000  
+85 523 46208.00 I  -.149070  .000702   .409800  .000652  I -.3988270  .0000460  0.9109 0.0350  I     3.030     .791     -.644     .298  -.149000   .406000  -.3995000      .000      .000  
+85 524 46209.00 I  -.145811  .000702   .412542  .000652  I -.3997466  .0000584  0.9431 0.0402  I     3.009     .791     -.692     .298  -.147000   .409000  -.4005000      .000      .000  
+85 525 46210.00 I  -.142687  .000757   .415266  .000582  I -.4007451  .0000660  1.0710 0.0428  I     3.070     .791     -.751     .298  -.144000   .412000  -.4015000      .000      .000  
+85 526 46211.00 I  -.139715  .000679   .417959  .000555  I -.4019197  .0000625  1.2922 0.0427  I     3.289     .791     -.800     .298  -.142000   .415000  -.4027000      .000      .000  
+85 527 46212.00 I  -.136898  .000376   .420617  .000533  I -.4033516  .0000542  1.5795 0.0463  I     3.602     .124     -.845     .298  -.140000   .418000  -.4042000      .000      .000  
+85 528 46213.00 I  -.134239  .000421   .423234  .000555  I -.4050843  .0000684  1.8834 0.0440  I     3.868     .165     -.851     .298  -.137000   .420000  -.4059000      .000      .000  
+85 529 46214.00 I  -.131710  .000421   .425794  .000555  I -.4071018  .0000693  2.1375 0.0454  I     3.957     .165     -.718     .298  -.135000   .423000  -.4079000      .000      .000  
+85 530 46215.00 I  -.129268  .000393   .428277  .000511  I -.4093187  .0000598  2.2698 0.0454  I     3.789     .165     -.395     .298  -.132000   .426000  -.4100000      .000      .000  
+85 531 46216.00 I  -.126862  .000306   .430697  .000518  I -.4115847  .0000588  2.2321 0.0375  I     3.370     .165     -.014     .298  -.130000   .429000  -.4122000      .000      .000  
+85 6 1 46217.00 I  -.124466  .000373   .433064  .000470  I -.4137295  .0000453  2.0344 0.0409  I     2.877     .194      .217     .179  -.127000   .431000  -.4142000      .000      .000  
+85 6 2 46218.00 I  -.122062  .000396   .435383  .000374  I -.4156205  .0000568  1.7378 0.0370  I     2.564     .219      .234     .239  -.125000   .434000  -.4159000      .000      .000  
+85 6 3 46219.00 I  -.119627  .000383   .437662  .000411  I -.4172008  .0000586  1.4282 0.0405  I     2.540     .219      .149     .239  -.122000   .436000  -.4174000      .000      .000  
+85 6 4 46220.00 I  -.117138  .000383   .439906  .000411  I -.4185018  .0000578  1.1934 0.0409  I     2.724     .219      .039     .239  -.119000   .439000  -.4186000      .000      .000  
+85 6 5 46221.00 I  -.114629  .000501   .442113  .000485  I -.4196298  .0000570  1.0854 0.0361  I     3.011     .219     -.165     .239  -.117000   .441000  -.4198000      .000      .000  
+85 6 6 46222.00 I  -.112156  .000453   .444281  .000425  I -.4207131  .0000434  1.0991 0.0375  I     3.301     .172     -.511     .180  -.114000   .443000  -.4209000      .000      .000  
+85 6 7 46223.00 I  -.109765  .000456   .446419  .000424  I -.4218551  .0000487  1.1943 0.0331  I     3.412     .106     -.837     .298  -.112000   .445000  -.4221000      .000      .000  
+85 6 8 46224.00 I  -.107492  .000456   .448543  .000424  I -.4231118  .0000500  1.3199 0.0339  I     3.171     .106     -.907     .298  -.109000   .447000  -.4234000      .000      .000  
+85 6 9 46225.00 I  -.105357  .000437   .450662  .000414  I -.4244918  .0000473  1.4362 0.0322  I     2.626     .106     -.699     .298  -.106000   .449000  -.4248000      .000      .000  
+85 610 46226.00 I  -.103325  .000397   .452758  .000381  I -.4259725  .0000406  1.5174 0.0263  I     2.037     .106     -.430     .298  -.104000   .451000  -.4263000      .000      .000  
+85 611 46227.00 I  -.101352  .000405   .454805  .000470  I -.4275097  .0000230  1.5478 0.0276  I     1.575     .379     -.279     .175  -.101000   .453000  -.4279000      .000      .000  
+85 612 46228.00 I  -.099393  .000221   .456780  .000478  I -.4290493  .0000374  1.5218 0.0217  I     1.164     .525     -.203     .233  -.098000   .455000  -.4295000      .000      .000  
+85 613 46229.00 I  -.097404  .000221   .458668  .000478  I -.4305347  .0000367  1.4401 0.0254  I      .668     .525     -.062     .233  -.095000   .456000  -.4310000      .000      .000  
+85 614 46230.00 I  -.095335  .000221   .460461  .000478  I -.4319136  .0000344  1.3107 0.0279  I      .128     .525      .145     .233  -.093000   .458000  -.4324000      .000      .000  
+85 615 46231.00 I  -.093149  .000540   .462163  .000512  I -.4331459  .0000421  1.1507 0.0351  I     -.309     .525      .237     .233  -.090000   .460000  -.4337000      .000      .000  
+85 616 46232.00 I  -.090825  .000672   .463779  .000625  I -.4342128  .0000612  0.9842 0.0265  I     -.576     .742      .084     .327  -.087000   .462000  -.4348000      .000      .000  
+85 617 46233.00 I  -.088349  .000444   .465312  .000331  I -.4351203  .0000321  0.8359 0.0342  I     -.683    1.046     -.247     .396  -.084000   .464000  -.4358000      .000      .000  
+85 618 46234.00 I  -.085711  .000446   .466761  .000331  I -.4359015  .0000305  0.7383 0.0228  I     -.629     .986     -.591     .363  -.082000   .465000  -.4365000      .000      .000  
+85 619 46235.00 I  -.082936  .000446   .468118  .000331  I -.4366149  .0000325  0.6946 0.0228  I     -.406     .986     -.840     .363  -.079000   .467000  -.4372000      .000      .000  
+85 620 46236.00 I  -.080122  .000425   .469408  .000334  I -.4373028  .0000340  0.6872 0.0243  I      .100     .986     -.766     .363  -.076000   .468000  -.4378000      .000      .000  
+85 621 46237.00 I  -.077361  .000467   .470667  .000289  I -.4380153  .0000362  0.7579 0.0223  I      .599     .809     -.619     .297  -.073000   .470000  -.4385000      .000      .000  
+85 622 46238.00 I  -.074610  .000377   .471903  .000153  I -.4388551  .0000290  0.9381 0.0267  I      .909     .753     -.661     .221  -.070000   .471000  -.4393000      .000      .000  
+85 623 46239.00 I  -.071793  .000377   .473116  .000153  I -.4399191  .0000392  1.2010 0.0565  I     1.188     .465     -.790     .137  -.067000   .473000  -.4403000      .000      .000  
+85 624 46240.00 I  -.068839  .000698   .474303  .000403  I -.4412630  .0001093  1.4817 0.0499  I     1.488     .190     -.818     .298  -.064000   .474000  -.4416000      .000      .000  
+85 625 46241.00 I  -.065753  .000784   .475472  .000466  I -.4428618  .0000918  1.7003 0.0682  I     1.671     .190     -.649     .298  -.062000   .475000  -.4431000      .000      .000  
+85 626 46242.00 I  -.062576  .000731   .476631  .000452  I -.4446257  .0000815  1.8053 0.0647  I     1.531     .398     -.300     .169  -.058000   .477000  -.4447000      .000      .000  
+85 627 46243.00 I  -.059354  .000657   .477788  .000537  I -.4464248  .0000913  1.7675 0.0607  I     1.000     .530      .123     .220  -.056000   .478000  -.4463000      .000      .000  
+85 628 46244.00 I  -.056153  .000657   .478938  .000537  I -.4481124  .0000899  1.5850 0.0573  I      .250     .530      .479     .220  -.053000   .479000  -.4478000      .000      .000  
+85 629 46245.00 I  -.053034  .000657   .480065  .000537  I -.4495582  .0000692  1.2928 0.0554  I     -.387     .530      .652     .220  -.050000   .480000  -.4491000      .000      .000  
+85 630 46246.00 I  -.050009  .000610   .481156  .000405  I -.4506836  .0000646  0.9573 0.0475  I     -.679     .530      .642     .220  -.047000   .481000  -.4501000      .000      .000  
+85 7 1 46247.00 I  -.047069  .000610   .482203  .000405  I  .5485152  .0000650  0.6579 0.0516  I     -.633     .581      .540     .193  -.044000   .483000   .5492000      .000      .000  
+85 7 2 46248.00 I  -.044201  .000451   .483202  .000152  I  .5479681  .0000806  0.4560 0.0494  I     -.425     .628      .413     .161  -.041000   .484000   .5486000      .000      .000  
+85 7 3 46249.00 I  -.041392  .000502   .484143  .000204  I  .5475631  .0000743  0.3744 0.0568  I     -.210     .628      .237     .161  -.038000   .484000   .5482000      .000      .000  
+85 7 4 46250.00 I  -.038612  .000621   .485025  .000419  I  .5471829  .0000801  0.4020 0.0495  I     -.067     .628     -.021     .161  -.034000   .485000   .5477000      .000      .000  
+85 7 5 46251.00 I  -.035784  .000585   .485851  .000489  I  .5467352  .0000655  0.5011 0.0503  I     -.070     .518     -.285     .143  -.031000   .486000   .5472000      .000      .000  
+85 7 6 46252.00 I  -.032827  .000539   .486625  .000464  I  .5461737  .0000607  0.6211 0.0450  I     -.338     .578     -.419     .261  -.028000   .487000   .5465000      .000      .000  
+85 7 7 46253.00 I  -.029687  .000542   .487346  .000500  I  .5455003  .0000616  0.7193 0.0466  I     -.908     .542     -.411     .313  -.025000   .488000   .5458000      .000      .000  
+85 7 8 46254.00 I  -.026333  .000542   .488016  .000500  I  .5447512  .0000708  0.7694 0.0465  I    -1.633     .542     -.397     .313  -.022000   .489000   .5449000      .000      .000  
+85 7 9 46255.00 I  -.022800  .000492   .488669  .000542  I  .5439789  .0000697  0.7675 0.0433  I    -2.329     .542     -.374     .313  -.019000   .489000   .5440000      .000      .000  
+85 710 46256.00 I  -.019130  .000519   .489314  .000511  I  .5432315  .0000499  0.7198 0.0432  I    -2.910     .542     -.288     .313  -.016000   .490000   .5431000      .000      .000  
+85 711 46257.00 I  -.015371  .000463   .489951  .000569  I  .5425526  .0000512  0.6321 0.0379  I    -3.406     .682     -.087     .281  -.013000   .490000   .5423000      .000      .000  
+85 712 46258.00 I  -.011572  .000538   .490575  .000628  I  .5419778  .0000571  0.5127 0.0383  I    -3.850     .705      .168     .153  -.010000   .491000   .5416000      .000      .000  
+85 713 46259.00 I  -.007792  .000538   .491171  .000628  I  .5415318  .0000571  0.3793 0.0369  I    -4.185     .705      .273     .153  -.006000   .492000   .5411000      .000      .000  
+85 714 46260.00 I  -.004082  .000538   .491721  .000628  I  .5412161  .0000466  0.2553 0.0366  I    -4.296     .705      .059     .153  -.003000   .492000   .5408000      .000      .000  
+85 715 46261.00 I  -.000464  .000526   .492239  .000659  I  .5410125  .0000457  0.1576 0.0302  I    -4.144     .705     -.401     .153   .000000   .493000   .5405000      .000      .000  
+85 716 46262.00 I   .003063  .000533   .492745  .000573  I  .5408855  .0000384  0.1062 0.0297  I    -3.766     .636     -.865     .112   .003000   .493000   .5404000      .000      .000  
+85 717 46263.00 I   .006507  .000674   .493256  .000546  I  .5407766  .0000381  0.1253 0.0268  I    -3.285     .557    -1.122     .298   .006000   .493000   .5403000      .000      .000  
+85 718 46264.00 I   .009872  .000603   .493788  .000595  I  .5406063  .0000375  0.2303 0.0297  I    -2.914     .557    -1.097     .298   .010000   .494000   .5401000      .000      .000  
+85 719 46265.00 I   .013176  .000603   .494340  .000595  I  .5402860  .0000455  0.4254 0.0285  I    -2.846     .509     -.871     .298   .013000   .494000   .5398000      .000      .000  
+85 720 46266.00 I   .016429  .000573   .494873  .000572  I  .5397323  .0000430  0.6900 0.0301  I    -3.036     .509     -.635     .298   .016000   .494000   .5393000      .000      .000  
+85 721 46267.00 I   .019647  .000631   .495332  .000533  I  .5389012  .0000394  0.9691 0.0307  I    -3.290     .732     -.527     .519   .019000   .495000   .5386000      .000      .000  
+85 722 46268.00 I   .022886  .000672   .495665  .000535  I  .5378134  .0000437  1.1903 0.0301  I    -3.438     .829     -.549     .677   .023000   .495000   .5375000      .000      .000  
+85 723 46269.00 I   .026158  .000546   .495886  .000518  I  .5365587  .0000456  1.2973 0.0315  I    -3.518     .829     -.583     .677   .026000   .495000   .5363000      .000      .000  
+85 724 46270.00 I   .029459  .000557   .496025  .000563  I  .5352637  .0000453  1.2695 0.0354  I    -3.755     .829     -.485     .677   .029000   .495000   .5351000      .000      .000  
+85 725 46271.00 I   .032763  .000501   .496114  .000441  I  .5340619  .0000542  1.1149 0.0428  I    -4.208     .971     -.295     .804   .033000   .495000   .5339000      .000      .000  
+85 726 46272.00 I   .036041  .000556   .496176  .000490  I  .5330642  .0000726  0.8694 0.0533  I    -4.758     .662     -.117     .521   .036000   .495000   .5329000      .000      .000  
+85 727 46273.00 I   .039272  .000573   .496233  .000556  I  .5323336  .0000918  0.5925 0.0586  I    -5.211     .312     -.007     .298   .039000   .495000   .5321000      .000      .000  
+85 728 46274.00 I   .042463  .000573   .496285  .000556  I  .5318666  .0000920  0.3534 0.0640  I    -5.413     .312      .030     .298   .043000   .495000   .5316000      .000      .000  
+85 729 46275.00 I   .045629  .000573   .496323  .000556  I  .5315935  .0000892  0.2140 0.0608  I    -5.330     .312      .010     .298   .046000   .495000   .5313000      .000      .000  
+85 730 46276.00 I   .048765  .000639   .496335  .000462  I  .5313965  .0000794  0.2007 0.0557  I    -5.056     .312     -.077     .298   .049000   .495000   .5310000      .000      .000  
+85 731 46277.00 I   .051872  .000698   .496310  .000632  I  .5311553  .0000668  0.2978 0.0445  I    -4.763     .312     -.188     .298   .053000   .495000   .5307000      .000      .000  
+85 8 1 46278.00 I   .054974  .000788   .496231  .000833  I  .5307762  .0000400  0.4690 0.0369  I    -4.578     .313     -.274     .298   .056000   .495000   .5303000      .000      .000  
+85 8 2 46279.00 I   .058100  .000776   .496081  .000894  I  .5302084  .0000316  0.6669 0.0262  I    -4.597     .313     -.270     .298   .059000   .495000   .5297000      .000      .000  
+85 8 3 46280.00 I   .061323  .000776   .495838  .000894  I  .5294499  .0000339  0.8424 0.0257  I    -4.918     .313     -.138     .298   .063000   .494000   .5289000      .000      .000  
+85 8 4 46281.00 I   .064658  .000677   .495523  .000821  I  .5285432  .0000405  0.9590 0.0268  I    -5.541     .313      .067     .298   .066000   .494000   .5280000      .000      .000  
+85 8 5 46282.00 I   .068084  .000630   .495159  .000784  I  .5275565  .0000414  1.0016 0.0322  I    -6.339     .660      .220     .298   .069000   .494000   .5271000      .000      .000  
+85 8 6 46283.00 I   .071580  .000565   .494755  .000706  I  .5265648  .0000501  0.9697 0.0388  I    -7.081     .879      .252     .298   .073000   .493000   .5261000      .000      .000  
+85 8 7 46284.00 I   .075122  .000598   .494320  .000422  I  .5256392  .0000657  0.8715 0.0410  I    -7.519     .879      .238     .298   .076000   .493000   .5252000      .000      .000  
+85 8 8 46285.00 I   .078697  .000454   .493855  .000467  I  .5248374  .0000648  0.7264 0.0450  I    -7.551     .879      .285     .298   .080000   .493000   .5244000      .000      .000  
+85 8 9 46286.00 I   .082279  .000602   .493336  .000447  I  .5241943  .0000615  0.5575 0.0442  I    -7.398     .915      .369     .298   .083000   .492000   .5237000      .000      .000  
+85 810 46287.00 I   .085829  .000586   .492728  .000427  I  .5237231  .0000600  0.3866 0.0442  I    -7.340     .905      .341     .213   .086000   .492000   .5232000      .000      .000  
+85 811 46288.00 I   .089317  .000520   .491994  .000602  I  .5234146  .0000636  0.2354 0.0440  I    -7.451     .921      .110     .269   .090000   .491000   .5229000      .000      .000  
+85 812 46289.00 I   .092722  .000520   .491108  .000602  I  .5232339  .0000645  0.1394 0.0424  I    -7.600     .921     -.239     .269   .093000   .491000   .5226000      .000      .000  
+85 813 46290.00 I   .096012  .000518   .490110  .000686  I  .5231072  .0000562  0.1290 0.0377  I    -7.355     .921     -.509     .269   .096000   .490000   .5224000      .000      .000  
+85 814 46291.00 I   .099202  .000548   .489066  .000680  I  .5229433  .0000390  0.2162 0.0339  I    -6.762     .921     -.587     .269   .099000   .489000   .5222000      .000      .000  
+85 815 46292.00 I   .102330  .000824   .488030  .000752  I  .5226398  .0000378  0.4082 0.0247  I    -6.136     .772     -.485     .243   .103000   .488000   .5219000      .000      .000  
+85 816 46293.00 I   .105445  .000782   .487036  .000859  I  .5220976  .0000303  0.6881 0.0255  I    -5.663     .633     -.281     .126   .106000   .488000   .5213000      .000      .000  
+85 817 46294.00 I   .108604  .000758   .486110  .000698  I  .5212499  .0000342  1.0093 0.0228  I    -5.411     .633     -.089     .126   .109000   .487000   .5205000      .000      .000  
+85 818 46295.00 I   .111863  .000758   .485251  .000698  I  .5200893  .0000340  1.2997 0.0226  I    -5.438     .633     -.017     .126   .112000   .486000   .5194000      .000      .000  
+85 819 46296.00 I   .115192  .000864   .484438  .000665  I  .5186855  .0000295  1.4851 0.0234  I    -5.741     .633     -.086     .126   .115000   .485000   .5180000      .000      .000  
+85 820 46297.00 I   .118524  .000802   .483639  .000877  I  .5171687  .0000321  1.5217 0.0239  I    -6.235     .525     -.200     .298   .118000   .484000   .5166000      .000      .000  
+85 821 46298.00 I   .121791  .000696   .482814  .001017  I  .5156920  .0000375  1.4084 0.0286  I    -6.791     .390     -.226     .298   .121000   .483000   .5152000      .000      .000  
+85 822 46299.00 I   .124926  .000585   .481908  .001298  I  .5143879  .0000473  1.1869 0.0299  I    -7.304     .390     -.115     .298   .124000   .482000   .5140000      .000      .000  
+85 823 46300.00 I   .127884  .000622   .480877  .001369  I  .5133339  .0000467  0.9182 0.0329  I    -7.716     .340      .077     .298   .127000   .481000   .5130000      .000      .000  
+85 824 46301.00 I   .130691  .000614   .479741  .001284  I  .5125465  .0000456  0.6643 0.0370  I    -7.995     .340      .235     .298   .130000   .479000   .5123000      .000      .000  
+85 825 46302.00 I   .133380  .000789   .478546  .001402  I  .5119814  .0000574  0.4819 0.0426  I    -8.094     .900      .269     .242   .133000   .478000   .5117000      .000      .000  
+85 826 46303.00 I   .136005  .000809   .477310  .001369  I  .5115435  .0000719  0.4170 0.0453  I    -7.964    1.120      .140     .316   .136000   .477000   .5113000      .000      .000  
+85 827 46304.00 I   .138660  .000809   .475975  .001369  I  .5111038  .0000701  0.4828 0.0498  I    -7.674    1.120     -.116     .316   .139000   .476000   .5108000      .000      .000  
+85 828 46305.00 I   .141430  .000957   .474480  .001334  I  .5105460  .0000690  0.6442 0.0489  I    -7.395    1.120     -.406     .316   .142000   .474000   .5102000      .000      .000  
+85 829 46306.00 I   .144270  .001073   .472834  .000972  I  .5098009  .0000683  0.8489 0.0500  I    -7.260    1.354     -.616     .375   .145000   .473000   .5094000      .000      .000  
+85 830 46307.00 I   .147121  .001039   .471079  .000924  I  .5088480  .0000724  1.0540 0.0520  I    -7.334    1.098     -.651     .298   .148000   .471000   .5084000      .000      .000  
+85 831 46308.00 I   .149942  .001041   .469255  .000421  I  .5077043  .0000783  1.2249 0.0521  I    -7.600     .791     -.504     .298   .150000   .470000   .5072000      .000      .000  
+85 9 1 46309.00 I   .152721  .000950   .467398  .000411  I  .5064174  .0000749  1.3381 0.0525  I    -8.019     .791     -.290     .298   .153000   .468000   .5060000      .000      .000  
+85 9 2 46310.00 I   .155498  .001175   .465536  .001400  I  .5050530  .0000700  1.3767 0.0529  I    -8.558     .791     -.157     .298   .156000   .467000   .5047000      .000      .000  
+85 9 3 46311.00 I   .158276  .000975   .463694  .001430  I  .5036912  .0000746  1.3339 0.0479  I    -9.102     .541     -.153     .101   .159000   .465000   .5035000      .000      .000  
+85 9 4 46312.00 I   .161038  .000957   .461899  .001131  I  .5024070  .0000655  1.2258 0.0538  I    -9.450     .749     -.155     .144   .161000   .464000   .5023000      .000      .000  
+85 9 5 46313.00 I   .163789  .001020   .460177  .001227  I  .5012528  .0000776  1.0781 0.0507  I    -9.462     .870     -.023     .172   .164000   .462000   .5013000      .000      .000  
+85 9 6 46314.00 I   .166536  .001020   .458544  .001227  I  .5002573  .0000775  0.9108 0.0527  I    -9.194     .870      .214     .172   .166000   .460000   .5005000      .000      .000  
+85 9 7 46315.00 I   .169227  .001043   .456971  .001237  I  .4994287  .0000714  0.7511 0.0517  I    -8.915     .870      .276     .172   .169000   .458000   .4997000      .000      .000  
+85 9 8 46316.00 I   .171822  .000959   .455409  .001169  I  .4987417  .0000686  0.6318 0.0469  I    -8.668     .870      .043     .172   .171000   .456000   .4991000      .000      .000  
+85 9 9 46317.00 I   .174282  .000672   .453812  .000865  I  .4981437  .0000607  0.5768 0.0475  I    -8.179     .873     -.281     .176   .174000   .455000   .4985000      .000      .000  
+85 910 46318.00 I   .176573  .000450   .452131  .001043  I  .4975589  .0000657  0.6094 0.0373  I    -7.382     .833     -.477     .173   .176000   .453000   .4979000      .000      .000  
+85 911 46319.00 I   .178677  .000450   .450315  .001043  I  .4968903  .0000432  0.7458 0.0423  I    -6.597     .833     -.497     .173   .178000   .451000   .4971000      .000      .000  
+85 912 46320.00 I   .180611  .000543   .448316  .000954  I  .4960317  .0000532  0.9890 0.0341  I    -6.201     .833     -.409     .173   .181000   .449000   .4962000      .000      .000  
+85 913 46321.00 I   .182398  .000449   .446159  .000957  I  .4948855  .0000527  1.3124 0.0350  I    -6.236     .833     -.270     .173   .183000   .447000   .4949000      .000      .000  
+85 914 46322.00 I   .184053  .000505   .443888  .000839  I  .4934018  .0000454  1.6509 0.0379  I    -6.504     .798     -.091     .308   .185000   .445000   .4934000      .000      .000  
+85 915 46323.00 I   .185592  .000571   .441539  .000448  I  .4916065  .0000546  1.9209 0.0370  I    -6.869     .762      .049     .400   .187000   .442000   .4915000      .000      .000  
+85 916 46324.00 I   .187053  .000571   .439148  .000359  I  .4896077  .0000584  2.0476 0.0393  I    -7.295     .762      .022     .400   .189000   .440000   .4894000      .000      .000  
+85 917 46325.00 I   .188508  .000571   .436747  .000359  I  .4875697  .0000566  1.9989 0.0383  I    -7.705     .762     -.180     .400   .191000   .438000   .4873000      .000      .000  
+85 918 46326.00 I   .189998  .000433   .434355  .000428  I  .4856603  .0000496  1.7991 0.0359  I    -7.985     .762     -.373     .400   .193000   .436000   .4854000      .000      .000  
+85 919 46327.00 I   .191546  .000654   .431996  .000385  I  .4839986  .0000443  1.5182 0.0347  I    -8.120     .555     -.384     .347   .195000   .434000   .4837000      .000      .000  
+85 920 46328.00 I   .193176  .000719   .429680  .000381  I  .4826222  .0000484  1.2424 0.0332  I    -8.189     .191     -.243     .285   .197000   .431000   .4823000      .000      .000  
+85 921 46329.00 I   .194912  .000719   .427417  .000381  I  .4814891  .0000495  1.0408 0.0339  I    -8.223     .191     -.117     .285   .199000   .429000   .4812000      .000      .000  
+85 922 46330.00 I   .196776  .000818   .425207  .000457  I  .4805008  .0000475  0.9588 0.0335  I    -8.153     .191     -.099     .285   .200000   .427000   .4802000      .000      .000  
+85 923 46331.00 I   .198726  .000723   .423023  .000448  I  .4795289  .0000453  1.0047 0.0310  I    -7.918     .191     -.143     .285   .202000   .424000   .4791000      .000      .000  
+85 924 46332.00 I   .200685  .000669   .420838  .000464  I  .4784586  .0000400  1.1490 0.0317  I    -7.543     .268     -.167     .244   .204000   .422000   .4780000      .000      .000  
+85 925 46333.00 I   .202577  .000512   .418621  .000542  I  .4772123  .0000444  1.3493 0.0302  I    -7.144     .327     -.134     .195   .205000   .419000   .4767000      .000      .000  
+85 926 46334.00 I   .204362  .000512   .416327  .000542  I  .4757559  .0000452  1.5621 0.0311  I    -6.895     .327     -.024     .195   .207000   .417000   .4752000      .000      .000  
+85 927 46335.00 I   .206018  .000512   .413909  .000542  I  .4740976  .0000436  1.7464 0.0298  I    -6.938     .327      .214     .195   .208000   .414000   .4736000      .000      .000  
+85 928 46336.00 I   .207522  .000376   .411358  .000372  I  .4722834  .0000390  1.8697 0.0290  I    -7.223     .387      .595     .170   .210000   .412000   .4718000      .000      .000  
+85 929 46337.00 I   .208873  .000507   .408682  .000359  I  .4703842  .0000384  1.9149 0.0302  I    -7.566     .362     1.000     .145   .211000   .409000   .4699000      .000      .000  
+85 930 46338.00 I   .210079  .000543   .405896  .000284  I  .4684802  .0000461  1.8801 0.0307  I    -7.810     .384     1.225     .298   .212000   .406000   .4681000      .000      .000  
+8510 1 46339.00 I   .211149  .000527   .403012  .000278  I  .4666470  .0000480  1.7761 0.0343  I    -7.853     .384     1.188     .298   .214000   .404000   .4663000      .000      .000  
+8510 2 46340.00 I   .212122  .000527   .400053  .000278  I  .4649418  .0000508  1.6308 0.0356  I    -7.726     .384      .958     .298   .215000   .401000   .4646000      .000      .000  
+8510 3 46341.00 I   .213067  .000538   .397048  .000327  I  .4633893  .0000526  1.4739 0.0350  I    -7.482     .384      .712     .298   .216000   .398000   .4631000      .000      .000  
+8510 4 46342.00 I   .214036  .000602   .394029  .000251  I  .4619896  .0000482  1.3301 0.0420  I    -7.214     .372      .520     .298   .217000   .395000   .4617000      .000      .000  
+8510 5 46343.00 I   .215075  .000683   .391019  .000365  I  .4607163  .0000656  1.2246 0.0403  I    -7.045     .416      .283     .298   .219000   .392000   .4604000      .000      .000  
+8510 6 46344.00 I   .216228  .000701   .388042  .000774  I  .4595225  .0000647  1.1730 0.0449  I    -6.908     .416     -.018     .298   .220000   .390000   .4592000      .000      .000  
+8510 7 46345.00 I   .217527  .000701   .385111  .000774  I  .4583458  .0000613  1.1951 0.0436  I    -6.553     .416     -.203     .298   .220000   .387000   .4580000      .000      .000  
+8510 8 46346.00 I   .218911  .000738   .382221  .000793  I  .4571011  .0000584  1.3107 0.0406  I    -5.916     .416     -.111     .298   .221000   .384000   .4568000      .000      .000  
+8510 9 46347.00 I   .220280  .000686   .379362  .001027  I  .4556925  .0000534  1.5218 0.0425  I    -5.310     .312      .181     .298   .222000   .381000   .4554000      .000      .000  
+851010 46348.00 I   .221542  .000549   .376513  .001256  I  .4540317  .0000618  1.8103 0.0413  I    -5.105     .148      .459     .110   .223000   .378000   .4538000      .000      .000  
+851011 46349.00 I   .222619  .000549   .373620  .001256  I  .4520607  .0000631  2.1323 0.0435  I    -5.336     .148      .655     .110   .224000   .375000   .4518000      .000      .000  
+851012 46350.00 I   .223455  .000584   .370637  .001192  I  .4497784  .0000613  2.4204 0.0441  I    -5.772     .148      .876     .110   .225000   .372000   .4496000      .000      .000  
+851013 46351.00 I   .224080  .000469   .367587  .001083  I  .4472576  .0000617  2.5955 0.0400  I    -6.224     .148     1.148     .110   .226000   .369000   .4471000      .000      .000  
+851014 46352.00 I   .224562  .000588   .364512  .000947  I  .4446451  .0000513  2.5977 0.0416  I    -6.600     .249     1.303     .164   .226000   .366000   .4444000      .000      .000  
+851015 46353.00 I   .224966  .000535   .361454  .000691  I  .4421210  .0000559  2.4235 0.0392  I    -6.774     .320     1.227     .204   .227000   .363000   .4419000      .000      .000  
+851016 46354.00 I   .225359  .000535   .358452  .000691  I  .4398379  .0000593  2.1298 0.0548  I    -6.636     .320     1.060     .204   .228000   .360000   .4396000      .000      .000  
+851017 46355.00 I   .225798  .000535   .355520  .000691  I  .4378696  .0000942  1.8116 0.0510  I    -6.277     .320     1.023     .204   .228000   .358000   .4376000      .000      .000  
+851018 46356.00 I   .226285  .000494   .352648  .000620  I  .4361921  .0000830  1.5614 0.0585  I    -5.943     .320     1.111     .204   .229000   .355000   .4359000      .000      .000  
+851019 46357.00 I   .226795  .000572   .349824  .000554  I  .4347040  .0000694  1.4396 0.0660  I    -5.711     .346     1.102     .314   .229000   .352000   .4344000      .000      .000  
+851020 46358.00 I   .227307  .000499   .347014  .000612  I  .4332664  .0001027  1.4572 0.0636  I    -5.420     .370      .892     .394   .230000   .349000   .4329000      .000      .000  
+851021 46359.00 I   .227800  .000551   .344182  .000558  I  .4317540  .0001066  1.5817 0.0727  I    -4.949     .370      .659     .394   .230000   .346000   .4314000      .000      .000  
+851022 46360.00 I   .228257  .000508   .341300  .000568  I  .4300833  .0001030  1.7655 0.0615  I    -4.379     .370      .642     .394   .231000   .343000   .4297000      .000      .000  
+851023 46361.00 I   .228671  .000466   .338380  .000503  I  .4282195  .0000612  1.9600 0.0581  I    -3.874     .370      .848     .394   .231000   .340000   .4279000      .000      .000  
+851024 46362.00 I   .229030  .000475   .335455  .000454  I  .4261722  .0000538  2.1278 0.0461  I    -3.555     .501     1.112     .309   .231000   .337000   .4258000      .000      .000  
+851025 46363.00 I   .229326  .000410   .332557  .000354  I  .4239808  .0000690  2.2450 0.0307  I    -3.492     .604     1.337     .190   .232000   .334000   .4237000      .000      .000  
+851026 46364.00 I   .229560  .000410   .329701  .000354  I  .4217036  .0000296  2.2980 0.0367  I    -3.692     .604     1.533     .190   .232000   .331000   .4215000      .000      .000  
+851027 46365.00 I   .229736  .000400   .326901  .000293  I  .4194097  .0000252  2.2764 0.0210  I    -4.077     .543     1.653     .199   .232000   .328000   .4192000      .000      .000  
+851028 46366.00 I   .229840  .000410   .324156  .000239  I  .4171761  .0000299  2.1788 0.0225  I    -4.493     .543     1.613     .199   .232000   .326000   .4171000      .000      .000  
+851029 46367.00 I   .229859  .000512   .321447  .000386  I  .4150728  .0000373  2.0192 0.0262  I    -4.842     .480     1.419     .335   .232000   .323000   .4150000      .000      .000  
+851030 46368.00 I   .229785  .000547   .318755  .000429  I  .4131510  .0000430  1.8198 0.0293  I    -5.076     .373     1.301     .407   .233000   .320000   .4132000      .000      .000  
+851031 46369.00 I   .229620  .000547   .316060  .000429  I  .4114356  .0000451  1.6131 0.0310  I    -5.191     .373     1.444     .407   .233000   .317000   .4115000      .000      .000  
+8511 1 46370.00 I   .229408  .000547   .313351  .000429  I  .4099157  .0000447  1.4338 0.0351  I    -5.313     .373     1.612     .407   .233000   .314000   .4100000      .000      .000  
+8511 2 46371.00 I   .229171  .000616   .310637  .000511  I  .4085510  .0000539  1.3055 0.0383  I    -5.461     .368     1.635     .463   .233000   .312000   .4086000      .000      .000  
+8511 3 46372.00 I   .228924  .000717   .307937  .000551  I  .4072826  .0000623  1.2435 0.0413  I    -5.536     .467     1.503     .407   .233000   .309000   .4073000      .000      .000  
+8511 4 46373.00 I   .228693  .000657   .305271  .000445  I  .4060380  .0000627  1.2593 0.0460  I    -5.374     .548     1.373     .341   .233000   .306000   .4060000      .000      .000  
+8511 5 46374.00 I   .228504  .000633   .302658  .000783  I  .4047364  .0000677  1.3577 0.0482  I    -4.916     .548     1.442     .341   .232000   .303000   .4046000      .000      .000  
+8511 6 46375.00 I   .228386  .000633   .300114  .000783  I  .4032939  .0000731  1.5420 0.0476  I    -4.313     .548     1.672     .341   .232000   .301000   .4030000      .000      .000  
+8511 7 46376.00 I   .228334  .000637   .297638  .000693  I  .4016286  .0000670  1.7977 0.0490  I    -3.818     .548     1.820     .341   .232000   .298000   .4012000      .000      .000  
+8511 8 46377.00 I   .228320  .000638   .295220  .000661  I  .3996907  .0000653  2.0769 0.0469  I    -3.533     .728     1.855     .287   .232000   .295000   .3990000      .000      .000  
+8511 9 46378.00 I   .228317  .000677   .292843  .000737  I  .3974904  .0000657  2.3093 0.0463  I    -3.405     .872     1.947     .220   .232000   .293000   .3967000      .000      .000  
+851110 46379.00 I   .228298  .000677   .290458  .000737  I  .3951109  .0000657  2.4253 0.0462  I    -3.451     .872     2.194     .220   .232000   .290000   .3942000      .000      .000  
+851111 46380.00 I   .228247  .000736   .288015  .000560  I  .3926938  .0000650  2.3791 0.0457  I    -3.703     .872     2.441     .220   .231000   .288000   .3917000      .000      .000  
+851112 46381.00 I   .228135  .000741   .285484  .000485  I  .3904061  .0000635  2.1725 0.0440  I    -3.959     .872     2.484     .220   .231000   .285000   .3893000      .000      .000  
+851113 46382.00 I   .227954  .000777   .282861  .000633  I  .3883798  .0000594  1.8729 0.0430  I    -3.977     .638     2.380     .156   .231000   .282000   .3873000      .000      .000  
+851114 46383.00 I   .227722  .000821   .280152  .000772  I  .3866578  .0000580  1.5809 0.0426  I    -3.803     .234     2.359     .298   .230000   .280000   .3855000      .000      .000  
+851115 46384.00 I   .227464  .000756   .277366  .000781  I  .3851853  .0000611  1.3870 0.0449  I    -3.671     .234     2.445     .298   .230000   .277000   .3841000      .000      .000  
+851116 46385.00 I   .227247  .000756   .274515  .000781  I  .3838348  .0000685  1.3401 0.0411  I    -3.605     .234     2.394     .298   .230000   .275000   .3827000      .000      .000  
+851117 46386.00 I   .227107  .000780   .271641  .000971  I  .3824592  .0000551  1.4310 0.0441  I    -3.421     .234     2.080     .298   .229000   .272000   .3814000      .000      .000  
+851118 46387.00 I   .227067  .000985   .268788  .001078  I  .3809433  .0000557  1.6105 0.0296  I    -3.035     .681     1.731     .131   .229000   .270000   .3799000      .000      .000  
+851119 46388.00 I   .227161  .000543   .265981  .000614  I  .3792292  .0000219  1.8172 0.0300  I    -2.636     .958     1.676     .212   .229000   .267000   .3783000      .000      .000  
+851120 46389.00 I   .227422  .000540   .263244  .000583  I  .3773162  .0000224  2.0021 0.0189  I    -2.489     .885     1.955     .198   .228000   .265000   .3765000      .000      .000  
+851121 46390.00 I   .227857  .000540   .260599  .000583  I  .3752469  .0000307  2.1213 0.0225  I    -2.672     .885     2.339     .198   .228000   .262000   .3746000      .000      .000  
+851122 46391.00 I   .228289  .000539   .258093  .000578  I  .3731068  .0000390  2.1408 0.0246  I    -2.886     .885     2.792     .198   .227000   .260000   .3726000      .000      .000  
+851123 46392.00 I   .228513  .000559   .255777  .000457  I  .3709919  .0000385  2.0806 0.0268  I    -3.109     .761     3.227     .270   .227000   .257000   .3705000      .000      .000  
+851124 46393.00 I   .228522  .000309   .253611  .000305  I  .3689618  .0000367  1.9718 0.0266  I    -3.346     .654     3.575     .307   .226000   .255000   .3686000      .000      .000  
+851125 46394.00 I   .228351  .000309   .251535  .000305  I  .3670608  .0000368  1.8255 0.0574  I    -3.396     .491     3.770     .317   .226000   .252000   .3667000      .000      .000  
+851126 46395.00 I   .228034  .000506   .249492  .000456  I  .3653185  .0001087  1.6560 0.0453  I    -3.139     .426     3.674     .367   .225000   .250000   .3650000      .000      .000  
+851127 46396.00 I   .227578  .000642   .247438  .000422  I  .3637506  .0000827  1.4810 0.0581  I    -2.705     .426     3.317     .367   .225000   .247000   .3635000      .000      .000  
+851128 46397.00 I   .226974  .000593   .245348  .000553  I  .3623496  .0000413  1.3267 0.0487  I    -2.239     .364     2.914     .291   .224000   .245000   .3622000      .000      .000  
+851129 46398.00 I   .226214  .000534   .243204  .000602  I  .3610822  .0000514  1.2175 0.0386  I    -1.746     .195     2.650     .298   .224000   .243000   .3609000      .000      .000  
+851130 46399.00 I   .225289  .000686   .240987  .000554  I  .3598928  .0000653  1.1738 0.0429  I    -1.217     .195     2.540     .298   .223000   .240000   .3598000      .000      .000  
+8512 1 46400.00 I   .224203  .000686   .238690  .000554  I  .3587090  .0000687  1.2070 0.0454  I     -.735     .195     2.506     .298   .222000   .238000   .3586000      .000      .000  
+8512 2 46401.00 I   .222985  .000686   .236330  .000572  I  .3574534  .0000630  1.3164 0.0463  I     -.370     .195     2.514     .298   .222000   .235000   .3574000      .000      .000  
+8512 3 46402.00 I   .221664  .000963   .233938  .000528  I  .3560531  .0000620  1.4950 0.0466  I     -.163     .461     2.592     .114   .221000   .233000   .3560000      .000      .000  
+8512 4 46403.00 I   .220295  .001076   .231542  .000402  I  .3544448  .0000686  1.7292 0.0485  I     -.158     .551     2.724     .143   .220000   .231000   .3544000      .000      .000  
+8512 5 46404.00 I   .218965  .000978   .229164  .000369  I  .3525858  .0000746  1.9899 0.0481  I     -.361     .551     2.828     .143   .219000   .228000   .3526000      .000      .000  
+8512 6 46405.00 I   .217750  .000994   .226823  .000388  I  .3504737  .0000675  2.2243 0.0477  I     -.703     .551     2.892     .143   .219000   .226000   .3505000      .000      .000  
+8512 7 46406.00 I   .216636  .000992   .224519  .000391  I  .3481682  .0000595  2.3656 0.0438  I    -1.141     .551     3.029     .143   .218000   .224000   .3482000      .000      .000  
+8512 8 46407.00 I   .215563  .000910   .222242  .000435  I  .3457903  .0000557  2.3634 0.0417  I    -1.720     .611     3.297     .305   .217000   .221000   .3459000      .000      .000  
+8512 9 46408.00 I   .214475  .000550   .219989  .000409  I  .3434927  .0000583  2.2071 0.0413  I    -2.431     .665     3.548     .407   .216000   .219000   .3436000      .000      .000  
+851210 46409.00 I   .213331  .000550   .217755  .000409  I  .3414142  .0000609  1.9365 0.0407  I    -3.044     .665     3.586     .407   .215000   .217000   .3416000      .000      .000  
+851211 46410.00 I   .212100  .000532   .215538  .000403  I  .3396322  .0000567  1.6286 0.0420  I    -3.266     .665     3.442     .407   .215000   .215000   .3398000      .000      .000  
+851212 46411.00 I   .210811  .000515   .213345  .000434  I  .3381405  .0000578  1.3703 0.0387  I    -3.079     .665     3.334     .407   .214000   .213000   .3383000      .000      .000  
+851213 46412.00 I   .209523  .001023   .211181  .000403  I  .3368527  .0000527  1.2289 0.0414  I    -2.738     .479     3.366     .296   .212000   .211000   .3371000      .000      .000  
+851214 46413.00 I   .208303  .001161   .209052  .000319  I  .3356368  .0000593  1.2253 0.0406  I    -2.413     .132     3.390     .298   .211000   .208000   .3358000      .000      .000  
+851215 46414.00 I   .207217  .001156   .206963  .000635  I  .3343657  .0000617  1.3309 0.0426  I    -2.045     .132     3.257     .298   .210000   .206000   .3345000      .000      .000  
+851216 46415.00 I   .206324  .001156   .204913  .000635  I  .3329571  .0000613  1.4902 0.0431  I    -1.605     .132     3.081     .298   .209000   .204000   .3331000      .000      .000  
+851217 46416.00 I   .205587  .001105   .202891  .000565  I  .3313867  .0000603  1.6451 0.0409  I    -1.270     .132     3.127     .298   .208000   .202000   .3315000      .000      .000  
+851218 46417.00 I   .204918  .000955   .200878  .000926  I  .3296829  .0000541  1.7518 0.0423  I    -1.220     .791     3.430     .261   .207000   .200000   .3297000      .000      .000  
+851219 46418.00 I   .204245  .000571   .198834  .001048  I  .3279056  .0000592  1.7908 0.0410  I    -1.390     .791     3.731     .356   .206000   .198000   .3279000      .000      .000  
+851220 46419.00 I   .203505  .000571   .196704  .001048  I  .3261229  .0000617  1.7649 0.0423  I    -1.570     .791     3.809     .356   .205000   .196000   .3261000      .000      .000  
+851221 46420.00 I   .202651  .000561   .194441  .001030  I  .3243953  .0000603  1.6805 0.0426  I    -1.641     .791     3.722     .356   .203000   .194000   .3244000      .000      .000  
+851222 46421.00 I   .201682  .000561   .192067  .001030  I  .3227800  .0000587  1.5419 0.0388  I    -1.586     .791     3.656     .356   .202000   .192000   .3228000      .000      .000  
+851223 46422.00 I   .200599  .000491   .189640  .001141  I  .3213244  .0000490  1.3648 0.0547  I    -1.409     .791     3.653     .356   .201000   .190000   .3213000      .000      .000  
+851224 46423.00 I   .199401  .000472   .187217  .001061  I  .3200557  .0000924  1.1720 0.0475  I    -1.159     .791     3.596     .298   .199000   .188000   .3201000      .000      .000  
+851225 46424.00 I   .198074  .000472   .184830  .001061  I  .3189776  .0000813  0.9877 0.0535  I     -.970     .791     3.410     .298   .198000   .186000   .3191000      .000      .000  
+851226 46425.00 I   .196602  .000635   .182503  .000870  I  .3180691  .0000540  0.8371 0.0565  I     -.918     .791     3.190     .298   .196000   .184000   .3182000      .000      .000  
+851227 46426.00 I   .194969  .000648   .180259  .000787  I  .3172844  .0000786  0.7436 0.0373  I     -.892     .791     3.094     .298   .195000   .182000   .3174000      .000      .000  
+851228 46427.00 I   .193183  .000748   .178098  .000734  I  .3165573  .0000516  0.7238 0.0470  I     -.713     .329     3.174     .102   .193000   .180000   .3167000      .000      .000  
+851229 46428.00 I   .191268  .000748   .176008  .000734  I  .3158105  .0000516  0.7828 0.0356  I     -.363     .329     3.344     .102   .192000   .178000   .3159000      .000      .000  
+851230 46429.00 I   .189274  .000752   .173979  .000740  I  .3149682  .0000491  0.9123 0.0356  I     -.003     .329     3.484     .102   .190000   .176000   .3150000      .000      .000  
+851231 46430.00 I   .187278  .000752   .172001  .000740  I  .3139669  .0000492  1.0989 0.0348  I      .207     .329     3.534     .102   .188000   .174000   .3139000      .000      .000  
+86 1 1 46431.00 I   .185312  .000642   .170079  .000696  I  .3127601  .0000493  1.3163 0.0346  I      .236     .329     3.517     .102   .187000   .172000   .3126000      .000      .000  
+86 1 2 46432.00 I   .183379  .000595   .168223  .000660  I  .3113387  .0000486  1.5204 0.0433  I      .156     .414     3.491     .298   .185000   .170000   .3111000      .000      .000  
+86 1 3 46433.00 I   .181454  .000475   .166418  .000631  I  .3097389  .0000712  1.6656 0.0453  I      .041     .484     3.521     .298   .183000   .169000   .3094000      .000      .000  
+86 1 4 46434.00 I   .179503  .000475   .164642  .000631  I  .3080397  .0000765  1.7141 0.0523  I     -.089     .484     3.653     .298   .181000   .167000   .3076000      .000      .000  
+86 1 5 46435.00 I   .177500  .000370   .162872  .000611  I  .3063498  .0000767  1.6452 0.0530  I     -.269     .484     3.862     .298   .179000   .165000   .3058000      .000      .000  
+86 1 6 46436.00 I   .175449  .000429   .161098  .000572  I  .3047858  .0000735  1.4668 0.0505  I     -.522     .484     4.033     .298   .177000   .163000   .3042000      .000      .000  
+86 1 7 46437.00 I   .173353  .000327   .159317  .000634  I  .3034362  .0000656  1.2284 0.0574  I     -.722     .705     4.047     .191   .175000   .161000   .3028000      .000      .000  
+86 1 8 46438.00 I   .171218  .000280   .157523  .000652  I  .3023221  .0000882  1.0106 0.0432  I     -.672     .847     3.930     .260   .173000   .159000   .3017000      .000      .000  
+86 1 9 46439.00 I   .169057  .000280   .155692  .000652  I  .3013826  .0000563  0.8898 0.0485  I     -.314     .847     3.872     .260   .171000   .157000   .3008000      .000      .000  
+86 110 46440.00 I   .166891  .000280   .153788  .000652  I  .3004973  .0000405  0.9045 0.0361  I      .206     .847     4.034     .260   .169000   .155000   .2999000      .000      .000  
+86 111 46441.00 I   .164758  .000342   .151817  .000543  I  .2995308  .0000452  1.0476 0.0311  I      .543     .847     4.165     .260   .168000   .153000   .2990000      .000      .000  
+86 112 46442.00 I   .162690  .000556   .149796  .000624  I  .2983744  .0000473  1.2737 0.0436  I      .604     .739     4.065     .209   .165000   .151000   .2979000      .000      .000  
+86 113 46443.00 I   .160722  .000631   .147740  .000382  I  .2969782  .0000746  1.5156 0.0453  I      .507     .635     3.896     .154   .164000   .149000   .2966000      .000      .000  
+86 114 46444.00 I   .158878  .000714   .145663  .000459  I  .2953575  .0000773  1.7148 0.0568  I      .243     .468     3.916     .102   .161000   .147000   .2950000      .000      .000  
+86 115 46445.00 I   .157141  .000714   .143587  .000459  I  .2935775  .0000856  1.8272 0.0564  I     -.189     .468     4.236     .102   .159000   .145000   .2933000      .000      .000  
+86 116 46446.00 I   .155372  .000837   .141583  .000474  I  .2917394  .0000821  1.8306 0.0583  I     -.755     .468     4.589     .102   .157000   .144000   .2916000      .000      .000  
+86 117 46447.00 I   .153408  .000752   .139731  .000382  I  .2899452  .0000791  1.7471 0.0667  I    -1.339     .710     4.650     .298   .155000   .142000   .2898000      .000      .000  
+86 118 46448.00 I   .151200  .000744   .138054  .000278  I  .2882630  .0001051  1.6100 0.0653  I    -1.765     .699     4.474     .298   .153000   .141000   .2882000      .000      .000  
+86 119 46449.00 I   .148727  .000744   .136557  .000278  I  .2867365  .0001040  1.4390 0.0699  I    -1.930     .699     4.317     .298   .150000   .139000   .2867000      .000      .000  
+86 120 46450.00 I   .145986  .000897   .135246  .000254  I  .2853861  .0000922  1.2646 0.0627  I    -1.808     .792     4.296     .298   .148000   .137000   .2853000      .000      .000  
+86 121 46451.00 I   .143091  .000835   .134110  .000250  I  .2842001  .0000702  1.1117 0.0545  I    -1.489     .792     4.257     .298   .145000   .136000   .2842000      .000      .000  
+86 122 46452.00 I   .140167  .000798   .133107  .000350  I  .2831507  .0000581  0.9948 0.0466  I    -1.131     .619     4.052     .103   .142000   .135000   .2831000      .000      .000  
+86 123 46453.00 I   .137314  .000566   .132188  .000310  I  .2821915  .0000612  0.9348 0.0338  I     -.855     .129     3.712     .127   .140000   .133000   .2822000      .000      .000  
+86 124 46454.00 I   .134567  .000745   .131298  .000505  I  .2812568  .0000345  0.9478 0.0355  I     -.630     .149     3.382     .149   .137000   .132000   .2813000      .000      .000  
+86 125 46455.00 I   .131939  .000745   .130388  .000505  I  .2802680  .0000358  1.0444 0.0247  I     -.308     .149     3.167     .149   .134000   .131000   .2803000      .000      .000  
+86 126 46456.00 I   .129401  .000490   .129446  .000538  I  .2791405  .0000354  1.2236 0.0262  I      .160     .149     3.094     .149   .131000   .130000   .2793000      .000      .000  
+86 127 46457.00 I   .126889  .000501   .128481  .000637  I  .2777997  .0000383  1.4662 0.0295  I      .659     .426     3.108     .188   .128000   .128000   .2780000      .000      .000  
+86 128 46458.00 I   .124344  .000561   .127502  .000644  I  .2761995  .0000473  1.7345 0.0302  I     1.007     .542     3.158     .242   .125000   .127000   .2764000      .000      .000  
+86 129 46459.00 I   .121701  .000561   .126519  .000644  I  .2743377  .0000467  1.9818 0.0401  I     1.077     .542     3.280     .242   .122000   .126000   .2747000      .000      .000  
+86 130 46460.00 I   .118895  .000561   .125549  .000644  I  .2722597  .0000648  2.1578 0.0367  I      .840     .542     3.564     .242   .119000   .125000   .2727000      .000      .000  
+86 131 46461.00 I   .115908  .000521   .124658  .000619  I  .2700604  .0000566  2.2188 0.0399  I      .484     .542     3.764     .242   .116000   .124000   .2707000      .000      .000  
+86 2 1 46462.00 I   .112821  .000486   .123850  .000563  I  .2678653  .0000466  2.1502 0.0366  I      .107     .634     3.821     .249   .113000   .124000   .2686000      .000      .000  
+86 2 2 46463.00 I   .109714  .000475   .123099  .000433  I  .2657978  .0000465  1.9684 0.0338  I     -.289     .612     3.821     .239   .111000   .123000   .2668000      .000      .000  
+86 2 3 46464.00 I   .106661  .000394   .122378  .000463  I  .2639515  .0000490  1.7177 0.0360  I     -.711     .658     3.812     .222   .108000   .122000   .2651000      .000      .000  
+86 2 4 46465.00 I   .103734  .000398   .121667  .000452  I  .2623630  .0000550  1.4651 0.0326  I    -1.141     .658     3.826     .222   .105000   .122000   .2636000      .000      .000  
+86 2 5 46466.00 I   .100944  .000411   .121002  .000439  I  .2609992  .0000429  1.2787 0.0341  I    -1.376     .658     3.744     .222   .103000   .121000   .2624000      .000      .000  
+86 2 6 46467.00 I   .098291  .000439   .120373  .000502  I  .2597681  .0000403  1.2048 0.0325  I    -1.344     .531     3.558     .227   .100000   .121000   .2612000      .000      .000  
+86 2 7 46468.00 I   .095777  .000398   .119754  .000407  I  .2585474  .0000489  1.2574 0.0334  I    -1.119     .307     3.376     .203   .098000   .120000   .2600000      .000      .000  
+86 2 8 46469.00 I   .093387  .000515   .119115  .000614  I  .2572194  .0000532  1.4117 0.0364  I     -.767     .246     3.265     .234   .095000   .120000   .2587000      .000      .000  
+86 2 9 46470.00 I   .091103  .000565   .118430  .000633  I  .2557082  .0000538  1.6136 0.0344  I     -.320     .246     3.233     .234   .093000   .120000   .2571000      .000      .000  
+86 210 46471.00 I   .088893  .000544   .117719  .000601  I  .2539971  .0000436  1.8010 0.0334  I      .158     .246     3.270     .234   .091000   .119000   .2554000      .000      .000  
+86 211 46472.00 I   .086712  .000525   .117033  .000610  I  .2521272  .0000395  1.9254 0.0313  I      .523     .554     3.368     .221   .088000   .119000   .2535000      .000      .000  
+86 212 46473.00 I   .084518  .000536   .116424  .000566  I  .2501744  .0000448  1.9656 0.0329  I      .624     .744     3.479     .208   .086000   .119000   .2515000      .000      .000  
+86 213 46474.00 I   .082279  .000536   .115931  .000566  I  .2482237  .0000527  1.9227 0.0346  I      .422     .744     3.518     .208   .084000   .119000   .2495000      .000      .000  
+86 214 46475.00 I   .080014  .000536   .115531  .000566  I  .2463535  .0000527  1.8064 0.0381  I      .027     .744     3.457     .208   .081000   .119000   .2477000      .000      .000  
+86 215 46476.00 I   .077728  .000570   .115215  .000558  I  .2446300  .0000551  1.6327 0.0346  I     -.355     .744     3.380     .208   .079000   .118000   .2459000      .000      .000  
+86 216 46477.00 I   .075396  .000468   .114980  .000587  I  .2431000  .0000448  1.4234 0.0381  I     -.552     .867     3.389     .211   .076000   .118000   .2443000      .000      .000  
+86 217 46478.00 I   .072972  .000541   .114814  .000613  I  .2417861  .0000526  1.2054 0.0359  I     -.499     .976     3.459     .215   .074000   .118000   .2430000      .000      .000  
+86 218 46479.00 I   .070407  .000508   .114705  .000594  I  .2406830  .0000562  1.0058 0.0365  I     -.228     .976     3.437     .215   .072000   .118000   .2417000      .000      .000  
+86 219 46480.00 I   .067671  .000508   .114639  .000594  I  .2397571  .0000506  0.8583 0.0409  I      .166     .976     3.206     .215   .069000   .118000   .2406000      .000      .000  
+86 220 46481.00 I   .064784  .000612   .114612  .000574  I  .2389393  .0000594  0.7920 0.0356  I      .536     .976     2.825     .215   .066000   .118000   .2395000      .000      .000  
+86 221 46482.00 I   .061769  .000568   .114632  .000532  I  .2381421  .0000500  0.8186 0.0416  I      .759     .844     2.450     .170   .063000   .118000   .2385000      .000      .000  
+86 222 46483.00 I   .058642  .000530   .114705  .000354  I  .2372709  .0000583  0.9387 0.0382  I      .824     .687     2.201     .109   .060000   .118000   .2373000      .000      .000  
+86 223 46484.00 I   .055401  .000530   .114826  .000354  I  .2362378  .0000578  1.1395 0.0419  I      .838     .687     2.122     .109   .057000   .118000   .2360000      .000      .000  
+86 224 46485.00 I   .052054  .000498   .114988  .000325  I  .2349740  .0000601  1.3941 0.0402  I      .924     .687     2.206     .109   .054000   .118000   .2346000      .000      .000  
+86 225 46486.00 I   .048662  .000454   .115180  .000304  I  .2334475  .0000558  1.6549 0.0388  I     1.083     .687     2.375     .109   .051000   .118000   .2330000      .000      .000  
+86 226 46487.00 I   .045283  .000569   .115387  .000537  I  .2316829  .0000492  1.8595 0.0487  I     1.159     .643     2.525     .119   .048000   .118000   .2312000      .000      .000  
+86 227 46488.00 I   .041965  .000518   .115589  .000746  I  .2297646  .0000798  1.9558 0.0462  I      .987     .595     2.592     .128   .045000   .118000   .2292000      .000      .000  
+86 228 46489.00 I   .038757  .000544   .115766  .000792  I  .2278141  .0000781  1.9237 0.0571  I      .571     .595     2.581     .128   .042000   .118000   .2273000      .000      .000  
+86 3 1 46490.00 I   .035706  .000544   .115906  .000792  I  .2259578  .0000817  1.7698 0.0542  I      .096     .595     2.537     .128   .039000   .118000   .2255000      .000      .000  
+86 3 2 46491.00 I   .032791  .000758   .116044  .000781  I  .2243030  .0000751  1.5303 0.0517  I     -.230     .595     2.493     .128   .036000   .118000   .2239000      .000      .000  
+86 3 3 46492.00 I   .029953  .000634   .116217  .000748  I  .2229021  .0000634  1.2763 0.0536  I     -.313     .435     2.454     .298   .032000   .118000   .2226000      .000      .000  
+86 3 4 46493.00 I   .027128  .000616   .116443  .000749  I  .2217315  .0000766  1.0792 0.0397  I     -.187     .156     2.396     .298   .029000   .118000   .2216000      .000      .000  
+86 3 5 46494.00 I   .024253  .000639   .116739  .000623  I  .2207104  .0000478  0.9819 0.0548  I      .069     .156     2.293     .298   .026000   .118000   .2206000      .000      .000  
+86 3 6 46495.00 I   .021283  .000639   .117115  .000623  I  .2197275  .0000783  1.0051 0.0422  I      .386     .156     2.137     .298   .023000   .119000   .2197000      .000      .000  
+86 3 7 46496.00 I   .018245  .000581   .117561  .000557  I  .2186638  .0000696  1.1375 0.0508  I      .708     .156     1.968     .298   .020000   .119000   .2187000      .000      .000  
+86 3 8 46497.00 I   .015184  .000586   .118063  .000673  I  .2174311  .0000648  1.3341 0.0530  I      .981     .356     1.875     .168   .017000   .119000   .2175000      .000      .000  
+86 3 9 46498.00 I   .012129  .000489   .118590  .000678  I  .2159936  .0000799  1.5367 0.0500  I     1.169     .478     1.943     .237   .015000   .119000   .2161000      .000      .000  
+86 310 46499.00 I   .009097  .000632   .119104  .000677  I  .2143741  .0000762  1.6902 0.0598  I     1.282     .478     2.192     .237   .012000   .120000   .2145000      .000      .000  
+86 311 46500.00 I   .006107  .000708   .119568  .000741  I  .2126434  .0000890  1.7533 0.0515  I     1.367     .476     2.551     .222   .009000   .120000   .2128000      .000      .000  
+86 312 46501.00 I   .003162  .000685   .119982  .000721  I  .2109038  .0000694  1.7076 0.0552  I     1.453     .576     2.825     .209   .006000   .121000   .2111000      .000      .000  
+86 313 46502.00 I   .000266  .000709   .120366  .000701  I  .2092616  .0000653  1.5617 0.0528  I     1.529     .555     2.810     .278   .004000   .121000   .2095000      .000      .000  
+86 314 46503.00 I  -.002553  .000816   .120732  .000679  I  .2078046  .0000797  1.3431 0.0530  I     1.595     .590     2.444     .298   .001000   .121000   .2081000      .000      .000  
+86 315 46504.00 I  -.005233  .000792   .121082  .000853  I  .2065820  .0000834  1.1047 0.0575  I     1.577     .590     2.029     .298  -.002000   .122000   .2068000      .000      .000  
+86 316 46505.00 I  -.007745  .000792   .121426  .000853  I  .2055882  .0000828  0.8872 0.0588  I     1.638     .590     1.785     .298  -.004000   .123000   .2057000      .000      .000  
+86 317 46506.00 I  -.010088  .000697   .121808  .000841  I  .2047961  .0000828  0.7043 0.0509  I     1.906     .623     1.663     .325  -.007000   .123000   .2048000      .000      .000  
+86 318 46507.00 I  -.012282  .000481   .122274  .000853  I  .2041610  .0000592  0.5773 0.0517  I     2.331     .610     1.526     .311  -.009000   .124000   .2041000      .000      .000  
+86 319 46508.00 I  -.014357  .000340   .122843  .000967  I  .2036164  .0000618  0.5255 0.0453  I     2.858     .694     1.326     .232  -.011000   .124000   .2034000      .000      .000  
+86 320 46509.00 I  -.016346  .000455   .123521  .001003  I  .2030807  .0000687  0.5617 0.0467  I     3.406     .694     1.150     .232  -.014000   .125000   .2028000      .000      .000  
+86 321 46510.00 I  -.018278  .000485   .124312  .000913  I  .2024589  .0000699  0.7004 0.0451  I     3.784     .694     1.080     .232  -.016000   .126000   .2021000      .000      .000  
+86 322 46511.00 I  -.020183  .000664   .125208  .000806  I  .2016446  .0000584  0.9450 0.0471  I     3.803     .694     1.080     .232  -.018000   .127000   .2012000      .000      .000  
+86 323 46512.00 I  -.022093  .000562   .126208  .000746  I  .2005405  .0000632  1.2746 0.0446  I     3.525     .568     1.087     .168  -.021000   .128000   .2001000      .000      .000  
+86 324 46513.00 I  -.024062  .000663   .127293  .000681  I  .1990832  .0000674  1.6406 0.0461  I     3.267     .404     1.146     .298  -.023000   .129000   .1987000      .000      .000  
+86 325 46514.00 I  -.026177  .000663   .128425  .000681  I  .1972693  .0000671  1.9767 0.0458  I     3.229     .404     1.327     .298  -.025000   .130000   .1970000      .000      .000  
+86 326 46515.00 I  -.028501  .000612   .129563  .000559  I  .1951654  .0000619  2.2062 0.0463  I     3.234     .404     1.550     .298  -.027000   .131000   .1950000      .000      .000  
+86 327 46516.00 I  -.030986  .000551   .130692  .000460  I  .1929143  .0000637  2.2636 0.0443  I     2.965    1.057     1.619     .361  -.030000   .132000   .1930000      .000      .000  
+86 328 46517.00 I  -.033545  .000551   .131826  .000460  I  .1906985  .0000635  2.1401 0.0481  I     2.404    1.057     1.416     .361  -.032000   .134000   .1910000      .000      .000  
+86 329 46518.00 I  -.036090  .000432   .132981  .000340  I  .1886785  .0000722  1.8834 0.0508  I     1.896    1.439     1.028     .507  -.034000   .135000   .1892000      .000      .000  
+86 330 46519.00 I  -.038555  .000707   .134187  .000967  I  .1869491  .0000794  1.5745 0.0537  I     1.779    1.439      .660     .507  -.036000   .136000   .1878000      .000      .000  
+86 331 46520.00 I  -.040914  .000707   .135472  .000967  I  .1855148  .0000795  1.3096 0.0519  I     2.070    1.184      .432     .427  -.039000   .137000   .1865000      .000      .000  
+86 4 1 46521.00 I  -.043172  .000851   .136853  .000919  I  .1842927  .0000669  1.1563 0.0457  I     2.538    1.184      .328     .427  -.041000   .139000   .1854000      .000      .000  
+86 4 2 46522.00 I  -.045336  .000693   .138344  .000839  I  .1831580  .0000452  1.1357 0.0392  I     2.972     .799      .287     .307  -.043000   .140000   .1844000      .000      .000  
+86 4 3 46523.00 I  -.047454  .000739   .139934  .000889  I  .1819794  .0000407  1.2407 0.0303  I     3.279     .835      .268     .271  -.045000   .141000   .1832000      .000      .000  
+86 4 4 46524.00 I  -.049568  .000739   .141566  .000889  I  .1806466  .0000403  1.4357 0.0261  I     3.407     .835      .246     .271  -.047000   .143000   .1819000      .000      .000  
+86 4 5 46525.00 I  -.051700  .000666   .143185  .000878  I  .1790974  .0000328  1.6626 0.0241  I     3.293     .835      .228     .271  -.049000   .145000   .1803000      .000      .000  
+86 4 6 46526.00 I  -.053825  .000585   .144820  .000591  I  .1773314  .0000265  1.8596 0.0217  I     3.190     .960      .304     .308  -.051000   .146000   .1785000      .000      .000  
+86 4 7 46527.00 I  -.055874  .000509   .146521  .000656  I  .1754022  .0000283  1.9847 0.0189  I     3.276    1.193      .545     .235  -.053000   .148000   .1766000      .000      .000  
+86 4 8 46528.00 I  -.057773  .000441   .148339  .000558  I  .1733924  .0000270  2.0188 0.0217  I     3.503    1.292      .891     .112  -.055000   .150000   .1745000      .000      .000  
+86 4 9 46529.00 I  -.059477  .000481   .150309  .000655  I  .1713959  .0000329  1.9590 0.0251  I     3.852    1.388     1.175     .127  -.057000   .152000   .1725000      .000      .000  
+86 410 46530.00 I  -.060969  .000456   .152445  .000737  I  .1694985  .0000423  1.8268 0.0242  I     4.223    1.388     1.239     .127  -.059000   .154000   .1705000      .000      .000  
+86 411 46531.00 I  -.062290  .000459   .154704  .000682  I  .1677555  .0000355  1.6550 0.0274  I     4.511    1.388     1.075     .127  -.060000   .155000   .1687000      .000      .000  
+86 412 46532.00 I  -.063503  .000407   .157021  .000599  I  .1661917  .0000348  1.4737 0.0297  I     4.699    1.073      .844     .125  -.062000   .157000   .1671000      .000      .000  
+86 413 46533.00 I  -.064673  .000372   .159335  .000491  I  .1648015  .0000476  1.3121 0.0296  I     4.841     .106      .702     .123  -.064000   .159000   .1656000      .000      .000  
+86 414 46534.00 I  -.065863  .000384   .161602  .000515  I  .1635526  .0000480  1.1952 0.0338  I     4.954     .106      .624     .123  -.065000   .161000   .1643000      .000      .000  
+86 415 46535.00 I  -.067116  .000384   .163798  .000515  I  .1623914  .0000479  1.1375 0.0327  I     5.009     .106      .471     .123  -.067000   .163000   .1631000      .000      .000  
+86 416 46536.00 I  -.068423  .000363   .165915  .000232  I  .1612565  .0000443  1.1430 0.0342  I     5.081     .106      .213     .123  -.068000   .165000   .1619000      .000      .000  
+86 417 46537.00 I  -.069777  .000392   .167954  .000305  I  .1600837  .0000487  1.2136 0.0417  I     5.290     .147     -.016     .104  -.070000   .167000   .1607000      .000      .000  
+86 418 46538.00 I  -.071187  .000382   .169929  .000403  I  .1588076  .0000707  1.3492 0.0406  I     5.558     .179     -.121     .298  -.071000   .169000   .1594000      .000      .000  
+86 419 46539.00 I  -.072663  .000355   .171851  .000390  I  .1573670  .0000649  1.5398 0.0569  I     5.616     .179     -.211     .298  -.072000   .171000   .1579000      .000      .000  
+86 420 46540.00 I  -.074202  .000402   .173729  .000365  I  .1557132  .0000893  1.7749 0.0496  I     5.386     .179     -.414     .298  -.074000   .173000   .1562000      .000      .000  
+86 421 46541.00 I  -.075759  .000378   .175573  .000358  I  .1538128  .0000749  2.0234 0.0544  I     5.129     .179     -.609     .298  -.075000   .175000   .1541000      .000      .000  
+86 422 46542.00 I  -.077279  .000376   .177399  .000293  I  .1516836  .0000620  2.2204 0.0483  I     5.095     .338     -.507     .298  -.077000   .177000   .1519000      .000      .000  
+86 423 46543.00 I  -.078707  .000373   .179220  .000203  I  .1494123  .0000609  2.2967 0.0425  I     5.106     .443     -.038     .298  -.078000   .179000   .1495000      .000      .000  
+86 424 46544.00 I  -.080012  .000373   .181058  .000203  I  .1471433  .0000582  2.2138 0.0431  I     4.743     .443      .507     .298  -.079000   .181000   .1471000      .000      .000  
+86 425 46545.00 I  -.081171  .000373   .182934  .000203  I  .1450321  .0000611  1.9888 0.0322  I     3.941     .443      .786     .298  -.081000   .183000   .1449000      .000      .000  
+86 426 46546.00 I  -.082168  .000382   .184865  .000186  I  .1431903  .0000274  1.6900 0.0330  I     3.160     .443      .733     .298  -.082000   .185000   .1430000      .000      .000  
+86 427 46547.00 I  -.083015  .000386   .186866  .000483  I  .1416451  .0000251  1.4121 0.0210  I     2.866     .692      .546     .298  -.083000   .187000   .1414000      .000      .000  
+86 428 46548.00 I  -.083728  .000445   .188951  .000576  I  .1403312  .0000319  1.2389 0.0203  I     3.089     .872      .386     .298  -.084000   .189000   .1400000      .000      .000  
+86 429 46549.00 I  -.084328  .000445   .191137  .000576  I  .1391180  .0000319  1.2135 0.0212  I     3.553     .872      .224     .298  -.085000   .191000   .1388000      .000      .000  
+86 430 46550.00 I  -.084841  .000455   .193434  .000834  I  .1378587  .0000278  1.3246 0.0203  I     4.032     .872     -.009     .298  -.086000   .193000   .1376000      .000      .000  
+86 5 1 46551.00 I  -.085302  .000636   .195807  .000796  I  .1364402  .0000250  1.5216 0.0172  I     4.423     .784     -.239     .298  -.087000   .195000   .1362000      .000      .000  
+86 5 2 46552.00 I  -.085766  .000660   .198188  .000836  I  .1348073  .0000203  1.7433 0.0194  I     4.716     .709     -.359     .298  -.088000   .197000   .1346000      .000      .000  
+86 5 3 46553.00 I  -.086310  .000888   .200499  .000978  I  .1329628  .0000297  1.9374 0.0206  I     4.895     .496     -.350     .298  -.089000   .199000   .1328000      .000      .000  
+86 5 4 46554.00 I  -.087006  .001011   .202681  .001077  I  .1309539  .0000359  2.0672 0.0268  I     4.888     .496     -.240     .298  -.090000   .201000   .1309000      .000      .000  
+86 5 5 46555.00 I  -.087865  .000839   .204743  .000956  I  .1288565  .0000445  2.1128 0.0259  I     4.777     .496     -.085     .298  -.090000   .203000   .1289000      .000      .000  
+86 5 6 46556.00 I  -.088838  .000672   .206708  .000870  I  .1267570  .0000374  2.0722 0.0295  I     4.610     .496      .108     .298  -.091000   .205000   .1268000      .000      .000  
+86 5 7 46557.00 I  -.089873  .000225   .208598  .000224  I  .1247376  .0000388  1.9551 0.0275  I     4.468     .257      .263     .109  -.092000   .207000   .1248000      .000      .000  
+86 5 8 46558.00 I  -.090917  .000225   .210433  .000224  I  .1228653  .0000404  1.7824 0.0311  I     4.441     .791      .233     .134  -.092000   .210000   .1230000      .000      .000  
+86 5 9 46559.00 I  -.091923  .000225   .212232  .000224  I  .1211815  .0000486  1.5834 0.0306  I     4.507     .791     -.005     .134  -.093000   .212000   .1214000      .000      .000  
+86 510 46560.00 I  -.092849  .000225   .214013  .000224  I  .1196996  .0000461  1.3810 0.0305  I     4.574     .791     -.246     .134  -.094000   .214000   .1199000      .000      .000  
+86 511 46561.00 I  -.093688  .000275   .215808  .000204  I  .1184135  .0000370  1.1966 0.0366  I     4.600     .791     -.292     .134  -.094000   .216000   .1187000      .000      .000  
+86 512 46562.00 I  -.094451  .000623   .217648  .000550  I  .1172924  .0000569  1.0543 0.0384  I     4.567     .342     -.178     .262  -.095000   .218000   .1176000      .000      .000  
+86 513 46563.00 I  -.095149  .000771   .219567  .000658  I  .1162853  .0000673  0.9707 0.0443  I     4.458     .434     -.148     .375  -.095000   .221000   .1167000      .000      .000  
+86 514 46564.00 I  -.095796  .000726   .221597  .000626  I  .1153295  .0000679  0.9516 0.0443  I     4.353     .434     -.395     .375  -.096000   .223000   .1157000      .000      .000  
+86 515 46565.00 I  -.096430  .000617   .223764  .000699  I  .1143641  .0000575  0.9864 0.0446  I     4.420     .577     -.856     .313  -.096000   .225000   .1147000      .000      .000  
+86 516 46566.00 I  -.097129  .000617   .226072  .000699  I  .1133334  .0000578  1.0910 0.0421  I     4.631     .577     -.962     .313  -.097000   .227000   .1135000      .000      .000  
+86 517 46567.00 I  -.097864  .000627   .228443  .000700  I  .1121536  .0000616  1.2810 0.0477  I     4.761     .577     -.606     .313  -.097000   .229000   .1122000      .000      .000  
+86 518 46568.00 I  -.098581  .000702   .230775  .000824  I  .1107561  .0000760  1.5170 0.0463  I     4.713     .634     -.336     .287  -.098000   .232000   .1107000      .000      .000  
+86 519 46569.00 I  -.099267  .000362   .233012  .000701  I  .1091256  .0000692  1.7350 0.0547  I     4.612     .739     -.291     .193  -.098000   .234000   .1089000      .000      .000  
+86 520 46570.00 I  -.099946  .000418   .235158  .000780  I  .1073146  .0000787  1.8676 0.0537  I     4.623     .739     -.162     .193  -.099000   .236000   .1070000      .000      .000  
+86 521 46571.00 I  -.100619  .000345   .237225  .000474  I  .1054365  .0000821  1.8619 0.0557  I     4.658     .791      .222     .298  -.099000   .238000   .1051000      .000      .000  
+86 522 46572.00 I  -.101277  .000516   .239225  .000479  I  .1036423  .0000789  1.7018 0.0579  I     4.430     .292      .623     .411  -.100000   .240000   .1033000      .000      .000  
+86 523 46573.00 I  -.101901  .000508   .241178  .000515  I  .1020719  .0000816  1.4247 0.0564  I     3.913     .292      .668     .411  -.100000   .242000   .1018000      .000      .000  
+86 524 46574.00 I  -.102451  .000508   .243121  .000515  I  .1008047  .0000806  1.1122 0.0545  I     3.446     .292      .302     .411  -.100000   .244000   .1006000      .000      .000  
+86 525 46575.00 I  -.102876  .000508   .245094  .000515  I  .0998261  .0000723  0.8639 0.0492  I     3.318     .292     -.189     .411  -.101000   .246000   .0997000      .000      .000  
+86 526 46576.00 I  -.103160  .000430   .247103  .000351  I  .0990329  .0000565  0.7476 0.0438  I     3.503     .292     -.570     .411  -.102000   .248000   .0990000      .000      .000  
+86 527 46577.00 I  -.103325  .000412   .249134  .000348  I  .0982836  .0000493  0.7731 0.0427  I     3.748     .445     -.844     .373  -.102000   .250000   .0983000      .000      .000  
+86 528 46578.00 I  -.103399  .000294   .251173  .000337  I  .0974527  .0000640  0.9007 0.0359  I     3.846     .558    -1.049     .329  -.103000   .252000   .0976000      .000      .000  
+86 529 46579.00 I  -.103404  .000294   .253206  .000337  I  .0964718  .0000523  1.0595 0.0420  I     3.766     .558    -1.078     .329  -.103000   .253000   .0967000      .000      .000  
+86 530 46580.00 I  -.103346  .000294   .255218  .000337  I  .0953424  .0000545  1.1922 0.0370  I     3.622     .558     -.820     .329  -.103000   .255000   .0956000      .000      .000  
+86 531 46581.00 I  -.103243  .000340   .257218  .000427  I  .0941066  .0000523  1.2672 0.0335  I     3.537     .558     -.380     .329  -.104000   .257000   .0944000      .000      .000  
+86 6 1 46582.00 I  -.103123  .000329   .259234  .000478  I  .0928334  .0000390  1.2660 0.0381  I     3.595     .666      .001     .297  -.104000   .259000   .0932000      .000      .000  
+86 6 2 46583.00 I  -.103011  .000363   .261304  .000555  I  .0915998  .0000554  1.1893 0.0294  I     3.723     .760      .209     .260  -.104000   .261000   .0919000      .000      .000  
+86 6 3 46584.00 I  -.102934  .000361   .263462  .000531  I  .0904755  .0000439  1.0504 0.0354  I     3.703     .760      .326     .260  -.104000   .263000   .0908000      .000      .000  
+86 6 4 46585.00 I  -.102910  .000361   .265735  .000531  I  .0895140  .0000442  0.8663 0.0291  I     3.396     .760      .412     .260  -.104000   .265000   .0899000      .000      .000  
+86 6 5 46586.00 I  -.102914  .000325   .268094  .000538  I  .0887517  .0000383  0.6557 0.0257  I     2.922     .760      .368     .260  -.104000   .267000   .0891000      .000      .000  
+86 6 6 46587.00 I  -.102903  .000303   .270487  .000637  I  .0882035  .0000261  0.4423 0.0380  I     2.444     .541      .103     .354  -.103000   .269000   .0885000      .000      .000  
+86 6 7 46588.00 I  -.102833  .000277   .272860  .000635  I  .0878589  .0000657  0.2534 0.0409  I     1.995     .791     -.247     .427  -.103000   .271000   .0881000      .000      .000  
+86 6 8 46589.00 I  -.102660  .000277   .275152  .000635  I  .0876797  .0000776  0.1155 0.0515  I     1.551     .791     -.400     .427  -.102000   .274000   .0879000      .000      .000  
+86 6 9 46590.00 I  -.102342  .000308   .277314  .000691  I  .0876058  .0000793  0.0440 0.0558  I     1.124     .791     -.231     .427  -.101000   .276000   .0878000      .000      .000  
+86 610 46591.00 I  -.101845  .000295   .279349  .000590  I  .0875678  .0000801  0.0442 0.0536  I      .738     .791      .072     .427  -.100000   .278000   .0877000      .000      .000  
+86 611 46592.00 I  -.101155  .000745   .281292  .000608  I  .0874923  .0000721  0.1197 0.0682  I      .452     .352      .230     .389  -.100000   .280000   .0875000      .000      .000  
+86 612 46593.00 I  -.100277  .000891   .283176  .000502  I  .0873049  .0001104  0.2659 0.0766  I      .407     .412      .137     .318  -.099000   .282000   .0872000      .000      .000  
+86 613 46594.00 I  -.099225  .000948   .285031  .000543  I  .0869416  .0001352  0.4690 0.0864  I      .725     .412     -.181     .318  -.098000   .284000   .0867000      .000      .000  
+86 614 46595.00 I  -.098024  .000948   .286885  .000543  I  .0863563  .0001329  0.7039 0.0865  I     1.320     .412     -.729     .318  -.096000   .287000   .0859000      .000      .000  
+86 615 46596.00 I  -.096693  .000804   .288773  .000483  I  .0855339  .0001080  0.9385 0.0698  I     1.819     .537    -1.207     .412  -.095000   .289000   .0850000      .000      .000  
+86 616 46597.00 I  -.095276  .000468   .290712  .000299  I  .0844919  .0000425  1.1354 0.0582  I     1.940     .615    -1.369     .526  -.094000   .291000   .0838000      .000      .000  
+86 617 46598.00 I  -.093812  .000488   .292705  .000264  I  .0832929  .0000433  1.2429 0.0290  I     1.603     .601     -.949     .562  -.093000   .293000   .0826000      .000      .000  
+86 618 46599.00 I  -.092335  .000253   .294749  .000213  I  .0820471  .0000394  1.2274 0.0249  I      .806     .667      .112     .613  -.092000   .296000   .0814000      .000      .000  
+86 619 46600.00 I  -.090889  .000253   .296847  .000213  I  .0808817  .0000246  1.0809 0.0240  I     -.121     .667      .732     .613  -.090000   .298000   .0803000      .000      .000  
+86 620 46601.00 I  -.089542  .000276   .299006  .000219  I  .0799154  .0000275  0.8439 0.0183  I     -.865     .667      .731     .613  -.089000   .300000   .0794000      .000      .000  
+86 621 46602.00 I  -.088276  .000304   .301210  .000214  I  .0791929  .0000271  0.6097 0.0182  I    -1.169     .484      .461     .464  -.088000   .303000   .0788000      .000      .000  
+86 622 46603.00 I  -.087034  .000261   .303439  .000158  I  .0786670  .0000237  0.4625 0.0451  I     -.954     .129      .146     .187  -.087000   .305000   .0784000      .000      .000  
+86 623 46604.00 I  -.085751  .000473   .305684  .000297  I  .0782238  .0000861  0.4477 0.0466  I     -.436     .157     -.058     .298  -.085000   .307000   .0781000      .000      .000  
+86 624 46605.00 I  -.084370  .000482   .307936  .000555  I  .0777276  .0000901  0.5650 0.0586  I      .083     .157     -.227     .298  -.084000   .309000   .0777000      .000      .000  
+86 625 46606.00 I  -.082897  .000437   .310196  .000500  I  .0770662  .0000795  0.7650 0.0619  I      .416     .157     -.434     .298  -.083000   .311000   .0771000      .000      .000  
+86 626 46607.00 I  -.081352  .000387   .312466  .000695  I  .0761962  .0000850  0.9692 0.0674  I      .433     .340     -.528     .239  -.081000   .313000   .0762000      .000      .000  
+86 627 46608.00 I  -.079745  .000223   .314743  .000834  I  .0751471  .0001089  1.1157 0.0723  I      .037     .454     -.300     .336  -.080000   .316000   .0752000      .000      .000  
+86 628 46609.00 I  -.078095  .000337   .317015  .000862  I  .0739938  .0001171  1.1754 0.0766  I     -.667     .454      .201     .336  -.079000   .318000   .0740000      .000      .000  
+86 629 46610.00 I  -.076437  .000337   .319251  .000862  I  .0728272  .0001078  1.1426 0.0760  I    -1.368     .454      .677     .336  -.077000   .320000   .0728000      .000      .000  
+86 630 46611.00 I  -.074819  .000515   .321453  .000722  I  .0717335  .0000968  1.0352 0.0692  I    -1.836     .454      .896     .336  -.076000   .322000   .0717000      .000      .000  
+86 7 1 46612.00 I  -.073288  .000485   .323644  .000715  I  .0707726  .0000867  0.8803 0.0602  I    -2.137     .406      .909     .272  -.075000   .324000   .0707000      .000      .000  
+86 7 2 46613.00 I  -.071864  .000618   .325834  .000591  I  .0699821  .0000717  0.6979 0.0504  I    -2.431     .352      .853     .189  -.073000   .326000   .0699000      .000      .000  
+86 7 3 46614.00 I  -.070558  .000571   .328031  .000431  I  .0693782  .0000516  0.5115 0.0401  I    -2.703     .352      .686     .189  -.072000   .328000   .0693000      .000      .000  
+86 7 4 46615.00 I  -.069363  .000568   .330236  .000420  I  .0689524  .0000358  0.3452 0.0312  I    -2.815     .294      .256     .170  -.070000   .330000   .0689000      .000      .000  
+86 7 5 46616.00 I  -.068207  .000531   .332442  .000447  I  .0686737  .0000351  0.2210 0.0260  I    -2.748     .294     -.343     .170  -.069000   .332000   .0686000      .000      .000  
+86 7 6 46617.00 I  -.067004  .000402   .334648  .000425  I  .0684897  .0000376  0.1588 0.0268  I    -2.588     .305     -.765     .276  -.067000   .334000   .0684000      .000      .000  
+86 7 7 46618.00 I  -.065692  .000478   .336846  .000284  I  .0683299  .0000404  0.1751 0.0290  I    -2.382     .267     -.724     .324  -.066000   .336000   .0683000      .000      .000  
+86 7 8 46619.00 I  -.064318  .000478   .339016  .000284  I  .0681120  .0000442  0.2738 0.0300  I    -2.168     .267     -.355     .324  -.064000   .338000   .0681000      .000      .000  
+86 7 9 46620.00 I  -.062954  .000899   .341131  .000989  I  .0677608  .0000444  0.4369 0.0400  I    -2.023     .267     -.012     .324  -.063000   .340000   .0677000      .000      .000  
+86 710 46621.00 I  -.061644  .000820   .343144  .000973  I  .0672256  .0000666  0.6377 0.0394  I    -1.974     .320      .132     .378  -.061000   .342000   .0672000      .000      .000  
+86 711 46622.00 I  -.060394  .000826   .344996  .000934  I  .0664822  .0000652  0.8482 0.0482  I    -1.955     .498      .138     .262  -.060000   .344000   .0665000      .000      .000  
+86 712 46623.00 I  -.059201  .000921   .346626  .001008  I  .0655386  .0000698  1.0305 0.0475  I    -1.915     .589      .140     .127  -.058000   .346000   .0656000      .000      .000  
+86 713 46624.00 I  -.057992  .000905   .348012  .001004  I  .0644446  .0000690  1.1426 0.0489  I    -1.927     .589      .210     .127  -.056000   .348000   .0645000      .000      .000  
+86 714 46625.00 I  -.056638  .000905   .349195  .001004  I  .0632836  .0000685  1.1641 0.0470  I    -2.155     .589      .343     .127  -.054000   .350000   .0633000      .000      .000  
+86 715 46626.00 I  -.055124  .000455   .350248  .000640  I  .0621501  .0000639  1.0844 0.0462  I    -2.699     .519      .484     .135  -.053000   .351000   .0622000      .000      .000  
+86 716 46627.00 I  -.053477  .000449   .351247  .000655  I  .0611486  .0000619  0.9034 0.0393  I    -3.492     .486      .574     .161  -.051000   .353000   .0611000      .000      .000  
+86 717 46628.00 I  -.051711  .000343   .352262  .000696  I  .0603652  .0000458  0.6566 0.0417  I    -4.316     .353      .505     .189  -.049000   .354000   .0602000      .000      .000  
+86 718 46629.00 I  -.049825  .000343   .353364  .000696  I  .0598363  .0000560  0.4071 0.0364  I    -4.909     .353      .203     .189  -.047000   .356000   .0597000      .000      .000  
+86 719 46630.00 I  -.047823  .000337   .354603  .000725  I  .0595248  .0000566  0.2361 0.0375  I    -5.199     .353     -.040     .189  -.045000   .358000   .0593000      .000      .000  
+86 720 46631.00 I  -.045742  .000314   .355959  .000674  I  .0593177  .0000499  0.2042 0.0368  I    -5.252     .353     -.015     .189  -.043000   .359000   .0591000      .000      .000  
+86 721 46632.00 I  -.043634  .000447   .357389  .000576  I  .0590660  .0000471  0.3234 0.0363  I    -5.208     .824      .239     .228  -.042000   .360000   .0588000      .000      .000  
+86 722 46633.00 I  -.041552  .000504   .358849  .000394  I  .0586337  .0000527  0.5541 0.0352  I    -5.075    1.091      .470     .253  -.040000   .362000   .0584000      .000      .000  
+86 723 46634.00 I  -.039560  .000504   .360304  .000394  I  .0579461  .0000522  0.8198 0.0323  I    -4.673    1.330      .409     .241  -.038000   .363000   .0577000      .000      .000  
+86 724 46635.00 I  -.037728  .000341   .361725  .000391  I  .0570104  .0000374  1.0368 0.0309  I    -3.925    1.330      .028     .241  -.036000   .364000   .0568000      .000      .000  
+86 725 46636.00 I  -.036067  .000542   .363091  .000362  I  .0559092  .0000329  1.1439 0.0268  I    -3.423    1.164     -.284     .216  -.034000   .365000   .0558000      .000      .000  
+86 726 46637.00 I  -.034531  .000524   .364382  .000338  I  .0547645  .0000385  1.1252 0.0262  I    -3.883    1.015     -.189     .176  -.033000   .367000   .0547000      .000      .000  
+86 727 46638.00 I  -.033067  .000538   .365577  .000314  I  .0536947  .0000407  0.9987 0.0276  I    -5.065     .975      .139     .112  -.031000   .368000   .0536000      .000      .000  
+86 728 46639.00 I  -.031637  .000538   .366669  .000314  I  .0527888  .0000396  0.8070 0.0286  I    -6.121     .975      .350     .112  -.029000   .368000   .0527000      .000      .000  
+86 729 46640.00 I  -.030274  .000538   .367690  .000314  I  .0520890  .0000403  0.5904 0.0283  I    -6.605     .542      .482     .298  -.028000   .369000   .0520000      .000      .000  
+86 730 46641.00 I  -.028996  .000495   .368666  .000545  I  .0516086  .0000405  0.3719 0.0321  I    -6.661     .476      .679     .298  -.026000   .370000   .0515000      .000      .000  
+86 731 46642.00 I  -.027795  .000367   .369619  .000914  I  .0513373  .0000501  0.1771 0.0348  I    -6.537     .581      .890     .146  -.025000   .371000   .0511000      .000      .000  
+86 8 1 46643.00 I  -.026634  .000390   .370570  .001029  I  .0512372  .0000565  0.0338 0.0385  I    -6.350     .507      .876     .203  -.024000   .372000   .0509000      .000      .000  
+86 8 2 46644.00 I  -.025468  .000348   .371543  .001071  I  .0512451  .0000585 -0.0358 0.0406  I    -6.215     .507      .458     .203  -.022000   .372000   .0509000      .000      .000  
+86 8 3 46645.00 I  -.024242  .000334   .372545  .001074  I  .0512849  .0000583 -0.0336 0.0396  I    -6.247     .507     -.223     .203  -.021000   .373000   .0509000      .000      .000  
+86 8 4 46646.00 I  -.022891  .000315   .373498  .001009  I  .0512841  .0000533  0.0534 0.0384  I    -6.523     .507     -.616     .203  -.020000   .374000   .0508000      .000      .000  
+86 8 5 46647.00 I  -.021434  .000340   .374402  .000948  I  .0511452  .0000501  0.2392 0.0354  I    -6.937     .504     -.530     .178  -.019000   .375000   .0506000      .000      .000  
+86 8 6 46648.00 I  -.019918  .000366   .375285  .000653  I  .0507817  .0000467  0.4970 0.0325  I    -7.341     .369     -.184     .141  -.018000   .376000   .0502000      .000      .000  
+86 8 7 46649.00 I  -.018396  .000306   .376154  .000546  I  .0501389  .0000415  0.7916 0.0299  I    -7.655     .370      .158     .298  -.017000   .377000   .0496000      .000      .000  
+86 8 8 46650.00 I  -.016918  .000306   .377001  .000546  I  .0492042  .0000375  1.0690 0.0376  I    -7.769     .370      .353     .298  -.016000   .378000   .0487000      .000      .000  
+86 8 9 46651.00 I  -.015510  .000422   .377825  .000475  I  .0480271  .0000626  1.2678 0.0339  I    -7.657     .370      .451     .298  -.014000   .379000   .0476000      .000      .000  
+86 810 46652.00 I  -.014168  .000409   .378641  .000444  I  .0467073  .0000564  1.3504 0.0493  I    -7.410     .317      .569     .298  -.013000   .380000   .0464000      .000      .000  
+86 811 46653.00 I  -.012882  .000525   .379462  .000548  I  .0453699  .0000762  1.3023 0.0473  I    -7.225     .252      .745     .298  -.012000   .381000   .0452000      .000      .000  
+86 812 46654.00 I  -.011640  .000455   .380306  .000591  I  .0441420  .0000760  1.1363 0.0523  I    -7.301     .252      .902     .298  -.011000   .382000   .0440000      .000      .000  
+86 813 46655.00 I  -.010403  .000455   .381186  .000591  I  .0431236  .0000717  0.8913 0.0503  I    -7.673     .252      .923     .298  -.009000   .383000   .0430000      .000      .000  
+86 814 46656.00 I  -.009141  .000380   .382083  .000560  I  .0423668  .0000658  0.6239 0.0384  I    -8.099     .252      .758     .298  -.008000   .384000   .0423000      .000      .000  
+86 815 46657.00 I  -.007839  .000200   .382970  .000597  I  .0418592  .0000277  0.4061 0.0369  I    -8.275     .434      .462     .140  -.007000   .385000   .0419000      .000      .000  
+86 816 46658.00 I  -.006482  .000084   .383837  .000578  I  .0415167  .0000336  0.3019 0.0229  I    -8.092     .560      .162     .198  -.005000   .386000   .0415000      .000      .000  
+86 817 46659.00 I  -.005055  .000259   .384681  .000673  I  .0412078  .0000364  0.3404 0.0254  I    -7.676     .604     -.014     .174  -.004000   .387000   .0412000      .000      .000  
+86 818 46660.00 I  -.003544  .000287   .385493  .000660  I  .0407924  .0000381  0.5094 0.0255  I    -7.233     .604     -.032     .174  -.002000   .388000   .0407000      .000      .000  
+86 819 46661.00 I  -.001936  .000312   .386285  .000680  I  .0401629  .0000356  0.7566 0.0238  I    -7.009     .604      .056     .174   .000000   .389000   .0401000      .000      .000  
+86 820 46662.00 I  -.000222  .000346   .387076  .000622  I  .0392789  .0000284  1.0047 0.0258  I    -7.149     .908      .191     .147   .001000   .390000   .0391000      .000      .000  
+86 821 46663.00 I   .001602  .000431   .387884  .000692  I  .0381772  .0000374  1.1819 0.0257  I    -7.574    1.082      .310     .298   .003000   .391000   .0380000      .000      .000  
+86 822 46664.00 I   .003514  .000431   .388702  .000692  I  .0369529  .0000429  1.2458 0.0259  I    -8.197    1.082      .361     .298   .005000   .391000   .0368000      .000      .000  
+86 823 46665.00 I   .005484  .000369   .389514  .000555  I  .0357240  .0000359  1.1945 0.0261  I    -8.983    1.226      .266     .298   .006000   .392000   .0355000      .000      .000  
+86 824 46666.00 I   .007473  .000712   .390301  .000519  I  .0345931  .0000299  1.0557 0.0233  I    -9.754    1.336     -.003     .119   .008000   .393000   .0344000      .000      .000  
+86 825 46667.00 I   .009457  .000800   .391054  .000540  I  .0336291  .0000296  0.8676 0.0241  I   -10.164    1.378     -.383     .108   .010000   .394000   .0334000      .000      .000  
+86 826 46668.00 I   .011415  .001113   .391764  .000520  I  .0328618  .0000378  0.6678 0.0253  I    -9.916    1.515     -.667     .116   .011000   .394000   .0327000      .000      .000  
+86 827 46669.00 I   .013324  .000934   .392421  .000443  I  .0322875  .0000410  0.4859 0.0332  I    -9.015    1.515     -.619     .116   .013000   .395000   .0321000      .000      .000  
+86 828 46670.00 I   .015140  .000934   .393021  .000443  I  .0318770  .0000546  0.3429 0.0344  I    -8.206    1.515     -.369     .116   .015000   .395000   .0317000      .000      .000  
+86 829 46671.00 I   .016870  .000765   .393579  .000647  I  .0315836  .0000553  0.2543 0.0372  I    -7.786    1.515     -.154     .116   .016000   .396000   .0314000      .000      .000  
+86 830 46672.00 I   .018538  .000695   .394122  .000655  I  .0313464  .0000506  0.2318 0.0396  I    -7.673     .903     -.097     .197   .018000   .396000   .0312000      .000      .000  
+86 831 46673.00 I   .020155  .000287   .394677  .000653  I  .0310971  .0000567  0.2782 0.0374  I    -7.751     .284     -.137     .241   .020000   .397000   .0310000      .000      .000  
+86 9 1 46674.00 I   .021728  .000374   .395271  .000610  I  .0307690  .0000550  0.3877 0.0389  I    -7.880     .284     -.104     .241   .021000   .397000   .0306000      .000      .000  
+86 9 2 46675.00 I   .023265  .000385   .395918  .000671  I  .0302994  .0000533  0.5640 0.0325  I    -7.919     .284      .089     .241   .023000   .397000   .0301000      .000      .000  
+86 9 3 46676.00 I   .024777  .000347   .396582  .000553  I  .0296206  .0000348  0.8013 0.0331  I    -7.869     .284      .367     .241   .025000   .398000   .0293000      .000      .000  
+86 9 4 46677.00 I   .026280  .000345   .397211  .000792  I  .0286889  .0000394  1.0622 0.0298  I    -7.808     .777      .565     .253   .026000   .398000   .0283000      .000      .000  
+86 9 5 46678.00 I   .027776  .000373   .397750  .000911  I  .0275048  .0000485  1.2973 0.0375  I    -7.794     .979      .561     .261   .028000   .398000   .0270000      .000      .000  
+86 9 6 46679.00 I   .029242  .000373   .398137  .000911  I  .0261182  .0000639  1.4606 0.0425  I    -7.873     .979      .347     .261   .030000   .398000   .0256000      .000      .000  
+86 9 7 46680.00 I   .030660  .000315   .398317  .000952  I  .0246201  .0000699  1.5143 0.0459  I    -8.114     .979      .048     .261   .031000   .399000   .0240000      .000      .000  
+86 9 8 46681.00 I   .032040  .000365   .398304  .001017  I  .0231308  .0000659  1.4445 0.0471  I    -8.540     .979     -.151     .261   .033000   .399000   .0226000      .000      .000  
+86 9 9 46682.00 I   .033398  .000368   .398165  .000983  I  .0217642  .0000630  1.2754 0.0509  I    -9.071    1.091     -.214     .212   .034000   .399000   .0213000      .000      .000  
+86 910 46683.00 I   .034748  .000417   .397969  .001018  I  .0205972  .0000776  1.0548 0.0487  I    -9.543    1.238     -.197     .109   .036000   .399000   .0202000      .000      .000  
+86 911 46684.00 I   .036109  .000417   .397793  .001018  I  .0196517  .0000743  0.8428 0.0494  I    -9.743    1.238     -.137     .109   .037000   .399000   .0194000      .000      .000  
+86 912 46685.00 I   .037511  .000417   .397718  .001018  I  .0188843  .0000612  0.7126 0.0439  I    -9.535    1.238      .004     .109   .038000   .399000   .0186000      .000      .000  
+86 913 46686.00 I   .038937  .000375   .397755  .000925  I  .0181818  .0000466  0.7166 0.0380  I    -9.018    1.238      .219     .109   .040000   .399000   .0180000      .000      .000  
+86 914 46687.00 I   .040369  .000331   .397869  .000803  I  .0174055  .0000449  0.8574 0.0328  I    -8.459    1.118      .428     .406   .041000   .399000   .0172000      .000      .000  
+86 915 46688.00 I   .041792  .000231   .398011  .000610  I  .0164323  .0000461  1.1024 0.0317  I    -8.112    1.259      .498     .852   .043000   .399000   .0161000      .000      .000  
+86 916 46689.00 I   .043195  .000173   .398133  .000476  I  .0151853  .0000448  1.3936 0.0295  I    -8.084    1.164      .253     .803   .044000   .399000   .0149000      .000      .000  
+86 917 46690.00 I   .044565  .000173   .398189  .000476  I  .0136551  .0000368  1.6549 0.0286  I    -8.296    1.164     -.352     .803   .045000   .399000   .0133000      .000      .000  
+86 918 46691.00 I   .045892  .000157   .398157  .000500  I  .0119068  .0000357  1.8222 0.0248  I    -8.272    1.164     -.317     .803   .046000   .399000   .0115000      .000      .000  
+86 919 46692.00 I   .047175  .000265   .398031  .000431  I  .0100508  .0000333  1.8690 0.0259  I    -8.133    1.044      .085     .646   .048000   .399000   .0097000      .000      .000  
+86 920 46693.00 I   .048412  .000309   .397812  .000473  I  .0082069  .0000375  1.8013 0.0242  I    -8.186    1.075      .299     .686   .049000   .399000   .0079000      .000      .000  
+86 921 46694.00 I   .049596  .000309   .397519  .000473  I  .0064771  .0000350  1.6467 0.0279  I    -8.448     .772      .356     .329   .050000   .399000   .0062000      .000      .000  
+86 922 46695.00 I   .050721  .000351   .397166  .000368  I  .0049286  .0000414  1.4467 0.0246  I    -8.762     .757      .350     .298   .051000   .399000   .0047000      .000      .000  
+86 923 46696.00 I   .051787  .000311   .396760  .000442  I  .0035841  .0000347  1.2455 0.0253  I    -8.891     .757      .407     .298   .052000   .398000   .0034000      .000      .000  
+86 924 46697.00 I   .052821  .000288   .396311  .000430  I  .0024267  .0000291  1.0769 0.0234  I    -8.700     .642      .600     .334   .054000   .398000   .0022000      .000      .000  
+86 925 46698.00 I   .053854  .000196   .395831  .000490  I  .0014112  .0000313  0.9656 0.0285  I    -8.267     .502      .852     .471   .055000   .398000   .0012000      .000      .000  
+86 926 46699.00 I   .054917  .000236   .395336  .000437  I  .0004703  .0000491  0.9301 0.0284  I    -7.799     .502      .972     .471   .056000   .398000   .0003000      .000      .000  
+86 927 46700.00 I   .056028  .000236   .394854  .000437  I -.0004763  .0000475  0.9767 0.0309  I    -7.441     .502      .860     .471   .057000   .397000  -.0007000      .000      .000  
+86 928 46701.00 I   .057188  .000210   .394417  .000640  I -.0015092  .0000375  1.1017 0.0302  I    -7.190     .502      .634     .471   .058000   .397000  -.0017000      .000      .000  
+86 929 46702.00 I   .058390  .000277   .394051  .000640  I -.0027028  .0000373  1.2960 0.0337  I    -7.034     .717      .492     .335   .060000   .396000  -.0029000      .000      .000  
+86 930 46703.00 I   .059614  .000306   .393782  .000758  I -.0041178  .0000561  1.5402 0.0339  I    -7.031     .882      .521     .298   .061000   .396000  -.0043000      .000      .000  
+8610 1 46704.00 I   .060833  .000288   .393642  .000729  I -.0057892  .0000565  1.8024 0.0337  I    -7.188     .882      .674     .298   .062000   .395000  -.0060000      .000      .000  
+8610 2 46705.00 I   .062023  .000279   .393644  .000804  I -.0077152  .0000373  2.0423 0.0355  I    -7.361     .882      .871     .298   .063000   .395000  -.0080000      .000      .000  
+8610 3 46706.00 I   .063183  .000252   .393743  .000711  I -.0098497  .0000429  2.2100 0.0289  I    -7.407     .882     1.035     .298   .064000   .395000  -.0101000      .000      .000  
+8610 4 46707.00 I   .064319  .000229   .393870  .000765  I -.0120944  .0000442  2.2555 0.0329  I    -7.329     .637     1.095     .270   .066000   .394000  -.0124000      .000      .000  
+8610 5 46708.00 I   .065439  .000122   .393967  .000637  I -.0143128  .0000500  2.1574 0.0336  I    -7.253     .185     1.017     .377   .067000   .394000  -.0146000      .000      .000  
+8610 6 46709.00 I   .066561  .000122   .393983  .000637  I -.0163691  .0000506  1.9391 0.0372  I    -7.298     .185      .842     .377   .068000   .393000  -.0167000      .000      .000  
+8610 7 46710.00 I   .067700  .000188   .393877  .000662  I -.0181709  .0000551  1.6606 0.0352  I    -7.481     .185      .649     .377   .069000   .393000  -.0184000      .000      .000  
+8610 8 46711.00 I   .068857  .000272   .393644  .000590  I -.0196953  .0000489  1.3971 0.0348  I    -7.687     .185      .498     .377   .071000   .392000  -.0200000      .000      .000  
+8610 9 46712.00 I   .070031  .000283   .393309  .000507  I -.0209933  .0000425  1.2184 0.0332  I    -7.781     .204      .383     .276   .072000   .392000  -.0212000      .000      .000  
+861010 46713.00 I   .071220  .000339   .392901  .000377  I -.0221744  .0000450  1.1668 0.0307  I    -7.663     .222      .286     .298   .073000   .392000  -.0224000      .000      .000  
+861011 46714.00 I   .072432  .000401   .392455  .000361  I -.0233677  .0000443  1.2377 0.0301  I    -7.283     .222      .249     .298   .074000   .391000  -.0237000      .000      .000  
+861012 46715.00 I   .073692  .000401   .392017  .000361  I -.0246816  .0000400  1.4038 0.0271  I    -6.668     .222      .339     .298   .076000   .391000  -.0251000      .000      .000  
+861013 46716.00 I   .075028  .000596   .391609  .000323  I -.0261924  .0000311  1.6210 0.0248  I    -5.993     .222      .547     .298   .077000   .391000  -.0267000      .000      .000  
+861014 46717.00 I   .076466  .000597   .391242  .000254  I -.0279202  .0000292  1.8281 0.0200  I    -5.429     .357      .813     .152   .078000   .391000  -.0285000      .000      .000  
+861015 46718.00 I   .078018  .000669   .390927  .000259  I -.0298285  .0000250  1.9749 0.0200  I    -5.071     .391     1.070     .185   .079000   .390000  -.0305000      .000      .000  
+861016 46719.00 I   .079677  .000669   .390666  .000259  I -.0318410  .0000274  2.0347 0.0187  I    -4.953     .391     1.232     .185   .081000   .390000  -.0326000      .000      .000  
+861017 46720.00 I   .081418  .000662   .390457  .000266  I -.0338647  .0000278  1.9948 0.0211  I    -5.071     .391     1.201     .185   .082000   .390000  -.0347000      .000      .000  
+861018 46721.00 I   .083132  .000760   .390277  .000255  I -.0358018  .0000322  1.8684 0.0206  I    -5.309     .391     1.085     .185   .083000   .389000  -.0367000      .000      .000  
+861019 46722.00 I   .084741  .000716   .390107  .000230  I -.0375854  .0000305  1.6936 0.0226  I    -5.595     .346      .969     .244   .085000   .389000  -.0384000      .000      .000  
+861020 46723.00 I   .086193  .000638   .389931  .000134  I -.0391847  .0000318  1.5058 0.0245  I    -5.920     .249      .829     .276   .086000   .389000  -.0400000      .000      .000  
+861021 46724.00 I   .087450  .000578   .389740  .000126  I -.0406038  .0000384  1.3383 0.0239  I    -6.152     .266      .737     .309   .087000   .388000  -.0413000      .000      .000  
+861022 46725.00 I   .088503  .000654   .389529  .000199  I -.0418764  .0000357  1.2160 0.0281  I    -6.104     .219      .742     .263   .088000   .388000  -.0425000      .000      .000  
+861023 46726.00 I   .089430  .000649   .389295  .000195  I -.0430563  .0000410  1.1551 0.0282  I    -5.762     .219      .811     .263   .090000   .388000  -.0435000      .000      .000  
+861024 46727.00 I   .090340  .000620   .389034  .000205  I -.0442099  .0000437  1.1642 0.0320  I    -5.297     .496      .850     .271   .091000   .387000  -.0445000      .000      .000  
+861025 46728.00 I   .091325  .000501   .388742  .000245  I -.0454034  .0000491  1.2293 0.0326  I    -4.856     .605      .860     .240   .092000   .387000  -.0455000      .000      .000  
+861026 46729.00 I   .092387  .000539   .388414  .000259  I -.0466797  .0000483  1.3279 0.0347  I    -4.473     .605      .920     .240   .094000   .387000  -.0467000      .000      .000  
+861027 46730.00 I   .093479  .000539   .388037  .000259  I -.0480733  .0000490  1.4687 0.0357  I    -4.226     .605     1.082     .240   .095000   .387000  -.0480000      .000      .000  
+861028 46731.00 I   .094579  .000535   .387595  .000350  I -.0496329  .0000527  1.6567 0.0335  I    -4.287     .735     1.307     .281   .096000   .386000  -.0495000      .000      .000  
+861029 46732.00 I   .095684  .000443   .387071  .000302  I -.0513921  .0000457  1.8608 0.0300  I    -4.725     .548     1.480     .397   .097000   .386000  -.0512000      .000      .000  
+861030 46733.00 I   .096822  .000479   .386457  .000309  I -.0533440  .0000285  2.0333 0.0270  I    -5.310     .213     1.572     .432   .099000   .385000  -.0532000      .000      .000  
+861031 46734.00 I   .098035  .000479   .385746  .000309  I -.0554304  .0000286  2.1210 0.0202  I    -5.665     .213     1.661     .432   .100000   .385000  -.0553000      .000      .000  
+8611 1 46735.00 I   .099348  .001097   .384936  .000490  I -.0575419  .0000286  2.0766 0.0185  I    -5.603     .213     1.789     .432   .101000   .385000  -.0574000      .000      .000  
+8611 2 46736.00 I   .100727  .000967   .384042  .000541  I -.0595353  .0000236  1.8875 0.0155  I    -5.247     .359     2.027     .435   .103000   .384000  -.0594000      .000      .000  
+8611 3 46737.00 I   .102130  .000565   .383079  .000564  I -.0612828  .0000120  1.5961 0.0126  I    -4.795     .608     2.200     .380   .104000   .383000  -.0612000      .000      .000  
+8611 4 46738.00 I   .103520  .000555   .382064  .000553  I -.0627206  .0000090  1.2839 0.0096  I    -4.383     .763     2.101     .279   .105000   .383000  -.0627000      .000      .000  
+8611 5 46739.00 I   .104920  .000610   .381025  .000589  I -.0638732  .0000149  1.0395 0.0109  I    -4.163     .849     1.671     .282   .106000   .382000  -.0638000      .000      .000  
+8611 6 46740.00 I   .106443  .000619   .380021  .000580  I -.0648435  .0000199  0.9268 0.0126  I    -4.070     .872     1.343     .268   .108000   .382000  -.0648000      .000      .000  
+8611 7 46741.00 I   .108160  .000313   .379146  .000550  I -.0657776  .0000204  0.9663 0.0155  I    -3.884     .872     1.189     .268   .109000   .381000  -.0659000      .000      .000  
+8611 8 46742.00 I   .110029  .000313   .378363  .000550  I -.0668165  .0000238  1.1268 0.0173  I    -3.586     .852     1.186     .466   .111000   .380000  -.0670000      .000      .000  
+8611 9 46743.00 I   .111974  .000337   .377602  .000501  I -.0680527  .0000279  1.3517 0.0481  I    -3.452     .817     1.514     .550   .113000   .379000  -.0683000      .000      .000  
+861110 46744.00 I   .113883  .000607   .376827  .000529  I -.0695212  .0000932  1.5804 0.0496  I    -3.482     .788     2.068     .624   .114000   .378000  -.0698000      .000      .000  
+861111 46745.00 I   .115670  .000607   .376009  .000529  I -.0711957  .0000951  1.7557 0.0639  I    -3.573     .788     2.524     .624   .116000   .377000  -.0716000      .000      .000  
+861112 46746.00 I   .117284  .000555   .375126  .000341  I -.0730039  .0000875  1.8448 0.0549  I    -3.730     .693     2.747     .732   .117000   .376000  -.0734000      .000      .000  
+861113 46747.00 I   .118681  .000491   .374161  .000311  I -.0748528  .0000550  1.8364 0.0513  I    -3.938     .538     2.787     .546   .118000   .374000  -.0753000      .000      .000  
+861114 46748.00 I   .119822  .000521   .373111  .000301  I -.0766462  .0000534  1.7364 0.0370  I    -4.109     .313     2.724     .244   .119000   .373000  -.0770000      .000      .000  
+861115 46749.00 I   .120675  .000521   .371975  .000301  I -.0783024  .0000494  1.5668 0.0300  I    -4.187     .313     2.591     .244   .120000   .372000  -.0786000      .000      .000  
+861116 46750.00 I   .121222  .000703   .370755  .000419  I -.0797678  .0000274  1.3612 0.0276  I    -4.231     .313     2.376     .244   .121000   .371000  -.0800000      .000      .000  
+861117 46751.00 I   .121525  .000689   .369473  .000388  I -.0810249  .0000247  1.1559 0.0175  I    -4.336     .313     2.087     .244   .121000   .370000  -.0813000      .000      .000  
+861118 46752.00 I   .121669  .000649   .368161  .000345  I -.0820903  .0000217  0.9828 0.0197  I    -4.500     .322     1.850     .290   .122000   .368000  -.0823000      .000      .000  
+861119 46753.00 I   .121731  .000672   .366845  .000439  I -.0830098  .0000308  0.8676 0.0182  I    -4.578     .332     1.810     .330   .122000   .367000  -.0832000      .000      .000  
+861120 46754.00 I   .121735  .000672   .365532  .000439  I -.0838496  .0000293  0.8247 0.0214  I    -4.401     .332     1.935     .330   .123000   .366000  -.0840000      .000      .000  
+861121 46755.00 I   .121695  .000672   .364223  .000439  I -.0846851  .0000296  0.8595 0.0180  I    -3.925     .332     2.033     .330   .123000   .365000  -.0848000      .000      .000  
+861122 46756.00 I   .121645  .000393   .362924  .000177  I -.0855930  .0000208  0.9675 0.0184  I    -3.228     .332     2.015     .330   .123000   .364000  -.0857000      .000      .000  
+861123 46757.00 I   .121615  .000459   .361638  .000166  I -.0866396  .0000218  1.1340 0.0193  I    -2.399     .259     2.005     .609   .124000   .362000  -.0868000      .000      .000  
+861124 46758.00 I   .121636  .000352   .360361  .000190  I -.0878742  .0000326  1.3400 0.0211  I    -1.596     .157     2.141     .796   .124000   .361000  -.0881000      .000      .000  
+861125 46759.00 I   .121737  .000397   .359088  .000060  I -.0893248  .0000362  1.5616 0.0245  I    -1.127     .157     2.365     .796   .124000   .360000  -.0895000      .000      .000  
+861126 46760.00 I   .121951  .000397   .357817  .000060  I -.0909912  .0000367  1.7645 0.0276  I    -1.218     .157     2.495     .796   .125000   .359000  -.0912000      .000      .000  
+861127 46761.00 I   .122300  .000318   .356546  .000126  I -.0928325  .0000418  1.9033 0.0244  I    -1.718     .157     2.511     .796   .125000   .358000  -.0931000      .000      .000  
+861128 46762.00 I   .122802  .000360   .355271  .000152  I -.0947608  .0000322  1.9311 0.0274  I    -2.288     .288     2.584     .576   .126000   .356000  -.0950000      .000      .000  
+861129 46763.00 I   .123482  .000291   .353996  .000173  I -.0966481  .0000354  1.8193 0.0234  I    -2.768     .376     2.799     .175   .126000   .355000  -.0969000      .000      .000  
+861130 46764.00 I   .124368  .000304   .352720  .000180  I -.0983574  .0000339  1.5817 0.0248  I    -3.167     .376     2.989     .175   .127000   .354000  -.0986000      .000      .000  
+8612 1 46765.00 I   .125479  .000281   .351444  .000335  I -.0997919  .0000348  1.2853 0.0228  I    -3.401     .376     2.977     .175   .127000   .352000  -.1001000      .000      .000  
+8612 2 46766.00 I   .126780  .000314   .350165  .000330  I -.1009402  .0000305  1.0254 0.0237  I    -3.328     .376     2.828     .175   .128000   .351000  -.1012000      .000      .000  
+8612 3 46767.00 I   .128205  .000423   .348882  .000436  I -.1018824  .0000321  0.8847 0.0265  I    -3.030     .571     2.765     .449   .129000   .350000  -.1022000      .000      .000  
+8612 4 46768.00 I   .129688  .000523   .347592  .000582  I -.1027627  .0000434  0.9033 0.0278  I    -2.817     .699     2.813     .542   .130000   .348000  -.1031000      .000      .000  
+8612 5 46769.00 I   .131165  .000523   .346274  .000582  I -.1037358  .0000454  1.0621 0.0314  I    -2.876     .699     2.716     .542   .131000   .347000  -.1041000      .000      .000  
+8612 6 46770.00 I   .132580  .000523   .344903  .000582  I -.1049099  .0000454  1.2898 0.0299  I    -3.056     .699     2.302     .542   .132000   .346000  -.1052000      .000      .000  
+8612 7 46771.00 I   .133924  .000504   .343466  .000466  I -.1063124  .0000390  1.5087 0.0288  I    -2.962     .648     2.037     .476   .133000   .344000  -.1066000      .000      .000  
+8612 8 46772.00 I   .135176  .000458   .341972  .000433  I -.1079059  .0000355  1.6636 0.0296  I    -2.605     .670     2.200     .392   .134000   .343000  -.1082000      .000      .000  
+8612 9 46773.00 I   .136306  .000468   .340435  .000420  I -.1096072  .0000445  1.7215 0.0239  I    -2.239     .645     2.655     .184   .135000   .341000  -.1099000      .000      .000  
+861210 46774.00 I   .137286  .000222   .338871  .000225  I -.1113158  .0000321  1.6803 0.0264  I    -2.014     .639     3.083     .118   .136000   .340000  -.1115000      .000      .000  
+861211 46775.00 I   .138103  .000222   .337292  .000225  I -.1129402  .0000285  1.5563 0.0467  I    -2.097     .639     3.282     .118   .137000   .339000  -.1131000      .000      .000  
+861212 46776.00 I   .138777  .000231   .335713  .000235  I -.1144085  .0000877  1.3724 0.0394  I    -2.396     .639     3.306     .118   .138000   .337000  -.1146000      .000      .000  
+861213 46777.00 I   .139334  .000265   .334158  .000202  I -.1156739  .0000735  1.1551 0.0639  I    -2.713     .553     3.256     .145   .138000   .336000  -.1158000      .000      .000  
+861214 46778.00 I   .139803  .000280   .332651  .000167  I -.1167165  .0000930  0.9313 0.0598  I    -2.944     .332     3.107     .150   .139000   .335000  -.1168000      .000      .000  
+861215 46779.00 I   .140216  .000305   .331220  .000166  I -.1175448  .0000943  0.7324 0.0674  I    -3.081     .332     2.826     .150   .140000   .334000  -.1177000      .000      .000  
+861216 46780.00 I   .140605  .000279   .329888  .000468  I -.1182030  .0000976  0.5987 0.0631  I    -3.127     .332     2.533     .150   .140000   .332000  -.1184000      .000      .000  
+861217 46781.00 I   .140997  .000241   .328664  .000424  I -.1187732  .0000840  0.5579 0.0575  I    -3.062     .332     2.424     .150   .141000   .331000  -.1191000      .000      .000  
+861218 46782.00 I   .141411  .000302   .327549  .000347  I -.1193512  .0000607  0.6144 0.0562  I    -2.802     .279     2.556     .183   .141000   .330000  -.1197000      .000      .000  
+861219 46783.00 I   .141868  .000301   .326542  .000441  I -.1200310  .0000748  0.7581 0.0480  I    -2.301     .214     2.787     .211   .142000   .329000  -.1204000      .000      .000  
+861220 46784.00 I   .142385  .000301   .325615  .000441  I -.1208896  .0000743  0.9686 0.0479  I    -1.635     .214     2.969     .211   .142000   .328000  -.1213000      .000      .000  
+861221 46785.00 I   .142978  .000369   .324735  .000440  I -.1219795  .0000597  1.2131 0.0466  I     -.951     .555     3.119     .163   .142000   .327000  -.1223000      .000      .000  
+861222 46786.00 I   .143609  .000387   .323868  .000309  I -.1233149  .0000561  1.4551 0.0410  I     -.381     .555     3.318     .163   .143000   .326000  -.1236000      .000      .000  
+861223 46787.00 I   .144204  .000387   .322977  .000309  I -.1248792  .0000562  1.6657 0.0319  I     -.066     .555     3.501     .163   .143000   .325000  -.1251000      .000      .000  
+861224 46788.00 I   .144684  .000450   .322025  .000439  I -.1266263  .0000303  1.8163 0.0409  I     -.063     .756     3.487     .298   .144000   .325000  -.1267000      .000      .000  
+861225 46789.00 I   .145013  .000450   .321001  .000439  I -.1284839  .0000594  1.8831 0.0348  I     -.257     .756     3.258     .298   .144000   .323000  -.1285000      .000      .000  
+861226 46790.00 I   .145222  .000450   .319917  .000439  I -.1303569  .0000626  1.8432 0.0490  I     -.498     .756     3.023     .298   .144000   .322000  -.1303000      .000      .000  
+861227 46791.00 I   .145351  .000366   .318788  .000232  I -.1321329  .0000779  1.6913 0.0444  I     -.810     .791     2.936     .298   .145000   .321000  -.1321000      .000      .000  
+861228 46792.00 I   .145443  .000417   .317630  .000216  I -.1337127  .0000629  1.4592 0.0499  I    -1.293     .350     2.867     .298   .145000   .320000  -.1336000      .000      .000  
+861229 46793.00 I   .145537  .000417   .316458  .000216  I -.1350465  .0000623  1.2127 0.0441  I    -1.816     .350     2.612     .298   .145000   .319000  -.1349000      .000      .000  
+861230 46794.00 I   .145675  .000417   .315287  .000216  I -.1361608  .0000617  1.0342 0.0343  I    -2.078     .350     2.249     .298   .145000   .317000  -.1360000      .000      .000  
+861231 46795.00 I   .145891  .000417   .314129  .000216  I -.1371607  .0000287  0.9931 0.0321  I    -2.023     .350     2.113     .298   .146000   .316000  -.1369000      .000      .000  
+87 1 1 46796.00 I   .146164  .000350   .312978  .000374  I -.1381993  .0000175  1.1088 0.0192  I    -1.921     .350     2.344     .298   .146000   .315000  -.1379000      .000      .000  
+87 1 2 46797.00 I   .146446  .000350   .311819  .000374  I -.1394157  .0000256  1.3366 0.0210  I    -2.019     .455     2.725     .276   .146000   .314000  -.1391000      .000      .000  
+87 1 3 46798.00 I   .146692  .000160   .310639  .000557  I -.1408817  .0000381  1.5921 0.0246  I    -2.244     .541     2.996     .387   .146000   .312000  -.1406000      .000      .000  
+87 1 4 46799.00 I   .146854  .000160   .309420  .000557  I -.1425808  .0000419  1.7903 0.0303  I    -2.388     .541     3.176     .387   .146000   .311000  -.1423000      .000      .000  
+87 1 5 46800.00 I   .146890  .000443   .308156  .000455  I -.1444251  .0000471  1.8770 0.0277  I    -2.406     .541     3.440     .387   .146000   .309000  -.1441000      .000      .000  
+87 1 6 46801.00 I   .146762  .000393   .306858  .000406  I -.1462932  .0000361  1.8389 0.0280  I    -2.419     .541     3.783     .387   .146000   .308000  -.1460000      .000      .000  
+87 1 7 46802.00 I   .146447  .000343   .305532  .000346  I -.1480683  .0000303  1.6969 0.0224  I    -2.418     .437     3.968     .280   .145000   .307000  -.1478000      .000      .000  
+87 1 8 46803.00 I   .145930  .000362   .304171  .000242  I -.1496648  .0000265  1.4881 0.0218  I    -2.267     .299     3.844     .298   .145000   .305000  -.1493000      .000      .000  
+87 1 9 46804.00 I   .145216  .000388   .302764  .000135  I -.1510340  .0000314  1.2476 0.0196  I    -1.948     .299     3.542     .298   .145000   .304000  -.1507000      .000      .000  
+87 110 46805.00 I   .144363  .000388   .301309  .000135  I -.1521611  .0000290  1.0103 0.0197  I    -1.598     .299     3.273     .298   .144000   .303000  -.1518000      .000      .000  
+87 111 46806.00 I   .143461  .000389   .299808  .000229  I -.1530660  .0000238  0.8072 0.0200  I    -1.314     .299     3.066     .298   .144000   .302000  -.1528000      .000      .000  
+87 112 46807.00 I   .142592  .000621   .298270  .000481  I -.1537942  .0000276  0.6603 0.0234  I    -1.168     .680     2.818     .298   .143000   .300000  -.1535000      .000      .000  
+87 113 46808.00 I   .141826  .000772   .296709  .000587  I -.1544114  .0000402  0.5879 0.0247  I    -1.258     .864     2.538     .298   .143000   .299000  -.1542000      .000      .000  
+87 114 46809.00 I   .141231  .000762   .295141  .000645  I -.1549984  .0000410  0.6008 0.0276  I    -1.612     .864     2.391     .298   .142000   .297000  -.1548000      .000      .000  
+87 115 46810.00 I   .140855  .000762   .293585  .000645  I -.1556391  .0000378  0.6919 0.0271  I    -2.059     .864     2.498     .298   .141000   .296000  -.1555000      .000      .000  
+87 116 46811.00 I   .140624  .000821   .292056  .000630  I -.1564038  .0000354  0.8478 0.0269  I    -2.160     .864     2.779     .298   .141000   .295000  -.1563000      .000      .000  
+87 117 46812.00 I   .140450  .000806   .290534  .000630  I -.1573502  .0000384  1.0503 0.0273  I    -1.797     .868     3.034     .141   .140000   .293000  -.1573000      .000      .000  
+87 118 46813.00 I   .140262  .000719   .289004  .000583  I -.1585097  .0000415  1.2687 0.0285  I    -1.227     .727     3.150     .247   .140000   .292000  -.1585000      .000      .000  
+87 119 46814.00 I   .139989  .000795   .287471  .000449  I -.1598827  .0000422  1.4722 0.0303  I     -.725     .647     3.136     .257   .139000   .290000  -.1598000      .000      .000  
+87 120 46815.00 I   .139575  .000887   .285944  .000507  I -.1614379  .0000441  1.6269 0.0285  I     -.460     .647     2.994     .257   .138000   .289000  -.1614000      .000      .000  
+87 121 46816.00 I   .139026  .000779   .284463  .000483  I -.1631089  .0000383  1.6987 0.0282  I     -.434     .647     2.959     .257   .138000   .288000  -.1631000      .000      .000  
+87 122 46817.00 I   .138418  .000724   .283070  .000512  I -.1648016  .0000352  1.6695 0.0252  I     -.627     .590     3.006     .211   .137000   .286000  -.1647000      .000      .000  
+87 123 46818.00 I   .137857  .000663   .281786  .000493  I -.1664139  .0000329  1.5384 0.0251  I     -.939     .369     3.089     .210   .137000   .285000  -.1664000      .000      .000  
+87 124 46819.00 I   .137431  .000761   .280616  .000974  I -.1678506  .0000358  1.3241 0.0229  I    -1.338     .421     3.264     .102   .136000   .284000  -.1678000      .000      .000  
+87 125 46820.00 I   .137166  .000807   .279539  .001125  I -.1690519  .0000319  1.0794 0.0227  I    -1.833     .458     3.406     .298   .136000   .282000  -.1690000      .000      .000  
+87 126 46821.00 I   .137038  .000710   .278561  .001084  I -.1700244  .0000278  0.8799 0.0206  I    -2.308     .458     3.324     .298   .135000   .281000  -.1700000      .000      .000  
+87 127 46822.00 I   .137011  .000732   .277704  .000597  I -.1708510  .0000262  0.7984 0.0210  I    -2.492     .422     3.018     .117   .135000   .280000  -.1708000      .000      .000  
+87 128 46823.00 I   .137001  .000813   .276949  .000608  I -.1716741  .0000315  0.8757 0.0204  I    -2.264     .329     2.722     .157   .135000   .279000  -.1717000      .000      .000  
+87 129 46824.00 I   .136835  .000769   .276208  .000599  I -.1726509  .0000313  1.0986 0.0209  I    -1.856     .329     2.595     .157   .134000   .277000  -.1727000      .000      .000  
+87 130 46825.00 I   .136335  .000648   .275387  .000272  I -.1738984  .0000274  1.4029 0.0207  I    -1.619     .329     2.529     .157   .134000   .276000  -.1740000      .000      .000  
+87 131 46826.00 I   .135381  .000663   .274410  .000333  I -.1754526  .0000270  1.6949 0.0198  I    -1.688     .329     2.507     .157   .133000   .275000  -.1756000      .000      .000  
+87 2 1 46827.00 I   .134106  .000779   .273266  .000425  I -.1772565  .0000285  1.8918 0.0196  I    -2.003     .647     2.552     .132   .133000   .274000  -.1774000      .000      .000  
+87 2 2 46828.00 I   .132707  .000783   .271968  .000325  I -.1791915  .0000284  1.9545 0.0207  I    -2.522     .869     2.706     .106   .132000   .273000  -.1793000      .000      .000  
+87 2 3 46829.00 I   .131373  .000713   .270544  .000400  I -.1811235  .0000301  1.8911 0.0205  I    -3.146    1.121     2.899     .116   .132000   .271000  -.1812000      .000      .000  
+87 2 4 46830.00 I   .130288  .000755   .269034  .000391  I -.1829432  .0000297  1.7363 0.0205  I    -3.543    1.121     2.877     .116   .132000   .270000  -.1830000      .000      .000  
+87 2 5 46831.00 I   .129572  .000756   .267504  .000383  I -.1845796  .0000279  1.5320 0.0379  I    -3.415    1.121     2.624     .116   .131000   .269000  -.1846000      .000      .000  
+87 2 6 46832.00 I   .129204  .000678   .266010  .000329  I -.1860049  .0000697  1.3209 0.0405  I    -3.125    1.099     2.476     .192   .131000   .268000  -.1860000      .000      .000  
+87 2 7 46833.00 I   .129075  .000661   .264586  .000256  I -.1872302  .0000761  1.1362 0.0547  I    -2.914    1.077     2.582     .240   .130000   .267000  -.1872000      .000      .000  
+87 2 8 46834.00 I   .129034  .000464   .263271  .000194  I -.1882929  .0000843  0.9981 0.0633  I    -2.667    1.068     2.719     .266   .130000   .266000  -.1882000      .000      .000  
+87 2 9 46835.00 I   .128903  .000572   .262120  .000247  I -.1892463  .0001011  0.9195 0.0609  I    -2.261     .916     2.539     .282   .129000   .265000  -.1891000      .000      .000  
+87 210 46836.00 I   .128587  .000512   .261167  .000283  I -.1901571  .0000879  0.9163 0.0647  I    -1.922     .916     2.259     .282   .129000   .264000  -.1900000      .000      .000  
+87 211 46837.00 I   .128150  .000504   .260373  .000272  I -.1911065  .0000807  0.9959 0.0548  I    -1.844     .839     2.163     .325   .128000   .263000  -.1909000      .000      .000  
+87 212 46838.00 I   .127667  .000465   .259684  .000266  I -.1921723  .0000655  1.1458 0.0526  I    -1.933     .593     2.319     .310   .128000   .262000  -.1920000      .000      .000  
+87 213 46839.00 I   .127184  .000435   .259047  .000316  I -.1934137  .0000675  1.3426 0.0480  I    -1.942     .616     2.635     .319   .128000   .262000  -.1933000      .000      .000  
+87 214 46840.00 I   .126747  .000356   .258408  .000315  I -.1948653  .0000703  1.5630 0.0409  I    -1.689     .616     2.886     .319   .127000   .261000  -.1948000      .000      .000  
+87 215 46841.00 I   .126370  .000531   .257736  .000338  I -.1965376  .0000461  1.7772 0.0404  I    -1.180     .616     2.971     .319   .127000   .260000  -.1965000      .000      .000  
+87 216 46842.00 I   .126024  .000444   .257013  .000290  I -.1984046  .0000398  1.9460 0.0328  I     -.623     .619     2.910     .245   .127000   .259000  -.1984000      .000      .000  
+87 217 46843.00 I   .125673  .000443   .256225  .000260  I -.2004034  .0000466  2.0363 0.0252  I     -.217     .513     2.767     .108   .126000   .258000  -.2004000      .000      .000  
+87 218 46844.00 I   .125290  .000447   .255354  .000286  I -.2024439  .0000309  2.0269 0.0281  I     -.066     .548     2.590     .119   .126000   .257000  -.2025000      .000      .000  
+87 219 46845.00 I   .124857  .000442   .254391  .000291  I -.2044244  .0000313  1.9191 0.0191  I     -.227     .548     2.391     .119   .125000   .256000  -.2045000      .000      .000  
+87 220 46846.00 I   .124399  .000436   .253371  .000304  I -.2062584  .0000223  1.7400 0.0181  I     -.559     .548     2.235     .119   .125000   .255000  -.2064000      .000      .000  
+87 221 46847.00 I   .123945  .000358   .252313  .000329  I -.2078958  .0000180  1.5349 0.0141  I     -.942     .507     2.147     .245   .124000   .254000  -.2081000      .000      .000  
+87 222 46848.00 I   .123508  .000276   .251228  .000304  I -.2093397  .0000173  1.3644 0.0122  I    -1.330     .478     2.078     .320   .124000   .253000  -.2096000      .000      .000  
+87 223 46849.00 I   .123087  .000318   .250117  .000382  I -.2106572  .0000166  1.2919 0.0118  I    -1.615     .570     1.967     .331   .123000   .252000  -.2109000      .000      .000  
+87 224 46850.00 I   .122661  .000318   .248976  .000382  I -.2119707  .0000160  1.3611 0.0114  I    -1.620     .570     1.819     .331   .123000   .251000  -.2122000      .000      .000  
+87 225 46851.00 I   .122246  .000355   .247844  .000390  I -.2134289  .0000157  1.5788 0.0118  I    -1.372     .570     1.562     .331   .122000   .250000  -.2137000      .000      .000  
+87 226 46852.00 I   .121872  .000386   .246727  .000395  I -.2151634  .0000173  1.9017 0.0129  I     -.824     .500     1.458     .267   .122000   .249000  -.2153000      .000      .000  
+87 227 46853.00 I   .121495  .000396   .245613  .000288  I -.2172400  .0000205  2.2476 0.0148  I     -.069     .537     1.607     .177   .121000   .247000  -.2173000      .000      .000  
+87 228 46854.00 I   .121053  .000572   .244482  .000489  I -.2196369  .0000239  2.5284 0.0169  I      .667     .455     1.802     .298   .121000   .246000  -.2196000      .000      .000  
+87 3 1 46855.00 I   .120474  .000502   .243307  .000416  I -.2222510  .0000269  2.6719 0.0172  I     1.163     .324     1.907     .298   .120000   .245000  -.2220000      .000      .000  
+87 3 2 46856.00 I   .119739  .000494   .242064  .000392  I -.2249249  .0000248  2.6481 0.0196  I     1.253     .324     1.940     .298   .119000   .243000  -.2245000      .000      .000  
+87 3 3 46857.00 I   .118859  .000602   .240737  .000344  I -.2274987  .0000285  2.4790 0.0228  I      .895     .362     1.931     .133   .118000   .242000  -.2268000      .000      .000  
+87 3 4 46858.00 I   .117846  .000632   .239311  .000335  I -.2298512  .0000383  2.2148 0.0280  I      .264     .396     1.831     .188   .118000   .240000  -.2290000      .000      .000  
+87 3 5 46859.00 I   .116699  .000632   .237782  .000335  I -.2319140  .0000481  1.9076 0.0318  I     -.342     .396     1.610     .188   .117000   .239000  -.2309000      .000      .000  
+87 3 6 46860.00 I   .115417  .000632   .236156  .000335  I -.2336699  .0000507  1.6109 0.0315  I     -.742     .396     1.381     .188   .116000   .237000  -.2326000      .000      .000  
+87 3 7 46861.00 I   .114084  .000539   .234471  .000347  I -.2351542  .0000408  1.3693 0.0308  I     -.914     .396     1.287     .188   .115000   .236000  -.2341000      .000      .000  
+87 3 8 46862.00 I   .112799  .000648   .232769  .000373  I -.2364341  .0000349  1.2044 0.0275  I     -.872     .547     1.312     .143   .115000   .235000  -.2355000      .000      .000  
+87 3 9 46863.00 I   .111657  .000608   .231094  .000414  I -.2375923  .0000368  1.1275 0.0253  I     -.623     .548     1.288     .298   .114000   .234000  -.2368000      .000      .000  
+87 310 46864.00 I   .110751  .000608   .229489  .000414  I -.2387201  .0000365  1.1437 0.0237  I     -.259     .548     1.122     .298   .113000   .233000  -.2382000      .000      .000  
+87 311 46865.00 I   .110161  .000608   .227994  .000414  I -.2399098  .0000298  1.2503 0.0210  I      .046     .548      .910     .298   .113000   .231000  -.2395000      .000      .000  
+87 312 46866.00 I   .109870  .000516   .226654  .000366  I -.2412443  .0000209  1.4278 0.0171  I      .167     .548      .815     .298   .112000   .230000  -.2411000      .000      .000  
+87 313 46867.00 I   .109779  .000476   .225503  .000307  I -.2427787  .0000167  1.6454 0.0146  I      .146     .437      .884     .298   .111000   .229000  -.2428000      .000      .000  
+87 314 46868.00 I   .109810  .000494   .224548  .000323  I -.2445374  .0000205  1.8700 0.0122  I      .100     .147     1.018     .298   .111000   .228000  -.2447000      .000      .000  
+87 315 46869.00 I   .109899  .000220   .223794  .000247  I -.2465079  .0000178  2.0621 0.0132  I      .054     .175     1.078     .298   .110000   .227000  -.2468000      .000      .000  
+87 316 46870.00 I   .109988  .000220   .223232  .000247  I -.2486381  .0000165  2.1838 0.0146  I     -.092     .175     1.006     .298   .109000   .226000  -.2490000      .000      .000  
+87 317 46871.00 I   .110020  .000225   .222818  .000342  I -.2508431  .0000231  2.2083 0.0135  I     -.389     .175      .864     .298   .109000   .225000  -.2512000      .000      .000  
+87 318 46872.00 I   .109928  .000465   .222495  .000380  I -.2530193  .0000213  2.1266 0.0209  I     -.803     .382      .771     .166   .108000   .224000  -.2534000      .000      .000  
+87 319 46873.00 I   .109637  .000595   .222199  .000472  I -.2550668  .0000349  1.9565 0.0205  I    -1.226     .422      .825     .261   .107000   .223000  -.2553000      .000      .000  
+87 320 46874.00 I   .109055  .000595   .221849  .000472  I -.2569179  .0000350  1.7431 0.0254  I    -1.483     .422     1.081     .261   .107000   .223000  -.2571000      .000      .000  
+87 321 46875.00 I   .108093  .000642   .221367  .000476  I -.2585563  .0000370  1.5396 0.0240  I    -1.407     .422     1.511     .261   .106000   .222000  -.2586000      .000      .000  
+87 322 46876.00 I   .106728  .000628   .220718  .000631  I -.2600186  .0000329  1.4006 0.0222  I     -.987     .422     1.678     .261   .105000   .221000  -.2599000      .000      .000  
+87 323 46877.00 I   .105080  .000703   .219945  .000615  I -.2613939  .0000247  1.3709 0.0210  I     -.374     .641     1.436     .279   .104000   .220000  -.2612000      .000      .000  
+87 324 46878.00 I   .103299  .000849   .219106  .000650  I -.2628015  .0000262  1.4646 0.0186  I      .211     .666      .920     .385   .104000   .219000  -.2624000      .000      .000  
+87 325 46879.00 I   .101537  .000737   .218262  .000651  I -.2643567  .0000279  1.6592 0.0192  I      .563     .669      .279     .390   .103000   .218000  -.2639000      .000      .000  
+87 326 46880.00 I   .099933  .000737   .217460  .000651  I -.2661370  .0000281  1.9052 0.0177  I      .565     .669     -.283     .390   .102000   .217000  -.2656000      .000      .000  
+87 327 46881.00 I   .098585  .000740   .216712  .000613  I -.2681613  .0000218  2.1337 0.0172  I      .453     .669     -.256     .390   .101000   .216000  -.2676000      .000      .000  
+87 328 46882.00 I   .097540  .000701   .216016  .000580  I -.2703756  .0000197  2.2758 0.0149  I      .446     .569      .102     .325   .100000   .215000  -.2698000      .000      .000  
+87 329 46883.00 I   .096745  .000568   .215368  .000214  I -.2726712  .0000202  2.2928 0.0165  I      .536     .286      .362     .345   .099000   .215000  -.2722000      .000      .000  
+87 330 46884.00 I   .096120  .000574   .214758  .000436  I -.2749188  .0000265  2.1827 0.0175  I      .600     .153      .500     .190   .098000   .214000  -.2745000      .000      .000  
+87 331 46885.00 I   .095597  .000478   .214178  .000519  I -.2770051  .0000285  1.9781 0.0189  I      .514     .148      .543     .298   .097000   .213000  -.2766000      .000      .000  
+87 4 1 46886.00 I   .095139  .000479   .213641  .000606  I -.2788608  .0000269  1.7308 0.0238  I      .296     .148      .506     .298   .096000   .212000  -.2785000      .000      .000  
+87 4 2 46887.00 I   .094713  .000526   .213178  .000636  I -.2804693  .0000381  1.4914 0.0329  I      .081     .148      .431     .142   .095000   .211000  -.2801000      .000      .000  
+87 4 3 46888.00 I   .094270  .000586   .212808  .000855  I -.2818591  .0000600  1.2985 0.0356  I      .009     .148      .408     .199   .094000   .211000  -.2815000      .000      .000  
+87 4 4 46889.00 I   .093722  .000586   .212509  .000855  I -.2830897  .0000601  1.1757 0.0405  I      .160     .148      .481     .199   .093000   .210000  -.2828000      .000      .000  
+87 4 5 46890.00 I   .092988  .000581   .212263  .000799  I -.2842360  .0000545  1.1293 0.0354  I      .550     .148      .552     .199   .092000   .210000  -.2839000      .000      .000  
+87 4 6 46891.00 I   .092064  .000439   .212060  .000776  I -.2853731  .0000375  1.1572 0.0303  I     1.122     .148      .464     .199   .091000   .209000  -.2850000      .000      .000  
+87 4 7 46892.00 I   .090975  .000389   .211868  .000591  I -.2865731  .0000263  1.2532 0.0196  I     1.729     .282      .166     .212   .090000   .209000  -.2862000      .000      .000  
+87 4 8 46893.00 I   .089743  .000262   .211650  .000501  I -.2878977  .0000113  1.4038 0.0148  I     2.151     .415     -.215     .199   .089000   .209000  -.2875000      .000      .000  
+87 4 9 46894.00 I   .088394  .000262   .211366  .000501  I -.2893924  .0000136  1.5894 0.0094  I     2.182     .415     -.513     .199   .088000   .208000  -.2890000      .000      .000  
+87 410 46895.00 I   .086971  .000262   .210974  .000501  I -.2910801  .0000149  1.7858 0.0102  I     1.782     .415     -.670     .199   .087000   .208000  -.2907000      .000      .000  
+87 411 46896.00 I   .085500  .000245   .210491  .000572  I -.2929587  .0000151  1.9663 0.0114  I     1.289     .415     -.610     .199   .086000   .208000  -.2926000      .000      .000  
+87 412 46897.00 I   .083991  .000195   .209938  .000697  I -.2949955  .0000173  2.0954 0.0143  I     1.040     .460     -.328     .300   .085000   .207000  -.2946000      .000      .000  
+87 413 46898.00 I   .082464  .000079   .209321  .000755  I -.2971198  .0000242  2.1356 0.0167  I     1.042     .472      .059     .310   .084000   .207000  -.2968000      .000      .000  
+87 414 46899.00 I   .080935  .000075   .208641  .000866  I -.2992297  .0000285  2.0650 0.0179  I     1.075     .464      .427     .346   .083000   .206000  -.2989000      .000      .000  
+87 415 46900.00 I   .079424  .000075   .207916  .000866  I -.3012155  .0000263  1.8917 0.0185  I      .888     .464      .634     .346   .082000   .206000  -.3009000      .000      .000  
+87 416 46901.00 I   .077952  .000107   .207220  .000774  I -.3029897  .0000235  1.6483 0.0187  I      .584     .603      .506     .366   .081000   .206000  -.3027000      .000      .000  
+87 417 46902.00 I   .076542  .000107   .206595  .000774  I -.3045084  .0000266  1.3937 0.0290  I      .436     .603      .085     .366   .080000   .206000  -.3043000      .000      .000  
+87 418 46903.00 I   .075219  .000140   .206060  .000777  I -.3057977  .0000530  1.2009 0.0453  I      .618     .654     -.416     .337   .078000   .205000  -.3055000      .000      .000  
+87 419 46904.00 I   .074010  .000333   .205614  .000467  I -.3069486  .0000866  1.1233 0.0506  I     1.113     .763     -.792     .391   .077000   .205000  -.3067000      .000      .000  
+87 420 46905.00 I   .072932  .000381   .205255  .000453  I -.3080894  .0000861  1.1812 0.0564  I     1.760     .668     -.887     .335   .076000   .205000  -.3079000      .000      .000  
+87 421 46906.00 I   .071990  .000437   .204990  .000679  I -.3093493  .0000724  1.3542 0.0543  I     2.315     .668     -.814     .335   .075000   .204000  -.3092000      .000      .000  
+87 422 46907.00 I   .071179  .000431   .204811  .000663  I -.3108178  .0000661  1.5874 0.0531  I     2.617     .615     -.744     .104   .074000   .204000  -.3107000      .000      .000  
+87 423 46908.00 I   .070473  .000461   .204690  .000707  I -.3125279  .0000777  1.8322 0.0485  I     2.629     .615     -.798     .104   .073000   .204000  -.3125000      .000      .000  
+87 424 46909.00 I   .069810  .000492   .204601  .000701  I -.3144718  .0000709  2.0460 0.0526  I     2.530     .615     -.853     .104   .072000   .203000  -.3145000      .000      .000  
+87 425 46910.00 I   .069116  .000492   .204498  .000701  I -.3165887  .0000710  2.1662 0.0436  I     2.565     .615     -.712     .104   .071000   .203000  -.3166000      .000      .000  
+87 426 46911.00 I   .068329  .000484   .204384  .000743  I -.3187598  .0000508  2.1533 0.0423  I     2.743     .696     -.408     .298   .070000   .203000  -.3187000      .000      .000  
+87 427 46912.00 I   .067396  .000538   .204269  .000780  I -.3208546  .0000461  2.0183 0.0412  I     2.986    1.105     -.124     .537   .069000   .202000  -.3207000      .000      .000  
+87 428 46913.00 I   .066290  .000560   .204134  .000855  I -.3227685  .0000650  1.7998 0.0286  I     3.201    1.248     -.041     .634   .068000   .202000  -.3225000      .000      .000  
+87 429 46914.00 I   .064990  .000469   .203955  .000781  I -.3244426  .0000337  1.5467 0.0363  I     3.229    1.248     -.241     .634   .067000   .202000  -.3241000      .000      .000  
+87 430 46915.00 I   .063489  .000422   .203714  .000795  I -.3258673  .0000325  1.3098 0.0233  I     2.930    1.090     -.662     .558   .066000   .202000  -.3254000      .000      .000  
+87 5 1 46916.00 I   .061855  .000400   .203438  .000720  I -.3270799  .0000323  1.1261 0.0206  I     2.627    1.006    -1.030     .513   .064000   .201000  -.3265000      .000      .000  
+87 5 2 46917.00 I   .060205  .000490   .203149  .000754  I -.3281429  .0000253  1.0126 0.0211  I     2.551    1.025    -1.156     .463   .063000   .201000  -.3275000      .000      .000  
+87 5 3 46918.00 I   .058669  .000431   .202858  .000682  I -.3291293  .0000273  0.9718 0.0240  I     2.695     .756    -1.062     .226   .062000   .201000  -.3284000      .000      .000  
+87 5 4 46919.00 I   .057350  .000398   .202549  .000674  I -.3301078  .0000407  0.9948 0.0254  I     2.917     .736     -.954     .245   .060000   .201000  -.3293000      .000      .000  
+87 5 5 46920.00 I   .056318  .000420   .202180  .000716  I -.3311396  .0000428  1.0799 0.0291  I     3.246     .674    -1.220     .229   .059000   .201000  -.3304000      .000      .000  
+87 5 6 46921.00 I   .055534  .000517   .201759  .000754  I -.3322852  .0000416  1.2180 0.0303  I     3.674     .731    -1.582     .248   .058000   .200000  -.3316000      .000      .000  
+87 5 7 46922.00 I   .054880  .000536   .201348  .000707  I -.3335849  .0000430  1.3842 0.0358  I     3.998     .706    -1.634     .256   .056000   .200000  -.3330000      .000      .000  
+87 5 8 46923.00 I   .054226  .000469   .201005  .000804  I -.3350588  .0000583  1.5661 0.0428  I     3.928     .409    -1.353     .211   .055000   .200000  -.3346000      .000      .000  
+87 5 9 46924.00 I   .053433  .000540   .200748  .000747  I -.3367160  .0000741  1.7447 0.0473  I     3.409     .463     -.962     .227   .054000   .200000  -.3363000      .000      .000  
+87 510 46925.00 I   .052428  .000540   .200544  .000747  I -.3385294  .0000746  1.8668 0.0444  I     2.699     .463     -.637     .227   .052000   .199000  -.3382000      .000      .000  
+87 511 46926.00 I   .051219  .000467   .200369  .000698  I -.3404133  .0000488  1.8800 0.0428  I     2.101     .558     -.335     .263   .051000   .199000  -.3401000      .000      .000  
+87 512 46927.00 I   .049840  .000374   .200207  .000485  I -.3422469  .0000418  1.7658 0.0325  I     1.637     .653     -.061     .204   .049000   .199000  -.3420000      .000      .000  
+87 513 46928.00 I   .048329  .000279   .200022  .000507  I -.3439092  .0000428  1.5445 0.0250  I     1.152     .735      .027     .118   .048000   .198000  -.3437000      .000      .000  
+87 514 46929.00 I   .046729  .000254   .199778  .000464  I -.3453195  .0000275  1.2738 0.0371  I      .704     .735     -.178     .118   .047000   .198000  -.3451000      .000      .000  
+87 515 46930.00 I   .045091  .000274   .199449  .000479  I -.3464683  .0000607  1.0374 0.0295  I      .633     .735     -.561     .118   .045000   .198000  -.3462000      .000      .000  
+87 516 46931.00 I   .043468  .000318   .199072  .000469  I -.3474324  .0000522  0.9151 0.0383  I     1.138     .735     -.884     .118   .043000   .197000  -.3472000      .000      .000  
+87 517 46932.00 I   .041909  .000513   .198704  .000638  I -.3483486  .0000466  0.9430 0.0424  I     2.025     .568    -1.007     .304   .042000   .197000  -.3482000      .000      .000  
+87 518 46933.00 I   .040463  .000551   .198405  .000837  I -.3493633  .0000669  1.1054 0.0406  I     2.882     .323     -.959     .413   .041000   .197000  -.3492000      .000      .000  
+87 519 46934.00 I   .039181  .000551   .198239  .000837  I -.3505857  .0000665  1.3466 0.0568  I     3.403     .323     -.849     .413   .039000   .197000  -.3505000      .000      .000  
+87 520 46935.00 I   .038100  .000622   .198265  .000994  I -.3520593  .0000917  1.5962 0.0447  I     3.536     .323     -.750     .413   .038000   .196000  -.3520000      .000      .000  
+87 521 46936.00 I   .037168  .000813   .198481  .001149  I -.3537602  .0000597  1.7922 0.0514  I     3.418     .323     -.675     .413   .037000   .196000  -.3538000      .000      .000  
+87 522 46937.00 I   .036280  .000865   .198815  .001210  I -.3556124  .0000465  1.8942 0.0415  I     3.161     .350     -.597     .345   .036000   .196000  -.3557000      .000      .000  
+87 523 46938.00 I   .035329  .000895   .199181  .001320  I -.3575135  .0000576  1.8907 0.0371  I     2.770     .401     -.481     .224   .035000   .196000  -.3576000      .000      .000  
+87 524 46939.00 I   .034223  .000897   .199476  .001206  I -.3593644  .0000578  1.7988 0.0413  I     2.225     .401     -.308     .224   .034000   .195000  -.3594000      .000      .000  
+87 525 46940.00 I   .032936  .000897   .199579  .001206  I -.3610880  .0000593  1.6377 0.0331  I     1.611     .401     -.140     .224   .034000   .195000  -.3611000      .000      .000  
+87 526 46941.00 I   .031586  .000867   .199492  .001159  I -.3626238  .0000324  1.4288 0.0341  I     1.208     .401     -.193     .224   .033000   .195000  -.3625000      .000      .000  
+87 527 46942.00 I   .030268  .000693   .199271  .001069  I -.3639418  .0000337  1.2087 0.0240  I     1.113     .690     -.549     .216   .032000   .195000  -.3637000      .000      .000  
+87 528 46943.00 I   .029042  .000405   .198973  .000674  I -.3650490  .0000353  1.0122 0.0265  I     1.161     .730    -1.032     .168   .031000   .195000  -.3647000      .000      .000  
+87 529 46944.00 I   .027961  .000237   .198658  .000747  I -.3659816  .0000410  0.8619 0.0270  I     1.179     .800    -1.340     .184   .030000   .195000  -.3655000      .000      .000  
+87 530 46945.00 I   .027069  .000233   .198384  .000842  I -.3667955  .0000408  0.7798 0.0279  I     1.103     .800    -1.262     .184   .030000   .195000  -.3663000      .000      .000  
+87 531 46946.00 I   .026356  .000210   .198192  .000781  I -.3675670  .0000378  0.7751 0.0306  I      .974     .800    -1.017     .184   .029000   .195000  -.3670000      .000      .000  
+87 6 1 46947.00 I   .025775  .000224   .198083  .000727  I -.3683667  .0000457  0.8332 0.0331  I      .852     .665     -.875     .201   .029000   .195000  -.3678000      .000      .000  
+87 6 2 46948.00 I   .025279  .000173   .198053  .000671  I -.3692478  .0000543  0.9344 0.0377  I      .828     .323     -.884     .199   .028000   .195000  -.3687000      .000      .000  
+87 6 3 46949.00 I   .024820  .000191   .198093  .000419  I -.3702416  .0000599  1.0539 0.0408  I     1.019     .388     -.894     .224   .027000   .195000  -.3698000      .000      .000  
+87 6 4 46950.00 I   .024353  .000268   .198199  .000477  I -.3713598  .0000608  1.1861 0.0431  I     1.395     .522     -.770     .191   .027000   .195000  -.3711000      .000      .000  
+87 6 5 46951.00 I   .023855  .000268   .198360  .000477  I -.3726176  .0000621  1.3299 0.0434  I     1.621     .522     -.588     .191   .026000   .195000  -.3726000      .000      .000  
+87 6 6 46952.00 I   .023324  .000268   .198545  .000477  I -.3740154  .0000620  1.4612 0.0427  I     1.389     .522     -.519     .191   .025000   .196000  -.3742000      .000      .000  
+87 6 7 46953.00 I   .022759  .000811   .198715  .000462  I -.3755227  .0000586  1.5407 0.0443  I      .772     .629     -.539     .151   .025000   .196000  -.3759000      .000      .000  
+87 6 8 46954.00 I   .022130  .000848   .198843  .000468  I -.3770620  .0000632  1.5158 0.0434  I      .124     .532     -.444     .128   .024000   .196000  -.3775000      .000      .000  
+87 6 9 46955.00 I   .021384  .000848   .198929  .000468  I -.3785134  .0000640  1.3683 0.0422  I     -.348     .532     -.171     .128   .023000   .197000  -.3790000      .000      .000  
+87 610 46956.00 I   .020463  .000920   .198976  .000403  I -.3797706  .0000559  1.1367 0.0369  I     -.710     .218      .050     .298   .022000   .197000  -.3802000      .000      .000  
+87 611 46957.00 I   .019334  .000928   .198993  .000378  I -.3807825  .0000368  0.8922 0.0349  I     -.928     .449     -.054     .149   .021000   .198000  -.3812000      .000      .000  
+87 612 46958.00 I   .018054  .000928   .199008  .000378  I -.3815793  .0000418  0.7205 0.0321  I     -.807     .449     -.419     .149   .020000   .198000  -.3819000      .000      .000  
+87 613 46959.00 I   .016708  .000928   .199060  .000378  I -.3822681  .0000525  0.6826 0.0334  I     -.282     .449     -.717     .149   .019000   .199000  -.3826000      .000      .000  
+87 614 46960.00 I   .015382  .000514   .199185  .000416  I -.3829938  .0000520  0.7926 0.0420  I      .350     .524     -.739     .176   .018000   .199000  -.3833000      .000      .000  
+87 615 46961.00 I   .014115  .000474   .199396  .000386  I -.3838894  .0000657  1.0108 0.0368  I      .694     .524     -.581     .176   .017000   .200000  -.3842000      .000      .000  
+87 616 46962.00 I   .012925  .000470   .199696  .000453  I -.3850249  .0000521  1.2576 0.0482  I      .593     .422     -.420     .125   .016000   .200000  -.3853000      .000      .000  
+87 617 46963.00 I   .011828  .000445   .200086  .000452  I -.3863871  .0000706  1.4519 0.0448  I      .179     .415     -.295     .298   .014000   .201000  -.3867000      .000      .000  
+87 618 46964.00 I   .010807  .000445   .200548  .000452  I -.3878939  .0000728  1.5417 0.0486  I     -.311     .415     -.177     .298   .013000   .201000  -.3883000      .000      .000  
+87 619 46965.00 I   .009827  .000445   .201057  .000452  I -.3894316  .0000669  1.5150 0.0459  I     -.683     .415     -.125     .298   .012000   .202000  -.3898000      .000      .000  
+87 620 46966.00 I   .008835  .000389   .201586  .000672  I -.3908886  .0000560  1.3826 0.0380  I     -.751     .415     -.236     .298   .011000   .202000  -.3912000      .000      .000  
+87 621 46967.00 I   .007817  .000405   .202110  .000738  I -.3921712  .0000359  1.1733 0.0295  I     -.609     .831     -.463     .275   .010000   .203000  -.3925000      .000      .000  
+87 622 46968.00 I   .006773  .000227   .202608  .000483  I -.3932229  .0000183  0.9271 0.0192  I     -.539    1.065     -.641     .359   .008000   .203000  -.3935000      .000      .000  
+87 623 46969.00 I   .005702  .000236   .203054  .000491  I -.3940250  .0000136  0.6799 0.0102  I     -.718    1.051     -.657     .361   .007000   .204000  -.3942000      .000      .000  
+87 624 46970.00 I   .004581  .000236   .203435  .000491  I -.3945922  .0000088  0.4613 0.0106  I    -1.184    1.051     -.532     .361   .006000   .205000  -.3948000      .000      .000  
+87 625 46971.00 I   .003328  .000253   .203807  .000561  I -.3949640  .0000162  0.2919 0.0108  I    -1.594    1.051     -.649     .361   .005000   .205000  -.3951000      .000      .000  
+87 626 46972.00 I   .001879  .000364   .204234  .000645  I -.3952013  .0000197  0.1984 0.0131  I    -1.945     .875     -.891     .300   .003000   .206000  -.3954000      .000      .000  
+87 627 46973.00 I   .000318  .000364   .204697  .000554  I -.3953915  .0000205  0.1971 0.0145  I    -2.344     .709     -.879     .216   .002000   .206000  -.3956000      .000      .000  
+87 628 46974.00 I  -.001239  .000373   .205162  .000580  I -.3956235  .0000214  0.2798 0.0293  I    -2.655     .516     -.559     .152   .001000   .207000  -.3959000      .000      .000  
+87 629 46975.00 I  -.002680  .000603   .205607  .000943  I -.3959716  .0000549  0.4240 0.0279  I    -2.707     .568     -.154     .171   .000000   .207000  -.3963000      .000      .000  
+87 630 46976.00 I  -.003968  .000629   .206069  .000923  I -.3964826  .0000515  0.6014 0.0330  I    -2.274     .568     -.082     .171  -.002000   .208000  -.3969000      .000      .000  
+87 7 1 46977.00 I  -.005103  .000608   .206556  .000784  I -.3971767  .0000366  0.7857 0.0325  I    -1.457     .553     -.241     .299  -.003000   .209000  -.3976000      .000      .000  
+87 7 2 46978.00 I  -.006110  .000382   .207053  .000896  I -.3980465  .0000396  0.9475 0.0328  I     -.698     .623     -.195     .350  -.004000   .209000  -.3985000      .000      .000  
+87 7 3 46979.00 I  -.007044  .000444   .207548  .000632  I -.3990551  .0000545  1.0596 0.0343  I     -.394     .518      .046     .363  -.005000   .210000  -.3996000      .000      .000  
+87 7 4 46980.00 I  -.007966  .000426   .208033  .000457  I -.4001420  .0000559  1.1007 0.0353  I     -.789     .591      .147     .413  -.007000   .210000  -.4006000      .000      .000  
+87 7 5 46981.00 I  -.008911  .000359   .208509  .000314  I -.4012269  .0000448  1.0528 0.0365  I    -1.793     .513      .018     .474  -.008000   .211000  -.4017000      .000      .000  
+87 7 6 46982.00 I  -.009909  .000300   .208988  .000275  I -.4022166  .0000470  0.9117 0.0337  I    -2.994     .635     -.114     .343  -.009000   .211000  -.4026000      .000      .000  
+87 7 7 46983.00 I  -.010986  .000223   .209478  .000207  I -.4030268  .0000504  0.7002 0.0388  I    -4.034     .686     -.045     .298  -.010000   .212000  -.4034000      .000      .000  
+87 7 8 46984.00 I  -.012169  .000320   .209989  .000400  I -.4036106  .0000617  0.4697 0.0392  I    -4.800     .686      .136     .298  -.012000   .213000  -.4039000      .000      .000  
+87 7 9 46985.00 I  -.013472  .000349   .210517  .000487  I -.4039816  .0000600  0.2854 0.0434  I    -5.220     .686      .197     .298  -.013000   .213000  -.4042000      .000      .000  
+87 710 46986.00 I  -.014873  .000429   .211044  .000464  I -.4042189  .0000610  0.2135 0.0432  I    -5.067     .686      .109     .298  -.014000   .214000  -.4044000      .000      .000  
+87 711 46987.00 I  -.016356  .000589   .211553  .000454  I -.4044596  .0000622  0.2947 0.0485  I    -4.402     .739      .074     .298  -.016000   .215000  -.4046000      .000      .000  
+87 712 46988.00 I  -.017869  .000681   .212064  .000521  I -.4048559  .0000753  0.5186 0.0552  I    -3.672     .740      .191     .298  -.017000   .216000  -.4050000      .000      .000  
+87 713 46989.00 I  -.019344  .000783   .212606  .000599  I -.4055222  .0000913  0.8188 0.0609  I    -3.319     .810      .291     .110  -.018000   .216000  -.4057000      .000      .000  
+87 714 46990.00 I  -.020705  .000756   .213196  .000479  I -.4064820  .0000958  1.0846 0.0658  I    -3.523     .810      .203     .110  -.019000   .217000  -.4066000      .000      .000  
+87 715 46991.00 I  -.021913  .000742   .213841  .000532  I -.4076496  .0000949  1.2249 0.0600  I    -4.130    1.046      .029     .224  -.020000   .218000  -.4078000      .000      .000  
+87 716 46992.00 I  -.022946  .000600   .214544  .000297  I -.4088811  .0000721  1.2130 0.0610  I    -4.927    1.293     -.021     .290  -.021000   .219000  -.4090000      .000      .000  
+87 717 46993.00 I  -.023784  .000453   .215306  .000302  I -.4100321  .0000768  1.0706 0.0520  I    -5.712    1.336      .047     .323  -.022000   .219000  -.4101000      .000      .000  
+87 718 46994.00 I  -.024434  .000453   .216111  .000302  I -.4109970  .0000750  0.8523 0.0538  I    -6.226    1.336      .012     .323  -.023000   .220000  -.4111000      .000      .000  
+87 719 46995.00 I  -.024929  .000413   .216938  .000327  I -.4117266  .0000753  0.6039 0.0473  I    -6.433    1.336     -.129     .323  -.023000   .221000  -.4118000      .000      .000  
+87 720 46996.00 I  -.025340  .000429   .217783  .000392  I -.4122057  .0000576  0.3584 0.0442  I    -6.574    1.214     -.172     .355  -.024000   .222000  -.4123000      .000      .000  
+87 721 46997.00 I  -.025680  .000366   .218647  .000366  I -.4124557  .0000463  0.1500 0.0354  I    -6.743     .954     -.130     .484  -.024000   .222000  -.4126000      .000      .000  
+87 722 46998.00 I  -.025937  .000302   .219537  .000334  I -.4125270  .0000412  0.0054 0.0329  I    -6.845     .261     -.246     .502  -.025000   .223000  -.4126000      .000      .000  
+87 723 46999.00 I  -.026102  .000270   .220452  .000394  I -.4124929  .0000468 -0.0602 0.0313  I    -6.713     .290     -.728     .556  -.025000   .224000  -.4126000      .000      .000  
+87 724 47000.00 I  -.026180  .000270   .221376  .000394  I -.4124338  .0000471 -0.0442 0.0303  I    -6.470     .290     -.981     .556  -.025000   .225000  -.4125000      .000      .000  
+87 725 47001.00 I  -.026210  .000268   .222271  .000388  I -.4124291  .0000386  0.0454 0.0302  I    -6.292     .290     -.888     .556  -.025000   .226000  -.4125000      .000      .000  
+87 726 47002.00 I  -.026216  .000266   .223132  .000432  I -.4125424  .0000378  0.1882 0.0266  I    -6.218     .457     -.512     .494  -.026000   .226000  -.4126000      .000      .000  
+87 727 47003.00 I  -.026225  .000136   .223964  .000322  I -.4128161  .0000365  0.3627 0.0335  I    -6.222     .552     -.040     .326  -.026000   .227000  -.4129000      .000      .000  
+87 728 47004.00 I  -.026262  .000176   .224772  .000483  I -.4132713  .0000553  0.5476 0.0393  I    -6.281     .668      .264     .342  -.026000   .228000  -.4133000      .000      .000  
+87 729 47005.00 I  -.026357  .000139   .225559  .000398  I -.4139051  .0000696  0.7139 0.0332  I    -6.363     .668      .338     .342  -.026000   .229000  -.4140000      .000      .000  
+87 730 47006.00 I  -.026538  .000353   .226339  .000367  I -.4146832  .0000367  0.8326 0.0396  I    -6.430     .668      .314     .342  -.026000   .230000  -.4148000      .000      .000  
+87 731 47007.00 I  -.026828  .000392   .227130  .000548  I -.4155480  .0000378  0.8845 0.0274  I    -6.528     .788      .273     .232  -.027000   .230000  -.4156000      .000      .000  
+87 8 1 47008.00 I  -.027249  .000413   .227951  .000608  I -.4164262  .0000407  0.8583 0.0280  I    -6.793     .859      .148     .298  -.027000   .231000  -.4165000      .000      .000  
+87 8 2 47009.00 I  -.027824  .000413   .228830  .000608  I -.4172396  .0000413  0.7571 0.0315  I    -7.282     .859     -.111     .298  -.027000   .232000  -.4174000      .000      .000  
+87 8 3 47010.00 I  -.028553  .000413   .229784  .000608  I -.4179193  .0000482  0.5928 0.0336  I    -7.851     .859     -.391     .298  -.028000   .233000  -.4181000      .000      .000  
+87 8 4 47011.00 I  -.029366  .000478   .230769  .000672  I -.4184132  .0000531  0.3927 0.0356  I    -8.282     .859     -.534     .298  -.028000   .234000  -.4186000      .000      .000  
+87 8 5 47012.00 I  -.030185  .000552   .231733  .000647  I -.4187114  .0000525  0.2128 0.0530  I    -8.423     .747     -.533     .166  -.028000   .234000  -.4189000      .000      .000  
+87 8 6 47013.00 I  -.030950  .000568   .232651  .000627  I -.4188688  .0000917  0.1229 0.0437  I    -8.236     .540     -.506     .232  -.029000   .235000  -.4191000      .000      .000  
+87 8 7 47014.00 I  -.031605  .000482   .233510  .000421  I -.4190079  .0000699  0.1852 0.0578  I    -7.793     .540     -.467     .232  -.030000   .236000  -.4193000      .000      .000  
+87 8 8 47015.00 I  -.032125  .000482   .234318  .000421  I -.4192911  .0000705  0.4030 0.0481  I    -7.319     .564     -.311     .203  -.030000   .237000  -.4195000      .000      .000  
+87 8 9 47016.00 I  -.032557  .000471   .235103  .000414  I -.4198449  .0000661  0.7136 0.0464  I    -7.053     .564     -.078     .203  -.030000   .238000  -.4200000      .000      .000  
+87 810 47017.00 I  -.032972  .000595   .235882  .000593  I -.4207195  .0000604  1.0279 0.0425  I    -6.993    1.691     -.052     .762  -.031000   .239000  -.4209000      .000      .000  
+87 811 47018.00 I  -.033433  .000435   .236668  .000552  I -.4218732  .0000535  1.2599 0.0371  I    -6.859    2.145     -.466     .976  -.032000   .239000  -.4221000      .000      .000  
+87 812 47019.00 I  -.033981  .000487   .237483  .000592  I -.4231936  .0000430  1.3549 0.0355  I    -6.603    2.145    -1.100     .976  -.032000   .240000  -.4234000      .000      .000  
+87 813 47020.00 I  -.034635  .000438   .238350  .000530  I -.4245314  .0000467  1.2953 0.0430  I    -6.641    2.145    -1.438     .976  -.032000   .241000  -.4248000      .000      .000  
+87 814 47021.00 I  -.035353  .000827   .239274  .000758  I -.4257428  .0000745  1.1117 0.0428  I    -7.136    2.572    -1.366    1.159  -.033000   .242000  -.4261000      .000      .000  
+87 815 47022.00 I  -.036075  .000856   .240246  .000732  I -.4267350  .0000718  0.8687 0.0520  I    -7.828    1.994    -1.180    1.018  -.034000   .243000  -.4271000      .000      .000  
+87 816 47023.00 I  -.036740  .000785   .241261  .000407  I -.4274817  .0000726  0.6301 0.0520  I    -8.349    1.158    -1.141     .855  -.034000   .244000  -.4279000      .000      .000  
+87 817 47024.00 I  -.037298  .000785   .242313  .000407  I -.4280123  .0000752  0.4429 0.0515  I    -8.597    1.158    -1.197     .855  -.034000   .245000  -.4284000      .000      .000  
+87 818 47025.00 I  -.037712  .000785   .243403  .000407  I -.4283918  .0000731  0.3286 0.0512  I    -8.723    1.158    -1.160     .855  -.035000   .246000  -.4288000      .000      .000  
+87 819 47026.00 I  -.038015  .000830   .244553  .000469  I -.4286951  .0000696  0.2909 0.0431  I    -8.859    1.158    -1.005     .855  -.035000   .247000  -.4291000      .000      .000  
+87 820 47027.00 I  -.038232  .000815   .245777  .000529  I -.4289996  .0000455  0.3310 0.0411  I    -8.969     .925     -.880     .691  -.035000   .248000  -.4293000      .000      .000  
+87 821 47028.00 I  -.038367  .000666   .247084  .000493  I -.4293826  .0000438  0.4476 0.0415  I    -9.025     .519     -.842     .414  -.036000   .249000  -.4297000      .000      .000  
+87 822 47029.00 I  -.038417  .000800   .248479  .000512  I -.4299181  .0000694  0.6340 0.0426  I    -9.120     .519     -.749     .414  -.036000   .250000  -.4301000      .000      .000  
+87 823 47030.00 I  -.038349  .000800   .249945  .000512  I -.4306659  .0000731  0.8664 0.0471  I    -9.337     .519     -.483     .414  -.036000   .251000  -.4308000      .000      .000  
+87 824 47031.00 I  -.038177  .000727   .251444  .000659  I -.4316518  .0000636  1.1016 0.0493  I    -9.611     .870     -.287     .409  -.036000   .252000  -.4317000      .000      .000  
+87 825 47032.00 I  -.037996  .000643   .252925  .000899  I -.4328582  .0000662  1.3043 0.0498  I    -9.766     .819     -.312     .388  -.036000   .253000  -.4327000      .000      .000  
+87 826 47033.00 I  -.037882  .000586   .254343  .000889  I -.4342427  .0000767  1.4540 0.0588  I    -9.610     .876     -.402     .301  -.036000   .254000  -.4340000      .000      .000  
+87 827 47034.00 I  -.037847  .000519   .255669  .000950  I -.4357424  .0000973  1.5322 0.0591  I    -9.027     .969     -.281     .316  -.036000   .256000  -.4354000      .000      .000  
+87 828 47035.00 I  -.037895  .000313   .256887  .001041  I -.4372807  .0000899  1.5311 0.0626  I    -8.509     .969     -.174     .316  -.037000   .257000  -.4369000      .000      .000  
+87 829 47036.00 I  -.038023  .000355   .258032  .000954  I -.4387741  .0000787  1.4384 0.0582  I    -8.480     .969     -.151     .316  -.037000   .258000  -.4383000      .000      .000  
+87 830 47037.00 I  -.038225  .000375   .259111  .001024  I -.4401286  .0000738  1.2589 0.0602  I    -8.932     .697     -.194     .241  -.037000   .259000  -.4395000      .000      .000  
+87 831 47038.00 I  -.038498  .000303   .260125  .000969  I -.4412756  .0000911  1.0306 0.0532  I    -9.637     .688     -.308     .122  -.037000   .260000  -.4406000      .000      .000  
+87 9 1 47039.00 I  -.038840  .000351   .261097  .000696  I -.4421910  .0000767  0.8061 0.0544  I   -10.255     .670     -.450     .143  -.037000   .261000  -.4415000      .000      .000  
+87 9 2 47040.00 I  -.039245  .000378   .262047  .000682  I -.4429115  .0000595  0.6527 0.0495  I   -10.417     .670     -.573     .143  -.037000   .262000  -.4423000      .000      .000  
+87 9 3 47041.00 I  -.039685  .000408   .262965  .000782  I -.4435399  .0000626  0.6296 0.0406  I   -10.029     .670     -.651     .143  -.038000   .263000  -.4430000      .000      .000  
+87 9 4 47042.00 I  -.040124  .000411   .263832  .000746  I -.4442230  .0000554  0.7633 0.0673  I    -9.290     .797     -.624     .358  -.038000   .264000  -.4437000      .000      .000  
+87 9 5 47043.00 I  -.040523  .000354   .264630  .000626  I -.4451130  .0001191  1.0366 0.0657  I    -8.587     .906     -.416     .485  -.038000   .265000  -.4447000      .000      .000  
+87 9 6 47044.00 I  -.040855  .000526   .265354  .000657  I -.4463229  .0001191  1.3900 0.0842  I    -8.290     .906     -.075     .485  -.039000   .266000  -.4460000      .000      .000  
+87 9 7 47045.00 I  -.041118  .000526   .266020  .000657  I -.4478847  .0001191  1.7187 0.0789  I    -8.450     .906      .183     .485  -.039000   .267000  -.4476000      .000      .000  
+87 9 8 47046.00 I  -.041363  .000552   .266679  .000644  I -.4497182  .0001035  1.9213 0.0728  I    -8.761     .906      .165     .485  -.040000   .268000  -.4495000      .000      .000  
+87 9 9 47047.00 I  -.041653  .000547   .267387  .000655  I -.4516703  .0000836  1.9531 0.0694  I    -8.990     .662     -.054     .475  -.040000   .269000  -.4514000      .000      .000  
+87 910 47048.00 I  -.042021  .000569   .268187  .000561  I -.4535705  .0000926  1.8233 0.0512  I    -9.275     .216     -.206     .390  -.040000   .270000  -.4534000      .000      .000  
+87 911 47049.00 I  -.042457  .000569   .269114  .000561  I -.4552813  .0000591  1.5866 0.0630  I    -9.842     .216     -.165     .390  -.041000   .271000  -.4551000      .000      .000  
+87 912 47050.00 I  -.042953  .000446   .270192  .000563  I -.4567302  .0000854  1.3093 0.0492  I   -10.563     .216     -.089     .390  -.041000   .272000  -.4565000      .000      .000  
+87 913 47051.00 I  -.043493  .000504   .271416  .000723  I -.4579047  .0000786  1.0462 0.0568  I   -11.005     .216     -.149     .390  -.042000   .273000  -.4577000      .000      .000  
+87 914 47052.00 I  -.044063  .000506   .272731  .001045  I -.4588415  .0000750  0.8397 0.0572  I   -10.949     .281     -.292     .309  -.042000   .274000  -.4587000      .000      .000  
+87 915 47053.00 I  -.044648  .000502   .274073  .001134  I -.4596119  .0000830  0.7165 0.0611  I   -10.581     .309     -.333     .106  -.043000   .275000  -.4595000      .000      .000  
+87 916 47054.00 I  -.045227  .000583   .275365  .001194  I -.4603080  .0000965  0.6937 0.0674  I   -10.176     .355     -.225     .126  -.043000   .276000  -.4603000      .000      .000  
+87 917 47055.00 I  -.045787  .000540   .276532  .001062  I -.4610335  .0001062  0.7733 0.0635  I    -9.859     .355     -.114     .126  -.044000   .277000  -.4611000      .000      .000  
+87 918 47056.00 I  -.046373  .000617   .277570  .001111  I -.4618809  .0000827  0.9316 0.0632  I    -9.614     .355     -.112     .126  -.045000   .278000  -.4620000      .000      .000  
+87 919 47057.00 I  -.046997  .000643   .278534  .001047  I -.4629139  .0000685  1.1414 0.0616  I    -9.438     .341     -.129     .130  -.045000   .279000  -.4631000      .000      .000  
+87 920 47058.00 I  -.047655  .000632   .279488  .001034  I -.4641732  .0000912  1.3796 0.0502  I    -9.309     .327     -.007     .134  -.046000   .280000  -.4644000      .000      .000  
+87 921 47059.00 I  -.048324  .000481   .280493  .000494  I -.4656749  .0000734  1.6231 0.0583  I    -9.117     .327      .263     .134  -.046000   .281000  -.4659000      .000      .000  
+87 922 47060.00 I  -.048973  .000481   .281599  .000494  I -.4674083  .0000725  1.8331 0.0448  I    -8.764     .348      .515     .113  -.047000   .282000  -.4676000      .000      .000  
+87 923 47061.00 I  -.049614  .000491   .282841  .000577  I -.4693152  .0000513  1.9653 0.0426  I    -8.383     .348      .580     .113  -.048000   .284000  -.4694000      .000      .000  
+87 924 47062.00 I  -.050272  .000492   .284240  .000634  I -.4713061  .0000449  1.9989 0.0392  I    -8.196     .365      .436     .136  -.048000   .285000  -.4714000      .000      .000  
+87 925 47063.00 I  -.050944  .000420   .285787  .000679  I -.4732788  .0000593  1.9298 0.0382  I    -8.331     .501      .203     .121  -.049000   .286000  -.4732000      .000      .000  
+87 926 47064.00 I  -.051614  .000420   .287435  .000679  I -.4751360  .0000618  1.7717 0.0488  I    -8.724     .501      .020     .121  -.050000   .288000  -.4750000      .000      .000  
+87 927 47065.00 I  -.052266  .000494   .289135  .000754  I -.4768015  .0000776  1.5516 0.0507  I    -9.242     .501     -.074     .121  -.050000   .289000  -.4765000      .000      .000  
+87 928 47066.00 I  -.052910  .000618   .290855  .000780  I -.4782346  .0000804  1.3176 0.0527  I    -9.577     .532     -.147     .137  -.051000   .291000  -.4779000      .000      .000  
+87 929 47067.00 I  -.053555  .000726   .292544  .000861  I -.4794534  .0000713  1.1338 0.0563  I    -9.584     .676     -.248     .385  -.052000   .292000  -.4791000      .000      .000  
+87 930 47068.00 I  -.054200  .000669   .294149  .000798  I -.4805379  .0000787  1.0572 0.0489  I    -9.251     .816     -.374     .484  -.052000   .294000  -.4802000      .000      .000  
+8710 1 47069.00 I  -.054800  .000720   .295654  .000744  I -.4816162  .0000668  1.1257 0.0513  I    -8.618     .846     -.444     .576  -.053000   .295000  -.4813000      .000      .000  
+8710 2 47070.00 I  -.055299  .000720   .297063  .000744  I -.4828365  .0000659  1.3358 0.0396  I    -7.876     .846     -.359     .576  -.054000   .296000  -.4826000      .000      .000  
+8710 3 47071.00 I  -.055709  .000743   .298407  .000497  I -.4843190  .0000427  1.6393 0.0426  I    -7.311     .846     -.089     .576  -.055000   .298000  -.4842000      .000      .000  
+8710 4 47072.00 I  -.056069  .000717   .299702  .000478  I -.4861217  .0000541  1.9624 0.0440  I    -7.129     .688      .293     .457  -.055000   .299000  -.4861000      .000      .000  
+8710 5 47073.00 I  -.056419  .000557   .300959  .000379  I -.4882227  .0000769  2.2222 0.0470  I    -7.287     .100      .627     .298  -.056000   .300000  -.4883000      .000      .000  
+8710 6 47074.00 I  -.056798  .000570   .302186  .000027  I -.4905233  .0000769  2.3536 0.0563  I    -7.541     .100      .756     .298  -.056000   .302000  -.4906000      .000      .000  
+8710 7 47075.00 I  -.057215  .000570   .303393  .000027  I -.4928758  .0000822  2.3228 0.0538  I    -7.731     .100      .651     .298  -.057000   .303000  -.4930000      .000      .000  
+8710 8 47076.00 I  -.057662  .000494   .304588  .000144  I -.4951190  .0000754  2.1424 0.0519  I    -7.946     .100      .444     .298  -.058000   .304000  -.4952000      .000      .000  
+8710 9 47077.00 I  -.058140  .000359   .305779  .000249  I -.4971304  .0000633  1.8714 0.0467  I    -8.366     .822      .274     .298  -.058000   .305000  -.4971000      .000      .000  
+871010 47078.00 I  -.058658  .000276   .306976  .000268  I -.4988550  .0000552  1.5800 0.0552  I    -8.949    1.011      .160     .375  -.059000   .307000  -.4988000      .000      .000  
+871011 47079.00 I  -.059234  .000276   .308184  .000268  I -.5003025  .0000904  1.3249 0.0632  I    -9.362    1.011      .082     .375  -.059000   .308000  -.5002000      .000      .000  
+871012 47080.00 I  -.059879  .000621   .309408  .000643  I -.5015304  .0001136  1.1467 0.0617  I    -9.281    1.011      .097     .375  -.060000   .309000  -.5014000      .000      .000  
+871013 47081.00 I  -.060578  .000534   .310627  .000544  I -.5026280  .0000839  1.0649 0.0642  I    -8.711    1.011      .264     .375  -.060000   .310000  -.5025000      .000      .000  
+871014 47082.00 I  -.061318  .000527   .311812  .000542  I -.5036915  .0000599  1.0770 0.0531  I    -7.906     .811      .515     .284  -.060000   .311000  -.5035000      .000      .000  
+871015 47083.00 I  -.062070  .000570   .312940  .000562  I -.5048089  .0000651  1.1697 0.0456  I    -7.139     .590      .670     .124  -.061000   .313000  -.5046000      .000      .000  
+871016 47084.00 I  -.062740  .000570   .314034  .000562  I -.5060519  .0000687  1.3253 0.0410  I    -6.603     .590      .608     .124  -.061000   .314000  -.5059000      .000      .000  
+871017 47085.00 I  -.063223  .000511   .315126  .000550  I -.5074719  .0000500  1.5180 0.0371  I    -6.414     .590      .389     .124  -.062000   .315000  -.5073000      .000      .000  
+871018 47086.00 I  -.063481  .000354   .316244  .000459  I -.5090887  .0000278  1.7132 0.0289  I    -6.384     .513      .270     .115  -.062000   .316000  -.5089000      .000      .000  
+871019 47087.00 I  -.063542  .000364   .317388  .000478  I -.5108898  .0000288  1.8830 0.0249  I    -6.344     .640      .390     .124  -.062000   .317000  -.5107000      .000      .000  
+871020 47088.00 I  -.063443  .000286   .318552  .000537  I -.5128381  .0000412  2.0031 0.0282  I    -6.341     .618      .658     .121  -.062000   .318000  -.5127000      .000      .000  
+871021 47089.00 I  -.063229  .000268   .319720  .000567  I -.5148723  .0000484  2.0520 0.0286  I    -6.444     .542      .948     .139  -.062000   .319000  -.5147000      .000      .000  
+871022 47090.00 I  -.062982  .000268   .320871  .000567  I -.5169156  .0000398  2.0215 0.0327  I    -6.725     .542     1.123     .139  -.063000   .320000  -.5168000      .000      .000  
+871023 47091.00 I  -.062783  .000281   .322005  .000537  I -.5188895  .0000439  1.9137 0.0311  I    -7.055     .542     1.224     .139  -.063000   .321000  -.5187000      .000      .000  
+871024 47092.00 I  -.062657  .000325   .323114  .000574  I -.5207186  .0000479  1.7328 0.0352  I    -7.282     .549     1.206     .127  -.063000   .322000  -.5205000      .000      .000  
+871025 47093.00 I  -.062589  .000351   .324213  .000599  I -.5223417  .0000551  1.5116 0.0352  I    -7.361     .318     1.096     .120  -.063000   .323000  -.5220000      .000      .000  
+871026 47094.00 I  -.062553  .000342   .325320  .000373  I -.5237487  .0000516  1.3111 0.0397  I    -7.273     .355     1.006     .109  -.063000   .325000  -.5234000      .000      .000  
+871027 47095.00 I  -.062531  .000434   .326452  .000453  I -.5249939  .0000571  1.2005 0.0365  I    -6.979     .420      .973     .298  -.063000   .326000  -.5246000      .000      .000  
+871028 47096.00 I  -.062507  .000436   .327621  .000406  I -.5261949  .0000515  1.2255 0.0349  I    -6.469     .420      .959     .298  -.063000   .327000  -.5257000      .000      .000  
+871029 47097.00 I  -.062459  .000626   .328833  .000365  I -.5274888  .0000400  1.3822 0.0307  I    -5.804     .713      .947     .115  -.063000   .328000  -.5271000      .000      .000  
+871030 47098.00 I  -.062370  .000697   .330089  .000266  I -.5289897  .0000335  1.6301 0.0266  I    -5.128     .776      .961     .132  -.063000   .329000  -.5286000      .000      .000  
+871031 47099.00 I  -.062261  .000697   .331385  .000266  I -.5307583  .0000351  1.9060 0.0248  I    -4.629     .776     1.007     .132  -.063000   .331000  -.5304000      .000      .000  
+8711 1 47100.00 I  -.062173  .000673   .332711  .000724  I -.5327890  .0000365  2.1439 0.0239  I    -4.440     .776     1.060     .132  -.062000   .332000  -.5325000      .000      .000  
+8711 2 47101.00 I  -.062171  .000618   .334055  .000734  I -.5350140  .0000324  2.2854 0.0200  I    -4.597     .685     1.185     .116  -.062000   .333000  -.5348000      .000      .000  
+8711 3 47102.00 I  -.062204  .000450   .335394  .000654  I -.5373157  .0000163  2.2946 0.0179  I    -4.908     .674     1.365     .106  -.062000   .335000  -.5372000      .000      .000  
+8711 4 47103.00 I  -.062184  .000453   .336699  .000690  I -.5395601  .0000152  2.1746 0.0159  I    -5.121     .533     1.497     .298  -.062000   .336000  -.5394000      .000      .000  
+8711 5 47104.00 I  -.062019  .000252   .337962  .000725  I -.5416347  .0000272  1.9640 0.0162  I    -5.123     .572     1.489     .298  -.061000   .337000  -.5415000      .000      .000  
+8711 6 47105.00 I  -.061613  .000252   .339246  .000725  I -.5434731  .0000286  1.7083 0.0193  I    -5.033     .572     1.279     .298  -.061000   .339000  -.5434000      .000      .000  
+8711 7 47106.00 I  -.060956  .000322   .340659  .000564  I -.5450545  .0000274  1.4620 0.0197  I    -5.125     .572     1.015     .298  -.060000   .340000  -.5450000      .000      .000  
+8711 8 47107.00 I  -.060130  .000338   .342210  .000560  I -.5464189  .0000270  1.2809 0.0236  I    -5.393     .755      .856     .233  -.060000   .342000  -.5463000      .000      .000  
+8711 9 47108.00 I  -.059246  .000323   .343883  .000539  I -.5476474  .0000385  1.1930 0.0536  I    -5.526     .787      .869     .262  -.060000   .343000  -.5476000      .000      .000  
+871110 47109.00 I  -.058418  .000471   .345665  .000435  I -.5488370  .0001038  1.2015 0.0489  I    -5.240     .832     1.060     .293  -.059000   .345000  -.5487000      .000      .000  
+871111 47110.00 I  -.057743  .000471   .347539  .000435  I -.5500785  .0000898  1.2942 0.0646  I    -4.455     .832     1.315     .293  -.059000   .346000  -.5500000      .000      .000  
+871112 47111.00 I  -.057237  .000400   .349460  .000473  I -.5514459  .0000768  1.4486 0.0566  I    -3.587     .832     1.430     .293  -.059000   .348000  -.5513000      .000      .000  
+871113 47112.00 I  -.056859  .000444   .351377  .000526  I -.5529858  .0000689  1.6335 0.0557  I    -2.974     .643     1.360     .239  -.058000   .350000  -.5528000      .000      .000  
+871114 47113.00 I  -.056557  .000410   .353241  .000442  I -.5547122  .0000806  1.8162 0.0490  I    -2.673     .389     1.272     .110  -.058000   .351000  -.5545000      .000      .000  
+871115 47114.00 I  -.056266  .000386   .355008  .000494  I -.5566074  .0000697  1.9666 0.0463  I    -2.695     .791     1.326     .125  -.058000   .353000  -.5564000      .000      .000  
+871116 47115.00 I  -.055923  .000422   .356643  .000569  I -.5586307  .0000457  2.0730 0.0407  I    -3.032     .791     1.518     .125  -.057000   .355000  -.5584000      .000      .000  
+871117 47116.00 I  -.055519  .000376   .358163  .000520  I -.5607359  .0000420  2.1271 0.0325  I    -3.601     .791     1.699     .125  -.057000   .356000  -.5605000      .000      .000  
+871118 47117.00 I  -.055096  .000448   .359613  .000501  I -.5628610  .0000461  2.1097 0.0384  I    -4.190     .166     1.766     .196  -.056000   .358000  -.5627000      .000      .000  
+871119 47118.00 I  -.054714  .000455   .361041  .000320  I -.5649276  .0000643  2.0093 0.0404  I    -4.579     .233     1.733     .248  -.056000   .360000  -.5648000      .000      .000  
+871120 47119.00 I  -.054428  .000445   .362491  .000355  I -.5668549  .0000664  1.8348 0.0426  I    -4.704     .233     1.656     .248  -.056000   .362000  -.5667000      .000      .000  
+871121 47120.00 I  -.054270  .000416   .363988  .000365  I -.5685829  .0000558  1.6173 0.0423  I    -4.653     .233     1.566     .248  -.056000   .363000  -.5685000      .000      .000  
+871122 47121.00 I  -.054283  .000374   .365542  .000334  I -.5700928  .0000523  1.4096 0.0402  I    -4.532     .242     1.498     .209  -.056000   .365000  -.5700000      .000      .000  
+871123 47122.00 I  -.054500  .000545   .367150  .000462  I -.5714266  .0000579  1.2753 0.0408  I    -4.375     .253     1.518     .261  -.056000   .366000  -.5713000      .000      .000  
+871124 47123.00 I  -.054941  .000534   .368800  .000491  I -.5726827  .0000626  1.2590 0.0407  I    -4.212     .266     1.647     .270  -.056000   .368000  -.5726000      .000      .000  
+871125 47124.00 I  -.055621  .000512   .370474  .000759  I -.5739870  .0000571  1.3698 0.0585  I    -4.126     .266     1.807     .270  -.057000   .369000  -.5740000      .000      .000  
+871126 47125.00 I  -.056525  .000512   .372135  .000759  I -.5754571  .0000989  1.5849 0.0487  I    -4.098     .266     1.910     .270  -.057000   .371000  -.5756000      .000      .000  
+871127 47126.00 I  -.057559  .000466   .373744  .000688  I -.5771728  .0000788  1.8480 0.0627  I    -4.076     .266     1.935     .270  -.057000   .373000  -.5774000      .000      .000  
+871128 47127.00 I  -.058610  .000710   .375255  .000722  I -.5791443  .0000772  2.0846 0.0574  I    -4.039     .389     1.941     .229  -.058000   .374000  -.5795000      .000      .000  
+871129 47128.00 I  -.059560  .000662   .376646  .000700  I -.5813132  .0000836  2.2349 0.0568  I    -3.996     .418     2.006     .298  -.058000   .375000  -.5817000      .000      .000  
+871130 47129.00 I  -.060283  .000662   .377940  .000700  I -.5835738  .0000834  2.2642 0.0589  I    -3.955     .418     2.164     .298  -.058000   .377000  -.5840000      .000      .000  
+8712 1 47130.00 I  -.060669  .000663   .379173  .000354  I -.5857988  .0000831  2.1652 0.0442  I    -3.876     .418     2.389     .298  -.058000   .378000  -.5863000      .000      .000  
+8712 2 47131.00 I  -.060705  .000598   .380381  .000326  I -.5878707  .0000291  1.9656 0.0515  I    -3.763     .418     2.548     .298  -.058000   .379000  -.5884000      .000      .000  
+8712 3 47132.00 I  -.060455  .000599   .381576  .000330  I -.5897125  .0000607  1.7133 0.0478  I    -3.563     .454     2.569     .141  -.058000   .380000  -.5903000      .000      .000  
+8712 4 47133.00 I  -.059990  .000409   .382762  .000332  I -.5912961  .0000910  1.4573 0.0582  I    -3.235     .435     2.470     .180  -.057000   .382000  -.5918000      .000      .000  
+8712 5 47134.00 I  -.059370  .000378   .383937  .000367  I -.5926399  .0000993  1.2396 0.0637  I    -2.848     .503     2.352     .207  -.057000   .383000  -.5931000      .000      .000  
+8712 6 47135.00 I  -.058644  .000376   .385103  .000434  I -.5937993  .0000893  1.0941 0.0609  I    -2.527     .627     2.391     .428  -.056000   .385000  -.5942000      .000      .000  
+8712 7 47136.00 I  -.057828  .000563   .386266  .000417  I -.5948576  .0000706  1.0373 0.0553  I    -2.336     .684     2.569     .491  -.056000   .386000  -.5952000      .000      .000  
+8712 8 47137.00 I  -.056931  .000515   .387435  .000439  I -.5959009  .0000653  1.0614 0.0443  I    -2.222     .783     2.660     .414  -.055000   .387000  -.5962000      .000      .000  
+8712 9 47138.00 I  -.055941  .000572   .388625  .000474  I -.5970021  .0000536  1.1506 0.0396  I    -2.123     .893     2.326     .492  -.054000   .389000  -.5972000      .000      .000  
+871210 47139.00 I  -.054829  .000572   .389872  .000474  I -.5982189  .0000447  1.2901 0.0348  I    -1.873     .893     1.954     .492  -.053000   .390000  -.5985000      .000      .000  
+871211 47140.00 I  -.053586  .000584   .391201  .000584  I -.5995910  .0000444  1.4557 0.0290  I    -1.522     .893     1.794     .492  -.052000   .391000  -.5998000      .000      .000  
+871212 47141.00 I  -.052243  .000571   .392604  .000492  I -.6011298  .0000369  1.6199 0.0253  I    -1.224     .913     1.859     .400  -.051000   .393000  -.6013000      .000      .000  
+871213 47142.00 I  -.050835  .000559   .394060  .000426  I -.6028227  .0000242  1.7599 0.0237  I    -1.099     .947     2.151     .384  -.050000   .394000  -.6030000      .000      .000  
+871214 47143.00 I  -.049410  .000501   .395542  .000574  I -.6046343  .0000297  1.8540 0.0215  I    -1.287     .803     2.483     .421  -.049000   .395000  -.6048000      .000      .000  
+871215 47144.00 I  -.048052  .000501   .396989  .000574  I -.6065087  .0000355  1.8823 0.0223  I    -1.826     .803     2.586     .421  -.048000   .396000  -.6067000      .000      .000  
+871216 47145.00 I  -.046844  .000422   .398339  .000476  I -.6083731  .0000332  1.8334 0.0248  I    -2.532     .803     2.373     .421  -.047000   .397000  -.6086000      .000      .000  
+871217 47146.00 I  -.045784  .000380   .399552  .000423  I -.6101502  .0000346  1.7085 0.0238  I    -3.189     .699     2.099     .402  -.045000   .399000  -.6104000      .000      .000  
+871218 47147.00 I  -.044816  .000620   .400625  .000408  I -.6117713  .0000340  1.5270 0.0362  I    -3.696     .848     2.006     .403  -.044000   .400000  -.6120000      .000      .000  
+871219 47148.00 I  -.043878  .000621   .401565  .000398  I -.6132009  .0000637  1.3355 0.0327  I    -4.066     .756     2.118     .306  -.043000   .401000  -.6135000      .000      .000  
+871220 47149.00 I  -.042903  .000599   .402385  .000261  I -.6144610  .0000559  1.2001 0.0366  I    -4.232     .742     2.356     .307  -.042000   .402000  -.6147000      .000      .000  
+871221 47150.00 I  -.041828  .000567   .403123  .000252  I -.6156405  .0000362  1.1827 0.0329  I    -3.987     .648     2.350     .262  -.040000   .403000  -.6159000      .000      .000  
+871222 47151.00 I  -.040607  .000584   .403827  .000252  I -.6168739  .0000348  1.3076 0.0235  I    -3.544     .648     2.226     .262  -.039000   .404000  -.6170000      .000      .000  
+871223 47152.00 I  -.039281  .000626   .404537  .000213  I -.6182946  .0000300  1.5493 0.0275  I    -3.221     .698     2.218     .250  -.038000   .405000  -.6184000      .000      .000  
+871224 47153.00 I  -.037899  .000626   .405269  .000213  I -.6199903  .0000425  1.8444 0.0248  I    -3.113     .371     2.251     .298  -.036000   .406000  -.6201000      .000      .000  
+871225 47154.00 I  -.036458  .000367   .406039  .000222  I -.6219738  .0000396  2.1105 0.0393  I    -3.119     .268     2.212     .298  -.035000   .407000  -.6221000      .000      .000  
+871226 47155.00 I  -.034936  .000407   .406865  .000201  I -.6241775  .0000661  2.2750 0.0541  I    -3.094     .316     2.148     .106  -.033000   .408000  -.6243000      .000      .000  
+871227 47156.00 I  -.033335  .000267   .407754  .000421  I -.6264776  .0001007  2.3010 0.0518  I    -3.027     .791     2.192     .298  -.032000   .409000  -.6266000      .000      .000  
+871228 47157.00 I  -.031657  .000102   .408711  .000430  I -.6287351  .0000797  2.1940 0.0644  I    -3.027     .994     2.368     .169  -.030000   .410000  -.6288000      .000      .000  
+871229 47158.00 I  -.029907  .000102   .409744  .000430  I -.6308325  .0000802  1.9879 0.0540  I    -3.147     .994     2.575     .169  -.028000   .411000  -.6309000      .000      .000  
+871230 47159.00 I  -.028088  .000102   .410856  .000430  I -.6326933  .0000730  1.7289 0.0605  I    -3.321     .994     2.709     .169  -.027000   .412000  -.6327000      .000      .000  
+871231 47160.00 I  -.026206  .000102   .412048  .000430  I -.6342906  .0000907  1.4706 0.0456  I    -3.441     .994     2.728     .169  -.025000   .413000  -.6343000      .000      .000  
+88 1 1 47161.00 I  -.024282  .000105   .413287  .000466  I  .3643500  .0000548  1.2587 0.0530  I    -3.420     .994     2.636     .169  -.023000   .414000   .3643000      .000      .000  
+88 1 2 47162.00 I  -.022333  .000380   .414528  .000515  I  .3631681  .0000549  1.1186 0.0443  I    -3.284     .866     2.451     .221  -.021000   .415000   .3631000      .000      .000  
+88 1 3 47163.00 I  -.020379  .000487   .415724  .000509  I  .3620846  .0000696  1.0630 0.0437  I    -3.151     .590     2.267     .292  -.019000   .416000   .3621000      .000      .000  
+88 1 4 47164.00 I  -.018437  .000487   .416831  .000509  I  .3610156  .0000680  1.0870 0.0473  I    -3.083     .590     2.276     .292  -.017000   .417000   .3610000      .000      .000  
+88 1 5 47165.00 I  -.016529  .000345   .417809  .000284  I  .3598894  .0000641  1.1746 0.0408  I    -2.964     .590     2.600     .292  -.015000   .418000   .3598000      .000      .000  
+88 1 6 47166.00 I  -.014674  .000379   .418643  .000650  I  .3586506  .0000450  1.3098 0.0386  I    -2.683     .582     2.845     .311  -.013000   .419000   .3586000      .000      .000  
+88 1 7 47167.00 I  -.012861  .000371   .419338  .000643  I  .3572612  .0000430  1.4710 0.0514  I    -2.267     .646     2.817     .285  -.011000   .420000   .3571000      .000      .000  
+88 1 8 47168.00 I  -.011080  .000428   .419907  .000749  I  .3557089  .0000925  1.6313 0.0513  I    -1.882     .606     2.728     .297  -.010000   .421000   .3555000      .000      .000  
+88 1 9 47169.00 I  -.009315  .000360   .420360  .000778  I  .3540054  .0000931  1.7713 0.0658  I    -1.681     .631     2.872     .246  -.008000   .422000   .3537000      .000      .000  
+88 110 47170.00 I  -.007555  .000401   .420728  .000743  I  .3521806  .0000936  1.8684 0.0616  I    -1.559     .631     3.005     .246  -.006000   .423000   .3519000      .000      .000  
+88 111 47171.00 I  -.005836  .000538   .421099  .000731  I  .3502919  .0000808  1.8956 0.0607  I    -1.647     .631     2.958     .247  -.004000   .423000   .3500000      .000      .000  
+88 112 47172.00 I  -.004197  .000663   .421557  .000736  I  .3484143  .0000772  1.8480 0.0591  I    -2.132     .761     2.731     .215  -.003000   .424000   .3481000      .000      .000  
+88 113 47173.00 I  -.002659  .000777   .422118  .000736  I  .3466188  .0000862  1.7318 0.0473  I    -2.832     .764     2.446     .206  -.001000   .425000   .3464000      .000      .000  
+88 114 47174.00 I  -.001282  .000729   .422756  .000635  I  .3449689  .0000547  1.5609 0.0533  I    -3.436     .691     2.380     .187   .000000   .425000   .3447000      .000      .000  
+88 115 47175.00 I  -.000119  .000650   .423392  .000395  I  .3435070  .0000628  1.3601 0.0392  I    -3.626     .679     2.377     .236   .002000   .426000   .3434000      .000      .000  
+88 116 47176.00 I   .000915  .000608   .423966  .000399  I  .3422443  .0000562  1.1726 0.0404  I    -3.527     .759     2.294     .224   .003000   .426000   .3422000      .000      .000  
+88 117 47177.00 I   .001971  .000562   .424454  .000396  I  .3411366  .0000509  1.0606 0.0392  I    -3.273     .746     2.121     .262   .005000   .427000   .3412000      .000      .000  
+88 118 47178.00 I   .003149  .000430   .424857  .000370  I  .3400813  .0000548  1.0739 0.0372  I    -2.855     .608     2.083     .265   .006000   .427000   .3403000      .000      .000  
+88 119 47179.00 I   .004431  .000410   .425192  .000354  I  .3389456  .0000542  1.2168 0.0390  I    -2.454     .608     2.135     .265   .008000   .428000   .3392000      .000      .000  
+88 120 47180.00 I   .005795  .000311   .425472  .000311  I  .3376186  .0000556  1.4469 0.0323  I    -2.190     .658     2.134     .289   .009000   .428000   .3379000      .000      .000  
+88 121 47181.00 I   .007263  .000220   .425747  .000327  I  .3360472  .0000352  1.6909 0.0314  I    -2.200     .677     2.117     .254   .011000   .429000   .3363000      .000      .000  
+88 122 47182.00 I   .008856  .000229   .426060  .000356  I  .3342621  .0000293  1.8592 0.0247  I    -2.504     .567     2.021     .232   .012000   .429000   .3344000      .000      .000  
+88 123 47183.00 I   .010591  .000216   .426454  .000303  I  .3323757  .0000347  1.8869 0.0232  I    -2.961     .516     1.918     .140   .014000   .430000   .3324000      .000      .000  
+88 124 47184.00 I   .012479  .000323   .426949  .000298  I  .3305363  .0000359  1.7705 0.0241  I    -3.497     .562     2.019     .123   .016000   .430000   .3305000      .000      .000  
+88 125 47185.00 I   .014531  .000369   .427485  .000296  I  .3288699  .0000335  1.5484 0.0243  I    -3.997     .562     2.221     .123   .018000   .431000   .3287000      .000      .000  
+88 126 47186.00 I   .016729  .000360   .428019  .000302  I  .3274564  .0000328  1.2755 0.0217  I    -4.368     .491     2.345     .149   .020000   .431000   .3272000      .000      .000  
+88 127 47187.00 I   .019043  .000384   .428523  .000384  I  .3263147  .0000276  1.0153 0.0269  I    -4.502     .417     2.359     .158   .022000   .431000   .3260000      .000      .000  
+88 128 47188.00 I   .021473  .000470   .428978  .000451  I  .3254055  .0000427  0.8162 0.0228  I    -4.355     .177     2.416     .177   .024000   .432000   .3250000      .000      .000  
+88 129 47189.00 I   .024050  .000470   .429387  .000451  I  .3246553  .0000363  0.6982 0.0258  I    -4.003     .177     2.642     .177   .027000   .432000   .3242000      .000      .000  
+88 130 47190.00 I   .026750  .000357   .429743  .000412  I  .3239802  .0000291  0.6669 0.0208  I    -3.540     .177     2.728     .177   .029000   .433000   .3235000      .000      .000  
+88 131 47191.00 I   .029541  .000348   .430052  .000355  I  .3232923  .0000205  0.7231 0.0168  I    -3.070     .177     2.534     .177   .031000   .433000   .3227000      .000      .000  
+88 2 1 47192.00 I   .032380  .000336   .430341  .000451  I  .3225081  .0000167  0.8568 0.0133  I    -2.683     .243     2.208     .184   .033000   .433000   .3220000      .000      .000  
+88 2 2 47193.00 I   .035225  .000359   .430638  .000408  I  .3215594  .0000168  1.0483 0.0111  I    -2.379     .263     1.975     .181   .036000   .434000   .3210000      .000      .000  
+88 2 3 47194.00 I   .038029  .000359   .430972  .000408  I  .3204005  .0000145  1.2726 0.0112  I    -2.042     .263     1.928     .181   .038000   .434000   .3199000      .000      .000  
+88 2 4 47195.00 I   .040717  .000359   .431369  .000408  I  .3190133  .0000149  1.4995 0.0108  I    -1.592     .263     1.964     .181   .041000   .435000   .3185000      .000      .000  
+88 2 5 47196.00 I   .043197  .000366   .431846  .000498  I  .3174101  .0000161  1.7007 0.0111  I    -1.177     .263     2.000     .181   .044000   .435000   .3169000      .000      .000  
+88 2 6 47197.00 I   .045436  .000358   .432383  .000547  I  .3156276  .0000164  1.8549 0.0126  I     -.958     .264     2.033     .151   .046000   .435000   .3152000      .000      .000  
+88 2 7 47198.00 I   .047417  .000409   .432934  .000612  I  .3137210  .0000193  1.9471 0.0138  I     -.985     .256     2.086     .298   .049000   .435000   .3133000      .000      .000  
+88 2 8 47199.00 I   .049127  .000382   .433448  .000685  I  .3117564  .0000222  1.9705 0.0148  I    -1.242     .265     2.077     .298   .051000   .435000   .3114000      .000      .000  
+88 2 9 47200.00 I   .050562  .000518   .433883  .000614  I  .3098046  .0000225  1.9201 0.0160  I    -1.663     .265     1.831     .298   .053000   .435000   .3095000      .000      .000  
+88 210 47201.00 I   .051772  .000506   .434212  .000668  I  .3079399  .0000231  1.7985 0.0167  I    -2.093     .222     1.400     .126   .054000   .435000   .3077000      .000      .000  
+88 211 47202.00 I   .052828  .000452   .434415  .000635  I  .3062239  .0000248  1.6281 0.0178  I    -2.409     .210     1.094     .127   .056000   .435000   .3061000      .000      .000  
+88 212 47203.00 I   .053789  .000480   .434472  .000610  I  .3046859  .0000271  1.4510 0.0227  I    -2.685     .163     1.172     .146   .057000   .435000   .3046000      .000      .000  
+88 213 47204.00 I   .054660  .000480   .434371  .000610  I  .3033032  .0000380  1.3298 0.0238  I    -3.087     .163     1.546     .146   .058000   .434000   .3033000      .000      .000  
+88 214 47205.00 I   .055477  .000531   .434080  .000638  I  .3019846  .0000392  1.3335 0.0256  I    -3.499     .163     1.716     .146   .059000   .434000   .3019000      .000      .000  
+88 215 47206.00 I   .056309  .000411   .433626  .000640  I  .3005816  .0000343  1.5010 0.0249  I    -3.561     .163     1.551     .146   .060000   .434000   .3005000      .000      .000  
+88 216 47207.00 I   .057220  .000458   .433069  .000575  I  .2989343  .0000307  1.8134 0.0252  I    -3.088     .723     1.375     .212   .061000   .434000   .2988000      .000      .000  
+88 217 47208.00 I   .058272  .000554   .432465  .000478  I  .2969319  .0000368  2.1945 0.0289  I    -2.366    1.004     1.432     .271   .062000   .433000   .2967000      .000      .000  
+88 218 47209.00 I   .059504  .000501   .431860  .000506  I  .2945576  .0000489  2.5386 0.0278  I    -1.903     .833     1.610     .228   .063000   .433000   .2943000      .000      .000  
+88 219 47210.00 I   .060894  .000501   .431273  .000506  I  .2919006  .0000418  2.7449 0.0308  I    -1.942     .833     1.665     .228   .064000   .433000   .2916000      .000      .000  
+88 220 47211.00 I   .062344  .000497   .430743  .000468  I  .2891320  .0000373  2.7585 0.0266  I    -2.322     .833     1.560     .228   .065000   .433000   .2889000      .000      .000  
+88 221 47212.00 I   .063722  .000415   .430316  .000555  I  .2864434  .0000328  2.5926 0.0271  I    -2.798     .775     1.458     .186   .066000   .432000   .2862000      .000      .000  
+88 222 47213.00 I   .064928  .000405   .430027  .000620  I  .2839871  .0000394  2.3059 0.0261  I    -3.213     .576     1.399     .298   .067000   .432000   .2838000      .000      .000  
+88 223 47214.00 I   .065945  .000465   .429861  .000593  I  .2818466  .0000405  1.9741 0.0231  I    -3.384     .576     1.199     .298   .068000   .432000   .2817000      .000      .000  
+88 224 47215.00 I   .066799  .000489   .429796  .000634  I  .2800276  .0000243  1.6762 0.0393  I    -3.133     .653      .738     .298   .069000   .432000   .2798000      .000      .000  
+88 225 47216.00 I   .067596  .000514   .429844  .000575  I  .2784642  .0000674  1.4683 0.0358  I    -2.691     .653      .267     .298   .071000   .432000   .2782000      .000      .000  
+88 226 47217.00 I   .068476  .000511   .429993  .000573  I  .2770556  .0000673  1.3668 0.0608  I    -2.334     .622      .043     .298   .072000   .432000   .2768000      .000      .000  
+88 227 47218.00 I   .069557  .000579   .430227  .000677  I  .2756960  .0001011  1.3693 0.0668  I    -2.133     .580      .049     .298   .073000   .431000   .2754000      .000      .000  
+88 228 47219.00 I   .070903  .000651   .430544  .000372  I  .2742860  .0001154  1.4650 0.0761  I    -2.008     .572      .107     .298   .075000   .431000   .2739000      .000      .000  
+88 229 47220.00 I   .072553  .000496   .430941  .000434  I  .2727442  .0001137  1.6262 0.0711  I    -1.886     .572      .152     .298   .076000   .432000   .2724000      .000      .000  
+88 3 1 47221.00 I   .074468  .000541   .431406  .000383  I  .2710225  .0000830  1.8207 0.0573  I    -1.806     .572      .305     .298   .078000   .432000   .2707000      .000      .000  
+88 3 2 47222.00 I   .076565  .000505   .431907  .000399  I  .2691009  .0000139  2.0207 0.0469  I    -1.780     .429      .644     .129   .080000   .432000   .2688000      .000      .000  
+88 3 3 47223.00 I   .078739  .000435   .432401  .000413  I  .2669896  .0000439  2.1950 0.0227  I    -1.746     .202     1.027     .181   .082000   .432000   .2667000      .000      .000  
+88 3 4 47224.00 I   .080892  .000427   .432834  .000389  I  .2647288  .0000432  2.3156 0.0306  I    -1.693     .202     1.236     .181   .084000   .432000   .2646000      .000      .000  
+88 3 5 47225.00 I   .082956  .000427   .433137  .000389  I  .2623834  .0000425  2.3613 0.0276  I    -1.690     .202     1.215     .181   .086000   .432000   .2624000      .000      .000  
+88 3 6 47226.00 I   .084978  .000381   .433274  .000360  I  .2600346  .0000343  2.3216 0.0291  I    -1.765     .202     1.079     .181   .088000   .432000   .2602000      .000      .000  
+88 3 7 47227.00 I   .087034  .000445   .433225  .000380  I  .2577686  .0000397  2.1965 0.0311  I    -1.843     .273      .932     .136   .090000   .432000   .2581000      .000      .000  
+88 3 8 47228.00 I   .089182  .000396   .432984  .000393  I  .2556665  .0000519  1.9967 0.0305  I    -1.821     .332      .760     .298   .092000   .432000   .2562000      .000      .000  
+88 3 9 47229.00 I   .091479  .000403   .432548  .000530  I  .2537920  .0000463  1.7463 0.0348  I    -1.631     .332      .521     .298   .095000   .432000   .2544000      .000      .000  
+88 310 47230.00 I   .093968  .000403   .431925  .000530  I  .2521810  .0000465  1.4744 0.0339  I    -1.299     .332      .274     .298   .097000   .432000   .2530000      .000      .000  
+88 311 47231.00 I   .096616  .000392   .431178  .000515  I  .2508327  .0000494  1.2339 0.0324  I    -1.074     .332      .205     .298   .100000   .431000   .2516000      .000      .000  
+88 312 47232.00 I   .099373  .000355   .430378  .000777  I  .2496800  .0000451  1.0930 0.0399  I    -1.146     .493      .257     .126   .102000   .431000   .2505000      .000      .000  
+88 313 47233.00 I   .102178  .000341   .429573  .000879  I  .2485988  .0000626  1.0957 0.0363  I    -1.442     .567      .181     .189   .104000   .430000   .2493000      .000      .000  
+88 314 47234.00 I   .104954  .000323   .428784  .000936  I  .2474383  .0000570  1.2492 0.0350  I    -1.670     .623     -.115     .206   .107000   .429000   .2480000      .000      .000  
+88 315 47235.00 I   .107628  .000353   .428032  .000676  I  .2460608  .0000315  1.5214 0.0340  I    -1.614     .623     -.447     .206   .109000   .428000   .2465000      .000      .000  
+88 316 47236.00 I   .110146  .000327   .427325  .000716  I  .2443810  .0000371  1.8370 0.0206  I    -1.494     .624     -.338     .183   .112000   .428000   .2446000      .000      .000  
+88 317 47237.00 I   .112463  .000294   .426598  .000938  I  .2424056  .0000266  2.0961 0.0245  I    -1.542     .532      .149     .256   .114000   .427000   .2424000      .000      .000  
+88 318 47238.00 I   .114535  .000312   .425771  .000979  I  .2402340  .0000321  2.2196 0.0259  I    -1.726     .404      .531     .292   .116000   .425000   .2401000      .000      .000  
+88 319 47239.00 I   .116348  .000272   .424764  .000925  I  .2380222  .0000444  2.1755 0.0280  I    -1.862     .366      .477     .296   .118000   .424000   .2378000      .000      .000  
+88 320 47240.00 I   .117957  .000272   .423510  .000925  I  .2359328  .0000459  1.9818 0.0383  I    -1.998     .366      .030     .296   .120000   .423000   .2356000      .000      .000  
+88 321 47241.00 I   .119427  .000182   .422058  .000900  I  .2340876  .0000625  1.7009 0.0393  I    -2.134     .366     -.358     .296   .122000   .422000   .2338000      .000      .000  
+88 322 47242.00 I   .120827  .000354   .420480  .000894  I  .2325317  .0000639  1.4177 0.0525  I    -2.077     .373     -.610     .260   .123000   .420000   .2322000      .000      .000  
+88 323 47243.00 I   .122229  .000460   .418839  .000703  I  .2312297  .0000843  1.2020 0.0545  I    -1.661     .427     -.857     .168   .125000   .419000   .2309000      .000      .000  
+88 324 47244.00 I   .123705  .000468   .417199  .000628  I  .2300952  .0000884  1.0838 0.0585  I    -1.017     .519    -1.026     .298   .126000   .418000   .2298000      .000      .000  
+88 325 47245.00 I   .125305  .000468   .415613  .000628  I  .2290276  .0000810  1.0692 0.0554  I     -.501     .519     -.986     .298   .128000   .417000   .2287000      .000      .000  
+88 326 47246.00 I   .126960  .000422   .414115  .000561  I  .2279249  .0000669  1.1502 0.0458  I     -.273     .519     -.762     .298   .129000   .415000   .2276000      .000      .000  
+88 327 47247.00 I   .128550  .000439   .412734  .000472  I  .2267026  .0000426  1.3049 0.0395  I     -.204     .403     -.548     .113   .130000   .414000   .2264000      .000      .000  
+88 328 47248.00 I   .129982  .000359   .411461  .000594  I  .2252995  .0000422  1.5065 0.0300  I     -.151     .237     -.456     .144   .131000   .413000   .2250000      .000      .000  
+88 329 47249.00 I   .131179  .000359   .410263  .000594  I  .2236844  .0000422  1.7238 0.0249  I     -.140     .237     -.392     .144   .132000   .412000   .2233000      .000      .000  
+88 330 47250.00 I   .132077  .000302   .409106  .000235  I  .2218552  .0000264  1.9314 0.0282  I     -.229     .237     -.239     .144   .133000   .410000   .2215000      .000      .000  
+88 331 47251.00 I   .132689  .000256   .407969  .000376  I  .2198328  .0000374  2.1055 0.0224  I     -.383     .256     -.046     .198   .134000   .409000   .2195000      .000      .000  
+88 4 1 47252.00 I   .133060  .000256   .406819  .000376  I  .2176635  .0000363  2.2217 0.0335  I     -.525     .256      .020     .198   .134000   .407000   .2173000      .000      .000  
+88 4 2 47253.00 I   .133242  .000153   .405621  .000461  I  .2154137  .0000557  2.2649 0.0337  I     -.657     .274     -.109     .240   .135000   .406000   .2151000      .000      .000  
+88 4 3 47254.00 I   .133291  .000329   .404331  .000421  I  .2131608  .0000569  2.2268 0.0397  I     -.822     .274     -.300     .240   .136000   .405000   .2128000      .000      .000  
+88 4 4 47255.00 I   .133276  .000329   .402927  .000421  I  .2109864  .0000567  2.1099 0.0375  I     -.987     .274     -.393     .240   .136000   .403000   .2107000      .000      .000  
+88 4 5 47256.00 I   .133296  .000464   .401435  .000411  I  .2089597  .0000488  1.9370 0.0309  I    -1.071     .274     -.373     .240   .137000   .402000   .2087000      .000      .000  
+88 4 6 47257.00 I   .133451  .000520   .399885  .000383  I  .2071178  .0000246  1.7478 0.0321  I    -1.048     .932     -.340     .153   .137000   .400000   .2069000      .000      .000  
+88 4 7 47258.00 I   .133796  .000630   .398302  .000215  I  .2054537  .0000416  1.5897 0.0219  I     -.947     .932     -.433     .153   .138000   .399000   .2052000      .000      .000  
+88 4 8 47259.00 I   .134366  .000630   .396706  .000215  I  .2039126  .0000363  1.5090 0.0281  I     -.807     .773     -.769     .207   .138000   .397000   .2037000      .000      .000  
+88 4 9 47260.00 I   .135164  .000719   .395107  .000284  I  .2023987  .0000379  1.5394 0.0240  I     -.636     .773    -1.421     .207   .139000   .396000   .2021000      .000      .000  
+88 410 47261.00 I   .136105  .000647   .393495  .000262  I  .2007934  .0000314  1.6909 0.0224  I     -.403     .773    -2.123     .207   .140000   .394000   .2005000      .000      .000  
+88 411 47262.00 I   .137096  .000495   .391851  .000211  I  .1989811  .0000237  1.9497 0.0216  I     -.055     .692    -2.436     .220   .141000   .392000   .1987000      .000      .000  
+88 412 47263.00 I   .138122  .000527   .390169  .000221  I  .1968751  .0000298  2.2652 0.0180  I      .346     .525    -2.302     .249   .142000   .391000   .1965000      .000      .000  
+88 413 47264.00 I   .139252  .000527   .388462  .000221  I  .1944597  .0000271  2.5536 0.0186  I      .616     .525    -1.924     .249   .143000   .389000   .1941000      .000      .000  
+88 414 47265.00 I   .140573  .000492   .386753  .000236  I  .1918060  .0000222  2.7278 0.0167  I      .594     .596    -1.606     .231   .144000   .388000   .1914000      .000      .000  
+88 415 47266.00 I   .142124  .000372   .385078  .000291  I  .1890631  .0000196  2.7249 0.0160  I      .456     .596    -1.322     .231   .146000   .386000   .1887000      .000      .000  
+88 416 47267.00 I   .143839  .000365   .383464  .000312  I  .1864171  .0000231  2.5391 0.0170  I      .301     .650    -1.090     .276   .147000   .385000   .1862000      .000      .000  
+88 417 47268.00 I   .145638  .000393   .381931  .000377  I  .1840284  .0000278  2.2227 0.0195  I      .038     .633     -.979     .265   .148000   .383000   .1838000      .000      .000  
+88 418 47269.00 I   .147446  .000417   .380503  .000512  I  .1819888  .0000313  1.8551 0.0280  I     -.402     .618     -.982     .277   .150000   .382000   .1818000      .000      .000  
+88 419 47270.00 I   .149227  .000475   .379205  .000571  I  .1803083  .0000485  1.5171 0.0265  I     -.975     .968    -1.118     .245   .151000   .381000   .1802000      .000      .000  
+88 420 47271.00 I   .150923  .000545   .378018  .000570  I  .1789243  .0000428  1.2698 0.0306  I    -1.409     .914    -1.409     .227   .153000   .379000   .1788000      .000      .000  
+88 421 47272.00 I   .152480  .000547   .376907  .000636  I  .1777309  .0000372  1.1358 0.0303  I    -1.415     .961    -1.748     .251   .154000   .378000   .1776000      .000      .000  
+88 422 47273.00 I   .153883  .000609   .375832  .000638  I  .1766178  .0000430  1.1066 0.0275  I     -.920    1.031    -1.979     .215   .156000   .377000   .1764000      .000      .000  
+88 423 47274.00 I   .155182  .000616   .374728  .000619  I  .1754892  .0000404  1.1630 0.0299  I     -.472    1.119    -2.042     .233   .157000   .374000   .1751000      .000      .000  
+88 424 47275.00 I   .156463  .000638   .373523  .000823  I  .1742706  .0000415  1.2832 0.0240  I     -.354    1.119    -2.148     .233   .159000   .373000   .1738000      .000      .000  
+88 425 47276.00 I   .157752  .000679   .372218  .000785  I  .1729094  .0000258  1.4437 0.0279  I     -.410     .961    -2.343     .278   .160000   .372000   .1724000      .000      .000  
+88 426 47277.00 I   .159044  .000677   .370851  .000735  I  .1713784  .0000374  1.6185 0.0341  I     -.513     .956    -2.398     .279   .162000   .370000   .1708000      .000      .000  
+88 427 47278.00 I   .160340  .000560   .369461  .000704  I  .1696762  .0000631  1.7819 0.0366  I     -.625     .893    -2.050     .275   .163000   .369000   .1690000      .000      .000  
+88 428 47279.00 I   .161671  .000560   .368081  .000704  I  .1678264  .0000630  1.9099 0.0441  I     -.626     .893    -1.265     .275   .165000   .368000   .1671000      .000      .000  
+88 429 47280.00 I   .163064  .000970   .366725  .000795  I  .1658776  .0000616  1.9742 0.0379  I     -.652     .893     -.638     .275   .166000   .367000   .1652000      .000      .000  
+88 430 47281.00 I   .164477  .000896   .365389  .000684  I  .1639065  .0000423  1.9529 0.0347  I     -.733     .803     -.478     .251   .167000   .366000   .1633000      .000      .000  
+88 5 1 47282.00 I   .165855  .000763   .364063  .000248  I  .1620006  .0000319  1.8453 0.0238  I     -.802     .638     -.687     .185   .169000   .364000   .1614000      .000      .000  
+88 5 2 47283.00 I   .167147  .000720   .362735  .000456  I  .1602385  .0000217  1.6698 0.0190  I     -.839     .277    -1.071     .298   .170000   .363000   .1597000      .000      .000  
+88 5 3 47284.00 I   .168285  .000780   .361394  .000499  I  .1586712  .0000208  1.4637 0.0156  I     -.812     .277    -1.447     .298   .171000   .363000   .1582000      .000      .000  
+88 5 4 47285.00 I   .169162  .000780   .360021  .000499  I  .1573034  .0000225  1.2808 0.0139  I     -.632     .277    -1.624     .298   .172000   .362000   .1569000      .000      .000  
+88 5 5 47286.00 I   .169788  .000744   .358587  .000447  I  .1560843  .0000184  1.1737 0.0150  I     -.298     .277    -1.616     .298   .173000   .360000   .1557000      .000      .000  
+88 5 6 47287.00 I   .170224  .000606   .357071  .000419  I  .1549187  .0000198  1.1786 0.0163  I      .129     .287    -1.546     .152   .173000   .359000   .1545000      .000      .000  
+88 5 7 47288.00 I   .170572  .000664   .355490  .000540  I  .1536860  .0000270  1.3070 0.0163  I      .572     .247    -1.493     .193   .174000   .357000   .1533000      .000      .000  
+88 5 8 47289.00 I   .170939  .000693   .353873  .000207  I  .1522705  .0000260  1.5380 0.0198  I      .911     .247    -1.503     .193   .174000   .355000   .1519000      .000      .000  
+88 5 9 47290.00 I   .171422  .000657   .352246  .000264  I  .1505918  .0000290  1.8235 0.0177  I     1.015     .247    -1.596     .193   .175000   .354000   .1502000      .000      .000  
+88 510 47291.00 I   .172031  .000687   .350624  .000235  I  .1486276  .0000240  2.0966 0.0195  I      .865     .247    -1.710     .193   .176000   .352000   .1482000      .000      .000  
+88 511 47292.00 I   .172740  .000669   .349018  .000241  I  .1464257  .0000261  2.2882 0.0204  I      .517     .436    -1.748     .395   .176000   .351000   .1460000      .000      .000  
+88 512 47293.00 I   .173522  .000650   .347441  .000264  I  .1440946  .0000331  2.3494 0.0214  I      .070     .565    -1.642     .524   .177000   .349000   .1436000      .000      .000  
+88 513 47294.00 I   .174315  .000650   .345886  .000264  I  .1417745  .0000340  2.2678 0.0231  I     -.326     .565    -1.402     .524   .177000   .347000   .1413000      .000      .000  
+88 514 47295.00 I   .175061  .000752   .344342  .000698  I  .1396002  .0000323  2.0625 0.0223  I     -.508     .565    -1.109     .524   .178000   .346000   .1392000      .000      .000  
+88 515 47296.00 I   .175731  .000747   .342790  .000758  I  .1376748  .0000288  1.7813 0.0256  I     -.454     .519     -.913     .457   .178000   .344000   .1373000      .000      .000  
+88 516 47297.00 I   .176269  .000713   .341207  .000751  I  .1360396  .0000397  1.4942 0.0332  I     -.221     .840     -.918     .494   .178000   .342000   .1357000      .000      .000  
+88 517 47298.00 I   .176616  .000673   .339565  .000879  I  .1346682  .0000599  1.2617 0.0355  I      .118     .916    -1.132     .419   .179000   .340000   .1345000      .000      .000  
+88 518 47299.00 I   .176737  .000673   .337839  .000879  I  .1334901  .0000588  1.1076 0.0383  I      .454     .916    -1.465     .419   .179000   .339000   .1333000      .000      .000  
+88 519 47300.00 I   .176689  .000655   .336003  .000699  I  .1324249  .0000479  1.0378 0.0381  I      .772     .912    -1.567     .354   .179000   .337000   .1323000      .000      .000  
+88 520 47301.00 I   .176571  .000516   .334072  .000661  I  .1313853  .0000486  1.0554 0.0369  I      .863     .866    -1.530     .333   .179000   .335000   .1313000      .000      .000  
+88 521 47302.00 I   .176472  .000520   .332078  .000387  I  .1302903  .0000561  1.1443 0.0418  I      .630     .918    -1.513     .346   .179000   .333000   .1301000      .000      .000  
+88 522 47303.00 I   .176453  .000528   .330055  .000270  I  .1290823  .0000680  1.2764 0.0426  I      .237     .764    -1.614     .158   .179000   .331000   .1288000      .000      .000  
+88 523 47304.00 I   .176504  .000574   .328048  .000290  I  .1277310  .0000640  1.4281 0.0479  I     -.041     .794    -1.736     .166   .178000   .330000   .1274000      .000      .000  
+88 524 47305.00 I   .176508  .000623   .326097  .000277  I  .1262273  .0000674  1.5763 0.0485  I     -.139     .794    -1.718     .166   .178000   .328000   .1258000      .000      .000  
+88 525 47306.00 I   .176371  .000534   .324224  .000256  I  .1245896  .0000730  1.6911 0.0537  I     -.219     .491    -1.497     .126   .177000   .326000   .1241000      .000      .000  
+88 526 47307.00 I   .176036  .000463   .322405  .000337  I  .1228631  .0000837  1.7521 0.0533  I     -.421     .910    -1.172     .334   .177000   .324000   .1224000      .000      .000  
+88 527 47308.00 I   .175458  .000428   .320609  .000291  I  .1211064  .0000776  1.7503 0.0554  I     -.728     .910     -.940     .334   .176000   .323000   .1206000      .000      .000  
+88 528 47309.00 I   .174650  .000460   .318806  .000395  I  .1193840  .0000726  1.6842 0.0528  I     -.988     .910     -.921     .334   .176000   .321000   .1189000      .000      .000  
+88 529 47310.00 I   .173647  .000460   .316974  .000395  I  .1177611  .0000715  1.5488 0.0458  I    -1.079     .910    -1.093     .334   .175000   .319000   .1174000      .000      .000  
+88 530 47311.00 I   .172508  .000183   .315109  .000348  I  .1163064  .0000560  1.3535 0.0425  I    -1.045     .910    -1.351     .334   .174000   .317000   .1161000      .000      .000  
+88 531 47312.00 I   .171313  .000234   .313217  .000290  I  .1150594  .0000458  1.1422 0.0365  I    -1.024     .693    -1.623     .240   .174000   .315000   .1149000      .000      .000  
+88 6 1 47313.00 I   .170143  .000299   .311304  .000159  I  .1140094  .0000467  0.9687 0.0321  I    -1.092     .363    -1.871     .298   .173000   .313000   .1140000      .000      .000  
+88 6 2 47314.00 I   .169074  .000282   .309379  .000156  I  .1130943  .0000450  0.8781 0.0357  I    -1.225     .363    -2.034     .298   .172000   .311000   .1132000      .000      .000  
+88 6 3 47315.00 I   .168160  .000354   .307456  .000407  I  .1122126  .0000541  0.9091 0.0316  I    -1.407     .562    -2.049     .298   .171000   .309000   .1122000      .000      .000  
+88 6 4 47316.00 I   .167385  .000327   .305554  .000430  I  .1112338  .0000445  1.0669 0.0340  I    -1.579     .562    -1.964     .298   .170000   .307000   .1112000      .000      .000  
+88 6 5 47317.00 I   .166735  .000302   .303687  .000433  I  .1100538  .0000413  1.2998 0.0336  I    -1.653     .569    -1.895     .253   .170000   .304000   .1099000      .000      .000  
+88 6 6 47318.00 I   .166213  .000328   .301859  .000543  I  .1086331  .0000504  1.5361 0.0328  I    -1.499     .674    -1.945     .327   .169000   .302000   .1083000      .000      .000  
+88 6 7 47319.00 I   .165809  .000367   .300064  .000534  I  .1070061  .0000509  1.6988 0.0354  I    -1.232     .674    -2.061     .327   .168000   .300000   .1066000      .000      .000  
+88 6 8 47320.00 I   .165500  .000367   .298286  .000534  I  .1052785  .0000496  1.7326 0.0361  I    -1.091     .674    -2.097     .327   .168000   .298000   .1048000      .000      .000  
+88 6 9 47321.00 I   .165260  .000349   .296515  .000518  I  .1035866  .0000513  1.6294 0.0296  I    -1.117     .580    -1.979     .385   .168000   .296000   .1030000      .000      .000  
+88 610 47322.00 I   .165075  .000321   .294741  .000302  I  .1020572  .0000324  1.4138 0.0306  I    -1.291     .445    -1.717     .317   .168000   .294000   .1015000      .000      .000  
+88 611 47323.00 I   .164939  .000373   .292954  .000149  I  .1007806  .0000335  1.1335 0.0237  I    -1.580     .244    -1.402     .229   .167000   .292000   .1002000      .000      .000  
+88 612 47324.00 I   .164891  .000373   .291145  .000149  I  .0997917  .0000346  0.8486 0.0238  I    -1.849     .244    -1.181     .229   .167000   .290000   .0992000      .000      .000  
+88 613 47325.00 I   .164964  .000333   .289308  .000248  I  .0990674  .0000338  0.6115 0.0249  I    -1.906     .244    -1.144     .229   .167000   .289000   .0985000      .000      .000  
+88 614 47326.00 I   .165103  .000555   .287445  .000282  I  .0985414  .0000359  0.4562 0.0201  I    -1.707     .244    -1.243     .229   .167000   .287000   .0980000      .000      .000  
+88 615 47327.00 I   .165220  .000729   .285551  .000340  I  .0981234  .0000216  0.3958 0.0212  I    -1.391     .361    -1.326     .270   .167000   .285000   .0976000      .000      .000  
+88 616 47328.00 I   .165235  .000926   .283612  .000331  I  .0977212  .0000226  0.4214 0.0182  I    -1.161     .420    -1.263     .257   .167000   .283000   .0973000      .000      .000  
+88 617 47329.00 I   .165078  .000930   .281610  .000350  I  .0972599  .0000292  0.5092 0.0200  I    -1.154     .365    -1.080     .229   .168000   .281000   .0969000      .000      .000  
+88 618 47330.00 I   .164740  .000922   .279509  .000347  I  .0966944  .0000331  0.6222 0.0228  I    -1.407     .365     -.964     .229   .168000   .279000   .0964000      .000      .000  
+88 619 47331.00 I   .164408  .000907   .277292  .000332  I  .0960175  .0000349  0.7293 0.0233  I    -1.763     .358    -1.049     .239   .168000   .277000   .0957000      .000      .000  
+88 620 47332.00 I   .164308  .000884   .274976  .000482  I  .0952407  .0000327  0.8219 0.0256  I    -2.111     .339    -1.318     .230   .168000   .275000   .0950000      .000      .000  
+88 621 47333.00 I   .164459  .000734   .272627  .000514  I  .0943817  .0000374  0.8907 0.0250  I    -2.451     .298    -1.542     .172   .169000   .273000   .0941000      .000      .000  
+88 622 47334.00 I   .164844  .000688   .270336  .000546  I  .0934727  .0000378  0.9194 0.0370  I    -2.872     .286    -1.467     .187   .169000   .271000   .0932000      .000      .000  
+88 623 47335.00 I   .165440  .000701   .268181  .000789  I  .0925620  .0000639  0.8907 0.0319  I    -3.436     .319    -1.377     .205   .169000   .269000   .0922000      .000      .000  
+88 624 47336.00 I   .166198  .000737   .266171  .000731  I  .0917134  .0000514  0.7955 0.0389  I    -4.059     .287    -1.476     .204   .170000   .267000   .0914000      .000      .000  
+88 625 47337.00 I   .167033  .000712   .264291  .000713  I  .0909916  .0000444  0.6385 0.0345  I    -4.558     .557    -1.672     .383   .170000   .265000   .0907000      .000      .000  
+88 626 47338.00 I   .167857  .000651   .262495  .000607  I  .0904523  .0000460  0.4338 0.0324  I    -4.718     .653    -1.735     .451   .170000   .263000   .0901000      .000      .000  
+88 627 47339.00 I   .168577  .000678   .260716  .000646  I  .0901316  .0000472  0.2064 0.0334  I    -4.521     .721    -1.491     .513   .171000   .261000   .0898000      .000      .000  
+88 628 47340.00 I   .169078  .000689   .258899  .000503  I  .0900288  .0000484  0.0110 0.0297  I    -4.186     .721    -1.094     .513   .171000   .259000   .0897000      .000      .000  
+88 629 47341.00 I   .169346  .000636   .257053  .000469  I  .0900763  .0000362 -0.0845 0.0266  I    -3.914     .721     -.826     .513   .171000   .257000   .0897000      .000      .000  
+88 630 47342.00 I   .169407  .000506   .255191  .000473  I  .0901508  .0000220 -0.0390 0.0449  I    -3.730    1.137     -.750     .449   .171000   .255000   .0897000      .000      .000  
+88 7 1 47343.00 I   .169293  .000985   .253312  .000510  I  .0901073  .0000822  0.1477 0.0421  I    -3.662    1.285     -.827     .305   .171000   .253000   .0897000      .000      .000  
+88 7 2 47344.00 I   .169043  .001107   .251413  .000604  I  .0898241  .0000812  0.4284 0.0603  I    -3.921    1.120    -1.103     .346   .171000   .251000   .0893000      .000      .000  
+88 7 3 47345.00 I   .168718  .001428   .249492  .000600  I  .0892455  .0000882  0.7239 0.0564  I    -4.717    1.067    -1.679     .332   .171000   .249000   .0887000      .000      .000  
+88 7 4 47346.00 I   .168392  .001353   .247551  .000649  I  .0883989  .0000784  0.9514 0.0590  I    -5.741    1.011    -2.148     .343   .171000   .247000   .0878000      .000      .000  
+88 7 5 47347.00 I   .168128  .001305   .245587  .000619  I  .0873872  .0000785  1.0454 0.0565  I    -6.628     .946    -2.040     .362   .171000   .246000   .0868000      .000      .000  
+88 7 6 47348.00 I   .167947  .001442   .243581  .000613  I  .0863579  .0000815  0.9901 0.0558  I    -7.024     .717    -1.525     .363   .171000   .244000   .0858000      .000      .000  
+88 7 7 47349.00 I   .167849  .001346   .241539  .000564  I  .0854474  .0000793  0.8136 0.0522  I    -7.052     .717     -.787     .363   .170000   .242000   .0849000      .000      .000  
+88 7 8 47350.00 I   .167747  .001246   .239484  .000563  I  .0847557  .0000653  0.5619 0.0497  I    -6.886     .768     -.459     .332   .170000   .240000   .0842000      .000      .000  
+88 7 9 47351.00 I   .167560  .001227   .237432  .000427  I  .0843280  .0000598  0.2968 0.0437  I    -6.928     .758     -.619     .343   .169000   .239000   .0838000      .000      .000  
+88 710 47352.00 I   .167240  .001103   .235399  .000458  I  .0841458  .0000581  0.0804 0.0441  I    -7.301    1.191     -.988     .331   .169000   .237000   .0836000      .000      .000  
+88 711 47353.00 I   .166830  .001311   .233390  .000572  I  .0841389  .0000649 -0.0513 0.0442  I    -7.643    1.252    -1.347     .259   .169000   .235000   .0837000      .000      .000  
+88 712 47354.00 I   .166361  .001311   .231408  .000572  I  .0842164  .0000667 -0.0872 0.0476  I    -7.765    1.201    -1.655     .291   .168000   .233000   .0838000      .000      .000  
+88 713 47355.00 I   .165858  .001700   .229461  .000641  I  .0842809  .0000696 -0.0259 0.0453  I    -7.874    1.201    -2.100     .291   .168000   .231000   .0838000      .000      .000  
+88 714 47356.00 I   .165381  .001451   .227575  .000443  I  .0842424  .0000612  0.1127 0.0477  I    -7.869    1.295    -2.410     .296   .167000   .229000   .0838000      .000      .000  
+88 715 47357.00 I   .164937  .001472   .225745  .000434  I  .0840428  .0000652  0.2895 0.0510  I    -7.635     .995    -2.093     .264   .167000   .228000   .0837000      .000      .000  
+88 716 47358.00 I   .164436  .001581   .223927  .000403  I  .0836617  .0000815  0.4713 0.0503  I    -7.327     .406    -1.325     .224   .166000   .226000   .0833000      .000      .000  
+88 717 47359.00 I   .163829  .001510   .222063  .000382  I  .0831075  .0000767  0.6313 0.0574  I    -7.175     .361     -.574     .240   .165000   .223000   .0828000      .000      .000  
+88 718 47360.00 I   .163209  .001322   .220095  .000282  I  .0824115  .0000808  0.7541 0.0549  I    -7.375     .287     -.135     .215   .165000   .221000   .0821000      .000      .000  
+88 719 47361.00 I   .162581  .000835   .218034  .000323  I  .0816152  .0000785  0.8291 0.0543  I    -7.818     .287      .132     .215   .164000   .219000   .0813000      .000      .000  
+88 720 47362.00 I   .161910  .000803   .215909  .000364  I  .0807731  .0000727  0.8447 0.0565  I    -8.289     .535      .326     .198   .163000   .217000   .0804000      .000      .000  
+88 721 47363.00 I   .161156  .000470   .213768  .000522  I  .0799456  .0000813  0.8010 0.0445  I    -8.751     .648      .346     .156   .162000   .215000   .0796000      .000      .000  
+88 722 47364.00 I   .160277  .000407   .211659  .000525  I  .0791869  .0000512  0.7101 0.0482  I    -9.220     .756     -.010     .158   .161000   .213000   .0788000      .000      .000  
+88 723 47365.00 I   .159233  .000391   .209618  .000558  I  .0785392  .0000518  0.5780 0.0320  I    -9.503     .756     -.741     .158   .160000   .211000   .0782000      .000      .000  
+88 724 47366.00 I   .158046  .000376   .207629  .000550  I  .0780408  .0000384  0.4164 0.0311  I    -9.535     .737    -1.369     .150   .159000   .209000   .0777000      .000      .000  
+88 725 47367.00 I   .156759  .000574   .205662  .000508  I  .0777049  .0000345  0.2594 0.0260  I    -9.456     .664    -1.491     .181   .158000   .207000   .0775000      .000      .000  
+88 726 47368.00 I   .155411  .000676   .203688  .000440  I  .0775034  .0000350  0.1583 0.0259  I    -9.497     .573    -1.227     .180   .156000   .205000   .0773000      .000      .000  
+88 727 47369.00 I   .154067  .000863   .201711  .000446  I  .0773500  .0000386  0.1722 0.0249  I    -9.521     .573    -1.108     .183   .155000   .203000   .0772000      .000      .000  
+88 728 47370.00 I   .152797  .000800   .199746  .000353  I  .0771104  .0000353  0.3318 0.0249  I    -9.421     .434    -1.333     .186   .154000   .201000   .0770000      .000      .000  
+88 729 47371.00 I   .151642  .000799   .197803  .000302  I  .0766462  .0000316  0.6119 0.0235  I    -9.136     .426    -1.485     .171   .153000   .199000   .0765000      .000      .000  
+88 730 47372.00 I   .150613  .000796   .195889  .000297  I  .0758730  .0000311  0.9329 0.0226  I    -8.803     .403    -1.305     .237   .152000   .198000   .0758000      .000      .000  
+88 731 47373.00 I   .149680  .000827   .193991  .000295  I  .0748029  .0000323  1.1863 0.0230  I    -8.733     .389    -1.059     .237   .150000   .196000   .0747000      .000      .000  
+88 8 1 47374.00 I   .148737  .000793   .192093  .000331  I  .0735477  .0000340  1.2976 0.0234  I    -9.075     .412    -1.083     .251   .149000   .194000   .0734000      .000      .000  
+88 8 2 47375.00 I   .147679  .000728   .190193  .000371  I  .0722613  .0000340  1.2481 0.0231  I    -9.672     .435    -1.442     .280   .148000   .192000   .0720000      .000      .000  
+88 8 3 47376.00 I   .146460  .000547   .188283  .000349  I  .0710986  .0000312  1.0573 0.0234  I   -10.262     .435    -1.842     .280   .147000   .190000   .0708000      .000      .000  
+88 8 4 47377.00 I   .145064  .000496   .186359  .000300  I  .0701735  .0000323  0.7861 0.0261  I   -10.662     .408    -1.939     .289   .145000   .188000   .0698000      .000      .000  
+88 8 5 47378.00 I   .143549  .000560   .184427  .000314  I  .0695288  .0000419  0.5076 0.0272  I   -10.747     .307    -1.632     .250   .144000   .185000   .0691000      .000      .000  
+88 8 6 47379.00 I   .141975  .000560   .182503  .000314  I  .0691416  .0000437  0.2791 0.0300  I   -10.588     .307    -1.303     .250   .142000   .184000   .0687000      .000      .000  
+88 8 7 47380.00 I   .140372  .000436   .180588  .000328  I  .0689507  .0000429  0.1104 0.0296  I   -10.368     .307    -1.330     .250   .141000   .182000   .0686000      .000      .000  
+88 8 8 47381.00 I   .138711  .000431   .178690  .000273  I  .0688957  .0000398  0.0171 0.0282  I   -10.192     .266    -1.527     .224   .140000   .180000   .0685000      .000      .000  
+88 8 9 47382.00 I   .137032  .000510   .176831  .000240  I  .0688826  .0000367  0.0254 0.0281  I   -10.022     .207    -1.683     .181   .138000   .178000   .0685000      .000      .000  
+88 810 47383.00 I   .135399  .000487   .175036  .000267  I  .0688161  .0000397  0.1202 0.0225  I    -9.794     .791    -1.786     .114   .137000   .177000   .0684000      .000      .000  
+88 811 47384.00 I   .133883  .000583   .173345  .000378  I  .0686211  .0000260  0.2784 0.0219  I    -9.552     .791    -1.731     .298   .135000   .175000   .0682000      .000      .000  
+88 812 47385.00 I   .132534  .000583   .171798  .000378  I  .0682485  .0000186  0.4691 0.0159  I    -9.397     .791    -1.403     .298   .134000   .174000   .0678000      .000      .000  
+88 813 47386.00 I   .131275  .000616   .170397  .000308  I  .0676839  .0000182  0.6568 0.0143  I    -9.376     .791     -.883     .298   .132000   .172000   .0672000      .000      .000  
+88 814 47387.00 I   .130008  .000563   .169109  .000296  I  .0669456  .0000218  0.8123 0.0178  I    -9.491     .258     -.448     .298   .131000   .171000   .0665000      .000      .000  
+88 815 47388.00 I   .128643  .000470   .167903  .000138  I  .0660771  .0000306  0.9144 0.0198  I    -9.720     .362     -.316     .298   .129000   .169000   .0656000      .000      .000  
+88 816 47389.00 I   .127093  .000445   .166742  .000234  I  .0651379  .0000331  0.9534 0.0211  I    -9.971     .362     -.437     .298   .127000   .168000   .0647000      .000      .000  
+88 817 47390.00 I   .125331  .000445   .165595  .000234  I  .0641926  .0000291  0.9257 0.0231  I   -10.123     .362     -.604     .298   .125000   .167000   .0637000      .000      .000  
+88 818 47391.00 I   .123406  .000449   .164434  .000206  I  .0633086  .0000322  0.8318 0.0199  I   -10.205     .362     -.747     .298   .124000   .165000   .0629000      .000      .000  
+88 819 47392.00 I   .121374  .000301   .163241  .000187  I  .0625467  .0000272  0.6847 0.0214  I   -10.397     .370     -.966     .298   .122000   .164000   .0622000      .000      .000  
+88 820 47393.00 I   .119274  .000339   .162008  .000195  I  .0619491  .0000282  0.5079 0.0194  I   -10.766     .378    -1.291     .298   .120000   .163000   .0616000      .000      .000  
+88 821 47394.00 I   .117135  .000339   .160741  .000195  I  .0615310  .0000276  0.3307 0.0192  I   -11.131     .378    -1.542     .298   .118000   .161000   .0612000      .000      .000  
+88 822 47395.00 I   .114975  .000367   .159443  .000170  I  .0612741  .0000261  0.1943 0.0183  I   -11.277     .378    -1.537     .298   .116000   .160000   .0610000      .000      .000  
+88 823 47396.00 I   .112786  .000331   .158136  .000160  I  .0611109  .0000241  0.1523 0.0148  I   -11.185     .378    -1.335     .298   .114000   .159000   .0608000      .000      .000  
+88 824 47397.00 I   .110555  .000400   .156842  .000173  I  .0609245  .0000141  0.2452 0.0170  I   -10.990     .447    -1.151     .298   .112000   .158000   .0606000      .000      .000  
+88 825 47398.00 I   .108275  .000463   .155581  .000218  I  .0605739  .0000241  0.4778 0.0138  I   -10.810     .506    -1.050     .298   .110000   .156000   .0602000      .000      .000  
+88 826 47399.00 I   .105966  .000463   .154361  .000218  I  .0599372  .0000238  0.8056 0.0206  I   -10.733     .506     -.886     .298   .108000   .155000   .0595000      .000      .000  
+88 827 47400.00 I   .103668  .000451   .153183  .000226  I  .0589596  .0000335  1.1429 0.0241  I   -10.846     .506     -.589     .298   .105000   .154000   .0584000      .000      .000  
+88 828 47401.00 I   .101413  .000389   .152048  .000191  I  .0576822  .0000418  1.3879 0.0275  I   -11.141     .506     -.362     .298   .103000   .153000   .0570000      .000      .000  
+88 829 47402.00 I   .099179  .000357   .150947  .000223  I  .0562406  .0000435  1.4625 0.0392  I   -11.436     .358     -.409     .190   .101000   .152000   .0555000      .000      .000  
+88 830 47403.00 I   .096931  .000236   .149870  .000259  I  .0548202  .0000664  1.3483 0.0409  I   -11.607     .148     -.636     .252   .099000   .151000   .0540000      .000      .000  
+88 831 47404.00 I   .094639  .000313   .148808  .000364  I  .0535890  .0000692  1.0993 0.0478  I   -11.795     .148     -.832     .252   .097000   .150000   .0527000      .000      .000  
+88 9 1 47405.00 I   .092289  .000313   .147762  .000364  I  .0526372  .0000687  0.8036 0.0467  I   -12.200     .148    -1.020     .252   .094000   .149000   .0517000      .000      .000  
+88 9 2 47406.00 I   .089921  .000285   .146743  .000373  I  .0519722  .0000626  0.5368 0.0435  I   -12.762     .148    -1.204     .252   .092000   .148000   .0511000      .000      .000  
+88 9 3 47407.00 I   .087577  .000295   .145762  .000537  I  .0515357  .0000535  0.3539 0.0453  I   -13.165     .270    -1.448     .202   .090000   .147000   .0507000      .000      .000  
+88 9 4 47408.00 I   .085267  .000307   .144806  .000638  I  .0512297  .0000654  0.2751 0.0377  I   -13.239     .349    -1.700     .147   .088000   .146000   .0504000      .000      .000  
+88 9 5 47409.00 I   .082984  .000318   .143851  .000673  I  .0509546  .0000532  0.2888 0.0396  I   -13.053     .384    -1.797     .298   .086000   .145000   .0503000      .000      .000  
+88 9 6 47410.00 I   .080727  .000257   .142877  .000594  I  .0506274  .0000448  0.3765 0.0321  I   -12.622     .384    -1.765     .298   .083000   .144000   .0501000      .000      .000  
+88 9 7 47411.00 I   .078490  .000226   .141894  .000541  I  .0501843  .0000359  0.5162 0.0403  I   -11.938     .350    -1.708     .126   .081000   .143000   .0497000      .000      .000  
+88 9 8 47412.00 I   .076267  .000314   .140924  .000476  I  .0495867  .0000669  0.6809 0.0425  I   -11.080     .279    -1.588     .124   .079000   .142000   .0492000      .000      .000  
+88 9 9 47413.00 I   .074057  .000347   .139990  .000165  I  .0488225  .0000770  0.8455 0.0510  I   -10.257     .175    -1.228     .141   .076000   .141000   .0485000      .000      .000  
+88 910 47414.00 I   .071886  .000347   .139112  .000165  I  .0479034  .0000769  0.9870 0.0555  I    -9.698     .175     -.574     .141   .074000   .141000   .0476000      .000      .000  
+88 911 47415.00 I   .069777  .000347   .138302  .000165  I  .0468630  .0000800  1.0852 0.0515  I    -9.448     .175     -.053     .141   .071000   .140000   .0466000      .000      .000  
+88 912 47416.00 I   .067686  .000406   .137557  .000256  I  .0457511  .0000686  1.1293 0.0509  I    -9.473     .175      .009     .141   .069000   .139000   .0454000      .000      .000  
+88 913 47417.00 I   .065546  .000372   .136864  .000241  I  .0446227  .0000631  1.1185 0.0538  I    -9.709     .115     -.336     .298   .067000   .138000   .0442000      .000      .000  
+88 914 47418.00 I   .063293  .000339   .136209  .000241  I  .0435312  .0000830  1.0565 0.0354  I   -10.030     .121     -.813     .298   .064000   .138000   .0431000      .000      .000  
+88 915 47419.00 I   .060869  .000350   .135577  .000369  I  .0425233  .0000321  0.9537 0.0447  I   -10.321     .121    -1.176     .298   .062000   .137000   .0420000      .000      .000  
+88 916 47420.00 I   .058265  .000350   .134961  .000369  I  .0416315  .0000331  0.8277 0.0219  I   -10.584     .180    -1.381     .298   .059000   .136000   .0411000      .000      .000  
+88 917 47421.00 I   .055502  .000347   .134348  .000426  I  .0408676  .0000298  0.7025 0.0216  I   -10.851     .180    -1.522     .298   .056000   .136000   .0404000      .000      .000  
+88 918 47422.00 I   .052603  .000157   .133723  .000395  I  .0402159  .0000277  0.6092 0.0225  I   -11.036     .516    -1.624     .298   .053000   .135000   .0397000      .000      .000  
+88 919 47423.00 I   .049581  .000191   .133086  .000425  I  .0396256  .0000337  0.5867 0.0235  I   -10.958     .663    -1.642     .109   .050000   .135000   .0392000      .000      .000  
+88 920 47424.00 I   .046436  .000206   .132471  .000460  I  .0390073  .0000379  0.6697 0.0259  I   -10.562     .663    -1.580     .109   .047000   .134000   .0386000      .000      .000  
+88 921 47425.00 I   .043170  .000204   .131913  .000466  I  .0382443  .0000394  0.8783 0.0339  I    -9.966     .663    -1.506     .109   .044000   .134000   .0379000      .000      .000  
+88 922 47426.00 I   .039824  .000210   .131419  .000386  I  .0372149  .0000563  1.1943 0.0326  I    -9.532     .747    -1.382     .122   .041000   .133000   .0369000      .000      .000  
+88 923 47427.00 I   .036435  .000336   .130977  .000351  I  .0358406  .0000519  1.5556 0.0417  I    -9.523     .717    -1.096     .118   .037000   .133000   .0355000      .000      .000  
+88 924 47428.00 I   .033043  .000377   .130578  .000317  I  .0341172  .0000616  1.8766 0.0412  I    -9.996     .668     -.668     .298   .034000   .133000   .0338000      .000      .000  
+88 925 47429.00 I   .029697  .000425   .130234  .000333  I  .0321301  .0000641  2.0697 0.0433  I   -10.757     .669     -.330     .112   .031000   .132000   .0318000      .000      .000  
+88 926 47430.00 I   .026438  .000519   .129962  .000468  I  .0300408  .0000608  2.0737 0.0407  I   -11.373     .669     -.294     .112   .027000   .132000   .0297000      .000      .000  
+88 927 47431.00 I   .023217  .000537   .129768  .000556  I  .0280465  .0000503  1.8862 0.0314  I   -11.611     .669     -.456     .112   .024000   .132000   .0277000      .000      .000  
+88 928 47432.00 I   .019958  .000480   .129647  .000563  I  .0263097  .0000161  1.5747 0.0373  I   -11.680     .769     -.521     .179   .021000   .132000   .0260000      .000      .000  
+88 929 47433.00 I   .016604  .000523   .129578  .000643  I  .0249050  .0000552  1.2396 0.0306  I   -11.885     .858     -.427     .227   .018000   .132000   .0245000      .000      .000  
+88 930 47434.00 I   .013117  .000549   .129525  .000669  I  .0238086  .0000590  0.9702 0.0402  I   -12.136     .858     -.450     .227   .014000   .132000   .0234000      .000      .000  
+8810 1 47435.00 I   .009537  .000549   .129435  .000669  I  .0229268  .0000584  0.8144 0.0391  I   -12.027     .858     -.829     .227   .011000   .132000   .0225000      .000      .000  
+8810 2 47436.00 I   .005981  .000476   .129326  .000550  I  .0221395  .0000512  0.7797 0.0380  I   -11.425     .858    -1.362     .227   .008000   .132000   .0216000      .000      .000  
+8810 3 47437.00 I   .002559  .000523   .129250  .000548  I  .0213314  .0000486  0.8529 0.0417  I   -10.659     .843    -1.612     .271   .005000   .132000   .0207000      .000      .000  
+8810 4 47438.00 I  -.000668  .000851   .129269  .000668  I  .0204069  .0000659  1.0064 0.0308  I   -10.096     .684    -1.346     .396   .002000   .132000   .0198000      .000      .000  
+8810 5 47439.00 I  -.003644  .000847   .129446  .000731  I  .0193018  .0000377  1.2103 0.0365  I    -9.802     .684     -.615     .396  -.001600   .132100   .0186300      .000      .000  
+8810 6 47440.00 I  -.006348  .000833   .129831  .000796  I  .0179812  .0000315  1.4296 0.0233  I    -9.680     .684      .472     .396  -.004800   .132500   .0172900      .000      .000  
+8810 7 47441.00 I  -.008941  .000775   .130419  .000736  I  .0164502  .0000273  1.6262 0.0207  I    -9.673     .684     1.342     .396  -.008000   .133000   .0157700      .000      .000  
+8810 8 47442.00 I  -.011635  .000721   .131184  .000732  I  .0147438  .0000269  1.7779 0.0199  I    -9.803     .533     1.470     .322  -.011200   .133500   .0141000      .000      .000  
+8810 9 47443.00 I  -.014534  .000788   .132069  .000819  I  .0129147  .0000290  1.8687 0.0196  I   -10.097     .112     1.079     .331  -.014400   .134100   .0123300      .000      .000  
+881010 47444.00 I  -.017668  .000788   .132983  .000819  I  .0110303  .0000285  1.8879 0.0197  I   -10.541     .116      .424     .166  -.017600   .134700   .0105200      .000      .000  
+881011 47445.00 I  -.021041  .000312   .133834  .000641  I  .0091639  .0000266  1.8320 0.0208  I   -11.122     .116     -.145     .166  -.020800   .135300   .0087500      .000      .000  
+881012 47446.00 I  -.024606  .000361   .134593  .000628  I  .0073898  .0000304  1.7055 0.0215  I   -11.735     .116     -.439     .166  -.024000   .136000   .0070800      .000      .000  
+881013 47447.00 I  -.028288  .000335   .135265  .000533  I  .0057691  .0000339  1.5302 0.0319  I   -12.164     .835     -.406     .729  -.027200   .136700   .0055600      .000      .000  
+881014 47448.00 I  -.031998  .000399   .135860  .000433  I  .0043350  .0000561  1.3380 0.0338  I   -12.223    1.176     -.145    1.017  -.030400   .137400   .0042200      .000      .000  
+881015 47449.00 I  -.035649  .000462   .136389  .000483  I  .0030862  .0000584  1.1663 0.0326  I   -11.874    1.176      .093    1.017  -.033600   .138100   .0030300      .000      .000  
+881016 47450.00 I  -.039166  .000550   .136885  .000671  I  .0019811  .0000331  1.0584 0.0332  I   -11.175    1.176      .064    1.017  -.036800   .138800   .0019600      .000      .000  
+881017 47451.00 I  -.042495  .000600   .137399  .000829  I  .0009354  .0000318  1.0526 0.0234  I   -10.311    1.215     -.235     .856  -.039900   .139500   .0009200      .000      .000  
+881018 47452.00 I  -.045595  .000713   .137986  .001057  I -.0001641  .0000332  1.1669 0.0213  I    -9.469    1.150     -.659     .720  -.043000   .140300  -.0002100      .000      .000  
+881019 47453.00 I  -.048446  .000713   .138691  .001104  I -.0014361  .0000282  1.3942 0.0233  I    -8.822    1.125    -1.050     .298  -.046100   .141100  -.0015300      .000      .000  
+881020 47454.00 I  -.051072  .000713   .139535  .001104  I -.0029797  .0000327  1.7032 0.0219  I    -8.561    1.125    -1.229     .298  -.049200   .141900  -.0031300      .000      .000  
+881021 47455.00 I  -.053561  .000771   .140503  .001105  I -.0048462  .0000335  2.0235 0.0231  I    -8.456    1.125    -1.100     .298  -.052300   .142800  -.0050600      .000      .000  
+881022 47456.00 I  -.056022  .000790   .141580  .000971  I -.0069989  .0000327  2.2606 0.0250  I    -8.480    1.125     -.713     .298  -.055300   .143700  -.0072600      .000      .000  
+881023 47457.00 I  -.058573  .000718   .142753  .000824  I -.0093158  .0000370  2.3428 0.0239  I    -8.623     .615     -.290     .298  -.058300   .144700  -.0096200      .000      .000  
+881024 47458.00 I  -.061320  .000661   .144005  .000413  I -.0116231  .0000348  2.2406 0.0254  I    -8.619     .334     -.065     .298  -.061300   .145700  -.0119800      .000      .000  
+881025 47459.00 I  -.064320  .000661   .145306  .000413  I -.0137447  .0000348  1.9813 0.0224  I    -8.291     .334     -.055     .298  -.064300   .146800  -.0141400      .000      .000  
+881026 47460.00 I  -.067585  .000603   .146623  .000432  I -.0155610  .0000283  1.6478 0.0250  I    -7.836     .334     -.072     .298  -.067300   .148000  -.0160000      .000      .000  
+881027 47461.00 I  -.071008  .000511   .147942  .000477  I -.0170483  .0000358  1.3382 0.0229  I    -7.589     .334      .022     .298  -.070300   .149200  -.0175400      .000      .000  
+881028 47462.00 I  -.074448  .000511   .149283  .000492  I -.0182697  .0000359  1.1255 0.0267  I    -7.577     .305      .130     .175  -.073200   .150600  -.0188100      .000      .000  
+881029 47463.00 I  -.077762  .000455   .150669  .000522  I -.0193425  .0000397  1.0424 0.0264  I    -7.490     .284      .088     .214  -.076200   .151900  -.0199300      .000      .000  
+881030 47464.00 I  -.080813  .000750   .152136  .000507  I -.0203951  .0000387  1.0811 0.0282  I    -7.131     .284     -.066     .214  -.079100   .153400  -.0210200      .000      .000  
+881031 47465.00 I  -.083525  .000750   .153718  .000507  I -.0215348  .0000401  1.2103 0.0265  I    -6.675     .316     -.142     .188  -.082000   .154900  -.0222000      .000      .000  
+8811 1 47466.00 I  -.086039  .000685   .155397  .000443  I -.0228325  .0000361  1.3901 0.0232  I    -6.359     .316     -.035     .188  -.084900   .156500  -.0235300      .000      .000  
+8811 2 47467.00 I  -.088557  .000640   .157148  .000405  I -.0243200  .0000233  1.5851 0.0218  I    -6.152     .283      .163     .183  -.087700   .158200  -.0250200      .000      .000  
+8811 3 47468.00 I  -.091194  .000758   .158948  .000239  I -.0259991  .0000245  1.7695 0.0235  I    -5.850     .348      .359     .214  -.090500   .159900  -.0266900      .000      .000  
+8811 4 47469.00 I  -.093909  .000714   .160779  .000576  I -.0278487  .0000408  1.9231 0.0248  I    -5.480     .348      .629     .214  -.093200   .161700  -.0285100      .000      .000  
+8811 5 47470.00 I  -.096631  .000657   .162627  .000584  I -.0298275  .0000432  2.0233 0.0280  I    -5.301     .365     1.072     .213  -.095900   .163500  -.0304200      .000      .000  
+8811 6 47471.00 I  -.099338  .000303   .164502  .000597  I -.0318693  .0000383  2.0456 0.0282  I    -5.472     .356     1.329     .236  -.098600   .165400  -.0323700      .000      .000  
+8811 7 47472.00 I  -.102060  .000318   .166418  .000750  I -.0338902  .0000363  1.9823 0.0230  I    -5.851     .398     1.258     .235  -.101300   .167300  -.0343100      .000      .000  
+8811 8 47473.00 I  -.104826  .000283   .168374  .000608  I -.0358126  .0000253  1.8549 0.0220  I    -6.198     .567     1.090     .241  -.103900   .169200  -.0361700      .000      .000  
+8811 9 47474.00 I  -.107616  .000265   .170322  .000621  I -.0375893  .0000249  1.6954 0.0166  I    -6.467     .574      .902     .195  -.106400   .171200  -.0378900      .000      .000  
+881110 47475.00 I  -.110370  .000265   .172220  .000621  I -.0391988  .0000215  1.5222 0.0150  I    -6.609     .574      .694     .195  -.108800   .173200  -.0394700      .000      .000  
+881111 47476.00 I  -.112960  .000250   .174102  .000506  I -.0406350  .0000168  1.3531 0.0137  I    -6.371     .605      .536     .192  -.111200   .175300  -.0408900      .000      .000  
+881112 47477.00 I  -.115258  .000247   .176073  .000492  I -.0419216  .0000169  1.2339 0.0117  I    -5.850     .496      .561     .162  -.113400   .177400  -.0421800      .000      .000  
+881113 47478.00 I  -.117269  .000220   .178146  .000455  I -.0431352  .0000162  1.2120 0.0121  I    -5.318     .509      .737     .105  -.115700   .179600  -.0434200      .000      .000  
+881114 47479.00 I  -.119034  .000221   .180309  .000290  I -.0443845  .0000174  1.3067 0.0204  I    -4.851     .321      .864     .108  -.117800   .181800  -.0447200      .000      .000  
+881115 47480.00 I  -.120585  .000244   .182550  .000357  I -.0457852  .0000374  1.5112 0.0146  I    -4.436     .108      .840     .298  -.119900   .184100  -.0461700      .000      .000  
+881116 47481.00 I  -.121991  .000239   .184885  .000336  I -.0474319  .0000234  1.7908 0.0219  I    -4.045     .108      .730     .298  -.121900   .186400  -.0478600      .000      .000  
+881117 47482.00 I  -.123340  .000242   .187332  .000331  I -.0493727  .0000229  2.0880 0.0425  I    -3.721     .791      .670     .298  -.123900   .188800  -.0498400      .000      .000  
+881118 47483.00 I  -.124708  .000235   .189888  .000359  I -.0515897  .0000817  2.3306 0.0422  I    -3.585     .791      .753     .298  -.125800   .191300  -.0520900      .000      .000  
+881119 47484.00 I  -.126172  .000235   .192541  .000359  I -.0539944  .0000813  2.4547 0.0568  I    -3.753     .791      .979     .298  -.127700   .193800  -.0545100      .000      .000  
+881120 47485.00 I  -.127798  .000564   .195270  .000415  I -.0564475  .0000789  2.4240 0.0524  I    -4.185     .791     1.249     .298  -.129600   .196400  -.0569700      .000      .000  
+881121 47486.00 I  -.129602  .000515   .198043  .000373  I -.0587926  .0000661  2.2439 0.0513  I    -4.658     .791     1.407     .298  -.131400   .199000  -.0593200      .000      .000  
+881122 47487.00 I  -.131586  .000565   .200833  .000368  I -.0609012  .0000656  1.9616 0.0576  I    -4.955     .136     1.378     .298  -.133300   .201700  -.0614200      .000      .000  
+881123 47488.00 I  -.133739  .000626   .203614  .000711  I -.0627064  .0000944  1.6512 0.0346  I    -5.071     .182     1.231     .298  -.135100   .204400  -.0632200      .000      .000  
+881124 47489.00 I  -.135980  .000626   .206392  .000711  I -.0642198  .0000222  1.3893 0.0485  I    -5.156     .182     1.098     .298  -.136900   .207200  -.0647300      .000      .000  
+881125 47490.00 I  -.138213  .000626   .209184  .000711  I -.0655199  .0000225  1.2322 0.0149  I    -5.282     .182     1.044     .298  -.138700   .210000  -.0660300      .000      .000  
+881126 47491.00 I  -.140403  .000331   .212013  .000569  I -.0667258  .0000199  1.1998 0.0203  I    -5.325     .182     1.064     .298  -.140500   .212800  -.0672500      .000      .000  
+881127 47492.00 I  -.142552  .000305   .214861  .000503  I -.0679543  .0000339  1.2718 0.0217  I    -5.158     .232     1.158     .153  -.142300   .215700  -.0684900      .000      .000  
+881128 47493.00 I  -.144665  .000241   .217698  .000512  I -.0692912  .0000386  1.4094 0.0258  I    -4.809     .231     1.342     .178  -.144000   .218500  -.0698400      .000      .000  
+881129 47494.00 I  -.146749  .000229   .220493  .000308  I -.0707816  .0000389  1.5727 0.0273  I    -4.386     .231     1.581     .178  -.145700   .221400  -.0713400      .000      .000  
+881130 47495.00 I  -.148794  .000229   .223228  .000308  I -.0724359  .0000386  1.7339 0.0273  I    -3.903     .231     1.784     .178  -.147400   .224300  -.0729900      .000      .000  
+8812 1 47496.00 I  -.150745  .000592   .225929  .000287  I -.0742397  .0000384  1.8659 0.0272  I    -3.338     .231     1.883     .178  -.149000   .227100  -.0747800      .000      .000  
+8812 2 47497.00 I  -.152550  .000616   .228623  .000235  I -.0761494  .0000382  1.9429 0.0250  I    -2.752     .475     1.935     .299  -.150600   .230000  -.0766700      .000      .000  
+8812 3 47498.00 I  -.154162  .000691   .231337  .000160  I -.0781025  .0000321  1.9509 0.0257  I    -2.286     .572     2.025     .348  -.152100   .232900  -.0785900      .000      .000  
+8812 4 47499.00 I  -.155533  .000965   .234098  .000232  I -.0800263  .0000344  1.8842 0.0231  I    -2.072     .693     2.101     .414  -.153600   .235800  -.0804900      .000      .000  
+8812 5 47500.00 I  -.156686  .000931   .236928  .000273  I -.0818496  .0000333  1.7535 0.0221  I    -2.170     .693     2.024     .414  -.155100   .238700  -.0822900      .000      .000  
+8812 6 47501.00 I  -.157701  .000787   .239829  .000384  I -.0835181  .0000276  1.5773 0.0230  I    -2.503     .693     1.759     .414  -.156400   .241500  -.0839300      .000      .000  
+8812 7 47502.00 I  -.158659  .000318   .242801  .000505  I -.0849965  .0000316  1.3779 0.0191  I    -2.969     .498     1.422     .302  -.157700   .244400  -.0853800      .000      .000  
+8812 8 47503.00 I  -.159628  .000298   .245841  .000350  I -.0862774  .0000263  1.1888 0.0234  I    -3.490     .131     1.180     .103  -.158900   .247200  -.0866400      .000      .000  
+8812 9 47504.00 I  -.160621  .000298   .248931  .000350  I -.0873914  .0000346  1.0516 0.0221  I    -3.964     .318     1.131     .298  -.160000   .250100  -.0877300      .000      .000  
+881210 47505.00 I  -.161634  .000298   .252042  .000350  I -.0884065  .0000355  0.9921 0.0241  I    -4.273     .318     1.279     .298  -.160900   .253000  -.0887000      .000      .000  
+881211 47506.00 I  -.162667  .000200   .255108  .000371  I -.0894034  .0000335  1.0161 0.0237  I    -4.278     .318     1.485     .298  -.161700   .255900  -.0896700      .000      .000  
+881212 47507.00 I  -.163707  .000493   .258085  .000365  I -.0904717  .0000315  1.1392 0.0231  I    -3.896     .397     1.577     .298  -.162400   .258800  -.0907500      .000      .000  
+881213 47508.00 I  -.164702  .000577   .260986  .000266  I -.0917109  .0000319  1.3496 0.0223  I    -3.323     .442     1.530     .298  -.163000   .261700  -.0920300      .000      .000  
+881214 47509.00 I  -.165583  .000577   .263835  .000266  I -.0931807  .0000317  1.5895 0.0220  I    -2.854     .442     1.438     .298  -.163500   .264600  -.0935700      .000      .000  
+881215 47510.00 I  -.166239  .000696   .266649  .000375  I -.0948778  .0000303  1.7932 0.0198  I    -2.721     .412     1.420     .298  -.164000   .267500  -.0953200      .000      .000  
+881216 47511.00 I  -.166572  .000586   .269463  .000337  I -.0967332  .0000238  1.8953 0.0181  I    -2.887     .412     1.446     .298  -.164400   .270400  -.0972300      .000      .000  
+881217 47512.00 I  -.166652  .000594   .272299  .000294  I -.0986221  .0000199  1.8584 0.0186  I    -3.226     .394     1.524     .182  -.164700   .273300  -.0991700      .000      .000  
+881218 47513.00 I  -.166579  .000652   .275166  .000209  I -.1004058  .0000285  1.6888 0.0157  I    -3.616     .294     1.717     .254  -.164900   .276200  -.1009900      .000      .000  
+881219 47514.00 I  -.166451  .000447   .278072  .000218  I -.1019672  .0000243  1.4218 0.0187  I    -3.893     .330     2.052     .282  -.165000   .279100  -.1025800      .000      .000  
+881220 47515.00 I  -.166364  .000446   .281028  .000300  I -.1032387  .0000242  1.1227 0.0149  I    -3.901     .330     2.485     .282  -.165000   .282000  -.1038800      .000      .000  
+881221 47516.00 I  -.166345  .000389   .284038  .000337  I -.1042255  .0000174  0.8624 0.0149  I    -3.670     .449     2.594     .222  -.165000   .284900  -.1049000      .000      .000  
+881222 47517.00 I  -.166322  .000389   .287090  .000337  I -.1049930  .0000175  0.6907 0.0136  I    -3.282     .449     2.315     .222  -.164800   .287700  -.1057000      .000      .000  
+881223 47518.00 I  -.166208  .000474   .290178  .000429  I -.1056444  .0000210  0.6314 0.0183  I    -2.825     .497     1.921     .186  -.164600   .290600  -.1063800      .000      .000  
+881224 47519.00 I  -.165936  .000322   .293325  .000429  I -.1062911  .0000321  0.6782 0.0192  I    -2.395     .582     1.664     .298  -.164300   .293500  -.1070400      .000      .000  
+881225 47520.00 I  -.165480  .000322   .296533  .000429  I -.1070274  .0000322  0.8050 0.0236  I    -2.047     .582     1.631     .298  -.163900   .296400  -.1078000      .000      .000  
+881226 47521.00 I  -.164879  .000247   .299756  .000537  I -.1079153  .0000346  0.9743 0.0258  I    -1.787     .582     1.731     .298  -.163400   .299300  -.1087200      .000      .000  
+881227 47522.00 I  -.164185  .000250   .302943  .000570  I -.1089782  .0000404  1.1501 0.0291  I    -1.611     .182     1.817     .217  -.162800   .302200  -.1098000      .000      .000  
+881228 47523.00 I  -.163448  .000364   .306042  .000601  I -.1102095  .0000467  1.3079 0.0353  I    -1.541     .182     1.788     .217  -.162200   .305100  -.1110300      .000      .000  
+881229 47524.00 I  -.162718  .000364   .309000  .000601  I -.1115825  .0000578  1.4312 0.0318  I    -1.610     .182     1.679     .217  -.161500   .308000  -.1123800      .000      .000  
+881230 47525.00 I  -.162014  .000364   .311771  .000601  I -.1130535  .0000432  1.4993 0.0339  I    -1.815     .182     1.629     .217  -.160700   .310800  -.1138000      .000      .000  
+881231 47526.00 I  -.161329  .000386   .314379  .000510  I -.1145574  .0000356  1.4965 0.0274  I    -2.118     .182     1.714     .217  -.159900   .313700  -.1152300      .000      .000  
+89 1 1 47527.00 I  -.160623  .000365   .316868  .000435  I -.1160242  .0000337  1.4270 0.0270  I    -2.471     .203     1.844     .154  -.159100   .316500  -.1166000      .000      .000  
+89 1 2 47528.00 I  -.159834  .000411   .319279  .000120  I -.1173940  .0000405  1.3055 0.0267  I    -2.806     .222     1.872     .298  -.158200   .319200  -.1178600      .000      .000  
+89 1 3 47529.00 I  -.158899  .000368   .321651  .000104  I -.1186247  .0000415  1.1525 0.0245  I    -3.020     .222     1.781     .298  -.157300   .322000  -.1189700    -1.200      .700  
+89 1 4 47530.00 I  -.157777  .000368   .324021  .000104  I -.1196954  .0000277  0.9885 0.0245  I    -3.061     .222     1.702     .298  -.156100   .324500  -.1200400    -1.200      .600  
+89 1 5 47531.00 I  -.156514  .000324   .326406  .000149  I -.1206076  .0000262  0.8421 0.0200  I    -3.009     .222     1.731     .298  -.154900   .327000  -.1209400    -1.300      .500  
+89 1 6 47532.00 I  -.155183  .000292   .328817  .000139  I -.1213994  .0000288  0.7552 0.0233  I    -2.991     .184     1.814     .298  -.153700   .329500  -.1217400    -1.500      .400  
+89 1 7 47533.00 I  -.153835  .000396   .331261  .000158  I -.1221507  .0000386  0.7663 0.0237  I    -3.001     .136     1.855     .298  -.152500   .332000  -.1225100    -1.600      .300  
+89 1 8 47534.00 I  -.152507  .000396   .333745  .000158  I -.1229689  .0000377  0.8879 0.0268  I    -2.909     .136     1.834     .298  -.151300   .334600  -.1233600    -1.700      .200  
+89 1 9 47535.00 I  -.151241  .000398   .336273  .000176  I -.1239605  .0000372  1.1113 0.0246  I    -2.668     .136     1.789     .298  -.150200   .337300  -.1243300    -1.800      .300  
+89 110 47536.00 I  -.150107  .000336   .338829  .000194  I -.1252112  .0000316  1.3937 0.0221  I    -2.437     .136     1.734     .298  -.149300   .340000  -.1255800    -1.900      .300  
+89 111 47537.00 I  -.149139  .000263   .341389  .000145  I -.1267405  .0000238  1.6537 0.0188  I    -2.425     .387     1.635     .130  -.148400   .342700  -.1271300    -2.100      .400  
+89 112 47538.00 I  -.148319  .000302   .343925  .000138  I -.1284866  .0000202  1.8175 0.0150  I    -2.674     .488     1.500     .155  -.147600   .345300  -.1288800    -2.100      .600  
+89 113 47539.00 I  -.147620  .000155   .346411  .000139  I -.1303312  .0000181  1.8484 0.0135  I    -3.060     .488     1.435     .155  -.146800   .347900  -.1307300    -2.200      .700  
+89 114 47540.00 I  -.146987  .000155   .348832  .000139  I -.1321353  .0000180  1.7352 0.0122  I    -3.433     .488     1.548     .155  -.146000   .350300  -.1325300    -2.100      .800  
+89 115 47541.00 I  -.146334  .000134   .351191  .000157  I -.1337636  .0000165  1.5081 0.0116  I    -3.619     .488     1.685     .155  -.145100   .352700  -.1341600    -2.000      .800  
+89 116 47542.00 I  -.145597  .000165   .353501  .000181  I -.1351367  .0000147  1.2366 0.0109  I    -3.626     .514     1.772     .144  -.144200   .355100  -.1355200    -1.900      .900  
+89 117 47543.00 I  -.144734  .000187   .355784  .000173  I -.1362438  .0000141  0.9859 0.0115  I    -3.488     .549     1.762     .127  -.143300   .357400  -.1366300    -1.800     1.000  
+89 118 47544.00 I  -.143704  .000202   .358063  .000271  I -.1371317  .0000178  0.8046 0.0114  I    -3.220     .549     1.622     .127  -.142300   .359600  -.1375100    -1.700     1.000  
+89 119 47545.00 I  -.142476  .000202   .360360  .000271  I -.1378875  .0000178  0.7267 0.0128  I    -2.864     .549     1.380     .127  -.141100   .361800  -.1382600    -1.700     1.000  
+89 120 47546.00 I  -.141091  .000279   .362676  .000407  I -.1386235  .0000183  0.7638 0.0124  I    -2.500     .549     1.145     .127  -.140000   .364000  -.1389800    -1.700     1.000  
+89 121 47547.00 I  -.139636  .000437   .364995  .000361  I -.1394478  .0000172  0.8989 0.0147  I    -2.255     .428     1.065     .109  -.138700   .366200  -.1397900    -1.700     1.000  
+89 122 47548.00 I  -.138188  .000567   .367291  .000392  I -.1404436  .0000230  1.1008 0.0132  I    -2.205     .262     1.229     .109  -.137500   .368300  -.1407900    -1.700      .900  
+89 123 47549.00 I  -.136813  .000567   .369529  .000392  I -.1416598  .0000201  1.3338 0.0150  I    -2.270     .262     1.593     .109  -.136300   .370400  -.1419900    -1.800      .800  
+89 124 47550.00 I  -.135556  .000602   .371683  .000398  I -.1431067  .0000193  1.5532 0.0136  I    -2.289     .262     1.987     .109  -.135100   .372400  -.1435100    -2.100      .700  
+89 125 47551.00 I  -.134376  .000558   .373769  .000422  I -.1447478  .0000183  1.7173 0.0135  I    -2.170     .262     2.095     .109  -.134000   .374400  -.1452100    -2.400      .600  
+89 126 47552.00 I  -.133268  .000519   .375796  .000397  I -.1465163  .0000190  1.8063 0.0213  I    -2.029     .640     1.896     .121  -.132900   .376400  -.1470300    -2.600      .500  
+89 127 47553.00 I  -.132239  .000635   .377769  .000385  I -.1483335  .0000385  1.8148 0.0205  I    -2.004     .802     1.627     .141  -.131800   .378400  -.1488800    -2.900      .400  
+89 128 47554.00 I  -.131292  .000326   .379698  .000354  I -.1501200  .0000364  1.7458 0.0265  I    -2.144     .955     1.468     .137  -.130800   .380300  -.1507100    -3.000      .300  
+89 129 47555.00 I  -.130378  .000326   .381620  .000354  I -.1518051  .0000365  1.6168 0.0245  I    -2.479     .955     1.417     .137  -.129800   .382400  -.1523400    -2.700      .300  
+89 130 47556.00 I  -.129424  .000460   .383583  .000421  I -.1533415  .0000327  1.4513 0.0246  I    -2.938     .955     1.312     .137  -.128800   .384500  -.1538200    -2.300      .400  
+89 131 47557.00 I  -.128349  .000378   .385633  .000381  I -.1547032  .0000331  1.2721 0.0279  I    -3.355     .841     1.124     .145  -.127700   .386700  -.1551400    -1.900      .500  
+89 2 1 47558.00 I  -.127087  .000460   .387818  .000425  I -.1558913  .0000452  1.1096 0.0245  I    -3.579     .594      .996     .179  -.126500   .388900  -.1562700    -1.400      .600  
+89 2 2 47559.00 I  -.125585  .000454   .390188  .000450  I -.1569400  .0000362  0.9997 0.0300  I    -3.623     .594      .965     .179  -.125100   .391200  -.1572800    -1.000      .700  
+89 2 3 47560.00 I  -.123832  .000478   .392773  .000479  I -.1579212  .0000396  0.9811 0.0236  I    -3.594     .594      .840     .179  -.123500   .393600  -.1583500     -.300     1.000  
+89 2 4 47561.00 I  -.121911  .000425   .395525  .000435  I -.1589440  .0000304  1.0879 0.0239  I    -3.554     .594      .681     .179  -.121600   .396200  -.1593900      .000     1.100  
+89 2 5 47562.00 I  -.119903  .000220   .398354  .000387  I -.1601397  .0000266  1.3230 0.0201  I    -3.323     .564      .617     .211  -.119600   .398900  -.1606200      .200     1.100  
+89 2 6 47563.00 I  -.117871  .000194   .401156  .000348  I -.1616185  .0000264  1.6437 0.0187  I    -2.796     .480      .756     .254  -.117500   .401600  -.1621400      .400     1.100  
+89 2 7 47564.00 I  -.115849  .000189   .403803  .000379  I -.1634295  .0000263  1.9716 0.0185  I    -2.277     .541     1.069     .260  -.115300   .404100  -.1639800      .300     1.100  
+89 2 8 47565.00 I  -.113860  .000143   .406177  .000366  I -.1655334  .0000258  2.2145 0.0179  I    -2.200     .541     1.304     .260  -.113200   .406500  -.1661000     -.200      .900  
+89 2 9 47566.00 I  -.111876  .000141   .408262  .000366  I -.1678033  .0000244  2.2917 0.0172  I    -2.483     .481     1.477     .284  -.111000   .408700  -.1683600     -.800      .700  
+89 210 47567.00 I  -.109852  .000261   .410131  .000349  I -.1700525  .0000228  2.1760 0.0205  I    -2.843     .486     1.548     .252  -.108800   .410800  -.1705800    -1.500      .500  
+89 211 47568.00 I  -.107744  .000334   .411869  .000450  I -.1721051  .0000329  1.9096 0.0179  I    -3.115     .469     1.371     .253  -.106600   .412700  -.1726000    -2.200      .300  
+89 212 47569.00 I  -.105503  .000409   .413566  .000610  I -.1738461  .0000277  1.5664 0.0217  I    -3.280     .424      .854     .243  -.104300   .414600  -.1743200    -2.800      .100  
+89 213 47570.00 I  -.103089  .000409   .415308  .000610  I -.1752415  .0000284  1.2341 0.0205  I    -3.317     .424      .336     .243  -.101800   .416200  -.1757100    -2.800     -.100  
+89 214 47571.00 I  -.100531  .000487   .417146  .000627  I -.1763413  .0000303  0.9828 0.0195  I    -3.205     .424     -.036     .243  -.099200   .417700  -.1768200    -2.800     -.200  
+89 215 47572.00 I  -.097904  .000451   .419098  .000474  I -.1772436  .0000266  0.8410 0.0216  I    -2.952     .938     -.259     .166  -.096700   .419300  -.1777600    -2.700     -.300  
+89 216 47573.00 I  -.095312  .000372   .421131  .000421  I -.1780595  .0000308  0.8079 0.0268  I    -2.609    1.064     -.320     .174  -.094100   .420900  -.1786100    -2.600     -.300  
+89 217 47574.00 I  -.092857  .000366   .423210  .000338  I -.1788889  .0000466  0.8634 0.0276  I    -2.269    1.044     -.242     .160  -.091600   .422600  -.1794900    -2.500     -.400  
+89 218 47575.00 I  -.090612  .000607   .425283  .000405  I -.1798109  .0000458  0.9927 0.0313  I    -2.044    1.044     -.055     .160  -.089600   .425000  -.1803500    -2.500     -.300  
+89 219 47576.00 I  -.088536  .000571   .427269  .000399  I -.1808903  .0000417  1.1699 0.0300  I    -2.020    1.039      .113     .145  -.087600   .427400  -.1813500    -2.600     -.200  
+89 220 47577.00 I  -.086538  .000559   .429119  .000360  I -.1821532  .0000387  1.3547 0.0291  I    -1.960    1.020      .328     .125  -.085500   .429900  -.1825200    -2.800     -.100  
+89 221 47578.00 I  -.084432  .000574   .430932  .000390  I -.1835922  .0000405  1.5169 0.0282  I    -1.794     .919      .592     .110  -.083400   .432500  -.1838500    -2.900     -.100  
+89 222 47579.00 I  -.082059  .000620   .432797  .000432  I -.1851673  .0000409  1.6200 0.0267  I    -1.752     .985      .733     .298  -.081100   .435000  -.1852900    -3.000      .000  
+89 223 47580.00 I  -.079410  .000759   .434757  .000603  I -.1868075  .0000349  1.6490 0.0269  I    -1.737     .988      .631     .298  -.078000   .436900  -.1870700    -3.000     -.200  
+89 224 47581.00 I  -.076519  .000777   .436825  .000420  I -.1884434  .0000350  1.6123 0.0223  I    -1.716     .988      .394     .298  -.074800   .438700  -.1888600    -3.100     -.400  
+89 225 47582.00 I  -.073472  .000378   .438984  .000437  I -.1900135  .0000277  1.5199 0.0262  I    -1.682     .791      .190     .298  -.071500   .440400  -.1905900    -3.100     -.600  
+89 226 47583.00 I  -.070384  .000611   .441200  .000513  I -.1914703  .0000389  1.3889 0.0243  I    -1.614     .791      .022     .112  -.068200   .442200  -.1922000    -3.000     -.800  
+89 227 47584.00 I  -.067355  .000590   .443424  .000469  I -.1927852  .0000399  1.2396 0.0277  I    -1.562     .791     -.203     .112  -.065000   .444000  -.1936400    -2.900    -1.000  
+89 228 47585.00 I  -.064462  .000590   .445590  .000469  I -.1939514  .0000394  1.0958 0.0256  I    -1.565     .791     -.471     .112  -.062400   .446200  -.1946700    -2.700    -1.100  
+89 3 1 47586.00 I  -.061777  .000496   .447654  .000341  I -.1949889  .0000320  0.9881 0.0231  I    -1.585     .791     -.744     .112  -.060000   .448300  -.1955700    -2.500    -1.100  
+89 3 2 47587.00 I  -.059322  .000503   .449590  .000237  I -.1959522  .0000240  0.9541 0.0207  I    -1.712     .503     -.899     .125  -.057700   .450300  -.1963900    -2.200    -1.200  
+89 3 3 47588.00 I  -.057032  .000527   .451392  .000183  I -.1969334  .0000264  1.0290 0.0171  I    -2.125     .542    -1.004     .136  -.055600   .452100  -.1972600    -2.100    -1.200  
+89 3 4 47589.00 I  -.054827  .000415   .453056  .000124  I -.1980522  .0000244  1.2297 0.0186  I    -2.779     .622    -1.219     .133  -.053500   .453900  -.1983000    -1.900    -1.100  
+89 3 5 47590.00 I  -.052640  .000405   .454584  .000118  I -.1994315  .0000261  1.5463 0.0170  I    -3.303     .622    -1.423     .133  -.051500   .455300  -.1997600    -2.200    -1.000  
+89 3 6 47591.00 I  -.050464  .000372   .455997  .000143  I -.2011648  .0000236  1.9229 0.0180  I    -3.291     .622    -1.420     .133  -.049300   .456600  -.2015700    -2.400     -.800  
+89 3 7 47592.00 I  -.048237  .000456   .457318  .000232  I -.2032656  .0000248  2.2643 0.0183  I    -2.920     .500    -1.089     .104  -.047100   .457700  -.2037500    -2.600     -.700  
+89 3 8 47593.00 I  -.045879  .000485   .458566  .000252  I -.2056514  .0000281  2.4796 0.0210  I    -2.722     .288     -.613     .298  -.044800   .458800  -.2061700    -2.800     -.500  
+89 3 9 47594.00 I  -.043333  .000470   .459762  .000327  I -.2081660  .0000340  2.5184 0.0214  I    -2.909     .220     -.340     .298  -.042400   .459900  -.2087000    -2.900     -.500  
+89 310 47595.00 I  -.040559  .000470   .460928  .000327  I -.2106262  .0000322  2.3713 0.0282  I    -3.250     .220     -.371     .298  -.039700   .461200  -.2111500    -2.600     -.700  
+89 311 47596.00 I  -.037601  .000500   .462108  .000353  I -.2128614  .0000451  2.0825 0.0277  I    -3.438     .220     -.559     .298  -.037000   .462600  -.2133400    -2.300    -1.000  
+89 312 47597.00 I  -.034537  .000500   .463328  .000353  I -.2147751  .0000451  1.7454 0.0434  I    -3.346     .254     -.792     .298  -.034100   .464000  -.2151900    -2.000    -1.400  
+89 313 47598.00 I  -.031444  .000485   .464609  .000445  I -.2163651  .0000741  1.4469 0.0431  I    -2.976     .284    -1.099     .298  -.031100   .465500  -.2167300    -1.600    -1.700  
+89 314 47599.00 I  -.028399  .000485   .465972  .000445  I -.2176977  .0000734  1.2348 0.0525  I    -2.402     .284    -1.481     .298  -.028100   .467000  -.2180500    -1.300    -2.100  
+89 315 47600.00 I  -.025444  .000485   .467418  .000445  I -.2188749  .0000743  1.1432 0.0467  I    -1.825     .284    -1.792     .298  -.025000   .468400  -.2192200    -1.200    -2.300  
+89 316 47601.00 I  -.022537  .000373   .468923  .000478  I -.2200257  .0000577  1.1762 0.0447  I    -1.467     .284    -1.894     .298  -.021800   .469800  -.2204100    -1.100    -2.500  
+89 317 47602.00 I  -.019637  .000359   .470447  .000491  I -.2212566  .0000497  1.2969 0.0349  I    -1.370     .300    -1.811     .298  -.018700   .471100  -.2217300    -1.100    -2.700  
+89 318 47603.00 I  -.016728  .000253   .471924  .000525  I -.2226366  .0000394  1.4688 0.0312  I    -1.411     .310    -1.674     .108  -.015600   .472300  -.2232000    -1.100    -2.800  
+89 319 47604.00 I  -.013793  .000195   .473291  .000504  I -.2242018  .0000377  1.6636 0.0276  I    -1.450     .310    -1.500     .108  -.012500   .473500  -.2248600    -1.100    -2.800  
+89 320 47605.00 I  -.010811  .000180   .474489  .000487  I -.2259581  .0000386  1.8412 0.0253  I    -1.426     .310    -1.205     .108  -.009500   .474800  -.2265900    -1.100    -2.700  
+89 321 47606.00 I  -.007772  .000178   .475523  .000436  I -.2278645  .0000336  1.9597 0.0228  I    -1.333     .310     -.837     .108  -.006400   .475900  -.2284400    -1.100    -2.500  
+89 322 47607.00 I  -.004680  .000169   .476423  .000394  I -.2298524  .0000244  2.0030 0.0212  I    -1.191     .429     -.622     .214  -.003400   .476900  -.2303600    -1.100    -2.400  
+89 323 47608.00 I  -.001536  .000165   .477221  .000210  I -.2318442  .0000258  1.9673 0.0256  I    -1.062     .560     -.755     .306  -.000400   .477800  -.2322500    -1.000    -2.200  
+89 324 47609.00 I   .001662  .000586   .477931  .000339  I -.2337629  .0000449  1.8593 0.0239  I     -.992     .461    -1.208     .276   .002600   .478600  -.2340800     -.800    -2.100  
+89 325 47610.00 I   .004910  .000567   .478562  .000360  I -.2355462  .0000402  1.7015 0.0294  I     -.932     .461    -1.799     .276   .005700   .479300  -.2359200     -.400    -2.200  
+89 326 47611.00 I   .008163  .000514   .479117  .000437  I -.2371585  .0000379  1.5214 0.0269  I     -.817     .402    -2.283     .244   .008700   .479800  -.2375800      .100    -2.300  
+89 327 47612.00 I   .011358  .000460   .479605  .000433  I -.2385892  .0000357  1.3419 0.0301  I     -.676     .723    -2.505     .230   .011700   .480300  -.2390200      .500    -2.500  
+89 328 47613.00 I   .014456  .000563   .480025  .000526  I -.2398493  .0000469  1.1833 0.0284  I     -.589     .715    -2.497     .176   .014800   .480700  -.2402700      .900    -2.700  
+89 329 47614.00 I   .017512  .000597   .480344  .000558  I -.2409700  .0000441  1.0672 0.0275  I     -.601     .715    -2.379     .176   .017900   .481100  -.2413800     1.300    -2.900  
+89 330 47615.00 I   .020572  .000597   .480580  .000558  I -.2420101  .0000289  1.0303 0.0289  I     -.747     .719    -2.296     .157   .021100   .481400  -.2424700     1.400    -2.900  
+89 331 47616.00 I   .023676  .000384   .480793  .000506  I -.2430699  .0000373  1.1111 0.0228  I    -1.083     .719    -2.205     .157   .024400   .481700  -.2436200     1.300    -2.900  
+89 4 1 47617.00 I   .026828  .000419   .481018  .000408  I -.2442733  .0000354  1.3147 0.0267  I    -1.483     .662    -2.227     .146   .027700   .481900  -.2449400     1.100    -2.800  
+89 4 2 47618.00 I   .030002  .000464   .481275  .000377  I -.2457298  .0000383  1.6096 0.0257  I    -1.605     .181    -2.406     .104   .031100   .482200  -.2465400      .900    -2.800  
+89 4 3 47619.00 I   .033252  .000505   .481540  .000405  I -.2475001  .0000374  1.9273 0.0268  I    -1.274     .190    -2.457     .298   .034500   .482400  -.2484400      .500    -2.700  
+89 4 4 47620.00 I   .036645  .000445   .481775  .000404  I -.2495596  .0000376  2.1704 0.0258  I     -.737     .190    -2.163     .298   .037900   .482600  -.2503600     -.400    -2.600  
+89 4 5 47621.00 I   .040156  .000333   .481968  .000204  I -.2517880  .0000356  2.2546 0.0203  I     -.446     .191    -1.693     .298   .041300   .482700  -.2524200    -1.100    -2.700  
+89 4 6 47622.00 I   .043695  .000482   .482123  .000244  I -.2540059  .0000153  2.1501 0.0210  I     -.585     .148    -1.429     .165   .044800   .482900  -.2544400    -1.700    -2.900  
+89 4 7 47623.00 I   .047168  .000609   .482245  .000303  I -.2560372  .0000224  1.8927 0.0138  I     -.953     .791    -1.531     .221   .048200   .483000  -.2563000    -2.200    -3.000  
+89 4 8 47624.00 I   .050497  .000609   .482334  .000303  I -.2577692  .0000230  1.5690 0.0162  I    -1.275     .791    -1.831     .221   .051600   .483100  -.2578500    -2.500    -3.200  
+89 4 9 47625.00 I   .053617  .000609   .482389  .000303  I -.2591858  .0000235  1.2772 0.0134  I    -1.416     .791    -2.156     .221   .054700   .483200  -.2594100    -2.200    -3.300  
+89 410 47626.00 I   .056542  .000461   .482418  .000289  I -.2603588  .0000136  1.0909 0.0127  I    -1.283     .791    -2.540     .221   .057800   .483200  -.2607300    -1.600    -3.400  
+89 411 47627.00 I   .059357  .000405   .482421  .000265  I -.2614125  .0000097  1.0392 0.0084  I     -.880     .190    -2.963     .255   .060900   .483200  -.2619200    -1.000    -3.400  
+89 412 47628.00 I   .062146  .000201   .482398  .000212  I -.2624770  .0000098  1.1070 0.0075  I     -.458     .255    -3.231     .285   .063900   .483200  -.2630900     -.400    -3.500  
+89 413 47629.00 I   .064996  .000201   .482348  .000212  I -.2636536  .0000114  1.2560 0.0116  I     -.354     .255    -3.152     .285   .066900   .483200  -.2643500      .200    -3.500  
+89 414 47630.00 I   .067974  .000201   .482275  .000212  I -.2650022  .0000211  1.4445 0.0108  I     -.609     .255    -2.809     .285   .069900   .483100  -.2656000      .400    -3.400  
+89 415 47631.00 I   .071056  .000176   .482182  .000209  I -.2665444  .0000184  1.6384 0.0134  I     -.926     .255    -2.470     .285   .072900   .483000  -.2670200      .600    -3.300  
+89 416 47632.00 I   .074175  .000259   .482084  .000278  I -.2682722  .0000165  1.8121 0.0152  I    -1.006     .190    -2.277     .211   .075800   .482900  -.2686400      .600    -3.100  
+89 417 47633.00 I   .077261  .000278   .481993  .000300  I -.2701558  .0000243  1.9476 0.0159  I     -.847     .791    -2.136     .134   .078700   .482800  -.2704300      .600    -3.000  
+89 418 47634.00 I   .080242  .000269   .481921  .000346  I -.2721509  .0000273  2.0338 0.0214  I     -.624     .791    -1.949     .134   .081400   .482800  -.2723800      .600    -2.900  
+89 419 47635.00 I   .083051  .000384   .481881  .000391  I -.2742048  .0000352  2.0643 0.0197  I     -.455     .791    -1.834     .120   .084000   .482900  -.2745500      .500    -2.900  
+89 420 47636.00 I   .085654  .000373   .481862  .000449  I -.2762618  .0000284  2.0416 0.0231  I     -.352     .298    -2.123     .166   .086500   .483000  -.2767500      .500    -2.900  
+89 421 47637.00 I   .088070  .000404   .481819  .000480  I -.2782747  .0000298  1.9789 0.0235  I     -.307     .380    -2.737     .251   .088800   .483100  -.2789200      .400    -2.900  
+89 422 47638.00 I   .090333  .000398   .481716  .000490  I -.2802104  .0000375  1.8886 0.0246  I     -.262     .437    -3.226     .289   .091000   .483200  -.2809800      .400    -2.900  
+89 423 47639.00 I   .092486  .000423   .481533  .000502  I -.2820442  .0000391  1.7750 0.0272  I     -.105     .445    -3.333     .297   .093100   .483100  -.2829000      .400    -2.900  
+89 424 47640.00 I   .094494  .000437   .481236  .000498  I -.2837585  .0000393  1.6555 0.0259  I     -.029     .445    -3.419     .297   .095200   .482700  -.2844400      .400    -2.900  
+89 425 47641.00 I   .096371  .000412   .480834  .000530  I -.2853637  .0000339  1.5616 0.0224  I     -.132     .479    -3.434     .324   .097200   .482100  -.2858300      .400    -2.900  
+89 426 47642.00 I   .098163  .000289   .480347  .000502  I -.2869023  .0000217  1.5297 0.0208  I     -.305     .437    -3.219     .297   .099200   .481400  -.2871600      .400    -2.800  
+89 427 47643.00 I   .099938  .000233   .479781  .000386  I -.2884530  .0000240  1.5876 0.0161  I     -.448     .397    -2.993     .253   .101100   .480700  -.2885100      .300    -2.800  
+89 428 47644.00 I   .101770  .000233   .479145  .000443  I -.2901074  .0000239  1.7353 0.0169  I     -.460     .397    -3.073     .253   .103100   .479800  -.2899900      .100    -2.800  
+89 429 47645.00 I   .103681  .000292   .478475  .000583  I -.2919493  .0000237  1.9599 0.0158  I     -.417     .441    -3.312     .249   .104900   .479400  -.2919500     -.500    -2.700  
+89 430 47646.00 I   .105679  .000266   .477783  .000577  I -.2940401  .0000207  2.2230 0.0150  I     -.329     .441    -3.531     .249   .106900   .478800  -.2942000    -1.200    -2.600  
+89 5 1 47647.00 I   .107778  .000283   .477063  .000565  I -.2963841  .0000183  2.4525 0.0161  I     -.221     .393    -3.544     .198   .109000   .478300  -.2966900    -1.900    -2.600  
+89 5 2 47648.00 I   .110015  .000376   .476300  .000687  I -.2989080  .0000247  2.5708 0.0136  I     -.259     .347    -3.226     .193   .111300   .477700  -.2993400    -2.500    -2.600  
+89 5 3 47649.00 I   .112428  .000345   .475470  .000721  I -.3014717  .0000202  2.5272 0.0160  I     -.592     .347    -2.738     .193   .113600   .477000  -.3020200    -3.000    -2.600  
+89 5 4 47650.00 I   .115060  .000345   .474545  .000721  I -.3039073  .0000202  2.3184 0.0127  I    -1.131     .347    -2.414     .193   .116100   .476000  -.3044400    -2.900    -3.000  
+89 5 5 47651.00 I   .117874  .000304   .473559  .000677  I -.3060707  .0000154  1.9962 0.0133  I    -1.632     .347    -2.428     .193   .118800   .474900  -.3065900    -2.500    -3.300  
+89 5 6 47652.00 I   .120803  .000311   .472567  .000522  I -.3078923  .0000173  1.6520 0.0138  I    -1.911     .451    -2.665     .157   .121600   .473800  -.3084100    -2.000    -3.600  
+89 5 7 47653.00 I   .123774  .000281   .471615  .000447  I -.3093978  .0000230  1.3773 0.0144  I    -1.927     .527    -2.937     .298   .124400   .472800  -.3099400    -1.500    -3.900  
+89 5 8 47654.00 I   .126711  .000281   .470731  .000447  I -.3106890  .0000229  1.2290 0.0162  I    -1.697     .527    -3.193     .298   .127300   .471800  -.3112700    -1.100    -4.100  
+89 5 9 47655.00 I   .129543  .000300   .469925  .000431  I -.3119010  .0000227  1.2162 0.0145  I    -1.315     .527    -3.433     .298   .130200   .470900  -.3124200    -1.000    -4.100  
+89 510 47656.00 I   .132250  .000245   .469156  .000410  I -.3131560  .0000177  1.3072 0.0162  I     -.908     .527    -3.552     .298   .133100   .470000  -.3136000    -1.000    -3.900  
+89 511 47657.00 I   .134873  .000264   .468363  .000358  I -.3145339  .0000232  1.4539 0.0163  I     -.807     .392    -3.416     .112   .135900   .469100  -.3148900    -1.000    -3.800  
+89 512 47658.00 I   .137457  .000232   .467478  .000276  I -.3160676  .0000273  1.6122 0.0209  I    -1.149     .293    -3.086     .113   .138700   .468100  -.3163400    -1.100    -3.600  
+89 513 47659.00 I   .140051  .000284   .466439  .000383  I -.3177515  .0000348  1.7503 0.0232  I    -1.591     .172    -2.817     .128   .141500   .467000  -.3179100    -1.300    -3.400  
+89 514 47660.00 I   .142692  .000284   .465202  .000383  I -.3195541  .0000374  1.8463 0.0250  I    -1.730     .172    -2.761     .128   .144100   .465800  -.3197900    -1.400    -3.400  
+89 515 47661.00 I   .145352  .000367   .463771  .000501  I -.3214257  .0000359  1.8873 0.0252  I    -1.542     .172    -2.817     .128   .146600   .464600  -.3217400    -1.600    -3.400  
+89 516 47662.00 I   .147974  .000432   .462165  .000483  I -.3233090  .0000337  1.8694 0.0288  I    -1.304     .138    -2.821     .103   .149000   .463200  -.3236900    -1.800    -3.400  
+89 517 47663.00 I   .150536  .000574   .460428  .000628  I -.3251465  .0000451  1.7977 0.0290  I    -1.217     .791    -2.794     .298   .151400   .461700  -.3255900    -1.900    -3.500  
+89 518 47664.00 I   .153032  .000574   .458624  .000580  I -.3268908  .0000471  1.6854 0.0304  I    -1.289     .791    -2.880     .298   .153700   .460100  -.3274000    -1.900    -3.500  
+89 519 47665.00 I   .155458  .000576   .456813  .000554  I -.3285086  .0000409  1.5470 0.0290  I    -1.474     .791    -3.109     .298   .156000   .458200  -.3290600    -1.800    -3.600  
+89 520 47666.00 I   .157792  .000511   .455046  .000534  I -.3299836  .0000337  1.4048 0.0250  I    -1.742     .791    -3.325     .298   .158100   .456200  -.3305900    -1.500    -3.800  
+89 521 47667.00 I   .159992  .000470   .453368  .000576  I -.3313262  .0000289  1.2864 0.0219  I    -2.029     .108    -3.351     .298   .160200   .454200  -.3320200    -1.300    -3.900  
+89 522 47668.00 I   .161991  .000454   .451794  .000549  I -.3325726  .0000281  1.2167 0.0202  I    -2.271     .161    -3.175     .298   .162200   .452200  -.3333900    -1.100    -3.900  
+89 523 47669.00 I   .163797  .000454   .450258  .000549  I -.3337839  .0000281  1.2200 0.0156  I    -2.461     .197    -2.953     .298   .164100   .450300  -.3347300    -1.000    -3.900  
+89 524 47670.00 I   .165449  .000383   .448686  .000565  I -.3350409  .0000134  1.3081 0.0158  I    -2.646     .197    -2.856     .298   .166000   .449200  -.3357500    -1.000    -3.600  
+89 525 47671.00 I   .167014  .000349   .447059  .000563  I -.3364270  .0000146  1.4767 0.0104  I    -2.844     .214    -2.924     .298   .167900   .448100  -.3368900    -1.200    -3.300  
+89 526 47672.00 I   .168630  .000359   .445410  .000531  I -.3380170  .0000158  1.7133 0.0154  I    -2.892     .378    -3.049     .298   .169700   .447100  -.3382400    -1.300    -3.000  
+89 527 47673.00 I   .170353  .000383   .443761  .000436  I -.3398651  .0000272  1.9842 0.0180  I    -2.671     .454    -3.159     .298   .171500   .446000  -.3398400    -1.600    -2.600  
+89 528 47674.00 I   .172213  .000408   .442138  .000471  I -.3419779  .0000323  2.2324 0.0233  I    -2.250     .505    -3.256     .298   .173300   .444800  -.3417200    -1.900    -2.300  
+89 529 47675.00 I   .174223  .000286   .440579  .000499  I -.3443007  .0000379  2.3930 0.0220  I    -1.815     .515    -3.331     .298   .175100   .442700  -.3443400    -2.000    -2.300  
+89 530 47676.00 I   .176326  .000321   .439081  .000507  I -.3467165  .0000299  2.4113 0.0233  I    -1.617     .515    -3.317     .298   .176900   .440500  -.3470700    -2.000    -2.400  
+89 531 47677.00 I   .178441  .000313   .437618  .000468  I -.3490693  .0000271  2.2675 0.0237  I    -1.819     .415    -3.206     .387   .178800   .438300  -.3496900    -2.000    -2.500  
+89 6 1 47678.00 I   .180503  .000351   .436141  .000435  I -.3512058  .0000369  1.9867 0.0197  I    -2.379     .258    -3.079     .458   .180600   .436100  -.3520600    -1.900    -2.700  
+89 6 2 47679.00 I   .182458  .000333   .434592  .000469  I -.3530186  .0000287  1.6338 0.0325  I    -3.020     .234    -3.004     .414   .182600   .434100  -.3540600    -1.700    -2.900  
+89 6 3 47680.00 I   .184277  .000333   .432933  .000469  I -.3544779  .0000535  1.2946 0.0275  I    -3.500     .349    -2.928     .387   .184700   .432400  -.3555200    -2.500    -4.000  
+89 6 4 47681.00 I   .185968  .000360   .431184  .000428  I -.3556373  .0000469  1.0439 0.0355  I    -3.764     .349    -2.961     .421   .186700   .431000  -.3567100    -1.800    -4.200  
+89 6 5 47682.00 I   .187552  .000324   .429384  .000373  I -.3566092  .0000467  0.9238 0.0430  I    -3.751     .312    -3.207     .357   .188800   .429700  -.3577100    -1.100    -4.200  
+89 6 6 47683.00 I   .189112  .000373   .427581  .000393  I -.3575300  .0000722  0.9391 0.0424  I    -3.297     .331    -3.377     .150   .190900   .428500  -.3586700     -.400    -4.300  
+89 6 7 47684.00 I   .190740  .000373   .425782  .000393  I -.3585215  .0000709  1.0567 0.0487  I    -2.656     .341    -3.340     .117   .192900   .427200  -.3597100      .100    -4.300  
+89 6 8 47685.00 I   .192506  .000445   .423983  .000278  I -.3596579  .0000655  1.2179 0.0423  I    -2.366     .378    -3.131     .128   .195000   .425500  -.3608800     -.100    -4.100  
+89 6 9 47686.00 I   .194400  .000407   .422163  .000179  I -.3609551  .0000462  1.3724 0.0388  I    -2.653     .175    -2.815     .105   .197000   .423800  -.3621600     -.400    -3.900  
+89 610 47687.00 I   .196393  .000386   .420297  .000164  I -.3623900  .0000417  1.4889 0.0333  I    -3.246     .258    -2.562     .105   .199000   .421900  -.3635400     -.900    -3.600  
+89 611 47688.00 I   .198458  .000498   .418355  .000136  I -.3639148  .0000479  1.5512 0.0265  I    -3.702     .285    -2.517     .298   .201000   .420000  -.3649900    -1.500    -3.500  
+89 612 47689.00 I   .200570  .000498   .416317  .000136  I -.3654695  .0000326  1.5447 0.0295  I    -3.868     .307    -2.623     .298   .202900   .417900  -.3664500    -2.000    -3.300  
+89 613 47690.00 I   .202666  .000498   .414182  .000136  I -.3669805  .0000345  1.4669 0.0226  I    -3.926     .307    -2.667     .298   .204700   .415500  -.3678700    -2.500    -3.400  
+89 614 47691.00 I   .204677  .000403   .411958  .000103  I -.3683846  .0000314  1.3330 0.0189  I    -4.068     .307    -2.620     .298   .206400   .413100  -.3691700    -2.800    -3.600  
+89 615 47692.00 I   .206570  .000362   .409656  .000106  I -.3696329  .0000155  1.1583 0.0213  I    -4.307     .273    -2.620     .298   .208100   .410600  -.3703100    -3.200    -3.800  
+89 616 47693.00 I   .208381  .000459   .407288  .000128  I -.3706947  .0000288  0.9642 0.0162  I    -4.571     .114    -2.736     .298   .209700   .408000  -.3712700    -3.500    -4.000  
+89 617 47694.00 I   .210155  .000118   .404868  .000141  I -.3715637  .0000284  0.7772 0.0200  I    -4.813     .114    -2.873     .298   .211400   .405400  -.3720900    -3.800    -4.200  
+89 618 47695.00 I   .211929  .000143   .402408  .000148  I -.3722632  .0000277  0.6324 0.0188  I    -5.008     .114    -2.898     .298   .213100   .402800  -.3727600    -3.700    -4.100  
+89 619 47696.00 I   .213726  .000456   .399916  .000171  I -.3728549  .0000247  0.5667 0.0179  I    -5.133     .114    -2.772     .298   .214900   .400300  -.3733200    -3.700    -3.900  
+89 620 47697.00 I   .215569  .000600   .397397  .000233  I -.3734306  .0000228  0.6031 0.0201  I    -5.205     .269    -2.578     .129   .216700   .397700  -.3738500    -3.600    -3.800  
+89 621 47698.00 I   .217478  .000753   .394856  .000281  I -.3740968  .0000318  0.7465 0.0168  I    -5.312     .356    -2.425     .143   .218500   .395100  -.3744500    -3.600    -3.600  
+89 622 47699.00 I   .219460  .000753   .392288  .000281  I -.3749524  .0000247  0.9764 0.0251  I    -5.569     .356    -2.370     .143   .220400   .392400  -.3752200    -3.600    -3.500  
+89 623 47700.00 I   .221490  .000753   .389688  .000281  I -.3760604  .0000388  1.2388 0.0222  I    -6.026     .356    -2.393     .143   .222400   .389800  -.3764300    -4.000    -3.400  
+89 624 47701.00 I   .223484  .000684   .387050  .000248  I -.3774185  .0000368  1.4667 0.0255  I    -6.518     .356    -2.412     .143   .224500   .387200  -.3778900    -4.500    -3.400  
+89 625 47702.00 I   .225443  .000744   .384378  .000359  I -.3789637  .0000332  1.6044 0.0270  I    -6.923     .334    -2.389     .122   .226600   .384600  -.3795300    -5.000    -3.400  
+89 626 47703.00 I   .227389  .000758   .381680  .000374  I -.3805834  .0000395  1.6106 0.0280  I    -7.211     .275    -2.343     .298   .228800   .382000  -.3812500    -5.300    -3.500  
+89 627 47704.00 I   .229349  .000672   .378961  .000378  I -.3821356  .0000451  1.4690 0.0299  I    -7.374     .250    -2.319     .298   .230900   .379300  -.3829100    -5.500    -3.600  
+89 628 47705.00 I   .231358  .000672   .376225  .000378  I -.3834821  .0000450  1.2095 0.0254  I    -7.405     .250    -2.351     .298   .232900   .376700  -.3841500    -5.100    -3.700  
+89 629 47706.00 I   .233388  .000685   .373459  .000363  I -.3845358  .0000232  0.8936 0.0262  I    -7.320     .250    -2.350     .298   .234800   .374000  -.3851100    -4.500    -3.900  
+89 630 47707.00 I   .235346  .000718   .370661  .000387  I -.3852727  .0000267  0.5881 0.0177  I    -7.167     .751    -2.340     .134   .236600   .371300  -.3857600    -3.800    -4.100  
+89 7 1 47708.00 I   .237174  .000830   .367822  .000449  I -.3857380  .0000268  0.3607 0.0193  I    -7.011     .852    -2.417     .150   .238400   .368600  -.3861700    -3.000    -4.300  
+89 7 2 47709.00 I   .238840  .000729   .364929  .000326  I -.3860344  .0000280  0.2541 0.0184  I    -6.922     .979    -2.596     .156   .240100   .365800  -.3864300    -2.300    -4.400  
+89 7 3 47710.00 I   .240365  .000633   .361986  .000367  I -.3862903  .0000253  0.2798 0.0185  I    -6.962     .979    -2.833     .156   .241800   .363000  -.3867200    -2.100    -3.700  
+89 7 4 47711.00 I   .241816  .000575   .359017  .000380  I -.3866311  .0000241  0.4167 0.0200  I    -6.994     .853    -2.920     .138   .243400   .359800  -.3870900    -1.800    -3.400  
+89 7 5 47712.00 I   .243232  .000679   .356043  .000464  I -.3871441  .0000309  0.6148 0.0208  I    -7.040     .743    -2.777     .343   .244900   .356500  -.3876300    -1.800    -3.100  
+89 7 6 47713.00 I   .244637  .000700   .353083  .000473  I -.3878642  .0000339  0.8233 0.0197  I    -7.290     .456    -2.500     .364   .246400   .353200  -.3883600    -1.900    -2.900  
+89 7 7 47714.00 I   .246029  .000508   .350152  .000338  I -.3887809  .0000244  1.0023 0.0208  I    -7.804     .433    -2.239     .368   .247800   .350000  -.3892600    -2.200    -2.700  
+89 7 8 47715.00 I   .247390  .000508   .347247  .000338  I -.3898499  .0000242  1.1244 0.0173  I    -8.394     .403    -2.153     .348   .249100   .347000  -.3903000    -3.200    -2.700  
+89 7 9 47716.00 I   .248711  .000480   .344346  .000349  I -.3910046  .0000244  1.1710 0.0180  I    -8.816     .403    -2.192     .348   .250400   .344100  -.3914000    -4.400    -2.800  
+89 710 47717.00 I   .249981  .000556   .341423  .000323  I -.3921652  .0000266  1.1376 0.0190  I    -8.905     .571    -2.159     .321   .251500   .341300  -.3925200    -5.600    -3.000  
+89 711 47718.00 I   .251214  .000534   .338475  .000257  I -.3932617  .0000291  1.0500 0.0200  I    -8.809     .573    -2.140     .116   .252600   .338500  -.3935800    -6.900    -3.100  
+89 712 47719.00 I   .252378  .000535   .335505  .000237  I -.3942564  .0000300  0.9361 0.0225  I    -8.886     .631    -2.266     .165   .253600   .335700  -.3945600    -8.000    -3.200  
+89 713 47720.00 I   .253441  .000629   .332538  .000350  I -.3951311  .0000342  0.8138 0.0340  I    -9.428     .620    -2.596     .169   .254500   .333000  -.3954500    -8.400    -3.000  
+89 714 47721.00 I   .254448  .000803   .329617  .000442  I -.3958903  .0000611  0.7105 0.0343  I   -10.190     .753    -2.930     .224   .255400   .330200  -.3962100    -8.600    -2.900  
+89 715 47722.00 I   .255471  .000864   .326783  .000453  I -.3965658  .0000594  0.6484 0.0396  I   -10.698     .737    -2.919     .317   .256100   .327500  -.3968500    -8.700    -2.700  
+89 716 47723.00 I   .256523  .000804   .324049  .000491  I -.3972030  .0000504  0.6342 0.0392  I   -10.795     .683    -2.614     .377   .256900   .324700  -.3975300    -8.800    -2.500  
+89 717 47724.00 I   .257510  .000798   .321393  .000499  I -.3978523  .0000511  0.6745 0.0356  I   -10.463     .625    -2.132     .364   .257500   .322000  -.3980000    -8.900    -2.300  
+89 718 47725.00 I   .258280  .000782   .318751  .000522  I -.3985792  .0000502  0.7964 0.0344  I   -10.059     .627    -2.055     .378   .258000   .319100  -.3986800    -9.200    -2.100  
+89 719 47726.00 I   .258834  .000604   .316059  .000495  I -.3994760  .0000460  1.0108 0.0293  I    -9.743     .691    -2.295     .409   .258500   .316200  -.3995800    -9.600    -2.000  
+89 720 47727.00 I   .259242  .000486   .313273  .000520  I -.4006205  .0000303  1.2842 0.0349  I    -9.567     .498    -2.371     .342   .258900   .313200  -.4007400   -10.000    -1.900  
+89 721 47728.00 I   .259520  .000908   .310377  .000880  I -.4020440  .0000525  1.5564 0.0353  I    -9.661     .293    -2.255     .219   .259300   .310100  -.4022100   -10.300    -1.900  
+89 722 47729.00 I   .259677  .000894   .307373  .000812  I -.4037092  .0000637  1.7563 0.0489  I   -10.131     .282    -2.180     .200   .259700   .307100  -.4039200   -10.600    -1.900  
+89 723 47730.00 I   .259721  .001211   .304260  .000887  I -.4055103  .0000825  1.8174 0.0466  I   -10.909     .393    -2.338     .217   .260100   .304000  -.4057500   -10.800    -2.000  
+89 724 47731.00 I   .259656  .000970   .301045  .000750  I -.4072883  .0000681  1.7115 0.0525  I   -11.646     .377    -2.566     .271   .260500   .300900  -.4075500   -10.900    -2.200  
+89 725 47732.00 I   .259516  .000946   .297755  .000746  I -.4088916  .0000651  1.4806 0.0491  I   -11.967     .366    -2.561     .236   .260800   .297800  -.4092000   -11.000    -2.400  
+89 726 47733.00 I   .259411  .001136   .294397  .000786  I -.4102297  .0000707  1.1904 0.0446  I   -11.822     .385    -2.305     .239   .261100   .294700  -.4105700   -10.900    -2.700  
+89 727 47734.00 I   .259400  .000986   .290980  .000721  I -.4112703  .0000611  0.8938 0.0445  I   -11.589     .385    -2.280     .239   .261200   .291500  -.4116300   -10.600    -2.900  
+89 728 47735.00 I   .259475  .000723   .287550  .000526  I -.4120367  .0000542  0.6553 0.0393  I   -11.568     .388    -2.484     .237   .261100   .288400  -.4122900    -9.900    -3.000  
+89 729 47736.00 I   .259578  .000669   .284153  .000535  I -.4126159  .0000494  0.5217 0.0352  I   -11.665     .354    -2.690     .219   .260900   .285300  -.4127600    -9.100    -3.100  
+89 730 47737.00 I   .259598  .000484   .280826  .000480  I -.4131170  .0000450  0.4987 0.0344  I   -11.771     .511    -2.791     .186   .260600   .282100  -.4131300    -8.200    -3.200  
+89 731 47738.00 I   .259486  .000634   .277618  .000540  I -.4136479  .0000480  0.5794 0.0323  I   -11.868     .698    -2.721     .190   .260300   .279000  -.4135600    -7.400    -3.200  
+89 8 1 47739.00 I   .259283  .000634   .274517  .000420  I -.4142997  .0000463  0.7317 0.0332  I   -11.954     .669    -2.494     .214   .259900   .275800  -.4141200    -6.700    -3.200  
+89 8 2 47740.00 I   .259062  .000597   .271488  .000399  I -.4151187  .0000459  0.9060 0.0260  I   -12.066     .676    -2.239     .205   .259600   .272500  -.4149900    -7.500    -3.000  
+89 8 3 47741.00 I   .258932  .000620   .268482  .000316  I -.4161049  .0000237  1.0598 0.0310  I   -12.031     .841    -2.043     .205   .259400   .269200  -.4160500    -7.300    -2.900  
+89 8 4 47742.00 I   .258981  .000616   .265471  .000322  I -.4172229  .0000416  1.1673 0.0267  I   -11.897     .748    -1.859     .207   .259300   .266000  -.4172400    -7.300    -2.800  
+89 8 5 47743.00 I   .259177  .000731   .262452  .000384  I -.4184194  .0000478  1.2146 0.0319  I   -11.788     .744    -1.900     .188   .259200   .262800  -.4185100    -7.500    -2.700  
+89 8 6 47744.00 I   .259382  .000731   .259419  .000385  I -.4196321  .0000485  1.2021 0.0362  I   -11.989     .629    -2.102     .241   .259200   .259600  -.4197900    -7.800    -2.600  
+89 8 7 47745.00 I   .259502  .000828   .256372  .000395  I -.4208062  .0000544  1.1375 0.0354  I   -12.279     .657    -2.116     .247   .259300   .256400  -.4210000    -8.900    -2.900  
+89 8 8 47746.00 I   .259528  .000722   .253308  .000518  I -.4218918  .0000515  1.0269 0.0373  I   -12.396     .670    -2.014     .240   .259400   .253200  -.4220600   -10.100    -3.100  
+89 8 9 47747.00 I   .259514  .000757   .250247  .000530  I -.4228527  .0000511  0.8944 0.0341  I   -12.372     .605    -2.120     .206   .259400   .250000  -.4229700   -11.300    -3.400  
+89 810 47748.00 I   .259562  .000817   .247205  .000590  I -.4236824  .0000446  0.7671 0.0338  I   -12.374     .669    -2.245     .203   .259500   .246800  -.4237400   -12.500    -3.600  
+89 811 47749.00 I   .259708  .000849   .244204  .000586  I -.4243916  .0000444  0.6537 0.0316  I   -12.301     .669    -2.371     .203   .259500   .243700  -.4243800   -13.400    -3.800  
+89 812 47750.00 I   .259841  .000805   .241279  .000562  I -.4250039  .0000449  0.5826 0.0295  I   -12.112     .730    -2.497     .135   .259400   .240800  -.4250300   -13.400    -3.500  
+89 813 47751.00 I   .259861  .000719   .238419  .000647  I -.4255850  .0000389  0.5960 0.0259  I   -11.765     .778    -2.541     .298   .259300   .237900  -.4256300   -13.100    -3.200  
+89 814 47752.00 I   .259701  .000415   .235585  .000673  I -.4262314  .0000259  0.7159 0.0272  I   -11.373     .641    -2.544     .227   .259000   .235100  -.4263200   -12.700    -2.800  
+89 815 47753.00 I   .259331  .000494   .232721  .000665  I -.4270534  .0000381  0.9455 0.0218  I   -11.104     .357    -2.612     .348   .258700   .232200  -.4271700   -12.200    -2.500  
+89 816 47754.00 I   .258722  .000486   .229769  .000628  I -.4281495  .0000351  1.2563 0.0259  I   -11.035     .295    -2.702     .294   .258400   .229400  -.4283300   -11.500    -2.200  
+89 817 47755.00 I   .257874  .000486   .226673  .000628  I -.4295740  .0000351  1.5911 0.0245  I   -11.202     .295    -2.649     .294   .257800   .226300  -.4297400   -11.900    -2.100  
+89 818 47756.00 I   .256866  .000490   .223437  .000609  I -.4313153  .0000343  1.8766 0.0252  I   -11.658     .295    -2.397     .294   .257200   .223000  -.4314600   -12.300    -2.100  
+89 819 47757.00 I   .255786  .000452   .220100  .000549  I -.4332828  .0000361  2.0288 0.0319  I   -12.438     .470    -2.064     .245   .256500   .219700  -.4333800   -12.900    -2.100  
+89 820 47758.00 I   .254697  .000638   .216697  .000322  I -.4353113  .0000539  1.9962 0.0327  I   -13.390     .534    -1.855     .130   .255700   .216300  -.4353500   -13.400    -2.200  
+89 821 47759.00 I   .253687  .000638   .213255  .000322  I -.4372182  .0000545  1.7926 0.0320  I   -14.183     .803    -1.884     .150   .255000   .213000  -.4372000   -13.900    -2.300  
+89 822 47760.00 I   .252831  .000521   .209803  .000354  I -.4388607  .0000345  1.4816 0.0301  I   -14.540     .923    -2.158     .168   .254100   .209600  -.4389300   -14.000    -2.400  
+89 823 47761.00 I   .252154  .000387   .206380  .000337  I -.4401749  .0000255  1.1511 0.0200  I   -14.651    1.210    -2.453     .148   .253200   .206300  -.4403400   -14.000    -2.600  
+89 824 47762.00 I   .251620  .000324   .203035  .000545  I -.4411822  .0000201  0.8783 0.0146  I   -14.908    1.186    -2.502     .145   .252400   .203000  -.4414600   -13.900    -2.700  
+89 825 47763.00 I   .251154  .000291   .199820  .000563  I -.4419658  .0000141  0.7083 0.0124  I   -15.105    1.383    -2.373     .141   .251500   .199900  -.4423900   -13.700    -2.800  
+89 826 47764.00 I   .250680  .000298   .196789  .000599  I -.4426360  .0000144  0.6499 0.0099  I   -14.867    1.383    -2.227     .141   .250600   .196800  -.4431800   -13.400    -2.800  
+89 827 47765.00 I   .250131  .000245   .193995  .000550  I -.4433011  .0000138  0.6978 0.0098  I   -14.528    1.401    -2.188     .116   .250000   .193900  -.4436700   -12.800    -2.600  
+89 828 47766.00 I   .249428  .000225   .191364  .000552  I -.4440612  .0000133  0.8344 0.0114  I   -14.207    1.221    -2.234     .103   .249300   .191100  -.4442400   -12.100    -2.300  
+89 829 47767.00 I   .248493  .000286   .188770  .000646  I -.4449861  .0000181  1.0198 0.0146  I   -13.819     .848    -2.244     .211   .248500   .188300  -.4449600   -11.500    -2.000  
+89 830 47768.00 I   .247289  .000392   .186106  .000636  I -.4461029  .0000259  1.2117 0.0165  I   -13.393     .548    -2.093     .234   .247600   .185500  -.4458700   -11.000    -1.600  
+89 831 47769.00 I   .245810  .000498   .183287  .000599  I -.4473984  .0000277  1.3703 0.0191  I   -12.986     .548    -1.746     .234   .246500   .182700  -.4469500   -10.600    -1.300  
+89 9 1 47770.00 I   .244066  .000452   .180279  .000594  I -.4488220  .0000281  1.4642 0.0214  I   -12.682     .548    -1.276     .234   .245000   .179700  -.4486000   -11.100    -1.300  
+89 9 2 47771.00 I   .242130  .000406   .177130  .000535  I -.4502998  .0000326  1.4770 0.0194  I   -12.674     .548    -1.056     .234   .243300   .176800  -.4503200   -11.700    -1.300  
+89 9 3 47772.00 I   .240098  .000386   .173910  .000496  I -.4517486  .0000268  1.4078 0.0217  I   -12.995     .844    -1.235     .264   .241400   .173700  -.4520100   -12.500    -1.300  
+89 9 4 47773.00 I   .238027  .000377   .170686  .000460  I -.4530928  .0000287  1.2710 0.0196  I   -13.447     .935    -1.600     .237   .239400   .170700  -.4536000   -13.200    -1.400  
+89 9 5 47774.00 I   .235922  .000394   .167512  .000460  I -.4542755  .0000286  1.0890 0.0204  I   -13.798    1.091    -1.912     .262   .237200   .167600  -.4550100   -14.000    -1.600  
+89 9 6 47775.00 I   .233773  .000351   .164445  .000454  I -.4552687  .0000289  0.9007 0.0193  I   -13.998     .905    -2.114     .221   .234900   .164200  -.4556800   -15.200    -2.200  
+89 9 7 47776.00 I   .231549  .000317   .161528  .000413  I -.4560882  .0000259  0.7462 0.0183  I   -14.180     .905    -2.328     .221   .232600   .161100  -.4563700   -15.200    -2.400  
+89 9 8 47777.00 I   .229223  .000308   .158754  .000324  I -.4567806  .0000223  0.6502 0.0185  I   -14.405     .796    -2.593     .269   .230100   .158100  -.4569300   -15.000    -2.600  
+89 9 9 47778.00 I   .226787  .000375   .156103  .000387  I -.4574131  .0000264  0.6277 0.0173  I   -14.475     .589    -2.758     .248   .227600   .155200  -.4574300   -14.700    -2.800  
+89 910 47779.00 I   .224295  .000366   .153554  .000153  I -.4580653  .0000264  0.6930 0.0192  I   -14.179     .589    -2.633     .248   .225000   .152400  -.4579600   -14.200    -2.900  
+89 911 47780.00 I   .221831  .000366   .151091  .000153  I -.4588307  .0000279  0.8530 0.0191  I   -13.567     .589    -2.263     .248   .222500   .149900  -.4587600   -13.600    -2.700  
+89 912 47781.00 I   .219415  .000387   .148691  .000149  I -.4598036  .0000277  1.1098 0.0200  I   -13.092     .668    -2.005     .282   .220000   .147500  -.4597900   -12.900    -2.500  
+89 913 47782.00 I   .217025  .000383   .146348  .000175  I -.4610755  .0000288  1.4420 0.0201  I   -12.949     .553    -1.963     .247   .217400   .145200  -.4611000   -12.200    -2.300  
+89 914 47783.00 I   .214648  .000358   .144057  .000175  I -.4626902  .0000291  1.7819 0.0242  I   -13.034     .519    -1.931     .171   .214900   .142900  -.4627700   -11.500    -2.100  
+89 915 47784.00 I   .212275  .000396   .141805  .000200  I -.4646152  .0000390  2.0496 0.0254  I   -13.265     .378    -1.787     .162   .212400   .140700  -.4647300   -11.000    -2.000  
+89 916 47785.00 I   .209901  .000396   .139576  .000356  I -.4667389  .0000416  2.1657 0.0260  I   -13.568     .393    -1.646     .142   .210100   .138600  -.4669400   -11.000    -2.200  
+89 917 47786.00 I   .207490  .000373   .137349  .000325  I -.4688831  .0000345  2.0914 0.0253  I   -13.888     .393    -1.689     .142   .207900   .136500  -.4691500   -11.200    -2.400  
+89 918 47787.00 I   .205003  .000316   .135107  .000362  I -.4708694  .0000287  1.8601 0.0216  I   -14.181     .355    -1.879     .136   .205500   .134400  -.4711900   -11.400    -2.700  
+89 919 47788.00 I   .202444  .000251   .132834  .000371  I -.4725772  .0000261  1.5504 0.0187  I   -14.344     .355    -1.963     .124   .203100   .132300  -.4729500   -11.600    -2.900  
+89 920 47789.00 I   .199818  .000251   .130546  .000371  I -.4739759  .0000239  1.2579 0.0191  I   -14.445     .355    -1.837     .124   .200600   .130100  -.4744000   -11.800    -3.200  
+89 921 47790.00 I   .197123  .000319   .128280  .000439  I -.4751244  .0000278  1.0597 0.0284  I   -14.505     .316    -1.616     .134   .197800   .127600  -.4754200   -11.800    -3.200  
+89 922 47791.00 I   .194319  .000297   .126036  .000344  I -.4761386  .0000516  0.9913 0.0251  I   -14.337     .265    -1.591     .152   .194800   .125000  -.4763200   -11.700    -3.200  
+89 923 47792.00 I   .191399  .000266   .123797  .000303  I -.4771475  .0000419  1.0444 0.0353  I   -13.938     .220    -1.739     .120   .191800   .122400  -.4772200   -11.500    -3.100  
+89 924 47793.00 I   .188364  .000246   .121549  .000236  I -.4782554  .0000482  1.1815 0.0320  I   -13.522     .182    -1.829     .117   .188700   .119800  -.4782300   -11.400    -3.000  
+89 925 47794.00 I   .185238  .000284   .119268  .000272  I -.4795257  .0000484  1.3642 0.0348  I   -13.256     .707    -1.784     .118   .185500   .117200  -.4794200   -11.300    -2.800  
+89 926 47795.00 I   .182078  .000284   .116925  .000272  I -.4809871  .0000502  1.5569 0.0329  I   -13.175    1.094    -1.648     .156   .182400   .115100  -.4809700   -11.400    -2.500  
+89 927 47796.00 I   .178927  .000390   .114535  .000361  I -.4826303  .0000446  1.7222 0.0270  I   -13.275    1.094    -1.498     .156   .179300   .113000  -.4827000   -11.500    -2.100  
+89 928 47797.00 I   .175801  .000368   .112143  .000429  I -.4844125  .0000201  1.8305 0.0259  I   -13.537     .945    -1.356     .185   .176100   .111000  -.4845500   -11.600    -1.800  
+89 929 47798.00 I   .172692  .000468   .109843  .000496  I -.4862662  .0000263  1.8634 0.0166  I   -13.477    1.159    -1.040     .228   .172900   .109100  -.4864500   -11.800    -1.500  
+89 930 47799.00 I   .169578  .000468   .107752  .000496  I -.4881118  .0000263  1.8137 0.0197  I   -13.140    1.159     -.722     .228   .169700   .107400  -.4883400   -11.900    -1.400  
+8910 1 47800.00 I   .166400  .000509   .105964  .000653  I -.4898709  .0000293  1.6959 0.0161  I   -12.924    1.135     -.700     .234   .166600   .105800  -.4901000   -12.000    -1.500  
+8910 2 47801.00 I   .163140  .000422   .104437  .000609  I -.4914920  .0000185  1.5432 0.0162  I   -12.882     .550     -.934     .228   .163500   .104400  -.4917400   -12.000    -1.700  
+8910 3 47802.00 I   .159817  .000270   .103076  .000633  I -.4929552  .0000137  1.3843 0.0128  I   -12.851     .708    -1.204     .213   .160300   .103000  -.4932500   -12.000    -2.000  
+8910 4 47803.00 I   .156445  .000252   .101784  .000556  I -.4942671  .0000178  1.2450 0.0139  I   -12.770     .899    -1.428     .236   .157100   .101700  -.4946200   -12.000    -2.300  
+8910 5 47804.00 I   .153030  .000252   .100460  .000556  I -.4954603  .0000241  1.1512 0.0132  I   -12.802     .899    -1.725     .236   .153800   .100400  -.4958600   -11.900    -2.600  
+8910 6 47805.00 I   .149568  .000402   .099020  .000503  I -.4965907  .0000195  1.1212 0.0160  I   -13.131     .899    -2.168     .236   .150400   .099000  -.4968500   -11.200    -2.500  
+8910 7 47806.00 I   .146082  .000354   .097493  .000528  I -.4977285  .0000210  1.1686 0.0135  I   -13.389     .792    -2.349     .220   .146900   .097700  -.4978400   -10.800    -2.500  
+8910 8 47807.00 I   .142608  .000362   .095962  .000444  I -.4989574  .0000186  1.3043 0.0151  I   -13.249     .652    -2.073     .181   .143300   .096400  -.4988900   -10.500    -2.400  
+8910 9 47808.00 I   .139183  .000446   .094510  .000395  I -.5003659  .0000216  1.5263 0.0136  I   -12.736     .686    -1.633     .163   .139600   .095100  -.5001200   -10.200    -2.400  
+891010 47809.00 I   .135807  .000444   .093205  .000369  I -.5020325  .0000198  1.8157 0.0136  I   -12.048     .518    -1.419     .221   .135800   .093800  -.5016400   -10.000    -2.300  
+891011 47810.00 I   .132325  .000444   .092049  .000369  I -.5040085  .0000164  2.1387 0.0129  I   -11.547     .488    -1.452     .214   .131900   .092500  -.5037300   -10.200    -2.200  
+891012 47811.00 I   .128573  .000497   .090993  .000385  I -.5062987  .0000164  2.4280 0.0149  I   -11.609     .488    -1.575     .214   .127900   .091200  -.5062100   -10.400    -2.200  
+891013 47812.00 I   .124506  .000547   .089968  .000309  I -.5088255  .0000250  2.6002 0.0158  I   -12.103     .532    -1.596     .195   .123800   .090000  -.5089400   -10.700    -2.100  
+891014 47813.00 I   .120219  .000588   .088938  .000320  I -.5114430  .0000271  2.6042 0.0170  I   -12.606     .566    -1.465     .211   .119600   .088700  -.5117600   -11.000    -2.100  
+891015 47814.00 I   .115844  .000507   .087877  .000279  I -.5139777  .0000231  2.4397 0.0174  I   -12.726     .382    -1.359     .208   .115400   .087500  -.5145000   -11.200    -2.000  
+891016 47815.00 I   .111554  .000468   .086777  .000314  I -.5162918  .0000217  2.1835 0.0164  I   -12.292     .384    -1.330     .298   .111300   .086400  -.5167800   -10.800    -2.000  
+891017 47816.00 I   .107593  .000476   .085697  .000346  I -.5183447  .0000232  1.9273 0.0158  I   -11.657     .390    -1.269     .298   .107300   .085300  -.5187500   -10.400    -2.000  
+891018 47817.00 I   .103907  .000457   .084674  .000484  I -.5201702  .0000229  1.7425 0.0149  I   -11.310     .359    -1.163     .105   .103300   .084300  -.5204900   -10.000    -2.000  
+891019 47818.00 I   .100289  .000445   .083678  .000499  I -.5218716  .0000188  1.6835 0.0143  I   -11.338     .244    -1.147     .110   .099300   .083200  -.5220800    -9.700    -2.000  
+891020 47819.00 I   .096530  .000279   .082687  .000513  I -.5235770  .0000170  1.7439 0.0153  I   -11.348     .268    -1.336     .115   .095500   .082100  -.5236700    -9.500    -1.900  
+891021 47820.00 I   .092643  .000369   .081623  .000515  I -.5253861  .0000241  1.8844 0.0145  I   -11.157     .284    -1.486     .116   .091800   .081100  -.5255000    -9.900    -1.700  
+891022 47821.00 I   .088758  .000374   .080515  .000566  I -.5273585  .0000235  2.0628 0.0168  I   -10.927     .238    -1.355     .125   .088200   .080000  -.5275000   -10.400    -1.500  
+891023 47822.00 I   .084999  .000329   .079469  .000494  I -.5295096  .0000234  2.2347 0.0170  I   -10.805     .206    -1.037     .181   .084600   .079100  -.5296700   -11.000    -1.300  
+891024 47823.00 I   .081461  .000323   .078569  .000341  I -.5318132  .0000245  2.3625 0.0158  I   -10.745     .225     -.752     .177   .081100   .078200  -.5319700   -11.600    -1.100  
+891025 47824.00 I   .078112  .000322   .077817  .000292  I -.5342076  .0000211  2.4094 0.0152  I   -10.569     .255     -.451     .166   .077600   .077400  -.5343600   -12.100     -.900  
+891026 47825.00 I   .074806  .000300   .077207  .000274  I -.5366070  .0000179  2.3813 0.0140  I   -10.252     .232     -.166     .164   .074300   .076900  -.5368100   -12.300     -.900  
+891027 47826.00 I   .071438  .000306   .076761  .000328  I -.5389626  .0000183  2.3303 0.0112  I   -10.005     .234      .038     .163   .071000   .076500  -.5392300   -12.400    -1.000  
+891028 47827.00 I   .068006  .000271   .076490  .000386  I -.5412601  .0000133  2.2569 0.0106  I    -9.895     .464      .103     .155   .067700   .076300  -.5415600   -12.300    -1.000  
+891029 47828.00 I   .064380  .000308   .076301  .000407  I -.5434609  .0000108  2.1370 0.0089  I    -9.975     .578     -.046     .273   .064400   .076100  -.5437800   -12.200    -1.100  
+891030 47829.00 I   .060604  .000303   .076052  .000429  I -.5455241  .0000118  1.9871 0.0088  I   -10.292     .563     -.433     .278   .061100   .076000  -.5458500   -12.000    -1.200  
+891031 47830.00 I   .056867  .000350   .075662  .000435  I -.5474344  .0000140  1.8353 0.0098  I   -10.684     .592     -.863     .288   .057500   .075700  -.5476900   -11.600    -1.200  
+8911 1 47831.00 I   .053306  .000363   .075251  .000472  I -.5492010  .0000157  1.7025 0.0110  I   -10.804     .632    -1.026     .305   .053800   .075500  -.5493800   -11.100    -1.200  
+8911 2 47832.00 I   .049948  .000386   .074957  .000480  I -.5508516  .0000171  1.6062 0.0128  I   -10.512     .743     -.958     .291   .050100   .075200  -.5510000   -10.600    -1.200  
+8911 3 47833.00 I   .046609  .000392   .074778  .000318  I -.5524322  .0000202  1.5664 0.0146  I    -9.907     .720     -.740     .337   .046300   .074900  -.5525700    -9.900    -1.200  
+8911 4 47834.00 I   .043062  .000444   .074689  .000334  I -.5540111  .0000237  1.6066 0.0194  I    -9.335     .658     -.504     .160   .042500   .074600  -.5541900    -9.300    -1.200  
+8911 5 47835.00 I   .039172  .000518   .074657  .000191  I -.5556779  .0000332  1.7444 0.0195  I    -9.139     .676     -.445     .164   .039800   .074600  -.5558600    -8.700    -1.300  
+8911 6 47836.00 I   .034976  .000518   .074651  .000167  I -.5575302  .0000310  1.9733 0.0213  I    -9.190     .625     -.484     .182   .035900   .074300  -.5577500    -8.100    -1.300  
+8911 7 47837.00 I   .030594  .000393   .074651  .000184  I -.5596418  .0000268  2.2541 0.0231  I    -9.193     .687     -.478     .185   .031900   .074100  -.5599000    -7.400    -1.200  
+8911 8 47838.00 I   .026170  .000454   .074658  .000210  I -.5620377  .0000342  2.5326 0.0217  I    -9.015     .559     -.393     .180   .027900   .074000  -.5623200    -7.000    -1.100  
+8911 9 47839.00 I   .021873  .000578   .074685  .000208  I -.5646849  .0000342  2.7446 0.0254  I    -8.806     .559     -.334     .180   .023800   .074000  -.5649700    -6.500    -2.000  
+891110 47840.00 I   .017774  .000609   .074750  .000182  I -.5674802  .0000376  2.8164 0.0235  I    -8.863     .592     -.142     .189   .019800   .074100  -.5676900    -6.100    -2.100  
+891111 47841.00 I   .013797  .000633   .074867  .000178  I -.5702598  .0000323  2.7145 0.0225  I    -8.961     .723      .032     .220   .015700   .074400  -.5703800    -5.600    -2.200  
+891112 47842.00 I   .009853  .000591   .075052  .000151  I -.5728625  .0000248  2.4723 0.0212  I    -8.674     .758     -.059     .190   .011800   .074600  -.5728800    -5.200    -2.300  
+891113 47843.00 I   .005935  .000679   .075329  .000172  I -.5751842  .0000275  2.1693 0.0181  I    -7.872     .736     -.305     .189   .007900   .075000  -.5751000    -4.700    -2.200  
+891114 47844.00 I   .002118  .000716   .075723  .000189  I -.5772119  .0000265  1.8987 0.0178  I    -7.039     .773     -.195     .205   .004000   .075500  -.5770200    -4.300    -2.100  
+891115 47845.00 I  -.001536  .000698   .076257  .000225  I -.5790178  .0000227  1.7369 0.0166  I    -6.495     .833      .191     .200   .000400   .076000  -.5789500    -4.300    -1.900  
+891116 47846.00 I  -.005052  .000581   .076920  .000233  I -.5807332  .0000201  1.7178 0.0135  I    -6.337     .845      .431     .226  -.003100   .076600  -.5807900    -4.300    -1.700  
+891117 47847.00 I  -.008515  .000551   .077690  .000217  I -.5824945  .0000148  1.8219 0.0124  I    -6.434     .799      .300     .194  -.006600   .077300  -.5826900    -4.300    -1.600  
+891118 47848.00 I  -.011982  .000491   .078552  .000268  I -.5844024  .0000145  2.0021 0.0103  I    -6.643     .824     -.055     .197  -.010200   .078100  -.5847500    -4.400    -1.400  
+891119 47849.00 I  -.015443  .000478   .079520  .000323  I -.5865052  .0000144  2.2017 0.0103  I    -6.754     .824     -.067     .197  -.013700   .079000  -.5870000    -4.400    -1.300  
+891120 47850.00 I  -.018894  .000546   .080613  .000361  I -.5887973  .0000145  2.3757 0.0105  I    -6.776     .755      .284     .194  -.017400   .080300  -.5891500    -4.600    -1.200  
+891121 47851.00 I  -.022304  .000489   .081830  .000332  I -.5912393  .0000153  2.4979 0.0104  I    -6.885     .669      .718     .198  -.021200   .081600  -.5914300    -4.900    -1.100  
+891122 47852.00 I  -.025738  .000438   .083181  .000273  I -.5937721  .0000148  2.5570 0.0123  I    -6.957     .560      .939     .169  -.025100   .083100  -.5938300    -5.100    -1.000  
+891123 47853.00 I  -.029284  .000501   .084672  .000215  I -.5963324  .0000192  2.5534 0.0120  I    -6.907     .357      .842     .163  -.028900   .084500  -.5962600    -5.300    -1.000  
+891124 47854.00 I  -.032975  .000393   .086275  .000230  I -.5988612  .0000189  2.4967 0.0136  I    -6.854     .117      .687     .164  -.032900   .086100  -.5986900    -5.400    -1.100  
+891125 47855.00 I  -.036766  .000393   .087923  .000230  I -.6013089  .0000192  2.3894 0.0140  I    -6.879     .117      .709     .164  -.036700   .087500  -.6012100    -5.400    -1.200  
+891126 47856.00 I  -.040644  .000344   .089531  .000183  I -.6036224  .0000206  2.2295 0.0129  I    -6.941     .125      .758     .161  -.040400   .088800  -.6036100    -5.400    -1.300  
+891127 47857.00 I  -.044621  .000327   .091021  .000211  I -.6057624  .0000171  2.0531 0.0149  I    -6.964     .135      .658     .127  -.044100   .090200  -.6058300    -5.400    -1.400  
+891128 47858.00 I  -.048622  .000347   .092360  .000242  I -.6077381  .0000215  1.9050 0.0139  I    -6.926     .152      .529     .298  -.047700   .091400  -.6078900    -5.200    -1.600  
+891129 47859.00 I  -.052504  .000357   .093533  .000237  I -.6095892  .0000219  1.8071 0.0171  I    -6.771     .152      .530     .298  -.051200   .092700  -.6098000    -5.000    -1.600  
+891130 47860.00 I  -.056142  .000428   .094538  .000440  I -.6113724  .0000266  1.7693 0.0173  I    -6.457     .149      .638     .298  -.054600   .093900  -.6115700    -4.600    -1.600  
+8912 1 47861.00 I  -.059499  .000363   .095445  .000369  I -.6131492  .0000269  1.7957 0.0174  I    -6.052     .149      .723     .298  -.057800   .095100  -.6133100    -4.100    -1.500  
+8912 2 47862.00 I  -.062559  .000340   .096349  .000367  I -.6149856  .0000224  1.8873 0.0178  I    -5.744     .233      .715     .298  -.060800   .096300  -.6150900    -3.700    -1.300  
+8912 3 47863.00 I  -.065327  .000277   .097344  .000301  I -.6169418  .0000233  2.0327 0.0204  I    -5.673     .284      .678     .298  -.063700   .097700  -.6169800    -3.300    -1.200  
+8912 4 47864.00 I  -.067830  .000277   .098522  .000301  I -.6190600  .0000340  2.2052 0.0242  I    -5.830     .284      .730     .298  -.066400   .099100  -.6190500    -3.100    -1.100  
+8912 5 47865.00 I  -.070117  .000385   .099965  .000330  I -.6213521  .0000424  2.3776 0.0308  I    -6.112     .284      .942     .298  -.069000   .100400  -.6214400    -2.800     -.500  
+8912 6 47866.00 I  -.072305  .000385   .101669  .000330  I -.6238043  .0000513  2.5173 0.0341  I    -6.361     .284     1.201     .298  -.071500   .102000  -.6238700    -3.700     -.200  
+8912 7 47867.00 I  -.074486  .000385   .103589  .000330  I -.6263590  .0000533  2.5740 0.0810  I    -6.593     .284     1.458     .298  -.074000   .103700  -.6264000    -4.700      .100  
+8912 8 47868.00 I  -.076739  .000748   .105674  .000318  I -.6289126  .0001537  2.5115 0.1026  I    -6.927     .259     1.700     .298  -.076500   .105600  -.6289500    -5.600      .000  
+8912 9 47869.00 I  -.079122  .001151   .107881  .000538  I -.6313409  .0001982  2.3258 0.0780  I    -7.324     .791     1.798     .298  -.078900   .107700  -.6313800    -6.100     -.100  
+891210 47870.00 I  -.081630  .000396   .110183  .000207  I -.6335356  .0000265  2.0544 0.0997  I    -7.520     .791     1.614     .298  -.081300   .109900  -.6335700    -6.400     -.300  
+891211 47871.00 I  -.084241  .000334   .112555  .000231  I -.6354462  .0000226  1.7725 0.0157  I    -7.271     .140     1.201     .298  -.083700   .112300  -.6354900    -6.200     -.500  
+891212 47872.00 I  -.086932  .000342   .114974  .000227  I -.6371037  .0000169  1.5598 0.0133  I    -6.656     .279      .818     .298  -.086200   .114800  -.6371500    -5.400     -.800  
+891213 47873.00 I  -.089614  .000342   .117435  .000227  I -.6386064  .0000140  1.4687 0.0090  I    -6.017     .279      .674     .298  -.088800   .117400  -.6386400    -4.300     -.900  
+891214 47874.00 I  -.092151  .000363   .119956  .000221  I -.6400823  .0000062  1.5010 0.0080  I    -5.577     .279      .722     .298  -.091100   .120000  -.6401300    -3.100     -.900  
+891215 47875.00 I  -.094464  .000259   .122557  .000174  I -.6416399  .0000077  1.6278 0.0054  I    -5.311     .279      .809     .298  -.093500   .122400  -.6416800    -1.900    -1.000  
+891216 47876.00 I  -.096596  .000223   .125204  .000155  I -.6433545  .0000088  1.8045 0.0069  I    -5.099     .310      .845     .298  -.095800   .125200  -.6434200    -1.100     -.900  
+891217 47877.00 I  -.098647  .000279   .127845  .000160  I -.6452473  .0000114  1.9764 0.0074  I    -4.999     .393      .886     .298  -.098100   .127800  -.6453100     -.600     -.800  
+891218 47878.00 I  -.100700  .000272   .130424  .000132  I -.6472936  .0000118  2.1073 0.0084  I    -5.115     .388      .980     .298  -.100200   .130300  -.6473600     -.700     -.600  
+891219 47879.00 I  -.102791  .000265   .132890  .000156  I -.6494431  .0000124  2.1818 0.0085  I    -5.335     .388     1.034     .298  -.102300   .132800  -.6495200    -1.100     -.500  
+891220 47880.00 I  -.104932  .000269   .135228  .000159  I -.6516350  .0000121  2.1897 0.0084  I    -5.551     .462      .928     .298  -.104300   .135100  -.6517000    -1.600     -.200  
+891221 47881.00 I  -.107038  .000272   .137530  .000155  I -.6537996  .0000112  2.1290 0.0083  I    -5.702     .473      .781     .132  -.106300   .137500  -.6538500    -2.200     -.100  
+891222 47882.00 I  -.109166  .000279   .139802  .000156  I -.6558744  .0000114  2.0126 0.0086  I    -5.778     .483      .770     .140  -.108600   .139700  -.6559100    -2.800     -.100  
+891223 47883.00 I  -.111425  .000358   .142033  .000182  I -.6578097  .0000130  1.8511 0.0103  I    -5.733     .518      .914     .169  -.110900   .141800  -.6578200    -3.200     -.300  
+891224 47884.00 I  -.113908  .000348   .144250  .000249  I -.6595674  .0000171  1.6621 0.0106  I    -5.662     .586      .990     .192  -.113200   .144100  -.6595900    -3.200     -.500  
+891225 47885.00 I  -.116617  .000342   .146490  .000244  I -.6611365  .0000168  1.4811 0.0106  I    -5.698     .586      .868     .192  -.115800   .146300  -.6611500    -3.300     -.800  
+891226 47886.00 I  -.119446  .000328   .148785  .000110  I -.6625434  .0000126  1.3417 0.0115  I    -5.835     .425      .701     .185  -.118400   .148800  -.6625900    -3.100     -.900  
+891227 47887.00 I  -.122271  .000358   .151162  .000239  I -.6638408  .0000157  1.2651 0.0092  I    -6.002     .159      .667     .170  -.120900   .151100  -.6639200    -2.800     -.800  
+891228 47888.00 I  -.124968  .000349   .153651  .000260  I -.6650994  .0000134  1.2657 0.0111  I    -6.036     .159      .809     .170  -.123500   .153800  -.6651700    -2.300     -.700  
+891229 47889.00 I  -.127413  .000349   .156281  .000260  I -.6663989  .0000158  1.3462 0.0104  I    -5.836     .159     1.041     .170  -.126200   .156700  -.6664800    -1.900     -.500  
+891230 47890.00 I  -.129524  .000349   .159074  .000260  I -.6678172  .0000158  1.5028 0.0101  I    -5.536     .159     1.174     .170  -.128600   .159700  -.6679000    -1.600     -.300  
+891231 47891.00 I  -.131349  .000268   .161999  .000202  I -.6694241  .0000127  1.7184 0.0109  I    -5.317     .159     1.154     .170  -.130600   .162500  -.6695100    -1.700     -.200  
+90 1 1 47892.00 I  -.132974  .000234   .164998  .000286  I  .3287404  .0000150  1.9510 0.0105  I    -5.258     .217     1.052     .144  -.132500   .165300   .3286400    -2.100     -.100  
+90 1 2 47893.00 I  -.134485  .000173   .168017  .000291  I  .3266860  .0000168  2.1474 0.0120  I    -5.325     .268      .955     .298  -.134100   .168000   .3265900    -2.700     -.100  
+90 1 3 47894.00 I  -.135970  .000173   .170997  .000291  I  .3244717  .0000188  2.2655 0.0135  I    -5.434     .268      .921     .298  -.135500   .170600   .3243500    -3.500     -.100  
+90 1 4 47895.00 I  -.137516  .000173   .173884  .000291  I  .3221932  .0000211  2.2691 0.0131  I    -5.532     .268      .960     .298  -.136800   .173400   .3221100    -4.500     1.000  
+90 1 5 47896.00 I  -.139181  .000210   .176642  .000295  I  .3199771  .0000182  2.1420 0.0139  I    -5.645     .268     1.037     .298  -.138200   .176000   .3199100    -6.100      .400  
+90 1 6 47897.00 I  -.140984  .000214   .179271  .000312  I  .3179432  .0000180  1.9131 0.0136  I    -5.798     .588     1.083     .127  -.139900   .178800   .3178800    -6.300      .000  
+90 1 7 47898.00 I  -.142938  .000344   .181783  .000529  I  .3161659  .0000203  1.6394 0.0135  I    -5.935     .787     1.027     .172  -.141800   .181300   .3160700    -5.300    -1.100  
+90 1 8 47899.00 I  -.145050  .000368   .184190  .000570  I  .3146584  .0000201  1.3838 0.0137  I    -5.982     .648      .875     .144  -.143800   .183400   .3146100    -3.200    -1.500  
+90 1 9 47900.00 I  -.147283  .000368   .186517  .000570  I  .3133695  .0000185  1.2147 0.0129  I    -5.952     .677      .752     .127  -.146100   .185800   .3133200    -2.100    -2.000  
+90 110 47901.00 I  -.149527  .000376   .188891  .000491  I  .3121848  .0000163  1.1782 0.0113  I    -5.846     .677      .787     .127  -.148400   .188200   .3121100     -.600    -2.100  
+90 111 47902.00 I  -.151664  .000297   .191448  .000431  I  .3109700  .0000131  1.2711 0.0109  I    -5.614     .726      .990     .129  -.150600   .191000   .3108600      .500    -1.600  
+90 112 47903.00 I  -.153666  .000338   .194203  .000459  I  .3096123  .0000146  1.4548 0.0098  I    -5.156     .692     1.202     .298  -.152500   .193700   .3095300      .700     -.500  
+90 113 47904.00 I  -.155469  .000338   .197091  .000459  I  .3080493  .0000147  1.6716 0.0107  I    -4.657     .692     1.186     .298  -.154400   .196600   .3079800      .300      .600  
+90 114 47905.00 I  -.157038  .000306   .200038  .000379  I  .3062812  .0000156  1.8520 0.0101  I    -4.558     .764      .791     .237  -.156200   .199900   .3062400      .300     1.300  
+90 115 47906.00 I  -.158489  .000244   .203022  .000149  I  .3043732  .0000138  1.9486 0.0120  I    -4.895     .765      .227     .269  -.157600   .203200   .3043100     -.500     1.700  
+90 116 47907.00 I  -.159972  .000314   .206036  .000165  I  .3024133  .0000183  1.9571 0.0139  I    -5.367     .602     -.097     .325  -.159500   .206100   .3023500    -1.900     1.600  
+90 117 47908.00 I  -.161637  .000356   .209075  .000196  I  .3004836  .0000241  1.8916 0.0147  I    -5.625     .612      .174     .358  -.161100   .208900   .3004300    -3.500     1.200  
+90 118 47909.00 I  -.163648  .000356   .212119  .000196  I  .2986485  .0000231  1.7709 0.0167  I    -5.688     .612      .676     .358  -.162600   .211200   .2985800    -4.900      .500  
+90 119 47910.00 I  -.166171  .000356   .215135  .000196  I  .2969497  .0000230  1.6265 0.0151  I    -5.794     .786      .749     .359  -.165400   .214500   .2968900    -6.500     -.200  
+90 120 47911.00 I  -.169172  .000439   .218109  .000309  I  .2953954  .0000195  1.4824 0.0142  I    -6.115     .741      .316     .326  -.168400   .217500   .2952300    -7.100     -.900  
+90 121 47912.00 I  -.172428  .000388   .221071  .000324  I  .2939803  .0000165  1.3521 0.0138  I    -6.348     .687     -.220     .368  -.172300   .220900   .2936200    -6.600    -1.300  
+90 122 47913.00 I  -.175694  .000417   .224056  .000493  I  .2926783  .0000195  1.2606 0.0103  I    -6.056     .798     -.296     .353  -.174900   .223800   .2925700    -5.100    -1.600  
+90 123 47914.00 I  -.178725  .000442   .227102  .000542  I  .2914388  .0000122  1.2299 0.0122  I    -5.523     .709      .153     .471  -.177600   .227000   .2915700    -3.400    -1.600  
+90 124 47915.00 I  -.181309  .000500   .230256  .000623  I  .2901924  .0000147  1.2776 0.0095  I    -5.199     .683      .610     .513  -.180000   .230000   .2903300    -2.100    -1.600  
+90 125 47916.00 I  -.183495  .000441   .233556  .000565  I  .2888525  .0000146  1.4187 0.0106  I    -5.239     .532      .833     .480  -.182500   .233400   .2889000    -1.300    -1.500  
+90 126 47917.00 I  -.185427  .000391   .236998  .000491  I  .2873251  .0000152  1.6495 0.0135  I    -5.306     .513      .528     .432  -.185100   .236700   .2873100     -.800    -1.200  
+90 127 47918.00 I  -.187215  .000426   .240537  .000473  I  .2855331  .0000226  1.9414 0.0148  I    -5.072     .492      .255     .431  -.187400   .239900   .2855600    -1.000     -.700  
+90 128 47919.00 I  -.188973  .000497   .244118  .000507  I  .2834373  .0000253  2.2482 0.0168  I    -4.695     .421      .241     .423  -.189600   .243100   .2835100    -1.500     -.300  
+90 129 47920.00 I  -.190812  .000565   .247664  .000613  I  .2810477  .0000249  2.5222 0.0183  I    -4.513     .435      .380     .321  -.191700   .246300   .2811600    -2.000      .000  
+90 130 47921.00 I  -.192611  .000563   .251151  .000585  I  .2784173  .0000264  2.7232 0.0218  I    -4.646     .443      .543     .156  -.193400   .249600   .2785100    -2.600      .100  
+90 131 47922.00 I  -.194191  .000553   .254600  .000497  I  .2756436  .0000357  2.7972 0.0288  I    -4.979     .342      .595     .174  -.195100   .253200   .2757500    -3.500      .200  
+90 2 1 47923.00 I  -.195576  .000729   .258070  .000590  I  .2728727  .0000512  2.7217 0.0314  I    -5.387     .338      .569     .172  -.196100   .256800   .2729000    -4.100     -.100  
+90 2 2 47924.00 I  -.196900  .000729   .261580  .000590  I  .2702385  .0000516  2.5312 0.0375  I    -5.757     .338      .544     .172  -.196400   .260600   .2701800    -4.400     -.600  
+90 2 3 47925.00 I  -.198266  .000702   .265115  .000732  I  .2678273  .0000547  2.2897 0.0356  I    -5.924     .343      .521     .184  -.197300   .264100   .2678600    -5.600    -1.100  
+90 2 4 47926.00 I  -.199681  .000600   .268675  .000605  I  .2656487  .0000490  2.0795 0.0351  I    -5.909     .314      .493     .171  -.198600   .268000   .2657200    -5.000    -1.900  
+90 2 5 47927.00 I  -.201065  .000480   .272274  .000274  I  .2636380  .0000440  1.9604 0.0305  I    -5.812     .480      .395     .246  -.200000   .271900   .2637700    -3.700    -2.300  
+90 2 6 47928.00 I  -.202333  .000409   .275932  .000393  I  .2616887  .0000363  1.9591 0.0296  I    -5.695     .546      .180     .249  -.201400   .275700   .2617500    -2.100    -2.300  
+90 2 7 47929.00 I  -.203403  .000412   .279667  .000396  I  .2596837  .0000395  2.0662 0.0266  I    -5.608     .600     -.101     .263  -.202800   .279500   .2597000     -.800    -2.100  
+90 2 8 47930.00 I  -.204211  .000412   .283483  .000396  I  .2575309  .0000389  2.2494 0.0269  I    -5.613     .625     -.236     .303  -.203900   .283200   .2574600      .200    -1.900  
+90 2 9 47931.00 I  -.204694  .000411   .287359  .000390  I  .2551758  .0000365  2.4597 0.0243  I    -5.538     .844     -.095     .340  -.204500   .287000   .2550700      .400    -1.500  
+90 210 47932.00 I  -.204841  .000347   .291287  .000274  I  .2526216  .0000291  2.6396 0.0225  I    -5.155     .862      .128     .325  -.204300   .290600   .2525600     -.300    -1.100  
+90 211 47933.00 I  -.204676  .000350   .295263  .000311  I  .2499181  .0000263  2.7550 0.0194  I    -4.645     .867      .420     .335  -.203800   .294500   .2499100    -1.600     -.800  
+90 212 47934.00 I  -.204224  .000272   .299284  .000324  I  .2471377  .0000258  2.7920 0.0176  I    -4.496     .890      .322     .369  -.202800   .298600   .2471500    -3.000     -.500  
+90 213 47935.00 I  -.203533  .000284   .303354  .000268  I  .2443607  .0000233  2.7493 0.0169  I    -4.550     .871      .047     .367  -.202200   .302700   .2443800    -3.700     -.300  
+90 214 47936.00 I  -.202713  .000269   .307486  .000269  I  .2416612  .0000218  2.6402 0.0155  I    -4.588     .824     -.052     .328  -.201500   .306700   .2416800    -4.100     -.500  
+90 215 47937.00 I  -.201903  .000324   .311642  .000284  I  .2390961  .0000205  2.4838 0.0150  I    -4.580     .513     -.123     .251  -.200900   .310800   .2390900    -3.600     -.800  
+90 216 47938.00 I  -.201203  .000307   .315725  .000271  I  .2366996  .0000205  2.3096 0.0178  I    -4.658     .391     -.063     .266  -.200500   .314800   .2367000    -2.100    -1.400  
+90 217 47939.00 I  -.200751  .000374   .319639  .000354  I  .2344775  .0000291  2.1338 0.0170  I    -4.771     .417     -.063     .243  -.200500   .318800   .2344600     -.200    -1.800  
+90 218 47940.00 I  -.200722  .000365   .323310  .000303  I  .2324294  .0000271  1.9657 0.0198  I    -4.891     .467     -.211     .174  -.200300   .322600   .2324500     1.400    -2.300  
+90 219 47941.00 I  -.201068  .000448   .326771  .000282  I  .2305399  .0000269  1.8160 0.0177  I    -5.017     .440     -.584     .148  -.200400   .326300   .2306200     2.700    -2.700  
+90 220 47942.00 I  -.201659  .000427   .330102  .000285  I  .2287872  .0000227  1.6968 0.0190  I    -5.124     .550     -.975     .140  -.200600   .329800   .2289000     3.900    -3.000  
+90 221 47943.00 I  -.202289  .000455   .333378  .000237  I  .2271173  .0000269  1.6644 0.0206  I    -5.061     .594    -1.128     .136  -.200900   .333100   .2272200     4.800    -3.000  
+90 222 47944.00 I  -.202612  .000505   .336678  .000228  I  .2254160  .0000344  1.7591 0.0239  I    -4.895     .649    -1.067     .123  -.201300   .336400   .2254900     5.000    -2.700  
+90 223 47945.00 I  -.202312  .000558   .340074  .000252  I  .2235642  .0000395  1.9586 0.0248  I    -4.818     .696    -1.115     .135  -.200400   .339400   .2236000     4.500    -2.400  
+90 224 47946.00 I  -.201390  .000514   .343597  .000252  I  .2214781  .0000357  2.2204 0.0260  I    -4.681     .669    -1.271     .153  -.199300   .342800   .2214800     3.100    -2.100  
+90 225 47947.00 I  -.199994  .000487   .347250  .000302  I  .2191223  .0000337  2.4856 0.0304  I    -4.374     .535    -1.311     .142  -.198100   .346400   .2191200     1.100    -1.700  
+90 226 47948.00 I  -.198336  .000751   .351023  .000359  I  .2165307  .0000492  2.6796 0.0298  I    -4.120     .198    -1.136     .142  -.197000   .350000   .2165100    -1.500    -1.600  
+90 227 47949.00 I  -.196637  .000720   .354907  .000364  I  .2138054  .0000491  2.7468 0.0295  I    -4.212     .182     -.833     .151  -.195800   .353800   .2138000    -3.200    -1.600  
+90 228 47950.00 I  -.195118  .000689   .358888  .000626  I  .2110894  .0000326  2.6571 0.0276  I    -4.643     .182     -.531     .151  -.194700   .357900   .2111100    -4.200    -1.800  
+90 3 1 47951.00 I  -.193973  .000641   .362910  .000538  I  .2085379  .0000252  2.4273 0.0209  I    -5.149     .182     -.441     .151  -.193800   .361900   .2085800    -4.700    -2.000  
+90 3 2 47952.00 I  -.193306  .000527   .366897  .000465  I  .2062554  .0000262  2.1357 0.0188  I    -5.455     .206     -.687     .147  -.193100   .365800   .2063000    -4.700    -2.400  
+90 3 3 47953.00 I  -.192965  .000613   .370776  .000539  I  .2042577  .0000280  1.8706 0.0194  I    -5.458     .212    -1.084     .150  -.192500   .369800   .2043200    -4.000    -2.800  
+90 3 4 47954.00 I  -.192737  .000613   .374532  .000539  I  .2024849  .0000287  1.6936 0.0197  I    -5.273     .212    -1.425     .150  -.192000   .373700   .2025600    -3.700    -3.100  
+90 3 5 47955.00 I  -.192439  .000268   .378169  .000536  I  .2008309  .0000278  1.6354 0.0194  I    -5.072     .238    -1.603     .140  -.191800   .377700   .2009100    -2.900    -4.400  
+90 3 6 47956.00 I  -.192013  .000269   .381747  .000316  I  .1991734  .0000262  1.6992 0.0198  I    -4.927     .205    -1.679     .134  -.191000   .381600   .1992000    -1.600    -4.500  
+90 3 7 47957.00 I  -.191447  .000229   .385333  .000330  I  .1973997  .0000283  1.8612 0.0197  I    -4.810     .271    -1.754     .109  -.190400   .385100   .1974000     -.500    -4.200  
+90 3 8 47958.00 I  -.190752  .000206   .388961  .000386  I  .1954329  .0000293  2.0774 0.0202  I    -4.685     .291    -1.871     .298  -.189800   .388800   .1954000     -.100    -3.900  
+90 3 9 47959.00 I  -.189934  .000188   .392658  .000293  I  .1932407  .0000289  2.3060 0.0203  I    -4.569     .291    -2.021     .298  -.188800   .392400   .1932300     -.800    -2.900  
+90 310 47960.00 I  -.188990  .000188   .396433  .000293  I  .1908357  .0000282  2.4900 0.0206  I    -4.455     .291    -2.075     .298  -.187800   .395700   .1908200     -.200    -2.200  
+90 311 47961.00 I  -.187975  .000423   .400222  .000516  I  .1882909  .0000293  2.5833 0.0218  I    -4.336     .291    -2.058     .298  -.186900   .399300   .1882700    -1.100    -1.800  
+90 312 47962.00 I  -.186968  .000434   .403938  .000509  I  .1857013  .0000333  2.5801 0.0279  I    -4.191     .540    -2.087     .289  -.186100   .402900   .1856700    -2.300    -2.000  
+90 313 47963.00 I  -.186071  .000637   .407506  .000690  I  .1831593  .0000476  2.4910 0.0322  I    -4.072     .760    -2.190     .361  -.185500   .406600   .1831000    -3.200    -2.800  
+90 314 47964.00 I  -.185394  .000639   .410852  .000680  I  .1807412  .0000552  2.3360 0.0367  I    -4.119     .722    -2.247     .318  -.184900   .410200   .1806400    -4.100    -3.500  
+90 315 47965.00 I  -.184985  .000639   .413929  .000680  I  .1784922  .0000558  2.1661 0.0372  I    -4.374     .722    -2.114     .318  -.184800   .413200   .1783300    -5.400    -4.000  
+90 316 47966.00 I  -.184660  .000772   .416814  .000652  I  .1763986  .0000498  2.0274 0.0374  I    -4.518     .722    -2.007     .318  -.184200   .416100   .1762300    -6.100    -4.400  
+90 317 47967.00 I  -.184220  .000772   .419631  .000652  I  .1744241  .0000498  1.9286 0.0375  I    -4.489     .793    -2.115     .353  -.183700   .419200   .1743500    -5.800    -5.100  
+90 318 47968.00 I  -.183515  .000712   .422474  .000493  I  .1725242  .0000561  1.8815 0.0353  I    -4.359     .845    -2.468     .321  -.182800   .422100   .1724700    -4.700    -5.400  
+90 319 47969.00 I  -.182424  .000773   .425419  .000587  I  .1706383  .0000500  1.9028 0.0299  I    -4.103     .825    -2.917     .344  -.181800   .424900   .1706200    -3.400    -5.600  
+90 320 47970.00 I  -.180871  .000469   .428535  .000234  I  .1686948  .0000206  1.9954 0.0269  I    -3.685     .779    -3.155     .344  -.180100   .428200   .1687600    -1.600    -5.500  
+90 321 47971.00 I  -.178945  .000419   .431863  .000231  I  .1666247  .0000200  2.1563 0.0134  I    -3.270     .714    -3.080     .311  -.178400   .431500   .1667000     -.400    -5.400  
+90 322 47972.00 I  -.176800  .000453   .435421  .000293  I  .1643610  .0000172  2.3806 0.0130  I    -3.127     .702    -2.907     .257  -.176300   .434900   .1644100     -.100    -4.700  
+90 323 47973.00 I  -.174577  .000324   .439208  .000285  I  .1618486  .0000165  2.6495 0.0117  I    -3.345     .561    -2.908     .102  -.174200   .438600   .1618200     -.500    -4.000  
+90 324 47974.00 I  -.172343  .000349   .443146  .000315  I  .1590562  .0000158  2.9356 0.0103  I    -3.641     .561    -3.098     .102  -.171900   .442500   .1590600    -1.200    -3.500  
+90 325 47975.00 I  -.170198  .000291   .447045  .000249  I  .1559934  .0000124  3.1735 0.0097  I    -3.630     .561    -3.103     .102  -.169500   .446100   .1559800    -1.700    -3.100  
+90 326 47976.00 I  -.168148  .000247   .450794  .000234  I  .1527522  .0000114  3.2824 0.0093  I    -3.450     .539    -2.746     .104  -.167100   .449700   .1527600    -2.600    -2.900  
+90 327 47977.00 I  -.166137  .000369   .454332  .000375  I  .1494856  .0000138  3.2205 0.0087  I    -3.530     .690    -2.289     .298  -.164900   .453400   .1494900    -3.400    -2.800  
+90 328 47978.00 I  -.164136  .000354   .457615  .000354  I  .1463661  .0000132  2.9941 0.0096  I    -3.969     .626    -2.087     .298  -.162600   .456800   .1463300    -3.900    -3.200  
+90 329 47979.00 I  -.162161  .000354   .460647  .000354  I  .1435361  .0000133  2.6516 0.0115  I    -4.431     .626    -2.231     .298  -.160400   .460000   .1435100    -4.100    -3.600  
+90 330 47980.00 I  -.160228  .000322   .463506  .000351  I  .1410660  .0000189  2.2997 0.0110  I    -4.584     .626    -2.575     .298  -.158300   .463100   .1410500    -4.000    -4.100  
+90 331 47981.00 I  -.158241  .000306   .466349  .000337  I  .1389047  .0000176  2.0437 0.0134  I    -4.402     .626    -2.928     .298  -.156200   .466100   .1388900    -3.400    -4.700  
+90 4 1 47982.00 I  -.156117  .000418   .469229  .000441  I  .1369332  .0000190  1.9238 0.0161  I    -4.078     .617    -3.196     .298  -.154000   .469000   .1369100    -2.400    -4.800  
+90 4 2 47983.00 I  -.153796  .000396   .472157  .000493  I  .1350106  .0000269  1.9436 0.0165  I    -3.828     .491    -3.361     .136  -.151900   .471900   .1350100    -1.100    -4.700  
+90 4 3 47984.00 I  -.151225  .000385   .475109  .000307  I  .1330082  .0000270  2.0770 0.0191  I    -3.771     .511    -3.404     .159  -.149800   .474800   .1329900     -.300    -4.700  
+90 4 4 47985.00 I  -.148374  .000374   .478055  .000296  I  .1308397  .0000270  2.2611 0.0171  I    -3.878     .511    -3.323     .159  -.147600   .477600   .1308000     1.800    -4.900  
+90 4 5 47986.00 I  -.145312  .000355   .480999  .000164  I  .1284925  .0000210  2.4258 0.0162  I    -3.883     .511    -3.167     .159  -.145300   .480200   .1284300     2.300    -4.600  
+90 4 6 47987.00 I  -.142123  .000317   .483957  .000242  I  .1260024  .0000180  2.5475 0.0165  I    -3.741     .450    -3.132     .220  -.142500   .483200   .1259600     1.700    -4.100  
+90 4 7 47988.00 I  -.138849  .000329   .486959  .000319  I  .1234139  .0000254  2.6199 0.0161  I    -3.512     .464    -3.186     .248  -.139400   .486300   .1233900      .200    -3.700  
+90 4 8 47989.00 I  -.135526  .000252   .490037  .000293  I  .1207829  .0000266  2.6312 0.0166  I    -3.248     .304    -3.205     .270  -.136300   .489800   .1207400    -2.000    -3.800  
+90 4 9 47990.00 I  -.132195  .000359   .493212  .000316  I  .1181738  .0000214  2.5755 0.0162  I    -2.983     .297    -3.162     .301  -.132700   .493100   .1181400    -3.500    -3.700  
+90 410 47991.00 I  -.128937  .000397   .496456  .000358  I  .1156518  .0000186  2.4599 0.0123  I    -2.750     .245    -3.182     .257  -.129200   .496400   .1156300    -4.500    -3.700  
+90 411 47992.00 I  -.125835  .000308   .499714  .000340  I  .1132670  .0000123  2.3051 0.0118  I    -2.623     .202    -3.343     .234  -.125500   .499800   .1132800    -4.700    -4.100  
+90 412 47993.00 I  -.122922  .000357   .502925  .000341  I  .1110453  .0000146  2.1390 0.0090  I    -2.629     .791    -3.572     .152  -.122400   .502900   .1110100    -3.400    -4.700  
+90 413 47994.00 I  -.120184  .000357   .506020  .000341  I  .1089861  .0000132  1.9816 0.0128  I    -2.656     .791    -3.761     .152  -.119500   .506000   .1089800    -2.500    -5.400  
+90 414 47995.00 I  -.117489  .000344   .508907  .000342  I  .1070738  .0000211  1.8491 0.0122  I    -2.600     .791    -3.839     .152  -.116800   .508700   .1070600    -1.600    -6.000  
+90 415 47996.00 I  -.114801  .000341   .511621  .000319  I  .1052702  .0000205  1.7697 0.0136  I    -2.500     .791    -3.965     .147  -.114200   .511600   .1052700     -.500    -6.500  
+90 416 47997.00 I  -.112127  .000276   .514204  .000299  I  .1035097  .0000173  1.7642 0.0146  I    -2.449     .402    -4.201     .186  -.111600   .514200   .1035000      .700    -6.700  
+90 417 47998.00 I  -.109471  .000325   .516685  .000294  I  .1017159  .0000209  1.8363 0.0137  I    -2.440     .578    -4.385     .235  -.109200   .516200   .1016800     1.900    -6.300  
+90 418 47999.00 I  -.106858  .000346   .519103  .000319  I  .0998076  .0000213  1.9970 0.0149  I    -2.420     .633    -4.363     .234  -.106600   .518400   .0998100     2.400    -5.700  
+90 419 48000.00 I  -.104324  .000339   .521523  .000348  I  .0976962  .0000213  2.2349 0.0143  I    -2.360     .633    -4.108     .234  -.104100   .520900   .0977300     3.000    -4.900  
+90 420 48001.00 I  -.101893  .000293   .523999  .000333  I  .0953261  .0000191  2.5080 0.0129  I    -2.168     .633    -4.005     .234  -.101700   .523200   .0953800     2.700    -4.400  
+90 421 48002.00 I  -.099610  .000283   .526519  .000305  I  .0926861  .0000146  2.7636 0.0124  I    -2.009     .595    -4.077     .224  -.099500   .525300   .0927600     1.800    -3.800  
+90 422 48003.00 I  -.097463  .000276   .528988  .000358  I  .0898268  .0000157  2.9356 0.0113  I    -1.889     .513    -4.052     .208  -.097200   .527700   .0899300      .300    -3.500  
+90 423 48004.00 I  -.095416  .000274   .531306  .000368  I  .0868628  .0000172  2.9637 0.0121  I    -1.920     .363    -3.759     .122  -.094900   .530100   .0868500    -1.300    -3.600  
+90 424 48005.00 I  -.093418  .000231   .533400  .000354  I  .0839541  .0000185  2.8275 0.0123  I    -2.345     .241    -3.414     .124  -.092700   .532300   .0838600    -2.700    -3.900  
+90 425 48006.00 I  -.091348  .000215   .535243  .000316  I  .0812546  .0000175  2.5510 0.0139  I    -3.129     .230    -3.306     .112  -.090600   .534500   .0811100    -3.600    -4.400  
+90 426 48007.00 I  -.089161  .000273   .536945  .000300  I  .0788778  .0000207  2.1976 0.0157  I    -3.837     .194    -3.545     .121  -.088400   .536700   .0787500    -3.700    -4.800  
+90 427 48008.00 I  -.086878  .000303   .538638  .000332  I  .0768512  .0000261  1.8688 0.0186  I    -4.046     .171    -3.976     .106  -.086000   .538500   .0767500    -3.000    -5.500  
+90 428 48009.00 I  -.084572  .000304   .540379  .000348  I  .0751104  .0000308  1.6295 0.0199  I    -3.799     .183    -4.347     .106  -.083800   .540300   .0750700    -2.000    -5.900  
+90 429 48010.00 I  -.082361  .000273   .542122  .000345  I  .0735487  .0000300  1.5208 0.0204  I    -3.343     .183    -4.605     .106  -.081600   .541900   .0736400    -1.000    -6.200  
+90 430 48011.00 I  -.080182  .000277   .543839  .000270  I  .0720199  .0000268  1.5589 0.0199  I    -2.922     .791    -4.770     .104  -.079200   .543400   .0720700     -.400    -6.300  
+90 5 1 48012.00 I  -.077877  .000256   .545523  .000262  I  .0703975  .0000263  1.6971 0.0195  I    -2.749     .192    -4.768     .146  -.076700   .545100   .0704400      .000    -5.900  
+90 5 2 48013.00 I  -.075287  .000184   .547166  .000300  I  .0686133  .0000282  1.8724 0.0198  I    -2.935     .300    -4.540     .141  -.073900   .546600   .0686400     -.400    -5.300  
+90 5 3 48014.00 I  -.072276  .000184   .548758  .000300  I  .0666583  .0000295  2.0307 0.0182  I    -3.341     .300    -4.205     .141  -.070800   .548100   .0666600     -.800    -5.100  
+90 5 4 48015.00 I  -.068759  .000183   .550281  .000242  I  .0645693  .0000230  2.1367 0.0181  I    -3.624     .300    -4.009     .141  -.067100   .549600   .0645800    -2.400    -5.100  
+90 5 5 48016.00 I  -.064784  .000209   .551772  .000244  I  .0624088  .0000210  2.1710 0.0162  I    -3.476     .305    -3.930     .143  -.063000   .551100   .0623900    -2.000    -5.300  
+90 5 6 48017.00 I  -.060468  .000371   .553258  .000220  I  .0602525  .0000229  2.1295 0.0176  I    -3.004     .346    -3.852     .157  -.058800   .552700   .0602400    -1.600    -5.500  
+90 5 7 48018.00 I  -.055942  .000445   .554752  .000241  I  .0581712  .0000282  2.0237 0.0171  I    -2.551     .694    -3.796     .149  -.054600   .554200   .0581700    -1.100    -5.700  
+90 5 8 48019.00 I  -.051343  .000453   .556267  .000227  I  .0562209  .0000255  1.8706 0.0179  I    -2.348     .735    -3.915     .156  -.050100   .555700   .0562200     -.600    -5.800  
+90 5 9 48020.00 I  -.046853  .000453   .557798  .000227  I  .0544325  .0000222  1.7102 0.0163  I    -2.366     .735    -4.162     .156  -.045800   .557300   .0544100     -.300    -5.900  
+90 510 48021.00 I  -.042609  .000435   .559319  .000288  I  .0527930  .0000204  1.5725 0.0150  I    -2.447     .735    -4.518     .156  -.041600   .558800   .0527700      .100    -5.800  
+90 511 48022.00 I  -.038544  .000425   .560777  .000336  I  .0512772  .0000202  1.4659 0.0151  I    -2.499     .713    -4.814     .194  -.037200   .560300   .0512600      .300    -5.800  
+90 512 48023.00 I  -.034545  .000456   .562139  .000391  I  .0498442  .0000222  1.4104 0.0155  I    -2.506     .839    -4.900     .212  -.032900   .561800   .0498300      .500    -5.600  
+90 513 48024.00 I  -.030505  .000373   .563381  .000472  I  .0484348  .0000236  1.4198 0.0168  I    -2.579     .460    -4.840     .216  -.028600   .563100   .0484100      .700    -5.500  
+90 514 48025.00 I  -.026329  .000361   .564505  .000478  I  .0469792  .0000253  1.5054 0.0165  I    -2.889     .439    -4.732     .192  -.024200   .564300   .0469400      .600    -5.100  
+90 515 48026.00 I  -.022010  .000350   .565557  .000391  I  .0453965  .0000230  1.6737 0.0182  I    -3.287     .439    -4.619     .192  -.019800   .565300   .0453300      .500    -4.800  
+90 516 48027.00 I  -.017588  .000330   .566569  .000387  I  .0436153  .0000263  1.8917 0.0191  I    -3.416     .432    -4.493     .186  -.015600   .566300   .0435700      .300    -4.400  
+90 517 48028.00 I  -.013173  .000353   .567518  .000398  I  .0416069  .0000304  2.1282 0.0204  I    -3.169     .399    -4.325     .142  -.011300   .567200   .0415600      .000    -4.000  
+90 518 48029.00 I  -.008793  .000353   .568420  .000398  I  .0393602  .0000313  2.3608 0.0203  I    -2.805     .399    -4.245     .142  -.007000   .568000   .0393400     -.400    -3.700  
+90 519 48030.00 I  -.004462  .000316   .569293  .000294  I  .0369007  .0000268  2.5473 0.0204  I    -2.654     .403    -4.302     .151  -.002800   .568800   .0368700     -.900    -3.600  
+90 520 48031.00 I  -.000214  .000217   .570103  .000291  I  .0342940  .0000262  2.6487 0.0165  I    -2.790     .345    -4.313     .147   .001200   .569500   .0342700    -1.400    -3.500  
+90 521 48032.00 I   .003913  .000183   .570813  .000254  I  .0316432  .0000193  2.6302 0.0152  I    -3.185     .429    -4.110     .155   .005100   .570100   .0316000    -1.900    -3.400  
+90 522 48033.00 I   .007879  .000146   .571392  .000190  I  .0290757  .0000155  2.4852 0.0124  I    -3.788     .429    -3.830     .129   .009200   .570600   .0290200    -2.400    -3.400  
+90 523 48034.00 I   .011670  .000160   .571830  .000189  I  .0267069  .0000157  2.2379 0.0108  I    -4.365     .394    -3.772     .120   .013000   .571000   .0266500    -2.700    -3.500  
+90 524 48035.00 I   .015380  .000160   .572205  .000189  I  .0246173  .0000149  1.9384 0.0106  I    -4.574     .394    -4.002     .120   .016600   .571100   .0246100    -2.400    -3.700  
+90 525 48036.00 I   .019079  .000165   .572518  .000213  I  .0228185  .0000143  1.6737 0.0096  I    -4.438     .394    -4.247     .120   .020300   .571200   .0228400    -2.100    -4.000  
+90 526 48037.00 I   .022725  .000165   .572767  .000271  I  .0212270  .0000120  1.5376 0.0091  I    -4.175     .387    -4.290     .177   .023700   .571200   .0212300    -1.700    -4.200  
+90 527 48038.00 I   .026334  .000192   .572981  .000260  I  .0196908  .0000114  1.5590 0.0164  I    -3.933     .271    -4.241     .188   .027200   .571300   .0196800    -1.300    -4.500  
+90 528 48039.00 I   .029941  .000198   .573192  .000318  I  .0180715  .0000305  1.6930 0.0262  I    -3.807     .353    -4.307     .196   .030800   .571300   .0180200    -1.100    -4.700  
+90 529 48040.00 I   .033584  .000204   .573433  .000511  I  .0162917  .0000512  1.8663 0.0272  I    -3.956     .404    -4.500     .222   .034500   .571700   .0162200    -1.600    -4.700  
+90 530 48041.00 I   .037283  .000228   .573697  .000450  I  .0143478  .0000451  2.0128 0.0320  I    -4.445     .404    -4.561     .222   .038100   .572000   .0142600    -2.300    -4.700  
+90 531 48042.00 I   .041030  .000231   .573946  .000393  I  .0122870  .0000384  2.0967 0.0340  I    -5.012     .434    -4.352     .174   .041900   .572400   .0122100    -2.900    -4.600  
+90 6 1 48043.00 I   .044816  .000244   .574165  .000259  I  .0101794  .0000510  2.1057 0.0315  I    -5.291     .523    -4.111     .298   .045600   .572700   .0101000    -3.500    -4.600  
+90 6 2 48044.00 I   .048642  .000236   .574355  .000457  I  .0080994  .0000499  2.0433 0.0314  I    -5.121     .523    -4.051     .298   .049400   .573000   .0080500    -4.000    -4.500  
+90 6 3 48045.00 I   .052531  .000248   .574522  .000441  I  .0061118  .0000366  1.9238 0.0261  I    -4.782     .516    -4.117     .298   .053300   .573300   .0060900    -4.200    -4.500  
+90 6 4 48046.00 I   .056477  .000246   .574617  .000406  I  .0042663  .0000155  1.7609 0.0196  I    -4.617     .516    -4.167     .298   .057200   .573600   .0042500    -3.800    -4.600  
+90 6 5 48047.00 I   .060427  .000241   .574560  .000365  I  .0025991  .0000143  1.5707 0.0105  I    -4.691     .614    -4.241     .298   .061100   .573700   .0025500    -3.500    -4.700  
+90 6 6 48048.00 I   .064325  .000400   .574288  .000491  I  .0011235  .0000141  1.3846 0.0108  I    -4.816     .694    -4.484     .298   .065000   .573700   .0010700    -3.200    -4.800  
+90 6 7 48049.00 I   .068136  .000433   .573790  .000485  I -.0001825  .0000162  1.2356 0.0116  I    -4.988     .613    -4.810     .298   .068900   .573700  -.0002400    -2.800    -4.900  
+90 6 8 48050.00 I   .071863  .000440   .573089  .000514  I -.0013675  .0000184  1.1461 0.0111  I    -5.352     .637    -4.919     .108   .072800   .572500  -.0014200    -3.100    -5.000  
+90 6 9 48051.00 I   .075621  .000412   .572246  .000287  I -.0025001  .0000153  1.1328 0.0119  I    -5.733     .600    -4.713     .123   .076700   .571500  -.0025700    -3.200    -5.100  
+90 610 48052.00 I   .079542  .000366   .571331  .000403  I -.0036596  .0000151  1.1989 0.0117  I    -5.847     .582    -4.407     .116   .080600   .570500  -.0037300    -3.500    -5.200  
+90 611 48053.00 I   .083643  .000411   .570420  .000473  I -.0049200  .0000177  1.3313 0.0117  I    -5.677     .492    -4.286     .127   .084400   .569500  -.0049900    -3.400    -5.200  
+90 612 48054.00 I   .087869  .000420   .569582  .000487  I -.0063350  .0000178  1.5021 0.0127  I    -5.566     .492    -4.224     .127   .088400   .568400  -.0063900    -3.600    -5.100  
+90 613 48055.00 I   .092108  .000342   .568860  .000464  I -.0079295  .0000183  1.6887 0.0121  I    -5.668     .529    -4.056     .138   .092200   .567900  -.0080100    -3.900    -5.000  
+90 614 48056.00 I   .096265  .000276   .568224  .000587  I -.0097134  .0000164  1.8782 0.0115  I    -5.743     .468    -3.892     .118   .096200   .567300  -.0098000    -4.200    -4.900  
+90 615 48057.00 I   .100309  .000228   .567608  .000586  I -.0116770  .0000138  2.0412 0.0125  I    -5.677     .417    -3.856     .120   .100100   .566600  -.0117500    -4.500    -5.000  
+90 616 48058.00 I   .104234  .000264   .566950  .000681  I -.0137740  .0000189  2.1390 0.0132  I    -5.610     .312    -3.958     .133   .104100   .565300  -.0138400    -4.600    -5.100  
+90 617 48059.00 I   .108071  .000251   .566198  .000682  I -.0159224  .0000226  2.1390 0.0158  I    -5.738     .385    -4.124     .267   .108100   .564300  -.0159800    -4.700    -5.100  
+90 618 48060.00 I   .111870  .000302   .565323  .000664  I -.0180150  .0000252  2.0279 0.0177  I    -6.171     .508    -4.257     .326   .112100   .563000  -.0180900    -4.700    -5.000  
+90 619 48061.00 I   .115674  .000279   .564316  .000629  I -.0199498  .0000273  1.8315 0.0175  I    -6.752     .517    -4.225     .309   .116100   .561900  -.0200200    -4.500    -5.300  
+90 620 48062.00 I   .119509  .000319   .563148  .000493  I -.0216658  .0000244  1.5985 0.0216  I    -7.158     .468    -3.999     .281   .119900   .560700  -.0217500    -4.500    -5.300  
+90 621 48063.00 I   .123347  .000391   .561823  .000368  I -.0231539  .0000335  1.3868 0.0208  I    -7.316     .499    -4.027     .305   .123700   .559800  -.0232500    -4.400    -5.500  
+90 622 48064.00 I   .127096  .000417   .560361  .000373  I -.0244627  .0000338  1.2450 0.0224  I    -7.168     .499    -4.136     .305   .127300   .558400  -.0245600    -4.500    -5.400  
+90 623 48065.00 I   .130620  .000492   .558791  .000411  I -.0256832  .0000298  1.2213 0.0217  I    -6.926     .482    -4.188     .271   .130600   .556900  -.0257500    -4.800    -5.200  
+90 624 48066.00 I   .134018  .000499   .557053  .000398  I -.0269483  .0000273  1.3267 0.0181  I    -6.675     .451    -4.120     .187   .133800   .555400  -.0269900    -5.400    -5.000  
+90 625 48067.00 I   .137425  .000430   .555162  .000371  I -.0283598  .0000204  1.5016 0.0202  I    -6.414     .443    -4.020     .163   .137100   .553600  -.0283900    -5.800    -4.800  
+90 626 48068.00 I   .140913  .000396   .553151  .000354  I -.0299500  .0000298  1.6721 0.0176  I    -6.327     .479    -3.953     .144   .140600   .551900  -.0299700    -6.400    -4.300  
+90 627 48069.00 I   .144519  .000487   .551067  .000391  I -.0316821  .0000288  1.7770 0.0211  I    -6.739     .448    -3.849     .132   .144000   .549800  -.0317100    -6.800    -4.300  
+90 628 48070.00 I   .148236  .000508   .549015  .000400  I -.0334770  .0000298  1.8011 0.0201  I    -7.601     .436    -3.766     .132   .148100   .547900  -.0335000    -7.100    -4.200  
+90 629 48071.00 I   .152136  .000472   .547071  .000406  I -.0352622  .0000281  1.7591 0.0212  I    -8.430     .451    -3.773     .134   .152300   .546000  -.0352800    -7.200    -4.500  
+90 630 48072.00 I   .156303  .000383   .545287  .000356  I -.0369802  .0000301  1.6721 0.0226  I    -8.728     .370    -3.828     .113   .156400   .544100  -.0370400    -7.300    -4.500  
+90 7 1 48073.00 I   .160777  .000413   .543635  .000384  I -.0385964  .0000355  1.5552 0.0210  I    -8.542     .290    -3.825     .111   .161100   .542400  -.0386700    -7.600    -4.700  
+90 7 2 48074.00 I   .165414  .000413   .542060  .000384  I -.0400777  .0000293  1.3995 0.0244  I    -8.459     .290    -3.787     .111   .165400   .540500  -.0401500    -7.500    -4.800  
+90 7 3 48075.00 I   .169947  .000490   .540503  .000416  I -.0413918  .0000336  1.2330 0.0209  I    -8.787     .314    -3.754     .117   .170000   .539600  -.0414200    -7.300    -4.900  
+90 7 4 48076.00 I   .174278  .000330   .538913  .000387  I -.0425512  .0000299  1.0891 0.0212  I    -9.397     .495    -3.703     .118   .174600   .538700  -.0425100    -7.900    -4.700  
+90 7 5 48077.00 I   .178387  .000231   .537236  .000331  I -.0435793  .0000260  0.9732 0.0234  I    -9.992     .586    -3.676     .122   .179100   .537200  -.0435200    -8.400    -4.300  
+90 7 6 48078.00 I   .182250  .000222   .535415  .000287  I -.0445130  .0000359  0.9034 0.0203  I   -10.323     .709    -3.672     .144   .182800   .535400  -.0445600    -8.800    -4.000  
+90 7 7 48079.00 I   .185852  .000431   .533390  .000291  I -.0454012  .0000312  0.8789 0.0240  I   -10.246     .813    -3.639     .140   .186200   .533000  -.0454800    -9.200    -4.100  
+90 7 8 48080.00 I   .189216  .000440   .531114  .000407  I -.0462908  .0000320  0.9146 0.0209  I   -10.004     .952    -3.487     .208   .189300   .530300  -.0463400    -9.700    -4.000  
+90 7 9 48081.00 I   .192463  .000407   .528646  .000394  I -.0472579  .0000278  1.0330 0.0219  I    -9.772     .919    -3.317     .192   .192800   .527400  -.0473200    -9.700    -4.100  
+90 710 48082.00 I   .195765  .000414   .526086  .000360  I -.0483778  .0000298  1.2145 0.0232  I    -9.655     .813    -3.273     .178   .196300   .525100  -.0484700    -9.800    -4.200  
+90 711 48083.00 I   .199218  .000546   .523520  .000426  I -.0496942  .0000371  1.4180 0.0221  I    -9.746    1.138    -3.366     .177   .199700   .522400  -.0497600    -9.400    -4.300  
+90 712 48084.00 I   .202743  .000534   .521000  .000465  I -.0512015  .0000327  1.5845 0.0246  I   -10.081    1.175    -3.539     .170   .202900   .520000  -.0512800    -9.100    -4.400  
+90 713 48085.00 I   .206192  .000503   .518522  .000463  I -.0528385  .0000324  1.6768 0.0229  I   -10.332    1.175    -3.763     .170   .206000   .517200  -.0529500    -9.100    -4.500  
+90 714 48086.00 I   .209567  .000392   .516057  .000444  I -.0545233  .0000320  1.6738 0.0216  I   -10.065    1.191    -3.973     .298   .209200   .514500  -.0546100    -9.300    -4.700  
+90 715 48087.00 I   .212890  .000335   .513585  .000415  I -.0561489  .0000287  1.5591 0.0215  I    -9.812    1.064    -4.033     .104   .212500   .511900  -.0562100    -9.600    -4.800  
+90 716 48088.00 I   .216181  .000356   .511092  .000591  I -.0576099  .0000288  1.3497 0.0250  I    -9.970    1.134    -3.942     .298   .216100   .510000  -.0576800    -9.800    -4.900  
+90 717 48089.00 I   .219452  .000200   .508596  .000458  I -.0588309  .0000409  1.0881 0.0238  I   -10.401     .738    -3.848     .298   .219900   .507900  -.0588900   -10.000    -4.700  
+90 718 48090.00 I   .222704  .000204   .506113  .000331  I -.0597892  .0000378  0.8357 0.0272  I   -10.858     .318    -3.894     .109   .223700   .505900  -.0598600   -10.000    -4.200  
+90 719 48091.00 I   .225900  .000194   .503614  .000323  I -.0605297  .0000358  0.6656 0.0249  I   -11.204     .429    -4.072     .101   .227400   .503400  -.0605700   -10.000    -4.100  
+90 720 48092.00 I   .229029  .000173   .501038  .000311  I -.0611658  .0000323  0.6319 0.0256  I   -11.449     .722    -4.181     .127   .230500   .500700  -.0612600    -9.400    -4.000  
+90 721 48093.00 I   .232094  .000233   .498320  .000411  I -.0618410  .0000367  0.7409 0.0240  I   -11.626     .821    -4.029     .134   .233600   .497600  -.0619500    -9.200    -3.900  
+90 722 48094.00 I   .235100  .000290   .495415  .000398  I -.0626823  .0000356  0.9540 0.0223  I   -11.579     .822    -3.786     .159   .236200   .494500  -.0627700    -9.000    -3.800  
+90 723 48095.00 I   .238069  .000286   .492348  .000415  I -.0637592  .0000252  1.1976 0.0218  I   -11.343     .754    -3.696     .181   .238800   .491200  -.0638100    -9.600    -4.100  
+90 724 48096.00 I   .241052  .000259   .489190  .000445  I -.0650623  .0000250  1.3957 0.0164  I   -11.146     .777    -3.725     .173   .241800   .488000  -.0651100   -10.100    -4.300  
+90 725 48097.00 I   .244089  .000265   .486004  .000452  I -.0665222  .0000211  1.5085 0.0175  I   -11.354     .751    -3.702     .247   .244900   .484600  -.0665400   -10.700    -4.500  
+90 726 48098.00 I   .247129  .000317   .482782  .000503  I -.0680495  .0000246  1.5319 0.0192  I   -12.138     .556    -3.742     .277   .248000   .481400  -.0680900   -10.800    -5.100  
+90 727 48099.00 I   .250068  .000317   .479505  .000503  I -.0695657  .0000320  1.4945 0.0211  I   -13.139     .556    -3.769     .277   .251000   .478200  -.0695900   -10.900    -5.400  
+90 728 48100.00 I   .252813  .000270   .476174  .000331  I -.0710254  .0000342  1.4177 0.0243  I   -13.962     .596    -3.601     .287   .253800   .474900  -.0710300   -11.200    -5.500  
+90 729 48101.00 I   .255333  .000245   .472800  .000284  I -.0723894  .0000365  1.3059 0.0234  I   -14.262     .578    -3.468     .292   .256300   .471800  -.0724200   -11.600    -5.200  
+90 730 48102.00 I   .257658  .000231   .469387  .000251  I -.0736311  .0000320  1.1760 0.0288  I   -14.137     .753    -3.410     .286   .258500   .468500  -.0736800   -12.000    -4.800  
+90 731 48103.00 I   .259827  .000415   .465943  .000403  I -.0747407  .0000446  1.0442 0.0271  I   -13.945     .730    -3.297     .233   .260500   .465200  -.0748300   -12.200    -4.000  
+90 8 1 48104.00 I   .261882  .000374   .462474  .000398  I -.0757207  .0000437  0.9160 0.0285  I   -13.870     .730    -3.145     .198   .262500   .462100  -.0757800   -12.900    -3.600  
+90 8 2 48105.00 I   .263860  .000371   .458987  .000379  I -.0765851  .0000356  0.8248 0.0288  I   -13.848     .715    -3.185     .184   .264200   .457800  -.0766300   -13.200    -3.300  
+90 8 3 48106.00 I   .265854  .000381   .455485  .000394  I -.0773983  .0000375  0.8174 0.0258  I   -13.945     .715    -3.272     .184   .266000   .454300  -.0774500   -13.400    -2.800  
+90 8 4 48107.00 I   .267940  .000393   .451994  .000406  I -.0782502  .0000373  0.9010 0.0243  I   -14.230     .758    -3.269     .182   .268700   .451400  -.0782800   -13.500    -2.500  
+90 8 5 48108.00 I   .270121  .000427   .448524  .000426  I -.0792279  .0000308  1.0675 0.0266  I   -14.425     .512    -3.215     .109   .271900   .448500  -.0792400   -14.000    -2.300  
+90 8 6 48109.00 I   .272360  .000524   .445084  .000560  I -.0804064  .0000378  1.2975 0.0270  I   -14.370     .536    -3.177     .298   .274300   .445500  -.0804500   -14.000    -2.400  
+90 8 7 48110.00 I   .274589  .000390   .441685  .000522  I -.0818318  .0000444  1.5542 0.0298  I   -14.208     .400    -3.200     .247   .276500   .442500  -.0818700   -14.200    -2.400  
+90 8 8 48111.00 I   .276741  .000360   .438343  .000506  I -.0835090  .0000461  1.7934 0.0278  I   -14.182     .250    -3.268     .318   .278200   .439000  -.0835500   -14.400    -2.600  
+90 8 9 48112.00 I   .278754  .000292   .435072  .000648  I -.0853967  .0000333  1.9667 0.0315  I   -14.459     .287    -3.311     .238   .279800   .435300  -.0854300   -14.700    -2.900  
+90 810 48113.00 I   .280596  .000292   .431901  .000648  I -.0874084  .0000430  2.0380 0.0264  I   -14.914     .289    -3.134     .220   .281200   .431200  -.0874800   -14.700    -3.500  
+90 811 48114.00 I   .282279  .000333   .428841  .000699  I -.0894342  .0000411  1.9938 0.0303  I   -15.264     .289    -3.016     .220   .282600   .427500  -.0894900   -14.800    -3.800  
+90 812 48115.00 I   .283818  .000399   .425877  .000724  I -.0913622  .0000428  1.8481 0.0285  I   -15.387     .260    -3.111     .222   .284000   .424500  -.0914600   -14.400    -4.000  
+90 813 48116.00 I   .285247  .000319   .422970  .000641  I -.0931091  .0000396  1.6384 0.0258  I   -15.368     .299    -3.360     .152   .285700   .421600  -.0933000   -13.900    -3.900  
+90 814 48117.00 I   .286585  .000372   .420014  .000600  I -.0946352  .0000288  1.4172 0.0261  I   -15.286     .530    -3.611     .107   .286900   .418600  -.0948000   -13.400    -3.900  
+90 815 48118.00 I   .287859  .000423   .416916  .000672  I -.0959629  .0000340  1.2543 0.0180  I   -15.186     .580    -3.664     .119   .288200   .416000  -.0960600   -12.600    -3.700  
+90 816 48119.00 I   .289172  .000436   .413704  .000561  I -.0971804  .0000217  1.2013 0.0226  I   -15.126     .621    -3.537     .126   .290000   .413000  -.0972400   -11.500    -4.100  
+90 817 48120.00 I   .290686  .000436   .410418  .000561  I -.0984078  .0000298  1.2753 0.0125  I   -15.245     .621    -3.377     .126   .291700   .409300  -.0984100   -11.200    -4.400  
+90 818 48121.00 I   .292427  .000296   .407051  .000291  I -.0997677  .0000123  1.4593 0.0164  I   -15.362     .692    -3.271     .123   .293400   .405500  -.0998400   -11.800    -4.500  
+90 819 48122.00 I   .294320  .000452   .403618  .000273  I -.1013457  .0000137  1.7011 0.0106  I   -15.271     .625    -3.181     .134   .295400   .401900  -.1014400   -12.800    -4.400  
+90 820 48123.00 I   .296284  .000458   .400149  .000219  I -.1031677  .0000172  1.9361 0.0110  I   -14.941     .455    -3.074     .118   .297500   .398400  -.1032600   -14.100    -4.200  
+90 821 48124.00 I   .298236  .000471   .396673  .000117  I -.1051968  .0000173  2.1077 0.0122  I   -14.468     .441    -2.992     .114   .299600   .395700  -.1053400   -15.100    -3.700  
+90 822 48125.00 I   .300054  .000471   .393217  .000117  I -.1073506  .0000173  2.1816 0.0112  I   -14.067     .441    -2.996     .114   .301500   .392900  -.1074500   -15.300    -3.600  
+90 823 48126.00 I   .301644  .000535   .389767  .000169  I -.1095274  .0000143  2.1576 0.0111  I   -14.020     .441    -3.104     .114   .303000   .389800  -.1096500   -15.100    -3.200  
+90 824 48127.00 I   .302975  .000571   .386306  .000172  I -.1116384  .0000140  2.0516 0.0178  I   -14.442     .379    -3.273     .103   .304100   .386400  -.1117600   -15.100    -3.600  
+90 825 48128.00 I   .304034  .000774   .382824  .000286  I -.1136104  .0000327  1.8852 0.0153  I   -15.057     .314    -3.432     .298   .305000   .382300  -.1137100   -14.900    -4.000  
+90 826 48129.00 I   .304812  .000807   .379313  .000279  I -.1153995  .0000271  1.6908 0.0211  I   -15.493     .314    -3.501     .298   .305800   .378400  -.1154700   -14.700    -4.300  
+90 827 48130.00 I   .305343  .000830   .375769  .000344  I -.1169930  .0000267  1.4993 0.0179  I   -15.571     .194    -3.458     .298   .305800   .375100  -.1170600   -15.000    -4.100  
+90 828 48131.00 I   .305706  .000725   .372194  .000306  I -.1184076  .0000235  1.3362 0.0156  I   -15.369     .194    -3.368     .298   .306000   .371900  -.1184500   -14.900    -4.000  
+90 829 48132.00 I   .305957  .000533   .368585  .000271  I -.1196803  .0000163  1.2179 0.0143  I   -15.088     .171    -3.322     .298   .306200   .368500  -.1197400   -14.500    -3.600  
+90 830 48133.00 I   .306169  .000395   .364943  .000212  I -.1208648  .0000162  1.1637 0.0126  I   -14.878     .140    -3.311     .298   .306400   .364700  -.1209200   -13.100    -3.600  
+90 831 48134.00 I   .306493  .000395   .361281  .000212  I -.1220331  .0000191  1.1856 0.0130  I   -14.829     .140    -3.260     .298   .307000   .360600  -.1220800   -12.500    -3.600  
+90 9 1 48135.00 I   .307079  .000395   .357616  .000212  I -.1232639  .0000204  1.2912 0.0167  I   -14.952     .140    -3.135     .298   .307700   .356600  -.1233000   -12.400    -3.500  
+90 9 2 48136.00 I   .307923  .000356   .353948  .000293  I -.1246436  .0000273  1.4811 0.0160  I   -15.171     .129    -2.994     .298   .308300   .352500  -.1246200   -12.600    -3.400  
+90 9 3 48137.00 I   .308928  .000368   .350259  .000284  I -.1262465  .0000247  1.7321 0.0217  I   -15.405     .416    -2.924     .206   .309300   .348600  -.1261700   -13.000    -3.300  
+90 9 4 48138.00 I   .309992  .000434   .346527  .000358  I -.1281148  .0000338  2.0040 0.0209  I   -15.643     .560    -2.938     .394   .310300   .344800  -.1280700   -13.200    -3.400  
+90 9 5 48139.00 I   .311003  .000431   .342728  .000340  I -.1302441  .0000338  2.2447 0.0224  I   -15.972     .504    -2.998     .389   .311700   .341400  -.1303100   -13.700    -3.300  
+90 9 6 48140.00 I   .311833  .000403   .338838  .000279  I -.1325698  .0000294  2.3821 0.0227  I   -16.510     .504    -3.067     .389   .312100   .337500  -.1327600   -14.300    -3.300  
+90 9 7 48141.00 I   .312470  .000430   .334859  .000304  I -.1349571  .0000302  2.3658 0.0196  I   -17.064     .460    -2.839     .352   .312800   .333600  -.1351200   -14.500    -3.500  
+90 9 8 48142.00 I   .312954  .000463   .330804  .000370  I -.1372534  .0000260  2.2057 0.0184  I   -17.382     .591    -2.650     .316   .313500   .329700  -.1374100   -14.200    -3.600  
+90 9 9 48143.00 I   .313259  .000442   .326689  .000364  I -.1393367  .0000209  1.9504 0.0178  I   -17.322     .712    -2.727     .317   .313600   .325700  -.1394800   -14.500    -3.600  
+90 910 48144.00 I   .313337  .000442   .322545  .000351  I -.1411452  .0000242  1.6680 0.0173  I   -16.910     .726    -2.871     .232   .313700   .321600  -.1412500   -14.600    -3.900  
+90 911 48145.00 I   .313177  .000443   .318438  .000365  I -.1426925  .0000275  1.4449 0.0195  I   -16.405     .776    -2.998     .203   .313700   .317500  -.1427300   -14.900    -3.500  
+90 912 48146.00 I   .312883  .000413   .314378  .000348  I -.1440792  .0000307  1.3545 0.0202  I   -15.884     .776    -3.069     .203   .313400   .313500  -.1441000   -15.100    -3.500  
+90 913 48147.00 I   .312523  .000418   .310356  .000386  I -.1454500  .0000295  1.4097 0.0219  I   -15.574     .732    -3.121     .182   .312900   .309400  -.1454700   -15.200    -3.400  
+90 914 48148.00 I   .312119  .000440   .306392  .000372  I -.1469374  .0000312  1.5813 0.0230  I   -15.571     .690    -3.195     .167   .312600   .305600  -.1469700   -15.200    -3.800  
+90 915 48149.00 I   .311661  .000307   .302501  .000262  I -.1486353  .0000352  1.8210 0.0229  I   -15.637     .456    -3.255     .298   .311800   .301500  -.1486700   -14.800    -3.800  
+90 916 48150.00 I   .311131  .000336   .298699  .000256  I -.1505805  .0000334  2.0641 0.0230  I   -15.505     .325    -3.212     .298   .310800   .297400  -.1505900   -14.600    -4.000  
+90 917 48151.00 I   .310531  .000404   .294983  .000247  I -.1527464  .0000296  2.2559 0.0225  I   -15.167     .325    -3.000     .298   .310000   .293700  -.1527900   -14.700    -4.000  
+90 918 48152.00 I   .309871  .000464   .291347  .000268  I -.1550642  .0000303  2.3635 0.0226  I   -14.817     .493    -2.653     .298   .309500   .290500  -.1551600   -14.800    -3.900  
+90 919 48153.00 I   .309160  .000847   .287783  .000283  I -.1574408  .0000342  2.3734 0.0234  I   -14.667     .622    -2.311     .298   .309400   .287000  -.1575100   -14.800    -3.600  
+90 920 48154.00 I   .308393  .000847   .284282  .000283  I -.1597815  .0000357  2.2949 0.0268  I   -14.846     .622    -2.125     .298   .309100   .283700  -.1598600   -14.800    -3.400  
+90 921 48155.00 I   .307506  .000847   .280822  .000283  I -.1620083  .0000412  2.1496 0.0231  I   -15.359     .622    -2.145     .298   .308700   .280400  -.1620200   -14.800    -3.300  
+90 922 48156.00 I   .306397  .000611   .277373  .000480  I -.1640705  .0000294  1.9736 0.0223  I   -15.866     .622    -2.293     .298   .307900   .277000  -.1641000   -14.700    -3.300  
+90 923 48157.00 I   .305056  .000409   .273887  .000460  I -.1659581  .0000169  1.8055 0.0177  I   -16.053     .523    -2.428     .298   .306500   .273600  -.1660200   -14.500    -3.200  
+90 924 48158.00 I   .303574  .000416   .270303  .000481  I -.1676926  .0000196  1.6709 0.0114  I   -15.806     .395    -2.481     .298   .304900   .270000  -.1677500   -14.200    -3.200  
+90 925 48159.00 I   .302063  .000205   .266557  .000403  I -.1693171  .0000154  1.5880 0.0128  I   -15.223     .279    -2.527     .298   .303100   .266300  -.1694200   -14.300    -3.200  
+90 926 48160.00 I   .300634  .000205   .262617  .000403  I -.1708895  .0000166  1.5678 0.0107  I   -14.637     .282    -2.687     .298   .301000   .262200  -.1710400   -14.300    -3.300  
+90 927 48161.00 I   .299388  .000186   .258587  .000372  I -.1724761  .0000149  1.6178 0.0128  I   -14.285     .282    -2.973     .298   .299600   .257900  -.1726200   -14.300    -3.500  
+90 928 48162.00 I   .298364  .000168   .254585  .000423  I -.1741494  .0000195  1.7409 0.0147  I   -14.164     .420    -3.200     .298   .298000   .253500  -.1742800   -14.100    -3.500  
+90 929 48163.00 I   .297561  .000209   .250709  .000353  I -.1759802  .0000254  1.9311 0.0164  I   -14.147     .460    -3.201     .298   .297700   .249800  -.1760800   -14.000    -3.800  
+90 930 48164.00 I   .296905  .000196   .247030  .000343  I -.1780282  .0000264  2.1711 0.0183  I   -14.274     .524    -3.043     .298   .297700   .246300  -.1781200   -13.900    -3.700  
+9010 1 48165.00 I   .296302  .000185   .243594  .000354  I -.1803265  .0000263  2.4233 0.0189  I   -14.698     .581    -2.874     .298   .297400   .243000  -.1804100   -14.100    -3.700  
+9010 2 48166.00 I   .295654  .000237   .240360  .000444  I -.1828631  .0000270  2.6404 0.0170  I   -15.259     .647    -2.748     .103   .297000   .240100  -.1829400   -14.400    -3.300  
+9010 3 48167.00 I   .294851  .000270   .237241  .000299  I -.1855792  .0000216  2.7730 0.0165  I   -15.616     .611    -2.614     .298   .295900   .236900  -.1856200   -14.500    -3.200  
+9010 4 48168.00 I   .293782  .000339   .234151  .000224  I -.1883677  .0000188  2.7812 0.0142  I   -15.537     .575    -2.492     .298   .294300   .233700  -.1884200   -14.300    -3.100  
+9010 5 48169.00 I   .292376  .000344   .230984  .000227  I -.1910975  .0000185  2.6569 0.0142  I   -15.169     .575    -2.451     .298   .292300   .230000  -.1911500   -13.900    -3.300  
+9010 6 48170.00 I   .290636  .000344   .227640  .000227  I -.1936458  .0000214  2.4253 0.0133  I   -14.752     .600    -2.508     .111   .290100   .226000  -.1937100   -14.400    -3.700  
+9010 7 48171.00 I   .288711  .000310   .224110  .000203  I -.1959332  .0000192  2.1488 0.0181  I   -14.406     .747    -2.580     .197   .287700   .221900  -.1960100   -13.700    -3.600  
+9010 8 48172.00 I   .286692  .000376   .220434  .000196  I -.1979555  .0000291  1.9086 0.0208  I   -14.125     .691    -2.585     .222   .285800   .218400  -.1980200   -13.000    -3.700  
+9010 9 48173.00 I   .284630  .000383   .216660  .000144  I -.1997832  .0000369  1.7670 0.0258  I   -13.940     .697    -2.523     .290   .283800   .214900  -.1998800   -12.600    -3.400  
+901010 48174.00 I   .282572  .000419   .212839  .000204  I -.2015301  .0000426  1.7474 0.0294  I   -14.111     .685    -2.253     .321   .282000   .211800  -.2016300   -12.800    -2.600  
+901011 48175.00 I   .280541  .000419   .209022  .000204  I -.2033154  .0000458  1.8401 0.0293  I   -14.374     .685    -2.129     .321   .280300   .208800  -.2033300   -12.800    -2.400  
+901012 48176.00 I   .278421  .000375   .205271  .000217  I -.2052338  .0000402  2.0034 0.0283  I   -14.419     .679    -2.386     .337   .278700   .205400  -.2052200   -13.200    -1.900  
+901013 48177.00 I   .276142  .000326   .201622  .000224  I -.2073263  .0000332  2.1789 0.0231  I   -14.192     .356    -2.584     .261   .276800   .202000  -.2073700   -13.100    -2.100  
+901014 48178.00 I   .273732  .000362   .198072  .000311  I -.2095793  .0000226  2.3177 0.0193  I   -13.791     .259    -2.460     .250   .274400   .198200  -.2096700   -13.000    -2.300  
+901015 48179.00 I   .271236  .000285   .194613  .000323  I -.2119396  .0000195  2.3904 0.0151  I   -13.375     .256    -2.186     .185   .271700   .194200  -.2120200   -12.900    -2.500  
+901016 48180.00 I   .268687  .000237   .191236  .000365  I -.2143357  .0000200  2.3898 0.0116  I   -13.114     .276    -1.953     .298   .269000   .190700  -.2143600   -12.900    -2.400  
+901017 48181.00 I   .266124  .000214   .187938  .000336  I -.2166969  .0000127  2.3223 0.0119  I   -13.025     .243    -1.816     .106   .266300   .187300  -.2167500   -12.700    -2.200  
+901018 48182.00 I   .263546  .000232   .184709  .000401  I -.2189627  .0000128  2.2019 0.0103  I   -12.995     .299    -1.782     .166   .263500   .184100  -.2190000   -12.600    -2.200  
+901019 48183.00 I   .260909  .000271   .181498  .000458  I -.2210914  .0000163  2.0537 0.0118  I   -12.987     .302    -1.859     .193   .260700   .180900  -.2211300   -12.100    -2.200  
+901020 48184.00 I   .258171  .000428   .178283  .000459  I -.2230666  .0000198  1.8952 0.0135  I   -13.034     .302    -1.984     .193   .258000   .178100  -.2231500   -11.900    -2.500  
+901021 48185.00 I   .255334  .000448   .175151  .000463  I -.2248874  .0000214  1.7536 0.0139  I   -13.137     .367    -2.195     .197   .255400   .175300  -.2249700   -12.000    -2.300  
+901022 48186.00 I   .252529  .000404   .172099  .000426  I -.2265925  .0000194  1.6683 0.0133  I   -13.082     .367    -2.385     .197   .252600   .172300  -.2266200   -12.400    -2.100  
+901023 48187.00 I   .249944  .000374   .169070  .000357  I -.2282489  .0000159  1.6578 0.0127  I   -12.685     .629    -2.458     .162   .250000   .169100  -.2282900   -12.000    -2.100  
+901024 48188.00 I   .247695  .000424   .166030  .000281  I -.2299310  .0000165  1.7161 0.0160  I   -12.047     .750    -2.444     .298   .247600   .165700  -.2300200   -10.800    -2.300  
+901025 48189.00 I   .245667  .000431   .163016  .000288  I -.2316994  .0000277  1.8294 0.0178  I   -11.556     .750    -2.427     .298   .245400   .162000  -.2317700    -9.700    -2.900  
+901026 48190.00 I   .243703  .000432   .160079  .000377  I -.2336061  .0000316  1.9916 0.0201  I   -11.444     .712    -2.398     .111   .244100   .158900  -.2337400    -9.300    -2.900  
+901027 48191.00 I   .241754  .000251   .157249  .000361  I -.2356992  .0000291  2.2038 0.0203  I   -11.368     .960    -2.274     .136   .242200   .155800  -.2357700    -9.400    -3.000  
+901028 48192.00 I   .239851  .000240   .154550  .000326  I -.2380273  .0000256  2.4570 0.0216  I   -11.158     .944    -2.056     .143   .240300   .153400  -.2381500    -9.900    -2.900  
+901029 48193.00 I   .238015  .000258   .152003  .000377  I -.2406142  .0000319  2.7132 0.0215  I   -11.030     .981    -1.851     .169   .238600   .151400  -.2406500   -10.600    -2.800  
+901030 48194.00 I   .236208  .000272   .149592  .000419  I -.2434364  .0000346  2.9176 0.0210  I   -11.317     .923    -1.900     .169   .236800   .149200  -.2435300   -10.900    -2.800  
+901031 48195.00 I   .234410  .000307   .147255  .000441  I -.2464136  .0000272  3.0145 0.0189  I   -11.651     .923    -2.035     .169   .235100   .147300  -.2465500   -10.800    -2.600  
+9011 1 48196.00 I   .232557  .000257   .144959  .000404  I -.2494178  .0000150  2.9686 0.0157  I   -11.755     .996    -2.037     .152   .233000   .144000  -.2494400   -10.600    -2.600  
+9011 2 48197.00 I   .230548  .000360   .142681  .000270  I -.2523024  .0000157  2.7777 0.0124  I   -11.620     .692    -1.949     .111   .231200   .141800  -.2522500   -10.100    -2.600  
+9011 3 48198.00 I   .228263  .000473   .140412  .000220  I -.2549381  .0000197  2.4816 0.0132  I   -11.270     .500    -1.920     .298   .228500   .139400  -.2549800    -9.600    -2.400  
+9011 4 48199.00 I   .225562  .000484   .138140  .000201  I -.2572554  .0000213  2.1550 0.0145  I   -10.804     .500    -1.935     .298   .226000   .137100  -.2573500    -9.500    -2.400  
+9011 5 48200.00 I   .222305  .000514   .135834  .000200  I -.2592738  .0000212  1.9056 0.0184  I   -10.492     .500    -1.842     .298   .222400   .134500  -.2594700   -10.000    -2.600  
+9011 6 48201.00 I   .218641  .000438   .133500  .000141  I -.2611209  .0000300  1.8190 0.0169  I   -10.567     .500    -1.633     .298   .218900   .132000  -.2611900   -10.900    -2.300  
+9011 7 48202.00 I   .214857  .000376   .131159  .000170  I -.2629680  .0000264  1.9008 0.0214  I   -10.943     .372    -1.501     .107   .214800   .129500  -.2631600   -11.200    -2.100  
+9011 8 48203.00 I   .211202  .000292   .128824  .000186  I -.2649608  .0000306  2.0973 0.0202  I   -11.255     .142    -1.575     .123   .211000   .127600  -.2650800   -11.100    -2.100  
+9011 9 48204.00 I   .207788  .000292   .126509  .000186  I -.2671750  .0000306  2.3308 0.0216  I   -11.248     .142    -1.724     .123   .207300   .125300  -.2672500   -10.900    -2.200  
+901110 48205.00 I   .204666  .000291   .124230  .000226  I -.2696089  .0000306  2.5237 0.0207  I   -10.997     .142    -1.723     .123   .203900   .123000  -.2697100   -10.300    -2.300  
+901111 48206.00 I   .201775  .000188   .121988  .000232  I -.2721936  .0000278  2.6300 0.0171  I   -10.717     .162    -1.513     .140   .201100   .120800  -.2724300    -9.800    -2.200  
+901112 48207.00 I   .199017  .000158   .119764  .000203  I -.2748376  .0000154  2.6422 0.0149  I   -10.492     .152    -1.218     .133   .198000   .118600  -.2750100    -9.400    -2.100  
+901113 48208.00 I   .196297  .000141   .117541  .000204  I -.2774490  .0000108  2.5673 0.0094  I   -10.299     .206     -.945     .136   .195400   .116400  -.2775800    -9.000    -2.100  
+901114 48209.00 I   .193519  .000141   .115309  .000204  I -.2799492  .0000107  2.4233 0.0083  I   -10.141     .206     -.687     .136   .192800   .113800  -.2800400    -9.100    -1.900  
+901115 48210.00 I   .190608  .000190   .113086  .000250  I -.2822820  .0000126  2.2383 0.0090  I   -10.061     .206     -.459     .136   .189900   .111800  -.2823400    -9.000    -1.800  
+901116 48211.00 I   .187568  .000177   .110916  .000220  I -.2844222  .0000145  2.0425 0.0102  I   -10.119     .185     -.484     .135   .186900   .109500  -.2844000    -8.900    -1.800  
+901117 48212.00 I   .184445  .000189   .108853  .000350  I -.2863721  .0000161  1.8622 0.0127  I   -10.250     .399     -.798     .116   .183900   .107900  -.2863600    -8.900    -1.900  
+901118 48213.00 I   .181286  .000218   .106953  .000483  I -.2881592  .0000209  1.7198 0.0138  I   -10.285     .481    -1.136     .112   .180700   .106100  -.2881300    -8.900    -1.800  
+901119 48214.00 I   .178131  .000225   .105240  .000506  I -.2898352  .0000224  1.6481 0.0152  I   -10.021     .580    -1.186     .298   .177700   .104400  -.2898400    -9.000    -1.900  
+901120 48215.00 I   .175047  .000225   .103600  .000506  I -.2914843  .0000221  1.6632 0.0149  I    -9.368     .580     -.974     .298   .174700   .102800  -.2915300    -9.100    -1.900  
+901121 48216.00 I   .172026  .000230   .102002  .000474  I -.2931847  .0000197  1.7475 0.0149  I    -8.648     .580     -.732     .298   .171500   .101200  -.2932900    -9.200    -1.600  
+901122 48217.00 I   .169017  .000223   .100466  .000494  I -.2949979  .0000200  1.8874 0.0142  I    -8.373     .575     -.651     .298   .168400   .099600  -.2951400    -9.300    -1.600  
+901123 48218.00 I   .165974  .000244   .098992  .000421  I -.2969738  .0000204  2.0701 0.0126  I    -8.595     .531     -.685     .298   .165400   .097800  -.2970900    -9.300    -1.500  
+901124 48219.00 I   .162854  .000230   .097582  .000272  I -.2991467  .0000154  2.2785 0.0134  I    -8.985     .531     -.695     .298   .162300   .096300  -.2992100    -9.400    -1.300  
+901125 48220.00 I   .159599  .000272   .096223  .000143  I -.3015319  .0000174  2.4903 0.0131  I    -9.224     .338     -.690     .126   .159200   .094800  -.3015500    -9.200    -1.300  
+901126 48221.00 I   .156136  .000258   .094901  .000139  I -.3041180  .0000211  2.6743 0.0128  I    -9.307     .305     -.762     .115   .155800   .093300  -.3041400    -9.000    -1.300  
+901127 48222.00 I   .152413  .000305   .093609  .000234  I -.3068584  .0000188  2.7920 0.0143  I    -9.369     .391     -.846     .177   .152200   .092400  -.3068700    -8.800    -1.300  
+901128 48223.00 I   .148427  .000326   .092345  .000242  I -.3096706  .0000193  2.8154 0.0137  I    -9.474     .401     -.709     .200   .147900   .091200  -.3097300    -8.300    -1.500  
+901129 48224.00 I   .144337  .000326   .091103  .000242  I -.3124545  .0000199  2.7348 0.0139  I    -9.602     .401     -.429     .200   .143600   .090000  -.3125400    -7.900    -1.500  
+901130 48225.00 I   .140317  .000326   .089885  .000242  I -.3151098  .0000199  2.5632 0.0153  I    -9.691     .401     -.318     .200   .139300   .088800  -.3152100    -7.500    -1.400  
+9012 1 48226.00 I   .136535  .000383   .088739  .000354  I -.3175645  .0000233  2.3426 0.0116  I    -9.439     .458     -.431     .206   .135500   .087700  -.3176400    -7.000    -1.400  
+9012 2 48227.00 I   .132960  .000365   .087668  .000326  I -.3198018  .0000119  2.1426 0.0145  I    -8.764     .507     -.601     .213   .131700   .086600  -.3198800    -6.600    -1.400  
+9012 3 48228.00 I   .129504  .000444   .086654  .000331  I -.3218807  .0000171  2.0357 0.0111  I    -8.039     .479     -.585     .164   .128400   .085500  -.3219400    -6.200    -1.200  
+9012 4 48229.00 I   .126079  .000380   .085679  .000266  I -.3239147  .0000188  2.0532 0.0119  I    -7.766     .422     -.311     .165   .125100   .084500  -.3240300    -6.000    -1.200  
+9012 5 48230.00 I   .122590  .000380   .084722  .000266  I -.3260221  .0000165  2.1756 0.0126  I    -8.074     .422     -.016     .165   .121500   .083500  -.3261200    -6.900    -1.500  
+9012 6 48231.00 I   .119050  .000390   .083780  .000334  I -.3282816  .0000169  2.3450 0.0108  I    -8.507     .422     -.030     .165   .117900   .082600  -.3284000    -7.000    -1.600  
+9012 7 48232.00 I   .115520  .000313   .082857  .000347  I -.3307054  .0000140  2.4941 0.0121  I    -8.601     .461     -.364     .136   .114300   .081700  -.3308400    -7.100    -1.600  
+9012 8 48233.00 I   .112032  .000233   .081940  .000312  I -.3332465  .0000173  2.5733 0.0106  I    -8.434     .448     -.652     .298   .110800   .080800  -.3333800    -7.100    -1.700  
+9012 9 48234.00 I   .108594  .000290   .081004  .000385  I -.3358221  .0000160  2.5629 0.0121  I    -8.327     .417     -.652     .298   .107300   .079900  -.3359400    -7.200    -1.700  
+901210 48235.00 I   .105159  .000275   .080000  .000365  I -.3383410  .0000168  2.4586 0.0111  I    -8.364     .417     -.441     .298   .103800   .078900  -.3384200    -7.200    -1.600  
+901211 48236.00 I   .101696  .000249   .078953  .000359  I -.3407106  .0000153  2.2684 0.0102  I    -8.415     .417     -.259     .298   .100400   .077900  -.3407500    -7.200    -1.600  
+901212 48237.00 I   .098177  .000162   .077921  .000443  I -.3428633  .0000116  2.0349 0.0099  I    -8.443     .421     -.200     .298   .097100   .076900  -.3429000    -7.200    -1.500  
+901213 48238.00 I   .094582  .000187   .076908  .000480  I -.3447823  .0000127  1.8071 0.0085  I    -8.454     .353     -.113     .114   .093700   .075800  -.3448300    -7.100    -1.400  
+901214 48239.00 I   .090989  .000187   .075839  .000480  I -.3464901  .0000125  1.6170 0.0108  I    -8.431     .353      .047     .114   .090400   .074700  -.3465700    -7.100    -1.300  
+901215 48240.00 I   .087493  .000169   .074656  .000501  I -.3480344  .0000174  1.4813 0.0097  I    -8.305     .364      .185     .116   .087200   .073500  -.3481300    -7.100    -1.200  
+901216 48241.00 I   .084124  .000160   .073460  .000484  I -.3494722  .0000149  1.4040 0.0108  I    -8.147     .427      .135     .113   .083900   .072500  -.3495700    -7.100    -1.100  
+901217 48242.00 I   .080833  .000146   .072344  .000434  I -.3508638  .0000128  1.3907 0.0110  I    -8.037     .423      .003     .129   .080600   .071500  -.3509700    -7.100     -.900  
+901218 48243.00 I   .077561  .000184   .071380  .000364  I -.3522759  .0000163  1.4443 0.0107  I    -7.999     .421     -.026     .139   .077200   .070600  -.3523800    -7.100     -.800  
+901219 48244.00 I   .074250  .000186   .070638  .000308  I -.3537777  .0000171  1.5737 0.0138  I    -8.092     .476      .036     .124   .073700   .069800  -.3538900    -7.200     -.700  
+901220 48245.00 I   .070866  .000186   .070146  .000308  I -.3554434  .0000222  1.7633 0.0142  I    -8.252     .476      .117     .124   .070200   .069200  -.3555600    -7.200     -.700  
+901221 48246.00 I   .067377  .000185   .069860  .000333  I -.3573110  .0000227  1.9729 0.0146  I    -8.381     .515      .132     .134   .066500   .068600  -.3574000    -7.100     -.800  
+901222 48247.00 I   .063775  .000185   .069730  .000375  I -.3593874  .0000191  2.1770 0.0253  I    -8.297     .514      .063     .144   .062800   .068200  -.3594600    -7.100     -.900  
+901223 48248.00 I   .060069  .000201   .069705  .000436  I -.3616542  .0000452  2.3489 0.0235  I    -7.960     .594     -.016     .140   .058900   .068000  -.3617100    -7.100     -.900  
+901224 48249.00 I   .056270  .000389   .069732  .000258  I -.3640664  .0000430  2.4646 0.0320  I    -7.504     .594     -.072     .140   .055000   .067800  -.3641200    -7.000    -1.000  
+901225 48250.00 I   .052379  .000366   .069786  .000243  I -.3665589  .0000454  2.5067 0.0269  I    -7.092     .571     -.118     .134   .050900   .067700  -.3666200    -7.000    -1.100  
+901226 48251.00 I   .048355  .000299   .069869  .000328  I -.3690509  .0000322  2.4621 0.0256  I    -6.893     .571     -.101     .134   .046900   .067700  -.3691300    -6.900    -1.100  
+901227 48252.00 I   .044145  .000321   .069989  .000425  I -.3714556  .0000237  2.3349 0.0211  I    -7.061     .528      .023     .211   .042800   .067800  -.3715300    -6.900    -1.200  
+901228 48253.00 I   .039730  .000325   .070144  .000434  I -.3737009  .0000272  2.1483 0.0185  I    -7.614     .528      .125     .211   .038700   .067900  -.3737700    -6.800    -1.100  
+901229 48254.00 I   .035225  .000325   .070309  .000434  I -.3757491  .0000285  1.9523 0.0197  I    -8.167     .528      .061     .211   .034600   .068100  -.3757900    -6.800    -1.100  
+901230 48255.00 I   .030776  .000325   .070470  .000434  I -.3776271  .0000286  1.8211 0.0184  I    -8.243     .528     -.090     .211   .030700   .068400  -.3776600    -6.800    -1.000  
+901231 48256.00 I   .026474  .000249   .070678  .000529  I -.3794330  .0000234  1.8149 0.0166  I    -7.885     .538     -.098     .250   .026900   .068800  -.3794600    -6.700     -.900  
+91 1 1 48257.00 I   .022389  .000235   .070986  .000487  I  .6186975  .0000170  1.9454 0.0151  I    -7.510     .598      .134     .204   .023100   .069300   .6186700    -6.700     -.800  
+91 1 2 48258.00 I   .018591  .000253   .071447  .000317  I  .6166447  .0000190  2.1705 0.0106  I    -7.378     .754      .394     .171   .019500   .070000   .6166000    -6.600     -.800  
+91 1 3 48259.00 I   .015151  .000253   .072113  .000317  I  .6143495  .0000125  2.4165 0.0174  I    -7.377     .754      .386     .171   .016100   .070700   .6142800    -6.600     -.700  
+91 1 4 48260.00 I   .012118  .000334   .073018  .000392  I  .6118302  .0000292  2.6071 0.0133  I    -7.330     .737      .106     .191   .013200   .072200   .6117600    -6.600     -.900  
+91 1 5 48261.00 I   .009382  .000291   .074132  .000359  I  .6091699  .0000235  2.6940 0.0174  I    -7.116     .737     -.012     .191   .010000   .073200   .6091200    -6.700     -.900  
+91 1 6 48262.00 I   .006782  .000345   .075384  .000278  I  .6064782  .0000191  2.6730 0.0195  I    -6.952     .657      .157     .181   .006800   .074300   .6064400    -6.700     -.900  
+91 1 7 48263.00 I   .004177  .000391   .076691  .000295  I  .6038514  .0000310  2.5695 0.0184  I    -7.033     .591      .248     .179   .003600   .075500   .6038400    -6.600    -1.000  
+91 1 8 48264.00 I   .001418  .000381   .077970  .000288  I  .6013588  .0000315  2.4071 0.0221  I    -7.208     .473      .045     .168   .000400   .076600   .6013600    -6.600    -1.000  
+91 1 9 48265.00 I  -.001661  .000381   .079172  .000288  I  .5990451  .0000315  2.2209 0.0230  I    -7.248     .428     -.143     .152  -.002800   .077800   .5990600    -6.500    -1.000  
+91 110 48266.00 I  -.005050  .000366   .080296  .000301  I  .5969117  .0000334  2.0505 0.0204  I    -7.294     .339     -.146     .121  -.006100   .078800   .5969200    -6.500    -1.000  
+91 111 48267.00 I  -.008653  .000300   .081354  .000296  I  .5949329  .0000258  1.9138 0.0255  I    -7.460     .521     -.042     .102  -.009500   .079800   .5949300    -6.400    -1.000  
+91 112 48268.00 I  -.012377  .000206   .082340  .000345  I  .5930695  .0000386  1.8211 0.0196  I    -7.638     .548      .008     .298  -.013000   .080700   .5930700    -6.400    -1.000  
+91 113 48269.00 I  -.016122  .000208   .083186  .000428  I  .5912743  .0000294  1.7778 0.0235  I    -7.753     .629     -.007     .298  -.016600   .081500   .5912800    -6.400    -1.000  
+91 114 48270.00 I  -.019806  .000292   .083830  .000431  I  .5894949  .0000267  1.7917 0.0187  I    -7.869     .559      .062     .122  -.020300   .082100   .5895000    -6.500     -.900  
+91 115 48271.00 I  -.023464  .000256   .084317  .000436  I  .5876705  .0000230  1.8668 0.0144  I    -7.962     .571      .261     .147  -.024000   .082700   .5876600    -6.600     -.900  
+91 116 48272.00 I  -.027175  .000208   .084736  .000445  I  .5857450  .0000107  1.9909 0.0134  I    -7.901     .499      .404     .136  -.027700   .083300   .5857400    -6.700     -.800  
+91 117 48273.00 I  -.031011  .000231   .085171  .000444  I  .5836807  .0000136  2.1392 0.0093  I    -7.606     .284      .232     .165  -.031400   .083700   .5836800    -6.800     -.800  
+91 118 48274.00 I  -.034995  .000236   .085646  .000456  I  .5814692  .0000151  2.2799 0.0132  I    -7.207     .284     -.097     .165  -.035100   .084200   .5814600    -6.900     -.700  
+91 119 48275.00 I  -.039044  .000236   .086098  .000456  I  .5791302  .0000227  2.3929 0.0134  I    -6.976     .284     -.338     .165  -.038700   .084800   .5791000    -7.000     -.700  
+91 120 48276.00 I  -.043017  .000347   .086553  .000364  I  .5766972  .0000221  2.4646 0.0149  I    -6.944     .299     -.403     .134  -.042200   .085400   .5766400    -7.100     -.700  
+91 121 48277.00 I  -.046776  .000253   .087092  .000319  I  .5742211  .0000193  2.4758 0.0163  I    -6.989     .275     -.314     .142  -.045600   .086100   .5741300    -7.200     -.700  
+91 122 48278.00 I  -.050215  .000318   .087788  .000285  I  .5717685  .0000240  2.4181 0.0159  I    -7.048     .218     -.151     .144  -.049000   .086900   .5716400    -7.300     -.700  
+91 123 48279.00 I  -.053236  .000351   .088712  .000283  I  .5694044  .0000253  2.3020 0.0172  I    -7.174     .218      .019     .144  -.052200   .087800   .5692800    -7.300     -.700  
+91 124 48280.00 I  -.055812  .000351   .089927  .000283  I  .5671813  .0000246  2.1356 0.0164  I    -7.469     .218      .128     .144  -.055300   .088900   .5670700    -7.400     -.800  
+91 125 48281.00 I  -.058173  .000330   .091415  .000261  I  .5651398  .0000210  1.9494 0.0156  I    -7.933     .218      .155     .144  -.058500   .090200   .5650600    -7.300     -.800  
+91 126 48282.00 I  -.060588  .000331   .093097  .000376  I  .5632680  .0000191  1.8067 0.0160  I    -8.348     .378      .015     .123  -.061800   .091500   .5632300    -7.200     -.900  
+91 127 48283.00 I  -.063289  .000353   .094881  .000497  I  .5614935  .0000241  1.7625 0.0134  I    -8.406     .449     -.300     .298  -.065100   .092900   .5614900    -7.100     -.900  
+91 128 48284.00 I  -.066451  .000364   .096671  .000449  I  .5597015  .0000189  1.8426 0.0146  I    -7.969     .515     -.610     .298  -.068600   .094400   .5597000    -6.800    -1.000  
+91 129 48285.00 I  -.070208  .000311   .098382  .000447  I  .5577729  .0000164  2.0287 0.0132  I    -7.170     .450     -.738     .298  -.072100   .096000   .5577700    -6.500    -1.100  
+91 130 48286.00 I  -.074442  .000361   .100022  .000411  I  .5556263  .0000184  2.2681 0.0104  I    -6.388     .450     -.746     .298  -.075800   .097500   .5556000    -6.200    -1.200  
+91 131 48287.00 I  -.078910  .000338   .101594  .000385  I  .5532423  .0000127  2.4906 0.0121  I    -5.811     .431     -.753     .298  -.079600   .099100   .5531700    -5.800    -1.400  
+91 2 1 48288.00 I  -.083389  .000392   .103081  .000366  I  .5506707  .0000157  2.6362 0.0098  I    -5.482     .335     -.738     .103  -.083500   .100600   .5505600    -5.500    -1.500  
+91 2 2 48289.00 I  -.087740  .000394   .104469  .000213  I  .5480040  .0000150  2.6794 0.0109  I    -5.521     .326     -.698     .104  -.087400   .102200   .5478600    -5.100    -1.600  
+91 2 3 48290.00 I  -.091885  .000394   .105752  .000213  I  .5453487  .0000152  2.6123 0.0127  I    -5.999     .288     -.667     .298  -.090900   .103500   .5452100    -5.600    -1.800  
+91 2 4 48291.00 I  -.095784  .000408   .106978  .000237  I  .5428091  .0000205  2.4562 0.0117  I    -6.696     .328     -.669     .298  -.094400   .104800   .5426800    -5.500    -1.900  
+91 2 5 48292.00 I  -.099377  .000380   .108224  .000248  I  .5404512  .0000177  2.2555 0.0143  I    -7.245     .293     -.728     .162  -.097900   .106200   .5403600    -5.400    -1.900  
+91 2 6 48293.00 I  -.102658  .000371   .109555  .000275  I  .5382971  .0000198  2.0577 0.0135  I    -7.480     .176     -.807     .201  -.101500   .107800   .5382100    -5.300    -2.000  
+91 2 7 48294.00 I  -.105703  .000371   .110999  .000275  I  .5363232  .0000205  1.8976 0.0146  I    -7.517     .176     -.780     .201  -.105000   .109400   .5362300    -5.200    -2.000  
+91 2 8 48295.00 I  -.108620  .000327   .112573  .000278  I  .5344856  .0000215  1.7864 0.0129  I    -7.461     .176     -.625     .201  -.108400   .111100   .5343900    -5.100    -2.100  
+91 2 9 48296.00 I  -.111491  .000290   .114302  .000256  I  .5327295  .0000155  1.7379 0.0121  I    -7.282     .193     -.686     .227  -.111700   .112900   .5326300    -5.000    -2.100  
+91 210 48297.00 I  -.114367  .000311   .116185  .000203  I  .5309856  .0000111  1.7621 0.0090  I    -6.970     .337    -1.042     .209  -.114900   .114800   .5308900    -5.000    -2.200  
+91 211 48298.00 I  -.117315  .000292   .118198  .000224  I  .5291822  .0000090  1.8558 0.0070  I    -6.671     .363    -1.419     .200  -.118000   .116900   .5290900    -4.900    -2.200  
+91 212 48299.00 I  -.120404  .000290   .120310  .000180  I  .5272551  .0000085  2.0063 0.0061  I    -6.553     .349    -1.570     .179  -.121100   .119100   .5271700    -4.900    -2.200  
+91 213 48300.00 I  -.123664  .000287   .122513  .000181  I  .5251586  .0000083  2.1898 0.0058  I    -6.611     .349    -1.453     .179  -.124100   .121400   .5251000    -5.000    -2.200  
+91 214 48301.00 I  -.126908  .000302   .124910  .000179  I  .5228707  .0000078  2.3875 0.0072  I    -6.635     .349    -1.368     .179  -.127100   .123900   .5228300    -5.100    -2.200  
+91 215 48302.00 I  -.130112  .000295   .127563  .000171  I  .5203904  .0000118  2.5646 0.0084  I    -6.576     .570    -1.369     .157  -.130100   .126500   .5203900    -5.200    -2.200  
+91 216 48303.00 I  -.133270  .000322   .130449  .000145  I  .5177638  .0000149  2.6748 0.0122  I    -6.571     .637    -1.365     .133  -.133100   .129200   .5177900    -5.300    -2.300  
+91 217 48304.00 I  -.136368  .000261   .133521  .000309  I  .5150737  .0000214  2.6861 0.0148  I    -6.721     .697    -1.356     .103  -.136100   .132000   .5151300    -5.500    -2.300  
+91 218 48305.00 I  -.139405  .000324   .136727  .000397  I  .5124253  .0000256  2.5961 0.0156  I    -6.999     .793    -1.374     .298  -.139100   .134900   .5124700    -5.600    -2.300  
+91 219 48306.00 I  -.142389  .000285   .140004  .000487  I  .5099051  .0000226  2.4353 0.0163  I    -7.288     .793    -1.409     .298  -.142200   .137800   .5099100    -5.800    -2.400  
+91 220 48307.00 I  -.145325  .000301   .143291  .000462  I  .5075665  .0000202  2.2393 0.0175  I    -7.482     .651    -1.429     .298  -.145300   .140800   .5075200    -5.900    -2.400  
+91 221 48308.00 I  -.148250  .000290   .146514  .000534  I  .5054215  .0000267  2.0584 0.0165  I    -7.553     .302    -1.416     .298  -.148300   .143800   .5053200    -6.100    -2.400  
+91 222 48309.00 I  -.151190  .000252   .149542  .000462  I  .5034249  .0000260  1.9520 0.0193  I    -7.587     .302    -1.468     .298  -.151300   .146800   .5033000    -6.200    -2.500  
+91 223 48310.00 I  -.154175  .000251   .152268  .000453  I  .5014858  .0000278  1.9409 0.0185  I    -7.667     .280    -1.725     .298  -.154300   .149800   .5013600    -6.300    -2.500  
+91 224 48311.00 I  -.157177  .000232   .154778  .000401  I  .4995116  .0000264  2.0244 0.0184  I    -7.708     .306    -2.149     .298  -.157100   .152800   .4994000    -6.300    -2.600  
+91 225 48312.00 I  -.160098  .000243   .157240  .000364  I  .4974054  .0000241  2.2026 0.0199  I    -7.582     .333    -2.536     .298  -.159900   .155700   .4973000    -6.400    -2.600  
+91 226 48313.00 I  -.162850  .000202   .159794  .000263  I  .4950844  .0000299  2.4467 0.0166  I    -7.253     .446    -2.630     .298  -.162600   .158600   .4949800    -6.400    -2.700  
+91 227 48314.00 I  -.165376  .000202   .162467  .000263  I  .4925069  .0000229  2.7060 0.0182  I    -6.828     .473    -2.375     .298  -.165200   .161500   .4923900    -6.400    -2.700  
+91 228 48315.00 I  -.167647  .000200   .165250  .000262  I  .4896908  .0000208  2.9102 0.0158  I    -6.463     .473    -1.961     .298  -.167700   .164300   .4895600    -6.400    -2.800  
+91 3 1 48316.00 I  -.169720  .000266   .168114  .000262  I  .4867258  .0000217  2.9967 0.0145  I    -6.350     .518    -1.712     .298  -.170100   .167200   .4866100    -6.400    -2.800  
+91 3 2 48317.00 I  -.171679  .000249   .171052  .000247  I  .4837438  .0000203  2.9440 0.0181  I    -6.423     .439    -1.710     .298  -.172400   .170100   .4836600    -6.400    -2.800  
+91 3 3 48318.00 I  -.173596  .000372   .174060  .000264  I  .4808788  .0000289  2.7683 0.0192  I    -6.584     .470    -1.861     .298  -.174500   .173000   .4808300    -6.400    -2.900  
+91 3 4 48319.00 I  -.175545  .000380   .177130  .000164  I  .4782346  .0000326  2.5103 0.0217  I    -6.804     .367    -2.056     .298  -.176500   .175900   .4782300    -6.500    -3.000  
+91 3 5 48320.00 I  -.177585  .000393   .180250  .000174  I  .4758656  .0000323  2.2301 0.0214  I    -7.014     .223    -2.173     .298  -.178400   .179300   .4758600    -6.300    -2.400  
+91 3 6 48321.00 I  -.179691  .000431   .183430  .000208  I  .4737648  .0000277  1.9787 0.0187  I    -7.138     .223    -2.170     .298  -.180200   .182700   .4737500    -6.300    -2.400  
+91 3 7 48322.00 I  -.181814  .000322   .186689  .000199  I  .4718903  .0000188  1.7808 0.0168  I    -7.128     .186    -2.125     .298  -.181900   .186200   .4718600    -6.300    -2.500  
+91 3 8 48323.00 I  -.183873  .000316   .190040  .000202  I  .4701765  .0000191  1.6629 0.0135  I    -6.910     .167    -2.205     .298  -.183500   .189700   .4701000    -6.400    -2.600  
+91 3 9 48324.00 I  -.185715  .000315   .193494  .000269  I  .4685319  .0000194  1.6428 0.0139  I    -6.464     .167    -2.473     .298  -.185200   .193200   .4684200    -6.500    -2.600  
+91 310 48325.00 I  -.187247  .000310   .197079  .000269  I  .4668623  .0000203  1.7085 0.0117  I    -5.902     .150    -2.802     .298  -.186800   .196700   .4667300    -6.600    -2.700  
+91 311 48326.00 I  -.188552  .000232   .200801  .000263  I  .4650913  .0000132  1.8449 0.0130  I    -5.448     .791    -3.012     .298  -.188400   .200300   .4649500    -6.700    -2.800  
+91 312 48327.00 I  -.189749  .000424   .204643  .000187  I  .4631528  .0000163  2.0402 0.0112  I    -5.317     .460    -3.024     .298  -.189900   .203900   .4630100    -6.900    -2.900  
+91 313 48328.00 I  -.190961  .000510   .208577  .000182  I  .4610003  .0000182  2.2672 0.0124  I    -5.544     .561    -2.927     .298  -.191400   .207600   .4608400    -7.000    -3.000  
+91 314 48329.00 I  -.192341  .000510   .212539  .000182  I  .4586217  .0000186  2.4843 0.0130  I    -5.948     .650    -2.852     .298  -.192800   .211300   .4584300    -7.100    -3.200  
+91 315 48330.00 I  -.193994  .000510   .216441  .000182  I  .4560330  .0000185  2.6975 0.0129  I    -6.350     .650    -2.822     .298  -.194200   .215000   .4557900    -7.100    -3.200  
+91 316 48331.00 I  -.195667  .000505   .220202  .000135  I  .4532397  .0000178  2.8718 0.0126  I    -6.707     .710    -2.766     .298  -.195600   .218700   .4529900    -7.100    -3.300  
+91 317 48332.00 I  -.197292  .000468   .223842  .000131  I  .4503304  .0000171  2.9231 0.0140  I    -6.887     .634    -2.692     .298  -.197000   .222400   .4501100    -7.000    -3.400  
+91 318 48333.00 I  -.198813  .000379   .227397  .000167  I  .4474393  .0000216  2.8371 0.0183  I    -6.928     .627    -2.682     .298  -.198400   .226100   .4472800    -6.900    -3.500  
+91 319 48334.00 I  -.200148  .000360   .230902  .000232  I  .4446940  .0000323  2.6379 0.0196  I    -6.963     .562    -2.791     .298  -.199700   .229900   .4445900    -6.800    -3.600  
+91 320 48335.00 I  -.201247  .000255   .234395  .000242  I  .4421798  .0000326  2.3900 0.0227  I    -6.974     .324    -3.001     .298  -.201100   .233600   .4421300    -6.600    -3.600  
+91 321 48336.00 I  -.202195  .000227   .237934  .000224  I  .4399037  .0000318  2.1730 0.0211  I    -6.848     .324    -3.244     .298  -.202600   .237300   .4398900    -6.400    -3.700  
+91 322 48337.00 I  -.203113  .000305   .241573  .000191  I  .4378071  .0000267  2.0360 0.0247  I    -6.577     .607    -3.461     .298  -.204000   .241100   .4378100    -6.200    -3.800  
+91 323 48338.00 I  -.204155  .000306   .245328  .000213  I  .4357970  .0000378  2.0029 0.0208  I    -6.261     .692    -3.657     .298  -.205400   .245000   .4358000    -6.000    -3.800  
+91 324 48339.00 I  -.205483  .000305   .249211  .000200  I  .4337687  .0000319  2.0676 0.0247  I    -5.961     .718    -3.888     .298  -.206900   .248800   .4337400    -5.800    -3.900  
+91 325 48340.00 I  -.207237  .000298   .253232  .000168  I  .4316295  .0000317  2.2293 0.0205  I    -5.617     .801    -4.176     .298  -.208400   .252800   .4315400    -5.600    -3.900  
+91 326 48341.00 I  -.209344  .000362   .257362  .000170  I  .4292805  .0000257  2.4797 0.0205  I    -5.165     .801    -4.393     .298  -.209800   .256700   .4291300    -5.400    -4.000  
+91 327 48342.00 I  -.211542  .000365   .261519  .000166  I  .4266726  .0000260  2.7224 0.0191  I    -4.907     .976    -4.402     .298  -.211300   .260700   .4265000    -5.200    -4.000  
+91 328 48343.00 I  -.213596  .000394   .265659  .000159  I  .4238689  .0000282  2.8655 0.0199  I    -4.920    1.093    -4.183     .112  -.212600   .264700   .4237100    -5.000    -4.100  
+91 329 48344.00 I  -.215298  .000386   .269752  .000176  I  .4209839  .0000301  2.8818 0.0181  I    -5.118    1.093    -3.877     .112  -.214000   .268800   .4208500    -4.900    -4.200  
+91 330 48345.00 I  -.216509  .000438   .273776  .000358  I  .4181445  .0000227  2.7806 0.0176  I    -5.334    1.168    -3.696     .127  -.215100   .272900   .4180100    -4.600    -4.200  
+91 331 48346.00 I  -.217320  .000427   .277756  .000350  I  .4154460  .0000183  2.6097 0.0144  I    -5.428    1.033    -3.744     .112  -.216200   .277000   .4152800    -4.400    -4.300  
+91 4 1 48347.00 I  -.217857  .000403   .281739  .000324  I  .4129329  .0000177  2.4156 0.0111  I    -5.355     .958    -3.941     .165  -.217200   .281000   .4127500    -4.200    -4.400  
+91 4 2 48348.00 I  -.218249  .000376   .285770  .000441  I  .4106103  .0000127  2.2350 0.0109  I    -5.172     .683    -4.111     .170  -.218100   .285200   .4104000    -4.100    -4.400  
+91 4 3 48349.00 I  -.218610  .000376   .289880  .000441  I  .4084511  .0000128  2.0897 0.0088  I    -4.967     .683    -4.150     .170  -.218800   .289300   .4082400    -4.000    -4.500  
+91 4 4 48350.00 I  -.219006  .000376   .294038  .000441  I  .4064165  .0000123  1.9875 0.0108  I    -4.883     .683    -4.132     .170  -.219600   .293400   .4062000    -4.000    -4.600  
+91 4 5 48351.00 I  -.219449  .000336   .298196  .000410  I  .4044592  .0000174  1.9362 0.0103  I    -4.834     .683    -4.203     .170  -.220200   .297300   .4042500    -4.100    -4.600  
+91 4 6 48352.00 I  -.219906  .000303   .302322  .000261  I  .4025264  .0000164  1.9382 0.0144  I    -4.711     .606    -4.438     .172  -.220600   .301400   .4023300    -4.100    -4.700  
+91 4 7 48353.00 I  -.220303  .000213   .306406  .000221  I  .4005663  .0000229  1.9897 0.0145  I    -4.535     .118    -4.731     .114  -.220700   .305400   .4004000    -4.100    -4.700  
+91 4 8 48354.00 I  -.220558  .000200   .310445  .000166  I  .3985331  .0000240  2.0828 0.0166  I    -4.408     .237    -4.865     .118  -.220700   .309400   .3983700    -4.100    -4.800  
+91 4 9 48355.00 I  -.220598  .000200   .314438  .000166  I  .3963880  .0000240  2.2140 0.0160  I    -4.435     .237    -4.746     .118  -.220400   .313400   .3962200    -4.100    -4.900  
+91 410 48356.00 I  -.220373  .000230   .318404  .000143  I  .3940960  .0000211  2.3725 0.0133  I    -4.593     .237    -4.552     .118  -.219900   .317500   .3939200    -4.100    -4.900  
+91 411 48357.00 I  -.219857  .000198   .322358  .000115  I  .3916419  .0000114  2.5343 0.0124  I    -4.697     .276    -4.512     .107  -.219300   .321500   .3914500    -4.200    -5.000  
+91 412 48358.00 I  -.219056  .000227   .326309  .000163  I  .3890362  .0000129  2.6696 0.0080  I    -4.612     .339    -4.584     .298  -.218600   .325500   .3888200    -4.200    -5.000  
+91 413 48359.00 I  -.218014  .000174   .330253  .000132  I  .3863229  .0000111  2.7444 0.0085  I    -4.379     .435    -4.544     .298  -.217800   .329500   .3861200    -4.300    -5.100  
+91 414 48360.00 I  -.216806  .000153   .334184  .000121  I  .3835812  .0000112  2.7178 0.0081  I    -4.256     .528    -4.288     .298  -.216900   .333500   .3834300    -4.400    -5.200  
+91 415 48361.00 I  -.215546  .000147   .338103  .000157  I  .3809266  .0000117  2.5733 0.0086  I    -4.453     .528    -4.023     .298  -.216000   .337400   .3808300    -4.500    -5.200  
+91 416 48362.00 I  -.214356  .000252   .342027  .000159  I  .3784616  .0000130  2.3479 0.0092  I    -4.898     .468    -4.030     .298  -.215200   .341400   .3784200    -4.600    -5.300  
+91 417 48363.00 I  -.213352  .000271   .345978  .000216  I  .3762352  .0000141  2.1094 0.0096  I    -5.316     .472    -4.368     .298  -.214500   .345300   .3762400    -4.800    -5.400  
+91 418 48364.00 I  -.212598  .000271   .349971  .000204  I  .3742255  .0000142  1.9229 0.0103  I    -5.479     .472    -4.811     .298  -.213800   .349200   .3742100    -5.100    -5.500  
+91 419 48365.00 I  -.212116  .000271   .353997  .000204  I  .3723417  .0000151  1.8796 0.0099  I    -5.340     .419    -5.119     .298  -.213200   .353200   .3722700    -5.200    -5.600  
+91 420 48366.00 I  -.211712  .000325   .357991  .000226  I  .3704127  .0000138  1.9971 0.0101  I    -5.100     .310    -5.305     .298  -.212800   .357100   .3702800    -5.400    -5.800  
+91 421 48367.00 I  -.211353  .000303   .361955  .000229  I  .3683187  .0000133  2.2009 0.0089  I    -4.950     .310    -5.450     .298  -.212400   .361000   .3681400    -5.500    -5.900  
+91 422 48368.00 I  -.211093  .000262   .365896  .000232  I  .3660009  .0000113  2.4348 0.0090  I    -4.888     .308    -5.578     .298  -.212200   .365000   .3657900    -5.600    -6.100  
+91 423 48369.00 I  -.210987  .000445   .369820  .000321  I  .3634567  .0000121  2.6459 0.0083  I    -4.781     .352    -5.646     .298  -.212000   .368900   .3632200    -5.600    -6.300  
+91 424 48370.00 I  -.211028  .000445   .373708  .000321  I  .3607315  .0000121  2.7896 0.0075  I    -4.551     .316    -5.561     .298  -.211900   .372700   .3605000    -5.500    -6.600  
+91 425 48371.00 I  -.211077  .000445   .377499  .000321  I  .3579095  .0000089  2.8371 0.0099  I    -4.358     .316    -5.267     .298  -.211800   .376600   .3576800    -5.400    -6.800  
+91 426 48372.00 I  -.211001  .000484   .381195  .000341  I  .3550906  .0000156  2.7847 0.0077  I    -4.312     .252    -4.897     .298  -.211700   .380400   .3548800    -5.200    -7.000  
+91 427 48373.00 I  -.210716  .000413   .384817  .000306  I  .3523675  .0000126  2.6501 0.0103  I    -4.342     .380    -4.727     .299  -.211500   .384200   .3521800    -5.000    -7.300  
+91 428 48374.00 I  -.210235  .000490   .388395  .000348  I  .3498073  .0000134  2.4647 0.0094  I    -4.325     .397    -4.873     .338  -.211200   .388000   .3496500    -4.800    -7.400  
+91 429 48375.00 I  -.209581  .000188   .391966  .000369  I  .3474433  .0000139  2.2638 0.0101  I    -4.234     .397    -5.223     .338  -.210700   .391700   .3473000    -4.600    -7.600  
+91 430 48376.00 I  -.208780  .000178   .395564  .000303  I  .3452739  .0000152  2.0804 0.0103  I    -4.196     .399    -5.528     .346  -.210000   .395400   .3451300    -4.500    -7.700  
+91 5 1 48377.00 I  -.207855  .000178   .399210  .000303  I  .3432674  .0000152  1.9424 0.0101  I    -4.323     .352    -5.593     .310  -.209200   .399100   .3431200    -4.300    -7.800  
+91 5 2 48378.00 I  -.206791  .000178   .402890  .000303  I  .3413683  .0000134  1.8669 0.0123  I    -4.506     .352    -5.526     .310  -.208200   .402800   .3412100    -4.200    -7.800  
+91 5 3 48379.00 I  -.205572  .000108   .406589  .000417  I  .3395114  .0000193  1.8580 0.0106  I    -4.559     .146    -5.577     .153  -.207000   .406500   .3393200    -4.100    -7.800  
+91 5 4 48380.00 I  -.204205  .000148   .410310  .000422  I  .3376298  .0000164  1.9166 0.0111  I    -4.478     .257    -5.739     .202  -.205400   .409500   .3374200    -3.800    -7.600  
+91 5 5 48381.00 I  -.202702  .000149   .414042  .000292  I  .3356575  .0000109  2.0373 0.0101  I    -4.345     .257    -5.881     .202  -.203900   .413200   .3354200    -3.900    -7.400  
+91 5 6 48382.00 I  -.201075  .000138   .417773  .000260  I  .3335389  .0000117  2.2068 0.0075  I    -4.170     .426    -5.861     .199  -.202400   .417000   .3332900    -4.000    -7.300  
+91 5 7 48383.00 I  -.199327  .000207   .421520  .000251  I  .3312343  .0000104  2.4052 0.0075  I    -3.938     .472    -5.643     .212  -.200700   .420700   .3309700    -4.200    -7.100  
+91 5 8 48384.00 I  -.197475  .000211   .425296  .000252  I  .3287302  .0000093  2.5987 0.0071  I    -3.766     .429    -5.402     .193  -.198900   .424400   .3284700    -4.300    -7.000  
+91 5 9 48385.00 I  -.195569  .000215   .429075  .000204  I  .3260494  .0000097  2.7548 0.0069  I    -3.882     .429    -5.315     .193  -.197000   .428200   .3257900    -4.400    -6.800  
+91 510 48386.00 I  -.193643  .000212   .432845  .000216  I  .3232425  .0000101  2.8454 0.0076  I    -4.231     .487    -5.414     .150  -.195100   .431900   .3229800    -4.500    -6.600  
+91 511 48387.00 I  -.191707  .000242   .436597  .000136  I  .3203892  .0000116  2.8444 0.0081  I    -4.546     .410    -5.495     .142  -.193000   .435600   .3201200    -4.700    -6.400  
+91 512 48388.00 I  -.189725  .000249   .440306  .000143  I  .3175869  .0000127  2.7439 0.0086  I    -4.762     .204    -5.377     .105  -.190700   .439200   .3173100    -4.900    -6.300  
+91 513 48389.00 I  -.187655  .000249   .443949  .000143  I  .3149288  .0000127  2.5613 0.0109  I    -5.019     .204    -5.165     .105  -.188400   .442800   .3146500    -5.100    -6.100  
+91 514 48390.00 I  -.185453  .000225   .447502  .000166  I  .3124747  .0000178  2.3474 0.0109  I    -5.347     .215    -5.087     .116  -.185900   .446400   .3122100    -5.400    -6.000  
+91 515 48391.00 I  -.183061  .000220   .450942  .000164  I  .3102256  .0000178  2.1587 0.0126  I    -5.545     .353    -5.200     .298  -.183200   .449800   .3099900    -5.800    -5.800  
+91 516 48392.00 I  -.180442  .000220   .454273  .000164  I  .3081325  .0000178  2.0444 0.0151  I    -5.432     .353    -5.414     .298  -.180500   .453200   .3079300    -6.200    -5.600  
+91 517 48393.00 I  -.177606  .000238   .457530  .000191  I  .3061030  .0000244  2.0315 0.0127  I    -5.108     .403    -5.555     .298  -.177600   .456500   .3059200    -6.700    -5.500  
+91 518 48394.00 I  -.174586  .000267   .460741  .000158  I  .3040388  .0000181  2.1108 0.0137  I    -4.869     .623    -5.615     .298  -.174600   .459700   .3038700    -7.100    -5.400  
+91 519 48395.00 I  -.171472  .000218   .463903  .000134  I  .3018647  .0000126  2.2402 0.0112  I    -4.892     .623    -5.662     .298  -.171700   .462800   .3017100    -7.400    -5.300  
+91 520 48396.00 I  -.168371  .000215   .467004  .000132  I  .2995630  .0000132  2.3556 0.0078  I    -5.140     .607    -5.695     .298  -.168700   .465900   .2994200    -7.700    -5.200  
+91 521 48397.00 I  -.165388  .000212   .470030  .000114  I  .2971748  .0000091  2.4069 0.0079  I    -5.432     .675    -5.668     .298  -.165700   .468900   .2970500    -7.900    -5.100  
+91 522 48398.00 I  -.162556  .000212   .472974  .000114  I  .2947821  .0000086  2.3594 0.0063  I    -5.630     .550    -5.571     .298  -.162800   .471900   .2946900    -8.000    -5.000  
+91 523 48399.00 I  -.159759  .000212   .475856  .000114  I  .2924858  .0000087  2.2226 0.0065  I    -5.810     .550    -5.435     .298  -.159800   .474800   .2924200    -8.000    -5.000  
+91 524 48400.00 I  -.156924  .000113   .478719  .000125  I  .2903538  .0000097  2.0351 0.0062  I    -5.978     .380    -5.284     .298  -.156900   .477700   .2902800    -7.900    -5.000  
+91 525 48401.00 I  -.154015  .000118   .481596  .000116  I  .2884229  .0000089  1.8258 0.0080  I    -6.086     .313    -5.144     .298  -.154000   .480600   .2883200    -7.700    -5.100  
+91 526 48402.00 I  -.151055  .000160   .484485  .000185  I  .2866991  .0000128  1.6258 0.0078  I    -6.133     .231    -5.105     .109  -.151100   .483400   .2865400    -7.500    -5.200  
+91 527 48403.00 I  -.148081  .000160   .487372  .000181  I  .2851582  .0000129  1.4650 0.0104  I    -6.087     .231    -5.301     .109  -.148200   .486200   .2849100    -7.300    -5.300  
+91 528 48404.00 I  -.145115  .000157   .490241  .000170  I  .2837485  .0000163  1.3660 0.0119  I    -5.953     .273    -5.782     .180  -.145200   .489000   .2834100    -7.000    -5.400  
+91 529 48405.00 I  -.142177  .000152   .493080  .000171  I  .2824062  .0000199  1.3271 0.0173  I    -5.781     .422    -6.379     .172  -.142300   .491800   .2819600    -6.800    -5.500  
+91 530 48406.00 I  -.139273  .000146   .495891  .000177  I  .2810759  .0000305  1.3433 0.0255  I    -5.569     .422    -6.709     .172  -.139400   .494600   .2805200    -6.500    -5.600  
+91 531 48407.00 I  -.136397  .000198   .498678  .000226  I  .2797012  .0000469  1.4146 0.0208  I    -5.318     .579    -6.566     .207  -.136400   .497400   .2790300    -6.300    -5.700  
+91 6 1 48408.00 I  -.133530  .000321   .501446  .000242  I  .2782301  .0000282  1.5357 0.0276  I    -5.291     .457    -6.261     .197  -.133300   .500200   .2774600    -6.100    -5.900  
+91 6 2 48409.00 I  -.130632  .000320   .504185  .000269  I  .2766170  .0000291  1.6951 0.0203  I    -5.610     .428    -6.039     .181  -.130200   .502900   .2758000    -5.900    -6.100  
+91 6 3 48410.00 I  -.127650  .000320   .506887  .000269  I  .2748345  .0000291  1.8705 0.0196  I    -6.055     .432    -5.823     .160  -.127300   .505700   .2751600    -6.500    -6.000  
+91 6 4 48411.00 I  -.124536  .000327   .509546  .000294  I  .2728759  .0000263  2.0461 0.0175  I    -6.284     .292    -5.518     .164  -.124100   .508500   .2730300    -6.700    -5.800  
+91 6 5 48412.00 I  -.121236  .000327   .512145  .000294  I  .2707460  .0000194  2.2107 0.0163  I    -6.168     .393    -5.250     .145  -.120800   .511200   .2707400    -6.800    -5.700  
+91 6 6 48413.00 I  -.117799  .000327   .514711  .000294  I  .2684654  .0000193  2.3425 0.0140  I    -6.030     .393    -5.246     .145  -.117500   .513900   .2683000    -7.000    -5.500  
+91 6 7 48414.00 I  -.114309  .000344   .517299  .000260  I  .2660808  .0000202  2.4150 0.0127  I    -6.211     .447    -5.496     .104  -.114000   .516500   .2657700    -7.200    -5.400  
+91 6 8 48415.00 I  -.110827  .000563   .519947  .000464  I  .2636634  .0000165  2.4034 0.0128  I    -6.785     .599    -5.717     .114  -.110500   .519100   .2633500    -7.400    -5.300  
+91 6 9 48416.00 I  -.107321  .000554   .522631  .000423  I  .2613040  .0000157  2.3017 0.0113  I    -7.525     .599    -5.661     .114  -.106900   .521700   .2610100    -7.700    -5.200  
+91 610 48417.00 I  -.103738  .000562   .525310  .000417  I  .2590792  .0000155  2.1425 0.0107  I    -8.189     .591    -5.415     .298  -.103200   .524200   .2588000    -8.000    -5.100  
+91 611 48418.00 I  -.100023  .000588   .527945  .000391  I  .2570190  .0000146  1.9833 0.0106  I    -8.576     .630    -5.255     .298  -.099400   .526700   .2567700    -8.300    -5.100  
+91 612 48419.00 I  -.096172  .000588   .530474  .000391  I  .2551011  .0000145  1.8587 0.0103  I    -8.545     .515    -5.269     .298  -.095600   .529000   .2549000    -8.600    -5.000  
+91 613 48420.00 I  -.092407  .000593   .532808  .000433  I  .2532746  .0000146  1.8152 0.0109  I    -8.255     .515    -5.288     .298  -.091800   .531300   .2530800    -9.000    -5.000  
+91 614 48421.00 I  -.088697  .000518   .534938  .000423  I  .2514330  .0000162  1.8846 0.0103  I    -7.917     .406    -5.209     .298  -.088100   .533500   .2512000    -9.200    -5.000  
+91 615 48422.00 I  -.084948  .000419   .536894  .000368  I  .2494815  .0000146  2.0255 0.0108  I    -7.706     .339    -5.161     .115  -.084400   .535600   .2492100    -9.400    -5.100  
+91 616 48423.00 I  -.081217  .000355   .538697  .000372  I  .2473810  .0000143  2.1693 0.0105  I    -7.679     .113    -5.232     .134  -.080700   .537500   .2470600    -9.600    -5.100  
+91 617 48424.00 I  -.077580  .000356   .540381  .000347  I  .2451650  .0000151  2.2466 0.0113  I    -7.830     .113    -5.299     .134  -.077200   .539300   .2448100    -9.600    -5.200  
+91 618 48425.00 I  -.074071  .000264   .542020  .000390  I  .2429220  .0000175  2.2213 0.0116  I    -8.136     .134    -5.176     .180  -.073700   .541100   .2425200    -9.500    -5.200  
+91 619 48426.00 I  -.070701  .000211   .543663  .000307  I  .2407553  .0000175  2.0975 0.0124  I    -8.462     .471    -4.875     .310  -.070300   .542700   .2403400    -9.300    -5.300  
+91 620 48427.00 I  -.067473  .000211   .545292  .000307  I  .2387508  .0000175  1.9025 0.0149  I    -8.565     .471    -4.645     .310  -.067100   .544300   .2383200    -9.000    -5.400  
+91 621 48428.00 I  -.064420  .000263   .546876  .000301  I  .2369620  .0000240  1.6723 0.0145  I    -8.332     .653    -4.638     .399  -.063900   .545900   .2365500    -8.700    -5.500  
+91 622 48429.00 I  -.061563  .000297   .548392  .000495  I  .2354087  .0000232  1.4344 0.0160  I    -7.965     .656    -4.800     .306  -.060900   .547300   .2350300    -8.300    -5.600  
+91 623 48430.00 I  -.058826  .000265   .549874  .000379  I  .2340892  .0000213  1.2084 0.0165  I    -7.811     .656    -4.982     .306  -.057800   .548800   .2337300    -7.900    -5.700  
+91 624 48431.00 I  -.056103  .000338   .551379  .000418  I  .2329812  .0000235  1.0145 0.0162  I    -8.017     .646    -5.152     .287  -.054800   .550300   .2326600    -7.400    -5.800  
+91 625 48432.00 I  -.053290  .000370   .552965  .000391  I  .2320435  .0000244  0.8707 0.0135  I    -8.521     .563    -5.326     .248  -.051700   .551800   .2317300    -7.000    -5.900  
+91 626 48433.00 I  -.050301  .000261   .554667  .000331  I  .2312179  .0000133  0.7928 0.0138  I    -9.139     .487    -5.398     .233  -.048700   .553200   .2309100    -6.700    -6.100  
+91 627 48434.00 I  -.047131  .000261   .556431  .000331  I  .2304329  .0000131  0.7901 0.0100  I    -9.525     .455    -5.267     .225  -.045600   .554700   .2301000    -6.400    -6.200  
+91 628 48435.00 I  -.043799  .000271   .558138  .000322  I  .2296136  .0000150  0.8599 0.0101  I    -9.661     .323    -5.170     .241  -.042500   .556200   .2292700    -6.200    -6.400  
+91 629 48436.00 I  -.040312  .000264   .559642  .000410  I  .2286955  .0000154  0.9826 0.0117  I    -9.769     .339    -5.053     .216  -.039300   .557600   .2283500    -6.100    -6.600  
+91 630 48437.00 I  -.036690  .000356   .560847  .000438  I  .2276412  .0000180  1.1269 0.0119  I   -10.016     .284    -4.882     .222  -.036000   .559000   .2272900    -6.100    -6.800  
+91 7 1 48438.00 I  -.033013  .000341   .561856  .000417  I  .2264439  .0000182  1.2645 0.0127  I   -10.402     .345    -4.829     .196  -.032600   .560300   .2260700    -6.200    -6.900  
+91 7 2 48439.00 I  -.029366  .000322   .562824  .000430  I  .2251163  .0000180  1.3898 0.0160  I   -10.710     .362    -4.824     .193  -.029100   .561600   .2247200    -6.300    -7.100  
+91 7 3 48440.00 I  -.025727  .000433   .563843  .000543  I  .2236695  .0000262  1.4997 0.0159  I   -10.699     .391    -4.686     .200  -.025000   .563100   .2234700    -6.800    -7.000  
+91 7 4 48441.00 I  -.021941  .000433   .564872  .000543  I  .2221343  .0000263  1.5575 0.0213  I   -10.451     .418    -4.601     .196  -.021200   .564100   .2219200    -7.200    -6.800  
+91 7 5 48442.00 I  -.017994  .000512   .565876  .000239  I  .2205824  .0000335  1.5317 0.0196  I   -10.264     .452    -4.665     .245  -.017400   .565000   .2203700    -7.900    -6.600  
+91 7 6 48443.00 I  -.013950  .000445   .566824  .000198  I  .2190993  .0000291  1.4209 0.0197  I   -10.327     .986    -4.746     .177  -.013500   .565900   .2189100    -8.400    -6.400  
+91 7 7 48444.00 I  -.009878  .000182   .567683  .000208  I  .2177630  .0000207  1.2430 0.0155  I   -10.606    1.319    -4.691     .298  -.009600   .566700   .2176000    -8.800    -6.200  
+91 7 8 48445.00 I  -.005846  .000158   .568421  .000135  I  .2166216  .0000109  1.0402 0.0117  I   -10.986    1.119    -4.555     .298  -.005700   .567400   .2164800    -9.600    -6.200  
+91 7 9 48446.00 I  -.001914  .000187   .569021  .000146  I  .2156705  .0000109  0.8736 0.0079  I   -11.405     .986    -4.539     .298  -.001700   .568100   .2155300   -10.200    -6.100  
+91 710 48447.00 I   .001903  .000183   .569477  .000280  I  .2148371  .0000115  0.8187 0.0102  I   -11.798     .892    -4.726     .183   .002300   .568700   .2146700   -10.900    -5.800  
+91 711 48448.00 I   .005725  .000317   .569812  .000273  I  .2139795  .0000172  0.9245 0.0108  I   -11.999     .780    -4.998     .193   .006300   .569200   .2137800   -11.400    -5.700  
+91 712 48449.00 I   .009670  .000328   .570109  .000284  I  .2129437  .0000182  1.1634 0.0123  I   -12.132     .841    -5.069     .211   .010300   .569700   .2127100   -11.800    -5.600  
+91 713 48450.00 I   .013729  .000305   .570442  .000518  I  .2116343  .0000175  1.4575 0.0122  I   -12.357     .919    -4.983     .196   .014400   .570200   .2113800   -11.500    -5.500  
+91 714 48451.00 I   .017946  .000282   .570858  .000548  I  .2100398  .0000163  1.7183 0.0152  I   -12.478     .959    -4.854     .201   .018700   .570600   .2097900   -11.600    -5.400  
+91 715 48452.00 I   .022375  .000425   .571352  .000699  I  .2082363  .0000249  1.8633 0.0140  I   -12.266     .920    -4.788     .207   .023000   .570900   .2080100   -11.700    -5.300  
+91 716 48453.00 I   .026968  .000321   .571904  .000611  I  .2063631  .0000227  1.8587 0.0165  I   -12.268     .929    -4.726     .222   .027400   .571200   .2061600   -11.800    -5.400  
+91 717 48454.00 I   .031649  .000327   .572418  .000593  I  .2045564  .0000217  1.7417 0.0160  I   -12.998    1.072    -4.642     .209   .031800   .571500   .2043600   -11.800    -5.500  
+91 718 48455.00 I   .036358  .000250   .572701  .000600  I  .2029001  .0000226  1.5636 0.0153  I   -13.903     .835    -4.660     .192   .036400   .571700   .2027300   -12.000    -5.500  
+91 719 48456.00 I   .041044  .000262   .572782  .000406  I  .2014419  .0000215  1.3476 0.0159  I   -14.393     .720    -4.676     .209   .041000   .571900   .2012900   -12.100    -5.600  
+91 720 48457.00 I   .045589  .000312   .572739  .000526  I  .2002059  .0000223  1.1288 0.0171  I   -14.254     .712    -4.778     .186   .045600   .572000   .2000600   -12.300    -5.600  
+91 721 48458.00 I   .050029  .000360   .572650  .000533  I  .1991700  .0000267  0.9531 0.0163  I   -14.009     .725    -4.872     .210   .050300   .572000   .1990200   -12.600    -5.600  
+91 722 48459.00 I   .054497  .000276   .572540  .000537  I  .1982781  .0000239  0.8422 0.0212  I   -14.205     .768    -4.856     .207   .054900   .572000   .1981300   -12.900    -5.500  
+91 723 48460.00 I   .059109  .000440   .572417  .000734  I  .1974633  .0000329  0.7981 0.0162  I   -14.833     .628    -4.836     .218   .059500   .571900   .1973100   -13.300    -5.500  
+91 724 48461.00 I   .063817  .000450   .572247  .000700  I  .1966611  .0000219  0.8163 0.0207  I   -15.457     .610    -4.746     .236   .064000   .571700   .1965100   -13.700    -5.400  
+91 725 48462.00 I   .068502  .000426   .572009  .000698  I  .1958101  .0000252  0.8963 0.0200  I   -15.667     .610    -4.748     .236   .068500   .571500   .1956600   -14.100    -5.400  
+91 726 48463.00 I   .073105  .000320   .571718  .000535  I  .1948501  .0000335  1.0315 0.0185  I   -15.531     .527    -4.763     .286   .072800   .571200   .1947100   -14.600    -5.300  
+91 727 48464.00 I   .077590  .000260   .571383  .000358  I  .1937368  .0000272  1.1975 0.0236  I   -15.331     .583    -4.566     .331   .076900   .570800   .1936000   -15.000    -5.300  
+91 728 48465.00 I   .081901  .000312   .571007  .000318  I  .1924553  .0000332  1.3628 0.0219  I   -15.227     .693    -4.295     .259   .081000   .570400   .1923400   -15.300    -5.300  
+91 729 48466.00 I   .085971  .000323   .570583  .000412  I  .1910240  .0000344  1.4898 0.0252  I   -15.260     .678    -4.151     .251   .084800   .569800   .1909400   -15.700    -5.300  
+91 730 48467.00 I   .089710  .000339   .570085  .000444  I  .1895032  .0000380  1.5344 0.0256  I   -15.242     .723    -4.454     .280   .088500   .569200   .1894300   -16.000    -5.300  
+91 731 48468.00 I   .093032  .000335   .569494  .000501  I  .1879815  .0000378  1.5000 0.0260  I   -15.100     .637    -4.834     .258   .092000   .568400   .1878800   -16.200    -5.300  
+91 8 1 48469.00 I   .096042  .000322   .568777  .000476  I  .1865172  .0000354  1.4237 0.0264  I   -14.997     .629    -4.921     .247   .095400   .567600   .1863600   -16.400    -5.400  
+91 8 2 48470.00 I   .098933  .000331   .567909  .000479  I  .1851435  .0000370  1.3193 0.0244  I   -15.069     .594    -4.824     .178   .098700   .566700   .1849200   -16.600    -5.500  
+91 8 3 48471.00 I   .101871  .000419   .566886  .000584  I  .1838886  .0000336  1.1848 0.0232  I   -15.354     .477    -4.773     .182   .101900   .565600   .1836600   -16.800    -5.600  
+91 8 4 48472.00 I   .104958  .000412   .565705  .000356  I  .1827794  .0000281  1.0339 0.0217  I   -15.846     .458    -4.704     .182   .105100   .564500   .1825800   -17.000    -5.600  
+91 8 5 48473.00 I   .108217  .000412   .564427  .000356  I  .1818143  .0000275  0.9025 0.0171  I   -16.345     .420    -4.719     .161   .108400   .563400   .1816700   -17.200    -5.700  
+91 8 6 48474.00 I   .111662  .000420   .563106  .000306  I  .1809531  .0000194  0.8348 0.0175  I   -16.595     .442    -4.836     .145   .112300   .562700   .1807900   -15.800    -5.400  
+91 8 7 48475.00 I   .115248  .000432   .561778  .000249  I  .1801100  .0000216  0.8711 0.0145  I   -16.529     .411    -4.860     .280   .115600   .561500   .1799900   -16.000    -5.400  
+91 8 8 48476.00 I   .118816  .000470   .560444  .000254  I  .1791690  .0000215  1.0330 0.0165  I   -16.317     .442    -4.781     .288   .118900   .560200   .1790600   -16.200    -5.300  
+91 8 9 48477.00 I   .122395  .000391   .559084  .000128  I  .1780101  .0000249  1.2965 0.0134  I   -16.217     .214    -4.613     .341   .122300   .558900   .1778800   -16.400    -5.200  
+91 810 48478.00 I   .126042  .000293   .557680  .000372  I  .1765680  .0000161  1.5840 0.0151  I   -16.291     .207    -4.488     .285   .125800   .557500   .1764200   -16.700    -5.000  
+91 811 48479.00 I   .129721  .000206   .556237  .000483  I  .1748620  .0000171  1.8117 0.0117  I   -16.385     .169    -4.495     .343   .129300   .556000   .1746800   -16.900    -4.900  
+91 812 48480.00 I   .133366  .000206   .554770  .000483  I  .1729817  .0000169  1.9279 0.0112  I   -16.460     .169    -4.625     .343   .132700   .554500   .1727600   -17.200    -4.700  
+91 813 48481.00 I   .136914  .000108   .553290  .000495  I  .1710455  .0000145  1.9261 0.0122  I   -16.781     .193    -4.687     .298   .136200   .552900   .1708200   -17.500    -4.600  
+91 814 48482.00 I   .140316  .000209   .551783  .000497  I  .1691646  .0000177  1.8190 0.0106  I   -17.533     .286    -4.580     .402   .139500   .551200   .1689400   -17.800    -4.400  
+91 815 48483.00 I   .143560  .000204   .550210  .000519  I  .1674311  .0000155  1.6410 0.0146  I   -18.378     .282    -4.443     .363   .142800   .549400   .1672400   -18.100    -4.300  
+91 816 48484.00 I   .146642  .000233   .548540  .000504  I  .1658892  .0000231  1.4432 0.0168  I   -18.744     .327    -4.439     .455   .146000   .547600   .1657200   -18.300    -4.300  
+91 817 48485.00 I   .149543  .000420   .546773  .000502  I  .1645384  .0000297  1.2642 0.0185  I   -18.442     .649    -4.516     .354   .149000   .545700   .1644000   -18.400    -4.200  
+91 818 48486.00 I   .152226  .000407   .544914  .000434  I  .1633450  .0000289  1.1325 0.0172  I   -17.924     .649    -4.500     .354   .151800   .543800   .1632200   -18.400    -4.300  
+91 819 48487.00 I   .154714  .000316   .542974  .000271  I  .1622537  .0000173  1.0597 0.0179  I   -17.630     .603    -4.334     .342   .154600   .541800   .1621400   -18.300    -4.300  
+91 820 48488.00 I   .157052  .000334   .540992  .000293  I  .1612062  .0000211  1.0449 0.0128  I   -17.572     .724    -4.122     .170   .157200   .539800   .1611000   -18.200    -4.400  
+91 821 48489.00 I   .159312  .000290   .538993  .000235  I  .1601450  .0000188  1.0867 0.0132  I   -17.533     .895    -4.009     .239   .159700   .537800   .1600400   -18.100    -4.500  
+91 822 48490.00 I   .161609  .000290   .536939  .000235  I  .1590155  .0000159  1.1803 0.0136  I   -17.306     .895    -4.081     .239   .162200   .535800   .1588800   -17.900    -4.600  
+91 823 48491.00 I   .164054  .000326   .534799  .000118  I  .1577638  .0000197  1.3355 0.0115  I   -16.927     .871    -4.043     .289   .164500   .533700   .1575700   -17.800    -4.700  
+91 824 48492.00 I   .166659  .000282   .532583  .000292  I  .1563302  .0000166  1.5335 0.0129  I   -16.758     .743    -3.944     .221   .166900   .531700   .1561000   -17.700    -4.800  
+91 825 48493.00 I   .169344  .000285   .530338  .000303  I  .1546978  .0000167  1.7287 0.0167  I   -16.866     .738    -3.992     .237   .169300   .529600   .1544400   -17.600    -4.900  
+91 826 48494.00 I   .171997  .000348   .528109  .000351  I  .1528838  .0000290  1.8911 0.0149  I   -17.094     .724    -4.229     .235   .171700   .527600   .1525900   -17.600    -5.000  
+91 827 48495.00 I   .174560  .000335   .525956  .000357  I  .1509325  .0000248  2.0029 0.0190  I   -17.324     .537    -4.543     .230   .174100   .525600   .1506300   -17.500    -5.100  
+91 828 48496.00 I   .177137  .000329   .523935  .000371  I  .1489024  .0000246  2.0416 0.0163  I   -17.565     .621    -4.617     .212   .176600   .523500   .1486100   -17.600    -5.200  
+91 829 48497.00 I   .179726  .000329   .521986  .000371  I  .1468790  .0000213  1.9912 0.0201  I   -17.813     .621    -4.468     .212   .179200   .521400   .1466000   -17.600    -5.300  
+91 830 48498.00 I   .182299  .000283   .520033  .000311  I  .1449414  .0000318  1.8767 0.0208  I   -18.113     .682    -4.510     .276   .181800   .519400   .1446900   -17.700    -5.300  
+91 831 48499.00 I   .184849  .000307   .518012  .000544  I  .1431336  .0000358  1.7383 0.0217  I   -18.328     .634    -4.642     .190   .184500   .517300   .1429000   -17.800    -5.300  
+91 9 1 48500.00 I   .187398  .000307   .515918  .000544  I  .1414584  .0000296  1.6192 0.0197  I   -18.443     .634    -4.739     .190   .187300   .515200   .1412500   -18.000    -5.300  
+91 9 2 48501.00 I   .189978  .000246   .513764  .000420  I  .1398743  .0000164  1.5629 0.0177  I   -18.529     .597    -4.849     .116   .190100   .513100   .1396800   -18.100    -5.300  
+91 9 3 48502.00 I   .192616  .000243   .511566  .000386  I  .1383010  .0000194  1.6015 0.0106  I   -18.582     .884    -4.977     .298   .192900   .510900   .1381200   -18.400    -5.300  
+91 9 4 48503.00 I   .195337  .000193   .509352  .000297  I  .1366345  .0000135  1.7504 0.0116  I   -18.582     .828    -5.070     .298   .195700   .508800   .1364500   -18.700    -5.200  
+91 9 5 48504.00 I   .198209  .000193   .507148  .000297  I  .1347696  .0000129  1.9910 0.0096  I   -18.493     .771    -5.058     .298   .198400   .506600   .1345800   -19.000    -5.100  
+91 9 6 48505.00 I   .201270  .000208   .504976  .000244  I  .1326407  .0000137  2.2669 0.0099  I   -18.352     .895    -4.901     .107   .201400   .504300   .1324500   -19.100    -5.100  
+91 9 7 48506.00 I   .204388  .000238   .502847  .000267  I  .1302495  .0000150  2.5019 0.0089  I   -18.377     .924    -4.586     .114   .204100   .502100   .1300500   -19.300    -4.900  
+91 9 8 48507.00 I   .207393  .000250   .500743  .000270  I  .1276691  .0000115  2.6405 0.0092  I   -18.509     .971    -4.302     .130   .206700   .499800   .1274400   -19.500    -4.800  
+91 9 9 48508.00 I   .210161  .000252   .498606  .000240  I  .1250076  .0000108  2.6618 0.0077  I   -18.510     .887    -4.146     .132   .209100   .497500   .1247500   -19.600    -4.700  
+91 910 48509.00 I   .212566  .000297   .496400  .000231  I  .1223822  .0000102  2.5731 0.0093  I   -18.391     .951    -3.983     .147   .211300   .495200   .1221100   -19.700    -4.500  
+91 911 48510.00 I   .214480  .000366   .494106  .000365  I  .1198897  .0000152  2.3994 0.0097  I   -18.644     .915    -3.835     .137   .213300   .492800   .1196300   -19.600    -4.500  
+91 912 48511.00 I   .215997  .000375   .491708  .000342  I  .1175991  .0000164  2.1785 0.0112  I   -19.249     .858    -3.777     .139   .215100   .490300   .1173700   -19.400    -4.400  
+91 913 48512.00 I   .217312  .000338   .489190  .000349  I  .1155326  .0000164  1.9578 0.0119  I   -19.719     .821    -3.871     .138   .216900   .487800   .1153500   -19.300    -4.400  
+91 914 48513.00 I   .218598  .000315   .486539  .000256  I  .1136722  .0000173  1.7711 0.0120  I   -19.703     .373    -4.107     .102   .218600   .485200   .1135500   -19.000    -4.400  
+91 915 48514.00 I   .219935  .000309   .483763  .000246  I  .1119721  .0000175  1.6392 0.0123  I   -19.204     .373    -4.236     .102   .220200   .482500   .1119000   -18.700    -4.400  
+91 916 48515.00 I   .221414  .000309   .480892  .000246  I  .1103748  .0000176  1.5643 0.0133  I   -18.511     .373    -4.178     .102   .221900   .479800   .1103500   -18.400    -4.500  
+91 917 48516.00 I   .223135  .000381   .477963  .000258  I  .1088260  .0000201  1.5418 0.0119  I   -17.877     .194    -4.070     .103   .223700   .477000   .1088200   -18.100    -4.500  
+91 918 48517.00 I   .225137  .000394   .475008  .000145  I  .1072693  .0000160  1.5851 0.0126  I   -17.416     .347    -4.011     .139   .225500   .474200   .1072500   -17.900    -4.600  
+91 919 48518.00 I   .227290  .000394   .472047  .000145  I  .1056320  .0000153  1.6998 0.0136  I   -17.214     .347    -3.972     .139   .227400   .471300   .1055800   -17.700    -4.700  
+91 920 48519.00 I   .229438  .000457   .469103  .000174  I  .1038529  .0000220  1.8647 0.0144  I   -17.332     .490    -3.912     .182   .229400   .468400   .1037400   -17.600    -4.700  
+91 921 48520.00 I   .231466  .000403   .466196  .000482  I  .1018945  .0000243  2.0538 0.0162  I   -17.725     .484    -3.871     .183   .231400   .465600   .1017200   -17.600    -4.700  
+91 922 48521.00 I   .233424  .000389   .463342  .000461  I  .0997466  .0000237  2.2392 0.0161  I   -18.181     .484    -3.907     .183   .233500   .462700   .0995100   -17.700    -4.700  
+91 923 48522.00 I   .235406  .000473   .460554  .000503  I  .0974257  .0000211  2.3960 0.0179  I   -18.536     .436    -4.007     .180   .235600   .459800   .0971300   -17.800    -4.700  
+91 924 48523.00 I   .237502  .000402   .457846  .000568  I  .0949725  .0000268  2.4991 0.0172  I   -18.737     .311    -4.092     .170   .237800   .456900   .0946600   -17.900    -4.600  
+91 925 48524.00 I   .239748  .000402   .455199  .000568  I  .0924587  .0000272  2.5087 0.0193  I   -18.768     .298    -4.082     .169   .239800   .454000   .0921500   -18.100    -4.600  
+91 926 48525.00 I   .242034  .000405   .452492  .000560  I  .0899884  .0000277  2.4185 0.0188  I   -18.671     .298    -3.937     .169   .241800   .451000   .0897100   -18.100    -4.600  
+91 927 48526.00 I   .244219  .000444   .449613  .000623  I  .0876444  .0000260  2.2601 0.0181  I   -18.468     .177    -3.834     .162   .243600   .448100   .0874100   -18.100    -4.600  
+91 928 48527.00 I   .246208  .000374   .446617  .000483  I  .0854745  .0000232  2.0827 0.0171  I   -18.199     .298    -3.786     .145   .245300   .445000   .0852900   -18.100    -4.600  
+91 929 48528.00 I   .247973  .000382   .443544  .000494  I  .0834657  .0000222  1.9451 0.0162  I   -17.883     .320    -3.782     .142   .246900   .442000   .0833200   -18.000    -4.700  
+91 930 48529.00 I   .249478  .000306   .440410  .000471  I  .0815602  .0000225  1.8797 0.0149  I   -17.537     .387    -3.835     .136   .248300   .438900   .0814500   -17.800    -4.700  
+9110 1 48530.00 I   .250664  .000364   .437218  .000392  I  .0796781  .0000200  1.8990 0.0151  I   -17.176     .425    -3.925     .158   .249500   .435700   .0795600   -17.700    -4.800  
+9110 2 48531.00 I   .251533  .000347   .433958  .000384  I  .0777307  .0000200  2.0127 0.0141  I   -16.831     .616    -4.028     .160   .250700   .432500   .0775900   -17.600    -4.800  
+9110 3 48532.00 I   .252261  .000347   .430611  .000384  I  .0756290  .0000200  2.1976 0.0155  I   -16.627     .616    -4.184     .160   .251700   .429200   .0754400   -17.500    -4.900  
+9110 4 48533.00 I   .253026  .000407   .427190  .000415  I  .0733329  .0000238  2.3905 0.0136  I   -16.658     .695    -4.398     .193   .252700   .425900   .0731100   -17.400    -5.000  
+9110 5 48534.00 I   .253919  .000279   .423732  .000271  I  .0708653  .0000185  2.5315 0.0153  I   -16.845     .545    -4.365     .149   .253500   .422600   .0706100   -17.400    -5.000  
+9110 6 48535.00 I   .254908  .000281   .420246  .000373  I  .0683008  .0000191  2.5799 0.0131  I   -17.038     .515    -4.030     .139   .254600   .419100   .0680400   -17.400    -4.400  
+9110 7 48536.00 I   .255934  .000246   .416738  .000368  I  .0657398  .0000185  2.5254 0.0129  I   -17.147     .541    -3.632     .101   .255600   .415600   .0655000   -17.400    -4.300  
+9110 8 48537.00 I   .256938  .000169   .413216  .000377  I  .0632768  .0000173  2.3904 0.0127  I   -17.156     .312    -3.380     .298   .256600   .412100   .0630400   -17.400    -4.300  
+9110 9 48538.00 I   .257857  .000190   .409694  .000378  I  .0609769  .0000173  2.2016 0.0111  I   -17.118     .366    -3.353     .298   .257500   .408700   .0607800   -17.300    -4.200  
+911010 48539.00 I   .258653  .000190   .406205  .000378  I  .0588820  .0000138  1.9875 0.0120  I   -17.198     .366    -3.475     .298   .258400   .405300   .0587400   -17.200    -4.200  
+911011 48540.00 I   .259307  .000215   .402771  .000454  I  .0569980  .0000165  1.7851 0.0092  I   -17.302     .436    -3.597     .298   .259000   .401800   .0569100   -17.100    -4.200  
+911012 48541.00 I   .259816  .000249   .399401  .000356  I  .0552983  .0000123  1.6231 0.0090  I   -17.215     .460    -3.614     .298   .259600   .398400   .0552600   -17.000    -4.200  
+911013 48542.00 I   .260215  .000207   .396078  .000143  I  .0537336  .0000070  1.5155 0.0068  I   -16.857     .405    -3.533     .298   .260100   .395000   .0537300   -16.800    -4.200  
+911014 48543.00 I   .260541  .000175   .392784  .000122  I  .0522502  .0000058  1.4590 0.0045  I   -16.315     .405    -3.440     .298   .260600   .391600   .0522600   -16.600    -4.100  
+911015 48544.00 I   .260834  .000189   .389497  .000059  I  .0508005  .0000056  1.4479 0.0039  I   -15.775     .428    -3.412     .298   .260900   .388200   .0507900   -16.300    -4.100  
+911016 48545.00 I   .261131  .000170   .386204  .000071  I  .0493325  .0000053  1.5027 0.0038  I   -15.401     .694    -3.440     .298   .261200   .384800   .0492500   -16.100    -4.100  
+911017 48546.00 I   .261471  .000170   .382917  .000071  I  .0477694  .0000052  1.6346 0.0034  I   -15.230     .644    -3.454     .298   .261400   .381500   .0476200   -15.900    -4.100  
+911018 48547.00 I   .261748  .000161   .379673  .000104  I  .0460491  .0000041  1.8092 0.0047  I   -15.191     .662    -3.447     .298   .261500   .378100   .0458400   -15.600    -4.000  
+911019 48548.00 I   .261878  .000214   .376475  .000157  I  .0441486  .0000078  1.9911 0.0048  I   -15.376     .618    -3.513     .298   .261500   .374800   .0439100   -15.400    -4.000  
+911020 48549.00 I   .261867  .000198   .373298  .000181  I  .0420742  .0000087  2.1510 0.0064  I   -15.685     .579    -3.635     .108   .261400   .371400   .0418300   -15.300    -3.900  
+911021 48550.00 I   .261762  .000206   .370065  .000195  I  .0398639  .0000101  2.2590 0.0067  I   -15.882     .579    -3.698     .114   .261200   .368100   .0396300   -15.200    -3.800  
+911022 48551.00 I   .261585  .000188   .366705  .000197  I  .0375816  .0000101  2.2907 0.0075  I   -15.900     .174    -3.618     .103   .261000   .364800   .0373800   -15.000    -3.800  
+911023 48552.00 I   .261298  .000215   .363280  .000223  I  .0353079  .0000110  2.2462 0.0074  I   -15.848     .190    -3.452     .108   .260700   .361500   .0351300   -14.900    -3.700  
+911024 48553.00 I   .260952  .000217   .359926  .000223  I  .0331125  .0000109  2.1319 0.0093  I   -15.783     .123    -3.372     .108   .260400   .358200   .0329600   -14.800    -3.600  
+911025 48554.00 I   .260565  .000098   .356662  .000266  I  .0310547  .0000150  1.9857 0.0083  I   -15.673     .791    -3.291     .135   .260100   .355000   .0309200   -14.800    -3.500  
+911026 48555.00 I   .260157  .000092   .353463  .000178  I  .0291278  .0000124  1.8794 0.0105  I   -15.454     .216    -3.183     .298   .259800   .351800   .0289900   -14.700    -3.500  
+911027 48556.00 I   .259771  .000149   .350310  .000168  I  .0272670  .0000147  1.8597 0.0099  I   -15.125     .216    -3.064     .298   .259700   .348700   .0271200   -14.700    -3.400  
+911028 48557.00 I   .259457  .000159   .347183  .000177  I  .0253742  .0000154  1.9426 0.0114  I   -14.759     .225    -2.967     .123   .259700   .345600   .0252200   -14.700    -3.400  
+911029 48558.00 I   .259269  .000285   .344065  .000169  I  .0233532  .0000175  2.1111 0.0107  I   -14.422     .225    -2.955     .123   .259900   .342600   .0231900   -14.700    -3.400  
+911030 48559.00 I   .259278  .000242   .340934  .000153  I  .0211389  .0000150  2.3187 0.0103  I   -14.129     .382    -3.040     .113   .260100   .339600   .0209600   -14.700    -3.400  
+911031 48560.00 I   .259575  .000242   .337805  .000153  I  .0187158  .0000110  2.5261 0.0097  I   -13.868     .392    -3.116     .106   .260400   .336700   .0185000   -14.800    -3.400  
+9111 1 48561.00 I   .260184  .000267   .334747  .000159  I  .0160973  .0000122  2.7015 0.0082  I   -13.691     .424    -3.089     .116   .260800   .333800   .0158700   -14.800    -3.400  
+9111 2 48562.00 I   .261067  .000325   .331831  .000191  I  .0133398  .0000122  2.7959 0.0094  I   -13.684     .595    -2.916     .140   .261100   .330900   .0131100   -14.700    -3.300  
+9111 3 48563.00 I   .262021  .000363   .329086  .000215  I  .0105434  .0000142  2.7766 0.0087  I   -13.719     .770    -2.618     .115   .261500   .328100   .0103500   -14.600    -3.300  
+9111 4 48564.00 I   .262838  .000359   .326446  .000227  I  .0078236  .0000123  2.6462 0.0089  I   -13.698     .770    -2.313     .115   .261800   .325200   .0076700   -14.400    -3.300  
+9111 5 48565.00 I   .263316  .000286   .323824  .000219  I  .0052780  .0000107  2.4346 0.0086  I   -13.595     .859    -2.146     .138   .262300   .322400   .0051600   -14.400    -3.300  
+9111 6 48566.00 I   .263351  .000337   .321155  .000272  I  .0029617  .0000119  2.2011 0.0080  I   -13.471     .836    -2.165     .139   .262400   .319700   .0028700   -14.400    -3.200  
+9111 7 48567.00 I   .263058  .000336   .318417  .000350  I  .0008641  .0000118  2.0029 0.0094  I   -13.386     .834    -2.313     .139   .262400   .317000   .0007600   -14.400    -3.200  
+9111 8 48568.00 I   .262580  .000304   .315600  .000394  I -.0010654  .0000146  1.8688 0.0074  I   -13.287     .809    -2.488     .108   .262100   .314300  -.0011900   -14.100    -3.100  
+9111 9 48569.00 I   .262019  .000290   .312716  .000437  I -.0028975  .0000089  1.8067 0.0080  I   -13.136     .990    -2.610     .103   .261800   .311400  -.0030400   -13.800    -3.100  
+911110 48570.00 I   .261375  .000200   .309796  .000277  I -.0047002  .0000066  1.8089 0.0056  I   -13.035     .990    -2.539     .103   .261200   .308500  -.0048500   -13.500    -3.000  
+911111 48571.00 I   .260618  .000200   .306885  .000277  I -.0065338  .0000068  1.8667 0.0042  I   -12.898     .856    -2.346     .298   .260500   .305600  -.0066900   -13.200    -3.000  
+911112 48572.00 I   .259733  .000138   .303992  .000279  I -.0084483  .0000053  1.9687 0.0045  I   -12.593     .936    -2.227     .298   .259700   .302600  -.0086100   -13.000    -2.900  
+911113 48573.00 I   .258711  .000145   .301113  .000274  I -.0104806  .0000058  2.0991 0.0052  I   -12.210     .876    -2.225     .298   .258800   .299700  -.0106500   -12.800    -2.900  
+911114 48574.00 I   .257557  .000145   .298217  .000274  I -.0126521  .0000090  2.2465 0.0054  I   -12.014     .814    -2.201     .298   .257800   .296700  -.0128400   -12.600    -2.800  
+911115 48575.00 I   .256324  .000132   .295259  .000276  I -.0149750  .0000091  2.3981 0.0064  I   -11.987     .476    -2.108     .298   .256800   .293800  -.0151700   -12.500    -2.800  
+911116 48576.00 I   .255081  .000275   .292194  .000336  I -.0174429  .0000090  2.5336 0.0083  I   -12.041     .406    -2.059     .298   .255700   .290800  -.0176400   -12.400    -2.900  
+911117 48577.00 I   .253909  .000412   .289017  .000356  I -.0200270  .0000139  2.6234 0.0081  I   -12.194     .442    -2.232     .105   .254700   .287800  -.0202100   -12.400    -2.900  
+911118 48578.00 I   .252920  .000399   .285821  .000373  I -.0226646  .0000135  2.6379 0.0097  I   -12.421     .429    -2.529     .104   .253700   .284700  -.0228200   -12.400    -2.900  
+911119 48579.00 I   .252234  .000378   .282720  .000381  I -.0252746  .0000135  2.5678 0.0096  I   -12.615     .479    -2.634     .105   .252700   .281700  -.0253900   -12.400    -2.900  
+911120 48580.00 I   .251872  .000399   .279772  .000361  I -.0277784  .0000136  2.4324 0.0096  I   -12.702     .475    -2.403     .116   .251800   .278600  -.0278700   -12.400    -2.800  
+911121 48581.00 I   .251571  .000399   .276910  .000361  I -.0301254  .0000136  2.2549 0.0111  I   -12.665     .475    -2.051     .116   .250900   .275500  -.0302000   -12.400    -2.700  
+911122 48582.00 I   .251059  .000350   .274132  .000274  I -.0322901  .0000176  2.0829 0.0131  I   -12.373     .546    -1.836     .109   .250100   .272400  -.0323700   -12.400    -2.600  
+911123 48583.00 I   .250193  .000409   .271398  .000419  I -.0343196  .0000223  1.9959 0.0146  I   -11.997     .643    -1.823     .298   .249200   .269300  -.0344300   -12.400    -2.500  
+911124 48584.00 I   .249052  .000340   .268621  .000541  I -.0363251  .0000232  2.0385 0.0179  I   -11.728     .705    -1.850     .298   .248400   .266200  -.0364800   -12.400    -2.400  
+911125 48585.00 I   .247766  .000355   .265706  .000554  I -.0384389  .0000280  2.2080 0.0207  I   -11.627     .831    -1.807     .150   .247500   .263100  -.0386300   -12.400    -2.300  
+911126 48586.00 I   .246464  .000455   .262558  .000630  I -.0407691  .0000344  2.4616 0.0224  I   -11.648     .980    -1.716     .200   .246700   .260000  -.0409800   -12.400    -2.300  
+911127 48587.00 I   .245276  .000455   .259134  .000630  I -.0433617  .0000349  2.7142 0.0240  I   -11.670     .980    -1.590     .200   .246000   .256900  -.0435600   -12.500    -2.200  
+911128 48588.00 I   .244270  .000455   .255563  .000630  I -.0461708  .0000336  2.8869 0.0244  I   -11.741     .980    -1.381     .200   .245200   .253800  -.0463600   -12.500    -2.200  
+911129 48589.00 I   .243445  .000411   .251970  .000853  I -.0491002  .0000340  2.9537 0.0202  I   -11.722     .913    -1.306     .232   .244400   .250800  -.0492700   -12.500    -2.100  
+911130 48590.00 I   .242748  .000348   .248441  .000682  I -.0520428  .0000223  2.9144 0.0217  I   -11.670     .767    -1.345     .236   .243600   .247800  -.0522000   -12.400    -2.100  
+9112 1 48591.00 I   .242116  .000386   .245061  .000668  I -.0548992  .0000270  2.7858 0.0131  I   -11.714     .395    -1.423     .242   .242700   .244800  -.0550500   -12.400    -2.100  
+9112 2 48592.00 I   .241483  .000254   .241909  .000387  I -.0575943  .0000136  2.5968 0.0151  I   -11.882     .428    -1.498     .297   .241600   .241900  -.0577600   -12.400    -2.100  
+9112 3 48593.00 I   .240748  .000365   .239028  .000423  I -.0600857  .0000137  2.3864 0.0097  I   -12.099     .406    -1.604     .282   .240500   .239100  -.0602600   -12.300    -2.100  
+9112 4 48594.00 I   .239785  .000367   .236379  .000438  I -.0623717  .0000137  2.1897 0.0097  I   -12.168     .363    -1.767     .290   .239100   .236300  -.0625700   -12.200    -2.100  
+9112 5 48595.00 I   .238404  .000355   .233887  .000431  I -.0644791  .0000138  2.0349 0.0094  I   -11.861     .390    -1.645     .306   .237500   .233600  -.0646900   -12.000    -2.000  
+9112 6 48596.00 I   .236477  .000381   .231434  .000310  I -.0664603  .0000130  1.9366 0.0089  I   -11.349     .418    -1.441     .336   .235800   .230800  -.0666800   -11.800    -1.900  
+9112 7 48597.00 I   .234014  .000394   .228899  .000367  I -.0683727  .0000114  1.8995 0.0075  I   -10.898     .356    -1.435     .366   .233800   .228000  -.0685900   -11.700    -1.800  
+9112 8 48598.00 I   .231202  .000346   .226236  .000379  I -.0702803  .0000073  1.9256 0.0074  I   -10.537     .226    -1.527     .342   .231700   .225200  -.0704900   -11.600    -1.800  
+9112 9 48599.00 I   .228292  .000381   .223448  .000385  I -.0722415  .0000093  2.0047 0.0056  I   -10.209     .207    -1.561     .360   .229500   .222400  -.0724600   -11.500    -1.800  
+911210 48600.00 I   .225542  .000270   .220545  .000313  I -.0743029  .0000084  2.1233 0.0070  I    -9.989     .312    -1.435     .351   .227200   .219600  -.0745200   -11.400    -1.700  
+911211 48601.00 I   .223142  .000267   .217573  .000316  I -.0764947  .0000105  2.2616 0.0074  I   -10.029     .337    -1.154     .305   .224800   .216800  -.0767200   -11.300    -1.700  
+911212 48602.00 I   .221062  .000279   .214672  .000328  I -.0788245  .0000122  2.3951 0.0093  I   -10.288     .337     -.990     .305   .222400   .214100  -.0790600   -11.300    -1.700  
+911213 48603.00 I   .219187  .000274   .211939  .000222  I -.0812771  .0000154  2.5053 0.0111  I   -10.438     .478     -.795     .226   .220000   .211400  -.0815300   -11.300    -1.700  
+911214 48604.00 I   .217366  .000265   .209355  .000271  I -.0838232  .0000185  2.5797 0.0110  I   -10.313     .424     -.721     .207   .217900   .208800  -.0841000   -11.200    -1.700  
+911215 48605.00 I   .215521  .000214   .206838  .000232  I -.0864216  .0000156  2.6092 0.0114  I   -10.178     .446     -.909     .184   .215700   .206200  -.0867100   -11.200    -1.700  
+911216 48606.00 I   .213630  .000186   .204303  .000223  I -.0890221  .0000133  2.5800 0.0104  I   -10.387     .412    -1.177     .135   .213700   .203800  -.0893100   -11.100    -1.700  
+911217 48607.00 I   .211809  .000191   .201740  .000213  I -.0915598  .0000138  2.4854 0.0091  I   -10.792     .416    -1.313     .131   .211700   .201400  -.0918400   -11.100    -1.700  
+911218 48608.00 I   .210191  .000239   .199201  .000240  I -.0939742  .0000125  2.3347 0.0091  I   -11.055     .389    -1.229     .135   .209800   .199100  -.0942200   -11.100    -1.600  
+911219 48609.00 I   .208711  .000232   .196874  .000243  I -.0962138  .0000119  2.1379 0.0085  I   -11.019     .255     -.986     .129   .207900   .196800  -.0964200   -11.100    -1.600  
+911220 48610.00 I   .207235  .000244   .194795  .000250  I -.0982561  .0000114  1.9592 0.0073  I   -10.627     .275     -.790     .121   .206000   .194600  -.0984300   -11.000    -1.600  
+911221 48611.00 I   .205507  .000194   .192814  .000202  I -.1001693  .0000086  1.8916 0.0078  I   -10.018     .428     -.874     .107   .204100   .192400  -.1003400   -11.000    -1.600  
+911222 48612.00 I   .203369  .000249   .190776  .000238  I -.1020840  .0000106  1.9582 0.0102  I    -9.412     .461    -1.084     .115   .202200   .190200  -.1022700   -11.000    -1.600  
+911223 48613.00 I   .200948  .000400   .188654  .000371  I -.1041185  .0000184  2.1232 0.0085  I    -9.100     .473    -1.190     .102   .200300   .187900  -.1043100   -11.000    -1.600  
+911224 48614.00 I   .198454  .000415   .186472  .000375  I -.1063444  .0000132  2.3301 0.0133  I    -9.251     .556    -1.222     .298   .198300   .185700  -.1065500   -10.900    -1.600  
+911225 48615.00 I   .196072  .000297   .184253  .000251  I -.1087701  .0000191  2.5113 0.0172  I    -9.653     .652    -1.291     .298   .196300   .183400  -.1089900   -10.800    -1.600  
+911226 48616.00 I   .193885  .000297   .182012  .000251  I -.1113399  .0000317  2.6112 0.0276  I    -9.981     .652    -1.355     .298   .194400   .181200  -.1115800   -10.600    -1.600  
+911227 48617.00 I   .191929  .000393   .179752  .000327  I -.1139584  .0000518  2.6088 0.0236  I   -10.162     .637    -1.266     .298   .192400   .178900  -.1142000   -10.500    -1.600  
+911228 48618.00 I   .190212  .000615   .177484  .000274  I -.1165251  .0000351  2.5092 0.0322  I   -10.284     .473    -1.032     .174   .190400   .176600  -.1167500   -10.300    -1.700  
+911229 48619.00 I   .188613  .000711   .175240  .000404  I -.1189540  .0000383  2.3412 0.0258  I   -10.401     .473     -.823     .174   .188400   .174400  -.1191500   -10.200    -1.700  
+911230 48620.00 I   .186972  .000711   .173043  .000404  I -.1211998  .0000378  2.1500 0.0258  I   -10.471     .473     -.767     .174   .186500   .172200  -.1213700   -10.100    -1.700  
+911231 48621.00 I   .185126  .000714   .170911  .000381  I -.1232581  .0000346  1.9712 0.0215  I   -10.473     .203     -.831     .231   .184500   .170000  -.1234200   -10.000    -1.700  
+92 1 1 48622.00 I   .182965  .000672   .168856  .000345  I -.1251559  .0000207  1.8335 0.0201  I   -10.437     .507     -.917     .165   .182400   .167900  -.1253000    -9.900    -1.700  
+92 1 2 48623.00 I   .180592  .000672   .166857  .000345  I -.1269451  .0000203  1.7556 0.0144  I   -10.354     .507     -.996     .165   .180300   .165900  -.1270800    -9.900    -1.700  
+92 1 3 48624.00 I   .178161  .000672   .164885  .000345  I -.1286896  .0000200  1.7450 0.0107  I   -10.201     .688    -1.068     .298   .178200   .163900  -.1288200    -9.900    -1.700  
+92 1 4 48625.00 I   .175799  .000264   .162915  .000341  I -.1304568  .0000070  1.7995 0.0105  I   -10.003     .529    -1.066     .298   .175700   .161600  -.1305800   -10.100    -1.500  
+92 1 5 48626.00 I   .173506  .000192   .160942  .000246  I -.1323066  .0000063  1.9081 0.0045  I    -9.781     .529     -.909     .298   .173500   .159600  -.1324300   -10.100    -1.400  
+92 1 6 48627.00 I   .171249  .000200   .158962  .000246  I -.1342857  .0000055  2.0548 0.0044  I    -9.535     .475     -.646     .298   .171100   .157800  -.1344200   -10.000    -1.400  
+92 1 7 48628.00 I   .168993  .000169   .156979  .000254  I -.1364224  .0000061  2.2201 0.0041  I    -9.315     .241     -.461     .298   .168700   .156000  -.1365600    -9.900    -1.400  
+92 1 8 48629.00 I   .166663  .000169   .155043  .000254  I -.1387244  .0000061  2.3807 0.0044  I    -9.222     .197     -.468     .107   .166200   .154200  -.1388600    -9.900    -1.400  
+92 1 9 48630.00 I   .164123  .000172   .153294  .000254  I -.1411761  .0000063  2.5180 0.0059  I    -9.265     .197     -.513     .107   .163600   .152600  -.1413200    -9.800    -1.400  
+92 110 48631.00 I   .161402  .000185   .151714  .000220  I -.1437490  .0000102  2.6210 0.0053  I    -9.283     .791     -.499     .134   .160900   .151000  -.1439000    -9.800    -1.400  
+92 111 48632.00 I   .158585  .000149   .150245  .000208  I -.1464011  .0000085  2.6729 0.0085  I    -9.144     .166     -.527     .121   .158100   .149500  -.1465400    -9.800    -1.400  
+92 112 48633.00 I   .155692  .000357   .148849  .000334  I -.1490736  .0000135  2.6613 0.0082  I    -8.960     .184     -.691     .123   .155300   .148100  -.1491800    -9.800    -1.400  
+92 113 48634.00 I   .152741  .000365   .147494  .000339  I -.1517024  .0000141  2.5859 0.0101  I    -8.956     .304     -.927     .115   .152300   .146700  -.1518000    -9.800    -1.400  
+92 114 48635.00 I   .149763  .000359   .146138  .000332  I -.1542271  .0000151  2.4555 0.0101  I    -9.257     .367     -.997     .298   .149300   .145400  -.1543000    -9.900    -1.300  
+92 115 48636.00 I   .146774  .000366   .144772  .000263  I -.1566078  .0000145  2.3083 0.0098  I    -9.832     .369     -.773     .133   .146200   .144200  -.1566900   -10.000    -1.300  
+92 116 48637.00 I   .143765  .000366   .143469  .000263  I -.1588545  .0000126  2.1937 0.0103  I   -10.496     .343     -.556     .125   .143100   .142900  -.1589500   -10.200    -1.300  
+92 117 48638.00 I   .140654  .000403   .142244  .000248  I -.1610204  .0000147  2.1548 0.0086  I   -10.968     .378     -.626     .134   .139900   .141700  -.1611400   -10.400    -1.300  
+92 118 48639.00 I   .137345  .000298   .141095  .000326  I -.1632032  .0000117  2.2332 0.0085  I   -10.999     .421     -.965     .123   .136700   .140500  -.1633600   -10.500    -1.300  
+92 119 48640.00 I   .133813  .000193   .139997  .000287  I -.1655276  .0000086  2.4339 0.0069  I   -10.616     .479    -1.297     .125   .133500   .139300  -.1657200   -10.500    -1.400  
+92 120 48641.00 I   .130220  .000191   .138870  .000286  I -.1680973  .0000075  2.7136 0.0057  I   -10.135     .465    -1.374     .135   .130300   .138000  -.1683300   -10.500    -1.400  
+92 121 48642.00 I   .126773  .000203   .137616  .000282  I -.1709548  .0000076  2.9935 0.0056  I    -9.818     .493    -1.239     .113   .127200   .136700  -.1712100   -10.500    -1.500  
+92 122 48643.00 I   .123633  .000164   .136222  .000333  I -.1740492  .0000084  3.1682 0.0057  I    -9.600     .460    -1.120     .122   .124100   .135400  -.1742900   -10.400    -1.600  
+92 123 48644.00 I   .120838  .000164   .134840  .000333  I -.1772390  .0000084  3.1864 0.0060  I    -9.442     .460    -1.125     .122   .121000   .134000  -.1774700   -10.300    -1.700  
+92 124 48645.00 I   .118239  .000176   .133514  .000294  I -.1803757  .0000086  3.0656 0.0070  I    -9.437     .437    -1.097     .132   .118000   .132700  -.1805900   -10.200    -1.800  
+92 125 48646.00 I   .115660  .000171   .132246  .000378  I -.1833389  .0000112  2.8511 0.0086  I    -9.644     .344     -.960     .191   .115100   .131300  -.1835400   -10.100    -1.800  
+92 126 48647.00 I   .113031  .000172   .131007  .000394  I -.1860675  .0000148  2.6056 0.0093  I    -9.925     .371     -.876     .326   .112300   .129900  -.1862800    -9.900    -1.900  
+92 127 48648.00 I   .110308  .000172   .129756  .000394  I -.1885557  .0000148  2.3768 0.0102  I   -10.025     .418     -.983     .303   .109500   .128600  -.1887700    -9.800    -2.000  
+92 128 48649.00 I   .107447  .000190   .128450  .000390  I -.1908372  .0000141  2.1964 0.0103  I    -9.890     .477    -1.190     .347   .106800   .127300  -.1910600    -9.700    -2.000  
+92 129 48650.00 I   .104483  .000190   .127120  .000390  I -.1929756  .0000143  2.0974 0.0100  I    -9.674     .466    -1.436     .301   .104200   .126100  -.1932200    -9.600    -2.100  
+92 130 48651.00 I   .101609  .000199   .125938  .000387  I -.1950580  .0000142  2.0764 0.0119  I    -9.421     .466    -1.643     .301   .101600   .125000  -.1953000    -9.500    -2.100  
+92 131 48652.00 I   .098935  .000227   .124947  .000371  I -.1971464  .0000189  2.1095 0.0115  I    -9.104     .487    -1.771     .316   .099100   .123900  -.1973700    -9.500    -2.200  
+92 2 1 48653.00 I   .096518  .000235   .124143  .000387  I -.1992921  .0000181  2.1877 0.0104  I    -8.786     .515    -1.815     .172   .096700   .123000  -.1994900    -9.500    -2.200  
+92 2 2 48654.00 I   .094302  .000203   .123506  .000278  I -.2015317  .0000089  2.2954 0.0102  I    -8.534     .503    -1.695     .158   .094300   .122200  -.2017000    -9.700    -2.300  
+92 2 3 48655.00 I   .092183  .000204   .123008  .000277  I -.2038871  .0000096  2.4158 0.0069  I    -8.416     .465    -1.427     .144   .091700   .121400  -.2040200    -9.600    -2.200  
+92 2 4 48656.00 I   .090027  .000214   .122615  .000274  I -.2063606  .0000106  2.5280 0.0075  I    -8.473     .484    -1.213     .168   .089300   .120700  -.2065100    -9.400    -2.200  
+92 2 5 48657.00 I   .087698  .000216   .122252  .000272  I -.2089429  .0000115  2.6394 0.0080  I    -8.697     .400    -1.266     .128   .086900   .120100  -.2091300    -9.200    -2.300  
+92 2 6 48658.00 I   .085120  .000216   .121749  .000272  I -.2116347  .0000119  2.7366 0.0082  I    -9.004     .380    -1.552     .119   .084500   .119600  -.2118600    -9.000    -2.300  
+92 2 7 48659.00 I   .082425  .000212   .121095  .000251  I -.2143996  .0000118  2.7841 0.0075  I    -9.303     .236    -1.864     .298   .082000   .119100  -.2146100    -9.100    -2.300  
+92 2 8 48660.00 I   .079747  .000145   .120336  .000202  I -.2171790  .0000092  2.7599 0.0077  I    -9.505     .258    -2.042     .298   .079400   .118600  -.2173600    -9.200    -2.400  
+92 2 9 48661.00 I   .077048  .000177   .119538  .000228  I -.2198943  .0000100  2.6606 0.0071  I    -9.550     .260    -2.086     .298   .076700   .118200  -.2200300    -9.400    -2.400  
+92 210 48662.00 I   .074254  .000177   .118767  .000228  I -.2224826  .0000108  2.5086 0.0072  I    -9.572     .306    -2.036     .298   .073900   .117700  -.2225800    -9.500    -2.400  
+92 211 48663.00 I   .071296  .000113   .118085  .000239  I -.2249019  .0000103  2.3279 0.0067  I    -9.777     .335    -1.844     .120   .071100   .117300  -.2249800    -9.700    -2.400  
+92 212 48664.00 I   .068126  .000124   .117511  .000189  I -.2271426  .0000080  2.1597 0.0065  I   -10.210     .329    -1.526     .116   .068100   .116900  -.2272000    -9.800    -2.400  
+92 213 48665.00 I   .064769  .000124   .117034  .000189  I -.2292410  .0000080  2.0505 0.0064  I   -10.677     .303    -1.413     .109   .065100   .116600  -.2293000   -10.000    -2.300  
+92 214 48666.00 I   .061346  .000159   .116670  .000140  I -.2312755  .0000100  2.0371 0.0062  I   -11.010     .307    -1.693     .114   .062000   .116300  -.2313500   -10.200    -2.300  
+92 215 48667.00 I   .057994  .000218   .116441  .000174  I -.2333549  .0000095  2.1427 0.0091  I   -11.097     .271    -2.234     .298   .058900   .116100  -.2334600   -10.300    -2.400  
+92 216 48668.00 I   .054803  .000246   .116362  .000155  I -.2355963  .0000153  2.3546 0.0093  I   -10.912     .178    -2.651     .298   .055800   .115900  -.2357400   -10.500    -2.400  
+92 217 48669.00 I   .051751  .000246   .116424  .000155  I -.2380810  .0000159  2.6173 0.0102  I   -10.611     .161    -2.670     .298   .052600   .115700  -.2382600   -10.600    -2.500  
+92 218 48670.00 I   .048799  .000290   .116604  .000149  I -.2408220  .0000134  2.8532 0.0099  I   -10.353     .137    -2.396     .298   .049500   .115700  -.2410200   -10.700    -2.500  
+92 219 48671.00 I   .045888  .000321   .116854  .000342  I -.2437544  .0000119  2.9900 0.0089  I   -10.123     .173    -2.147     .298   .046300   .115600  -.2439800   -10.700    -2.600  
+92 220 48672.00 I   .042907  .000325   .117120  .000331  I -.2467553  .0000117  2.9867 0.0085  I    -9.889     .190    -2.105     .298   .043000   .115500  -.2469800   -10.800    -2.600  
+92 221 48673.00 I   .039772  .000332   .117341  .000296  I -.2496841  .0000122  2.8523 0.0094  I    -9.710     .195    -2.142     .110   .039800   .115500  -.2499100   -10.800    -2.700  
+92 222 48674.00 I   .036468  .000333   .117447  .000203  I -.2524364  .0000146  2.6473 0.0101  I    -9.651     .260    -2.107     .151   .036500   .115400  -.2526400   -10.800    -2.700  
+92 223 48675.00 I   .033121  .000299   .117372  .000194  I -.2549754  .0000160  2.4325 0.0108  I    -9.670     .283    -2.212     .162   .033200   .115300  -.2551400   -10.800    -2.800  
+92 224 48676.00 I   .029796  .000295   .117134  .000205  I -.2573113  .0000159  2.2473 0.0125  I    -9.614     .423    -2.581     .175   .029900   .115300  -.2574300   -10.700    -2.800  
+92 225 48677.00 I   .026512  .000262   .116772  .000198  I -.2594898  .0000192  2.1213 0.0135  I    -9.548     .486    -3.032     .198   .026600   .115200  -.2595300   -10.700    -2.900  
+92 226 48678.00 I   .023303  .000264   .116361  .000149  I -.2615661  .0000219  2.0317 0.0149  I    -9.711     .442    -3.300     .183   .023200   .115100  -.2615300   -10.600    -3.000  
+92 227 48679.00 I   .020120  .000267   .116041  .000189  I -.2635649  .0000228  1.9770 0.0186  I   -10.007     .442    -3.272     .183   .019800   .115000  -.2634800   -10.500    -3.000  
+92 228 48680.00 I   .016870  .000283   .115871  .000204  I -.2655401  .0000301  1.9822 0.0179  I   -10.167     .482    -3.161     .169   .016400   .115000  -.2654600   -10.300    -3.100  
+92 229 48681.00 I   .013480  .000161   .115880  .000229  I -.2675507  .0000275  2.0516 0.0165  I   -10.006     .538    -3.175     .178   .013000   .115100  -.2675100   -10.100    -3.200  
+92 3 1 48682.00 I   .009978  .000153   .116087  .000159  I -.2696648  .0000136  2.1854 0.0145  I    -9.601     .468    -3.219     .165   .009500   .115200  -.2697000    -9.900    -3.200  
+92 3 2 48683.00 I   .006393  .000153   .116477  .000159  I -.2719343  .0000093  2.3575 0.0080  I    -9.196     .422    -3.154     .150   .006000   .115400  -.2720500    -9.700    -3.300  
+92 3 3 48684.00 I   .002747  .000135   .117026  .000169  I -.2743831  .0000084  2.5395 0.0075  I    -8.927     .523    -3.034     .163   .002500   .115700  -.2745600    -9.500    -3.400  
+92 3 4 48685.00 I  -.000960  .000172   .117699  .000122  I -.2770061  .0000118  2.6999 0.0072  I    -8.780     .444    -3.013     .136  -.000900   .116200  -.2772200    -8.800    -3.500  
+92 3 5 48686.00 I  -.004773  .000172   .118416  .000122  I -.2797652  .0000116  2.8073 0.0084  I    -8.712     .444    -3.165     .131  -.004400   .116700  -.2799900    -8.700    -3.600  
+92 3 6 48687.00 I  -.008589  .000172   .119105  .000122  I -.2825980  .0000120  2.8466 0.0095  I    -8.712     .304    -3.375     .298  -.008000   .117300  -.2828200    -8.600    -3.700  
+92 3 7 48688.00 I  -.012262  .000181   .119710  .000131  I -.2854369  .0000150  2.8212 0.0122  I    -8.720     .304    -3.487     .140  -.011500   .118000  -.2856300    -8.500    -3.800  
+92 3 8 48689.00 I  -.015689  .000206   .120230  .000146  I -.2882203  .0000212  2.7353 0.0131  I    -8.570     .388    -3.404     .226  -.015000   .118800  -.2883600    -8.500    -3.900  
+92 3 9 48690.00 I  -.018919  .000209   .120750  .000143  I -.2908904  .0000214  2.5979 0.0153  I    -8.316     .369    -3.238     .239  -.018400   .119700  -.2910000    -8.500    -4.000  
+92 310 48691.00 I  -.022035  .000261   .121373  .000134  I -.2934116  .0000220  2.4468 0.0153  I    -8.202     .414    -3.195     .256  -.021900   .120700  -.2935400    -8.600    -4.100  
+92 311 48692.00 I  -.025117  .000254   .122197  .000140  I -.2958109  .0000220  2.3764 0.0170  I    -8.423     .481    -3.444     .244  -.025300   .121800  -.2959800    -8.700    -4.200  
+92 312 48693.00 I  -.028234  .000254   .123272  .000140  I -.2982033  .0000258  2.4228 0.0165  I    -8.890     .463    -3.756     .232  -.028700   .123000  -.2984000    -8.700    -4.300  
+92 313 48694.00 I  -.031378  .000263   .124589  .000118  I -.3006878  .0000247  2.5630 0.0170  I    -9.379     .501    -4.126     .238  -.032100   .124300  -.3008900    -8.800    -4.400  
+92 314 48695.00 I  -.034530  .000228   .126117  .000114  I -.3033568  .0000221  2.7858 0.0179  I    -9.542     .533    -4.570     .158  -.035400   .125700  -.3035600    -8.900    -4.500  
+92 315 48696.00 I  -.037731  .000252   .127806  .000135  I -.3062763  .0000260  3.0595 0.0164  I    -9.272     .589    -4.835     .100  -.038700   .127300  -.3064700    -9.000    -4.600  
+92 316 48697.00 I  -.040970  .000268   .129629  .000200  I -.3094750  .0000242  3.3309 0.0169  I    -8.884     .582    -4.740     .101  -.042000   .128900  -.3096600    -9.000    -4.600  
+92 317 48698.00 I  -.044230  .000193   .131570  .000220  I -.3129125  .0000217  3.5254 0.0134  I    -8.774     .546    -4.405     .298  -.045300   .130600  -.3130800    -9.000    -4.700  
+92 318 48699.00 I  -.047505  .000155   .133592  .000206  I -.3164823  .0000113  3.5892 0.0122  I    -9.030     .590    -4.136     .298  -.048500   .132400  -.3166600    -9.000    -4.800  
+92 319 48700.00 I  -.050798  .000150   .135598  .000207  I -.3200428  .0000112  3.5085 0.0084  I    -9.299     .554    -4.072     .298  -.051600   .134300  -.3202100    -8.900    -4.800  
+92 320 48701.00 I  -.054100  .000189   .137506  .000215  I -.3234626  .0000125  3.3178 0.0078  I    -9.392     .490    -4.157     .298  -.054600   .136300  -.3236400    -8.900    -4.900  
+92 321 48702.00 I  -.057350  .000189   .139342  .000226  I -.3266588  .0000110  3.0685 0.0088  I    -9.326     .404    -4.250     .115  -.057600   .138300  -.3268300    -8.800    -5.000  
+92 322 48703.00 I  -.060446  .000211   .141156  .000229  I -.3296001  .0000123  2.8209 0.0077  I    -9.135     .388    -4.393     .123  -.060400   .140300  -.3297700    -8.600    -5.000  
+92 323 48704.00 I  -.063319  .000174   .143002  .000157  I -.3323193  .0000109  2.6295 0.0086  I    -8.781     .388    -4.595     .123  -.063100   .142400  -.3324800    -8.500    -5.100  
+92 324 48705.00 I  -.065917  .000265   .144942  .000164  I -.3348843  .0000119  2.5136 0.0096  I    -8.367     .198    -4.743     .141  -.065700   .144600  -.3350400    -8.400    -5.100  
+92 325 48706.00 I  -.068216  .000310   .147021  .000196  I -.3373685  .0000158  2.4638 0.0104  I    -8.153     .301    -4.766     .126  -.068200   .146800  -.3375000    -8.400    -5.100  
+92 326 48707.00 I  -.070314  .000310   .149236  .000196  I -.3398287  .0000171  2.4643 0.0146  I    -8.233     .301    -4.741     .126  -.070600   .149000  -.3399300    -8.300    -5.100  
+92 327 48708.00 I  -.072339  .000373   .151570  .000240  I -.3423103  .0000245  2.5044 0.0136  I    -8.380     .412    -4.791     .108  -.072800   .151200  -.3424000    -8.300    -5.100  
+92 328 48709.00 I  -.074391  .000401   .153996  .000305  I -.3448509  .0000212  2.5847 0.0169  I    -8.381     .345    -4.931     .298  -.074900   .153400  -.3449700    -8.400    -5.100  
+92 329 48710.00 I  -.076467  .000408   .156449  .000302  I -.3474917  .0000233  2.7012 0.0157  I    -8.272     .345    -5.027     .298  -.077000   .155600  -.3476400    -8.400    -5.100  
+92 330 48711.00 I  -.078543  .000408   .158854  .000302  I -.3502571  .0000232  2.8293 0.0157  I    -8.252     .469    -4.980     .298  -.079000   .157800  -.3504400    -8.500    -5.200  
+92 331 48712.00 I  -.080594  .000266   .161135  .000331  I -.3531461  .0000209  2.9448 0.0148  I    -8.359     .505    -4.865     .298  -.080900   .159900  -.3533400    -8.600    -5.200  
+92 4 1 48713.00 I  -.082596  .000266   .163229  .000331  I -.3561338  .0000184  3.0214 0.0137  I    -8.384     .656    -4.838     .148  -.082800   .161900  -.3563400    -8.700    -5.300  
+92 4 2 48714.00 I  -.084556  .000322   .165149  .000316  I -.3591684  .0000177  3.0364 0.0179  I    -8.108     .656    -4.966     .148  -.084600   .163900  -.3593600    -8.800    -5.400  
+92 4 3 48715.00 I  -.086492  .000417   .166920  .000264  I -.3621836  .0000307  2.9824 0.0154  I    -7.774     .822    -5.110     .187  -.086500   .165900  -.3623500    -8.600    -5.600  
+92 4 4 48716.00 I  -.088401  .000265   .168583  .000385  I -.3651128  .0000253  2.8673 0.0192  I    -7.780     .813    -5.096     .234  -.088200   .167700  -.3652700    -8.500    -5.700  
+92 4 5 48717.00 I  -.090251  .000264   .170205  .000376  I -.3679050  .0000230  2.7127 0.0172  I    -8.052     .816    -4.950     .256  -.090000   .169600  -.3680400    -8.300    -5.800  
+92 4 6 48718.00 I  -.092014  .000347   .171858  .000359  I -.3705355  .0000233  2.5499 0.0171  I    -8.319     .713    -4.813     .326  -.091800   .171500  -.3706600    -8.200    -5.900  
+92 4 7 48719.00 I  -.093706  .000336   .173611  .000324  I -.3730152  .0000252  2.4183 0.0179  I    -8.369     .644    -4.828     .371  -.093500   .173400  -.3731300    -8.200    -6.000  
+92 4 8 48720.00 I  -.095351  .000286   .175516  .000343  I -.3753975  .0000272  2.3630 0.0184  I    -8.188     .603    -5.034     .316  -.095300   .175300  -.3755200    -8.200    -6.000  
+92 4 9 48721.00 I  -.096976  .000279   .177569  .000327  I -.3777761  .0000268  2.4123 0.0203  I    -7.961     .603    -5.431     .316  -.097000   .177300  -.3779200    -8.300    -6.100  
+92 410 48722.00 I  -.098597  .000279   .179745  .000327  I -.3802556  .0000301  2.5621 0.0176  I    -7.720     .470    -5.849     .330  -.098800   .179300  -.3804300    -8.400    -6.100  
+92 411 48723.00 I  -.100207  .000260   .182020  .000220  I -.3829267  .0000228  2.7913 0.0212  I    -7.475     .433    -6.328     .305  -.100600   .181500  -.3831500    -8.500    -6.100  
+92 412 48724.00 I  -.101809  .000203   .184383  .000152  I -.3858506  .0000299  3.0578 0.0182  I    -7.264     .583    -6.729     .394  -.102300   .183800  -.3861300    -8.600    -6.000  
+92 413 48725.00 I  -.103423  .000230   .186819  .000191  I -.3890352  .0000284  3.3030 0.0207  I    -7.173     .559    -6.812     .368  -.104100   .186100  -.3893700    -8.600    -6.000  
+92 414 48726.00 I  -.105076  .000239   .189311  .000237  I -.3924319  .0000285  3.4741 0.0208  I    -7.289     .467    -6.448     .331  -.105900   .188500  -.3927900    -8.700    -5.900  
+92 415 48727.00 I  -.106793  .000240   .191842  .000240  I -.3959418  .0000303  3.5204 0.0211  I    -7.598     .467    -5.794     .331  -.107700   .190800  -.3962800    -8.700    -5.800  
+92 416 48728.00 I  -.108599  .000240   .194378  .000240  I -.3994216  .0000311  3.4134 0.0219  I    -7.914     .467    -5.348     .331  -.109500   .193200  -.3997000    -8.700    -5.800  
+92 417 48729.00 I  -.110484  .000241   .196883  .000233  I -.4027295  .0000316  3.1891 0.0185  I    -8.160     .495    -5.304     .349  -.111300   .195700  -.4029400    -8.700    -5.700  
+92 418 48730.00 I  -.112402  .000213   .199323  .000253  I -.4057833  .0000199  2.9153 0.0178  I    -8.288     .530    -5.535     .139  -.113100   .198100  -.4059300    -8.600    -5.700  
+92 419 48731.00 I  -.114309  .000196   .201692  .000292  I -.4085627  .0000166  2.6495 0.0128  I    -8.269     .578    -5.795     .156  -.114800   .200500  -.4086600    -8.500    -5.800  
+92 420 48732.00 I  -.116160  .000120   .203983  .000278  I -.4110990  .0000161  2.4340 0.0106  I    -8.171     .681    -5.904     .190  -.116500   .202800  -.4111700    -8.400    -5.800  
+92 421 48733.00 I  -.117913  .000163   .206196  .000264  I -.4134536  .0000133  2.2873 0.0106  I    -8.150     .681    -5.835     .190  -.118100   .205200  -.4135300    -8.300    -5.900  
+92 422 48734.00 I  -.119538  .000163   .208379  .000264  I -.4157038  .0000137  2.2313 0.0098  I    -8.251     .659    -5.760     .154  -.119700   .207600  -.4158200    -8.200    -6.000  
+92 423 48735.00 I  -.121032  .000164   .210673  .000278  I -.4179446  .0000143  2.2606 0.0107  I    -8.374     .659    -5.847     .154  -.121300   .209900  -.4181000    -8.100    -6.100  
+92 424 48736.00 I  -.122480  .000174   .213058  .000288  I -.4202420  .0000165  2.3410 0.0105  I    -8.323     .564    -6.084     .112  -.122800   .212300  -.4204300    -7.900    -6.300  
+92 425 48737.00 I  -.123975  .000206   .215479  .000249  I -.4226378  .0000154  2.4551 0.0118  I    -7.965     .505    -6.341     .298  -.124300   .214700  -.4228500    -7.800    -6.400  
+92 426 48738.00 I  -.125501  .000273   .217910  .000244  I -.4251565  .0000170  2.5820 0.0109  I    -7.453     .559    -6.459     .298  -.125900   .217100  -.4253900    -7.700    -6.500  
+92 427 48739.00 I  -.127017  .000275   .220342  .000249  I -.4277973  .0000153  2.6954 0.0106  I    -7.106     .681    -6.406     .102  -.127400   .219400  -.4280300    -7.600    -6.600  
+92 428 48740.00 I  -.128494  .000278   .222791  .000292  I -.4305358  .0000126  2.7743 0.0095  I    -7.126     .714    -6.319     .126  -.129000   .221800  -.4307400    -7.500    -6.700  
+92 429 48741.00 I  -.129927  .000284   .225263  .000283  I -.4333245  .0000112  2.7891 0.0084  I    -7.404     .635    -6.331     .127  -.130500   .224100  -.4335000    -7.500    -6.700  
+92 430 48742.00 I  -.131420  .000284   .227741  .000283  I -.4360890  .0000112  2.7291 0.0086  I    -7.558     .635    -6.360     .127  -.132100   .226500  -.4362300    -7.500    -6.800  
+92 5 1 48743.00 I  -.133096  .000324   .230149  .000304  I -.4387615  .0000131  2.6056 0.0083  I    -7.533     .695    -6.293     .155  -.133800   .228800  -.4388700    -7.500    -6.800  
+92 5 2 48744.00 I  -.135028  .000302   .232420  .000382  I -.4412846  .0000122  2.4352 0.0090  I    -7.501     .639    -6.120     .151  -.135400   .231100  -.4413800    -7.500    -6.900  
+92 5 3 48745.00 I  -.137123  .000289   .234572  .000262  I -.4436273  .0000122  2.2509 0.0080  I    -7.542     .408    -5.969     .131  -.137200   .233300  -.4437200    -7.700    -7.000  
+92 5 4 48746.00 I  -.139228  .000289   .236665  .000262  I -.4457947  .0000103  2.0915 0.0085  I    -7.620     .392    -5.988     .130  -.138800   .235700  -.4458900    -7.800    -7.000  
+92 5 5 48747.00 I  -.141185  .000285   .238758  .000302  I -.4478320  .0000119  1.9970 0.0078  I    -7.679     .353    -6.229     .130  -.140500   .238100  -.4479500    -7.800    -7.100  
+92 5 6 48748.00 I  -.142849  .000285   .240919  .000302  I -.4498196  .0000118  1.9950 0.0122  I    -7.682     .349    -6.579     .109  -.142000   .240500  -.4499600    -7.900    -7.100  
+92 5 7 48749.00 I  -.144143  .000285   .243238  .000302  I -.4518569  .0000214  2.0977 0.0142  I    -7.567     .349    -6.751     .109  -.143500   .243000  -.4520300    -7.900    -7.000  
+92 5 8 48750.00 I  -.145138  .000283   .245766  .000257  I -.4540441  .0000258  2.2879 0.0179  I    -7.420     .355    -6.728     .104  -.144900   .245500  -.4542500    -7.900    -7.000  
+92 5 9 48751.00 I  -.145941  .000387   .248520  .000284  I -.4564424  .0000287  2.5074 0.0176  I    -7.278     .616    -6.665     .298  -.146200   .248000  -.4566700    -7.900    -6.900  
+92 510 48752.00 I  -.146679  .000318   .251420  .000297  I -.4590478  .0000240  2.6935 0.0188  I    -7.084     .717    -6.613     .298  -.147400   .250600  -.4592700    -7.900    -6.900  
+92 511 48753.00 I  -.147478  .000283   .254362  .000232  I -.4618024  .0000244  2.7985 0.0173  I    -6.797     .681    -6.520     .298  -.148400   .253100  -.4620200    -7.900    -6.800  
+92 512 48754.00 I  -.148460  .000345   .257247  .000198  I -.4646084  .0000249  2.7943 0.0162  I    -6.485     .778    -6.319     .298  -.149400   .255700  -.4648100    -7.800    -6.700  
+92 513 48755.00 I  -.149655  .000371   .259981  .000224  I -.4673633  .0000212  2.7070 0.0156  I    -6.393     .658    -6.038     .112  -.150200   .258200  -.4675800    -7.700    -6.700  
+92 514 48756.00 I  -.150888  .000384   .262487  .000233  I -.4700007  .0000189  2.5547 0.0126  I    -6.689     .628    -5.780     .106  -.151000   .260700  -.4702000    -7.700    -6.700  
+92 515 48757.00 I  -.151944  .000332   .264796  .000219  I -.4724541  .0000135  2.3465 0.0112  I    -7.140     .482    -5.779     .135  -.151600   .263100  -.4726300    -7.600    -6.600  
+92 516 48758.00 I  -.152674  .000286   .266971  .000205  I -.4746929  .0000122  2.1360 0.0105  I    -7.495     .377    -6.172     .125  -.152200   .265600  -.4748600    -7.600    -6.600  
+92 517 48759.00 I  -.153100  .000363   .269090  .000249  I -.4767418  .0000162  1.9727 0.0109  I    -7.641     .284    -6.650     .138  -.152800   .268000  -.4769000    -7.700    -6.600  
+92 518 48760.00 I  -.153324  .000371   .271238  .000247  I -.4786626  .0000180  1.8823 0.0124  I    -7.555     .284    -6.759     .138  -.153300   .270400  -.4788200    -7.700    -6.600  
+92 519 48761.00 I  -.153492  .000278   .273491  .000426  I -.4805333  .0000189  1.8725 0.0129  I    -7.372     .664    -6.486     .109  -.153700   .272800  -.4806900    -7.900    -6.700  
+92 520 48762.00 I  -.153702  .000230   .275896  .000335  I -.4824287  .0000186  1.9261 0.0133  I    -7.283     .699    -6.167     .159  -.154200   .275200  -.4825800    -8.100    -6.700  
+92 521 48763.00 I  -.153937  .000211   .278419  .000325  I -.4843968  .0000186  2.0138 0.0142  I    -7.418     .683    -6.020     .137  -.154600   .277600  -.4845400    -8.400    -6.700  
+92 522 48764.00 I  -.154207  .000172   .281007  .000357  I -.4864569  .0000214  2.1033 0.0135  I    -7.812     .798    -6.119     .157  -.155000   .280000  -.4865900    -8.700    -6.700  
+92 523 48765.00 I  -.154584  .000204   .283623  .000449  I -.4886033  .0000196  2.1926 0.0144  I    -8.062     .723    -6.315     .144  -.155400   .282400  -.4887500    -8.900    -6.700  
+92 524 48766.00 I  -.155104  .000204   .286252  .000449  I -.4908421  .0000194  2.2821 0.0119  I    -8.052     .723    -6.411     .144  -.155900   .284700  -.4910000    -9.100    -6.700  
+92 525 48767.00 I  -.155760  .000183   .288822  .000442  I -.4931589  .0000135  2.3460 0.0124  I    -7.984     .568    -6.373     .154  -.156300   .287100  -.4933200    -9.400    -6.700  
+92 526 48768.00 I  -.156535  .000364   .291241  .000355  I -.4955207  .0000156  2.3696 0.0110  I    -8.160     .448    -6.321     .298  -.156600   .289500  -.4956700    -9.500    -6.700  
+92 527 48769.00 I  -.157366  .000389   .293461  .000460  I -.4978772  .0000174  2.3304 0.0107  I    -8.719     .388    -6.393     .101  -.157000   .291800  -.4980000    -9.700    -6.700  
+92 528 48770.00 I  -.158048  .000384   .295568  .000530  I -.5001556  .0000146  2.2136 0.0117  I    -9.404     .333    -6.533     .141  -.157300   .294200  -.5002600    -9.800    -6.700  
+92 529 48771.00 I  -.158364  .000387   .297671  .000451  I -.5022890  .0000155  2.0504 0.0102  I    -9.853     .308    -6.541     .145  -.157500   .296500  -.5023900    -9.900    -6.700  
+92 530 48772.00 I  -.158224  .000403   .299872  .000431  I -.5042519  .0000143  1.8735 0.0108  I   -10.001     .318    -6.260     .167  -.157600   .298900  -.5043500    -9.900    -6.600  
+92 531 48773.00 I  -.157794  .000380   .302214  .000367  I -.5060354  .0000151  1.6949 0.0108  I   -10.019     .302    -5.954     .168  -.157700   .301200  -.5061400    -9.900    -6.600  
+92 6 1 48774.00 I  -.157251  .000377   .304723  .000406  I -.5076563  .0000163  1.5601 0.0111  I   -10.041     .293    -5.989     .163  -.157600   .303500  -.5077700   -10.300    -6.900  
+92 6 2 48775.00 I  -.156693  .000352   .307325  .000450  I -.5091858  .0000164  1.5159 0.0117  I    -9.928     .316    -6.266     .175  -.157400   .306000  -.5093000    -9.600    -6.800  
+92 6 3 48776.00 I  -.156213  .000370   .309905  .000462  I -.5107243  .0000167  1.5803 0.0126  I    -9.536     .383    -6.524     .152  -.157200   .308800  -.5108600    -9.200    -6.700  
+92 6 4 48777.00 I  -.155865  .000419   .312371  .000384  I -.5123786  .0000192  1.7411 0.0138  I    -9.196     .354    -6.637     .158  -.156900   .311500  -.5125300    -8.900    -6.500  
+92 6 5 48778.00 I  -.155629  .000398   .314694  .000394  I -.5142194  .0000220  1.9404 0.0153  I    -9.147     .367    -6.518     .106  -.156600   .314100  -.5143800    -8.700    -6.400  
+92 6 6 48779.00 I  -.155420  .000354   .316894  .000381  I -.5162500  .0000238  2.1114 0.0246  I    -9.249     .358    -6.320     .298  -.156300   .316300  -.5164300    -8.700    -6.200  
+92 6 7 48780.00 I  -.155182  .000412   .319021  .000533  I -.5184166  .0000440  2.2054 0.0263  I    -9.325     .363    -6.156     .107  -.156000   .318300  -.5186000    -8.900    -6.000  
+92 6 8 48781.00 I  -.154897  .000421   .321135  .000431  I -.5206263  .0000470  2.1957 0.0319  I    -9.268     .363    -6.017     .107  -.155500   .320200  -.5208200    -9.300    -6.000  
+92 6 9 48782.00 I  -.154597  .000386   .323300  .000289  I -.5227758  .0000463  2.0892 0.0320  I    -9.130     .234    -5.843     .125  -.154800   .322200  -.5229400    -9.800    -6.000  
+92 610 48783.00 I  -.154299  .000257   .325574  .000366  I -.5247841  .0000435  1.9209 0.0285  I    -9.122     .234    -5.605     .125  -.154200   .324500  -.5249100   -10.200    -6.100  
+92 611 48784.00 I  -.153976  .000226   .327985  .000404  I -.5266096  .0000331  1.7287 0.0292  I    -9.404     .225    -5.387     .113  -.153700   .327100  -.5266900   -10.700    -6.300  
+92 612 48785.00 I  -.153631  .000235   .330557  .000464  I -.5282452  .0000389  1.5475 0.0178  I    -9.962     .473    -5.328     .289  -.153500   .330000  -.5282800   -11.000    -6.600  
+92 613 48786.00 I  -.153301  .000288   .333315  .000424  I -.5297193  .0000130  1.4102 0.0206  I   -10.577     .701    -5.546     .238  -.153400   .333000  -.5297300   -11.100    -6.900  
+92 614 48787.00 I  -.153029  .000219   .336272  .000432  I -.5310856  .0000134  1.3327 0.0098  I   -11.015     .701    -6.052     .238  -.153200   .336000  -.5311000   -10.900    -7.100  
+92 615 48788.00 I  -.152876  .000219   .339376  .000432  I -.5324041  .0000147  1.3134 0.0105  I   -11.238     .774    -6.525     .222  -.153000   .339100  -.5324500   -10.600    -7.300  
+92 616 48789.00 I  -.152878  .000246   .342509  .000504  I -.5337292  .0000162  1.3445 0.0124  I   -11.461     .774    -6.625     .222  -.152900   .342000  -.5338200   -10.300    -7.300  
+92 617 48790.00 I  -.153016  .000639   .345557  .000575  I -.5351059  .0000200  1.4141 0.0131  I   -11.671    1.055    -6.476     .250  -.153100   .344800  -.5352300   -10.100    -7.200  
+92 618 48791.00 I  -.153169  .000729   .348440  .000574  I -.5365664  .0000205  1.5105 0.0163  I   -11.576    1.079    -6.302     .312  -.153300   .347400  -.5367200   -10.000    -7.000  
+92 619 48792.00 I  -.153196  .000753   .351097  .000566  I -.5381314  .0000257  1.6202 0.0176  I   -11.402    1.167    -6.297     .423  -.153400   .349900  -.5383100   -10.200    -6.800  
+92 620 48793.00 I  -.152947  .000761   .353491  .000584  I -.5398079  .0000285  1.7333 0.0186  I   -11.581    1.023    -6.449     .356  -.153300   .352200  -.5400000   -10.500    -6.500  
+92 621 48794.00 I  -.152328  .000696   .355688  .000419  I -.5415918  .0000268  1.8280 0.0196  I   -11.896    1.006    -6.230     .382  -.153000   .354400  -.5417800   -11.100    -6.300  
+92 622 48795.00 I  -.151443  .000748   .357814  .000401  I -.5434488  .0000270  1.8774 0.0176  I   -11.841     .876    -5.916     .339  -.152200   .356600  -.5436200   -11.800    -6.100  
+92 623 48796.00 I  -.150489  .000616   .359987  .000336  I -.5453287  .0000229  1.8731 0.0167  I   -11.617     .639    -5.875     .372  -.151200   .358800  -.5454800   -12.600    -6.000  
+92 624 48797.00 I  -.149658  .000587   .362268  .000327  I -.5471758  .0000196  1.8111 0.0148  I   -11.860     .722    -6.016     .259  -.150200   .361000  -.5473200   -13.400    -6.000  
+92 625 48798.00 I  -.148926  .000548   .364635  .000317  I -.5489337  .0000187  1.6975 0.0145  I   -12.582     .552    -6.266     .170  -.149200   .363400  -.5490800   -14.200    -6.100  
+92 626 48799.00 I  -.148103  .000580   .367069  .000288  I -.5505592  .0000214  1.5491 0.0150  I   -13.435     .564    -6.367     .199  -.148000   .365800  -.5507200   -14.700    -6.300  
+92 627 48800.00 I  -.147055  .000584   .369542  .000262  I -.5520272  .0000235  1.3867 0.0149  I   -14.003     .645    -6.152     .157  -.146800   .368400  -.5521800   -14.900    -6.400  
+92 628 48801.00 I  -.145800  .000433   .372031  .000236  I -.5533401  .0000208  1.2467 0.0157  I   -14.186     .756    -5.812     .171  -.145700   .371000  -.5535000   -14.700    -6.600  
+92 629 48802.00 I  -.144519  .000421   .374531  .000214  I -.5545415  .0000208  1.1695 0.0152  I   -14.124     .692    -5.677     .163  -.144700   .373500  -.5547000   -14.500    -6.700  
+92 630 48803.00 I  -.143342  .000393   .377023  .000216  I -.5557122  .0000223  1.1918 0.0152  I   -13.968     .607    -5.833     .298  -.143600   .375900  -.5558700   -14.300    -6.800  
+92 7 1 48804.00 I  -.142256  .000389   .379477  .000214  I  .4430472  .0000222  1.2973 0.0162  I   -13.824     .607    -6.085     .298  -.142500   .378200   .4429100   -13.900    -6.900  
+92 7 2 48805.00 I  -.141189  .000376   .381860  .000187  I  .4416753  .0000236  1.4565 0.0147  I   -13.758     .607    -6.227     .298  -.141300   .380500   .4415300   -13.600    -7.000  
+92 7 3 48806.00 I  -.140045  .000301   .384172  .000200  I  .4401262  .0000194  1.6397 0.0159  I   -13.855     .436    -6.156     .102  -.140200   .382700   .4399700   -13.900    -7.000  
+92 7 4 48807.00 I  -.138748  .000262   .386425  .000242  I  .4384135  .0000214  1.7702 0.0195  I   -14.145     .432    -5.945     .159  -.139200   .384900   .4382400   -14.300    -6.800  
+92 7 5 48808.00 I  -.137348  .000411   .388614  .000349  I  .4366213  .0000339  1.7941 0.0225  I   -14.556     .433    -5.731     .154  -.138000   .387100   .4364400   -14.800    -6.500  
+92 7 6 48809.00 I  -.135865  .000387   .390743  .000267  I  .4348628  .0000396  1.7055 0.0251  I   -14.958     .434    -5.560     .166  -.136700   .389400   .4346700   -15.400    -6.400  
+92 7 7 48810.00 I  -.134255  .000355   .392840  .000256  I  .4332363  .0000371  1.5389 0.0262  I   -15.276     .399    -5.493     .174  -.135000   .391500   .4330500   -16.000    -6.300  
+92 7 8 48811.00 I  -.132501  .000343   .394965  .000255  I  .4317956  .0000343  1.3405 0.0254  I   -15.475     .356    -5.591     .152  -.133200   .393700   .4316200   -16.400    -6.300  
+92 7 9 48812.00 I  -.130806  .000342   .397220  .000241  I  .4305555  .0000346  1.1414 0.0250  I   -15.508     .356    -5.743     .152  -.131400   .396100   .4304000   -16.600    -6.200  
+92 710 48813.00 I  -.129424  .000359   .399651  .000284  I  .4294993  .0000363  0.9827 0.0208  I   -15.635     .329    -5.839     .120  -.129900   .398800   .4293600   -16.800    -6.200  
+92 711 48814.00 I  -.128330  .000418   .402171  .000254  I  .4285694  .0000232  0.8860 0.0216  I   -15.918     .318    -5.844     .166  -.128700   .401700   .4284400   -16.700    -6.200  
+92 712 48815.00 I  -.127463  .000428   .404642  .000263  I  .4277093  .0000236  0.8432 0.0147  I   -16.200     .237    -5.827     .175  -.128000   .404500   .4275900   -16.400    -6.200  
+92 713 48816.00 I  -.126732  .000409   .406920  .000243  I  .4268671  .0000182  0.8482 0.0145  I   -16.348     .189    -5.829     .168  -.127500   .406800   .4267600   -16.200    -6.200  
+92 714 48817.00 I  -.126065  .000423   .408912  .000245  I  .4259970  .0000169  0.9010 0.0122  I   -16.372     .169    -5.812     .202  -.127000   .408600   .4258900   -16.000    -6.200  
+92 715 48818.00 I  -.125322  .000427   .410633  .000287  I  .4250476  .0000163  1.0063 0.0117  I   -16.368     .289    -5.720     .239  -.126200   .410100   .4249200   -16.200    -6.200  
+92 716 48819.00 I  -.124191  .000421   .412277  .000272  I  .4239735  .0000161  1.1444 0.0123  I   -16.389     .268    -5.603     .221  -.124900   .411600   .4238400   -16.500    -6.300  
+92 717 48820.00 I  -.122472  .000330   .414066  .000295  I  .4227595  .0000185  1.2806 0.0102  I   -16.483     .300    -5.600     .215  -.123100   .413300   .4226200   -17.000    -6.300  
+92 718 48821.00 I  -.120237  .000226   .416097  .000278  I  .4214188  .0000124  1.3974 0.0106  I   -16.639     .263    -5.650     .206  -.120700   .415400   .4212700   -17.500    -6.200  
+92 719 48822.00 I  -.117661  .000206   .418425  .000237  I  .4199735  .0000104  1.4877 0.0077  I   -16.815     .261    -5.698     .202  -.118100   .417800   .4198100   -18.200    -6.200  
+92 720 48823.00 I  -.114962  .000173   .420939  .000237  I  .4184560  .0000092  1.5402 0.0068  I   -16.864     .258    -5.707     .202  -.115400   .420400   .4182900   -19.000    -6.200  
+92 721 48824.00 I  -.112339  .000197   .423477  .000249  I  .4169068  .0000087  1.5515 0.0063  I   -16.785     .178    -5.748     .142  -.112800   .422900   .4167400   -19.600    -6.200  
+92 722 48825.00 I  -.110008  .000206   .425890  .000194  I  .4153668  .0000086  1.5213 0.0057  I   -16.887     .473    -5.896     .186  -.110400   .425200   .4152100   -20.100    -6.200  
+92 723 48826.00 I  -.108033  .000211   .428109  .000198  I  .4138765  .0000073  1.4542 0.0056  I   -17.380     .464    -6.042     .175  -.108200   .427400   .4137200   -20.500    -6.200  
+92 724 48827.00 I  -.106077  .000218   .430216  .000178  I  .4124657  .0000073  1.3653 0.0053  I   -18.060     .527    -6.100     .158  -.106000   .429500   .4122900   -20.600    -6.300  
+92 725 48828.00 I  -.103972  .000217   .432230  .000185  I  .4111448  .0000076  1.2797 0.0066  I   -18.518     .502    -6.026     .135  -.104000   .431500   .4109600   -20.400    -6.300  
+92 726 48829.00 I  -.101805  .000263   .434165  .000173  I  .4098930  .0000111  1.2340 0.0062  I   -18.481     .487    -5.905     .127  -.102100   .433400   .4097000   -20.000    -6.400  
+92 727 48830.00 I  -.099751  .000271   .436034  .000263  I  .4086562  .0000097  1.2501 0.0074  I   -18.074     .509    -5.913     .133  -.100000   .435300   .4084800   -19.600    -6.400  
+92 728 48831.00 I  -.097900  .000263   .437831  .000254  I  .4073690  .0000097  1.3376 0.0065  I   -17.673     .305    -6.096     .298  -.098000   .437200   .4072100   -19.100    -6.400  
+92 729 48832.00 I  -.096176  .000241   .439589  .000222  I  .4059513  .0000087  1.5142 0.0064  I   -17.470     .281    -6.281     .298  -.096100   .439000   .4058000   -18.600    -6.400  
+92 730 48833.00 I  -.094340  .000238   .441446  .000225  I  .4043197  .0000083  1.7533 0.0057  I   -17.567     .224    -6.235     .298  -.094300   .440800   .4041700   -18.400    -6.200  
+92 731 48834.00 I  -.092328  .000233   .443549  .000221  I  .4024494  .0000075  1.9781 0.0078  I   -17.998     .280    -5.994     .108  -.092500   .442700   .4023000   -18.300    -6.100  
+92 8 1 48835.00 I  -.090223  .000324   .445839  .000240  I  .4003910  .0000131  2.1204 0.0073  I   -18.641     .288    -5.745     .137  -.090400   .444900   .4002500   -18.400    -5.900  
+92 8 2 48836.00 I  -.088082  .000285   .448188  .000237  I  .3982501  .0000125  2.1384 0.0091  I   -19.285     .265    -5.597     .135  -.088300   .447300   .3981000   -18.700    -5.700  
+92 8 3 48837.00 I  -.085895  .000284   .450460  .000166  I  .3961543  .0000127  2.0362 0.0089  I   -19.786     .283    -5.452     .149  -.086200   .449700   .3959900   -19.100    -5.600  
+92 8 4 48838.00 I  -.083755  .000283   .452563  .000180  I  .3942075  .0000127  1.8445 0.0089  I   -20.107     .260    -5.315     .128  -.084100   .451900   .3940300   -19.400    -5.500  
+92 8 5 48839.00 I  -.081828  .000278   .454576  .000184  I  .3924681  .0000125  1.6442 0.0093  I   -20.223     .257    -5.378     .123  -.082200   .454100   .3922700   -19.900    -5.500  
+92 8 6 48840.00 I  -.080003  .000270   .456571  .000182  I  .3909099  .0000135  1.4714 0.0079  I   -20.052     .173    -5.604     .124  -.080400   .456100   .3907400   -20.200    -5.700  
+92 8 7 48841.00 I  -.078139  .000178   .458634  .000144  I  .3895165  .0000097  1.3248 0.0089  I   -19.775     .204    -5.851     .298  -.078500   .457900   .3893600   -20.500    -5.800  
+92 8 8 48842.00 I  -.076208  .000201   .460875  .000172  I  .3882434  .0000115  1.2287 0.0082  I   -19.707     .269    -6.000     .163  -.076500   .459800   .3881300   -20.400    -5.800  
+92 8 9 48843.00 I  -.074290  .000207   .463332  .000186  I  .3870412  .0000131  1.1862 0.0097  I   -19.894     .304    -5.974     .157  -.074400   .462000   .3869300   -20.300    -5.900  
+92 810 48844.00 I  -.072315  .000219   .465924  .000210  I  .3858530  .0000157  1.1978 0.0104  I   -20.048     .360    -5.886     .159  -.072500   .464700   .3857400   -19.800    -6.000  
+92 811 48845.00 I  -.070241  .000222   .468541  .000207  I  .3846145  .0000161  1.3029 0.0119  I   -19.997     .414    -5.892     .171  -.070700   .467200   .3844400   -19.700    -5.900  
+92 812 48846.00 I  -.068261  .000235   .471062  .000240  I  .3832183  .0000178  1.4949 0.0121  I   -19.901     .409    -5.885     .188  -.068900   .469700   .3830000   -19.800    -5.700  
+92 813 48847.00 I  -.066397  .000236   .473325  .000232  I  .3816262  .0000181  1.6825 0.0134  I   -19.828     .401    -5.694     .199  -.067100   .471800   .3814100   -20.100    -5.700  
+92 814 48848.00 I  -.064466  .000200   .475307  .000290  I  .3798709  .0000201  1.8172 0.0120  I   -19.995     .411    -5.393     .158  -.065100   .473800   .3796700   -20.500    -5.700  
+92 815 48849.00 I  -.062333  .000208   .477088  .000358  I  .3780113  .0000157  1.8934 0.0129  I   -20.418     .627    -5.267     .159  -.063000   .475900   .3778100   -21.100    -5.600  
+92 816 48850.00 I  -.060005  .000234   .478776  .000329  I  .3761010  .0000162  1.9188 0.0121  I   -20.925     .646    -5.393     .172  -.060700   .477800   .3759100   -21.700    -5.700  
+92 817 48851.00 I  -.057474  .000241   .480454  .000313  I  .3741898  .0000185  1.8958 0.0115  I   -21.248     .609    -5.604     .167  -.058100   .479700   .3740100   -22.200    -5.900  
+92 818 48852.00 I  -.054730  .000224   .482120  .000313  I  .3723218  .0000163  1.8354 0.0118  I   -21.189     .757    -5.773     .123  -.055400   .481500   .3721400   -22.600    -6.100  
+92 819 48853.00 I  -.051810  .000200   .483699  .000302  I  .3705234  .0000148  1.7616 0.0134  I   -20.899     .859    -5.909     .173  -.052500   .483100   .3703400   -22.700    -6.200  
+92 820 48854.00 I  -.048783  .000190   .485162  .000241  I  .3687999  .0000213  1.6840 0.0162  I   -20.838    1.089    -5.998     .160  -.049300   .484600   .3686300   -22.400    -6.400  
+92 821 48855.00 I  -.045664  .000274   .486491  .000200  I  .3671538  .0000289  1.6114 0.0190  I   -21.209    1.131    -6.045     .157  -.046100   .485900   .3669900   -21.900    -6.600  
+92 822 48856.00 I  -.042499  .000354   .487683  .000395  I  .3655657  .0000314  1.5732 0.0214  I   -21.780     .952    -6.043     .173  -.043100   .487100   .3654300   -21.300    -6.700  
+92 823 48857.00 I  -.039354  .000484   .488789  .000510  I  .3639866  .0000316  1.5976 0.0204  I   -21.812     .951    -6.065     .175  -.040100   .488200   .3638700   -20.800    -6.800  
+92 824 48858.00 I  -.036252  .000463   .489888  .000498  I  .3623445  .0000262  1.7001 0.0207  I   -21.320     .951    -6.229     .175  -.037200   .489200   .3622400   -20.300    -6.800  
+92 825 48859.00 I  -.033146  .000462   .491085  .000495  I  .3605595  .0000268  1.8833 0.0165  I   -20.771     .856    -6.454     .149  -.034200   .490300   .3604500   -20.000    -6.700  
+92 826 48860.00 I  -.030036  .000388   .492464  .000551  I  .3585519  .0000199  2.1444 0.0161  I   -20.499     .446    -6.459     .176  -.031000   .491600   .3584100   -20.000    -6.600  
+92 827 48861.00 I  -.026957  .000302   .493979  .000507  I  .3562597  .0000179  2.4385 0.0121  I   -20.712     .298    -6.126     .208  -.027700   .493200   .3560900   -20.300    -6.500  
+92 828 48862.00 I  -.023903  .000203   .495593  .000344  I  .3536961  .0000136  2.6692 0.0109  I   -21.237     .416    -5.714     .197  -.024400   .494900   .3535100   -20.700    -6.200  
+92 829 48863.00 I  -.020858  .000309   .497302  .000425  I  .3509702  .0000124  2.7534 0.0093  I   -21.607     .488    -5.375     .185  -.021300   .496700   .3507800   -21.400    -6.100  
+92 830 48864.00 I  -.017903  .000323   .499041  .000391  I  .3482488  .0000127  2.6592 0.0091  I   -21.624     .488    -5.364     .185  -.018300   .498500   .3480800   -22.100    -6.000  
+92 831 48865.00 I  -.015192  .000345   .500593  .000399  I  .3457035  .0000134  2.4097 0.0093  I   -21.714     .488    -5.457     .185  -.015600   .499900   .3455300   -22.700    -6.000  
+92 9 1 48866.00 I  -.012886  .000353   .501710  .000449  I  .3434557  .0000137  2.0811 0.0098  I   -22.079     .499    -5.363     .177  -.013200   .500900   .3432800   -23.200    -6.100  
+92 9 2 48867.00 I  -.010966  .000387   .502220  .000438  I  .3415326  .0000142  1.7786 0.0105  I   -22.354     .454    -5.245     .137  -.011000   .501200   .3413000   -23.300    -6.200  
+92 9 3 48868.00 I  -.008939  .000416   .502278  .000473  I  .3398721  .0000160  1.5552 0.0119  I   -22.168     .386    -5.472     .144  -.008900   .501100   .3396100   -23.200    -6.400  
+92 9 4 48869.00 I  -.006749  .000354   .502235  .000546  I  .3383956  .0000191  1.4117 0.0108  I   -21.532     .119    -5.923     .167  -.006700   .500900   .3381600   -23.000    -6.400  
+92 9 5 48870.00 I  -.004454  .000335   .502390  .000385  I  .3370185  .0000146  1.3589 0.0127  I   -20.903     .650    -6.154     .167  -.004100   .501200   .3368300   -22.700    -6.500  
+92 9 6 48871.00 I  -.002028  .000303   .502831  .000447  I  .3356478  .0000168  1.3963 0.0111  I   -20.689     .721    -6.054     .168  -.001500   .501600   .3355000   -22.000    -6.300  
+92 9 7 48872.00 I   .000513  .000303   .503509  .000390  I  .3342017  .0000167  1.5064 0.0115  I   -20.853     .686    -5.840     .161   .001000   .502500   .3340600   -21.400    -6.100  
+92 9 8 48873.00 I   .003059  .000287   .504279  .000318  I  .3326178  .0000158  1.6681 0.0117  I   -21.168     .884    -5.726     .155   .003300   .503500   .3324700   -20.900    -5.800  
+92 9 9 48874.00 I   .005476  .000276   .504990  .000274  I  .3308625  .0000163  1.8389 0.0112  I   -21.529     .686    -5.696     .133   .005600   .504400   .3307100   -20.800    -5.600  
+92 910 48875.00 I   .007814  .000433   .505575  .000346  I  .3289492  .0000158  1.9822 0.0113  I   -21.797     .686    -5.542     .133   .008000   .505100   .3287900   -20.900    -5.600  
+92 911 48876.00 I   .010098  .000561   .506007  .000397  I  .3269116  .0000157  2.0848 0.0093  I   -21.955     .308    -5.319     .103   .010500   .505500   .3267400   -21.200    -5.500  
+92 912 48877.00 I   .012363  .000451   .506266  .000560  I  .3247966  .0000100  2.1362 0.0089  I   -22.048     .272    -5.271     .298   .012800   .505700   .3246300   -21.600    -5.600  
+92 913 48878.00 I   .014709  .000446   .506388  .000563  I  .3226585  .0000084  2.1298 0.0065  I   -22.091     .166    -5.423     .298   .015100   .505700   .3225000   -22.200    -5.700  
+92 914 48879.00 I   .017122  .000428   .506485  .000554  I  .3205567  .0000083  2.0643 0.0050  I   -22.054     .275    -5.592     .298   .017300   .505700   .3204100   -22.500    -5.800  
+92 915 48880.00 I   .019557  .000390   .506712  .000547  I  .3185458  .0000056  1.9510 0.0055  I   -21.857     .359    -5.597     .105   .019400   .505700   .3184100   -22.900    -6.000  
+92 916 48881.00 I   .022043  .000267   .507108  .000505  I  .3166597  .0000072  1.8225 0.0048  I   -21.544     .359    -5.438     .105   .021800   .506100   .3165100   -22.800    -6.300  
+92 917 48882.00 I   .024591  .000160   .507480  .000515  I  .3148939  .0000078  1.7147 0.0058  I   -21.401     .359    -5.292     .105   .024400   .506500   .3147400   -22.500    -6.300  
+92 918 48883.00 I   .027139  .000188   .507675  .000351  I  .3132183  .0000090  1.6431 0.0069  I   -21.524     .416    -5.297     .128   .027200   .506800   .3130700   -22.200    -6.400  
+92 919 48884.00 I   .029623  .000331   .507617  .000414  I  .3115916  .0000114  1.6199 0.0072  I   -21.760     .463    -5.428     .104   .029900   .506900   .3114600   -21.800    -6.500  
+92 920 48885.00 I   .032003  .000308   .507391  .000330  I  .3099566  .0000113  1.6625 0.0078  I   -21.891     .450    -5.629     .113   .032400   .506700   .3098500   -21.300    -6.500  
+92 921 48886.00 I   .034238  .000321   .507135  .000336  I  .3082435  .0000107  1.7746 0.0079  I   -21.759     .732    -5.859     .119   .034600   .506500   .3081500   -21.000    -6.500  
+92 922 48887.00 I   .036273  .000345   .507005  .000324  I  .3063870  .0000111  1.9480 0.0077  I   -21.433     .628    -6.023     .120   .036500   .506300   .3062800   -20.800    -6.300  
+92 923 48888.00 I   .038147  .000346   .507048  .000314  I  .3043250  .0000110  2.1888 0.0078  I   -21.182     .628    -5.954     .120   .038300   .506100   .3041800   -20.700    -6.200  
+92 924 48889.00 I   .040098  .000340   .507093  .000325  I  .3020052  .0000110  2.4420 0.0073  I   -21.242     .628    -5.550     .120   .040200   .506100   .3018300   -20.800    -6.000  
+92 925 48890.00 I   .042174  .000265   .507081  .000320  I  .2994677  .0000096  2.6150 0.0070  I   -21.562     .667    -5.104     .148   .042200   .506100   .2992800   -21.000    -5.800  
+92 926 48891.00 I   .044339  .000247   .506983  .000330  I  .2968178  .0000087  2.6602 0.0062  I   -21.819     .558    -4.999     .315   .044500   .506200   .2966300   -21.300    -5.700  
+92 927 48892.00 I   .046531  .000269   .506715  .000420  I  .2941925  .0000078  2.5700 0.0062  I   -21.780     .288    -5.210     .357   .046600   .505900   .2940000   -21.600    -5.600  
+92 928 48893.00 I   .048707  .000269   .506217  .000405  I  .2917083  .0000088  2.3885 0.0062  I   -21.641     .219    -5.436     .490   .048700   .505500   .2915200   -21.800    -5.700  
+92 929 48894.00 I   .050938  .000271   .505528  .000409  I  .2894253  .0000096  2.1777 0.0065  I   -21.721     .155    -5.411     .397   .050800   .504800   .2892500   -21.900    -5.700  
+92 930 48895.00 I   .053292  .000280   .504791  .000387  I  .2873458  .0000095  1.9882 0.0064  I   -21.956     .155    -5.178     .397   .053000   .504000   .2872000   -21.800    -5.700  
+9210 1 48896.00 I   .055692  .000242   .504145  .000345  I  .2854308  .0000086  1.8530 0.0070  I   -21.949     .155    -5.002     .397   .055400   .503200   .2853100   -21.500    -5.800  
+9210 2 48897.00 I   .058118  .000308   .503680  .000361  I  .2836186  .0000104  1.7815 0.0060  I   -21.509     .791    -4.989     .275   .057800   .502500   .2835100   -21.100    -5.800  
+9210 3 48898.00 I   .060608  .000308   .503410  .000368  I  .2818446  .0000085  1.7795 0.0063  I   -20.922     .165    -5.033     .210   .060400   .502300   .2817300   -20.600    -5.700  
+9210 4 48899.00 I   .063234  .000303   .503229  .000389  I  .2800370  .0000072  1.8454 0.0064  I   -20.563     .165    -5.014     .210   .063100   .502100   .2799300   -20.100    -5.700  
+9210 5 48900.00 I   .066052  .000305   .503051  .000382  I  .2781375  .0000096  1.9602 0.0058  I   -20.472     .233    -4.978     .113   .066200   .501900   .2780900   -20.000    -5.600  
+9210 6 48901.00 I   .069055  .000326   .502853  .000348  I  .2761060  .0000090  2.1067 0.0068  I   -20.475     .202    -5.009     .208   .069200   .501900   .2760600   -19.900    -5.500  
+9210 7 48902.00 I   .072135  .000340   .502609  .000291  I  .2739224  .0000096  2.2581 0.0067  I   -20.520     .202    -5.090     .208   .072300   .501800   .2738600   -20.200    -5.300  
+9210 8 48903.00 I   .075164  .000329   .502249  .000357  I  .2715976  .0000099  2.3859 0.0082  I   -20.652     .202    -5.160     .208   .075300   .501600   .2715000   -20.600    -5.200  
+9210 9 48904.00 I   .078011  .000336   .501719  .000414  I  .2691643  .0000133  2.4727 0.0065  I   -20.838     .165    -5.226     .272   .078100   .501100   .2690300   -21.200    -5.100  
+921010 48905.00 I   .080592  .000333   .500975  .000368  I  .2666714  .0000085  2.5021 0.0071  I   -20.948     .184    -5.288     .217   .080600   .500400   .2665000   -21.700    -5.100  
+921011 48906.00 I   .082938  .000227   .500005  .000273  I  .2641812  .0000051  2.4682 0.0050  I   -20.956     .184    -5.317     .217   .082800   .499300   .2640000   -21.900    -5.100  
+921012 48907.00 I   .085182  .000227   .498864  .000273  I  .2617535  .0000052  2.3789 0.0034  I   -20.915     .213    -5.241     .121   .085100   .498100   .2615900   -22.000    -5.200  
+921013 48908.00 I   .087534  .000215   .497713  .000255  I  .2594361  .0000045  2.2516 0.0035  I   -20.796     .205    -5.015     .298   .087500   .496700   .2592900   -21.900    -5.200  
+921014 48909.00 I   .090137  .000191   .496752  .000206  I  .2572455  .0000048  2.1387 0.0034  I   -20.515     .205    -4.702     .298   .090200   .495600   .2571100   -21.400    -5.400  
+921015 48910.00 I   .092869  .000181   .496097  .000161  I  .2551454  .0000052  2.0656 0.0040  I   -20.151     .205    -4.438     .298   .093100   .495000   .2550400   -20.700    -5.500  
+921016 48911.00 I   .095524  .000153   .495655  .000176  I  .2531016  .0000064  2.0304 0.0045  I   -19.851     .208    -4.337     .298   .095800   .494800   .2530300   -19.800    -5.500  
+921017 48912.00 I   .097959  .000186   .495300  .000184  I  .2510598  .0000074  2.0696 0.0062  I   -19.728     .293    -4.431     .153   .098300   .494700   .2509900   -19.200    -5.500  
+921018 48913.00 I   .100177  .000242   .494912  .000177  I  .2489308  .0000106  2.2037 0.0065  I   -19.704     .624    -4.645     .159   .100400   .494500   .2488400   -18.600    -5.500  
+921019 48914.00 I   .102242  .000251   .494385  .000198  I  .2466266  .0000108  2.4151 0.0075  I   -19.601     .663    -4.865     .231   .102200   .493800   .2465000   -18.200    -5.400  
+921020 48915.00 I   .104231  .000250   .493641  .000242  I  .2440833  .0000105  2.6784 0.0075  I   -19.281     .763    -4.958     .223   .103900   .492900   .2439300   -18.000    -5.100  
+921021 48916.00 I   .106221  .000257   .492669  .000269  I  .2412656  .0000104  2.9543 0.0075  I   -18.761     .763    -4.843     .223   .106000   .491700   .2410900   -18.000    -4.900  
+921022 48917.00 I   .108349  .000293   .491575  .000269  I  .2381997  .0000106  3.1553 0.0085  I   -18.351     .722    -4.507     .214   .108200   .490400   .2380300   -18.200    -4.600  
+921023 48918.00 I   .110632  .000297   .490517  .000304  I  .2350047  .0000134  3.2071 0.0079  I   -18.228     .795    -4.019     .208   .110700   .489400   .2348600   -18.600    -4.400  
+921024 48919.00 I   .112984  .000304   .489593  .000324  I  .2318337  .0000118  3.1144 0.0084  I   -18.293     .601    -3.578     .228   .113300   .488500   .2317100   -18.900    -4.300  
+921025 48920.00 I   .115243  .000322   .488773  .000379  I  .2288108  .0000101  2.9169 0.0079  I   -18.350     .659    -3.468     .199   .115600   .487700   .2286900   -19.100    -4.200  
+921026 48921.00 I   .117297  .000301   .487948  .000331  I  .2260199  .0000105  2.6592 0.0071  I   -18.391     .232    -3.642     .199   .117500   .487000   .2259100   -19.200    -4.300  
+921027 48922.00 I   .119065  .000291   .486996  .000282  I  .2234917  .0000099  2.4035 0.0077  I   -18.517     .254    -3.834     .262   .119000   .486000   .2233700   -19.100    -4.400  
+921028 48923.00 I   .120544  .000258   .485856  .000302  I  .2211912  .0000113  2.2130 0.0077  I   -18.692     .270    -3.901     .283   .120200   .484800   .2210600   -18.700    -4.500  
+921029 48924.00 I   .121936  .000290   .484560  .000303  I  .2190355  .0000119  2.1131 0.0088  I   -18.711     .264    -3.915     .265   .121400   .483500   .2188900   -18.200    -4.600  
+921030 48925.00 I   .123457  .000259   .483156  .000359  I  .2169378  .0000135  2.0947 0.0081  I   -18.381     .269    -3.992     .290   .123000   .482200   .2167700   -17.700    -4.700  
+921031 48926.00 I   .125267  .000347   .481680  .000326  I  .2148240  .0000110  2.1427 0.0089  I   -17.788     .277    -4.127     .239   .125000   .480900   .2146500   -17.100    -4.700  
+9211 1 48927.00 I   .127408  .000345   .480182  .000359  I  .2126421  .0000117  2.2218 0.0086  I   -17.256     .277    -4.159     .239   .127400   .479500   .2124900   -16.600    -4.800  
+9211 2 48928.00 I   .129736  .000330   .478689  .000348  I  .2103838  .0000131  2.2909 0.0081  I   -16.939     .286    -4.125     .129   .129900   .478100   .2102600   -16.300    -4.600  
+9211 3 48929.00 I   .132018  .000301   .477293  .000348  I  .2080688  .0000113  2.3347 0.0081  I   -16.823     .479    -4.195     .197   .132200   .476700   .2079700   -16.300    -4.600  
+9211 4 48930.00 I   .134034  .000269   .476071  .000330  I  .2057129  .0000096  2.3832 0.0074  I   -16.880     .451    -4.389     .177   .134000   .475600   .2056100   -15.800    -4.600  
+9211 5 48931.00 I   .135730  .000275   .474916  .000299  I  .2032926  .0000096  2.4613 0.0068  I   -17.026     .451    -4.474     .177   .135500   .474200   .2031600   -16.200    -4.600  
+9211 6 48932.00 I   .137164  .000181   .473676  .000284  I  .2007989  .0000095  2.5136 0.0064  I   -17.230     .502    -4.389     .192   .136900   .473000   .2006600   -16.800    -4.700  
+9211 7 48933.00 I   .138539  .000217   .472270  .000266  I  .1982865  .0000085  2.5026 0.0063  I   -17.402     .481    -4.300     .216   .138100   .471500   .1981600   -17.400    -4.700  
+9211 8 48934.00 I   .140013  .000204   .470709  .000214  I  .1958095  .0000084  2.4441 0.0070  I   -17.483     .502    -4.223     .229   .139500   .470000   .1956900   -18.000    -4.800  
+9211 9 48935.00 I   .141637  .000290   .469027  .000222  I  .1934112  .0000112  2.3467 0.0081  I   -17.500     .317    -4.032     .181   .141100   .468300   .1932900   -18.500    -4.800  
+921110 48936.00 I   .143375  .000321   .467265  .000250  I  .1911216  .0000139  2.2326 0.0087  I   -17.451     .361    -3.687     .225   .142900   .466500   .1909900   -18.400    -4.700  
+921111 48937.00 I   .145215  .000299   .465487  .000244  I  .1889393  .0000133  2.1385 0.0098  I   -17.249     .423    -3.316     .259   .144900   .464700   .1887800   -18.000    -4.600  
+921112 48938.00 I   .147211  .000334   .463795  .000244  I  .1868318  .0000137  2.0828 0.0121  I   -16.860     .477    -3.215     .324   .147000   .463000   .1866800   -17.300    -4.400  
+921113 48939.00 I   .149308  .000353   .462245  .000264  I  .1847543  .0000202  2.0851 0.0104  I   -16.307     .501    -3.488     .353   .149200   .461500   .1846000   -16.700    -4.100  
+921114 48940.00 I   .151459  .000315   .460843  .000272  I  .1826347  .0000156  2.1680 0.0125  I   -15.731     .434    -4.053     .305   .151300   .460100   .1824900   -16.100    -3.900  
+921115 48941.00 I   .153688  .000336   .459540  .000290  I  .1803904  .0000146  2.3348 0.0094  I   -15.464     .468    -4.279     .328   .153500   .458900   .1802400   -15.800    -3.700  
+921116 48942.00 I   .155993  .000267   .458291  .000235  I  .1779453  .0000106  2.5612 0.0102  I   -15.578     .430    -4.006     .303   .155800   .457700   .1778000   -15.600    -3.500  
+921117 48943.00 I   .158277  .000331   .457088  .000228  I  .1752648  .0000143  2.7974 0.0085  I   -15.855     .388    -3.657     .304   .158200   .456500   .1751100   -15.600    -3.300  
+921118 48944.00 I   .160480  .000250   .455924  .000207  I  .1723679  .0000134  2.9815 0.0096  I   -16.111     .167    -3.492     .123   .160600   .455400   .1722100   -16.000    -3.300  
+921119 48945.00 I   .162663  .000270   .454751  .000216  I  .1693369  .0000128  3.0604 0.0104  I   -16.326     .161    -3.368     .114   .163000   .454200   .1691800   -16.600    -3.300  
+921120 48946.00 I   .164781  .000328   .453500  .000210  I  .1662885  .0000160  3.0152 0.0089  I   -16.531     .791    -3.183     .298   .165200   .452900   .1661400   -17.200    -3.400  
+921121 48947.00 I   .166706  .000318   .452072  .000244  I  .1633407  .0000124  2.8676 0.0099  I   -16.739     .130    -2.949     .298   .167200   .451300   .1632000   -17.300    -3.500  
+921122 48948.00 I   .168352  .000314   .450398  .000256  I  .1605728  .0000118  2.6615 0.0086  I   -16.915     .138    -2.788     .298   .168700   .449600   .1604400   -17.300    -3.700  
+921123 48949.00 I   .169592  .000324   .448510  .000255  I  .1580229  .0000120  2.4396 0.0063  I   -16.980     .138    -2.771     .298   .169600   .447800   .1578900   -17.100    -3.800  
+921124 48950.00 I   .170409  .000294   .446462  .000247  I  .1556831  .0000044  2.2491 0.0066  I   -16.881     .176    -2.821     .298   .170200   .445800   .1555500   -16.600    -4.100  
+921125 48951.00 I   .170909  .000326   .444279  .000286  I  .1535019  .0000056  2.1271 0.0038  I   -16.620     .195    -2.799     .298   .170600   .443700   .1533300   -15.900    -4.100  
+921126 48952.00 I   .171329  .000285   .441971  .000279  I  .1514019  .0000061  2.0861 0.0056  I   -16.254     .195    -2.636     .298   .170900   .441400   .1512000   -15.200    -4.100  
+921127 48953.00 I   .171871  .000348   .439582  .000265  I  .1493071  .0000097  2.1130 0.0051  I   -15.821     .791    -2.416     .298   .171400   .439000   .1490900   -14.400    -4.000  
+921128 48954.00 I   .172586  .000311   .437181  .000229  I  .1471611  .0000081  2.1845 0.0089  I   -15.352     .845    -2.292     .298   .172000   .436600   .1469400   -13.600    -3.900  
+921129 48955.00 I   .173419  .000420   .434829  .000254  I  .1449299  .0000149  2.2807 0.0085  I   -14.899     .845    -2.352     .298   .172700   .434200   .1447300   -13.000    -3.600  
+921130 48956.00 I   .174288  .000399   .432567  .000291  I  .1425977  .0000149  2.3830 0.0109  I   -14.560     .896    -2.573     .298   .173500   .432000   .1424200   -12.700    -3.300  
+9212 1 48957.00 I   .175124  .000426   .430416  .000329  I  .1401658  .0000158  2.4796 0.0109  I   -14.452     .738    -2.842     .105   .174400   .429900   .1400100   -12.700    -3.100  
+9212 2 48958.00 I   .175909  .000437   .428369  .000331  I  .1376364  .0000158  2.5825 0.0104  I   -14.536     .655    -3.012     .102   .175600   .427800   .1374800   -13.100    -3.000  
+9212 3 48959.00 I   .176811  .000414   .426428  .000331  I  .1350035  .0000136  2.6773 0.0117  I   -14.543     .655    -2.958     .102   .176900   .425800   .1348500   -13.600    -2.800  
+9212 4 48960.00 I   .178006  .000457   .424602  .000360  I  .1323019  .0000172  2.7116 0.0095  I   -14.584     .513    -2.749     .298   .178200   .424000   .1321700   -14.400    -2.800  
+9212 5 48961.00 I   .179261  .000406   .422835  .000335  I  .1296009  .0000133  2.6839 0.0100  I   -14.752     .483    -2.609     .104   .179500   .422400   .1294800   -15.100    -2.800  
+9212 6 48962.00 I   .180442  .000356   .421016  .000320  I  .1269445  .0000101  2.6249 0.0082  I   -14.959     .358    -2.530     .109   .180600   .420700   .1268200   -15.500    -3.000  
+9212 7 48963.00 I   .181507  .000358   .419048  .000275  I  .1243624  .0000097  2.5322 0.0068  I   -15.060     .341    -2.371     .102   .181600   .418900   .1242500   -15.700    -3.200  
+9212 8 48964.00 I   .182424  .000332   .416981  .000277  I  .1218870  .0000090  2.4190 0.0066  I   -14.963     .318    -2.137     .106   .182400   .416800   .1217800   -15.700    -3.200  
+9212 9 48965.00 I   .183234  .000320   .414896  .000283  I  .1195148  .0000089  2.3347 0.0068  I   -14.659     .293    -2.023     .101   .183300   .414600   .1194100   -15.600    -3.300  
+921210 48966.00 I   .184075  .000322   .412781  .000254  I  .1171967  .0000101  2.3130 0.0089  I   -14.290     .320    -2.251     .112   .184100   .412300   .1170700   -15.300    -3.300  
+921211 48967.00 I   .185114  .000334   .410653  .000234  I  .1148636  .0000154  2.3668 0.0070  I   -13.928     .237    -2.668     .102   .185100   .410100   .1147100   -14.900    -3.200  
+921212 48968.00 I   .186391  .000267   .408560  .000296  I  .1124375  .0000098  2.4973 0.0093  I   -13.673     .557    -2.930     .261   .186200   .407900   .1122700   -14.500    -3.100  
+921213 48969.00 I   .187772  .000286   .406530  .000273  I  .1098522  .0000104  2.6782 0.0069  I   -13.636     .657    -2.892     .389   .187400   .405800   .1096700   -14.200    -3.100  
+921214 48970.00 I   .189068  .000243   .404548  .000264  I  .1070804  .0000097  2.8614 0.0071  I   -13.827     .607    -2.614     .421   .188600   .403800   .1069000   -13.900    -3.000  
+921215 48971.00 I   .190156  .000223   .402565  .000254  I  .1041438  .0000097  3.0016 0.0071  I   -14.091     .604    -2.203     .462   .189800   .401900   .1039600   -13.900    -3.000  
+921216 48972.00 I   .190995  .000233   .400504  .000243  I  .1011071  .0000104  3.0522 0.0077  I   -14.260     .604    -1.834     .462   .190800   .400000   .1009100   -13.900    -2.700  
+921217 48973.00 I   .191741  .000264   .398313  .000254  I  .0980773  .0000119  2.9892 0.0098  I   -14.219     .604    -1.402     .462   .191700   .397900   .0978900   -14.200    -2.700  
+921218 48974.00 I   .192464  .000295   .395974  .000268  I  .0951610  .0000167  2.8295 0.0093  I   -14.027     .438    -1.186     .470   .192700   .395500   .0949800   -14.400    -2.600  
+921219 48975.00 I   .193139  .000313   .393493  .000203  I  .0924394  .0000144  2.6066 0.0108  I   -13.866     .327    -1.286     .323   .193500   .393000   .0922800   -14.700    -2.600  
+921220 48976.00 I   .193720  .000258   .390895  .000276  I  .0899542  .0000137  2.3646 0.0101  I   -13.858     .326    -1.557     .249   .194200   .390300   .0898200   -14.800    -2.600  
+921221 48977.00 I   .194234  .000265   .388228  .000275  I  .0877011  .0000142  2.1501 0.0089  I   -13.984     .565    -1.858     .111   .194800   .387700   .0875800   -14.800    -2.500  
+921222 48978.00 I   .194827  .000266   .385566  .000272  I  .0856314  .0000114  2.0034 0.0087  I   -14.040     .565    -2.110     .111   .195500   .385200   .0855100   -14.700    -2.600  
+921223 48979.00 I   .195638  .000224   .382963  .000270  I  .0836635  .0000100  1.9490 0.0069  I   -13.887     .565    -2.222     .111   .196100   .382700   .0835200   -14.500    -2.600  
+921224 48980.00 I   .196651  .000235   .380395  .000261  I  .0817043  .0000078  1.9820 0.0073  I   -13.621     .615    -2.154     .114   .196700   .380300   .0815400   -14.200    -2.500  
+921225 48981.00 I   .197901  .000240   .377836  .000272  I  .0796786  .0000106  2.0779 0.0054  I   -13.390     .764    -1.948     .298   .197700   .377700   .0794900   -13.800    -2.400  
+921226 48982.00 I   .199439  .000187   .375287  .000213  I  .0775356  .0000075  2.2126 0.0070  I   -13.226     .551    -1.735     .298   .199200   .375100   .0773400   -13.500    -2.200  
+921227 48983.00 I   .201252  .000152   .372765  .000191  I  .0752484  .0000090  2.3624 0.0063  I   -13.070     .153    -1.652     .134   .201000   .372400   .0750600   -13.200    -2.100  
+921228 48984.00 I   .203210  .000172   .370284  .000214  I  .0728132  .0000100  2.5050 0.0069  I   -12.926     .376    -1.731     .114   .203100   .369800   .0726400   -13.100    -1.900  
+921229 48985.00 I   .205074  .000173   .367837  .000218  I  .0702468  .0000104  2.6225 0.0073  I   -12.865     .512    -1.879     .189   .205100   .367200   .0701000   -13.100    -1.800  
+921230 48986.00 I   .206599  .000146   .365331  .000225  I  .0675835  .0000106  2.6940 0.0073  I   -12.859     .512    -1.962     .189   .206700   .364700   .0674400   -13.000    -1.800  
+921231 48987.00 I   .207631  .000152   .362604  .000242  I  .0648749  .0000103  2.7170 0.0088  I   -12.761     .512    -1.923     .189   .207800   .362000   .0647400   -13.100    -1.800  
+93 1 1 48988.00 I   .208194  .000172   .359648  .000240  I  .0621615  .0000141  2.7038 0.0075  I   -12.718     .651    -1.862     .219   .208500   .359100   .0620200   -13.300    -1.900  
+93 1 2 48989.00 I   .208431  .000166   .356562  .000241  I  .0594783  .0000108  2.6575 0.0094  I   -12.881     .587    -1.893     .180   .208700   .355900   .0593100   -13.400    -2.000  
+93 1 3 48990.00 I   .208526  .000197   .353449  .000252  I  .0568545  .0000124  2.5872 0.0081  I   -13.238     .578    -1.969     .198   .208800   .352600   .0566700   -13.400    -2.200  
+93 1 4 48991.00 I   .208647  .000207   .350396  .000251  I  .0543068  .0000120  2.5083 0.0105  I   -13.660     .393    -1.947     .298   .208900   .349600   .0541300   -13.500    -2.500  
+93 1 5 48992.00 I   .208921  .000289   .347431  .000241  I  .0518327  .0000170  2.4451 0.0104  I   -13.951     .377    -1.822     .298   .209000   .346600   .0516600   -13.400    -2.600  
+93 1 6 48993.00 I   .209421  .000313   .344530  .000237  I  .0494074  .0000169  2.4096 0.0116  I   -14.002     .377    -1.780     .298   .209300   .343800   .0492500   -13.400    -2.700  
+93 1 7 48994.00 I   .210159  .000312   .341695  .000223  I  .0469999  .0000158  2.4148 0.0126  I   -13.838     .377    -1.928     .298   .209700   .341100   .0468700   -13.400    -2.700  
+93 1 8 48995.00 I   .211067  .000323   .338925  .000221  I  .0445590  .0000187  2.4764 0.0109  I   -13.503     .290    -2.188     .298   .210600   .338400   .0444300   -13.400    -2.700  
+93 1 9 48996.00 I   .212049  .000299   .336234  .000240  I  .0420253  .0000149  2.6034 0.0122  I   -13.108     .235    -2.304     .298   .211600   .335800   .0418800   -13.400    -2.500  
+93 110 48997.00 I   .213045  .000365   .333641  .000276  I  .0393377  .0000158  2.7739 0.0136  I   -12.856     .261    -2.140     .298   .212800   .333200   .0392000   -13.500    -2.300  
+93 111 48998.00 I   .213955  .000354   .331154  .000273  I  .0364839  .0000227  2.9251 0.0127  I   -12.921     .114    -1.841     .298   .213900   .330800   .0363500   -13.700    -2.100  
+93 112 48999.00 I   .214684  .000225   .328784  .000464  I  .0335118  .0000199  3.0034 0.0151  I   -13.266     .114    -1.665     .298   .214800   .328400   .0333800   -14.000    -2.000  
+93 113 49000.00 I   .215132  .000204   .326497  .000462  I  .0305107  .0000198  2.9810 0.0140  I   -13.680     .216    -1.722     .298   .215300   .326200   .0303900   -14.200    -2.000  
+93 114 49001.00 I   .215226  .000206   .324183  .000462  I  .0275822  .0000196  2.8614 0.0177  I   -13.987     .216    -1.890     .298   .215500   .324100   .0274700   -14.400    -2.100  
+93 115 49002.00 I   .214978  .000303   .321737  .000557  I  .0248090  .0000293  2.6787 0.0136  I   -14.172     .283    -2.023     .298   .215300   .321800   .0247000   -14.600    -2.200  
+93 116 49003.00 I   .214461  .000289   .319091  .000435  I  .0222319  .0000190  2.4749 0.0149  I   -14.290     .207    -2.050     .298   .214500   .319200   .0221400   -14.500    -2.400  
+93 117 49004.00 I   .213815  .000202   .316306  .000317  I  .0198540  .0000056  2.2867 0.0099  I   -14.398     .207    -2.028     .298   .213700   .316400   .0197600   -14.300    -2.600  
+93 118 49005.00 I   .213184  .000208   .313454  .000306  I  .0176442  .0000055  2.1414 0.0039  I   -14.485     .186    -2.037     .298   .212800   .313300   .0175500   -14.000    -2.700  
+93 119 49006.00 I   .212639  .000206   .310580  .000242  I  .0155523  .0000053  2.0527 0.0039  I   -14.469     .791    -2.128     .298   .212300   .310100   .0154500   -13.700    -2.800  
+93 120 49007.00 I   .212180  .000206   .307690  .000254  I  .0135130  .0000056  2.0414 0.0040  I   -14.282     .152    -2.283     .298   .212000   .306900   .0133900   -13.600    -2.800  
+93 121 49008.00 I   .211925  .000182   .304822  .000258  I  .0114464  .0000059  2.0995 0.0043  I   -13.979     .152    -2.328     .298   .211900   .303900   .0113300   -13.500    -2.700  
+93 122 49009.00 I   .211898  .000133   .302089  .000223  I  .0093022  .0000066  2.1932 0.0051  I   -13.722     .187    -2.199     .298   .212000   .301000   .0091800   -13.500    -2.500  
+93 123 49010.00 I   .211999  .000142   .299570  .000282  I  .0070530  .0000083  2.3081 0.0078  I   -13.625     .210    -1.974     .134   .212100   .298500   .0069300   -13.600    -2.300  
+93 124 49011.00 I   .212110  .000240   .297312  .000313  I  .0046827  .0000141  2.4329 0.0081  I   -13.642     .227    -1.772     .175   .212300   .296300   .0045600   -13.700    -2.200  
+93 125 49012.00 I   .212144  .000228   .295279  .000312  I  .0021893  .0000140  2.5515 0.0099  I   -13.705     .212    -1.700     .188   .212400   .294300   .0020500   -13.900    -2.000  
+93 126 49013.00 I   .212037  .000245   .293336  .000316  I -.0004160  .0000138  2.6570 0.0106  I   -13.793     .235    -1.778     .272   .212300   .292300  -.0005600   -14.200    -2.000  
+93 127 49014.00 I   .211751  .000254   .291318  .000305  I -.0031141  .0000158  2.7305 0.0103  I   -13.835     .253    -1.980     .234   .211800   .290300  -.0032600   -14.500    -2.100  
+93 128 49015.00 I   .211304  .000267   .289155  .000302  I -.0058559  .0000154  2.7408 0.0127  I   -13.777     .253    -2.246     .234   .211100   .288300  -.0059900   -14.600    -2.200  
+93 129 49016.00 I   .210612  .000316   .286843  .000326  I -.0085770  .0000200  2.6949 0.0116  I   -13.629     .258    -2.350     .248   .210200   .286100  -.0087000   -14.800    -2.400  
+93 130 49017.00 I   .209635  .000364   .284374  .000254  I -.0112341  .0000173  2.6141 0.0127  I   -13.471     .556    -2.481     .197   .209100   .283700  -.0113600   -15.000    -2.700  
+93 131 49018.00 I   .208394  .000343   .281767  .000275  I -.0137992  .0000158  2.5152 0.0124  I   -13.492     .605    -2.715     .187   .208000   .281100  -.0139300   -14.900    -2.900  
+93 2 1 49019.00 I   .207041  .000355   .279023  .000271  I -.0162659  .0000177  2.4203 0.0109  I   -13.725     .591    -2.840     .298   .206800   .278400  -.0164000   -14.900    -3.200  
+93 2 2 49020.00 I   .205890  .000341   .276161  .000271  I -.0186504  .0000151  2.3570 0.0116  I   -14.044     .846    -2.728     .298   .205800   .275500  -.0187800      .000      .000  
+93 2 3 49021.00 I   .205272  .000326   .273272  .000285  I -.0210032  .0000150  2.3635 0.0106  I   -14.312     .901    -2.545     .185   .205600   .272600  -.0211300   -14.700    -3.500  
+93 2 4 49022.00 I   .205181  .000303   .270501  .000277  I -.0234080  .0000150  2.4618 0.0119  I   -14.286     .901    -2.595     .185   .205600   .269600  -.0235400   -14.400    -3.600  
+93 2 5 49023.00 I   .205410  .000354   .267923  .000288  I -.0259570  .0000186  2.6506 0.0094  I   -13.832     .911    -2.859     .217   .205700   .266800  -.0261000   -14.100    -3.500  
+93 2 6 49024.00 I   .205674  .000251   .265552  .000266  I -.0287298  .0000112  2.9011 0.0113  I   -13.309     .785    -3.090     .181   .205700   .264600  -.0288900   -13.800    -3.400  
+93 2 7 49025.00 I   .205728  .000216   .263317  .000278  I -.0317594  .0000127  3.1521 0.0083  I   -12.956     .843    -2.999     .192   .205700   .262400  -.0319500   -13.600    -3.100  
+93 2 8 49026.00 I   .205400  .000200   .261104  .000271  I -.0350095  .0000122  3.3296 0.0092  I   -12.944     .662    -2.688     .178   .205400   .260200  -.0352200   -13.600    -3.000  
+93 2 9 49027.00 I   .204693  .000244   .258794  .000243  I -.0383773  .0000133  3.3832 0.0079  I   -13.242     .285    -2.450     .298   .204900   .257800  -.0386000   -13.500    -2.900  
+93 210 49028.00 I   .203779  .000228   .256316  .000213  I -.0417285  .0000100  3.2948 0.0083  I   -13.628     .321    -2.430     .298   .204200   .255300  -.0419400   -13.700    -3.000  
+93 211 49029.00 I   .202761  .000220   .253763  .000218  I -.0449247  .0000099  3.0800 0.0075  I   -13.898     .301    -2.563     .298   .203400   .252700  -.0451200   -14.000    -3.100  
+93 212 49030.00 I   .201616  .000226   .251195  .000215  I -.0478655  .0000112  2.7963 0.0072  I   -14.001     .299    -2.714     .298   .202200   .250100  -.0480400   -14.200    -3.300  
+93 213 49031.00 I   .200385  .000208   .248588  .000190  I -.0505214  .0000105  2.5248 0.0072  I   -14.073     .275    -2.963     .298   .200900   .247500  -.0506900   -14.500    -3.500  
+93 214 49032.00 I   .199315  .000256   .245908  .000186  I -.0529393  .0000092  2.3260 0.0070  I   -14.148     .314    -3.302     .298   .199500   .245000  -.0531000   -14.600    -3.800  
+93 215 49033.00 I   .198417  .000267   .243224  .000178  I -.0552035  .0000092  2.2176 0.0061  I   -14.258     .295    -3.616     .298   .198400   .242500  -.0553600   -14.600    -3.900  
+93 216 49034.00 I   .197692  .000252   .240590  .000178  I -.0574059  .0000081  2.2032 0.0074  I   -14.457     .225    -3.825     .298   .197600   .240100  -.0575600   -14.600    -4.100  
+93 217 49035.00 I   .197110  .000271   .238066  .000256  I -.0596344  .0000115  2.2621 0.0070  I   -14.627     .340    -3.899     .298   .197100   .237400  -.0597700   -14.400    -4.100  
+93 218 49036.00 I   .196581  .000298   .235758  .000255  I -.0619457  .0000114  2.3679 0.0095  I   -14.554     .340    -3.815     .298   .196800   .234900  -.0620600   -14.400    -4.000  
+93 219 49037.00 I   .195886  .000367   .233727  .000297  I -.0643816  .0000151  2.5080 0.0084  I   -14.280     .412    -3.669     .298   .196300   .232700  -.0644800   -14.300    -3.900  
+93 220 49038.00 I   .194803  .000374   .232000  .000347  I -.0669627  .0000124  2.6510 0.0091  I   -14.013     .382    -3.503     .298   .195400   .230900  -.0670500   -14.200    -3.700  
+93 221 49039.00 I   .193264  .000290   .230511  .000308  I -.0696740  .0000102  2.7651 0.0079  I   -13.856     .382    -3.342     .298   .193900   .229400  -.0697600   -14.100    -3.700  
+93 222 49040.00 I   .191321  .000291   .229092  .000313  I -.0724767  .0000097  2.8306 0.0068  I   -13.793     .382    -3.277     .298   .191900   .228000  -.0725800   -14.100    -3.700  
+93 223 49041.00 I   .189105  .000232   .227541  .000294  I -.0753148  .0000091  2.8350 0.0065  I   -13.752     .324    -3.382     .298   .189600   .226700  -.0754400   -14.200    -3.700  
+93 224 49042.00 I   .186790  .000206   .225705  .000282  I -.0781292  .0000087  2.7869 0.0054  I   -13.630     .364    -3.583     .298   .187300   .224800  -.0782800   -14.000    -3.900  
+93 225 49043.00 I   .184497  .000205   .223638  .000279  I -.0808761  .0000059  2.7011 0.0059  I   -13.369     .364    -3.741     .298   .184900   .222900  -.0810400   -13.900    -4.000  
+93 226 49044.00 I   .182313  .000195   .221451  .000305  I -.0835222  .0000081  2.5876 0.0041  I   -13.021     .400    -3.814     .298   .182600   .220800  -.0836700   -13.600    -4.300  
+93 227 49045.00 I   .180270  .000174   .219255  .000209  I -.0860470  .0000056  2.4613 0.0050  I   -12.853     .377    -3.892     .161   .180600   .218600  -.0861700   -13.600    -4.500  
+93 228 49046.00 I   .178323  .000206   .217119  .000197  I -.0884464  .0000059  2.3397 0.0051  I   -13.068     .377    -4.038     .161   .178600   .216500  -.0885500   -13.500    -4.600  
+93 3 1 49047.00 I   .176433  .000203   .215094  .000201  I -.0907343  .0000085  2.2419 0.0060  I   -13.574     .349    -4.168     .152   .176600   .214400  -.0908200   -13.500    -4.800  
+93 3 2 49048.00 I   .174589  .000224   .213215  .000182  I -.0929467  .0000104  2.1938 0.0067  I   -14.056     .311    -4.186     .198   .174600   .212500  -.0930500   -13.500    -4.900  
+93 3 3 49049.00 I   .172837  .000217   .211506  .000180  I -.0951493  .0000104  2.2280 0.0074  I   -14.283     .523    -4.184     .171   .172700   .210700  -.0952700   -13.600    -4.900  
+93 3 4 49050.00 I   .171272  .000225   .209920  .000175  I -.0974343  .0000104  2.3571 0.0084  I   -14.290     .523    -4.308     .171   .171200   .209000  -.0975700   -13.300    -5.100  
+93 3 5 49051.00 I   .169878  .000277   .208394  .000166  I -.0998884  .0000133  2.5611 0.0088  I   -14.149     .613    -4.555     .116   .169800   .207600  -.1000400   -13.500    -5.000  
+93 3 6 49052.00 I   .168575  .000261   .206865  .000176  I -.1025715  .0000142  2.8103 0.0086  I   -13.856     .476    -4.781     .298   .168400   .206100  -.1027400   -13.700    -5.000  
+93 3 7 49053.00 I   .167251  .000275   .205305  .000209  I -.1055072  .0000108  3.0541 0.0097  I   -13.524     .521    -4.761     .298   .167000   .204500  -.1056700   -14.000    -4.800  
+93 3 8 49054.00 I   .165878  .000279   .203710  .000207  I -.1086556  .0000131  3.2254 0.0074  I   -13.331     .480    -4.526     .298   .165800   .202900  -.1088200   -13.900    -4.800  
+93 3 9 49055.00 I   .164621  .000289   .202094  .000212  I -.1119204  .0000102  3.2838 0.0084  I   -13.303     .155    -4.325     .298   .164700   .201400  -.1120700   -14.000    -4.800  
+93 310 49056.00 I   .163704  .000289   .200494  .000211  I -.1151810  .0000106  3.2157 0.0082  I   -13.360     .492    -4.288     .298   .163700   .199800  -.1153000   -14.100    -4.800  
+93 311 49057.00 I   .163151  .000260   .198951  .000204  I -.1183182  .0000128  3.0467 0.0083  I   -13.491     .492    -4.377     .298   .163100   .198300  -.1184100   -14.200    -4.900  
+93 312 49058.00 I   .162596  .000258   .197466  .000197  I -.1212618  .0000128  2.8398 0.0110  I   -13.631     .633    -4.483     .298   .162600   .196900  -.1213400   -14.200    -5.000  
+93 313 49059.00 I   .161644  .000294   .196015  .000192  I -.1240068  .0000178  2.6600 0.0110  I   -13.616     .529    -4.644     .107   .161900   .195500  -.1240900   -14.100    -5.100  
+93 314 49060.00 I   .160152  .000258   .194585  .000306  I -.1266037  .0000179  2.5461 0.0126  I   -13.364     .577    -4.923     .116   .160500   .194100  -.1267000   -13.900    -5.400  
+93 315 49061.00 I   .158171  .000259   .193139  .000304  I -.1291206  .0000177  2.4971 0.0124  I   -13.045     .478    -5.234     .158   .158500   .192700  -.1292200   -13.500    -5.600  
+93 316 49062.00 I   .155860  .000272   .191669  .000310  I -.1316158  .0000171  2.5020 0.0119  I   -12.943     .248    -5.445     .170   .156000   .191200  -.1317200   -13.300    -5.600  
+93 317 49063.00 I   .153408  .000283   .190202  .000311  I -.1341389  .0000159  2.5499 0.0118  I   -13.092     .328    -5.523     .152   .153600   .189700  -.1342400   -13.000    -5.700  
+93 318 49064.00 I   .150961  .000286   .188755  .000311  I -.1367249  .0000163  2.6256 0.0107  I   -13.231     .328    -5.469     .152   .151100   .188200  -.1368200   -12.900    -5.700  
+93 319 49065.00 I   .148646  .000274   .187318  .000331  I -.1393946  .0000142  2.7147 0.0102  I   -13.129     .332    -5.414     .157   .148600   .186700  -.1394800   -12.800    -5.700  
+93 320 49066.00 I   .146522  .000303   .185882  .000328  I -.1421530  .0000121  2.8001 0.0101  I   -12.810     .347    -5.324     .149   .146500   .185300  -.1422400   -12.700    -5.500  
+93 321 49067.00 I   .144578  .000329   .184458  .000195  I -.1449878  .0000144  2.8647 0.0072  I   -12.526     .404    -5.138     .108   .144600   .183900  -.1450800   -12.700    -5.500  
+93 322 49068.00 I   .142711  .000254   .183056  .000178  I -.1478704  .0000077  2.8934 0.0082  I   -12.435     .391    -4.961     .160   .142700   .182600  -.1479800   -12.600    -5.500  
+93 323 49069.00 I   .140784  .000245   .181682  .000176  I -.1507614  .0000080  2.8826 0.0055  I   -12.483     .348    -4.949     .216   .140900   .181100  -.1508900   -12.700    -5.600  
+93 324 49070.00 I   .138650  .000249   .180349  .000178  I -.1536223  .0000078  2.8320 0.0057  I   -12.558     .340    -5.167     .184   .138700   .179700  -.1537700   -13.000    -5.700  
+93 325 49071.00 I   .136190  .000258   .179107  .000178  I -.1564082  .0000081  2.7300 0.0058  I   -12.610     .340    -5.614     .184   .136200   .178400  -.1565700   -13.000    -5.900  
+93 326 49072.00 I   .133300  .000213   .177912  .000189  I -.1590735  .0000086  2.6017 0.0054  I   -12.565     .321    -5.919     .204   .133300   .177200  -.1592400   -13.100    -6.100  
+93 327 49073.00 I   .130164  .000193   .176669  .000221  I -.1616137  .0000071  2.4798 0.0055  I   -12.393     .277    -6.054     .174   .130200   .175900  -.1617700   -13.100    -6.400  
+93 328 49074.00 I   .126954  .000190   .175365  .000224  I -.1640387  .0000070  2.3746 0.0076  I   -12.261     .291    -6.159     .149   .127000   .174400  -.1641800   -12.900    -6.600  
+93 329 49075.00 I   .123795  .000206   .174030  .000268  I -.1663745  .0000134  2.3040 0.0076  I   -12.291     .239    -6.262     .298   .123700   .173000  -.1665100   -12.700    -6.800  
+93 330 49076.00 I   .120808  .000168   .172734  .000260  I -.1686651  .0000135  2.2885 0.0093  I   -12.384     .112    -6.312     .298   .120500   .171600  -.1687800   -12.300    -6.800  
+93 331 49077.00 I   .118065  .000182   .171571  .000256  I -.1709796  .0000129  2.3573 0.0088  I   -12.374     .112    -6.328     .298   .117700   .170700  -.1711000   -12.000    -6.900  
+93 4 1 49078.00 I   .115461  .000161   .170608  .000249  I -.1734106  .0000113  2.5188 0.0121  I   -12.193     .112    -6.406     .298   .115200   .169800  -.1735300   -11.700    -6.800  
+93 4 2 49079.00 I   .112819  .000189   .169850  .000226  I -.1760396  .0000204  2.7474 0.0110  I   -11.913     .791    -6.562     .298   .112800   .169100  -.1761600   -11.600    -6.600  
+93 4 3 49080.00 I   .109985  .000251   .169234  .000161  I -.1789125  .0000189  2.9973 0.0128  I   -11.669     .310    -6.630     .298   .110400   .168500  -.1790400   -11.000    -6.500  
+93 4 4 49081.00 I   .106929  .000258   .168672  .000135  I -.1820214  .0000155  3.2089 0.0124  I   -11.588     .310    -6.450     .298   .107500   .167900  -.1821500   -11.400    -6.400  
+93 4 5 49082.00 I   .103742  .000253   .168107  .000178  I -.1852993  .0000160  3.3277 0.0111  I   -11.705     .310    -6.115     .298   .104400   .167300  -.1854200   -12.000    -6.300  
+93 4 6 49083.00 I   .100497  .000243   .167543  .000195  I -.1886393  .0000160  3.3340 0.0113  I   -11.894     .236    -5.905     .298   .101000   .166800  -.1887400   -12.300    -6.300  
+93 4 7 49084.00 I   .097190  .000266   .166999  .000196  I -.1919310  .0000159  3.2312 0.0107  I   -12.000     .236    -5.965     .298   .097400   .166300  -.1920200   -12.600    -6.300  
+93 4 8 49085.00 I   .093870  .000272   .166460  .000200  I -.1950761  .0000143  3.0515 0.0127  I   -12.022     .236    -6.176     .298   .093800   .165900  -.1951500   -12.700    -6.500  
+93 4 9 49086.00 I   .090617  .000223   .165924  .000225  I -.1980306  .0000198  2.8618 0.0107  I   -12.033     .125    -6.353     .298   .090200   .165400  -.1981000   -12.700    -6.700  
+93 410 49087.00 I   .087503  .000279   .165434  .000265  I -.2008148  .0000158  2.7176 0.0129  I   -11.973     .153    -6.465     .134   .087100   .164900  -.2008700   -12.700    -6.800  
+93 411 49088.00 I   .084599  .000288   .165031  .000277  I -.2034890  .0000165  2.6431 0.0131  I   -11.743     .187    -6.582     .122   .084300   .164400  -.2035500   -12.500    -6.900  
+93 412 49089.00 I   .081980  .000304   .164749  .000212  I -.2061209  .0000208  2.6282 0.0128  I   -11.481     .220    -6.689     .142   .081800   .163900  -.2061900   -12.300    -7.100  
+93 413 49090.00 I   .079691  .000297   .164583  .000244  I -.2087601  .0000195  2.6572 0.0142  I   -11.477     .306    -6.677     .145   .079700   .163600  -.2088500   -12.000    -7.200  
+93 414 49091.00 I   .077753  .000287   .164501  .000247  I -.2114531  .0000194  2.7395 0.0138  I   -11.738     .303    -6.562     .132   .077900   .163600  -.2115600   -11.900    -7.200  
+93 415 49092.00 I   .076037  .000287   .164432  .000236  I -.2142464  .0000195  2.8438 0.0158  I   -11.886     .303    -6.561     .132   .076200   .163600  -.2143700   -11.800    -7.200  
+93 416 49093.00 I   .074297  .000303   .164311  .000202  I -.2171315  .0000250  2.9204 0.0121  I   -11.677     .342    -6.775     .112   .074400   .163600  -.2172500   -11.800    -7.200  
+93 417 49094.00 I   .072364  .000233   .164130  .000208  I -.2200758  .0000142  2.9628 0.0134  I   -11.179     .413    -6.919     .121   .072400   .163500  -.2201900   -11.700    -7.100  
+93 418 49095.00 I   .070167  .000252   .163952  .000226  I -.2230453  .0000096  2.9699 0.0102  I   -10.809     .430    -6.854     .130   .070300   .163500  -.2231600   -11.600    -7.100  
+93 419 49096.00 I   .067678  .000203   .163854  .000248  I -.2260020  .0000146  2.9362 0.0091  I   -10.838     .559    -6.730     .159   .068000   .163400  -.2261100   -11.600    -7.100  
+93 420 49097.00 I   .064991  .000208   .163886  .000265  I -.2289063  .0000155  2.8684 0.0107  I   -11.190     .581    -6.775     .256   .065500   .163400  -.2290100   -11.700    -7.200  
+93 421 49098.00 I   .062269  .000234   .164046  .000266  I -.2317394  .0000156  2.8024 0.0111  I   -11.576     .570    -7.003     .222   .062800   .163400  -.2318600   -11.700    -7.400  
+93 422 49099.00 I   .059560  .000208   .164214  .000266  I -.2345184  .0000159  2.7584 0.0146  I   -11.622     .570    -7.146     .222   .060000   .163300  -.2346600   -11.700    -7.600  
+93 423 49100.00 I   .056815  .000247   .164291  .000279  I -.2372510  .0000248  2.6990 0.0132  I   -11.470     .579    -7.299     .251   .057000   .163100  -.2373800   -11.500    -7.700  
+93 424 49101.00 I   .054017  .000269   .164249  .000247  I -.2399097  .0000212  2.6196 0.0165  I   -11.390     .636    -7.341     .298   .054000   .162900  -.2400300   -11.300    -8.000  
+93 425 49102.00 I   .051235  .000294   .164158  .000262  I -.2424968  .0000218  2.5600 0.0131  I   -11.502     .551    -7.297     .300   .051100   .162800  -.2426200   -11.000    -8.200  
+93 426 49103.00 I   .048568  .000275   .164102  .000202  I -.2450409  .0000153  2.5339 0.0132  I   -11.837     .829    -7.303     .345   .048300   .163000  -.2451500   -10.800    -8.200  
+93 427 49104.00 I   .046083  .000262   .164147  .000183  I -.2475844  .0000149  2.5672 0.0106  I   -12.288     .845    -7.420     .379   .045800   .163400  -.2477200   -10.500    -8.300  
+93 428 49105.00 I   .043828  .000260   .164335  .000186  I -.2502105  .0000148  2.7060 0.0106  I   -12.520     .776    -7.610     .316   .043400   .163800  -.2503800   -10.400    -8.200  
+93 429 49106.00 I   .041787  .000279   .164665  .000190  I -.2530275  .0000151  2.9383 0.0106  I   -12.123     .776    -7.690     .316   .041400   .164200  -.2532100   -10.500    -8.200  
+93 430 49107.00 I   .039911  .000278   .165073  .000192  I -.2560917  .0000151  3.1846 0.0099  I   -11.325     .783    -7.647     .280   .039500   .164600  -.2562600   -10.700    -8.000  
+93 5 1 49108.00 I   .038162  .000254   .165485  .000180  I -.2593800  .0000129  3.3808 0.0089  I   -10.625     .783    -7.446     .280   .038000   .165000  -.2595300   -11.100    -7.900  
+93 5 2 49109.00 I   .036530  .000228   .165871  .000096  I -.2628226  .0000095  3.4850 0.0090  I   -10.323     .410    -7.069     .298   .036600   .165300  -.2629600   -11.600    -7.700  
+93 5 3 49110.00 I   .034937  .000282   .166200  .000124  I -.2663070  .0000126  3.4602 0.0091  I   -10.460     .410    -6.657     .298   .035100   .165600  -.2664400   -12.200    -7.700  
+93 5 4 49111.00 I   .033243  .000329   .166454  .000202  I -.2696980  .0000156  3.3004 0.0099  I   -10.874     .264    -6.478     .298   .033300   .165800  -.2698200   -12.800    -7.600  
+93 5 5 49112.00 I   .031379  .000322   .166619  .000197  I -.2728791  .0000152  3.0546 0.0109  I   -11.347     .334    -6.692     .298   .031400   .166100  -.2730100   -13.300    -7.600  
+93 5 6 49113.00 I   .029478  .000322   .166678  .000199  I -.2758004  .0000151  2.7886 0.0107  I   -11.792     .334    -7.115     .298   .029500   .166200  -.2759200   -13.500    -7.700  
+93 5 7 49114.00 I   .027545  .000315   .166609  .000212  I -.2784700  .0000152  2.5638 0.0113  I   -12.174     .334    -7.366     .298   .027700   .166400  -.2785800   -13.500    -7.800  
+93 5 8 49115.00 I   .025583  .000327   .166474  .000238  I -.2809558  .0000167  2.4224 0.0117  I   -12.284     .373    -7.404     .105   .025900   .166400  -.2810600   -13.200    -7.800  
+93 5 9 49116.00 I   .023567  .000292   .166356  .000262  I -.2833422  .0000178  2.3632 0.0110  I   -12.050     .439    -7.370     .141   .024000   .166400  -.2834500   -12.800    -7.900  
+93 510 49117.00 I   .021584  .000244   .166332  .000218  I -.2857034  .0000144  2.3678 0.0104  I   -11.693     .381    -7.354     .298   .022100   .166300  -.2858100   -12.300    -7.800  
+93 511 49118.00 I   .019770  .000179   .166462  .000185  I -.2880885  .0000106  2.4047 0.0089  I   -11.533     .125    -7.374     .298   .020100   .166200  -.2882100   -11.800    -7.800  
+93 512 49119.00 I   .018154  .000181   .166749  .000181  I -.2905120  .0000106  2.4394 0.0076  I   -11.656     .495    -7.402     .155   .018200   .166100  -.2906300   -11.400    -7.700  
+93 513 49120.00 I   .016659  .000192   .167191  .000169  I -.2929677  .0000108  2.4754 0.0070  I   -11.782     .495    -7.402     .155   .016600   .166400  -.2931100   -11.100    -7.500  
+93 514 49121.00 I   .015280  .000186   .167765  .000158  I -.2954686  .0000092  2.5290 0.0069  I   -11.599     .495    -7.368     .155   .015300   .166800  -.2956200   -10.900    -7.500  
+93 515 49122.00 I   .014000  .000185   .168440  .000164  I -.2980239  .0000087  2.5773 0.0063  I   -11.239     .495    -7.276     .155   .014000   .167400  -.2981900   -11.000    -7.400  
+93 516 49123.00 I   .012715  .000192   .169193  .000153  I -.3006133  .0000086  2.5961 0.0077  I   -11.088     .507    -7.121     .164   .012700   .168200  -.3007600   -11.300    -7.400  
+93 517 49124.00 I   .011395  .000270   .170002  .000179  I -.3032040  .0000127  2.5788 0.0064  I   -11.308     .508    -7.010     .180   .011400   .169000  -.3033500   -11.700    -7.500  
+93 518 49125.00 I   .010122  .000263   .170851  .000161  I -.3057593  .0000094  2.5268 0.0076  I   -11.718     .206    -7.106     .135   .010200   .170000  -.3059000   -12.300    -7.600  
+93 519 49126.00 I   .008962  .000260   .171744  .000138  I -.3082467  .0000083  2.4422 0.0060  I   -12.046     .206    -7.431     .135   .009000   .170900  -.3083700   -12.900    -7.800  
+93 520 49127.00 I   .007802  .000272   .172669  .000138  I -.3106349  .0000074  2.3312 0.0056  I   -12.255     .195    -7.694     .110   .007600   .171900  -.3107400   -13.300    -7.900  
+93 521 49128.00 I   .006488  .000306   .173605  .000145  I -.3129097  .0000074  2.2219 0.0056  I   -12.370     .195    -7.751     .110   .006000   .172900  -.3130200   -13.500    -8.100  
+93 522 49129.00 I   .004962  .000323   .174529  .000121  I -.3150881  .0000085  2.1407 0.0056  I   -12.385     .166    -7.664     .105   .004000   .173900  -.3152100   -13.500    -8.300  
+93 523 49130.00 I   .003180  .000307   .175435  .000147  I -.3172081  .0000083  2.1104 0.0050  I   -12.340     .374    -7.541     .298   .001900   .174900  -.3173300   -13.300    -8.300  
+93 524 49131.00 I   .001001  .000288   .176264  .000158  I -.3193324  .0000051  2.1505 0.0049  I   -12.299     .357    -7.459     .298  -.000400   .175700  -.3194600   -13.000    -8.300  
+93 525 49132.00 I  -.001543  .000293   .176968  .000147  I -.3215329  .0000052  2.2621 0.0039  I   -12.297     .309    -7.467     .298  -.002700   .176500  -.3216700   -12.700    -8.200  
+93 526 49133.00 I  -.004186  .000271   .177552  .000173  I -.3238725  .0000058  2.4214 0.0039  I   -12.264     .343    -7.597     .298  -.004900   .177000  -.3240100   -12.500    -8.000  
+93 527 49134.00 I  -.006612  .000255   .178039  .000168  I -.3263804  .0000058  2.5948 0.0056  I   -12.208     .343    -7.764     .298  -.006900   .177400  -.3265300   -12.300    -7.900  
+93 528 49135.00 I  -.008664  .000254   .178485  .000165  I -.3290562  .0000095  2.7504 0.0062  I   -12.087     .343    -7.860     .298  -.008700   .177700  -.3292300   -12.300    -7.600  
+93 529 49136.00 I  -.010426  .000279   .178935  .000144  I -.3318619  .0000110  2.8481 0.0100  I   -11.910     .228    -7.834     .298  -.010400   .178000  -.3320500   -12.500    -7.400  
+93 530 49137.00 I  -.012046  .000327   .179405  .000164  I -.3347233  .0000176  2.8585 0.0095  I   -11.812     .791    -7.665     .298  -.012000   .178400  -.3349100   -12.900    -7.300  
+93 531 49138.00 I  -.013693  .000317   .179884  .000236  I -.3375466  .0000156  2.7720 0.0114  I   -11.935     .122    -7.392     .298  -.013700   .178900  -.3377400   -13.300    -7.200  
+93 6 1 49139.00 I  -.015457  .000320   .180333  .000303  I -.3402389  .0000145  2.6002 0.0110  I   -12.301     .122    -7.129     .298  -.015400   .179500  -.3404000   -13.600    -7.300  
+93 6 2 49140.00 I  -.017306  .000327   .180721  .000305  I -.3427283  .0000154  2.3724 0.0098  I   -12.803     .791    -6.996     .298  -.017100   .180000  -.3428600   -13.800    -7.300  
+93 6 3 49141.00 I  -.019162  .000308   .181046  .000313  I -.3449825  .0000131  2.1410 0.0097  I   -13.288     .791    -6.985     .298  -.018900   .180500  -.3450900   -13.900    -7.300  
+93 6 4 49142.00 I  -.020994  .000281   .181454  .000317  I -.3470279  .0000117  1.9623 0.0091  I   -13.599     .791    -6.988     .298  -.020900   .180900  -.3471100   -14.000    -7.500  
+93 6 5 49143.00 I  -.022821  .000274   .182091  .000324  I -.3489347  .0000126  1.8665 0.0114  I   -13.654     .791    -6.902     .298  -.022800   .181500  -.3489900   -13.800    -7.600  
+93 6 6 49144.00 I  -.024651  .000361   .182945  .000336  I -.3507899  .0000196  1.8576 0.0088  I   -13.514     .283    -6.721     .298  -.024600   .182400  -.3508500   -13.600    -7.500  
+93 6 7 49145.00 I  -.026472  .000260   .183944  .000245  I -.3526721  .0000122  1.9154 0.0117  I   -13.344     .292    -6.582     .298  -.026500   .183300  -.3527500   -13.500    -7.500  
+93 6 8 49146.00 I  -.028260  .000292   .184996  .000179  I -.3546329  .0000129  2.0099 0.0089  I   -13.296     .298    -6.641     .298  -.028300   .184300  -.3547500   -13.300    -7.500  
+93 6 9 49147.00 I  -.029986  .000296   .186010  .000178  I -.3566907  .0000130  2.1009 0.0099  I   -13.369     .298    -6.942     .298  -.030200   .185300  -.3568300   -13.300    -7.400  
+93 610 49148.00 I  -.031655  .000290   .186928  .000197  I -.3588295  .0000149  2.1764 0.0098  I   -13.533     .298    -7.344     .298  -.032000   .186200  -.3590000   -13.500    -7.300  
+93 611 49149.00 I  -.033229  .000292   .187816  .000194  I -.3610373  .0000148  2.2334 0.0091  I   -13.633     .298    -7.653     .298  -.033500   .187000  -.3612300   -13.800    -7.300  
+93 612 49150.00 I  -.034528  .000240   .188782  .000156  I -.3632832  .0000106  2.2510 0.0109  I   -13.643     .258    -7.716     .298  -.034700   .188100  -.3634800   -14.300    -7.300  
+93 613 49151.00 I  -.035578  .000210   .189930  .000218  I -.3655243  .0000161  2.2235 0.0080  I   -13.730     .791    -7.560     .298  -.035600   .189300  -.3657100   -14.700    -7.500  
+93 614 49152.00 I  -.036543  .000172   .191288  .000197  I -.3677157  .0000119  2.1525 0.0101  I   -14.024     .791    -7.349     .102  -.036600   .190600  -.3678700   -15.200    -7.600  
+93 615 49153.00 I  -.037651  .000163   .192787  .000205  I -.3698172  .0000122  2.0451 0.0082  I   -14.497     .791    -7.256     .102  -.037800   .192000  -.3699400   -15.700    -7.800  
+93 616 49154.00 I  -.039083  .000163   .194308  .000190  I -.3718005  .0000114  1.9214 0.0082  I   -15.026     .791    -7.312     .102  -.039200   .193500  -.3719100   -16.000    -8.000  
+93 617 49155.00 I  -.040805  .000159   .195682  .000185  I -.3736641  .0000111  1.8101 0.0077  I   -15.473     .791    -7.313     .102  -.040900   .194800  -.3737700   -16.200    -8.200  
+93 618 49156.00 I  -.042804  .000146   .196851  .000181  I -.3754291  .0000104  1.7240 0.0075  I   -15.752     .791    -7.207     .102  -.042900   .195900  -.3755400   -16.200    -8.300  
+93 619 49157.00 I  -.045006  .000178   .197823  .000239  I -.3771254  .0000101  1.6779 0.0084  I   -15.816     .791    -7.109     .106  -.045100   .196900  -.3772600   -16.200    -8.400  
+93 620 49158.00 I  -.047278  .000179   .198658  .000185  I -.3788066  .0000132  1.6968 0.0083  I   -15.676     .298    -7.109     .182  -.047200   .197800  -.3789600   -16.000    -8.400  
+93 621 49159.00 I  -.049500  .000171   .199429  .000186  I -.3805425  .0000132  1.7863 0.0080  I   -15.454     .511    -7.179     .208  -.049300   .198600  -.3807100   -15.900    -8.400  
+93 622 49160.00 I  -.051507  .000202   .200208  .000178  I -.3823984  .0000090  1.9333 0.0076  I   -15.366     .512    -7.253     .173  -.051300   .199300  -.3825600   -15.800    -8.200  
+93 623 49161.00 I  -.053139  .000189   .201109  .000146  I -.3844143  .0000076  2.0959 0.0062  I   -15.564     .512    -7.291     .173  -.053000   .200200  -.3845700   -15.900    -7.900  
+93 624 49162.00 I  -.054384  .000192   .202161  .000157  I -.3865801  .0000084  2.2283 0.0057  I   -15.910     .399    -7.107     .145  -.054400   .201400  -.3867400   -16.000    -7.700  
+93 625 49163.00 I  -.055378  .000192   .203307  .000153  I -.3888537  .0000085  2.3092 0.0060  I   -16.328     .399    -6.821     .145  -.055600   .202600  -.3890300   -16.400    -7.400  
+93 626 49164.00 I  -.056273  .000190   .204479  .000159  I -.3911756  .0000087  2.3215 0.0057  I   -16.764     .420    -6.642     .134  -.056600   .203800  -.3913600   -16.800    -7.200  
+93 627 49165.00 I  -.057333  .000176   .205615  .000149  I -.3934676  .0000075  2.2464 0.0057  I   -17.057     .286    -6.586     .298  -.057700   .204800  -.3936400   -17.200    -7.100  
+93 628 49166.00 I  -.058551  .000209   .206700  .000193  I -.3956403  .0000073  2.0868 0.0054  I   -17.229     .138    -6.567     .298  -.058800   .205900  -.3958000   -17.700    -7.000  
+93 629 49167.00 I  -.059828  .000181   .207760  .000201  I -.3976239  .0000077  1.8751 0.0050  I   -17.427     .138    -6.535     .298  -.060000   .206900  -.3977900   -18.100    -7.100  
+93 630 49168.00 I  -.061112  .000200   .208846  .000269  I -.3993921  .0000069  1.6680 0.0055  I   -17.718     .182    -6.527     .298  -.061200   .208100  -.3995700   -18.300    -7.100  
+93 7 1 49169.00 I  -.062437  .000190   .210047  .000264  I  .5990240  .0000079  1.5090 0.0053  I   -18.047     .182    -6.655     .298  -.062300   .209300   .5988300   -18.400    -7.200  
+93 7 2 49170.00 I  -.063739  .000190   .211328  .000263  I  .5975692  .0000080  1.4121 0.0050  I   -18.203     .182    -6.887     .298  -.063500   .210600   .5974000   -18.400    -7.300  
+93 7 3 49171.00 I  -.064926  .000177   .212596  .000240  I  .5961771  .0000060  1.3833 0.0058  I   -18.031     .105    -7.056     .298  -.064700   .211800   .5960200   -18.200    -7.300  
+93 7 4 49172.00 I  -.065948  .000087   .213794  .000140  I  .5947836  .0000084  1.4115 0.0050  I   -17.620     .791    -7.038     .298  -.065800   .213000   .5946400   -17.900    -7.300  
+93 7 5 49173.00 I  -.066764  .000179   .214898  .000198  I  .5933425  .0000079  1.4745 0.0080  I   -17.220     .791    -6.855     .187  -.066800   .214100   .5932100   -17.800    -7.300  
+93 7 6 49174.00 I  -.067351  .000224   .215906  .000200  I  .5918315  .0000136  1.5469 0.0081  I   -17.022     .107    -6.637     .209  -.067600   .215200   .5917300   -17.700    -7.300  
+93 7 7 49175.00 I  -.067751  .000238   .216822  .000198  I  .5902532  .0000142  1.6057 0.0102  I   -17.051     .151    -6.473     .171  -.068100   .216100   .5901800   -17.700    -7.200  
+93 7 8 49176.00 I  -.068022  .000234   .217671  .000199  I  .5886301  .0000151  1.6344 0.0108  I   -17.247     .151    -6.350     .171  -.068300   .216800   .5885900   -17.900    -7.100  
+93 7 9 49177.00 I  -.068127  .000242   .218538  .000195  I  .5869959  .0000163  1.6288 0.0107  I   -17.535     .151    -6.400     .171  -.068400   .217600   .5869700   -18.400    -6.900  
+93 710 49178.00 I  -.068091  .000226   .219466  .000175  I  .5853818  .0000151  1.5955 0.0113  I   -17.884     .151    -6.558     .171  -.068500   .218600   .5853600   -18.800    -6.900  
+93 711 49179.00 I  -.068029  .000196   .220478  .000137  I  .5838113  .0000157  1.5430 0.0093  I   -18.225     .190    -6.700     .142  -.068500   .219600   .5837500   -19.300    -6.900  
+93 712 49180.00 I  -.068167  .000183   .221597  .000096  I  .5822997  .0000108  1.4789 0.0091  I   -18.552     .252    -6.842     .298  -.068700   .220900   .5821800   -19.800    -6.900  
+93 713 49181.00 I  -.068638  .000162   .222851  .000095  I  .5808530  .0000093  1.4162 0.0072  I   -18.970     .295    -7.001     .140  -.069000   .222300   .5806900   -20.100    -7.000  
+93 714 49182.00 I  -.069396  .000163   .224261  .000143  I  .5794633  .0000096  1.3654 0.0067  I   -19.529     .256    -7.099     .205  -.069500   .223800   .5792900   -20.300    -7.100  
+93 715 49183.00 I  -.070293  .000161   .225760  .000142  I  .5781232  .0000096  1.3117 0.0068  I   -20.135     .259    -7.114     .203  -.070200   .225100   .5779600   -20.400    -7.300  
+93 716 49184.00 I  -.071136  .000161   .227328  .000144  I  .5768387  .0000096  1.2618 0.0069  I   -20.478     .259    -7.131     .203  -.071100   .226600   .5767200   -20.300    -7.400  
+93 717 49185.00 I  -.071804  .000215   .228951  .000177  I  .5755861  .0000099  1.2525 0.0088  I   -20.439     .271    -7.089     .222  -.071900   .228000   .5755000   -20.200    -7.500  
+93 718 49186.00 I  -.072163  .000256   .230617  .000215  I  .5743088  .0000147  1.3178 0.0070  I   -20.201     .339    -7.122     .204  -.072400   .229700   .5742500   -20.100    -7.500  
+93 719 49187.00 I  -.072376  .000219   .232328  .000235  I  .5729212  .0000100  1.4709 0.0088  I   -19.960     .315    -7.267     .179  -.072800   .231500   .5728500   -20.100    -7.500  
+93 720 49188.00 I  -.072659  .000216   .234071  .000224  I  .5713467  .0000096  1.6847 0.0062  I   -19.857     .317    -7.238     .102  -.073100   .233300   .5712500   -20.100    -7.400  
+93 721 49189.00 I  -.073162  .000228   .235815  .000201  I  .5695413  .0000074  1.9299 0.0060  I   -20.031     .327    -6.900     .298  -.073400   .235100   .5694000   -20.300    -7.300  
+93 722 49190.00 I  -.073761  .000231   .237549  .000190  I  .5674973  .0000071  2.1440 0.0055  I   -20.523     .327    -6.462     .298  -.073800   .236700   .5673200   -20.700    -7.100  
+93 723 49191.00 I  -.074331  .000234   .239305  .000193  I  .5652901  .0000082  2.2478 0.0059  I   -21.227     .327    -6.173     .298  -.074300   .238300   .5651100   -21.100    -7.000  
+93 724 49192.00 I  -.074925  .000150   .241023  .000158  I  .5630454  .0000093  2.2204 0.0103  I   -21.856     .147    -6.120     .298  -.074900   .239900   .5628700   -21.500    -7.000  
+93 725 49193.00 I  -.075668  .000146   .242640  .000135  I  .5608853  .0000190  2.0849 0.0133  I   -22.149     .791    -6.240     .298  -.075600   .241500   .5607100   -22.000    -6.900  
+93 726 49194.00 I  -.076631  .000150   .244148  .000158  I  .5588963  .0000250  1.8872 0.0128  I   -22.081     .791    -6.417     .298  -.076500   .243100   .5587400   -22.400    -7.000  
+93 727 49195.00 I  -.077778  .000133   .245624  .000153  I  .5571142  .0000171  1.6798 0.0151  I   -21.870     .159    -6.574     .115  -.077700   .244800   .5569700   -22.500    -7.000  
+93 728 49196.00 I  -.078981  .000129   .247191  .000156  I  .5555234  .0000171  1.5125 0.0119  I   -21.791     .186    -6.700     .121  -.078900   .246600   .5553900   -22.600    -7.200  
+93 729 49197.00 I  -.080118  .000138   .248935  .000159  I  .5540600  .0000166  1.4327 0.0118  I   -21.953     .186    -6.824     .121  -.080000   .248400   .5539300   -22.500    -7.200  
+93 730 49198.00 I  -.081227  .000132   .250760  .000163  I  .5526319  .0000163  1.4312 0.0115  I   -22.231     .186    -7.024     .121  -.081100   .250200   .5525200   -22.400    -7.300  
+93 731 49199.00 I  -.082366  .000211   .252510  .000201  I  .5511802  .0000159  1.4819 0.0099  I   -22.339     .186    -7.165     .121  -.082200   .252100   .5510800   -22.100    -7.300  
+93 8 1 49200.00 I  -.083461  .000233   .254212  .000223  I  .5496530  .0000113  1.5778 0.0093  I   -22.196     .206    -7.121     .122  -.083200   .253900   .5495600   -22.000    -7.300  
+93 8 2 49201.00 I  -.084451  .000305   .255956  .000259  I  .5480175  .0000096  1.6950 0.0094  I   -21.996     .162    -6.932     .298  -.084100   .255600   .5479300   -21.900    -7.200  
+93 8 3 49202.00 I  -.085351  .000369   .257807  .000301  I  .5462633  .0000149  1.8114 0.0088  I   -21.952     .791    -6.722     .298  -.085100   .257300   .5461500   -22.000    -7.000  
+93 8 4 49203.00 I  -.086260  .000372   .259752  .000304  I  .5443991  .0000147  1.9146 0.0105  I   -22.146     .134    -6.650     .298  -.086300   .259100   .5442500   -22.300    -6.900  
+93 8 5 49204.00 I  -.087499  .000376   .261732  .000301  I  .5424427  .0000147  1.9919 0.0104  I   -22.525     .134    -6.750     .298  -.087800   .261100   .5422800   -22.700    -6.900  
+93 8 6 49205.00 I  -.089023  .000378   .263722  .000271  I  .5404353  .0000146  2.0093 0.0118  I   -22.986     .134    -6.888     .298  -.089300   .263000   .5402800   -22.600    -6.700  
+93 8 7 49206.00 I  -.090640  .000330   .265695  .000231  I  .5384455  .0000185  1.9624 0.0138  I   -23.322     .124    -6.985     .298  -.090700   .265000   .5382800   -23.000    -6.800  
+93 8 8 49207.00 I  -.092153  .000247   .267658  .000183  I  .5365244  .0000235  1.8739 0.0165  I   -23.344     .279    -7.016     .298  -.092100   .267000   .5363500   -23.500    -6.900  
+93 8 9 49208.00 I  -.093437  .000225   .269647  .000135  I  .5347066  .0000273  1.7586 0.0187  I   -23.125     .326    -7.016     .298  -.093100   .268900   .5345300   -23.800    -7.200  
+93 810 49209.00 I  -.094417  .000248   .271698  .000134  I  .5330118  .0000291  1.6295 0.0204  I   -23.045     .316    -7.069     .298  -.094100   .270900   .5328700   -24.100    -7.400  
+93 811 49210.00 I  -.095113  .000241   .273838  .000134  I  .5314421  .0000302  1.5168 0.0224  I   -23.423     .316    -7.159     .298  -.094700   .273000   .5313200   -24.200    -7.700  
+93 812 49211.00 I  -.095676  .000242   .276076  .000128  I  .5299608  .0000340  1.4562 0.0212  I   -24.027     .316    -7.143     .298  -.095300   .275200   .5298800   -24.200    -8.000  
+93 813 49212.00 I  -.096200  .000228   .278363  .000122  I  .5285077  .0000299  1.4617 0.0216  I   -24.426     .316    -7.005     .298  -.095700   .277400   .5284700   -24.100    -8.100  
+93 814 49213.00 I  -.096752  .000187   .280621  .000106  I  .5270114  .0000266  1.5454 0.0185  I   -24.397     .260    -6.890     .298  -.096300   .279500   .5270100   -23.900    -8.200  
+93 815 49214.00 I  -.097412  .000160   .282790  .000094  I  .5253905  .0000217  1.7083 0.0186  I   -24.072     .110    -6.957     .298  -.097000   .281600   .5254000   -23.800    -8.200  
+93 816 49215.00 I  -.098178  .000209   .284807  .000167  I  .5235760  .0000260  1.9276 0.0133  I   -23.742     .309    -7.175     .167  -.097800   .283500   .5235700   -23.700    -8.100  
+93 817 49216.00 I  -.098964  .000158   .286624  .000135  I  .5215295  .0000155  2.1641 0.0144  I   -23.598     .444    -7.312     .185  -.098800   .285400   .5214800   -23.700    -8.100  
+93 818 49217.00 I  -.099720  .000155   .288258  .000134  I  .5192544  .0000125  2.3806 0.0102  I   -23.687     .406    -7.198     .169  -.099800   .287100   .5191600   -23.900    -7.900  
+93 819 49218.00 I  -.100408  .000153   .289796  .000136  I  .5167887  .0000134  2.5358 0.0090  I   -23.953     .406    -6.829     .169  -.100700   .288800   .5166500   -24.200    -7.700  
+93 820 49219.00 I  -.101032  .000140   .291317  .000134  I  .5142204  .0000129  2.5781 0.0093  I   -24.412     .406    -6.574     .169  -.101400   .290500   .5140600   -24.600    -7.600  
+93 821 49220.00 I  -.101549  .000162   .292889  .000180  I  .5116758  .0000128  2.4904 0.0095  I   -24.882     .468    -6.507     .190  -.101800   .292100   .5115200   -25.000    -7.500  
+93 822 49221.00 I  -.101885  .000154   .294559  .000187  I  .5092718  .0000140  2.3059 0.0082  I   -25.156     .466    -6.484     .157  -.102100   .293700   .5091100   -25.300    -7.400  
+93 823 49222.00 I  -.102012  .000155   .296341  .000245  I  .5070777  .0000102  2.0803 0.0109  I   -25.153     .330    -6.494     .109  -.102100   .295500   .5069000   -25.500    -7.400  
+93 824 49223.00 I  -.101942  .000202   .298233  .000312  I  .5051082  .0000166  1.8639 0.0091  I   -24.816     .777    -6.634     .290  -.102000   .297300   .5049300   -25.500    -7.300  
+93 825 49224.00 I  -.101719  .000205   .300269  .000311  I  .5033333  .0000151  1.6974 0.0109  I   -24.203     .777    -6.953     .290  -.101700   .299400   .5031500   -25.400    -7.400  
+93 826 49225.00 I  -.101402  .000213   .302496  .000320  I  .5016905  .0000141  1.5997 0.0102  I   -23.690     .777    -7.229     .290  -.101500   .301700   .5015000   -25.100    -7.400  
+93 827 49226.00 I  -.101072  .000241   .304851  .000309  I  .5001094  .0000138  1.5756 0.0104  I   -23.590     .777    -7.299     .290  -.101100   .304100   .4999300   -24.700    -7.300  
+93 828 49227.00 I  -.100733  .000300   .307233  .000306  I  .4985168  .0000152  1.6191 0.0107  I   -23.844     .862    -7.191     .328  -.100800   .306500   .4983600   -24.400    -7.200  
+93 829 49228.00 I  -.100362  .000302   .309577  .000261  I  .4968559  .0000163  1.7086 0.0103  I   -24.192     .739    -7.003     .368  -.100500   .308900   .4967200   -24.100    -7.100  
+93 830 49229.00 I  -.099972  .000246   .311833  .000224  I  .4950917  .0000140  1.8219 0.0106  I   -24.464     .449    -6.777     .288  -.100100   .311100   .4949600   -24.000    -6.900  
+93 831 49230.00 I  -.099671  .000258   .313947  .000242  I  .4932110  .0000135  1.9384 0.0098  I   -24.611     .449    -6.508     .288  -.099800   .313100   .4930800   -24.000    -6.700  
+93 9 1 49231.00 I  -.099584  .000250   .315892  .000248  I  .4912200  .0000137  2.0395 0.0101  I   -24.610     .446    -6.203     .258  -.099500   .315100   .4910800   -24.200    -6.600  
+93 9 2 49232.00 I  -.099550  .000241   .317749  .000249  I  .4891461  .0000149  2.0983 0.0102  I   -24.508     .446    -6.013     .258  -.099300   .316900   .4890000   -24.500    -6.600  
+93 9 3 49233.00 I  -.099476  .000251   .319598  .000249  I  .4870423  .0000152  2.1003 0.0101  I   -24.446     .446    -6.060     .258  -.099200   .318800   .4868900   -24.800    -6.700  
+93 9 4 49234.00 I  -.099417  .000231   .321454  .000216  I  .4849612  .0000136  2.0551 0.0116  I   -24.520     .567    -6.269     .187  -.099200   .320600   .4847900   -25.200    -6.800  
+93 9 5 49235.00 I  -.099508  .000242   .323283  .000169  I  .4829426  .0000176  1.9783 0.0092  I   -24.583     .317    -6.497     .298  -.099400   .322300   .4827600   -25.600    -6.800  
+93 9 6 49236.00 I  -.099829  .000223   .325038  .000160  I  .4810086  .0000123  1.8895 0.0107  I   -24.514     .261    -6.687     .298  -.099800   .324000   .4808200   -25.600    -7.200  
+93 9 7 49237.00 I  -.100319  .000228   .326663  .000149  I  .4791607  .0000120  1.8095 0.0078  I   -24.510     .791    -6.907     .298  -.100300   .325600   .4789900   -25.600    -7.500  
+93 9 8 49238.00 I  -.100783  .000217   .328160  .000144  I  .4773845  .0000097  1.7449 0.0075  I   -24.824     .791    -7.199     .298  -.100900   .327100   .4772400   -25.400    -7.700  
+93 9 9 49239.00 I  -.101141  .000274   .329689  .000144  I  .4756590  .0000091  1.7159 0.0077  I   -25.359     .791    -7.424     .298  -.101300   .328700   .4755400   -25.100    -7.900  
+93 910 49240.00 I  -.101269  .000250   .331310  .000159  I  .4739299  .0000120  1.7553 0.0072  I   -25.685     .791    -7.440     .298  -.101400   .330300   .4738300   -24.800    -7.900  
+93 911 49241.00 I  -.101089  .000237   .333037  .000156  I  .4721218  .0000111  1.8747 0.0085  I   -25.513     .791    -7.296     .298  -.101200   .332100   .4720200   -24.600    -8.000  
+93 912 49242.00 I  -.100565  .000275   .334903  .000139  I  .4701547  .0000119  2.0716 0.0067  I   -25.009     .791    -7.185     .298  -.100600   .334000   .4700600   -24.300    -7.900  
+93 913 49243.00 I  -.099728  .000235   .336973  .000117  I  .4679612  .0000076  2.3206 0.0079  I   -24.590     .177    -7.190     .298  -.099800   .336100   .4678600   -24.300    -7.700  
+93 914 49244.00 I  -.098778  .000246   .339250  .000156  I  .4655123  .0000103  2.5730 0.0065  I   -24.535     .132    -7.185     .149  -.099000   .338400   .4654000   -24.400    -7.600  
+93 915 49245.00 I  -.097920  .000227   .341636  .000166  I  .4628345  .0000106  2.7673 0.0070  I   -24.830     .122    -7.050     .155  -.098100   .340900   .4627000   -24.800    -7.500  
+93 916 49246.00 I  -.097307  .000211   .344011  .000146  I  .4600161  .0000095  2.8462 0.0072  I   -25.253     .122    -6.860     .155  -.097400   .343300   .4598700   -25.200    -7.300  
+93 917 49247.00 I  -.096914  .000224   .346228  .000166  I  .4571881  .0000097  2.7869 0.0067  I   -25.517     .122    -6.685     .155  -.096900   .345600   .4570400   -25.700    -7.100  
+93 918 49248.00 I  -.096709  .000224   .348151  .000175  I  .4544796  .0000095  2.6157 0.0099  I   -25.554     .122    -6.637     .155  -.096700   .347600   .4543300   -26.200    -7.000  
+93 919 49249.00 I  -.096650  .000225   .349767  .000236  I  .4519736  .0000173  2.3938 0.0065  I   -25.586     .791    -6.634     .183  -.096700   .349400   .4518200   -26.500    -7.100  
+93 920 49250.00 I  -.096757  .000183   .351130  .000192  I  .4496859  .0000089  2.1901 0.0101  I   -25.778     .255    -6.554     .220  -.096800   .350800   .4495400   -26.700    -7.000  
+93 921 49251.00 I  -.096961  .000189   .352364  .000187  I  .4475688  .0000106  2.0603 0.0069  I   -25.920     .481    -6.489     .267  -.097100   .352000   .4474300   -26.700    -7.000  
+93 922 49252.00 I  -.097137  .000166   .353660  .000186  I  .4455356  .0000106  2.0195 0.0076  I   -25.653     .608    -6.490     .265  -.097300   .353200   .4454100   -26.500    -7.100  
+93 923 49253.00 I  -.097226  .000156   .355198  .000177  I  .4435103  .0000108  2.0370 0.0076  I   -24.982     .608    -6.457     .265  -.097300   .354400   .4434000   -26.200    -7.000  
+93 924 49254.00 I  -.097154  .000176   .356944  .000175  I  .4414471  .0000109  2.0979 0.0074  I   -24.493     .608    -6.516     .265  -.097200   .355900   .4413300   -25.800    -7.000  
+93 925 49255.00 I  -.096846  .000165   .358816  .000183  I  .4393042  .0000102  2.1898 0.0125  I   -24.450     .608    -6.519     .265  -.096800   .357700   .4391800   -25.400    -6.900  
+93 926 49256.00 I  -.096384  .000227   .360749  .000236  I  .4370666  .0000226  2.2843 0.0103  I   -24.583     .645    -6.379     .241  -.096400   .359600   .4369400   -25.000    -6.800  
+93 927 49257.00 I  -.095887  .000291   .362707  .000215  I  .4347408  .0000180  2.3632 0.0122  I   -24.665     .687    -6.258     .181  -.095900   .361700   .4346100   -24.800    -6.700  
+93 928 49258.00 I  -.095487  .000216   .364679  .000178  I  .4323504  .0000092  2.4115 0.0100  I   -24.652     .633    -6.169     .163  -.095600   .363900   .4322300   -24.800    -6.500  
+93 929 49259.00 I  -.095344  .000215   .366640  .000172  I  .4299340  .0000089  2.4112 0.0064  I   -24.637     .829    -6.102     .189  -.095400   .366000   .4298200   -24.900    -6.500  
+93 930 49260.00 I  -.095565  .000219   .368552  .000172  I  .4275414  .0000088  2.3708 0.0063  I   -24.633     .829    -6.150     .189  -.095400   .368000   .4274400   -25.100    -6.500  
+9310 1 49261.00 I  -.095760  .000218   .370405  .000176  I  .4251976  .0000088  2.3148 0.0056  I   -24.496     .829    -6.232     .189  -.095400   .369900   .4250900   -25.300    -6.600  
+9310 2 49262.00 I  -.095500  .000226   .372243  .000166  I  .4229157  .0000070  2.2470 0.0061  I   -24.490     .908    -6.368     .207  -.095300   .371700   .4228100   -25.400    -6.700  
+9310 3 49263.00 I  -.094925  .000203   .374109  .000172  I  .4207044  .0000084  2.1768 0.0046  I   -24.506     .986    -6.599     .250  -.094900   .373400   .4206100   -25.400    -6.900  
+9310 4 49264.00 I  -.094225  .000169   .376028  .000164  I  .4185569  .0000061  2.1223 0.0083  I   -24.422     .918    -6.768     .195  -.094300   .375200   .4184500   -25.300    -7.100  
+9310 5 49265.00 I  -.093568  .000206   .377975  .000149  I  .4164492  .0000144  2.0995 0.0088  I   -24.311     .492    -6.860     .298  -.093900   .377100   .4163300   -25.100    -7.300  
+9310 6 49266.00 I  -.093027  .000228   .379897  .000142  I  .4143430  .0000165  2.1215 0.0111  I   -24.354     .530    -6.912     .298  -.093500   .378900   .4142100   -24.600    -7.400  
+9310 7 49267.00 I  -.092536  .000212   .381742  .000134  I  .4121963  .0000169  2.1732 0.0118  I   -24.537     .530    -6.871     .298  -.092800   .380700   .4120700   -24.200    -7.400  
+9310 8 49268.00 I  -.091935  .000197   .383500  .000125  I  .4099864  .0000168  2.2556 0.0113  I   -24.531     .530    -6.708     .298  -.092100   .382500   .4098600   -23.900    -7.400  
+9310 9 49269.00 I  -.091076  .000194   .385238  .000194  I  .4076651  .0000151  2.3978 0.0115  I   -24.249     .530    -6.498     .298  -.091100   .384200   .4075300   -23.500    -7.300  
+931010 49270.00 I  -.089912  .000169   .387006  .000184  I  .4051709  .0000157  2.5995 0.0102  I   -23.848     .538    -6.358     .298  -.089900   .386000   .4050400   -23.400    -7.200  
+931011 49271.00 I  -.088541  .000172   .388858  .000201  I  .4024546  .0000137  2.8358 0.0094  I   -23.561     .363    -6.329     .116  -.088500   .387900   .4023200   -23.400    -6.900  
+931012 49272.00 I  -.087093  .000176   .390877  .000231  I  .3995030  .0000104  3.0611 0.0085  I   -23.573     .294    -6.317     .157  -.087000   .390000   .3993700   -23.600    -6.700  
+931013 49273.00 I  -.085687  .000145   .393093  .000231  I  .3963491  .0000102  3.2365 0.0074  I   -23.811     .318    -6.234     .139  -.085600   .392300   .3962100   -23.900    -6.600  
+931014 49274.00 I  -.084433  .000167   .395382  .000234  I  .3930678  .0000106  3.2986 0.0074  I   -24.012     .318    -6.229     .139  -.084300   .394500   .3929500   -24.200    -6.400  
+931015 49275.00 I  -.083389  .000175   .397498  .000232  I  .3898032  .0000106  3.2069 0.0063  I   -23.934     .318    -6.287     .139  -.083200   .396600   .3897000   -24.600    -6.300  
+931016 49276.00 I  -.082597  .000163   .399324  .000180  I  .3866909  .0000067  3.0044 0.0058  I   -23.489     .352    -6.331     .155  -.082400   .398400   .3865900   -24.800    -6.300  
+931017 49277.00 I  -.082066  .000161   .400879  .000175  I  .3838085  .0000048  2.7596 0.0040  I   -23.037     .383    -6.208     .134  -.081800   .399900   .3837000   -24.900    -6.300  
+931018 49278.00 I  -.081697  .000155   .402206  .000165  I  .3811629  .0000044  2.5414 0.0033  I   -23.032     .313    -5.863     .121  -.081400   .401200   .3810500   -24.800    -6.300  
+931019 49279.00 I  -.081249  .000152   .403378  .000172  I  .3787015  .0000044  2.3959 0.0030  I   -23.383     .248    -5.557     .125  -.081000   .402400   .3785800   -24.600    -6.300  
+931020 49280.00 I  -.080501  .000142   .404517  .000178  I  .3763403  .0000040  2.3427 0.0030  I   -23.567     .248    -5.575     .125  -.080700   .403700   .3762200   -24.200    -6.300  
+931021 49281.00 I  -.079780  .000138   .405850  .000185  I  .3739861  .0000042  2.3794 0.0029  I   -23.227     .248    -5.774     .125  -.080300   .405100   .3738500   -23.600    -6.300  
+931022 49282.00 I  -.079255  .000139   .407354  .000188  I  .3715641  .0000041  2.4684 0.0028  I   -22.639     .248    -5.927     .125  -.079800   .406700   .3714300   -23.000    -6.300  
+931023 49283.00 I  -.078848  .000146   .408918  .000222  I  .3690462  .0000038  2.5669 0.0033  I   -22.252     .116    -5.911     .125  -.079300   .408300   .3689200   -22.500    -6.300  
+931024 49284.00 I  -.078395  .000174   .410502  .000250  I  .3664339  .0000051  2.6548 0.0040  I   -22.117     .791    -5.793     .298  -.078600   .410000   .3663200   -22.100    -6.200  
+931025 49285.00 I  -.077753  .000194   .412128  .000213  I  .3637438  .0000071  2.7212 0.0045  I   -21.998     .158    -5.717     .298  -.077900   .411700   .3636400   -21.900    -6.200  
+931026 49286.00 I  -.076914  .000191   .413836  .000207  I  .3610009  .0000075  2.7592 0.0052  I   -21.814     .158    -5.684     .298  -.077100   .413400   .3609000   -21.900    -6.100  
+931027 49287.00 I  -.076031  .000218   .415576  .000201  I  .3582377  .0000077  2.7601 0.0054  I   -21.706     .158    -5.613     .298  -.076400   .415100   .3581400   -22.000    -6.100  
+931028 49288.00 I  -.075370  .000203   .417185  .000175  I  .3554951  .0000077  2.7178 0.0055  I   -21.801     .158    -5.524     .298  -.075800   .416700   .3554000   -22.300    -6.000  
+931029 49289.00 I  -.074954  .000197   .418609  .000151  I  .3528138  .0000079  2.6404 0.0054  I   -22.010     .158    -5.508     .298  -.075300   .418000   .3527000   -22.500    -5.900  
+931030 49290.00 I  -.074635  .000306   .419832  .000127  I  .3502215  .0000077  2.5413 0.0071  I   -22.205     .184    -5.578     .298  -.074900   .419100   .3500800   -22.700    -6.000  
+931031 49291.00 I  -.074213  .000306   .420862  .000122  I  .3477349  .0000119  2.4312 0.0066  I   -22.328     .136    -5.637     .141  -.074400   .420000   .3475800   -22.700    -6.000  
+9311 1 49292.00 I  -.073492  .000322   .421760  .000135  I  .3453578  .0000106  2.3250 0.0079  I   -22.310     .137    -5.610     .125  -.073600   .420800   .3451900   -22.600    -6.000  
+9311 2 49293.00 I  -.072270  .000336   .422619  .000171  I  .3430772  .0000103  2.2420 0.0075  I   -22.086     .131    -5.541     .113  -.072500   .421500   .3429200   -22.400    -6.100  
+9311 3 49294.00 I  -.070455  .000327   .423522  .000174  I  .3408636  .0000105  2.1897 0.0074  I   -21.692     .131    -5.534     .113  -.071000   .422300   .3407300   -22.000    -6.000  
+9311 4 49295.00 I  -.068458  .000329   .424564  .000177  I  .3386838  .0000105  2.1794 0.0077  I   -21.259     .131    -5.651     .113  -.069100   .423400   .3385700   -21.800    -6.200  
+9311 5 49296.00 I  -.066409  .000337   .425838  .000177  I  .3364799  .0000113  2.2439 0.0078  I   -20.892     .131    -5.748     .113  -.066900   .424700   .3363600   -21.500    -6.000  
+9311 6 49297.00 I  -.064303  .000265   .427336  .000206  I  .3341689  .0000115  2.3895 0.0079  I   -20.567     .125    -5.708     .298  -.064600   .426300   .3340500   -21.200    -5.800  
+9311 7 49298.00 I  -.062188  .000220   .428971  .000218  I  .3316825  .0000109  2.5901 0.0068  I   -20.264     .332    -5.554     .298  -.062300   .428100   .3315700   -21.100    -5.600  
+9311 8 49299.00 I  -.060083  .000174   .430629  .000147  I  .3289829  .0000071  2.8082 0.0064  I   -20.108     .451    -5.336     .298  -.060100   .429800   .3288600   -21.200    -5.400  
+9311 9 49300.00 I  -.058051  .000181   .432202  .000118  I  .3260761  .0000068  2.9964 0.0048  I   -20.288     .451    -5.072     .298  -.058100   .431400   .3259500   -21.400    -5.300  
+931110 49301.00 I  -.056232  .000183   .433615  .000131  I  .3230175  .0000065  3.1022 0.0048  I   -20.836     .451    -4.786     .298  -.056400   .432900   .3229000   -21.600    -5.300  
+931111 49302.00 I  -.054719  .000168   .434848  .000140  I  .3199125  .0000068  3.0854 0.0046  I   -21.361     .451    -4.585     .298  -.054900   .434200   .3197900   -21.800    -5.200  
+931112 49303.00 I  -.053383  .000156   .435925  .000138  I  .3168850  .0000066  2.9536 0.0052  I   -21.490     .451    -4.602     .298  -.053500   .435300   .3167600   -22.000    -5.100  
+931113 49304.00 I  -.052073  .000128   .436873  .000134  I  .3140291  .0000078  2.7505 0.0103  I   -21.142     .446    -4.799     .298  -.052100   .436100   .3139000   -22.000    -4.900  
+931114 49305.00 I  -.050757  .000171   .437726  .000152  I  .3113888  .0000196  2.5331 0.0062  I   -20.615     .791    -4.935     .298  -.050800   .436900   .3112500   -21.800    -4.900  
+931115 49306.00 I  -.049472  .000175   .438542  .000145  I  .3089486  .0000096  2.3585 0.0109  I   -20.322     .791    -4.825     .298  -.049500   .437600   .3088100   -21.500    -4.900  
+931116 49307.00 I  -.048279  .000162   .439395  .000150  I  .3066469  .0000096  2.2587 0.0064  I   -20.309     .791    -4.579     .298  -.048500   .438500   .3065200   -21.000    -4.900  
+931117 49308.00 I  -.047288  .000169   .440342  .000164  I  .3044064  .0000084  2.2332 0.0064  I   -20.213     .791    -4.482     .298  -.047700   .439400   .3042900   -20.400    -4.800  
+931118 49309.00 I  -.046610  .000169   .441395  .000156  I  .3021613  .0000085  2.2653 0.0060  I   -19.782     .791    -4.655     .298  -.047000   .440400   .3020400   -19.900    -4.800  
+931119 49310.00 I  -.046115  .000190   .442500  .000154  I  .2998652  .0000086  2.3293 0.0073  I   -19.221     .791    -4.918     .298  -.046400   .441500   .2997400   -19.400    -4.800  
+931120 49311.00 I  -.045686  .000223   .443609  .000166  I  .2975016  .0000118  2.3966 0.0103  I   -18.897     .791    -5.055     .298  -.045900   .442600   .2973700   -19.000    -4.800  
+931121 49312.00 I  -.045176  .000239   .444669  .000186  I  .2950769  .0000188  2.4494 0.0110  I   -18.869     .791    -5.032     .298  -.045300   .443700   .2949600   -18.800    -4.700  
+931122 49313.00 I  -.044412  .000252   .445671  .000164  I  .2926107  .0000185  2.4787 0.0133  I   -18.924     .791    -4.930     .298  -.044600   .444800   .2925000   -18.800    -4.800  
+931123 49314.00 I  -.043359  .000254   .446638  .000168  I  .2901289  .0000187  2.4798 0.0134  I   -18.947     .791    -4.794     .298  -.043700   .445900   .2900300   -19.000    -4.800  
+931124 49315.00 I  -.042190  .000257   .447596  .000157  I  .2876619  .0000195  2.4483 0.0134  I   -19.013     .791    -4.619     .298  -.042700   .447000   .2875600   -19.200    -4.900  
+931125 49316.00 I  -.041254  .000245   .448548  .000155  I  .2852456  .0000191  2.3768 0.0133  I   -19.151     .791    -4.431     .298  -.041700   .448000   .2851600   -19.500    -4.900  
+931126 49317.00 I  -.040560  .000237   .449434  .000162  I  .2829184  .0000182  2.2751 0.0109  I   -19.261     .791    -4.283     .298  -.040900   .448900   .2828300   -19.800    -4.900  
+931127 49318.00 I  -.039980  .000226   .450216  .000121  I  .2806996  .0000106  2.1610 0.0107  I   -19.290     .791    -4.178     .298  -.040100   .449600   .2806200   -19.800    -4.900  
+931128 49319.00 I  -.039440  .000209   .450907  .000127  I  .2785978  .0000113  2.0429 0.0074  I   -19.308     .143    -4.071     .298  -.039300   .450300   .2785100   -19.800    -4.800  
+931129 49320.00 I  -.038813  .000222   .451524  .000099  I  .2766129  .0000102  1.9275 0.0075  I   -19.336     .219    -3.958     .298  -.038600   .450800   .2765200   -19.500    -4.700  
+931130 49321.00 I  -.037886  .000229   .452118  .000088  I  .2747398  .0000098  1.8211 0.0070  I   -19.259     .191    -3.909     .298  -.037700   .451300   .2746400   -19.200    -4.600  
+9312 1 49322.00 I  -.036491  .000226   .452767  .000087  I  .2729459  .0000095  1.7893 0.0061  I   -18.993     .191    -3.986     .298  -.036600   .451900   .2728200   -18.800    -4.500  
+9312 2 49323.00 I  -.035037  .000221   .453502  .000081  I  .2711337  .0000074  1.8401 0.0060  I   -18.689     .191    -4.162     .298  -.035300   .452600   .2710000   -18.400    -4.400  
+9312 3 49324.00 I  -.033629  .000216   .454320  .000080  I  .2692482  .0000074  1.9434 0.0065  I   -18.501     .191    -4.304     .298  -.033800   .453400   .2690900   -18.300    -4.300  
+9312 4 49325.00 I  -.032184  .000207   .455219  .000093  I  .2672266  .0000108  2.1076 0.0078  I   -18.472     .211    -4.324     .298  -.032100   .454600   .2671000   -18.100    -4.000  
+9312 5 49326.00 I  -.030695  .000292   .456183  .000199  I  .2650228  .0000137  2.3025 0.0078  I   -18.535     .791    -4.221     .298  -.030600   .455600   .2648700   -18.200    -4.000  
+9312 6 49327.00 I  -.029197  .000284   .457189  .000184  I  .2626230  .0000113  2.4933 0.0088  I   -18.592     .791    -4.020     .298  -.029000   .456600   .2624600   -18.400    -4.000  
+9312 7 49328.00 I  -.027689  .000286   .458224  .000189  I  .2600475  .0000110  2.6501 0.0079  I   -18.624     .791    -3.748     .298  -.027600   .457600   .2598800   -18.700    -3.900  
+9312 8 49329.00 I  -.026169  .000294   .459296  .000202  I  .2573503  .0000110  2.7245 0.0080  I   -18.670     .791    -3.454     .298  -.026300   .458600   .2572000   -19.000    -4.000  
+9312 9 49330.00 I  -.024876  .000313   .460349  .000201  I  .2546337  .0000115  2.6932 0.0081  I   -18.735     .791    -3.262     .298  -.025000   .459500   .2545100   -19.300    -4.000  
+931210 49331.00 I  -.023654  .000316   .461368  .000221  I  .2519902  .0000120  2.5829 0.0089  I   -18.736     .791    -3.232     .298  -.023700   .460400   .2518700   -19.400    -4.200  
+931211 49332.00 I  -.022373  .000323   .462389  .000273  I  .2494811  .0000135  2.4331 0.0091  I   -18.590     .791    -3.287     .115  -.022400   .461400   .2493700   -19.300    -4.300  
+931212 49333.00 I  -.021116  .000199   .463459  .000226  I  .2471210  .0000136  2.2924 0.0084  I   -18.334     .791    -3.351     .111  -.021200   .462400   .2470100   -19.100    -4.200  
+931213 49334.00 I  -.019978  .000171   .464619  .000189  I  .2448779  .0000101  2.2070 0.0087  I   -18.112     .791    -3.402     .114  -.020100   .463600   .2447600   -18.700    -4.200  
+931214 49335.00 I  -.018938  .000200   .465875  .000240  I  .2426803  .0000109  2.2019 0.0077  I   -17.959     .791    -3.356     .104  -.019000   .465000   .2425400   -18.100    -4.100  
+931215 49336.00 I  -.017978  .000189   .467130  .000238  I  .2404463  .0000117  2.2803 0.0074  I   -17.747     .791    -3.247     .298  -.017900   .466300   .2403000   -17.600    -3.900  
+931216 49337.00 I  -.016999  .000162   .468233  .000226  I  .2381032  .0000101  2.4082 0.0079  I   -17.388     .791    -3.138     .298  -.017000   .467500   .2379400   -17.000    -3.700  
+931217 49338.00 I  -.015881  .000177   .469162  .000207  I  .2356355  .0000106  2.5194 0.0067  I   -17.021     .791    -3.137     .298  -.016000   .468500   .2354700   -16.800    -3.600  
+931218 49339.00 I  -.014635  .000223   .469955  .000259  I  .2330778  .0000088  2.5903 0.0087  I   -16.866     .791    -3.278     .298  -.014800   .469300   .2329100   -16.700    -3.600  
+931219 49340.00 I  -.013258  .000252   .470683  .000292  I  .2304656  .0000138  2.6290 0.0070  I   -16.964     .148    -3.465     .150  -.013500   .470000   .2303000   -16.800    -3.500  
+931220 49341.00 I  -.011691  .000209   .471433  .000245  I  .2278282  .0000109  2.6425 0.0087  I   -17.184     .133    -3.572     .131  -.011700   .470700   .2276700   -17.100    -3.500  
+931221 49342.00 I  -.009752  .000176   .472284  .000203  I  .2251854  .0000107  2.6415 0.0074  I   -17.423     .152    -3.527     .146  -.009700   .471500   .2250500   -17.500    -3.500  
+931222 49343.00 I  -.007342  .000180   .473280  .000202  I  .2225628  .0000101  2.5875 0.0072  I   -17.655     .152    -3.359     .146  -.007400   .472500   .2224700   -17.900    -3.600  
+931223 49344.00 I  -.004758  .000189   .474365  .000201  I  .2200279  .0000096  2.4810 0.0069  I   -17.813     .152    -3.224     .146  -.005000   .473600   .2199400   -18.300    -3.700  
+931224 49345.00 I  -.002260  .000188   .475357  .000198  I  .2176001  .0000094  2.3767 0.0062  I   -17.835     .152    -3.182     .146  -.002700   .474600   .2175100   -18.600    -3.800  
+931225 49346.00 I  -.000079  .000128   .476105  .000129  I  .2152727  .0000078  2.2779 0.0092  I   -17.752     .791    -3.188     .298  -.000600   .475300   .2151800   -18.700    -3.900  
+931226 49347.00 I   .001645  .000162   .476538  .000152  I  .2130411  .0000158  2.1885 0.0049  I   -17.692     .791    -3.178     .298   .001200   .475800   .2129400   -18.700    -4.000  
+931227 49348.00 I   .002979  .000134   .476647  .000114  I  .2108865  .0000059  2.1265 0.0084  I   -17.717     .149    -3.171     .298   .002600   .475900   .2107800   -18.400    -4.000  
+931228 49349.00 I   .004130  .000125   .476509  .000113  I  .2087733  .0000059  2.1089 0.0043  I   -17.717     .179    -3.245     .298   .003900   .475800   .2086600   -18.100    -3.900  
+931229 49350.00 I   .005326  .000128   .476268  .000110  I  .2066509  .0000063  2.1448 0.0043  I   -17.537     .179    -3.412     .298   .005000   .475600   .2065100   -17.900    -3.800  
+931230 49351.00 I   .006736  .000104   .476099  .000089  I  .2044548  .0000063  2.2673 0.0044  I   -17.187     .179    -3.556     .298   .006200   .475500   .2042600   -17.600    -3.700  
+931231 49352.00 I   .008448  .000106   .476147  .000089  I  .2020948  .0000062  2.4544 0.0046  I   -16.805     .179    -3.580     .298   .007800   .475500   .2018500   -17.300    -3.600  
+94 1 1 49353.00 I   .010488  .000152   .476399  .000131  I  .1995489  .0000067  2.6327 0.0049  I   -16.588     .179    -3.467     .298   .009700   .475600   .1992800   -17.200    -3.400  
+94 1 2 49354.00 I   .012823  .000198   .476816  .000148  I  .1968449  .0000076  2.7646 0.0055  I   -16.618     .204    -3.280     .298   .012000   .476000   .1965900   -17.300    -3.300  
+94 1 3 49355.00 I   .015382  .000219   .477358  .000131  I  .1940457  .0000087  2.8187 0.0056  I   -16.799     .166    -3.093     .104   .014700   .476700   .1938000   -17.500    -3.100  
+94 1 4 49356.00 I   .018130  .000221   .477976  .000131  I  .1912390  .0000082  2.7783 0.0062  I   -17.011     .186    -2.927     .181   .017600   .477300   .1910200   -17.800    -3.100  
+94 1 5 49357.00 I   .021020  .000223   .478639  .000131  I  .1885171  .0000088  2.6539 0.0061  I   -17.249     .252    -2.762     .174   .020600   .478000   .1883300   -18.100    -3.100  
+94 1 6 49358.00 I   .023887  .000233   .479288  .000129  I  .1859460  .0000091  2.4852 0.0064  I   -17.614     .252    -2.611     .174   .023600   .478600   .1857800   -18.500    -3.100  
+94 1 7 49359.00 I   .026706  .000226   .479806  .000138  I  .1835517  .0000092  2.3015 0.0067  I   -18.139     .252    -2.669     .174   .026400   .479000   .1834100   -18.700    -3.200  
+94 1 8 49360.00 I   .029429  .000197   .480131  .000128  I  .1813388  .0000098  2.1303 0.0079  I   -18.653     .252    -2.888     .174   .029100   .479200   .1812100   -18.900    -3.200  
+94 1 9 49361.00 I   .031915  .000185   .480235  .000174  I  .1792719  .0000129  2.0168 0.0065  I   -18.969     .233    -3.116     .165   .031600   .479300   .1791600   -18.900    -3.200  
+94 110 49362.00 I   .034135  .000162   .480135  .000219  I  .1772787  .0000085  1.9828 0.0071  I   -19.013     .210    -3.245     .298   .033900   .479200   .1771700   -18.800    -3.200  
+94 111 49363.00 I   .036207  .000130   .479908  .000191  I  .1752855  .0000061  2.0110 0.0050  I   -18.808     .232    -3.165     .298   .036200   .479000   .1751800   -18.600    -3.200  
+94 112 49364.00 I   .038357  .000117   .479664  .000179  I  .1732344  .0000052  2.1059 0.0039  I   -18.485     .227    -2.917     .298   .038400   .478900   .1731100   -18.400    -3.200  
+94 113 49365.00 I   .040806  .000110   .479395  .000162  I  .1710573  .0000048  2.2498 0.0037  I   -18.199     .270    -2.670     .298   .040800   .478700   .1709500   -18.300    -3.100  
+94 114 49366.00 I   .043564  .000103   .479149  .000151  I  .1687462  .0000052  2.3594 0.0035  I   -18.008     .247    -2.589     .298   .043200   .478700   .1686700   -18.300    -3.000  
+94 115 49367.00 I   .046270  .000103   .479033  .000136  I  .1663712  .0000052  2.3710 0.0037  I   -17.898     .246    -2.705     .298   .045600   .478600   .1663300   -18.400    -3.000  
+94 116 49368.00 I   .048614  .000087   .479092  .000142  I  .1640261  .0000052  2.3168 0.0036  I   -17.900     .257    -2.905     .298   .047900   .478700   .1639700   -18.500    -3.000  
+94 117 49369.00 I   .050696  .000099   .479199  .000136  I  .1617348  .0000049  2.2710 0.0039  I   -18.030     .234    -3.045     .298   .050100   .478700   .1616500   -18.700    -3.000  
+94 118 49370.00 I   .052590  .000105   .479158  .000141  I  .1594831  .0000057  2.2281 0.0037  I   -18.224     .235    -3.039     .108   .052300   .478500   .1593800   -18.900    -3.100  
+94 119 49371.00 I   .054280  .000109   .478859  .000134  I  .1572956  .0000055  2.1342 0.0039  I   -18.379     .208    -2.996     .125   .054300   .478200   .1572000   -19.100    -3.300  
+94 120 49372.00 I   .055909  .000109   .478392  .000172  I  .1552205  .0000054  2.0228 0.0039  I   -18.417     .197    -3.058     .144   .056300   .477600   .1551100   -19.300    -3.500  
+94 121 49373.00 I   .057689  .000106   .477780  .000197  I  .1532311  .0000054  1.9679 0.0036  I   -18.335     .191    -3.289     .146   .058400   .477000   .1531100   -19.400    -3.700  
+94 122 49374.00 I   .059822  .000103   .477049  .000209  I  .1512759  .0000048  1.9394 0.0036  I   -18.256     .163    -3.491     .148   .060500   .476400   .1511700   -19.300    -3.800  
+94 123 49375.00 I   .062349  .000105   .476481  .000219  I  .1493481  .0000047  1.9236 0.0034  I   -18.261     .175    -3.495     .142   .062700   .475900   .1492600   -19.200    -4.100  
+94 124 49376.00 I   .065142  .000101   .476263  .000210  I  .1474173  .0000049  1.9419 0.0034  I   -18.317     .156    -3.434     .132   .065100   .475500   .1473300   -18.800    -4.100  
+94 125 49377.00 I   .067938  .000101   .476205  .000223  I  .1454482  .0000049  2.0084 0.0037  I   -18.314     .133    -3.467     .119   .067700   .475200   .1453500   -18.600    -4.200  
+94 126 49378.00 I   .070662  .000095   .475982  .000238  I  .1433702  .0000055  2.1658 0.0040  I   -18.145     .145    -3.654     .298   .070400   .474900   .1432400   -18.300    -4.100  
+94 127 49379.00 I   .073391  .000096   .475402  .000214  I  .1410971  .0000063  2.3817 0.0045  I   -17.786     .154    -3.898     .298   .073200   .474500   .1409600   -18.100    -4.000  
+94 128 49380.00 I   .076083  .000112   .474665  .000188  I  .1386113  .0000070  2.5843 0.0057  I   -17.406     .163    -3.954     .298   .076000   .473900   .1384800   -18.100    -3.900  
+94 129 49381.00 I   .078769  .000143   .473851  .000179  I  .1359433  .0000094  2.7427 0.0094  I   -17.259     .108    -3.737     .298   .078700   .473200   .1358100   -18.200    -3.700  
+94 130 49382.00 I   .081448  .000162   .472951  .000128  I  .1331513  .0000175  2.8249 0.0075  I   -17.486     .112    -3.416     .298   .081500   .472300   .1330100   -18.500    -3.600  
+94 131 49383.00 I   .084148  .000161   .471983  .000128  I  .1303264  .0000118  2.8085 0.0102  I   -18.006     .244    -3.203     .298   .084200   .471400   .1301900   -18.800    -3.600  
+94 2 1 49384.00 I   .086895  .000155   .471012  .000109  I  .1275677  .0000105  2.6919 0.0078  I   -18.573     .258    -3.170     .298   .086900   .470400   .1274300   -19.200    -3.500  
+94 2 2 49385.00 I   .089671  .000170   .470130  .000132  I  .1249677  .0000101  2.4999 0.0073  I   -19.000     .258    -3.232     .298   .089600   .469600   .1248200   -19.800    -3.400  
+94 2 3 49386.00 I   .092442  .000180   .469412  .000139  I  .1225727  .0000101  2.2935 0.0073  I   -19.285     .258    -3.282     .298   .092300   .468800   .1224200   -20.000    -3.600  
+94 2 4 49387.00 I   .095098  .000180   .468762  .000143  I  .1203722  .0000105  2.1126 0.0074  I   -19.509     .258    -3.312     .298   .095000   .468000   .1202300   -20.100    -3.900  
+94 2 5 49388.00 I   .097505  .000183   .468057  .000150  I  .1183323  .0000108  1.9773 0.0088  I   -19.753     .258    -3.357     .298   .097500   .467300   .1182000   -19.900    -4.100  
+94 2 6 49389.00 I   .099674  .000189   .467277  .000175  I  .1163942  .0000141  1.9123 0.0079  I   -19.927     .195    -3.485     .298   .099900   .466600   .1162700   -19.800    -4.200  
+94 2 7 49390.00 I   .101698  .000179   .466450  .000133  I  .1144788  .0000116  1.9341 0.0092  I   -19.846     .245    -3.683     .298   .102000   .465800   .1143600   -19.400    -4.300  
+94 2 8 49391.00 I   .103663  .000198   .465580  .000108  I  .1125030  .0000118  2.0249 0.0082  I   -19.415     .245    -3.875     .298   .104100   .464900   .1123800   -19.100    -4.400  
+94 2 9 49392.00 I   .105628  .000200   .464636  .000123  I  .1104216  .0000115  2.1377 0.0081  I   -18.747     .309    -3.988     .298   .106100   .464000   .1103000   -18.800    -4.400  
+94 210 49393.00 I   .107685  .000189   .463574  .000119  I  .1082301  .0000111  2.2428 0.0082  I   -18.069     .309    -3.912     .298   .108000   .463000   .1081000   -18.500    -4.400  
+94 211 49394.00 I   .109662  .000184   .462451  .000122  I  .1059464  .0000117  2.3166 0.0069  I   -17.606     .309    -3.787     .298   .109800   .462000   .1058200   -18.400    -4.300  
+94 212 49395.00 I   .111429  .000183   .461331  .000114  I  .1036106  .0000083  2.3494 0.0085  I   -17.486     .380    -3.812     .103   .111500   .460800   .1034800   -18.500    -4.400  
+94 213 49396.00 I   .113118  .000190   .460239  .000142  I  .1012573  .0000124  2.3532 0.0066  I   -17.668     .387    -3.999     .298   .113100   .459700   .1011200   -18.700    -4.500  
+94 214 49397.00 I   .114866  .000193   .459172  .000137  I  .0989138  .0000102  2.3283 0.0079  I   -18.062     .335    -4.224     .298   .114700   .458500   .0987800   -19.100    -4.600  
+94 215 49398.00 I   .116741  .000209   .458065  .000153  I  .0966117  .0000097  2.2704 0.0074  I   -18.546     .267    -4.383     .298   .116500   .457300   .0964700   -19.400    -4.800  
+94 216 49399.00 I   .118747  .000202   .456839  .000140  I  .0943824  .0000107  2.1842 0.0066  I   -18.900     .267    -4.473     .298   .118300   .456100   .0942400   -19.700    -5.000  
+94 217 49400.00 I   .120837  .000212   .455491  .000149  I  .0922419  .0000089  2.1020 0.0075  I   -18.964     .267    -4.576     .298   .120200   .454800   .0920800   -19.900    -5.300  
+94 218 49401.00 I   .122767  .000221   .454064  .000161  I  .0901704  .0000106  2.0437 0.0083  I   -18.792     .267    -4.715     .298   .122200   .453400   .0900000   -20.100    -5.500  
+94 219 49402.00 I   .124543  .000228   .452625  .000170  I  .0881463  .0000139  2.0099 0.0112  I   -18.583     .140    -4.813     .298   .124200   .452000   .0879700   -20.200    -5.700  
+94 220 49403.00 I   .126444  .000223   .451326  .000199  I  .0861344  .0000197  2.0247 0.0107  I   -18.411     .242    -4.749     .298   .126400   .450800   .0859700   -20.000    -5.900  
+94 221 49404.00 I   .128682  .000208   .450311  .000207  I  .0840749  .0000164  2.1054 0.0125  I   -18.227     .226    -4.549     .298   .128800   .449800   .0839300   -19.900    -5.900  
+94 222 49405.00 I   .131239  .000220   .449616  .000208  I  .0819021  .0000155  2.2504 0.0112  I   -18.057     .226    -4.460     .298   .131400   .449100   .0817700   -19.700    -5.900  
+94 223 49406.00 I   .133898  .000213   .449154  .000213  I  .0795498  .0000154  2.4681 0.0103  I   -17.986     .226    -4.706     .298   .134000   .448600   .0794300   -19.700    -5.900  
+94 224 49407.00 I   .136340  .000246   .448793  .000270  I  .0769470  .0000135  2.7425 0.0095  I   -17.926     .226    -5.112     .298   .136400   .448300   .0768400   -19.500    -5.700  
+94 225 49408.00 I   .138371  .000251   .448401  .000257  I  .0740647  .0000111  3.0174 0.0073  I   -17.790     .226    -5.340     .298   .138400   .447900   .0739700   -19.400    -5.600  
+94 226 49409.00 I   .139965  .000254   .447866  .000290  I  .0709302  .0000055  3.2385 0.0084  I   -17.651     .155    -5.222     .298   .140100   .447400   .0708400   -19.300    -5.500  
+94 227 49410.00 I   .141211  .000249   .447137  .000267  I  .0676205  .0000126  3.3612 0.0049  I   -17.683     .791    -4.921     .298   .141400   .446600   .0675100   -19.400    -5.300  
+94 228 49411.00 I   .142256  .000207   .446175  .000230  I  .0642490  .0000081  3.3603 0.0074  I   -17.934     .791    -4.737     .298   .142500   .445600   .0641200   -19.500    -5.300  
+94 3 1 49412.00 I   .143219  .000197   .444899  .000224  I  .0609375  .0000078  3.2465 0.0062  I   -18.226     .791    -4.796     .298   .143400   .444200   .0607900   -19.600    -5.400  
+94 3 2 49413.00 I   .144190  .000180   .443314  .000229  I  .0577774  .0000095  3.0684 0.0069  I   -18.342     .791    -4.976     .298   .144300   .442700   .0576300   -19.500    -5.500  
+94 3 3 49414.00 I   .145240  .000149   .441509  .000185  I  .0548062  .0000113  2.8736 0.0075  I   -18.225     .791    -5.096     .298   .145200   .440900   .0546700   -19.600    -5.600  
+94 3 4 49415.00 I   .146278  .000148   .439625  .000149  I  .0520263  .0000117  2.6904 0.0080  I   -18.003     .791    -5.108     .298   .146200   .439000   .0519500   -19.400    -5.800  
+94 3 5 49416.00 I   .147211  .000154   .437777  .000188  I  .0494116  .0000113  2.5485 0.0092  I   -17.834     .791    -5.075     .298   .147300   .437200   .0493600   -19.300    -6.000  
+94 3 6 49417.00 I   .148071  .000135   .436001  .000188  I  .0469051  .0000143  2.4792 0.0080  I   -17.782     .274    -5.066     .159   .148200   .435400   .0468600   -19.100    -6.000  
+94 3 7 49418.00 I   .148970  .000145   .434307  .000171  I  .0444290  .0000112  2.4825 0.0087  I   -17.814     .196    -5.126     .158   .149100   .433800   .0443700   -18.900    -6.100  
+94 3 8 49419.00 I   .149918  .000151   .432679  .000160  I  .0419256  .0000098  2.5294 0.0072  I   -17.885     .196    -5.293     .158   .150000   .432200   .0418500   -18.700    -6.100  
+94 3 9 49420.00 I   .150889  .000156   .431067  .000164  I  .0393615  .0000092  2.6025 0.0066  I   -18.033     .277    -5.567     .129   .150900   .430500   .0392600   -18.600    -6.100  
+94 310 49421.00 I   .151945  .000155   .429415  .000167  I  .0367221  .0000089  2.6713 0.0064  I   -18.286     .277    -5.728     .129   .151800   .428800   .0366200   -18.400    -6.100  
+94 311 49422.00 I   .153095  .000168   .427708  .000171  I  .0340371  .0000090  2.6857 0.0056  I   -18.576     .277    -5.730     .129   .153000   .427100   .0339500   -18.200    -6.000  
+94 312 49423.00 I   .154380  .000191   .425975  .000140  I  .0313733  .0000069  2.6323 0.0063  I   -18.702     .279    -5.692     .111   .154200   .425200   .0312900   -18.100    -6.000  
+94 313 49424.00 I   .155842  .000215   .424297  .000208  I  .0287840  .0000089  2.5445 0.0070  I   -18.580     .284    -5.719     .298   .155700   .423500   .0286800   -18.100    -6.200  
+94 314 49425.00 I   .157393  .000201   .422761  .000197  I  .0262872  .0000121  2.4480 0.0074  I   -18.319     .347    -5.848     .298   .157200   .421800   .0261500   -18.100    -6.300  
+94 315 49426.00 I   .158931  .000204   .421377  .000203  I  .0238883  .0000117  2.3507 0.0085  I   -18.031     .284    -6.038     .298   .158800   .420400   .0237300   -18.100    -6.500  
+94 316 49427.00 I   .160366  .000209   .420007  .000205  I  .0215796  .0000119  2.2720 0.0084  I   -17.744     .392    -6.239     .298   .160300   .419000   .0214200   -18.000    -6.700  
+94 317 49428.00 I   .161723  .000212   .418500  .000199  I  .0193435  .0000120  2.1956 0.0085  I   -17.558     .392    -6.430     .298   .161500   .417700   .0192100   -17.900    -7.000  
+94 318 49429.00 I   .162780  .000198   .416933  .000193  I  .0171856  .0000120  2.1275 0.0091  I   -17.573     .392    -6.625     .298   .162500   .416200   .0170800   -17.700    -7.100  
+94 319 49430.00 I   .163469  .000193   .415334  .000235  I  .0150740  .0000137  2.1027 0.0106  I   -17.734     .436    -6.821     .298   .163100   .414700   .0149800   -17.600    -7.300  
+94 320 49431.00 I   .163895  .000179   .413673  .000201  I  .0129631  .0000174  2.1291 0.0075  I   -17.862     .433    -6.888     .298   .163500   .413100   .0128700   -17.200    -7.300  
+94 321 49432.00 I   .164155  .000146   .411919  .000205  I  .0107951  .0000063  2.2177 0.0092  I   -17.766     .482    -6.727     .298   .163800   .411400   .0107000   -16.900    -7.300  
+94 322 49433.00 I   .164345  .000159   .410066  .000233  I  .0085070  .0000061  2.3686 0.0043  I   -17.460     .384    -6.496     .298   .164200   .409600   .0084200   -16.800    -7.300  
+94 323 49434.00 I   .164664  .000150   .408178  .000255  I  .0060379  .0000058  2.5797 0.0042  I   -17.222     .314    -6.469     .298   .164700   .407700   .0059400   -16.600    -7.200  
+94 324 49435.00 I   .165351  .000149   .406360  .000248  I  .0033379  .0000058  2.8199 0.0041  I   -17.252     .314    -6.681     .298   .165600   .405800   .0032300   -16.600    -7.000  
+94 325 49436.00 I   .166358  .000135   .404603  .000240  I  .0004004  .0000059  3.0532 0.0041  I   -17.354     .314    -6.848     .298   .166500   .403900   .0002800   -16.800    -6.900  
+94 326 49437.00 I   .167468  .000155   .402813  .000235  I -.0027475  .0000059  3.2234 0.0052  I   -17.361     .314    -6.747     .298   .167500   .402000  -.0028700   -17.100    -6.800  
+94 327 49438.00 I   .168527  .000149   .400966  .000268  I -.0060032  .0000086  3.2638 0.0054  I   -17.347     .251    -6.479     .298   .168400   .400100  -.0061200   -17.500    -6.900  
+94 328 49439.00 I   .169439  .000181   .399053  .000224  I -.0092285  .0000090  3.1643 0.0060  I   -17.417     .791    -6.336     .298   .169300   .398200  -.0093300   -17.800    -6.900  
+94 329 49440.00 I   .170178  .000194   .397074  .000207  I -.0122952  .0000084  2.9551 0.0063  I   -17.544     .791    -6.472     .298   .170300   .396300  -.0124100   -18.100    -7.100  
+94 330 49441.00 I   .170917  .000197   .395070  .000188  I -.0151299  .0000089  2.7197 0.0062  I   -17.627     .791    -6.763     .298   .171400   .394400  -.0152600   -18.200    -7.400  
+94 331 49442.00 I   .172023  .000217   .393179  .000204  I -.0177504  .0000092  2.5319 0.0063  I   -17.603     .791    -7.030     .298   .172600   .392600  -.0178900   -18.300    -7.600  
+94 4 1 49443.00 I   .173479  .000204   .391451  .000220  I -.0202159  .0000088  2.4109 0.0059  I   -17.464     .791    -7.234     .298   .174000   .390800  -.0203400   -18.200    -7.800  
+94 4 2 49444.00 I   .175073  .000196   .389822  .000165  I -.0225980  .0000073  2.3673 0.0081  I   -17.254     .791    -7.413     .298   .175300   .389100  -.0227200   -17.900    -7.900  
+94 4 3 49445.00 I   .176575  .000191   .388195  .000209  I -.0249739  .0000137  2.3938 0.0056  I   -17.090     .791    -7.541     .298   .176500   .387500  -.0251000   -17.700    -8.000  
+94 4 4 49446.00 I   .177850  .000184   .386499  .000206  I -.0273956  .0000086  2.4502 0.0078  I   -17.076     .791    -7.561     .298   .177700   .385800  -.0274900   -17.500    -8.100  
+94 4 5 49447.00 I   .178909  .000184   .384736  .000239  I -.0298724  .0000075  2.5010 0.0054  I   -17.153     .791    -7.499     .298   .178800   .384200  -.0299700   -17.500    -8.000  
+94 4 6 49448.00 I   .179853  .000164   .382938  .000221  I -.0323972  .0000064  2.5505 0.0049  I   -17.148     .791    -7.436     .298   .179800   .382400  -.0325000   -17.500    -7.900  
+94 4 7 49449.00 I   .180783  .000174   .381137  .000230  I -.0349731  .0000064  2.5993 0.0038  I   -17.013     .791    -7.383     .298   .180800   .380700  -.0350900   -17.500    -7.900  
+94 4 8 49450.00 I   .181636  .000172   .379343  .000241  I -.0375888  .0000042  2.6273 0.0039  I   -16.894     .791    -7.280     .298   .181700   .379000  -.0377100   -17.400    -7.800  
+94 4 9 49451.00 I   .182329  .000218   .377572  .000239  I -.0402176  .0000044  2.6249 0.0031  I   -16.937     .791    -7.124     .298   .182400   .377300  -.0403500   -17.400    -7.800  
+94 410 49452.00 I   .182867  .000240   .375874  .000405  I -.0428274  .0000045  2.5890 0.0036  I   -17.124     .791    -7.045     .298   .183000   .375600  -.0429600   -17.500    -7.800  
+94 411 49453.00 I   .183229  .000219   .374257  .000344  I -.0453837  .0000056  2.5175 0.0049  I   -17.334     .791    -7.171     .298   .183300   .373900  -.0455200   -17.500    -7.900  
+94 412 49454.00 I   .183341  .000212   .372623  .000339  I -.0478529  .0000087  2.4177 0.0055  I   -17.448     .791    -7.473     .298   .183400   .372200  -.0479800   -17.400    -8.000  
+94 413 49455.00 I   .183248  .000230   .370836  .000334  I -.0502164  .0000094  2.3099 0.0064  I   -17.371     .791    -7.792     .298   .183300   .370400  -.0503400   -17.200    -8.200  
+94 414 49456.00 I   .183142  .000236   .368777  .000321  I -.0524756  .0000093  2.2107 0.0066  I   -17.103     .791    -8.018     .298   .183100   .368500  -.0525900   -17.000    -8.400  
+94 415 49457.00 I   .183089  .000200   .366542  .000316  I -.0546441  .0000092  2.1304 0.0072  I   -16.833     .791    -8.179     .298   .183100   .366300  -.0547500   -16.800    -8.500  
+94 416 49458.00 I   .183155  .000188   .364319  .000350  I -.0567524  .0000109  2.0982 0.0069  I   -16.769     .791    -8.318     .298   .183200   .364000  -.0568600   -16.500    -8.400  
+94 417 49459.00 I   .183364  .000191   .362224  .000243  I -.0588633  .0000104  2.1345 0.0064  I   -16.844     .791    -8.365     .298   .183400   .361800  -.0589700   -16.300    -8.400  
+94 418 49460.00 I   .183638  .000193   .360311  .000201  I -.0610425  .0000068  2.2343 0.0062  I   -16.757     .791    -8.215     .298   .183600   .359700  -.0611500   -16.000    -8.300  
+94 419 49461.00 I   .183851  .000186   .358589  .000193  I -.0633504  .0000066  2.3898 0.0050  I   -16.367     .791    -7.933     .298   .183800   .357800  -.0634500   -15.900    -8.200  
+94 420 49462.00 I   .183927  .000170   .357041  .000191  I -.0658290  .0000072  2.5660 0.0051  I   -15.908     .791    -7.744     .298   .184000   .356200  -.0659100   -16.000    -8.100  
+94 421 49463.00 I   .183893  .000169   .355593  .000196  I -.0684853  .0000079  2.7509 0.0050  I   -15.709     .791    -7.768     .298   .183900   .354800  -.0685800   -16.100    -7.900  
+94 422 49464.00 I   .183783  .000172   .354125  .000143  I -.0713343  .0000070  2.9463 0.0054  I   -15.837     .791    -7.849     .298   .183800   .353400  -.0714500   -16.400    -7.700  
+94 423 49465.00 I   .183580  .000185   .352535  .000137  I -.0743644  .0000073  3.1014 0.0068  I   -16.130     .791    -7.766     .298   .183600   .351900  -.0744800   -16.600    -7.700  
+94 424 49466.00 I   .183329  .000200   .350751  .000180  I -.0775031  .0000117  3.1546 0.0068  I   -16.435     .791    -7.537     .298   .183300   .350200  -.0776000   -17.000    -7.700  
+94 425 49467.00 I   .183076  .000199   .348730  .000149  I -.0806300  .0000114  3.0769 0.0077  I   -16.680     .119    -7.404     .298   .183000   .348200  -.0806900   -17.300    -7.800  
+94 426 49468.00 I   .182904  .000177   .346445  .000155  I -.0836211  .0000101  2.8917 0.0075  I   -16.834     .272    -7.499     .298   .182800   .345900  -.0836600   -17.500    -7.900  
+94 427 49469.00 I   .182861  .000178   .343925  .000163  I -.0864020  .0000098  2.6725 0.0071  I   -16.894     .259    -7.699     .205   .182700   .343200  -.0864600   -17.600    -8.200  
+94 428 49470.00 I   .182883  .000173   .341266  .000166  I -.0889845  .0000099  2.5087 0.0072  I   -16.887     .259    -7.817     .205   .182700   .340400  -.0890600   -17.500    -8.300  
+94 429 49471.00 I   .183010  .000168   .338645  .000153  I -.0914518  .0000106  2.4420 0.0073  I   -16.831     .259    -7.940     .205   .183000   .337700  -.0915600   -17.400    -8.500  
+94 430 49472.00 I   .183316  .000151   .336208  .000152  I -.0938945  .0000106  2.4531 0.0074  I   -16.631     .280    -8.134     .224   .183300   .335200  -.0940100   -17.200    -8.600  
+94 5 1 49473.00 I   .183751  .000175   .333988  .000186  I -.0963720  .0000102  2.5061 0.0069  I   -16.392     .305    -8.311     .247   .183800   .332900  -.0964900   -16.900    -8.600  
+94 5 2 49474.00 I   .184268  .000144   .331918  .000169  I -.0989092  .0000089  2.5664 0.0067  I   -16.413     .212    -8.351     .240   .184300   .330900  -.0990100   -16.900    -8.600  
+94 5 3 49475.00 I   .184802  .000148   .329910  .000163  I -.1014984  .0000088  2.6074 0.0062  I   -16.728     .791    -8.242     .298   .184400   .329300  -.1016100   -17.000    -8.700  
+94 5 4 49476.00 I   .185248  .000158   .327875  .000171  I -.1041177  .0000087  2.6293 0.0056  I   -16.996     .791    -8.111     .298   .184700   .327300  -.1042400   -17.200    -8.600  
+94 5 5 49477.00 I   .185493  .000164   .325771  .000175  I -.1067517  .0000070  2.6351 0.0056  I   -16.932     .791    -8.031     .298   .184900   .325100  -.1068800   -17.400    -8.500  
+94 5 6 49478.00 I   .185617  .000167   .323560  .000181  I -.1093766  .0000070  2.6069 0.0045  I   -16.682     .791    -7.929     .298   .185200   .322800  -.1095100   -17.600    -8.400  
+94 5 7 49479.00 I   .185787  .000150   .321227  .000153  I -.1119535  .0000056  2.5427 0.0044  I   -16.611     .791    -7.751     .298   .185500   .320400  -.1120800   -17.900    -8.400  
+94 5 8 49480.00 I   .186127  .000153   .318824  .000169  I -.1144563  .0000053  2.4613 0.0039  I   -16.842     .791    -7.619     .298   .186000   .318000  -.1145800   -18.000    -8.400  
+94 5 9 49481.00 I   .186656  .000118   .316455  .000178  I -.1168720  .0000053  2.3677 0.0044  I   -17.177     .282    -7.719     .298   .186700   .315600  -.1169900   -18.200    -8.600  
+94 510 49482.00 I   .187338  .000130   .314204  .000206  I -.1191899  .0000070  2.2686 0.0044  I   -17.383     .612    -8.067     .147   .187400   .313400  -.1193000   -18.200    -8.800  
+94 511 49483.00 I   .188084  .000125   .312099  .000195  I -.1214190  .0000070  2.1990 0.0050  I   -17.392     .548    -8.476     .137   .188200   .311300  -.1215400   -18.100    -8.900  
+94 512 49484.00 I   .188701  .000131   .310098  .000190  I -.1236014  .0000071  2.1700 0.0050  I   -17.311     .548    -8.763     .137   .188700   .309300  -.1237200   -17.800    -9.100  
+94 513 49485.00 I   .189149  .000139   .308105  .000196  I -.1257618  .0000072  2.1493 0.0054  I   -17.209     .548    -8.917     .137   .189000   .307400  -.1258600   -17.400    -9.200  
+94 514 49486.00 I   .189254  .000145   .306043  .000202  I -.1279101  .0000081  2.1590 0.0058  I   -17.242     .611    -8.959     .153   .189000   .305400  -.1280100   -17.100    -9.300  
+94 515 49487.00 I   .188985  .000130   .303929  .000199  I -.1300973  .0000092  2.2213 0.0091  I   -17.469     .669    -8.904     .177   .188800   .303300  -.1301900   -16.700    -9.300  
+94 516 49488.00 I   .188471  .000243   .301845  .000148  I -.1323644  .0000162  2.3187 0.0089  I   -17.675     .116    -8.750     .298   .188400   .301200  -.1324700   -16.600    -9.200  
+94 517 49489.00 I   .187907  .000233   .299837  .000120  I -.1347430  .0000152  2.4411 0.0112  I   -17.613     .168    -8.515     .298   .188000   .299100  -.1348500   -16.600    -9.100  
+94 518 49490.00 I   .187447  .000226   .297844  .000120  I -.1372496  .0000155  2.5725 0.0109  I   -17.309     .168    -8.325     .298   .187600   .297000  -.1373600   -16.800    -9.000  
+94 519 49491.00 I   .187258  .000219   .295802  .000108  I -.1398852  .0000155  2.6955 0.0110  I   -17.047     .168    -8.289     .298   .187300   .295000  -.1400100   -17.000    -8.800  
+94 520 49492.00 I   .187165  .000222   .293799  .000125  I -.1426253  .0000155  2.7725 0.0115  I   -17.028     .168    -8.248     .298   .187000   .293100  -.1427500   -17.300    -8.600  
+94 521 49493.00 I   .186911  .000221   .291936  .000139  I -.1454033  .0000170  2.7688 0.0121  I   -17.269     .161    -8.051     .298   .186600   .291300  -.1455300   -17.800    -8.500  
+94 522 49494.00 I   .186381  .000133   .290234  .000209  I -.1481329  .0000187  2.6751 0.0117  I   -17.634     .164    -7.775     .298   .186000   .289700  -.1482500   -18.100    -8.500  
+94 523 49495.00 I   .185530  .000136   .288644  .000188  I -.1507284  .0000162  2.5062 0.0122  I   -17.930     .140    -7.622     .298   .185200   .288100  -.1508300   -18.300    -8.400  
+94 524 49496.00 I   .184389  .000139   .287063  .000200  I -.1531330  .0000157  2.3005 0.0112  I   -18.058     .115    -7.683     .298   .184200   .286400  -.1532300   -18.500    -8.400  
+94 525 49497.00 I   .183055  .000153   .285359  .000203  I -.1553305  .0000155  2.0982 0.0115  I   -18.066     .115    -7.809     .298   .183100   .284700  -.1554300   -18.500    -8.500  
+94 526 49498.00 I   .181653  .000151   .283438  .000200  I -.1573496  .0000168  1.9565 0.0111  I   -17.983     .115    -7.803     .298   .181900   .282700  -.1574600   -18.400    -8.600  
+94 527 49499.00 I   .180293  .000163   .281331  .000202  I -.1592708  .0000160  1.8965 0.0117  I   -17.762     .791    -7.691     .298   .180600   .280600  -.1593900   -18.100    -8.600  
+94 528 49500.00 I   .179012  .000173   .279090  .000188  I -.1611620  .0000164  1.8946 0.0136  I   -17.346     .791    -7.651     .298   .179200   .278400  -.1612800   -17.900    -8.700  
+94 529 49501.00 I   .177800  .000187   .276742  .000174  I -.1630720  .0000220  1.9287 0.0113  I   -16.919     .791    -7.749     .298   .177900   .276100  -.1632000   -17.800    -8.600  
+94 530 49502.00 I   .176635  .000174   .274317  .000121  I -.1650226  .0000156  1.9725 0.0135  I   -16.872     .101    -7.874     .298   .176700   .273600  -.1651600   -17.700    -8.600  
+94 531 49503.00 I   .175513  .000231   .271880  .000103  I -.1670147  .0000158  2.0096 0.0105  I   -17.343     .791    -7.936     .298   .175500   .271300  -.1671600   -17.900    -8.500  
+94 6 1 49504.00 I   .174487  .000230   .269528  .000095  I -.1690326  .0000140  2.0193 0.0104  I   -17.975     .791    -7.981     .298   .174500   .268900  -.1691800   -18.200    -8.400  
+94 6 2 49505.00 I   .173610  .000218   .267345  .000087  I -.1710389  .0000134  1.9860 0.0093  I   -18.333     .791    -8.073     .298   .173500   .266700  -.1711600   -18.700    -8.500  
+94 6 3 49506.00 I   .172730  .000204   .265339  .000102  I -.1729923  .0000122  1.9159 0.0072  I   -18.405     .791    -8.130     .298   .172400   .264700  -.1731100   -19.200    -8.500  
+94 6 4 49507.00 I   .171669  .000195   .263474  .000095  I -.1748627  .0000051  1.8219 0.0080  I   -18.540     .791    -8.049     .298   .171400   .262700  -.1749800   -19.600    -8.500  
+94 6 5 49508.00 I   .170453  .000245   .261702  .000155  I -.1766318  .0000104  1.7148 0.0046  I   -18.938     .791    -7.915     .298   .170200   .260900  -.1767500   -20.000    -8.600  
+94 6 6 49509.00 I   .169134  .000261   .259973  .000143  I -.1782903  .0000076  1.6015 0.0066  I   -19.405     .791    -7.902     .298   .169100   .259100  -.1784000   -20.300    -8.600  
+94 6 7 49510.00 I   .167779  .000220   .258226  .000159  I -.1798374  .0000081  1.4961 0.0057  I   -19.659     .116    -8.062     .298   .167900   .257300  -.1799400   -20.400    -8.800  
+94 6 8 49511.00 I   .166542  .000220   .256394  .000161  I -.1812913  .0000085  1.4172 0.0058  I   -19.626     .116    -8.274     .298   .166800   .255500  -.1813900   -20.300    -8.900  
+94 6 9 49512.00 I   .165561  .000220   .254458  .000146  I -.1826856  .0000084  1.3798 0.0061  I   -19.394     .116    -8.404     .298   .165700   .253600  -.1827900   -20.200    -9.000  
+94 610 49513.00 I   .164659  .000222   .252447  .000149  I -.1840720  .0000088  1.4058 0.0056  I   -19.114     .116    -8.469     .298   .164600   .251700  -.1842000   -20.000    -9.100  
+94 611 49514.00 I   .163719  .000226   .250366  .000146  I -.1855180  .0000074  1.4943 0.0076  I   -18.937     .116    -8.546     .298   .163600   .249600  -.1856600   -19.800    -9.100  
+94 612 49515.00 I   .162763  .000227   .248207  .000185  I -.1870737  .0000125  1.6222 0.0054  I   -18.989     .132    -8.653     .298   .162600   .247400  -.1872300   -19.600    -9.100  
+94 613 49516.00 I   .161851  .000150   .245977  .000231  I -.1887704  .0000080  1.7741 0.0074  I   -19.243     .276    -8.717     .249   .161800   .245200  -.1889200   -19.600    -9.000  
+94 614 49517.00 I   .161026  .000149   .243751  .000232  I -.1906238  .0000078  1.9318 0.0062  I   -19.475     .271    -8.624     .254   .161000   .243100  -.1907700   -19.800    -8.800  
+94 615 49518.00 I   .160281  .000153   .241641  .000241  I -.1926234  .0000094  2.0577 0.0058  I   -19.454     .271    -8.279     .254   .160200   .241000  -.1927500   -20.100    -8.700  
+94 616 49519.00 I   .159534  .000141   .239746  .000235  I -.1947203  .0000085  2.1269 0.0062  I   -19.190     .271    -7.649     .254   .159500   .239100  -.1948300   -20.500    -8.400  
+94 617 49520.00 I   .158676  .000159   .237991  .000257  I -.1968565  .0000082  2.1340 0.0049  I   -19.016     .271    -7.061     .254   .158700   .237400  -.1969500   -21.000    -8.300  
+94 618 49521.00 I   .157611  .000147   .236226  .000220  I -.1989637  .0000049  2.0671 0.0052  I   -19.208     .271    -6.696     .254   .157700   .235600  -.1990500   -21.400    -8.100  
+94 619 49522.00 I   .156276  .000146   .234349  .000184  I -.2009653  .0000065  1.9239 0.0038  I   -19.769     .192    -6.573     .185   .156500   .233800  -.2010400   -21.800    -8.000  
+94 620 49523.00 I   .154689  .000127   .232316  .000179  I -.2027923  .0000057  1.7232 0.0041  I   -20.493     .148    -6.755     .298   .155100   .231800  -.2028700   -22.000    -8.000  
+94 621 49524.00 I   .152998  .000139   .230146  .000171  I -.2044062  .0000049  1.5059 0.0038  I   -21.146     .148    -7.190     .298   .153500   .229600  -.2045000   -22.100    -8.000  
+94 622 49525.00 I   .151432  .000135   .227937  .000170  I -.2058193  .0000049  1.3341 0.0039  I   -21.641     .148    -7.629     .298   .151900   .227300  -.2059300   -22.100    -8.000  
+94 623 49526.00 I   .149986  .000123   .225843  .000155  I -.2071000  .0000061  1.2392 0.0040  I   -22.029     .289    -7.815     .298   .150100   .225100  -.2072300   -21.900    -8.100  
+94 624 49527.00 I   .148533  .000122   .223884  .000147  I -.2083200  .0000062  1.2114 0.0059  I   -22.261     .289    -7.712     .298   .148300   .223100  -.2084500   -21.800    -8.100  
+94 625 49528.00 I   .146973  .000158   .222011  .000151  I -.2095412  .0000102  1.2389 0.0079  I   -22.210     .316    -7.516     .298   .146500   .221200  -.2096800   -21.600    -8.100  
+94 626 49529.00 I   .145298  .000261   .220177  .000205  I -.2108058  .0000145  1.2903 0.0088  I   -21.905     .359    -7.442     .298   .144800   .219300  -.2109400   -21.700    -8.000  
+94 627 49530.00 I   .143565  .000270   .218360  .000251  I -.2121185  .0000144  1.3319 0.0106  I   -21.637     .293    -7.526     .298   .143000   .217500  -.2122400   -21.800    -8.000  
+94 628 49531.00 I   .141813  .000248   .216582  .000252  I -.2134590  .0000156  1.3419 0.0105  I   -21.735     .488    -7.650     .298   .141400   .215800  -.2135700   -22.100    -8.100  
+94 629 49532.00 I   .140036  .000246   .214909  .000253  I -.2147803  .0000153  1.2859 0.0112  I   -22.113     .470    -7.727     .336   .139800   .214200  -.2148800   -22.600    -8.000  
+94 630 49533.00 I   .138313  .000256   .213438  .000261  I -.2160203  .0000160  1.1984 0.0107  I   -22.429     .470    -7.778     .336   .138300   .212700  -.2161400   -23.100    -8.100  
+94 7 1 49534.00 I   .136704  .000246   .212123  .000260  I  .7828134  .0000151  1.1396 0.0112  I   -22.586     .495    -7.896     .359   .136800   .211500   .7826700   -23.700    -8.200  
+94 7 2 49535.00 I   .135090  .000228   .210874  .000257  I  .7817000  .0000158  1.0824 0.0111  I   -22.711     .495    -7.977     .359   .135000   .210300   .7815500   -24.300    -7.700  
+94 7 3 49536.00 I   .133370  .000217   .209627  .000206  I  .7806540  .0000164  1.0089 0.0098  I   -22.984     .535    -7.891     .387   .133300   .209000   .7805200   -24.300    -7.800  
+94 7 4 49537.00 I   .131521  .000171   .208338  .000169  I  .7796814  .0000116  0.9377 0.0094  I   -23.345     .396    -7.780     .416   .131400   .207600   .7795600   -24.200    -7.800  
+94 7 5 49538.00 I   .129613  .000140   .206974  .000120  I  .7787730  .0000093  0.8833 0.0074  I   -23.627     .251    -7.733     .241   .129500   .206200   .7786700   -23.900    -7.900  
+94 7 6 49539.00 I   .127726  .000134   .205520  .000147  I  .7779060  .0000092  0.8552 0.0065  I   -23.785     .265    -7.754     .244   .127700   .204600   .7778100   -23.700    -7.900  
+94 7 7 49540.00 I   .125890  .000123   .203972  .000139  I  .7770472  .0000090  0.8732 0.0065  I   -23.846     .265    -7.837     .244   .125900   .203000   .7769300   -23.400    -7.900  
+94 7 8 49541.00 I   .124100  .000119   .202429  .000137  I  .7761321  .0000091  0.9738 0.0073  I   -23.815     .265    -7.887     .244   .124100   .201400   .7759900   -23.100    -7.800  
+94 7 9 49542.00 I   .122316  .000122   .200998  .000145  I  .7750765  .0000114  1.1439 0.0081  I   -23.717     .265    -7.840     .244   .122400   .199900   .7749200   -22.900    -7.700  
+94 710 49543.00 I   .120582  .000120   .199702  .000172  I  .7738352  .0000133  1.3414 0.0086  I   -23.683     .266    -7.763     .236   .120600   .198700   .7737000   -22.900    -7.600  
+94 711 49544.00 I   .118900  .000197   .198504  .000149  I  .7723924  .0000129  1.5430 0.0098  I   -23.895     .171    -7.649     .144   .118800   .197600   .7722700   -23.100    -7.600  
+94 712 49545.00 I   .117262  .000212   .197367  .000155  I  .7707577  .0000144  1.7193 0.0098  I   -24.337     .288    -7.524     .154   .117100   .196600   .7706400   -23.400    -7.400  
+94 713 49546.00 I   .115585  .000219   .196254  .000144  I  .7689693  .0000147  1.8492 0.0108  I   -24.771     .289    -7.427     .146   .115300   .195500   .7688400   -23.900    -7.400  
+94 714 49547.00 I   .113774  .000210   .195114  .000147  I  .7670815  .0000162  1.9124 0.0108  I   -24.962     .289    -7.384     .146   .113500   .194400   .7669300   -24.500    -7.400  
+94 715 49548.00 I   .111917  .000204   .193886  .000157  I  .7651629  .0000159  1.9204 0.0112  I   -24.879     .289    -7.363     .146   .111700   .193100   .7649800   -25.000    -7.400  
+94 716 49549.00 I   .110060  .000186   .192527  .000164  I  .7632581  .0000156  1.8763 0.0113  I   -24.790     .316    -7.261     .160   .109900   .191700   .7630900   -25.500    -7.400  
+94 717 49550.00 I   .108157  .000190   .191009  .000196  I  .7614317  .0000160  1.7680 0.0105  I   -24.951     .324    -7.108     .164   .108000   .190200   .7613000   -25.900    -7.500  
+94 718 49551.00 I   .106172  .000114   .189314  .000232  I  .7597348  .0000142  1.6217 0.0104  I   -25.392     .196    -7.070     .298   .106000   .188400   .7596400   -26.100    -7.700  
+94 719 49552.00 I   .104134  .000078   .187488  .000220  I  .7581907  .0000132  1.4681 0.0097  I   -25.979     .394    -7.267     .298   .104000   .186600   .7581200   -26.000    -7.800  
+94 720 49553.00 I   .102165  .000080   .185697  .000223  I  .7567906  .0000131  1.3386 0.0094  I   -26.503     .426    -7.666     .298   .102000   .184800   .7567200   -25.900    -7.900  
+94 721 49554.00 I   .100269  .000084   .184109  .000224  I  .7554917  .0000133  1.2743 0.0083  I   -26.720     .426    -8.016     .298   .100100   .183100   .7553900   -25.700    -7.900  
+94 722 49555.00 I   .098391  .000080   .182709  .000195  I  .7542115  .0000102  1.3013 0.0100  I   -26.485     .426    -8.144     .298   .098200   .181700   .7540600   -25.500    -8.000  
+94 723 49556.00 I   .096537  .000087   .181392  .000201  I  .7528672  .0000150  1.3941 0.0124  I   -26.031     .482    -8.003     .298   .096400   .180400   .7526900   -25.300    -8.000  
+94 724 49557.00 I   .094755  .000094   .180140  .000155  I  .7514222  .0000227  1.4901 0.0110  I   -25.675     .589    -7.741     .298   .094600   .179200   .7512600   -25.300    -7.900  
+94 725 49558.00 I   .092961  .000095   .178983  .000129  I  .7499005  .0000161  1.5457 0.0129  I   -25.608     .365    -7.572     .102   .092700   .178100   .7497800   -25.400    -7.800  
+94 726 49559.00 I   .091017  .000095   .177952  .000101  I  .7483472  .0000123  1.5521 0.0099  I   -25.894     .791    -7.555     .105   .090700   .177100   .7482500   -25.700    -7.700  
+94 727 49560.00 I   .088891  .000094   .177080  .000117  I  .7468139  .0000114  1.5058 0.0086  I   -26.385     .175    -7.649     .140   .088500   .176200   .7467100   -26.200    -7.700  
+94 728 49561.00 I   .086705  .000104   .176385  .000121  I  .7453424  .0000120  1.4390 0.0071  I   -26.828     .175    -7.806     .140   .086300   .175400   .7451900   -26.700    -7.600  
+94 729 49562.00 I   .084616  .000106   .175803  .000130  I  .7439290  .0000083  1.3929 0.0086  I   -27.103     .175    -7.879     .140   .084200   .174700   .7437300   -27.200    -7.600  
+94 730 49563.00 I   .082635  .000104   .175254  .000134  I  .7425566  .0000122  1.3467 0.0095  I   -27.271     .175    -7.739     .140   .082100   .174200   .7423500   -27.600    -7.600  
+94 731 49564.00 I   .080660  .000113   .174710  .000181  I  .7412436  .0000172  1.2766 0.0086  I   -27.440     .169    -7.519     .169   .080200   .173800   .7410500   -27.800    -7.700  
+94 8 1 49565.00 I   .078707  .000115   .174217  .000167  I  .7400066  .0000122  1.1969 0.0105  I   -27.676     .146    -7.396     .155   .078500   .173400   .7398500   -28.000    -7.700  
+94 8 2 49566.00 I   .076835  .000114   .173815  .000233  I  .7388476  .0000122  1.1236 0.0089  I   -27.985     .272    -7.481     .128   .076800   .173100   .7387200   -27.800    -7.700  
+94 8 3 49567.00 I   .075074  .000115   .173500  .000238  I  .7377391  .0000130  1.1110 0.0089  I   -28.297     .369    -7.815     .120   .075100   .172800   .7376000   -27.700    -7.700  
+94 8 4 49568.00 I   .073460  .000112   .173232  .000230  I  .7366003  .0000130  1.1742 0.0088  I   -28.465     .369    -8.208     .120   .073400   .172500   .7364400   -27.500    -7.700  
+94 8 5 49569.00 I   .071866  .000127   .172970  .000229  I  .7353776  .0000119  1.2766 0.0094  I   -28.347     .369    -8.552     .120   .071600   .172200   .7352000   -27.100    -7.700  
+94 8 6 49570.00 I   .070233  .000141   .172666  .000192  I  .7340370  .0000137  1.4092 0.0103  I   -28.089     .425    -8.744     .298   .069900   .171700   .7339000   -27.600    -7.400  
+94 8 7 49571.00 I   .068588  .000160   .172309  .000195  I  .7325559  .0000169  1.5517 0.0102  I   -27.916     .469    -8.671     .298   .068300   .171400   .7324300   -27.700    -7.400  
+94 8 8 49572.00 I   .067030  .000164   .171954  .000213  I  .7309394  .0000151  1.6768 0.0114  I   -27.955     .419    -8.318     .298   .066800   .171300   .7308300   -27.800    -7.400  
+94 8 9 49573.00 I   .065656  .000172   .171684  .000181  I  .7292203  .0000153  1.7480 0.0108  I   -28.228     .547    -7.808     .169   .065400   .171200   .7291200   -28.000    -7.200  
+94 810 49574.00 I   .064458  .000175   .171547  .000180  I  .7274593  .0000155  1.7713 0.0111  I   -28.560     .658    -7.362     .182   .064100   .171200   .7273400   -28.200    -7.300  
+94 811 49575.00 I   .063177  .000176   .171524  .000190  I  .7256921  .0000162  1.7512 0.0106  I   -28.757     .658    -7.088     .182   .062700   .171200   .7255600   -28.500    -7.400  
+94 812 49576.00 I   .061639  .000167   .171505  .000195  I  .7239814  .0000145  1.6577 0.0103  I   -28.588     .658    -6.841     .182   .061100   .171000   .7238400   -28.800    -7.500  
+94 813 49577.00 I   .059681  .000189   .171353  .000175  I  .7223951  .0000126  1.5089 0.0112  I   -28.281     .734    -6.720     .209   .059100   .170700   .7222500   -29.100    -7.600  
+94 814 49578.00 I   .057308  .000206   .170981  .000140  I  .7209662  .0000170  1.3523 0.0091  I   -28.145     .718    -6.823     .202   .056900   .170200   .7208100   -29.300    -7.700  
+94 815 49579.00 I   .054665  .000188   .170386  .000139  I  .7196757  .0000132  1.2402 0.0107  I   -28.281     .538    -7.082     .126   .054500   .169600   .7195100   -29.300    -7.900  
+94 816 49580.00 I   .052050  .000176   .169688  .000119  I  .7184603  .0000130  1.2047 0.0089  I   -28.667     .130    -7.455     .298   .052000   .168900   .7183000   -29.200    -7.900  
+94 817 49581.00 I   .049759  .000195   .169084  .000115  I  .7172468  .0000118  1.2276 0.0088  I   -29.099     .130    -7.862     .298   .049700   .168300   .7171100   -29.100    -7.900  
+94 818 49582.00 I   .047661  .000195   .168749  .000091  I  .7159904  .0000119  1.2947 0.0084  I   -29.330     .130    -8.157     .298   .047300   .168000   .7158700   -28.800    -7.900  
+94 819 49583.00 I   .045502  .000198   .168670  .000093  I  .7146430  .0000119  1.4050 0.0079  I   -29.250     .130    -8.214     .298   .045000   .167800   .7145300   -28.500    -7.800  
+94 820 49584.00 I   .043003  .000174   .168739  .000106  I  .7131745  .0000105  1.5329 0.0071  I   -28.961     .126    -8.018     .298   .042400   .167900   .7130500   -28.400    -7.700  
+94 821 49585.00 I   .040105  .000156   .168840  .000130  I  .7115798  .0000078  1.6529 0.0077  I   -28.685     .791    -7.697     .298   .039800   .168000   .7114500   -28.400    -7.600  
+94 822 49586.00 I   .036966  .000256   .168869  .000241  I  .7098798  .0000114  1.7397 0.0071  I   -28.600     .278    -7.439     .298   .037000   .168000   .7097400   -28.600    -7.400  
+94 823 49587.00 I   .033817  .000249   .168787  .000242  I  .7081159  .0000118  1.7799 0.0083  I   -28.752     .271    -7.346     .298   .034200   .167900   .7079800   -28.900    -7.300  
+94 824 49588.00 I   .030911  .000250   .168608  .000243  I  .7063369  .0000122  1.7693 0.0085  I   -29.122     .315    -7.395     .298   .031400   .167600   .7062200   -29.400    -7.300  
+94 825 49589.00 I   .028467  .000253   .168424  .000243  I  .7045966  .0000123  1.7009 0.0086  I   -29.669     .315    -7.508     .298   .029000   .167400   .7044700   -29.800    -7.300  
+94 826 49590.00 I   .026502  .000277   .168362  .000243  I  .7029378  .0000122  1.6244 0.0084  I   -30.183     .315    -7.619     .298   .026800   .167300   .7027900   -30.200    -7.400  
+94 827 49591.00 I   .024679  .000269   .168471  .000226  I  .7013413  .0000114  1.5674 0.0090  I   -30.349     .315    -7.719     .298   .024700   .167400   .7011900   -30.500    -7.500  
+94 828 49592.00 I   .022800  .000288   .168698  .000224  I  .6998036  .0000132  1.5086 0.0075  I   -30.126     .331    -7.837     .298   .022700   .167700   .6996800   -30.600    -7.700  
+94 829 49593.00 I   .020795  .000197   .169007  .000125  I  .6983214  .0000097  1.4578 0.0081  I   -29.812     .357    -7.971     .298   .020600   .168100   .6982400   -30.500    -7.800  
+94 830 49594.00 I   .018609  .000185   .169415  .000116  I  .6968824  .0000093  1.4237 0.0066  I   -29.713     .266    -8.053     .298   .018400   .168600   .6968200   -30.200    -7.900  
+94 831 49595.00 I   .016183  .000172   .169907  .000115  I  .6954573  .0000090  1.4398 0.0064  I   -29.858     .245    -8.001     .298   .016100   .169000   .6953800   -30.000    -7.900  
+94 9 1 49596.00 I   .013552  .000149   .170355  .000120  I  .6939768  .0000089  1.5340 0.0061  I   -29.913     .245    -7.856     .298   .013700   .169400   .6938700   -29.600    -7.900  
+94 9 2 49597.00 I   .010952  .000128   .170717  .000126  I  .6923683  .0000083  1.6913 0.0066  I   -29.700     .245    -7.829     .298   .011200   .169800   .6922400   -29.200    -7.800  
+94 9 3 49598.00 I   .008574  .000125   .171044  .000126  I  .6905787  .0000097  1.8952 0.0065  I   -29.379     .202    -7.949     .298   .008800   .170200   .6904400   -29.100    -7.700  
+94 9 4 49599.00 I   .006431  .000122   .171426  .000121  I  .6885696  .0000101  2.1240 0.0074  I   -29.182     .132    -8.049     .107   .006400   .170700   .6884300   -29.000    -7.500  
+94 9 5 49600.00 I   .004323  .000130   .171935  .000116  I  .6863372  .0000111  2.3334 0.0077  I   -29.213     .122    -7.953     .298   .004000   .171000   .6862300   -29.400    -7.400  
+94 9 6 49601.00 I   .002002  .000148   .172597  .000123  I  .6839238  .0000117  2.4798 0.0081  I   -29.478     .285    -7.625     .263   .001600   .171800   .6838300   -29.700    -7.300  
+94 9 7 49602.00 I  -.000616  .000165   .173385  .000129  I  .6814098  .0000119  2.5294 0.0085  I   -29.918     .269    -7.240     .237  -.000800   .172700   .6813000   -30.100    -7.200  
+94 9 8 49603.00 I  -.003456  .000162   .174249  .000122  I  .6788784  .0000122  2.5387 0.0085  I   -30.414     .269    -7.010     .237  -.003500   .173600   .6787400   -30.400    -7.200  
+94 9 9 49604.00 I  -.006148  .000167   .175135  .000119  I  .6763470  .0000122  2.5042 0.0086  I   -30.813     .269    -7.039     .237  -.006100   .174600   .6762100   -30.700    -7.200  
+94 910 49605.00 I  -.008596  .000172   .176085  .000124  I  .6738930  .0000122  2.4007 0.0097  I   -30.956     .269    -7.180     .237  -.008500   .175500   .6737700   -30.800    -7.400  
+94 911 49606.00 I  -.010833  .000180   .177119  .000121  I  .6715460  .0000150  2.2959 0.0079  I   -30.831     .270    -7.279     .236  -.010800   .176500   .6714500   -30.900    -7.400  
+94 912 49607.00 I  -.013072  .000198   .178169  .000123  I  .6692901  .0000101  2.2243 0.0092  I   -30.566     .133    -7.349     .298  -.013100   .177400   .6692100   -30.600    -7.500  
+94 913 49608.00 I  -.015556  .000172   .179143  .000122  I  .6670788  .0000106  2.2084 0.0069  I   -30.308     .791    -7.449     .298  -.015600   .178200   .6670100   -30.400    -7.600  
+94 914 49609.00 I  -.018422  .000167   .179980  .000116  I  .6648563  .0000094  2.2434 0.0071  I   -30.158     .151    -7.589     .298  -.018400   .179100   .6647800   -30.100    -7.500  
+94 915 49610.00 I  -.021599  .000162   .180790  .000122  I  .6625777  .0000095  2.3212 0.0065  I   -30.105     .151    -7.710     .298  -.021400   .179800   .6624700   -29.800    -7.500  
+94 916 49611.00 I  -.024813  .000164   .181577  .000124  I  .6601997  .0000091  2.4414 0.0066  I   -30.049     .151    -7.730     .298  -.024700   .180600   .6600700   -29.600    -7.300  
+94 917 49612.00 I  -.027798  .000153   .182332  .000142  I  .6576960  .0000092  2.5583 0.0067  I   -29.920     .178    -7.609     .298  -.027800   .181300   .6575600   -29.400    -7.200  
+94 918 49613.00 I  -.030505  .000136   .183089  .000153  I  .6551011  .0000098  2.6213 0.0054  I   -29.808     .235    -7.388     .298  -.030700   .182200   .6549800   -29.400    -7.100  
+94 919 49614.00 I  -.033007  .000153   .183934  .000145  I  .6524739  .0000057  2.6229 0.0055  I   -29.836     .195    -7.172     .298  -.033300   .183100   .6523600   -29.500    -6.900  
+94 920 49615.00 I  -.035461  .000150   .184962  .000153  I  .6498753  .0000050  2.5646 0.0039  I   -30.017     .177    -7.061     .298  -.035800   .184200   .6497700   -29.700    -7.000  
+94 921 49616.00 I  -.038015  .000154   .186147  .000148  I  .6473536  .0000053  2.4796 0.0036  I   -30.328     .236    -7.099     .298  -.038400   .185400   .6472300   -30.100    -7.000  
+94 922 49617.00 I  -.040832  .000163   .187296  .000151  I  .6449207  .0000053  2.3806 0.0040  I   -30.690     .236    -7.186     .298  -.041000   .186600   .6447800   -30.300    -7.100  
+94 923 49618.00 I  -.043818  .000160   .188375  .000146  I  .6426013  .0000060  2.2548 0.0040  I   -30.923     .236    -7.290     .298  -.043800   .187700   .6424600   -30.600    -7.200  
+94 924 49619.00 I  -.046775  .000165   .189470  .000129  I  .6404117  .0000059  2.1271 0.0049  I   -30.778     .232    -7.429     .298  -.046600   .188700   .6402600   -30.600    -7.300  
+94 925 49620.00 I  -.049585  .000145   .190626  .000157  I  .6383387  .0000078  2.0244 0.0041  I   -30.261     .309    -7.585     .298  -.049400   .189700   .6381900   -30.500    -7.600  
+94 926 49621.00 I  -.052280  .000127   .191848  .000143  I  .6363505  .0000056  1.9587 0.0047  I   -29.706     .264    -7.744     .298  -.052300   .190900   .6362000   -30.200    -7.700  
+94 927 49622.00 I  -.054909  .000132   .193105  .000143  I  .6344068  .0000054  1.9365 0.0041  I   -29.502     .229    -7.860     .298  -.055100   .192100   .6342700   -29.900    -7.700  
+94 928 49623.00 I  -.057521  .000134   .194405  .000155  I  .6324646  .0000061  1.9532 0.0052  I   -29.675     .229    -7.841     .298  -.057900   .193600   .6323400   -29.500    -7.700  
+94 929 49624.00 I  -.060233  .000131   .195865  .000160  I  .6304856  .0000088  2.0144 0.0053  I   -29.819     .229    -7.680     .298  -.060700   .195100   .6303600   -29.100    -7.600  
+94 930 49625.00 I  -.062857  .000132   .197484  .000168  I  .6284157  .0000086  2.1359 0.0065  I   -29.697     .229    -7.504     .298  -.063300   .196800   .6282800   -28.800    -7.500  
+9410 1 49626.00 I  -.065164  .000139   .199217  .000171  I  .6261970  .0000096  2.3078 0.0071  I   -29.482     .135    -7.481     .298  -.065500   .198500   .6260500   -28.700    -7.300  
+9410 2 49627.00 I  -.067149  .000138   .201047  .000165  I  .6237941  .0000114  2.4978 0.0070  I   -29.431     .221    -7.604     .298  -.067400   .200300   .6236400   -28.700    -7.100  
+9410 3 49628.00 I  -.068989  .000137   .202944  .000165  I  .6212049  .0000101  2.6771 0.0076  I   -29.544     .210    -7.670     .298  -.069200   .202200   .6210500   -28.800    -7.000  
+9410 4 49629.00 I  -.070976  .000189   .204837  .000163  I  .6184532  .0000100  2.8163 0.0064  I   -29.597     .617    -7.515     .298  -.071200   .204000   .6183100   -29.100    -6.900  
+9410 5 49630.00 I  -.073424  .000189   .206629  .000149  I  .6155998  .0000077  2.8730 0.0063  I   -29.430     .636    -7.233     .298  -.073900   .205500   .6155100   -29.300    -6.700  
+9410 6 49631.00 I  -.076446  .000186   .208213  .000149  I  .6127461  .0000077  2.8130 0.0052  I   -29.179     .636    -7.115     .298  -.076800   .207100   .6126800   -29.600    -6.900  
+9410 7 49632.00 I  -.079838  .000186   .209601  .000144  I  .6100058  .0000070  2.6571 0.0049  I   -29.178     .636    -7.176     .298  -.080000   .208600   .6099500   -29.800    -6.900  
+9410 8 49633.00 I  -.083262  .000194   .210886  .000134  I  .6074385  .0000060  2.4813 0.0045  I   -29.386     .723    -7.226     .298  -.083300   .210000   .6073700   -29.800    -7.100  
+9410 9 49634.00 I  -.086479  .000211   .212130  .000184  I  .6050286  .0000057  2.3492 0.0038  I   -29.605     .874    -7.178     .298  -.086500   .211300   .6049500   -29.600    -7.200  
+941010 49635.00 I  -.089290  .000169   .213380  .000144  I  .6027164  .0000046  2.2882 0.0037  I   -29.663     .487    -7.125     .298  -.089300   .212600   .6026200   -29.300    -7.200  
+941011 49636.00 I  -.091505  .000134   .214693  .000114  I  .6004284  .0000047  2.2986 0.0033  I   -29.374     .791    -7.157     .298  -.091600   .214000   .6003300   -29.000    -7.200  
+941012 49637.00 I  -.093166  .000133   .216160  .000114  I  .5981027  .0000047  2.3584 0.0050  I   -28.789     .791    -7.217     .105  -.093400   .215500   .5980000   -28.500    -7.100  
+941013 49638.00 I  -.094538  .000137   .217881  .000124  I  .5957062  .0000088  2.4344 0.0052  I   -28.195     .791    -7.171     .105  -.094800   .217200   .5956100   -28.100    -7.000  
+941014 49639.00 I  -.095750  .000120   .219840  .000120  I  .5932373  .0000092  2.5003 0.0063  I   -27.833     .791    -6.981     .105  -.095900   .219100   .5931400   -27.800    -6.700  
+941015 49640.00 I  -.096889  .000115   .221990  .000123  I  .5907151  .0000091  2.5377 0.0070  I   -27.732     .791    -6.730     .298  -.096900   .221100   .5906300   -27.500    -6.600  
+941016 49641.00 I  -.098078  .000120   .224264  .000151  I  .5881772  .0000106  2.5292 0.0068  I   -27.799     .791    -6.522     .113  -.098000   .223400   .5881000   -27.400    -6.400  
+941017 49642.00 I  -.099501  .000137   .226604  .000138  I  .5856753  .0000101  2.4650 0.0079  I   -27.949     .791    -6.388     .100  -.099500   .225700   .5856200   -27.400    -6.300  
+941018 49643.00 I  -.101377  .000139   .228955  .000166  I  .5832655  .0000117  2.3458 0.0066  I   -28.097     .145    -6.342     .298  -.101500   .228000   .5832200   -27.600    -6.200  
+941019 49644.00 I  -.103841  .000157   .231268  .000168  I  .5809929  .0000084  2.1989 0.0077  I   -28.159     .146    -6.428     .298  -.104100   .230300   .5809500   -27.600    -6.200  
+941020 49645.00 I  -.106752  .000150   .233466  .000159  I  .5788597  .0000099  2.0761 0.0065  I   -28.151     .146    -6.598     .298  -.107100   .232600   .5788000   -27.800    -6.300  
+941021 49646.00 I  -.109750  .000145   .235599  .000154  I  .5768260  .0000100  1.9973 0.0065  I   -28.099     .152    -6.777     .298  -.110100   .234900   .5767600   -27.900    -6.600  
+941022 49647.00 I  -.112530  .000130   .237770  .000135  I  .5748551  .0000085  1.9483 0.0080  I   -27.906     .152    -6.895     .298  -.112800   .237100   .5747800   -27.900    -6.700  
+941023 49648.00 I  -.114973  .000108   .239947  .000137  I  .5729195  .0000124  1.9288 0.0060  I   -27.529     .200    -6.919     .298  -.115100   .239300   .5728500   -27.700    -6.900  
+941024 49649.00 I  -.117092  .000113   .242100  .000147  I  .5709849  .0000085  1.9471 0.0077  I   -27.136     .189    -6.900     .298  -.117200   .241300   .5709100   -27.400    -7.000  
+941025 49650.00 I  -.119084  .000118   .244217  .000210  I  .5690110  .0000090  2.0083 0.0058  I   -26.957     .181    -6.902     .298  -.119200   .243300   .5689300   -27.100    -7.100  
+941026 49651.00 I  -.121195  .000117   .246300  .000210  I  .5669543  .0000078  2.1115 0.0060  I   -26.972     .347    -6.898     .298  -.121400   .245300   .5668700   -26.800    -7.100  
+941027 49652.00 I  -.123525  .000121   .248390  .000209  I  .5647789  .0000079  2.2419 0.0056  I   -26.961     .347    -6.781     .298  -.123800   .247300   .5646900   -26.600    -6.900  
+941028 49653.00 I  -.125949  .000123   .250477  .000214  I  .5624625  .0000079  2.3964 0.0054  I   -26.804     .347    -6.581     .298  -.126100   .249400   .5623800   -26.400    -6.700  
+941029 49654.00 I  -.128152  .000152   .252528  .000235  I  .5599782  .0000074  2.5748 0.0061  I   -26.673     .366    -6.388     .298  -.128300   .251500   .5599200   -26.500    -6.600  
+941030 49655.00 I  -.130001  .000159   .254583  .000231  I  .5573138  .0000094  2.7507 0.0051  I   -26.803     .447    -6.270     .104  -.130200   .253700   .5572700   -26.600    -6.300  
+941031 49656.00 I  -.131520  .000155   .256710  .000201  I  .5544892  .0000071  2.8894 0.0057  I   -27.115     .480    -6.190     .101  -.131800   .255900   .5544400   -26.900    -6.300  
+9411 1 49657.00 I  -.132859  .000160   .258913  .000127  I  .5515578  .0000065  2.9599 0.0051  I   -27.224     .424    -6.064     .298  -.133200   .258200   .5515000   -27.100    -6.200  
+9411 2 49658.00 I  -.134179  .000156   .261087  .000129  I  .5485981  .0000073  2.9445 0.0051  I   -26.818     .424    -5.963     .298  -.134500   .260400   .5485300   -27.300    -6.200  
+9411 3 49659.00 I  -.135582  .000161   .263155  .000113  I  .5457003  .0000079  2.8346 0.0053  I   -26.109     .424    -5.946     .298  -.135800   .262600   .5456100   -27.500    -6.200  
+9411 4 49660.00 I  -.136997  .000157   .265187  .000106  I  .5429500  .0000077  2.6615 0.0057  I   -25.467     .424    -5.987     .298  -.137200   .264900   .5428600   -28.000    -6.100  
+9411 5 49661.00 I  -.138425  .000121   .267286  .000088  I  .5403769  .0000081  2.4897 0.0079  I   -25.234     .297    -5.951     .298  -.138600   .267000   .5402800   -27.700    -6.200  
+9411 6 49662.00 I  -.139887  .000157   .269503  .000130  I  .5379537  .0000137  2.3687 0.0062  I   -25.520     .791    -5.795     .298  -.140100   .269100   .5378600   -27.200    -6.200  
+9411 7 49663.00 I  -.141344  .000139   .271822  .000107  I  .5356169  .0000094  2.3154 0.0082  I   -26.008     .157    -5.692     .298  -.141700   .271300   .5355300   -26.700    -6.100  
+9411 8 49664.00 I  -.142740  .000149   .274220  .000101  I  .5333062  .0000089  2.3121 0.0062  I   -26.181     .157    -5.819     .298  -.143100   .273600   .5332300   -26.100    -6.100  
+9411 9 49665.00 I  -.143972  .000163   .276693  .000095  I  .5309772  .0000081  2.3554 0.0062  I   -25.847     .141    -6.093     .298  -.144300   .276000   .5309100   -25.600    -5.900  
+941110 49666.00 I  -.144804  .000165   .279285  .000090  I  .5285867  .0000085  2.4250 0.0058  I   -25.301     .141    -6.270     .298  -.145200   .278700   .5285300   -25.300    -5.800  
+941111 49667.00 I  -.145287  .000167   .281983  .000089  I  .5261314  .0000084  2.4822 0.0060  I   -24.982     .141    -6.215     .298  -.145700   .281400   .5260800   -25.100    -5.500  
+941112 49668.00 I  -.145653  .000176   .284744  .000100  I  .5236320  .0000084  2.5105 0.0093  I   -24.995     .165    -6.033     .298  -.146200   .284200   .5236000   -24.900    -5.400  
+941113 49669.00 I  -.146085  .000137   .287529  .000106  I  .5211225  .0000166  2.5025 0.0067  I   -25.125     .100    -5.890     .298  -.146500   .286900   .5210900   -25.000    -5.300  
+941114 49670.00 I  -.146623  .000138   .290267  .000131  I  .5186373  .0000104  2.4635 0.0098  I   -25.220     .791    -5.802     .298  -.146800   .289600   .5186000   -25.200    -5.300  
+941115 49671.00 I  -.147213  .000135   .292902  .000140  I  .5162031  .0000105  2.4019 0.0078  I   -25.299     .791    -5.682     .298  -.147200   .292300   .5161600   -25.300    -5.400  
+941116 49672.00 I  -.147808  .000101   .295464  .000142  I  .5138394  .0000116  2.3228 0.0080  I   -25.366     .791    -5.524     .298  -.147700   .294900   .5137800   -25.400    -5.500  
+941117 49673.00 I  -.148488  .000101   .298075  .000147  I  .5115623  .0000122  2.2293 0.0084  I   -25.355     .791    -5.410     .298  -.148300   .297500   .5114900   -25.500    -5.500  
+941118 49674.00 I  -.149331  .000109   .300760  .000141  I  .5093815  .0000122  2.1336 0.0073  I   -25.239     .791    -5.379     .298  -.149200   .300200   .5093100   -25.600    -5.700  
+941119 49675.00 I  -.150308  .000100   .303477  .000122  I  .5072894  .0000079  2.0548 0.0103  I   -25.045     .791    -5.368     .298  -.150300   .302900   .5072100   -25.400    -5.800  
+941120 49676.00 I  -.151335  .000092   .306191  .000112  I  .5052594  .0000166  2.0133 0.0065  I   -24.808     .165    -5.328     .298  -.151400   .305600   .5051700   -25.200    -5.900  
+941121 49677.00 I  -.152336  .000133   .308941  .000110  I  .5032454  .0000102  2.0239 0.0093  I   -24.601     .175    -5.319     .298  -.152500   .308400   .5031400   -24.900    -5.800  
+941122 49678.00 I  -.153136  .000129   .311793  .000113  I  .5011934  .0000082  2.0891 0.0063  I   -24.547     .175    -5.435     .298  -.153400   .311100   .5010800   -24.500    -5.800  
+941123 49679.00 I  -.153511  .000141   .314720  .000109  I  .4990493  .0000075  2.2081 0.0057  I   -24.659     .175    -5.642     .298  -.153800   .313900   .4989500   -24.200    -5.600  
+941124 49680.00 I  -.153354  .000165   .317579  .000122  I  .4967655  .0000078  2.3621 0.0047  I   -24.704     .175    -5.716     .298  -.153700   .316700   .4967000   -24.000    -5.400  
+941125 49681.00 I  -.152777  .000179   .320381  .000118  I  .4943244  .0000057  2.5182 0.0069  I   -24.517     .175    -5.571     .298  -.153100   .319500   .4942900   -23.700    -5.200  
+941126 49682.00 I  -.152113  .000199   .323160  .000175  I  .4917358  .0000113  2.6543 0.0066  I   -24.210     .185    -5.329     .298  -.152300   .322300   .4917300   -23.600    -5.000  
+941127 49683.00 I  -.151650  .000230   .325909  .000179  I  .4890285  .0000120  2.7525 0.0077  I   -24.031     .130    -5.127     .298  -.151600   .325100   .4890400   -23.700    -4.800  
+941128 49684.00 I  -.151460  .000193   .328635  .000162  I  .4862510  .0000106  2.7901 0.0080  I   -24.087     .121    -4.977     .298  -.151200   .327900   .4862600   -23.800    -4.800  
+941129 49685.00 I  -.151383  .000184   .331360  .000163  I  .4834753  .0000107  2.7465 0.0076  I   -24.250     .121    -4.831     .298  -.151200   .330600   .4834500   -23.900    -4.700  
+941130 49686.00 I  -.151275  .000171   .334074  .000169  I  .4807701  .0000109  2.6664 0.0076  I   -24.308     .121    -4.744     .298  -.151400   .333400   .4806900   -23.900    -4.700  
+9412 1 49687.00 I  -.151498  .000148   .336727  .000158  I  .4781455  .0000109  2.5772 0.0074  I   -24.154     .110    -4.797     .298  -.151700   .336100   .4780300   -24.000    -4.900  
+9412 2 49688.00 I  -.152003  .000145   .339262  .000158  I  .4756244  .0000100  2.4620 0.0066  I   -23.860     .110    -4.966     .298  -.152200   .338700   .4755000   -24.000    -5.000  
+9412 3 49689.00 I  -.152556  .000125   .341652  .000123  I  .4732183  .0000076  2.3565 0.0075  I   -23.675     .791    -5.060     .298  -.152500   .341100   .4730900   -23.900    -5.100  
+9412 4 49690.00 I  -.152865  .000092   .343888  .000153  I  .4708950  .0000111  2.3003 0.0052  I   -23.792     .162    -4.944     .298  -.152900   .343200   .4707300   -24.000    -5.300  
+9412 5 49691.00 I  -.152737  .000097   .346018  .000149  I  .4685954  .0000072  2.3109 0.0068  I   -24.054     .252    -4.767     .298  -.152900   .345300   .4684300   -23.500    -5.300  
+9412 6 49692.00 I  -.152319  .000106   .348133  .000148  I  .4662553  .0000079  2.3752 0.0053  I   -24.048     .230    -4.791     .298  -.152600   .347400   .4661100   -23.300    -5.200  
+9412 7 49693.00 I  -.151855  .000104   .350338  .000142  I  .4638417  .0000079  2.4492 0.0054  I   -23.616     .265    -5.034     .298  -.152200   .349600   .4637200   -23.300    -5.000  
+9412 8 49694.00 I  -.151502  .000124   .352762  .000150  I  .4613657  .0000075  2.4966 0.0055  I   -23.189     .265    -5.183     .298  -.151900   .352100   .4612800   -23.000    -4.800  
+9412 9 49695.00 I  -.151377  .000150   .355413  .000160  I  .4588597  .0000077  2.5104 0.0046  I   -23.153     .265    -5.046     .298  -.151700   .354700   .4587800   -22.900    -4.700  
+941210 49696.00 I  -.151519  .000160   .358227  .000137  I  .4563534  .0000052  2.4986 0.0052  I   -23.433     .282    -4.750     .298  -.151700   .357600   .4562800   -22.800    -4.400  
+941211 49697.00 I  -.152018  .000164   .361091  .000124  I  .4538684  .0000069  2.4690 0.0037  I   -23.665     .182    -4.531     .298  -.152000   .360500   .4537800   -22.900    -4.400  
+941212 49698.00 I  -.152813  .000156   .363880  .000124  I  .4514189  .0000052  2.4288 0.0043  I   -23.655     .220    -4.470     .298  -.152600   .363300   .4513200   -22.900    -4.300  
+941213 49699.00 I  -.153503  .000156   .366531  .000131  I  .4490111  .0000052  2.3877 0.0040  I   -23.518     .220    -4.502     .298  -.153200   .366000   .4489200   -22.900    -4.400  
+941214 49700.00 I  -.153781  .000150   .369106  .000142  I  .4466544  .0000062  2.3139 0.0040  I   -23.379     .181    -4.584     .298  -.153800   .368500   .4465900   -23.000    -4.400  
+941215 49701.00 I  -.153973  .000146   .371747  .000149  I  .4443857  .0000062  2.2330 0.0043  I   -23.276     .181    -4.656     .298  -.154400   .370900   .4443300   -23.000    -4.500  
+941216 49702.00 I  -.154240  .000148   .374469  .000154  I  .4421722  .0000059  2.2006 0.0045  I   -23.179     .181    -4.710     .298  -.154900   .373300   .4421100   -23.000    -4.800  
+941217 49703.00 I  -.154662  .000116   .377245  .000159  I  .4399678  .0000064  2.2182 0.0049  I   -23.123     .164    -4.723     .298  -.155400   .375900   .4398900   -22.800    -4.900  
+941218 49704.00 I  -.155272  .000130   .380014  .000181  I  .4377180  .0000077  2.2892 0.0047  I   -23.120     .183    -4.675     .298  -.156000   .378700   .4376300   -22.700    -4.900  
+941219 49705.00 I  -.156060  .000119   .382715  .000166  I  .4353743  .0000070  2.4056 0.0047  I   -23.084     .194    -4.632     .112  -.156700   .381500   .4352700   -22.500    -5.000  
+941220 49706.00 I  -.156932  .000122   .385263  .000184  I  .4328925  .0000055  2.5650 0.0045  I   -22.946     .237    -4.670     .135  -.157400   .384300   .4327900   -22.400    -4.900  
+941221 49707.00 I  -.157709  .000119   .387602  .000171  I  .4302489  .0000056  2.7106 0.0039  I   -22.740     .237    -4.765     .135  -.158000   .386800   .4301800   -22.300    -4.700  
+941222 49708.00 I  -.158271  .000100   .389863  .000142  I  .4274840  .0000055  2.8181 0.0039  I   -22.605     .237    -4.798     .135  -.158600   .389100   .4274400   -22.300    -4.400  
+941223 49709.00 I  -.158674  .000098   .392127  .000145  I  .4246131  .0000055  2.9243 0.0043  I   -22.550     .237    -4.680     .135  -.159000   .391400   .4245700   -22.200    -4.100  
+941224 49710.00 I  -.158946  .000107   .394483  .000172  I  .4216396  .0000065  3.0178 0.0051  I   -22.525     .215    -4.434     .185  -.159200   .393700   .4215900   -22.300    -3.800  
+941225 49711.00 I  -.159032  .000143   .397043  .000170  I  .4185905  .0000087  3.0722 0.0048  I   -22.553     .791    -4.146     .298  -.159300   .396200   .4185400   -22.500    -3.500  
+941226 49712.00 I  -.158912  .000146   .399861  .000124  I  .4155133  .0000070  3.0723 0.0059  I   -22.682     .791    -3.874     .298  -.159200   .399100   .4154600   -22.600    -3.300  
+941227 49713.00 I  -.158656  .000148   .402918  .000211  I  .4124665  .0000080  3.0106 0.0054  I   -22.908     .791    -3.651     .298  -.159000   .402200   .4124000   -22.700    -3.200  
+941228 49714.00 I  -.158336  .000147   .406112  .000211  I  .4095072  .0000081  2.9037 0.0057  I   -23.150     .162    -3.573     .298  -.158700   .405500   .4094300   -22.700    -3.100  
+941229 49715.00 I  -.157891  .000153   .409294  .000210  I  .4066683  .0000082  2.7694 0.0057  I   -23.281     .162    -3.761     .298  -.158100   .408700   .4065700   -22.600    -3.200  
+941230 49716.00 I  -.156905  .000153   .412426  .000207  I  .4039580  .0000081  2.6665 0.0058  I   -23.240     .162    -4.218     .298  -.157100   .411700   .4038300   -22.300    -3.300  
+941231 49717.00 I  -.155298  .000148   .415519  .000209  I  .4013094  .0000081  2.6414 0.0059  I   -23.114     .162    -4.629     .298  -.155600   .414800   .4011600   -21.900    -3.300  
+95 1 1 49718.00 I  -.153189  .000141   .418559  .000222  I  .3986542  .0000085  2.6795 0.0055  I   -23.041     .180    -4.690     .298  -.153600   .417700   .3985000   -21.600    -3.400  
+95 1 2 49719.00 I  -.150825  .000118   .421482  .000225  I  .3959327  .0000075  2.7708 0.0064  I   -23.011     .179    -4.436     .298  -.151300   .420500   .3957900   -21.200    -3.400  
+95 1 3 49720.00 I  -.148493  .000091   .424222  .000141  I  .3931052  .0000095  2.8841 0.0059  I   -22.859     .791    -4.143     .298  -.148900   .423300   .3929800   -22.600    -3.900  
+95 1 4 49721.00 I  -.146361  .000074   .426771  .000140  I  .3901717  .0000092  2.9756 0.0069  I   -22.540     .791    -4.023     .298  -.146700   .426000   .3900700   -22.700    -3.800  
+95 1 5 49722.00 I  -.144479  .000075   .429174  .000140  I  .3871759  .0000099  3.0014 0.0069  I   -22.305     .791    -4.043     .298  -.144700   .428500   .3870900   -22.800    -3.900  
+95 1 6 49723.00 I  -.142828  .000071   .431398  .000139  I  .3841933  .0000104  2.9540 0.0075  I   -22.431     .791    -4.051     .298  -.143100   .430800   .3841100   -22.900    -3.900  
+95 1 7 49724.00 I  -.141374  .000109   .433434  .000199  I  .3812858  .0000113  2.8529 0.0096  I   -22.839     .791    -4.004     .298  -.141600   .432800   .3812000   -23.000    -3.900  
+95 1 8 49725.00 I  -.140045  .000146   .435337  .000266  I  .3785005  .0000162  2.7128 0.0069  I   -23.190     .791    -3.985     .298  -.140300   .434700   .3784200   -23.300    -4.000  
+95 1 9 49726.00 I  -.138689  .000123   .437218  .000223  I  .3758672  .0000080  2.5516 0.0091  I   -23.310     .791    -4.048     .298  -.138900   .436700   .3757900   -23.500    -4.100  
+95 110 49727.00 I  -.137139  .000123   .439265  .000231  I  .3734000  .0000081  2.3824 0.0056  I   -23.314     .791    -4.168     .298  -.137400   .438800   .3733300   -23.500    -4.300  
+95 111 49728.00 I  -.135392  .000122   .441655  .000235  I  .3710942  .0000078  2.2379 0.0054  I   -23.318     .791    -4.303     .298  -.135800   .441100   .3710100   -23.500    -4.600  
+95 112 49729.00 I  -.133709  .000124   .444245  .000232  I  .3689076  .0000072  2.1433 0.0051  I   -23.243     .791    -4.386     .298  -.134100   .443500   .3688100   -23.300    -4.800  
+95 113 49730.00 I  -.132167  .000114   .446876  .000228  I  .3667940  .0000067  2.0895 0.0055  I   -23.043     .791    -4.399     .298  -.132600   .446100   .3666900   -23.100    -5.000  
+95 114 49731.00 I  -.130820  .000091   .449483  .000178  I  .3647144  .0000083  2.0783 0.0083  I   -22.842     .791    -4.343     .298  -.131200   .448700   .3646100   -22.800    -5.100  
+95 115 49732.00 I  -.129771  .000120   .452053  .000158  I  .3626227  .0000152  2.1111 0.0073  I   -22.760     .791    -4.265     .298  -.130200   .451300   .3625200   -22.400    -5.200  
+95 116 49733.00 I  -.129050  .000211   .454549  .000164  I  .3604814  .0000120  2.1762 0.0096  I   -22.734     .483    -4.270     .144  -.129400   .453800   .3603800   -22.100    -5.200  
+95 117 49734.00 I  -.128552  .000213   .456895  .000160  I  .3582618  .0000117  2.2669 0.0085  I   -22.655     .513    -4.429     .151  -.128800   .456200   .3581600   -21.900    -5.000  
+95 118 49735.00 I  -.128075  .000216   .459036  .000143  I  .3559323  .0000119  2.4035 0.0084  I   -22.589     .513    -4.717     .151  -.128200   .458300   .3558300   -21.800    -4.800  
+95 119 49736.00 I  -.127274  .000216   .460979  .000134  I  .3534489  .0000120  2.5576 0.0077  I   -22.721     .513    -5.033     .151  -.127500   .460200   .3533500   -21.800    -4.600  
+95 120 49737.00 I  -.126173  .000222   .462741  .000144  I  .3508263  .0000097  2.6839 0.0070  I   -22.958     .513    -5.129     .151  -.126600   .461900   .3507400   -21.900    -4.300  
+95 121 49738.00 I  -.124927  .000169   .464397  .000124  I  .3480913  .0000073  2.7794 0.0060  I   -23.146     .513    -4.947     .151  -.125400   .463400   .3480000   -22.200    -4.100  
+95 122 49739.00 I  -.123597  .000096   .466094  .000096  I  .3452808  .0000070  2.8348 0.0050  I   -23.225     .276    -4.613     .114  -.124000   .465200   .3452000   -22.400    -4.000  
+95 123 49740.00 I  -.122176  .000098   .468000  .000105  I  .3424368  .0000069  2.8447 0.0053  I   -23.209     .101    -4.237     .298  -.122500   .467100   .3423600   -22.800    -3.900  
+95 124 49741.00 I  -.120697  .000099   .470190  .000110  I  .3396079  .0000079  2.8050 0.0052  I   -23.207     .101    -3.924     .298  -.120900   .469400   .3395300   -22.900    -3.900  
+95 125 49742.00 I  -.119243  .000101   .472586  .000109  I  .3368351  .0000078  2.7404 0.0055  I   -23.344     .791    -3.810     .298  -.119300   .471900   .3367500   -22.900    -3.900  
+95 126 49743.00 I  -.117856  .000104   .475101  .000110  I  .3341227  .0000077  2.6891 0.0053  I   -23.656     .791    -3.985     .298  -.117900   .474400   .3340300   -22.900    -4.100  
+95 127 49744.00 I  -.116658  .000100   .477515  .000108  I  .3314510  .0000071  2.6555 0.0060  I   -24.026     .791    -4.436     .298  -.116700   .476800   .3313600   -22.800    -4.200  
+95 128 49745.00 I  -.115778  .000118   .479680  .000113  I  .3287997  .0000093  2.6578 0.0071  I   -24.304     .128    -4.978     .298  -.115800   .479000   .3287100   -22.700    -4.200  
+95 129 49746.00 I  -.115216  .000159   .481614  .000120  I  .3261178  .0000123  2.7130 0.0058  I   -24.434     .160    -5.290     .138  -.115300   .480900   .3260400   -22.600    -4.300  
+95 130 49747.00 I  -.114986  .000179   .483338  .000179  I  .3233651  .0000069  2.7940 0.0084  I   -24.403     .180    -5.194     .143  -.115200   .482600   .3233000   -22.500    -4.200  
+95 131 49748.00 I  -.115087  .000228   .484913  .000183  I  .3205334  .0000114  2.8640 0.0066  I   -24.191     .223    -4.772     .276  -.115400   .484200   .3204800   -22.500    -4.200  
+95 2 1 49749.00 I  -.115431  .000254   .486423  .000184  I  .3176520  .0000113  2.8891 0.0082  I   -23.847     .193    -4.282     .232  -.115900   .485700   .3175900   -22.700    -4.100  
+95 2 2 49750.00 I  -.115770  .000254   .487929  .000181  I  .3147682  .0000117  2.8750 0.0081  I   -23.596     .193    -4.132     .232  -.116200   .487200   .3146800   -23.200    -4.200  
+95 2 3 49751.00 I  -.115750  .000254   .489384  .000183  I  .3119068  .0000116  2.8464 0.0085  I   -23.576     .193    -4.355     .232  -.116300   .488600   .3118000   -23.400    -4.200  
+95 2 4 49752.00 I  -.115037  .000257   .490757  .000184  I  .3090844  .0000123  2.7908 0.0092  I   -23.713     .190    -4.654     .237  -.115800   .489900   .3089800   -23.800    -4.300  
+95 2 5 49753.00 I  -.113739  .000256   .492107  .000188  I  .3063359  .0000144  2.7030 0.0088  I   -23.852     .186    -4.843     .246  -.114600   .491300   .3062500   -24.100    -4.300  
+95 2 6 49754.00 I  -.111844  .000240   .493562  .000164  I  .3036856  .0000125  2.5936 0.0097  I   -23.933     .115    -4.939     .298  -.112700   .492800   .3036200   -24.200    -4.500  
+95 2 7 49755.00 I  -.109299  .000204   .495255  .000188  I  .3011561  .0000131  2.4622 0.0091  I   -24.006     .132    -5.004     .298  -.110100   .494600   .3011100   -24.300    -4.700  
+95 2 8 49756.00 I  -.106276  .000199   .497280  .000189  I  .2987650  .0000133  2.3196 0.0093  I   -24.099     .132    -5.090     .298  -.107000   .496600   .2987300   -24.200    -5.000  
+95 2 9 49757.00 I  -.103092  .000192   .499653  .000191  I  .2965034  .0000133  2.2176 0.0094  I   -24.164     .132    -5.204     .298  -.103800   .498900   .2964500   -24.100    -5.200  
+95 210 49758.00 I  -.100159  .000195   .502148  .000184  I  .2943105  .0000133  2.1735 0.0092  I   -24.165     .132    -5.293     .298  -.100900   .501300   .2942500   -23.900    -5.500  
+95 211 49759.00 I  -.097808  .000179   .504465  .000170  I  .2921455  .0000127  2.1621 0.0104  I   -24.181     .132    -5.306     .298  -.098400   .503500   .2920700   -23.600    -5.600  
+95 212 49760.00 I  -.096094  .000176   .506447  .000116  I  .2899714  .0000160  2.1955 0.0081  I   -24.282     .370    -5.286     .298  -.096600   .505500   .2899000   -23.400    -5.800  
+95 213 49761.00 I  -.094893  .000205   .508087  .000126  I  .2877376  .0000100  2.2797 0.0095  I   -24.354     .264    -5.329     .130  -.095200   .507300   .2876600   -23.200    -5.800  
+95 214 49762.00 I  -.093920  .000195   .509472  .000118  I  .2853989  .0000102  2.4033 0.0071  I   -24.172     .262    -5.453     .126  -.094100   .508700   .2853100   -23.200    -5.700  
+95 215 49763.00 I  -.092755  .000186   .510757  .000109  I  .2829181  .0000102  2.5657 0.0070  I   -23.653     .262    -5.564     .126  -.092800   .510100   .2828300   -23.200    -5.700  
+95 216 49764.00 I  -.091000  .000187   .512165  .000108  I  .2802679  .0000095  2.7271 0.0066  I   -23.077     .262    -5.637     .126  -.091300   .511400   .2801800   -23.300    -5.600  
+95 217 49765.00 I  -.088903  .000188   .513700  .000117  I  .2774850  .0000085  2.8252 0.0071  I   -22.779     .262    -5.567     .126  -.089500   .512800   .2774100   -23.500    -5.400  
+95 218 49766.00 I  -.086820  .000187   .515241  .000112  I  .2746413  .0000105  2.8517 0.0077  I   -22.832     .187    -5.402     .146  -.087700   .514200   .2745700   -23.700    -5.400  
+95 219 49767.00 I  -.084959  .000152   .516735  .000116  I  .2718026  .0000128  2.8151 0.0059  I   -23.087     .259    -5.282     .117  -.085900   .515600   .2717300   -23.900    -5.300  
+95 220 49768.00 I  -.083343  .000119   .518078  .000151  I  .2690284  .0000055  2.7265 0.0072  I   -23.374     .791    -5.248     .298  -.084200   .517000   .2689500   -23.900    -5.300  
+95 221 49769.00 I  -.081869  .000138   .519239  .000157  I  .2663575  .0000066  2.6142 0.0043  I   -23.630     .791    -5.279     .298  -.082600   .518400   .2662800   -23.800    -5.400  
+95 222 49770.00 I  -.080396  .000138   .520331  .000168  I  .2637974  .0000066  2.5099 0.0048  I   -23.905     .137    -5.384     .298  -.081000   .519800   .2637300   -23.500    -5.400  
+95 223 49771.00 I  -.078734  .000126   .521570  .000165  I  .2613248  .0000071  2.4445 0.0045  I   -24.254     .137    -5.613     .298  -.079200   .521300   .2612700   -23.200    -5.500  
+95 224 49772.00 I  -.076638  .000133   .523062  .000185  I  .2588847  .0000062  2.4502 0.0051  I   -24.606     .137    -5.941     .298  -.077000   .522800   .2588400   -22.800    -5.600  
+95 225 49773.00 I  -.073891  .000140   .524836  .000192  I  .2564009  .0000074  2.5262 0.0079  I   -24.792     .137    -6.236     .298  -.074300   .524500   .2563800   -22.400    -5.600  
+95 226 49774.00 I  -.070608  .000164   .526809  .000182  I  .2538179  .0000145  2.6453 0.0072  I   -24.734     .170    -6.357     .298  -.071300   .526200   .2538100   -22.100    -5.600  
+95 227 49775.00 I  -.067041  .000180   .528787  .000183  I  .2511060  .0000123  2.7774 0.0127  I   -24.473     .124    -6.212     .298  -.067900   .528000   .2511100   -21.900    -5.600  
+95 228 49776.00 I  -.063404  .000248   .530614  .000173  I  .2482696  .0000208  2.8902 0.0119  I   -24.144     .791    -5.883     .298  -.064300   .529700   .2482600   -21.800    -5.500  
+95 3 1 49777.00 I  -.059834  .000244   .532244  .000179  I  .2453351  .0000204  2.9747 0.0138  I   -23.881     .791    -5.624     .298  -.060400   .531300   .2452600   -23.600    -5.400  
+95 3 2 49778.00 I  -.056421  .000241   .533667  .000166  I  .2423301  .0000182  3.0295 0.0134  I   -23.719     .791    -5.663     .298  -.057000   .532700   .2422100   -23.700    -5.400  
+95 3 3 49779.00 I  -.053150  .000235   .534943  .000164  I  .2392855  .0000173  3.0562 0.0099  I   -23.603     .791    -5.974     .298  -.053700   .534200   .2391700   -24.000    -5.500  
+95 3 4 49780.00 I  -.049859  .000199   .536159  .000119  I  .2362316  .0000078  3.0412 0.0093  I   -23.497     .791    -6.334     .298  -.050300   .535400   .2361300   -24.100    -5.600  
+95 3 5 49781.00 I  -.046533  .000180   .537369  .000118  I  .2332219  .0000070  2.9698 0.0050  I   -23.450     .791    -6.566     .298  -.047000   .536600   .2331600   -24.300    -5.800  
+95 3 6 49782.00 I  -.043210  .000146   .538620  .000118  I  .2303048  .0000063  2.8598 0.0041  I   -23.513     .791    -6.647     .298  -.043600   .537800   .2302700   -24.300    -6.100  
+95 3 7 49783.00 I  -.039960  .000117   .539942  .000115  I  .2275100  .0000044  2.7265 0.0041  I   -23.639     .101    -6.679     .298  -.040400   .539000   .2274800   -24.100    -6.300  
+95 3 8 49784.00 I  -.036857  .000115   .541301  .000111  I  .2248388  .0000051  2.6323 0.0036  I   -23.701     .101    -6.770     .298  -.037300   .540300   .2247700   -23.700    -6.600  
+95 3 9 49785.00 I  -.034054  .000114   .542584  .000113  I  .2222167  .0000058  2.6244 0.0038  I   -23.581     .101    -6.931     .298  -.034500   .541600   .2221100   -23.300    -6.900  
+95 310 49786.00 I  -.031586  .000115   .543697  .000122  I  .2195729  .0000057  2.6680 0.0053  I   -23.314     .101    -7.060     .298  -.032000   .542800   .2194600   -23.000    -7.000  
+95 311 49787.00 I  -.029449  .000176   .544584  .000129  I  .2168735  .0000089  2.7332 0.0071  I   -23.030     .791    -7.060     .298  -.029900   .543800   .2167900   -22.600    -7.200  
+95 312 49788.00 I  -.027596  .000253   .545229  .000117  I  .2141008  .0000131  2.8155 0.0071  I   -22.835     .268    -6.971     .149  -.028000   .544400   .2140400   -22.300    -7.200  
+95 313 49789.00 I  -.025967  .000243   .545574  .000124  I  .2112397  .0000110  2.9063 0.0085  I   -22.769     .247    -6.939     .135  -.026300   .544800   .2112100   -22.100    -7.300  
+95 314 49790.00 I  -.024318  .000251   .545700  .000124  I  .2082900  .0000107  2.9916 0.0074  I   -22.794     .247    -7.025     .135  -.024500   .545000   .2082700   -22.100    -7.200  
+95 315 49791.00 I  -.022230  .000250   .545858  .000126  I  .2052493  .0000099  3.0986 0.0086  I   -22.814     .247    -7.093     .135  -.022400   .545200   .2052000   -22.200    -7.200  
+95 316 49792.00 I  -.019570  .000241   .546291  .000101  I  .2020894  .0000134  3.2157 0.0083  I   -22.722     .247    -7.002     .135  -.019900   .545500   .2020200   -22.300    -7.100  
+95 317 49793.00 I  -.016638  .000245   .547022  .000103  I  .1988327  .0000133  3.2882 0.0098  I   -22.567     .247    -6.745     .135  -.017100   .546100   .1987600   -22.500    -7.100  
+95 318 49794.00 I  -.013712  .000197   .547927  .000102  I  .1955371  .0000144  3.2882 0.0112  I   -22.488     .134    -6.507     .298  -.014100   .547000   .1954600   -22.700    -7.000  
+95 319 49795.00 I  -.010970  .000160   .548911  .000093  I  .1922824  .0000181  3.2097 0.0097  I   -22.534     .791    -6.498     .298  -.011300   .548000   .1922100   -22.800    -7.100  
+95 320 49796.00 I  -.008609  .000144   .549912  .000087  I  .1891428  .0000129  3.0559 0.0111  I   -22.617     .166    -6.743     .298  -.009000   .549000   .1890800   -22.800    -7.100  
+95 321 49797.00 I  -.006664  .000206   .550852  .000085  I  .1861914  .0000129  2.8397 0.0080  I   -22.639     .166    -7.087     .298  -.007200   .550000   .1861400   -22.700    -7.300  
+95 322 49798.00 I  -.004915  .000209   .551625  .000086  I  .1834651  .0000095  2.6183 0.0080  I   -22.633     .175    -7.372     .298  -.005500   .550700   .1834100   -22.300    -7.300  
+95 323 49799.00 I  -.003080  .000214   .552167  .000111  I  .1809253  .0000093  2.4855 0.0066  I   -22.722     .175    -7.560     .298  -.003700   .551200   .1808400   -22.100    -7.400  
+95 324 49800.00 I  -.000718  .000208   .552558  .000117  I  .1784517  .0000093  2.4799 0.0060  I   -22.899     .175    -7.700     .298  -.001100   .551600   .1783400   -21.800    -7.400  
+95 325 49801.00 I   .002665  .000211   .552945  .000137  I  .1759392  .0000077  2.5532 0.0065  I   -23.001     .175    -7.829     .298   .002200   .552000   .1758500   -21.700    -7.500  
+95 326 49802.00 I   .007068  .000233   .553526  .000191  I  .1733344  .0000092  2.6591 0.0051  I   -22.894     .160    -7.922     .298   .006500   .552600   .1732600   -21.600    -7.400  
+95 327 49803.00 I   .012125  .000209   .554424  .000185  I  .1706200  .0000066  2.7678 0.0051  I   -22.605     .144    -7.910     .298   .011300   .553600   .1705600   -21.600    -7.300  
+95 328 49804.00 I   .017209  .000170   .555609  .000213  I  .1678072  .0000045  2.8512 0.0040  I   -22.317     .118    -7.772     .298   .016300   .554800   .1677500   -21.800    -7.300  
+95 329 49805.00 I   .021783  .000146   .556881  .000202  I  .1649300  .0000045  2.8974 0.0035  I   -22.216     .118    -7.598     .298   .021000   .556000   .1648600   -22.100    -7.300  
+95 330 49806.00 I   .025737  .000154   .557853  .000196  I  .1620269  .0000053  2.9002 0.0034  I   -22.259     .118    -7.539     .298   .025100   .557000   .1619500   -22.500    -7.300  
+95 331 49807.00 I   .029145  .000154   .558411  .000200  I  .1591455  .0000051  2.8554 0.0036  I   -22.270     .118    -7.660     .298   .028700   .557600   .1590500   -22.700    -7.400  
+95 4 1 49808.00 I   .032223  .000131   .558606  .000178  I  .1563266  .0000050  2.7793 0.0064  I   -22.159     .104    -7.887     .298   .031800   .557800   .1562300   -23.000    -7.500  
+95 4 2 49809.00 I   .035253  .000123   .558563  .000124  I  .1535919  .0000118  2.6884 0.0074  I   -22.027     .791    -8.095     .298   .034800   .557700   .1535000   -23.000    -7.700  
+95 4 3 49810.00 I   .038395  .000124   .558415  .000121  I  .1509506  .0000139  2.5952 0.0092  I   -22.004     .791    -8.223     .298   .037700   .557500   .1508600   -22.900    -8.000  
+95 4 4 49811.00 I   .041610  .000121   .558191  .000127  I  .1484005  .0000140  2.5050 0.0100  I   -22.061     .791    -8.307     .298   .041000   .557300   .1483300   -22.600    -8.200  
+95 4 5 49812.00 I   .044799  .000114   .557877  .000129  I  .1459346  .0000144  2.4328 0.0104  I   -22.084     .791    -8.415     .298   .044300   .557000   .1458700   -22.200    -8.400  
+95 4 6 49813.00 I   .048055  .000105   .557657  .000118  I  .1435147  .0000153  2.4210 0.0106  I   -22.077     .791    -8.566     .298   .047800   .556900   .1434500   -21.800    -8.600  
+95 4 7 49814.00 I   .051330  .000106   .557646  .000117  I  .1410720  .0000155  2.4708 0.0103  I   -22.107     .791    -8.676     .298   .051100   .556800   .1410100   -21.400    -8.700  
+95 4 8 49815.00 I   .054471  .000086   .557796  .000160  I  .1385650  .0000137  2.5448 0.0119  I   -22.142     .791    -8.634     .298   .054200   .557000   .1385200   -21.000    -8.700  
+95 4 9 49816.00 I   .057417  .000111   .557972  .000177  I  .1359808  .0000180  2.6234 0.0110  I   -22.082     .225    -8.449     .298   .057100   .557200   .1359400   -20.800    -8.600  
+95 410 49817.00 I   .060287  .000181   .558056  .000180  I  .1333095  .0000173  2.7281 0.0121  I   -21.956     .318    -8.302     .298   .059800   .557300   .1332500   -20.600    -8.600  
+95 411 49818.00 I   .063186  .000199   .557998  .000181  I  .1305124  .0000162  2.8696 0.0114  I   -21.911     .489    -8.361     .298   .062500   .557300   .1304400   -20.700    -8.500  
+95 412 49819.00 I   .066106  .000203   .557795  .000180  I  .1275648  .0000150  3.0278 0.0112  I   -21.966     .505    -8.550     .298   .065300   .557100   .1274900   -21.000    -8.400  
+95 413 49820.00 I   .069162  .000206   .557477  .000186  I  .1244732  .0000155  3.1369 0.0108  I   -21.985     .505    -8.591     .298   .068300   .556600   .1244100   -21.400    -8.400  
+95 414 49821.00 I   .072319  .000220   .557059  .000188  I  .1213199  .0000156  3.1592 0.0109  I   -21.738     .505    -8.385     .298   .071600   .556200   .1212700   -21.700    -8.400  
+95 415 49822.00 I   .075646  .000222   .556623  .000130  I  .1181739  .0000152  3.1240 0.0108  I   -21.434     .568    -8.108     .298   .075100   .555700   .1181200   -22.100    -8.400  
+95 416 49823.00 I   .079115  .000187   .556274  .000143  I  .1150863  .0000150  3.0455 0.0085  I   -21.370     .639    -8.040     .298   .078700   .555400   .1150300   -22.400    -8.500  
+95 417 49824.00 I   .082588  .000187   .556036  .000088  I  .1120940  .0000074  2.9337 0.0082  I   -21.526     .404    -8.275     .298   .082200   .555100   .1120400   -22.400    -8.500  
+95 418 49825.00 I   .085904  .000165   .555871  .000118  I  .1092209  .0000067  2.8158 0.0048  I   -21.732     .262    -8.624     .298   .085600   .555000   .1091800   -22.400    -8.700  
+95 419 49826.00 I   .088995  .000164   .555759  .000123  I  .1064576  .0000061  2.7122 0.0045  I   -21.871     .428    -8.839     .298   .088700   .555000   .1064300   -22.100    -8.800  
+95 420 49827.00 I   .091859  .000167   .555687  .000126  I  .1037831  .0000061  2.6488 0.0041  I   -21.966     .428    -8.843     .298   .091600   .554900   .1037200   -21.800    -8.800  
+95 421 49828.00 I   .094840  .000154   .555488  .000128  I  .1011338  .0000055  2.6640 0.0041  I   -22.131     .428    -8.791     .298   .094700   .554700   .1010300   -21.400    -8.800  
+95 422 49829.00 I   .098282  .000142   .555027  .000123  I  .0984390  .0000055  2.7276 0.0039  I   -22.304     .391    -8.765     .298   .097900   .554300   .0983000   -21.100    -8.800  
+95 423 49830.00 I   .101923  .000120   .554313  .000155  I  .0956750  .0000056  2.8020 0.0040  I   -22.350     .423    -8.753     .298   .101300   .553600   .0955200   -20.900    -8.700  
+95 424 49831.00 I   .105677  .000118   .553421  .000134  I  .0928361  .0000059  2.8729 0.0043  I   -22.220     .400    -8.741     .298   .105100   .552800   .0926800   -20.900    -8.600  
+95 425 49832.00 I   .109648  .000110   .552409  .000117  I  .0899362  .0000065  2.9226 0.0044  I   -21.969     .103    -8.709     .298   .109200   .551800   .0897900   -21.100    -8.600  
+95 426 49833.00 I   .113828  .000093   .551295  .000118  I  .0870060  .0000066  2.9271 0.0059  I   -21.778     .103    -8.637     .298   .113400   .550600   .0869000   -21.300    -8.500  
+95 427 49834.00 I   .118052  .000094   .550083  .000113  I  .0841042  .0000098  2.8651 0.0058  I   -21.811     .103    -8.532     .298   .117600   .549400   .0840200   -21.700    -8.600  
+95 428 49835.00 I   .122201  .000095   .548781  .000115  I  .0812932  .0000096  2.7508 0.0070  I   -22.006     .128    -8.444     .298   .121800   .548000   .0812200   -22.100    -8.600  
+95 429 49836.00 I   .126200  .000085   .547400  .000115  I  .0786103  .0000100  2.6133 0.0070  I   -22.183     .128    -8.443     .298   .125900   .546600   .0785400   -22.300    -8.700  
+95 430 49837.00 I   .130004  .000104   .545963  .000085  I  .0760682  .0000102  2.4709 0.0063  I   -22.260     .791    -8.560     .298   .129800   .545100   .0759800   -22.500    -8.900  
+95 5 1 49838.00 I   .133625  .000099   .544472  .000076  I  .0736575  .0000077  2.3614 0.0064  I   -22.260     .791    -8.763     .298   .133600   .543700   .0735500   -22.500    -9.100  
+95 5 2 49839.00 I   .137151  .000102   .542978  .000085  I  .0713226  .0000078  2.3203 0.0044  I   -22.173     .791    -8.993     .298   .137100   .542200   .0712000   -22.300    -9.200  
+95 5 3 49840.00 I   .140652  .000105   .541540  .000084  I  .0689971  .0000041  2.3387 0.0067  I   -21.978     .791    -9.223     .298   .140500   .540700   .0688500   -21.800    -9.200  
+95 5 4 49841.00 I   .144150  .000115   .540101  .000081  I  .0666340  .0000108  2.3906 0.0064  I   -21.787     .791    -9.398     .298   .144000   .539100   .0664900   -21.400    -9.300  
+95 5 5 49842.00 I   .147689  .000127   .538598  .000080  I  .0642119  .0000122  2.4545 0.0086  I   -21.736     .791    -9.496     .298   .147600   .537600   .0640600   -21.000    -9.300  
+95 5 6 49843.00 I   .151386  .000099   .537040  .000079  I  .0617241  .0000135  2.5210 0.0174  I   -21.732     .791    -9.460     .298   .151400   .536000   .0615800   -20.600    -9.200  
+95 5 7 49844.00 I   .155353  .000183   .535497  .000096  I  .0591702  .0000325  2.5865 0.0125  I   -21.524     .791    -9.247     .298   .155400   .534400   .0590300   -20.500    -9.100  
+95 5 8 49845.00 I   .159560  .000268   .533999  .000154  I  .0565425  .0000211  2.6779 0.0194  I   -21.105     .160    -8.972     .298   .159500   .533000   .0564200   -20.400    -9.000  
+95 5 9 49846.00 I   .163824  .000268   .532527  .000154  I  .0538021  .0000213  2.8062 0.0135  I   -20.845     .149    -8.852     .298   .163600   .531600   .0536900   -20.600    -8.900  
+95 510 49847.00 I   .167886  .000258   .531033  .000152  I  .0509297  .0000169  2.9355 0.0136  I   -21.061     .149    -8.949     .298   .167600   .530200   .0508200   -21.000    -8.900  
+95 511 49848.00 I   .171598  .000255   .529473  .000154  I  .0479442  .0000168  3.0254 0.0118  I   -21.632     .149    -9.068     .298   .171400   .528700   .0478400   -21.400    -8.800  
+95 512 49849.00 I   .174931  .000252   .527820  .000159  I  .0449067  .0000164  3.0320 0.0117  I   -22.134     .149    -8.967     .298   .175000   .527100   .0448200   -22.000    -8.700  
+95 513 49850.00 I   .178042  .000252   .526120  .000170  I  .0419048  .0000164  2.9650 0.0105  I   -22.377     .149    -8.702     .298   .178400   .525500   .0418100   -22.300    -8.700  
+95 514 49851.00 I   .181104  .000127   .524458  .000133  I  .0389846  .0000132  2.8743 0.0091  I   -22.490     .138    -8.566     .298   .181500   .523800   .0388900   -22.600    -8.900  
+95 515 49852.00 I   .184123  .000119   .522872  .000105  I  .0361612  .0000079  2.7684 0.0077  I   -22.604     .791    -8.710     .298   .184300   .522100   .0360800   -22.700    -8.900  
+95 516 49853.00 I   .187027  .000113   .521341  .000116  I  .0334480  .0000080  2.6617 0.0047  I   -22.693     .791    -8.980     .298   .186900   .520400   .0333900   -22.700    -8.900  
+95 517 49854.00 I   .189688  .000112   .519782  .000143  I  .0308279  .0000050  2.5846 0.0044  I   -22.662     .791    -9.132     .298   .189300   .518700   .0307800   -22.500    -8.900  
+95 518 49855.00 I   .191958  .000104   .518055  .000144  I  .0282646  .0000035  2.5502 0.0036  I   -22.480     .791    -9.105     .298   .191600   .516900   .0282100   -22.100    -8.900  
+95 519 49856.00 I   .193890  .000110   .516107  .000149  I  .0257150  .0000051  2.5534 0.0030  I   -22.234     .791    -9.000     .298   .193700   .514900   .0256500   -21.700    -8.800  
+95 520 49857.00 I   .195623  .000096   .513903  .000139  I  .0231537  .0000049  2.5689 0.0065  I   -22.089     .791    -8.885     .298   .195700   .512800   .0230700   -21.500    -8.800  
+95 521 49858.00 I   .197336  .000114   .511469  .000163  I  .0205831  .0000119  2.5666 0.0057  I   -22.162     .791    -8.757     .298   .197600   .510400   .0204900   -21.300    -8.700  
+95 522 49859.00 I   .199225  .000111   .508960  .000140  I  .0180327  .0000104  2.5277 0.0095  I   -22.379     .261    -8.644     .298   .199500   .508100   .0179500   -21.300    -8.600  
+95 523 49860.00 I   .201339  .000112   .506500  .000116  I  .0155409  .0000147  2.4494 0.0094  I   -22.542     .257    -8.621     .298   .201300   .505700   .0154600   -21.500    -8.500  
+95 524 49861.00 I   .203530  .000114   .504116  .000113  I  .0131463  .0000156  2.3341 0.0103  I   -22.610     .257    -8.696     .298   .203100   .503400   .0130500   -21.800    -8.600  
+95 525 49862.00 I   .205615  .000105   .501788  .000100  I  .0108704  .0000145  2.2256 0.0113  I   -22.787     .257    -8.781     .298   .205000   .501000   .0107500   -22.300    -8.600  
+95 526 49863.00 I   .207613  .000104   .499451  .000097  I  .0086859  .0000164  2.1446 0.0109  I   -23.171     .257    -8.783     .298   .207000   .498600   .0085600   -22.700    -8.700  
+95 527 49864.00 I   .209581  .000104   .497026  .000089  I  .0065837  .0000164  2.0562 0.0109  I   -23.641     .257    -8.767     .298   .209000   .496100   .0064700   -23.100    -8.700  
+95 528 49865.00 I   .211530  .000060   .494489  .000106  I  .0045724  .0000143  1.9711 0.0095  I   -23.974     .252    -8.865     .298   .211100   .493600   .0044800   -23.300    -8.800  
+95 529 49866.00 I   .213501  .000074   .491824  .000139  I  .0026326  .0000096  1.9128 0.0085  I   -24.035     .791    -9.068     .298   .213200   .491000   .0025600   -23.400    -9.000  
+95 530 49867.00 I   .215531  .000072   .489023  .000150  I  .0007373  .0000092  1.8831 0.0070  I   -23.855     .791    -9.227     .298   .215300   .488400   .0006700   -23.300    -9.100  
+95 531 49868.00 I   .217624  .000069   .486128  .000154  I -.0011437  .0000102  1.8837 0.0071  I   -23.581     .791    -9.231     .298   .217400   .485500  -.0012200   -23.100    -9.100  
+95 6 1 49869.00 I   .219839  .000068   .483227  .000154  I -.0030435  .0000107  1.9245 0.0074  I   -23.435     .791    -9.142     .298   .219700   .482600  -.0031400   -22.800    -9.100  
+95 6 2 49870.00 I   .222301  .000067   .480281  .000151  I -.0050071  .0000107  2.0086 0.0076  I   -23.587     .791    -9.132     .298   .222200   .479500  -.0051200   -22.600    -9.100  
+95 6 3 49871.00 I   .225108  .000070   .477193  .000153  I -.0070698  .0000108  2.1199 0.0093  I   -23.919     .791    -9.219     .298   .224900   .476300  -.0071900   -22.400    -9.100  
+95 6 4 49872.00 I   .228205  .000095   .473977  .000167  I -.0092459  .0000153  2.2283 0.0082  I   -24.056     .791    -9.259     .298   .227900   .473100  -.0093500   -22.400    -8.900  
+95 6 5 49873.00 I   .231450  .000116   .470731  .000189  I -.0115205  .0000124  2.3191 0.0097  I   -23.793     .147    -9.158     .298   .231000   .469800  -.0116100   -22.700    -8.800  
+95 6 6 49874.00 I   .234633  .000122   .467602  .000186  I -.0138775  .0000118  2.3900 0.0080  I   -23.391     .147    -8.974     .298   .234200   .466700  -.0139500   -22.900    -8.800  
+95 6 7 49875.00 I   .237641  .000132   .464714  .000187  I -.0162951  .0000101  2.4446 0.0080  I   -23.280     .142    -8.779     .298   .237400   .463800  -.0163700   -23.400    -8.800  
+95 6 8 49876.00 I   .240594  .000133   .462046  .000191  I -.0187550  .0000109  2.4642 0.0074  I   -23.560     .142    -8.498     .298   .240300   .461000  -.0188200   -23.900    -8.700  
+95 6 9 49877.00 I   .243439  .000131   .459261  .000186  I -.0212012  .0000107  2.4171 0.0074  I   -23.983     .142    -8.092     .298   .243100   .458200  -.0212500   -24.300    -8.700  
+95 610 49878.00 I   .246051  .000125   .456323  .000186  I -.0235719  .0000099  2.3183 0.0082  I   -24.310     .142    -7.727     .298   .245600   .455300  -.0236100   -24.700    -8.700  
+95 611 49879.00 I   .248386  .000079   .453343  .000162  I -.0258309  .0000123  2.1989 0.0084  I   -24.504     .136    -7.645     .298   .247900   .452300  -.0258700   -24.900    -8.800  
+95 612 49880.00 I   .250452  .000088   .450340  .000155  I -.0279733  .0000136  2.0905 0.0089  I   -24.670     .285    -7.906     .298   .250100   .449300  -.0280200   -24.900    -8.800  
+95 613 49881.00 I   .252350  .000068   .447248  .000142  I -.0300289  .0000130  2.0333 0.0092  I   -24.913     .427    -8.312     .298   .252100   .446300  -.0300900   -24.900    -8.800  
+95 614 49882.00 I   .254267  .000068   .444027  .000135  I -.0320660  .0000125  2.0546 0.0095  I   -25.237     .427    -8.609     .298   .254200   .443200  -.0321300   -24.700    -8.700  
+95 615 49883.00 I   .256310  .000064   .440739  .000132  I -.0341466  .0000138  2.1014 0.0093  I   -25.532     .427    -8.757     .298   .256200   .440000  -.0342100   -24.500    -8.600  
+95 616 49884.00 I   .258509  .000068   .437481  .000131  I -.0362715  .0000139  2.1562 0.0098  I   -25.586     .427    -8.817     .298   .258400   .436800  -.0363500   -24.300    -8.500  
+95 617 49885.00 I   .260839  .000064   .434277  .000136  I -.0384633  .0000139  2.2237 0.0137  I   -25.507     .386    -8.823     .298   .260600   .433600  -.0385600   -24.300    -8.300  
+95 618 49886.00 I   .263215  .000076   .431106  .000130  I -.0407064  .0000235  2.2537 0.0137  I   -25.630     .389    -8.728     .298   .262900   .430300  -.0408200   -24.300    -8.200  
+95 619 49887.00 I   .265545  .000112   .427896  .000148  I -.0429534  .0000237  2.2319 0.0159  I   -26.013     .324    -8.539     .298   .265100   .427000  -.0430700   -24.600    -8.100  
+95 620 49888.00 I   .267697  .000117   .424553  .000151  I -.0451547  .0000214  2.1635 0.0151  I   -26.320     .324    -8.406     .298   .267300   .423600  -.0452600   -25.100    -8.000  
+95 621 49889.00 I   .269577  .000126   .421018  .000161  I -.0472665  .0000186  2.0535 0.0155  I   -26.224     .324    -8.444     .298   .269200   .420100  -.0473600   -25.500    -8.000  
+95 622 49890.00 I   .271154  .000126   .417398  .000173  I -.0492487  .0000225  1.9044 0.0151  I   -25.768     .324    -8.550     .298   .270800   .416500  -.0493200   -26.100    -8.000  
+95 623 49891.00 I   .272392  .000107   .413796  .000169  I -.0510626  .0000238  1.7170 0.0162  I   -25.413     .359    -8.583     .298   .272100   .412900  -.0511200   -26.600    -8.200  
+95 624 49892.00 I   .273290  .000101   .410267  .000169  I -.0526763  .0000232  1.5102 0.0142  I   -25.425     .359    -8.560     .298   .273000   .409400  -.0527200   -26.900    -8.300  
+95 625 49893.00 I   .273966  .000136   .406811  .000169  I -.0540931  .0000154  1.3337 0.0133  I   -25.639    1.012    -8.617     .298   .273700   .405800  -.0541400   -27.100    -8.400  
+95 626 49894.00 I   .274637  .000145   .403337  .000153  I -.0553614  .0000129  1.2104 0.0099  I   -25.850     .866    -8.795     .404   .274400   .402300  -.0554100   -27.200    -8.500  
+95 627 49895.00 I   .275453  .000145   .399721  .000150  I -.0565304  .0000126  1.1366 0.0085  I   -26.137     .893    -8.961     .319   .275100   .398700  -.0565800   -27.100    -8.600  
+95 628 49896.00 I   .276446  .000144   .395963  .000144  I -.0576556  .0000111  1.1259 0.0087  I   -26.700     .893    -8.958     .319   .276100   .395100  -.0577100   -26.900    -8.600  
+95 629 49897.00 I   .277574  .000151   .392210  .000148  I -.0588041  .0000121  1.1811 0.0082  I   -27.309     .893    -8.713     .319   .277300   .391400  -.0588700   -26.700    -8.400  
+95 630 49898.00 I   .278839  .000162   .388463  .000144  I -.0600344  .0000121  1.2863 0.0085  I   -27.865     .893    -8.474     .319   .278600   .387600  -.0601100   -26.500    -8.300  
+95 7 1 49899.00 I   .280135  .000175   .384623  .000138  I -.0613867  .0000118  1.4216 0.0106  I   -28.378     .861    -8.417     .354   .279900   .383700  -.0614700   -26.400    -8.200  
+95 7 2 49900.00 I   .281307  .000150   .380660  .000089  I -.0628822  .0000174  1.5707 0.0123  I   -28.702     .932    -8.450     .298   .281100   .379700  -.0629700   -26.400    -8.000  
+95 7 3 49901.00 I   .282279  .000132   .376569  .000109  I -.0645201  .0000215  1.6960 0.0134  I   -28.656     .791    -8.429     .298   .282100   .375600  -.0646000   -26.600    -7.900  
+95 7 4 49902.00 I   .283155  .000160   .372366  .000099  I -.0662537  .0000205  1.7600 0.0130  I   -28.335     .288    -8.308     .298   .283000   .371400  -.0663200   -27.000    -7.900  
+95 7 5 49903.00 I   .284080  .000157   .368160  .000105  I -.0680185  .0000146  1.7593 0.0126  I   -28.129     .288    -8.148     .298   .283900   .367200  -.0680800   -27.500    -7.900  
+95 7 6 49904.00 I   .284998  .000146   .364071  .000101  I -.0697585  .0000148  1.7171 0.0117  I   -28.393     .288    -8.005     .298   .284700   .363000  -.0698300   -27.900    -8.000  
+95 7 7 49905.00 I   .285752  .000113   .360096  .000104  I -.0714445  .0000182  1.6502 0.0113  I   -29.156     .288    -7.910     .298   .285500   .358900  -.0715200   -28.500    -8.000  
+95 7 8 49906.00 I   .286264  .000126   .356144  .000107  I -.0730519  .0000172  1.5624 0.0128  I   -30.083     .288    -7.923     .298   .286100   .354900  -.0731300   -28.900    -8.100  
+95 7 9 49907.00 I   .286592  .000155   .352185  .000101  I -.0745701  .0000179  1.4770 0.0111  I   -30.805     .580    -8.127     .298   .286500   .351000  -.0746500   -29.300    -8.300  
+95 710 49908.00 I   .286847  .000152   .348271  .000101  I -.0760160  .0000140  1.4218 0.0117  I   -31.152     .672    -8.474     .147   .286800   .347200  -.0760900   -29.500    -8.400  
+95 711 49909.00 I   .287167  .000150   .344456  .000090  I -.0774314  .0000150  1.4198 0.0101  I   -31.126     .549    -8.724     .134   .287100   .343500  -.0774900   -29.600    -8.400  
+95 712 49910.00 I   .287522  .000146   .340770  .000095  I -.0788750  .0000147  1.4759 0.0104  I   -30.798     .549    -8.676     .134   .287200   .339900  -.0789200   -29.800    -8.400  
+95 713 49911.00 I   .287691  .000147   .337184  .000124  I -.0803920  .0000144  1.5585 0.0103  I   -30.419     .549    -8.516     .134   .287400   .336400  -.0804300   -29.700    -8.400  
+95 714 49912.00 I   .287724  .000131   .333635  .000125  I -.0819965  .0000143  1.6546 0.0091  I   -30.024     .549    -8.405     .134   .287400   .332800  -.0820500   -29.500    -8.300  
+95 715 49913.00 I   .287795  .000125   .330040  .000134  I -.0836972  .0000110  1.7387 0.0103  I   -29.694     .325    -8.404     .124   .287500   .329200  -.0837700   -29.500    -8.200  
+95 716 49914.00 I   .287949  .000102   .326344  .000170  I -.0854542  .0000149  1.7638 0.0079  I   -29.729     .791    -8.440     .298   .287600   .325500  -.0855200   -29.700    -8.200  
+95 717 49915.00 I   .288082  .000135   .322556  .000174  I -.0872007  .0000114  1.7167 0.0097  I   -30.260     .791    -8.406     .298   .287700   .321700  -.0872600   -30.000    -8.200  
+95 718 49916.00 I   .288062  .000140   .318743  .000174  I -.0888665  .0000124  1.6065 0.0080  I   -30.944     .791    -8.365     .298   .287800   .317800  -.0889200   -30.300    -8.300  
+95 719 49917.00 I   .287868  .000139   .314950  .000156  I -.0904009  .0000113  1.4580 0.0084  I   -31.292     .791    -8.442     .298   .287700   .313900  -.0904600   -30.700    -8.400  
+95 720 49918.00 I   .287689  .000148   .311145  .000156  I -.0917787  .0000114  1.2981 0.0075  I   -31.247     .791    -8.575     .298   .287600   .309900  -.0918600   -31.400    -8.500  
+95 721 49919.00 I   .287565  .000154   .307292  .000155  I -.0929977  .0000099  1.1401 0.0068  I   -31.216     .791    -8.638     .298   .287400   .306000  -.0931000   -31.900    -8.600  
+95 722 49920.00 I   .287387  .000132   .303396  .000155  I -.0940641  .0000075  0.9976 0.0059  I   -31.487     .791    -8.598     .298   .287100   .302100  -.0941900   -32.400    -8.800  
+95 723 49921.00 I   .287031  .000127   .299471  .000155  I -.0950056  .0000065  0.8932 0.0049  I   -31.891     .123    -8.540     .298   .286700   .298300  -.0951400   -32.700    -8.900  
+95 724 49922.00 I   .286566  .000138   .295521  .000170  I -.0958652  .0000063  0.8330 0.0049  I   -32.115     .168    -8.534     .117   .286300   .294500  -.0959900   -32.800    -8.900  
+95 725 49923.00 I   .286095  .000149   .291575  .000168  I -.0966853  .0000074  0.8139 0.0049  I   -32.100     .168    -8.554     .117   .285800   .290600  -.0968000   -32.800    -8.900  
+95 726 49924.00 I   .285505  .000144   .287660  .000163  I -.0975064  .0000075  0.8349 0.0057  I   -31.971     .168    -8.512     .117   .285100   .286800  -.0975900   -32.800    -8.900  
+95 727 49925.00 I   .284645  .000141   .283792  .000157  I -.0983658  .0000088  0.8882 0.0064  I   -31.774     .168    -8.272     .117   .284300   .282900  -.0984300   -32.500    -8.700  
+95 728 49926.00 I   .283658  .000138   .280001  .000145  I -.0992918  .0000104  0.9687 0.0084  I   -31.577     .168    -7.928     .117   .283300   .279100  -.0993500   -32.200    -8.500  
+95 729 49927.00 I   .282595  .000165   .276263  .000102  I -.1003121  .0000144  1.0759 0.0135  I   -31.515     .203    -7.639     .131   .282200   .275300  -.1003800   -31.900    -8.400  
+95 730 49928.00 I   .281448  .000113   .272477  .000062  I -.1014508  .0000249  1.2049 0.0105  I   -31.664     .565    -7.469     .273   .281100   .271500  -.1015400   -31.900    -8.300  
+95 731 49929.00 I   .280368  .000091   .268586  .000071  I -.1027208  .0000154  1.3308 0.0146  I   -31.932     .552    -7.431     .266   .280100   .267700  -.1028100   -32.000    -8.200  
+95 8 1 49930.00 I   .279541  .000088   .264644  .000075  I -.1041002  .0000153  1.4200 0.0104  I   -32.183     .552    -7.568     .266   .279200   .263800  -.1041800   -32.000    -8.200  
+95 8 2 49931.00 I   .278952  .000083   .260708  .000068  I -.1055396  .0000140  1.4455 0.0100  I   -32.433     .552    -7.912     .266   .278500   .259900  -.1056100   -32.300    -8.200  
+95 8 3 49932.00 I   .278360  .000084   .256799  .000081  I -.1069717  .0000130  1.4125 0.0089  I   -32.662     .552    -8.138     .266   .277900   .255900  -.1070400   -32.700    -8.400  
+95 8 4 49933.00 I   .277631  .000069   .252861  .000085  I -.1083570  .0000109  1.3567 0.0085  I   -32.963     .552    -8.181     .266   .277200   .251900  -.1084400   -33.200    -8.500  
+95 8 5 49934.00 I   .276791  .000065   .248912  .000099  I -.1096881  .0000110  1.3099 0.0079  I   -33.362     .380    -8.205     .189   .276500   .248000  -.1097900   -33.500    -8.600  
+95 8 6 49935.00 I   .275892  .000094   .245043  .000144  I -.1109876  .0000113  1.2957 0.0074  I   -33.726     .791    -8.336     .298   .275900   .244100  -.1110900   -33.800    -8.800  
+95 8 7 49936.00 I   .274915  .000117   .241303  .000159  I -.1122929  .0000100  1.3219 0.0076  I   -33.948     .272    -8.565     .298   .274800   .240400  -.1123800   -34.000    -8.800  
+95 8 8 49937.00 I   .273771  .000126   .237673  .000152  I -.1136461  .0000101  1.3923 0.0064  I   -34.077     .316    -8.742     .298   .273500   .236700  -.1137100   -34.000    -8.800  
+95 8 9 49938.00 I   .272359  .000128   .234099  .000141  I -.1150900  .0000079  1.5002 0.0065  I   -34.252     .316    -8.709     .298   .272100   .233100  -.1151400   -34.200    -8.700  
+95 810 49939.00 I   .270663  .000124   .230520  .000137  I -.1166522  .0000082  1.6251 0.0056  I   -34.508     .316    -8.427     .298   .270600   .229600  -.1167000   -34.100    -8.600  
+95 811 49940.00 I   .269001  .000119   .226934  .000142  I -.1183333  .0000078  1.7294 0.0057  I   -34.609     .387    -8.133     .298   .269100   .226000  -.1183800   -34.000    -8.500  
+95 812 49941.00 I   .267541  .000124   .223342  .000134  I -.1200937  .0000078  1.7818 0.0065  I   -34.488     .387    -8.056     .298   .267600   .222500  -.1201600   -34.000    -8.300  
+95 813 49942.00 I   .266166  .000126   .219764  .000117  I -.1218769  .0000103  1.7740 0.0046  I   -34.401     .389    -8.171     .298   .266100   .218900  -.1219600   -34.200    -8.200  
+95 814 49943.00 I   .264644  .000100   .216284  .000150  I -.1236236  .0000048  1.7117 0.0057  I   -34.593     .233    -8.298     .298   .264400   .215300  -.1237100   -34.400    -8.200  
+95 815 49944.00 I   .262691  .000095   .212933  .000155  I -.1252897  .0000050  1.6177 0.0043  I   -34.989     .217    -8.335     .298   .262400   .211900  -.1253800   -34.700    -8.200  
+95 816 49945.00 I   .260241  .000091   .209642  .000156  I -.1268567  .0000072  1.5169 0.0045  I   -35.290     .217    -8.333     .298   .260100   .208500  -.1269500   -34.900    -8.300  
+95 817 49946.00 I   .257691  .000095   .206449  .000149  I -.1283241  .0000075  1.4178 0.0057  I   -35.361     .217    -8.370     .298   .257700   .205300  -.1284100   -35.200    -8.400  
+95 818 49947.00 I   .255336  .000102   .203412  .000147  I -.1296985  .0000088  1.3374 0.0062  I   -35.305     .217    -8.443     .298   .255300   .202300  -.1297800   -35.400    -8.500  
+95 819 49948.00 I   .253179  .000098   .200506  .000137  I -.1310131  .0000098  1.2997 0.0065  I   -35.293     .217    -8.503     .298   .253000   .199500  -.1311000   -35.500    -8.700  
+95 820 49949.00 I   .251097  .000111   .197685  .000081  I -.1323117  .0000097  1.3034 0.0062  I   -35.336     .199    -8.530     .298   .250800   .196800  -.1324000   -35.400    -8.700  
+95 821 49950.00 I   .249107  .000162   .194904  .000115  I -.1336314  .0000076  1.3416 0.0059  I   -35.346     .428    -8.527     .298   .248900   .194000  -.1337000   -35.200    -8.700  
+95 822 49951.00 I   .247201  .000178   .192091  .000122  I -.1350051  .0000067  1.4103 0.0052  I   -35.347     .535    -8.499     .298   .246900   .191200  -.1350600   -35.000    -8.700  
+95 823 49952.00 I   .245183  .000187   .189208  .000122  I -.1364567  .0000072  1.4933 0.0046  I   -35.427     .438    -8.466     .298   .244800   .188400  -.1364900   -34.900    -8.500  
+95 824 49953.00 I   .242878  .000175   .186348  .000176  I -.1379952  .0000063  1.5870 0.0046  I   -35.563     .379    -8.460     .298   .242600   .185400  -.1380200   -34.700    -8.400  
+95 825 49954.00 I   .240438  .000168   .183450  .000174  I -.1396425  .0000058  1.7160 0.0051  I   -35.521     .374    -8.475     .298   .240300   .182400  -.1396900   -34.700    -8.200  
+95 826 49955.00 I   .238156  .000165   .180477  .000169  I -.1414378  .0000079  1.8769 0.0050  I   -35.362     .356    -8.394     .298   .238000   .179500  -.1414900   -34.800    -8.100  
+95 827 49956.00 I   .236101  .000158   .177546  .000167  I -.1433880  .0000082  2.0131 0.0057  I   -35.373     .311    -8.223     .298   .235800   .176700  -.1434400   -35.100    -8.000  
+95 828 49957.00 I   .234106  .000107   .174753  .000163  I -.1454513  .0000081  2.1114 0.0059  I   -35.688     .193    -8.026     .124   .233600   .173900  -.1454900   -35.300    -8.000  
+95 829 49958.00 I   .232124  .000099   .172120  .000177  I -.1475858  .0000086  2.1347 0.0062  I   -36.091     .360    -7.956     .176   .231500   .171200  -.1476000   -35.700    -8.100  
+95 830 49959.00 I   .229971  .000107   .169548  .000176  I -.1496976  .0000094  2.0887 0.0068  I   -36.370     .417    -8.076     .175   .229300   .168500  -.1497300   -36.000    -8.200  
+95 831 49960.00 I   .227437  .000105   .166958  .000120  I -.1517621  .0000106  2.0392 0.0063  I   -36.548     .427    -8.135     .185   .227000   .165700  -.1518200   -36.200    -8.400  
+95 9 1 49961.00 I   .224672  .000120   .164364  .000112  I -.1537776  .0000085  1.9944 0.0082  I   -36.726     .454    -8.080     .201   .224600   .163100  -.1538500   -36.500    -8.600  
+95 9 2 49962.00 I   .221943  .000131   .161813  .000119  I -.1557561  .0000125  1.9654 0.0105  I   -36.847     .507    -8.078     .210   .222000   .160600  -.1558300   -36.600    -8.800  
+95 9 3 49963.00 I   .219408  .000149   .159389  .000131  I -.1577167  .0000193  1.9615 0.0087  I   -36.861     .576    -8.229     .216   .219600   .158400  -.1577800   -36.500    -9.000  
+95 9 4 49964.00 I   .217128  .000142   .157140  .000126  I -.1596912  .0000121  1.9941 0.0115  I   -36.779     .455    -8.488     .298   .217200   .156300  -.1597400   -36.400    -9.100  
+95 9 5 49965.00 I   .215002  .000142   .155058  .000111  I -.1617171  .0000124  2.0633 0.0086  I   -36.615     .263    -8.714     .298   .214800   .154300  -.1617900   -36.300    -9.100  
+95 9 6 49966.00 I   .212740  .000142   .153069  .000109  I -.1638234  .0000121  2.1491 0.0091  I   -36.445     .263    -8.750     .298   .212500   .152300  -.1638800   -36.200    -9.100  
+95 9 7 49967.00 I   .210029  .000131   .151075  .000109  I -.1660164  .0000134  2.2381 0.0082  I   -36.352     .263    -8.556     .298   .209800   .150200  -.1660900   -36.000    -8.800  
+95 9 8 49968.00 I   .206969  .000128   .148852  .000109  I -.1682977  .0000110  2.3215 0.0086  I   -36.269     .263    -8.263     .298   .206900   .147800  -.1684000   -35.900    -8.700  
+95 9 9 49969.00 I   .203795  .000118   .146375  .000110  I -.1706431  .0000109  2.3561 0.0121  I   -36.151     .263    -8.079     .298   .203600   .145200  -.1707500   -36.000    -8.500  
+95 910 49970.00 I   .200570  .000147   .143742  .000112  I -.1729846  .0000215  2.3147 0.0080  I   -36.077     .185    -8.092     .298   .200300   .142400  -.1730900   -36.000    -8.300  
+95 911 49971.00 I   .197305  .000134   .140984  .000123  I -.1752536  .0000116  2.2166 0.0127  I   -36.148     .791    -8.197     .298   .197000   .139500  -.1753400   -36.100    -8.200  
+95 912 49972.00 I   .194074  .000119   .138110  .000129  I -.1774091  .0000134  2.0924 0.0082  I   -36.373     .791    -8.241     .298   .193700   .136700  -.1774800   -36.200    -8.100  
+95 913 49973.00 I   .191035  .000115   .135293  .000134  I -.1794394  .0000117  1.9710 0.0087  I   -36.631     .791    -8.195     .298   .190800   .134100  -.1794900   -36.200    -8.200  
+95 914 49974.00 I   .188269  .000110   .132860  .000142  I -.1813611  .0000111  1.8794 0.0081  I   -36.762     .791    -8.150     .298   .188000   .131900  -.1814000   -36.200    -8.300  
+95 915 49975.00 I   .185662  .000101   .130861  .000132  I -.1832127  .0000112  1.8312 0.0066  I   -36.676     .791    -8.190     .298   .185400   .129800  -.1832300   -36.100    -8.400  
+95 916 49976.00 I   .182997  .000104   .129117  .000146  I -.1850363  .0000072  1.8213 0.0067  I   -36.397     .791    -8.304     .298   .182800   .127900  -.1850200   -35.900    -8.600  
+95 917 49977.00 I   .180140  .000133   .127395  .000142  I -.1868638  .0000073  1.8370 0.0047  I   -36.035     .791    -8.419     .298   .180200   .126100  -.1868200   -35.600    -8.600  
+95 918 49978.00 I   .177142  .000144   .125569  .000181  I -.1887169  .0000059  1.8726 0.0044  I   -35.742     .791    -8.462     .134   .177500   .124300  -.1886600   -35.300    -8.600  
+95 919 49979.00 I   .174227  .000150   .123629  .000197  I -.1906144  .0000050  1.9245 0.0038  I   -35.624     .791    -8.408     .134   .174600   .122600  -.1905900   -35.000    -8.500  
+95 920 49980.00 I   .171426  .000156   .121661  .000205  I -.1925842  .0000048  2.0314 0.0035  I   -35.667     .791    -8.328     .121   .171500   .120800  -.1926200   -34.800    -8.400  
+95 921 49981.00 I   .168433  .000161   .119799  .000208  I -.1946974  .0000048  2.1987 0.0034  I   -35.733     .791    -8.430     .121   .168300   .119100  -.1947900   -34.700    -8.300  
+95 922 49982.00 I   .165227  .000150   .118066  .000205  I -.1969832  .0000047  2.3706 0.0036  I   -35.721     .791    -8.631     .121   .165000   .117300  -.1971000   -34.700    -8.000  
+95 923 49983.00 I   .161888  .000153   .116469  .000202  I -.1994317  .0000055  2.5218 0.0046  I   -35.649     .791    -8.651     .132   .161700   .115600  -.1995500   -34.900    -7.800  
+95 924 49984.00 I   .158666  .000103   .114917  .000179  I -.2020139  .0000080  2.6345 0.0043  I   -35.618     .791    -8.403     .298   .158400   .113900  -.2021200   -35.100    -7.700  
+95 925 49985.00 I   .155648  .000109   .113415  .000199  I -.2046817  .0000066  2.6903 0.0056  I   -35.683     .791    -8.016     .298   .155400   .112400  -.2047700   -35.500    -7.600  
+95 926 49986.00 I   .152758  .000088   .112022  .000191  I -.2073726  .0000078  2.6805 0.0052  I   -35.797     .791    -7.726     .298   .152500   .111000  -.2074300   -35.700    -7.600  
+95 927 49987.00 I   .149886  .000084   .110801  .000185  I -.2100182  .0000081  2.5973 0.0059  I   -35.857     .791    -7.672     .298   .149700   .109800  -.2100500   -35.900    -7.600  
+95 928 49988.00 I   .147073  .000089   .109840  .000186  I -.2125541  .0000089  2.4749 0.0057  I   -35.792     .791    -7.761     .298   .146900   .108800  -.2125800   -36.000    -7.700  
+95 929 49989.00 I   .144280  .000091   .108970  .000184  I -.2149738  .0000081  2.3701 0.0067  I   -35.636     .791    -7.849     .298   .144100   .107800  -.2150100   -36.100    -7.900  
+95 930 49990.00 I   .141336  .000102   .108038  .000171  I -.2173092  .0000100  2.3101 0.0066  I   -35.486     .791    -7.879     .298   .141100   .106900  -.2173700   -35.900    -8.000  
+9510 1 49991.00 I   .138111  .000091   .107025  .000131  I -.2196143  .0000104  2.3110 0.0064  I   -35.414     .791    -7.885     .298   .137900   .105900  -.2196900   -35.700    -8.000  
+9510 2 49992.00 I   .134567  .000131   .105987  .000110  I -.2219501  .0000079  2.3687 0.0063  I   -35.417     .791    -7.910     .298   .134300   .105000  -.2220200   -35.500    -8.100  
+9510 3 49993.00 I   .130695  .000129   .105001  .000111  I -.2243638  .0000070  2.4627 0.0055  I   -35.442     .791    -7.940     .298   .130600   .104100  -.2244200   -35.300    -8.000  
+9510 4 49994.00 I   .126575  .000127   .104045  .000111  I -.2268727  .0000076  2.5481 0.0061  I   -35.442     .791    -7.919     .298   .126600   .103100  -.2269100   -35.200    -7.900  
+9510 5 49995.00 I   .122609  .000128   .103062  .000114  I -.2294525  .0000100  2.6108 0.0062  I   -35.406     .791    -7.857     .298   .122500   .102000  -.2295000   -35.000    -7.700  
+9510 6 49996.00 I   .118773  .000127   .101939  .000117  I -.2320905  .0000098  2.6619 0.0070  I   -35.359     .791    -7.743     .298   .118500   .100900  -.2321600   -35.000    -7.600  
+9510 7 49997.00 I   .114860  .000126   .100643  .000105  I -.2347659  .0000097  2.6817 0.0091  I   -35.325     .791    -7.601     .298   .114600   .099600  -.2348500   -35.000    -7.400  
+9510 8 49998.00 I   .110837  .000098   .099201  .000116  I -.2374358  .0000154  2.6473 0.0091  I   -35.303     .121    -7.521     .298   .110600   .098100  -.2375100   -35.100    -7.400  
+9510 9 49999.00 I   .106690  .000169   .097625  .000155  I -.2400381  .0000155  2.5456 0.0107  I   -35.274     .101    -7.504     .298   .106400   .096500  -.2401000   -35.200    -7.400  
+951010 50000.00 I   .102471  .000212   .095946  .000161  I -.2425086  .0000148  2.3888 0.0109  I   -35.261     .133    -7.468     .126   .102200   .094900  -.2425500   -35.300    -7.400  
+951011 50001.00 I   .098323  .000219   .094278  .000180  I -.2448171  .0000154  2.2362 0.0108  I   -35.331     .116    -7.377     .138   .098200   .093200  -.2448700   -35.200    -7.600  
+951012 50002.00 I   .094472  .000228   .092742  .000174  I -.2469890  .0000158  2.1077 0.0110  I   -35.412     .116    -7.317     .138   .094400   .091700  -.2470300   -35.100    -7.700  
+951013 50003.00 I   .090997  .000231   .091469  .000182  I -.2490365  .0000158  1.9911 0.0121  I   -35.282     .116    -7.447     .138   .090900   .090200  -.2490800   -34.900    -7.800  
+951014 50004.00 I   .087895  .000229   .090594  .000182  I -.2509869  .0000183  1.9215 0.0115  I   -34.828     .106    -7.641     .160   .087800   .089400  -.2510300   -34.700    -7.900  
+951015 50005.00 I   .084727  .000197   .090020  .000153  I -.2528981  .0000166  1.9076 0.0115  I   -34.210     .127    -7.787     .194   .084800   .088800  -.2529600   -34.300    -7.900  
+951016 50006.00 I   .081140  .000165   .089428  .000142  I -.2548170  .0000140  1.9383 0.0107  I   -33.717     .791    -7.838     .121   .081100   .088200  -.2548900   -34.000    -7.900  
+951017 50007.00 I   .077223  .000152   .088633  .000115  I -.2567910  .0000136  2.0179 0.0099  I   -33.484     .791    -7.776     .298   .077100   .087500  -.2568600   -33.700    -7.800  
+951018 50008.00 I   .073319  .000124   .087696  .000122  I -.2588592  .0000140  2.1168 0.0097  I   -33.416     .791    -7.655     .298   .072900   .086700  -.2589200   -33.600    -7.600  
+951019 50009.00 I   .069832  .000125   .086810  .000106  I -.2610189  .0000137  2.1986 0.0089  I   -33.396     .791    -7.580     .298   .069400   .085700  -.2610700   -33.400    -7.400  
+951020 50010.00 I   .066975  .000143   .086104  .000108  I -.2632595  .0000110  2.2898 0.0088  I   -33.437     .791    -7.586     .298   .066600   .084900  -.2633200   -33.400    -7.200  
+951021 50011.00 I   .064561  .000151   .085696  .000106  I -.2656028  .0000109  2.3939 0.0092  I   -33.575     .118    -7.568     .298   .064500   .084600  -.2656600   -33.400    -6.900  
+951022 50012.00 I   .062087  .000193   .085544  .000129  I -.2680337  .0000147  2.4573 0.0079  I   -33.726     .158    -7.383     .298   .062100   .084500  -.2680800   -33.500    -6.800  
+951023 50013.00 I   .059125  .000151   .085440  .000138  I -.2705006  .0000114  2.4705 0.0086  I   -33.747     .157    -7.048     .298   .059000   .084300  -.2705500   -33.500    -6.600  
+951024 50014.00 I   .055535  .000146   .085180  .000131  I -.2729630  .0000091  2.4488 0.0075  I   -33.596     .157    -6.774     .298   .055100   .084100  -.2730200   -33.400    -6.700  
+951025 50015.00 I   .051426  .000130   .084676  .000130  I -.2753887  .0000096  2.3988 0.0060  I   -33.367     .157    -6.750     .298   .051100   .083700  -.2754500   -33.200    -6.700  
+951026 50016.00 I   .047101  .000122   .084034  .000150  I -.2777537  .0000079  2.3282 0.0059  I   -33.227     .157    -6.921     .298   .046900   .083200  -.2778100   -33.100    -6.700  
+951027 50017.00 I   .042802  .000110   .083316  .000146  I -.2800474  .0000068  2.2645 0.0052  I   -33.224     .155    -7.077     .298   .042600   .082400  -.2800900   -33.000    -6.900  
+951028 50018.00 I   .038761  .000099   .082671  .000148  I -.2823000  .0000069  2.2526 0.0048  I   -33.307     .155    -7.080     .298   .038600   .081800  -.2823500   -32.800    -6.900  
+951029 50019.00 I   .035078  .000106   .082295  .000131  I -.2845748  .0000067  2.3071 0.0046  I   -33.384     .791    -6.962     .298   .034900   .081400  -.2846300   -32.500    -6.900  
+951030 50020.00 I   .031665  .000092   .082253  .000105  I -.2869319  .0000060  2.4145 0.0048  I   -33.363     .791    -6.831     .298   .031500   .081300  -.2870000   -32.300    -6.800  
+951031 50021.00 I   .028365  .000097   .082439  .000106  I -.2894134  .0000069  2.5505 0.0046  I   -33.213     .791    -6.740     .298   .028200   .081400  -.2894800   -32.100    -6.700  
+9511 1 50022.00 I   .025113  .000097   .082725  .000098  I -.2920343  .0000071  2.6907 0.0050  I   -32.986     .791    -6.667     .298   .025000   .081700  -.2921000   -32.200    -6.600  
+9511 2 50023.00 I   .021946  .000089   .083061  .000097  I -.2947758  .0000073  2.7741 0.0051  I   -32.769     .791    -6.592     .298   .021800   .082100  -.2948200   -32.100    -6.400  
+9511 3 50024.00 I   .018673  .000089   .083419  .000100  I -.2975496  .0000073  2.7590 0.0050  I   -32.641     .791    -6.528     .298   .018300   .082400  -.2975700   -32.100    -6.200  
+9511 4 50025.00 I   .015135  .000085   .083780  .000104  I -.3002725  .0000069  2.6800 0.0073  I   -32.633     .791    -6.500     .298   .014900   .082700  -.3003000   -32.100    -6.100  
+9511 5 50026.00 I   .011387  .000095   .084118  .000185  I -.3028973  .0000126  2.5639 0.0086  I   -32.694     .791    -6.508     .298   .011200   .083000  -.3029300   -32.200    -6.000  
+9511 6 50027.00 I   .007541  .000086   .084428  .000184  I -.3053956  .0000158  2.4335 0.0100  I   -32.713     .357    -6.507     .298   .007600   .083300  -.3054500   -32.200    -6.100  
+9511 7 50028.00 I   .003739  .000098   .084751  .000188  I -.3077684  .0000156  2.3155 0.0109  I   -32.643     .357    -6.442     .298   .003700   .083600  -.3078300   -32.000    -6.100  
+9511 8 50029.00 I   .000001  .000104   .085124  .000181  I -.3100311  .0000151  2.2112 0.0108  I   -32.577     .384    -6.293     .298  -.000200   .083900  -.3100700   -31.700    -6.100  
+9511 9 50030.00 I  -.003744  .000106   .085488  .000179  I -.3121888  .0000149  2.1011 0.0108  I   -32.616     .384    -6.082     .298  -.004100   .084300  -.3122000   -31.500    -6.400  
+951110 50031.00 I  -.007475  .000111   .085790  .000182  I -.3142379  .0000154  2.0049 0.0103  I   -32.588     .384    -5.914     .298  -.007800   .084600  -.3142500   -31.200    -6.500  
+951111 50032.00 I  -.011231  .000132   .086077  .000175  I -.3162171  .0000143  1.9643 0.0087  I   -32.224     .384    -5.906     .298  -.011500   .084900  -.3162400   -30.700    -6.600  
+951112 50033.00 I  -.014987  .000180   .086408  .000142  I -.3181895  .0000081  1.9927 0.0078  I   -31.607     .362    -6.055     .298  -.015200   .085300  -.3182300   -30.400    -6.700  
+951113 50034.00 I  -.018569  .000198   .086804  .000161  I -.3202225  .0000062  2.0812 0.0050  I   -31.082     .295    -6.260     .298  -.018800   .085700  -.3202700   -30.100    -6.600  
+951114 50035.00 I  -.021862  .000177   .087327  .000169  I -.3223659  .0000058  2.2116 0.0044  I   -30.819     .192    -6.394     .298  -.022300   .086300  -.3224300   -29.900    -6.600  
+951115 50036.00 I  -.025065  .000182   .088127  .000170  I -.3246626  .0000063  2.3926 0.0040  I   -30.711     .168    -6.366     .298  -.025800   .087100  -.3247200   -29.900    -6.400  
+951116 50037.00 I  -.028782  .000189   .089292  .000170  I -.3271535  .0000054  2.5806 0.0041  I   -30.607     .168    -6.214     .298  -.029500   .088100  -.3271800   -30.000    -6.200  
+951117 50038.00 I  -.033035  .000171   .090654  .000162  I -.3298032  .0000054  2.7066 0.0037  I   -30.601     .168    -6.085     .298  -.033600   .089400  -.3298000   -30.100    -5.900  
+951118 50039.00 I  -.037476  .000174   .092091  .000160  I -.3325547  .0000050  2.7965 0.0048  I   -30.807     .791    -6.032     .298  -.037800   .090800  -.3325600   -30.300    -5.800  
+951119 50040.00 I  -.041719  .000156   .093516  .000157  I -.3353883  .0000079  2.8626 0.0055  I   -31.079     .791    -5.930     .298  -.042100   .092200  -.3354100   -30.500    -5.600  
+951120 50041.00 I  -.045724  .000152   .094850  .000153  I -.3382631  .0000097  2.8784 0.0074  I   -31.117     .791    -5.695     .298  -.046300   .093600  -.3383100   -30.700    -5.500  
+951121 50042.00 I  -.049751  .000177   .096014  .000189  I -.3411295  .0000125  2.8476 0.0078  I   -30.820     .791    -5.463     .298  -.050400   .094800  -.3411800   -30.600    -5.600  
+951122 50043.00 I  -.053914  .000163   .096986  .000212  I -.3439446  .0000122  2.7759 0.0087  I   -30.385     .791    -5.474     .298  -.054400   .096000  -.3440000   -30.500    -5.600  
+951123 50044.00 I  -.057976  .000171   .097979  .000217  I -.3466769  .0000122  2.6912 0.0090  I   -30.102     .791    -5.804     .298  -.058300   .097200  -.3467200   -30.400    -5.600  
+951124 50045.00 I  -.061727  .000179   .099130  .000223  I -.3493369  .0000133  2.6362 0.0090  I   -30.101     .791    -6.219     .298  -.061900   .098300  -.3493700   -30.200    -5.800  
+951125 50046.00 I  -.065201  .000197   .100487  .000251  I -.3519652  .0000131  2.6288 0.0084  I   -30.323     .791    -6.466     .298  -.065400   .099600  -.3519800   -29.900    -5.900  
+951126 50047.00 I  -.068566  .000211   .102026  .000157  I -.3546099  .0000101  2.6677 0.0083  I   -30.582     .791    -6.517     .109  -.068900   .101000  -.3546300   -29.800    -5.900  
+951127 50048.00 I  -.071992  .000199   .103675  .000136  I -.3573086  .0000102  2.7305 0.0074  I   -30.681     .791    -6.465     .101  -.072400   .102600  -.3573300   -29.600    -5.900  
+951128 50049.00 I  -.075682  .000271   .105386  .000112  I -.3600689  .0000109  2.7872 0.0075  I   -30.591     .791    -6.310     .101  -.076300   .104400  -.3601100   -29.600    -5.800  
+951129 50050.00 I  -.079882  .000284   .107134  .000105  I -.3628755  .0000110  2.8213 0.0079  I   -30.483     .791    -5.984     .101  -.080600   .106100  -.3629200   -29.800    -5.700  
+951130 50051.00 I  -.084668  .000292   .108887  .000088  I -.3656937  .0000115  2.8019 0.0078  I   -30.525     .791    -5.636     .101  -.085300   .107800  -.3657400   -30.000    -5.600  
+9512 1 50052.00 I  -.089793  .000278   .110581  .000107  I -.3684577  .0000112  2.7177 0.0080  I   -30.702     .791    -5.408     .101  -.090300   .109500  -.3685100   -30.200    -5.400  
+9512 2 50053.00 I  -.094910  .000269   .112190  .000102  I -.3711199  .0000110  2.6059 0.0122  I   -30.883     .791    -5.347     .298  -.095300   .111200  -.3711900   -30.400    -5.200  
+9512 3 50054.00 I  -.099728  .000269   .113810  .000111  I -.3736715  .0000216  2.4999 0.0094  I   -30.973     .791    -5.378     .298  -.100100   .112800  -.3737600   -30.600    -5.100  
+9512 4 50055.00 I  -.104255  .000249   .115578  .000145  I -.3761191  .0000153  2.3919 0.0130  I   -30.935     .299    -5.380     .298  -.104800   .114500  -.3762000   -30.600    -5.200  
+9512 5 50056.00 I  -.108571  .000228   .117528  .000152  I -.3784535  .0000146  2.2785 0.0107  I   -30.736     .314    -5.315     .298  -.109200   .116400  -.3785200   -30.600    -5.200  
+9512 6 50057.00 I  -.112580  .000228   .119567  .000159  I -.3806794  .0000151  2.1748 0.0105  I   -30.376     .314    -5.244     .298  -.113200   .118500  -.3807300   -30.300    -5.200  
+9512 7 50058.00 I  -.116132  .000230   .121605  .000164  I -.3828140  .0000151  2.1036 0.0107  I   -29.921     .314    -5.220     .298  -.116600   .120700  -.3828500   -30.100    -5.400  
+9512 8 50059.00 I  -.119291  .000224   .123582  .000165  I -.3849046  .0000151  2.0863 0.0092  I   -29.527     .314    -5.230     .298  -.119700   .122700  -.3849300   -29.600    -5.400  
+9512 9 50060.00 I  -.122360  .000237   .125522  .000166  I -.3870040  .0000105  2.1211 0.0092  I   -29.226     .314    -5.249     .298  -.122600   .124600  -.3870300   -29.300    -5.500  
+951210 50061.00 I  -.125428  .000269   .127453  .000175  I -.3891584  .0000106  2.1906 0.0062  I   -29.022     .329    -5.293     .298  -.125800   .126400  -.3891800   -29.000    -5.500  
+951211 50062.00 I  -.128714  .000217   .129439  .000150  I -.3913900  .0000065  2.2746 0.0062  I   -28.989     .122    -5.385     .298  -.129100   .128400  -.3914100   -28.600    -5.500  
+951212 50063.00 I  -.132294  .000191   .131545  .000153  I -.3937117  .0000063  2.3708 0.0047  I   -29.081     .102    -5.472     .298  -.132600   .130400  -.3937500   -28.600    -5.400  
+951213 50064.00 I  -.135762  .000195   .133872  .000147  I -.3961394  .0000068  2.4904 0.0052  I   -29.082     .102    -5.462     .298  -.135900   .132800  -.3961900   -28.600    -5.300  
+951214 50065.00 I  -.138554  .000179   .136542  .000145  I -.3986872  .0000084  2.5940 0.0051  I   -28.888     .102    -5.347     .298  -.138900   .135500  -.3987300   -28.800    -5.100  
+951215 50066.00 I  -.140929  .000162   .139485  .000140  I -.4013079  .0000077  2.6389 0.0057  I   -28.737     .102    -5.185     .298  -.141300   .138400  -.4013500   -28.900    -5.000  
+951216 50067.00 I  -.143210  .000193   .142573  .000191  I -.4039535  .0000077  2.6492 0.0083  I   -28.889     .102    -5.061     .298  -.143500   .141400  -.4040000   -29.100    -4.800  
+951217 50068.00 I  -.145513  .000210   .145731  .000237  I -.4066048  .0000146  2.6551 0.0087  I   -29.254     .791    -4.953     .298  -.145700   .144600  -.4066600   -29.200    -4.800  
+951218 50069.00 I  -.147835  .000228   .148873  .000240  I -.4092583  .0000155  2.6447 0.0105  I   -29.504     .791    -4.784     .298  -.148000   .147700  -.4093200   -29.200    -4.800  
+951219 50070.00 I  -.150201  .000257   .151908  .000242  I -.4118837  .0000150  2.6029 0.0095  I   -29.474     .791    -4.651     .298  -.150400   .150800  -.4119500   -29.100    -4.800  
+951220 50071.00 I  -.152541  .000252   .154799  .000250  I -.4144558  .0000110  2.5363 0.0099  I   -29.300     .791    -4.766     .298  -.152900   .153700  -.4145200   -28.900    -4.800  
+951221 50072.00 I  -.154776  .000258   .157666  .000255  I -.4169546  .0000128  2.4645 0.0086  I   -29.200     .791    -5.091     .298  -.155200   .156600  -.4170000   -28.700    -4.900  
+951222 50073.00 I  -.156826  .000233   .160665  .000254  I -.4193989  .0000133  2.4351 0.0088  I   -29.275     .791    -5.380     .298  -.157100   .159500  -.4194400   -28.400    -5.000  
+951223 50074.00 I  -.158669  .000175   .163912  .000148  I -.4218509  .0000120  2.4842 0.0080  I   -29.480     .791    -5.421     .298  -.158900   .162800  -.4218800   -28.300    -5.100  
+951224 50075.00 I  -.160459  .000145   .167387  .000129  I -.4243901  .0000090  2.6018 0.0065  I   -29.656     .791    -5.252     .298  -.160700   .166200  -.4244100   -28.200    -5.100  
+951225 50076.00 I  -.162335  .000113   .170951  .000119  I -.4270547  .0000049  2.7202 0.0052  I   -29.628     .791    -5.083     .298  -.162700   .169900  -.4270700   -28.200    -5.100  
+951226 50077.00 I  -.164330  .000069   .174443  .000101  I -.4298117  .0000053  2.7824 0.0027  I   -29.412     .791    -4.994     .298  -.164800   .173400  -.4298400   -28.400    -4.900  
+951227 50078.00 I  -.166407  .000055   .177742  .000094  I -.4325949  .0000024  2.7709 0.0033  I   -29.256     .791    -4.890     .298  -.167000   .176600  -.4326300   -28.700    -4.900  
+951228 50079.00 I  -.168495  .000074   .180798  .000093  I -.4353285  .0000039  2.6844 0.0024  I   -29.357     .791    -4.719     .298  -.169000   .179500  -.4353800   -29.000    -4.800  
+951229 50080.00 I  -.170527  .000064   .183633  .000091  I -.4379429  .0000042  2.5354 0.0029  I   -29.591     .791    -4.596     .298  -.170900   .182300  -.4379900   -29.100    -4.700  
+951230 50081.00 I  -.172465  .000108   .186350  .000088  I -.4403853  .0000043  2.3442 0.0056  I   -29.680     .791    -4.643     .298  -.172700   .185100  -.4404300   -29.400    -4.600  
+951231 50082.00 I  -.174304  .000169   .189077  .000146  I -.4426252  .0000103  2.1347 0.0044  I   -29.557     .791    -4.797     .298  -.174500   .188000  -.4426700   -29.500    -4.500  
+96 1 1 50083.00 I  -.175934  .000172   .191874  .000177  I  .5553429  .0000076  1.9325 0.0065  I   -29.394     .791    -4.888     .298  -.176200   .190800   .5552900   -29.400    -4.600  
+96 1 2 50084.00 I  -.177203  .000171   .194733  .000187  I  .5534992  .0000080  1.7620 0.0050  I   -29.306     .791    -4.849     .298  -.177700   .193700   .5534400   -29.300    -4.600  
+96 1 3 50085.00 I  -.178219  .000167   .197661  .000231  I  .5518040  .0000066  1.6361 0.0057  I   -29.226     .791    -4.768     .298  -.178700   .196600   .5517600   -28.800    -4.700  
+96 1 4 50086.00 I  -.179271  .000201   .200769  .000265  I  .5502108  .0000082  1.5587 0.0058  I   -29.079     .791    -4.739     .298  -.179700   .199600   .5501600   -28.400    -4.800  
+96 1 5 50087.00 I  -.180413  .000175   .204061  .000270  I  .5486679  .0000096  1.5374 0.0061  I   -28.892     .791    -4.756     .298  -.180700   .202900   .5486300   -28.000    -5.000  
+96 1 6 50088.00 I  -.181716  .000200   .207436  .000272  I  .5471137  .0000089  1.5831 0.0084  I   -28.710     .791    -4.783     .298  -.182100   .206200   .5471000   -27.600    -5.200  
+96 1 7 50089.00 I  -.183392  .000165   .210670  .000268  I  .5454827  .0000137  1.6859 0.0068  I   -28.546     .791    -4.849     .298  -.183900   .209600   .5454800   -27.400    -5.300  
+96 1 8 50090.00 I  -.185233  .000158   .213575  .000255  I  .5437364  .0000102  1.8052 0.0086  I   -28.421     .791    -5.007     .298  -.185700   .212600   .5437200   -27.400    -5.200  
+96 1 9 50091.00 I  -.186902  .000161   .216171  .000229  I  .5418803  .0000103  1.9004 0.0071  I   -28.349     .791    -5.208     .298  -.187100   .215200   .5418400   -27.600    -5.300  
+96 110 50092.00 I  -.188610  .000139   .218633  .000185  I  .5399478  .0000098  1.9590 0.0070  I   -28.276     .791    -5.310     .298  -.189000   .217500   .5399000   -27.800    -5.300  
+96 111 50093.00 I  -.190544  .000143   .221323  .000184  I  .5379721  .0000096  1.9883 0.0070  I   -28.168     .791    -5.232     .298  -.191000   .220100   .5379200   -28.100    -5.200  
+96 112 50094.00 I  -.192621  .000131   .224329  .000240  I  .5359773  .0000101  1.9993 0.0063  I   -28.132     .791    -5.062     .298  -.192700   .223000   .5359300   -28.600    -5.100  
+96 113 50095.00 I  -.194690  .000122   .227472  .000226  I  .5339774  .0000082  1.9986 0.0095  I   -28.313     .791    -4.945     .298  -.194800   .226200   .5339400   -28.900    -5.000  
+96 114 50096.00 I  -.196600  .000139   .230482  .000225  I  .5319852  .0000160  1.9827 0.0087  I   -28.673     .791    -4.904     .298  -.197000   .229500   .5319200   -29.100    -5.000  
+96 115 50097.00 I  -.198256  .000192   .233199  .000221  I  .5300178  .0000154  1.9494 0.0118  I   -29.010     .791    -4.864     .298  -.198600   .232300   .5299700   -29.300    -4.900  
+96 116 50098.00 I  -.199573  .000179   .235746  .000221  I  .5280928  .0000173  1.8968 0.0116  I   -29.212     .791    -4.833     .298  -.200000   .234700   .5280700   -29.200    -4.900  
+96 117 50099.00 I  -.200722  .000180   .238434  .000215  I  .5262338  .0000173  1.8155 0.0121  I   -29.356     .791    -4.937     .298  -.201300   .237100   .5262100   -29.100    -5.000  
+96 118 50100.00 I  -.202042  .000179   .241575  .000178  I  .5244563  .0000169  1.7506 0.0117  I   -29.552     .791    -5.217     .298  -.202500   .240200   .5244100   -28.800    -5.000  
+96 119 50101.00 I  -.203464  .000175   .245190  .000185  I  .5227037  .0000157  1.7723 0.0121  I   -29.802     .791    -5.482     .298  -.203700   .244000   .5227000   -28.700    -5.000  
+96 120 50102.00 I  -.204972  .000215   .249073  .000239  I  .5208840  .0000173  1.8771 0.0124  I   -30.012     .791    -5.505     .298  -.205300   .248100   .5209000   -28.500    -5.000  
+96 121 50103.00 I  -.206515  .000183   .252890  .000244  I  .5189387  .0000193  2.0143 0.0112  I   -30.053     .791    -5.306     .298  -.207100   .252000   .5189200   -28.300    -5.000  
+96 122 50104.00 I  -.208097  .000203   .256437  .000255  I  .5168645  .0000143  2.1240 0.0117  I   -29.834     .791    -5.112     .298  -.208500   .255500   .5168300   -28.400    -5.000  
+96 123 50105.00 I  -.209673  .000198   .259782  .000264  I  .5147185  .0000131  2.1502 0.0096  I   -29.454     .791    -5.049     .298  -.209900   .258800   .5146800   -28.600    -4.900  
+96 124 50106.00 I  -.210988  .000196   .263176  .000257  I  .5125896  .0000129  2.1000 0.0087  I   -29.222     .791    -5.015     .298  -.211400   .262100   .5125500   -29.000    -4.900  
+96 125 50107.00 I  -.211914  .000199   .266751  .000251  I  .5105347  .0000115  2.0013 0.0087  I   -29.365     .791    -4.949     .298  -.212400   .265600   .5104800   -29.300    -4.900  
+96 126 50108.00 I  -.212703  .000195   .270456  .000263  I  .5085976  .0000118  1.8707 0.0064  I   -29.717     .791    -4.913     .298  -.213000   .269400   .5085400   -29.700    -5.000  
+96 127 50109.00 I  -.213735  .000128   .274297  .000255  I  .5067973  .0000058  1.7280 0.0066  I   -29.911     .791    -5.020     .298  -.213900   .273300   .5067400   -29.900    -5.100  
+96 128 50110.00 I  -.215159  .000098   .278183  .000253  I  .5051407  .0000061  1.5880 0.0045  I   -29.841     .158    -5.262     .298  -.215500   .277300   .5051000   -30.000    -5.200  
+96 129 50111.00 I  -.216851  .000099   .281901  .000234  I  .5036132  .0000069  1.4725 0.0050  I   -29.729     .163    -5.495     .298  -.217200   .281000   .5035800   -29.900    -5.400  
+96 130 50112.00 I  -.218493  .000109   .285363  .000237  I  .5021832  .0000078  1.3947 0.0052  I   -29.714     .197    -5.618     .298  -.218800   .284400   .5021500   -29.600    -5.600  
+96 131 50113.00 I  -.219824  .000099   .288726  .000235  I  .5008057  .0000078  1.3714 0.0054  I   -29.645     .197    -5.663     .298  -.220200   .287700   .5007700   -29.200    -5.700  
+96 2 1 50114.00 I  -.220800  .000088   .292186  .000183  I  .4994203  .0000075  1.4085 0.0058  I   -29.423     .197    -5.681     .298  -.221300   .290900   .4993900   -28.700    -5.800  
+96 2 2 50115.00 I  -.221440  .000087   .295824  .000163  I  .4979729  .0000085  1.4932 0.0069  I   -29.133     .197    -5.670     .298  -.221800   .294600   .4979800   -28.500    -5.800  
+96 2 3 50116.00 I  -.221815  .000102   .299586  .000186  I  .4964256  .0000117  1.6030 0.0061  I   -28.932     .174    -5.620     .298  -.222200   .298700   .4964100   -28.200    -5.800  
+96 2 4 50117.00 I  -.222065  .000106   .303384  .000196  I  .4947668  .0000088  1.7133 0.0066  I   -28.852     .110    -5.589     .298  -.222300   .302300   .4947300   -28.100    -5.800  
+96 2 5 50118.00 I  -.222381  .000097   .307187  .000164  I  .4930004  .0000061  1.8194 0.0055  I   -28.845     .576    -5.645     .298  -.222400   .305900   .4929300   -28.000    -5.800  
+96 2 6 50119.00 I  -.222896  .000103   .310942  .000182  I  .4911259  .0000066  1.9318 0.0045  I   -28.935     .670    -5.767     .298  -.223200   .309700   .4910300   -28.200    -5.800  
+96 2 7 50120.00 I  -.223554  .000137   .314574  .000187  I  .4891368  .0000066  2.0444 0.0043  I   -29.209     .670    -5.857     .298  -.223900   .313300   .4890800   -28.300    -5.800  
+96 2 8 50121.00 I  -.224342  .000139   .318023  .000180  I  .4870476  .0000056  2.1257 0.0042  I   -29.711     .670    -5.902     .298  -.224600   .316900   .4870400   -28.200    -5.900  
+96 2 9 50122.00 I  -.225044  .000162   .321171  .000182  I  .4849035  .0000051  2.1529 0.0040  I   -30.118     .670    -5.896     .298  -.225300   .320300   .4848600   -28.200    -6.000  
+96 210 50123.00 I  -.225181  .000161   .323983  .000167  I  .4827588  .0000056  2.1291 0.0068  I   -30.281     .817    -5.882     .298  -.225300   .322900   .4827400   -28.200    -6.100  
+96 211 50124.00 I  -.224580  .000171   .326681  .000187  I  .4806567  .0000127  2.0711 0.0053  I   -30.265     .663    -5.893     .298  -.224700   .325500   .4806600   -28.300    -6.200  
+96 212 50125.00 I  -.223400  .000164   .329470  .000151  I  .4786206  .0000091  2.0010 0.0076  I   -30.117     .533    -5.894     .298  -.223900   .328400   .4786100   -28.600    -6.100  
+96 213 50126.00 I  -.221975  .000135   .332497  .000148  I  .4766505  .0000083  1.9436 0.0063  I   -29.920     .533    -5.875     .298  -.222400   .331400   .4766200   -29.100    -6.000  
+96 214 50127.00 I  -.220650  .000133   .335894  .000146  I  .4747223  .0000086  1.9194 0.0057  I   -29.779     .483    -5.885     .298  -.221000   .334800   .4746900   -29.600    -5.900  
+96 215 50128.00 I  -.219519  .000084   .339747  .000120  I  .4727933  .0000079  1.9504 0.0054  I   -29.609     .483    -5.960     .298  -.219800   .338500   .4727600   -29.800    -5.700  
+96 216 50129.00 I  -.218710  .000092   .344051  .000123  I  .4707968  .0000064  2.0554 0.0051  I   -29.461     .483    -6.013     .298  -.219100   .342700   .4707600   -29.800    -5.600  
+96 217 50130.00 I  -.218381  .000093   .348607  .000176  I  .4686632  .0000065  2.2182 0.0050  I   -29.437     .502    -5.924     .298  -.218900   .347600   .4686900   -29.700    -5.600  
+96 218 50131.00 I  -.218571  .000096   .353126  .000188  I  .4663566  .0000078  2.3924 0.0047  I   -29.438     .365    -5.710     .298  -.219000   .352200   .4664100   -29.300    -5.600  
+96 219 50132.00 I  -.219284  .000139   .357369  .000168  I  .4638910  .0000067  2.5287 0.0046  I   -29.353     .262    -5.582     .298  -.219800   .356500   .4639200   -29.000    -5.700  
+96 220 50133.00 I  -.220255  .000132   .361221  .000179  I  .4613243  .0000050  2.5896 0.0043  I   -29.218     .791    -5.715     .298  -.220800   .360200   .4613000   -28.800    -5.900  
+96 221 50134.00 I  -.221031  .000133   .364694  .000191  I  .4587397  .0000055  2.5668 0.0040  I   -29.233     .791    -6.025     .298  -.221300   .363600   .4586900   -28.800    -6.000  
+96 222 50135.00 I  -.221356  .000127   .367982  .000191  I  .4562191  .0000062  2.4586 0.0044  I   -29.540     .791    -6.278     .298  -.221700   .366900   .4562000   -29.100    -6.100  
+96 223 50136.00 I  -.221356  .000128   .371356  .000161  I  .4538542  .0000068  2.2551 0.0048  I   -30.009     .791    -6.389     .298  -.221500   .369900   .4538500   -29.500    -6.300  
+96 224 50137.00 I  -.221173  .000122   .375065  .000174  I  .4517135  .0000074  2.0378 0.0053  I   -30.356     .791    -6.464     .298  -.221400   .373500   .4516400   -30.000    -6.400  
+96 225 50138.00 I  -.220760  .000100   .379108  .000194  I  .4497550  .0000082  1.8915 0.0056  I   -30.495     .791    -6.594     .298  -.221200   .378000   .4496300   -30.300    -6.500  
+96 226 50139.00 I  -.220267  .000096   .383241  .000183  I  .4479084  .0000084  1.8116 0.0117  I   -30.591     .791    -6.764     .298  -.220700   .382200   .4477600   -30.500    -6.600  
+96 227 50140.00 I  -.219849  .000130   .387230  .000182  I  .4461162  .0000220  1.7783 0.0114  I   -30.729     .791    -6.920     .298  -.220100   .386100   .4459900   -30.500    -6.900  
+96 228 50141.00 I  -.219416  .000138   .391075  .000184  I  .4443430  .0000212  1.7712 0.0149  I   -30.727     .791    -7.034     .298  -.219800   .390000   .4442800   -30.100    -7.000  
+96 229 50142.00 I  -.218720  .000146   .394877  .000190  I  .4425576  .0000202  1.8128 0.0142  I   -30.420     .791    -7.097     .298  -.219200   .393500   .4425900   -29.700    -7.100  
+96 3 1 50143.00 I  -.217592  .000138   .398724  .000167  I  .4406961  .0000190  1.9185 0.0133  I   -29.944     .791    -7.096     .298  -.218100   .397500   .4407400   -29.200    -7.100  
+96 3 2 50144.00 I  -.216046  .000143   .402709  .000173  I  .4387105  .0000173  2.0545 0.0111  I   -29.568     .791    -7.053     .298  -.216400   .401800   .4386800   -28.700    -7.200  
+96 3 3 50145.00 I  -.214256  .000143   .406820  .000157  I  .4365826  .0000113  2.2041 0.0090  I   -29.366     .791    -7.034     .298  -.214400   .405800   .4365700   -28.400    -7.200  
+96 3 4 50146.00 I  -.212377  .000114   .410989  .000146  I  .4343027  .0000052  2.3526 0.0062  I   -29.210     .791    -7.087     .298  -.212700   .409800   .4343200   -28.200    -7.100  
+96 3 5 50147.00 I  -.210462  .000108   .415165  .000159  I  .4318862  .0000052  2.4747 0.0042  I   -29.035     .791    -7.179     .298  -.210800   .413800   .4318900   -28.200    -7.100  
+96 3 6 50148.00 I  -.208540  .000104   .419342  .000163  I  .4293659  .0000065  2.5588 0.0039  I   -28.924     .791    -7.249     .298  -.209000   .418200   .4293400   -28.400    -7.200  
+96 3 7 50149.00 I  -.206795  .000103   .423380  .000159  I  .4267812  .0000057  2.6050 0.0049  I   -28.931     .791    -7.285     .298  -.207100   .422300   .4267300   -28.700    -7.200  
+96 3 8 50150.00 I  -.205259  .000102   .427213  .000154  I  .4241680  .0000073  2.6150 0.0053  I   -29.022     .791    -7.314     .298  -.205900   .425900   .4241600   -29.100    -7.300  
+96 3 9 50151.00 I  -.203908  .000117   .430867  .000202  I  .4215619  .0000090  2.5927 0.0076  I   -29.113     .321    -7.363     .298  -.204300   .429800   .4216000   -29.400    -7.300  
+96 310 50152.00 I  -.202582  .000126   .434377  .000214  I  .4189899  .0000133  2.5483 0.0092  I   -29.170     .367    -7.426     .298  -.203000   .433300   .4190100   -29.500    -7.400  
+96 311 50153.00 I  -.201172  .000142   .437787  .000233  I  .4164748  .0000160  2.4755 0.0100  I   -29.216     .367    -7.480     .298  -.201800   .436600   .4164900   -29.500    -7.500  
+96 312 50154.00 I  -.199681  .000153   .441159  .000243  I  .4140508  .0000150  2.3672 0.0109  I   -29.273     .367    -7.534     .298  -.199800   .440100   .4140600   -29.400    -7.600  
+96 313 50155.00 I  -.198181  .000161   .444555  .000234  I  .4117438  .0000148  2.2488 0.0098  I   -29.332     .367    -7.631     .298  -.198600   .443400   .4117000   -29.100    -7.600  
+96 314 50156.00 I  -.196547  .000168   .448062  .000231  I  .4095361  .0000125  2.1818 0.0091  I   -29.352     .367    -7.780     .298  -.197100   .447000   .4094800   -28.700    -7.800  
+96 315 50157.00 I  -.194698  .000164   .451546  .000228  I  .4073526  .0000105  2.1975 0.0079  I   -29.321     .791    -7.891     .298  -.195100   .450500   .4073300   -28.400    -7.800  
+96 316 50158.00 I  -.192737  .000188   .454954  .000212  I  .4051230  .0000098  2.2674 0.0076  I   -29.256     .791    -7.841     .298  -.193100   .453800   .4051100   -28.100    -7.900  
+96 317 50159.00 I  -.190621  .000202   .458387  .000229  I  .4028131  .0000111  2.3515 0.0059  I   -29.180     .791    -7.622     .298  -.191100   .457400   .4028100   -28.000    -7.900  
+96 318 50160.00 I  -.188103  .000190   .461977  .000198  I  .4004263  .0000067  2.4167 0.0076  I   -29.102     .791    -7.415     .298  -.188700   .460700   .4004400   -28.100    -7.900  
+96 319 50161.00 I  -.185015  .000175   .465952  .000201  I  .3979922  .0000103  2.4444 0.0068  I   -29.037     .791    -7.436     .298  -.185500   .464600   .3979900   -28.200    -7.900  
+96 320 50162.00 I  -.181736  .000174   .470274  .000220  I  .3955522  .0000118  2.4279 0.0083  I   -29.044     .791    -7.720     .298  -.182000   .469400   .3955200   -28.400    -8.000  
+96 321 50163.00 I  -.178926  .000199   .474524  .000225  I  .3931553  .0000129  2.3547 0.0088  I   -29.179     .791    -8.078     .298  -.179100   .473800   .3931500   -28.500    -7.900  
+96 322 50164.00 I  -.176775  .000150   .478401  .000200  I  .3908599  .0000131  2.2303 0.0087  I   -29.403     .791    -8.294     .298  -.177000   .477600   .3908500   -28.700    -7.900  
+96 323 50165.00 I  -.175051  .000160   .481739  .000189  I  .3886987  .0000118  2.0938 0.0088  I   -29.629     .791    -8.320     .298  -.175600   .480800   .3886500   -28.800    -8.000  
+96 324 50166.00 I  -.173268  .000164   .484606  .000166  I  .3866632  .0000117  1.9845 0.0068  I   -29.829     .369    -8.268     .298  -.173900   .483500   .3866500   -28.800    -8.000  
+96 325 50167.00 I  -.171139  .000176   .487249  .000143  I  .3847174  .0000067  1.9120 0.0066  I   -30.011     .496    -8.254     .298  -.171600   .486200   .3847200   -28.700    -8.100  
+96 326 50168.00 I  -.168588  .000169   .489916  .000116  I  .3828287  .0000061  1.8711 0.0043  I   -30.084     .440    -8.305     .298  -.169100   .488800   .3828000   -28.600    -8.200  
+96 327 50169.00 I  -.165644  .000155   .492745  .000120  I  .3809636  .0000055  1.8650 0.0043  I   -29.876     .440    -8.364     .298  -.166000   .491600   .3809300   -28.300    -8.300  
+96 328 50170.00 I  -.162586  .000142   .495671  .000102  I  .3790850  .0000060  1.9002 0.0040  I   -29.464     .440    -8.392     .298  -.162900   .494600   .3790600   -27.900    -8.500  
+96 329 50171.00 I  -.159679  .000133   .498650  .000098  I  .3771505  .0000057  1.9737 0.0053  I   -28.989     .440    -8.361     .298  -.160200   .497700   .3771400   -27.700    -8.500  
+96 330 50172.00 I  -.156908  .000114   .501603  .000097  I  .3751298  .0000088  2.0707 0.0090  I   -28.666     .472    -8.305     .298  -.157200   .500500   .3751100   -27.400    -8.500  
+96 331 50173.00 I  -.154212  .000101   .504539  .000100  I  .3730040  .0000171  2.1829 0.0079  I   -28.606     .298    -8.301     .298  -.154600   .503400   .3729600   -27.400    -8.500  
+96 4 1 50174.00 I  -.151663  .000117   .507519  .000123  I  .3707596  .0000131  2.3081 0.0110  I   -28.693     .247    -8.367     .298  -.152300   .506400   .3708000   -27.500    -8.400  
+96 4 2 50175.00 I  -.149362  .000124   .510501  .000125  I  .3683888  .0000137  2.4303 0.0093  I   -28.784     .246    -8.423     .298  -.149700   .509400   .3685000   -28.000    -8.300  
+96 4 3 50176.00 I  -.147360  .000128   .513289  .000134  I  .3659173  .0000133  2.4977 0.0095  I   -28.867     .246    -8.396     .298  -.147900   .512200   .3659300   -28.400    -8.300  
+96 4 4 50177.00 I  -.145638  .000137   .515645  .000143  I  .3634127  .0000133  2.5073 0.0086  I   -28.994     .246    -8.338     .298  -.146000   .514500   .3633400   -28.700    -8.400  
+96 4 5 50178.00 I  -.143920  .000148   .517579  .000142  I  .3609107  .0000110  2.4928 0.0081  I   -29.092     .246    -8.369     .298  -.144200   .516300   .3609000   -29.100    -8.400  
+96 4 6 50179.00 I  -.142117  .000183   .519318  .000155  I  .3584370  .0000093  2.4487 0.0086  I   -29.093     .246    -8.541     .298  -.142300   .518100   .3584400   -29.400    -8.500  
+96 4 7 50180.00 I  -.140191  .000181   .521063  .000161  I  .3560213  .0000131  2.3808 0.0059  I   -29.012     .245    -8.775     .298  -.140400   .519900   .3560200   -29.500    -8.700  
+96 4 8 50181.00 I  -.137977  .000180   .522959  .000139  I  .3536761  .0000071  2.3108 0.0075  I   -28.909     .791    -8.941     .298  -.138500   .521600   .3536600   -29.400    -8.800  
+96 4 9 50182.00 I  -.135234  .000179   .525188  .000133  I  .3513918  .0000075  2.2646 0.0055  I   -28.840     .791    -8.991     .298  -.135700   .523700   .3513800   -29.200    -8.800  
+96 410 50183.00 I  -.132187  .000195   .527816  .000131  I  .3491286  .0000085  2.2733 0.0059  I   -28.802     .791    -8.973     .298  -.132700   .526700   .3491000   -28.900    -8.900  
+96 411 50184.00 I  -.129341  .000205   .530702  .000141  I  .3468257  .0000090  2.3407 0.0060  I   -28.733     .791    -8.959     .298  -.129400   .529800   .3468200   -28.400    -8.900  
+96 412 50185.00 I  -.126573  .000181   .533654  .000131  I  .3444367  .0000085  2.4398 0.0059  I   -28.558     .791    -8.964     .298  -.126700   .532700   .3444800   -28.000    -8.900  
+96 413 50186.00 I  -.123540  .000182   .536510  .000120  I  .3419479  .0000076  2.5335 0.0094  I   -28.286     .791    -8.932     .298  -.123800   .535500   .3419800   -27.700    -8.900  
+96 414 50187.00 I  -.120077  .000180   .539229  .000133  I  .3393835  .0000168  2.5859 0.0086  I   -28.040     .791    -8.816     .298  -.120300   .538200   .3393300   -27.500    -8.800  
+96 415 50188.00 I  -.116351  .000192   .541835  .000124  I  .3367947  .0000154  2.5827 0.0112  I   -27.977     .791    -8.672     .298  -.116700   .540600   .3367600   -27.500    -8.800  
+96 416 50189.00 I  -.112714  .000165   .544371  .000136  I  .3342362  .0000147  2.5252 0.0103  I   -28.144     .791    -8.650     .298  -.112900   .543100   .3342400   -27.600    -8.800  
+96 417 50190.00 I  -.109479  .000154   .546890  .000134  I  .3317556  .0000138  2.4338 0.0100  I   -28.426     .791    -8.844     .298  -.109600   .545800   .3317400   -27.800    -8.900  
+96 418 50191.00 I  -.106534  .000154   .549353  .000153  I  .3293821  .0000136  2.3020 0.0112  I   -28.662     .791    -9.175     .298  -.107000   .548400   .3293200   -28.100    -9.000  
+96 419 50192.00 I  -.103718  .000163   .551690  .000158  I  .3271622  .0000176  2.1385 0.0114  I   -28.763     .791    -9.444     .298  -.104200   .550600   .3271400   -28.400    -9.100  
+96 420 50193.00 I  -.100881  .000147   .553900  .000169  I  .3250953  .0000184  2.0044 0.0108  I   -28.796     .791    -9.531     .298  -.100900   .552900   .3250900   -28.500    -9.300  
+96 421 50194.00 I  -.097922  .000130   .556020  .000150  I  .3231337  .0000126  1.9294 0.0106  I   -28.874     .791    -9.490     .298  -.098000   .554900   .3231400   -28.500    -9.300  
+96 422 50195.00 I  -.094702  .000133   .558058  .000135  I  .3212225  .0000104  1.8964 0.0082  I   -28.979     .466    -9.454     .255  -.095100   .556600   .3212000   -28.500    -9.400  
+96 423 50196.00 I  -.091203  .000148   .559985  .000143  I  .3193323  .0000104  1.8890 0.0074  I   -28.959     .427    -9.480     .223  -.091300   .558900   .3192800   -28.200    -9.400  
+96 424 50197.00 I  -.087651  .000165   .561722  .000132  I  .3174315  .0000104  1.9204 0.0063  I   -28.674     .382    -9.499     .200  -.088000   .560600   .3174000   -27.800    -9.400  
+96 425 50198.00 I  -.084232  .000163   .563198  .000149  I  .3154816  .0000071  1.9813 0.0062  I   -28.166     .382    -9.450     .200  -.084800   .562300   .3154700   -27.500    -9.300  
+96 426 50199.00 I  -.080698  .000158   .564540  .000154  I  .3134595  .0000066  2.0704 0.0048  I   -27.711     .382    -9.384     .200  -.081100   .563800   .3134500   -27.200    -9.200  
+96 427 50200.00 I  -.076772  .000158   .565959  .000155  I  .3113307  .0000064  2.1896 0.0053  I   -27.474     .382    -9.296     .200  -.077100   .564900   .3113000   -27.000    -9.100  
+96 428 50201.00 I  -.072472  .000156   .567693  .000185  I  .3090793  .0000084  2.3116 0.0058  I   -27.509     .199    -9.247     .298  -.072700   .566400   .3090500   -27.000    -9.100  
+96 429 50202.00 I  -.068033  .000137   .569841  .000182  I  .3067111  .0000096  2.4227 0.0065  I   -27.810     .243    -9.282     .298  -.068300   .568500   .3066900   -27.100    -9.000  
+96 430 50203.00 I  -.063732  .000100   .572237  .000178  I  .3042392  .0000099  2.5177 0.0069  I   -28.257     .523    -9.318     .298  -.064000   .571100   .3042100   -27.500    -9.100  
+96 5 1 50204.00 I  -.059829  .000118   .574547  .000157  I  .3016817  .0000099  2.5946 0.0071  I   -28.644     .523    -9.243     .298  -.059900   .573600   .3016500   -27.900    -9.200  
+96 5 2 50205.00 I  -.056414  .000130   .576487  .000138  I  .2990626  .0000102  2.6336 0.0074  I   -28.806     .523    -9.089     .298  -.056600   .575600   .2990300   -28.400    -9.300  
+96 5 3 50206.00 I  -.053179  .000140   .578097  .000127  I  .2964375  .0000111  2.6037 0.0076  I   -28.598     .523    -8.975     .298  -.053500   .577000   .2964200   -28.900    -9.500  
+96 5 4 50207.00 I  -.049736  .000144   .579512  .000115  I  .2938736  .0000112  2.5186 0.0085  I   -28.151     .523    -9.038     .298  -.049900   .578500   .2938600   -29.300    -9.600  
+96 5 5 50208.00 I  -.045973  .000147   .580829  .000104  I  .2914053  .0000128  2.4185 0.0087  I   -27.721     .931    -9.255     .298  -.046000   .579900   .2913700   -29.400    -9.700  
+96 5 6 50209.00 I  -.042012  .000153   .582102  .000126  I  .2890282  .0000133  2.3435 0.0093  I   -27.502    1.043    -9.442     .298  -.042100   .581000   .2890300   -29.400    -9.800  
+96 5 7 50210.00 I  -.037918  .000135   .583347  .000133  I  .2866998  .0000135  2.3239 0.0095  I   -27.703    1.043    -9.490     .298  -.038000   .582200   .2867100   -29.300    -9.700  
+96 5 8 50211.00 I  -.033632  .000123   .584594  .000137  I  .2843591  .0000136  2.3681 0.0098  I   -28.404    1.043    -9.460     .298  -.033800   .583500   .2843400   -29.000    -9.700  
+96 5 9 50212.00 I  -.029180  .000115   .585848  .000152  I  .2819499  .0000141  2.4533 0.0099  I   -29.094    1.043    -9.383     .298  -.029300   .584800   .2819500   -28.700    -9.500  
+96 510 50213.00 I  -.024728  .000110   .587025  .000157  I  .2794478  .0000144  2.5525 0.0098  I   -29.457    1.043    -9.335     .298  -.024900   .586000   .2794900   -28.400    -9.300  
+96 511 50214.00 I  -.020330  .000086   .588093  .000151  I  .2768482  .0000135  2.6416 0.0093  I   -29.424     .934    -9.336     .298  -.020800   .587000   .2768600   -28.300    -9.200  
+96 512 50215.00 I  -.015922  .000091   .589125  .000121  I  .2741811  .0000117  2.6811 0.0084  I   -29.110     .791    -9.319     .298  -.016300   .587800   .2741700   -28.100    -9.100  
+96 513 50216.00 I  -.011521  .000088   .590154  .000137  I  .2715088  .0000101  2.6523 0.0078  I   -28.799     .791    -9.232     .298  -.011700   .589000   .2714900   -28.100    -9.000  
+96 514 50217.00 I  -.007268  .000104   .591099  .000148  I  .2688973  .0000103  2.5610 0.0069  I   -28.748     .791    -9.102     .298  -.007800   .589800   .2688800   -28.300    -8.900  
+96 515 50218.00 I  -.003399  .000112   .591911  .000133  I  .2663992  .0000095  2.4324 0.0070  I   -28.967     .791    -9.008     .298  -.004000   .590700   .2663800   -28.500    -9.000  
+96 516 50219.00 I  -.000024  .000114   .592626  .000134  I  .2640413  .0000095  2.2775 0.0065  I   -29.226     .791    -8.988     .298  -.000300   .591600   .2640100   -28.600    -9.000  
+96 517 50220.00 I   .003144  .000109   .593209  .000140  I  .2618504  .0000090  2.1039 0.0068  I   -29.296     .791    -9.005     .298   .003000   .592300   .2618600   -28.800    -9.000  
+96 518 50221.00 I   .006435  .000110   .593685  .000131  I  .2598275  .0000096  1.9484 0.0077  I   -29.186     .791    -9.005     .298   .006000   .592600   .2598300   -28.800    -9.200  
+96 519 50222.00 I   .009919  .000123   .594127  .000116  I  .2579410  .0000125  1.8307 0.0067  I   -29.065     .791    -8.998     .298   .009700   .592900   .2579500   -28.700    -9.300  
+96 520 50223.00 I   .013491  .000122   .594555  .000111  I  .2561562  .0000094  1.7428 0.0083  I   -29.007     .791    -9.042     .298   .013400   .593600   .2561500   -28.500    -9.300  
+96 521 50224.00 I   .017124  .000103   .594917  .000120  I  .2544473  .0000109  1.6793 0.0069  I   -28.956     .791    -9.186     .298   .017100   .593900   .2544200   -28.300    -9.300  
+96 522 50225.00 I   .020937  .000098   .595164  .000115  I  .2527826  .0000102  1.6609 0.0078  I   -28.895     .791    -9.420     .298   .020800   .594100   .2527500   -28.000    -9.300  
+96 523 50226.00 I   .025152  .000109   .595261  .000115  I  .2511090  .0000112  1.6920 0.0082  I   -28.900     .791    -9.618     .298   .024800   .594000   .2511000   -27.900    -9.200  
+96 524 50227.00 I   .029779  .000105   .595317  .000111  I  .2493911  .0000129  1.7456 0.0083  I   -28.934     .791    -9.690     .298   .029600   .594000   .2493600   -27.900    -9.200  
+96 525 50228.00 I   .034665  .000098   .595469  .000115  I  .2476132  .0000122  1.8132 0.0114  I   -28.871     .791    -9.625     .298   .034400   .594300   .2476200   -28.000    -9.000  
+96 526 50229.00 I   .039753  .000092   .595702  .000149  I  .2457632  .0000188  1.8854 0.0098  I   -28.756     .791    -9.503     .298   .039400   .594600   .2457400   -28.300    -9.000  
+96 527 50230.00 I   .044841  .000092   .595957  .000175  I  .2438479  .0000153  1.9409 0.0115  I   -28.864     .791    -9.426     .298   .044700   .594700   .2438100   -28.600    -9.000  
+96 528 50231.00 I   .049615  .000087   .596238  .000155  I  .2418917  .0000134  1.9653 0.0100  I   -29.358     .791    -9.384     .298   .049500   .594900   .2418500   -29.000    -9.000  
+96 529 50232.00 I   .053882  .000096   .596541  .000156  I  .2399269  .0000128  1.9610 0.0088  I   -30.023     .791    -9.256     .298   .053800   .595400   .2398900   -29.400    -9.100  
+96 530 50233.00 I   .057700  .000094   .596714  .000163  I  .2379830  .0000114  1.9168 0.0085  I   -30.487     .791    -9.008     .298   .057500   .595600   .2379800   -29.700    -9.100  
+96 531 50234.00 I   .061444  .000097   .596642  .000164  I  .2361074  .0000111  1.8304 0.0077  I   -30.610     .791    -8.791     .298   .061200   .595600   .2361100   -30.000    -9.200  
+96 6 1 50235.00 I   .065503  .000113   .596277  .000155  I  .2343259  .0000105  1.7330 0.0075  I   -30.561     .791    -8.810     .298   .065300   .595400   .2343000   -30.100    -9.200  
+96 6 2 50236.00 I   .069860  .000121   .595604  .000121  I  .2326331  .0000101  1.6606 0.0068  I   -30.532     .791    -9.069     .298   .069800   .594500   .2326100   -30.200    -9.200  
+96 6 3 50237.00 I   .074230  .000146   .594696  .000164  I  .2309860  .0000085  1.6445 0.0073  I   -30.547     .791    -9.326     .298   .074300   .593500   .2309700   -30.100    -9.100  
+96 6 4 50238.00 I   .078467  .000146   .593622  .000190  I  .2293212  .0000105  1.6973 0.0072  I   -30.581     .791    -9.359     .298   .078400   .592900   .2292900   -29.900    -9.100  
+96 6 5 50239.00 I   .082604  .000148   .592449  .000190  I  .2275791  .0000116  1.7872 0.0087  I   -30.692     .791    -9.192     .298   .082300   .591600   .2275400   -30.000    -9.000  
+96 6 6 50240.00 I   .086784  .000143   .591323  .000184  I  .2257463  .0000138  1.8786 0.0088  I   -30.930     .791    -8.975     .298   .086400   .590000   .2257100   -29.900    -8.900  
+96 6 7 50241.00 I   .090816  .000143   .590282  .000182  I  .2238242  .0000133  1.9631 0.0097  I   -31.233     .791    -8.864     .298   .090500   .589000   .2237900   -30.000    -8.800  
+96 6 8 50242.00 I   .094546  .000115   .589194  .000162  I  .2218261  .0000136  2.0296 0.0099  I   -31.444     .791    -8.892     .298   .094500   .588000   .2218100   -30.200    -8.700  
+96 6 9 50243.00 I   .098025  .000073   .587957  .000130  I  .2197756  .0000148  2.0643 0.0094  I   -31.444     .791    -8.991     .298   .097900   .586900   .2198100   -30.500    -8.700  
+96 610 50244.00 I   .101457  .000100   .586564  .000172  I  .2177168  .0000129  2.0411 0.0099  I   -31.287     .166    -9.077     .172   .101200   .585400   .2177500   -30.900    -8.800  
+96 611 50245.00 I   .105120  .000094   .585084  .000178  I  .2157148  .0000131  1.9536 0.0088  I   -31.193     .165    -9.087     .177   .104900   .583900   .2156800   -31.200    -8.800  
+96 612 50246.00 I   .109158  .000086   .583575  .000171  I  .2138240  .0000121  1.8228 0.0092  I   -31.343     .165    -8.964     .177   .108900   .582500   .2137800   -31.500    -9.000  
+96 613 50247.00 I   .113468  .000083   .581998  .000178  I  .2120760  .0000130  1.6714 0.0088  I   -31.651     .165    -8.626     .177   .113200   .580900   .2121100   -31.700    -9.200  
+96 614 50248.00 I   .117895  .000076   .580426  .000178  I  .2104819  .0000128  1.5179 0.0093  I   -31.912     .165    -8.354     .177   .117800   .579200   .2104800   -31.900    -9.300  
+96 615 50249.00 I   .122258  .000086   .578845  .000182  I  .2090393  .0000134  1.3673 0.0099  I   -31.982     .197    -8.356     .211   .122200   .577800   .2089500   -32.000    -9.400  
+96 616 50250.00 I   .126467  .000109   .577104  .000144  I  .2077336  .0000150  1.2579 0.0086  I   -31.881     .162    -8.552     .187   .126100   .576400   .2077400   -31.800    -9.500  
+96 617 50251.00 I   .130498  .000090   .575237  .000125  I  .2065038  .0000108  1.2075 0.0101  I   -31.732     .791    -8.801     .298   .130300   .574100   .2064900   -31.800    -9.400  
+96 618 50252.00 I   .134268  .000094   .573331  .000167  I  .2053055  .0000136  1.1962 0.0093  I   -31.645     .791    -8.996     .298   .134300   .572000   .2052500   -31.600    -9.400  
+96 619 50253.00 I   .137862  .000123   .571399  .000193  I  .2040955  .0000151  1.2324 0.0103  I   -31.733     .383    -9.125     .185   .137800   .570400   .2040700   -31.500    -9.200  
+96 620 50254.00 I   .141523  .000125   .569469  .000193  I  .2028277  .0000155  1.3076 0.0107  I   -32.068     .361    -9.204     .160   .141400   .568400   .2028700   -31.500    -9.000  
+96 621 50255.00 I   .145303  .000121   .567674  .000189  I  .2014758  .0000151  1.3962 0.0111  I   -32.526     .361    -9.185     .160   .145100   .566600   .2015300   -31.600    -8.900  
+96 622 50256.00 I   .149172  .000116   .566173  .000189  I  .2000356  .0000159  1.4838 0.0110  I   -32.804     .361    -9.013     .160   .148900   .565100   .2000600   -31.800    -8.900  
+96 623 50257.00 I   .153039  .000102   .564948  .000191  I  .1985142  .0000161  1.5532 0.0095  I   -32.842     .465    -8.803     .173   .152900   .564000   .1984900   -32.100    -8.800  
+96 624 50258.00 I   .156765  .000108   .563751  .000167  I  .1969418  .0000103  1.5847 0.0084  I   -32.954     .463    -8.676     .169   .156600   .562700   .1969100   -32.500    -8.800  
+96 625 50259.00 I   .160185  .000088   .562310  .000087  I  .1953602  .0000050  1.5701 0.0056  I   -33.423     .458    -8.732     .116   .159800   .561300   .1953400   -32.800    -8.900  
+96 626 50260.00 I   .163281  .000085   .560423  .000094  I  .1938095  .0000045  1.5319 0.0035  I   -34.065     .429    -8.894     .116   .162900   .559500   .1937800   -33.200    -8.900  
+96 627 50261.00 I   .166362  .000090   .558025  .000101  I  .1923025  .0000050  1.4755 0.0034  I   -34.561     .429    -8.855     .116   .166200   .556800   .1923000   -33.700    -8.900  
+96 628 50262.00 I   .169493  .000098   .555334  .000099  I  .1908709  .0000050  1.3818 0.0035  I   -34.691     .429    -8.649     .116   .169200   .554100   .1908900   -34.100    -8.900  
+96 629 50263.00 I   .172608  .000096   .552597  .000113  I  .1895423  .0000048  1.2778 0.0045  I   -34.607     .319    -8.556     .108   .172200   .551400   .1895400   -34.500    -8.900  
+96 630 50264.00 I   .175817  .000090   .549915  .000137  I  .1883068  .0000074  1.1992 0.0050  I   -34.604     .791    -8.675     .298   .175600   .548600   .1882900   -34.800    -8.700  
+96 7 1 50265.00 I   .179070  .000128   .547255  .000148  I  .1871278  .0000087  1.1689 0.0109  I   -34.769     .791    -8.814     .298   .179000   .545900   .1871200   -34.900    -8.600  
+96 7 2 50266.00 I   .182205  .000154   .544555  .000191  I  .1859475  .0000205  1.2031 0.0113  I   -34.999     .791    -8.744     .298   .182300   .543100   .1859300   -35.000    -8.500  
+96 7 3 50267.00 I   .185266  .000151   .541804  .000203  I  .1846984  .0000209  1.3070 0.0149  I   -35.206     .791    -8.482     .298   .185200   .540600   .1846700   -35.000    -8.400  
+96 7 4 50268.00 I   .188487  .000146   .539052  .000212  I  .1833305  .0000216  1.4201 0.0148  I   -35.411     .791    -8.248     .298   .188100   .537900   .1833800   -35.000    -8.400  
+96 7 5 50269.00 I   .191979  .000141   .536334  .000193  I  .1818802  .0000209  1.4673 0.0146  I   -35.707     .791    -8.181     .298   .191700   .534600   .1820100   -35.000    -8.400  
+96 7 6 50270.00 I   .195778  .000138   .533729  .000179  I  .1804193  .0000195  1.4444 0.0127  I   -36.123     .791    -8.244     .298   .195600   .531800   .1805700   -35.200    -8.300  
+96 7 7 50271.00 I   .199792  .000133   .531295  .000169  I  .1790079  .0000146  1.3721 0.0106  I   -36.514     .791    -8.360     .298   .199700   .529500   .1791100   -35.200    -8.500  
+96 7 8 50272.00 I   .203823  .000149   .528995  .000150  I  .1776848  .0000085  1.2706 0.0090  I   -36.655     .791    -8.526     .298   .203900   .527500   .1777200   -35.400    -8.600  
+96 7 9 50273.00 I   .207687  .000170   .526712  .000172  I  .1764712  .0000105  1.1554 0.0067  I   -36.524     .791    -8.726     .298   .207800   .525300   .1764400   -35.500    -8.800  
+96 710 50274.00 I   .211388  .000184   .524315  .000175  I  .1753711  .0000103  1.0487 0.0071  I   -36.416     .164    -8.858     .298   .211100   .523000   .1753400   -35.700    -8.800  
+96 711 50275.00 I   .215158  .000179   .521696  .000172  I  .1743692  .0000097  0.9557 0.0071  I   -36.639     .164    -8.827     .298   .215000   .520300   .1743700   -35.900    -9.000  
+96 712 50276.00 I   .218752  .000171   .518866  .000170  I  .1734575  .0000097  0.8694 0.0067  I   -37.114     .164    -8.713     .298   .218500   .517300   .1734500   -36.000    -9.000  
+96 713 50277.00 I   .221889  .000168   .515895  .000155  I  .1726196  .0000091  0.8157 0.0076  I   -37.464     .164    -8.688     .298   .221500   .514400   .1725800   -36.000    -8.900  
+96 714 50278.00 I   .224827  .000136   .512845  .000160  I  .1718092  .0000116  0.8127 0.0065  I   -37.448     .179    -8.781     .298   .224800   .511400   .1718100   -36.100    -8.800  
+96 715 50279.00 I   .227709  .000132   .509712  .000143  I  .1709819  .0000092  0.8465 0.0066  I   -37.134     .189    -8.855     .298   .227600   .508500   .1710000   -36.100    -8.700  
+96 716 50280.00 I   .230519  .000104   .506559  .000117  I  .1701089  .0000062  0.9022 0.0056  I   -36.745     .152    -8.790     .298   .230200   .505200   .1701000   -36.100    -8.600  
+96 717 50281.00 I   .233085  .000110   .503531  .000097  I  .1691727  .0000063  0.9725 0.0048  I   -36.504     .152    -8.636     .298   .232800   .502000   .1691400   -36.200    -8.600  
+96 718 50282.00 I   .235301  .000117   .500701  .000087  I  .1681581  .0000074  1.0603 0.0048  I   -36.580     .152    -8.534     .298   .235000   .499200   .1681300   -36.200    -8.400  
+96 719 50283.00 I   .237275  .000121   .497932  .000086  I  .1670524  .0000073  1.1472 0.0048  I   -36.866     .152    -8.572     .298   .237200   .497000   .1670400   -36.300    -8.400  
+96 720 50284.00 I   .238918  .000102   .495123  .000149  I  .1658696  .0000061  1.2163 0.0054  I   -37.048     .155    -8.664     .298   .239100   .493900   .1658600   -36.500    -8.400  
+96 721 50285.00 I   .240184  .000110   .492260  .000180  I  .1646247  .0000079  1.2707 0.0047  I   -36.970     .456    -8.684     .134   .240000   .490700   .1645800   -36.700    -8.500  
+96 722 50286.00 I   .241314  .000111   .489368  .000202  I  .1633338  .0000072  1.3085 0.0047  I   -36.881     .468    -8.648     .148   .241100   .487900   .1632900   -36.900    -8.500  
+96 723 50287.00 I   .242591  .000086   .486495  .000169  I  .1620133  .0000051  1.3296 0.0044  I   -37.183     .468    -8.681     .148   .242800   .484800   .1620200   -37.200    -8.700  
+96 724 50288.00 I   .244009  .000084   .483674  .000170  I  .1606780  .0000049  1.3405 0.0037  I   -37.914     .406    -8.810     .130   .244000   .482100   .1606700   -37.500    -8.900  
+96 725 50289.00 I   .245469  .000087   .480888  .000191  I  .1593401  .0000053  1.3279 0.0036  I   -38.712     .406    -8.841     .130   .245000   .479800   .1593400   -37.800    -9.000  
+96 726 50290.00 I   .247079  .000090   .478037  .000195  I  .1580361  .0000054  1.2735 0.0037  I   -39.162     .406    -8.761     .130   .246800   .476700   .1580200   -38.100    -9.200  
+96 727 50291.00 I   .248835  .000088   .475059  .000168  I  .1567921  .0000053  1.2222 0.0040  I   -39.230     .139    -8.752     .298   .248700   .473500   .1567500   -38.200    -9.300  
+96 728 50292.00 I   .250734  .000066   .472110  .000160  I  .1555719  .0000059  1.2304 0.0038  I   -39.206     .791    -8.875     .298   .250700   .470400   .1555600   -38.500    -9.300  
+96 729 50293.00 I   .252661  .000068   .469292  .000148  I  .1543073  .0000054  1.3107 0.0050  I   -39.316     .791    -8.994     .298   .252700   .467600   .1542900   -38.700    -9.200  
+96 730 50294.00 I   .254453  .000072   .466543  .000190  I  .1529305  .0000080  1.4510 0.0052  I   -39.543     .791    -8.940     .298   .254300   .465200   .1529300   -38.900    -9.000  
+96 731 50295.00 I   .256087  .000063   .463725  .000180  I  .1513964  .0000089  1.6182 0.0071  I   -39.717     .791    -8.754     .298   .255900   .462600   .1513900   -39.200    -8.800  
+96 8 1 50296.00 I   .257649  .000058   .460694  .000139  I  .1497082  .0000117  1.7433 0.0075  I   -39.727     .791    -8.625     .298   .257700   .459300   .1496800   -39.500    -8.700  
+96 8 2 50297.00 I   .259242  .000055   .457382  .000130  I  .1479439  .0000121  1.7662 0.0083  I   -39.698     .791    -8.628     .298   .259000   .456300   .1479100   -39.800    -8.400  
+96 8 3 50298.00 I   .260754  .000066   .453772  .000118  I  .1462136  .0000118  1.6758 0.0142  I   -39.895     .791    -8.631     .298   .260500   .452800   .1461800   -40.100    -8.400  
+96 8 4 50299.00 I   .262152  .000057   .449899  .000094  I  .1446201  .0000258  1.5020 0.0127  I   -40.375     .791    -8.529     .298   .262200   .448300   .1445800   -40.300    -8.300  
+96 8 5 50300.00 I   .263615  .000070   .445865  .000177  I  .1432182  .0000225  1.3024 0.0186  I   -40.820     .397    -8.427     .298   .263600   .444600   .1432100   -40.300    -8.300  
+96 8 6 50301.00 I   .265323  .000090   .441767  .000171  I  .1420121  .0000268  1.1126 0.0185  I   -40.895     .405    -8.496     .298   .265100   .440500   .1420100   -40.300    -8.400  
+96 8 7 50302.00 I   .267376  .000103   .437702  .000177  I  .1409883  .0000293  0.9371 0.0204  I   -40.729     .405    -8.727     .298   .267100   .436500   .1410100   -40.300    -8.400  
+96 8 8 50303.00 I   .269796  .000111   .433842  .000176  I  .1401274  .0000308  0.7933 0.0215  I   -40.798     .405    -8.954     .298   .269400   .432600   .1401400   -40.400    -8.600  
+96 8 9 50304.00 I   .272298  .000105   .430200  .000197  I  .1393817  .0000314  0.7096 0.0204  I   -41.176     .405    -9.030     .298   .272200   .429000   .1394400   -40.600    -8.800  
+96 810 50305.00 I   .274464  .000112   .426635  .000172  I  .1386936  .0000267  0.6697 0.0222  I   -41.526     .405    -9.004     .298   .274400   .425200   .1386800   -40.700    -8.800  
+96 811 50306.00 I   .276292  .000104   .423082  .000163  I  .1380287  .0000314  0.6707 0.0171  I   -41.524     .294    -8.971     .298   .276000   .421400   .1379900   -40.800    -8.900  
+96 812 50307.00 I   .278048  .000114   .419545  .000113  I  .1373368  .0000215  0.7178 0.0178  I   -41.175     .791    -8.898     .298   .277800   .418000   .1372800   -40.800    -8.800  
+96 813 50308.00 I   .279980  .000102   .416016  .000103  I  .1365864  .0000168  0.7850 0.0129  I   -40.735     .791    -8.723     .298   .279900   .414800   .1365800   -40.600    -8.800  
+96 814 50309.00 I   .282112  .000117   .412506  .000110  I  .1357628  .0000142  0.8642 0.0107  I   -40.421     .791    -8.510     .298   .282000   .411200   .1357600   -40.100    -8.700  
+96 815 50310.00 I   .284194  .000105   .409021  .000089  I  .1348547  .0000133  0.9535 0.0091  I   -40.320     .791    -8.397     .298   .283900   .407800   .1348200   -39.600    -8.500  
+96 816 50311.00 I   .285973  .000100   .405504  .000084  I  .1338546  .0000115  1.0465 0.0078  I   -40.398     .791    -8.468     .298   .286100   .404200   .1338600   -39.400    -8.400  
+96 817 50312.00 I   .287390  .000103   .401913  .000088  I  .1327661  .0000083  1.1262 0.0072  I   -40.518     .791    -8.647     .298   .287200   .400700   .1327800   -39.400    -8.400  
+96 818 50313.00 I   .288667  .000072   .398273  .000095  I  .1316146  .0000085  1.1688 0.0056  I   -40.537     .791    -8.782     .298   .288100   .396900   .1315700   -39.400    -8.400  
+96 819 50314.00 I   .290024  .000078   .394658  .000078  I  .1304407  .0000074  1.1749 0.0054  I   -40.479     .791    -8.808     .298   .289900   .393200   .1304000   -39.500    -8.400  
+96 820 50315.00 I   .291404  .000066   .391108  .000078  I  .1292722  .0000066  1.1588 0.0058  I   -40.559     .791    -8.782     .298   .291000   .389900   .1292800   -39.800    -8.500  
+96 821 50316.00 I   .292692  .000065   .387592  .000071  I  .1281259  .0000089  1.1341 0.0064  I   -40.933     .791    -8.773     .298   .292200   .386400   .1281100   -40.100    -8.700  
+96 822 50317.00 I   .293933  .000065   .384110  .000067  I  .1270006  .0000109  1.1194 0.0071  I   -41.481     .791    -8.794     .298   .293900   .382600   .1269900   -40.200    -8.800  
+96 823 50318.00 I   .295088  .000063   .380662  .000085  I  .1258849  .0000111  1.1111 0.0084  I   -41.919     .791    -8.842     .298   .294800   .379300   .1258700   -40.300    -9.000  
+96 824 50319.00 I   .296087  .000096   .377192  .000122  I  .1247746  .0000128  1.1140 0.0121  I   -42.099     .791    -8.937     .298   .295600   .376000   .1247200   -40.500    -9.100  
+96 825 50320.00 I   .296841  .000105   .373579  .000148  I  .1236414  .0000215  1.1633 0.0098  I   -42.109     .767    -9.062     .298   .296700   .372300   .1235900   -40.700    -9.200  
+96 826 50321.00 I   .297290  .000157   .369723  .000144  I  .1224278  .0000148  1.2731 0.0126  I   -42.127     .661    -9.102     .298   .297100   .368300   .1224000   -41.000    -9.100  
+96 827 50322.00 I   .297493  .000158   .365659  .000148  I  .1210837  .0000131  1.4173 0.0092  I   -42.204     .575    -8.971     .298   .297000   .364100   .1210700   -41.300    -9.100  
+96 828 50323.00 I   .297670  .000164   .361446  .000146  I  .1195813  .0000110  1.5972 0.0092  I   -42.215     .575    -8.755     .298   .297300   .360100   .1195700   -41.600    -8.900  
+96 829 50324.00 I   .298033  .000165   .357036  .000140  I  .1178957  .0000130  1.7578 0.0084  I   -42.082     .575    -8.621     .298   .297900   .355700   .1179000   -41.900    -8.700  
+96 830 50325.00 I   .298180  .000167   .352481  .000139  I  .1160999  .0000128  1.8157 0.0086  I   -41.825     .575    -8.648     .298   .297700   .351500   .1161200   -42.100    -8.500  
+96 831 50326.00 I   .297996  .000153   .347920  .000095  I  .1142992  .0000114  1.7689 0.0083  I   -41.710     .269    -8.670     .298   .297500   .346700   .1143200   -42.200    -8.300  
+96 9 1 50327.00 I   .297595  .000102   .343439  .000088  I  .1125912  .0000107  1.6347 0.0072  I   -41.977     .143    -8.489     .298   .297200   .342200   .1126200   -42.200    -8.100  
+96 9 2 50328.00 I   .297111  .000110   .339045  .000075  I  .1110459  .0000089  1.4523 0.0068  I   -42.430     .277    -8.184     .298   .296800   .337900   .1111500   -42.200    -8.000  
+96 9 3 50329.00 I   .296552  .000117   .334745  .000077  I  .1096902  .0000083  1.2592 0.0056  I   -42.608     .234    -8.023     .298   .296500   .333200   .1098300   -42.100    -8.100  
+96 9 4 50330.00 I   .295960  .000112   .330523  .000078  I  .1085160  .0000067  1.1007 0.0053  I   -42.366     .305    -8.154     .152   .295700   .329200   .1085500   -42.000    -8.100  
+96 9 5 50331.00 I   .295473  .000114   .326376  .000077  I  .1074717  .0000067  0.9935 0.0041  I   -42.104     .279    -8.470     .146   .295100   .325300   .1073800   -41.700    -8.300  
+96 9 6 50332.00 I   .294897  .000109   .322302  .000078  I  .1065122  .0000048  0.9367 0.0042  I   -42.107     .279    -8.807     .146   .294600   .321100   .1064600   -41.700    -8.500  
+96 9 7 50333.00 I   .294281  .000118   .318273  .000083  I  .1055830  .0000051  0.9258 0.0042  I   -42.159     .299    -8.926     .163   .294000   .316900   .1055800   -41.700    -8.600  
+96 9 8 50334.00 I   .293581  .000101   .314370  .000080  I  .1046463  .0000068  0.9578 0.0047  I   -42.023     .248    -8.902     .163   .293300   .313300   .1046500   -41.600    -8.800  
+96 9 9 50335.00 I   .292918  .000102   .310562  .000082  I  .1036476  .0000079  1.0491 0.0062  I   -41.746     .243    -8.853     .140   .292600   .309500   .1036700   -41.600    -8.700  
+96 910 50336.00 I   .292468  .000093   .306814  .000071  I  .1025295  .0000103  1.1963 0.0094  I   -41.537     .791    -8.756     .298   .292200   .305500   .1025400   -41.600    -8.700  
+96 911 50337.00 I   .292078  .000087   .303180  .000065  I  .1012360  .0000170  1.4005 0.0096  I   -41.497     .791    -8.620     .298   .291700   .302000   .1012300   -41.700    -8.600  
+96 912 50338.00 I   .291441  .000082   .299621  .000075  I  .0997288  .0000162  1.6039 0.0115  I   -41.534     .791    -8.506     .298   .291100   .298400   .0997500   -41.700    -8.400  
+96 913 50339.00 I   .290440  .000076   .295973  .000076  I  .0980515  .0000154  1.7374 0.0094  I   -41.571     .791    -8.430     .298   .290200   .294600   .0980600   -41.800    -8.300  
+96 914 50340.00 I   .289166  .000060   .292145  .000096  I  .0962769  .0000094  1.8023 0.0085  I   -41.639     .791    -8.378     .298   .288800   .291300   .0962500   -41.900    -8.200  
+96 915 50341.00 I   .287719  .000074   .288083  .000095  I  .0944635  .0000074  1.8175 0.0053  I   -41.718     .791    -8.343     .298   .287500   .287200   .0944700   -41.900    -8.200  
+96 916 50342.00 I   .286237  .000072   .283819  .000095  I  .0926574  .0000048  1.7863 0.0042  I   -41.709     .791    -8.328     .298   .286000   .282600   .0927000   -41.800    -8.200  
+96 917 50343.00 I   .284921  .000075   .279497  .000105  I  .0909065  .0000038  1.7084 0.0029  I   -41.606     .791    -8.354     .298   .284000   .278100   .0908900   -41.800    -8.200  
+96 918 50344.00 I   .283911  .000076   .275292  .000097  I  .0892429  .0000033  1.6237 0.0028  I   -41.559     .791    -8.432     .298   .283300   .274100   .0892200   -41.600    -8.400  
+96 919 50345.00 I   .283203  .000081   .271200  .000093  I  .0876477  .0000042  1.5732 0.0026  I   -41.688     .791    -8.488     .298   .282900   .270000   .0876400   -41.200    -8.500  
+96 920 50346.00 I   .282657  .000078   .267301  .000096  I  .0860787  .0000039  1.5759 0.0031  I   -41.923     .791    -8.491     .298   .282500   .266000   .0860000   -41.000    -8.500  
+96 921 50347.00 I   .282139  .000071   .263790  .000096  I  .0844801  .0000045  1.6258 0.0040  I   -42.120     .122    -8.456     .298   .281900   .262400   .0844400   -40.700    -8.600  
+96 922 50348.00 I   .281419  .000060   .260549  .000110  I  .0828080  .0000069  1.7330 0.0040  I   -42.210     .129    -8.452     .298   .281100   .259300   .0828300   -40.700    -8.500  
+96 923 50349.00 I   .280372  .000066   .257324  .000102  I  .0809917  .0000066  1.9075 0.0052  I   -42.221     .139    -8.439     .298   .280100   .256600   .0810400   -40.700    -8.500  
+96 924 50350.00 I   .278936  .000060   .253900  .000086  I  .0789841  .0000077  2.1086 0.0060  I   -42.204     .161    -8.344     .298   .278500   .253000   .0790100   -41.000    -8.400  
+96 925 50351.00 I   .277230  .000067   .250239  .000094  I  .0767836  .0000101  2.2825 0.0064  I   -42.146     .191    -8.206     .298   .276800   .249000   .0767800   -41.300    -8.200  
+96 926 50352.00 I   .275516  .000087   .246473  .000150  I  .0744490  .0000102  2.3668 0.0069  I   -42.005     .191    -8.075     .298   .275400   .245200   .0744500   -41.700    -8.100  
+96 927 50353.00 I   .273808  .000091   .242655  .000150  I  .0720875  .0000095  2.3387 0.0060  I   -41.738     .152    -8.036     .298   .273500   .241500   .0720500   -42.100    -7.900  
+96 928 50354.00 I   .272150  .000094   .238863  .000154  I  .0698002  .0000064  2.2247 0.0058  I   -41.488     .152    -8.011     .298   .271400   .237300   .0697300   -42.300    -7.700  
+96 929 50355.00 I   .270516  .000093   .235209  .000170  I  .0676504  .0000068  2.0738 0.0044  I   -41.480     .791    -7.819     .115   .269700   .233500   .0676500   -42.300    -7.600  
+96 930 50356.00 I   .268914  .000103   .231685  .000142  I  .0656491  .0000059  1.9333 0.0040  I   -41.709     .173    -7.466     .101   .268400   .230500   .0656900   -42.200    -7.400  
+9610 1 50357.00 I   .267380  .000095   .228141  .000148  I  .0637705  .0000043  1.8328 0.0036  I   -41.890     .285    -7.213     .298   .266800   .227100   .0638000   -41.900    -7.400  
+9610 2 50358.00 I   .265754  .000082   .224491  .000134  I  .0619873  .0000041  1.7209 0.0031  I   -41.789     .250    -7.323     .298   .265200   .223300   .0619900   -41.500    -7.500  
+9610 3 50359.00 I   .263829  .000079   .220650  .000110  I  .0603299  .0000044  1.6054 0.0030  I   -41.471     .247    -7.677     .298   .263400   .219300   .0603100   -41.000    -7.600  
+9610 4 50360.00 I   .261799  .000074   .216746  .000105  I  .0587553  .0000043  1.5537 0.0032  I   -41.054     .247    -8.029     .298   .261400   .215700   .0587300   -40.700    -7.800  
+9610 5 50361.00 I   .259851  .000093   .213089  .000101  I  .0572015  .0000047  1.5651 0.0032  I   -40.668     .276    -8.307     .298   .259500   .212000   .0571500   -40.300    -8.100  
+9610 6 50362.00 I   .257961  .000070   .209664  .000114  I  .0556113  .0000048  1.6178 0.0035  I   -40.416     .249    -8.470     .298   .257600   .208500   .0555600   -40.000    -8.300  
+9610 7 50363.00 I   .256087  .000067   .206436  .000116  I  .0539591  .0000053  1.6910 0.0038  I   -40.347     .131    -8.503     .298   .255700   .205200   .0539600   -39.900    -8.400  
+9610 8 50364.00 I   .254144  .000068   .203440  .000088  I  .0522227  .0000058  1.7840 0.0048  I   -40.475     .125    -8.431     .298   .253800   .202300   .0522300   -39.900    -8.300  
+9610 9 50365.00 I   .252026  .000068   .200631  .000093  I  .0503866  .0000080  1.8904 0.0050  I   -40.692     .791    -8.256     .298   .251600   .199400   .0503900   -40.100    -8.200  
+961010 50366.00 I   .249757  .000067   .197861  .000089  I  .0484432  .0000081  1.9928 0.0054  I   -40.814     .791    -7.997     .298   .249400   .196800   .0484400   -40.300    -8.000  
+961011 50367.00 I   .247358  .000077   .194971  .000084  I  .0464105  .0000074  2.0668 0.0047  I   -40.798     .791    -7.678     .298   .246900   .193900   .0463800   -40.500    -7.800  
+961012 50368.00 I   .244908  .000068   .191925  .000084  I  .0443206  .0000048  2.1079 0.0046  I   -40.751     .791    -7.368     .298   .244400   .190700   .0443200   -40.500    -7.500  
+961013 50369.00 I   .242479  .000074   .188831  .000085  I  .0422045  .0000056  2.1196 0.0034  I   -40.738     .791    -7.164     .298   .242000   .187700   .0422100   -40.500    -7.300  
+961014 50370.00 I   .239981  .000080   .185792  .000080  I  .0400921  .0000047  2.0990 0.0034  I   -40.669     .180    -7.141     .298   .239500   .184700   .0401100   -40.400    -7.200  
+961015 50371.00 I   .237451  .000084   .182854  .000086  I  .0380178  .0000039  2.0444 0.0030  I   -40.444     .188    -7.256     .298   .236900   .181500   .0380400   -40.200    -7.100  
+961016 50372.00 I   .235135  .000084   .180027  .000084  I  .0360083  .0000037  1.9747 0.0029  I   -40.135     .216    -7.379     .298   .234600   .178800   .0360100   -39.800    -7.100  
+961017 50373.00 I   .232875  .000088   .177326  .000086  I  .0340670  .0000044  1.9090 0.0030  I   -39.988     .193    -7.476     .298   .232300   .176200   .0340600   -39.400    -7.200  
+961018 50374.00 I   .230420  .000093   .174678  .000087  I  .0321772  .0000046  1.8826 0.0038  I   -40.099     .193    -7.516     .298   .230000   .173400   .0321500   -39.100    -7.300  
+961019 50375.00 I   .227845  .000088   .172031  .000109  I  .0302706  .0000062  1.9499 0.0043  I   -40.282     .207    -7.501     .298   .227500   .170800   .0302700   -38.900    -7.400  
+961020 50376.00 I   .225250  .000099   .169455  .000113  I  .0282566  .0000073  2.0797 0.0056  I   -40.347     .191    -7.413     .298   .224900   .168300   .0283100   -38.800    -7.300  
+961021 50377.00 I   .222714  .000104   .166943  .000105  I  .0261129  .0000094  2.2044 0.0070  I   -40.237     .180    -7.237     .298   .222200   .165600   .0261100   -38.700    -7.300  
+961022 50378.00 I   .220149  .000108   .164399  .000106  I  .0238554  .0000120  2.3063 0.0091  I   -40.009     .128    -7.016     .298   .219700   .163000   .0238100   -38.800    -7.200  
+961023 50379.00 I   .217347  .000119   .161682  .000118  I  .0215014  .0000155  2.4050 0.0106  I   -39.770     .155    -6.840     .298   .217100   .160500   .0215000   -39.000    -6.900  
+961024 50380.00 I   .214308  .000116   .158809  .000111  I  .0190585  .0000175  2.4645 0.0113  I   -39.617     .155    -6.724     .298   .213900   .157900   .0190400   -39.100    -6.700  
+961025 50381.00 I   .211321  .000120   .155815  .000110  I  .0166062  .0000164  2.4228 0.0117  I   -39.515     .155    -6.738     .298   .210900   .154600   .0165600   -39.300    -6.500  
+961026 50382.00 I   .208747  .000111   .152758  .000096  I  .0142398  .0000154  2.3005 0.0122  I   -39.402     .154    -6.863     .298   .208300   .151400   .0142000   -39.400    -6.400  
+961027 50383.00 I   .206648  .000096   .149723  .000113  I  .0120193  .0000181  2.1361 0.0091  I   -39.287     .791    -6.935     .298   .206100   .148400   .0119700   -39.500    -6.300  
+961028 50384.00 I   .204727  .000077   .146782  .000151  I  .0099692  .0000096  1.9670 0.0106  I   -39.198     .791    -6.828     .298   .204300   .145500   .0099500   -39.300    -6.300  
+961029 50385.00 I   .202616  .000079   .143945  .000153  I  .0080787  .0000112  1.8177 0.0066  I   -39.110     .791    -6.614     .298   .202100   .142900   .0080900   -39.000    -6.400  
+961030 50386.00 I   .200095  .000059   .141147  .000163  I  .0063248  .0000090  1.6953 0.0074  I   -38.940     .791    -6.509     .298   .199500   .139900   .0063400   -38.600    -6.500  
+961031 50387.00 I   .197246  .000058   .138301  .000162  I  .0046700  .0000096  1.6272 0.0066  I   -38.613     .791    -6.647     .298   .197100   .137000   .0046300   -38.200    -6.600  
+9611 1 50388.00 I   .194360  .000064   .135259  .000165  I  .0030512  .0000096  1.6166 0.0064  I   -38.142     .791    -6.945     .298   .194300   .134100   .0030100   -37.700    -6.700  
+9611 2 50389.00 I   .191481  .000054   .132248  .000148  I  .0014209  .0000086  1.6535 0.0065  I   -37.631     .791    -7.213     .298   .191000   .130900   .0014500   -37.300    -6.800  
+9611 3 50390.00 I   .188491  .000062   .129471  .000149  I -.0002731  .0000087  1.7422 0.0055  I   -37.232     .791    -7.315     .130   .188200   .128200  -.0002500   -37.000    -7.000  
+9611 4 50391.00 I   .185317  .000109   .126988  .000090  I -.0020740  .0000068  1.8625 0.0054  I   -37.058     .791    -7.226     .106   .185100   .125800  -.0021100   -36.800    -7.100  
+9611 5 50392.00 I   .181928  .000106   .124826  .000082  I -.0040039  .0000063  2.0003 0.0043  I   -37.116     .277    -7.019     .298   .181500   .123400  -.0040700   -36.700    -7.000  
+9611 6 50393.00 I   .178262  .000102   .122939  .000131  I -.0060643  .0000053  2.1074 0.0041  I   -37.305     .294    -6.899     .298   .177700   .121700  -.0060700   -36.800    -7.000  
+9611 7 50394.00 I   .174164  .000103   .121176  .000133  I -.0082014  .0000054  2.1626 0.0035  I   -37.469     .273    -6.823     .298   .173600   .120000  -.0081500   -36.900    -7.000  
+9611 8 50395.00 I   .170037  .000105   .119377  .000142  I -.0103803  .0000046  2.1900 0.0036  I   -37.495     .299    -6.638     .298   .169500   .118000  -.0104100   -37.000    -6.900  
+9611 9 50396.00 I   .166197  .000103   .117456  .000151  I -.0125639  .0000048  2.1648 0.0032  I   -37.514     .327    -6.265     .298   .165800   .116000  -.0126300   -37.100    -6.800  
+961110 50397.00 I   .162466  .000078   .115589  .000163  I -.0146986  .0000045  2.1056 0.0031  I   -37.607     .376    -5.870     .298   .162100   .114300  -.0147400   -37.200    -6.700  
+961111 50398.00 I   .158663  .000099   .113955  .000160  I -.0167781  .0000040  2.0555 0.0030  I   -37.670     .328    -5.722     .126   .158200   .112600  -.0168200   -37.100    -6.700  
+961112 50399.00 I   .154633  .000103   .112544  .000165  I -.0188187  .0000039  2.0328 0.0029  I   -37.586     .319    -5.928     .120   .154300   .111200  -.0188400   -37.000    -6.700  
+961113 50400.00 I   .150422  .000133   .111200  .000162  I -.0208427  .0000042  2.0071 0.0032  I   -37.337     .329    -6.343     .120   .150200   .109900  -.0208200   -36.800    -6.600  
+961114 50401.00 I   .146079  .000131   .109862  .000152  I -.0228148  .0000051  1.9270 0.0033  I   -37.116     .294    -6.538     .108   .145700   .108800  -.0228400   -36.600    -6.600  
+961115 50402.00 I   .141568  .000135   .108374  .000150  I -.0246957  .0000052  1.8437 0.0039  I   -37.000     .294    -6.398     .108   .141500   .107300  -.0247200   -36.300    -6.500  
+961116 50403.00 I   .137457  .000152   .106632  .000152  I -.0265370  .0000058  1.8646 0.0043  I   -37.006     .271    -6.100     .298   .137400   .105400  -.0264900   -36.200    -6.400  
+961117 50404.00 I   .134081  .000153   .104805  .000166  I -.0284527  .0000068  1.9688 0.0046  I   -37.069     .219    -5.847     .298   .133700   .103500  -.0284100   -36.200    -6.100  
+961118 50405.00 I   .131054  .000146   .103105  .000195  I -.0304736  .0000072  2.0698 0.0047  I   -37.076     .203    -5.711     .298   .130800   .101900  -.0304600   -36.300    -6.000  
+961119 50406.00 I   .128026  .000130   .101643  .000190  I -.0325821  .0000066  2.1400 0.0047  I   -37.013     .179    -5.659     .298   .127800   .100400  -.0325900   -36.500    -5.800  
+961120 50407.00 I   .125019  .000101   .100437  .000173  I -.0347399  .0000060  2.1689 0.0046  I   -36.968     .343    -5.653     .167   .124600   .099200  -.0347400   -36.700    -5.600  
+961121 50408.00 I   .122162  .000095   .099507  .000171  I -.0369011  .0000065  2.1414 0.0043  I   -37.042     .343    -5.707     .167   .121700   .098300  -.0369000   -36.900    -5.400  
+961122 50409.00 I   .119269  .000090   .098733  .000172  I -.0390000  .0000062  2.0456 0.0047  I   -37.352     .343    -5.838     .167   .118800   .097400  -.0390000   -37.000    -5.300  
+961123 50410.00 I   .116042  .000090   .097932  .000158  I -.0409795  .0000067  1.9112 0.0046  I   -37.890     .343    -6.207     .167   .115600   .096900  -.0409600   -37.000    -5.200  
+961124 50411.00 I   .112575  .000075   .097007  .000143  I -.0428249  .0000067  1.7844 0.0043  I   -38.389    1.034    -6.721     .328   .112100   .096000  -.0427700   -36.800    -5.300  
+961125 50412.00 I   .108895  .000065   .096055  .000124  I -.0445572  .0000055  1.6845 0.0045  I   -38.547    1.319    -7.006     .393   .108500   .094800  -.0444900   -36.400    -5.300  
+961126 50413.00 I   .105076  .000056   .095273  .000104  I -.0462060  .0000059  1.6209 0.0035  I   -38.213    1.575    -6.785     .452   .104700   .094000  -.0461600   -35.900    -5.300  
+961127 50414.00 I   .101293  .000054   .094701  .000094  I -.0478085  .0000044  1.5857 0.0038  I   -37.349    1.575    -6.024     .452   .100900   .093400  -.0478000   -35.400    -5.400  
+961128 50415.00 I   .097465  .000062   .094238  .000094  I -.0493838  .0000049  1.5698 0.0030  I   -36.506    1.575    -5.425     .452   .097000   .093200  -.0493900   -34.800    -5.500  
+961129 50416.00 I   .093540  .000069   .093769  .000087  I -.0509576  .0000042  1.5826 0.0033  I   -35.843    1.575    -5.250     .452   .093000   .092800  -.0509700   -34.300    -5.700  
+961130 50417.00 I   .089593  .000068   .093199  .000087  I -.0525574  .0000043  1.6207 0.0038  I   -35.312    1.423    -5.330     .411   .089100   .092000  -.0525600   -34.000    -5.800  
+9612 1 50418.00 I   .085827  .000073   .092517  .000111  I -.0542025  .0000064  1.6692 0.0041  I   -35.002     .404    -5.499     .298   .085800   .091500  -.0541800   -33.700    -5.900  
+9612 2 50419.00 I   .082281  .000112   .091772  .000131  I -.0558923  .0000069  1.7071 0.0053  I   -34.933     .499    -5.663     .133   .082300   .090600  -.0558700   -33.700    -6.000  
+9612 3 50420.00 I   .078743  .000120   .091073  .000145  I -.0576114  .0000085  1.7289 0.0053  I   -34.965     .499    -5.790     .133   .078300   .089700  -.0576100   -33.800    -6.000  
+9612 4 50421.00 I   .074984  .000110   .090512  .000155  I -.0593535  .0000080  1.7607 0.0058  I   -34.992     .459    -5.849     .123   .074600   .089400  -.0593300   -34.000    -6.000  
+9612 5 50422.00 I   .070877  .000107   .089989  .000148  I -.0611357  .0000079  1.8011 0.0054  I   -35.211     .459    -5.693     .123   .070700   .089000  -.0611100   -34.400    -6.000  
+9612 6 50423.00 I   .066593  .000114   .089367  .000150  I -.0629445  .0000073  1.8077 0.0063  I   -35.635     .459    -5.341     .123   .066600   .088100  -.0629300   -34.700    -5.900  
+9612 7 50424.00 I   .062411  .000125   .088604  .000183  I -.0647376  .0000097  1.7738 0.0053  I   -35.977     .484    -4.941     .143   .062400   .087300  -.0647300   -35.100    -5.800  
+9612 8 50425.00 I   .058416  .000100   .087729  .000146  I -.0664852  .0000077  1.7194 0.0056  I   -36.008     .281    -4.632     .298   .058100   .086500  -.0664800   -35.300    -5.700  
+9612 9 50426.00 I   .054504  .000107   .086825  .000109  I -.0681764  .0000056  1.6651 0.0046  I   -35.762     .230    -4.574     .298   .054200   .085500  -.0681700   -35.300    -5.700  
+961210 50427.00 I   .050574  .000087   .085999  .000107  I -.0698227  .0000052  1.6326 0.0041  I   -35.447     .109    -4.849     .298   .050200   .084500  -.0697800   -35.200    -5.600  
+961211 50428.00 I   .046689  .000087   .085384  .000136  I -.0714549  .0000061  1.6400 0.0042  I   -35.251     .109    -5.289     .298   .046200   .084100  -.0714300   -35.000    -5.500  
+961212 50429.00 I   .043010  .000072   .085082  .000135  I -.0731165  .0000067  1.6888 0.0046  I   -35.188     .109    -5.548     .298   .042500   .084000  -.0731400   -34.700    -5.500  
+961213 50430.00 I   .039688  .000075   .085081  .000133  I -.0748463  .0000069  1.7791 0.0047  I   -35.216     .109    -5.447     .298   .039400   .083000  -.0748400   -34.500    -5.400  
+961214 50431.00 I   .036684  .000072   .085362  .000110  I -.0766865  .0000065  1.9048 0.0081  I   -35.316     .791    -5.104     .298   .036500   .083600  -.0766400   -34.300    -5.300  
+961215 50432.00 I   .033789  .000075   .085870  .000136  I -.0786548  .0000147  2.0272 0.0056  I   -35.447     .791    -4.768     .298   .033500   .084600  -.0786500   -34.300    -5.100  
+961216 50433.00 I   .030822  .000083   .086510  .000124  I -.0807293  .0000090  2.1149 0.0086  I   -35.548     .791    -4.590     .298   .030700   .085300  -.0807400   -34.400    -5.000  
+961217 50434.00 I   .027731  .000068   .087197  .000091  I -.0828705  .0000089  2.1602 0.0064  I   -35.597     .791    -4.559     .298   .027600   .085900  -.0828800   -34.700    -4.900  
+961218 50435.00 I   .024552  .000067   .087895  .000080  I -.0850383  .0000091  2.1711 0.0064  I   -35.631     .791    -4.607     .298   .024300   .086600  -.0850300   -35.100    -4.800  
+961219 50436.00 I   .021384  .000063   .088618  .000083  I -.0871961  .0000092  2.1322 0.0066  I   -35.708     .791    -4.704     .298   .020900   .087200  -.0871800   -35.500    -4.700  
+961220 50437.00 I   .018204  .000063   .089314  .000083  I -.0892816  .0000096  2.0299 0.0066  I   -35.843     .791    -4.837     .298   .017800   .088000  -.0892900   -35.900    -4.700  
+961221 50438.00 I   .015098  .000069   .089938  .000077  I -.0912487  .0000095  1.9060 0.0086  I   -35.975     .791    -4.973     .298   .014900   .088500  -.0912500   -36.200    -4.600  
+961222 50439.00 I   .012264  .000074   .090507  .000088  I -.0931030  .0000143  1.8104 0.0083  I   -35.988     .791    -5.054     .298   .012000   .089100  -.0930700   -36.300    -4.700  
+961223 50440.00 I   .009778  .000072   .091040  .000090  I -.0948805  .0000137  1.7477 0.0093  I   -35.829     .791    -5.042     .298   .009400   .089700  -.0948400   -36.100    -4.700  
+961224 50441.00 I   .007387  .000072   .091534  .000117  I -.0966031  .0000118  1.6989 0.0090  I   -35.594     .791    -4.967     .298   .007100   .090300  -.0965900   -35.800    -4.800  
+961225 50442.00 I   .004683  .000088   .091983  .000124  I -.0982859  .0000117  1.6728 0.0076  I   -35.436     .791    -4.904     .298   .004500   .090800  -.0982600   -35.400    -4.800  
+961226 50443.00 I   .001482  .000082   .092365  .000119  I -.0999606  .0000096  1.6825 0.0074  I   -35.367     .791    -4.907     .298   .001200   .091300  -.0999300   -34.900    -4.900  
+961227 50444.00 I  -.002138  .000090   .092697  .000124  I -.1016613  .0000089  1.7234 0.0082  I   -35.263     .791    -4.967     .298  -.002300   .091500  -.1016500   -34.400    -4.900  
+961228 50445.00 I  -.006054  .000136   .093050  .000178  I -.1034141  .0000134  1.7844 0.0073  I   -35.073     .791    -5.038     .298  -.006000   .091700  -.1034200   -34.100    -4.800  
+961229 50446.00 I  -.010233  .000136   .093503  .000167  I -.1052325  .0000116  1.8527 0.0090  I   -34.891     .791    -5.087     .298  -.010500   .092100  -.1052300   -33.900    -4.900  
+961230 50447.00 I  -.014631  .000130   .094090  .000157  I -.1071181  .0000119  1.9167 0.0094  I   -34.767     .791    -5.091     .298  -.014800   .092900  -.1071000   -33.900    -5.000  
+961231 50448.00 I  -.019065  .000142   .094720  .000174  I -.1090616  .0000148  1.9677 0.0100  I   -34.607     .791    -5.044     .298  -.019400   .093700  -.1090300   -34.000    -5.000  
+97 1 1 50449.00 I  -.023125  .000146   .095292  .000182  I -.1110467  .0000160  1.9984 0.0113  I   -34.381     .791    -4.984     .298  -.023120   .095270  -.1110260   -34.400    -5.000  
+97 1 2 50450.00 I  -.026846  .000142   .095921  .000187  I -.1130512  .0000172  2.0075 0.0115  I   -34.279     .791    -4.977     .298  -.026650   .095730  -.1129910   -34.600    -4.900  
+97 1 3 50451.00 I  -.030356  .000162   .096804  .000162  I -.1150536  .0000165  1.9923 0.0133  I   -34.450     .791    -5.015     .298  -.030320   .096580  -.1150660   -34.900    -4.900  
+97 1 4 50452.00 I  -.033659  .000118   .098009  .000196  I -.1170274  .0000202  1.9518 0.0125  I   -34.718     .791    -4.984     .298  -.033580   .097740  -.1170900   -35.100    -5.000  
+97 1 5 50453.00 I  -.036894  .000155   .099459  .000190  I -.1189536  .0000187  1.9006 0.0112  I   -34.770     .791    -4.808     .298  -.036610   .099330  -.1189530   -35.100    -5.000  
+97 1 6 50454.00 I  -.040341  .000118   .100969  .000158  I -.1208302  .0000095  1.8544 0.0101  I   -34.580     .149    -4.610     .298  -.040400   .100800  -.1208340   -35.000    -5.000  
+97 1 7 50455.00 I  -.043963  .000104   .102347  .000140  I -.1226704  .0000074  1.8324 0.0061  I   -34.425     .133    -4.619     .298  -.044180   .102110  -.1226990   -34.800    -5.000  
+97 1 8 50456.00 I  -.047384  .000102   .103560  .000133  I -.1245101  .0000075  1.8557 0.0054  I   -34.505     .133    -4.870     .298  -.047410   .103440  -.1245240   -34.500    -4.900  
+97 1 9 50457.00 I  -.050363  .000099   .104719  .000127  I -.1263955  .0000080  1.9202 0.0055  I   -34.731     .133    -5.121     .298  -.050390   .104490  -.1264190   -34.300    -4.900  
+97 110 50458.00 I  -.053191  .000093   .105897  .000096  I -.1283614  .0000081  2.0173 0.0060  I   -34.874     .133    -5.094     .298  -.053080   .105700  -.1283790   -34.100    -4.700  
+97 111 50459.00 I  -.056069  .000096   .107078  .000093  I -.1304323  .0000090  2.1208 0.0055  I   -34.878     .133    -4.806     .298  -.055890   .106970  -.1304310   -33.900    -4.600  
+97 112 50460.00 I  -.058933  .000100   .108271  .000094  I -.1325930  .0000073  2.1942 0.0070  I   -34.848     .114    -4.504     .298  -.058900   .108160  -.1326170   -34.000    -4.600  
+97 113 50461.00 I  -.061619  .000116   .109534  .000101  I -.1348093  .0000107  2.2333 0.0061  I   -34.887     .791    -4.366     .298  -.061840   .109360  -.1347970   -34.200    -4.400  
+97 114 50462.00 I  -.063963  .000119   .110918  .000107  I -.1370449  .0000098  2.2282 0.0074  I   -35.030     .791    -4.371     .298  -.063990   .110710  -.1370150   -34.700    -4.500  
+97 115 50463.00 I  -.066046  .000156   .112506  .000139  I -.1392469  .0000103  2.1668 0.0071  I   -35.228     .791    -4.443     .298  -.065980   .112380  -.1392600   -35.100    -4.500  
+97 116 50464.00 I  -.068034  .000125   .114400  .000139  I -.1413615  .0000104  2.0543 0.0070  I   -35.360     .791    -4.572     .298  -.068080   .114440  -.1413620   -35.500    -4.500  
+97 117 50465.00 I  -.069960  .000132   .116470  .000138  I -.1433426  .0000094  1.9031 0.0071  I   -35.345     .791    -4.767     .298  -.069680   .115950  -.1433430   -35.900    -4.600  
+97 118 50466.00 I  -.071941  .000130   .118545  .000136  I -.1451623  .0000096  1.7359 0.0067  I   -35.228     .791    -4.960     .298  -.071350   .117780  -.1451910   -36.000    -4.600  
+97 119 50467.00 I  -.074152  .000130   .120610  .000244  I -.1468202  .0000095  1.5863 0.0059  I   -35.108     .791    -5.052     .298  -.074030   .120500  -.1468210   -36.000    -4.800  
+97 120 50468.00 I  -.076773  .000166   .122686  .000205  I -.1483487  .0000068  1.4781 0.0055  I   -35.019     .223    -5.031     .298  -.076670   .122510  -.1483560   -35.700    -4.900  
+97 121 50469.00 I  -.079660  .000171   .124753  .000176  I -.1497922  .0000055  1.4171 0.0043  I   -34.944     .216    -4.987     .298  -.079820   .124740  -.1498140   -35.400    -4.900  
+97 122 50470.00 I  -.082335  .000166   .126769  .000179  I -.1512048  .0000052  1.4217 0.0039  I   -34.909     .216    -5.005     .298  -.082480   .126830  -.1512110   -34.800    -5.000  
+97 123 50471.00 I  -.084929  .000156   .128732  .000181  I -.1526485  .0000054  1.4650 0.0036  I   -34.952     .216    -5.080     .298  -.084950   .128440  -.1526570   -34.300    -5.000  
+97 124 50472.00 I  -.087687  .000162   .130552  .000187  I -.1541269  .0000051  1.4847 0.0043  I   -34.969     .216    -5.153     .298  -.087820   .130140  -.1541470   -33.800    -5.100  
+97 125 50473.00 I  -.090542  .000161   .132279  .000096  I -.1556175  .0000066  1.5031 0.0043  I   -34.899     .216    -5.216     .298  -.090550   .132210  -.1556260   -33.400    -5.100  
+97 126 50474.00 I  -.093642  .000141   .133992  .000107  I -.1571430  .0000070  1.5513 0.0057  I   -34.808     .209    -5.307     .298  -.093280   .134020  -.1571430   -33.300    -5.200  
+97 127 50475.00 I  -.096798  .000113   .135756  .000122  I -.1587242  .0000093  1.6119 0.0051  I   -34.755     .189    -5.425     .298  -.096530   .135560  -.1586830   -33.400    -5.300  
+97 128 50476.00 I  -.099828  .000118   .137597  .000122  I -.1603627  .0000073  1.6602 0.0062  I   -34.704     .189    -5.513     .298  -.099770   .137440  -.1603380   -33.700    -5.400  
+97 129 50477.00 I  -.102756  .000123   .139487  .000119  I -.1620217  .0000082  1.6399 0.0056  I   -34.655     .189    -5.554     .298  -.102820   .139450  -.1620400   -34.100    -5.500  
+97 130 50478.00 I  -.105545  .000111   .141428  .000117  I -.1636253  .0000085  1.5680 0.0055  I   -34.763     .189    -5.622     .298  -.105760   .141240  -.1636150   -34.700    -5.600  
+97 131 50479.00 I  -.108317  .000105   .143490  .000121  I -.1651635  .0000072  1.5136 0.0054  I   -35.132     .189    -5.764     .298  -.108290   .143260  -.1651560   -35.300    -5.600  
+97 2 1 50480.00 I  -.111349  .000102   .145610  .000116  I -.1666459  .0000067  1.4394 0.0048  I   -35.556     .189    -5.875     .298  -.111150   .145580  -.1666790   -35.800    -5.700  
+97 2 2 50481.00 I  -.114391  .000113   .147746  .000155  I -.1680324  .0000065  1.3356 0.0046  I   -35.706     .791    -5.791     .298  -.114590   .147850  -.1680380   -36.100    -5.700  
+97 2 3 50482.00 I  -.117215  .000107   .149884  .000140  I -.1693291  .0000062  1.2680 0.0046  I   -35.581     .791    -5.537     .298  -.117340   .149870  -.1693300   -36.200    -5.700  
+97 2 4 50483.00 I  -.119869  .000110   .152077  .000176  I -.1705907  .0000065  1.2675 0.0043  I   -35.525     .791    -5.360     .298  -.119820   .151850  -.1705910   -36.200    -5.600  
+97 2 5 50484.00 I  -.122471  .000109   .154427  .000179  I -.1718955  .0000061  1.3612 0.0049  I   -35.763     .791    -5.423     .298  -.122580   .154440  -.1718900   -36.000    -5.500  
+97 2 6 50485.00 I  -.124786  .000109   .156838  .000172  I -.1733379  .0000073  1.5294 0.0048  I   -36.095     .791    -5.534     .298  -.124840   .156950  -.1733440   -35.700    -5.400  
+97 2 7 50486.00 I  -.126743  .000113   .159259  .000180  I -.1749635  .0000075  1.7251 0.0072  I   -36.191     .791    -5.494     .298  -.126880   .159370  -.1749570   -35.400    -5.200  
+97 2 8 50487.00 I  -.128511  .000105   .161777  .000137  I -.1767825  .0000125  1.9039 0.0060  I   -35.962     .791    -5.348     .298  -.128590   .161690  -.1767640   -35.100    -5.200  
+97 2 9 50488.00 I  -.130350  .000069   .164433  .000142  I -.1787477  .0000093  2.0120 0.0074  I   -35.581     .138    -5.255     .298  -.130260   .164120  -.1787810   -35.000    -5.100  
+97 210 50489.00 I  -.132250  .000067   .167200  .000123  I -.1807865  .0000081  2.0603 0.0061  I   -35.311     .109    -5.312     .298  -.132220   .167330  -.1807960   -35.000    -5.100  
+97 211 50490.00 I  -.134165  .000084   .170000  .000171  I -.1828595  .0000078  2.0824 0.0054  I   -35.302     .148    -5.428     .298  -.134060   .170390  -.1828460   -35.200    -5.200  
+97 212 50491.00 I  -.136191  .000085   .172752  .000174  I -.1849226  .0000070  2.0184 0.0057  I   -35.471     .148    -5.471     .298  -.136190   .172770  -.1849320   -35.600    -5.300  
+97 213 50492.00 I  -.138295  .000075   .175444  .000183  I -.1868678  .0000084  1.8689 0.0056  I   -35.584     .148    -5.462     .298  -.138400   .175240  -.1868910   -35.900    -5.400  
+97 214 50493.00 I  -.140379  .000071   .178160  .000181  I -.1886653  .0000087  1.7342 0.0060  I   -35.487     .148    -5.565     .298  -.140490   .178200  -.1886420   -36.100    -5.600  
+97 215 50494.00 I  -.142530  .000067   .180941  .000181  I -.1903477  .0000085  1.6342 0.0083  I   -35.305     .139    -5.819     .298  -.142460   .181110  -.1903170   -36.300    -5.700  
+97 216 50495.00 I  -.144884  .000101   .183697  .000184  I -.1919402  .0000141  1.5538 0.0071  I   -35.287     .226    -6.058     .298  -.144880   .183840  -.1919650   -36.400    -5.800  
+97 217 50496.00 I  -.147478  .000102   .186326  .000174  I -.1934698  .0000113  1.5171 0.0085  I   -35.505     .155    -6.179     .298  -.147590   .186540  -.1934630   -36.300    -6.000  
+97 218 50497.00 I  -.150122  .000101   .188791  .000102  I -.1949925  .0000096  1.5349 0.0067  I   -35.739     .155    -6.232     .298  -.150110   .188740  -.1949620   -36.000    -6.100  
+97 219 50498.00 I  -.152594  .000105   .191120  .000090  I -.1965482  .0000073  1.5785 0.0060  I   -35.750     .123    -6.277     .298  -.152560   .191020  -.1965500   -35.600    -6.200  
+97 220 50499.00 I  -.154965  .000116   .193390  .000078  I -.1981573  .0000072  1.6453 0.0049  I   -35.525     .123    -6.279     .298  -.155120   .193450  -.1981660   -35.200    -6.200  
+97 221 50500.00 I  -.157097  .000134   .195697  .000078  I -.1998452  .0000065  1.7311 0.0048  I   -35.228     .123    -6.218     .298  -.157190   .195650  -.1998380   -34.800    -6.300  
+97 222 50501.00 I  -.158915  .000124   .198140  .000088  I -.2016223  .0000062  1.8254 0.0056  I   -34.977     .123    -6.173     .298  -.158970   .197900  -.2016180   -34.500    -6.400  
+97 223 50502.00 I  -.160453  .000083   .200800  .000118  I -.2034968  .0000090  1.9221 0.0054  I   -34.788     .791    -6.245     .298  -.160360   .200690  -.2034930   -34.300    -6.400  
+97 224 50503.00 I  -.161818  .000148   .203733  .000118  I -.2054597  .0000089  1.9982 0.0067  I   -34.681     .791    -6.450     .298  -.161690   .203580  -.2054440   -34.300    -6.500  
+97 225 50504.00 I  -.163299  .000153   .206941  .000124  I -.2074795  .0000100  2.0331 0.0067  I   -34.661     .791    -6.689     .298  -.163220   .206860  -.2074620   -34.400    -6.700  
+97 226 50505.00 I  -.165215  .000153   .210308  .000136  I -.2095110  .0000101  2.0232 0.0073  I   -34.711     .791    -6.868     .298  -.165150   .210200  -.2095060   -34.600    -6.800  
+97 227 50506.00 I  -.167652  .000151   .213624  .000136  I -.2115238  .0000105  2.0070 0.0071  I   -34.862     .791    -7.007     .298  -.167740   .213480  -.2115180   -34.900    -6.900  
+97 228 50507.00 I  -.170138  .000162   .216857  .000122  I -.2135309  .0000101  2.0085 0.0073  I   -35.126     .791    -7.176     .298  -.170330   .216900  -.2135090   -35.000    -7.000  
+97 3 1 50508.00 I  -.172256  .000163   .220043  .000110  I -.2155422  .0000102  2.0143 0.0075  I   -35.357     .791    -7.340     .298  -.172380   .219970  -.2155140   -35.200    -7.200  
+97 3 2 50509.00 I  -.173879  .000105   .223231  .000067  I -.2175595  .0000110  2.0202 0.0064  I   -35.337     .791    -7.364     .298  -.173970   .223050  -.2175420   -35.100    -7.300  
+97 3 3 50510.00 I  -.174995  .000091   .226453  .000089  I -.2195849  .0000076  2.0331 0.0065  I   -35.080     .791    -7.214     .298  -.175070   .226410  -.2195720   -35.100    -7.200  
+97 3 4 50511.00 I  -.175740  .000099   .229709  .000083  I -.2216355  .0000068  2.0753 0.0048  I   -34.900     .791    -7.053     .298  -.175650   .229730  -.2216320   -34.800    -7.200  
+97 3 5 50512.00 I  -.176415  .000096   .232987  .000080  I -.2237518  .0000059  2.1662 0.0055  I   -35.052     .791    -7.057     .298  -.176420   .232950  -.2237540   -34.600    -7.100  
+97 3 6 50513.00 I  -.177300  .000079   .236295  .000083  I -.2259897  .0000086  2.3223 0.0051  I   -35.424     .791    -7.189     .298  -.177190   .236190  -.2259670   -34.400    -7.000  
+97 3 7 50514.00 I  -.178558  .000073   .239568  .000090  I -.2284127  .0000084  2.5272 0.0063  I   -35.676     .791    -7.254     .298  -.178250   .239750  -.2283680   -34.300    -6.800  
+97 3 8 50515.00 I  -.180253  .000078   .242757  .000087  I -.2310411  .0000091  2.7230 0.0064  I   -35.608     .791    -7.179     .298  -.180110   .242900  -.2310240   -34.200    -6.700  
+97 3 9 50516.00 I  -.182213  .000109   .245858  .000072  I -.2338346  .0000097  2.8466 0.0058  I   -35.322     .791    -7.099     .298  -.182130   .245820  -.2338510   -34.300    -6.700  
+97 310 50517.00 I  -.184152  .000128   .248905  .000135  I -.2367006  .0000071  2.8693 0.0059  I   -35.098     .103    -7.134     .298  -.184210   .248920  -.2366890   -34.600    -6.800  
+97 311 50518.00 I  -.185660  .000126   .251986  .000127  I -.2395438  .0000068  2.8040 0.0043  I   -35.175     .103    -7.215     .298  -.185880   .251900  -.2395060   -34.800    -6.900  
+97 312 50519.00 I  -.186433  .000131   .255167  .000121  I -.2422867  .0000047  2.6730 0.0045  I   -35.526     .103    -7.215     .298  -.186520   .255110  -.2422750   -35.100    -7.100  
+97 313 50520.00 I  -.186654  .000150   .258479  .000124  I -.2448840  .0000058  2.5247 0.0034  I   -35.821     .103    -7.181     .298  -.186640   .258650  -.2449000   -35.400    -7.300  
+97 314 50521.00 I  -.186547  .000147   .262016  .000128  I -.2473473  .0000050  2.4100 0.0039  I   -35.740     .103    -7.281     .298  -.186430   .261920  -.2473450   -35.700    -7.600  
+97 315 50522.00 I  -.186532  .000144   .265890  .000134  I -.2497212  .0000051  2.3468 0.0061  I   -35.356     .103    -7.561     .298  -.186230   .265770  -.2496900   -35.800    -7.800  
+97 316 50523.00 I  -.186927  .000126   .270001  .000109  I -.2520565  .0000111  2.3304 0.0043  I   -35.063     .791    -7.881     .298  -.186860   .270210  -.2520300   -35.800    -8.000  
+97 317 50524.00 I  -.187669  .000129   .274026  .000103  I -.2543915  .0000070  2.3424 0.0064  I   -35.074     .791    -8.085     .298  -.187830   .274290  -.2543900   -35.600    -8.100  
+97 318 50525.00 I  -.188374  .000175   .277782  .000095  I -.2567473  .0000064  2.3724 0.0048  I   -35.173     .791    -8.150     .298  -.188480   .277770  -.2567630   -35.400    -8.100  
+97 319 50526.00 I  -.188751  .000173   .281365  .000092  I -.2591447  .0000066  2.4278 0.0046  I   -35.067     .791    -8.134     .298  -.188700   .281390  -.2591520   -35.000    -8.000  
+97 320 50527.00 I  -.188948  .000172   .284964  .000075  I -.2615966  .0000065  2.4644 0.0049  I   -34.768     .791    -8.117     .298  -.188980   .285030  -.2615730   -34.600    -7.800  
+97 321 50528.00 I  -.189277  .000165   .288636  .000056  I -.2640664  .0000073  2.4797 0.0047  I   -34.492     .791    -8.026     .298  -.189010   .288660  -.2640260   -34.200    -7.800  
+97 322 50529.00 I  -.189584  .000178   .292340  .000082  I -.2665641  .0000068  2.5191 0.0051  I   -34.366     .791    -7.875     .298  -.189180   .292380  -.2665350   -34.000    -7.700  
+97 323 50530.00 I  -.189715  .000191   .296049  .000073  I -.2691041  .0000070  2.5568 0.0051  I   -34.331     .101    -7.790     .298  -.189770   .296020  -.2691000   -33.800    -7.700  
+97 324 50531.00 I  -.189650  .000163   .299799  .000107  I -.2716708  .0000076  2.5736 0.0050  I   -34.332     .103    -7.831     .298  -.189710   .299790  -.2716640   -33.800    -7.700  
+97 325 50532.00 I  -.189501  .000164   .303650  .000113  I -.2742439  .0000071  2.5680 0.0053  I   -34.402     .103    -7.949     .298  -.189510   .303670  -.2742150   -34.000    -7.800  
+97 326 50533.00 I  -.189576  .000159   .307593  .000127  I -.2767977  .0000073  2.5349 0.0047  I   -34.559     .103    -8.070     .298  -.189610   .307610  -.2767820   -34.200    -8.000  
+97 327 50534.00 I  -.190011  .000151   .311542  .000132  I -.2793072  .0000061  2.4822 0.0048  I   -34.749     .103    -8.162     .298  -.190060   .311790  -.2793000   -34.400    -8.200  
+97 328 50535.00 I  -.190465  .000149   .315430  .000127  I -.2817635  .0000062  2.4336 0.0041  I   -34.921     .124    -8.255     .298  -.190390   .315590  -.2817270   -34.500    -8.300  
+97 329 50536.00 I  -.190817  .000110   .319244  .000137  I -.2841799  .0000055  2.4013 0.0044  I   -35.031     .124    -8.350     .298  -.190700   .319190  -.2841550   -34.700    -8.500  
+97 330 50537.00 I  -.191111  .000083   .322923  .000142  I -.2865724  .0000063  2.3877 0.0038  I   -34.999     .791    -8.398     .298  -.191090   .323120  -.2865830   -34.700    -8.600  
+97 331 50538.00 I  -.191277  .000104   .326401  .000163  I -.2889662  .0000053  2.4069 0.0041  I   -34.783     .791    -8.379     .298  -.191330   .326200  -.2889710   -34.600    -8.600  
+97 4 1 50539.00 I  -.191095  .000120   .329761  .000156  I -.2913990  .0000053  2.4646 0.0037  I   -34.468     .791    -8.361     .298  -.191030   .329370  -.2913530   -34.400    -8.500  
+97 4 2 50540.00 I  -.190396  .000123   .333126  .000160  I -.2939066  .0000052  2.5558 0.0038  I   -34.207     .791    -8.419     .298  -.190470   .333060  -.2938890   -34.200    -8.400  
+97 4 3 50541.00 I  -.189369  .000135   .336798  .000177  I -.2965213  .0000054  2.6789 0.0035  I   -34.058     .791    -8.522     .298  -.189510   .336850  -.2965170   -34.100    -8.300  
+97 4 4 50542.00 I  -.188326  .000135   .340644  .000164  I -.2992707  .0000046  2.8209 0.0037  I   -33.981     .791    -8.529     .298  -.188320   .340750  -.2992520   -34.000    -8.100  
+97 4 5 50543.00 I  -.187324  .000171   .344421  .000165  I -.3021543  .0000051  2.9366 0.0037  I   -33.916     .791    -8.416     .298  -.186950   .344770  -.3021410   -34.000    -8.100  
+97 4 6 50544.00 I  -.186426  .000170   .348044  .000128  I -.3051186  .0000058  2.9763 0.0034  I   -33.866     .791    -8.336     .298  -.186080   .348490  -.3050560   -34.200    -8.200  
+97 4 7 50545.00 I  -.185573  .000167   .351535  .000123  I -.3080759  .0000045  2.9231 0.0037  I   -33.907     .120    -8.419     .110  -.185710   .351620  -.3080380   -34.300    -8.200  
+97 4 8 50546.00 I  -.184596  .000184   .354973  .000117  I -.3109377  .0000046  2.7887 0.0034  I   -34.134     .120    -8.601     .110  -.184670   .355100  -.3109070   -34.600    -8.400  
+97 4 9 50547.00 I  -.183491  .000179   .358473  .000107  I -.3136437  .0000051  2.6256 0.0036  I   -34.522     .120    -8.700     .110  -.183910   .358510  -.3136330   -34.800    -8.500  
+97 410 50548.00 I  -.182447  .000185   .362076  .000103  I -.3161928  .0000056  2.4741 0.0038  I   -34.817     .120    -8.675     .110  -.182710   .362170  -.3162020   -35.000    -8.700  
+97 411 50549.00 I  -.181423  .000179   .365823  .000104  I -.3185995  .0000056  2.3455 0.0042  I   -34.799     .120    -8.670     .110  -.181650   .365730  -.3186020   -35.200    -8.900  
+97 412 50550.00 I  -.180458  .000153   .369697  .000100  I -.3208959  .0000062  2.2531 0.0080  I   -34.553     .109    -8.825     .135  -.180750   .369460  -.3209070   -35.200    -9.100  
+97 413 50551.00 I  -.179741  .000104   .373586  .000106  I -.3231184  .0000150  2.1989 0.0054  I   -34.400     .791    -9.111     .298  -.179540   .373610  -.3231080   -35.200    -9.200  
+97 414 50552.00 I  -.179301  .000071   .377335  .000092  I -.3253059  .0000088  2.1815 0.0083  I   -34.496     .130    -9.379     .298  -.179130   .377460  -.3253080   -35.100    -9.300  
+97 415 50553.00 I  -.178935  .000074   .380843  .000086  I -.3274896  .0000069  2.1887 0.0055  I   -34.605     .139    -9.516     .298  -.179170   .381090  -.3275180   -34.900    -9.300  
+97 416 50554.00 I  -.178449  .000052   .384082  .000085  I -.3296974  .0000065  2.2383 0.0048  I   -34.418     .139    -9.494     .298  -.178510   .384090  -.3297100   -34.700    -9.300  
+97 417 50555.00 I  -.177770  .000058   .387200  .000086  I -.3319711  .0000067  2.3027 0.0045  I   -33.981     .139    -9.320     .298  -.177840   .387160  -.3319570   -34.500    -9.100  
+97 418 50556.00 I  -.176894  .000064   .390339  .000084  I -.3342906  .0000063  2.3307 0.0043  I   -33.660     .139    -9.081     .298  -.177080   .390390  -.3342830   -34.400    -9.000  
+97 419 50557.00 I  -.175898  .000106   .393568  .000075  I -.3366294  .0000055  2.3495 0.0042  I   -33.642     .139    -8.863     .298  -.175800   .393490  -.3366160   -34.100    -8.900  
+97 420 50558.00 I  -.174918  .000117   .396920  .000067  I -.3389891  .0000056  2.3670 0.0043  I   -33.799     .118    -8.727     .298  -.174820   .396880  -.3389690   -34.000    -8.800  
+97 421 50559.00 I  -.174074  .000129   .400408  .000141  I -.3413517  .0000066  2.3495 0.0044  I   -33.964     .791    -8.693     .298  -.173790   .400430  -.3413440   -34.000    -8.700  
+97 422 50560.00 I  -.173393  .000135   .404014  .000143  I -.3436733  .0000069  2.2876 0.0044  I   -34.105     .791    -8.741     .298  -.173130   .404030  -.3436830   -33.800    -8.700  
+97 423 50561.00 I  -.172759  .000132   .407606  .000146  I -.3459204  .0000059  2.2062 0.0046  I   -34.233     .791    -8.856     .298  -.172750   .407590  -.3459270   -33.800    -8.700  
+97 424 50562.00 I  -.171839  .000139   .410966  .000142  I -.3480859  .0000061  2.1254 0.0060  I   -34.323     .791    -9.017     .298  -.172230   .411360  -.3480680   -33.800    -8.900  
+97 425 50563.00 I  -.170499  .000140   .414152  .000134  I -.3501739  .0000105  2.0526 0.0064  I   -34.355     .791    -9.186     .298  -.170760   .414200  -.3501490   -33.800    -9.000  
+97 426 50564.00 I  -.168831  .000107   .417314  .000137  I -.3521945  .0000113  1.9901 0.0097  I   -34.397     .791    -9.300     .298  -.168870   .417240  -.3521830   -33.800    -9.100  
+97 427 50565.00 I  -.167106  .000096   .420468  .000094  I -.3541611  .0000163  1.9485 0.0081  I   -34.519     .791    -9.323     .298  -.167060   .420570  -.3541560   -33.800    -9.200  
+97 428 50566.00 I  -.165634  .000081   .423541  .000096  I -.3561064  .0000117  1.9516 0.0098  I   -34.669     .172    -9.280     .298  -.165470   .423620  -.3560980   -33.900    -9.300  
+97 429 50567.00 I  -.164540  .000088   .426430  .000106  I -.3580823  .0000110  2.0086 0.0081  I   -34.708     .214    -9.228     .298  -.164390   .426550  -.3580740   -34.000    -9.300  
+97 430 50568.00 I  -.163574  .000089   .429110  .000123  I -.3601397  .0000112  2.1139 0.0075  I   -34.556     .214    -9.186     .298  -.163620   .429130  -.3601370   -34.100    -9.200  
+97 5 1 50569.00 I  -.162447  .000089   .431668  .000129  I -.3623133  .0000101  2.2290 0.0077  I   -34.273     .214    -9.110     .298  -.162550   .431430  -.3623130   -34.200    -9.100  
+97 5 2 50570.00 I  -.160959  .000087   .434208  .000131  I -.3645947  .0000106  2.3352 0.0072  I   -33.968     .214    -8.955     .298  -.161010   .434320  -.3645950   -34.400    -9.000  
+97 5 3 50571.00 I  -.158952  .000103   .436863  .000138  I -.3669830  .0000102  2.4391 0.0082  I   -33.815     .204    -8.747     .298  -.159020   .437110  -.3669560   -34.600    -8.900  
+97 5 4 50572.00 I  -.156442  .000109   .439744  .000143  I -.3694605  .0000124  2.5056 0.0085  I   -33.919     .219    -8.616     .298  -.156530   .439490  -.3694140   -34.600    -8.900  
+97 5 5 50573.00 I  -.153614  .000126   .442881  .000121  I -.3719702  .0000136  2.5002 0.0095  I   -34.226     .138    -8.691     .298  -.153640   .442850  -.3719270   -34.700    -8.900  
+97 5 6 50574.00 I  -.150798  .000129   .446180  .000107  I -.3744440  .0000143  2.4443 0.0095  I   -34.595     .138    -8.937     .298  -.150610   .446380  -.3744430   -34.600    -9.000  
+97 5 7 50575.00 I  -.148127  .000122   .449423  .000102  I -.3768402  .0000132  2.3327 0.0096  I   -34.882     .138    -9.159     .298  -.148120   .449590  -.3768500   -34.600    -9.200  
+97 5 8 50576.00 I  -.145405  .000122   .452426  .000094  I -.3790965  .0000129  2.1824 0.0092  I   -34.940     .138    -9.207     .298  -.145420   .452510  -.3790580   -34.500    -9.300  
+97 5 9 50577.00 I  -.142482  .000119   .455307  .000094  I -.3812199  .0000127  2.0768 0.0093  I   -34.779     .138    -9.127     .298  -.142440   .455210  -.3811930   -34.500    -9.500  
+97 510 50578.00 I  -.139426  .000104   .458227  .000094  I -.3832642  .0000134  2.0135 0.0087  I   -34.582     .108    -9.090     .121  -.139410   .458130  -.3832900   -34.600    -9.700  
+97 511 50579.00 I  -.136461  .000055   .461179  .000059  I -.3852533  .0000118  1.9693 0.0071  I   -34.566     .791    -9.201     .298  -.136280   .461250  -.3852540   -34.600    -9.800  
+97 512 50580.00 I  -.133867  .000058   .464047  .000065  I -.3872115  .0000048  1.9511 0.0062  I   -34.773     .791    -9.406     .298  -.133860   .464070  -.3872040   -34.700    -9.800  
+97 513 50581.00 I  -.131687  .000055   .466720  .000053  I -.3891616  .0000040  1.9510 0.0032  I   -35.004     .791    -9.580     .298  -.131640   .466690  -.3891660   -34.800    -9.800  
+97 514 50582.00 I  -.129668  .000054   .469178  .000053  I -.3911154  .0000042  1.9564 0.0034  I   -35.037     .791    -9.646     .298  -.129560   .469170  -.3911180   -34.900    -9.700  
+97 515 50583.00 I  -.127578  .000064   .471457  .000066  I -.3930758  .0000056  1.9659 0.0035  I   -34.869     .791    -9.605     .298  -.127760   .471830  -.3930820   -35.000    -9.500  
+97 516 50584.00 I  -.125217  .000065   .473621  .000072  I -.3950526  .0000056  1.9916 0.0036  I   -34.723     .791    -9.498     .298  -.125190   .473650  -.3950390   -35.000    -9.300  
+97 517 50585.00 I  -.122492  .000065   .475779  .000070  I -.3970639  .0000045  2.0319 0.0040  I   -34.766     .791    -9.369     .298  -.122280   .475780  -.3970140   -35.200    -9.100  
+97 518 50586.00 I  -.119535  .000070   .478059  .000106  I -.3991144  .0000058  2.0661 0.0040  I   -34.977     .791    -9.233     .298  -.119350   .478040  -.3990670   -35.200    -8.900  
+97 519 50587.00 I  -.116559  .000102   .480544  .000135  I -.4011911  .0000066  2.0855 0.0042  I   -35.249     .791    -9.077     .147  -.116500   .480480  -.4011750   -35.400    -8.900  
+97 520 50588.00 I  -.113641  .000104   .483188  .000134  I -.4032818  .0000061  2.0943 0.0041  I   -35.502     .791    -8.914     .147  -.113540   .483140  -.4032990   -35.600    -8.800  
+97 521 50589.00 I  -.110776  .000101   .485865  .000136  I -.4053710  .0000050  2.0769 0.0040  I   -35.680     .791    -8.828     .147  -.110730   .485760  -.4053930   -35.700    -8.800  
+97 522 50590.00 I  -.108256  .000098   .488391  .000130  I -.4074257  .0000052  2.0298 0.0036  I   -35.739     .791    -8.904     .147  -.108270   .488390  -.4074370   -35.900    -9.000  
+97 523 50591.00 I  -.105963  .000097   .490720  .000133  I -.4094314  .0000052  1.9853 0.0048  I   -35.696     .791    -9.106     .147  -.105880   .490770  -.4094310   -36.000    -9.100  
+97 524 50592.00 I  -.103700  .000115   .492983  .000123  I -.4114046  .0000080  1.9658 0.0062  I   -35.675     .791    -9.283     .147  -.103560   .492970  -.4114080   -36.200    -9.100  
+97 525 50593.00 I  -.101447  .000098   .495252  .000136  I -.4133742  .0000112  1.9798 0.0065  I   -35.820     .791    -9.309     .298  -.101400   .495370  -.4133980   -36.300    -9.100  
+97 526 50594.00 I  -.099172  .000097   .497478  .000145  I -.4153798  .0000103  2.0406 0.0076  I   -36.147     .791    -9.202     .298  -.099110   .497570  -.4154060   -36.300    -9.100  
+97 527 50595.00 I  -.096785  .000094   .499650  .000144  I -.4174722  .0000103  2.1520 0.0076  I   -36.494     .791    -9.088     .298  -.096900   .499300  -.4174680   -36.400    -9.000  
+97 528 50596.00 I  -.094267  .000110   .501741  .000136  I -.4196953  .0000112  2.2981 0.0079  I   -36.635     .791    -9.060     .298  -.094180   .501500  -.4197000   -36.400    -8.800  
+97 529 50597.00 I  -.091850  .000123   .503791  .000125  I -.4220672  .0000120  2.4406 0.0078  I   -36.461     .791    -9.109     .298  -.091740   .504070  -.4220830   -36.500    -8.700  
+97 530 50598.00 I  -.089584  .000109   .505799  .000132  I -.4245581  .0000110  2.5279 0.0080  I   -36.098     .791    -9.146     .298  -.089680   .506070  -.4245640   -36.400    -8.500  
+97 531 50599.00 I  -.087350  .000082   .507760  .000100  I -.4270965  .0000106  2.5357 0.0091  I   -35.840     .791    -9.106     .298  -.087270   .507660  -.4271100   -36.500    -8.500  
+97 6 1 50600.00 I  -.085071  .000094   .509688  .000110  I -.4296072  .0000144  2.4765 0.0085  I   -35.945     .791    -9.018     .298  -.084900   .509870  -.4295920   -36.700    -8.400  
+97 6 2 50601.00 I  -.082698  .000126   .511540  .000111  I -.4320282  .0000134  2.3532 0.0097  I   -36.426     .791    -8.965     .118  -.082550   .511740  -.4320310   -36.800    -8.400  
+97 6 3 50602.00 I  -.080141  .000125   .513310  .000102  I -.4342951  .0000131  2.1742 0.0092  I   -37.021     .791    -8.971     .118  -.080290   .513170  -.4342640   -36.900    -8.400  
+97 6 4 50603.00 I  -.077450  .000117   .515008  .000106  I -.4363661  .0000127  1.9635 0.0091  I   -37.381     .791    -8.954     .118  -.077560   .514830  -.4363590   -37.000    -8.600  
+97 6 5 50604.00 I  -.074955  .000129   .516512  .000110  I -.4382224  .0000125  1.7536 0.0089  I   -37.331     .791    -8.885     .118  -.074960   .516480  -.4382470   -36.900    -8.600  
+97 6 6 50605.00 I  -.072662  .000138   .517746  .000111  I -.4398921  .0000125  1.6002 0.0080  I   -37.001     .121    -8.751     .135  -.072650   .517730  -.4398790   -36.800    -8.700  
+97 6 7 50606.00 I  -.070423  .000137   .518722  .000113  I -.4414443  .0000101  1.5113 0.0070  I   -36.680     .121    -8.626     .135  -.070340   .518680  -.4414520   -36.600    -8.800  
+97 6 8 50607.00 I  -.068053  .000133   .519422  .000101  I -.4429291  .0000062  1.4654 0.0056  I   -36.563     .791    -8.615     .298  -.068210   .519640  -.4429350   -36.600    -8.900  
+97 6 9 50608.00 I  -.065268  .000206   .519887  .000104  I -.4443891  .0000047  1.4613 0.0041  I   -36.649     .791    -8.724     .298  -.065500   .520040  -.4443870   -36.500    -8.900  
+97 610 50609.00 I  -.061898  .000192   .520349  .000101  I -.4458636  .0000053  1.4930 0.0043  I   -36.832     .791    -8.869     .298  -.061880   .520140  -.4458620   -36.600    -8.900  
+97 611 50610.00 I  -.058127  .000198   .521097  .000100  I -.4473822  .0000071  1.5460 0.0045  I   -37.022     .791    -8.965     .298  -.058090   .520920  -.4473900   -36.800    -8.800  
+97 612 50611.00 I  -.054367  .000194   .522302  .000102  I -.4489535  .0000073  1.5925 0.0066  I   -37.171     .791    -8.983     .298  -.054330   .522280  -.4489650   -37.100    -8.800  
+97 613 50612.00 I  -.050642  .000188   .523897  .000099  I -.4505582  .0000111  1.6118 0.0083  I   -37.269     .791    -8.943     .298  -.050440   .523870  -.4505490   -37.600    -8.600  
+97 614 50613.00 I  -.046970  .000196   .525560  .000130  I -.4521676  .0000149  1.6024 0.0087  I   -37.401     .791    -8.877     .298  -.046980   .525830  -.4521290   -37.900    -8.500  
+97 615 50614.00 I  -.043365  .000091   .526958  .000122  I -.4537530  .0000133  1.5628 0.0097  I   -37.713     .791    -8.789     .298  -.043510   .527200  -.4537240   -38.300    -8.300  
+97 616 50615.00 I  -.039765  .000164   .528003  .000117  I -.4552828  .0000124  1.4920 0.0090  I   -38.254     .211    -8.660     .298  -.039660   .528020  -.4552880   -38.600    -8.200  
+97 617 50616.00 I  -.036136  .000141   .528829  .000118  I -.4567309  .0000122  1.4028 0.0086  I   -38.847     .211    -8.493     .298  -.036070   .528570  -.4567500   -38.800    -8.200  
+97 618 50617.00 I  -.032476  .000130   .529592  .000112  I -.4580759  .0000119  1.2760 0.0081  I   -39.225     .211    -8.376     .298  -.032510   .529440  -.4580800   -38.900    -8.200  
+97 619 50618.00 I  -.028867  .000131   .530411  .000105  I -.4592748  .0000108  1.1248 0.0082  I   -39.279     .211    -8.393     .298  -.028920   .530430  -.4592590   -38.900    -8.200  
+97 620 50619.00 I  -.025152  .000126   .531246  .000092  I -.4603396  .0000112  1.0159 0.0071  I   -39.131     .211    -8.572     .298  -.025010   .531400  -.4603310   -38.800    -8.300  
+97 621 50620.00 I  -.021281  .000121   .532003  .000070  I -.4613282  .0000092  0.9717 0.0075  I   -38.983     .258    -8.777     .298  -.021080   .532140  -.4613360   -38.700    -8.300  
+97 622 50621.00 I  -.017250  .000072   .532620  .000070  I -.4623065  .0000099  0.9978 0.0059  I   -38.971     .791    -8.793     .298  -.017230   .532690  -.4623090   -38.700    -8.200  
+97 623 50622.00 I  -.013076  .000103   .533105  .000076  I -.4633442  .0000075  1.0850 0.0062  I   -39.142     .791    -8.558     .298  -.012820   .533010  -.4633470   -38.800    -8.200  
+97 624 50623.00 I  -.008959  .000096   .533538  .000073  I -.4644849  .0000076  1.1976 0.0054  I   -39.470     .791    -8.230     .298  -.008700   .533480  -.4644800   -39.000    -8.100  
+97 625 50624.00 I  -.005037  .000089   .533969  .000079  I -.4657361  .0000077  1.3005 0.0054  I   -39.836     .791    -8.028     .298  -.004870   .533880  -.4657440   -39.400    -7.900  
+97 626 50625.00 I  -.001305  .000106   .534422  .000086  I -.4670736  .0000076  1.3666 0.0055  I   -40.063     .791    -8.040     .298  -.001160   .534400  -.4670770   -39.800    -7.800  
+97 627 50626.00 I   .002419  .000096   .534850  .000092  I -.4684479  .0000078  1.3687 0.0056  I   -40.048     .791    -8.189     .298   .002430   .534990  -.4684540   -40.300    -7.800  
+97 628 50627.00 I   .006322  .000094   .535197  .000093  I -.4697869  .0000083  1.2987 0.0057  I   -39.896     .791    -8.344     .298   .006390   .535310  -.4698040   -40.700    -7.800  
+97 629 50628.00 I   .010476  .000105   .535489  .000106  I -.4710285  .0000084  1.1784 0.0061  I   -39.879     .791    -8.442     .298   .010520   .535600  -.4710160   -41.100    -8.000  
+97 630 50629.00 I   .014809  .000151   .535883  .000141  I -.4721332  .0000089  1.0266 0.0061  I   -40.213     .791    -8.514     .193   .014850   .535860  -.4721370   -41.200    -8.100  
+97 7 1 50630.00 I   .019205  .000148   .536419  .000137  I  .5269220  .0000088  0.8635 0.0060  I   -40.843     .791    -8.615     .193   .019150   .536250   .5268940   -41.200    -8.200  
+97 7 2 50631.00 I   .023493  .000143   .536912  .000142  I  .5261374  .0000080  0.7075 0.0060  I   -41.454     .791    -8.756     .193   .023390   .536680   .5261270   -41.200    -8.500  
+97 7 3 50632.00 I   .027452  .000138   .537141  .000140  I  .5254967  .0000083  0.5826 0.0058  I   -41.739     .791    -8.881     .193   .027540   .537280   .5255080   -41.100    -8.600  
+97 7 4 50633.00 I   .031223  .000137   .537076  .000141  I  .5249515  .0000085  0.5200 0.0063  I   -41.681     .791    -8.937     .193   .031140   .536960   .5249520   -41.000    -8.700  
+97 7 5 50634.00 I   .034962  .000149   .536773  .000149  I  .5244340  .0000096  0.5256 0.0070  I   -41.507     .791    -8.914     .193   .034850   .536560   .5244230   -40.900    -8.800  
+97 7 6 50635.00 I   .038689  .000134   .536291  .000078  I  .5238814  .0000111  0.5879 0.0061  I   -41.429     .791    -8.843     .298   .038740   .536120   .5238950   -40.900    -8.400  
+97 7 7 50636.00 I   .042534  .000138   .535696  .000119  I  .5232476  .0000076  0.6822 0.0066  I   -41.502     .328    -8.758     .298   .042370   .535810   .5232340   -41.000    -8.400  
+97 7 8 50637.00 I   .046663  .000142   .535063  .000132  I  .5225157  .0000073  0.7806 0.0053  I   -41.723     .394    -8.697     .298   .046380   .534930   .5224760   -41.300    -8.400  
+97 7 9 50638.00 I   .050873  .000151   .534487  .000141  I  .5216906  .0000073  0.8665 0.0056  I   -42.093     .394    -8.706     .298   .050830   .534450   .5216790   -41.800    -8.500  
+97 710 50639.00 I   .054750  .000149   .534055  .000145  I  .5207857  .0000084  0.9432 0.0054  I   -42.500     .394    -8.795     .298   .054960   .534310   .5207760   -42.300    -8.700  
+97 711 50640.00 I   .058275  .000144   .533596  .000152  I  .5198074  .0000080  1.0101 0.0065  I   -42.623     .394    -8.870     .298   .058500   .533840   .5198110   -42.900    -8.900  
+97 712 50641.00 I   .061703  .000152   .532970  .000144  I  .5187691  .0000099  1.0661 0.0067  I   -42.452     .387    -8.876     .298   .061880   .533060   .5187780   -43.400    -9.000  
+97 713 50642.00 I   .065250  .000140   .532212  .000114  I  .5176801  .0000107  1.1072 0.0067  I   -42.384     .414    -8.829     .298   .065180   .532240   .5176940   -43.700    -9.100  
+97 714 50643.00 I   .068880  .000155   .531426  .000113  I  .5165642  .0000091  1.1197 0.0075  I   -42.759     .288    -8.755     .224   .068750   .531420   .5166260   -44.000    -9.100  
+97 715 50644.00 I   .072463  .000151   .530698  .000105  I  .5154546  .0000104  1.0906 0.0066  I   -43.473     .288    -8.658     .224   .072390   .530670   .5154970   -44.100    -9.000  
+97 716 50645.00 I   .075783  .000151   .530020  .000105  I  .5143902  .0000096  1.0401 0.0071  I   -44.093     .288    -8.558     .224   .075690   .529910   .5143660   -44.000    -8.900  
+97 717 50646.00 I   .078739  .000165   .529321  .000102  I  .5133592  .0000097  1.0352 0.0062  I   -44.273     .288    -8.484     .224   .078780   .529110   .5133850   -43.900    -8.800  
+97 718 50647.00 I   .081527  .000162   .528578  .000106  I  .5122953  .0000079  1.1038 0.0063  I   -44.177     .234    -8.552     .269   .081560   .528620   .5123300   -43.700    -8.700  
+97 719 50648.00 I   .084482  .000141   .527746  .000106  I  .5111334  .0000081  1.2269 0.0093  I   -44.120     .234    -8.742     .269   .084430   .527980   .5111090   -43.600    -8.600  
+97 720 50649.00 I   .087863  .000117   .526792  .000101  I  .5098259  .0000169  1.3969 0.0068  I   -44.182     .791    -8.836     .298   .087470   .526420   .5098570   -43.500    -8.400  
+97 721 50650.00 I   .091630  .000118   .525731  .000126  I  .5083296  .0000110  1.5969 0.0096  I   -44.278     .433    -8.661     .298   .091370   .525420   .5083920   -43.600    -8.100  
+97 722 50651.00 I   .095462  .000129   .524636  .000152  I  .5066364  .0000093  1.7839 0.0072  I   -44.372     .459    -8.299     .298   .095540   .524670   .5066460   -43.800    -8.000  
+97 723 50652.00 I   .099070  .000127   .523593  .000153  I  .5047789  .0000093  1.9195 0.0071  I   -44.489     .459    -7.986     .298   .099300   .523600   .5047620   -44.100    -7.900  
+97 724 50653.00 I   .102369  .000116   .522632  .000144  I  .5028128  .0000108  2.0090 0.0070  I   -44.602     .459    -7.865     .298   .102360   .522590   .5028580   -44.700    -7.900  
+97 725 50654.00 I   .105406  .000111   .521769  .000147  I  .5007884  .0000105  2.0160 0.0075  I   -44.750     .459    -7.940     .298   .105250   .521650   .5008370   -45.100    -8.000  
+97 726 50655.00 I   .108028  .000112   .520860  .000139  I  .4988149  .0000105  1.9208 0.0072  I   -44.868     .459    -8.105     .298   .108100   .520900   .4987890   -45.600    -8.100  
+97 727 50656.00 I   .110314  .000115   .519815  .000128  I  .4969636  .0000099  1.7750 0.0061  I   -44.921     .484    -8.291     .298   .110350   .519920   .4969520   -45.900    -8.400  
+97 728 50657.00 I   .112515  .000114   .518611  .000089  I  .4952704  .0000062  1.6125 0.0062  I   -45.040     .131    -8.493     .170   .112490   .518700   .4952740   -46.000    -8.600  
+97 729 50658.00 I   .114866  .000119   .517276  .000095  I  .4937342  .0000074  1.4633 0.0040  I   -45.376     .131    -8.698     .170   .114770   .517170   .4937570   -45.900    -8.800  
+97 730 50659.00 I   .117460  .000113   .515918  .000093  I  .4923373  .0000050  1.3338 0.0049  I   -45.887     .131    -8.873     .170   .117530   .515740   .4923430   -45.700    -8.900  
+97 731 50660.00 I   .120245  .000108   .514597  .000092  I  .4910524  .0000064  1.2471 0.0041  I   -46.307     .131    -9.000     .170   .120280   .514540   .4910370   -45.400    -9.000  
+97 8 1 50661.00 I   .123226  .000113   .513301  .000116  I  .4898217  .0000064  1.2247 0.0046  I   -46.412     .131    -9.089     .170   .123130   .513310   .4898480   -45.000    -9.000  
+97 8 2 50662.00 I   .126325  .000131   .512004  .000129  I  .4885897  .0000065  1.2422 0.0059  I   -46.220     .131    -9.118     .170   .126390   .512030   .4885980   -44.700    -8.800  
+97 8 3 50663.00 I   .129373  .000118   .510695  .000159  I  .4873339  .0000098  1.2699 0.0050  I   -45.914     .791    -9.024     .298   .129470   .510800   .4872900   -44.600    -8.700  
+97 8 4 50664.00 I   .132300  .000125   .509356  .000172  I  .4860454  .0000077  1.3112 0.0064  I   -45.657     .109    -8.792     .298   .132500   .509470   .4860610   -44.700    -8.600  
+97 8 5 50665.00 I   .135125  .000131   .507996  .000161  I  .4847079  .0000083  1.3632 0.0053  I   -45.547     .109    -8.534     .298   .135210   .508000   .4847340   -45.000    -8.300  
+97 8 6 50666.00 I   .137790  .000141   .506654  .000155  I  .4833214  .0000074  1.4079 0.0056  I   -45.628     .109    -8.427     .298   .137730   .506730   .4833070   -45.300    -8.300  
+97 8 7 50667.00 I   .140168  .000141   .505311  .000147  I  .4818941  .0000074  1.4464 0.0051  I   -45.837     .109    -8.524     .298   .140190   .505620   .4819060   -45.800    -8.400  
+97 8 8 50668.00 I   .142406  .000119   .503863  .000127  I  .4804318  .0000071  1.4752 0.0046  I   -45.947     .109    -8.720     .298   .142330   .503990   .4804660   -46.300    -8.500  
+97 8 9 50669.00 I   .144656  .000098   .502196  .000100  I  .4789539  .0000055  1.4732 0.0063  I   -45.881     .791    -8.870     .298   .144720   .502370   .4789680   -46.600    -8.600  
+97 810 50670.00 I   .146894  .000086   .500298  .000107  I  .4774990  .0000104  1.4303 0.0045  I   -45.936     .791    -8.931     .298   .146900   .500350   .4775170   -46.900    -8.700  
+97 811 50671.00 I   .149084  .000121   .498268  .000164  I  .4761027  .0000071  1.3593 0.0063  I   -46.450     .250    -8.946     .298   .149040   .498160   .4761580   -47.100    -8.600  
+97 812 50672.00 I   .151262  .000122   .496249  .000171  I  .4747824  .0000070  1.2823 0.0051  I   -47.283     .250    -8.912     .298   .151260   .496060   .4748590   -47.200    -8.600  
+97 813 50673.00 I   .153451  .000127   .494316  .000178  I  .4735354  .0000072  1.2132 0.0062  I   -47.883     .250    -8.784     .298   .153290   .494020   .4735610   -47.200    -8.500  
+97 814 50674.00 I   .155554  .000128   .492263  .000186  I  .4723490  .0000102  1.1649 0.0063  I   -47.935     .250    -8.623     .298   .155510   .492230   .4723190   -47.100    -8.400  
+97 815 50675.00 I   .157518  .000128   .490077  .000189  I  .4711881  .0000103  1.1691 0.0071  I   -47.688     .305    -8.592     .298   .157600   .489950   .4711990   -47.200    -8.300  
+97 816 50676.00 I   .159400  .000136   .487885  .000192  I  .4699843  .0000099  1.2526 0.0105  I   -47.577     .305    -8.760     .298   .159390   .487510   .4700320   -47.200    -8.300  
+97 817 50677.00 I   .161219  .000099   .485756  .000141  I  .4686609  .0000184  1.4020 0.0082  I   -47.732     .791    -8.968     .298   .161220   .485780   .4686570   -47.200    -8.300  
+97 818 50678.00 I   .163022  .000114   .483664  .000200  I  .4671734  .0000131  1.5723 0.0106  I   -47.978     .181    -8.989     .298   .162940   .483860   .4671290   -47.400    -8.300  
+97 819 50679.00 I   .164917  .000123   .481520  .000219  I  .4655203  .0000107  1.7308 0.0076  I   -48.167     .185    -8.786     .298   .165070   .481530   .4655210   -47.700    -8.400  
+97 820 50680.00 I   .166942  .000116   .479299  .000206  I  .4637208  .0000078  1.8625 0.0068  I   -48.355     .185    -8.502     .298   .167120   .479130   .4637370   -48.000    -8.500  
+97 821 50681.00 I   .169141  .000117   .476973  .000199  I  .4618231  .0000085  1.9110 0.0057  I   -48.686     .185    -8.226     .298   .169090   .476780   .4617800   -48.300    -8.500  
+97 822 50682.00 I   .171583  .000112   .474577  .000210  I  .4599375  .0000082  1.8436 0.0059  I   -49.146     .185    -8.005     .298   .171650   .474590   .4599200   -48.600    -8.500  
+97 823 50683.00 I   .174167  .000121   .472261  .000220  I  .4581597  .0000082  1.7049 0.0069  I   -49.556     .185    -7.831     .298   .174220   .472300   .4581840   -48.700    -8.500  
+97 824 50684.00 I   .176778  .000119   .470154  .000232  I  .4565369  .0000112  1.5388 0.0089  I   -49.654     .144    -7.781     .298   .176740   .470020   .4564810   -48.600    -8.400  
+97 825 50685.00 I   .179283  .000126   .468296  .000231  I  .4550755  .0000157  1.3926 0.0099  I   -49.313     .113    -7.978     .298   .179480   .468220   .4549860   -48.400    -8.500  
+97 826 50686.00 I   .181563  .000124   .466641  .000233  I  .4537300  .0000164  1.3114 0.0111  I   -48.751     .113    -8.393     .298   .181730   .466700   .4537580   -47.900    -8.500  
+97 827 50687.00 I   .183704  .000117   .465033  .000241  I  .4524304  .0000158  1.2969 0.0111  I   -48.336     .113    -8.850     .298   .183670   .465180   .4524560   -47.400    -8.600  
+97 828 50688.00 I   .185879  .000134   .463308  .000248  I  .4511285  .0000149  1.3054 0.0110  I   -48.213     .113    -9.148     .298   .186040   .463220   .4510470   -46.700    -8.600  
+97 829 50689.00 I   .188047  .000144   .461515  .000245  I  .4498180  .0000152  1.3186 0.0101  I   -48.164     .113    -9.285     .298   .188200   .461540   .4497610   -46.200    -8.700  
+97 830 50690.00 I   .190182  .000149   .459681  .000224  I  .4484854  .0000136  1.3496 0.0096  I   -47.964     .127    -9.314     .298   .190040   .459870   .4484800   -45.700    -8.700  
+97 831 50691.00 I   .192397  .000160   .457851  .000154  I  .4471108  .0000117  1.4047 0.0078  I   -47.662     .791    -9.193     .298   .192810   .457580   .4470950   -45.500    -8.500  
+97 9 1 50692.00 I   .194835  .000174   .456075  .000171  I  .4456687  .0000076  1.4816 0.0070  I   -47.462     .254    -8.877     .298   .195190   .455900   .4456580   -45.500    -8.500  
+97 9 2 50693.00 I   .197512  .000171   .454304  .000189  I  .4441490  .0000077  1.5544 0.0054  I   -47.492     .270    -8.473     .298   .197410   .454390   .4441620   -45.800    -8.400  
+97 9 3 50694.00 I   .200273  .000164   .452464  .000209  I  .4425676  .0000078  1.6042 0.0059  I   -47.751     .270    -8.201     .298   .199960   .452670   .4425770   -46.500    -8.300  
+97 9 4 50695.00 I   .202819  .000142   .450531  .000186  I  .4409528  .0000090  1.6175 0.0058  I   -48.120     .270    -8.192     .298   .202790   .450800   .4409470   -47.100    -8.300  
+97 9 5 50696.00 I   .204834  .000143   .448415  .000196  I  .4393440  .0000086  1.5964 0.0058  I   -48.315     .270    -8.349     .298   .204910   .448760   .4393220   -47.900    -8.200  
+97 9 6 50697.00 I   .206425  .000166   .446053  .000203  I  .4377641  .0000074  1.5628 0.0057  I   -48.217     .270    -8.481     .298   .206370   .446300   .4377530   -48.500    -8.300  
+97 9 7 50698.00 I   .207950  .000174   .443508  .000201  I  .4362179  .0000074  1.5308 0.0048  I   -48.043     .285    -8.514     .298   .207950   .443560   .4362150   -49.000    -8.200  
+97 9 8 50699.00 I   .209613  .000162   .440941  .000193  I  .4347090  .0000060  1.4795 0.0048  I   -48.124     .483    -8.512     .298   .209570   .440850   .4347020   -49.200    -8.200  
+97 9 9 50700.00 I   .211333  .000170   .438467  .000190  I  .4332717  .0000060  1.3899 0.0041  I   -48.493     .483    -8.521     .298   .211080   .438240   .4332700   -49.200    -8.400  
+97 910 50701.00 I   .212799  .000167   .435949  .000193  I  .4319120  .0000057  1.3521 0.0045  I   -48.809     .483    -8.492     .298   .212530   .435910   .4319150   -48.900    -8.400  
+97 911 50702.00 I   .214129  .000165   .433249  .000189  I  .4305354  .0000068  1.4108 0.0044  I   -48.779     .483    -8.397     .298   .213980   .433250   .4305350   -48.500    -8.400  
+97 912 50703.00 I   .215443  .000153   .430595  .000177  I  .4290757  .0000068  1.5137 0.0053  I   -48.508     .483    -8.319     .298   .215450   .430440   .4290670   -48.000    -8.400  
+97 913 50704.00 I   .216636  .000129   .428209  .000196  I  .4274979  .0000082  1.6470 0.0090  I   -48.333     .396    -8.347     .298   .216880   .428020   .4275020   -47.600    -8.300  
+97 914 50705.00 I   .217447  .000131   .426056  .000196  I  .4257653  .0000167  1.8295 0.0084  I   -48.407     .791    -8.418     .298   .217650   .426110   .4257870   -47.300    -8.300  
+97 915 50706.00 I   .217825  .000126   .423914  .000238  I  .4238243  .0000146  2.0557 0.0106  I   -48.587     .791    -8.382     .298   .218030   .424210   .4238360   -47.200    -8.100  
+97 916 50707.00 I   .217939  .000126   .421578  .000230  I  .4216578  .0000130  2.2703 0.0089  I   -48.653     .791    -8.215     .298   .218030   .421720   .4216490   -47.300    -8.000  
+97 917 50708.00 I   .218042  .000125   .419053  .000230  I  .4193071  .0000103  2.4149 0.0090  I   -48.544     .791    -8.038     .298   .217980   .419020   .4192990   -47.600    -8.000  
+97 918 50709.00 I   .218405  .000133   .416554  .000223  I  .4168661  .0000124  2.4454 0.0081  I   -48.435     .791    -7.928     .298   .218320   .416550   .4168570   -48.000    -7.900  
+97 919 50710.00 I   .219060  .000129   .414120  .000198  I  .4144571  .0000126  2.3536 0.0086  I   -48.570     .791    -7.763     .298   .219070   .414120   .4144540   -48.300    -7.900  
+97 920 50711.00 I   .219824  .000096   .411705  .000193  I  .4121859  .0000119  2.1809 0.0080  I   -48.985     .791    -7.455     .298   .219840   .411700   .4122050   -48.500    -7.900  
+97 921 50712.00 I   .220552  .000104   .409271  .000134  I  .4100988  .0000100  1.9976 0.0070  I   -49.361     .791    -7.175     .298   .220580   .409270   .4101310   -48.600    -7.900  
+97 922 50713.00 I   .221159  .000144   .406759  .000213  I  .4081784  .0000074  1.8512 0.0066  I   -49.293     .235    -7.201     .298   .221230   .406690   .4081940   -48.500    -8.100  
+97 923 50714.00 I   .221544  .000146   .404116  .000221  I  .4063782  .0000087  1.7595 0.0053  I   -48.763     .235    -7.580     .298   .221670   .403970   .4063660   -48.200    -8.100  
+97 924 50715.00 I   .221639  .000140   .401267  .000227  I  .4046411  .0000076  1.7227 0.0058  I   -48.192     .235    -8.065     .298   .221680   .400980   .4046340   -47.700    -8.100  
+97 925 50716.00 I   .221427  .000141   .398075  .000233  I  .4029151  .0000078  1.7389 0.0054  I   -47.921     .235    -8.404     .298   .221290   .397770   .4029280   -47.200    -8.200  
+97 926 50717.00 I   .221148  .000144   .394691  .000238  I  .4011444  .0000076  1.8119 0.0065  I   -47.835     .235    -8.550     .298   .221180   .394520   .4011560   -46.700    -8.100  
+97 927 50718.00 I   .220967  .000146   .391340  .000234  I  .3992871  .0000104  1.8975 0.0108  I   -47.628     .235    -8.589     .298   .220850   .391110   .3992790   -46.300    -8.000  
+97 928 50719.00 I   .220896  .000092   .388141  .000257  I  .3973575  .0000203  1.9588 0.0101  I   -47.248     .791    -8.553     .298   .220760   .387900   .3973340   -46.100    -7.900  
+97 929 50720.00 I   .220936  .000073   .385125  .000253  I  .3953779  .0000174  1.9950 0.0139  I   -46.903     .791    -8.401     .298   .220990   .385200   .3953510   -46.100    -7.800  
+97 930 50721.00 I   .221029  .000117   .382236  .000255  I  .3933771  .0000189  2.0023 0.0127  I   -46.737     .791    -8.154     .298   .221110   .382080   .3933600   -46.300    -7.700  
+9710 1 50722.00 I   .221183  .000102   .379339  .000249  I  .3913652  .0000184  2.0337 0.0124  I   -46.719     .791    -7.924     .298   .221130   .379260   .3913550   -46.500    -7.700  
+9710 2 50723.00 I   .221438  .000101   .376317  .000250  I  .3893063  .0000162  2.0751 0.0110  I   -46.774     .791    -7.794     .298   .221440   .376660   .3893070   -47.000    -7.600  
+9710 3 50724.00 I   .221678  .000109   .373215  .000250  I  .3872347  .0000122  2.0574 0.0096  I   -46.842     .791    -7.740     .298   .221760   .373380   .3872330   -47.400    -7.600  
+9710 4 50725.00 I   .221852  .000108   .370134  .000229  I  .3852065  .0000103  1.9948 0.0088  I   -46.861     .791    -7.668     .298   .221910   .370090   .3852180   -47.600    -7.600  
+9710 5 50726.00 I   .222066  .000119   .367211  .000128  I  .3832492  .0000126  1.9198 0.0072  I   -46.822     .154    -7.544     .298   .222050   .367100   .3832650   -47.700    -7.700  
+9710 6 50727.00 I   .222328  .000137   .364524  .000163  I  .3813624  .0000100  1.8583 0.0080  I   -46.825     .262    -7.430     .298   .222270   .364270   .3813700   -47.600    -7.600  
+9710 7 50728.00 I   .222531  .000105   .362045  .000157  I  .3795218  .0000097  1.8292 0.0073  I   -46.942     .262    -7.398     .298   .222490   .361950   .3795040   -47.400    -7.600  
+9710 8 50729.00 I   .222583  .000122   .359663  .000155  I  .3776878  .0000105  1.8486 0.0078  I   -47.072     .262    -7.443     .298   .222450   .359630   .3776800   -47.000    -7.500  
+9710 9 50730.00 I   .222463  .000134   .357334  .000156  I  .3758081  .0000121  1.9175 0.0082  I   -47.075     .262    -7.459     .298   .222590   .357400   .3758620   -46.700    -7.400  
+971010 50731.00 I   .222364  .000146   .354973  .000158  I  .3738415  .0000127  2.0202 0.0082  I   -46.915     .262    -7.420     .298   .222250   .355160   .3739320   -46.300    -7.200  
+971011 50732.00 I   .222546  .000146   .352483  .000161  I  .3717573  .0000112  2.1539 0.0098  I   -46.705     .302    -7.356     .298   .222270   .352650   .3718190   -46.100    -6.900  
+971012 50733.00 I   .223066  .000141   .349874  .000130  I  .3695248  .0000150  2.3141 0.0087  I   -46.585     .791    -7.242     .298   .223130   .349980   .3695390   -45.900    -6.800  
+971013 50734.00 I   .223742  .000163   .347247  .000161  I  .3671319  .0000133  2.4658 0.0099  I   -46.587     .791    -7.041     .298   .224030   .347190   .3671270   -46.100    -6.700  
+971014 50735.00 I   .224350  .000149   .344654  .000155  I  .3646101  .0000129  2.5668 0.0084  I   -46.630     .791    -6.818     .298   .224420   .344320   .3646070   -46.400    -6.600  
+971015 50736.00 I   .224829  .000146   .342047  .000165  I  .3620202  .0000102  2.6020 0.0084  I   -46.608     .791    -6.732     .298   .224770   .341830   .3620180   -46.700    -6.700  
+971016 50737.00 I   .225233  .000116   .339341  .000149  I  .3594312  .0000107  2.5619 0.0071  I   -46.513     .791    -6.824     .298   .225390   .339510   .3594170   -47.200    -6.700  
+971017 50738.00 I   .225513  .000127   .336514  .000151  I  .3569238  .0000099  2.4395 0.0065  I   -46.494     .791    -6.907     .298   .225690   .336490   .3568930   -47.400    -6.900  
+971018 50739.00 I   .225723  .000153   .333587  .000161  I  .3545707  .0000074  2.2617 0.0058  I   -46.687     .791    -6.789     .298   .225510   .333780   .3545530   -47.600    -7.000  
+971019 50740.00 I   .226071  .000166   .330617  .000142  I  .3524006  .0000061  2.0834 0.0056  I   -46.951     .139    -6.552     .298   .225840   .330710   .3524200   -47.500    -7.000  
+971020 50741.00 I   .226734  .000169   .327713  .000135  I  .3503925  .0000084  1.9394 0.0052  I   -46.924     .245    -6.497     .298   .226660   .327500   .3504260   -47.200    -7.200  
+971021 50742.00 I   .227583  .000172   .324971  .000135  I  .3485072  .0000083  1.8391 0.0057  I   -46.449     .245    -6.781     .298   .227620   .324710   .3485250   -46.700    -7.200  
+971022 50743.00 I   .228135  .000168   .322377  .000130  I  .3467023  .0000078  1.7747 0.0058  I   -45.796     .245    -7.228     .298   .228130   .322290   .3467090   -46.000    -7.100  
+971023 50744.00 I   .228073  .000160   .319805  .000131  I  .3449452  .0000081  1.7482 0.0058  I   -45.361     .245    -7.559     .298   .227930   .319980   .3449410   -45.300    -7.000  
+971024 50745.00 I   .227639  .000155   .317177  .000124  I  .3431894  .0000085  1.7711 0.0061  I   -45.163     .245    -7.637     .298   .227590   .317140   .3431750   -44.600    -6.900  
+971025 50746.00 I   .227015  .000136   .314451  .000099  I  .3413928  .0000091  1.8246 0.0066  I   -44.955     .283    -7.529     .298   .227000   .314360   .3413770   -44.100    -6.800  
+971026 50747.00 I   .226260  .000090   .311590  .000078  I  .3395366  .0000101  1.8888 0.0054  I   -44.661     .791    -7.347     .298   .226170   .311650   .3395010   -43.800    -6.600  
+971027 50748.00 I   .225349  .000099   .308591  .000118  I  .3376163  .0000058  1.9498 0.0061  I   -44.450     .112    -7.124     .298   .225500   .308760   .3375650   -43.900    -6.500  
+971028 50749.00 I   .224117  .000108   .305464  .000188  I  .3356391  .0000067  2.0046 0.0042  I   -44.442     .791    -6.847     .298   .224230   .305610   .3356010   -44.000    -6.400  
+971029 50750.00 I   .222553  .000123   .302189  .000185  I  .3336090  .0000061  2.0538 0.0060  I   -44.579     .124    -6.528     .298   .222490   .302310   .3336030   -44.400    -6.400  
+971030 50751.00 I   .220887  .000128   .298780  .000192  I  .3315353  .0000100  2.0916 0.0059  I   -44.793     .124    -6.227     .298   .221120   .298860   .3315420   -44.900    -6.400  
+971031 50752.00 I   .219360  .000133   .295439  .000201  I  .3294279  .0000100  2.1230 0.0073  I   -45.044     .124    -6.085     .298   .219130   .295250   .3294120   -45.300    -6.500  
+9711 1 50753.00 I   .218197  .000144   .292331  .000193  I  .3272972  .0000106  2.1305 0.0073  I   -45.234     .142    -6.067     .102   .217830   .292330   .3272540   -45.500    -6.500  
+9711 2 50754.00 I   .217440  .000167   .289537  .000207  I  .3251797  .0000106  2.0995 0.0076  I   -45.248     .134    -6.117     .116   .217660   .290260   .3251270   -45.700    -6.700  
+9711 3 50755.00 I   .216911  .000178   .287060  .000151  I  .3231026  .0000109  2.0551 0.0076  I   -45.061     .268    -6.203     .298   .217200   .287420   .3230750   -45.500    -6.700  
+9711 4 50756.00 I   .216413  .000166   .284799  .000148  I  .3210639  .0000109  2.0274 0.0071  I   -44.809     .300    -6.281     .298   .216380   .285030   .3210520   -45.200    -6.600  
+9711 5 50757.00 I   .215856  .000183   .282591  .000139  I  .3190230  .0000090  2.0742 0.0071  I   -44.657     .300    -6.329     .298   .215990   .282700   .3190130   -44.800    -6.500  
+9711 6 50758.00 I   .215208  .000179   .280313  .000127  I  .3168940  .0000092  2.1854 0.0061  I   -44.621     .300    -6.355     .298   .215420   .280340   .3168880   -44.400    -6.300  
+9711 7 50759.00 I   .214575  .000162   .278014  .000127  I  .3146522  .0000083  2.2964 0.0061  I   -44.564     .300    -6.363     .298   .214490   .278000   .3146430   -43.900    -6.100  
+9711 8 50760.00 I   .213973  .000157   .275719  .000131  I  .3123008  .0000081  2.4085 0.0076  I   -44.381     .300    -6.318     .298   .213790   .275840   .3122920   -43.600    -5.900  
+9711 9 50761.00 I   .213355  .000122   .273388  .000123  I  .3098278  .0000127  2.5429 0.0064  I   -44.109     .791    -6.162     .298   .213340   .273380   .3098240   -43.400    -5.700  
+971110 50762.00 I   .212621  .000117   .271003  .000143  I  .3072218  .0000098  2.6569 0.0075  I   -43.886     .104    -5.878     .298   .212890   .271220   .3072180   -43.400    -5.500  
+971111 50763.00 I   .211614  .000138   .268548  .000158  I  .3045421  .0000079  2.6864 0.0059  I   -43.815     .127    -5.559     .298   .211850   .268880   .3045330   -43.400    -5.500  
+971112 50764.00 I   .210284  .000105   .266043  .000160  I  .3018805  .0000067  2.6213 0.0057  I   -43.858     .127    -5.363     .298   .210220   .266070   .3018760   -43.600    -5.400  
+971113 50765.00 I   .208730  .000107   .263564  .000159  I  .2993329  .0000081  2.4560 0.0053  I   -43.885     .127    -5.357     .298   .208840   .263480   .2993360   -43.900    -5.400  
+971114 50766.00 I   .207088  .000125   .261177  .000153  I  .2969961  .0000082  2.2080 0.0053  I   -43.872     .127    -5.503     .298   .207230   .261170   .2969980   -44.000    -5.500  
+971115 50767.00 I   .205438  .000123   .258919  .000153  I  .2949190  .0000068  1.9536 0.0052  I   -43.864     .127    -5.592     .298   .205490   .258980   .2949020   -44.100    -5.600  
+971116 50768.00 I   .203918  .000123   .256761  .000123  I  .2930689  .0000065  1.7592 0.0043  I   -43.844     .109    -5.507     .298   .203880   .256780   .2930260   -44.000    -5.700  
+971117 50769.00 I   .202655  .000104   .254669  .000127  I  .2913779  .0000051  1.6329 0.0044  I   -43.683     .271    -5.404     .108   .202760   .254780   .2913250   -43.800    -5.700  
+971118 50770.00 I   .201619  .000108   .252564  .000122  I  .2897821  .0000060  1.5697 0.0036  I   -43.276     .271    -5.471     .108   .201850   .252560   .2897440   -43.300    -5.700  
+971119 50771.00 I   .200584  .000112   .250318  .000124  I  .2882163  .0000050  1.5730 0.0043  I   -42.698     .319    -5.700     .298   .200620   .250230   .2882030   -42.800    -5.700  
+971120 50772.00 I   .199174  .000111   .247864  .000127  I  .2866280  .0000061  1.6004 0.0039  I   -42.119     .319    -5.990     .298   .199210   .248060   .2866450   -42.300    -5.600  
+971121 50773.00 I   .197451  .000106   .245209  .000124  I  .2850227  .0000059  1.6060 0.0043  I   -41.701     .319    -6.141     .298   .197520   .245450   .2850530   -41.800    -5.400  
+971122 50774.00 I   .195727  .000110   .242394  .000118  I  .2834162  .0000062  1.6110 0.0054  I   -41.511     .325    -6.071     .298   .195750   .242480   .2834300   -41.400    -5.300  
+971123 50775.00 I   .194034  .000111   .239527  .000111  I  .2817959  .0000091  1.6303 0.0046  I   -41.492     .319    -5.886     .298   .194200   .239640   .2817920   -41.400    -5.200  
+971124 50776.00 I   .192232  .000123   .236767  .000135  I  .2801566  .0000068  1.6466 0.0057  I   -41.639     .262    -5.687     .298   .192380   .236780   .2801520   -41.500    -5.200  
+971125 50777.00 I   .190303  .000103   .234238  .000142  I  .2785077  .0000068  1.6479 0.0042  I   -41.900     .791    -5.487     .298   .190440   .234200   .2785100   -41.800    -5.200  
+971126 50778.00 I   .188296  .000131   .231988  .000160  I  .2768699  .0000049  1.6218 0.0044  I   -42.131     .791    -5.255     .298   .188400   .232120   .2768720   -42.200    -5.200  
+971127 50779.00 I   .186082  .000138   .230043  .000159  I  .2752722  .0000055  1.5715 0.0036  I   -42.271     .791    -5.001     .298   .186160   .230400   .2752670   -42.600    -5.400  
+971128 50780.00 I   .183599  .000139   .228284  .000160  I  .2737303  .0000053  1.5111 0.0040  I   -42.382     .791    -4.787     .298   .183680   .228470   .2737230   -43.000    -5.400  
+971129 50781.00 I   .180925  .000158   .226584  .000185  I  .2722504  .0000057  1.4497 0.0042  I   -42.490     .791    -4.714     .298   .181050   .226750   .2722450   -43.300    -5.400  
+971130 50782.00 I   .178200  .000180   .224851  .000167  I  .2708259  .0000066  1.4034 0.0042  I   -42.496     .791    -4.830     .298   .178370   .225150   .2708160   -43.300    -5.500  
+9712 1 50783.00 I   .175672  .000204   .223009  .000148  I  .2694351  .0000063  1.3825 0.0046  I   -42.322     .390    -5.038     .298   .175500   .223390   .2694290   -43.100    -5.400  
+9712 2 50784.00 I   .173588  .000180   .221047  .000138  I  .2680505  .0000064  1.3926 0.0040  I   -42.080     .390    -5.155     .298   .173170   .221480   .2680540   -42.700    -5.300  
+9712 3 50785.00 I   .171942  .000168   .219053  .000126  I  .2666417  .0000050  1.4271 0.0049  I   -42.006     .390    -5.068     .298   .171810   .219080   .2666530   -42.200    -5.100  
+9712 4 50786.00 I   .170344  .000166   .217157  .000119  I  .2651830  .0000073  1.5013 0.0044  I   -42.230     .390    -4.811     .298   .170440   .217090   .2651940   -41.700    -4.900  
+9712 5 50787.00 I   .168527  .000155   .215369  .000116  I  .2636186  .0000072  1.6368 0.0051  I   -42.618     .390    -4.511     .298   .168750   .215580   .2636170   -41.300    -4.700  
+9712 6 50788.00 I   .166342  .000185   .213626  .000103  I  .2618905  .0000072  1.8291 0.0059  I   -42.925     .390    -4.247     .298   .166520   .213890   .2618910   -41.000    -4.400  
+9712 7 50789.00 I   .163903  .000169   .211872  .000089  I  .2599495  .0000093  2.0543 0.0051  I   -43.016     .588    -4.024     .112   .164000   .212020   .2599740   -41.000    -4.200  
+9712 8 50790.00 I   .161422  .000179   .210090  .000105  I  .2577994  .0000073  2.2272 0.0060  I   -42.932     .560    -3.850     .109   .161480   .210280   .2578130   -41.000    -4.100  
+9712 9 50791.00 I   .159046  .000187   .208306  .000115  I  .2555327  .0000077  2.2874 0.0047  I   -42.783     .560    -3.813     .109   .159250   .208410   .2555200   -41.300    -4.000  
+971210 50792.00 I   .157016  .000194   .206578  .000113  I  .2532611  .0000058  2.2380 0.0048  I   -42.626     .560    -4.029     .109   .157260   .206590   .2532500   -41.500    -4.000  
+971211 50793.00 I   .155360  .000209   .204964  .000149  I  .2510794  .0000058  2.1204 0.0041  I   -42.600     .560    -4.398     .109   .155610   .204990   .2510800   -41.900    -4.100  
+971212 50794.00 I   .153813  .000205   .203422  .000172  I  .2490314  .0000058  1.9696 0.0040  I   -42.606     .560    -4.778     .109   .154140   .203490   .2490330   -42.100    -4.100  
+971213 50795.00 I   .151960  .000160   .201840  .000174  I  .2471484  .0000055  1.7943 0.0047  I   -42.494     .375    -4.990     .298   .152290   .202230   .2471530   -42.200    -4.300  
+971214 50796.00 I   .149526  .000143   .200084  .000214  I  .2454378  .0000074  1.6339 0.0038  I   -42.261     .791    -4.916     .298   .149870   .200740   .2454510   -42.200    -4.400  
+971215 50797.00 I   .146669  .000119   .198079  .000168  I  .2438609  .0000052  1.5325 0.0046  I   -41.983     .791    -4.655     .298   .146680   .198370   .2438760   -42.000    -4.400  
+971216 50798.00 I   .143768  .000116   .195933  .000171  I  .2423544  .0000054  1.4862 0.0040  I   -41.722     .791    -4.447     .298   .143740   .196060   .2423610   -41.800    -4.400  
+971217 50799.00 I   .141075  .000119   .193902  .000158  I  .2408754  .0000060  1.4792 0.0048  I   -41.476     .791    -4.454     .298   .141160   .194160   .2408750   -41.500    -4.400  
+971218 50800.00 I   .138876  .000106   .192194  .000152  I  .2393864  .0000079  1.5008 0.0048  I   -41.221     .791    -4.656     .298   .139040   .192400   .2393930   -41.200    -4.400  
+971219 50801.00 I   .137047  .000112   .190980  .000155  I  .2378658  .0000076  1.5462 0.0056  I   -40.967     .791    -4.871     .298   .137340   .191070   .2378620   -41.000    -4.200  
+971220 50802.00 I   .134949  .000111   .190057  .000154  I  .2362873  .0000078  1.6115 0.0053  I   -40.779     .791    -4.977     .298   .135090   .190480   .2362660   -40.900    -4.200  
+971221 50803.00 I   .132348  .000123   .189130  .000155  I  .2346470  .0000075  1.6640 0.0060  I   -40.730     .301    -4.984     .125   .132320   .189640   .2346450   -40.900    -4.100  
+971222 50804.00 I   .129498  .000142   .188011  .000183  I  .2329639  .0000091  1.7025 0.0058  I   -40.851     .296    -4.928     .119   .129690   .188190   .2329880   -41.000    -4.100  
+971223 50805.00 I   .126543  .000131   .186609  .000184  I  .2312498  .0000088  1.7176 0.0055  I   -41.124     .296    -4.778     .119   .126820   .186830   .2312730   -41.300    -4.100  
+971224 50806.00 I   .123555  .000132   .184907  .000171  I  .2295451  .0000062  1.6837 0.0055  I   -41.502     .296    -4.467     .119   .123590   .185080   .2295430   -41.600    -4.200  
+971225 50807.00 I   .120723  .000124   .183142  .000166  I  .2278943  .0000065  1.6143 0.0042  I   -41.843     .296    -4.114     .119   .120750   .183220   .2278720   -41.800    -4.400  
+971226 50808.00 I   .118041  .000125   .181462  .000170  I  .2263238  .0000058  1.5231 0.0045  I   -42.089     .296    -3.801     .119   .118120   .181490   .2263070   -42.100    -4.500  
+971227 50809.00 I   .115429  .000087   .179926  .000125  I  .2248520  .0000063  1.4203 0.0040  I   -42.204     .292    -3.644     .112   .115510   .179870   .2248460   -42.200    -4.500  
+971228 50810.00 I   .112782  .000088   .178571  .000111  I  .2234795  .0000054  1.3285 0.0042  I   -42.139     .791    -3.756     .298   .112950   .178530   .2234750   -42.200    -4.600  
+971229 50811.00 I   .110042  .000095   .177409  .000110  I  .2221795  .0000055  1.2833 0.0039  I   -41.895     .137    -4.090     .298   .110410   .177530   .2221700   -42.000    -4.500  
+971230 50812.00 I   .107282  .000105   .176420  .000120  I  .2208913  .0000055  1.3029 0.0037  I   -41.541     .137    -4.423     .298   .107600   .176500   .2208800   -41.800    -4.500  
+971231 50813.00 I   .104669  .000106   .175520  .000121  I  .2195567  .0000050  1.3734 0.0041  I   -41.195     .137    -4.529     .298   .104840   .175500   .2195510   -41.500    -4.400  
+98 1 1 50814.00 I   .102330  .000113   .174610  .000130  I  .2181268  .0000062  1.4968 0.0040  I   -40.962     .137    -4.383     .298   .102620   .174590   .2181430   -40.900    -4.300  
+98 1 2 50815.00 I   .100067  .000111   .173756  .000125  I  .2165474  .0000063  1.6672 0.0048  I   -40.873     .137    -4.154     .298   .100400   .173810   .2165920   -40.700    -4.200  
+98 1 3 50816.00 I   .097717  .000110   .173046  .000119  I  .2147880  .0000074  1.8510 0.0080  I   -40.872     .137    -4.018     .298   .097860   .173110   .2148370   -40.500    -4.200  
+98 1 4 50817.00 I   .095308  .000125   .172486  .000151  I  .2128524  .0000148  2.0140 0.0064  I   -40.876     .791    -4.010     .298   .095580   .172660   .2128680   -40.400    -4.100  
+98 1 5 50818.00 I   .092881  .000076   .172032  .000104  I  .2107892  .0000104  2.0893 0.0094  I   -40.869     .791    -4.068     .298   .093160   .172300   .2107640   -40.500    -4.100  
+98 1 6 50819.00 I   .090425  .000082   .171596  .000107  I  .2087156  .0000116  2.0391 0.0073  I   -40.929     .791    -4.136     .298   .090530   .171710   .2086890   -40.600    -4.100  
+98 1 7 50820.00 I   .087912  .000087   .171078  .000123  I  .2067344  .0000102  1.9187 0.0078  I   -41.141     .791    -4.226     .298   .088120   .171270   .2067320   -40.800    -4.300  
+98 1 8 50821.00 I   .085272  .000073   .170438  .000113  I  .2048885  .0000105  1.7672 0.0066  I   -41.482     .791    -4.375     .298   .085520   .170630   .2048730   -41.200    -4.300  
+98 1 9 50822.00 I   .082407  .000089   .169723  .000115  I  .2032072  .0000084  1.5940 0.0065  I   -41.800     .791    -4.566     .298   .082510   .169920   .2031800   -41.500    -4.300  
+98 110 50823.00 I   .079324  .000146   .169046  .000104  I  .2016899  .0000078  1.4528 0.0056  I   -41.925     .791    -4.700     .298   .079420   .168960   .2016870   -41.700    -4.400  
+98 111 50824.00 I   .076072  .000175   .168515  .000120  I  .2002746  .0000074  1.3928 0.0047  I   -41.828     .791    -4.677     .298   .076390   .168470   .2002920   -41.700    -4.300  
+98 112 50825.00 I   .072675  .000164   .168147  .000132  I  .1988820  .0000054  1.3996 0.0045  I   -41.652     .791    -4.508     .298   .072880   .168310   .1988680   -41.700    -4.300  
+98 113 50826.00 I   .069398  .000165   .167910  .000141  I  .1974576  .0000052  1.4598 0.0037  I   -41.555     .791    -4.315     .298   .069500   .167940   .1974300   -41.600    -4.200  
+98 114 50827.00 I   .066566  .000164   .167768  .000128  I  .1959508  .0000050  1.5547 0.0037  I   -41.530     .791    -4.216     .298   .066770   .167790   .1959580   -41.300    -4.100  
+98 115 50828.00 I   .063657  .000165   .167608  .000131  I  .1943544  .0000052  1.6311 0.0034  I   -41.436     .791    -4.261     .298   .063900   .167680   .1943530   -41.100    -4.000  
+98 116 50829.00 I   .060477  .000169   .167464  .000144  I  .1927001  .0000047  1.6730 0.0038  I   -41.243     .791    -4.363     .298   .060510   .167550   .1926850   -41.000    -3.900  
+98 117 50830.00 I   .057260  .000124   .167422  .000157  I  .1910127  .0000055  1.7019 0.0050  I   -41.092     .791    -4.439     .298   .057290   .167510   .1910200   -41.000    -3.900  
+98 118 50831.00 I   .054151  .000098   .167516  .000142  I  .1892952  .0000089  1.7342 0.0044  I   -41.102     .791    -4.498     .298   .054110   .167560   .1893100   -41.000    -4.100  
+98 119 50832.00 I   .051100  .000093   .167743  .000212  I  .1875474  .0000069  1.7574 0.0057  I   -41.230     .791    -4.579     .298   .051120   .167890   .1875500   -41.100    -4.300  
+98 120 50833.00 I   .047984  .000098   .167986  .000188  I  .1857901  .0000072  1.7517 0.0051  I   -41.383     .791    -4.688     .298   .048350   .168320   .1857890   -41.200    -4.500  
+98 121 50834.00 I   .044715  .000094   .168028  .000189  I  .1840492  .0000076  1.7304 0.0051  I   -41.575     .791    -4.776     .298   .044980   .168210   .1840490   -41.400    -4.700  
+98 122 50835.00 I   .041334  .000141   .167746  .000194  I  .1823291  .0000072  1.7098 0.0053  I   -41.846     .791    -4.761     .298   .041680   .167720   .1823160   -41.500    -4.900  
+98 123 50836.00 I   .037958  .000129   .167314  .000200  I  .1806273  .0000074  1.6963 0.0054  I   -42.097     .791    -4.600     .298   .038150   .167320   .1806180   -41.600    -5.000  
+98 124 50837.00 I   .034688  .000147   .166906  .000193  I  .1789316  .0000080  1.6976 0.0061  I   -42.179     .791    -4.367     .298   .034730   .167260   .1789340   -41.600    -5.100  
+98 125 50838.00 I   .031556  .000204   .166612  .000198  I  .1772322  .0000097  1.6985 0.0062  I   -42.109     .252    -4.251     .298   .031770   .167010   .1772150   -41.500    -5.100  
+98 126 50839.00 I   .028551  .000255   .166534  .000136  I  .1755271  .0000096  1.7217 0.0065  I   -42.024     .325    -4.396     .298   .028770   .166600   .1754970   -41.600    -5.100  
+98 127 50840.00 I   .025795  .000237   .166733  .000149  I  .1737632  .0000087  1.8216 0.0069  I   -41.932     .309    -4.717     .298   .025910   .166860   .1737480   -41.600    -5.000  
+98 128 50841.00 I   .023234  .000233   .167166  .000172  I  .1718530  .0000098  2.0142 0.0066  I   -41.669     .309    -4.952     .298   .023200   .167300   .1718700   -41.700    -4.900  
+98 129 50842.00 I   .020394  .000227   .167717  .000153  I  .1697221  .0000099  2.2450 0.0069  I   -41.232     .309    -4.896     .298   .020430   .167790   .1697400   -41.700    -4.600  
+98 130 50843.00 I   .017343  .000215   .168286  .000145  I  .1673762  .0000096  2.4363 0.0073  I   -40.858     .309    -4.609     .298   .017520   .168400   .1673530   -41.800    -4.500  
+98 131 50844.00 I   .014234  .000225   .168811  .000174  I  .1648804  .0000108  2.5347 0.0070  I   -40.815     .324    -4.312     .298   .014380   .168980   .1648510   -41.900    -4.300  
+98 2 1 50845.00 I   .011108  .000100   .169359  .000193  I  .1623325  .0000103  2.5558 0.0073  I   -41.100     .288    -4.186     .298   .011350   .169560   .1623420   -41.800    -4.300  
+98 2 2 50846.00 I   .007955  .000132   .170019  .000191  I  .1597821  .0000098  2.5371 0.0071  I   -41.504     .236    -4.230     .298   .007820   .170180   .1597890   -41.800    -4.200  
+98 2 3 50847.00 I   .004686  .000139   .170837  .000204  I  .1572725  .0000099  2.4757 0.0070  I   -41.792     .210    -4.374     .298   .004450   .170980   .1572640   -41.800    -4.300  
+98 2 4 50848.00 I   .001321  .000137   .171691  .000178  I  .1548339  .0000099  2.4045 0.0072  I   -41.848     .210    -4.585     .298   .001740   .171850   .1548260   -41.700    -4.500  
+98 2 5 50849.00 I  -.001925  .000138   .172410  .000177  I  .1524679  .0000105  2.3200 0.0073  I   -41.771     .210    -4.780     .298  -.001740   .172650   .1524600   -41.700    -4.700  
+98 2 6 50850.00 I  -.004907  .000126   .173114  .000172  I  .1502065  .0000106  2.1976 0.0071  I   -41.668     .126    -4.940     .298  -.005010   .173440   .1501780   -41.600    -4.800  
+98 2 7 50851.00 I  -.007577  .000105   .173869  .000152  I  .1480662  .0000096  2.0947 0.0075  I   -41.528     .126    -5.048     .298  -.007560   .174140   .1480560   -41.500    -5.000  
+98 2 8 50852.00 I  -.010035  .000090   .174566  .000151  I  .1459967  .0000107  2.0529 0.0067  I   -41.311     .177    -5.089     .298  -.009850   .174770   .1460250   -41.400    -5.100  
+98 2 9 50853.00 I  -.012460  .000097   .175079  .000142  I  .1439594  .0000093  2.0142 0.0071  I   -41.075     .791    -5.100     .298  -.012370   .175200   .1439480   -41.300    -5.200  
+98 210 50854.00 I  -.015089  .000090   .175334  .000147  I  .1419780  .0000092  1.9465 0.0063  I   -40.931     .791    -5.144     .298  -.014930   .175270   .1419500   -41.200    -5.300  
+98 211 50855.00 I  -.017954  .000089   .175401  .000148  I  .1400520  .0000085  1.9221 0.0062  I   -40.897     .791    -5.254     .298  -.017950   .175420   .1400530   -41.100    -5.200  
+98 212 50856.00 I  -.020654  .000094   .175617  .000154  I  .1381159  .0000084  1.9516 0.0053  I   -40.867     .791    -5.403     .298  -.020750   .175750   .1381030   -41.100    -5.300  
+98 213 50857.00 I  -.023038  .000090   .176036  .000150  I  .1361486  .0000062  1.9818 0.0058  I   -40.806     .791    -5.533     .298  -.022900   .176290   .1361190   -41.100    -5.300  
+98 214 50858.00 I  -.025089  .000118   .176594  .000151  I  .1341574  .0000080  1.9969 0.0053  I   -40.836     .791    -5.620     .298  -.025110   .176620   .1341540   -41.100    -5.200  
+98 215 50859.00 I  -.026885  .000111   .177371  .000136  I  .1321610  .0000086  1.9935 0.0052  I   -41.044     .791    -5.694     .298  -.026860   .177210   .1321700   -41.200    -5.300  
+98 216 50860.00 I  -.028529  .000171   .178429  .000123  I  .1301747  .0000067  1.9773 0.0081  I   -41.337     .791    -5.766     .298  -.028500   .178670   .1302110   -41.300    -5.300  
+98 217 50861.00 I  -.030138  .000190   .179743  .000109  I  .1282129  .0000137  1.9415 0.0082  I   -41.576     .791    -5.835     .298  -.030170   .179970   .1282310   -41.400    -5.600  
+98 218 50862.00 I  -.032005  .000202   .181204  .000103  I  .1263079  .0000149  1.8572 0.0104  I   -41.767     .791    -5.900     .298  -.031880   .181340   .1262970   -41.600    -5.700  
+98 219 50863.00 I  -.034594  .000199   .182632  .000110  I  .1244965  .0000157  1.7789 0.0107  I   -41.950     .791    -5.932     .298  -.034580   .182820   .1244970   -41.800    -5.900  
+98 220 50864.00 I  -.037751  .000197   .183914  .000100  I  .1227247  .0000153  1.7767 0.0109  I   -41.988     .791    -5.839     .298  -.037650   .184250   .1227710   -41.900    -6.200  
+98 221 50865.00 I  -.041186  .000192   .185022  .000103  I  .1209348  .0000151  1.7994 0.0105  I   -41.714     .791    -5.577     .298  -.040900   .185400   .1210210   -41.800    -6.400  
+98 222 50866.00 I  -.044703  .000143   .185960  .000109  I  .1191234  .0000144  1.8295 0.0087  I   -41.280     .791    -5.296     .298  -.044630   .186210   .1191930   -41.800    -6.500  
+98 223 50867.00 I  -.047998  .000131   .186807  .000109  I  .1172605  .0000085  1.9055 0.0088  I   -41.081     .229    -5.276     .298  -.048200   .186940   .1172860   -41.700    -6.400  
+98 224 50868.00 I  -.050931  .000139   .187634  .000118  I  .1152941  .0000100  2.0362 0.0066  I   -41.243     .229    -5.624     .298  -.051200   .187930   .1152930   -41.400    -6.300  
+98 225 50869.00 I  -.053569  .000134   .188438  .000112  I  .1131771  .0000101  2.1997 0.0073  I   -41.415     .229    -6.106     .298  -.053470   .188800   .1131760   -41.300    -6.200  
+98 226 50870.00 I  -.055810  .000128   .189277  .000117  I  .1108978  .0000106  2.3538 0.0074  I   -41.196     .229    -6.323     .298  -.055720   .189430   .1109010   -41.200    -6.000  
+98 227 50871.00 I  -.057486  .000137   .190283  .000119  I  .1084770  .0000109  2.4855 0.0076  I   -40.664     .229    -6.183     .298  -.057560   .190280   .1084740   -41.300    -5.800  
+98 228 50872.00 I  -.058657  .000135   .191598  .000113  I  .1059310  .0000108  2.6046 0.0094  I   -40.261     .277    -5.936     .298  -.058660   .191770   .1059310   -41.200    -5.800  
+98 3 1 50873.00 I  -.059602  .000103   .193205  .000109  I  .1032905  .0000154  2.6554 0.0076  I   -40.292     .791    -5.822     .298  -.059380   .193340   .1033060   -41.300    -5.700  
+98 3 2 50874.00 I  -.060660  .000087   .194960  .000136  I  .1006586  .0000108  2.5909 0.0086  I   -40.673     .791    -5.862     .298  -.060390   .194970   .1006710   -41.300    -5.800  
+98 3 3 50875.00 I  -.062008  .000077   .196729  .000124  I  .0981386  .0000077  2.4367 0.0062  I   -41.088     .791    -5.956     .298  -.061790   .196830   .0981390   -41.300    -5.900  
+98 3 4 50876.00 I  -.063592  .000074   .198476  .000115  I  .0957946  .0000060  2.2542 0.0049  I   -41.276     .791    -6.067     .298  -.063460   .198530   .0957850   -41.200    -6.100  
+98 3 5 50877.00 I  -.065267  .000080   .200360  .000110  I  .0936210  .0000062  2.0992 0.0045  I   -41.195     .791    -6.227     .298  -.065140   .200500   .0935970   -41.200    -6.300  
+98 3 6 50878.00 I  -.066905  .000067   .202319  .000108  I  .0915841  .0000067  1.9806 0.0049  I   -41.001     .791    -6.417     .298  -.066730   .202460   .0915420   -41.000    -6.500  
+98 3 7 50879.00 I  -.068490  .000066   .204312  .000108  I  .0896482  .0000076  1.8969 0.0059  I   -40.864     .791    -6.560     .298  -.068240   .204350   .0895940   -40.700    -6.700  
+98 3 8 50880.00 I  -.070085  .000086   .206386  .000066  I  .0877786  .0000098  1.8483 0.0057  I   -40.799     .791    -6.628     .298  -.070080   .206330   .0877340   -40.500    -6.800  
+98 3 9 50881.00 I  -.071696  .000104   .208509  .000068  I  .0859377  .0000085  1.8416 0.0059  I   -40.701     .791    -6.676     .298  -.071740   .208600   .0859110   -40.300    -6.800  
+98 310 50882.00 I  -.073337  .000111   .210604  .000120  I  .0840788  .0000066  1.8849 0.0054  I   -40.530     .791    -6.748     .298  -.073230   .210690   .0840630   -40.100    -6.800  
+98 311 50883.00 I  -.074912  .000123   .212602  .000121  I  .0821452  .0000066  1.9965 0.0046  I   -40.360     .791    -6.807     .298  -.074840   .212610   .0821340   -40.100    -6.700  
+98 312 50884.00 I  -.076183  .000114   .214536  .000116  I  .0800910  .0000064  2.0925 0.0045  I   -40.252     .791    -6.791     .298  -.076150   .214770   .0801100   -40.200    -6.600  
+98 313 50885.00 I  -.077239  .000124   .216649  .000119  I  .0779831  .0000061  2.1197 0.0044  I   -40.181     .791    -6.707     .298  -.077210   .216810   .0780040   -40.400    -6.500  
+98 314 50886.00 I  -.078422  .000136   .218857  .000119  I  .0758586  .0000059  2.1257 0.0039  I   -40.158     .791    -6.655     .298  -.078270   .219010   .0758610   -40.500    -6.500  
+98 315 50887.00 I  -.080159  .000123   .220952  .000138  I  .0737412  .0000048  2.1031 0.0045  I   -40.221     .106    -6.703     .298  -.079990   .221170   .0737280   -40.600    -6.500  
+98 316 50888.00 I  -.082383  .000121   .222816  .000107  I  .0716611  .0000068  2.0544 0.0040  I   -40.319     .791    -6.811     .298  -.082370   .222800   .0716340   -40.700    -6.600  
+98 317 50889.00 I  -.084734  .000121   .224483  .000123  I  .0696389  .0000063  1.9862 0.0042  I   -40.378     .791    -6.915     .298  -.084700   .224290   .0696090   -40.600    -6.800  
+98 318 50890.00 I  -.086987  .000126   .226085  .000126  I  .0676945  .0000048  1.9006 0.0042  I   -40.443     .791    -7.026     .298  -.086850   .226100   .0676700   -40.400    -7.000  
+98 319 50891.00 I  -.089008  .000130   .227692  .000133  I  .0658367  .0000055  1.8181 0.0036  I   -40.573     .791    -7.176     .298  -.088830   .227490   .0658220   -40.200    -7.100  
+98 320 50892.00 I  -.090879  .000139   .229385  .000141  I  .0640498  .0000053  1.7609 0.0042  I   -40.611     .791    -7.293     .298  -.090580   .229270   .0640470   -39.900    -7.300  
+98 321 50893.00 I  -.092870  .000157   .231116  .000134  I  .0623018  .0000064  1.7428 0.0044  I   -40.309     .791    -7.236     .298  -.092640   .231340   .0623090   -39.700    -7.400  
+98 322 50894.00 I  -.094860  .000153   .232676  .000110  I  .0605486  .0000069  1.7716 0.0041  I   -39.756     .791    -7.022     .298  -.094790   .232860   .0605620   -39.500    -7.400  
+98 323 50895.00 I  -.096558  .000146   .234047  .000099  I  .0587419  .0000050  1.8506 0.0047  I   -39.397     .145    -6.895     .298  -.096640   .234260   .0587590   -39.500    -7.400  
+98 324 50896.00 I  -.097957  .000140   .235445  .000099  I  .0568313  .0000063  1.9780 0.0043  I   -39.491     .149    -7.066     .298  -.097950   .235530   .0568400   -39.600    -7.300  
+98 325 50897.00 I  -.099289  .000141   .237069  .000085  I  .0547597  .0000070  2.1842 0.0051  I   -39.743     .149    -7.426     .298  -.099210   .237070   .0547480   -39.800    -7.300  
+98 326 50898.00 I  -.100687  .000151   .238870  .000088  I  .0524515  .0000079  2.4248 0.0053  I   -39.699     .149    -7.644     .298  -.100620   .239000   .0524510   -39.900    -7.200  
+98 327 50899.00 I  -.102256  .000142   .240823  .000094  I  .0499414  .0000079  2.5714 0.0060  I   -39.350     .149    -7.571     .298  -.102090   .240920   .0499410   -40.100    -7.100  
+98 328 50900.00 I  -.104010  .000132   .242915  .000090  I  .0473499  .0000089  2.5942 0.0076  I   -39.095     .165    -7.379     .298  -.103850   .242890   .0473420   -40.300    -7.100  
+98 329 50901.00 I  -.105925  .000136   .245145  .000100  I  .0447784  .0000131  2.5408 0.0085  I   -39.277     .157    -7.307     .298  -.105760   .245180   .0447980   -40.400    -7.100  
+98 330 50902.00 I  -.107733  .000123   .247444  .000093  I  .0422919  .0000145  2.4168 0.0097  I   -39.840     .337    -7.389     .298  -.107670   .247570   .0423000   -40.400    -7.300  
+98 331 50903.00 I  -.109077  .000114   .249741  .000098  I  .0399650  .0000142  2.2323 0.0097  I   -40.383     .362    -7.530     .298  -.109050   .249770   .0399470   -40.300    -7.500  
+98 4 1 50904.00 I  -.109935  .000111   .252103  .000095  I  .0378239  .0000129  2.0578 0.0093  I   -40.478     .362    -7.721     .298  -.109830   .252060   .0378020   -40.100    -7.700  
+98 4 2 50905.00 I  -.110527  .000083   .254548  .000079  I  .0358353  .0000120  1.9254 0.0084  I   -40.005     .362    -8.040     .298  -.110280   .254420   .0358140   -39.900    -8.000  
+98 4 3 50906.00 I  -.111154  .000073   .256961  .000079  I  .0339580  .0000109  1.8384 0.0082  I   -39.385     .362    -8.425     .298  -.110870   .256870   .0339240   -39.700    -8.200  
+98 4 4 50907.00 I  -.112007  .000086   .259254  .000094  I  .0321401  .0000112  1.8066 0.0084  I   -39.175     .362    -8.682     .298  -.111810   .259280   .0321020   -39.500    -8.300  
+98 4 5 50908.00 I  -.112987  .000120   .261411  .000091  I  .0303301  .0000127  1.8188 0.0081  I   -39.426     .386    -8.722     .298  -.112870   .261520   .0303230   -39.300    -8.300  
+98 4 6 50909.00 I  -.113778  .000166   .263513  .000111  I  .0284947  .0000117  1.8544 0.0084  I   -39.763     .203    -8.616     .298  -.113770   .263420   .0285300   -39.300    -8.300  
+98 4 7 50910.00 I  -.114131  .000163   .265742  .000152  I  .0266181  .0000111  1.8996 0.0081  I   -39.820     .167    -8.467     .298  -.114090   .265490   .0266580   -39.400    -8.300  
+98 4 8 50911.00 I  -.114147  .000163   .268209  .000160  I  .0246935  .0000112  1.9507 0.0078  I   -39.588     .167    -8.277     .298  -.114030   .268270   .0247080   -39.500    -8.100  
+98 4 9 50912.00 I  -.113999  .000165   .270830  .000160  I  .0227298  .0000111  1.9623 0.0078  I   -39.282     .167    -8.007     .298  -.113910   .270980   .0227410   -39.600    -8.000  
+98 410 50913.00 I  -.113829  .000164   .273649  .000153  I  .0207804  .0000109  1.9392 0.0075  I   -39.061     .167    -7.717     .298  -.113910   .273640   .0207910   -39.700    -7.900  
+98 411 50914.00 I  -.113728  .000177   .276606  .000148  I  .0188422  .0000102  1.9437 0.0070  I   -38.940     .270    -7.557     .298  -.113670   .276770   .0188450   -39.900    -7.800  
+98 412 50915.00 I  -.113850  .000138   .279529  .000145  I  .0168902  .0000088  1.9565 0.0061  I   -38.906     .323    -7.612     .298  -.113640   .279590   .0168970   -39.900    -7.800  
+98 413 50916.00 I  -.114218  .000141   .282316  .000112  I  .0149437  .0000068  1.9257 0.0057  I   -38.984     .383    -7.808     .298  -.114090   .282260   .0149670   -39.900    -7.800  
+98 414 50917.00 I  -.114694  .000144   .284973  .000101  I  .0130558  .0000074  1.8438 0.0048  I   -39.226     .383    -8.019     .298  -.114540   .285160   .0130720   -39.800    -8.000  
+98 415 50918.00 I  -.115071  .000147   .287594  .000099  I  .0112541  .0000067  1.7678 0.0051  I   -39.680     .383    -8.204     .298  -.114800   .287640   .0112440   -39.600    -8.100  
+98 416 50919.00 I  -.114962  .000153   .290211  .000098  I  .0095180  .0000069  1.6983 0.0049  I   -40.211     .383    -8.376     .298  -.114880   .290140   .0095240   -39.200    -8.300  
+98 417 50920.00 I  -.114593  .000156   .292907  .000094  I  .0078497  .0000072  1.6521 0.0055  I   -40.640     .293    -8.529     .298  -.114520   .292890   .0078650   -38.900    -8.400  
+98 418 50921.00 I  -.114123  .000135   .295738  .000096  I  .0061926  .0000085  1.6695 0.0058  I   -40.732     .337    -8.569     .298  -.113800   .295860   .0061990   -38.600    -8.500  
+98 419 50922.00 I  -.113765  .000095   .298599  .000096  I  .0044955  .0000092  1.7326 0.0062  I   -40.401     .377    -8.438     .298  -.113500   .298690   .0044940   -38.500    -8.500  
+98 420 50923.00 I  -.113651  .000105   .301376  .000113  I  .0027115  .0000089  1.8435 0.0062  I   -39.886     .626    -8.255     .298  -.113460   .301360   .0027230   -38.400    -8.500  
+98 421 50924.00 I  -.113687  .000096   .304101  .000110  I  .0007922  .0000082  2.0033 0.0060  I   -39.482     .542    -8.204     .298  -.113590   .304190   .0008070   -38.500    -8.400  
+98 422 50925.00 I  -.113745  .000092   .306874  .000121  I -.0013031  .0000080  2.1872 0.0058  I   -39.217     .542    -8.300     .298  -.113720   .307070  -.0012960   -38.800    -8.300  
+98 423 50926.00 I  -.113785  .000082   .309763  .000124  I -.0035829  .0000082  2.3732 0.0056  I   -39.031     .542    -8.347     .298  -.113540   .309850  -.0035750   -39.200    -8.100  
+98 424 50927.00 I  -.113731  .000085   .312527  .000127  I -.0060392  .0000077  2.5285 0.0056  I   -38.874     .587    -8.235     .298  -.113670   .312610  -.0060240   -39.600    -8.100  
+98 425 50928.00 I  -.113542  .000083   .314955  .000126  I -.0086030  .0000075  2.5733 0.0053  I   -38.863     .587    -8.093     .298  -.113670   .315030  -.0085900   -39.900    -8.000  
+98 426 50929.00 I  -.113192  .000051   .317088  .000093  I -.0111380  .0000074  2.4748 0.0060  I   -39.145     .791    -8.093     .298  -.113000   .317070  -.0111280   -40.200    -8.000  
+98 427 50930.00 I  -.112849  .000081   .319179  .000117  I -.0135214  .0000093  2.2828 0.0062  I   -39.657     .791    -8.207     .298  -.112520   .319060  -.0135040   -40.200    -8.100  
+98 428 50931.00 I  -.112779  .000081   .321423  .000099  I -.0156958  .0000099  2.0673 0.0064  I   -40.104     .791    -8.288     .298  -.112730   .321280  -.0156750   -40.200    -8.200  
+98 429 50932.00 I  -.113003  .000070   .323784  .000094  I -.0176699  .0000089  1.8934 0.0065  I   -40.145     .791    -8.321     .298  -.113080   .323640  -.0176610   -40.000    -8.400  
+98 430 50933.00 I  -.113272  .000070   .326044  .000083  I -.0195105  .0000085  1.8032 0.0064  I   -39.678     .791    -8.452     .298  -.113090   .326010  -.0195140   -39.900    -8.500  
+98 5 1 50934.00 I  -.113419  .000076   .328142  .000084  I -.0212989  .0000091  1.7809 0.0055  I   -39.036     .791    -8.741     .298  -.113480   .328220  -.0213010   -39.600    -8.700  
+98 5 2 50935.00 I  -.113532  .000086   .330140  .000083  I -.0230801  .0000069  1.7821 0.0073  I   -38.752     .151    -9.045     .298  -.113460   .330150  -.0230680   -39.400    -8.800  
+98 5 3 50936.00 I  -.113724  .000063   .332146  .000070  I -.0248627  .0000115  1.7822 0.0060  I   -39.008     .203    -9.187     .298  -.113500   .332250  -.0248360   -39.400    -8.900  
+98 5 4 50937.00 I  -.113999  .000076   .334250  .000100  I -.0266435  .0000097  1.7793 0.0072  I   -39.441     .430    -9.146     .298  -.113900   .334350  -.0266060   -39.400    -8.800  
+98 5 5 50938.00 I  -.114283  .000077   .336511  .000100  I -.0284218  .0000086  1.7779 0.0065  I   -39.601     .373    -9.007     .298  -.114060   .336460  -.0283880   -39.500    -8.700  
+98 5 6 50939.00 I  -.114503  .000074   .338910  .000102  I -.0302130  .0000086  1.8177 0.0060  I   -39.484     .373    -8.819     .298  -.114270   .338950  -.0301970   -39.600    -8.600  
+98 5 7 50940.00 I  -.114596  .000078   .341219  .000098  I -.0320567  .0000083  1.8561 0.0060  I   -39.383     .373    -8.633     .298  -.114420   .341170  -.0320350   -39.800    -8.500  
+98 5 8 50941.00 I  -.114527  .000073   .343367  .000094  I -.0339048  .0000083  1.8333 0.0059  I   -39.509     .414    -8.437     .298  -.114350   .343360  -.0338790   -40.100    -8.400  
+98 5 9 50942.00 I  -.114308  .000066   .345406  .000088  I -.0357187  .0000085  1.7968 0.0048  I   -39.774     .414    -8.301     .298  -.114230   .345460  -.0357040   -40.200    -8.400  
+98 510 50943.00 I  -.113923  .000064   .347417  .000060  I -.0374953  .0000050  1.7510 0.0050  I   -39.995     .791    -8.307     .298  -.113610   .347380  -.0374910   -40.300    -8.400  
+98 511 50944.00 I  -.113420  .000059   .349476  .000043  I -.0392108  .0000052  1.6757 0.0031  I   -40.117     .791    -8.424     .298  -.113120   .349430  -.0392160   -40.200    -8.400  
+98 512 50945.00 I  -.112913  .000064   .351594  .000043  I -.0408403  .0000038  1.5814 0.0036  I   -40.162     .791    -8.554     .298  -.112850   .351680  -.0408540   -40.000    -8.600  
+98 513 50946.00 I  -.112428  .000064   .353738  .000046  I -.0423730  .0000049  1.4853 0.0039  I   -40.147     .791    -8.644     .298  -.112340   .353770  -.0423860   -39.800    -8.700  
+98 514 50947.00 I  -.111946  .000060   .355832  .000045  I -.0438200  .0000069  1.4165 0.0042  I   -40.133     .791    -8.716     .298  -.111790   .355760  -.0438250   -39.400    -8.700  
+98 515 50948.00 I  -.111435  .000061   .357812  .000045  I -.0452267  .0000069  1.4100 0.0050  I   -40.186     .791    -8.797     .298  -.111280   .357820  -.0452220   -39.100    -8.700  
+98 516 50949.00 I  -.110968  .000058   .359665  .000050  I -.0466667  .0000071  1.4838 0.0052  I   -40.257     .791    -8.860     .298  -.110670   .359770  -.0466610   -38.700    -8.700  
+98 517 50950.00 I  -.110639  .000053   .361433  .000086  I -.0482169  .0000079  1.6253 0.0046  I   -40.187     .791    -8.854     .298  -.110410   .361540  -.0482240   -38.600    -8.700  
+98 518 50951.00 I  -.110376  .000062   .363189  .000111  I -.0499317  .0000060  1.8098 0.0067  I   -39.900     .378    -8.767     .298  -.110290   .363160  -.0499590   -38.700    -8.600  
+98 519 50952.00 I  -.110102  .000065   .365018  .000125  I -.0518421  .0000109  2.0111 0.0061  I   -39.516     .309    -8.630     .298  -.110140   .365110  -.0518730   -38.900    -8.500  
+98 520 50953.00 I  -.109967  .000063   .367001  .000125  I -.0539483  .0000106  2.1957 0.0075  I   -39.247     .309    -8.461     .298  -.109960   .367090  -.0539550   -39.300    -8.300  
+98 521 50954.00 I  -.109945  .000065   .369171  .000127  I -.0562109  .0000104  2.3126 0.0074  I   -39.244     .309    -8.261     .298  -.109810   .369190  -.0561900   -39.800    -8.200  
+98 522 50955.00 I  -.109673  .000079   .371698  .000127  I -.0585571  .0000104  2.3804 0.0073  I   -39.540     .309    -8.064     .298  -.109650   .371850  -.0585430   -40.300    -8.100  
+98 523 50956.00 I  -.109234  .000075   .374455  .000122  I -.0609492  .0000103  2.3805 0.0079  I   -40.078     .309    -8.007     .298  -.109220   .374630  -.0609400   -40.800    -8.100  
+98 524 50957.00 I  -.108731  .000069   .377218  .000099  I -.0632756  .0000118  2.2529 0.0067  I   -40.715     .791    -8.186     .298  -.108590   .377330  -.0632740   -41.100    -8.100  
+98 525 50958.00 I  -.108142  .000074   .379851  .000092  I -.0654284  .0000087  2.0455 0.0073  I   -41.260     .791    -8.483     .298  -.107930   .379900  -.0654430   -41.200    -8.300  
+98 526 50959.00 I  -.107668  .000073   .382295  .000092  I -.0673610  .0000086  1.8211 0.0064  I   -41.535     .791    -8.665     .298  -.107430   .382270  -.0673860   -41.200    -8.400  
+98 527 50960.00 I  -.107472  .000072   .384492  .000108  I -.0690754  .0000095  1.6109 0.0075  I   -41.425     .791    -8.644     .298  -.107250   .384510  -.0690950   -41.100    -8.500  
+98 528 50961.00 I  -.107423  .000062   .386358  .000125  I -.0705961  .0000124  1.4405 0.0081  I   -40.965     .791    -8.568     .298  -.107410   .386640  -.0706060   -40.900    -8.600  
+98 529 50962.00 I  -.107151  .000056   .387984  .000127  I -.0719801  .0000130  1.3411 0.0092  I   -40.441     .791    -8.616     .298  -.107110   .388050  -.0719760   -40.600    -8.700  
+98 530 50963.00 I  -.106549  .000057   .389639  .000126  I -.0733016  .0000137  1.3117 0.0082  I   -40.264     .791    -8.772     .298  -.106410   .389480  -.0732880   -40.500    -8.800  
+98 531 50964.00 I  -.105883  .000054   .391519  .000103  I -.0746174  .0000099  1.3241 0.0080  I   -40.588     .791    -8.883     .298  -.105720   .391520  -.0746120   -40.400    -8.900  
+98 6 1 50965.00 I  -.105316  .000050   .393568  .000109  I -.0759485  .0000081  1.3327 0.0065  I   -41.107     .108    -8.865     .298  -.105150   .393650  -.0759530   -40.400    -8.800  
+98 6 2 50966.00 I  -.104823  .000055   .395623  .000097  I -.0772754  .0000085  1.3190 0.0053  I   -41.375     .108    -8.773     .298  -.104610   .395670  -.0772840   -40.700    -8.800  
+98 6 3 50967.00 I  -.104525  .000053   .397545  .000079  I -.0785861  .0000068  1.3039 0.0057  I   -41.311     .108    -8.683     .298  -.104580   .397600  -.0785930   -41.000    -8.700  
+98 6 4 50968.00 I  -.104589  .000055   .399252  .000086  I -.0798820  .0000076  1.2851 0.0048  I   -41.222     .108    -8.594     .298  -.104650   .399280  -.0798900   -41.500    -8.700  
+98 6 5 50969.00 I  -.104719  .000054   .400837  .000086  I -.0811497  .0000068  1.2466 0.0051  I   -41.360     .108    -8.470     .298  -.104610   .400860  -.0811560   -41.800    -8.500  
+98 6 6 50970.00 I  -.104591  .000055   .402402  .000087  I -.0823602  .0000067  1.1630 0.0054  I   -41.667     .108    -8.319     .298  -.104480   .402480  -.0823650   -42.200    -8.400  
+98 6 7 50971.00 I  -.104185  .000051   .403981  .000073  I -.0834622  .0000084  1.0389 0.0048  I   -41.952     .791    -8.190     .298  -.104060   .404030  -.0834740   -42.300    -8.400  
+98 6 8 50972.00 I  -.103655  .000047   .405577  .000069  I -.0844369  .0000069  0.9114 0.0053  I   -42.133     .791    -8.127     .298  -.103460   .405670  -.0844450   -42.400    -8.300  
+98 6 9 50973.00 I  -.103042  .000047   .407182  .000075  I -.0852883  .0000066  0.7938 0.0055  I   -42.198     .791    -8.147     .298  -.102880   .407220  -.0852860   -42.200    -8.200  
+98 610 50974.00 I  -.102217  .000050   .408801  .000072  I -.0860368  .0000086  0.7131 0.0059  I   -42.112     .791    -8.230     .298  -.102140   .408820  -.0860440   -41.900    -8.200  
+98 611 50975.00 I  -.101272  .000059   .410408  .000074  I -.0867308  .0000099  0.6813 0.0068  I   -41.898     .791    -8.318     .298  -.101130   .410530  -.0867380   -41.600    -8.100  
+98 612 50976.00 I  -.100513  .000063   .411926  .000077  I -.0874101  .0000106  0.6815 0.0071  I   -41.737     .791    -8.358     .298  -.100270   .412130  -.0873920   -41.200    -8.100  
+98 613 50977.00 I  -.100010  .000067   .413302  .000091  I -.0881062  .0000102  0.7188 0.0085  I   -41.806     .239    -8.341     .298  -.099840   .413470  -.0880890   -41.100    -8.000  
+98 614 50978.00 I  -.099407  .000072   .414567  .000098  I -.0888650  .0000133  0.8080 0.0082  I   -42.057     .334    -8.306     .298  -.099300   .414620  -.0888680   -41.100    -7.900  
+98 615 50979.00 I  -.098389  .000094   .415830  .000113  I -.0897238  .0000129  0.9019 0.0082  I   -42.265     .353    -8.274     .112  -.098200   .415820  -.0897280   -41.300    -7.900  
+98 616 50980.00 I  -.097022  .000098   .417175  .000110  I -.0906571  .0000097  0.9608 0.0079  I   -42.306     .318    -8.214     .298  -.096830   .417220  -.0906520   -41.700    -7.900  
+98 617 50981.00 I  -.095357  .000093   .418640  .000107  I -.0916396  .0000091  1.0022 0.0066  I   -42.294     .318    -8.064     .298  -.095290   .418670  -.0916240   -42.200    -7.800  
+98 618 50982.00 I  -.093646  .000092   .420329  .000110  I -.0926459  .0000089  0.9969 0.0064  I   -42.385     .318    -7.755     .298  -.093450   .420380  -.0926230   -42.900    -7.800  
+98 619 50983.00 I  -.091783  .000089   .421990  .000104  I -.0936208  .0000089  0.9539 0.0063  I   -42.737     .313    -7.381     .110  -.091580   .422120  -.0936100   -43.500    -7.900  
+98 620 50984.00 I  -.089921  .000082   .423490  .000101  I -.0945457  .0000090  0.8871 0.0051  I   -43.376     .271    -7.149     .115  -.089720   .423670  -.0945390   -44.000    -8.000  
+98 621 50985.00 I  -.088168  .000060   .424852  .000108  I -.0953771  .0000051  0.7668 0.0057  I   -44.109     .125    -7.200     .298  -.087960   .425010  -.0953740   -44.500    -8.000  
+98 622 50986.00 I  -.086454  .000066   .426143  .000102  I -.0960672  .0000071  0.6101 0.0048  I   -44.651     .791    -7.494     .114  -.086300   .426230  -.0960770   -44.700    -8.200  
+98 623 50987.00 I  -.084694  .000068   .427473  .000109  I -.0966007  .0000082  0.4635 0.0057  I   -44.835     .791    -7.869     .114  -.084560   .427490  -.0966180   -44.800    -8.300  
+98 624 50988.00 I  -.082934  .000075   .428940  .000114  I -.0970187  .0000090  0.3905 0.0061  I   -44.696     .791    -8.192     .114  -.082690   .428930  -.0970360   -44.600    -8.400  
+98 625 50989.00 I  -.081371  .000074   .430507  .000121  I -.0974038  .0000091  0.3838 0.0061  I   -44.427     .791    -8.360     .114  -.081120   .430630  -.0974240   -44.400    -8.500  
+98 626 50990.00 I  -.079860  .000077   .431951  .000122  I -.0977963  .0000083  0.4069 0.0067  I   -44.265     .139    -8.489     .298  -.079670   .432110  -.0978250   -44.100    -8.600  
+98 627 50991.00 I  -.078218  .000080   .433227  .000145  I -.0982229  .0000097  0.4457 0.0071  I   -44.404     .139    -8.676     .298  -.078070   .433380  -.0982420   -44.000    -8.700  
+98 628 50992.00 I  -.076251  .000088   .434408  .000137  I -.0986901  .0000114  0.4916 0.0069  I   -44.877     .506    -8.839     .298  -.076120   .434520  -.0986920   -44.000    -8.800  
+98 629 50993.00 I  -.073849  .000085   .435647  .000141  I -.0992107  .0000098  0.5513 0.0071  I   -45.473     .582    -8.861     .158  -.073650   .435640  -.0992050   -44.100    -8.800  
+98 630 50994.00 I  -.071100  .000086   .437082  .000153  I -.0997910  .0000086  0.6059 0.0065  I   -45.877     .511    -8.727     .139  -.070940   .437030  -.0997880   -44.400    -8.700  
+98 7 1 50995.00 I  -.068239  .000082   .438694  .000153  I -.1004131  .0000085  0.6322 0.0061  I   -45.942     .511    -8.503     .139  -.068160   .438840  -.1004110   -44.800    -8.700  
+98 7 2 50996.00 I  -.065567  .000082   .440347  .000157  I -.1010373  .0000086  0.6041 0.0056  I   -45.929     .511    -8.285     .139  -.065400   .440690  -.1010300   -45.200    -8.400  
+98 7 3 50997.00 I  -.063009  .000079   .441996  .000130  I -.1016024  .0000073  0.5193 0.0049  I   -45.994     .511    -8.101     .139  -.062830   .442190  -.1015890   -45.700    -8.200  
+98 7 4 50998.00 I  -.060511  .000080   .443674  .000135  I -.1020711  .0000049  0.4202 0.0043  I   -46.149     .513    -7.903     .158  -.060370   .443770  -.1020530   -46.000    -8.000  
+98 7 5 50999.00 I  -.057993  .000063   .445381  .000155  I -.1024447  .0000046  0.3268 0.0042  I   -46.368     .168    -7.676     .298  -.057850   .445490  -.1024230   -46.300    -7.800  
+98 7 6 51000.00 I  -.055404  .000098   .447048  .000156  I -.1027229  .0000069  0.2281 0.0042  I   -46.595     .791    -7.491     .298  -.055190   .447270  -.1027270   -46.900    -7.800  
+98 7 7 51001.00 I  -.052822  .000104   .448568  .000155  I -.1029010  .0000071  0.1297 0.0060  I   -46.748     .791    -7.448     .298  -.052640   .448880  -.1029200   -46.900    -7.700  
+98 7 8 51002.00 I  -.050272  .000103   .449909  .000152  I -.1029867  .0000099  0.0445 0.0061  I   -46.743     .791    -7.578     .298  -.050110   .450080  -.1030040   -46.600    -7.600  
+98 7 9 51003.00 I  -.047789  .000113   .451171  .000154  I -.1030078  .0000099  0.0129 0.0071  I   -46.598     .791    -7.777     .298  -.047580   .451160  -.1030060   -46.400    -7.600  
+98 710 51004.00 I  -.045284  .000107   .452559  .000144  I -.1030458  .0000102  0.0813 0.0067  I   -46.477     .791    -7.881     .298  -.045060   .452530  -.1030150   -46.200    -7.500  
+98 711 51005.00 I  -.042770  .000103   .454154  .000134  I -.1031990  .0000090  0.2354 0.0066  I   -46.574     .791    -7.811     .298  -.042630   .454360  -.1031510   -46.100    -7.600  
+98 712 51006.00 I  -.040237  .000073   .455835  .000120  I -.1035270  .0000083  0.4207 0.0062  I   -46.925     .791    -7.646     .298  -.040080   .456150  -.1034910   -46.100    -7.500  
+98 713 51007.00 I  -.037743  .000061   .457466  .000119  I -.1040342  .0000084  0.5875 0.0052  I   -47.361     .237    -7.531     .108  -.037610   .457660  -.1040260   -46.300    -7.600  
+98 714 51008.00 I  -.035317  .000060   .458998  .000113  I -.1046856  .0000062  0.7053 0.0052  I   -47.653     .239    -7.530     .298  -.035190   .459100  -.1046950   -46.600    -7.600  
+98 715 51009.00 I  -.032985  .000056   .460388  .000106  I -.1054234  .0000063  0.7591 0.0046  I   -47.720     .239    -7.593     .298  -.032820   .460470  -.1054320   -47.100    -7.700  
+98 716 51010.00 I  -.030768  .000055   .461506  .000101  I -.1061780  .0000069  0.7356 0.0046  I   -47.690     .239    -7.644     .298  -.030630   .461620  -.1061790   -47.600    -7.700  
+98 717 51011.00 I  -.028607  .000060   .462383  .000098  I -.1068703  .0000066  0.6392 0.0049  I   -47.745     .276    -7.711     .109  -.028420   .462510  -.1068730   -48.200    -7.800  
+98 718 51012.00 I  -.026513  .000066   .463176  .000094  I -.1074437  .0000070  0.5047 0.0044  I   -48.045     .276    -7.865     .109  -.026280   .463320  -.1074530   -48.700    -8.000  
+98 719 51013.00 I  -.024528  .000079   .463998  .000071  I -.1078768  .0000059  0.3615 0.0060  I   -48.570     .283    -8.132     .298  -.024350   .464190  -.1078910   -49.200    -8.100  
+98 720 51014.00 I  -.022578  .000108   .464858  .000082  I -.1081687  .0000097  0.2245 0.0062  I   -49.098     .280    -8.442     .298  -.022400   .465070  -.1081780   -49.500    -8.200  
+98 721 51015.00 I  -.020654  .000115   .465732  .000078  I -.1083355  .0000110  0.1168 0.0074  I   -49.392     .280    -8.620     .298  -.020390   .465930  -.1083390   -49.500    -8.300  
+98 722 51016.00 I  -.018742  .000107   .466609  .000081  I -.1084270  .0000112  0.0833 0.0078  I   -49.390     .280    -8.515     .298  -.018520   .466820  -.1084240   -49.500    -8.300  
+98 723 51017.00 I  -.016591  .000104   .467461  .000080  I -.1085268  .0000112  0.1239 0.0079  I   -49.144     .280    -8.246     .298  -.016390   .467730  -.1085030   -49.200    -8.400  
+98 724 51018.00 I  -.014288  .000101   .468234  .000078  I -.1086888  .0000112  0.2065 0.0082  I   -48.871     .280    -7.991     .298  -.014030   .468560  -.1086470   -48.900    -8.400  
+98 725 51019.00 I  -.011898  .000096   .468963  .000081  I -.1089490  .0000119  0.3169 0.0080  I   -48.771     .238    -7.853     .298  -.011710   .469190  -.1089050   -48.700    -8.400  
+98 726 51020.00 I  -.009354  .000054   .469790  .000064  I -.1093187  .0000113  0.4158 0.0078  I   -48.896     .791    -7.836     .298  -.009170   .469900  -.1092880   -48.700    -8.400  
+98 727 51021.00 I  -.006753  .000057   .470803  .000106  I -.1097667  .0000102  0.4729 0.0072  I   -49.207     .344    -7.885     .298  -.006510   .470970  -.1097590   -48.900    -8.400  
+98 728 51022.00 I  -.004257  .000119   .471952  .000148  I -.1102513  .0000088  0.4902 0.0074  I   -49.631     .281    -7.988     .298  -.004050   .472140  -.1102550   -49.400    -8.300  
+98 729 51023.00 I  -.001928  .000122   .473168  .000154  I -.1107348  .0000106  0.4705 0.0068  I   -50.038     .281    -8.169     .298  -.001800   .473270  -.1107300   -50.100    -8.200  
+98 730 51024.00 I   .000141  .000124   .474366  .000153  I -.1111979  .0000105  0.4675 0.0075  I   -50.280     .281    -8.393     .298   .000400   .474440  -.1111900   -51.000    -8.200  
+98 731 51025.00 I   .002045  .000122   .475412  .000157  I -.1116748  .0000106  0.4796 0.0074  I   -50.344     .281    -8.509     .298   .002240   .475590  -.1116620   -51.800    -8.200  
+98 8 1 51026.00 I   .003902  .000118   .476287  .000160  I -.1121413  .0000105  0.4444 0.0070  I   -50.405     .281    -8.419     .298   .004030   .476470  -.1121250   -52.400    -8.100  
+98 8 2 51027.00 I   .005810  .000139   .476934  .000165  I -.1125566  .0000092  0.3883 0.0084  I   -50.653     .791    -8.153     .298   .006030   .477150  -.1125390   -52.600    -8.100  
+98 8 3 51028.00 I   .007707  .000096   .477354  .000122  I -.1129220  .0000130  0.3444 0.0055  I   -51.055     .791    -7.825     .298   .007910   .477580  -.1129010   -52.500    -7.900  
+98 8 4 51029.00 I   .009695  .000101   .477689  .000120  I -.1132513  .0000060  0.3181 0.0072  I   -51.373     .791    -7.595     .298   .009780   .477780  -.1132420   -52.000    -7.700  
+98 8 5 51030.00 I   .011888  .000102   .478048  .000120  I -.1135649  .0000060  0.3117 0.0045  I   -51.435     .791    -7.588     .298   .011970   .478280  -.1135780   -51.300    -7.600  
+98 8 6 51031.00 I   .014036  .000107   .478378  .000108  I -.1138882  .0000067  0.3457 0.0044  I   -51.304     .791    -7.798     .298   .014310   .478670  -.1138850   -50.900    -7.500  
+98 8 7 51032.00 I   .016013  .000116   .478564  .000101  I -.1142787  .0000065  0.4469 0.0038  I   -51.165     .791    -8.045     .298   .016310   .478810  -.1142650   -50.600    -7.400  
+98 8 8 51033.00 I   .017857  .000099   .478532  .000092  I -.1147998  .0000035  0.6015 0.0040  I   -51.134     .791    -8.123     .298   .018000   .478750  -.1147840   -50.500    -7.400  
+98 8 9 51034.00 I   .019846  .000062   .478394  .000090  I -.1154884  .0000045  0.7763 0.0027  I   -51.238     .791    -7.997     .298   .020000   .478530  -.1154780   -50.400    -7.400  
+98 810 51035.00 I   .022136  .000106   .478349  .000116  I -.1163435  .0000040  0.9243 0.0032  I   -51.474     .130    -7.824     .298   .022360   .478550  -.1163610   -50.700    -7.500  
+98 811 51036.00 I   .024683  .000113   .478428  .000116  I -.1173135  .0000046  1.0016 0.0029  I   -51.813     .130    -7.773     .298   .024920   .478620  -.1172870   -51.100    -7.600  
+98 812 51037.00 I   .027507  .000118   .478537  .000120  I -.1183214  .0000043  1.0030 0.0035  I   -52.172     .130    -7.849     .298   .027750   .478650  -.1183140   -51.700    -7.800  
+98 813 51038.00 I   .030469  .000115   .478490  .000114  I -.1192916  .0000053  0.9207 0.0038  I   -52.470     .130    -7.924     .298   .030740   .478710  -.1193330   -52.400    -7.900  
+98 814 51039.00 I   .033161  .000123   .478373  .000115  I -.1201373  .0000062  0.7619 0.0048  I   -52.696     .130    -7.916     .298   .033470   .478530  -.1201380   -53.000    -8.000  
+98 815 51040.00 I   .035385  .000126   .478230  .000116  I -.1208043  .0000081  0.5699 0.0104  I   -52.929     .195    -7.861     .298   .035640   .478380  -.1208020   -53.400    -8.200  
+98 816 51041.00 I   .037338  .000076   .477954  .000077  I -.1212799  .0000198  0.3864 0.0104  I   -53.235     .284    -7.851     .298   .037440   .478200  -.1212930   -53.600    -8.200  
+98 817 51042.00 I   .039383  .000058   .477571  .000082  I -.1215970  .0000191  0.2625 0.0144  I   -53.541     .273    -7.944     .298   .039480   .477780  -.1215910   -53.600    -8.300  
+98 818 51043.00 I   .041616  .000039   .477282  .000079  I -.1218310  .0000209  0.2168 0.0146  I   -53.635     .273    -8.126     .298   .041850   .477460  -.1217910   -53.300    -8.300  
+98 819 51044.00 I   .043877  .000038   .477170  .000093  I -.1220399  .0000221  0.1988 0.0147  I   -53.354     .273    -8.330     .298   .044010   .477310  -.1220280   -52.900    -8.400  
+98 820 51045.00 I   .046118  .000032   .477172  .000087  I -.1222411  .0000206  0.2182 0.0153  I   -52.848     .273    -8.426     .298   .046250   .477350  -.1222380   -52.400    -8.400  
+98 821 51046.00 I   .048308  .000029   .477138  .000083  I -.1224999  .0000212  0.3085 0.0123  I   -52.357     .262    -8.392     .298   .048530   .477440  -.1224530   -52.100    -8.500  
+98 822 51047.00 I   .050364  .000033   .476926  .000086  I -.1228631  .0000134  0.4139 0.0121  I   -52.053     .207    -8.266     .298   .050550   .477220  -.1228260   -51.800    -8.500  
+98 823 51048.00 I   .052280  .000047   .476613  .000099  I -.1233193  .0000117  0.4943 0.0078  I   -51.975     .130    -8.090     .298   .052440   .476810  -.1233090   -51.700    -8.500  
+98 824 51049.00 I   .054145  .000049   .476412  .000124  I -.1238454  .0000078  0.5559 0.0069  I   -52.093     .310    -7.930     .144   .054320   .476560  -.1238350   -51.800    -8.500  
+98 825 51050.00 I   .056077  .000065   .476410  .000117  I -.1244283  .0000072  0.6093 0.0054  I   -52.360     .278    -7.882     .126   .056240   .476540  -.1244130   -52.200    -8.400  
+98 826 51051.00 I   .058154  .000067   .476479  .000122  I -.1250667  .0000074  0.6709 0.0053  I   -52.646     .278    -7.984     .126   .058240   .476620  -.1250660   -52.500    -8.200  
+98 827 51052.00 I   .060476  .000068   .476406  .000123  I -.1257468  .0000078  0.6626 0.0053  I   -52.766     .278    -8.121     .126   .060590   .476610  -.1257590   -52.900    -8.000  
+98 828 51053.00 I   .063022  .000067   .476301  .000123  I -.1263679  .0000075  0.5822 0.0056  I   -52.600     .278    -8.189     .126   .063220   .476500  -.1263670   -53.200    -7.900  
+98 829 51054.00 I   .065457  .000061   .476258  .000123  I -.1269255  .0000080  0.5446 0.0057  I   -52.391     .312    -8.140     .145   .065630   .476440  -.1268960   -53.500    -7.800  
+98 830 51055.00 I   .067554  .000058   .476216  .000070  I -.1274719  .0000086  0.5515 0.0072  I   -52.500     .145    -8.006     .298   .067680   .476380  -.1274620   -53.600    -7.700  
+98 831 51056.00 I   .069401  .000048   .476025  .000068  I -.1280318  .0000120  0.5684 0.0076  I   -52.913     .791    -7.856     .298   .069550   .476230  -.1280370   -53.500    -7.600  
+98 9 1 51057.00 I   .071120  .000054   .475561  .000064  I -.1286135  .0000126  0.5999 0.0086  I   -53.253     .791    -7.741     .298   .071240   .475620  -.1285890   -53.300    -8.100  
+98 9 2 51058.00 I   .072844  .000059   .474730  .000062  I -.1292386  .0000123  0.6526 0.0093  I   -53.270     .791    -7.722     .298   .073020   .474780  -.1292390   -53.100    -7.800  
+98 9 3 51059.00 I   .074764  .000068   .473551  .000055  I -.1299286  .0000137  0.7349 0.0093  I   -53.117     .791    -7.848     .298   .074860   .473590  -.1299930   -52.900    -7.400  
+98 9 4 51060.00 I   .077100  .000073   .472242  .000060  I -.1307263  .0000139  0.8707 0.0093  I   -53.060     .791    -8.050     .298   .077130   .472220  -.1307450   -52.800    -7.200  
+98 9 5 51061.00 I   .079771  .000071   .471042  .000062  I -.1316873  .0000126  1.0583 0.0090  I   -53.119     .791    -8.139     .298   .079940   .471050  -.1316510   -52.700    -7.200  
+98 9 6 51062.00 I   .082436  .000081   .470009  .000080  I -.1328413  .0000113  1.2412 0.0080  I   -53.159     .791    -7.991     .298   .082560   .470090  -.1328540   -52.700    -7.100  
+98 9 7 51063.00 I   .084904  .000090   .469113  .000105  I -.1341544  .0000099  1.3782 0.0076  I   -53.169     .791    -7.718     .298   .084950   .469130  -.1341840   -52.900    -7.300  
+98 9 8 51064.00 I   .087182  .000093   .468379  .000112  I -.1355772  .0000103  1.4537 0.0070  I   -53.291     .791    -7.561     .298   .087280   .468310  -.1355640   -53.200    -7.400  
+98 9 9 51065.00 I   .089300  .000094   .467798  .000116  I -.1370359  .0000099  1.4516 0.0075  I   -53.597     .791    -7.628     .298   .089440   .467860  -.1370290   -53.500    -7.700  
+98 910 51066.00 I   .091338  .000094   .467196  .000119  I -.1384475  .0000108  1.3507 0.0075  I   -53.976     .791    -7.806     .298   .091430   .467320  -.1384850   -53.900    -7.800  
+98 911 51067.00 I   .093191  .000104   .466586  .000113  I -.1397068  .0000112  1.1583 0.0078  I   -54.241     .791    -7.942     .298   .093290   .466610  -.1397250   -54.200    -8.000  
+98 912 51068.00 I   .094945  .000100   .466045  .000106  I -.1407607  .0000112  0.9558 0.0099  I   -54.286     .791    -8.017     .298   .095020   .466090  -.1407430   -54.300    -8.200  
+98 913 51069.00 I   .096838  .000077   .465596  .000083  I -.1416295  .0000163  0.7866 0.0082  I   -54.155     .791    -8.103     .298   .096750   .465690  -.1416630   -54.400    -8.300  
+98 914 51070.00 I   .099104  .000082   .465229  .000089  I -.1423579  .0000121  0.6895 0.0103  I   -53.982     .791    -8.212     .298   .099100   .465260  -.1423780   -54.200    -8.300  
+98 915 51071.00 I   .101649  .000086   .464944  .000092  I -.1430406  .0000127  0.6886 0.0089  I   -53.857     .791    -8.264     .298   .101750   .464930  -.1430220   -53.900    -8.300  
+98 916 51072.00 I   .104134  .000081   .464679  .000099  I -.1437528  .0000130  0.7410 0.0091  I   -53.728     .791    -8.182     .298   .104290   .464720  -.1437630   -53.600    -8.200  
+98 917 51073.00 I   .106262  .000070   .464282  .000096  I -.1445295  .0000129  0.8143 0.0091  I   -53.494     .791    -7.960     .298   .106540   .464300  -.1445660   -53.400    -8.000  
+98 918 51074.00 I   .107886  .000062   .463595  .000095  I -.1453877  .0000128  0.9064 0.0090  I   -53.178     .791    -7.703     .298   .108060   .463730  -.1453830   -53.200    -7.800  
+98 919 51075.00 I   .109157  .000064   .462458  .000095  I -.1463485  .0000126  1.0172 0.0084  I   -52.920     .791    -7.466     .298   .109190   .462570  -.1463160   -53.000    -7.500  
+98 920 51076.00 I   .110451  .000074   .461014  .000077  I -.1474139  .0000109  1.1035 0.0072  I   -52.815     .791    -7.210     .298   .110510   .460960  -.1474310   -52.900    -7.300  
+98 921 51077.00 I   .112012  .000069   .459494  .000120  I -.1485386  .0000068  1.1390 0.0060  I   -52.853     .791    -6.993     .298   .112080   .459540  -.1485550   -52.900    -7.200  
+98 922 51078.00 I   .113860  .000067   .457995  .000116  I -.1496770  .0000049  1.1299 0.0040  I   -52.965     .791    -6.951     .298   .113860   .458050  -.1496660   -52.800    -7.100  
+98 923 51079.00 I   .115813  .000066   .456545  .000116  I -.1507847  .0000044  1.0798 0.0047  I   -53.020     .791    -7.135     .298   .115840   .456520  -.1507800   -52.900    -7.100  
+98 924 51080.00 I   .117554  .000070   .455099  .000114  I -.1518337  .0000080  1.0211 0.0046  I   -52.833     .791    -7.414     .298   .117640   .455060  -.1518410   -53.000    -7.200  
+98 925 51081.00 I   .119055  .000074   .453760  .000119  I -.1528303  .0000080  0.9725 0.0054  I   -52.371     .791    -7.604     .298   .119170   .453760  -.1528260   -53.100    -7.300  
+98 926 51082.00 I   .120278  .000072   .452516  .000114  I -.1537788  .0000072  0.9240 0.0068  I   -51.923     .791    -7.638     .298   .120390   .452570  -.1537680   -53.100    -7.400  
+98 927 51083.00 I   .121282  .000062   .451171  .000065  I -.1546743  .0000110  0.8635 0.0060  I   -51.872     .791    -7.595     .298   .121340   .451320  -.1546930   -53.100    -7.500  
+98 928 51084.00 I   .122230  .000077   .449599  .000070  I -.1555100  .0000096  0.8156 0.0066  I   -52.222     .791    -7.548     .298   .122300   .449720  -.1555430   -53.100    -7.500  
+98 929 51085.00 I   .123196  .000068   .447930  .000083  I -.1563226  .0000073  0.8189 0.0051  I   -52.567     .791    -7.473     .298   .123320   .447910  -.1563210   -52.800    -7.400  
+98 930 51086.00 I   .124155  .000072   .446382  .000086  I -.1571765  .0000032  0.9082 0.0042  I   -52.603     .105    -7.352     .298   .124320   .446400  -.1571750   -52.500    -7.300  
+9810 1 51087.00 I   .125228  .000076   .445043  .000088  I -.1581667  .0000041  1.0806 0.0026  I   -52.453     .105    -7.258     .298   .125350   .445040  -.1581770   -52.100    -7.200  
+9810 2 51088.00 I   .126461  .000068   .443833  .000088  I -.1593503  .0000041  1.2909 0.0029  I   -52.389     .105    -7.256     .298   .126530   .443810  -.1593500   -51.600    -6.900  
+9810 3 51089.00 I   .128001  .000074   .442525  .000107  I -.1607548  .0000041  1.5201 0.0036  I   -52.397     .113    -7.265     .298   .128040   .442560  -.1607750   -51.300    -6.800  
+9810 4 51090.00 I   .129722  .000090   .441128  .000122  I -.1623864  .0000059  1.7371 0.0032  I   -52.287     .113    -7.141     .298   .129790   .441260  -.1623690   -51.000    -6.600  
+9810 5 51091.00 I   .131406  .000089   .439608  .000122  I -.1642040  .0000050  1.8792 0.0039  I   -52.014     .103    -6.918     .298   .131470   .439610  -.1641980   -51.000    -6.600  
+9810 6 51092.00 I   .132907  .000097   .437892  .000123  I -.1661050  .0000052  1.9019 0.0036  I   -51.778     .791    -6.808     .298   .132950   .438040  -.1661190   -51.100    -6.600  
+9810 7 51093.00 I   .134223  .000094   .435948  .000126  I -.1679813  .0000051  1.8451 0.0043  I   -51.803     .791    -6.917     .298   .134300   .436030  -.1679800   -51.300    -6.800  
+9810 8 51094.00 I   .135605  .000097   .433878  .000128  I -.1697762  .0000069  1.7314 0.0043  I   -52.125     .791    -7.060     .298   .135650   .433830  -.1697670   -51.700    -7.000  
+9810 9 51095.00 I   .137157  .000103   .431974  .000127  I -.1714343  .0000069  1.5884 0.0055  I   -52.567     .791    -7.073     .298   .137210   .431860  -.1714380   -52.000    -7.200  
+981010 51096.00 I   .138748  .000101   .430520  .000117  I -.1729566  .0000085  1.4561 0.0060  I   -52.863     .157    -7.019     .298   .138840   .430600  -.1729550   -52.100    -7.400  
+981011 51097.00 I   .140117  .000083   .429469  .000105  I -.1743488  .0000098  1.3307 0.0083  I   -52.836     .203    -7.074     .298   .140170   .429510  -.1743740   -52.200    -7.600  
+981012 51098.00 I   .141200  .000072   .428517  .000099  I -.1756317  .0000143  1.2465 0.0095  I   -52.544     .266    -7.283     .298   .141300   .428710  -.1756750   -52.200    -7.700  
+981013 51099.00 I   .142006  .000072   .427407  .000091  I -.1768635  .0000162  1.2275 0.0102  I   -52.205     .266    -7.500     .298   .142080   .427600  -.1768890   -51.900    -7.800  
+981014 51100.00 I   .142798  .000065   .426003  .000093  I -.1781129  .0000146  1.2870 0.0113  I   -51.932     .266    -7.589     .298   .142800   .426040  -.1781180   -51.700    -7.500  
+981015 51101.00 I   .143900  .000067   .424493  .000097  I -.1794441  .0000158  1.3663 0.0103  I   -51.698     .266    -7.537     .298   .144040   .424490  -.1794610   -51.300    -7.400  
+981016 51102.00 I   .145221  .000060   .423152  .000084  I -.1808316  .0000144  1.4038 0.0107  I   -51.366     .244    -7.426     .298   .145380   .423230  -.1808420   -51.100    -7.100  
+981017 51103.00 I   .146618  .000044   .422003  .000070  I -.1822482  .0000145  1.4308 0.0100  I   -50.973     .244    -7.266     .298   .146710   .422100  -.1822120   -50.800    -6.700  
+981018 51104.00 I   .147994  .000079   .420910  .000066  I -.1836933  .0000140  1.4580 0.0081  I   -50.694     .791    -7.001     .298   .148110   .420990  -.1836610   -50.700    -6.500  
+981019 51105.00 I   .149208  .000080   .419738  .000108  I -.1851581  .0000071  1.4667 0.0077  I   -50.590     .791    -6.664     .298   .149290   .419730  -.1851800   -50.600    -6.300  
+981020 51106.00 I   .150207  .000089   .418399  .000108  I -.1866206  .0000065  1.4571 0.0044  I   -50.562     .791    -6.414     .298   .150230   .418400  -.1866130   -50.500    -6.300  
+981021 51107.00 I   .151112  .000088   .416821  .000109  I -.1880692  .0000053  1.4383 0.0043  I   -50.471     .791    -6.367     .298   .151150   .416880  -.1880530   -50.500    -6.200  
+981022 51108.00 I   .151751  .000102   .414917  .000124  I -.1894838  .0000056  1.3794 0.0037  I   -50.226     .791    -6.463     .298   .151950   .414940  -.1895090   -50.500    -6.300  
+981023 51109.00 I   .152151  .000102   .412904  .000123  I -.1908182  .0000053  1.2913 0.0040  I   -49.858     .791    -6.543     .298   .152320   .412880  -.1908230   -50.500    -6.400  
+981024 51110.00 I   .152450  .000095   .411039  .000121  I -.1920780  .0000058  1.2380 0.0051  I   -49.542     .791    -6.540     .298   .152530   .411040  -.1920590   -50.600    -6.500  
+981025 51111.00 I   .152867  .000075   .409395  .000106  I -.1933079  .0000087  1.2257 0.0077  I   -49.513     .791    -6.517     .298   .152960   .409450  -.1933040   -50.600    -6.500  
+981026 51112.00 I   .153419  .000061   .407837  .000105  I -.1945276  .0000142  1.2080 0.0099  I   -49.786     .791    -6.526     .298   .153510   .407950  -.1945460   -50.500    -6.500  
+981027 51113.00 I   .154100  .000056   .406206  .000097  I -.1957206  .0000177  1.1804 0.0124  I   -50.066     .791    -6.493     .298   .154190   .406270  -.1957380   -50.400    -6.400  
+981028 51114.00 I   .154951  .000043   .404482  .000084  I -.1969058  .0000204  1.2052 0.0137  I   -50.074     .791    -6.323     .298   .155000   .404560  -.1969190   -50.100    -6.300  
+981029 51115.00 I   .155988  .000040   .402752  .000080  I -.1981645  .0000209  1.3307 0.0144  I   -49.866     .791    -6.052     .298   .156040   .402790  -.1981300   -49.700    -6.100  
+981030 51116.00 I   .157099  .000041   .401147  .000081  I -.1995944  .0000203  1.5378 0.0130  I   -49.718     .791    -5.815     .298   .157170   .401180  -.1995050   -49.200    -5.700  
+981031 51117.00 I   .158205  .000047   .399656  .000085  I -.2012498  .0000156  1.7739 0.0121  I   -49.732     .791    -5.650     .298   .158280   .399690  -.2011920   -48.800    -5.400  
+9811 1 51118.00 I   .159372  .000050   .398227  .000101  I -.2031347  .0000133  1.9874 0.0086  I   -49.763     .157    -5.481     .298   .159470   .398270  -.2031340   -48.600    -5.200  
+9811 2 51119.00 I   .160608  .000060   .396796  .000095  I -.2051970  .0000074  2.1180 0.0075  I   -49.695     .174    -5.314     .298   .160720   .396800  -.2052100   -48.500    -5.100  
+9811 3 51120.00 I   .161800  .000099   .395350  .000114  I -.2073295  .0000069  2.1252 0.0049  I   -49.557     .158    -5.299     .298   .161840   .395320  -.2073330   -48.800    -5.200  
+9811 4 51121.00 I   .162759  .000108   .393866  .000116  I -.2094137  .0000065  2.0315 0.0052  I   -49.432     .144    -5.497     .298   .162790   .393910  -.2094130   -48.900    -5.300  
+9811 5 51122.00 I   .163186  .000105   .392206  .000121  I -.2113694  .0000078  1.8684 0.0052  I   -49.428     .144    -5.680     .298   .163190   .392310  -.2113550   -49.100    -5.600  
+9811 6 51123.00 I   .163127  .000107   .390338  .000130  I -.2131451  .0000082  1.6890 0.0057  I   -49.549     .144    -5.581     .298   .163130   .390500  -.2131330   -49.200    -5.900  
+9811 7 51124.00 I   .163177  .000103   .388193  .000131  I -.2147595  .0000083  1.5458 0.0056  I   -49.636     .125    -5.360     .104   .163230   .388320  -.2147600   -49.200    -6.100  
+9811 8 51125.00 I   .163540  .000100   .385840  .000108  I -.2162531  .0000077  1.4518 0.0064  I   -49.512     .791    -5.337     .115   .163570   .385860  -.2162550   -49.200    -6.200  
+9811 9 51126.00 I   .164135  .000088   .383444  .000093  I -.2176863  .0000097  1.4273 0.0061  I   -49.208     .791    -5.588     .298   .164150   .383480  -.2176810   -49.100    -6.200  
+981110 51127.00 I   .164793  .000054   .381095  .000082  I -.2191246  .0000094  1.4534 0.0059  I   -48.999     .118    -5.897     .298   .164860   .381130  -.2191100   -49.000    -6.100  
+981111 51128.00 I   .165431  .000047   .378844  .000080  I -.2205953  .0000067  1.4861 0.0059  I   -49.097     .139    -5.996     .298   .165440   .378810  -.2205850   -48.900    -6.000  
+981112 51129.00 I   .166094  .000042   .376752  .000078  I -.2220940  .0000072  1.5104 0.0049  I   -49.362     .139    -5.854     .298   .166110   .376800  -.2220960   -48.800    -5.700  
+981113 51130.00 I   .166560  .000039   .374724  .000068  I -.2236125  .0000071  1.5240 0.0051  I   -49.450     .139    -5.638     .298   .166620   .374820  -.2236190   -48.700    -5.500  
+981114 51131.00 I   .166577  .000039   .372674  .000077  I -.2251363  .0000071  1.5206 0.0067  I   -49.255     .139    -5.453     .298   .166590   .372680  -.2251430   -48.600    -5.200  
+981115 51132.00 I   .166129  .000059   .370621  .000104  I -.2266458  .0000113  1.4936 0.0065  I   -48.998     .158    -5.261     .298   .166180   .370690  -.2266690   -48.500    -5.000  
+981116 51133.00 I   .165389  .000074   .368567  .000127  I -.2281187  .0000108  1.4521 0.0078  I   -48.866     .277    -5.020     .168   .165440   .368620  -.2281310   -48.400    -4.800  
+981117 51134.00 I   .164616  .000078   .366565  .000147  I -.2295496  .0000108  1.4095 0.0074  I   -48.796     .320    -4.794     .206   .164590   .366530  -.2295470   -48.300    -4.700  
+981118 51135.00 I   .164092  .000082   .364644  .000150  I -.2309382  .0000100  1.3685 0.0074  I   -48.669     .320    -4.680     .206   .164060   .364670  -.2309380   -48.200    -4.800  
+981119 51136.00 I   .163768  .000094   .362711  .000152  I -.2322849  .0000100  1.3225 0.0071  I   -48.483     .320    -4.688     .206   .163740   .362710  -.2322770   -48.200    -4.800  
+981120 51137.00 I   .163194  .000105   .360797  .000147  I -.2335826  .0000102  1.2746 0.0071  I   -48.271     .320    -4.743     .206   .163200   .360760  -.2335820   -48.000    -4.900  
+981121 51138.00 I   .161963  .000096   .358907  .000136  I -.2348381  .0000101  1.2386 0.0082  I   -48.057     .320    -4.794     .206   .162040   .359040  -.2348520   -47.900    -5.100  
+981122 51139.00 I   .160085  .000077   .356946  .000110  I -.2360666  .0000129  1.2230 0.0072  I   -47.909     .791    -4.855     .298   .160030   .357130  -.2360610   -47.900    -5.100  
+981123 51140.00 I   .158115  .000073   .354896  .000096  I -.2372925  .0000104  1.2326 0.0083  I   -47.900     .791    -4.940     .298   .158090   .354910  -.2372750   -47.800    -5.200  
+981124 51141.00 I   .156354  .000073   .352913  .000095  I -.2385373  .0000106  1.2587 0.0077  I   -47.984     .791    -4.990     .298   .156480   .352940  -.2385630   -47.800    -5.000  
+981125 51142.00 I   .154814  .000070   .351026  .000107  I -.2398232  .0000113  1.3249 0.0079  I   -48.015     .791    -4.929     .298   .154930   .351080  -.2398440   -47.800    -4.900  
+981126 51143.00 I   .153691  .000061   .349091  .000104  I -.2412084  .0000116  1.4552 0.0081  I   -47.909     .791    -4.754     .298   .153770   .349160  -.2411550   -47.900    -4.600  
+981127 51144.00 I   .152791  .000066   .347042  .000109  I -.2427449  .0000117  1.6196 0.0072  I   -47.717     .791    -4.534     .298   .152870   .347140  -.2427040   -48.000    -4.300  
+981128 51145.00 I   .151834  .000075   .344872  .000114  I -.2444448  .0000086  1.7758 0.0075  I   -47.529     .791    -4.314     .298   .151860   .344890  -.2444480   -48.200    -4.200  
+981129 51146.00 I   .150915  .000079   .342720  .000125  I -.2462737  .0000093  1.8635 0.0057  I   -47.408     .791    -4.096     .298   .150870   .342630  -.2462790   -48.300    -4.100  
+981130 51147.00 I   .150141  .000120   .340779  .000149  I -.2481367  .0000076  1.8457 0.0058  I   -47.416     .172    -3.926     .298   .150250   .340730  -.2481490   -48.300    -4.100  
+9812 1 51148.00 I   .149184  .000115   .339098  .000146  I -.2499346  .0000068  1.7362 0.0049  I   -47.585     .172    -3.925     .298   .149440   .339290  -.2499460   -48.200    -4.100  
+9812 2 51149.00 I   .147951  .000122   .337562  .000148  I -.2515983  .0000061  1.5942 0.0046  I   -47.851     .172    -4.124     .298   .148060   .337590  -.2516030   -48.000    -4.100  
+9812 3 51150.00 I   .147004  .000127   .336146  .000141  I -.2531202  .0000061  1.4438 0.0041  I   -48.101     .172    -4.343     .298   .146980   .336120  -.2531290   -47.600    -4.300  
+9812 4 51151.00 I   .146455  .000127   .335017  .000137  I -.2544842  .0000055  1.2884 0.0044  I   -48.253     .172    -4.343     .298   .146520   .335080  -.2544910   -47.100    -4.400  
+9812 5 51152.00 I   .145863  .000128   .334151  .000152  I -.2557114  .0000063  1.1762 0.0056  I   -48.247     .175    -4.125     .298   .145960   .334300  -.2557150   -46.600    -4.400  
+9812 6 51153.00 I   .144933  .000091   .333320  .000153  I -.2568539  .0000097  1.1161 0.0056  I   -48.011     .182    -3.953     .298   .144940   .333360  -.2568680   -46.200    -4.500  
+9812 7 51154.00 I   .143695  .000088   .332385  .000137  I -.2579548  .0000093  1.0898 0.0071  I   -47.577     .184    -4.035     .298   .143730   .332270  -.2579490   -46.100    -4.500  
+9812 8 51155.00 I   .142269  .000076   .331265  .000131  I -.2590365  .0000103  1.0724 0.0072  I   -47.158     .184    -4.267     .298   .142260   .331140  -.2590450   -46.200    -4.500  
+9812 9 51156.00 I   .140845  .000072   .329776  .000124  I -.2601098  .0000109  1.0855 0.0076  I   -46.970     .184    -4.371     .298   .140850   .329720  -.2601250   -46.600    -4.400  
+981210 51157.00 I   .139654  .000065   .327889  .000116  I -.2612229  .0000113  1.1448 0.0075  I   -47.019     .184    -4.194     .298   .139700   .327880  -.2611980   -47.000    -4.200  
+981211 51158.00 I   .138670  .000065   .325829  .000111  I -.2623954  .0000103  1.1922 0.0076  I   -47.070     .184    -3.875     .298   .138680   .325810  -.2623830   -47.500    -3.900  
+981212 51159.00 I   .137880  .000067   .323810  .000082  I -.2635872  .0000102  1.1795 0.0070  I   -47.029     .187    -3.617     .298   .137890   .323810  -.2636020   -48.000    -3.700  
+981213 51160.00 I   .137344  .000046   .321899  .000062  I -.2647402  .0000095  1.1244 0.0059  I   -47.057     .109    -3.473     .298   .137390   .321940  -.2647510   -47.800    -3.600  
+981214 51161.00 I   .137118  .000048   .320090  .000090  I -.2658320  .0000061  1.0574 0.0055  I   -47.250     .150    -3.394     .298   .137150   .320130  -.2658350   -47.800    -3.500  
+981215 51162.00 I   .137191  .000056   .318439  .000094  I -.2668510  .0000054  0.9784 0.0039  I   -47.470     .133    -3.369     .298   .137240   .318410  -.2668620   -47.700    -3.400  
+981216 51163.00 I   .137482  .000059   .317021  .000101  I -.2677836  .0000047  0.8839 0.0037  I   -47.551     .133    -3.440     .298   .137450   .316970  -.2677810   -47.500    -3.500  
+981217 51164.00 I   .137993  .000065   .315738  .000105  I -.2686203  .0000051  0.7938 0.0035  I   -47.540     .133    -3.572     .298   .137950   .315730  -.2686130   -47.200    -3.600  
+981218 51165.00 I   .138867  .000071   .314494  .000109  I -.2693765  .0000051  0.7196 0.0034  I   -47.491     .133    -3.726     .298   .138870   .314470  -.2693900   -46.900    -3.800  
+981219 51166.00 I   .140070  .000066   .313420  .000137  I -.2700640  .0000045  0.6589 0.0047  I   -47.356     .140    -3.882     .298   .140080   .313340  -.2700750   -46.700    -3.900  
+981220 51167.00 I   .141362  .000066   .312536  .000132  I -.2707054  .0000078  0.6316 0.0049  I   -47.095     .791    -3.999     .298   .141430   .312550  -.2706980   -46.500    -4.000  
+981221 51168.00 I   .142330  .000074   .311541  .000129  I -.2713404  .0000087  0.6439 0.0059  I   -46.816     .791    -4.034     .298   .142400   .311680  -.2713370   -46.400    -4.000  
+981222 51169.00 I   .142795  .000070   .310097  .000128  I -.2720051  .0000088  0.6921 0.0063  I   -46.683     .791    -3.973     .298   .142860   .310170  -.2720570   -46.500    -3.800  
+981223 51170.00 I   .142988  .000067   .308356  .000126  I -.2727487  .0000090  0.8128 0.0067  I   -46.726     .791    -3.851     .298   .143050   .308250  -.2727810   -46.700    -3.700  
+981224 51171.00 I   .143090  .000066   .306710  .000126  I -.2736544  .0000100  1.0047 0.0067  I   -46.816     .791    -3.722     .298   .143130   .306690  -.2735780   -47.000    -3.600  
+981225 51172.00 I   .143080  .000068   .305222  .000119  I -.2747547  .0000099  1.1863 0.0069  I   -46.819     .791    -3.604     .298   .143110   .305330  -.2746410   -47.300    -3.400  
+981226 51173.00 I   .142815  .000082   .303796  .000074  I -.2760051  .0000096  1.3021 0.0065  I   -46.732     .791    -3.485     .298   .142820   .303820  -.2759310   -47.700    -3.400  
+981227 51174.00 I   .142282  .000099   .302444  .000087  I -.2773357  .0000085  1.3481 0.0062  I   -46.676     .101    -3.368     .298   .142260   .302430  -.2773300   -47.900    -3.400  
+981228 51175.00 I   .141721  .000102   .301186  .000088  I -.2786798  .0000078  1.3295 0.0056  I   -46.797     .384    -3.313     .131   .141690   .301160  -.2787160   -48.200    -3.400  
+981229 51176.00 I   .141207  .000101   .299985  .000105  I -.2799819  .0000074  1.2726 0.0049  I   -47.126     .384    -3.412     .131   .141210   .299910  -.2800170   -48.200    -3.600  
+981230 51177.00 I   .140598  .000106   .298726  .000102  I -.2812143  .0000060  1.1838 0.0048  I   -47.528     .384    -3.676     .131   .140690   .298710  -.2812110   -48.000    -3.800  
+981231 51178.00 I   .139675  .000101   .297292  .000109  I -.2823385  .0000062  1.0620 0.0038  I   -47.820     .384    -3.956     .131   .139760   .297390  -.2823330   -47.600    -3.900  
+99 1 1 51179.00 I   .138577  .000110   .295556  .000106  I  .7166587  .0000048  0.9492 0.0055  I   -47.878     .384    -4.035     .131   .138510   .295650   .7166370   -47.500    -4.100  
+99 1 2 51180.00 I   .137785  .000081   .293577  .000107  I  .7157494  .0000091  0.8776 0.0069  I   -47.682     .465    -3.856     .160   .137710   .293550   .7157410   -47.100    -4.300  
+99 1 3 51181.00 I   .137421  .000087   .291696  .000111  I  .7148885  .0000130  0.8510 0.0081  I   -47.278     .791    -3.620     .298   .137480   .291660   .7148720   -46.700    -4.400  
+99 1 4 51182.00 I   .137132  .000091   .290124  .000104  I  .7140379  .0000135  0.8529 0.0099  I   -46.762     .791    -3.573     .298   .137190   .290230   .7139820   -46.300    -4.300  
+99 1 5 51183.00 I   .136733  .000083   .288814  .000104  I  .7131775  .0000149  0.8702 0.0106  I   -46.302     .791    -3.734     .298   .136690   .288940   .7131390   -46.100    -4.200  
+99 1 6 51184.00 I   .136397  .000085   .287754  .000094  I  .7122751  .0000163  0.9546 0.0118  I   -46.058     .791    -3.893     .298   .136360   .287820   .7122810   -46.000    -4.000  
+99 1 7 51185.00 I   .136247  .000073   .287027  .000097  I  .7112608  .0000182  1.0616 0.0117  I   -46.047     .791    -3.871     .298   .136280   .287070   .7112410   -45.900    -3.600  
+99 1 8 51186.00 I   .136118  .000062   .286554  .000090  I  .7101793  .0000169  1.0866 0.0127  I   -46.166     .791    -3.703     .298   .136140   .286610   .7101380   -46.000    -3.400  
+99 1 9 51187.00 I   .135752  .000055   .286182  .000095  I  .7091003  .0000177  1.0737 0.0118  I   -46.356     .791    -3.545     .298   .135710   .286270   .7091040   -46.200    -3.200  
+99 110 51188.00 I   .134909  .000076   .285701  .000092  I  .7080310  .0000165  1.0635 0.0108  I   -46.640     .791    -3.475     .298   .134860   .285720   .7080490   -46.400    -3.100  
+99 111 51189.00 I   .133471  .000118   .284873  .000094  I  .7069893  .0000125  1.0051 0.0105  I   -46.985     .181    -3.444     .136   .133490   .284910   .7069560   -46.700    -3.100  
+99 112 51190.00 I   .131464  .000115   .283567  .000090  I  .7060440  .0000130  0.8769 0.0083  I   -47.259     .176    -3.366     .112   .131450   .283640   .7060060   -46.900    -3.100  
+99 113 51191.00 I   .129180  .000120   .281889  .000095  I  .7052302  .0000109  0.7646 0.0085  I   -47.387     .176    -3.229     .112   .129100   .281870   .7052330   -47.000    -3.300  
+99 114 51192.00 I   .126962  .000119   .279990  .000100  I  .7044958  .0000109  0.7091 0.0073  I   -47.455     .176    -3.108     .112   .126900   .280070   .7044610   -47.000    -3.400  
+99 115 51193.00 I   .124851  .000120   .277989  .000092  I  .7038139  .0000096  0.6477 0.0074  I   -47.512     .176    -3.137     .112   .124920   .278020   .7037620   -47.000    -3.500  
+99 116 51194.00 I   .122714  .000123   .276071  .000093  I  .7032033  .0000100  0.5777 0.0074  I   -47.503     .176    -3.349     .112   .122820   .276030   .7031910   -46.900    -3.600  
+99 117 51195.00 I   .120630  .000073   .274356  .000090  I  .7026480  .0000113  0.5392 0.0064  I   -47.340     .166    -3.626     .298   .120620   .274400   .7026250   -46.700    -3.600  
+99 118 51196.00 I   .118887  .000096   .272823  .000106  I  .7021026  .0000080  0.5676 0.0069  I   -47.048     .791    -3.800     .298   .118870   .272900   .7020740   -46.600    -3.600  
+99 119 51197.00 I   .117525  .000094   .271405  .000098  I  .7014865  .0000080  0.6747 0.0069  I   -46.777     .791    -3.794     .298   .117530   .271450   .7014750   -46.500    -3.600  
+99 120 51198.00 I   .116539  .000099   .270022  .000113  I  .7007330  .0000112  0.8423 0.0084  I   -46.640     .791    -3.676     .298   .116510   .270050   .7007330   -46.500    -3.600  
+99 121 51199.00 I   .116083  .000100   .268687  .000100  I  .6997928  .0000147  1.0373 0.0091  I   -46.604     .791    -3.568     .298   .116100   .268630   .6997900   -46.600    -3.600  
+99 122 51200.00 I   .116118  .000102   .267493  .000102  I  .6986675  .0000144  1.2050 0.0121  I   -46.568     .791    -3.522     .298   .116140   .267460   .6986490   -46.700    -3.600  
+99 123 51201.00 I   .116223  .000124   .266420  .000119  I  .6973983  .0000193  1.3262 0.0144  I   -46.497     .791    -3.504     .298   .116330   .266480   .6973720   -46.800    -3.600  
+99 124 51202.00 I   .115937  .000140   .265363  .000117  I  .6960300  .0000249  1.4029 0.0134  I   -46.465     .791    -3.479     .298   .116040   .265470   .6960030   -47.000    -3.600  
+99 125 51203.00 I   .115117  .000162   .264256  .000133  I  .6946208  .0000187  1.3948 0.0141  I   -46.584     .200    -3.478     .106   .115100   .264350   .6945500   -47.100    -3.600  
+99 126 51204.00 I   .113991  .000180   .263174  .000146  I  .6932696  .0000133  1.2991 0.0108  I   -46.893     .296    -3.577     .115   .113920   .263120   .6931850   -47.100    -3.700  
+99 127 51205.00 I   .112826  .000169   .262237  .000149  I  .6920205  .0000109  1.2098 0.0087  I   -47.300     .312    -3.820     .100   .112830   .262250   .6919960   -47.000    -3.800  
+99 128 51206.00 I   .111620  .000171   .261398  .000146  I  .6908379  .0000111  1.1568 0.0062  I   -47.630     .312    -4.136     .100   .111640   .261450   .6908520   -46.800    -3.900  
+99 129 51207.00 I   .110525  .000159   .260526  .000142  I  .6896941  .0000057  1.1422 0.0066  I   -47.705     .312    -4.271     .100   .110480   .260550   .6896900   -46.600    -4.000  
+99 130 51208.00 I   .109379  .000160   .259573  .000132  I  .6885405  .0000072  1.1665 0.0048  I   -47.600     .312    -4.157     .100   .109400   .259590   .6885240   -46.300    -4.100  
+99 131 51209.00 I   .108080  .000135   .258531  .000117  I  .6873571  .0000077  1.2029 0.0058  I   -47.418     .348    -3.950     .298   .108160   .258590   .6873410   -46.100    -4.200  
+99 2 1 51210.00 I   .106598  .000138   .257341  .000121  I  .6861313  .0000092  1.2494 0.0086  I   -47.214     .262    -3.884     .298   .106640   .257490   .6861150   -46.900    -4.200  
+99 2 2 51211.00 I   .105004  .000172   .256005  .000104  I  .6848593  .0000153  1.2930 0.0090  I   -46.983     .171    -4.080     .298   .105030   .256080   .6848460   -46.700    -4.300  
+99 2 3 51212.00 I   .103396  .000174   .254659  .000128  I  .6835503  .0000155  1.3218 0.0108  I   -46.725     .171    -4.430     .298   .103380   .254690   .6835470   -46.500    -4.500  
+99 2 4 51213.00 I   .101922  .000189   .253439  .000157  I  .6822214  .0000153  1.3336 0.0105  I   -46.559     .171    -4.657     .298   .101750   .253390   .6822120   -46.600    -4.700  
+99 2 5 51214.00 I   .100916  .000190   .252566  .000161  I  .6808880  .0000142  1.3308 0.0105  I   -46.571     .171    -4.685     .298   .100770   .252400   .6808730   -47.200    -4.400  
+99 2 6 51215.00 I   .100335  .000184   .252224  .000166  I  .6795667  .0000143  1.3073 0.0109  I   -46.749     .129    -4.628     .298   .100380   .252260   .6795660   -47.200    -4.500  
+99 2 7 51216.00 I   .099624  .000192   .252238  .000170  I  .6782837  .0000165  1.2529 0.0096  I   -47.008     .244    -4.601     .298   .099720   .252380   .6782890   -46.900    -5.000  
+99 2 8 51217.00 I   .098384  .000190   .252265  .000170  I  .6770716  .0000129  1.1665 0.0107  I   -47.202     .301    -4.608     .166   .098340   .252260   .6770550   -47.200    -4.900  
+99 2 9 51218.00 I   .096675  .000188   .252190  .000162  I  .6759507  .0000137  1.0800 0.0096  I   -47.252     .301    -4.589     .166   .096530   .252090   .6759100   -47.300    -4.600  
+99 210 51219.00 I   .094706  .000186   .251925  .000143  I  .6749074  .0000142  1.0062 0.0103  I   -47.200     .261    -4.537     .157   .094590   .252050   .6748970   -47.300    -4.400  
+99 211 51220.00 I   .092622  .000185   .251225  .000147  I  .6739383  .0000155  0.9326 0.0105  I   -47.053     .261    -4.638     .157   .092500   .251370   .6739270   -47.200    -4.300  
+99 212 51221.00 I   .090736  .000180   .250235  .000147  I  .6730319  .0000154  0.8901 0.0103  I   -46.899     .261    -4.883     .157   .090610   .250190   .6730310   -46.700    -4.200  
+99 213 51222.00 I   .089163  .000171   .249217  .000149  I  .6721348  .0000135  0.9176 0.0121  I   -46.812     .232    -5.137     .175   .089120   .249330   .6721840   -46.300    -4.400  
+99 214 51223.00 I   .087881  .000120   .248238  .000112  I  .6711759  .0000186  1.0075 0.0096  I   -46.760     .791    -5.353     .125   .087860   .248370   .6711830   -45.900    -4.400  
+99 215 51224.00 I   .086783  .000124   .247431  .000101  I  .6701095  .0000137  1.1284 0.0114  I   -46.648     .791    -5.413     .298   .086770   .247460   .6701030   -45.600    -4.500  
+99 216 51225.00 I   .085708  .000113   .246965  .000111  I  .6689138  .0000131  1.2651 0.0090  I   -46.401     .134    -5.227     .298   .085630   .246990   .6689060   -45.600    -4.700  
+99 217 51226.00 I   .084445  .000109   .246805  .000094  I  .6675690  .0000117  1.4327 0.0090  I   -46.049     .134    -4.889     .298   .084480   .246820   .6675580   -45.700    -4.700  
+99 218 51227.00 I   .082689  .000111   .246707  .000096  I  .6660476  .0000124  1.6028 0.0084  I   -45.728     .134    -4.641     .298   .082810   .246830   .6660510   -46.100    -4.700  
+99 219 51228.00 I   .080806  .000104   .246425  .000086  I  .6643896  .0000121  1.6944 0.0087  I   -45.613     .134    -4.616     .298   .080790   .246630   .6643680   -46.500    -4.700  
+99 220 51229.00 I   .079313  .000097   .245935  .000081  I  .6626922  .0000121  1.6860 0.0105  I   -45.768     .134    -4.750     .298   .079250   .246020   .6626600   -46.900    -4.700  
+99 221 51230.00 I   .078445  .000095   .245457  .000104  I  .6610367  .0000171  1.6205 0.0095  I   -46.092     .144    -4.918     .298   .078400   .245460   .6610490   -47.400    -4.700  
+99 222 51231.00 I   .078153  .000092   .245134  .000087  I  .6594679  .0000147  1.5049 0.0111  I   -46.465     .791    -5.026     .298   .078140   .245200   .6594700   -47.500    -4.700  
+99 223 51232.00 I   .078078  .000088   .244906  .000087  I  .6580462  .0000142  1.3315 0.0099  I   -46.815     .791    -5.072     .298   .078080   .244950   .6580360   -47.400    -4.900  
+99 224 51233.00 I   .077632  .000084   .244669  .000081  I  .6568065  .0000133  1.1532 0.0099  I   -47.075     .791    -5.107     .298   .077660   .244710   .6568110   -47.100    -5.000  
+99 225 51234.00 I   .076472  .000088   .244314  .000081  I  .6557266  .0000137  1.0145 0.0096  I   -47.155     .791    -5.161     .298   .076510   .244390   .6557030   -46.700    -5.200  
+99 226 51235.00 I   .074875  .000093   .243781  .000079  I  .6547633  .0000139  0.9184 0.0097  I   -47.000     .791    -5.216     .298   .074890   .243870   .6547300   -46.200    -5.400  
+99 227 51236.00 I   .073082  .000090   .243098  .000081  I  .6538706  .0000136  0.8800 0.0110  I   -46.668     .791    -5.242     .298   .073090   .243170   .6538810   -45.800    -5.500  
+99 228 51237.00 I   .071378  .000063   .242384  .000056  I  .6529831  .0000170  0.9022 0.0088  I   -46.327     .791    -5.260     .298   .071330   .242420   .6529950   -45.500    -5.700  
+99 3 1 51238.00 I   .069983  .000071   .241806  .000065  I  .6520627  .0000113  0.9350 0.0116  I   -46.124     .791    -5.336     .298   .069960   .241870   .6520380   -45.400    -5.700  
+99 3 2 51239.00 I   .068909  .000072   .241487  .000067  I  .6511207  .0000158  0.9451 0.0102  I   -46.061     .791    -5.504     .298   .068880   .241600   .6510780   -45.400    -5.700  
+99 3 3 51240.00 I   .068114  .000078   .241469  .000077  I  .6501709  .0000171  0.9601 0.0113  I   -46.029     .791    -5.696     .298   .068060   .241560   .6501610   -45.700    -5.700  
+99 3 4 51241.00 I   .067407  .000076   .241688  .000069  I  .6491932  .0000162  0.9971 0.0115  I   -46.000     .791    -5.803     .298   .067400   .241730   .6492320   -46.000    -5.700  
+99 3 5 51242.00 I   .066561  .000073   .242023  .000068  I  .6481793  .0000153  1.0262 0.0098  I   -46.084     .791    -5.799     .298   .066570   .242140   .6481930   -46.300    -5.600  
+99 3 6 51243.00 I   .065483  .000102   .242354  .000090  I  .6471690  .0000110  0.9708 0.0095  I   -46.347     .791    -5.754     .298   .065460   .242450   .6471360   -46.500    -5.600  
+99 3 7 51244.00 I   .064348  .000125   .242547  .000088  I  .6462538  .0000113  0.8672 0.0066  I   -46.648     .791    -5.748     .298   .064360   .242600   .6462500   -46.600    -5.600  
+99 3 8 51245.00 I   .063278  .000145   .242556  .000090  I  .6454247  .0000074  0.7933 0.0062  I   -46.764     .791    -5.789     .298   .063280   .242620   .6454270   -46.600    -5.700  
+99 3 9 51246.00 I   .062192  .000158   .242377  .000085  I  .6446631  .0000049  0.7318 0.0043  I   -46.623     .791    -5.839     .298   .062040   .242430   .6446490   -46.400    -5.700  
+99 310 51247.00 I   .061032  .000159   .242009  .000087  I  .6439529  .0000045  0.6951 0.0034  I   -46.311     .791    -5.857     .298   .060890   .242050   .6439460   -46.200    -5.800  
+99 311 51248.00 I   .059969  .000168   .241610  .000090  I  .6432600  .0000048  0.6971 0.0033  I   -45.903     .791    -5.815     .298   .059840   .241620   .6432690   -46.000    -5.800  
+99 312 51249.00 I   .058807  .000157   .241239  .000067  I  .6425445  .0000047  0.7417 0.0036  I   -45.456     .791    -5.726     .298   .058710   .241350   .6425460   -45.800    -5.900  
+99 313 51250.00 I   .057514  .000158   .240861  .000080  I  .6417607  .0000054  0.8340 0.0035  I   -45.108     .791    -5.693     .298   .057520   .241090   .6417470   -45.700    -6.000  
+99 314 51251.00 I   .056092  .000126   .240433  .000098  I  .6408596  .0000052  0.9770 0.0039  I   -45.028     .791    -5.818     .298   .056150   .240550   .6408520   -45.500    -6.000  
+99 315 51252.00 I   .054562  .000114   .239984  .000120  I  .6397960  .0000055  1.1522 0.0040  I   -45.165     .791    -6.058     .298   .054620   .239970   .6397940   -45.200    -6.100  
+99 316 51253.00 I   .052907  .000112   .239553  .000136  I  .6385563  .0000061  1.3240 0.0041  I   -45.220     .791    -6.234     .298   .052900   .239580   .6385570   -45.000    -6.200  
+99 317 51254.00 I   .051136  .000104   .239142  .000136  I  .6371559  .0000062  1.4721 0.0048  I   -44.996     .791    -6.233     .298   .051100   .239140   .6371530   -44.700    -6.200  
+99 318 51255.00 I   .049793  .000103   .238932  .000138  I  .6356238  .0000073  1.5850 0.0048  I   -44.655     .791    -6.111     .298   .049790   .238830   .6356030   -44.600    -6.200  
+99 319 51256.00 I   .048941  .000108   .239050  .000123  I  .6340022  .0000073  1.6489 0.0061  I   -44.570     .791    -6.095     .298   .049020   .238990   .6339940   -44.700    -6.200  
+99 320 51257.00 I   .048186  .000086   .239430  .000114  I  .6323403  .0000098  1.6697 0.0075  I   -44.878     .106    -6.311     .298   .048260   .239470   .6323600   -44.900    -6.300  
+99 321 51258.00 I   .047327  .000075   .239931  .000093  I  .6306782  .0000130  1.6442 0.0067  I   -45.346     .791    -6.634     .298   .047260   .239980   .6306790   -45.100    -6.400  
+99 322 51259.00 I   .046514  .000071   .240468  .000077  I  .6290778  .0000091  1.5409 0.0081  I   -45.660     .791    -6.856     .298   .046430   .240490   .6290540   -45.300    -6.400  
+99 323 51260.00 I   .045565  .000101   .240966  .000097  I  .6276165  .0000096  1.3774 0.0064  I   -45.699     .791    -6.887     .298   .045540   .241010   .6275870   -45.400    -6.500  
+99 324 51261.00 I   .044085  .000107   .241305  .000094  I  .6263131  .0000090  1.2436 0.0065  I   -45.537     .791    -6.777     .298   .044080   .241400   .6263030   -45.400    -6.700  
+99 325 51262.00 I   .042017  .000112   .241415  .000105  I  .6251109  .0000087  1.1648 0.0060  I   -45.278     .791    -6.621     .298   .041950   .241450   .6251350   -45.100    -6.800  
+99 326 51263.00 I   .039295  .000116   .241416  .000107  I  .6239616  .0000080  1.1516 0.0063  I   -44.959     .791    -6.551     .298   .039180   .241430   .6239720   -44.700    -7.000  
+99 327 51264.00 I   .036347  .000107   .241357  .000125  I  .6227854  .0000090  1.2054 0.0066  I   -44.580     .791    -6.601     .298   .036230   .241480   .6227770   -44.200    -7.000  
+99 328 51265.00 I   .033747  .000103   .241145  .000129  I  .6215430  .0000106  1.2825 0.0063  I   -44.207     .791    -6.741     .298   .033680   .241250   .6215430   -43.800    -7.100  
+99 329 51266.00 I   .031676  .000060   .240915  .000124  I  .6202226  .0000089  1.3530 0.0076  I   -43.975     .791    -6.930     .298   .031690   .240850   .6202090   -43.600    -7.200  
+99 330 51267.00 I   .029843  .000062   .240902  .000124  I  .6188504  .0000108  1.3831 0.0071  I   -43.952     .791    -7.096     .298   .029860   .240820   .6188340   -43.600    -7.100  
+99 331 51268.00 I   .027952  .000047   .241025  .000114  I  .6174612  .0000110  1.3986 0.0074  I   -44.055     .791    -7.163     .298   .028000   .241080   .6174570   -43.900    -7.100  
+99 4 1 51269.00 I   .025972  .000046   .240966  .000119  I  .6160514  .0000102  1.4196 0.0071  I   -44.177     .791    -7.111     .298   .026030   .241020   .6160780   -44.100    -7.100  
+99 4 2 51270.00 I   .023889  .000045   .240663  .000104  I  .6146313  .0000091  1.4128 0.0069  I   -44.333     .791    -7.012     .298   .023870   .240740   .6146500   -44.600    -7.100  
+99 4 3 51271.00 I   .021820  .000048   .240215  .000098  I  .6132443  .0000094  1.3505 0.0076  I   -44.574     .791    -6.956     .298   .021760   .240220   .6132240   -45.000    -7.100  
+99 4 4 51272.00 I   .020052  .000105   .239794  .000087  I  .6119391  .0000121  1.2617 0.0072  I   -44.827     .791    -6.963     .298   .019960   .239760   .6119380   -45.200    -7.100  
+99 4 5 51273.00 I   .018652  .000146   .239541  .000087  I  .6107150  .0000110  1.1907 0.0081  I   -44.962     .791    -7.003     .298   .018570   .239620   .6107220   -45.300    -7.200  
+99 4 6 51274.00 I   .017384  .000149   .239548  .000084  I  .6095457  .0000107  1.1558 0.0077  I   -44.989     .791    -7.069     .298   .017320   .239570   .6095590   -45.100    -7.200  
+99 4 7 51275.00 I   .015829  .000147   .239833  .000081  I  .6084018  .0000107  1.1257 0.0074  I   -45.007     .791    -7.166     .298   .015740   .239860   .6084080   -44.900    -7.100  
+99 4 8 51276.00 I   .013791  .000150   .240165  .000085  I  .6072974  .0000103  1.0862 0.0073  I   -44.959     .791    -7.240     .298   .013730   .240310   .6072760   -44.500    -7.100  
+99 4 9 51277.00 I   .012055  .000153   .240386  .000095  I  .6062115  .0000098  1.1002 0.0069  I   -44.678     .791    -7.199     .298   .011990   .240520   .6061980   -44.200    -7.100  
+99 410 51278.00 I   .010998  .000155   .240635  .000095  I  .6050749  .0000092  1.1804 0.0068  I   -44.248     .791    -7.066     .298   .010940   .240690   .6050670   -43.900    -7.100  
+99 411 51279.00 I   .010475  .000088   .241143  .000134  I  .6038335  .0000095  1.3121 0.0078  I   -44.036     .791    -7.015     .298   .010500   .241200   .6038210   -43.700    -7.000  
+99 412 51280.00 I   .010119  .000083   .241969  .000151  I  .6024322  .0000127  1.4991 0.0061  I   -44.206     .791    -7.154     .298   .010210   .242090   .6024510   -43.700    -7.000  
+99 413 51281.00 I   .009565  .000082   .242944  .000147  I  .6008268  .0000078  1.7116 0.0076  I   -44.423     .791    -7.346     .298   .009610   .243030   .6008480   -43.800    -7.100  
+99 414 51282.00 I   .008800  .000080   .243956  .000148  I  .5990280  .0000084  1.8672 0.0061  I   -44.271     .791    -7.351     .298   .008830   .243840   .5990220   -44.000    -7.200  
+99 415 51283.00 I   .008074  .000078   .245070  .000131  I  .5971222  .0000095  1.9336 0.0060  I   -43.819     .791    -7.158     .298   .008020   .244910   .5971310   -44.100    -7.300  
+99 416 51284.00 I   .007323  .000066   .246324  .000126  I  .5951849  .0000086  1.9279 0.0065  I   -43.559     .791    -7.024     .298   .007300   .246280   .5951890   -44.100    -7.500  
+99 417 51285.00 I   .006257  .000079   .247512  .000132  I  .5932963  .0000088  1.8325 0.0065  I   -43.772     .791    -7.166     .298   .006360   .247560   .5932790   -44.100    -7.600  
+99 418 51286.00 I   .004782  .000089   .248353  .000086  I  .5915380  .0000098  1.6829 0.0063  I   -44.219     .251    -7.503     .298   .004820   .248450   .5915350   -44.100    -7.800  
+99 419 51287.00 I   .003071  .000099   .248755  .000092  I  .5899323  .0000091  1.5280 0.0073  I   -44.483     .325    -7.783     .298   .002980   .248890   .5899240   -43.900    -7.900  
+99 420 51288.00 I   .001508  .000100   .248848  .000098  I  .5884751  .0000108  1.3936 0.0069  I   -44.426     .295    -7.869     .298   .001420   .248930   .5884800   -43.800    -7.800  
+99 421 51289.00 I   .000190  .000098   .248839  .000093  I  .5871312  .0000105  1.3007 0.0076  I   -44.255     .295    -7.827     .298   .000130   .248850   .5871390   -43.800    -7.700  
+99 422 51290.00 I  -.001057  .000101   .248911  .000095  I  .5858655  .0000106  1.2325 0.0077  I   -44.189     .295    -7.787     .298  -.001090   .248950   .5858710   -43.600    -7.600  
+99 423 51291.00 I  -.002271  .000103   .249270  .000091  I  .5846479  .0000112  1.2194 0.0079  I   -44.270     .295    -7.720     .298  -.002300   .249360   .5846520   -43.500    -7.500  
+99 424 51292.00 I  -.003651  .000095   .249966  .000081  I  .5834051  .0000116  1.2713 0.0088  I   -44.363     .268    -7.615     .298  -.003630   .250120   .5833930   -43.300    -7.300  
+99 425 51293.00 I  -.005339  .000082   .250849  .000052  I  .5820993  .0000136  1.3412 0.0103  I   -44.286     .126    -7.538     .298  -.005340   .251010   .5820920   -43.200    -7.300  
+99 426 51294.00 I  -.006985  .000083   .251766  .000048  I  .5807227  .0000170  1.4110 0.0108  I   -44.026     .791    -7.532     .298  -.007100   .251870   .5807220   -43.200    -7.400  
+99 427 51295.00 I  -.008027  .000082   .252694  .000051  I  .5792838  .0000169  1.4614 0.0123  I   -43.778     .791    -7.563     .298  -.008140   .252780   .5792780   -43.200    -7.400  
+99 428 51296.00 I  -.008362  .000084   .253742  .000048  I  .5778108  .0000179  1.4793 0.0112  I   -43.721     .791    -7.570     .298  -.008440   .253770   .5777930   -43.400    -7.500  
+99 429 51297.00 I  -.008472  .000088   .255001  .000051  I  .5763380  .0000146  1.4590 0.0110  I   -43.841     .791    -7.479     .298  -.008530   .255000   .5763270   -43.500    -7.500  
+99 430 51298.00 I  -.008673  .000085   .256408  .000053  I  .5749065  .0000127  1.3976 0.0087  I   -44.012     .791    -7.403     .298  -.008740   .256480   .5749090   -43.600    -7.400  
+99 5 1 51299.00 I  -.009270  .000083   .257734  .000058  I  .5735522  .0000095  1.3080 0.0078  I   -44.149     .791    -7.461     .298  -.009340   .257860   .5735560   -43.700    -7.500  
+99 5 2 51300.00 I  -.010432  .000074   .258759  .000078  I  .5722963  .0000090  1.2009 0.0063  I   -44.211     .791    -7.610     .298  -.010510   .258900   .5723070   -44.600    -7.600  
+99 5 3 51301.00 I  -.011958  .000109   .259424  .000083  I  .5711562  .0000082  1.0765 0.0060  I   -44.192     .791    -7.742     .298  -.011990   .259570   .5711640   -43.800    -7.600  
+99 5 4 51302.00 I  -.013543  .000106   .259790  .000092  I  .5701485  .0000080  0.9365 0.0058  I   -44.182     .791    -7.836     .298  -.013550   .260020   .5701520   -44.000    -7.800  
+99 5 5 51303.00 I  -.014882  .000102   .260006  .000094  I  .5692803  .0000081  0.8051 0.0057  I   -44.287     .791    -7.953     .298  -.014970   .260010   .5692870   -44.100    -7.900  
+99 5 6 51304.00 I  -.015809  .000105   .260357  .000096  I  .5685207  .0000081  0.7264 0.0059  I   -44.407     .791    -8.060     .298  -.015880   .260350   .5685460   -44.200    -7.900  
+99 5 7 51305.00 I  -.016511  .000098   .260980  .000098  I  .5677978  .0000085  0.7369 0.0056  I   -44.268     .791    -8.067     .298  -.016510   .261130   .5678080   -44.200    -7.900  
+99 5 8 51306.00 I  -.017204  .000086   .261793  .000100  I  .5670197  .0000078  0.8292 0.0056  I   -43.824     .791    -7.917     .298  -.017230   .261940   .5670120   -44.100    -8.000  
+99 5 9 51307.00 I  -.017955  .000070   .262620  .000088  I  .5661215  .0000072  0.9753 0.0053  I   -43.452     .791    -7.735     .298  -.018020   .262790   .5661330   -44.000    -8.000  
+99 510 51308.00 I  -.018562  .000059   .263437  .000080  I  .5650617  .0000071  1.1437 0.0051  I   -43.527     .791    -7.720     .298  -.018650   .263510   .5650480   -43.900    -7.900  
+99 511 51309.00 I  -.018908  .000060   .264417  .000084  I  .5638338  .0000071  1.3131 0.0050  I   -43.943     .791    -7.868     .298  -.019000   .264410   .5638010   -44.000    -7.900  
+99 512 51310.00 I  -.019144  .000058   .265626  .000080  I  .5624372  .0000071  1.4776 0.0057  I   -44.298     .791    -7.963     .298  -.019220   .265740   .5624390   -44.100    -7.900  
+99 513 51311.00 I  -.019272  .000063   .267017  .000079  I  .5608976  .0000089  1.5852 0.0051  I   -44.466     .791    -7.888     .298  -.019370   .267170   .5609190   -44.500    -7.900  
+99 514 51312.00 I  -.019234  .000065   .268489  .000053  I  .5593032  .0000074  1.5837 0.0077  I   -44.718     .791    -7.796     .298  -.019350   .268670   .5593160   -44.800    -7.900  
+99 515 51313.00 I  -.019058  .000060   .270015  .000054  I  .5577666  .0000126  1.4732 0.0075  I   -45.251     .791    -7.884     .298  -.019090   .270160   .5577750   -45.100    -7.900  
+99 516 51314.00 I  -.019061  .000071   .271612  .000076  I  .5563793  .0000131  1.2952 0.0086  I   -45.840     .791    -8.099     .298  -.019060   .271710   .5563890   -45.300    -8.000  
+99 517 51315.00 I  -.019409  .000093   .273248  .000087  I  .5551731  .0000118  1.1264 0.0086  I   -46.060     .243    -8.216     .298  -.019510   .273340   .5551900   -45.300    -8.000  
+99 518 51316.00 I  -.019872  .000093   .274767  .000100  I  .5541002  .0000112  1.0364 0.0075  I   -45.710     .245    -8.136     .298  -.019990   .274890   .5541190   -45.200    -8.000  
+99 519 51317.00 I  -.020213  .000090   .275981  .000098  I  .5530726  .0000094  1.0296 0.0076  I   -44.993     .245    -7.971     .298  -.020290   .276130   .5530890   -44.800    -8.000  
+99 520 51318.00 I  -.020417  .000091   .276839  .000102  I  .5520267  .0000104  1.0657 0.0074  I   -44.367     .245    -7.836     .298  -.020500   .276930   .5520360   -44.400    -7.900  
+99 521 51319.00 I  -.020523  .000081   .277505  .000098  I  .5509281  .0000115  1.1411 0.0080  I   -44.264     .245    -7.766     .298  -.020570   .277570   .5509490   -44.000    -7.800  
+99 522 51320.00 I  -.020535  .000083   .278185  .000095  I  .5497378  .0000121  1.2366 0.0094  I   -44.634     .245    -7.706     .298  -.020560   .278270   .5497680   -43.700    -7.600  
+99 523 51321.00 I  -.020552  .000059   .278928  .000089  I  .5484707  .0000149  1.2848 0.0102  I   -45.026     .249    -7.668     .298  -.020600   .279020   .5484720   -43.700    -7.600  
+99 524 51322.00 I  -.020768  .000045   .279657  .000087  I  .5471797  .0000164  1.2986 0.0110  I   -45.105     .791    -7.703     .298  -.020760   .279750   .5471860   -43.800    -7.500  
+99 525 51323.00 I  -.021347  .000045   .280333  .000097  I  .5458784  .0000161  1.2976 0.0116  I   -44.999     .791    -7.756     .298  -.021300   .280390   .5459010   -44.300    -7.600  
+99 526 51324.00 I  -.022250  .000048   .280942  .000097  I  .5446124  .0000165  1.2129 0.0110  I   -45.073     .791    -7.702     .298  -.022280   .280980   .5446230   -44.900    -7.600  
+99 527 51325.00 I  -.023138  .000056   .281436  .000095  I  .5434745  .0000149  1.0624 0.0111  I   -45.450     .791    -7.524     .298  -.023170   .281490   .5434710   -45.500    -7.700  
+99 528 51326.00 I  -.023752  .000054   .281994  .000095  I  .5424832  .0000149  0.9251 0.0100  I   -45.914     .791    -7.374     .298  -.023750   .282100   .5424970   -46.100    -7.800  
+99 529 51327.00 I  -.024118  .000055   .282646  .000095  I  .5416162  .0000134  0.8120 0.0112  I   -46.216     .791    -7.389     .298  -.024110   .282830   .5416450   -46.500    -7.900  
+99 530 51328.00 I  -.024418  .000078   .283263  .000065  I  .5408527  .0000167  0.7183 0.0099  I   -46.294     .791    -7.528     .298  -.024450   .283410   .5408500   -46.600    -8.000  
+99 531 51329.00 I  -.024737  .000101   .283829  .000084  I  .5401746  .0000146  0.6394 0.0114  I   -46.230     .297    -7.652     .189  -.024820   .283930   .5401390   -46.600    -8.000  
+99 6 1 51330.00 I  -.025164  .000109   .284461  .000087  I  .5395663  .0000154  0.5832 0.0112  I   -46.156     .297    -7.711     .189  -.025220   .284540   .5395750   -46.300    -8.000  
+99 6 2 51331.00 I  -.025839  .000103   .285250  .000092  I  .5389945  .0000171  0.5682 0.0111  I   -46.188     .297    -7.788     .189  -.025920   .285380   .5390250   -45.900    -8.000  
+99 6 3 51332.00 I  -.026663  .000099   .286131  .000092  I  .5384164  .0000161  0.5937 0.0118  I   -46.313     .297    -7.945     .189  -.026790   .286290   .5383850   -45.400    -7.900  
+99 6 4 51333.00 I  -.027370  .000103   .287157  .000101  I  .5377925  .0000162  0.6631 0.0109  I   -46.331     .297    -8.086     .189  -.027450   .287220   .5377750   -45.100    -7.700  
+99 6 5 51334.00 I  -.027956  .000102   .288463  .000097  I  .5370730  .0000146  0.7841 0.0109  I   -46.074     .297    -8.070     .189  -.027980   .288510   .5371050   -44.800    -7.600  
+99 6 6 51335.00 I  -.028608  .000059   .290007  .000066  I  .5362194  .0000145  0.9199 0.0093  I   -45.676     .791    -7.905     .298  -.028550   .290050   .5362130   -45.000    -7.500  
+99 6 7 51336.00 I  -.029271  .000063   .291489  .000075  I  .5352299  .0000115  1.0656 0.0094  I   -45.471     .791    -7.737     .298  -.029220   .291540   .5352240   -45.300    -7.400  
+99 6 8 51337.00 I  -.029839  .000057   .292673  .000069  I  .5340830  .0000121  1.2269 0.0085  I   -45.625     .791    -7.657     .298  -.029720   .292750   .5341110   -45.500    -7.500  
+99 6 9 51338.00 I  -.030385  .000065   .293489  .000065  I  .5327898  .0000125  1.3471 0.0101  I   -46.017     .791    -7.604     .298  -.030240   .293620   .5327920   -45.900    -7.500  
+99 610 51339.00 I  -.030823  .000065   .293963  .000053  I  .5314166  .0000162  1.3839 0.0105  I   -46.500     .791    -7.512     .298  -.030730   .294060   .5314210   -46.200    -7.500  
+99 611 51340.00 I  -.031123  .000067   .294357  .000057  I  .5300536  .0000168  1.3260 0.0113  I   -47.061     .791    -7.455     .298  -.031020   .294390   .5300850   -46.600    -7.600  
+99 612 51341.00 I  -.031394  .000085   .294908  .000056  I  .5287990  .0000158  1.1650 0.0112  I   -47.695     .791    -7.529     .298  -.031350   .295020   .5287960   -46.900    -7.600  
+99 613 51342.00 I  -.031599  .000084   .295656  .000066  I  .5277405  .0000149  0.9534 0.0104  I   -48.241     .791    -7.651     .298  -.031630   .295780   .5277610   -47.100    -7.500  
+99 614 51343.00 I  -.031741  .000097   .296616  .000091  I  .5268796  .0000135  0.7795 0.0102  I   -48.468     .207    -7.639     .298  -.031650   .296690   .5269420   -47.300    -7.500  
+99 615 51344.00 I  -.032060  .000092   .297675  .000093  I  .5261601  .0000138  0.6697 0.0089  I   -48.269     .207    -7.472     .298  -.031880   .297780   .5261980   -47.300    -7.400  
+99 616 51345.00 I  -.032633  .000091   .298575  .000103  I  .5255218  .0000116  0.6151 0.0090  I   -47.774     .207    -7.348     .298  -.032610   .298690   .5255170   -47.400    -7.200  
+99 617 51346.00 I  -.033005  .000086   .299226  .000107  I  .5249077  .0000116  0.6271 0.0078  I   -47.313     .207    -7.410     .298  -.033010   .299280   .5249170   -47.400    -7.200  
+99 618 51347.00 I  -.033064  .000088   .299759  .000105  I  .5242518  .0000104  0.6865 0.0072  I   -47.275     .207    -7.561     .298  -.032930   .299810   .5242620   -47.500    -7.100  
+99 619 51348.00 I  -.032912  .000071   .300307  .000091  I  .5235385  .0000084  0.7347 0.0062  I   -47.735     .249    -7.611     .298  -.032790   .300340   .5235260   -47.600    -7.000  
+99 620 51349.00 I  -.032633  .000047   .301003  .000058  I  .5227939  .0000069  0.7486 0.0051  I   -48.309     .791    -7.538     .298  -.032530   .301030   .5228120   -47.700    -7.000  
+99 621 51350.00 I  -.032416  .000053   .301872  .000056  I  .5220497  .0000059  0.7375 0.0048  I   -48.556     .791    -7.477     .298  -.032260   .301940   .5220930   -47.900    -7.100  
+99 622 51351.00 I  -.032382  .000054   .302784  .000051  I  .5213298  .0000068  0.6938 0.0044  I   -48.490     .791    -7.492     .298  -.032230   .302870   .5213500   -48.100    -7.200  
+99 623 51352.00 I  -.032414  .000061   .303630  .000043  I  .5206856  .0000065  0.5797 0.0055  I   -48.534     .791    -7.487     .298  -.032430   .303730   .5206850   -48.400    -7.300  
+99 624 51353.00 I  -.032237  .000061   .304449  .000044  I  .5201823  .0000086  0.4301 0.0050  I   -48.969     .791    -7.358     .298  -.032270   .304480   .5202060   -48.800    -7.400  
+99 625 51354.00 I  -.032009  .000066   .305351  .000051  I  .5198199  .0000077  0.2972 0.0079  I   -49.610     .791    -7.161     .298  -.031920   .305360   .5198390   -49.100    -7.500  
+99 626 51355.00 I  -.032072  .000073   .306343  .000046  I  .5195874  .0000133  0.1658 0.0085  I   -50.118     .241    -7.027     .298  -.031990   .306370   .5195890   -49.400    -7.600  
+99 627 51356.00 I  -.032424  .000106   .307330  .000063  I  .5194846  .0000152  0.0453 0.0087  I   -50.367     .325    -7.009     .298  -.032390   .307400   .5195020   -49.700    -7.700  
+99 628 51357.00 I  -.032681  .000110   .308172  .000069  I  .5194888  .0000112 -0.0514 0.0094  I   -50.404     .209    -7.053     .121  -.032680   .308260   .5194870   -49.900    -7.600  
+99 629 51358.00 I  -.032643  .000108   .308831  .000083  I  .5195759  .0000112 -0.1138 0.0082  I   -50.260     .202    -7.108     .105  -.032600   .308870   .5196000   -49.900    -7.500  
+99 630 51359.00 I  -.032439  .000107   .309415  .000080  I  .5196994  .0000120 -0.1253 0.0086  I   -49.982     .202    -7.181     .105  -.032410   .309380   .5197040   -49.700    -7.300  
+99 7 1 51360.00 I  -.032311  .000104   .310020  .000081  I  .5198139  .0000131 -0.0989 0.0089  I   -49.792     .202    -7.248     .105  -.032200   .309950   .5198250   -49.400    -7.100  
+99 7 2 51361.00 I  -.032153  .000104   .310745  .000081  I  .5198820  .0000132 -0.0269 0.0090  I   -49.812     .202    -7.308     .105  -.032030   .310750   .5199040   -49.100    -6.800  
+99 7 3 51362.00 I  -.031784  .000099   .311739  .000082  I  .5198545  .0000123  0.0849 0.0102  I   -49.908     .139    -7.323     .119  -.031690   .311740   .5198140   -48.900    -6.600  
+99 7 4 51363.00 I  -.031170  .000062   .313045  .000072  I  .5196951  .0000155  0.2482 0.0115  I   -49.912     .179    -7.252     .298  -.031120   .313080   .5197340   -48.700    -6.500  
+99 7 5 51364.00 I  -.030442  .000060   .314529  .000047  I  .5193487  .0000194  0.4396 0.0104  I   -49.865     .791    -7.109     .298  -.030430   .314630   .5194090   -48.900    -6.500  
+99 7 6 51365.00 I  -.029704  .000062   .315956  .000057  I  .5188292  .0000139  0.5910 0.0111  I   -49.964     .791    -6.948     .298  -.029680   .316030   .5188420   -49.600    -6.500  
+99 7 7 51366.00 I  -.028910  .000063   .317201  .000047  I  .5181918  .0000109  0.6672 0.0106  I   -50.356     .791    -6.819     .298  -.028900   .317270   .5181920   -50.100    -6.700  
+99 7 8 51367.00 I  -.027983  .000062   .318324  .000048  I  .5175273  .0000159  0.6461 0.0100  I   -51.019     .791    -6.775     .298  -.028030   .318330   .5175160   -50.800    -6.800  
+99 7 9 51368.00 I  -.027037  .000063   .319481  .000048  I  .5169244  .0000168  0.5508 0.0115  I   -51.790     .791    -6.877     .298  -.027030   .319480   .5169230   -51.400    -7.000  
+99 710 51369.00 I  -.026224  .000073   .320703  .000082  I  .5164345  .0000165  0.4291 0.0107  I   -52.452     .791    -7.115     .298  -.026250   .320820   .5164500   -51.800    -7.100  
+99 711 51370.00 I  -.025557  .000062   .321908  .000082  I  .5160590  .0000133  0.3291 0.0098  I   -52.823     .791    -7.344     .298  -.025590   .321960   .5160600   -52.100    -7.100  
+99 712 51371.00 I  -.025019  .000067   .323101  .000077  I  .5157613  .0000105  0.2742 0.0084  I   -52.850     .106    -7.379     .111  -.024980   .323000   .5157550   -52.100    -7.100  
+99 713 51372.00 I  -.024667  .000087   .324344  .000137  I  .5154946  .0000104  0.2674 0.0065  I   -52.595     .118    -7.216     .298  -.024670   .324210   .5154940   -52.000    -7.000  
+99 714 51373.00 I  -.024535  .000085   .325578  .000146  I  .5152068  .0000075  0.3196 0.0078  I   -52.187     .118    -7.077     .298  -.024560   .325580   .5152140   -51.800    -6.900  
+99 715 51374.00 I  -.024744  .000084   .326635  .000143  I  .5148456  .0000116  0.4012 0.0068  I   -51.829     .118    -7.158     .298  -.024670   .326630   .5148690   -51.700    -6.800  
+99 716 51375.00 I  -.025238  .000077   .327339  .000132  I  .5144052  .0000114  0.4803 0.0083  I   -51.750     .118    -7.340     .298  -.025120   .327330   .5144310   -51.500    -6.800  
+99 717 51376.00 I  -.025708  .000078   .327855  .000133  I  .5138917  .0000120  0.5392 0.0096  I   -52.082     .118    -7.389     .298  -.025670   .327860   .5138980   -51.600    -6.800  
+99 718 51377.00 I  -.025892  .000083   .328401  .000146  I  .5133447  .0000155  0.5443 0.0112  I   -52.651     .167    -7.243     .298  -.025820   .328410   .5133180   -51.900    -6.800  
+99 719 51378.00 I  -.025770  .000061   .329054  .000067  I  .5128171  .0000189  0.5073 0.0123  I   -53.103     .179    -7.063     .298  -.025650   .329040   .5127800   -52.300    -6.900  
+99 720 51379.00 I  -.025384  .000061   .329837  .000060  I  .5123367  .0000192  0.4506 0.0115  I   -53.303     .179    -7.029     .298  -.025280   .329830   .5123250   -52.900    -6.900  
+99 721 51380.00 I  -.024803  .000063   .330652  .000064  I  .5119213  .0000131  0.3778 0.0123  I   -53.444     .179    -7.135     .298  -.024770   .330670   .5119280   -53.500    -7.000  
+99 722 51381.00 I  -.024166  .000066   .331389  .000055  I  .5115879  .0000155  0.2847 0.0110  I   -53.672     .179    -7.196     .298  -.024170   .331470   .5115740   -54.000    -7.100  
+99 723 51382.00 I  -.023612  .000066   .332029  .000048  I  .5113555  .0000177  0.1809 0.0120  I   -53.947     .179    -7.123     .298  -.023650   .332070   .5113690   -54.400    -7.200  
+99 724 51383.00 I  -.023436  .000062   .332554  .000046  I  .5112222  .0000184  0.0887 0.0126  I   -54.161     .164    -6.993     .298  -.023290   .332570   .5112600   -54.700    -7.300  
+99 725 51384.00 I  -.023690  .000060   .332988  .000049  I  .5111749  .0000179  0.0061 0.0119  I   -54.310     .791    -6.929     .298  -.023610   .333050   .5111350   -54.800    -7.400  
+99 726 51385.00 I  -.023985  .000068   .333417  .000062  I  .5111988  .0000150 -0.0428 0.0112  I   -54.453     .169    -6.980     .187  -.023970   .333480   .5111610   -54.700    -7.400  
+99 727 51386.00 I  -.024026  .000079   .333921  .000073  I  .5112401  .0000133 -0.0304 0.0109  I   -54.561     .139    -7.092     .153  -.023980   .333980   .5112580   -54.700    -7.300  
+99 728 51387.00 I  -.023857  .000080   .334593  .000073  I  .5112419  .0000158  0.0350 0.0118  I   -54.587     .139    -7.161     .153  -.023810   .334630   .5112540   -54.700    -7.300  
+99 729 51388.00 I  -.023510  .000081   .335462  .000078  I  .5111595  .0000195  0.1321 0.0126  I   -54.624     .139    -7.130     .153  -.023400   .335520   .5111360   -54.800    -7.200  
+99 730 51389.00 I  -.023000  .000083   .336427  .000080  I  .5109628  .0000197  0.2739 0.0120  I   -54.828     .139    -7.049     .153  -.022860   .336460   .5109910   -55.000    -7.000  
+99 731 51390.00 I  -.022362  .000078   .337453  .000067  I  .5105973  .0000140  0.4589 0.0123  I   -55.189     .139    -7.009     .153  -.022280   .337490   .5106410   -55.000    -6.900  
+99 8 1 51391.00 I  -.021640  .000062   .338517  .000066  I  .5100551  .0000147  0.6137 0.0103  I   -55.507     .791    -7.042     .298  -.021570   .338540   .5100190   -55.200    -6.900  
+99 8 2 51392.00 I  -.020859  .000053   .339539  .000045  I  .5093789  .0000151  0.7414 0.0098  I   -55.621     .791    -7.098     .298  -.020830   .339690   .5093670   -55.300    -6.800  
+99 8 3 51393.00 I  -.019878  .000055   .340497  .000049  I  .5085788  .0000130  0.8496 0.0085  I   -55.601     .791    -7.107     .298  -.019910   .340720   .5086130   -55.500    -6.900  
+99 8 4 51394.00 I  -.018583  .000051   .341387  .000050  I  .5077202  .0000079  0.8365 0.0079  I   -55.652     .791    -7.071     .298  -.018720   .341550   .5077120   -55.700    -7.000  
+99 8 5 51395.00 I  -.017112  .000050   .342266  .000049  I  .5069471  .0000089  0.6996 0.0054  I   -55.892     .791    -7.068     .298  -.017190   .342340   .5069180   -55.600    -7.100  
+99 8 6 51396.00 I  -.015757  .000051   .343305  .000056  I  .5063317  .0000074  0.5306 0.0072  I   -56.243     .791    -7.181     .298  -.015620   .343440   .5063360   -55.700    -7.300  
+99 8 7 51397.00 I  -.014781  .000051   .344488  .000060  I  .5058809  .0000113  0.3766 0.0084  I   -56.493     .791    -7.401     .298  -.014670   .344680   .5058930   -55.600    -7.400  
+99 8 8 51398.00 I  -.014169  .000062   .345595  .000064  I  .5055680  .0000151  0.2542 0.0086  I   -56.471     .214    -7.598     .298  -.014300   .345840   .5055380   -55.600    -7.400  
+99 8 9 51399.00 I  -.013827  .000059   .346439  .000059  I  .5053520  .0000130  0.1932 0.0102  I   -56.196     .151    -7.622     .298  -.013890   .346680   .5053180   -55.500    -7.500  
+99 810 51400.00 I  -.013570  .000065   .347008  .000059  I  .5051508  .0000138  0.2247 0.0095  I   -55.853     .144    -7.450     .298  -.013640   .347170   .5051770   -55.500    -7.400  
+99 811 51401.00 I  -.013229  .000067   .347413  .000060  I  .5048772  .0000139  0.3325 0.0096  I   -55.639     .144    -7.233     .298  -.013310   .347500   .5048890   -55.500    -7.300  
+99 812 51402.00 I  -.012743  .000086   .347767  .000061  I  .5044897  .0000134  0.4288 0.0098  I   -55.608     .144    -7.139     .298  -.012860   .347800   .5044840   -55.500    -7.000  
+99 813 51403.00 I  -.012239  .000092   .348141  .000064  I  .5040260  .0000138  0.5060 0.0091  I   -55.764     .144    -7.231     .298  -.012470   .348220   .5040580   -55.700    -6.900  
+99 814 51404.00 I  -.011835  .000098   .348680  .000078  I  .5034709  .0000123  0.6037 0.0120  I   -56.134     .184    -7.367     .298  -.011940   .348780   .5034900   -55.800    -6.700  
+99 815 51405.00 I  -.011719  .000090   .349523  .000078  I  .5028289  .0000196  0.6707 0.0114  I   -56.653     .225    -7.390     .298  -.011760   .349630   .5028440   -56.000    -6.700  
+99 816 51406.00 I  -.011590  .000088   .350631  .000073  I  .5021460  .0000193  0.6882 0.0149  I   -57.117     .298    -7.320     .298  -.011790   .350780   .5021740   -56.300    -6.700  
+99 817 51407.00 I  -.011034  .000089   .351884  .000073  I  .5014710  .0000225  0.6500 0.0164  I   -57.303     .298    -7.253     .298  -.011220   .352100   .5014320   -56.400    -6.800  
+99 818 51408.00 I  -.010319  .000072   .353153  .000075  I  .5008619  .0000264  0.5639 0.0175  I   -57.153     .298    -7.195     .298  -.010320   .353250   .5008390   -56.700    -7.000  
+99 819 51409.00 I  -.009797  .000066   .354359  .000072  I  .5003492  .0000267  0.4597 0.0192  I   -56.878     .298    -7.109     .298  -.009880   .354600   .5003400   -57.000    -7.200  
+99 820 51410.00 I  -.009297  .000063   .355503  .000073  I  .4999451  .0000279  0.3476 0.0172  I   -56.660     .298    -6.936     .298  -.009530   .355730   .4999570   -57.100    -7.400  
+99 821 51411.00 I  -.008671  .000065   .356678  .000060  I  .4996400  .0000217  0.2776 0.0184  I   -56.613     .304    -6.727     .298  -.008740   .356860   .4997250   -57.300    -7.600  
+99 822 51412.00 I  -.008248  .000084   .357883  .000068  I  .4993711  .0000241  0.2642 0.0143  I   -56.776     .113    -6.641     .298  -.008330   .358130   .4993600   -57.300    -7.700  
+99 823 51413.00 I  -.008243  .000087   .358996  .000068  I  .4991033  .0000185  0.2759 0.0142  I   -57.052     .791    -6.790     .298  -.008270   .359220   .4990810   -57.300    -7.800  
+99 824 51414.00 I  -.008483  .000103   .359983  .000065  I  .4988082  .0000151  0.3211 0.0114  I   -57.239     .791    -7.145     .298  -.008450   .360160   .4988010   -57.200    -7.800  
+99 825 51415.00 I  -.008694  .000105   .360823  .000067  I  .4984339  .0000132  0.4479 0.0108  I   -57.195     .791    -7.533     .298  -.008880   .360930   .4984360   -57.200    -7.600  
+99 826 51416.00 I  -.008598  .000104   .361514  .000062  I  .4978839  .0000155  0.6604 0.0101  I   -57.012     .791    -7.700     .298  -.008690   .361790   .4979120   -57.000    -7.500  
+99 827 51417.00 I  -.008393  .000100   .362115  .000056  I  .4971095  .0000154  0.8839 0.0109  I   -56.883     .791    -7.596     .298  -.008440   .362310   .4971170   -56.900    -7.400  
+99 828 51418.00 I  -.008182  .000097   .362641  .000055  I  .4961321  .0000152  1.0594 0.0109  I   -56.917     .791    -7.396     .298  -.008280   .362810   .4961240   -57.000    -7.300  
+99 829 51419.00 I  -.007823  .000074   .363098  .000081  I  .4950086  .0000154  1.1810 0.0100  I   -57.065     .791    -7.297     .298  -.007930   .363190   .4950170   -56.900    -7.200  
+99 830 51420.00 I  -.007289  .000058   .363548  .000088  I  .4937904  .0000130  1.2416 0.0099  I   -57.212     .791    -7.341     .298  -.007340   .363690   .4937990   -57.000    -7.100  
+99 831 51421.00 I  -.006771  .000061   .364020  .000086  I  .4925551  .0000125  1.2133 0.0071  I   -57.308     .791    -7.416     .298  -.006770   .364210   .4925550   -57.100    -7.200  
+99 9 1 51422.00 I  -.006488  .000058   .364447  .000089  I  .4913924  .0000059  1.0994 0.0092  I   -57.404     .791    -7.409     .298  -.006490   .364650   .4913850   -57.200    -7.300  
+99 9 2 51423.00 I  -.006386  .000060   .364778  .000102  I  .4903690  .0000136  0.9476 0.0078  I   -57.570     .791    -7.321     .298  -.006430   .364930   .4903750   -57.300    -7.300  
+99 9 3 51424.00 I  -.006220  .000056   .365077  .000095  I  .4894913  .0000145  0.8137 0.0100  I   -57.793     .791    -7.237     .298  -.006220   .365200   .4895020   -57.400    -7.400  
+99 9 4 51425.00 I  -.005751  .000045   .365411  .000091  I  .4887284  .0000147  0.7195 0.0108  I   -57.956     .791    -7.211     .298  -.005850   .365580   .4887250   -56.800    -9.400  
+99 9 5 51426.00 I  -.004880  .000053   .365869  .000083  I  .4880370  .0000160  0.6711 0.0103  I   -57.921     .791    -7.216     .298  -.004960   .366010   .4880420   -56.200    -9.400  
+99 9 6 51427.00 I  -.003703  .000047   .366428  .000092  I  .4873721  .0000145  0.6650 0.0109  I   -57.637     .176    -7.174     .191  -.003810   .366600   .4873840   -55.800    -9.000  
+99 9 7 51428.00 I  -.002464  .000048   .367003  .000095  I  .4866972  .0000149  0.6883 0.0087  I   -57.197     .176    -7.042     .191  -.002570   .367190   .4867060   -55.700    -8.200  
+99 9 8 51429.00 I  -.001309  .000049   .367620  .000085  I  .4859923  .0000095  0.7211 0.0090  I   -56.771     .176    -6.869     .191  -.001440   .367610   .4860000   -55.900    -7.100  
+99 9 9 51430.00 I  -.000411  .000049   .368267  .000086  I  .4852548  .0000101  0.7545 0.0068  I   -56.497     .176    -6.756     .191  -.000550   .368300   .4852780   -56.300    -5.900  
+99 910 51431.00 I   .000061  .000059   .368863  .000087  I  .4844846  .0000096  0.7841 0.0071  I   -56.414     .176    -6.745     .191   .000030   .369070   .4845120   -56.900    -5.000  
+99 911 51432.00 I   .000383  .000065   .369397  .000095  I  .4836996  .0000101  0.7749 0.0071  I   -56.488     .176    -6.782     .191   .000460   .369580   .4837120   -57.700    -4.500  
+99 912 51433.00 I   .000863  .000058   .369937  .000070  I  .4829502  .0000105  0.7195 0.0070  I   -56.684     .791    -6.805     .298   .000800   .370170   .4829480   -58.400    -4.500  
+99 913 51434.00 I   .001600  .000058   .370608  .000102  I  .4822679  .0000098  0.6420 0.0075  I   -56.957     .791    -6.839     .298   .001620   .370730   .4822670   -58.700    -4.900  
+99 914 51435.00 I   .002414  .000058   .371490  .000109  I  .4816712  .0000108  0.5494 0.0070  I   -57.187     .791    -6.950     .298   .002450   .371490   .4816770   -58.600    -5.800  
+99 915 51436.00 I   .003040  .000055   .372432  .000110  I  .4811759  .0000100  0.4365 0.0075  I   -57.197     .791    -7.113     .298   .003040   .372620   .4811780   -58.100    -6.800  
+99 916 51437.00 I   .003503  .000049   .373142  .000117  I  .4807967  .0000103  0.3283 0.0070  I   -56.947     .791    -7.205     .298   .003510   .373430   .4807760   -57.400    -8.000  
+99 917 51438.00 I   .003889  .000044   .373599  .000101  I  .4805028  .0000099  0.2697 0.0070  I   -56.642     .791    -7.142     .298   .003850   .373750   .4804930   -56.500    -9.000  
+99 918 51439.00 I   .004184  .000053   .373979  .000097  I  .4802355  .0000094  0.2764 0.0066  I   -56.571     .791    -6.984     .298   .004070   .374060   .4802480   -55.600    -9.500  
+99 919 51440.00 I   .004345  .000057   .374430  .000069  I  .4799329  .0000086  0.3345 0.0057  I   -56.794     .243    -6.865     .298   .004280   .374520   .4799360   -54.900    -9.600  
+99 920 51441.00 I   .004513  .000061   .374913  .000065  I  .4795506  .0000066  0.4404 0.0052  I   -57.069     .248    -6.869     .298   .004470   .375080   .4795610   -54.500    -9.100  
+99 921 51442.00 I   .004887  .000065   .375305  .000061  I  .4790321  .0000059  0.6064 0.0047  I   -57.122     .248    -6.971     .298   .004820   .375420   .4790480   -54.700    -8.300  
+99 922 51443.00 I   .005344  .000059   .375576  .000057  I  .4783296  .0000068  0.7971 0.0048  I   -56.919     .248    -7.059     .298   .005330   .375590   .4783330   -55.400    -7.200  
+99 923 51444.00 I   .005458  .000058   .375778  .000063  I  .4774428  .0000076  0.9730 0.0050  I   -56.693     .248    -7.003     .298   .005560   .375850   .4774500   -56.400    -6.000  
+99 924 51445.00 I   .005210  .000048   .375829  .000070  I  .4763994  .0000073  1.1015 0.0056  I   -56.571     .248    -6.753     .298   .005150   .376030   .4764010   -57.500    -5.100  
+99 925 51446.00 I   .004983  .000048   .375759  .000060  I  .4752638  .0000081  1.1581 0.0076  I   -56.552     .251    -6.423     .298   .004960   .375910   .4752540   -58.500    -4.500  
+99 926 51447.00 I   .005018  .000048   .375787  .000092  I  .4740970  .0000134  1.1735 0.0087  I   -56.643     .791    -6.241     .298   .005000   .375900   .4741130   -59.300    -4.400  
+99 927 51448.00 I   .005262  .000043   .376086  .000100  I  .4729339  .0000153  1.1377 0.0099  I   -56.864     .791    -6.341     .298   .005160   .376130   .4729480   -59.600    -4.800  
+99 928 51449.00 I   .005564  .000051   .376625  .000102  I  .4718474  .0000147  1.0245 0.0106  I   -57.166     .791    -6.617     .298   .005430   .376760   .4718160   -59.300    -5.600  
+99 929 51450.00 I   .005826  .000056   .377307  .000101  I  .4708876  .0000147  0.9034 0.0106  I   -57.432     .791    -6.823     .298   .005810   .377530   .4708750   -58.400    -6.600  
+99 930 51451.00 I   .006099  .000059   .378097  .000099  I  .4700343  .0000154  0.8014 0.0106  I   -57.567     .791    -6.800     .298   .006070   .378340   .4700530   -57.300    -7.600  
+9910 1 51452.00 I   .006366  .000064   .378984  .000099  I  .4692888  .0000152  0.6876 0.0098  I   -57.566     .791    -6.600     .298   .006260   .379200   .4692770   -56.000    -8.500  
+9910 2 51453.00 I   .006616  .000061   .379890  .000105  I  .4686406  .0000121  0.6295 0.0091  I   -57.458     .791    -6.380     .298   .006580   .380060   .4686480   -54.800    -8.900  
+9910 3 51454.00 I   .007091  .000060   .380748  .000084  I  .4679841  .0000099  0.7086 0.0083  I   -57.245     .791    -6.243     .298   .007070   .380920   .4680100   -54.000    -8.900  
+9910 4 51455.00 I   .007760  .000092   .381484  .000097  I  .4671962  .0000115  0.8692 0.0074  I   -56.917     .313    -6.196     .298   .007850   .381800   .4672270   -52.300    -6.000  
+9910 5 51456.00 I   .008441  .000096   .382034  .000096  I  .4662445  .0000110  1.0335 0.0076  I   -56.508     .313    -6.211     .298   .008400   .382310   .4662570   -53.600    -6.000  
+9910 6 51457.00 I   .009156  .000102   .382437  .000104  I  .4651338  .0000099  1.1840 0.0076  I   -56.129     .313    -6.271     .298   .009120   .382600   .4651320   -55.400    -6.200  
+9910 7 51458.00 I   .009792  .000100   .382579  .000105  I  .4638922  .0000106  1.2876 0.0074  I   -55.896     .313    -6.304     .298   .010140   .382930   .4639000   -56.800    -6.300  
+9910 8 51459.00 I   .010453  .000102   .382483  .000108  I  .4625759  .0000109  1.3394 0.0084  I   -55.847     .313    -6.270     .298   .010710   .382670   .4625900   -57.600    -6.200  
+9910 9 51460.00 I   .011302  .000118   .382442  .000095  I  .4612270  .0000131  1.3502 0.0076  I   -55.898     .315    -6.163     .298   .011250   .382540   .4612430   -57.600    -6.200  
+991010 51461.00 I   .012327  .000087   .382576  .000077  I  .4598931  .0000106  1.3080 0.0081  I   -55.943     .791    -6.021     .298   .012270   .382700   .4599020   -57.200    -6.000  
+991011 51462.00 I   .013291  .000088   .382712  .000077  I  .4586308  .0000094  1.2064 0.0077  I   -55.939     .791    -5.932     .298   .013270   .382940   .4586320   -56.500    -6.000  
+991012 51463.00 I   .013933  .000083   .382739  .000053  I  .4574905  .0000112  1.0741 0.0066  I   -55.842     .791    -5.953     .298   .013950   .382940   .4574970   -55.800    -5.900  
+991013 51464.00 I   .014160  .000085   .382696  .000052  I  .4564699  .0000094  0.9797 0.0072  I   -55.544     .791    -6.029     .298   .014140   .382830   .4564730   -55.300    -5.900  
+991014 51465.00 I   .014011  .000090   .382620  .000050  I  .4555245  .0000092  0.9049 0.0065  I   -55.045     .791    -6.071     .298   .013960   .382790   .4555120   -54.300    -5.900  
+991015 51466.00 I   .013764  .000093   .382574  .000049  I  .4546679  .0000091  0.8066 0.0063  I   -54.573     .791    -6.029     .298   .013670   .382780   .4546620   -52.700    -5.800  
+991016 51467.00 I   .013723  .000093   .382518  .000048  I  .4539027  .0000086  0.7339 0.0064  I   -54.432     .791    -5.960     .298   .013670   .382760   .4539230   -51.100    -5.600  
+991017 51468.00 I   .013998  .000082   .382379  .000048  I  .4531777  .0000089  0.7283 0.0057  I   -54.628     .791    -5.945     .298   .014010   .382650   .4531920   -50.300    -5.600  
+991018 51469.00 I   .014481  .000090   .382265  .000051  I  .4524251  .0000074  0.7857 0.0059  I   -54.817     .791    -5.976     .298   .014510   .382440   .4524180   -50.700    -5.600  
+991019 51470.00 I   .015066  .000087   .382334  .000050  I  .4515871  .0000077  0.9008 0.0052  I   -54.729     .791    -5.994     .298   .015050   .382360   .4515800   -52.000    -5.800  
+991020 51471.00 I   .015704  .000088   .382570  .000052  I  .4505951  .0000073  1.1013 0.0053  I   -54.466     .791    -5.968     .298   .015740   .382680   .4505970   -53.800    -5.800  
+991021 51472.00 I   .016335  .000079   .382806  .000059  I  .4493644  .0000074  1.3623 0.0049  I   -54.269     .791    -5.880     .298   .016400   .382990   .4493660   -55.300    -5.900  
+991022 51473.00 I   .016759  .000077   .382957  .000053  I  .4478747  .0000066  1.6108 0.0053  I   -54.163     .791    -5.685     .298   .016850   .383150   .4478740   -56.100    -5.900  
+991023 51474.00 I   .017150  .000065   .383056  .000064  I  .4461607  .0000076  1.8056 0.0057  I   -54.007     .791    -5.385     .298   .017130   .383230   .4461670   -55.800    -5.700  
+991024 51475.00 I   .017702  .000061   .383229  .000064  I  .4442931  .0000092  1.9114 0.0057  I   -53.796     .176    -5.130     .298   .017730   .383390   .4442970   -54.900    -5.500  
+991025 51476.00 I   .018291  .000058   .383481  .000062  I  .4423756  .0000086  1.9040 0.0064  I   -53.705     .168    -5.112     .298   .018330   .383650   .4423640   -54.000    -5.300  
+991026 51477.00 I   .018863  .000064   .383621  .000064  I  .4405168  .0000089  1.8015 0.0062  I   -53.831     .168    -5.329     .298   .018810   .383830   .4405100   -53.500    -5.300  
+991027 51478.00 I   .019452  .000065   .383532  .000057  I  .4388010  .0000089  1.6137 0.0064  I   -54.074     .168    -5.541     .298   .019430   .383710   .4387960   -54.000    -5.500  
+991028 51479.00 I   .019978  .000073   .383305  .000058  I  .4372960  .0000092  1.4062 0.0065  I   -54.225     .168    -5.543     .298   .019970   .383500   .4372900   -54.500    -5.600  
+991029 51480.00 I   .020327  .000077   .383128  .000059  I  .4359633  .0000095  1.2747 0.0069  I   -54.232     .168    -5.353     .298   .020230   .383360   .4359710   -54.800    -5.700  
+991030 51481.00 I   .020502  .000073   .383004  .000063  I  .4347173  .0000102  1.2311 0.0071  I   -54.157     .159    -5.162     .298   .020480   .383150   .4347180   -54.800    -5.800  
+991031 51482.00 I   .020765  .000076   .382805  .000106  I  .4334775  .0000105  1.2582 0.0072  I   -54.049     .791    -5.102     .298   .020760   .382990   .4334870   -54.600    -5.700  
+9911 1 51483.00 I   .021271  .000102   .382449  .000116  I  .4321898  .0000102  1.3188 0.0073  I   -53.920     .791    -5.144     .298   .021280   .382720   .4321920   -54.100    -5.600  
+9911 2 51484.00 I   .021918  .000097   .381946  .000117  I  .4308357  .0000100  1.3922 0.0070  I   -53.758     .791    -5.195     .298   .021890   .382230   .4308260   -53.700    -5.300  
+9911 3 51485.00 I   .022609  .000092   .381443  .000121  I  .4294020  .0000097  1.4758 0.0070  I   -53.560     .791    -5.220     .298   .022700   .381380   .4293980   -53.500    -5.200  
+9911 4 51486.00 I   .023219  .000089   .380905  .000120  I  .4278975  .0000098  1.5193 0.0067  I   -53.385     .791    -5.213     .298   .023300   .380950   .4279030   -53.100    -5.000  
+9911 5 51487.00 I   .023757  .000086   .380406  .000121  I  .4263817  .0000091  1.5080 0.0071  I   -53.322     .791    -5.134     .298   .023730   .380400   .4263920   -52.900    -4.800  
+9911 6 51488.00 I   .024151  .000095   .380035  .000121  I  .4248891  .0000102  1.4740 0.0065  I   -53.379     .791    -4.942     .298   .024130   .380020   .4249070   -52.900    -4.600  
+9911 7 51489.00 I   .024358  .000091   .379606  .000080  I  .4234446  .0000092  1.4073 0.0069  I   -53.452     .791    -4.689     .298   .024420   .379640   .4234540   -52.900    -4.600  
+9911 8 51490.00 I   .024501  .000073   .378912  .000122  I  .4220772  .0000094  1.3323 0.0075  I   -53.430     .791    -4.523     .298   .024490   .378880   .4220890   -52.900    -4.500  
+9911 9 51491.00 I   .024892  .000085   .378025  .000132  I  .4207713  .0000119  1.2833 0.0071  I   -53.264     .791    -4.539     .298   .024840   .377880   .4207840   -52.900    -4.600  
+991110 51492.00 I   .025657  .000089   .377145  .000141  I  .4195125  .0000107  1.2288 0.0082  I   -52.931     .791    -4.668     .298   .025610   .377150   .4195120   -52.800    -4.600  
+991111 51493.00 I   .026741  .000099   .376460  .000151  I  .4183198  .0000113  1.1562 0.0074  I   -52.458     .791    -4.749     .298   .026750   .376460   .4183170   -52.500    -4.700  
+991112 51494.00 I   .027764  .000108   .376262  .000156  I  .4171923  .0000103  1.1071 0.0082  I   -52.027     .791    -4.713     .298   .027750   .376140   .4172030   -52.100    -4.700  
+991113 51495.00 I   .028474  .000113   .376609  .000153  I  .4160811  .0000120  1.1317 0.0077  I   -51.874     .791    -4.640     .298   .028440   .376550   .4160980   -51.800    -4.800  
+991114 51496.00 I   .028809  .000125   .377310  .000129  I  .4149095  .0000114  1.2147 0.0079  I   -51.991     .791    -4.607     .298   .028950   .377350   .4149150   -51.500    -4.800  
+991115 51497.00 I   .028761  .000121   .377949  .000113  I  .4136514  .0000104  1.2986 0.0076  I   -52.073     .791    -4.572     .298   .028830   .378060   .4136300   -51.300    -4.600  
+991116 51498.00 I   .028712  .000105   .378224  .000111  I  .4123109  .0000100  1.3866 0.0069  I   -51.914     .791    -4.469     .298   .028600   .378260   .4122870   -51.300    -4.500  
+991117 51499.00 I   .029229  .000100   .378250  .000100  I  .4108591  .0000092  1.5319 0.0068  I   -51.686     .791    -4.342     .298   .029220   .378260   .4108540   -51.500    -4.400  
+991118 51500.00 I   .030311  .000085   .378225  .000091  I  .4092440  .0000093  1.6865 0.0057  I   -51.638     .791    -4.256     .298   .030320   .378220   .4092360   -51.800    -4.200  
+991119 51501.00 I   .031599  .000085   .378298  .000081  I  .4075068  .0000069  1.7789 0.0058  I   -51.743     .791    -4.188     .298   .031550   .378290   .4074990   -52.100    -4.000  
+991120 51502.00 I   .032630  .000070   .378479  .000070  I  .4057008  .0000068  1.8273 0.0067  I   -51.774     .791    -4.034     .298   .032670   .378520   .4057080   -52.400    -3.800  
+991121 51503.00 I   .033130  .000073   .378618  .000055  I  .4038769  .0000116  1.8015 0.0057  I   -51.673     .791    -3.805     .298   .033180   .378650   .4038770   -52.500    -3.900  
+991122 51504.00 I   .033152  .000080   .378618  .000052  I  .4021328  .0000092  1.6708 0.0075  I   -51.620     .791    -3.685     .298   .033160   .378630   .4021340   -52.400    -3.800  
+991123 51505.00 I   .032879  .000082   .378417  .000055  I  .4005584  .0000096  1.4707 0.0066  I   -51.707     .791    -3.783     .298   .032830   .378490   .4005630   -52.100    -3.800  
+991124 51506.00 I   .032516  .000075   .378016  .000054  I  .3991948  .0000095  1.2605 0.0070  I   -51.795     .791    -3.944     .298   .032520   .378050   .3991930   -51.700    -3.900  
+991125 51507.00 I   .032158  .000081   .377578  .000064  I  .3980249  .0000102  1.0878 0.0070  I   -51.724     .791    -3.926     .298   .032220   .377580   .3980150   -51.300    -4.000  
+991126 51508.00 I   .031840  .000081   .377205  .000066  I  .3969956  .0000103  0.9858 0.0068  I   -51.496     .791    -3.714     .298   .031880   .377270   .3969800   -50.800    -4.000  
+991127 51509.00 I   .031731  .000084   .376900  .000065  I  .3960227  .0000089  0.9757 0.0076  I   -51.223     .791    -3.529     .298   .031730   .376960   .3960080   -50.500    -4.000  
+991128 51510.00 I   .032013  .000080   .376716  .000076  I  .3950159  .0000112  1.0505 0.0069  I   -51.008     .791    -3.520     .298   .031980   .376690   .3950130   -50.300    -4.000  
+991129 51511.00 I   .032624  .000068   .376739  .000074  I  .3939021  .0000105  1.1841 0.0077  I   -50.914     .791    -3.599     .298   .032620   .376770   .3939120   -50.300    -3.900  
+991130 51512.00 I   .033305  .000076   .377007  .000074  I  .3926455  .0000107  1.3244 0.0073  I   -50.926     .791    -3.611     .298   .033360   .377030   .3926480   -50.400    -3.700  
+9912 1 51513.00 I   .033866  .000080   .377511  .000070  I  .3912784  .0000101  1.3893 0.0083  I   -50.925     .791    -3.552     .298   .033910   .377480   .3912670   -50.700    -3.500  
+9912 2 51514.00 I   .034243  .000076   .378168  .000064  I  .3898971  .0000126  1.3637 0.0083  I   -50.824     .791    -3.522     .298   .034260   .378180   .3898730   -51.000    -3.400  
+9912 3 51515.00 I   .034482  .000070   .378767  .000060  I  .3885654  .0000132  1.2948 0.0081  I   -50.710     .791    -3.534     .298   .034480   .378850   .3885010   -51.300    -3.200  
+9912 4 51516.00 I   .034712  .000069   .379145  .000084  I  .3873141  .0000101  1.2061 0.0094  I   -50.740     .791    -3.497     .298   .034700   .379180   .3872730   -51.500    -3.100  
+9912 5 51517.00 I   .034806  .000064   .379274  .000088  I  .3861571  .0000133  1.1056 0.0074  I   -50.909     .791    -3.374     .298   .034850   .379330   .3861610   -51.500    -3.000  
+9912 6 51518.00 I   .034636  .000073   .379187  .000085  I  .3851032  .0000108  1.0043 0.0086  I   -51.049     .791    -3.267     .298   .034710   .379240   .3851200   -51.400    -3.000  
+9912 7 51519.00 I   .034509  .000074   .378991  .000086  I  .3841467  .0000109  0.9086 0.0072  I   -51.030     .791    -3.288     .298   .034490   .378970   .3841480   -51.200    -3.200  
+9912 8 51520.00 I   .034839  .000075   .378900  .000087  I  .3832822  .0000096  0.8243 0.0076  I   -50.877     .791    -3.408     .298   .034790   .378900   .3832790   -50.800    -3.300  
+9912 9 51521.00 I   .035705  .000077   .379108  .000089  I  .3824822  .0000105  0.7878 0.0073  I   -50.690     .791    -3.522     .298   .035700   .379150   .3824670   -50.300    -3.500  
+991210 51522.00 I   .036626  .000078   .379542  .000089  I  .3816877  .0000109  0.8082 0.0077  I   -50.579     .791    -3.565     .298   .036690   .379600   .3816790   -50.000    -3.600  
+991211 51523.00 I   .037157  .000103   .379986  .000071  I  .3808536  .0000113  0.8652 0.0076  I   -50.647     .791    -3.582     .298   .037230   .380060   .3808610   -49.800    -3.600  
+991212 51524.00 I   .037313  .000105   .380340  .000073  I  .3799565  .0000105  0.9244 0.0071  I   -50.882     .791    -3.625     .298   .037340   .380370   .3799460   -49.700    -3.600  
+991213 51525.00 I   .037388  .000116   .380650  .000091  I  .3789967  .0000086  1.0077 0.0065  I   -51.095     .791    -3.633     .298   .037370   .380650   .3790130   -49.900    -3.500  
+991214 51526.00 I   .037709  .000113   .381013  .000090  I  .3779240  .0000075  1.1421 0.0054  I   -51.109     .791    -3.518     .298   .037680   .380980   .3779550   -50.300    -3.400  
+991215 51527.00 I   .038233  .000110   .381469  .000086  I  .3767143  .0000064  1.2709 0.0052  I   -50.970     .791    -3.325     .298   .038290   .381490   .3767130   -50.700    -3.200  
+991216 51528.00 I   .038411  .000118   .381831  .000085  I  .3753863  .0000073  1.3872 0.0045  I   -50.851     .791    -3.220     .298   .038470   .381890   .3753720   -51.100    -3.100  
+991217 51529.00 I   .038307  .000124   .381983  .000091  I  .3739443  .0000063  1.4902 0.0043  I   -50.764     .791    -3.231     .298   .038300   .381920   .3739430   -51.500    -3.000  
+991218 51530.00 I   .038151  .000112   .382020  .000084  I  .3724233  .0000045  1.5412 0.0046  I   -50.606     .791    -3.214     .298   .038120   .381980   .3724420   -51.800    -3.000  
+991219 51531.00 I   .037966  .000114   .382019  .000076  I  .3708867  .0000068  1.5180 0.0047  I   -50.434     .791    -3.085     .298   .037990   .382080   .3709520   -51.800    -3.000  
+991220 51532.00 I   .037613  .000104   .381863  .000104  I  .3694136  .0000083  1.4159 0.0053  I   -50.456     .791    -2.967     .298   .037700   .381940   .3694790   -51.700    -3.000  
+991221 51533.00 I   .037076  .000112   .381420  .000101  I  .3680734  .0000082  1.2581 0.0056  I   -50.710     .791    -3.008     .298   .037210   .381360   .3680520   -51.400    -3.000  
+991222 51534.00 I   .036608  .000121   .380682  .000118  I  .3668939  .0000074  1.1106 0.0055  I   -50.948     .791    -3.136     .298   .036610   .380730   .3668750   -50.900    -3.100  
+991223 51535.00 I   .036570  .000122   .379666  .000122  I  .3658297  .0000074  1.0306 0.0052  I   -50.913     .791    -3.137     .298   .036540   .379730   .3658610   -50.400    -3.100  
+991224 51536.00 I   .037112  .000109   .378618  .000115  I  .3648087  .0000074  1.0226 0.0079  I   -50.581     .791    -2.970     .298   .037160   .378560   .3647670   -49.900    -3.100  
+991225 51537.00 I   .038004  .000116   .377845  .000126  I  .3637629  .0000139  1.0793 0.0063  I   -50.118     .791    -2.834     .298   .038060   .377680   .3636580   -49.500    -3.100  
+991226 51538.00 I   .039000  .000125   .377510  .000119  I  .3626369  .0000103  1.1755 0.0079  I   -49.742     .791    -2.876     .298   .039020   .377410   .3625410   -49.400    -2.900  
+991227 51539.00 I   .040049  .000117   .377548  .000129  I  .3614129  .0000075  1.2687 0.0068  I   -49.636     .791    -2.972     .298   .040050   .377580   .3613690   -49.400    -2.800  
+991228 51540.00 I   .041137  .000109   .377788  .000125  I  .3601152  .0000090  1.3147 0.0062  I   -49.841     .791    -2.907     .298   .041120   .377740   .3601150   -49.800    -2.700  
+991229 51541.00 I   .042052  .000088   .378106  .000111  I  .3588103  .0000099  1.2804 0.0067  I   -50.176     .791    -2.678     .298   .041930   .378160   .3588120   -50.100    -2.600  
+991230 51542.00 I   .042547  .000089   .378200  .000110  I  .3575773  .0000100  1.1776 0.0068  I   -50.392     .791    -2.493     .298   .042450   .378270   .3575540   -50.500    -2.500  
+991231 51543.00 I   .042890  .000090   .377991  .000108  I  .3564633  .0000093  1.0504 0.0070  I   -50.473     .791    -2.486     .298   .042860   .377980   .3564530   -50.800    -2.400  
+ 0 1 1 51544.00 I   .043215  .000092   .377697  .000099  I  .3554732  .0000099  0.9333 0.0076  I   -50.607     .791    -2.585     .298   .043190   .377700   .3554990   -50.900    -2.500  
+ 0 1 2 51545.00 I   .043455  .000058   .377468  .000073  I  .3545966  .0000119  0.8165 0.0074  I   -50.218     .740    -2.679     .340   .043480   .377510   .3546330   -50.800    -2.500  
+ 0 1 3 51546.00 I   .043512  .000069   .377238  .000077  I  .3538464  .0000109  0.6813 0.0083  I   -50.459     .740    -2.699     .340   .043590   .377270   .3538640   -50.600    -2.500  
+ 0 1 4 51547.00 I   .043363  .000071   .376945  .000089  I  .3532360  .0000115  0.5403 0.0107  I   -50.437     .740    -2.766     .340   .043410   .376940   .3532310   -50.300    -2.800  
+ 0 1 5 51548.00 I   .043134  .000080   .376623  .000088  I  .3527537  .0000184  0.4358 0.0106  I   -50.188     .740    -2.893     .340   .043160   .376600   .3527960   -49.900    -2.900  
+ 0 1 6 51549.00 I   .043149  .000087   .376297  .000093  I  .3523431  .0000177  0.3954 0.0127  I   -49.678     .740    -3.066     .340   .043140   .376270   .3524010   -49.400    -2.900  
+ 0 1 7 51550.00 I   .043422  .000076   .376104  .000091  I  .3519484  .0000176  0.3987 0.0121  I   -49.409     .740    -3.103     .340   .043440   .376070   .3519450   -49.000    -2.900  
+ 0 1 8 51551.00 I   .043659  .000106   .375969  .000093  I  .3515404  .0000164  0.4181 0.0125  I   -49.211     .740    -3.090     .340   .043730   .376020   .3515040   -48.500    -2.800  
+ 0 1 9 51552.00 I   .043675  .000124   .375686  .000099  I  .3510966  .0000177  0.4845 0.0103  I   -49.134     .740    -3.078     .340   .043690   .375760   .3510900   -48.400    -2.600  
+ 0 110 51553.00 I   .043604  .000128   .375254  .000094  I  .3505534  .0000125  0.6050 0.0098  I   -49.197     .740    -3.071     .340   .043590   .375250   .3505590   -48.300    -2.400  
+ 0 111 51554.00 I   .043745  .000128   .374881  .000096  I  .3498790  .0000082  0.7484 0.0073  I   -49.336     .740    -3.037     .340   .043740   .374760   .3498330   -48.600    -2.200  
+ 0 112 51555.00 I   .044251  .000132   .374731  .000092  I  .3490532  .0000074  0.9018 0.0057  I   -49.474     .740    -2.995     .340   .044220   .374640   .3489670   -48.900    -2.100  
+ 0 113 51556.00 I   .045178  .000133   .374726  .000097  I  .3480742  .0000078  1.0586 0.0052  I   -49.629     .142    -2.979     .112   .045170   .374690   .3479980   -49.400    -2.100  
+ 0 114 51557.00 I   .046378  .000128   .374757  .000097  I  .3469483  .0000073  1.1786 0.0069  I   -49.677     .142    -3.035     .112   .046490   .374730   .3469090   -49.900    -2.100  
+ 0 115 51558.00 I   .047518  .000120   .374783  .000091  I  .3457480  .0000113  1.2057 0.0077  I   -49.689     .740    -3.048     .340   .047640   .374810   .3457280   -50.400    -2.200  
+ 0 116 51559.00 I   .048487  .000104   .374789  .000081  I  .3445662  .0000136  1.1447 0.0091  I   -49.800     .740    -2.966     .340   .048510   .374820   .3445610   -50.700    -2.300  
+ 0 117 51560.00 I   .049484  .000107   .374848  .000094  I  .3434739  .0000143  1.0376 0.0102  I   -50.181     .427    -2.879     .247   .049450   .374840   .3435070   -50.900    -2.500  
+ 0 118 51561.00 I   .050671  .000095   .375099  .000098  I  .3424895  .0000152  0.9349 0.0111  I   -50.789     .427    -2.914     .247   .050690   .375130   .3425460   -50.800    -2.600  
+ 0 119 51562.00 I   .051944  .000097   .375468  .000094  I  .3415968  .0000169  0.8541 0.0109  I   -51.314     .427    -3.044     .247   .051980   .375540   .3416250   -50.500    -2.600  
+ 0 120 51563.00 I   .053115  .000095   .375682  .000096  I  .3407635  .0000157  0.8269 0.0103  I   -51.604     .220    -3.008     .340   .053160   .375720   .3407420   -50.200    -2.600  
+ 0 121 51564.00 I   .054190  .000089   .375869  .000089  I  .3399193  .0000118  0.8709 0.0106  I   -51.228     .220    -2.945     .340   .054210   .375830   .3398860   -49.700    -2.500  
+ 0 122 51565.00 I   .055094  .000090   .376229  .000090  I  .3390041  .0000143  0.9677 0.0097  I   -50.536     .220    -2.903     .340   .055110   .376210   .3389880   -49.300    -2.500  
+ 0 123 51566.00 I   .055780  .000082   .376695  .000064  I  .3379742  .0000155  1.0937 0.0100  I   -49.812     .740    -3.019     .340   .055820   .376690   .3379660   -49.100    -2.300  
+ 0 124 51567.00 I   .056228  .000090   .377100  .000063  I  .3368184  .0000141  1.2145 0.0106  I   -49.344     .740    -3.190     .340   .056210   .377100   .3368040   -49.200    -2.100  
+ 0 125 51568.00 I   .056440  .000089   .377321  .000064  I  .3355604  .0000145  1.2895 0.0105  I   -49.289     .740    -3.182     .340   .056420   .377350   .3355310   -49.500    -2.000  
+ 0 126 51569.00 I   .056569  .000089   .377302  .000061  I  .3342584  .0000155  1.3073 0.0110  I   -49.551     .740    -2.941     .340   .056570   .377290   .3342110   -49.800    -2.000  
+ 0 127 51570.00 I   .056930  .000091   .377024  .000065  I  .3329659  .0000166  1.2647 0.0109  I   -49.778     .740    -2.721     .340   .056980   .376990   .3329220   -50.400    -1.900  
+ 0 128 51571.00 I   .057279  .000089   .376691  .000067  I  .3317549  .0000153  1.1442 0.0114  I   -50.052     .740    -2.653     .340   .057300   .376720   .3317330   -50.800    -2.100  
+ 0 129 51572.00 I   .057260  .000083   .376406  .000067  I  .3306897  .0000155  0.9869 0.0123  I   -50.347     .740    -2.785     .340   .057180   .376380   .3306810   -51.100    -2.300  
+ 0 130 51573.00 I   .057053  .000088   .376159  .000060  I  .3297764  .0000193  0.8438 0.0097  I   -50.674     .740    -2.964     .340   .056980   .376130   .3297760   -51.200    -2.500  
+ 0 131 51574.00 I   .056920  .000110   .375899  .000086  I  .3289928  .0000117  0.7287 0.0110  I   -50.834     .740    -3.087     .147   .056930   .375950   .3290060   -51.000    -2.700  
+ 0 2 1 51575.00 I   .056955  .000111   .375515  .000086  I  .3283083  .0000105  0.6455 0.0073  I   -50.661     .740    -3.175     .147   .056890   .375520   .3283220   -50.700    -3.000  
+ 0 2 2 51576.00 I   .057214  .000109   .374985  .000084  I  .3276983  .0000086  0.5726 0.0069  I   -50.262     .740    -3.274     .147   .057200   .375010   .3276990   -50.300    -3.100  
+ 0 2 3 51577.00 I   .057620  .000109   .374341  .000083  I  .3271605  .0000091  0.5076 0.0062  I   -49.874     .740    -3.397     .166   .057660   .374400   .3271500   -49.800    -3.100  
+ 0 2 4 51578.00 I   .058222  .000106   .373714  .000086  I  .3266641  .0000088  0.4997 0.0066  I   -49.607     .740    -3.461     .166   .058190   .373750   .3266670   -49.400    -3.000  
+ 0 2 5 51579.00 I   .058993  .000109   .373135  .000091  I  .3261312  .0000095  0.5813 0.0076  I   -49.395     .740    -3.453     .166   .059040   .373130   .3261480   -49.000    -2.900  
+ 0 2 6 51580.00 I   .059938  .000098   .372624  .000092  I  .3254829  .0000123  0.7185 0.0070  I   -49.234     .740    -3.387     .340   .059970   .372620   .3254630   -48.600    -3.100  
+ 0 2 7 51581.00 I   .061017  .000103   .372235  .000095  I  .3246859  .0000104  0.8805 0.0080  I   -49.211     .170    -3.314     .340   .061040   .372220   .3245860   -48.400    -3.300  
+ 0 2 8 51582.00 I   .062195  .000108   .371971  .000091  I  .3237181  .0000101  1.0540 0.0082  I   -49.352     .170    -3.296     .340   .062240   .371940   .3236430   -48.300    -3.300  
+ 0 2 9 51583.00 I   .063502  .000107   .371823  .000091  I  .3225902  .0000128  1.1908 0.0085  I   -49.554     .170    -3.361     .340   .063470   .371980   .3225890   -48.700    -3.300  
+ 0 210 51584.00 I   .064771  .000109   .371580  .000086  I  .3213657  .0000136  1.2402 0.0092  I   -49.669     .140    -3.503     .340   .064720   .371710   .3213750   -49.200    -3.300  
+ 0 211 51585.00 I   .065761  .000109   .371153  .000089  I  .3201477  .0000132  1.1759 0.0087  I   -49.735     .140    -3.605     .340   .065790   .371160   .3201260   -49.800    -3.500  
+ 0 212 51586.00 I   .066202  .000092   .370649  .000093  I  .3190448  .0000108  1.0187 0.0094  I   -49.789     .140    -3.637     .340   .066240   .370670   .3190220   -50.400    -3.600  
+ 0 213 51587.00 I   .066157  .000113   .370171  .000074  I  .3181117  .0000133  0.8572 0.0077  I   -49.927     .740    -3.614     .340   .066190   .370140   .3181430   -50.800    -3.700  
+ 0 214 51588.00 I   .066000  .000151   .369722  .000093  I  .3173178  .0000109  0.7336 0.0080  I   -50.204     .131    -3.618     .340   .065970   .369710   .3173170   -51.000    -3.900  
+ 0 215 51589.00 I   .066136  .000148   .369254  .000097  I  .3166298  .0000090  0.6541 0.0065  I   -50.548     .131    -3.721     .340   .066020   .369250   .3166280   -50.800    -3.900  
+ 0 216 51590.00 I   .066699  .000155   .368822  .000099  I  .3159886  .0000069  0.6376 0.0066  I   -50.779     .131    -3.891     .340   .066650   .368810   .3159960   -50.600    -3.900  
+ 0 217 51591.00 I   .067329  .000159   .368509  .000103  I  .3153378  .0000097  0.6714 0.0059  I   -50.742     .131    -4.014     .340   .067380   .368490   .3153000   -50.200    -3.900  
+ 0 218 51592.00 I   .067939  .000142   .368369  .000104  I  .3146275  .0000096  0.7600 0.0072  I   -50.430     .131    -4.036     .340   .067960   .368340   .3145900   -49.700    -3.900  
+ 0 219 51593.00 I   .068516  .000127   .368291  .000092  I  .3137951  .0000107  0.9168 0.0102  I   -49.958     .131    -4.056     .340   .068520   .368310   .3138080   -49.400    -4.000  
+ 0 220 51594.00 I   .069027  .000069   .368146  .000076  I  .3127835  .0000179  1.1050 0.0101  I   -49.483     .740    -4.198     .340   .069000   .368190   .3128270   -49.100    -4.000  
+ 0 221 51595.00 I   .069214  .000071   .367844  .000076  I  .3116045  .0000172  1.2351 0.0124  I   -49.155     .184    -4.423     .340   .069170   .367900   .3116160   -49.000    -4.000  
+ 0 222 51596.00 I   .069035  .000071   .367356  .000078  I  .3103486  .0000173  1.2591 0.0121  I   -49.085     .184    -4.532     .340   .068980   .367350   .3103220   -49.100    -4.200  
+ 0 223 51597.00 I   .068730  .000069   .366746  .000074  I  .3091149  .0000169  1.1971 0.0119  I   -49.273     .184    -4.415     .340   .068720   .366770   .3091040   -49.300    -4.300  
+ 0 224 51598.00 I   .068361  .000058   .366024  .000067  I  .3079714  .0000164  1.0840 0.0117  I   -49.615     .184    -4.191     .340   .068400   .366050   .3079750   -49.600    -4.500  
+ 0 225 51599.00 I   .067890  .000060   .365197  .000066  I  .3069563  .0000163  0.9427 0.0125  I   -50.009     .184    -4.080     .340   .067930   .365220   .3069360   -49.900    -4.600  
+ 0 226 51600.00 I   .067390  .000070   .364288  .000067  I  .3060864  .0000188  0.8002 0.0125  I   -50.396     .184    -4.160     .340   .067440   .364350   .3060680   -50.100    -4.700  
+ 0 227 51601.00 I   .066951  .000060   .363382  .000069  I  .3053466  .0000190  0.6857 0.0119  I   -50.665     .740    -4.331     .340   .066970   .363430   .3053490   -50.200    -4.700  
+ 0 228 51602.00 I   .066617  .000067   .362566  .000102  I  .3047064  .0000147  0.5970 0.0113  I   -50.640     .740    -4.465     .340   .066620   .362640   .3046720   -50.100    -4.700  
+ 0 229 51603.00 I   .066422  .000081   .361905  .000110  I  .3041427  .0000124  0.5380 0.0096  I   -50.248     .740    -4.535     .340   .066450   .361910   .3041150   -49.800    -4.600  
+ 0 3 1 51604.00 I   .066401  .000092   .361388  .000115  I  .3036098  .0000123  0.5409 0.0111  I   -49.671     .740    -4.593     .340   .066400   .361470   .3036080   -49.500    -4.600  
+ 0 3 2 51605.00 I   .066648  .000097   .360890  .000117  I  .3030436  .0000184  0.5956 0.0099  I   -49.399     .167    -4.629     .340   .066580   .360960   .3030390   -49.200    -4.500  
+ 0 3 3 51606.00 I   .067130  .000097   .360477  .000115  I  .3024079  .0000156  0.6822 0.0118  I   -49.141     .167    -4.709     .340   .067140   .360330   .3024040   -48.900    -4.500  
+ 0 3 4 51607.00 I   .067620  .000095   .360236  .000123  I  .3016646  .0000149  0.8126 0.0122  I   -49.024     .167    -4.718     .340   .067760   .360170   .3016670   -48.700    -4.400  
+ 0 3 5 51608.00 I   .067948  .000130   .360099  .000108  I  .3007691  .0000187  0.9838 0.0105  I   -48.940     .740    -4.618     .340   .067950   .360180   .3007680   -48.600    -4.400  
+ 0 3 6 51609.00 I   .068216  .000141   .359961  .000113  I  .2996940  .0000148  1.1639 0.0120  I   -48.886     .399    -4.461     .192   .068160   .360020   .2996990   -48.700    -4.400  
+ 0 3 7 51610.00 I   .068525  .000136   .359801  .000111  I  .2984518  .0000149  1.3123 0.0080  I   -48.900     .399    -4.379     .192   .068600   .359770   .2984570   -48.900    -4.500  
+ 0 3 8 51611.00 I   .068828  .000132   .359586  .000115  I  .2970918  .0000061  1.3933 0.0088  I   -48.978     .399    -4.470     .192   .068820   .359720   .2970870   -49.200    -4.600  
+ 0 3 9 51612.00 I   .069387  .000128   .359217  .000117  I  .2956919  .0000095  1.3941 0.0062  I   -49.184     .311    -4.698     .189   .069280   .359300   .2956890   -49.500    -4.700  
+ 0 310 51613.00 I   .070402  .000135   .358866  .000109  I  .2943263  .0000107  1.3268 0.0056  I   -49.341     .311    -4.918     .189   .070270   .358810   .2943390   -49.700    -4.900  
+ 0 311 51614.00 I   .071773  .000106   .358686  .000135  I  .2930544  .0000061  1.2113 0.0064  I   -49.548     .311    -5.030     .189   .071690   .358680   .2930720   -49.900    -5.000  
+ 0 312 51615.00 I   .073083  .000099   .358599  .000130  I  .2919128  .0000070  1.0687 0.0049  I   -49.769     .740    -5.045     .340   .073060   .358650   .2919190   -49.900    -5.000  
+ 0 313 51616.00 I   .073990  .000101   .358364  .000130  I  .2909174  .0000076  0.9250 0.0052  I   -49.912     .250    -5.047     .139   .073940   .358480   .2909220   -49.800    -5.100  
+ 0 314 51617.00 I   .074480  .000102   .357854  .000132  I  .2900542  .0000077  0.8072 0.0051  I   -49.873     .250    -5.102     .139   .074370   .357960   .2900640   -49.500    -5.100  
+ 0 315 51618.00 I   .074671  .000109   .357111  .000133  I  .2892761  .0000067  0.7701 0.0052  I   -49.604     .250    -5.206     .139   .074620   .357200   .2892770   -49.200    -5.100  
+ 0 316 51619.00 I   .074758  .000099   .356241  .000136  I  .2884848  .0000071  0.8205 0.0048  I   -48.898     .740    -5.234     .340   .074740   .356290   .2884850   -48.800    -5.100  
+ 0 317 51620.00 I   .074596  .000088   .355401  .000127  I  .2876281  .0000068  0.8920 0.0074  I   -48.468     .740    -5.282     .340   .074570   .355470   .2876310   -48.400    -5.000  
+ 0 318 51621.00 I   .074245  .000098   .354616  .000106  I  .2867043  .0000130  0.9529 0.0072  I   -48.190     .740    -5.320     .340   .074260   .354760   .2867060   -48.100    -5.100  
+ 0 319 51622.00 I   .073913  .000081   .353859  .000087  I  .2857300  .0000126  0.9908 0.0087  I   -48.112     .740    -5.425     .340   .073980   .353950   .2857400   -47.900    -5.200  
+ 0 320 51623.00 I   .073747  .000083   .353172  .000077  I  .2847254  .0000117  1.0207 0.0087  I   -48.156     .178    -5.601     .340   .073730   .353110   .2847510   -47.800    -5.300  
+ 0 321 51624.00 I   .073826  .000089   .352606  .000074  I  .2836875  .0000120  1.0539 0.0084  I   -48.231     .178    -5.732     .340   .073800   .352620   .2837170   -47.900    -5.500  
+ 0 322 51625.00 I   .073986  .000082   .352100  .000070  I  .2826302  .0000121  1.0495 0.0099  I   -48.329     .178    -5.708     .340   .074010   .352130   .2826370   -48.000    -5.600  
+ 0 323 51626.00 I   .073990  .000085   .351575  .000076  I  .2816146  .0000158  0.9669 0.0098  I   -48.514     .166    -5.621     .340   .073980   .351510   .2815880   -48.100    -5.900  
+ 0 324 51627.00 I   .073949  .000092   .351028  .000071  I  .2807146  .0000154  0.8296 0.0116  I   -48.847     .166    -5.510     .340   .073900   .351030   .2807060   -48.400    -6.000  
+ 0 325 51628.00 I   .073762  .000089   .350394  .000081  I  .2799580  .0000169  0.6845 0.0140  I   -49.222     .166    -5.532     .340   .073770   .350450   .2799650   -48.500    -6.000  
+ 0 326 51629.00 I   .073420  .000085   .349596  .000075  I  .2793488  .0000234  0.5296 0.0131  I   -49.440     .740    -5.651     .340   .073380   .349600   .2793210   -48.600    -6.100  
+ 0 327 51630.00 I   .073080  .000079   .348740  .000068  I  .2788852  .0000201  0.4153 0.0155  I   -49.344     .740    -5.769     .340   .073100   .348650   .2789080   -48.500    -6.000  
+ 0 328 51631.00 I   .072772  .000078   .347935  .000072  I  .2784878  .0000204  0.3922 0.0125  I   -48.936     .740    -5.841     .340   .072860   .347950   .2785310   -48.500    -5.900  
+ 0 329 51632.00 I   .072757  .000081   .347135  .000068  I  .2780890  .0000149  0.4043 0.0125  I   -48.369     .740    -5.887     .340   .072710   .347190   .2780890   -48.300    -5.800  
+ 0 330 51633.00 I   .073380  .000091   .346415  .000064  I  .2776678  .0000145  0.4504 0.0086  I   -47.929     .740    -5.952     .104   .073380   .346410   .2776610   -47.900    -5.600  
+ 0 331 51634.00 I   .074374  .000102   .345977  .000056  I  .2771617  .0000086  0.5760 0.0087  I   -47.625     .740    -5.998     .104   .074460   .346060   .2771740   -47.600    -5.500  
+ 0 4 1 51635.00 I   .075198  .000105   .345904  .000046  I  .2764928  .0000096  0.7705 0.0078  I   -47.582     .740    -6.012     .104   .075220   .345980   .2765170   -47.200    -5.400  
+ 0 4 2 51636.00 I   .075808  .000117   .346131  .000055  I  .2756134  .0000130  0.9868 0.0074  I   -47.702     .740    -5.949     .340   .075680   .346120   .2756560   -47.000    -5.300  
+ 0 4 3 51637.00 I   .076481  .000128   .346510  .000060  I  .2745277  .0000113  1.1777 0.0088  I   -47.809     .351    -5.803     .340   .076340   .346510   .2745730   -46.900    -5.400  
+ 0 4 4 51638.00 I   .076985  .000129   .346828  .000063  I  .2732774  .0000119  1.3104 0.0080  I   -47.813     .351    -5.668     .340   .077030   .346880   .2732930   -47.000    -5.500  
+ 0 4 5 51639.00 I   .077059  .000113   .346914  .000075  I  .2719400  .0000112  1.3436 0.0082  I   -47.797     .351    -5.690     .340   .077060   .346950   .2719320   -47.200    -5.600  
+ 0 4 6 51640.00 I   .077093  .000094   .346707  .000077  I  .2706251  .0000113  1.2720 0.0077  I   -47.915     .351    -5.922     .340   .077060   .346750   .2706330   -47.500    -5.800  
+ 0 4 7 51641.00 I   .077296  .000096   .346262  .000083  I  .2694147  .0000105  1.1443 0.0077  I   -48.219     .352    -6.267     .340   .077310   .346310   .2694350   -47.800    -6.000  
+ 0 4 8 51642.00 I   .077573  .000097   .345685  .000098  I  .2683416  .0000104  1.0013 0.0077  I   -48.592     .352    -6.499     .340   .077600   .345730   .2683450   -48.100    -6.200  
+ 0 4 9 51643.00 I   .077806  .000093   .345015  .000092  I  .2674068  .0000113  0.8740 0.0065  I   -48.875     .740    -6.543     .340   .077800   .345120   .2674040   -48.200    -6.300  
+ 0 410 51644.00 I   .078238  .000094   .344262  .000097  I  .2665760  .0000078  0.7993 0.0069  I   -48.961     .392    -6.454     .340   .078180   .344290   .2665780   -48.200    -6.300  
+ 0 411 51645.00 I   .079142  .000110   .343638  .000098  I  .2657834  .0000078  0.7990 0.0056  I   -48.819     .392    -6.348     .340   .079090   .343600   .2657810   -48.100    -6.400  
+ 0 412 51646.00 I   .080330  .000125   .343365  .000091  I  .2649542  .0000080  0.8700 0.0061  I   -48.458     .392    -6.306     .340   .080370   .343360   .2649460   -47.900    -6.400  
+ 0 413 51647.00 I   .081333  .000126   .343380  .000089  I  .2640252  .0000093  0.9957 0.0061  I   -48.173     .625    -6.329     .340   .081460   .343390   .2640320   -47.600    -6.300  
+ 0 414 51648.00 I   .081906  .000121   .343576  .000084  I  .2629513  .0000091  1.1558 0.0065  I   -47.670     .625    -6.383     .340   .081990   .343570   .2629550   -47.400    -6.200  
+ 0 415 51649.00 I   .082086  .000111   .343849  .000077  I  .2617145  .0000092  1.3133 0.0074  I   -47.392     .625    -6.431     .340   .082090   .343870   .2617140   -47.400    -6.100  
+ 0 416 51650.00 I   .082136  .000096   .344069  .000100  I  .2603384  .0000117  1.4297 0.0071  I   -47.442     .740    -6.469     .340   .082110   .344100   .2603470   -47.500    -6.100  
+ 0 417 51651.00 I   .082226  .000127   .344150  .000109  I  .2588795  .0000109  1.4728 0.0085  I   -47.718     .379    -6.494     .340   .082280   .344150   .2588640   -47.600    -6.100  
+ 0 418 51652.00 I   .082276  .000131   .344044  .000108  I  .2574198  .0000122  1.4348 0.0083  I   -47.987     .379    -6.477     .340   .082430   .344110   .2574370   -48.000    -6.100  
+ 0 419 51653.00 I   .082219  .000131   .343715  .000108  I  .2560309  .0000124  1.3337 0.0087  I   -48.118     .379    -6.400     .340   .082280   .343740   .2560440   -48.300    -6.200  
+ 0 420 51654.00 I   .082294  .000139   .343161  .000107  I  .2547592  .0000124  1.2120 0.0087  I   -48.421     .149    -6.275     .340   .082350   .343120   .2547520   -48.600    -6.400  
+ 0 421 51655.00 I   .082424  .000141   .342461  .000101  I  .2536047  .0000123  1.0968 0.0086  I   -48.584     .149    -6.241     .340   .082580   .342510   .2536740   -48.800    -6.600  
+ 0 422 51656.00 I   .082541  .000134   .341696  .000093  I  .2525701  .0000118  0.9681 0.0097  I   -48.813     .149    -6.308     .340   .082560   .341730   .2526650   -48.800    -6.700  
+ 0 423 51657.00 I   .082838  .000127   .340923  .000060  I  .2516714  .0000149  0.8306 0.0072  I   -48.944     .740    -6.435     .340   .082870   .340860   .2517210   -48.800    -6.900  
+ 0 424 51658.00 I   .083396  .000099   .340229  .000058  I  .2509021  .0000083  0.7134 0.0093  I   -48.882     .179    -6.565     .111   .083440   .340130   .2509180   -48.500    -6.900  
+ 0 425 51659.00 I   .084129  .000080   .339694  .000057  I  .2502312  .0000111  0.6365 0.0073  I   -48.658     .179    -6.675     .111   .084160   .339640   .2502580   -48.200    -6.900  
+ 0 426 51660.00 I   .084942  .000061   .339305  .000058  I  .2496080  .0000119  0.6229 0.0090  I   -48.308     .179    -6.752     .111   .084990   .339270   .2496080   -47.900    -6.700  
+ 0 427 51661.00 I   .085776  .000055   .338979  .000069  I  .2489548  .0000142  0.7012 0.0093  I   -47.776     .109    -6.773     .118   .085840   .338870   .2489720   -47.600    -6.400  
+ 0 428 51662.00 I   .086596  .000053   .338677  .000074  I  .2481768  .0000144  0.8660 0.0100  I   -47.357     .109    -6.727     .118   .086640   .338570   .2481970   -47.400    -6.200  
+ 0 429 51663.00 I   .087438  .000097   .338335  .000089  I  .2472104  .0000142  1.0679 0.0124  I   -47.247     .109    -6.683     .118   .087450   .338270   .2471880   -47.300    -6.100  
+ 0 430 51664.00 I   .088310  .000091   .337912  .000088  I  .2460469  .0000202  1.2521 0.0103  I   -47.527     .740    -6.672     .340   .088320   .337850   .2460670   -47.200    -5.900  
+ 0 5 1 51665.00 I   .089074  .000090   .337501  .000097  I  .2447165  .0000148  1.4056 0.0133  I   -47.919     .740    -6.638     .186   .089060   .337400   .2447320   -47.300    -5.900  
+ 0 5 2 51666.00 I   .089646  .000093   .337119  .000103  I  .2432550  .0000172  1.5014 0.0105  I   -48.105     .740    -6.532     .186   .089650   .337110   .2432530   -47.500    -5.900  
+ 0 5 3 51667.00 I   .089943  .000096   .336653  .000107  I  .2417404  .0000149  1.5171 0.0112  I   -48.118     .740    -6.439     .186   .089980   .336700   .2417460   -47.800    -6.200  
+ 0 5 4 51668.00 I   .089876  .000100   .335967  .000104  I  .2402498  .0000143  1.4458 0.0101  I   -48.260     .740    -6.541     .206   .089850   .336090   .2402460   -48.100    -6.300  
+ 0 5 5 51669.00 I   .089512  .000061   .335028  .000093  I  .2388797  .0000137  1.2819 0.0097  I   -48.636     .740    -6.820     .206   .089490   .334990   .2388380   -48.500    -6.500  
+ 0 5 6 51670.00 I   .089040  .000060   .333967  .000084  I  .2376950  .0000131  1.0912 0.0105  I   -49.026     .740    -7.107     .206   .089050   .333810   .2376060   -48.600    -6.800  
+ 0 5 7 51671.00 I   .088496  .000057   .332907  .000085  I  .2366841  .0000159  0.9403 0.0087  I   -49.157     .740    -7.191     .340   .088530   .332910   .2365990   -48.500    -6.900  
+ 0 5 8 51672.00 I   .087926  .000071   .331857  .000107  I  .2357910  .0000115  0.8598 0.0098  I   -49.011     .740    -7.051     .109   .087960   .331860   .2357550   -48.600    -7.000  
+ 0 5 9 51673.00 I   .087469  .000061   .330886  .000093  I  .2349382  .0000113  0.8583 0.0082  I   -48.770     .740    -6.842     .109   .087530   .330830   .2349480   -48.500    -6.900  
+ 0 510 51674.00 I   .087221  .000051   .330148  .000083  I  .2340443  .0000118  0.9472 0.0091  I   -48.563     .740    -6.721     .109   .087260   .330140   .2340480   -48.400    -6.800  
+ 0 511 51675.00 I   .087388  .000050   .329677  .000082  I  .2330322  .0000143  1.0710 0.0093  I   -48.366     .740    -6.722     .109   .087380   .329760   .2330110   -48.400    -6.700  
+ 0 512 51676.00 I   .088025  .000069   .329575  .000088  I  .2319108  .0000144  1.1694 0.0121  I   -48.124     .740    -6.789     .109   .088070   .329580   .2318930   -48.400    -6.400  
+ 0 513 51677.00 I   .088812  .000067   .329617  .000091  I  .2307012  .0000196  1.2444 0.0157  I   -47.896     .740    -6.855     .109   .088870   .329580   .2307180   -48.500    -6.300  
+ 0 514 51678.00 I   .089475  .000070   .329668  .000078  I  .2294361  .0000278  1.2772 0.0170  I   -47.849     .740    -6.865     .340   .089470   .329690   .2294520   -48.600    -6.200  
+ 0 515 51679.00 I   .090028  .000086   .329588  .000044  I  .2281687  .0000278  1.2444 0.0200  I   -48.073     .623    -6.784     .182   .090050   .329610   .2281330   -48.800    -6.100  
+ 0 516 51680.00 I   .090488  .000085   .329187  .000044  I  .2269698  .0000288  1.1440 0.0194  I   -48.453     .623    -6.617     .182   .090540   .329170   .2269170   -49.000    -6.200  
+ 0 517 51681.00 I   .090846  .000086   .328477  .000042  I  .2258826  .0000272  1.0377 0.0195  I   -48.775     .623    -6.439     .182   .090870   .328450   .2258710   -49.200    -6.300  
+ 0 518 51682.00 I   .091393  .000068   .327755  .000039  I  .2248928  .0000262  0.9362 0.0159  I   -49.026     .535    -6.400     .146   .091390   .327710   .2248910   -49.300    -6.600  
+ 0 519 51683.00 I   .092217  .000068   .327154  .000038  I  .2240194  .0000163  0.8072 0.0136  I   -49.101     .535    -6.484     .146   .092280   .327100   .2239890   -49.400    -6.800  
+ 0 520 51684.00 I   .093187  .000087   .326636  .000045  I  .2232798  .0000074  0.6739 0.0086  I   -49.147     .535    -6.658     .146   .093220   .326590   .2232440   -49.300    -7.000  
+ 0 521 51685.00 I   .093994  .000065   .326187  .000045  I  .2226631  .0000056  0.5661 0.0046  I   -49.147     .740    -6.808     .340   .094040   .326130   .2226540   -49.000    -7.100  
+ 0 522 51686.00 I   .094457  .000067   .325675  .000053  I  .2221314  .0000056  0.5070 0.0044  I   -49.124     .184    -6.895     .340   .094520   .325650   .2221350   -48.800    -7.200  
+ 0 523 51687.00 I   .094541  .000067   .324805  .000055  I  .2216301  .0000069  0.5048 0.0046  I   -49.145     .184    -6.969     .340   .094640   .324730   .2216290   -48.400    -7.200  
+ 0 524 51688.00 I   .094765  .000064   .323507  .000053  I  .2211125  .0000074  0.5306 0.0052  I   -49.144     .184    -7.041     .340   .094850   .323410   .2210940   -48.000    -7.100  
+ 0 525 51689.00 I   .095304  .000062   .322391  .000053  I  .2205648  .0000077  0.5689 0.0053  I   -48.814     .740    -6.995     .340   .095340   .322360   .2205220   -47.800    -6.800  
+ 0 526 51690.00 I   .096112  .000055   .321571  .000055  I  .2199668  .0000076  0.6310 0.0074  I   -48.451     .740    -6.855     .340   .096140   .321540   .2199430   -47.800    -6.600  
+ 0 527 51691.00 I   .097312  .000036   .320835  .000054  I  .2192941  .0000127  0.7193 0.0109  I   -48.306     .740    -6.697     .340   .097340   .320780   .2193000   -47.900    -6.500  
+ 0 528 51692.00 I   .098918  .000035   .320093  .000035  I  .2185232  .0000205  0.8225 0.0108  I   -48.673     .740    -6.666     .340   .098910   .320120   .2185070   -48.200    -6.400  
+ 0 529 51693.00 I   .100678  .000044   .319359  .000037  I  .2176552  .0000174  0.9072 0.0135  I   -49.336     .542    -6.731     .142   .100690   .319400   .2176300   -48.500    -6.300  
+ 0 530 51694.00 I   .102331  .000055   .318691  .000051  I  .2167245  .0000175  0.9446 0.0127  I   -49.820     .542    -6.713     .142   .102300   .318690   .2167470   -48.900    -6.400  
+ 0 531 51695.00 I   .103800  .000060   .318055  .000053  I  .2157888  .0000185  0.9134 0.0126  I   -50.005     .542    -6.561     .142   .103790   .318060   .2157980   -49.200    -6.600  
+ 0 6 1 51696.00 I   .105087  .000063   .317341  .000055  I  .2149209  .0000180  0.8126 0.0134  I   -49.884     .207    -6.457     .140   .105050   .317360   .2149210   -49.600    -6.700  
+ 0 6 2 51697.00 I   .106400  .000062   .316492  .000053  I  .2141761  .0000193  0.6743 0.0115  I   -50.305     .207    -6.564     .140   .106310   .316510   .2141970   -49.700    -6.800  
+ 0 6 3 51698.00 I   .107684  .000054   .315507  .000055  I  .2135716  .0000142  0.5381 0.0119  I   -50.689     .207    -6.793     .140   .107760   .315500   .2135470   -49.800    -6.800  
+ 0 6 4 51699.00 I   .108770  .000048   .314486  .000074  I  .2130846  .0000139  0.4479 0.0087  I   -50.700     .740    -6.902     .340   .108820   .314500   .2130840   -49.700    -6.800  
+ 0 6 5 51700.00 I   .109818  .000055   .313510  .000073  I  .2126473  .0000101  0.4432 0.0083  I   -50.344     .740    -6.805     .143   .109820   .313540   .2126560   -49.600    -6.800  
+ 0 6 6 51701.00 I   .110928  .000054   .312639  .000077  I  .2121691  .0000092  0.5257 0.0080  I   -49.961     .740    -6.645     .143   .110970   .312620   .2121930   -49.600    -6.600  
+ 0 6 7 51702.00 I   .111937  .000063   .311860  .000087  I  .2115752  .0000123  0.6704 0.0080  I   -49.858     .740    -6.578     .143   .111870   .311870   .2115840   -49.600    -6.400  
+ 0 6 8 51703.00 I   .112461  .000059   .311070  .000088  I  .2108262  .0000131  0.8215 0.0091  I   -50.050     .740    -6.599     .143   .112450   .311120   .2108200   -49.800    -6.300  
+ 0 6 9 51704.00 I   .112535  .000063   .310143  .000085  I  .2099522  .0000134  0.9125 0.0092  I   -50.304     .740    -6.626     .143   .112510   .310180   .2099400   -49.900    -6.200  
+ 0 610 51705.00 I   .112490  .000070   .308914  .000079  I  .2090299  .0000128  0.9172 0.0121  I   -50.397     .740    -6.629     .143   .112470   .308970   .2090050   -50.200    -6.000  
+ 0 611 51706.00 I   .112729  .000070   .307475  .000066  I  .2081422  .0000202  0.8485 0.0125  I   -50.353     .740    -6.624     .340   .112680   .307450   .2081520   -50.600    -6.000  
+ 0 612 51707.00 I   .113194  .000112   .306099  .000065  I  .2073506  .0000214  0.7266 0.0151  I   -50.414     .413    -6.581     .114   .113130   .306060   .2073440   -50.900    -6.100  
+ 0 613 51708.00 I   .113500  .000106   .304864  .000059  I  .2067048  .0000225  0.5574 0.0192  I   -50.757     .413    -6.452     .114   .113470   .304900   .2067100   -51.300    -6.200  
+ 0 614 51709.00 I   .113577  .000106   .303639  .000060  I  .2062475  .0000320  0.3531 0.0203  I   -51.267     .413    -6.293     .114   .113620   .303680   .2062480   -51.600    -6.300  
+ 0 615 51710.00 I   .113645  .000101   .302472  .000061  I  .2060009  .0000339  0.1417 0.0243  I   -51.963     .740    -6.236     .125   .113600   .302480   .2059850   -51.800    -6.500  
+ 0 616 51711.00 I   .113161  .000093   .301332  .000067  I  .2059520  .0000367 -0.0336 0.0233  I   -52.091     .740    -6.379     .125   .113100   .301300   .2059900   -51.900    -6.700  
+ 0 617 51712.00 I   .112189  .000089   .300267  .000086  I  .2060449  .0000319 -0.1394 0.0229  I   -52.031     .740    -6.599     .125   .112160   .300250   .2060860   -51.900    -6.700  
+ 0 618 51713.00 I   .110999  .000056   .299135  .000090  I  .2062115  .0000274 -0.1873 0.0196  I   -51.918     .740    -6.712     .340   .111010   .299210   .2061740   -52.000    -6.800  
+ 0 619 51714.00 I   .109831  .000049   .297643  .000093  I  .2064062  .0000227 -0.1952 0.0176  I   -51.892     .740    -6.675     .212   .109870   .297710   .2063480   -51.900    -6.700  
+ 0 620 51715.00 I   .108880  .000040   .295971  .000092  I  .2065859  .0000221 -0.1552 0.0145  I   -52.050     .740    -6.612     .212   .108870   .296020   .2065770   -52.000    -6.600  
+ 0 621 51716.00 I   .108124  .000037   .294316  .000092  I  .2066983  .0000182 -0.0604 0.0141  I   -52.318     .740    -6.615     .212   .108140   .294340   .2067080   -52.100    -6.400  
+ 0 622 51717.00 I   .107741  .000036   .292556  .000087  I  .2067001  .0000176  0.0543 0.0115  I   -52.368     .740    -6.578     .180   .107770   .292570   .2066590   -52.300    -6.200  
+ 0 623 51718.00 I   .107635  .000032   .290771  .000074  I  .2065948  .0000142  0.1537 0.0117  I   -52.267     .740    -6.453     .180   .107700   .290810   .2065550   -52.600    -6.000  
+ 0 624 51719.00 I   .107822  .000023   .289158  .000053  I  .2063949  .0000153  0.2466 0.0131  I   -52.198     .740    -6.262     .180   .107890   .289170   .2064170   -52.900    -5.900  
+ 0 625 51720.00 I   .108185  .000024   .287884  .000045  I  .2061000  .0000220  0.3445 0.0102  I   -52.525     .740    -6.186     .340   .108190   .287890   .2061060   -53.300    -5.800  
+ 0 626 51721.00 I   .108554  .000038   .286664  .000076  I  .2057138  .0000135  0.4187 0.0130  I   -53.213     .114    -6.273     .152   .108550   .286670   .2056990   -53.600    -5.800  
+ 0 627 51722.00 I   .108995  .000037   .285324  .000078  I  .2052783  .0000137  0.4457 0.0103  I   -53.860     .114    -6.351     .152   .108990   .285330   .2053220   -53.900    -5.900  
+ 0 628 51723.00 I   .109531  .000041   .283989  .000077  I  .2048415  .0000156  0.4155 0.0103  I   -54.227     .114    -6.282     .152   .109520   .283980   .2048650   -54.000    -6.000  
+ 0 629 51724.00 I   .110044  .000040   .282821  .000076  I  .2044716  .0000155  0.3125 0.0111  I   -54.412     .740    -6.220     .207   .110020   .282840   .2044680   -54.000    -6.200  
+ 0 630 51725.00 I   .110221  .000041   .281535  .000076  I  .2042304  .0000157  0.1678 0.0102  I   -54.720     .740    -6.243     .207   .110210   .281560   .2042410   -54.000    -6.400  
+ 0 7 1 51726.00 I   .110169  .000046   .280039  .000081  I  .2041293  .0000133  0.0432 0.0142  I   -54.966     .740    -6.397     .207   .110140   .280000   .2040530   -53.800    -6.500  
+ 0 7 2 51727.00 I   .109967  .000048   .278617  .000054  I  .2041166  .0000236  0.0009 0.0139  I   -54.896     .740    -6.493     .340   .109940   .278620   .2039720   -53.600    -6.600  
+ 0 7 3 51728.00 I   .109546  .000047   .277387  .000044  I  .2040917  .0000244  0.0662 0.0142  I   -54.496     .740    -6.450     .340   .109520   .277410   .2039550   -53.700    -6.700  
+ 0 7 4 51729.00 I   .108963  .000068   .276322  .000064  I  .2039568  .0000157  0.2139 0.0143  I   -54.053     .740    -6.399     .340   .108970   .276340   .2038820   -53.700    -6.700  
+ 0 7 5 51730.00 I   .108195  .000068   .275448  .000064  I  .2036533  .0000151  0.3933 0.0111  I   -53.906     .740    -6.453     .340   .108210   .275460   .2036680   -53.800    -6.600  
+ 0 7 6 51731.00 I   .107386  .000068   .274682  .000062  I  .2031755  .0000157  0.5566 0.0109  I   -54.247     .740    -6.583     .340   .107390   .274680   .2031930   -54.200    -6.500  
+ 0 7 7 51732.00 I   .107012  .000068   .273910  .000062  I  .2025619  .0000157  0.6544 0.0111  I   -54.786     .740    -6.527     .340   .106990   .273890   .2025540   -54.500    -6.400  
+ 0 7 8 51733.00 I   .106830  .000058   .273235  .000070  I  .2018964  .0000156  0.6630 0.0094  I   -55.211     .740    -6.382     .340   .106810   .273230   .2018930   -55.000    -6.400  
+ 0 7 9 51734.00 I   .106345  .000056   .272676  .000075  I  .2012574  .0000105  0.6070 0.0090  I   -55.289     .740    -6.317     .340   .106320   .272700   .2012680   -55.300    -6.300  
+ 0 710 51735.00 I   .105472  .000041   .272081  .000062  I  .2006965  .0000088  0.5085 0.0068  I   -55.187     .740    -6.389     .340   .105450   .272070   .2007080   -55.600    -6.300  
+ 0 711 51736.00 I   .104471  .000049   .271366  .000070  I  .2002445  .0000087  0.3976 0.0068  I   -55.276     .740    -6.480     .340   .104450   .271300   .2002440   -55.700    -6.400  
+ 0 712 51737.00 I   .103658  .000051   .270383  .000072  I  .1999051  .0000103  0.2753 0.0069  I   -55.675     .740    -6.494     .340   .103620   .270380   .1999000   -55.700    -6.500  
+ 0 713 51738.00 I   .102881  .000054   .269207  .000075  I  .1996952  .0000106  0.1490 0.0075  I   -56.100     .740    -6.514     .340   .102910   .269240   .1996870   -55.700    -6.600  
+ 0 714 51739.00 I   .102127  .000065   .268078  .000082  I  .1996037  .0000108  0.0330 0.0081  I   -56.296     .740    -6.606     .340   .102150   .268100   .1996080   -55.500    -6.700  
+ 0 715 51740.00 I   .101213  .000073   .266972  .000078  I  .1996296  .0000123 -0.0841 0.0086  I   -56.234     .740    -6.749     .340   .101200   .267020   .1996010   -55.400    -6.700  
+ 0 716 51741.00 I   .100163  .000071   .265843  .000081  I  .1997601  .0000133 -0.1659 0.0088  I   -56.104     .740    -6.790     .340   .100110   .265850   .1997040   -55.300    -6.800  
+ 0 717 51742.00 I   .099235  .000060   .264837  .000089  I  .1999437  .0000126 -0.1947 0.0088  I   -56.067     .257    -6.666     .340   .099230   .264830   .1999110   -55.500    -6.700  
+ 0 718 51743.00 I   .098285  .000059   .263948  .000091  I  .2001382  .0000114 -0.1896 0.0079  I   -56.188     .257    -6.490     .340   .098270   .263900   .2001430   -55.700    -6.500  
+ 0 719 51744.00 I   .097161  .000061   .262947  .000094  I  .2003128  .0000096 -0.1541 0.0073  I   -56.443     .257    -6.405     .340   .097120   .262910   .2003170   -56.000    -6.400  
+ 0 720 51745.00 I   .096019  .000039   .261634  .000077  I  .2004413  .0000091 -0.1032 0.0066  I   -56.616     .168    -6.395     .340   .096020   .261600   .2004180   -56.500    -6.300  
+ 0 721 51746.00 I   .094818  .000032   .260257  .000076  I  .2005212  .0000091 -0.0584 0.0074  I   -56.737     .168    -6.364     .340   .094860   .260160   .2005040   -56.900    -6.100  
+ 0 722 51747.00 I   .093439  .000036   .259074  .000087  I  .2005555  .0000116 -0.0057 0.0091  I   -56.768     .168    -6.262     .340   .093450   .259050   .2005770   -57.500    -6.000  
+ 0 723 51748.00 I   .092112  .000070   .258017  .000080  I  .2005297  .0000157  0.0558 0.0078  I   -56.942     .740    -6.187     .340   .092080   .258090   .2005480   -57.900    -6.000  
+ 0 724 51749.00 I   .091249  .000083   .256975  .000078  I  .2004521  .0000105  0.0926 0.0100  I   -57.381     .192    -6.224     .340   .091250   .257010   .2004300   -58.200    -6.000  
+ 0 725 51750.00 I   .090774  .000082   .256140  .000077  I  .2003567  .0000124  0.0929 0.0081  I   -57.939     .192    -6.319     .340   .090800   .256130   .2003190   -58.500    -6.100  
+ 0 726 51751.00 I   .090467  .000078   .255547  .000079  I  .2002801  .0000124  0.0519 0.0087  I   -58.399     .192    -6.373     .340   .090420   .255640   .2002770   -58.500    -6.300  
+ 0 727 51752.00 I   .090291  .000079   .255049  .000082  I  .2002659  .0000123 -0.0281 0.0078  I   -58.696     .192    -6.403     .340   .090210   .255130   .2002820   -58.500    -6.500  
+ 0 728 51753.00 I   .089877  .000082   .254516  .000073  I  .2003391  .0000096 -0.1165 0.0073  I   -58.859     .192    -6.486     .340   .089820   .254560   .2003350   -58.200    -6.600  
+ 0 729 51754.00 I   .089117  .000059   .253907  .000077  I  .2004866  .0000080 -0.1679 0.0076  I   -58.870     .192    -6.593     .340   .089090   .253970   .2004870   -58.100    -6.700  
+ 0 730 51755.00 I   .088353  .000032   .253164  .000072  I  .2006483  .0000119 -0.1395 0.0064  I   -58.697     .740    -6.594     .340   .088320   .253210   .2006530   -57.800    -6.700  
+ 0 731 51756.00 I   .087624  .000072   .252369  .000069  I  .2007368  .0000100 -0.0249 0.0075  I   -58.397     .194    -6.476     .340   .087600   .252400   .2007420   -57.700    -6.800  
+ 0 8 1 51757.00 I   .086922  .000075   .251692  .000063  I  .2006819  .0000091  0.1382 0.0068  I   -58.112     .194    -6.405     .340   .086920   .251760   .2006950   -57.800    -6.800  
+ 0 8 2 51758.00 I   .086416  .000080   .251127  .000061  I  .2004629  .0000093  0.2938 0.0066  I   -58.002     .194    -6.492     .340   .086350   .251190   .2004710   -58.000    -6.600  
+ 0 8 3 51759.00 I   .085879  .000081   .250675  .000062  I  .2001140  .0000095  0.3904 0.0071  I   -58.228     .161    -6.610     .340   .085880   .250750   .2000900   -58.300    -6.400  
+ 0 8 4 51760.00 I   .085277  .000084   .250228  .000029  I  .1997081  .0000107  0.4090 0.0070  I   -58.724     .161    -6.528     .340   .085310   .250310   .1997160   -58.600    -6.300  
+ 0 8 5 51761.00 I   .084583  .000083   .249655  .000030  I  .1993192  .0000103  0.3579 0.0079  I   -59.261     .161    -6.281     .340   .084600   .249680   .1993260   -59.000    -6.200  
+ 0 8 6 51762.00 I   .083909  .000039   .249042  .000030  I  .1990109  .0000116  0.2512 0.0070  I   -59.498     .740    -6.134     .340   .083890   .249060   .1990050   -59.400    -6.200  
+ 0 8 7 51763.00 I   .083208  .000040   .248525  .000053  I  .1988276  .0000094  0.1123 0.0073  I   -59.391     .245    -6.259     .340   .083200   .248580   .1988220   -59.600    -6.200  
+ 0 8 8 51764.00 I   .082305  .000039   .248115  .000054  I  .1987890  .0000089 -0.0348 0.0064  I   -59.255     .245    -6.536     .340   .082270   .248180   .1987940   -59.600    -6.400  
+ 0 8 9 51765.00 I   .081267  .000037   .247773  .000056  I  .1988874  .0000086 -0.1527 0.0062  I   -59.347     .245    -6.728     .340   .081170   .247790   .1988930   -59.500    -6.600  
+ 0 810 51766.00 I   .079976  .000035   .247487  .000060  I  .1990782  .0000086 -0.2222 0.0059  I   -59.413     .420    -6.725     .340   .079980   .247550   .1990860   -59.300    -6.800  
+ 0 811 51767.00 I   .078346  .000038   .247089  .000058  I  .1993185  .0000081 -0.2518 0.0056  I   -59.538     .420    -6.702     .340   .078360   .247210   .1993320   -59.000    -6.900  
+ 0 812 51768.00 I   .076607  .000037   .246398  .000061  I  .1995682  .0000072 -0.2405 0.0073  I   -59.497     .420    -6.712     .340   .076600   .246450   .1995820   -58.600    -7.000  
+ 0 813 51769.00 I   .075050  .000033   .245638  .000053  I  .1997864  .0000122 -0.1898 0.0074  I   -59.430     .740    -6.715     .340   .075080   .245660   .1997900   -58.400    -6.900  
+ 0 814 51770.00 I   .073685  .000070   .245040  .000049  I  .1999357  .0000130 -0.1026 0.0095  I   -59.411     .835    -6.628     .340   .073680   .245120   .1999360   -58.200    -6.800  
+ 0 815 51771.00 I   .072650  .000075   .244535  .000046  I  .1999812  .0000145  0.0159 0.0090  I   -59.410     .835    -6.458     .340   .072610   .244590   .1999960   -58.200    -6.600  
+ 0 816 51772.00 I   .071939  .000079   .244191  .000043  I  .1998923  .0000124  0.1694 0.0095  I   -59.437     .835    -6.297     .340   .071990   .244180   .1999100   -58.400    -6.400  
+ 0 817 51773.00 I   .071315  .000076   .244107  .000044  I  .1996358  .0000123  0.3429 0.0090  I   -59.385     .669    -6.235     .340   .071320   .244120   .1996310   -58.700    -6.100  
+ 0 818 51774.00 I   .070374  .000074   .244145  .000044  I  .1992137  .0000131  0.4948 0.0095  I   -59.542     .669    -6.225     .340   .070350   .244190   .1992030   -59.200    -6.000  
+ 0 819 51775.00 I   .069083  .000076   .244139  .000033  I  .1986598  .0000144  0.6058 0.0076  I   -59.648     .669    -6.231     .340   .069080   .244150   .1986760   -59.600    -5.900  
+ 0 820 51776.00 I   .067529  .000032   .244006  .000031  I  .1980179  .0000077  0.6696 0.0080  I   -59.722     .740    -6.224     .340   .067510   .244020   .1980460   -60.100    -5.900  
+ 0 821 51777.00 I   .065843  .000033   .243813  .000036  I  .1973375  .0000071  0.6829 0.0066  I   -59.896     .740    -6.218     .340   .065840   .243870   .1973380   -60.400    -6.000  
+ 0 822 51778.00 I   .063909  .000033   .243619  .000044  I  .1966686  .0000108  0.6467 0.0065  I   -60.247     .740    -6.239     .340   .063950   .243660   .1966380   -60.700    -6.100  
+ 0 823 51779.00 I   .062076  .000034   .243350  .000045  I  .1960529  .0000109  0.5841 0.0076  I   -60.681     .740    -6.304     .340   .062070   .243450   .1960370   -60.700    -6.200  
+ 0 824 51780.00 I   .060596  .000037   .243028  .000053  I  .1955095  .0000108  0.4940 0.0075  I   -61.006     .740    -6.416     .340   .060540   .243110   .1955580   -60.600    -6.300  
+ 0 825 51781.00 I   .059118  .000031   .242771  .000052  I  .1950637  .0000102  0.4073 0.0086  I   -61.072     .740    -6.543     .340   .059070   .242770   .1951390   -60.500    -6.400  
+ 0 826 51782.00 I   .057453  .000040   .242702  .000055  I  .1946679  .0000133  0.4015 0.0107  I   -60.870     .740    -6.584     .340   .057380   .242750   .1946870   -60.300    -6.500  
+ 0 827 51783.00 I   .055584  .000041   .242638  .000057  I  .1942311  .0000187  0.4844 0.0084  I   -60.556     .740    -6.441     .340   .055540   .242700   .1942120   -60.300    -6.400  
+ 0 828 51784.00 I   .053762  .000061   .242461  .000045  I  .1936784  .0000101  0.6295 0.0109  I   -60.326     .857    -6.159     .170   .053770   .242480   .1936680   -60.400    -6.200  
+ 0 829 51785.00 I   .052242  .000063   .242168  .000040  I  .1929644  .0000111  0.7977 0.0076  I   -60.255     .857    -5.940     .170   .052240   .242200   .1929680   -60.600    -6.000  
+ 0 830 51786.00 I   .051091  .000062   .241829  .000034  I  .1920968  .0000113  0.9246 0.0078  I   -60.295     .857    -5.939     .170   .051050   .241840   .1920900   -60.900    -5.800  
+ 0 831 51787.00 I   .050026  .000063   .241689  .000036  I  .1911429  .0000110  0.9686 0.0079  I   -60.525     .673    -5.991     .340   .050050   .241700   .1911300   -61.300    -5.700  
+ 0 9 1 51788.00 I   .049004  .000063   .241787  .000036  I  .1901885  .0000111  0.9259 0.0076  I   -60.780     .673    -5.998     .340   .049000   .241830   .1902050   -61.600    -5.600  
+ 0 9 2 51789.00 I   .047868  .000064   .241878  .000038  I  .1893152  .0000104  0.8109 0.0093  I   -61.135     .673    -5.832     .340   .047870   .241900   .1893390   -62.300    -5.500  
+ 0 9 3 51790.00 I   .046627  .000053   .241895  .000040  I  .1885815  .0000150  0.6516 0.0067  I   -61.383     .349    -5.698     .189   .046610   .241930   .1885410   -62.500    -5.700  
+ 0 9 4 51791.00 I   .045163  .000067   .241966  .000053  I  .1880169  .0000086  0.4775 0.0095  I   -61.369     .260    -5.808     .177   .045120   .242050   .1879720   -61.700    -5.900  
+ 0 9 5 51792.00 I   .043394  .000068   .242041  .000052  I  .1876245  .0000116  0.3095 0.0069  I   -61.176     .260    -6.107     .177   .043370   .242120   .1875600   -61.400    -6.200  
+ 0 9 6 51793.00 I   .041253  .000070   .242044  .000048  I  .1873924  .0000108  0.1581 0.0080  I   -60.996     .260    -6.344     .177   .041300   .242150   .1873680   -61.100    -6.500  
+ 0 9 7 51794.00 I   .038987  .000070   .241874  .000050  I  .1872994  .0000111  0.0333 0.0077  I   -60.682     .249    -6.379     .178   .038960   .241980   .1873270   -60.600    -6.600  
+ 0 9 8 51795.00 I   .036646  .000072   .241519  .000057  I  .1873119  .0000110 -0.0499 0.0084  I   -60.586     .249    -6.270     .178   .036650   .241590   .1873080   -60.100    -6.700  
+ 0 9 9 51796.00 I   .034228  .000066   .241045  .000056  I  .1873757  .0000126 -0.0627 0.0094  I   -60.499     .249    -6.197     .178   .034220   .241120   .1874040   -59.800    -6.700  
+ 0 910 51797.00 I   .031863  .000042   .240490  .000049  I  .1874162  .0000153 -0.0122 0.0078  I   -60.471     .740    -6.213     .191   .031860   .240520   .1874630   -59.600    -6.600  
+ 0 911 51798.00 I   .029800  .000047   .240042  .000056  I  .1873909  .0000092  0.0660 0.0089  I   -60.459     .274    -6.227     .143   .029850   .240070   .1874080   -59.700    -6.400  
+ 0 912 51799.00 I   .027756  .000046   .239711  .000062  I  .1872765  .0000092  0.1672 0.0067  I   -60.358     .274    -6.125     .143   .027770   .239730   .1872670   -59.900    -6.100  
+ 0 913 51800.00 I   .025131  .000066   .239553  .000069  I  .1870392  .0000097  0.3203 0.0067  I   -60.185     .274    -5.898     .143   .025180   .239550   .1870400   -60.300    -5.900  
+ 0 914 51801.00 I   .022100  .000068   .239613  .000070  I  .1866261  .0000097  0.5028 0.0061  I   -60.105     .261    -5.689     .156   .022170   .239660   .1866420   -60.600    -5.700  
+ 0 915 51802.00 I   .019235  .000065   .239702  .000068  I  .1860446  .0000075  0.6525 0.0067  I   -60.160     .261    -5.586     .156   .019230   .239770   .1860490   -61.000    -5.600  
+ 0 916 51803.00 I   .016892  .000062   .239768  .000070  I  .1853451  .0000092  0.7304 0.0051  I   -60.265     .261    -5.648     .156   .016920   .239800   .1853450   -61.300    -5.600  
+ 0 917 51804.00 I   .015146  .000050   .239926  .000085  I  .1846132  .0000069  0.7203 0.0059  I   -60.308     .109    -5.775     .340   .015190   .239960   .1845970   -61.400    -5.600  
+ 0 918 51805.00 I   .013673  .000055   .240390  .000083  I  .1839280  .0000074  0.6397 0.0050  I   -60.331     .740    -5.843     .340   .013700   .240450   .1839060   -61.300    -5.700  
+ 0 919 51806.00 I   .012234  .000046   .241177  .000078  I  .1833480  .0000072  0.5165 0.0053  I   -60.453     .740    -5.826     .340   .012240   .241170   .1833410   -61.000    -5.700  
+ 0 920 51807.00 I   .010639  .000049   .242107  .000084  I  .1828855  .0000077  0.4218 0.0053  I   -60.681     .740    -5.794     .340   .010580   .242100   .1828890   -60.700    -5.800  
+ 0 921 51808.00 I   .008784  .000049   .242995  .000082  I  .1824901  .0000079  0.3702 0.0053  I   -60.780     .125    -5.845     .340   .008730   .243030   .1824890   -60.100    -5.800  
+ 0 922 51809.00 I   .006877  .000049   .243489  .000079  I  .1821322  .0000073  0.3574 0.0065  I   -60.690     .125    -5.890     .340   .006910   .243550   .1821650   -59.600    -5.800  
+ 0 923 51810.00 I   .005374  .000058   .243521  .000063  I  .1817526  .0000102  0.4127 0.0060  I   -60.319     .125    -5.852     .340   .005410   .243510   .1817180   -59.300    -5.700  
+ 0 924 51811.00 I   .004180  .000061   .243406  .000056  I  .1812846  .0000096  0.5348 0.0072  I   -59.864     .222    -5.649     .137   .004180   .243400   .1812110   -59.000    -5.700  
+ 0 925 51812.00 I   .002961  .000071   .243379  .000042  I  .1806641  .0000102  0.7138 0.0067  I   -59.581     .289    -5.324     .158   .002940   .243410   .1806320   -58.900    -5.500  
+ 0 926 51813.00 I   .001685  .000068   .243522  .000042  I  .1798529  .0000094  0.9053 0.0074  I   -59.566     .289    -5.044     .158   .001720   .243530   .1798730   -59.000    -5.300  
+ 0 927 51814.00 I   .000637  .000065   .243908  .000034  I  .1788651  .0000107  1.0620 0.0069  I   -59.696     .289    -4.961     .158   .000670   .243960   .1788750   -59.200    -5.100  
+ 0 928 51815.00 I  -.000618  .000065   .244567  .000036  I  .1777557  .0000102  1.1383 0.0074  I   -59.804     .289    -5.055     .158  -.000600   .244620   .1777340   -59.400    -5.000  
+ 0 929 51816.00 I  -.002327  .000067   .245461  .000042  I  .1766239  .0000101  1.1083 0.0081  I   -59.878     .297    -5.130     .188  -.002350   .245470   .1766000   -59.600    -4.900  
+ 0 930 51817.00 I  -.004224  .000059   .246291  .000072  I  .1755666  .0000126  0.9957 0.0135  I   -59.920     .297    -5.130     .188  -.004230   .246310   .1756310   -59.800    -4.900  
+ 010 1 51818.00 I  -.005825  .000065   .246948  .000107  I  .1746510  .0000250  0.8278 0.0089  I   -59.969     .176    -5.101     .119  -.005830   .246970   .1747260   -59.800    -5.000  
+ 010 2 51819.00 I  -.007317  .000079   .247621  .000126  I  .1739216  .0000126  0.6283 0.0136  I   -59.939     .239    -5.189     .340  -.007300   .247640   .1739250   -59.700    -5.100  
+ 010 3 51820.00 I  -.009224  .000082   .248297  .000128  I  .1733949  .0000107  0.4272 0.0084  I   -59.745     .239    -5.387     .340  -.009170   .248320   .1733650   -59.400    -5.200  
+ 010 4 51821.00 I  -.011143  .000084   .248950  .000125  I  .1730499  .0000112  0.2778 0.0078  I   -59.402     .239    -5.525     .340  -.011180   .248870   .1730460   -58.900    -5.400  
+ 010 5 51822.00 I  -.013069  .000084   .249438  .000126  I  .1728087  .0000114  0.2201 0.0079  I   -59.020     .245    -5.434     .340  -.013050   .249390   .1728150   -58.600    -5.500  
+ 010 6 51823.00 I  -.014665  .000080   .249912  .000114  I  .1725813  .0000111  0.2476 0.0070  I   -58.714     .245    -5.280     .340  -.014670   .249930   .1725740   -58.100    -5.500  
+ 010 7 51824.00 I  -.016139  .000064   .250291  .000085  I  .1722903  .0000080  0.3446 0.0156  I   -58.558     .245    -5.181     .340  -.016150   .250310   .1723010   -57.800    -5.400  
+ 010 8 51825.00 I  -.017636  .000033   .250548  .000036  I  .1718754  .0000291  0.4916 0.0078  I   -58.518     .292    -5.207     .340  -.017650   .250520   .1718640   -57.600    -5.300  
+ 010 9 51826.00 I  -.019065  .000053   .250992  .000078  I  .1712972  .0000135  0.6682 0.0155  I   -58.483     .285    -5.261     .106  -.019100   .250930   .1712420   -57.700    -5.200  
+ 01010 51827.00 I  -.020494  .000061   .251829  .000106  I  .1705340  .0000104  0.8597 0.0086  I   -58.380     .285    -5.183     .106  -.020520   .251850   .1704830   -57.800    -5.000  
+ 01011 51828.00 I  -.021762  .000063   .253062  .000105  I  .1695809  .0000106  1.0417 0.0077  I   -58.247     .285    -4.908     .106  -.021790   .253120   .1695750   -58.100    -4.800  
+ 01012 51829.00 I  -.022955  .000061   .254629  .000103  I  .1684621  .0000114  1.1891 0.0077  I   -58.260     .333    -4.550     .105  -.022930   .254700   .1684640   -58.500    -4.600  
+ 01013 51830.00 I  -.024334  .000062   .256374  .000104  I  .1672188  .0000111  1.2883 0.0075  I   -58.296     .333    -4.314     .105  -.024370   .256430   .1672620   -58.800    -4.500  
+ 01014 51831.00 I  -.026199  .000063   .257929  .000105  I  .1659060  .0000097  1.3260 0.0073  I   -58.363     .314    -4.345     .173  -.026230   .257910   .1658840   -59.000    -4.400  
+ 01015 51832.00 I  -.028276  .000043   .259197  .000087  I  .1645897  .0000094  1.2951 0.0066  I   -58.380     .320    -4.573     .211  -.028270   .259150   .1644540   -59.100    -4.400  
+ 01016 51833.00 I  -.030364  .000046   .260226  .000042  I  .1633355  .0000090  1.2053 0.0061  I   -58.349     .341    -4.784     .193  -.030370   .260220   .1631760   -59.000    -4.400  
+ 01017 51834.00 I  -.032237  .000041   .261068  .000050  I  .1621903  .0000078  1.0821 0.0062  I   -58.332     .341    -4.817     .193  -.032240   .261070   .1621250   -58.700    -4.500  
+ 01018 51835.00 I  -.034006  .000040   .261825  .000051  I  .1611638  .0000085  0.9816 0.0056  I   -58.350     .341    -4.690     .193  -.033940   .261820   .1611760   -58.100    -4.500  
+ 01019 51836.00 I  -.035697  .000040   .262610  .000050  I  .1602119  .0000081  0.9269 0.0054  I   -58.430     .396    -4.520     .194  -.035650   .262640   .1601930   -57.600    -4.600  
+ 01020 51837.00 I  -.037440  .000042   .263490  .000056  I  .1592914  .0000067  0.9281 0.0059  I   -58.265     .396    -4.410     .194  -.037410   .263500   .1593100   -57.100    -4.500  
+ 01021 51838.00 I  -.039119  .000047   .264415  .000053  I  .1583268  .0000085  1.0159 0.0043  I   -57.924     .474    -4.329     .101  -.039160   .264420   .1584290   -56.800    -4.500  
+ 01022 51839.00 I  -.040594  .000031   .265452  .000052  I  .1572384  .0000054  1.1673 0.0048  I   -57.520     .740    -4.219     .340  -.040620   .265410   .1573430   -56.600    -4.400  
+ 01023 51840.00 I  -.041999  .000037   .266789  .000047  I  .1559864  .0000046  1.3361 0.0032  I   -57.248     .740    -4.066     .105  -.042050   .266770   .1560110   -56.600    -4.200  
+ 01024 51841.00 I  -.043325  .000037   .268351  .000047  I  .1545737  .0000034  1.4824 0.0030  I   -57.230     .740    -3.925     .105  -.043340   .268370   .1545450   -56.900    -4.100  
+ 01025 51842.00 I  -.044307  .000038   .269937  .000058  I  .1530409  .0000037  1.5707 0.0024  I   -57.410     .740    -3.869     .105  -.044330   .269950   .1530330   -57.300    -4.000  
+ 01026 51843.00 I  -.045559  .000044   .271645  .000058  I  .1514582  .0000035  1.5812 0.0023  I   -57.603     .740    -3.911     .105  -.045520   .271650   .1514710   -57.600    -3.900  
+ 01027 51844.00 I  -.046947  .000037   .273406  .000063  I  .1499040  .0000027  1.5152 0.0035  I   -57.650     .740    -3.985     .105  -.046990   .273440   .1499100   -57.800    -3.900  
+ 01028 51845.00 I  -.048312  .000042   .274938  .000068  I  .1484473  .0000060  1.3905 0.0034  I   -57.545     .740    -4.029     .105  -.048330   .274930   .1484300   -58.000    -3.900  
+ 01029 51846.00 I  -.049258  .000049   .276441  .000065  I  .1471312  .0000062  1.2411 0.0050  I   -57.393     .242    -4.061     .145  -.049290   .276360   .1471610   -57.900    -4.000  
+ 01030 51847.00 I  -.050029  .000053   .278336  .000063  I  .1459646  .0000079  1.0933 0.0048  I   -57.247     .197    -4.138     .178  -.050100   .278260   .1460480   -57.600    -4.100  
+ 01031 51848.00 I  -.051245  .000056   .280534  .000055  I  .1449376  .0000074  0.9666 0.0053  I   -57.032     .197    -4.240     .178  -.051190   .280530   .1449780   -57.200    -4.200  
+ 011 1 51849.00 I  -.052365  .000053   .282579  .000069  I  .1440273  .0000070  0.8524 0.0051  I   -56.665     .197    -4.258     .178  -.052430   .282600   .1440070   -56.600    -4.500  
+ 011 2 51850.00 I  -.053768  .000049   .284278  .000065  I  .1432139  .0000071  0.7951 0.0050  I   -56.224     .197    -4.134     .178  -.053760   .284260   .1432280   -55.800    -4.300  
+ 011 3 51851.00 I  -.055168  .000049   .285920  .000067  I  .1424100  .0000071  0.8192 0.0054  I   -55.902     .197    -3.954     .178  -.055120   .285960   .1424240   -55.300    -4.200  
+ 011 4 51852.00 I  -.056466  .000041   .287605  .000071  I  .1415673  .0000081  0.8678 0.0046  I   -55.779     .197    -3.855     .178  -.056420   .287660   .1415700   -55.000    -4.100  
+ 011 5 51853.00 I  -.057701  .000038   .289318  .000071  I  .1406684  .0000059  0.9344 0.0049  I   -55.737     .435    -3.867     .340  -.057720   .289250   .1406590   -54.900    -4.000  
+ 011 6 51854.00 I  -.059197  .000032   .291235  .000073  I  .1396914  .0000054  1.0221 0.0047  I   -55.656     .391    -3.893     .340  -.059220   .291140   .1396830   -55.000    -4.000  
+ 011 7 51855.00 I  -.060735  .000034   .293436  .000055  I  .1386201  .0000072  1.1219 0.0048  I   -55.577     .391    -3.811     .340  -.060760   .293410   .1386150   -55.300    -4.000  
+ 011 8 51856.00 I  -.062207  .000032   .295705  .000054  I  .1374452  .0000080  1.2287 0.0051  I   -55.610     .391    -3.571     .340  -.062220   .295680   .1374380   -55.700    -4.000  
+ 011 9 51857.00 I  -.063703  .000031   .297752  .000052  I  .1361688  .0000072  1.3172 0.0066  I   -55.736     .391    -3.226     .340  -.063730   .297700   .1361610   -56.100    -3.900  
+ 01110 51858.00 I  -.065070  .000045   .299403  .000065  I  .1348301  .0000105  1.3480 0.0095  I   -55.822     .391    -2.921     .340  -.065100   .299370   .1348130   -56.600    -3.800  
+ 01111 51859.00 I  -.065971  .000044   .300644  .000081  I  .1335009  .0000176  1.2946 0.0123  I   -55.801     .409    -2.825     .340  -.066020   .300590   .1334650   -56.800    -3.700  
+ 01112 51860.00 I  -.066267  .000059   .301799  .000080  I  .1322709  .0000222  1.1511 0.0107  I   -55.718     .369    -2.987     .340  -.066280   .301690   .1322310   -56.900    -3.500  
+ 01113 51861.00 I  -.066492  .000068   .303333  .000075  I  .1312182  .0000122  0.9491 0.0125  I   -55.618     .389    -3.254     .340  -.066450   .303290   .1312040   -56.600    -3.400  
+ 01114 51862.00 I  -.067493  .000071   .305215  .000075  I  .1303689  .0000116  0.7585 0.0085  I   -55.481     .389    -3.380     .340  -.067400   .305250   .1303790   -56.200    -3.300  
+ 01115 51863.00 I  -.069107  .000069   .306966  .000073  I  .1296774  .0000119  0.6393 0.0080  I   -55.297     .389    -3.254     .340  -.069160   .307050   .1296860   -55.700    -3.200  
+ 01116 51864.00 I  -.071252  .000069   .308424  .000065  I  .1290646  .0000111  0.5971 0.0069  I   -55.106     .389    -2.984     .340  -.071220   .308460   .1290580   -55.000    -3.200  
+ 01117 51865.00 I  -.073154  .000075   .309840  .000046  I  .1284567  .0000071  0.6344 0.0067  I   -54.940     .389    -2.766     .340  -.073120   .309810   .1284520   -54.500    -3.100  
+ 01118 51866.00 I  -.074727  .000064   .311485  .000040  I  .1277697  .0000074  0.7501 0.0072  I   -54.776     .358    -2.695     .340  -.074710   .311500   .1277780   -54.100    -3.100  
+ 01119 51867.00 I  -.075653  .000057   .313425  .000046  I  .1269444  .0000126  0.9020 0.0071  I   -54.594     .740    -2.727     .103  -.075660   .313440   .1269430   -54.000    -3.200  
+ 01120 51868.00 I  -.075902  .000065   .315632  .000067  I  .1259690  .0000122  1.0441 0.0087  I   -54.447     .740    -2.780     .103  -.075870   .315600   .1259530   -54.000    -3.100  
+ 01121 51869.00 I  -.075832  .000065   .317969  .000067  I  .1248704  .0000120  1.1438 0.0087  I   -54.435     .740    -2.817     .103  -.075810   .317980   .1248720   -54.200    -3.100  
+ 01122 51870.00 I  -.075847  .000066   .320194  .000067  I  .1236988  .0000124  1.1914 0.0087  I   -54.603     .740    -2.842     .103  -.075840   .320240   .1237180   -54.600    -3.000  
+ 01123 51871.00 I  -.076126  .000052   .322251  .000070  I  .1225155  .0000127  1.1555 0.0088  I   -54.868     .740    -2.850     .103  -.076120   .322250   .1224790   -54.900    -2.900  
+ 01124 51872.00 I  -.076569  .000052   .324131  .000071  I  .1214167  .0000124  1.0330 0.0091  I   -55.054     .740    -2.830     .103  -.076580   .324110   .1213050   -55.200    -2.800  
+ 01125 51873.00 I  -.077090  .000052   .325916  .000070  I  .1204631  .0000129  0.8696 0.0073  I   -55.037     .740    -2.798     .103  -.077060   .325860   .1203310   -55.300    -2.700  
+ 01126 51874.00 I  -.077734  .000046   .327749  .000049  I  .1196786  .0000076  0.7027 0.0071  I   -54.853     .194    -2.810     .254  -.077740   .327710   .1195830   -55.200    -2.700  
+ 01127 51875.00 I  -.078464  .000053   .329650  .000070  I  .1190476  .0000061  0.5661 0.0053  I   -54.621     .194    -2.900     .254  -.078510   .329660   .1190050   -54.900    -2.700  
+ 01128 51876.00 I  -.079156  .000052   .331507  .000069  I  .1185260  .0000073  0.4908 0.0049  I   -54.377     .194    -3.003     .254  -.079060   .331530   .1185190   -54.300    -2.700  
+ 01129 51877.00 I  -.079387  .000049   .333385  .000065  I  .1180405  .0000076  0.4920 0.0053  I   -54.081     .194    -3.001     .254  -.079330   .333330   .1180470   -53.600    -2.700  
+ 01130 51878.00 I  -.079572  .000049   .335195  .000064  I  .1175256  .0000077  0.5425 0.0052  I   -53.785     .194    -2.868     .254  -.079610   .335150   .1175220   -53.000    -2.700  
+ 012 1 51879.00 I  -.080077  .000052   .336962  .000063  I  .1169465  .0000071  0.6199 0.0060  I   -53.640     .194    -2.711     .254  -.080070   .336980   .1169220   -52.500    -2.700  
+ 012 2 51880.00 I  -.080633  .000053   .338725  .000066  I  .1162730  .0000093  0.7357 0.0092  I   -53.606     .155    -2.570     .158  -.080610   .338690   .1162800   -52.500    -2.800  
+ 012 3 51881.00 I  -.080874  .000041   .340453  .000038  I  .1154659  .0000170  0.8793 0.0068  I   -53.633     .142    -2.597     .340  -.080890   .340360   .1155090   -52.500    -2.700  
+ 012 4 51882.00 I  -.080959  .000066   .342134  .000071  I  .1145151  .0000100  1.0210 0.0099  I   -53.534     .133    -2.617     .340  -.081000   .342100   .1145360   -52.700    -2.700  
+ 012 5 51883.00 I  -.081277  .000097   .343792  .000082  I  .1134289  .0000103  1.1477 0.0071  I   -53.453     .177    -2.579     .190  -.081290   .343710   .1134120   -53.100    -2.600  
+ 012 6 51884.00 I  -.081778  .000099   .345435  .000083  I  .1122263  .0000102  1.2545 0.0074  I   -53.580     .177    -2.488     .190  -.081830   .345320   .1122210   -53.400    -2.500  
+ 012 7 51885.00 I  -.082321  .000100   .347178  .000086  I  .1109317  .0000105  1.3258 0.0072  I   -53.798     .211    -2.360     .166  -.082340   .347130   .1109530   -53.700    -2.400  
+ 012 8 51886.00 I  -.082764  .000097   .349073  .000087  I  .1095995  .0000102  1.3226 0.0073  I   -53.940     .211    -2.098     .166  -.082810   .349020   .1095820   -54.000    -2.200  
+ 012 9 51887.00 I  -.083349  .000097   .350969  .000089  I  .1083132  .0000102  1.2392 0.0063  I   -53.926     .211    -1.843     .166  -.083330   .350940   .1083340   -54.100    -2.200  
+ 01210 51888.00 I  -.083714  .000094   .352612  .000108  I  .1071406  .0000073  1.0974 0.0057  I   -53.922     .247    -1.782     .292  -.083680   .352570   .1071950   -54.100    -2.100  
+ 01211 51889.00 I  -.083829  .000083   .353999  .000106  I  .1061295  .0000049  0.9222 0.0043  I   -53.971     .236    -1.964     .268  -.083840   .354000   .1061520   -53.900    -2.000  
+ 01212 51890.00 I  -.083649  .000088   .355350  .000103  I  .1052914  .0000044  0.7614 0.0037  I   -53.885     .221    -2.184     .278  -.083610   .355370   .1052740   -53.600    -2.000  
+ 01213 51891.00 I  -.082749  .000087   .357031  .000098  I  .1045855  .0000056  0.6643 0.0036  I   -53.532     .221    -2.197     .278  -.082670   .356990   .1045790   -53.100    -2.000  
+ 01214 51892.00 I  -.081454  .000086   .359066  .000096  I  .1039318  .0000056  0.6601 0.0039  I   -52.962     .139    -1.961     .254  -.081380   .359130   .1039370   -52.500    -1.900  
+ 01215 51893.00 I  -.080187  .000089   .361234  .000096  I  .1032411  .0000055  0.7284 0.0042  I   -52.615     .139    -1.742     .254  -.080170   .361250   .1032250   -52.100    -1.900  
+ 01216 51894.00 I  -.079088  .000083   .363461  .000065  I  .1024684  .0000062  0.8166 0.0046  I   -52.487     .373    -1.678     .220  -.079090   .363400   .1024390   -51.700    -1.800  
+ 01217 51895.00 I  -.078140  .000064   .365712  .000067  I  .1016101  .0000074  0.8984 0.0066  I   -52.494     .381    -1.737     .163  -.078160   .365680   .1014840   -51.700    -1.800  
+ 01218 51896.00 I  -.077838  .000071   .367832  .000075  I  .1006813  .0000117  0.9512 0.0065  I   -52.538     .373    -1.801     .151  -.077860   .367890   .1004880   -51.800    -1.800  
+ 01219 51897.00 I  -.078183  .000072   .369725  .000074  I  .0997235  .0000107  0.9567 0.0083  I   -52.608     .373    -1.834     .151  -.078140   .369680   .0996230   -52.200    -1.900  
+ 01220 51898.00 I  -.078693  .000069   .371616  .000074  I  .0987847  .0000118  0.9117 0.0080  I   -52.751     .373    -1.870     .151  -.078760   .371540   .0987910   -52.600    -2.000  
+ 01221 51899.00 I  -.078656  .000068   .373822  .000074  I  .0979190  .0000118  0.8099 0.0083  I   -52.968     .397    -1.954     .161  -.078790   .373900   .0978530   -53.000    -2.100  
+ 01222 51900.00 I  -.078397  .000073   .376311  .000077  I  .0971744  .0000118  0.6794 0.0087  I   -53.238     .397    -1.956     .161  -.078300   .376360   .0971970   -53.400    -2.300  
+ 01223 51901.00 I  -.078015  .000076   .378911  .000064  I  .0965589  .0000128  0.5527 0.0095  I   -53.380     .162    -1.922     .116  -.077960   .378920   .0966350   -53.600    -2.300  
+ 01224 51902.00 I  -.077568  .000053   .381524  .000051  I  .0960664  .0000150  0.4337 0.0109  I   -53.296     .740    -1.938     .340  -.077570   .381510   .0961140   -53.500    -2.300  
+ 01225 51903.00 I  -.077052  .000056   .384097  .000057  I  .0956855  .0000176  0.3328 0.0080  I   -53.041     .209    -2.062     .340  -.077090   .384100   .0956820   -53.300    -2.300  
+ 01226 51904.00 I  -.076627  .000087   .386538  .000077  I  .0953894  .0000055  0.2661 0.0093  I   -52.739     .192    -2.219     .340  -.076580   .386520   .0953610   -53.100    -2.300  
+ 01227 51905.00 I  -.076313  .000079   .388743  .000073  I  .0951401  .0000060  0.2388 0.0043  I   -52.473     .192    -2.267     .340  -.076400   .388660   .0951180   -52.600    -2.300  
+ 01228 51906.00 I  -.076058  .000079   .390710  .000072  I  .0948989  .0000065  0.2500 0.0043  I   -52.307     .192    -2.175     .340  -.076070   .390660   .0948940   -52.300    -2.100  
+ 01229 51907.00 I  -.075340  .000079   .392637  .000074  I  .0946252  .0000063  0.3057 0.0048  I   -52.316     .192    -2.062     .340  -.075390   .392710   .0946300   -51.900    -2.000  
+ 01230 51908.00 I  -.074867  .000076   .394535  .000076  I  .0942721  .0000070  0.4076 0.0047  I   -52.467     .192    -2.049     .340  -.074860   .394520   .0942860   -51.700    -2.000  
+ 01231 51909.00 I  -.074232  .000073   .396311  .000078  I  .0938013  .0000069  0.5356 0.0038  I   -52.572     .191    -2.112     .340  -.074200   .396280   .0938240   -51.600    -1.900  
+ 1 1 1 51910.00 I  -.073475  .000040   .398000  .000052  I  .0932012  .0000032  0.6628 0.0037  I   -52.513     .174    -2.159     .340  -.073450   .397930   .0932210   -51.600    -2.000  
+ 1 1 2 51911.00 I  -.072616  .000042   .399776  .000057  I  .0924807  .0000029  0.7749 0.0022  I   -52.431     .174    -2.184     .340  -.072570   .399630   .0924880   -51.800    -2.100  
+ 1 1 3 51912.00 I  -.071574  .000046   .401696  .000058  I  .0916585  .0000029  0.8655 0.0022  I   -52.522     .174    -2.242     .340  -.071560   .401750   .0916580   -52.100    -2.300  
+ 1 1 4 51913.00 I  -.071043  .000043   .403552  .000055  I  .0907643  .0000033  0.9123 0.0022  I   -52.722     .174    -2.278     .340  -.071020   .403630   .0907650   -52.600    -2.400  
+ 1 1 5 51914.00 I  -.070727  .000043   .405169  .000052  I  .0898571  .0000033  0.8897 0.0036  I   -52.837     .174    -2.140     .340  -.070740   .405100   .0898580   -53.100    -1.900  
+ 1 1 6 51915.00 I  -.070375  .000043   .406607  .000044  I  .0890085  .0000064  0.7965 0.0061  I   -52.917     .189    -1.821     .340  -.070400   .406550   .0890200   -53.500    -1.800  
+ 1 1 7 51916.00 I  -.070175  .000047   .407955  .000050  I  .0882806  .0000117  0.6539 0.0053  I   -53.215     .183    -1.575     .340  -.070180   .407910   .0883060   -53.700    -1.800  
+ 1 1 8 51917.00 I  -.070202  .000045   .409286  .000070  I  .0876993  .0000084  0.5154 0.0068  I   -53.713     .196    -1.647     .340  -.070120   .409250   .0877260   -53.800    -1.800  
+ 1 1 9 51918.00 I  -.070110  .000056   .410656  .000066  I  .0872305  .0000069  0.4348 0.0056  I   -53.979     .196    -1.955     .340  -.070060   .410700   .0872420   -53.500    -2.000  
+ 1 110 51919.00 I  -.069867  .000052   .412121  .000066  I  .0868107  .0000075  0.4113 0.0051  I   -53.649     .196    -2.180     .340  -.069810   .412100   .0868070   -53.200    -2.200  
+ 1 111 51920.00 I  -.069253  .000052   .413913  .000065  I  .0863871  .0000074  0.4502 0.0048  I   -52.624     .740    -2.182     .340  -.069330   .413860   .0863720   -52.700    -2.400  
+ 1 112 51921.00 I  -.068491  .000054   .415946  .000067  I  .0858811  .0000061  0.5766 0.0053  I   -51.878     .740    -2.036     .340  -.068490   .415910   .0858980   -52.300    -2.600  
+ 1 113 51922.00 I  -.067476  .000048   .418035  .000067  I  .0852171  .0000075  0.7532 0.0059  I   -51.498     .740    -1.953     .340  -.067480   .418010   .0852290   -52.000    -2.400  
+ 1 114 51923.00 I  -.066439  .000049   .420036  .000049  I  .0843862  .0000101  0.8952 0.0050  I   -51.499     .330    -1.918     .206  -.066440   .420030   .0843870   -51.900    -2.300  
+ 1 115 51924.00 I  -.065330  .000036   .421837  .000061  I  .0834544  .0000067  0.9543 0.0062  I   -51.709     .311    -1.818     .182  -.065340   .421820   .0834490   -51.900    -2.100  
+ 1 116 51925.00 I  -.063996  .000041   .423433  .000081  I  .0825093  .0000072  0.9185 0.0055  I   -51.949     .311    -1.677     .182  -.064050   .423420   .0825050   -52.000    -1.900  
+ 1 117 51926.00 I  -.062707  .000040   .424929  .000081  I  .0816517  .0000088  0.7799 0.0056  I   -52.141     .311    -1.643     .182  -.062730   .424880   .0816480   -52.200    -1.900  
+ 1 118 51927.00 I  -.061468  .000041   .426305  .000081  I  .0809688  .0000085  0.5836 0.0059  I   -52.315     .332    -1.770     .181  -.061460   .426190   .0809690   -52.400    -1.900  
+ 1 119 51928.00 I  -.060311  .000045   .427747  .000088  I  .0804814  .0000080  0.3968 0.0058  I   -52.581     .332    -1.948     .181  -.060340   .427710   .0804850   -52.600    -2.100  
+ 1 120 51929.00 I  -.059229  .000050   .429112  .000088  I  .0801680  .0000078  0.2317 0.0061  I   -52.834     .332    -2.065     .181  -.059270   .429150   .0801190   -52.600    -2.200  
+ 1 121 51930.00 I  -.058108  .000049   .430179  .000088  I  .0800094  .0000093  0.0923 0.0060  I   -52.871     .122    -2.149     .189  -.058160   .430160   .0799550   -52.500    -2.300  
+ 1 122 51931.00 I  -.056802  .000062   .431143  .000063  I  .0799699  .0000090 -0.0066 0.0057  I   -52.610     .125    -2.279     .211  -.056820   .431050   .0799820   -52.400    -2.400  
+ 1 123 51932.00 I  -.055433  .000062   .432399  .000068  I  .0800133  .0000065 -0.0777 0.0055  I   -52.196     .125    -2.422     .211  -.055400   .432420   .0800690   -52.100    -2.400  
+ 1 124 51933.00 I  -.054105  .000061   .434088  .000066  I  .0800967  .0000064 -0.0631 0.0046  I   -51.846     .125    -2.457     .211  -.054080   .434170   .0801060   -51.700    -2.300  
+ 1 125 51934.00 I  -.052244  .000061   .435907  .000063  I  .0801067  .0000064  0.0500 0.0045  I   -51.605     .196    -2.312     .172  -.052310   .435870   .0800960   -51.400    -2.100  
+ 1 126 51935.00 I  -.050480  .000061   .437795  .000065  I  .0799898  .0000062  0.1837 0.0052  I   -51.624     .196    -2.188     .172  -.050530   .437790   .0799840   -51.000    -2.100  
+ 1 127 51936.00 I  -.049071  .000061   .439653  .000076  I  .0797378  .0000083  0.3217 0.0047  I   -51.770     .196    -2.174     .172  -.049080   .439600   .0797570   -50.900    -2.100  
+ 1 128 51937.00 I  -.047516  .000040   .441457  .000081  I  .0793490  .0000070  0.4518 0.0054  I   -51.917     .125    -2.262     .200  -.047500   .441380   .0794010   -50.800    -2.100  
+ 1 129 51938.00 I  -.045591  .000037   .443202  .000100  I  .0788464  .0000068  0.5454 0.0048  I   -51.961     .176    -2.358     .171  -.045590   .443170   .0789010   -50.900    -2.300  
+ 1 130 51939.00 I  -.043693  .000038   .444798  .000100  I  .0782754  .0000067  0.5875 0.0048  I   -51.946     .176    -2.440     .171  -.043680   .444700   .0782950   -51.100    -2.400  
+ 1 131 51940.00 I  -.042033  .000035   .446206  .000097  I  .0776959  .0000069  0.5562 0.0048  I   -51.980     .176    -2.569     .171  -.042080   .446190   .0776930   -51.600    -2.700  
+ 1 2 1 51941.00 I  -.040636  .000032   .447190  .000096  I  .0771815  .0000069  0.4696 0.0044  I   -51.985     .124    -2.765     .137  -.040620   .447160   .0771880   -52.100    -3.000  
+ 1 2 2 51942.00 I  -.039126  .000029   .447931  .000089  I  .0767659  .0000053  0.3556 0.0043  I   -51.998     .124    -2.769     .137  -.039100   .447830   .0767630   -52.600    -3.200  
+ 1 2 3 51943.00 I  -.037703  .000032   .448626  .000084  I  .0764797  .0000051  0.2136 0.0036  I   -52.080     .124    -2.567     .137  -.037700   .448620   .0764750   -52.900    -3.400  
+ 1 2 4 51944.00 I  -.036061  .000043   .449368  .000035  I  .0763355  .0000049  0.0814 0.0038  I   -52.499     .740    -2.361     .340  -.036070   .449360   .0763320   -53.300    -3.500  
+ 1 2 5 51945.00 I  -.034020  .000069   .450341  .000038  I  .0762962  .0000055  0.0113 0.0035  I   -53.224     .740    -2.435     .152  -.034080   .450270   .0763010   -53.400    -3.500  
+ 1 2 6 51946.00 I  -.032180  .000068   .451589  .000039  I  .0762796  .0000049  0.0409 0.0038  I   -53.761     .740    -2.795     .152  -.032090   .451620   .0762880   -53.500    -3.500  
+ 1 2 7 51947.00 I  -.030365  .000068   .453000  .000040  I  .0761678  .0000053  0.2102 0.0037  I   -53.620     .740    -3.153     .152  -.030410   .453010   .0761720   -53.400    -3.300  
+ 1 2 8 51948.00 I  -.028369  .000069   .454523  .000037  I  .0758262  .0000056  0.4784 0.0039  I   -52.834     .740    -3.243     .180  -.028520   .454470   .0758360   -53.200    -3.100  
+ 1 2 9 51949.00 I  -.026513  .000069   .456074  .000063  I  .0752100  .0000057  0.7497 0.0046  I   -51.910     .740    -3.188     .180  -.026520   .456090   .0751990   -52.900    -3.000  
+ 1 210 51950.00 I  -.024700  .000065   .457538  .000069  I  .0743443  .0000074  0.9684 0.0047  I   -51.319     .176    -3.125     .149  -.024720   .457560   .0743150   -52.600    -2.600  
+ 1 211 51951.00 I  -.023433  .000034   .458809  .000078  I  .0733026  .0000076  1.0990 0.0051  I   -51.218     .179    -3.057     .340  -.023390   .458870   .0732830   -52.300    -2.500  
+ 1 212 51952.00 I  -.022363  .000038   .459792  .000083  I  .0721740  .0000069  1.1465 0.0052  I   -51.475     .175    -2.877     .340  -.022340   .459760   .0721790   -52.100    -2.400  
+ 1 213 51953.00 I  -.020906  .000039   .460725  .000082  I  .0710272  .0000071  1.1411 0.0054  I   -51.830     .175    -2.633     .340  -.020910   .460680   .0710400   -51.900    -2.500  
+ 1 214 51954.00 I  -.019204  .000041   .461937  .000080  I  .0699186  .0000084  1.0554 0.0057  I   -52.076     .175    -2.547     .340  -.019230   .461970   .0699210   -51.900    -2.600  
+ 1 215 51955.00 I  -.017628  .000038   .463232  .000068  I  .0689386  .0000089  0.9030 0.0060  I   -52.241     .170    -2.717     .340  -.017580   .463260   .0689260   -51.700    -2.700  
+ 1 216 51956.00 I  -.015910  .000038   .464556  .000068  I  .0681089  .0000085  0.7617 0.0064  I   -52.437     .170    -3.066     .340  -.015900   .464530   .0681100   -51.700    -3.000  
+ 1 217 51957.00 I  -.014070  .000038   .465865  .000067  I  .0674058  .0000092  0.6487 0.0109  I   -52.687     .107    -3.340     .340  -.014070   .465820   .0673560   -51.500    -3.300  
+ 1 218 51958.00 I  -.012282  .000030   .467076  .000057  I  .0667945  .0000200  0.5868 0.0067  I   -52.746     .740    -3.470     .182  -.012260   .467050   .0667340   -51.400    -3.400  
+ 1 219 51959.00 I  -.010501  .000041   .468197  .000057  I  .0662114  .0000097  0.5874 0.0104  I   -52.415     .139    -3.529     .178  -.010490   .468140   .0661950   -51.200    -3.500  
+ 1 220 51960.00 I  -.008318  .000059   .469373  .000058  I  .0656072  .0000059  0.6255 0.0056  I   -51.832     .139    -3.558     .178  -.008260   .469310   .0656190   -51.000    -3.500  
+ 1 221 51961.00 I  -.005520  .000056   .470698  .000052  I  .0649585  .0000054  0.6693 0.0038  I   -51.326     .139    -3.500     .178  -.005540   .470720   .0649590   -50.800    -3.500  
+ 1 222 51962.00 I  -.002296  .000056   .472165  .000052  I  .0642607  .0000048  0.7366 0.0037  I   -50.976     .171    -3.335     .157  -.002380   .472160   .0642450   -50.700    -3.400  
+ 1 223 51963.00 I   .000948  .000058   .473902  .000050  I  .0634634  .0000051  0.8694 0.0036  I   -50.956     .171    -3.147     .157   .001010   .473850   .0634730   -50.500    -3.200  
+ 1 224 51964.00 I   .004069  .000059   .475723  .000048  I  .0625081  .0000053  1.0437 0.0038  I   -51.055     .171    -3.074     .157   .004070   .475750   .0625000   -50.500    -3.200  
+ 1 225 51965.00 I   .006803  .000060   .477346  .000044  I  .0613757  .0000057  1.2189 0.0042  I   -51.200     .740    -3.150     .116   .006820   .477360   .0613410   -50.600    -3.200  
+ 1 226 51966.00 I   .009390  .000056   .478757  .000069  I  .0600802  .0000066  1.3642 0.0055  I   -51.325     .169    -3.303     .340   .009410   .478700   .0600530   -50.700    -3.300  
+ 1 227 51967.00 I   .011992  .000059   .479986  .000071  I  .0586678  .0000093  1.4479 0.0057  I   -51.384     .169    -3.467     .340   .011990   .479910   .0586680   -50.900    -3.500  
+ 1 228 51968.00 I   .014200  .000057   .481045  .000070  I  .0572087  .0000093  1.4586 0.0063  I   -51.395     .169    -3.630     .340   .014300   .481000   .0572140   -51.300    -3.800  
+ 1 3 1 51969.00 I   .016153  .000057   .481998  .000072  I  .0557767  .0000086  1.3911 0.0064  I   -51.668     .685    -3.826     .106   .016090   .481990   .0557520   -51.600    -4.100  
+ 1 3 2 51970.00 I   .017276  .000071   .482700  .000077  I  .0544494  .0000087  1.2550 0.0062  I   -51.632     .685    -3.900     .106   .017280   .482630   .0544200   -51.800    -4.400  
+ 1 3 3 51971.00 I   .018496  .000066   .483232  .000083  I  .0532711  .0000088  1.1058 0.0053  I   -51.638     .145    -3.870     .340   .018470   .483100   .0532710   -52.000    -4.700  
+ 1 3 4 51972.00 I   .020341  .000053   .483840  .000087  I  .0522268  .0000060  0.9897 0.0061  I   -51.810     .740    -3.842     .340   .020380   .483750   .0522360   -52.200    -4.800  
+ 1 3 5 51973.00 I   .022588  .000087   .484558  .000097  I  .0512724  .0000084  0.9316 0.0051  I   -52.135     .412    -3.975     .340   .022620   .484550   .0512640   -52.200    -4.900  
+ 1 3 6 51974.00 I   .024503  .000096   .485112  .000093  I  .0503386  .0000083  0.9484 0.0059  I   -52.357     .412    -4.273     .340   .024500   .485160   .0503260   -52.100    -4.800  
+ 1 3 7 51975.00 I   .026284  .000095   .485380  .000093  I  .0493333  .0000083  1.0920 0.0059  I   -52.202     .412    -4.545     .340   .026380   .485330   .0493410   -52.000    -4.500  
+ 1 3 8 51976.00 I   .028795  .000088   .485434  .000088  I  .0481232  .0000083  1.3296 0.0058  I   -51.688     .412    -4.630     .340   .028660   .485440   .0481510   -51.800    -4.300  
+ 1 3 9 51977.00 I   .031018  .000088   .485399  .000083  I  .0466901  .0000082  1.5191 0.0071  I   -51.107     .412    -4.587     .340   .031050   .485380   .0466690   -51.600    -4.100  
+ 1 310 51978.00 I   .033359  .000092   .485373  .000062  I  .0451120  .0000116  1.6277 0.0063  I   -50.747     .412    -4.572     .340   .033350   .485300   .0451310   -51.400    -3.900  
+ 1 311 51979.00 I   .035564  .000055   .485413  .000035  I  .0434664  .0000096  1.6413 0.0069  I   -50.712     .740    -4.590     .340   .035550   .485400   .0435500   -51.300    -3.800  
+ 1 312 51980.00 I   .038022  .000034   .485524  .000052  I  .0418693  .0000075  1.5354 0.0068  I   -50.933     .412    -4.513     .340   .037980   .485480   .0419400   -51.100    -3.800  
+ 1 313 51981.00 I   .040915  .000033   .485734  .000052  I  .0404265  .0000096  1.3370 0.0064  I   -51.229     .412    -4.330     .340   .040870   .485670   .0404350   -51.000    -3.900  
+ 1 314 51982.00 I   .043874  .000028   .486103  .000048  I  .0392186  .0000104  1.0688 0.0072  I   -51.433     .412    -4.233     .340   .043920   .486220   .0392130   -50.900    -4.200  
+ 1 315 51983.00 I   .046406  .000027   .486377  .000050  I  .0382843  .0000107  0.8144 0.0074  I   -51.535     .412    -4.391     .340   .046450   .486420   .0383080   -50.700    -4.500  
+ 1 316 51984.00 I   .048681  .000028   .486655  .000054  I  .0375617  .0000106  0.6443 0.0073  I   -51.665     .412    -4.724     .340   .048650   .486610   .0375840   -50.600    -4.800  
+ 1 317 51985.00 I   .050978  .000030   .487043  .000053  I  .0369778  .0000099  0.5279 0.0081  I   -51.841     .412    -4.996     .340   .050980   .487060   .0369820   -50.400    -5.100  
+ 1 318 51986.00 I   .053555  .000027   .487408  .000066  I  .0364941  .0000122  0.4468 0.0070  I   -51.824     .740    -5.080     .340   .053540   .487400   .0364890   -50.300    -5.200  
+ 1 319 51987.00 I   .056329  .000044   .487821  .000069  I  .0360676  .0000100  0.4153 0.0072  I   -51.399     .374    -5.031     .176   .056310   .487770   .0360630   -50.200    -5.300  
+ 1 320 51988.00 I   .059135  .000061   .488394  .000086  I  .0356430  .0000077  0.4451 0.0067  I   -50.698     .374    -4.944     .176   .059060   .488390   .0356370   -50.200    -5.100  
+ 1 321 51989.00 I   .061688  .000061   .488864  .000087  I  .0351568  .0000088  0.5365 0.0058  I   -50.111     .374    -4.828     .176   .061640   .488880   .0351550   -50.100    -5.000  
+ 1 322 51990.00 I   .064613  .000062   .489050  .000087  I  .0345635  .0000088  0.6473 0.0064  I   -49.860     .419    -4.696     .152   .064420   .489130   .0345770   -50.100    -4.800  
+ 1 323 51991.00 I   .067318  .000067   .489461  .000088  I  .0338698  .0000092  0.7354 0.0063  I   -49.913     .419    -4.489     .152   .067340   .489510   .0338570   -50.100    -4.600  
+ 1 324 51992.00 I   .070277  .000066   .490025  .000073  I  .0330839  .0000090  0.8498 0.0057  I   -50.077     .419    -4.351     .152   .070240   .490030   .0330900   -50.200    -4.500  
+ 1 325 51993.00 I   .073332  .000083   .490497  .000064  I  .0321623  .0000069  0.9878 0.0053  I   -50.258     .109    -4.368     .340   .073320   .490500   .0321940   -50.200    -4.500  
+ 1 326 51994.00 I   .076391  .000085   .490842  .000038  I  .0311235  .0000056  1.0803 0.0044  I   -50.411     .103    -4.541     .340   .076380   .490860   .0311380   -50.200    -4.600  
+ 1 327 51995.00 I   .079270  .000092   .491052  .000038  I  .0300255  .0000054  1.1015 0.0039  I   -50.482     .140    -4.793     .144   .079230   .491060   .0300160   -50.300    -4.800  
+ 1 328 51996.00 I   .081797  .000092   .491117  .000039  I  .0289424  .0000054  1.0571 0.0037  I   -50.483     .140    -5.020     .144   .081730   .491080   .0289390   -50.200    -5.000  
+ 1 329 51997.00 I   .084181  .000090   .491078  .000040  I  .0279322  .0000052  0.9502 0.0037  I   -50.420     .173    -5.139     .132   .084070   .491050   .0279420   -50.100    -5.300  
+ 1 330 51998.00 I   .086363  .000091   .490780  .000043  I  .0270475  .0000052  0.8270 0.0040  I   -50.514     .173    -5.190     .132   .086360   .490830   .0270520   -49.900    -5.600  
+ 1 331 51999.00 I   .088580  .000077   .490263  .000049  I  .0262681  .0000061  0.7341 0.0044  I   -50.623     .205    -5.212     .153   .088550   .490340   .0262730   -49.800    -5.700  
+ 1 4 1 52000.00 I   .090657  .000062   .489693  .000041  I  .0255680  .0000071  0.6750 0.0041  I   -50.626     .348    -5.274     .164   .090660   .489730   .0255590   -49.700    -5.800  
+ 1 4 2 52001.00 I   .092713  .000034   .489218  .000061  I  .0248977  .0000056  0.6770 0.0043  I   -50.444     .330    -5.404     .340   .092710   .489170   .0248780   -49.600    -5.800  
+ 1 4 3 52002.00 I   .094742  .000033   .488819  .000071  I  .0241865  .0000050  0.7616 0.0040  I   -50.089     .330    -5.549     .340   .094770   .488820   .0241770   -49.500    -5.800  
+ 1 4 4 52003.00 I   .096970  .000033   .488212  .000068  I  .0233415  .0000056  0.9453 0.0039  I   -49.680     .330    -5.609     .340   .097060   .488230   .0233470   -49.600    -5.600  
+ 1 4 5 52004.00 I   .099146  .000034   .487316  .000068  I  .0222831  .0000061  1.1674 0.0048  I   -49.398     .330    -5.542     .340   .099230   .487290   .0222820   -49.600    -5.400  
+ 1 4 6 52005.00 I   .101639  .000034   .486689  .000076  I  .0210200  .0000078  1.3495 0.0055  I   -49.370     .330    -5.440     .340   .101620   .486670   .0210190   -50.000    -5.500  
+ 1 4 7 52006.00 I   .104372  .000034   .486451  .000081  I  .0196018  .0000091  1.4786 0.0067  I   -49.565     .205    -5.436     .340   .104330   .486450   .0196170   -50.200    -5.500  
+ 1 4 8 52007.00 I   .106684  .000029   .486230  .000070  I  .0181065  .0000108  1.4768 0.0066  I   -49.839     .740    -5.535     .340   .106650   .486230   .0181290   -50.300    -5.500  
+ 1 4 9 52008.00 I   .108446  .000054   .485677  .000078  I  .0167021  .0000095  1.3133 0.0075  I   -50.069     .156    -5.600     .340   .108450   .485660   .0167110   -50.400    -5.500  
+ 1 410 52009.00 I   .110408  .000053   .484787  .000077  I  .0155036  .0000103  1.0787 0.0068  I   -50.216     .156    -5.543     .340   .110420   .484780   .0155010   -50.400    -5.500  
+ 1 411 52010.00 I   .112966  .000050   .483921  .000076  I  .0145483  .0000097  0.8332 0.0065  I   -50.299     .156    -5.457     .340   .113020   .483870   .0145520   -50.300    -5.600  
+ 1 412 52011.00 I   .115877  .000049   .483273  .000073  I  .0138282  .0000078  0.6148 0.0058  I   -50.502     .193    -5.557     .340   .115940   .483200   .0138300   -50.000    -5.600  
+ 1 413 52012.00 I   .118552  .000049   .482764  .000070  I  .0133060  .0000062  0.4346 0.0057  I   -50.635     .193    -5.740     .340   .118580   .482740   .0132910   -49.700    -5.600  
+ 1 414 52013.00 I   .120993  .000048   .482036  .000069  I  .0129373  .0000082  0.3195 0.0054  I   -50.769     .193    -5.911     .340   .121010   .481980   .0129400   -49.500    -5.600  
+ 1 415 52014.00 I   .123648  .000030   .481138  .000065  I  .0126343  .0000089  0.3024 0.0054  I   -50.707     .740    -5.950     .340   .123680   .481070   .0126510   -49.100    -5.700  
+ 1 416 52015.00 I   .126521  .000050   .480220  .000061  I  .0122983  .0000071  0.3877 0.0056  I   -50.303     .299    -5.886     .340   .126590   .480190   .0123230   -48.800    -5.800  
+ 1 417 52016.00 I   .129576  .000061   .479260  .000069  I  .0118375  .0000067  0.5371 0.0050  I   -49.685     .285    -5.814     .340   .129610   .479320   .0118590   -48.600    -5.800  
+ 1 418 52017.00 I   .132758  .000060   .478579  .000071  I  .0112160  .0000070  0.7109 0.0049  I   -49.187     .285    -5.762     .340   .132870   .478610   .0112190   -48.500    -5.800  
+ 1 419 52018.00 I   .136404  .000060   .478052  .000070  I  .0104241  .0000071  0.8595 0.0048  I   -49.053     .285    -5.683     .340   .136310   .478060   .0104330   -48.600    -5.900  
+ 1 420 52019.00 I   .139400  .000061   .477581  .000070  I  .0095180  .0000065  0.9450 0.0052  I   -49.257     .285    -5.545     .340   .139470   .477590   .0095310   -48.800    -5.900  
+ 1 421 52020.00 I   .142322  .000063   .476918  .000059  I  .0085454  .0000075  0.9967 0.0056  I   -49.603     .336    -5.390     .340   .142300   .476880   .0085640   -49.100    -5.900  
+ 1 422 52021.00 I   .144945  .000047   .476117  .000058  I  .0075411  .0000092  0.9988 0.0061  I   -49.917     .256    -5.317     .340   .144920   .476040   .0075520   -49.300    -5.900  
+ 1 423 52022.00 I   .147340  .000050   .475404  .000049  I  .0065665  .0000095  0.9449 0.0069  I   -50.103     .177    -5.408     .106   .147380   .475340   .0065630   -49.600    -5.900  
+ 1 424 52023.00 I   .149333  .000050   .474680  .000048  I  .0056600  .0000102  0.8648 0.0069  I   -50.147     .177    -5.648     .106   .149330   .474630   .0056590   -49.800    -6.000  
+ 1 425 52024.00 I   .151014  .000050   .473687  .000041  I  .0048331  .0000100  0.7961 0.0066  I   -50.130     .177    -5.922     .106   .151040   .473690   .0048440   -49.800    -6.000  
+ 1 426 52025.00 I   .153471  .000050   .472377  .000041  I  .0040681  .0000085  0.7267 0.0068  I   -50.319     .160    -6.143     .145   .153320   .472380   .0040670   -49.800    -6.000  
+ 1 427 52026.00 I   .155789  .000051   .471026  .000044  I  .0033913  .0000091  0.6227 0.0068  I   -50.514     .160    -6.178     .145   .155790   .470940   .0033730   -49.700    -6.100  
+ 1 428 52027.00 I   .157806  .000050   .469570  .000044  I  .0028082  .0000106  0.5622 0.0110  I   -50.740     .160    -6.152     .145   .157800   .469490   .0028290   -49.500    -6.100  
+ 1 429 52028.00 I   .159603  .000022   .467985  .000029  I  .0022319  .0000200  0.6068 0.0070  I   -50.776     .740    -6.154     .340   .159600   .467950   .0022510   -49.300    -6.200  
+ 1 430 52029.00 I   .161444  .000040   .466243  .000051  I  .0015624  .0000090  0.7479 0.0108  I   -50.478     .317    -6.198     .340   .161460   .466200   .0015540   -49.100    -6.100  
+ 1 5 1 52030.00 I   .163356  .000072   .464304  .000091  I  .0007169  .0000083  0.9465 0.0062  I   -49.916     .303    -6.223     .340   .163170   .464260   .0006960   -49.000    -6.200  
+ 1 5 2 52031.00 I   .164950  .000071   .462522  .000090  I -.0003369  .0000084  1.1639 0.0059  I   -49.361     .303    -6.169     .340   .164950   .462500  -.0003420   -49.000    -6.200  
+ 1 5 3 52032.00 I   .167277  .000072   .461283  .000090  I -.0016044  .0000083  1.3619 0.0056  I   -49.158     .335    -6.060     .103   .167170   .461160  -.0015850   -49.100    -6.100  
+ 1 5 4 52033.00 I   .169451  .000074   .460079  .000091  I -.0030462  .0000075  1.5163 0.0055  I   -49.369     .335    -5.928     .103   .169470   .460060  -.0030340   -49.400    -6.200  
+ 1 5 5 52034.00 I   .171731  .000074   .458504  .000091  I -.0046043  .0000071  1.5725 0.0053  I   -49.905     .335    -5.879     .103   .171710   .458490  -.0046170   -49.600    -6.200  
+ 1 5 6 52035.00 I   .173634  .000070   .456540  .000090  I -.0061441  .0000075  1.4874 0.0045  I   -50.461     .328    -5.930     .130   .173660   .456560  -.0061660   -49.800    -5.900  
+ 1 5 7 52036.00 I   .175770  .000036   .454417  .000040  I -.0075479  .0000055  1.3086 0.0051  I   -50.780     .740    -5.998     .103   .175750   .454430  -.0075520   -50.200    -5.900  
+ 1 5 8 52037.00 I   .178361  .000036   .452275  .000039  I -.0087514  .0000070  1.0999 0.0043  I   -50.827     .740    -6.001     .103   .178400   .452300  -.0087500   -50.400    -5.900  
+ 1 5 9 52038.00 I   .181152  .000037   .450055  .000041  I -.0097479  .0000067  0.8917 0.0047  I   -50.758     .740    -5.956     .103   .181190   .450110  -.0097520   -50.500    -6.100  
+ 1 510 52039.00 I   .183899  .000031   .447804  .000040  I -.0105429  .0000064  0.7078 0.0048  I   -50.800     .740    -5.985     .340   .183850   .447870  -.0105440   -50.400    -6.200  
+ 1 511 52040.00 I   .186558  .000031   .445713  .000041  I -.0111874  .0000068  0.5955 0.0057  I   -50.907     .740    -6.067     .340   .186520   .445780  -.0111840   -50.300    -6.300  
+ 1 512 52041.00 I   .189162  .000028   .444034  .000022  I -.0117606  .0000095  0.5633 0.0055  I   -51.016     .740    -6.164     .340   .189130   .444060  -.0117580   -50.000    -6.400  
+ 1 513 52042.00 I   .191399  .000066   .442523  .000038  I -.0123357  .0000086  0.5963 0.0061  I   -50.989     .740    -6.207     .340   .191380   .442540  -.0123210   -49.800    -6.400  
+ 1 514 52043.00 I   .193310  .000069   .440749  .000046  I -.0129715  .0000075  0.6841 0.0053  I   -50.779     .231    -6.214     .340   .193240   .440740  -.0129560   -49.600    -6.400  
+ 1 515 52044.00 I   .194797  .000077   .438595  .000063  I -.0137153  .0000062  0.8060 0.0048  I   -50.458     .268    -6.243     .113   .194970   .438620  -.0137180   -49.500    -6.300  
+ 1 516 52045.00 I   .196885  .000076   .436321  .000061  I -.0145805  .0000061  0.9189 0.0043  I   -50.181     .268    -6.288     .113   .196880   .436330  -.0145870   -49.500    -6.300  
+ 1 517 52046.00 I   .198612  .000076   .433526  .000061  I -.0155485  .0000061  1.0181 0.0040  I   -50.143     .269    -6.271     .114   .198680   .433650  -.0155280   -49.800    -6.100  
+ 1 518 52047.00 I   .200793  .000076   .430724  .000061  I -.0166117  .0000051  1.1022 0.0043  I   -50.403     .269    -6.182     .114   .200760   .430710  -.0166130   -50.200    -6.000  
+ 1 519 52048.00 I   .203161  .000053   .427891  .000058  I -.0177380  .0000061  1.1414 0.0038  I   -50.912     .324    -6.028     .134   .203180   .427890  -.0177410   -50.500    -5.900  
+ 1 520 52049.00 I   .205174  .000060   .425164  .000072  I -.0188736  .0000055  1.1179 0.0039  I   -51.429     .459    -5.874     .155   .205110   .425180  -.0188620   -50.900    -5.900  
+ 1 521 52050.00 I   .206955  .000057   .422557  .000053  I -.0199526  .0000049  1.0310 0.0037  I   -51.730     .417    -5.801     .104   .206910   .422590  -.0199380   -51.200    -5.900  
+ 1 522 52051.00 I   .208746  .000055   .420125  .000053  I -.0209135  .0000050  0.8779 0.0034  I   -51.794     .417    -5.870     .104   .208850   .420250  -.0209080   -51.400    -6.000  
+ 1 523 52052.00 I   .210426  .000056   .417989  .000061  I -.0216892  .0000048  0.6671 0.0035  I   -51.787     .389    -6.069     .111   .210410   .418040  -.0216940   -51.400    -6.100  
+ 1 524 52053.00 I   .212039  .000057   .415612  .000062  I -.0222479  .0000048  0.4568 0.0032  I   -51.841     .390    -6.275     .103   .211890   .415630  -.0222490   -51.300    -6.300  
+ 1 525 52054.00 I   .213256  .000058   .413088  .000063  I -.0226142  .0000042  0.2808 0.0030  I   -51.985     .390    -6.385     .103   .213350   .413120  -.0226100   -51.200    -6.400  
+ 1 526 52055.00 I   .214679  .000047   .410347  .000042  I -.0228347  .0000036  0.1805 0.0035  I   -52.084     .252    -6.357     .340   .214620   .410370  -.0228330   -50.900    -6.500  
+ 1 527 52056.00 I   .215942  .000032   .407372  .000047  I -.0230140  .0000056  0.1968 0.0032  I   -52.048     .298    -6.267     .114   .215880   .407350  -.0230120   -50.600    -6.500  
+ 1 528 52057.00 I   .217326  .000033   .404456  .000051  I -.0232574  .0000053  0.3006 0.0043  I   -51.860     .226    -6.203     .340   .217320   .404480  -.0232580   -50.500    -6.400  
+ 1 529 52058.00 I   .219019  .000037   .401751  .000063  I -.0236287  .0000065  0.4449 0.0041  I   -51.561     .333    -6.177     .117   .219030   .401800  -.0236350   -50.600    -6.300  
+ 1 530 52059.00 I   .220923  .000039   .399153  .000064  I -.0241428  .0000062  0.5758 0.0045  I   -51.251     .333    -6.150     .117   .220930   .399220  -.0241480   -50.900    -6.200  
+ 1 531 52060.00 I   .222844  .000037   .396603  .000062  I -.0247593  .0000062  0.6435 0.0043  I   -51.097     .331    -6.125     .340   .222860   .396660  -.0247580   -51.400    -6.000  
+ 1 6 1 52061.00 I   .224462  .000037   .394024  .000063  I -.0254085  .0000061  0.6472 0.0049  I   -51.244     .331    -6.036     .340   .224420   .394050  -.0253810   -52.000    -5.900  
+ 1 6 2 52062.00 I   .225856  .000043   .391301  .000067  I -.0260285  .0000075  0.5753 0.0047  I   -51.720     .331    -5.948     .340   .225790   .391340  -.0260010   -52.700    -5.800  
+ 1 6 3 52063.00 I   .227208  .000067   .388448  .000070  I -.0265294  .0000072  0.4143 0.0049  I   -52.338     .329    -5.884     .340   .227200   .388480  -.0265140   -53.100    -5.700  
+ 1 6 4 52064.00 I   .228755  .000066   .385506  .000065  I -.0268396  .0000062  0.2008 0.0050  I   -52.808     .154    -5.848     .340   .228700   .385520  -.0268270   -52.600    -5.600  
+ 1 6 5 52065.00 I   .230305  .000066   .382461  .000063  I -.0269233  .0000069 -0.0358 0.0047  I   -52.956     .154    -5.839     .340   .230520   .382550  -.0268950   -52.500    -5.700  
+ 1 6 6 52066.00 I   .232394  .000065   .379951  .000061  I -.0267701  .0000070 -0.2660 0.0050  I   -52.868     .154    -5.872     .340   .232380   .380060  -.0267660   -52.400    -5.800  
+ 1 6 7 52067.00 I   .234494  .000065   .377269  .000062  I -.0264129  .0000072 -0.4314 0.0045  I   -52.701     .175    -5.941     .340   .234400   .377400  -.0264180   -52.200    -6.100  
+ 1 6 8 52068.00 I   .236427  .000064   .374759  .000060  I -.0259398  .0000058 -0.4994 0.0049  I   -52.706     .175    -6.044     .340   .236450   .374730  -.0259510   -51.900    -6.400  
+ 1 6 9 52069.00 I   .238000  .000036   .372435  .000054  I -.0254444  .0000067 -0.4764 0.0048  I   -52.778     .211    -6.101     .340   .237980   .372450  -.0254460   -51.800    -6.600  
+ 1 610 52070.00 I   .239149  .000032   .370013  .000053  I -.0250118  .0000076 -0.3791 0.0043  I   -52.859     .194    -6.102     .108   .239120   .370100  -.0250090   -51.800    -6.700  
+ 1 611 52071.00 I   .240122  .000057   .367384  .000058  I -.0247004  .0000054 -0.2394 0.0049  I   -52.955     .130    -6.113     .155   .240140   .367450  -.0246970   -51.900    -6.800  
+ 1 612 52072.00 I   .241075  .000056   .364662  .000077  I -.0245354  .0000063 -0.0925 0.0046  I   -53.041     .159    -6.179     .154   .241010   .364630  -.0245310   -52.300    -6.700  
+ 1 613 52073.00 I   .241862  .000055   .361668  .000077  I -.0245107  .0000074  0.0404 0.0049  I   -53.044     .159    -6.245     .154   .241850   .361720  -.0245030   -52.700    -6.400  
+ 1 614 52074.00 I   .243205  .000058   .358359  .000078  I -.0245966  .0000074  0.1143 0.0053  I   -53.123     .135    -6.189     .172   .243170   .358550  -.0245960   -53.300    -6.200  
+ 1 615 52075.00 I   .244809  .000059   .355242  .000078  I -.0247260  .0000075  0.1481 0.0059  I   -53.318     .135    -6.073     .172   .244820   .355300  -.0247330   -53.700    -5.900  
+ 1 616 52076.00 I   .246266  .000086   .352304  .000074  I -.0248955  .0000093  0.1900 0.0064  I   -53.895     .132    -5.936     .196   .246230   .352330  -.0248900   -54.300    -5.700  
+ 1 617 52077.00 I   .247366  .000074   .349444  .000070  I -.0250968  .0000104  0.2043 0.0072  I   -54.637     .106    -5.811     .183   .247330   .349550  -.0250730   -54.600    -5.500  
+ 1 618 52078.00 I   .248189  .000080   .346490  .000067  I -.0252880  .0000111  0.1705 0.0069  I   -55.150     .280    -5.682     .128   .248170   .346560  -.0252650   -54.800    -5.400  
+ 1 619 52079.00 I   .248439  .000077   .343539  .000069  I -.0254205  .0000091  0.0850 0.0073  I   -55.314     .298    -5.593     .134   .248480   .343620  -.0254190   -54.900    -5.500  
+ 1 620 52080.00 I   .248322  .000073   .340726  .000069  I -.0254431  .0000094 -0.0451 0.0066  I   -55.352     .298    -5.648     .134   .248350   .340790  -.0254530   -54.900    -5.600  
+ 1 621 52081.00 I   .248209  .000073   .337798  .000069  I -.0253430  .0000096 -0.1369 0.0064  I   -55.457     .306    -5.813     .340   .248270   .337830  -.0253190   -54.800    -5.700  
+ 1 622 52082.00 I   .248422  .000039   .334848  .000063  I -.0251893  .0000086 -0.1686 0.0066  I   -55.519     .306    -6.047     .340   .248430   .334900  -.0252160   -54.500    -5.800  
+ 1 623 52083.00 I   .248662  .000040   .331828  .000064  I -.0250212  .0000092 -0.1540 0.0058  I   -55.387     .306    -6.118     .340   .248720   .331890  -.0249870   -54.400    -6.000  
+ 1 624 52084.00 I   .248931  .000042   .328775  .000072  I -.0249081  .0000078 -0.0592 0.0063  I   -55.131     .234    -6.019     .340   .248970   .328800  -.0248170   -54.300    -6.100  
+ 1 625 52085.00 I   .249514  .000047   .325692  .000079  I -.0249313  .0000085  0.1209 0.0056  I   -54.975     .134    -5.893     .340   .249480   .325730  -.0248560   -54.300    -6.100  
+ 1 626 52086.00 I   .250305  .000066   .322581  .000103  I -.0251681  .0000080  0.3557 0.0057  I   -55.024     .191    -5.851     .340   .250410   .322600  -.0251460   -54.600    -6.100  
+ 1 627 52087.00 I   .251263  .000065   .319736  .000103  I -.0256329  .0000077  0.5613 0.0054  I   -55.177     .191    -5.870     .340   .251270   .319770  -.0256330   -54.900    -6.000  
+ 1 628 52088.00 I   .252011  .000065   .317012  .000103  I -.0262455  .0000072  0.6315 0.0051  I   -55.395     .217    -5.880     .340   .251940   .316990  -.0262050   -55.500    -6.000  
+ 1 629 52089.00 I   .252360  .000066   .313934  .000104  I -.0268484  .0000066  0.5593 0.0053  I   -55.492     .217    -5.840     .340   .252380   .313920  -.0268050   -56.000    -5.900  
+ 1 630 52090.00 I   .252992  .000058   .310715  .000092  I -.0273415  .0000078  0.4193 0.0052  I   -55.700     .259    -5.779     .340   .252990   .310720  -.0273470   -56.400    -5.800  
+ 1 7 1 52091.00 I   .253731  .000063   .307575  .000087  I -.0276738  .0000081  0.2396 0.0058  I   -56.098     .425    -5.717     .340   .253780   .307610  -.0277010   -56.600    -5.700  
+ 1 7 2 52092.00 I   .253964  .000047   .304394  .000058  I -.0278178  .0000086  0.0511 0.0060  I   -56.574     .347    -5.664     .340   .253940   .304430  -.0278370   -56.600    -5.700  
+ 1 7 3 52093.00 I   .253753  .000046   .301145  .000057  I -.0277834  .0000088 -0.1151 0.0062  I   -56.892     .347    -5.662     .340   .253750   .301190  -.0277890   -56.300    -5.700  
+ 1 7 4 52094.00 I   .254215  .000045   .298188  .000056  I -.0276027  .0000088 -0.2358 0.0064  I   -56.929     .347    -5.763     .340  0.254090  0.298230 -0.0276160   -56.000    -5.800  
+ 1 7 5 52095.00 I   .254232  .000044   .295468  .000055  I -.0273324  .0000092 -0.2945 0.0065  I   -56.882     .421    -5.943     .340  0.254290  0.295550 -0.0273580   -56.900    -6.000  
+ 1 7 6 52096.00 I   .253911  .000046   .292761  .000059  I -.0270278  .0000095 -0.3110 0.0082  I   -56.746     .421    -6.098     .340  0.253890  0.292770 -0.0270370   -57.200    -6.100  
+ 1 7 7 52097.00 I   .253524  .000032   .290040  .000051  I -.0267282  .0000135 -0.2743 0.0061  I   -56.724     .740    -6.097     .340  0.253530  0.290050 -0.0267140   -57.300    -6.100  
+ 1 7 8 52098.00 I   .252708  .000038   .287256  .000034  I -.0264986  .0000075 -0.1795 0.0078  I   -56.847     .740    -5.961     .340  0.252700  0.287310 -0.0264760   -57.300    -6.000  
+ 1 7 9 52099.00 I   .251813  .000041   .284150  .000049  I -.0263669  .0000079 -0.0917 0.0050  I   -57.119     .195    -5.844     .127  0.251720  0.284140 -0.0263590   -57.300    -6.000  
+ 1 710 52100.00 I   .251686  .000041   .280793  .000052  I -.0263067  .0000067 -0.0296 0.0051  I   -57.433     .365    -5.847     .101  0.251690  0.280760 -0.0263210   -57.300    -6.000  
+ 1 711 52101.00 I   .251944  .000042   .277620  .000052  I -.0263047  .0000066  0.0234 0.0046  I   -57.574     .365    -5.891     .101  0.251980  0.277670 -0.0263080   -57.300    -5.900  
+ 1 712 52102.00 I   .251507  .000041   .274653  .000050  I -.0263530  .0000064  0.0747 0.0042  I   -57.562     .303    -5.843     .104  0.251470  0.274620 -0.0263440   -57.600    -5.900  
+ 1 713 52103.00 I   .250977  .000042   .271726  .000050  I -.0264534  .0000051  0.1238 0.0045  I   -57.597     .303    -5.707     .104  0.250880  0.271650 -0.0264360   -58.100    -5.800  
+ 1 714 52104.00 I   .250420  .000038   .268800  .000055  I -.0265857  .0000062  0.1281 0.0039  I   -58.082     .303    -5.628     .104  0.250360  0.268790 -0.0265840   -58.500    -5.800  
+ 1 715 52105.00 I   .249489  .000041   .265680  .000041  I -.0266888  .0000060  0.0699 0.0053  I   -58.901     .440    -5.654     .340  0.249470  0.265690 -0.0266870   -59.000    -5.900  
+ 1 716 52106.00 I   .248487  .000054   .262337  .000040  I -.0267108  .0000086 -0.0323 0.0048  I   -59.563     .317    -5.671     .340  0.248500  0.262310 -0.0266970   -59.300    -5.800  
+ 1 717 52107.00 I   .248045  .000064   .259044  .000056  I -.0266166  .0000074 -0.1572 0.0056  I   -59.795     .317    -5.608     .340  0.248020  0.259030 -0.0265990   -59.400    -5.700  
+ 1 718 52108.00 I   .247899  .000062   .255898  .000054  I -.0263879  .0000073 -0.3075 0.0052  I   -59.785     .317    -5.582     .340  0.247930  0.255930 -0.0263840   -59.300    -5.600  
+ 1 719 52109.00 I   .247886  .000061   .252693  .000054  I -.0260054  .0000073 -0.4463 0.0052  I   -59.727     .264    -5.746     .340  0.247880  0.252780 -0.0260360   -58.700    -5.500  
+ 1 720 52110.00 I   .247644  .000062   .249621  .000055  I -.0255194  .0000073 -0.5128 0.0049  I   -59.684     .264    -5.995     .340  0.247620  0.249630 -0.0255320   -58.100    -5.400  
+ 1 721 52111.00 I   .247124  .000055   .246549  .000058  I -.0250172  .0000066 -0.4672 0.0051  I   -59.436     .264    -6.113     .340  0.247110  0.246510 -0.0250070   -57.700    -5.400  
+ 1 722 52112.00 I   .246308  .000062   .243497  .000077  I -.0246244  .0000072 -0.3034 0.0066  I   -59.081     .417    -6.020     .138  0.246310  0.243480 -0.0245960   -57.500    -5.500  
+ 1 723 52113.00 I   .245303  .000050   .240604  .000071  I -.0244283  .0000115 -0.0859 0.0062  I   -58.929     .293    -5.875     .340  0.245290  0.240600 -0.0243980   -57.800    -5.500  
+ 1 724 52114.00 I   .244181  .000052   .237844  .000067  I -.0244490  .0000100  0.1207 0.0080  I   -59.145     .329    -5.833     .112  0.244230  0.237850 -0.0244370   -58.400    -5.700  
+ 1 725 52115.00 I   .243624  .000051   .235369  .000063  I -.0246366  .0000110  0.2279 0.0074  I   -59.594     .329    -5.858     .112  0.243550  0.235400 -0.0246340   -59.500    -5.900  
+ 1 726 52116.00 I   .242989  .000051   .232644  .000063  I -.0248666  .0000110  0.2204 0.0078  I   -60.059     .330    -5.815     .114  0.242970  0.232700 -0.0248580   -60.200    -6.000  
+ 1 727 52117.00 I   .242022  .000050   .229827  .000063  I -.0250474  .0000111  0.1229 0.0077  I   -60.239     .330    -5.745     .114  0.242000  0.229780 -0.0250340   -60.800    -6.100  
+ 1 728 52118.00 I   .240668  .000027   .226879  .000040  I -.0250822  .0000109 -0.0650 0.0077  I   -60.241     .230    -5.735     .113  0.240630  0.226830 -0.0250700   -61.100    -6.100  
+ 1 729 52119.00 I   .239018  .000029   .223779  .000041  I -.0249085  .0000107 -0.2794 0.0072  I   -60.276     .335    -5.819     .172  0.239010  0.223820 -0.0249070   -61.200    -6.000  
+ 1 730 52120.00 I   .237308  .000022   .220720  .000104  I -.0245315  .0000094 -0.4693 0.0060  I   -60.493     .414    -5.916     .340  0.237300  0.220680 -0.0245330   -61.000    -6.100  
+ 1 731 52121.00 I   .235872  .000045   .217961  .000107  I -.0239862  .0000053 -0.6102 0.0056  I   -60.798     .414    -5.972     .340  0.235850  0.217860 -0.0239860   -60.700    -6.100  
+ 1 8 1 52122.00 I   .234708  .000045   .215461  .000111  I -.0233285  .0000060 -0.6990 0.0040  I   -60.947     .414    -6.043     .340  0.234740  0.215420 -0.0233300   -60.300    -6.000  
+ 1 8 2 52123.00 I   .233413  .000045   .213496  .000111  I -.0226143  .0000060 -0.7095 0.0042  I   -60.854     .432    -6.157     .340  0.233290  0.213440 -0.0226280   -60.000    -6.100  
+ 1 8 3 52124.00 I   .230934  .000046   .211330  .000113  I -.0219419  .0000058 -0.6228 0.0042  I   -60.604     .415    -6.249     .340  0.230970  0.211380 -0.0219510   -59.900    -6.000  
+ 1 8 4 52125.00 I   .228252  .000047   .208668  .000113  I -.0213853  .0000059 -0.4862 0.0040  I   -60.455     .415    -6.162     .340  0.228190  0.208600 -0.0213740   -59.700    -5.900  
+ 1 8 5 52126.00 I   .225848  .000061   .205783  .000079  I -.0209760  .0000054 -0.3301 0.0050  I   -60.486     .151    -5.890     .340  0.225820  0.205680 -0.0209610   -59.700    -5.700  
+ 1 8 6 52127.00 I   .223854  .000045   .203137  .000065  I -.0207247  .0000080 -0.1752 0.0045  I   -60.672     .252    -5.623     .340  0.223840  0.203130 -0.0207250   -59.900    -5.700  
+ 1 8 7 52128.00 I   .221846  .000052   .200695  .000087  I -.0206206  .0000073 -0.0354 0.0057  I   -60.888     .234    -5.527     .340  0.221850  0.200830 -0.0206260   -60.000    -5.600  
+ 1 8 8 52129.00 I   .219641  .000050   .198602  .000082  I -.0206566  .0000081  0.1125 0.0055  I   -60.949     .234    -5.555     .340  0.219630  0.198630 -0.0206580   -60.300    -5.600  
+ 1 8 9 52130.00 I   .217156  .000050   .196301  .000081  I -.0208393  .0000082  0.2417 0.0057  I   -60.873     .149    -5.546     .340  0.217110  0.196290 -0.0208430   -60.600    -5.600  
+ 1 810 52131.00 I   .214270  .000052   .194048  .000082  I -.0211293  .0000079  0.3390 0.0061  I   -60.766     .149    -5.456     .340  0.214300  0.194010 -0.0211170   -60.900    -5.700  
+ 1 811 52132.00 I   .211292  .000038   .191558  .000079  I -.0214996  .0000089  0.3834 0.0058  I   -61.056     .175    -5.438     .340  0.211260  0.191530 -0.0215140   -61.300    -5.700  
+ 1 812 52133.00 I   .208443  .000041   .188809  .000082  I -.0218695  .0000086  0.3482 0.0053  I   -61.739     .114    -5.583     .340  0.208400  0.188780 -0.0219090   -61.600    -5.800  
+ 1 813 52134.00 I   .205986  .000044   .186155  .000048  I -.0221796  .0000059  0.2638 0.0048  I   -62.391     .185    -5.769     .340  0.206010  0.186150 -0.0222080   -61.900    -5.800  
+ 1 814 52135.00 I   .203661  .000076   .183652  .000046  I -.0223872  .0000042  0.1497 0.0036  I   -62.647     .185    -5.835     .340  0.203770  0.183640 -0.0223950   -62.000    -5.900  
+ 1 815 52136.00 I   .201030  .000075   .181204  .000047  I -.0224832  .0000042  0.0482 0.0030  I   -62.552     .185    -5.807     .340  0.201050  0.181170 -0.0224850   -62.000    -5.900  
+ 1 816 52137.00 I   .198726  .000076   .178978  .000052  I -.0225064  .0000042  0.0151 0.0030  I   -62.292     .173    -5.825     .340  0.198400  0.178940 -0.0225100   -62.000    -5.900  
+ 1 817 52138.00 I   .195935  .000076   .176831  .000047  I -.0225537  .0000044  0.1029 0.0033  I   -62.068     .173    -5.896     .340  0.196010  0.176810 -0.0225520   -61.800    -5.800  
+ 1 818 52139.00 I   .193417  .000076   .174597  .000045  I -.0227462  .0000050  0.2926 0.0029  I   -61.794     .172    -5.859     .340  0.193410  0.174570 -0.0227320   -61.700    -5.700  
+ 1 819 52140.00 I   .190985  .000121   .172340  .000074  I -.0231581  .0000037  0.5398 0.0032  I   -61.555     .740    -5.665     .340  0.190970  0.172310 -0.0231440   -61.600    -5.700  
+ 1 820 52141.00 I   .188799  .000103   .170234  .000072  I -.0238223  .0000041  0.7765 0.0031  I   -61.531     .219    -5.490     .340  0.188770  0.170270 -0.0238140   -61.700    -5.600  
+ 1 821 52142.00 I   .186205  .000098   .168172  .000069  I -.0246828  .0000050  0.9284 0.0033  I   -61.781     .318    -5.490     .340  0.186480  0.168150 -0.0246870   -62.000    -5.500  
+ 1 822 52143.00 I   .183852  .000096   .165911  .000064  I -.0256448  .0000051  0.9776 0.0035  I   -62.198     .318    -5.571     .340  0.183820  0.165890 -0.0256510   -62.300    -5.500  
+ 1 823 52144.00 I   .181210  .000098   .163907  .000064  I -.0265834  .0000049  0.8630 0.0034  I   -62.590     .233    -5.547     .340  0.181090  0.163910 -0.0265740   -62.800    -5.500  
+ 1 824 52145.00 I   .178677  .000099   .162045  .000065  I -.0273417  .0000045  0.6609 0.0040  I   -62.832     .233    -5.426     .340  0.178690  0.162090 -0.0273220   -63.200    -5.500  
+ 1 825 52146.00 I   .176475  .000040   .160131  .000038  I -.0278971  .0000064  0.4344 0.0045  I   -62.813     .233    -5.430     .340  0.176480  0.160180 -0.0279020   -63.600    -5.600  
+ 1 826 52147.00 I   .174361  .000038   .158092  .000099  I -.0282024  .0000077  0.1835 0.0048  I   -62.640     .213    -5.661     .340  0.174360  0.158120 -0.0282170   -63.700    -5.700  
+ 1 827 52148.00 I   .172421  .000039   .156000  .000101  I -.0282814  .0000072 -0.0154 0.0051  I   -62.562     .740    -5.953     .340  0.172380  0.156010 -0.0282800   -63.600    -5.800  
+ 1 828 52149.00 I   .170433  .000045   .153890  .000104  I -.0281922  .0000068 -0.1524 0.0050  I   -62.687     .740    -6.089     .340  0.170520  0.154080 -0.0281840   -63.300    -5.900  
+ 1 829 52150.00 I   .168322  .000042   .152401  .000102  I -.0279987  .0000070 -0.2230 0.0049  I   -62.825     .740    -6.058     .340  0.168310  0.152450 -0.0280010   -62.800    -6.000  
+ 1 830 52151.00 I   .166083  .000041   .150982  .000102  I -.0277811  .0000070 -0.1888 0.0048  I   -62.747     .740    -5.994     .340  0.165940  0.151010 -0.0277760   -62.300    -5.900  
+ 1 831 52152.00 I   .163282  .000042   .149983  .000105  I -.0276358  .0000066 -0.1106 0.0050  I   -62.479     .740    -5.946     .340  0.163320  0.150020 -0.0276410   -61.900    -5.800  
+ 1 9 1 52153.00 I   .160290  .000042   .149077  .000087  I -.0275677  .0000072 -0.0092 0.0055  I   -62.233     .525    -5.817     .123  0.160240  0.149120 -0.0275220   -61.500    -5.800  
+ 1 9 2 52154.00 I   .157071  .000044   .147756  .000091  I -.0276349  .0000089  0.1446 0.0062  I   -62.123     .772    -5.551     .180  0.157030  0.147790 -0.0275400   -61.300    -5.500  
+ 1 9 3 52155.00 I   .153925  .000051   .146230  .000078  I -.0278569  .0000101  0.2984 0.0063  I   -62.097     .537    -5.258     .116  0.153930  0.146230 -0.0278290   -61.700    -4.700  
+ 1 9 4 52156.00 I   .150804  .000061   .144646  .000078  I -.0282213  .0000089  0.4210 0.0066  I   -62.065     .446    -5.105     .113  0.150800  0.144700 -0.0282350   -61.800    -4.900  
+ 1 9 5 52157.00 I   .147452  .000061   .142777  .000078  I -.0286907  .0000086  0.5191 0.0062  I   -61.974     .446    -5.114     .113  0.147470  0.142820 -0.0286930   -61.800    -5.100  
+ 1 9 6 52158.00 I   .144611  .000061   .140770  .000079  I -.0292332  .0000086  0.5383 0.0056  I   -61.811     .438    -5.156     .110  0.144570  0.140680 -0.0292230   -61.700    -5.100  
+ 1 9 7 52159.00 I   .141812  .000057   .139100  .000041  I -.0297340  .0000071  0.4575 0.0055  I   -61.701     .127    -5.158     .340  0.141940  0.139040 -0.0296950   -61.500    -5.000  
+ 1 9 8 52160.00 I   .139469  .000054   .137762  .000045  I -.0301363  .0000067  0.3410 0.0059  I   -61.821     .127    -5.181     .340  0.139480  0.137780 -0.0301450   -61.400    -4.900  
+ 1 9 9 52161.00 I   .137173  .000049   .136680  .000079  I -.0304103  .0000093  0.2075 0.0060  I   -62.223     .247    -5.312     .110  0.137220  0.136710 -0.0304570   -61.500    -5.000  
+ 1 910 52162.00 I   .134793  .000057   .135598  .000084  I -.0305519  .0000099  0.0759 0.0068  I   -62.691     .427    -5.504     .130  0.134820  0.135600 -0.0305810   -61.600    -5.200  
+ 1 911 52163.00 I   .131937  .000083   .134534  .000088  I -.0305697  .0000099 -0.0328 0.0070  I   -62.921     .359    -5.625     .119  0.132050  0.134440 -0.0305690   -61.800    -5.400  
+ 1 912 52164.00 I   .128799  .000081   .133191  .000085  I -.0305005  .0000100 -0.0989 0.0070  I   -62.802     .359    -5.617     .119  0.128800  0.133200 -0.0304980   -61.900    -5.600  
+ 1 913 52165.00 I   .125569  .000081   .132151  .000083  I -.0304014  .0000100 -0.0765 0.0071  I   -62.508     .376    -5.557     .112  0.125660  0.132030 -0.0304240   -61.800    -5.700  
+ 1 914 52166.00 I   .122462  .000082   .130991  .000082  I -.0303880  .0000101  0.0674 0.0070  I   -62.083     .376    -5.391     .112  0.122490  0.130970 -0.0304260   -61.700    -5.700  
+ 1 915 52167.00 I   .118823  .000083   .129921  .000062  I -.0305704  .0000099  0.3140 0.0070  I   -61.758     .419    -5.100     .340  0.118860  0.129900 -0.0305830   -61.600    -5.500  
+ 1 916 52168.00 I   .115134  .000073   .129008  .000051  I -.0310339  .0000098  0.6144 0.0063  I   -61.672     .740    -4.738     .340  0.115160  0.129020 -0.0310310   -61.700    -5.400  
+ 1 917 52169.00 I   .111702  .000050   .128161  .000040  I -.0317828  .0000077  0.8655 0.0055  I   -61.835     .193    -4.519     .134  0.111710  0.128160 -0.0317820   -61.700    -5.200  
+ 1 918 52170.00 I   .108312  .000050   .127305  .000041  I -.0327193  .0000051  0.9797 0.0047  I   -62.089     .181    -4.590     .188  0.108320  0.127300 -0.0327230   -62.000    -5.100  
+ 1 919 52171.00 I   .104560  .000049   .126560  .000041  I -.0336945  .0000055  0.9507 0.0037  I   -62.278     .181    -4.809     .188  0.104560  0.126580 -0.0336970   -62.300    -5.000  
+ 1 920 52172.00 I   .101202  .000049   .125935  .000041  I -.0345894  .0000054  0.8276 0.0038  I   -62.399     .181    -4.899     .188  0.101130  0.125960 -0.0345850   -62.500    -4.900  
+ 1 921 52173.00 I   .097832  .000051   .125409  .000046  I -.0353300  .0000052  0.6454 0.0052  I   -62.485     .181    -4.809     .188  0.097880  0.125390 -0.0353410   -62.700    -4.900  
+ 1 922 52174.00 I   .094515  .000052   .124864  .000045  I -.0358762  .0000088  0.4514 0.0061  I   -62.467     .181    -4.784     .188  0.094530  0.124880 -0.0358710   -62.800    -5.000  
+ 1 923 52175.00 I   .091429  .000052   .124165  .000040  I -.0362401  .0000111  0.2794 0.0077  I   -62.293     .196    -5.012     .204  0.091460  0.124210 -0.0362300   -62.700    -5.000  
+ 1 924 52176.00 I   .088536  .000068   .123182  .000073  I -.0364427  .0000127  0.1304 0.0074  I   -62.084     .158    -5.354     .226  0.088580  0.123200 -0.0364470   -62.500    -5.200  
+ 1 925 52177.00 I   .085411  .000069   .122051  .000100  I -.0365260  .0000097  0.0565 0.0080  I   -61.995     .196    -5.511     .194  0.085470  0.122040 -0.0365380   -62.100    -5.400  
+ 1 926 52178.00 I   .082376  .000068   .120940  .000099  I -.0365832  .0000097  0.0649 0.0069  I   -61.970     .196    -5.388     .194  0.082290  0.120950 -0.0365820   -61.800    -5.500  
+ 1 927 52179.00 I   .078852  .000069   .119978  .000099  I -.0366762  .0000098  0.1343 0.0063  I   -61.826     .196    -5.158     .194  0.078960  0.119830 -0.0366910   -61.300    -5.600  
+ 1 928 52180.00 I   .075375  .000070   .119070  .000101  I -.0368739  .0000079  0.2699 0.0059  I   -61.540     .196    -5.002     .194  0.075340  0.118980 -0.0368680   -60.900    -5.400  
+ 1 929 52181.00 I   .071799  .000055   .118503  .000103  I -.0372183  .0000067  0.4125 0.0047  I   -61.327     .235    -4.868     .238  0.071810  0.118500 -0.0372090   -60.500    -5.300  
+ 1 930 52182.00 I   .068626  .000038   .118099  .000091  I -.0376932  .0000052  0.5382 0.0045  I   -61.159     .229    -4.730     .155  0.068640  0.118080 -0.0376640   -60.200    -5.100  
+ 110 1 52183.00 I   .065428  .000028   .117780  .000066  I -.0382971  .0000061  0.6713 0.0038  I   -61.020     .193    -4.515     .234  0.065420  0.117780 -0.0382510   -60.200    -4.800  
+ 110 2 52184.00 I   .061701  .000034   .117636  .000064  I -.0390380  .0000055  0.8111 0.0043  I   -60.852     .164    -4.319     .200  0.061680  0.117630 -0.0390180   -60.200    -4.600  
+ 110 3 52185.00 I   .057927  .000034   .117397  .000065  I -.0398955  .0000061  0.8794 0.0041  I   -60.708     .164    -4.243     .200  0.057890  0.117430 -0.0399000   -60.400    -4.400  
+ 110 4 52186.00 I   .054765  .000032   .117299  .000064  I -.0407777  .0000060  0.8904 0.0041  I   -60.638     .164    -4.286     .200  0.054770  0.117230 -0.0407620   -60.300    -4.300  
+ 110 5 52187.00 I   .052007  .000031   .117381  .000064  I -.0416711  .0000056  0.8858 0.0043  I   -60.609     .164    -4.376     .200  0.052010  0.117390 -0.0416520   -60.200    -4.300  
+ 110 6 52188.00 I   .048970  .000030   .117600  .000061  I -.0425184  .0000063  0.7883 0.0048  I   -60.594     .173    -4.416     .233  0.049030  0.117650 -0.0425430   -60.100    -4.300  
+ 110 7 52189.00 I   .045981  .000030   .117726  .000036  I -.0432326  .0000077  0.6454 0.0053  I   -60.665     .740    -4.487     .116  0.045990  0.117750 -0.0432790   -60.100    -4.400  
+ 110 8 52190.00 I   .043041  .000044   .117743  .000038  I -.0438207  .0000086  0.5370 0.0066  I   -60.806     .139    -4.557     .177  0.043020  0.117720 -0.0438420   -60.200    -4.500  
+ 110 9 52191.00 I   .039838  .000051   .117721  .000033  I -.0443233  .0000106  0.4788 0.0067  I   -60.881     .172    -4.608     .238  0.039870  0.117720 -0.0443200   -60.300    -4.500  
+ 11010 52192.00 I   .036029  .000043   .117573  .000037  I -.0448060  .0000104  0.5037 0.0075  I   -60.725     .172    -4.602     .238  0.036070  0.117610 -0.0447990   -60.500    -4.400  
+ 11011 52193.00 I   .031916  .000043   .117281  .000037  I -.0453585  .0000105  0.6119 0.0073  I   -60.301     .172    -4.494     .238  0.031890  0.117280 -0.0453630   -60.700    -4.100  
+ 11012 52194.00 I   .027453  .000044   .117238  .000040  I -.0460502  .0000102  0.7812 0.0074  I   -59.763     .172    -4.243     .238  0.027530  0.117290 -0.0460900   -60.700    -3.700  
+ 11013 52195.00 I   .023095  .000044   .117487  .000041  I -.0469466  .0000103  1.0276 0.0101  I   -59.434     .158    -3.774     .178  0.023160  0.117520 -0.0469310   -60.800    -3.200  
+ 11014 52196.00 I   .019346  .000048   .117756  .000045  I -.0481163  .0000174  1.3066 0.0067  I   -59.428     .161    -3.358     .168  0.019360  0.117720 -0.0480670   -60.700    -2.900  
+ 11015 52197.00 I   .015946  .000043   .118233  .000049  I -.0495361  .0000087  1.5143 0.0097  I   -59.739     .256    -3.137     .340  0.015960  0.118200 -0.0495160   -60.700    -2.900  
+ 11016 52198.00 I   .012831  .000046   .118897  .000053  I -.0511037  .0000084  1.5982 0.0059  I   -60.061     .214    -3.245     .222  0.012800  0.118850 -0.0511100   -60.500    -3.100  
+ 11017 52199.00 I   .009771  .000047   .119369  .000051  I -.0526870  .0000081  1.5455 0.0060  I   -60.138     .230    -3.553     .197  0.009780  0.119370 -0.0526840   -60.300    -3.600  
+ 11018 52200.00 I   .006624  .000051   .119915  .000054  I -.0541499  .0000087  1.3586 0.0060  I   -59.996     .230    -3.771     .197  0.006640  0.119920 -0.0541550   -60.100    -4.100  
+ 11019 52201.00 I   .003117  .000053   .120419  .000059  I -.0553755  .0000088  1.0858 0.0061  I   -59.832     .230    -3.767     .197  0.003130  0.120460 -0.0553510   -59.800    -4.500  
+ 11020 52202.00 I  -.000633  .000044   .121004  .000056  I -.0563214  .0000086  0.8128 0.0056  I   -59.724     .248    -3.718     .211 -0.000630  0.121030 -0.0563460   -59.700    -4.900  
+ 11021 52203.00 I  -.004548  .000066   .121787  .000067  I -.0570287  .0000070  0.6226 0.0053  I   -59.583     .218    -3.803     .208 -0.004550  0.121810 -0.0571110   -59.400    -5.000  
+ 11022 52204.00 I  -.008592  .000064   .122717  .000064  I -.0575979  .0000061  0.5264 0.0045  I   -59.362     .265    -3.998     .340 -0.008610  0.122720 -0.0576820   -59.200    -4.700  
+ 11023 52205.00 I  -.012764  .000089   .123691  .000066  I -.0581052  .0000056  0.5014 0.0039  I   -59.119     .217    -4.072     .340 -0.012680  0.123650 -0.0581450   -58.900    -4.400  
+ 11024 52206.00 I  -.016471  .000091   .124646  .000067  I -.0586147  .0000050  0.5183 0.0037  I   -58.891     .217    -3.907     .340 -0.016540  0.124620 -0.0586110   -58.500    -4.000  
+ 11025 52207.00 I  -.020057  .000088   .125720  .000060  I -.0591595  .0000048  0.5882 0.0032  I   -58.646     .217    -3.644     .340 -0.020140  0.125640 -0.0591720   -57.900    -3.700  
+ 11026 52208.00 I  -.023592  .000090   .126873  .000061  I -.0598171  .0000039  0.7361 0.0048  I   -58.399     .217    -3.492     .340 -0.023560  0.126840 -0.0598170   -57.300    -3.400  
+ 11027 52209.00 I  -.027016  .000080   .128062  .000050  I -.0606384  .0000083  0.9041 0.0036  I   -58.233     .199    -3.479     .340 -0.027010  0.128060 -0.0606310   -56.900    -3.300  
+ 11028 52210.00 I  -.030363  .000080   .129127  .000046  I -.0616118  .0000060  1.0317 0.0050  I   -58.165     .740    -3.457     .340 -0.030400  0.129080 -0.0616080   -56.600    -3.200  
+ 11029 52211.00 I  -.033489  .000047   .130207  .000045  I -.0626844  .0000056  1.1070 0.0041  I   -58.113     .127    -3.292     .209 -0.033430  0.130180 -0.0626800   -56.600    -3.200  
+ 11030 52212.00 I  -.036312  .000041   .131409  .000056  I -.0638054  .0000056  1.1210 0.0040  I   -58.035     .250    -3.013     .182 -0.036440  0.131310 -0.0637910   -56.900    -3.100  
+ 11031 52213.00 I  -.039723  .000040   .132495  .000054  I -.0649117  .0000057  1.0909 0.0040  I   -57.997     .250    -2.778     .182 -0.039670  0.132430 -0.0649050   -57.500    -3.000  
+ 111 1 52214.00 I  -.042998  .000039   .133687  .000053  I -.0659738  .0000056  1.0205 0.0035  I   -58.039     .250    -2.727     .182 -0.043040  0.133660 -0.0659630   -58.000    -2.800  
+ 111 2 52215.00 I  -.046638  .000037   .134773  .000054  I -.0669227  .0000041  0.8600 0.0040  I   -58.071     .250    -2.858     .182 -0.046640  0.134770 -0.0669370   -58.300    -2.900  
+ 111 3 52216.00 I  -.050417  .000025   .135809  .000053  I -.0676901  .0000057  0.6885 0.0036  I   -58.075     .223    -2.983     .238 -0.050340  0.135800 -0.0676910   -58.300    -2.900  
+ 111 4 52217.00 I  -.053930  .000091   .136813  .000047  I -.0683200  .0000060  0.5779 0.0039  I   -57.894     .173    -3.079     .149 -0.053880  0.136820 -0.0683050   -58.000    -3.000  
+ 111 5 52218.00 I  -.056874  .000095   .137877  .000043  I -.0688598  .0000053  0.5092 0.0042  I   -57.726     .277    -3.062     .340 -0.056890  0.137870 -0.0688520   -57.500    -3.100  
+ 111 6 52219.00 I  -.059567  .000094   .139242  .000055  I -.0693496  .0000058  0.4743 0.0038  I   -57.586     .256    -3.002     .116 -0.059350  0.139300 -0.0693540   -57.100    -3.100  
+ 111 7 52220.00 I  -.061636  .000095   .140902  .000054  I -.0698298  .0000055  0.5037 0.0038  I   -57.366     .256    -2.957     .116 -0.061630  0.140970 -0.0698350   -56.700    -3.000  
+ 111 8 52221.00 I  -.063465  .000094   .142802  .000059  I -.0704038  .0000050  0.6735 0.0037  I   -56.978     .256    -2.896     .116 -0.063600  0.142770 -0.0703970   -56.700    -2.700  
+ 111 9 52222.00 I  -.065483  .000095   .144986  .000060  I -.0712220  .0000050  0.9788 0.0038  I   -56.506     .256    -2.745     .116 -0.065480  0.145000 -0.0712120   -56.600    -2.300  
+ 11110 52223.00 I  -.067793  .000044   .147468  .000062  I -.0723560  .0000058  1.2679 0.0045  I   -56.183     .313    -2.422     .340 -0.067800  0.147470 -0.0723670   -56.400    -1.800  
+ 11111 52224.00 I  -.069810  .000044   .149958  .000070  I -.0737262  .0000076  1.4620 0.0040  I   -56.234     .305    -2.145     .340 -0.069820  0.149910 -0.0737430   -56.400    -1.500  
+ 11112 52225.00 I  -.071468  .000046   .152519  .000070  I -.0752515  .0000054  1.5704 0.0046  I   -56.621     .260    -1.998     .340 -0.071500  0.152520 -0.0752510   -56.400    -1.400  
+ 11113 52226.00 I  -.073350  .000062   .155089  .000081  I -.0768355  .0000051  1.5841 0.0037  I   -57.063     .246    -2.076     .340 -0.073310  0.155070 -0.0768330   -56.600    -1.700  
+ 11114 52227.00 I  -.075332  .000063   .157245  .000076  I -.0783711  .0000051  1.4520 0.0036  I   -57.250     .244    -2.311     .340 -0.075350  0.157260 -0.0783700   -56.800    -2.400  
+ 11115 52228.00 I  -.077750  .000063   .159099  .000076  I -.0796914  .0000050  1.1755 0.0035  I   -57.138     .244    -2.507     .340 -0.077860  0.159060 -0.0796860   -57.000    -2.600  
+ 11116 52229.00 I  -.080457  .000063   .160740  .000077  I -.0807265  .0000048  0.9122 0.0033  I   -56.888     .244    -2.540     .340 -0.080460  0.160730 -0.0807140   -56.900    -2.600  
+ 11117 52230.00 I  -.082630  .000055   .162556  .000067  I -.0815412  .0000042  0.7253 0.0035  I   -56.701     .132    -2.458     .340 -0.082630  0.162600 -0.0815400   -56.700    -2.700  
+ 11118 52231.00 I  -.084537  .000051   .164432  .000057  I -.0821981  .0000051  0.6015 0.0032  I   -56.544     .182    -2.428     .340 -0.084550  0.164490 -0.0822050   -56.500    -2.500  
+ 11119 52232.00 I  -.086599  .000052   .166367  .000063  I -.0827684  .0000048  0.5503 0.0036  I   -56.355     .740    -2.463     .340 -0.086610  0.166400 -0.0827700   -56.200    -2.500  
+ 11120 52233.00 I  -.088961  .000053   .168447  .000064  I -.0833152  .0000050  0.5485 0.0037  I   -56.088     .740    -2.443     .340 -0.088970  0.168490 -0.0833120   -55.900    -2.400  
+ 11121 52234.00 I  -.091666  .000051   .170548  .000062  I -.0838756  .0000057  0.5773 0.0038  I   -55.798     .740    -2.295     .340 -0.091650  0.170580 -0.0838760   -55.700    -2.300  
+ 11122 52235.00 I  -.094439  .000051   .172912  .000061  I -.0844874  .0000056  0.6589 0.0042  I   -55.576     .740    -2.119     .340 -0.094470  0.172930 -0.0844770   -55.400    -2.200  
+ 11123 52236.00 I  -.097417  .000053   .175528  .000066  I -.0852001  .0000061  0.7607 0.0039  I   -55.477     .740    -2.063     .340 -0.097430  0.175550 -0.0851540   -55.200    -1.800  
+ 11124 52237.00 I  -.100610  .000055   .178082  .000068  I -.0860027  .0000053  0.8441 0.0071  I   -55.480     .740    -2.121     .340 -0.100640  0.178070 -0.0859420   -55.100    -1.600  
+ 11125 52238.00 I  -.103621  .000023   .180536  .000046  I -.0868873  .0000128  0.9244 0.0041  I   -55.538     .740    -2.153     .340 -0.103680  0.180540 -0.0868450   -55.200    -1.500  
+ 11126 52239.00 I  -.106097  .000038   .183056  .000084  I -.0878437  .0000062  0.9813 0.0067  I   -55.601     .740    -1.994     .340 -0.106080  0.183040 -0.0878340   -55.300    -1.300  
+ 11127 52240.00 I  -.108161  .000040   .185529  .000085  I -.0888340  .0000040  0.9906 0.0037  I   -55.682     .308    -1.653     .340 -0.108120  0.185520 -0.0888440   -55.500    -1.300  
+ 11128 52241.00 I  -.110184  .000043   .187897  .000086  I -.0898046  .0000042  0.9389 0.0029  I   -55.807     .308    -1.298     .340 -0.110230  0.187940 -0.0898050   -55.600    -1.300  
+ 11129 52242.00 I  -.112626  .000044   .190242  .000084  I -.0906958  .0000041  0.8391 0.0029  I   -55.944     .308    -1.132     .340 -0.112570  0.190300 -0.0906720   -55.700    -1.400  
+ 11130 52243.00 I  -.115319  .000046   .192771  .000084  I -.0914748  .0000041  0.7155 0.0030  I   -56.001     .308    -1.236     .340 -0.115330  0.192810 -0.0914570   -55.600    -1.600  
+ 112 1 52244.00 I  -.118472  .000051   .195444  .000084  I -.0921087  .0000043  0.5378 0.0025  I   -55.854     .344    -1.497     .340 -0.118480  0.195510 -0.0921210   -55.400    -1.800  
+ 112 2 52245.00 I  -.121686  .000100   .197956  .000057  I -.0925504  .0000027  0.3601 0.0024  I   -55.603     .505    -1.723     .340 -0.121680  0.198010 -0.0925740   -55.000    -1.800  
+ 112 3 52246.00 I  -.124538  .000107   .200158  .000055  I -.0928592  .0000022  0.2733 0.0016  I   -55.272     .720    -1.766     .126 -0.124610  0.200230 -0.0928610   -54.600    -1.900  
+ 112 4 52247.00 I  -.127367  .000104   .202499  .000057  I -.0931227  .0000018  0.2637 0.0015  I   -54.934     .720    -1.659     .126 -0.127150  0.202470 -0.0931050   -54.200    -1.800  
+ 112 5 52248.00 I  -.129424  .000103   .205211  .000058  I -.0934180  .0000020  0.3484 0.0013  I   -54.617     .720    -1.531     .126 -0.129470  0.205230 -0.0934140   -53.800    -1.600  
+ 112 6 52249.00 I  -.131746  .000103   .208532  .000057  I -.0938524  .0000020  0.5318 0.0015  I   -54.321     .720    -1.461     .126 -0.131820  0.208530 -0.0938520   -53.600    -1.300  
+ 112 7 52250.00 I  -.134559  .000102   .211661  .000057  I -.0944922  .0000021  0.7472 0.0023  I   -54.076     .720    -1.430     .126 -0.134560  0.211710 -0.0944960   -53.700    -1.100  
+ 112 8 52251.00 I  -.137796  .000068   .214373  .000066  I -.0953455  .0000042  0.9589 0.0027  I   -53.894     .526    -1.389     .295 -0.137790  0.214400 -0.0953380   -54.000    -0.900  
+ 112 9 52252.00 I  -.140993  .000056   .216887  .000054  I -.0963972  .0000050  1.1321 0.0047  I   -54.018     .492    -1.326     .344 -0.140970  0.216840 -0.0963730   -54.400    -0.700  
+ 11210 52253.00 I  -.143845  .000070   .219614  .000052  I -.0975759  .0000085  1.2038 0.0055  I   -54.377     .413    -1.286     .288 -0.143840  0.219610 -0.0975250   -55.000    -0.500  
+ 11211 52254.00 I  -.146663  .000067   .222530  .000051  I -.0987595  .0000098  1.1397 0.0063  I   -54.824     .413    -1.304     .288 -0.146720  0.222550 -0.0986800   -55.500    -0.500  
+ 11212 52255.00 I  -.149955  .000071   .225288  .000059  I -.0998250  .0000094  0.9849 0.0067  I   -55.220     .293    -1.361     .268 -0.149810  0.225270 -0.0997520   -55.900    -0.600  
+ 11213 52256.00 I  -.152619  .000073   .227892  .000058  I -.1007198  .0000091  0.8018 0.0066  I   -55.247     .293    -1.421     .268 -0.152690  0.227810 -0.1006790   -56.100    -0.800  
+ 11214 52257.00 I  -.155312  .000077   .230578  .000060  I -.1014175  .0000093  0.5856 0.0063  I   -55.031     .293    -1.435     .268 -0.155270  0.230440 -0.1014000   -55.900    -1.000  
+ 11215 52258.00 I  -.157721  .000066   .233138  .000055  I -.1018974  .0000088  0.3888 0.0074  I   -54.743     .108    -1.424     .185 -0.157710  0.233150 -0.1018990   -55.500    -1.200  
+ 11216 52259.00 I  -.159985  .000041   .235805  .000052  I -.1022319  .0000115  0.3026 0.0054  I   -54.524     .740    -1.446     .187 -0.159980  0.235780 -0.1022370   -54.800    -1.400  
+ 11217 52260.00 I  -.161987  .000045   .238560  .000048  I -.1025397  .0000063  0.3278 0.0064  I   -54.370     .195    -1.487     .168 -0.161990  0.238560 -0.1025390   -54.200    -1.600  
+ 11218 52261.00 I  -.163912  .000064   .241535  .000043  I -.1029096  .0000058  0.4194 0.0044  I   -54.210     .264    -1.480     .152 -0.163910  0.241570 -0.1029110   -53.700    -1.600  
+ 11219 52262.00 I  -.165861  .000058   .244801  .000042  I -.1033804  .0000062  0.5169 0.0041  I   -54.050     .264    -1.401     .152 -0.165910  0.244800 -0.1033780   -53.400    -1.400  
+ 11220 52263.00 I  -.167850  .000056   .248402  .000047  I -.1039633  .0000059  0.6742 0.0043  I   -53.984     .264    -1.336     .152 -0.167810  0.248290 -0.1039500   -53.200    -1.200  
+ 11221 52264.00 I  -.169230  .000060   .251819  .000048  I -.1047528  .0000059  0.9034 0.0042  I   -54.043     .264    -1.379     .152 -0.169310  0.251770 -0.1047380   -53.500    -0.900  
+ 11222 52265.00 I  -.170330  .000062   .255332  .000051  I -.1057456  .0000059  1.0590 0.0045  I   -53.924     .740    -1.588     .340 -0.170420  0.255330 -0.1057660   -53.900    -0.600  
+ 11223 52266.00 I  -.171339  .000066   .258892  .000058  I -.1068441  .0000069  1.1347 0.0063  I   -53.942     .740    -1.631     .340 -0.171340  0.258950 -0.1068720   -54.200    -0.500  
+ 11224 52267.00 I  -.172082  .000030   .262522  .000046  I -.1080049  .0000112  1.1803 0.0052  I   -53.955     .740    -1.498     .340 -0.172130  0.262500 -0.1080060   -54.800    -0.400  
+ 11225 52268.00 I  -.172610  .000031   .266399  .000052  I -.1091917  .0000078  1.1868 0.0058  I   -54.085     .740    -1.216     .340 -0.172630  0.266380 -0.1091660   -55.100    -0.600  
+ 11226 52269.00 I  -.173029  .000037   .270501  .000068  I -.1103666  .0000027  1.1574 0.0041  I   -54.327     .194     -.902     .340 -0.172980  0.270520 -0.1103540   -55.400    -0.700  
+ 11227 52270.00 I  -.173564  .000043   .274604  .000066  I -.1114947  .0000027  1.0925 0.0021  I   -54.556     .194     -.691     .340 -0.173600  0.274890 -0.1114930   -55.500    -0.800  
+ 11228 52271.00 I  -.174569  .000043   .278560  .000066  I -.1125366  .0000031  0.9827 0.0035  I   -54.667     .165     -.692     .340 -0.174540  0.278470 -0.1125380   -55.500    -1.000  
+ 11229 52272.00 I  -.175316  .000040   .282350  .000086  I -.1134552  .0000065  0.8583 0.0037  I   -54.728     .165     -.941     .340 -0.175190  0.282350 -0.1134560   -55.200    -1.000  
+ 11230 52273.00 I  -.175984  .000040   .286373  .000079  I -.1142677  .0000067  0.7774 0.0048  I   -54.662     .165    -1.294     .340 -0.175920  0.286410 -0.1142540   -54.800    -1.000  
+ 11231 52274.00 I  -.176653  .000042   .290272  .000072  I -.1150324  .0000070  0.7636 0.0094  I   -54.357     .165    -1.518     .340 -0.176950  0.290250 -0.1149770   -54.300    -0.900  
+ 2 1 1 52275.00 I  -.177016  .000041   .293921  .000069  I -.1158152  .0000175  0.8108 0.0060  I   -53.821     .740    -1.481     .340 -0.177000  0.293620 -0.1158230   -52.800    -1.100  
+ 2 1 2 52276.00 I  -.177495  .000033   .297612  .000080  I -.1166808  .0000098  0.9385 0.0103  I   -53.265     .265    -1.268     .340 -0.177470  0.297200 -0.1166920   -52.600    -1.200  
+ 2 1 3 52277.00 I  -.178336  .000037   .300810  .000073  I -.1177100  .0000108  1.1198 0.0070  I   -52.938     .265    -1.076     .340 -0.178340  0.300940 -0.1177150   -52.600    -1.100  
+ 2 1 4 52278.00 I  -.179101  .000042   .303585  .000061  I -.1189101  .0000099  1.2704 0.0072  I   -52.906     .265    -1.021     .340 -0.179090  0.303680 -0.1189030   -52.800    -1.100  
+ 2 1 5 52279.00 I  -.179532  .000046   .306461  .000060  I -.1202228  .0000094  1.3372 0.0062  I   -53.091     .259    -1.064     .119 -0.179550  0.306440 -0.1202550   -53.100    -1.000  
+ 2 1 6 52280.00 I  -.180020  .000057   .309511  .000089  I -.1215588  .0000074  1.3270 0.0061  I   -53.330     .208    -1.116     .122 -0.179970  0.309560 -0.1216410   -53.500    -0.900  
+ 2 1 7 52281.00 I  -.180675  .000057   .312707  .000088  I -.1228480  .0000077  1.2304 0.0057  I   -53.622     .208    -1.132     .122 -0.180630  0.312730 -0.1229070   -53.800    -0.900  
+ 2 1 8 52282.00 I  -.181819  .000065   .315313  .000071  I -.1239725  .0000088  0.9923 0.0057  I   -53.953     .140    -1.120     .124 -0.181690  0.315560 -0.1239680   -54.100    -0.800  
+ 2 1 9 52283.00 I  -.182661  .000094   .318169  .000076  I -.1248182  .0000085  0.7108 0.0061  I   -54.210     .226    -1.105     .101 -0.182690  0.318280 -0.1248070   -54.100    -0.800  
+ 2 110 52284.00 I  -.183034  .000088   .321152  .000076  I -.1254127  .0000084  0.4850 0.0062  I   -54.304     .226    -1.081     .101 -0.183060  0.321190 -0.1254210   -54.000    -0.900  
+ 2 111 52285.00 I  -.183124  .000081   .324202  .000082  I -.1258003  .0000089  0.2955 0.0071  I   -54.136     .226    -1.087     .101 -0.183040  0.324220 -0.1257940   -53.700    -1.000  
+ 2 112 52286.00 I  -.182606  .000079   .327370  .000036  I -.1260104  .0000114  0.1261 0.0060  I   -53.756     .231    -1.161     .340 -0.182770  0.327380 -0.1260400   -53.500    -1.200  
+ 2 113 52287.00 I  -.182290  .000085   .330466  .000067  I -.1260705  .0000081  0.0106 0.0071  I   -53.448     .211    -1.310     .129 -0.182260  0.330390 -0.1261170   -53.300    -1.400  
+ 2 114 52288.00 I  -.181735  .000084   .333568  .000075  I -.1260606  .0000084 -0.0178 0.0052  I   -53.288     .211    -1.459     .129 -0.181660  0.333550 -0.1260720   -53.200    -1.500  
+ 2 115 52289.00 I  -.181305  .000047   .336868  .000079  I -.1260645  .0000066  0.0426 0.0047  I   -53.250     .189    -1.511     .174 -0.181260  0.336820 -0.1260550   -53.200    -1.600  
+ 2 116 52290.00 I  -.180666  .000048   .339816  .000072  I -.1261542  .0000042  0.1280 0.0039  I   -53.278     .149    -1.462     .133 -0.180660  0.339780 -0.1261430   -53.200    -1.600  
+ 2 117 52291.00 I  -.179799  .000050   .342945  .000074  I -.1263182  .0000041  0.2064 0.0029  I   -53.374     .149    -1.419     .133 -0.179880  0.342870 -0.1263090   -53.300    -1.600  
+ 2 118 52292.00 I  -.179235  .000049   .346080  .000082  I -.1265902  .0000040  0.3543 0.0029  I   -53.504     .149    -1.476     .133 -0.179240  0.346120 -0.1265880   -53.400    -1.500  
+ 2 119 52293.00 I  -.178756  .000032   .349176  .000059  I -.1270231  .0000040  0.4911 0.0027  I   -53.538     .740    -1.620     .340 -0.178740  0.349230 -0.1270260   -53.300    -1.400  
+ 2 120 52294.00 I  -.178420  .000029   .352206  .000054  I -.1275466  .0000037  0.5505 0.0027  I   -53.402     .740    -1.665     .340 -0.178410  0.352280 -0.1275570   -53.200    -1.300  
+ 2 121 52295.00 I  -.178175  .000098   .355254  .000052  I -.1281161  .0000036  0.5861 0.0024  I   -53.270     .223    -1.611     .340 -0.178170  0.355300 -0.1281260   -53.000    -1.200  
+ 2 122 52296.00 I  -.177717  .000100   .358445  .000045  I -.1287129  .0000032  0.6041 0.0024  I   -53.356     .302    -1.520     .340 -0.177750  0.358510 -0.1287150   -53.000    -1.200  
+ 2 123 52297.00 I  -.177120  .000106   .361868  .000045  I -.1293129  .0000032  0.5879 0.0023  I   -53.632     .244    -1.427     .340 -0.177120  0.361930 -0.1293080   -53.000    -1.200  
+ 2 124 52298.00 I  -.176579  .000107   .365288  .000045  I -.1298667  .0000032  0.5058 0.0022  I   -53.901     .244    -1.315     .340 -0.176510  0.365290 -0.1298590   -53.400    -1.200  
+ 2 125 52299.00 I  -.175468  .000109   .368698  .000047  I -.1303104  .0000031  0.3813 0.0023  I   -54.125     .244    -1.241     .340 -0.175730  0.368690 -0.1303060   -53.800    -1.200  
+ 2 126 52300.00 I  -.174998  .000119   .372115  .000048  I -.1306448  .0000032  0.3033 0.0030  I   -54.387     .223    -1.352     .340 -0.175000  0.372170 -0.1306280   -54.100    -1.400  
+ 2 127 52301.00 I  -.174316  .000076   .375411  .000057  I -.1309512  .0000051  0.3277 0.0032  I   -54.671     .321    -1.735     .340 -0.174370  0.375470 -0.1309230   -54.200    -1.700  
+ 2 128 52302.00 I  -.173598  .000075   .378730  .000059  I -.1313384  .0000055  0.4665 0.0044  I   -54.583     .321    -2.157     .340 -0.173550  0.378710 -0.1313120   -54.100    -1.900  
+ 2 129 52303.00 I  -.172607  .000062   .382056  .000058  I -.1319137  .0000071  0.6939 0.0046  I   -53.935     .421    -2.303     .340 -0.172820  0.382030 -0.1319070   -54.000    -2.200  
+ 2 130 52304.00 I  -.172389  .000111   .385066  .000051  I -.1327493  .0000073  0.9908 0.0051  I   -53.054     .401    -2.100     .159 -0.172060  0.385140 -0.1327840   -53.400    -2.100  
+ 2 131 52305.00 I  -.170719  .000113   .388310  .000051  I -.1338791  .0000074  1.2392 0.0052  I   -52.497     .401    -1.785     .159 -0.170750  0.388250 -0.1339120   -52.900    -1.900  
+ 2 2 1 52306.00 I  -.168875  .000103   .391546  .000048  I -.1351973  .0000073  1.3964 0.0047  I   -52.497     .401    -1.619     .159 -0.168940  0.391530 -0.1352080   -52.400    -1.600  
+ 2 2 2 52307.00 I  -.167477  .000110   .394739  .000066  I -.1366556  .0000057  1.5046 0.0044  I   -52.845     .379    -1.638     .212 -0.167400  0.394750 -0.1365590   -52.300    -1.500  
+ 2 2 3 52308.00 I  -.166425  .000068   .397897  .000101  I -.1381554  .0000049  1.4595 0.0038  I   -53.214     .337    -1.696     .224 -0.166390  0.397840 -0.1380160   -52.500    -1.400  
+ 2 2 4 52309.00 I  -.165568  .000064   .400893  .000101  I -.1395328  .0000049  1.2892 0.0034  I   -53.473     .337    -1.725     .224 -0.165460  0.400780 -0.1394740   -52.800    -1.400  
+ 2 2 5 52310.00 I  -.164218  .000045   .403149  .000104  I -.1407285  .0000048  1.1032 0.0034  I   -53.665     .290    -1.751     .236 -0.164370  0.403580 -0.1407190   -54.000    -1.400  
+ 2 2 6 52311.00 I  -.163276  .000056   .406446  .000100  I -.1417207  .0000046  0.8616 0.0033  I   -53.843     .263    -1.804     .168 -0.163320  0.406310 -0.1417360   -54.100    -1.500  
+ 2 2 7 52312.00 I  -.162284  .000055   .409364  .000101  I -.1424592  .0000045  0.6423 0.0031  I   -53.959     .263    -1.858     .168 -0.162230  0.409320 -0.1424540   -53.900    -1.600  
+ 2 2 8 52313.00 I  -.161022  .000053   .412491  .000100  I -.1430272  .0000043  0.4886 0.0044  I   -53.893     .263    -1.909     .168 -0.161130  0.412430 -0.1430230   -53.400    -1.800  
+ 2 2 9 52314.00 I  -.159842  .000049   .415394  .000050  I -.1434514  .0000075  0.3800 0.0047  I   -53.498     .134    -2.001     .340 -0.159750  0.415430 -0.1434440   -53.000    -1.900  
+ 2 210 52315.00 I  -.157943  .000056   .418781  .000106  I -.1438265  .0000084  0.3895 0.0054  I   -53.099     .454    -2.173     .165 -0.157950  0.418820 -0.1438150   -52.600    -2.000  
+ 2 211 52316.00 I  -.156070  .000058   .422412  .000119  I -.1442607  .0000077  0.4900 0.0058  I   -52.804     .454    -2.328     .165 -0.156050  0.422450 -0.1442500   -52.500    -2.100  
+ 2 212 52317.00 I  -.154331  .000050   .425633  .000119  I -.1448045  .0000079  0.5844 0.0052  I   -52.715     .628    -2.341     .233 -0.154400  0.425740 -0.1447930   -52.500    -2.100  
+ 2 213 52318.00 I  -.153348  .000073   .428706  .000121  I -.1454279  .0000071  0.6738 0.0052  I   -52.787     .451    -2.211     .174 -0.153250  0.428820 -0.1454300   -52.600    -2.100  
+ 2 214 52319.00 I  -.152471  .000068   .431713  .000120  I -.1461593  .0000069  0.7846 0.0045  I   -52.928     .451    -2.084     .174 -0.152390  0.431700 -0.1461620   -52.700    -2.000  
+ 2 215 52320.00 I  -.151431  .000074   .434433  .000119  I -.1469919  .0000055  0.8798 0.0038  I   -53.037     .451    -2.090     .174 -0.151390  0.434420 -0.1469910   -52.800    -2.000  
+ 2 216 52321.00 I  -.150089  .000069   .437078  .000077  I -.1479225  .0000033  0.9858 0.0033  I   -53.009     .122    -2.215     .340 -0.150100  0.437100 -0.1479090   -52.700    -2.000  
+ 2 217 52322.00 I  -.148485  .000065   .439730  .000045  I -.1489536  .0000035  1.0621 0.0032  I   -52.796     .122    -2.298     .340 -0.148490  0.439730 -0.1489370   -52.500    -2.100  
+ 2 218 52323.00 I  -.146818  .000112   .442441  .000075  I -.1500204  .0000054  1.0593 0.0035  I   -52.597     .740    -2.350     .340 -0.146780  0.442390 -0.1500170   -52.300    -2.100  
+ 2 219 52324.00 I  -.145248  .000100   .445256  .000077  I -.1510529  .0000060  0.9984 0.0040  I   -52.626     .740    -2.458     .340 -0.145260  0.445150 -0.1510560   -52.100    -2.100  
+ 2 220 52325.00 I  -.143908  .000104   .447804  .000077  I -.1520116  .0000060  0.9206 0.0043  I   -52.833     .226    -2.622     .340 -0.143730  0.447920 -0.1520210   -52.100    -2.200  
+ 2 221 52326.00 I  -.142017  .000105   .450844  .000075  I -.1528875  .0000061  0.8229 0.0043  I   -52.990     .226    -2.701     .340 -0.142030  0.450810 -0.1528980   -52.200    -2.400  
+ 2 222 52327.00 I  -.140236  .000105   .453903  .000075  I -.1536583  .0000061  0.7279 0.0042  I   -53.081     .226    -2.644     .340 -0.140240  0.453930 -0.1536530   -52.500    -2.700  
+ 2 223 52328.00 I  -.138470  .000104   .457214  .000070  I -.1543530  .0000058  0.6621 0.0039  I   -53.260     .187    -2.679     .340 -0.138440  0.457220 -0.1543870   -52.800    -3.000  
+ 2 224 52329.00 I  -.136564  .000139   .460595  .000023  I -.1550116  .0000047  0.6835 0.0038  I   -53.660     .294    -2.970     .340 -0.136510  0.460600 -0.1551080   -53.100    -3.300  
+ 2 225 52330.00 I  -.134094  .000156   .463762  .000021  I -.1557661  .0000049  0.8433 0.0031  I   -53.763     .294    -3.449     .340 -0.134050  0.463790 -0.1558460   -53.200    -3.600  
+ 2 226 52331.00 I  -.131075  .000147   .466899  .000032  I -.1567270  .0000040  1.0894 0.0031  I   -53.205     .335    -3.740     .340 -0.131080  0.466900 -0.1567280   -53.100    -3.700  
+ 2 227 52332.00 I  -.128411  .000142   .470196  .000051  I -.1579544  .0000038  1.3639 0.0028  I   -52.247     .241    -3.628     .340 -0.128360  0.470160 -0.1579220   -52.700    -3.700  
+ 2 228 52333.00 I  -.125976  .000133   .473454  .000051  I -.1594256  .0000038  1.5508 0.0027  I   -51.558     .241    -3.297     .340 -0.125970  0.473440 -0.1594490   -52.100    -3.400  
+ 2 3 1 52334.00 I  -.123473  .000133   .476420  .000052  I -.1610247  .0000039  1.6439 0.0026  I   -51.514     .241    -3.071     .340 -0.123360  0.476540 -0.1610230   -51.400    -3.000  
+ 2 3 2 52335.00 I  -.120773  .000034   .479750  .000055  I -.1626879  .0000035  1.6606 0.0024  I   -51.996     .740    -3.026     .340 -0.120890  0.479830 -0.1626750   -51.300    -2.700  
+ 2 3 3 52336.00 I  -.118537  .000073   .482904  .000054  I -.1642927  .0000028  1.5177 0.0022  I   -52.427     .168    -3.060     .340 -0.118380  0.482830 -0.1642830   -51.200    -2.400  
+ 2 3 4 52337.00 I  -.116662  .000087   .485901  .000053  I -.1656830  .0000025  1.2538 0.0022  I   -52.637     .152    -3.081     .340 -0.116640  0.485860 -0.1656820   -51.400    -2.400  
+ 2 3 5 52338.00 I  -.114402  .000076   .488895  .000075  I -.1668039  .0000034  1.0006 0.0018  I   -52.661     .183    -3.165     .340 -0.114530  0.488880 -0.1668110   -51.700    -2.500  
+ 2 3 6 52339.00 I  -.111601  .000075   .491674  .000054  I -.1677040  .0000027  0.8068 0.0021  I   -52.662     .217    -3.359     .340 -0.111870  0.491710 -0.1677050   -51.900    -2.800  
+ 2 3 7 52340.00 I  -.108721  .000076   .494389  .000053  I -.1684320  .0000025  0.6566 0.0018  I   -52.744     .217    -3.560     .340 -0.108770  0.494280 -0.1684280   -52.100    -3.100  
+ 2 3 8 52341.00 I  -.105539  .000074   .497043  .000053  I -.1690387  .0000023  0.5710 0.0018  I   -52.818     .217    -3.656     .340 -0.105510  0.497000 -0.1690330   -52.100    -3.500  
+ 2 3 9 52342.00 I  -.102297  .000069   .499702  .000054  I -.1695899  .0000025  0.5331 0.0019  I   -52.614     .172    -3.662     .340 -0.102260  0.499710 -0.1696080   -51.900    -3.700  
+ 2 310 52343.00 I  -.099240  .000088   .502427  .000058  I -.1701263  .0000031  0.5596 0.0020  I   -52.203     .160    -3.678     .340 -0.099160  0.502440 -0.1701600   -51.600    -3.800  
+ 2 311 52344.00 I  -.096907  .000097   .505134  .000050  I -.1707381  .0000032  0.6733 0.0023  I   -51.725     .160    -3.677     .340 -0.096810  0.505150 -0.1707500   -51.400    -3.700  
+ 2 312 52345.00 I  -.095010  .000103   .507537  .000040  I -.1714858  .0000035  0.8257 0.0023  I   -51.455     .740    -3.552     .340 -0.095040  0.507560 -0.1714790   -51.300    -3.500  
+ 2 313 52346.00 I  -.092703  .000098   .509844  .000045  I -.1723819  .0000034  0.9554 0.0025  I   -51.475     .206    -3.291     .340 -0.092840  0.509890 -0.1723820   -51.200    -3.300  
+ 2 314 52347.00 I  -.090280  .000108   .512133  .000050  I -.1733703  .0000036  1.0061 0.0025  I   -51.626     .206    -3.058     .340 -0.090220  0.512070 -0.1733690   -51.300    -3.200  
+ 2 315 52348.00 I  -.087647  .000109   .514321  .000054  I -.1743650  .0000037  0.9693 0.0025  I   -51.748     .206    -3.018     .340 -0.087660  0.514370 -0.1743580   -51.300    -3.100  
+ 2 316 52349.00 I  -.084887  .000041   .516458  .000050  I -.1753014  .0000036  0.9098 0.0030  I   -51.739     .247    -3.159     .340 -0.084860  0.516470 -0.1753050   -51.300    -3.000  
+ 2 317 52350.00 I  -.081872  .000095   .518429  .000045  I -.1761905  .0000047  0.8680 0.0030  I   -51.598     .141    -3.339     .340 -0.081840  0.518430 -0.1762050   -51.200    -3.100  
+ 2 318 52351.00 I  -.078750  .000095   .520307  .000058  I -.1770307  .0000047  0.8060 0.0034  I   -51.451     .141    -3.494     .340 -0.078700  0.520250 -0.1770390   -51.000    -3.200  
+ 2 319 52352.00 I  -.075580  .000088   .522229  .000057  I -.1777808  .0000048  0.6788 0.0032  I   -51.449     .140    -3.689     .340 -0.075630  0.522210 -0.1777670   -50.900    -3.300  
+ 2 320 52353.00 I  -.072564  .000086   .523982  .000061  I -.1783793  .0000042  0.5245 0.0031  I   -51.564     .233    -3.948     .340 -0.072570  0.523990 -0.1783600   -50.800    -3.500  
+ 2 321 52354.00 I  -.069255  .000081   .525681  .000057  I -.1788451  .0000040  0.4162 0.0029  I   -51.599     .233    -4.144     .340 -0.069250  0.525600 -0.1788340   -50.800    -3.700  
+ 2 322 52355.00 I  -.065799  .000084   .527523  .000057  I -.1792335  .0000039  0.3735 0.0024  I   -51.492     .233    -4.169     .340 -0.065770  0.527460 -0.1792290   -50.900    -4.000  
+ 2 323 52356.00 I  -.062329  .000036   .529144  .000062  I -.1796148  .0000026  0.3991 0.0023  I   -51.432     .298    -4.139     .122 -0.062270  0.529100 -0.1796230   -51.000    -4.400  
+ 2 324 52357.00 I  -.058837  .000046   .530650  .000056  I -.1800603  .0000024  0.5107 0.0018  I   -51.530     .214    -4.282     .127 -0.058810  0.530710 -0.1801030   -51.100    -4.700  
+ 2 325 52358.00 I  -.055246  .000055   .532291  .000056  I -.1806694  .0000026  0.7219 0.0019  I   -51.554     .214    -4.608     .127 -0.055180  0.532160 -0.1807120   -51.000    -4.900  
+ 2 326 52359.00 I  -.051312  .000054   .534075  .000049  I -.1815255  .0000030  0.9975 0.0021  I   -51.213     .201    -4.844     .340 -0.051350  0.533960 -0.1815250   -50.800    -4.900  
+ 2 327 52360.00 I  -.048010  .000062   .535792  .000049  I -.1826741  .0000033  1.3024 0.0023  I   -50.631     .200    -4.779     .340 -0.047900  0.535800 -0.1826590   -50.500    -4.800  
+ 2 328 52361.00 I  -.045031  .000063   .537281  .000048  I -.1841051  .0000034  1.5317 0.0024  I   -50.267     .200    -4.510     .340 -0.044850  0.537270 -0.1841020   -50.200    -4.500  
+ 2 329 52362.00 I  -.041718  .000069   .538545  .000050  I -.1856662  .0000036  1.5469 0.0028  I   -50.401     .200    -4.327     .340 -0.041730  0.538490 -0.1856720   -49.900    -4.300  
+ 2 330 52363.00 I  -.038236  .000045   .539546  .000037  I -.1871407  .0000044  1.3874 0.0030  I   -50.867     .278    -4.318     .340 -0.038250  0.539420 -0.1871400   -49.700    -4.100  
+ 2 331 52364.00 I  -.034512  .000028   .540256  .000052  I -.1884214  .0000047  1.1690 0.0043  I   -51.291     .278    -4.347     .340 -0.034510  0.540310 -0.1884220   -49.600    -4.100  
+ 2 4 1 52365.00 I  -.030784  .000064   .540741  .000079  I -.1894701  .0000074  0.9247 0.0037  I   -51.432     .440    -4.340     .340 -0.030760  0.540660 -0.1894800   -49.700    -4.200  
+ 2 4 2 52366.00 I  -.027006  .000076   .541124  .000079  I -.1902749  .0000058  0.6928 0.0045  I   -51.299     .385    -4.416     .130 -0.026850  0.541150 -0.1902860   -49.900    -4.400  
+ 2 4 3 52367.00 I  -.022763  .000073   .541626  .000083  I -.1908693  .0000052  0.5017 0.0039  I   -51.097     .319    -4.663     .111 -0.022980  0.541720 -0.1908570   -50.100    -4.700  
+ 2 4 4 52368.00 I  -.018616  .000073   .542855  .000085  I -.1913055  .0000052  0.3922 0.0037  I   -51.094     .326    -4.944     .340 -0.018830  0.542820 -0.1912760   -50.500    -4.900  
+ 2 4 5 52369.00 I  -.014936  .000076   .544230  .000079  I -.1916850  .0000053  0.3767 0.0034  I   -51.221     .326    -5.060     .340 -0.014960  0.544200 -0.1916810   -50.700    -5.000  
+ 2 4 6 52370.00 I  -.011584  .000083   .545683  .000068  I -.1920849  .0000044  0.4394 0.0031  I   -51.255     .326    -4.972     .340 -0.011580  0.545710 -0.1920770   -50.900    -5.000  
+ 2 4 7 52371.00 I  -.008818  .000102   .546912  .000047  I -.1925759  .0000034  0.5386 0.0027  I   -50.958     .324    -4.815     .340 -0.008710  0.546960 -0.1925570   -50.800    -4.900  
+ 2 4 8 52372.00 I  -.006177  .000099   .547837  .000058  I -.1931609  .0000033  0.6344 0.0024  I   -50.455     .282    -4.670     .340 -0.006160  0.547850 -0.1931530   -50.700    -4.700  
+ 2 4 9 52373.00 I  -.003471  .000102   .548651  .000057  I -.1938494  .0000035  0.7444 0.0023  I   -50.118     .337    -4.481     .340 -0.003780  0.548650 -0.1938450   -50.600    -4.400  
+ 2 410 52374.00 I  -.001639  .000100   .549319  .000064  I -.1946504  .0000031  0.8567 0.0023  I   -50.146     .276    -4.205     .340 -0.001790  0.549280 -0.1946360   -50.500    -4.100  
+ 2 411 52375.00 I   .000751  .000093   .549735  .000065  I -.1955552  .0000030  0.9464 0.0022  I   -50.402     .276    -3.956     .340  0.000630  0.549660 -0.1955480   -50.500    -4.000  
+ 2 412 52376.00 I   .003786  .000091   .550390  .000071  I -.1965192  .0000030  0.9642 0.0025  I   -50.645     .276    -3.903     .340  0.003750  0.550380 -0.1965140   -50.500    -3.900  
+ 2 413 52377.00 I   .006859  .000056   .551221  .000072  I -.1974561  .0000040  0.8995 0.0029  I   -50.849     .134    -4.084     .340  0.006850  0.551270 -0.1974570   -50.400    -4.000  
+ 2 414 52378.00 I   .009914  .000065   .551919  .000060  I -.1983019  .0000050  0.7859 0.0032  I   -50.826     .225    -4.365     .340  0.009940  0.551890 -0.1983280   -50.200    -4.200  
+ 2 415 52379.00 I   .012891  .000066   .552556  .000056  I -.1990194  .0000050  0.6467 0.0036  I   -50.741     .225    -4.611     .340  0.012910  0.552530 -0.1990500   -50.100    -4.400  
+ 2 416 52380.00 I   .015666  .000067   .553134  .000041  I -.1995747  .0000053  0.4458 0.0035  I   -50.701     .303    -4.802     .119  0.015700  0.553150 -0.1995690   -50.100    -4.600  
+ 2 417 52381.00 I   .018798  .000070   .553633  .000042  I -.1999273  .0000050  0.2940 0.0036  I   -50.764     .240    -4.957     .340  0.018850  0.553680 -0.1999170   -50.200    -4.800  
+ 2 418 52382.00 I   .022135  .000072   .554122  .000041  I -.2002060  .0000050  0.2722 0.0034  I   -50.844     .240    -5.110     .340  0.022150  0.554150 -0.2001990   -50.300    -5.000  
+ 2 419 52383.00 I   .025465  .000075   .554554  .000042  I -.2004662  .0000045  0.2341 0.0032  I   -50.793     .240    -5.191     .340  0.025500  0.554540 -0.2004610   -50.400    -5.100  
+ 2 420 52384.00 I   .028893  .000034   .554819  .000040  I -.2006861  .0000039  0.2318 0.0028  I   -50.580     .153    -5.218     .340  0.028950  0.554890 -0.2006920   -50.300    -5.200  
+ 2 421 52385.00 I   .032006  .000078   .554948  .000052  I -.2009777  .0000033  0.3734 0.0026  I   -50.295     .207    -5.273     .340  0.032050  0.555000 -0.2009790   -50.200    -5.300  
+ 2 422 52386.00 I   .034837  .000078   .554923  .000056  I -.2014742  .0000035  0.6391 0.0024  I   -50.010     .207    -5.370     .340  0.034890  0.554920 -0.2014710   -50.000    -5.300  
+ 2 423 52387.00 I   .037858  .000075   .554783  .000059  I -.2022657  .0000034  0.9341 0.0027  I   -49.772     .250    -5.391     .340  0.037860  0.554810 -0.2022590   -49.800    -5.300  
+ 2 424 52388.00 I   .041216  .000076   .554620  .000066  I -.2033246  .0000040  1.1756 0.0026  I   -49.700     .242    -5.246     .340  0.041250  0.554620 -0.2033180   -49.700    -5.200  
+ 2 425 52389.00 I   .044875  .000076   .554471  .000066  I -.2045984  .0000040  1.3617 0.0027  I   -49.933     .242    -5.033     .340  0.044890  0.554490 -0.2045770   -49.800    -5.100  
+ 2 426 52390.00 I   .048626  .000078   .554293  .000069  I -.2060056  .0000037  1.4204 0.0037  I   -50.438     .242    -4.937     .340  0.048700  0.554360 -0.2059990   -50.000    -4.900  
+ 2 427 52391.00 I   .052514  .000059   .553903  .000073  I -.2073772  .0000063  1.2929 0.0035  I   -51.044     .374    -4.990     .340  0.052510  0.553960 -0.2073770   -50.200    -4.800  
+ 2 428 52392.00 I   .056207  .000067   .553344  .000098  I -.2085449  .0000060  1.0260 0.0043  I   -51.380     .340    -5.040     .340  0.056270  0.553350 -0.2085470   -50.400    -4.800  
+ 2 429 52393.00 I   .059895  .000068   .552842  .000098  I -.2094192  .0000060  0.7292 0.0043  I   -51.411     .340    -5.008     .340  0.059990  0.552900 -0.2094170   -50.600    -4.900  
+ 2 430 52394.00 I   .063457  .000058   .552433  .000099  I -.2100075  .0000061  0.4450 0.0041  I   -51.188     .302    -5.017     .340  0.063540  0.552680 -0.2099850   -50.700    -5.100  
+ 2 5 1 52395.00 I   .066763  .000059   .552386  .000099  I -.2103409  .0000055  0.2560 0.0041  I   -50.882     .250    -5.204     .340  0.066810  0.552550 -0.2103280   -50.900    -5.400  
+ 2 5 2 52396.00 I   .069968  .000057   .552234  .000095  I -.2105649  .0000055  0.2032 0.0034  I   -50.717     .250    -5.482     .340  0.070040  0.552260 -0.2105750   -51.000    -5.600  
+ 2 5 3 52397.00 I   .073288  .000052   .551921  .000090  I -.2107657  .0000041  0.2057 0.0033  I   -50.781     .250    -5.625     .340  0.073400  0.551980 -0.2107650   -50.800    -5.600  
+ 2 5 4 52398.00 I   .076875  .000043   .551796  .000056  I -.2110038  .0000037  0.2908 0.0030  I   -50.900     .172    -5.519     .340  0.076890  0.551810 -0.2110110   -50.500    -5.500  
+ 2 5 5 52399.00 I   .080648  .000051   .551735  .000052  I -.2113748  .0000044  0.4585 0.0032  I   -50.784     .370    -5.340     .204  0.080730  0.551700 -0.2114160   -50.100    -5.300  
+ 2 5 6 52400.00 I   .084621  .000056   .551579  .000048  I -.2119226  .0000052  0.6317 0.0035  I   -50.470     .307    -5.202     .185  0.084750  0.551580 -0.2119720   -49.900    -4.900  
+ 2 5 7 52401.00 I   .088539  .000060   .551194  .000048  I -.2126279  .0000055  0.7740 0.0037  I   -50.271     .308    -5.088     .192  0.088540  0.551260 -0.2126300   -49.900    -4.500  
+ 2 5 8 52402.00 I   .091562  .000056   .550682  .000050  I -.2134579  .0000053  0.8781 0.0038  I   -50.404     .264    -4.919     .171  0.091560  0.550730 -0.2134090   -50.200    -4.400  
+ 2 5 9 52403.00 I   .094243  .000059   .549881  .000051  I -.2143723  .0000052  0.9469 0.0037  I   -50.790     .264    -4.708     .171  0.094320  0.549950 -0.2143480   -50.600    -4.400  
+ 2 510 52404.00 I   .097639  .000059   .549119  .000052  I -.2153390  .0000051  0.9776 0.0040  I   -51.167     .264    -4.598     .171  0.097670  0.549210 -0.2153350   -51.000    -4.600  
+ 2 511 52405.00 I   .101069  .000061   .548815  .000052  I -.2163055  .0000060  0.9424 0.0039  I   -51.344     .145    -4.696     .105  0.101130  0.548850 -0.2163140   -51.100    -4.800  
+ 2 512 52406.00 I   .103917  .000071   .548350  .000060  I -.2172079  .0000058  0.8597 0.0052  I   -51.418     .178    -4.959     .340  0.104010  0.548380 -0.2172330   -51.000    -5.000  
+ 2 513 52407.00 I   .106766  .000072   .547632  .000063  I -.2180235  .0000086  0.7730 0.0050  I   -51.369     .140    -5.248     .340  0.106820  0.547560 -0.2180410   -50.900    -5.200  
+ 2 514 52408.00 I   .109822  .000105   .546781  .000060  I -.2187407  .0000081  0.6468 0.0055  I   -51.284     .143    -5.441     .340  0.109690  0.546720 -0.2187190   -50.800    -5.300  
+ 2 515 52409.00 I   .112006  .000103   .545573  .000055  I -.2193284  .0000069  0.5543 0.0053  I   -51.291     .169    -5.527     .340  0.112130  0.545580 -0.2193030   -50.900    -5.400  
+ 2 516 52410.00 I   .114375  .000097   .544014  .000055  I -.2198677  .0000069  0.5168 0.0046  I   -51.445     .169    -5.558     .340  0.114200  0.544020 -0.2198500   -51.000    -5.500  
+ 2 517 52411.00 I   .116538  .000092   .542416  .000054  I -.2203632  .0000060  0.4829 0.0040  I   -51.589     .169    -5.604     .340  0.116510  0.542440 -0.2203590   -51.100    -5.500  
+ 2 518 52412.00 I   .119081  .000062   .541230  .000045  I -.2208752  .0000041  0.5741 0.0033  I   -51.504     .164    -5.670     .340  0.119110  0.541240 -0.2208620   -50.900    -5.500  
+ 2 519 52413.00 I   .121980  .000062   .540478  .000044  I -.2215514  .0000028  0.7854 0.0024  I   -51.131     .263    -5.711     .340  0.121990  0.540490 -0.2215070   -50.700    -5.500  
+ 2 520 52414.00 I   .125203  .000040   .539959  .000035  I -.2224608  .0000023  1.0412 0.0017  I   -50.660     .317    -5.665     .340  0.125270  0.539970 -0.2224240   -50.500    -5.400  
+ 2 521 52415.00 I   .128372  .000037   .539462  .000033  I -.2236311  .0000019  1.2889 0.0015  I   -50.405     .393    -5.503     .340  0.128480  0.539480 -0.2236270   -50.500    -5.300  
+ 2 522 52416.00 I   .131149  .000049   .538798  .000050  I -.2249998  .0000020  1.4200 0.0014  I   -50.596     .287    -5.264     .340  0.131230  0.538810 -0.2250060   -50.900    -5.300  
+ 2 523 52417.00 I   .133610  .000045   .537948  .000049  I -.2264286  .0000020  1.4234 0.0014  I   -51.214     .287    -5.064     .340  0.133700  0.537930 -0.2264180   -51.400    -5.200  
+ 2 524 52418.00 I   .135820  .000043   .537054  .000049  I -.2278096  .0000020  1.3158 0.0016  I   -51.985     .287    -5.008     .340  0.135990  0.537030 -0.2278030   -51.900    -5.100  
+ 2 525 52419.00 I   .138173  .000036   .536021  .000048  I -.2290156  .0000026  1.0744 0.0016  I   -52.570     .101    -5.081     .100  0.138220  0.536070 -0.2290250   -52.100    -4.900  
+ 2 526 52420.00 I   .140457  .000034   .534941  .000055  I -.2299334  .0000024  0.7581 0.0019  I   -52.794     .101    -5.152     .100  0.140550  0.534950 -0.2299640   -52.100    -4.800  
+ 2 527 52421.00 I   .143105  .000051   .533782  .000060  I -.2305356  .0000027  0.4533 0.0020  I   -52.706     .206    -5.138     .102  0.143240  0.533780 -0.2305660   -52.000    -4.800  
+ 2 528 52422.00 I   .146195  .000046   .532652  .000049  I -.2308616  .0000031  0.2133 0.0021  I   -52.458     .274    -5.122     .104  0.146250  0.532660 -0.2308730   -51.800    -4.900  
+ 2 529 52423.00 I   .148920  .000049   .531341  .000047  I -.2309940  .0000031  0.0685 0.0022  I   -52.198     .336    -5.234     .340  0.149140  0.531430 -0.2309950   -51.700    -5.000  
+ 2 530 52424.00 I   .151861  .000049   .529999  .000047  I -.2310346  .0000031  0.0315 0.0022  I   -52.057     .336    -5.455     .340  0.151940  0.530030 -0.2310410   -51.700    -5.300  
+ 2 531 52425.00 I   .154660  .000052   .528524  .000051  I -.2310732  .0000032  0.0429 0.0022  I   -52.101     .336    -5.618     .340  0.154720  0.528570 -0.2310720   -51.900    -5.600  
+ 2 6 1 52426.00 I   .157254  .000051   .526992  .000049  I -.2311274  .0000031  0.0753 0.0023  I   -52.252     .336    -5.620     .340  0.157340  0.527040 -0.2311240   -51.800    -5.700  
+ 2 6 2 52427.00 I   .159754  .000052   .525267  .000059  I -.2312328  .0000032  0.1348 0.0022  I   -52.354     .308    -5.534     .340  0.159880  0.525310 -0.2312140   -51.700    -5.600  
+ 2 6 3 52428.00 I   .162414  .000051   .523380  .000059  I -.2313968  .0000030  0.1936 0.0022  I   -52.360     .296    -5.478     .340  0.162500  0.523430 -0.2313740   -51.700    -5.500  
+ 2 6 4 52429.00 I   .165131  .000048   .521795  .000055  I -.2316129  .0000029  0.2312 0.0021  I   -52.404     .183    -5.446     .117  0.165300  0.521670 -0.2316120   -51.800    -5.300  
+ 2 6 5 52430.00 I   .168230  .000074   .520114  .000054  I -.2318286  .0000029  0.1769 0.0021  I   -52.639     .193    -5.335     .131  0.168340  0.520030 -0.2318370   -52.300    -5.100  
+ 2 6 6 52431.00 I   .171414  .000075   .518441  .000054  I -.2319476  .0000029  0.0654 0.0021  I   -53.061     .193    -5.113     .131  0.171450  0.518430 -0.2319380   -52.900    -5.000  
+ 2 6 7 52432.00 I   .174114  .000081   .516725  .000075  I -.2319645  .0000031 -0.0308 0.0028  I   -53.538     .193    -4.888     .131  0.174530  0.516740 -0.2319570   -53.500    -5.000  
+ 2 6 8 52433.00 I   .177634  .000075   .515071  .000060  I -.2318775  .0000049 -0.1524 0.0028  I   -53.804     .318    -4.835     .148  0.177650  0.515060 -0.2318840   -53.800    -5.100  
+ 2 6 9 52434.00 I   .180641  .000078   .513456  .000062  I -.2316492  .0000046 -0.3053 0.0042  I   -54.050     .247    -4.977     .103  0.180710  0.513450 -0.2316690   -53.800    -5.200  
+ 2 610 52435.00 I   .183530  .000090   .511787  .000067  I -.2312677  .0000068 -0.4556 0.0048  I   -54.114     .247    -5.253     .103  0.183570  0.511780 -0.2312790   -53.800    -5.300  
+ 2 611 52436.00 I   .186077  .000081   .509890  .000077  I -.2307375  .0000085 -0.6072 0.0054  I   -54.054     .173    -5.506     .340  0.186120  0.509890 -0.2307300   -53.800    -5.400  
+ 2 612 52437.00 I   .188424  .000085   .507805  .000080  I -.2300812  .0000083 -0.6750 0.0059  I   -54.008     .163    -5.620     .340  0.188420  0.507800 -0.2300660   -53.800    -5.500  
+ 2 613 52438.00 I   .190960  .000083   .505694  .000065  I -.2294015  .0000082 -0.7007 0.0058  I   -54.077     .163    -5.607     .340  0.190770  0.505750 -0.2293550   -53.900    -5.500  
+ 2 614 52439.00 I   .193075  .000086   .503992  .000071  I -.2287126  .0000081 -0.6280 0.0067  I   -54.204     .163    -5.568     .340  0.193220  0.503920 -0.2287030   -53.900    -5.500  
+ 2 615 52440.00 I   .195887  .000082   .502180  .000071  I -.2281968  .0000105 -0.4015 0.0054  I   -54.182     .221    -5.589     .340  0.195910  0.502180 -0.2282220   -53.700    -5.500  
+ 2 616 52441.00 I   .199050  .000072   .500101  .000063  I -.2279198  .0000072 -0.1445 0.0065  I   -53.994     .222    -5.603     .340  0.199100  0.500090 -0.2279630   -53.400    -5.500  
+ 2 617 52442.00 I   .202216  .000052   .497766  .000062  I -.2279049  .0000078  0.1038 0.0055  I   -53.706     .200    -5.541     .340  0.202290  0.497760 -0.2279310   -53.300    -5.500  
+ 2 618 52443.00 I   .204825  .000041   .495346  .000055  I -.2280920  .0000082  0.2461 0.0056  I   -53.574     .226    -5.371     .124  0.204940  0.495220 -0.2280790   -53.400    -5.400  
+ 2 619 52444.00 I   .207395  .000051   .492822  .000068  I -.2283708  .0000080  0.3097 0.0057  I   -53.810     .328    -5.149     .103  0.207500  0.492730 -0.2283380   -53.900    -5.200  
+ 2 620 52445.00 I   .210129  .000052   .490564  .000066  I -.2286949  .0000079  0.3240 0.0054  I   -54.417     .328    -4.970     .103  0.210240  0.490560 -0.2286600   -54.500    -5.000  
+ 2 621 52446.00 I   .212475  .000055   .488780  .000064  I -.2289991  .0000072  0.2792 0.0059  I   -55.163     .328    -4.896     .103  0.212630  0.488670 -0.2289890   -55.100    -4.800  
+ 2 622 52447.00 I   .214565  .000054   .486718  .000080  I -.2292301  .0000088  0.1649 0.0045  I   -55.677     .459    -4.937     .340  0.214630  0.486680 -0.2292480   -55.500    -4.700  
+ 2 623 52448.00 I   .216538  .000061   .484377  .000075  I -.2293139  .0000054  0.0058 0.0049  I   -55.889     .331    -4.997     .340  0.216550  0.484340 -0.2293260   -55.500    -4.700  
+ 2 624 52449.00 I   .218215  .000057   .481849  .000074  I -.2292565  .0000044 -0.1088 0.0032  I   -55.778     .331    -5.051     .340  0.218230  0.481840 -0.2292470   -55.300    -4.800  
+ 2 625 52450.00 I   .219488  .000047   .479106  .000056  I -.2291217  .0000036 -0.1472 0.0029  I   -55.532     .740    -5.117     .340  0.219580  0.479140 -0.2291160   -55.000    -5.000  
+ 2 626 52451.00 I   .220855  .000053   .476274  .000048  I -.2289744  .0000038 -0.1487 0.0026  I   -55.340     .178    -5.242     .140  0.220900  0.476260 -0.2289770   -54.800    -5.200  
+ 2 627 52452.00 I   .222495  .000050   .473233  .000048  I -.2288397  .0000038 -0.1040 0.0025  I   -55.293     .178    -5.406     .140  0.222530  0.473240 -0.2288370   -54.700    -5.500  
+ 2 628 52453.00 I   .224475  .000049   .470176  .000041  I -.2287886  .0000034  0.0072 0.0025  I   -55.398     .178    -5.518     .140  0.224420  0.470060 -0.2287840   -54.900    -5.600  
+ 2 629 52454.00 I   .225974  .000042   .467245  .000030  I -.2288471  .0000032  0.0974 0.0021  I   -55.673     .233    -5.563     .117  0.226010  0.467180 -0.2288750   -55.200    -5.700  
+ 2 630 52455.00 I   .227145  .000056   .464496  .000035  I -.2289808  .0000025  0.1799 0.0021  I   -55.957     .195    -5.524     .102  0.227260  0.464490 -0.2290160   -55.700    -5.600  
+ 2 7 1 52456.00 I   .228085  .000056   .461571  .000040  I -.2292183  .0000027  0.2966 0.0017  I   -56.223     .172    -5.510     .340  0.228170  0.461610 -0.2292270   -56.100    -5.400  
+ 2 7 2 52457.00 I   .228670  .000050   .458420  .000045  I -.2295755  .0000024  0.4177 0.0018  I   -56.422     .131    -5.490     .340  0.228800  0.458450 -0.2295720   -56.300    -5.300  
+ 2 7 3 52458.00 I   .229477  .000054   .455657  .000050  I -.2300230  .0000025  0.4468 0.0017  I   -56.604     .131    -5.365     .340  0.229470  0.455480 -0.2300200   -56.400    -5.300  
+ 2 7 4 52459.00 I   .229929  .000056   .452705  .000050  I -.2304413  .0000025  0.3926 0.0018  I   -56.916     .131    -5.120     .340  0.230020  0.452640 -0.2304250   -56.500    -5.300  
+ 2 7 5 52460.00 I   .230325  .000055   .449629  .000047  I -.2307979  .0000025  0.3073 0.0024  I   -57.440     .131    -4.873     .340  0.230440  0.449620 -0.2307870   -57.000    -5.300  
+ 2 7 6 52461.00 I   .230813  .000042   .446335  .000056  I -.2310385  .0000040  0.1696 0.0021  I   -58.055     .112    -4.771     .340  0.230840  0.446330 -0.2310450   -57.400    -5.300  
+ 2 7 7 52462.00 I   .231538  .000033   .442868  .000064  I -.2311346  .0000034  0.0245 0.0037  I   -58.514     .149    -4.874     .215  0.231560  0.442800 -0.2311160   -57.800    -5.300  
+ 2 7 8 52463.00 I   .232357  .000037   .439566  .000096  I -.2310913  .0000062 -0.1093 0.0034  I   -58.673     .149    -5.132     .215  0.232370  0.439500 -0.2310570   -58.200    -5.300  
+ 2 7 9 52464.00 I   .233101  .000043   .436299  .000090  I -.2309258  .0000060 -0.2139 0.0042  I   -58.599     .440    -5.431     .182  0.233070  0.436310 -0.2309210   -58.400    -5.300  
+ 2 710 52465.00 I   .234036  .000040   .433127  .000093  I -.2306797  .0000058 -0.2699 0.0042  I   -58.451     .427    -5.639     .150  0.234030  0.433250 -0.2306780   -58.300    -5.300  
+ 2 711 52466.00 I   .235477  .000040   .430263  .000093  I -.2304023  .0000058 -0.2769 0.0040  I   -58.317     .427    -5.675     .150  0.235400  0.430340 -0.2303350   -58.000    -5.400  
+ 2 712 52467.00 I   .236735  .000037   .427399  .000091  I -.2301805  .0000056 -0.1201 0.0045  I   -58.212     .427    -5.573     .150  0.236820  0.427380 -0.2301690   -57.800    -5.400  
+ 2 713 52468.00 I   .238121  .000045   .424430  .000081  I -.2301960  .0000068  0.1383 0.0038  I   -58.224     .449    -5.447     .171  0.238100  0.424380 -0.2302190   -57.600    -5.500  
+ 2 714 52469.00 I   .239167  .000063   .421365  .000053  I -.2304459  .0000051  0.3633 0.0047  I   -58.244     .421    -5.392     .340  0.239200  0.421320 -0.2304620   -57.700    -5.500  
+ 2 715 52470.00 I   .240194  .000061   .418308  .000040  I -.2309062  .0000064  0.5393 0.0039  I   -58.353     .338    -5.388     .340  0.240220  0.418270 -0.2308980   -57.900    -5.400  
+ 2 716 52471.00 I   .241186  .000066   .415505  .000037  I -.2314847  .0000060  0.5958 0.0041  I   -58.531     .121    -5.362     .340  0.241160  0.415450 -0.2314830   -58.200    -5.300  
+ 2 717 52472.00 I   .241880  .000062   .412784  .000043  I -.2320585  .0000050  0.5343 0.0039  I   -58.784     .150    -5.277     .109  0.241970  0.412750 -0.2320660   -58.500    -5.300  
+ 2 718 52473.00 I   .242880  .000069   .410344  .000044  I -.2325272  .0000050  0.3944 0.0035  I   -59.135     .150    -5.159     .109  0.242950  0.410280 -0.2324960   -58.800    -5.200  
+ 2 719 52474.00 I   .244016  .000068   .408159  .000041  I -.2328183  .0000049  0.1674 0.0036  I   -59.570     .150    -5.056     .109  0.243920  0.408040 -0.2328090   -59.100    -5.200  
+ 2 720 52475.00 I   .244296  .000055   .405615  .000045  I -.2328375  .0000052 -0.1331 0.0030  I   -59.978     .173    -5.050     .105  0.244380  0.405560 -0.2328360   -59.400    -5.100  
+ 2 721 52476.00 I   .244742  .000064   .402725  .000054  I -.2325613  .0000034 -0.4061 0.0031  I   -60.203     .201    -5.063     .340  0.244780  0.402680 -0.2325410   -59.700    -5.100  
+ 2 722 52477.00 I   .245495  .000067   .399749  .000060  I -.2320551  .0000034 -0.5896 0.0022  I   -60.157     .201    -5.150     .340  0.245540  0.399670 -0.2320260   -59.900    -5.100  
+ 2 723 52478.00 I   .246117  .000050   .396855  .000064  I -.2314115  .0000029 -0.6850 0.0022  I   -59.923     .242    -5.304     .340  0.246260  0.396850 -0.2314050   -59.800    -5.100  
+ 2 724 52479.00 I   .246666  .000063   .394095  .000071  I -.2307041  .0000029 -0.7235 0.0021  I   -59.694     .310    -5.477     .340  0.246670  0.394040 -0.2307260   -59.600    -5.200  
+ 2 725 52480.00 I   .246900  .000063   .391189  .000074  I -.2299998  .0000030 -0.6562 0.0021  I   -59.614     .310    -5.580     .340  0.246940  0.391050 -0.2300230   -59.200    -5.300  
+ 2 726 52481.00 I   .246744  .000068   .387877  .000069  I -.2294179  .0000030 -0.5102 0.0020  I   -59.699     .310    -5.544     .340  0.246920  0.387830 -0.2294130   -58.900    -5.400  
+ 2 727 52482.00 I   .246820  .000061   .384346  .000072  I -.2289761  .0000027 -0.3739 0.0020  I   -59.932     .349    -5.396     .340  0.246880  0.384320 -0.2289960   -58.700    -5.400  
+ 2 728 52483.00 I   .247096  .000068   .380592  .000076  I -.2286673  .0000025 -0.2460 0.0020  I   -60.218     .362    -5.262     .340  0.247190  0.380540 -0.2287050   -58.700    -5.300  
+ 2 729 52484.00 I   .247619  .000080   .376810  .000076  I -.2284689  .0000030 -0.1638 0.0019  I   -60.495     .412    -5.219     .340  0.247690  0.376780 -0.2284900   -59.000    -5.200  
+ 2 730 52485.00 I   .248459  .000054   .373119  .000067  I -.2283114  .0000029 -0.1664 0.0020  I   -60.621     .386    -5.202     .340  0.248530  0.373170 -0.2283280   -59.500    -5.100  
+ 2 731 52486.00 I   .249767  .000055   .369842  .000075  I -.2281178  .0000025 -0.2239 0.0019  I   -60.603     .462    -5.096     .119  0.249840  0.369800 -0.2281490   -60.200    -5.100  
+ 2 8 1 52487.00 I   .251195  .000055   .366848  .000072  I -.2278583  .0000025 -0.2971 0.0018  I   -60.708     .462    -4.915     .119  0.251250  0.366800 -0.2278600   -60.800    -5.000  
+ 2 8 2 52488.00 I   .252209  .000059   .364110  .000067  I -.2275238  .0000025 -0.3695 0.0024  I   -61.195     .462    -4.807     .119  0.252240  0.364080 -0.2275160   -61.400    -5.000  
+ 2 8 3 52489.00 I   .252951  .000045   .361548  .000041  I -.2271092  .0000042 -0.4721 0.0023  I   -61.936     .527    -4.876     .167  0.253020  0.361480 -0.2271160   -61.600    -5.100  
+ 2 8 4 52490.00 I   .253921  .000054   .358980  .000054  I -.2265683  .0000038 -0.6085 0.0028  I   -62.484     .559    -5.071     .141  0.253980  0.358920 -0.2265870   -61.700    -5.200  
+ 2 8 5 52491.00 I   .254925  .000055   .356325  .000053  I -.2259038  .0000036 -0.7099 0.0028  I   -62.551     .559    -5.284     .141  0.254980  0.356280 -0.2259130   -61.500    -5.300  
+ 2 8 6 52492.00 I   .255633  .000053   .353419  .000054  I -.2251723  .0000040 -0.7399 0.0026  I   -62.268     .590    -5.471     .107  0.255770  0.353310 -0.2251650   -61.200    -5.400  
+ 2 8 7 52493.00 I   .256726  .000055   .350230  .000068  I -.2244566  .0000038 -0.6723 0.0028  I   -61.992     .584    -5.630     .172  0.256720  0.350180 -0.2244500   -60.900    -5.400  
+ 2 8 8 52494.00 I   .257858  .000050   .347410  .000068  I -.2238681  .0000038 -0.4836 0.0025  I   -61.705     .584    -5.649     .172  0.257930  0.347350 -0.2238700   -60.700    -5.300  
+ 2 8 9 52495.00 I   .259013  .000051   .344903  .000071  I -.2235232  .0000032 -0.1934 0.0033  I   -61.472     .584    -5.498     .172  0.259060  0.344730 -0.2235210   -60.600    -5.300  
+ 2 810 52496.00 I   .259881  .000040   .342253  .000065  I -.2234895  .0000053  0.1214 0.0033  I   -61.376     .504    -5.272     .209  0.259930  0.342210 -0.2235000   -60.900    -5.200  
+ 2 811 52497.00 I   .260387  .000055   .339692  .000080  I -.2237494  .0000057  0.3863 0.0039  I   -61.547     .426    -5.161     .194  0.260430  0.339680 -0.2237760   -61.300    -5.200  
+ 2 812 52498.00 I   .260493  .000057   .336844  .000081  I -.2242302  .0000056  0.5554 0.0043  I   -61.955     .426    -5.238     .194  0.260510  0.336830 -0.2242470   -61.800    -5.200  
+ 2 813 52499.00 I   .260687  .000060   .333646  .000067  I -.2248094  .0000065  0.5720 0.0042  I   -62.386     .331    -5.385     .178  0.260660  0.333730 -0.2248020   -62.300    -5.200  
+ 2 814 52500.00 I   .260828  .000066   .330859  .000060  I -.2253333  .0000062  0.4658 0.0045  I   -62.664     .354    -5.440     .131  0.260880  0.330800 -0.2253290   -62.600    -5.200  
+ 2 815 52501.00 I   .260774  .000076   .328167  .000060  I -.2257140  .0000063  0.2786 0.0039  I   -62.794     .354    -5.369     .131  0.260800  0.328160 -0.2257190   -62.800    -5.200  
+ 2 816 52502.00 I   .260540  .000071   .325597  .000060  I -.2258714  .0000048  0.0340 0.0040  I   -62.898     .354    -5.259     .131  0.260590  0.325560 -0.2258670   -62.700    -5.300  
+ 2 817 52503.00 I   .260229  .000064   .322975  .000040  I -.2257922  .0000049 -0.1799 0.0031  I   -63.109     .336    -5.181     .340  0.260270  0.322960 -0.2258040   -62.600    -5.300  
+ 2 818 52504.00 I   .259728  .000064   .320286  .000048  I -.2255360  .0000039 -0.3204 0.0034  I   -63.271     .295    -5.171     .340  0.259760  0.320270 -0.2255640   -62.600    -5.300  
+ 2 819 52505.00 I   .259106  .000058   .317546  .000044  I -.2251760  .0000046 -0.3871 0.0028  I   -63.295     .295    -5.225     .340  0.259100  0.317490 -0.2251930   -62.500    -5.300  
+ 2 820 52506.00 I   .258503  .000059   .314720  .000047  I -.2247865  .0000041 -0.3797 0.0030  I   -63.114     .246    -5.344     .340  0.258500  0.314620 -0.2247810   -62.500    -5.300  
+ 2 821 52507.00 I   .257794  .000052   .311720  .000050  I -.2244519  .0000039 -0.2664 0.0028  I   -62.800     .214    -5.503     .340  0.257860  0.311680 -0.2244460   -62.500    -5.400  
+ 2 822 52508.00 I   .257201  .000051   .308634  .000050  I -.2242797  .0000039 -0.0752 0.0027  I   -62.594     .214    -5.530     .340  0.257220  0.308630 -0.2242690   -62.500    -5.300  
+ 2 823 52509.00 I   .256792  .000051   .305386  .000045  I -.2242788  .0000036  0.0478 0.0030  I   -62.554     .214    -5.346     .340  0.256760  0.305340 -0.2242730   -62.600    -5.300  
+ 2 824 52510.00 I   .256222  .000040   .302075  .000030  I -.2243658  .0000045  0.1422 0.0025  I   -62.624     .223    -5.006     .340  0.256260  0.302050 -0.2243560   -62.500    -5.100  
+ 2 825 52511.00 I   .255523  .000041   .298675  .000044  I -.2245688  .0000035  0.2534 0.0029  I   -62.760     .187    -4.726     .340  0.255550  0.298650 -0.2245560   -62.400    -5.000  
+ 2 826 52512.00 I   .254858  .000039   .295170  .000043  I -.2248545  .0000035  0.3102 0.0024  I   -62.855     .187    -4.640     .340  0.254880  0.295130 -0.2248520   -62.400    -4.800  
+ 2 827 52513.00 I   .254463  .000040   .291714  .000051  I -.2251742  .0000034  0.3218 0.0023  I   -62.799     .143    -4.680     .340  0.254570  0.291610 -0.2251720   -62.300    -4.700  
+ 2 828 52514.00 I   .254529  .000033   .288453  .000053  I -.2254807  .0000031  0.2811 0.0023  I   -62.610     .105    -4.689     .340  0.254600  0.288320 -0.2254850   -62.400    -4.600  
+ 2 829 52515.00 I   .254519  .000036   .285396  .000053  I -.2257157  .0000032  0.1784 0.0022  I   -62.614     .140    -4.648     .340  0.254560  0.285420 -0.2257490   -62.500    -4.600  
+ 2 830 52516.00 I   .254091  .000033   .282309  .000058  I -.2258262  .0000030  0.0419 0.0023  I   -63.009     .140    -4.718     .340  0.254150  0.282230 -0.2258220   -62.700    -4.700  
+ 2 831 52517.00 I   .253545  .000028   .279192  .000059  I -.2258030  .0000034 -0.0841 0.0028  I   -63.710     .740    -4.964     .340  0.253570  0.279080 -0.2258010   -62.800    -4.800  
+ 2 9 1 52518.00 I   .252756  .000028   .276056  .000060  I -.2256657  .0000047 -0.1871 0.0032  I   -64.185     .740    -5.236     .340  0.252800  0.276040 -0.2256610   -62.900    -4.900  
+ 2 9 2 52519.00 I   .251578  .000042   .272855  .000063  I -.2254402  .0000055 -0.2560 0.0041  I   -64.067     .740    -5.341     .340  0.251620  0.272820 -0.2254090   -62.800    -5.100  
+ 2 9 3 52520.00 I   .250129  .000052   .269689  .000070  I -.2251797  .0000067 -0.2468 0.0042  I   -63.531     .238    -5.274     .132  0.250140  0.269660 -0.2251190   -62.700    -5.100  
+ 2 9 4 52521.00 I   .248953  .000054   .266676  .000066  I -.2249860  .0000064 -0.1192 0.0046  I   -63.001     .233    -5.163     .175  0.248990  0.266590 -0.2249760   -62.600    -5.100  
+ 2 9 5 52522.00 I   .248303  .000058   .263660  .000068  I -.2249649  .0000064  0.0792 0.0045  I   -62.677     .233    -5.043     .175  0.248290  0.263550 -0.2249850   -62.500    -5.000  
+ 2 9 6 52523.00 I   .247358  .000064   .260693  .000059  I -.2251708  .0000062  0.3568 0.0043  I   -62.523     .233    -4.839     .175  0.247480  0.260610 -0.2251690   -62.600    -4.900  
+ 2 9 7 52524.00 I   .246202  .000078   .258028  .000064  I -.2257018  .0000057  0.7042 0.0042  I   -62.544     .233    -4.586     .175  0.246250  0.257990 -0.2256930   -62.800    -4.900  
+ 2 9 8 52525.00 I   .244623  .000075   .255658  .000047  I -.2265511  .0000056  0.9673 0.0040  I   -62.801     .239    -4.485     .170  0.244650  0.255640 -0.2265270   -62.900    -4.900  
+ 2 9 9 52526.00 I   .242763  .000070   .253201  .000041  I -.2275770  .0000056  1.0521 0.0042  I   -63.210     .172    -4.652     .172  0.242770  0.253220 -0.2275570   -63.000    -4.900  
+ 2 910 52527.00 I   .241036  .000074   .250576  .000074  I -.2285921  .0000062  0.9474 0.0038  I   -63.549     .650    -4.924     .340  0.241050  0.250530 -0.2286070   -63.100    -4.900  
+ 2 911 52528.00 I   .239272  .000075   .248027  .000075  I -.2294206  .0000052  0.6893 0.0040  I   -63.692     .544    -5.056     .340  0.239380  0.247960 -0.2294510   -63.300    -4.900  
+ 2 912 52529.00 I   .237442  .000068   .245443  .000075  I -.2299704  .0000052  0.4304 0.0036  I   -63.689     .544    -4.974     .340  0.237550  0.245520 -0.2299690   -63.400    -4.900  
+ 2 913 52530.00 I   .235727  .000062   .242781  .000069  I -.2303005  .0000051  0.2288 0.0032  I   -63.661     .544    -4.873     .340  0.235820  0.242720 -0.2302950   -63.400    -4.900  
+ 2 914 52531.00 I   .234195  .000049   .239697  .000073  I -.2304384  .0000038  0.0584 0.0029  I   -63.678     .663    -4.891     .106  0.234230  0.239620 -0.2304410   -63.300    -4.900  
+ 2 915 52532.00 I   .232872  .000048   .236809  .000070  I -.2304447  .0000028 -0.0298 0.0024  I   -63.738     .549    -4.972     .340  0.232900  0.236760 -0.2304400   -63.300    -4.900  
+ 2 916 52533.00 I   .231666  .000046   .234534  .000049  I -.2304053  .0000029 -0.0383 0.0022  I   -63.764     .165    -5.008     .340  0.231690  0.234540 -0.2303880   -63.100    -4.900  
+ 2 917 52534.00 I   .230134  .000044   .232605  .000039  I -.2303821  .0000033 -0.0046 0.0023  I   -63.641     .125    -4.999     .340  0.230150  0.232650 -0.2303780   -62.900    -4.800  
+ 2 918 52535.00 I   .227992  .000045   .230846  .000039  I -.2304091  .0000036  0.0681 0.0024  I   -63.353     .190    -4.995     .340  0.228000  0.230880 -0.2304330   -62.800    -4.800  
+ 2 919 52536.00 I   .225292  .000045   .229151  .000036  I -.2305297  .0000036  0.1751 0.0025  I   -63.037     .190    -4.949     .340  0.225360  0.229150 -0.2305380   -62.600    -4.700  
+ 2 920 52537.00 I   .222316  .000045   .227178  .000037  I -.2307597  .0000034  0.2835 0.0030  I   -62.845     .190    -4.740     .340  0.222380  0.227190 -0.2307560   -62.500    -4.600  
+ 2 921 52538.00 I   .219435  .000041   .224964  .000036  I -.2310915  .0000049  0.3763 0.0027  I   -62.688     .176    -4.357     .340  0.219440  0.224910 -0.2310880   -62.400    -4.400  
+ 2 922 52539.00 I   .216745  .000051   .222702  .000050  I -.2315018  .0000042  0.4375 0.0036  I   -62.654     .203    -4.030     .340  0.216770  0.222670 -0.2314890   -62.200    -4.300  
+ 2 923 52540.00 I   .214368  .000050   .220362  .000050  I -.2319528  .0000054  0.4577 0.0031  I   -62.560     .203    -3.932     .340  0.214380  0.220350 -0.2319350   -62.100    -4.100  
+ 2 924 52541.00 I   .212100  .000045   .217747  .000053  I -.2323967  .0000045  0.4166 0.0036  I   -62.376     .273    -4.040     .114  0.212310  0.217770 -0.2323930   -61.900    -4.100  
+ 2 925 52542.00 I   .210452  .000047   .215446  .000060  I -.2327672  .0000048  0.3192 0.0033  I   -62.154     .273    -4.177     .103  0.210510  0.215420 -0.2327630   -61.700    -4.100  
+ 2 926 52543.00 I   .208767  .000051   .213100  .000059  I -.2330159  .0000048  0.1643 0.0033  I   -62.067     .273    -4.266     .103  0.208750  0.213110 -0.2329580   -61.600    -4.200  
+ 2 927 52544.00 I   .206775  .000049   .210842  .000060  I -.2331152  .0000045  0.0676 0.0035  I   -62.297     .273    -4.404     .103  0.206800  0.210720 -0.2330990   -61.600    -4.400  
+ 2 928 52545.00 I   .204745  .000034   .208471  .000052  I -.2331567  .0000050 -0.0121 0.0030  I   -62.746     .297    -4.656     .340  0.204730  0.208400 -0.2332060   -61.700    -4.500  
+ 2 929 52546.00 I   .202677  .000043   .205888  .000058  I -.2330781  .0000041 -0.1304 0.0042  I   -63.007     .264    -4.880     .340  0.202690  0.205880 -0.2331410   -61.800    -4.600  
+ 2 930 52547.00 I   .200592  .000049   .203187  .000058  I -.2329247  .0000068 -0.1624 0.0033  I   -62.773     .231    -4.869     .340  0.200580  0.203140 -0.2329430   -61.800    -4.600  
+ 210 1 52548.00 I   .198430  .000053   .200445  .000053  I -.2327953  .0000052 -0.0683 0.0041  I   -62.175     .179    -4.617     .340  0.198520  0.200480 -0.2328000   -61.800    -4.500  
+ 210 2 52549.00 I   .196564  .000055   .198099  .000057  I -.2328142  .0000045  0.1040 0.0034  I   -61.543     .142    -4.279     .106  0.196610  0.198090 -0.2328330   -61.500    -4.200  
+ 210 3 52550.00 I   .194659  .000053   .195695  .000059  I -.2330134  .0000045  0.3065 0.0031  I   -61.224     .142    -4.028     .106  0.194670  0.195650 -0.2330330   -61.200    -3.800  
+ 210 4 52551.00 I   .192452  .000050   .193467  .000053  I -.2334663  .0000042  0.6264 0.0034  I   -61.158     .142    -3.786     .106  0.192520  0.193410 -0.2334550   -61.000    -3.600  
+ 210 5 52552.00 I   .189854  .000047   .191374  .000046  I -.2342676  .0000051  0.9507 0.0028  I   -61.357     .126    -3.547     .132  0.189930  0.191370 -0.2343080   -60.900    -3.600  
+ 210 6 52553.00 I   .187313  .000042   .189304  .000053  I -.2353188  .0000037  1.1285 0.0033  I   -61.641     .106    -3.467     .116  0.187340  0.189270 -0.2353840   -61.000    -3.800  
+ 210 7 52554.00 I   .184951  .000051   .187197  .000066  I -.2364692  .0000042  1.1403 0.0032  I   -61.884     .740    -3.665     .106  0.184980  0.187140 -0.2364880   -61.200    -4.000  
+ 210 8 52555.00 I   .182522  .000046   .185011  .000070  I -.2375451  .0000053  0.9894 0.0032  I   -61.896     .740    -3.967     .340  0.182620  0.184970 -0.2375410   -61.500    -4.100  
+ 210 9 52556.00 I   .180036  .000055   .182676  .000067  I -.2384155  .0000048  0.7411 0.0036  I   -61.714     .740    -4.071     .340  0.180170  0.182730 -0.2384380   -61.600    -4.000  
+ 21010 52557.00 I   .177936  .000056   .180677  .000067  I -.2390205  .0000049  0.4722 0.0035  I   -61.543     .740    -3.931     .340  0.177910  0.180620 -0.2390100   -61.700    -3.800  
+ 21011 52558.00 I   .175524  .000057   .178743  .000064  I -.2393753  .0000050  0.2493 0.0038  I   -61.483     .740    -3.811     .340  0.175550  0.178830 -0.2393640   -61.600    -3.700  
+ 21012 52559.00 I   .173126  .000067   .176892  .000062  I -.2395524  .0000057  0.1262 0.0031  I   -61.469     .143    -3.917     .340  0.173160  0.176910 -0.2395600   -61.400    -3.700  
+ 21013 52560.00 I   .170913  .000055   .175068  .000054  I -.2396689  .0000038  0.1265 0.0040  I   -61.444     .160    -4.130     .110  0.170950  0.175020 -0.2396870   -61.200    -3.700  
+ 21014 52561.00 I   .168481  .000055   .173411  .000070  I -.2398339  .0000055  0.2121 0.0033  I   -61.408     .173    -4.193     .120  0.168490  0.173340 -0.2398360   -61.100    -3.800  
+ 21015 52562.00 I   .165852  .000049   .171533  .000064  I -.2401034  .0000053  0.3284 0.0035  I   -61.316     .186    -4.051     .147  0.165930  0.171640 -0.2400990   -60.900    -3.900  
+ 21016 52563.00 I   .163384  .000053   .170132  .000062  I -.2404951  .0000043  0.4578 0.0032  I   -61.189     .240    -3.878     .149  0.163530  0.170080 -0.2405390   -60.900    -3.900  
+ 21017 52564.00 I   .161183  .000053   .168869  .000058  I -.2410285  .0000037  0.6158 0.0027  I   -60.879     .230    -3.750     .150  0.161140  0.168790 -0.2410910   -60.800    -3.700  
+ 21018 52565.00 I   .158396  .000053   .167813  .000057  I -.2417084  .0000034  0.7188 0.0027  I   -60.641     .228    -3.602     .145  0.158390  0.167740 -0.2417050   -60.700    -3.500  
+ 21019 52566.00 I   .154524  .000049   .166697  .000051  I -.2424420  .0000039  0.7493 0.0023  I   -60.525     .156    -3.349     .133  0.154650  0.166660 -0.2424460   -60.600    -3.300  
+ 21020 52567.00 I   .150245  .000047   .165404  .000045  I -.2432013  .0000030  0.7626 0.0025  I   -60.432     .159    -3.074     .120  0.150440  0.165330 -0.2432310   -60.500    -3.100  
+ 21021 52568.00 I   .146611  .000056   .163868  .000047  I -.2439578  .0000032  0.7479 0.0023  I   -60.281     .176    -2.956     .115  0.146600  0.163910 -0.2439770   -60.300    -3.100  
+ 21022 52569.00 I   .143148  .000054   .162588  .000052  I -.2446889  .0000034  0.7088 0.0024  I   -60.108     .218    -3.046     .101  0.143220  0.162700 -0.2446860   -60.100    -3.100  
+ 21023 52570.00 I   .139888  .000054   .161306  .000057  I -.2453597  .0000035  0.6228 0.0025  I   -59.977     .205    -3.223     .340  0.139950  0.161420 -0.2453520   -60.000    -3.100  
+ 21024 52571.00 I   .136555  .000056   .160043  .000065  I -.2459212  .0000036  0.4971 0.0023  I   -59.916     .181    -3.365     .340  0.136600  0.159880 -0.2459250   -59.900    -3.200  
+ 21025 52572.00 I   .132959  .000059   .158365  .000065  I -.2463482  .0000031  0.3545 0.0023  I   -59.933     .171    -3.478     .340  0.133050  0.158470 -0.2463450   -59.900    -3.400  
+ 21026 52573.00 I   .129479  .000059   .156684  .000064  I -.2466410  .0000030  0.2445 0.0021  I   -60.121     .186    -3.625     .340  0.129500  0.156810 -0.2466280   -59.800    -3.500  
+ 21027 52574.00 I   .125826  .000049   .155193  .000067  I -.2468584  .0000029  0.1982 0.0021  I   -60.069     .179    -3.722     .340  0.125880  0.155240 -0.2468390   -59.600    -3.500  
+ 21028 52575.00 I   .122277  .000045   .154017  .000060  I -.2470415  .0000029  0.1641 0.0020  I   -59.781     .185    -3.670     .340  0.122280  0.153930 -0.2470170   -59.400    -3.500  
+ 21029 52576.00 I   .118729  .000043   .152877  .000050  I -.2472156  .0000027  0.2170 0.0019  I   -59.302     .212    -3.449     .104  0.118900  0.152880 -0.2472120   -59.000    -3.300  
+ 21030 52577.00 I   .115378  .000042   .152147  .000042  I -.2475286  .0000026  0.4292 0.0019  I   -58.829     .260    -3.171     .340  0.115420  0.152150 -0.2475260   -58.600    -3.100  
+ 21031 52578.00 I   .111554  .000040   .151452  .000041  I -.2480936  .0000026  0.7003 0.0019  I   -58.526     .263    -2.923     .340  0.111560  0.151430 -0.2480760   -58.200    -2.800  
+ 211 1 52579.00 I   .107456  .000041   .150724  .000037  I -.2489322  .0000027  0.9806 0.0026  I   -58.468     .263    -2.682     .340  0.107540  0.150700 -0.2489260   -58.100    -2.600  
+ 211 2 52580.00 I   .103551  .000058   .149991  .000053  I -.2500339  .0000046  1.1983 0.0028  I   -58.713     .270    -2.440     .340  0.103570  0.149990 -0.2500350   -58.200    -2.500  
+ 211 3 52581.00 I   .099863  .000070   .149384  .000076  I -.2512752  .0000049  1.2554 0.0037  I   -59.078     .262    -2.330     .340  0.099910  0.149380 -0.2512750   -58.500    -2.400  
+ 211 4 52582.00 I   .096363  .000098   .148926  .000092  I -.2525032  .0000058  1.1882 0.0047  I   -59.338     .244    -2.461     .101  0.096410  0.148870 -0.2524980   -58.700    -2.500  
+ 211 5 52583.00 I   .092454  .000103   .148083  .000102  I -.2535988  .0000080  0.9627 0.0046  I   -59.264     .168    -2.700     .108  0.092750  0.148250 -0.2535730   -58.900    -2.500  
+ 211 6 52584.00 I   .088989  .000093   .147567  .000097  I -.2544123  .0000072  0.6882 0.0053  I   -58.934     .181    -2.773     .340  0.088800  0.147510 -0.2544100   -58.800    -2.400  
+ 211 7 52585.00 I   .084733  .000092   .146842  .000097  I -.2549895  .0000071  0.4567 0.0048  I   -58.632     .181    -2.613     .340  0.084780  0.146840 -0.2549740   -58.500    -2.400  
+ 211 8 52586.00 I   .080605  .000091   .146169  .000104  I -.2553384  .0000064  0.2633 0.0046  I   -58.494     .181    -2.470     .340  0.080700  0.146110 -0.2553240   -58.100    -2.400  
+ 211 9 52587.00 I   .076653  .000088   .145400  .000075  I -.2555385  .0000059  0.1369 0.0041  I   -58.406     .210    -2.575     .340  0.076660  0.145430 -0.2555430   -57.700    -2.400  
+ 21110 52588.00 I   .072792  .000055   .144872  .000074  I -.2556375  .0000050  0.0863 0.0041  I   -58.265     .283    -2.822     .340  0.072840  0.144860 -0.2556750   -57.500    -2.400  
+ 21111 52589.00 I   .069204  .000055   .144512  .000072  I -.2557455  .0000056  0.1388 0.0038  I   -58.127     .283    -2.898     .340  0.069250  0.144500 -0.2557700   -57.400    -2.500  
+ 21112 52590.00 I   .065865  .000057   .144240  .000077  I -.2559352  .0000056  0.2514 0.0038  I   -58.043     .365    -2.689     .340  0.065950  0.144170 -0.2559250   -57.500    -2.500  
+ 21113 52591.00 I   .062931  .000074   .143850  .000080  I -.2562653  .0000050  0.4149 0.0038  I   -58.046     .266    -2.389     .103  0.063020  0.143850 -0.2562560   -57.600    -2.500  
+ 21114 52592.00 I   .059962  .000071   .143707  .000079  I -.2567568  .0000050  0.5539 0.0035  I   -57.926     .266    -2.198     .103  0.059990  0.143740 -0.2567520   -57.900    -2.400  
+ 21115 52593.00 I   .056305  .000067   .143674  .000082  I -.2573501  .0000049  0.6238 0.0044  I   -57.843     .266    -2.109     .103  0.056470  0.143620 -0.2573380   -58.000    -2.200  
+ 21116 52594.00 I   .052983  .000072   .143654  .000094  I -.2579905  .0000073  0.6522 0.0038  I   -57.837     .274    -1.975     .116  0.053070  0.143640 -0.2579920   -58.000    -2.000  
+ 21117 52595.00 I   .049731  .000071   .143605  .000106  I -.2586403  .0000057  0.6382 0.0048  I   -57.825     .231    -1.757     .340  0.049760  0.143600 -0.2586500   -57.800    -1.700  
+ 21118 52596.00 I   .046266  .000075   .143164  .000109  I -.2592524  .0000063  0.5806 0.0046  I   -57.751     .231    -1.586     .340  0.046290  0.143150 -0.2592520   -57.500    -1.600  
+ 21119 52597.00 I   .042668  .000066   .142504  .000111  I -.2597790  .0000072  0.4556 0.0046  I   -57.685     .341    -1.590     .340  0.042760  0.142590 -0.2597580   -57.200    -1.600  
+ 21120 52598.00 I   .039023  .000068   .142080  .000100  I -.2601516  .0000066  0.2946 0.0049  I   -57.693     .440    -1.754     .125  0.039060  0.142050 -0.2601350   -57.000    -1.700  
+ 21121 52599.00 I   .035643  .000069   .141645  .000099  I -.2603927  .0000066  0.2072 0.0045  I   -57.695     .440    -1.957     .125  0.035610  0.141620 -0.2603750   -56.800    -1.900  
+ 21122 52600.00 I   .032382  .000070   .141439  .000086  I -.2605844  .0000062  0.1752 0.0047  I   -57.564     .440    -2.096     .125  0.032530  0.141440 -0.2605540   -56.700    -2.100  
+ 21123 52601.00 I   .029455  .000060   .141705  .000056  I -.2607451  .0000067  0.1493 0.0039  I   -57.270     .518    -2.145     .340  0.029500  0.141590 -0.2607550   -56.600    -2.200  
+ 21124 52602.00 I   .026278  .000057   .141919  .000061  I -.2609050  .0000047  0.1894 0.0040  I   -56.936     .422    -2.143     .340  0.026290  0.141920 -0.2609170   -56.600    -2.200  
+ 21125 52603.00 I   .023146  .000053   .142072  .000060  I -.2611561  .0000042  0.3263 0.0032  I   -56.599     .389    -2.102     .340  0.023140  0.142090 -0.2611320   -56.500    -2.100  
+ 21126 52604.00 I   .020419  .000036   .142111  .000058  I -.2615777  .0000042  0.5237 0.0030  I   -56.262     .228    -2.032     .340  0.020440  0.142180 -0.2615560   -56.400    -2.000  
+ 21127 52605.00 I   .017702  .000038   .141972  .000056  I -.2622236  .0000042  0.7814 0.0030  I   -55.941     .228    -1.938     .340  0.017780  0.141910 -0.2622010   -56.300    -2.000  
+ 21128 52606.00 I   .014598  .000038   .141668  .000055  I -.2631419  .0000042  1.0434 0.0029  I   -55.707     .228    -1.807     .340  0.014610  0.141600 -0.2631340   -56.300    -1.800  
+ 21129 52607.00 I   .011103  .000038   .141506  .000058  I -.2642958  .0000041  1.2617 0.0040  I   -55.671     .228    -1.616     .340  0.011120  0.141530 -0.2642190   -56.300    -1.600  
+ 21130 52608.00 I   .007579  .000035   .141384  .000061  I -.2656414  .0000067  1.4082 0.0024  I   -56.053     .199    -1.385     .340  0.007650  0.141380 -0.2655300   -56.300    -1.300  
+ 212 1 52609.00 I   .004190  .000043   .141181  .000057  I -.2670650  .0000023  1.4130 0.0036  I   -56.523     .273    -1.234     .340  0.004230  0.141160 -0.2669760   -56.400    -1.100  
+ 212 2 52610.00 I   .000976  .000043   .141175  .000064  I -.2684199  .0000028  1.2753 0.0028  I   -56.957     .273    -1.261     .340  0.000980  0.141150 -0.2683720   -56.700    -1.500  
+ 212 3 52611.00 I  -.002188  .000055   .141366  .000082  I -.2695781  .0000050  1.0250 0.0027  I   -57.095     .366    -1.407     .340 -0.002100  0.141540 -0.2695620   -56.800    -1.400  
+ 212 4 52612.00 I  -.005190  .000058   .142182  .000082  I -.2704599  .0000046  0.7448 0.0034  I   -56.926     .353    -1.485     .340 -0.005140  0.142250 -0.2704590   -56.600    -1.300  
+ 212 5 52613.00 I  -.008410  .000060   .143068  .000080  I -.2710687  .0000046  0.4678 0.0033  I   -56.663     .353    -1.411     .340 -0.008540  0.143130 -0.2710520   -56.300    -1.300  
+ 212 6 52614.00 I  -.012360  .000066   .144207  .000078  I -.2714357  .0000046  0.3116 0.0041  I   -56.452     .353    -1.326     .340 -0.012430  0.144160 -0.2714150   -55.900    -1.300  
+ 212 7 52615.00 I  -.016720  .000076   .145538  .000076  I -.2717517  .0000068  0.3349 0.0036  I   -56.242     .350    -1.406     .340 -0.016710  0.145520 -0.2717620   -55.600    -1.300  
+ 212 8 52616.00 I  -.020888  .000062   .146709  .000092  I -.2721330  .0000056  0.4408 0.0047  I   -55.972     .301    -1.596     .340 -0.020860  0.146750 -0.2721450   -55.500    -1.400  
+ 212 9 52617.00 I  -.024269  .000055   .147737  .000096  I -.2726535  .0000065  0.6073 0.0038  I   -55.727     .327    -1.660     .340 -0.024190  0.147790 -0.2726310   -55.500    -1.400  
+ 21210 52618.00 I  -.027099  .000052   .149028  .000066  I -.2733480  .0000050  0.7750 0.0041  I   -55.631     .145    -1.480     .340 -0.027050  0.149110 -0.2733250   -55.600    -1.400  
+ 21211 52619.00 I  -.030097  .000054   .150624  .000068  I -.2742030  .0000049  0.9413 0.0035  I   -55.665     .147    -1.203     .340 -0.029990  0.150660 -0.2742050   -55.700    -1.300  
+ 21212 52620.00 I  -.032910  .000054   .152253  .000070  I -.2751980  .0000049  1.0100 0.0034  I   -55.794     .147    -1.033     .340 -0.032910  0.152320 -0.2751850   -55.700    -1.200  
+ 21213 52621.00 I  -.036521  .000056   .153643  .000074  I -.2762097  .0000048  1.0389 0.0040  I   -55.943     .147     -.985     .340 -0.036380  0.153690 -0.2762010   -55.700    -1.000  
+ 21214 52622.00 I  -.040135  .000058   .154901  .000064  I -.2772696  .0000063  1.0493 0.0037  I   -56.075     .163     -.905     .340 -0.040130  0.154810 -0.2772850   -55.800    -0.800  
+ 21215 52623.00 I  -.044170  .000055   .155905  .000084  I -.2782719  .0000057  0.9506 0.0045  I   -56.135     .258     -.706     .340 -0.044120  0.155800 -0.2783150   -55.800    -0.600  
+ 21216 52624.00 I  -.048085  .000063   .156669  .000091  I -.2791553  .0000064  0.8055 0.0042  I   -56.122     .243     -.487     .340 -0.048100  0.156550 -0.2791780   -55.900    -0.400  
+ 21217 52625.00 I  -.051623  .000048   .157274  .000096  I -.2798786  .0000063  0.6475 0.0043  I   -56.130     .372     -.424     .340 -0.051560  0.157350 -0.2798630   -56.000    -0.500  
+ 21218 52626.00 I  -.054557  .000068   .158497  .000091  I -.2804448  .0000058  0.4730 0.0043  I   -56.238     .301     -.580     .340 -0.054500  0.158360 -0.2804270   -56.000    -0.600  
+ 21219 52627.00 I  -.056950  .000064   .159883  .000092  I -.2808192  .0000060  0.2824 0.0040  I   -56.288     .301     -.884     .340 -0.056950  0.159770 -0.2808220   -56.000    -0.800  
+ 21220 52628.00 I  -.059147  .000061   .161774  .000082  I -.2810419  .0000055  0.1889 0.0042  I   -56.129     .301    -1.142     .340 -0.059110  0.161760 -0.2810310   -55.900    -1.100  
+ 21221 52629.00 I  -.061584  .000055   .164084  .000047  I -.2812224  .0000058  0.1718 0.0041  I   -55.769     .274    -1.188     .340 -0.061540  0.164060 -0.2812280   -55.600    -1.300  
+ 21222 52630.00 I  -.064259  .000063   .166441  .000043  I -.2813994  .0000062  0.1965 0.0042  I   -55.283     .274    -1.132     .340 -0.064250  0.166410 -0.2814080   -55.000    -1.400  
+ 21223 52631.00 I  -.066758  .000059   .168646  .000046  I -.2816508  .0000061  0.3274 0.0110  I   -54.871     .104    -1.044     .340 -0.066770  0.168630 -0.2816380   -54.400    -1.500  
+ 21224 52632.00 I  -.069104  .000042   .170874  .000042  I -.2820935  .0000212  0.5763 0.0095  I   -54.583     .740    -1.015     .340 -0.069100  0.170830 -0.2820620   -53.900    -1.400  
+ 21225 52633.00 I  -.071648  .000041   .173153  .000039  I -.2828125  .0000180  0.8527 0.0135  I   -54.399     .740    -1.032     .340 -0.071640  0.173150 -0.2827880   -53.500    -1.300  
+ 21226 52634.00 I  -.074203  .000041   .175133  .000034  I -.2837772  .0000166  1.0642 0.0097  I   -54.322     .740    -1.015     .340 -0.074230  0.175140 -0.2837740   -53.300    -1.100  
+ 21227 52635.00 I  -.076492  .000044   .176860  .000026  I -.2849084  .0000072  1.1783 0.0095  I   -54.406     .740     -.910     .340 -0.076500  0.176820 -0.2849120   -53.500    -0.900  
+ 21228 52636.00 I  -.078749  .000059   .178859  .000039  I -.2860947  .0000092  1.1751 0.0049  I   -54.548     .237     -.740     .121 -0.078730  0.178830 -0.2860920   -54.000    -0.700  
+ 21229 52637.00 I  -.081140  .000060   .181116  .000050  I -.2872199  .0000067  1.0558 0.0057  I   -54.991     .160     -.587     .108 -0.081160  0.181130 -0.2872110   -54.600    -0.500  
+ 21230 52638.00 I  -.083425  .000058   .183254  .000051  I -.2881773  .0000068  0.8494 0.0044  I   -55.413     .160     -.527     .108 -0.083470  0.183210 -0.2881680   -55.100    -0.400  
+ 21231 52639.00 I  -.085587  .000075   .185612  .000050  I -.2889136  .0000058  0.6277 0.0042  I   -55.626     .141     -.568     .340 -0.085710  0.185460 -0.2889120   -55.500    -0.400  
+ 3 1 1 52640.00 I  -.088506  .000087   .187936  .000054  I -.2894400  .0000050  0.4280 0.0038  I   -55.580     .132     -.644     .340 -0.088460  0.187930 -0.2894480   -55.500    -0.500  
+ 3 1 2 52641.00 I  -.091525  .000081   .190250  .000054  I -.2897971  .0000050  0.3107 0.0035  I   -55.381     .132     -.698     .340 -0.091550  0.190200 -0.2897920   -55.300    -0.600  
+ 3 1 3 52642.00 I  -.094535  .000063   .192681  .000051  I -.2901029  .0000050  0.3178 0.0037  I   -55.151     .132     -.756     .340 -0.094510  0.192640 -0.2900920   -54.900    -0.700  
+ 3 1 4 52643.00 I  -.097547  .000065   .195185  .000044  I -.2904422  .0000055  0.3533 0.0035  I   -54.916     .740     -.876     .340 -0.097560  0.195210 -0.2904570   -54.500    -0.800  
+ 3 1 5 52644.00 I  -.100674  .000059   .197402  .000045  I -.2908236  .0000050  0.4311 0.0038  I   -54.663     .740    -1.025     .340 -0.100680  0.197410 -0.2908460   -54.300    -0.900  
+ 3 1 6 52645.00 I  -.103497  .000061   .199315  .000044  I -.2913364  .0000051  0.6049 0.0034  I   -54.443     .740    -1.079     .340 -0.103540  0.199310 -0.2913490   -54.100    -1.000  
+ 3 1 7 52646.00 I  -.105918  .000043   .201164  .000043  I -.2920312  .0000047  0.7721 0.0035  I   -54.366     .186     -.977     .136 -0.105960  0.201290 -0.2920180   -54.100    -1.000  
+ 3 1 8 52647.00 I  -.108609  .000049   .203326  .000045  I -.2928525  .0000047  0.8551 0.0033  I   -54.485     .194     -.817     .141 -0.108520  0.203380 -0.2928610   -54.300    -1.000  
+ 3 1 9 52648.00 I  -.111066  .000052   .205508  .000044  I -.2937266  .0000047  0.8936 0.0034  I   -54.737     .194     -.733     .141 -0.111060  0.205470 -0.2937380   -54.500    -0.900  
+ 3 110 52649.00 I  -.113231  .000046   .207881  .000043  I -.2946374  .0000048  0.9252 0.0035  I   -54.991     .194     -.724     .141 -0.113170  0.207880 -0.2946290   -54.700    -0.800  
+ 3 111 52650.00 I  -.115263  .000036   .210338  .000038  I -.2955678  .0000052  0.9293 0.0033  I   -55.122     .120     -.632     .195 -0.115240  0.210360 -0.2955520   -54.800    -0.600  
+ 3 112 52651.00 I  -.117288  .000031   .212631  .000038  I -.2964717  .0000044  0.8607 0.0034  I   -55.163     .120     -.462     .171 -0.117260  0.212610 -0.2964480   -54.900    -0.400  
+ 3 113 52652.00 I  -.118995  .000036   .214760  .000036  I -.2972660  .0000045  0.7227 0.0032  I   -55.158     .120     -.272     .154 -0.119000  0.214730 -0.2972470   -54.900    -0.300  
+ 3 114 52653.00 I  -.120321  .000035   .216851  .000046  I -.2979152  .0000046  0.5791 0.0030  I   -55.190     .121     -.227     .210 -0.120310  0.216890 -0.2979030   -55.000    -0.300  
+ 3 115 52654.00 I  -.121679  .000033   .219146  .000044  I -.2984219  .0000039  0.4288 0.0029  I   -55.273     .121     -.412     .181 -0.121570  0.219120 -0.2984020   -55.100    -0.600  
+ 3 116 52655.00 I  -.122808  .000035   .221634  .000041  I -.2987735  .0000035  0.2806 0.0024  I   -55.330     .121     -.762     .181 -0.122870  0.221530 -0.2987500   -55.200    -0.900  
+ 3 117 52656.00 I  -.124297  .000038   .224033  .000040  I -.2990067  .0000029  0.2030 0.0025  I   -55.258     .122    -1.113     .340 -0.124280  0.224060 -0.2989930   -55.100    -1.100  
+ 3 118 52657.00 I  -.126047  .000045   .226509  .000041  I -.2992149  .0000037  0.2315 0.0024  I   -54.974     .137    -1.297     .340 -0.125980  0.226530 -0.2992100   -54.900    -1.300  
+ 3 119 52658.00 I  -.127673  .000043   .228811  .000045  I -.2994968  .0000039  0.3411 0.0028  I   -54.527     .132    -1.257     .340 -0.127580  0.228790 -0.2994690   -54.500    -1.300  
+ 3 120 52659.00 I  -.128873  .000038   .231030  .000050  I -.2999075  .0000043  0.4818 0.0039  I   -54.053     .168    -1.086     .340 -0.128840  0.231010 -0.2998440   -54.100    -1.100  
+ 3 121 52660.00 I  -.129940  .000051   .233478  .000061  I -.3004639  .0000067  0.6331 0.0042  I   -53.724     .287     -.943     .340 -0.129910  0.233420 -0.3004010   -53.700    -1.000  
+ 3 122 52661.00 I  -.131006  .000056   .236356  .000068  I -.3011699  .0000072  0.7731 0.0052  I   -53.649     .308     -.913     .110 -0.130970  0.236350 -0.3011540   -53.400    -0.900  
+ 3 123 52662.00 I  -.132220  .000052   .239582  .000070  I -.3019920  .0000079  0.8588 0.0052  I   -53.817     .308     -.956     .110 -0.132140  0.239610 -0.3020130   -53.400    -0.900  
+ 3 124 52663.00 I  -.133567  .000049   .242395  .000071  I -.3028736  .0000076  0.9028 0.0054  I   -54.132     .308     -.979     .110 -0.133540  0.242440 -0.3028670   -53.600    -0.900  
+ 3 125 52664.00 I  -.135144  .000051   .244806  .000067  I -.3037659  .0000073  0.8515 0.0048  I   -54.457     .283     -.916     .101 -0.135120  0.244810 -0.3037500   -53.900    -0.900  
+ 3 126 52665.00 I  -.136792  .000049   .247042  .000053  I -.3045278  .0000059  0.6536 0.0045  I   -54.774     .287     -.812     .115 -0.136780  0.247020 -0.3045260   -54.400    -0.800  
+ 3 127 52666.00 I  -.138126  .000042   .249381  .000044  I -.3050546  .0000053  0.4003 0.0038  I   -54.991     .287     -.705     .115 -0.138090  0.249450 -0.3050560   -54.700    -0.700  
+ 3 128 52667.00 I  -.138992  .000037   .252107  .000042  I -.3053340  .0000049  0.1640 0.0034  I   -55.045     .181     -.652     .104 -0.138880  0.252210 -0.3053250   -54.900    -0.700  
+ 3 129 52668.00 I  -.139269  .000049   .255088  .000043  I -.3054123  .0000043  0.0170 0.0033  I   -54.910     .153     -.689     .101 -0.139280  0.255170 -0.3054140   -54.800    -0.800  
+ 3 130 52669.00 I  -.139478  .000051   .258219  .000043  I -.3054011  .0000043 -0.0306 0.0029  I   -54.642     .167     -.837     .340 -0.139380  0.258240 -0.3053970   -54.500    -0.900  
+ 3 131 52670.00 I  -.139794  .000051   .261292  .000044  I -.3053653  .0000039 -0.0356 0.0036  I   -54.354     .167    -1.031     .340 -0.139870  0.261290 -0.3053620   -54.200    -1.100  
+ 3 2 1 52671.00 I  -.141155  .000059   .264059  .000065  I -.3053500  .0000057  0.0198 0.0031  I   -54.147     .116    -1.238     .340 -0.141130  0.264050 -0.3053730   -53.900    -1.200  
+ 3 2 2 52672.00 I  -.142642  .000061   .266788  .000072  I -.3054336  .0000047  0.1613 0.0035  I   -54.035     .125    -1.388     .340 -0.142570  0.266750 -0.3054490   -53.800    -1.200  
+ 3 2 3 52673.00 I  -.144127  .000075   .269650  .000076  I -.3056955  .0000040  0.3714 0.0030  I   -53.981     .125    -1.417     .340 -0.144090  0.269670 -0.3056800   -53.800    -1.200  
+ 3 2 4 52674.00 I  -.145231  .000062   .272399  .000079  I -.3061850  .0000036  0.6074 0.0027  I   -53.980     .251    -1.337     .340 -0.145260  0.272440 -0.3061760   -53.800    -1.200  
+ 3 2 5 52675.00 I  -.146060  .000059   .275320  .000074  I -.3068810  .0000035  0.7555 0.0025  I   -54.077     .227    -1.247     .340 -0.146160  0.275280 -0.3068960   -53.900    -1.200  
+ 3 2 6 52676.00 I  -.147316  .000056   .277939  .000075  I -.3076581  .0000036  0.7898 0.0025  I   -54.265     .227    -1.235     .340 -0.147270  0.278000 -0.3076810   -54.000    -1.200  
+ 3 2 7 52677.00 I  -.148426  .000054   .280393  .000067  I -.3084369  .0000035  0.7530 0.0027  I   -54.433     .227    -1.276     .340 -0.148390  0.280430 -0.3084350   -54.000    -1.200  
+ 3 2 8 52678.00 I  -.149667  .000055   .283189  .000061  I -.3091443  .0000041  0.6567 0.0025  I   -54.482     .268    -1.273     .340 -0.149610  0.283160 -0.3091510   -53.900    -1.200  
+ 3 2 9 52679.00 I  -.151304  .000036   .285945  .000063  I -.3097464  .0000035  0.5485 0.0029  I   -54.451     .296    -1.207     .340 -0.151270  0.285920 -0.3097880   -53.900    -1.100  
+ 3 210 52680.00 I  -.152949  .000036   .288612  .000061  I -.3102376  .0000040  0.4292 0.0030  I   -54.446     .273    -1.168     .340 -0.152910  0.288570 -0.3102810   -53.900    -1.100  
+ 3 211 52681.00 I  -.154297  .000048   .291302  .000062  I -.3106009  .0000049  0.2984 0.0030  I   -54.478     .472    -1.246     .162 -0.154280  0.291370 -0.3106030   -54.000    -1.300  
+ 3 212 52682.00 I  -.155365  .000055   .294094  .000057  I -.3108547  .0000045  0.2286 0.0034  I   -54.442     .411    -1.434     .152 -0.155300  0.294100 -0.3108090   -54.200    -1.500  
+ 3 213 52683.00 I  -.155875  .000057   .296851  .000058  I -.3110916  .0000046  0.2591 0.0032  I   -54.381     .411    -1.706     .152 -0.155910  0.296780 -0.3110340   -54.300    -1.900  
+ 3 214 52684.00 I  -.156091  .000060   .299473  .000055  I -.3113852  .0000046  0.3263 0.0035  I   -54.325     .411    -2.010     .152 -0.156160  0.299500 -0.3113730   -54.300    -2.100  
+ 3 215 52685.00 I  -.156343  .000059   .302128  .000032  I -.3117429  .0000053  0.3897 0.0034  I   -54.237     .465    -2.272     .193 -0.156320  0.302110 -0.3117780   -54.100    -2.200  
+ 3 216 52686.00 I  -.156302  .000073   .304583  .000039  I -.3121947  .0000049  0.5434 0.0034  I   -53.957     .439    -2.366     .176 -0.156290  0.304550 -0.3122450   -53.700    -2.100  
+ 3 217 52687.00 I  -.155862  .000062   .307063  .000046  I -.3128650  .0000041  0.8029 0.0029  I   -53.456     .155    -2.230     .118 -0.155780  0.307060 -0.3128800   -53.300    -1.900  
+ 3 218 52688.00 I  -.155323  .000064   .310072  .000049  I -.3137985  .0000031  1.0565 0.0024  I   -52.998     .186    -1.976     .340 -0.155280  0.310030 -0.3137900   -53.000    -1.800  
+ 3 219 52689.00 I  -.154911  .000071   .313488  .000054  I -.3149478  .0000026  1.2194 0.0020  I   -52.877     .231    -1.828     .340 -0.154890  0.313550 -0.3149440   -52.900    -1.700  
+ 3 220 52690.00 I  -.154784  .000069   .317584  .000051  I -.3161986  .0000025  1.2662 0.0018  I   -53.220     .231    -1.863     .340 -0.154700  0.317550 -0.3161840   -53.100    -1.900  
+ 3 221 52691.00 I  -.155311  .000071   .321366  .000048  I -.3174385  .0000025  1.1880 0.0021  I   -53.721     .231    -2.012     .340 -0.155090  0.321380 -0.3174310   -53.400    -2.000  
+ 3 222 52692.00 I  -.155475  .000071   .324475  .000045  I -.3185303  .0000033  0.9769 0.0020  I   -54.093     .229    -2.117     .340 -0.155490  0.324470 -0.3185360   -53.800    -2.100  
+ 3 223 52693.00 I  -.155454  .000070   .327396  .000056  I -.3193753  .0000030  0.7149 0.0023  I   -54.254     .180    -2.103     .340 -0.155400  0.327390 -0.3193890   -54.100    -2.000  
+ 3 224 52694.00 I  -.155123  .000065   .330443  .000054  I -.3199700  .0000031  0.4827 0.0023  I   -54.273     .180    -2.014     .340 -0.155070  0.330430 -0.3199750   -54.200    -2.000  
+ 3 225 52695.00 I  -.154614  .000047   .333493  .000050  I -.3203602  .0000035  0.3088 0.0025  I   -54.202     .200    -1.938     .340 -0.154650  0.333430 -0.3203540   -54.000    -1.900  
+ 3 226 52696.00 I  -.154637  .000045   .336386  .000053  I -.3206182  .0000038  0.2265 0.0026  I   -54.016     .240    -1.948     .102 -0.154530  0.336370 -0.3206160   -53.700    -1.900  
+ 3 227 52697.00 I  -.154656  .000045   .339306  .000059  I -.3208399  .0000038  0.2244 0.0025  I   -53.693     .240    -2.073     .102 -0.154610  0.339280 -0.3208330   -53.200    -2.000  
+ 3 228 52698.00 I  -.154375  .000041   .342141  .000060  I -.3210741  .0000032  0.2437 0.0039  I   -53.310     .240    -2.286     .102 -0.154360  0.342110 -0.3210690   -52.800    -2.200  
+ 3 3 1 52699.00 I  -.153841  .000023   .344649  .000029  I -.3213467  .0000067  0.3212 0.0027  I   -53.008     .295    -2.471     .105 -0.153800  0.344630 -0.3213410   -52.500    -2.200  
+ 3 3 2 52700.00 I  -.153198  .000024   .347240  .000031  I -.3217410  .0000043  0.4720 0.0042  I   -52.919     .277    -2.570     .340 -0.153150  0.347190 -0.3217350   -52.600    -2.300  
+ 3 3 3 52701.00 I  -.152880  .000024   .350202  .000029  I -.3222894  .0000050  0.6188 0.0034  I   -52.973     .277    -2.491     .340 -0.152810  0.350190 -0.3222940   -52.800    -2.300  
+ 3 3 4 52702.00 I  -.153092  .000026   .353080  .000025  I -.3229464  .0000052  0.6689 0.0036  I   -53.052     .211    -2.302     .340 -0.153040  0.353130 -0.3229420   -53.000    -2.200  
+ 3 3 5 52703.00 I  -.153422  .000036   .355842  .000018  I -.3236106  .0000051  0.6690 0.0036  I   -53.122     .307    -2.166     .340 -0.153370  0.355830 -0.3236090   -53.200    -2.200  
+ 3 3 6 52704.00 I  -.153763  .000039   .358316  .000018  I -.3242961  .0000051  0.7040 0.0035  I   -53.174     .307    -2.176     .340 -0.153700  0.358310 -0.3242970   -53.300    -2.200  
+ 3 3 7 52705.00 I  -.154354  .000038   .360787  .000017  I -.3250005  .0000048  0.6846 0.0039  I   -53.177     .307    -2.289     .340 -0.154090  0.360750 -0.3249950   -53.300    -2.200  
+ 3 3 8 52706.00 I  -.154534  .000047   .363477  .000020  I -.3256463  .0000059  0.6082 0.0032  I   -53.092     .300    -2.393     .340 -0.154490  0.363470 -0.3256600   -53.100    -2.300  
+ 3 3 9 52707.00 I  -.154768  .000044   .366339  .000024  I -.3262172  .0000043  0.5326 0.0036  I   -53.001     .255    -2.479     .340 -0.154690  0.366290 -0.3262470   -53.000    -2.400  
+ 3 310 52708.00 I  -.154911  .000043   .369337  .000029  I -.3267117  .0000041  0.4574 0.0027  I   -53.008     .255    -2.630     .340 -0.154860  0.369300 -0.3267360   -52.800    -2.600  
+ 3 311 52709.00 I  -.155587  .000042   .372368  .000040  I -.3271255  .0000034  0.3627 0.0027  I   -53.033     .184    -2.864     .111 -0.155520  0.372380 -0.3271240   -52.800    -2.700  
+ 3 312 52710.00 I  -.156437  .000052   .375474  .000041  I -.3274535  .0000034  0.3174 0.0024  I   -52.883     .184    -3.071     .101 -0.156400  0.375480 -0.3274420   -52.700    -2.900  
+ 3 313 52711.00 I  -.157026  .000054   .378713  .000041  I -.3277792  .0000034  0.3289 0.0023  I   -52.580     .184    -3.187     .101 -0.157030  0.378590 -0.3277560   -52.700    -3.100  
+ 3 314 52712.00 I  -.157691  .000058   .381330  .000041  I -.3281342  .0000032  0.4089 0.0024  I   -52.385     .184    -3.316     .101 -0.157290  0.381370 -0.3281250   -52.500    -3.300  
+ 3 315 52713.00 I  -.157076  .000065   .384012  .000042  I -.3286353  .0000034  0.6036 0.0021  I   -52.390     .181    -3.571     .340 -0.157110  0.384010 -0.3286480   -52.100    -3.400  
+ 3 316 52714.00 I  -.156943  .000073   .386870  .000040  I -.3293660  .0000028  0.8722 0.0025  I   -52.324     .157    -3.839     .340 -0.156910  0.386880 -0.3293890   -51.700    -3.500  
+ 3 317 52715.00 I  -.156743  .000078   .389761  .000063  I -.3303950  .0000036  1.1868 0.0021  I   -51.935     .168    -3.868     .340 -0.156650  0.389760 -0.3304080   -51.300    -3.600  
+ 3 318 52716.00 I  -.155936  .000066   .392624  .000065  I -.3317189  .0000032  1.4392 0.0023  I   -51.450     .115    -3.601     .114 -0.155950  0.392630 -0.3317120   -51.200    -3.600  
+ 3 319 52717.00 I  -.154945  .000064   .395674  .000066  I -.3332271  .0000030  1.5525 0.0022  I   -51.354     .740    -3.289     .340 -0.154890  0.395810 -0.3332170   -51.300    -3.600  
+ 3 320 52718.00 I  -.153875  .000060   .399566  .000065  I -.3347675  .0000029  1.4965 0.0020  I   -51.788     .740    -3.210     .340 -0.153840  0.399600 -0.3347600   -51.700    -3.500  
+ 3 321 52719.00 I  -.153268  .000057   .403517  .000069  I -.3361673  .0000026  1.2819 0.0019  I   -52.385     .740    -3.369     .340 -0.153080  0.403390 -0.3361610   -52.100    -3.500  
+ 3 322 52720.00 I  -.152322  .000046   .406664  .000083  I -.3373037  .0000026  0.9843 0.0019  I   -52.733     .740    -3.562     .340 -0.152280  0.406640 -0.3373110   -52.500    -3.500  
+ 3 323 52721.00 I  -.151525  .000051   .409589  .000049  I -.3381325  .0000027  0.6764 0.0019  I   -52.701     .740    -3.638     .340 -0.151440  0.409600 -0.3381530   -52.600    -3.500  
+ 3 324 52722.00 I  -.150576  .000048   .412494  .000048  I -.3386755  .0000028  0.4255 0.0021  I   -52.520     .740    -3.643     .340 -0.150480  0.412410 -0.3386950   -52.500    -3.500  
+ 3 325 52723.00 I  -.148982  .000039   .415439  .000048  I -.3390145  .0000033  0.2677 0.0022  I   -52.377     .740    -3.669     .340 -0.149060  0.415390 -0.3390110   -52.200    -3.600  
+ 3 326 52724.00 I  -.147578  .000046   .418309  .000058  I -.3392556  .0000033  0.2439 0.0024  I   -52.275     .740    -3.735     .340 -0.147490  0.418350 -0.3392450   -51.900    -3.800  
+ 3 327 52725.00 I  -.145779  .000046   .421212  .000059  I -.3395425  .0000034  0.3405 0.0023  I   -52.098     .740    -3.813     .340 -0.145670  0.421160 -0.3395480   -51.700    -3.900  
+ 3 328 52726.00 I  -.143452  .000042   .424036  .000052  I -.3399480  .0000033  0.4712 0.0024  I   -51.784     .740    -3.895     .340 -0.143350  0.424030 -0.3399430   -51.500    -3.900  
+ 3 329 52727.00 I  -.140613  .000039   .426885  .000055  I -.3404906  .0000034  0.6191 0.0024  I   -51.437     .102    -3.957     .340 -0.140570  0.426870 -0.3404850   -51.500    -3.800  
+ 3 330 52728.00 I  -.137880  .000051   .429885  .000054  I -.3411865  .0000035  0.7679 0.0027  I   -51.244     .183    -3.908     .340 -0.137770  0.429840 -0.3412060   -51.500    -3.700  
+ 3 331 52729.00 I  -.135448  .000048   .432832  .000050  I -.3420147  .0000041  0.8816 0.0025  I   -51.280     .183    -3.679     .340 -0.135380  0.432830 -0.3420440   -51.500    -3.500  
+ 3 4 1 52730.00 I  -.133253  .000052   .435574  .000036  I -.3429313  .0000036  0.9401 0.0028  I   -51.438     .459    -3.347     .149 -0.133250  0.435620 -0.3429290   -51.400    -3.400  
+ 3 4 2 52731.00 I  -.131337  .000052   .438596  .000042  I -.3438876  .0000039  0.9767 0.0027  I   -51.553     .522    -3.109     .152 -0.131170  0.438590 -0.3438740   -51.200    -3.300  
+ 3 4 3 52732.00 I  -.129096  .000055   .441736  .000043  I -.3448712  .0000039  0.9728 0.0027  I   -51.586     .522    -3.153     .152 -0.129050  0.441740 -0.3448740   -51.000    -3.400  
+ 3 4 4 52733.00 I  -.127130  .000055   .444678  .000040  I -.3458013  .0000038  0.8732 0.0028  I   -51.514     .522    -3.390     .152 -0.126950  0.444670 -0.3457940   -50.800    -3.500  
+ 3 4 5 52734.00 I  -.124629  .000045   .447542  .000035  I -.3466152  .0000039  0.7663 0.0025  I   -51.368     .560    -3.641     .151 -0.124580  0.447540 -0.3466170   -50.800    -3.700  
+ 3 4 6 52735.00 I  -.122177  .000053   .450759  .000034  I -.3473352  .0000032  0.6632 0.0029  I   -51.258     .454    -3.842     .144 -0.122080  0.450760 -0.3473310   -50.900    -3.900  
+ 3 4 7 52736.00 I  -.119826  .000058   .454061  .000046  I -.3479283  .0000042  0.5202 0.0026  I   -51.285     .454    -4.074     .144 -0.119780  0.454050 -0.3479260   -51.000    -4.100  
+ 3 4 8 52737.00 I  -.117581  .000064   .456994  .000053  I -.3483759  .0000041  0.3781 0.0029  I   -51.342     .265    -4.359     .111 -0.117590  0.456990 -0.3483700   -51.100    -4.200  
+ 3 4 9 52738.00 I  -.116238  .000061   .459671  .000056  I -.3487087  .0000041  0.3087 0.0029  I   -51.174     .225    -4.558     .104 -0.115960  0.459710 -0.3487010   -50.900    -4.300  
+ 3 410 52739.00 I  -.114690  .000060   .462343  .000060  I -.3490285  .0000041  0.3449 0.0029  I   -50.751     .225    -4.567     .104 -0.114680  0.462350 -0.3490260   -50.700    -4.400  
+ 3 411 52740.00 I  -.113539  .000059   .464834  .000059  I -.3494229  .0000041  0.4544 0.0034  I   -50.391     .225    -4.532     .104 -0.113230  0.464850 -0.3494180   -50.300    -4.600  
+ 3 412 52741.00 I  -.111408  .000064   .467511  .000063  I -.3499690  .0000054  0.6588 0.0025  I   -50.343     .290    -4.688     .340 -0.111410  0.467490 -0.3499570   -49.900    -4.700  
+ 3 413 52742.00 I  -.109399  .000055   .470304  .000041  I -.3507694  .0000029  0.9497 0.0030  I   -50.418     .250    -5.004     .340 -0.109290  0.470290 -0.3507470   -49.600    -4.900  
+ 3 414 52743.00 I  -.107268  .000048   .472883  .000034  I -.3518708  .0000028  1.2479 0.0024  I   -50.297     .151    -5.153     .340 -0.107170  0.472880 -0.3518560   -49.600    -4.900  
+ 3 415 52744.00 I  -.105224  .000044   .475253  .000038  I -.3532336  .0000037  1.4514 0.0024  I   -50.073     .189    -4.923     .340 -0.105260  0.475280 -0.3532260   -49.800    -4.800  
+ 3 416 52745.00 I  -.103976  .000048   .477415  .000038  I -.3547178  .0000040  1.4874 0.0032  I   -50.363     .136    -4.461     .340 -0.103790  0.477410 -0.3547140   -50.200    -4.600  
+ 3 417 52746.00 I  -.102241  .000048   .479238  .000039  I -.3561391  .0000053  1.3154 0.0034  I   -50.934     .136    -4.223     .340 -0.102200  0.479230 -0.3561370   -50.700    -4.300  
+ 3 418 52747.00 I  -.100347  .000046   .481207  .000040  I -.3573084  .0000054  1.0228 0.0062  I   -51.604     .136    -4.276     .340 -0.100290  0.481160 -0.3572750   -51.000    -4.200  
+ 3 419 52748.00 I  -.098110  .000046   .483411  .000051  I -.3581655  .0000113  0.6726 0.0043  I   -51.877     .130    -4.406     .340 -0.098020  0.483390 -0.3581420   -51.100    -4.200  
+ 3 420 52749.00 I  -.095579  .000059   .485678  .000071  I -.3586492  .0000067  0.3093 0.0067  I   -51.679     .124    -4.532     .340 -0.095490  0.485660 -0.3586890   -50.900    -4.400  
+ 3 421 52750.00 I  -.093129  .000060   .487711  .000085  I -.3588349  .0000071  0.0983 0.0045  I   -51.252     .435    -4.668     .256 -0.093040  0.487740 -0.3589020   -50.700    -4.700  
+ 3 422 52751.00 I  -.090755  .000056   .489518  .000091  I -.3588929  .0000060  0.0284 0.0042  I   -50.908     .405    -4.882     .238 -0.090700  0.489620 -0.3588960   -50.500    -4.900  
+ 3 423 52752.00 I  -.088601  .000058   .491625  .000089  I -.3589248  .0000045  0.0578 0.0037  I   -50.782     .352    -5.082     .204 -0.088490  0.491700 -0.3588860   -50.400    -5.100  
+ 3 424 52753.00 I  -.086073  .000056   .493677  .000089  I -.3590416  .0000044  0.1867 0.0026  I   -50.792     .352    -5.122     .204 -0.085900  0.493740 -0.3590440   -50.400    -5.100  
+ 3 425 52754.00 I  -.082835  .000055   .495853  .000083  I -.3593016  .0000025  0.3259 0.0025  I   -50.741     .352    -5.002     .204 -0.082770  0.495770 -0.3592960   -50.500    -4.900  
+ 3 426 52755.00 I  -.080055  .000051   .497996  .000080  I -.3596948  .0000025  0.4691 0.0016  I   -50.540     .413    -4.824     .234 -0.079990  0.497960 -0.3596890   -50.400    -4.700  
+ 3 427 52756.00 I  -.077683  .000063   .500185  .000068  I -.3602410  .0000019  0.6157 0.0015  I   -50.334     .137    -4.628     .340 -0.077590  0.500160 -0.3602360   -50.300    -4.500  
+ 3 428 52757.00 I  -.075264  .000065   .502396  .000062  I -.3609113  .0000018  0.7175 0.0013  I   -50.344     .133    -4.349     .340 -0.075190  0.502440 -0.3609080   -50.300    -4.200  
+ 3 429 52758.00 I  -.072945  .000060   .504336  .000057  I -.3616574  .0000017  0.7635 0.0013  I   -50.590     .132    -4.013     .340 -0.072840  0.504420 -0.3616510   -50.400    -4.000  
+ 3 430 52759.00 I  -.070452  .000057   .506168  .000059  I -.3624152  .0000018  0.7402 0.0013  I   -50.875     .132    -3.814     .340 -0.070270  0.506180 -0.3624080   -50.800    -3.900  
+ 3 5 1 52760.00 I  -.066884  .000056   .508018  .000058  I -.3631068  .0000020  0.6237 0.0014  I   -51.014     .132    -3.925     .340 -0.066850  0.508020 -0.3631080   -51.100    -3.900  
+ 3 5 2 52761.00 I  -.063134  .000054   .509849  .000043  I -.3636406  .0000022  0.4410 0.0022  I   -50.976     .132    -4.288     .340 -0.063020  0.509870 -0.3636450   -51.200    -4.100  
+ 3 5 3 52762.00 I  -.059460  .000045   .511574  .000040  I -.3639858  .0000039  0.2491 0.0026  I   -50.818     .164    -4.673     .340 -0.059380  0.511610 -0.3639710   -51.100    -4.400  
+ 3 5 4 52763.00 I  -.056188  .000041   .513428  .000044  I -.3641403  .0000047  0.0615 0.0038  I   -50.705     .173    -4.909     .340 -0.056110  0.513430 -0.3640950   -50.900    -4.800  
+ 3 5 5 52764.00 I  -.053251  .000048   .515445  .000043  I -.3641271  .0000066 -0.0712 0.0037  I   -50.721     .173    -5.059     .340 -0.053140  0.515420 -0.3640860   -50.700    -5.100  
+ 3 5 6 52765.00 I  -.050102  .000064   .517481  .000047  I -.3640312  .0000057 -0.1038 0.0042  I   -50.831     .213    -5.218     .340 -0.050100  0.517520 -0.3640240   -50.600    -5.200  
+ 3 5 7 52766.00 I  -.047177  .000062   .519684  .000067  I -.3639292  .0000052 -0.1072 0.0038  I   -50.830     .284    -5.344     .340 -0.047150  0.519710 -0.3639140   -50.400    -5.300  
+ 3 5 8 52767.00 I  -.044759  .000066   .521707  .000067  I -.3638449  .0000051 -0.0264 0.0035  I   -50.584     .284    -5.339     .340 -0.044670  0.521610 -0.3638350   -50.300    -5.300  
+ 3 5 9 52768.00 I  -.042316  .000062   .523206  .000065  I -.3639183  .0000048  0.1802 0.0036  I   -50.240     .284    -5.263     .340 -0.042140  0.523330 -0.3639110   -50.300    -5.300  
+ 3 510 52769.00 I  -.039744  .000061   .525015  .000067  I -.3642129  .0000052  0.4095 0.0030  I   -49.972     .486    -5.277     .103 -0.039680  0.525050 -0.3642000   -50.100    -5.400  
+ 3 511 52770.00 I  -.037767  .000052   .526629  .000061  I -.3647435  .0000035  0.6574 0.0028  I   -49.993     .330    -5.449     .340 -0.037690  0.526600 -0.3647260   -49.900    -5.400  
+ 3 512 52771.00 I  -.036128  .000046   .527945  .000077  I -.3655317  .0000022  0.9174 0.0022  I   -50.086     .300    -5.525     .340 -0.036010  0.527970 -0.3655100   -49.900    -5.400  
+ 3 513 52772.00 I  -.034478  .000036   .529264  .000063  I -.3665666  .0000028  1.1423 0.0019  I   -50.269     .106    -5.298     .340 -0.034400  0.529290 -0.3665540   -50.000    -5.300  
+ 3 514 52773.00 I  -.032655  .000033   .530583  .000072  I -.3677702  .0000030  1.2291 0.0022  I   -50.726     .134    -4.887     .340 -0.032560  0.530530 -0.3677770   -50.600    -5.100  
+ 3 515 52774.00 I  -.030523  .000035   .531887  .000073  I -.3689547  .0000033  1.1058 0.0022  I   -51.457     .134    -4.605     .340 -0.030430  0.531850 -0.3689700   -51.200    -4.800  
+ 3 516 52775.00 I  -.028293  .000036   .533225  .000075  I -.3699223  .0000031  0.8039 0.0036  I   -52.127     .134    -4.587     .340 -0.028250  0.533180 -0.3699180   -51.700    -4.600  
+ 3 517 52776.00 I  -.025981  .000045   .534353  .000088  I -.3705531  .0000065  0.4736 0.0032  I   -52.379     .157    -4.675     .340 -0.025890  0.534300 -0.3705330   -51.900    -4.500  
+ 3 518 52777.00 I  -.023693  .000043   .535468  .000064  I -.3709000  .0000055  0.2347 0.0043  I   -52.128     .143    -4.799     .118 -0.023560  0.535470 -0.3708860   -51.600    -4.700  
+ 3 519 52778.00 I  -.021358  .000051   .536500  .000059  I -.3710701  .0000055  0.1385 0.0035  I   -51.589     .150    -4.999     .112 -0.021250  0.536550 -0.3710520   -51.200    -4.900  
+ 3 520 52779.00 I  -.018620  .000054   .537522  .000045  I -.3712217  .0000043  0.1764 0.0034  I   -51.061     .117    -5.335     .128 -0.018500  0.537530 -0.3712130   -50.800    -5.200  
+ 3 521 52780.00 I  -.015410  .000064   .538602  .000043  I -.3714380  .0000039  0.2598 0.0029  I   -50.794     .119    -5.642     .115 -0.015430  0.538610 -0.3714480   -50.600    -5.400  
+ 3 522 52781.00 I  -.012603  .000064   .539688  .000042  I -.3717551  .0000039  0.3847 0.0026  I   -50.863     .119    -5.672     .115 -0.012490  0.539640 -0.3717310   -50.600    -5.500  
+ 3 523 52782.00 I  -.009866  .000058   .540575  .000035  I -.3722105  .0000033  0.5188 0.0026  I   -51.090     .119    -5.399     .115 -0.009800  0.540440 -0.3722000   -50.900    -5.400  
+ 3 524 52783.00 I  -.007004  .000061   .540972  .000036  I -.3727809  .0000035  0.6174 0.0024  I   -51.212     .122    -5.042     .340 -0.006960  0.540960 -0.3727690   -51.200    -5.100  
+ 3 525 52784.00 I  -.004106  .000052   .541211  .000052  I -.3734260  .0000034  0.6579 0.0025  I   -51.203     .102    -4.775     .102 -0.004030  0.541340 -0.3733950   -51.400    -4.800  
+ 3 526 52785.00 I  -.001056  .000053   .541528  .000074  I -.3740728  .0000035  0.6265 0.0027  I   -51.287     .131    -4.572     .340 -0.000940  0.541610 -0.3740370   -51.700    -4.500  
+ 3 527 52786.00 I   .002298  .000052   .541977  .000096  I -.3746654  .0000042  0.5543 0.0024  I   -51.609     .154    -4.366     .197  0.002370  0.541990 -0.3746410   -51.800    -4.300  
+ 3 528 52787.00 I   .005837  .000072   .542598  .000087  I -.3751705  .0000032  0.4494 0.0026  I   -51.982     .214    -4.234     .172  0.005880  0.542640 -0.3751620   -52.000    -4.300  
+ 3 529 52788.00 I   .009260  .000080   .543591  .000086  I -.3755531  .0000032  0.3113 0.0022  I   -52.260     .214    -4.353     .172  0.009390  0.543690 -0.3755520   -52.100    -4.500  
+ 3 530 52789.00 I   .012429  .000072   .544507  .000081  I -.3757844  .0000029  0.1470 0.0021  I   -52.338     .214    -4.716     .172  0.012550  0.544580 -0.3757760   -52.200    -4.700  
+ 3 531 52790.00 I   .015576  .000071   .545546  .000078  I -.3758359  .0000027 -0.0510 0.0019  I   -52.300     .210    -5.116     .167  0.015640  0.545500 -0.3758550   -52.100    -5.000  
+ 3 6 1 52791.00 I   .018416  .000063   .546437  .000067  I -.3756855  .0000025 -0.2398 0.0018  I   -52.244     .210    -5.342     .172  0.018520  0.546410 -0.3757030   -52.000    -5.100  
+ 3 6 2 52792.00 I   .021231  .000064   .547100  .000061  I -.3753793  .0000025 -0.3595 0.0020  I   -52.247     .200    -5.371     .340  0.021340  0.546990 -0.3753690   -51.900    -5.200  
+ 3 6 3 52793.00 I   .024311  .000037   .547652  .000042  I -.3749825  .0000030 -0.4311 0.0022  I   -52.359     .154    -5.329     .135  0.024380  0.547540 -0.3749710   -51.900    -5.200  
+ 3 6 4 52794.00 I   .027719  .000039   .547855  .000057  I -.3745271  .0000037 -0.4726 0.0025  I   -52.524     .280    -5.312     .148  0.027810  0.547850 -0.3745520   -52.000    -5.300  
+ 3 6 5 52795.00 I   .031430  .000044   .547882  .000058  I -.3740730  .0000040 -0.4068 0.0028  I   -52.585     .280    -5.308     .148  0.031540  0.547890 -0.3740740   -52.100    -5.400  
+ 3 6 6 52796.00 I   .034917  .000044   .547818  .000051  I -.3737576  .0000042 -0.2085 0.0033  I   -52.455     .280    -5.286     .148  0.035020  0.547910 -0.3737490   -52.300    -5.400  
+ 3 6 7 52797.00 I   .038130  .000034   .547817  .000051  I -.3736737  .0000052  0.0429 0.0029  I   -52.218     .369    -5.218     .196  0.038190  0.547810 -0.3736780   -52.300    -5.300  
+ 3 6 8 52798.00 I   .041333  .000064   .547855  .000050  I -.3738447  .0000041  0.2983 0.0033  I   -52.115     .323    -5.183     .161  0.041410  0.547810 -0.3738780   -52.400    -5.200  
+ 3 6 9 52799.00 I   .044736  .000066   .547922  .000047  I -.3742503  .0000040  0.4937 0.0027  I   -52.278     .323    -5.064     .161  0.044810  0.547930 -0.3742770   -52.600    -4.900  
+ 3 610 52800.00 I   .048281  .000072   .548027  .000046  I -.3747833  .0000036  0.5426 0.0026  I   -52.767     .418    -4.808     .340  0.048330  0.548050 -0.3747790   -52.800    -4.700  
+ 3 611 52801.00 I   .051673  .000073   .548061  .000051  I -.3752832  .0000033  0.4346 0.0022  I   -53.549     .637    -4.534     .148  0.051790  0.548060 -0.3752700   -53.100    -4.500  
+ 3 612 52802.00 I   .055139  .000073   .547756  .000058  I -.3756082  .0000026  0.1937 0.0020  I   -54.346     .637    -4.383     .148  0.055260  0.547750 -0.3756120   -53.400    -4.500  
+ 3 613 52803.00 I   .058556  .000073   .547201  .000053  I -.3756412  .0000024 -0.1354 0.0030  I   -54.883     .637    -4.430     .148  0.058730  0.547230 -0.3756430   -53.700    -4.500  
+ 3 614 52804.00 I   .062094  .000037   .546689  .000057  I -.3753452  .0000054 -0.4411 0.0025  I   -55.004     .766    -4.554     .182  0.062170  0.546630 -0.3753230   -54.000    -4.700  
+ 3 615 52805.00 I   .065802  .000052   .546171  .000058  I -.3747957  .0000044 -0.6369 0.0035  I   -54.781     .667    -4.661     .159  0.065870  0.546100 -0.3747700   -54.100    -4.900  
+ 3 616 52806.00 I   .069733  .000051   .545588  .000054  I -.3741172  .0000044 -0.6955 0.0027  I   -54.378     .664    -4.826     .158  0.069830  0.545570 -0.3741000   -54.100    -5.100  
+ 3 617 52807.00 I   .074052  .000069   .545079  .000057  I -.3734464  .0000033 -0.6290 0.0027  I   -53.954     .405    -5.129     .128  0.074140  0.545040 -0.3734360   -54.100    -5.300  
+ 3 618 52808.00 I   .078547  .000067   .544862  .000057  I -.3728845  .0000032 -0.4864 0.0023  I   -53.629     .428    -5.435     .184  0.078630  0.544840 -0.3728820   -53.900    -5.400  
+ 3 619 52809.00 I   .082892  .000068   .544756  .000066  I -.3724844  .0000033 -0.3112 0.0023  I   -53.717     .428    -5.479     .184  0.083140  0.544680 -0.3724930   -53.800    -5.300  
+ 3 620 52810.00 I   .087700  .000069   .544532  .000061  I -.3722530  .0000032 -0.1633 0.0024  I   -54.102     .428    -5.203     .184  0.087770  0.544520 -0.3722550   -53.800    -5.200  
+ 3 621 52811.00 I   .091956  .000069   .544384  .000065  I -.3721348  .0000034 -0.0846 0.0022  I   -54.527     .391    -4.827     .199  0.092070  0.544420 -0.3721070   -53.800    -5.000  
+ 3 622 52812.00 I   .095888  .000078   .544085  .000066  I -.3720627  .0000031 -0.0694 0.0027  I   -54.812     .260    -4.589     .177  0.095980  0.544080 -0.3720050   -54.100    -4.800  
+ 3 623 52813.00 I   .099772  .000063   .543616  .000063  I -.3719772  .0000041 -0.1107 0.0025  I   -55.043     .308    -4.499     .227  0.099880  0.543620 -0.3719230   -54.400    -4.600  
+ 3 624 52814.00 I   .103554  .000057   .542996  .000067  I -.3718238  .0000038 -0.2046 0.0028  I   -55.376     .328    -4.425     .197  0.103640  0.543060 -0.3718090   -54.900    -4.400  
+ 3 625 52815.00 I   .107221  .000062   .542491  .000075  I -.3715540  .0000039 -0.3405 0.0030  I   -55.789     .345    -4.346     .212  0.107340  0.542480 -0.3715590   -55.400    -4.400  
+ 3 626 52816.00 I   .110928  .000058   .542076  .000073  I -.3711389  .0000046 -0.4880 0.0030  I   -56.129     .345    -4.388     .212  0.111030  0.542050 -0.3711060   -55.900    -4.400  
+ 3 627 52817.00 I   .114722  .000059   .541683  .000071  I -.3705786  .0000045 -0.6337 0.0030  I   -56.334     .345    -4.638     .212  0.114840  0.541520 -0.3705660   -56.200    -4.500  
+ 3 628 52818.00 I   .118619  .000038   .541064  .000064  I -.3698746  .0000040 -0.7700 0.0028  I   -56.407     .402    -4.976     .234  0.118730  0.540990 -0.3698540   -56.400    -4.700  
+ 3 629 52819.00 I   .122623  .000072   .540447  .000067  I -.3690496  .0000032 -0.8731 0.0025  I   -56.445     .270    -5.234     .165  0.122740  0.540420 -0.3690180   -56.300    -4.900  
+ 3 630 52820.00 I   .126689  .000078   .539883  .000064  I -.3681479  .0000029 -0.9175 0.0023  I   -56.421     .259    -5.271     .158  0.126790  0.539860 -0.3681090   -56.200    -5.100  
+ 3 7 1 52821.00 I   .130468  .000079   .539313  .000048  I -.3672420  .0000032 -0.8796 0.0020  I   -56.414     .226    -5.141     .340  0.130560  0.539290 -0.3672270   -56.200    -5.200  
+ 3 7 2 52822.00 I   .133821  .000080   .538582  .000051  I -.3664106  .0000027 -0.7761 0.0021  I   -56.477     .204    -5.030     .107  0.133980  0.538570 -0.3664210   -56.200    -5.100  
+ 3 7 3 52823.00 I   .136813  .000080   .537563  .000051  I -.3657010  .0000027 -0.6389 0.0020  I   -56.630     .204    -4.988     .107  0.137040  0.537500 -0.3656920   -56.400    -5.000  
+ 3 7 4 52824.00 I   .139880  .000072   .535923  .000049  I -.3651475  .0000029 -0.4576 0.0027  I   -56.681     .204    -5.024     .107  0.139980  0.535890 -0.3651290   -56.500    -4.800  
+ 3 7 5 52825.00 I   .143073  .000046   .534157  .000048  I -.3647861  .0000046 -0.2753 0.0029  I   -56.584     .238    -5.033     .101  0.143200  0.534100 -0.3647340   -56.500    -4.700  
+ 3 7 6 52826.00 I   .146403  .000056   .532623  .000055  I -.3645739  .0000050 -0.1620 0.0039  I   -56.504     .200    -4.928     .340  0.146510  0.532570 -0.3644890   -56.600    -4.600  
+ 3 7 7 52827.00 I   .149616  .000049   .531187  .000055  I -.3644331  .0000064 -0.1359 0.0031  I   -56.690     .740    -4.711     .340  0.149680  0.531190 -0.3643570   -56.800    -4.500  
+ 3 7 8 52828.00 I   .153014  .000057   .529717  .000057  I -.3642754  .0000038 -0.1901 0.0037  I   -57.246     .217    -4.463     .340  0.153090  0.529730 -0.3642560   -57.000    -4.500  
+ 3 7 9 52829.00 I   .156652  .000066   .528214  .000059  I -.3640177  .0000038 -0.3499 0.0027  I   -58.023     .280    -4.301     .340  0.156730  0.528180 -0.3640300   -57.400    -4.400  
+ 3 710 52830.00 I   .160400  .000070   .526692  .000060  I -.3635461  .0000037 -0.5983 0.0025  I   -58.701     .280    -4.300     .340  0.160450  0.526650 -0.3635320   -57.800    -4.400  
+ 3 711 52831.00 I   .163893  .000069   .525208  .000058  I -.3628283  .0000033 -0.8250 0.0022  I   -59.026     .280    -4.431     .340  0.164060  0.525270 -0.3628150   -58.100    -4.400  
+ 3 712 52832.00 I   .167447  .000065   .523922  .000055  I -.3619299  .0000025 -0.9503 0.0020  I   -58.947     .328    -4.642     .340  0.167540  0.523940 -0.3619300   -58.200    -4.400  
+ 3 713 52833.00 I   .170540  .000070   .522624  .000054  I -.3609656  .0000021 -0.9618 0.0018  I   -58.730     .298    -4.737     .129  0.170640  0.522650 -0.3609700   -58.100    -4.400  
+ 3 714 52834.00 I   .173119  .000070   .521200  .000052  I -.3600377  .0000025 -0.8791 0.0015  I   -58.502     .276    -4.826     .130  0.173240  0.521190 -0.3600350   -58.000    -4.500  
+ 3 715 52835.00 I   .175615  .000055   .519726  .000043  I -.3592355  .0000021 -0.7122 0.0016  I   -58.316     .380    -4.986     .138  0.175690  0.519660 -0.3592290   -58.000    -4.800  
+ 3 716 52836.00 I   .178216  .000065   .518207  .000044  I -.3586320  .0000020 -0.4892 0.0015  I   -58.214     .454    -5.159     .140  0.178280  0.518100 -0.3586240   -58.200    -5.100  
+ 3 717 52837.00 I   .180961  .000061   .516617  .000045  I -.3582506  .0000021 -0.2857 0.0014  I   -58.310     .454    -5.182     .140  0.180970  0.516510 -0.3582320   -58.500    -5.200  
+ 3 718 52838.00 I   .183442  .000058   .514713  .000042  I -.3580347  .0000019 -0.1600 0.0015  I   -58.665     .454    -4.996     .140  0.183560  0.514700 -0.3580200   -59.000    -5.000  
+ 3 719 52839.00 I   .186304  .000056   .512678  .000044  I -.3579064  .0000020 -0.1070 0.0014  I   -59.164     .523    -4.774     .340  0.186360  0.512610 -0.3579100   -59.500    -4.900  
+ 3 720 52840.00 I   .189291  .000067   .510645  .000045  I -.3577985  .0000020 -0.1208 0.0015  I   -59.610     .490    -4.637     .340  0.189360  0.510580 -0.3577950   -59.900    -4.700  
+ 3 721 52841.00 I   .191970  .000070   .508531  .000044  I -.3576469  .0000023 -0.1883 0.0022  I   -59.920     .518    -4.622     .340  0.192020  0.508560 -0.3576290   -60.300    -4.600  
+ 3 722 52842.00 I   .194308  .000050   .506211  .000049  I -.3574124  .0000040 -0.2841 0.0026  I   -60.157     .311    -4.602     .340  0.194430  0.506240 -0.3573990   -60.400    -4.500  
+ 3 723 52843.00 I   .197124  .000062   .503868  .000054  I -.3570731  .0000047 -0.3965 0.0032  I   -60.399     .340    -4.523     .179  0.197180  0.503790 -0.3570760   -60.400    -4.500  
+ 3 724 52844.00 I   .199921  .000062   .501622  .000059  I -.3566195  .0000049 -0.5085 0.0034  I   -60.655     .340    -4.497     .179  0.200020  0.501600 -0.3566200   -60.300    -4.500  
+ 3 725 52845.00 I   .202476  .000064   .499419  .000064  I -.3560571  .0000049 -0.6175 0.0046  I   -60.884     .340    -4.654     .179  0.202520  0.499500 -0.3560510   -60.300    -4.500  
+ 3 726 52846.00 I   .204685  .000051   .497220  .000070  I -.3554030  .0000079 -0.6711 0.0044  I   -60.932     .355    -4.999     .229  0.204770  0.497210 -0.3554020   -60.400    -4.600  
+ 3 727 52847.00 I   .206809  .000062   .494817  .000074  I -.3547428  .0000073 -0.6410 0.0051  I   -60.930     .390    -5.298     .194  0.206880  0.494770 -0.3547510   -60.600    -4.800  
+ 3 728 52848.00 I   .208980  .000069   .492100  .000073  I -.3541361  .0000066 -0.5655 0.0046  I   -60.779     .390    -5.410     .207  0.209050  0.492120 -0.3541420   -60.700    -5.000  
+ 3 729 52849.00 I   .211303  .000059   .489142  .000070  I -.3536200  .0000056 -0.4653 0.0042  I   -60.583     .409    -5.305     .340  0.211370  0.489240 -0.3536150   -60.800    -5.200  
+ 3 730 52850.00 I   .213815  .000065   .486413  .000070  I -.3532271  .0000053 -0.3001 0.0040  I   -60.430     .370    -5.113     .340  0.213900  0.486430 -0.3532260   -60.700    -5.200  
+ 3 731 52851.00 I   .216500  .000063   .483887  .000055  I -.3530459  .0000057 -0.0565 0.0040  I   -60.469     .370    -4.992     .340  0.216580  0.483900 -0.3530440   -60.500    -5.200  
+ 3 8 1 52852.00 I   .219112  .000056   .481538  .000058  I -.3531033  .0000060  0.1548 0.0047  I   -60.570     .370    -5.017     .340  0.219220  0.481570 -0.3530920   -60.300    -5.100  
+ 3 8 2 52853.00 I   .221386  .000042   .479513  .000049  I -.3533306  .0000075  0.2915 0.0046  I   -60.663     .116    -5.101     .340  0.221430  0.479470 -0.3533400   -60.300    -5.000  
+ 3 8 3 52854.00 I   .223071  .000054   .477318  .000053  I -.3536689  .0000071  0.3761 0.0051  I   -60.785     .740    -5.106     .340  0.223150  0.477200 -0.3537200   -60.500    -4.900  
+ 3 8 4 52855.00 I   .224748  .000056   .474861  .000051  I -.3540496  .0000069  0.3611 0.0053  I   -61.041     .740    -4.981     .340  0.224830  0.474730 -0.3540840   -60.900    -5.100  
+ 3 8 5 52856.00 I   .226443  .000051   .472367  .000048  I -.3543334  .0000080  0.1730 0.0051  I   -61.473     .156    -4.800     .101  0.226500  0.472310 -0.3543240   -61.300    -4.700  
+ 3 8 6 52857.00 I   .228150  .000054   .469614  .000060  I -.3543726  .0000074 -0.0840 0.0053  I   -61.973     .162    -4.676     .340  0.228230  0.469600 -0.3543660   -61.700    -4.600  
+ 3 8 7 52858.00 I   .230141  .000059   .466612  .000053  I -.3541745  .0000069 -0.3135 0.0046  I   -62.345     .162    -4.658     .340  0.230230  0.466580 -0.3541780   -62.000    -4.600  
+ 3 8 8 52859.00 I   .232124  .000064   .463704  .000055  I -.3537567  .0000056 -0.5096 0.0039  I   -62.450     .162    -4.723     .340  0.232240  0.463660 -0.3537490   -62.200    -4.700  
+ 3 8 9 52860.00 I   .234060  .000039   .461100  .000076  I -.3531909  .0000036 -0.5988 0.0033  I   -62.304     .178    -4.828     .340  0.234120  0.461030 -0.3531860   -62.200    -4.700  
+ 3 810 52861.00 I   .235882  .000049   .458865  .000093  I -.3526009  .0000035 -0.5626 0.0025  I   -62.063     .185    -4.892     .340  0.235980  0.458830 -0.3525970   -62.000    -4.800  
+ 3 811 52862.00 I   .237707  .000047   .456702  .000093  I -.3521001  .0000035 -0.4230 0.0022  I   -61.866     .269    -4.930     .126  0.237790  0.456760 -0.3520940   -61.800    -4.900  
+ 3 812 52863.00 I   .239487  .000044   .454309  .000095  I -.3517812  .0000028 -0.2043 0.0022  I   -61.759     .290    -4.952     .139  0.239600  0.454460 -0.3517730   -61.500    -4.900  
+ 3 813 52864.00 I   .241314  .000053   .452088  .000096  I -.3516894  .0000027  0.0082 0.0021  I   -61.729     .331    -4.936     .123  0.241370  0.452080 -0.3516780   -61.300    -5.000  
+ 3 814 52865.00 I   .243093  .000056   .449784  .000095  I -.3517784  .0000031  0.1630 0.0020  I   -61.792     .331    -4.837     .123  0.243160  0.449760 -0.3517770   -61.300    -4.900  
+ 3 815 52866.00 I   .244570  .000059   .447324  .000091  I -.3520012  .0000029  0.2750 0.0026  I   -62.004     .331    -4.668     .123  0.244710  0.447420 -0.3519870   -61.500    -4.700  
+ 3 816 52867.00 I   .246011  .000053   .444752  .000071  I -.3523064  .0000042  0.3208 0.0026  I   -62.371     .369    -4.537     .124  0.246050  0.444730 -0.3523300   -61.800    -4.500  
+ 3 817 52868.00 I   .247532  .000064   .441804  .000078  I -.3526161  .0000043  0.2865 0.0030  I   -62.774     .284    -4.520     .340  0.247620  0.441710 -0.3526850   -62.200    -4.400  
+ 3 818 52869.00 I   .249124  .000069   .438677  .000078  I -.3528512  .0000044  0.1676 0.0037  I   -63.052     .284    -4.575     .340  0.249190  0.438650 -0.3529040   -62.600    -4.400  
+ 3 819 52870.00 I   .250680  .000060   .435417  .000076  I -.3529173  .0000060 -0.0534 0.0035  I   -63.148     .187    -4.583     .126  0.250720  0.435430 -0.3529140   -63.000    -4.400  
+ 3 820 52871.00 I   .252254  .000061   .432462  .000075  I -.3527417  .0000055 -0.2824 0.0045  I   -63.177     .223    -4.521     .147  0.252330  0.432380 -0.3527250   -63.200    -4.500  
+ 3 821 52872.00 I   .253774  .000059   .429753  .000077  I -.3523732  .0000068 -0.4492 0.0042  I   -63.280     .223    -4.508     .147  0.253840  0.429680 -0.3523710   -63.300    -4.700  
+ 3 822 52873.00 I   .254928  .000054   .427262  .000067  I -.3518548  .0000064 -0.5814 0.0054  I   -63.427     .223    -4.657     .147  0.255050  0.427260 -0.3518440   -63.400    -4.800  
+ 3 823 52874.00 I   .255947  .000040   .424872  .000060  I -.3512339  .0000083 -0.6430 0.0049  I   -63.524     .351    -4.911     .174  0.255980  0.424890 -0.3512340   -63.300    -4.900  
+ 3 824 52875.00 I   .256958  .000042   .422061  .000081  I -.3505935  .0000073 -0.6306 0.0065  I   -63.294     .339    -5.146     .144  0.257020  0.422020 -0.3506380   -63.300    -5.000  
+ 3 825 52876.00 I   .258249  .000045   .418880  .000085  I -.3499998  .0000099 -0.5371 0.0056  I   -62.925     .383    -5.216     .135  0.258310  0.418840 -0.3500360   -63.100    -5.000  
+ 3 826 52877.00 I   .259210  .000049   .415542  .000081  I -.3495442  .0000085 -0.3689 0.0060  I   -62.620     .377    -5.104     .340  0.259350  0.415660 -0.3495410   -62.900    -5.000  
+ 3 827 52878.00 I   .260146  .000064   .412296  .000080  I -.3493055  .0000067 -0.0703 0.0055  I   -62.496     .330    -4.889     .340  0.260160  0.412320 -0.3493060   -62.700    -4.900  
+ 3 828 52879.00 I   .261170  .000065   .409038  .000080  I -.3494278  .0000070  0.3008 0.0048  I   -62.525     .334    -4.691     .340  0.261270  0.409070 -0.3493980   -62.500    -4.800  
+ 3 829 52880.00 I   .262134  .000067   .406067  .000072  I -.3498745  .0000069  0.5742 0.0051  I   -62.673     .334    -4.655     .340  0.262410  0.406130 -0.3498590   -62.400    -4.700  
+ 3 830 52881.00 I   .263337  .000073   .403308  .000053  I -.3505380  .0000075  0.7329 0.0043  I   -62.908     .291    -4.780     .340  0.263420  0.403290 -0.3505460   -62.400    -4.700  
+ 3 831 52882.00 I   .264430  .000064   .400496  .000055  I -.3512890  .0000050  0.7375 0.0043  I   -63.199     .164    -4.951     .136  0.264490  0.400450 -0.3513040   -62.700    -4.600  
+ 3 9 1 52883.00 I   .265244  .000064   .397526  .000047  I -.3519601  .0000040  0.5833 0.0031  I   -63.490     .170    -5.018     .127  0.265340  0.397440 -0.3519670   -63.000    -4.600  
+ 3 9 2 52884.00 I   .265514  .000047   .394414  .000040  I -.3524292  .0000035  0.3497 0.0025  I   -63.733     .299    -4.937     .148  0.265610  0.394360 -0.3524220   -63.300    -4.500  
+ 3 9 3 52885.00 I   .265529  .000049   .391195  .000047  I -.3526473  .0000031  0.0793 0.0024  I   -63.905     .364    -4.779     .120  0.265540  0.391190 -0.3526340   -63.500    -4.500  
+ 3 9 4 52886.00 I   .265386  .000049   .387938  .000051  I -.3525985  .0000034 -0.1589 0.0023  I   -63.983     .364    -4.648     .120  0.265490  0.387910 -0.3525990   -63.600    -4.500  
+ 3 9 5 52887.00 I   .265113  .000048   .384441  .000050  I -.3523713  .0000034 -0.2716 0.0022  I   -63.941     .364    -4.591     .120  0.265320  0.384430 -0.3523630   -63.500    -4.600  
+ 3 9 6 52888.00 I   .265182  .000048   .380910  .000043  I -.3520822  .0000027 -0.3037 0.0022  I   -63.670     .252    -4.587     .101  0.265190  0.380840 -0.3520800   -63.300    -4.600  
+ 3 9 7 52889.00 I   .265053  .000057   .377505  .000058  I -.3517877  .0000029 -0.2645 0.0020  I   -63.406     .240    -4.632     .340  0.265120  0.377410 -0.3518070   -63.100    -4.700  
+ 3 9 8 52890.00 I   .264911  .000058   .374278  .000057  I -.3515887  .0000030 -0.1189 0.0021  I   -63.134     .240    -4.670     .340  0.264960  0.374190 -0.3515900   -62.900    -4.700  
+ 3 9 9 52891.00 I   .264699  .000054   .371156  .000068  I -.3515693  .0000030  0.0850 0.0020  I   -62.942     .201    -4.645     .340  0.264780  0.371110 -0.3515600   -62.800    -4.600  
+ 3 910 52892.00 I   .264511  .000053   .367894  .000064  I -.3517499  .0000027  0.2625 0.0020  I   -62.871     .220    -4.506     .340  0.264640  0.367820 -0.3517590   -62.800    -4.500  
+ 3 911 52893.00 I   .264605  .000054   .364586  .000065  I -.3520732  .0000027  0.3768 0.0018  I   -62.895     .220    -4.260     .340  0.264740  0.364530 -0.3520710   -62.900    -4.300  
+ 3 912 52894.00 I   .264519  .000052   .361280  .000066  I -.3524733  .0000024  0.4005 0.0024  I   -62.988     .220    -4.007     .340  0.264560  0.361260 -0.3524620   -63.100    -4.100  
+ 3 913 52895.00 I   .264233  .000041   .357987  .000064  I -.3528459  .0000040  0.3393 0.0022  I   -63.229     .265    -3.929     .340  0.264300  0.357910 -0.3528470   -63.300    -3.900  
+ 3 914 52896.00 I   .264223  .000047   .354809  .000067  I -.3531448  .0000036  0.2568 0.0032  I   -63.451     .308    -4.011     .340  0.264280  0.354740 -0.3531440   -63.400    -3.800  
+ 3 915 52897.00 I   .264230  .000044   .351772  .000050  I -.3533557  .0000050  0.1627 0.0028  I   -63.600     .295    -4.181     .156  0.264320  0.351740 -0.3533550   -63.600    -3.900  
+ 3 916 52898.00 I   .264141  .000044   .348778  .000052  I -.3534664  .0000042  0.0571 0.0032  I   -63.576     .298    -4.279     .184  0.264230  0.348800 -0.3534580   -63.600    -4.100  
+ 3 917 52899.00 I   .264034  .000047   .345932  .000049  I -.3534705  .0000041 -0.0465 0.0030  I   -63.473     .299    -4.285     .161  0.264090  0.345900 -0.3534420   -63.600    -4.300  
+ 3 918 52900.00 I   .264003  .000050   .342995  .000049  I -.3533594  .0000044 -0.1919 0.0029  I   -63.463     .299    -4.331     .161  0.264010  0.342920 -0.3533250   -63.400    -4.500  
+ 3 919 52901.00 I   .263699  .000050   .339808  .000051  I -.3531016  .0000040 -0.2925 0.0031  I   -63.510     .299    -4.500     .161  0.263760  0.339770 -0.3530900   -63.100    -4.600  
+ 3 920 52902.00 I   .263057  .000045   .336422  .000048  I -.3528096  .0000043 -0.2876 0.0027  I   -63.385     .259    -4.688     .185  0.263100  0.336400 -0.3528150   -62.700    -4.700  
+ 3 921 52903.00 I   .262536  .000056   .332948  .000072  I -.3525464  .0000035 -0.2227 0.0030  I   -62.909     .227    -4.743     .113  0.262570  0.332800 -0.3525610   -62.300    -4.700  
+ 3 922 52904.00 I   .262588  .000059   .329728  .000078  I -.3524015  .0000041 -0.0457 0.0035  I   -62.352     .226    -4.629     .105  0.262610  0.329590 -0.3523970   -61.900    -4.600  
+ 3 923 52905.00 I   .262483  .000062   .326855  .000106  I -.3524815  .0000060  0.2110 0.0030  I   -62.056     .116    -4.439     .101  0.262550  0.326880 -0.3524690   -61.700    -4.500  
+ 3 924 52906.00 I   .261881  .000073   .324088  .000096  I -.3528272  .0000044  0.4787 0.0038  I   -62.092     .126    -4.242     .118  0.261930  0.324050 -0.3528410   -61.700    -4.400  
+ 3 925 52907.00 I   .260919  .000073   .320822  .000085  I -.3534321  .0000048  0.7259 0.0033  I   -62.279     .126    -4.059     .118  0.260980  0.320860 -0.3534380   -61.800    -4.200  
+ 3 926 52908.00 I   .260058  .000080   .317272  .000086  I -.3542544  .0000048  0.8992 0.0042  I   -62.478     .126    -3.950     .118  0.260120  0.317310 -0.3542520   -62.100    -4.100  
+ 3 927 52909.00 I   .259522  .000071   .314021  .000064  I -.3551846  .0000069  0.9349 0.0035  I   -62.681     .167    -4.013     .124  0.259650  0.313970 -0.3551960   -62.400    -4.100  
+ 3 928 52910.00 I   .259354  .000067   .311099  .000066  I -.3560733  .0000050  0.8178 0.0043  I   -62.868     .236    -4.232     .134  0.259430  0.311050 -0.3560970   -62.700    -4.100  
+ 3 929 52911.00 I   .259186  .000062   .308482  .000064  I -.3567895  .0000051  0.6085 0.0034  I   -62.960     .236    -4.424     .134  0.259270  0.308390 -0.3568040   -62.900    -4.200  
+ 3 930 52912.00 I   .259199  .000043   .306212  .000053  I -.3572758  .0000045  0.3558 0.0032  I   -62.943     .274    -4.416     .128  0.259180  0.306160 -0.3572700   -63.000    -4.300  
+ 310 1 52913.00 I   .258446  .000051   .304036  .000064  I -.3575077  .0000039  0.1228 0.0029  I   -62.900     .232    -4.236     .131  0.258530  0.304000 -0.3575060   -63.100    -4.300  
+ 310 2 52914.00 I   .257373  .000050   .301433  .000064  I -.3575563  .0000037 -0.0054 0.0023  I   -62.886     .232    -4.063     .131  0.257380  0.301390 -0.3575580   -63.000    -4.200  
+ 310 3 52915.00 I   .256284  .000049   .298629  .000065  I -.3575382  .0000024 -0.0096 0.0030  I   -62.846     .232    -4.019     .131  0.256250  0.298690 -0.3575300   -62.800    -4.200  
+ 310 4 52916.00 I   .254925  .000047   .296135  .000058  I -.3575692  .0000046  0.0824 0.0027  I   -62.688     .142    -4.072     .160  0.254990  0.296150 -0.3575800   -62.400    -4.100  
+ 310 5 52917.00 I   .253564  .000054   .293452  .000058  I -.3577244  .0000049  0.2384 0.0033  I   -62.392     .127    -4.127     .157  0.253630  0.293450 -0.3577210   -62.000    -4.000  
+ 310 6 52918.00 I   .252217  .000055   .290461  .000056  I -.3580632  .0000048  0.4459 0.0049  I   -62.034     .127    -4.134     .157  0.252280  0.290420 -0.3580400   -61.600    -4.000  
+ 310 7 52919.00 I   .250916  .000048   .287405  .000046  I -.3586134  .0000084  0.6449 0.0040  I   -61.739     .151    -4.070     .182  0.250960  0.287370 -0.3586000   -61.400    -3.800  
+ 310 8 52920.00 I   .249548  .000045   .284675  .000051  I -.3593205  .0000065  0.7465 0.0053  I   -61.621     .157    -3.933     .181  0.249600  0.284630 -0.3593330   -61.500    -3.700  
+ 310 9 52921.00 I   .248049  .000043   .282079  .000053  I -.3600671  .0000065  0.7304 0.0043  I   -61.614     .157    -3.630     .181  0.248110  0.282020 -0.3600770   -61.500    -3.600  
+ 31010 52922.00 I   .246399  .000042   .279260  .000055  I -.3607698  .0000057  0.6799 0.0041  I   -61.646     .157    -3.308     .181  0.246430  0.279220 -0.3607580   -61.300    -3.400  
+ 31011 52923.00 I   .244458  .000037   .276479  .000057  I -.3614181  .0000049  0.6031 0.0035  I   -61.667     .138    -3.140     .147  0.244420  0.276420 -0.3614210   -61.100    -3.300  
+ 31012 52924.00 I   .242041  .000041   .273677  .000061  I -.3619580  .0000041  0.4724 0.0028  I   -61.667     .147    -3.262     .152  0.242100  0.273640 -0.3619840   -61.100    -3.300  
+ 31013 52925.00 I   .239770  .000038   .270720  .000060  I -.3623574  .0000028  0.3253 0.0025  I   -61.634     .135    -3.533     .138  0.239820  0.270690 -0.3623750   -61.200    -3.400  
+ 31014 52926.00 I   .237782  .000038   .267465  .000058  I -.3626070  .0000028  0.1733 0.0019  I   -61.524     .177    -3.742     .115  0.237790  0.267490 -0.3625980   -61.300    -3.600  
+ 31015 52927.00 I   .235760  .000048   .264252  .000064  I -.3627098  .0000027  0.0387 0.0019  I   -61.380     .219    -3.818     .107  0.235850  0.264180 -0.3626930   -61.300    -3.800  
+ 31016 52928.00 I   .233828  .000049   .261079  .000063  I -.3626966  .0000027 -0.0591 0.0019  I   -61.312     .219    -3.880     .107  0.233880  0.261050 -0.3626940   -61.200    -4.000  
+ 31017 52929.00 I   .231726  .000054   .257910  .000063  I -.3626117  .0000027 -0.0965 0.0018  I   -61.273     .219    -4.010     .107  0.231840  0.257960 -0.3626070   -60.900    -4.100  
+ 31018 52930.00 I   .229788  .000052   .255053  .000063  I -.3625381  .0000025 -0.0305 0.0017  I   -61.048     .259    -4.108     .340  0.229830  0.254970 -0.3625330   -60.500    -4.000  
+ 31019 52931.00 I   .227911  .000056   .252528  .000058  I -.3625861  .0000021  0.1416 0.0016  I   -60.491     .259    -3.997     .340  0.227960  0.252450 -0.3626020   -60.000    -3.900  
+ 31020 52932.00 I   .225989  .000058   .250050  .000058  I -.3628492  .0000021  0.3973 0.0017  I   -59.908     .244    -3.728     .340  0.226020  0.250040 -0.3628760   -59.600    -3.700  
+ 31021 52933.00 I   .224050  .000066   .247358  .000060  I -.3633940  .0000027  0.6930 0.0018  I   -59.673     .196    -3.487     .340  0.224070  0.247350 -0.3633930   -59.400    -3.400  
+ 31022 52934.00 I   .221858  .000080   .244719  .000071  I -.3642305  .0000029  0.9746 0.0019  I   -59.826     .175    -3.349     .340  0.221970  0.244690 -0.3641960   -59.500    -3.200  
+ 31023 52935.00 I   .220267  .000077   .242197  .000071  I -.3653286  .0000027  1.2122 0.0020  I   -60.112     .175    -3.211     .340  0.220270  0.242220 -0.3652860   -59.700    -3.000  
+ 31024 52936.00 I   .219367  .000076   .239953  .000066  I -.3666147  .0000027  1.3290 0.0028  I   -60.338     .175    -3.020     .340  0.219290  0.239920 -0.3665910   -60.100    -2.900  
+ 31025 52937.00 I   .218599  .000082   .237824  .000080  I -.3679262  .0000049  1.2645 0.0028  I   -60.532     .179    -2.919     .340  0.218640  0.237720 -0.3679320   -60.300    -2.900  
+ 31026 52938.00 I   .218068  .000074   .235794  .000085  I -.3690870  .0000048  1.0298 0.0036  I   -60.561     .159    -3.018     .340  0.218130  0.235680 -0.3690970   -60.300    -2.900  
+ 31027 52939.00 I   .217046  .000066   .233766  .000079  I -.3699470  .0000054  0.6786 0.0038  I   -60.390     .287    -3.198     .135  0.217130  0.233710 -0.3699450   -60.200    -3.000  
+ 31028 52940.00 I   .215529  .000041   .231563  .000061  I -.3704375  .0000059  0.3074 0.0041  I   -60.090     .327    -3.224     .196  0.215490  0.231520 -0.3704240   -60.000    -3.100  
+ 31029 52941.00 I   .213730  .000046   .229233  .000065  I -.3705941  .0000061  0.0333 0.0043  I   -59.883     .287    -3.071     .217  0.213800  0.229150 -0.3705920   -59.900    -3.200  
+ 31030 52942.00 I   .212408  .000047   .226978  .000068  I -.3705533  .0000062 -0.0932 0.0043  I   -59.873     .287    -2.958     .217  0.212460  0.226900 -0.3705570   -59.700    -3.300  
+ 31031 52943.00 I   .210965  .000048   .225003  .000059  I -.3704455  .0000060 -0.1065 0.0051  I   -59.915     .287    -3.040     .217  0.211060  0.225010 -0.3704340   -59.600    -3.400  
+ 311 1 52944.00 I   .209202  .000048   .223344  .000043  I -.3703748  .0000082 -0.0165 0.0044  I   -59.866     .352    -3.211     .255  0.209260  0.223310 -0.3703860   -59.400    -3.400  
+ 311 2 52945.00 I   .207198  .000050   .221632  .000052  I -.3704382  .0000064  0.1505 0.0052  I   -59.622     .182    -3.240     .188  0.207240  0.221550 -0.3704470   -59.400    -3.200  
+ 311 3 52946.00 I   .205026  .000051   .219556  .000051  I -.3706830  .0000063  0.3392 0.0043  I   -59.334     .298    -3.088     .177  0.205080  0.219480 -0.3706680   -59.200    -3.100  
+ 311 4 52947.00 I   .202693  .000065   .217022  .000067  I -.3711065  .0000058  0.4975 0.0041  I   -59.110     .319    -2.873     .142  0.202740  0.216980 -0.3710900   -59.000    -2.900  
+ 311 5 52948.00 I   .200301  .000062   .214160  .000066  I -.3716507  .0000054  0.5740 0.0039  I   -59.009     .294    -2.665     .128  0.200360  0.214070 -0.3716580   -58.900    -2.800  
+ 311 6 52949.00 I   .198096  .000057   .211227  .000067  I -.3722245  .0000052  0.5605 0.0037  I   -59.020     .294    -2.429     .128  0.198250  0.211100 -0.3722220   -58.900    -2.700  
+ 311 7 52950.00 I   .196256  .000056   .208248  .000067  I -.3727506  .0000050  0.4838 0.0040  I   -59.050     .294    -2.170     .128  0.196320  0.208230 -0.3727430   -58.900    -2.300  
+ 311 8 52951.00 I   .194561  .000057   .205709  .000075  I -.3731858  .0000061  0.3880 0.0038  I   -59.077     .338    -2.023     .143  0.194580  0.205620 -0.3731760   -58.900    -2.000  
+ 311 9 52952.00 I   .192665  .000057   .203467  .000080  I -.3735243  .0000056  0.2851 0.0043  I   -58.943     .275    -2.138     .147  0.192750  0.203370 -0.3735510   -58.900    -2.100  
+ 31110 52953.00 I   .190182  .000045   .201124  .000068  I -.3737455  .0000061  0.1508 0.0044  I   -58.800     .276    -2.438     .340  0.190250  0.201140 -0.3737820   -58.900    -2.300  
+ 31111 52954.00 I   .187191  .000039   .198488  .000071  I -.3738187  .0000067 -0.0051 0.0044  I   -58.676     .291    -2.706     .103  0.187240  0.198490 -0.3738110   -58.800    -2.600  
+ 31112 52955.00 I   .184483  .000056   .196120  .000076  I -.3737645  .0000063 -0.0733 0.0046  I   -58.557     .323    -2.815     .340  0.184520  0.195980 -0.3737240   -58.600    -2.800  
+ 31113 52956.00 I   .182109  .000058   .193783  .000074  I -.3737076  .0000062 -0.0348 0.0041  I   -58.441     .323    -2.843     .340  0.182190  0.193700 -0.3736830   -58.300    -2.900  
+ 31114 52957.00 I   .179892  .000056   .191375  .000061  I -.3737002  .0000052  0.0197 0.0044  I   -58.287     .323    -2.892     .340  0.179870  0.191370 -0.3736890   -57.900    -2.800  
+ 31115 52958.00 I   .177373  .000063   .189100  .000045  I -.3737560  .0000063  0.1012 0.0033  I   -57.999     .352    -2.888     .340  0.177470  0.189040 -0.3737660   -57.600    -2.800  
+ 31116 52959.00 I   .175135  .000075   .187125  .000050  I -.3739256  .0000042  0.2518 0.0040  I   -57.520     .299    -2.754     .340  0.175190  0.187030 -0.3739370   -57.300    -2.600  
+ 31117 52960.00 I   .172811  .000080   .185478  .000049  I -.3742828  .0000049  0.4721 0.0033  I   -57.072     .299    -2.507     .340  0.172860  0.185420 -0.3742740   -57.000    -2.500  
+ 31118 52961.00 I   .170301  .000075   .183783  .000060  I -.3748732  .0000052  0.7026 0.0033  I   -56.911     .214    -2.325     .340  0.170180  0.183740 -0.3748600   -56.800    -2.300  
+ 31119 52962.00 I   .167255  .000066   .181967  .000073  I -.3756701  .0000043  0.8793 0.0034  I   -57.003     .328    -2.270     .340  0.167340  0.181890 -0.3756920   -56.800    -2.200  
+ 31120 52963.00 I   .164407  .000069   .180384  .000077  I -.3766149  .0000043  1.0052 0.0030  I   -57.258     .328    -2.177     .340  0.164430  0.180360 -0.3766400   -56.900    -2.000  
+ 31121 52964.00 I   .161871  .000068   .179057  .000075  I -.3776704  .0000042  1.1006 0.0031  I   -57.539     .328    -1.930     .340  0.161850  0.179120 -0.3776600   -57.100    -1.900  
+ 31122 52965.00 I   .159315  .000040   .178382  .000072  I -.3787681  .0000045  1.0519 0.0030  I   -57.855     .335    -1.673     .340  0.159410  0.178310 -0.3787760   -57.300    -1.900  
+ 31123 52966.00 I   .156598  .000049   .177794  .000067  I -.3797096  .0000042  0.8094 0.0030  I   -58.088     .267    -1.631     .340  0.156660  0.177700 -0.3797530   -57.500    -1.900  
+ 31124 52967.00 I   .153411  .000047   .176861  .000059  I -.3803632  .0000041  0.4958 0.0032  I   -58.025     .338    -1.781     .340  0.153490  0.176770 -0.3803940   -57.600    -1.900  
+ 31125 52968.00 I   .149829  .000054   .175601  .000048  I -.3807043  .0000049  0.1915 0.0032  I   -57.674     .316    -1.877     .340  0.149710  0.175550 -0.3806940   -57.400    -1.900  
+ 31126 52969.00 I   .145159  .000054   .174197  .000045  I -.3807785  .0000048 -0.0158 0.0034  I   -57.318     .316    -1.819     .340  0.145320  0.174190 -0.3807670   -57.100    -1.800  
+ 31127 52970.00 I   .141261  .000050   .172966  .000044  I -.3807255  .0000048 -0.0647 0.0032  I   -57.158     .316    -1.792     .340  0.141260  0.172870 -0.3807190   -56.700    -1.800  
+ 31128 52971.00 I   .137856  .000046   .171859  .000043  I -.3806939  .0000043  0.0208 0.0031  I   -57.100     .316    -1.954     .340  0.137930  0.171760 -0.3807010   -56.300    -1.700  
+ 31129 52972.00 I   .134327  .000046   .170606  .000042  I -.3807906  .0000040  0.1768 0.0027  I   -57.013     .420    -2.151     .340  0.134400  0.170550 -0.3808080   -56.200    -1.700  
+ 31130 52973.00 I   .130325  .000045   .169150  .000053  I -.3810472  .0000031  0.3320 0.0026  I   -56.869     .279    -2.095     .340  0.130400  0.169040 -0.3810580   -56.300    -1.600  
+ 312 1 52974.00 I   .126424  .000040   .167828  .000050  I -.3814438  .0000034  0.4547 0.0022  I   -56.817     .279    -1.743     .340  0.126440  0.167710 -0.3814390   -56.500    -1.400  
+ 312 2 52975.00 I   .123273  .000045   .166663  .000061  I -.3819391  .0000032  0.5247 0.0023  I   -56.871     .258    -1.344     .340  0.123160  0.166610 -0.3819270   -56.800    -1.300  
+ 312 3 52976.00 I   .120088  .000061   .165470  .000081  I -.3824681  .0000030  0.5193 0.0022  I   -56.964     .220    -1.114     .340  0.120170  0.165390 -0.3824720   -57.000    -1.100  
+ 312 4 52977.00 I   .116990  .000067   .164469  .000079  I -.3829558  .0000030  0.4481 0.0021  I   -57.058     .220    -1.023     .340  0.117050  0.164370 -0.3829730   -57.000    -1.000  
+ 312 5 52978.00 I   .113970  .000064   .163757  .000076  I -.3833545  .0000028  0.3475 0.0026  I   -57.110     .220     -.946     .340  0.114130  0.163830 -0.3833480   -57.000    -1.000  
+ 312 6 52979.00 I   .111335  .000070   .163476  .000071  I -.3836462  .0000043  0.2333 0.0025  I   -57.055     .137     -.894     .340  0.111400  0.163450 -0.3836440   -57.000    -1.000  
+ 312 7 52980.00 I   .108466  .000073   .163098  .000072  I -.3838085  .0000041  0.0814 0.0027  I   -56.885     .121    -1.002     .340  0.108520  0.162960 -0.3838250   -56.900    -1.200  
+ 312 8 52981.00 I   .105420  .000066   .162535  .000073  I -.3837934  .0000033 -0.1174 0.0026  I   -56.717     .116    -1.276     .340  0.105460  0.162450 -0.3837940   -56.800    -1.300  
+ 312 9 52982.00 I   .102491  .000054   .162009  .000057  I -.3835759  .0000033 -0.3097 0.0024  I   -56.625     .252    -1.554     .340  0.102520  0.162010 -0.3835510   -56.700    -1.500  
+ 31210 52983.00 I   .099884  .000058   .161513  .000066  I -.3832108  .0000034 -0.3917 0.0024  I   -56.545     .312    -1.686     .102  0.099840  0.161520 -0.3832000   -56.400    -1.600  
+ 31211 52984.00 I   .096736  .000057   .160989  .000064  I -.3828200  .0000035 -0.3913 0.0024  I   -56.362     .312    -1.683     .102  0.096870  0.160960 -0.3828340   -56.000    -1.700  
+ 31212 52985.00 I   .093238  .000055   .160263  .000072  I -.3824450  .0000033 -0.3407 0.0023  I   -56.048     .312    -1.653     .102  0.093360  0.160300 -0.3824450   -55.500    -1.700  
+ 31213 52986.00 I   .089737  .000051   .159501  .000077  I -.3821565  .0000029 -0.2364 0.0024  I   -55.658     .297    -1.633     .340  0.089740  0.159450 -0.3821680   -55.000    -1.700  
+ 31214 52987.00 I   .086417  .000050   .158868  .000094  I -.3819878  .0000034 -0.0852 0.0023  I   -55.274     .329    -1.574     .122  0.086450  0.158710 -0.3819980   -54.700    -1.600  
+ 31215 52988.00 I   .083454  .000050   .158563  .000088  I -.3820082  .0000036  0.1323 0.0023  I   -54.999     .321    -1.473     .139  0.083500  0.158510 -0.3820050   -54.500    -1.500  
+ 31216 52989.00 I   .080534  .000038   .158331  .000075  I -.3822631  .0000030  0.3820 0.0024  I   -54.906     .171    -1.405     .112  0.080610  0.158360 -0.3822560   -54.600    -1.400  
+ 31217 52990.00 I   .077537  .000044   .158131  .000076  I -.3827676  .0000032  0.6181 0.0022  I   -54.912     .180    -1.396     .340  0.077620  0.158050 -0.3827510   -54.800    -1.500  
+ 31218 52991.00 I   .074455  .000045   .157692  .000070  I -.3834652  .0000032  0.7520 0.0023  I   -55.073     .180    -1.304     .340  0.074480  0.157650 -0.3834390   -55.000    -1.300  
+ 31219 52992.00 I   .071386  .000045   .157191  .000065  I -.3842398  .0000032  0.7906 0.0026  I   -55.383     .180    -1.057     .340  0.071480  0.157210 -0.3842270   -55.200    -1.100  
+ 31220 52993.00 I   .068869  .000045   .156874  .000038  I -.3850195  .0000042  0.7485 0.0028  I   -55.907     .177     -.787     .340  0.068890  0.156860 -0.3850240   -55.500    -0.900  
+ 31221 52994.00 I   .066299  .000047   .156453  .000038  I -.3856933  .0000047  0.5758 0.0037  I   -56.487     .167     -.727     .340  0.066350  0.156400 -0.3857350   -55.800    -0.800  
+ 31222 52995.00 I   .063459  .000050   .155926  .000042  I -.3861387  .0000060  0.3058 0.0043  I   -56.792     .163     -.907     .340  0.063520  0.155850 -0.3861900   -56.000    -0.900  
+ 31223 52996.00 I   .060462  .000048   .155491  .000032  I -.3863147  .0000071  0.0651 0.0046  I   -56.671     .194    -1.113     .340  0.060390  0.155410 -0.3863100   -56.200    -1.000  
+ 31224 52997.00 I   .056600  .000045   .155110  .000034  I -.3863313  .0000071  0.0114 0.0050  I   -56.269     .167    -1.155     .340  0.056690  0.155070 -0.3862360   -56.100    -1.200  
+ 31225 52998.00 I   .052596  .000044   .154775  .000040  I -.3863873  .0000071  0.1069 0.0049  I   -55.891     .167    -1.176     .340  0.052620  0.154710 -0.3862160   -55.900    -1.400  
+ 31226 52999.00 I   .048916  .000048   .154525  .000036  I -.3865594  .0000067  0.2452 0.0047  I   -55.553     .167    -1.292     .340  0.048950  0.154440 -0.3863760   -55.800    -1.500  
+ 31227 53000.00 I   .045817  .000043   .154540  .000042  I -.3868836  .0000062  0.4011 0.0038  I   -55.263     .402    -1.407     .340  0.045870  0.154430 -0.3867280   -55.600    -1.400  
+ 31228 53001.00 I   .042882  .000042   .154743  .000044  I -.3873512  .0000034  0.5258 0.0037  I   -55.121     .288    -1.284     .340  0.042940  0.154660 -0.3872450   -55.600    -1.100  
+ 31229 53002.00 I   .039839  .000042   .154760  .000045  I -.3879174  .0000041  0.5970 0.0028  I   -55.265     .288     -.881     .340  0.039910  0.154710 -0.3878690   -55.600    -0.800  
+ 31230 53003.00 I   .037049  .000044   .154451  .000046  I -.3885246  .0000044  0.6066 0.0032  I   -55.612     .288     -.464     .340  0.037030  0.154430 -0.3885140   -55.800    -0.500  
+ 31231 53004.00 I   .034038  .000052   .154141  .000045  I -.3891136  .0000050  0.5654 0.0033  I   -55.957     .288     -.296     .340  0.034120  0.154100 -0.3890920   -55.900    -0.200  
+ 4 1 1 53005.00 I   .031243  .000047   .153836  .000043  I -.3896476  .0000049  0.5008 0.0035  I   -56.182     .288     -.356     .340  0.031250  0.153770 -0.3895920   -56.100    -0.100  
+ 4 1 2 53006.00 I   .028845  .000054   .153671  .000039  I -.3901039  .0000050  0.4025 0.0046  I   -56.267     .288     -.447     .340  0.028870  0.153550 -0.3900740   -56.100    -0.200  
+ 4 1 3 53007.00 I   .026638  .000051   .153848  .000031  I -.3904342  .0000077  0.2492 0.0037  I   -56.230     .740     -.510     .340  0.026700  0.153740 -0.3904550   -56.000    -0.400  
+ 4 1 4 53008.00 I   .024195  .000056   .154295  .000031  I -.3905978  .0000054  0.0825 0.0046  I   -56.014     .244     -.595     .340  0.024260  0.154230 -0.3906300   -55.900    -0.600  
+ 4 1 5 53009.00 I   .021490  .000054   .154845  .000028  I -.3906122  .0000051 -0.0453 0.0037  I   -55.791     .244     -.810     .340  0.021590  0.154800 -0.3906200   -55.700    -0.900  
+ 4 1 6 53010.00 I   .018789  .000053   .155467  .000041  I -.3905340  .0000051 -0.0926 0.0037  I   -55.682     .285    -1.079     .340  0.018790  0.155440 -0.3905240   -55.500    -1.000  
+ 4 1 7 53011.00 I   .015861  .000055   .156209  .000065  I -.3904593  .0000053 -0.0429 0.0037  I   -55.620     .244    -1.244     .340  0.015960  0.156150 -0.3904520   -55.200    -1.100  
+ 4 1 8 53012.00 I   .012902  .000050   .156907  .000066  I -.3904692  .0000053  0.0698 0.0035  I   -55.433     .244    -1.241     .340  0.012990  0.156850 -0.3904660   -54.900    -1.100  
+ 4 1 9 53013.00 I   .010072  .000046   .157332  .000060  I -.3906221  .0000047  0.2522 0.0038  I   -55.072     .244    -1.140     .340  0.010150  0.157360 -0.3906230   -54.600    -1.100  
+ 4 110 53014.00 I   .007588  .000057   .157654  .000069  I -.3909924  .0000054  0.4911 0.0033  I   -54.671     .255    -1.050     .340  0.007710  0.157630 -0.3909980   -54.400    -1.200  
+ 4 111 53015.00 I   .005350  .000068   .157928  .000068  I -.3916090  .0000045  0.7442 0.0035  I   -54.387     .266    -1.023     .340  0.005380  0.157840 -0.3916020   -54.200    -1.300  
+ 4 112 53016.00 I   .003047  .000066   .158344  .000065  I -.3924797  .0000046  0.9938 0.0029  I   -54.273     .252    -1.041     .149  0.003030  0.158320 -0.3924550   -54.100    -1.300  
+ 4 113 53017.00 I   .001080  .000059   .159023  .000048  I -.3935837  .0000038  1.2045 0.0030  I   -54.289     .258    -1.066     .169  0.001150  0.159010 -0.3935690   -54.100    -1.100  
+ 4 114 53018.00 I  -.001154  .000067   .160078  .000053  I -.3948469  .0000039  1.2899 0.0028  I   -54.306     .293    -1.052     .143 -0.000940  0.159990 -0.3948590   -54.100    -0.700  
+ 4 115 53019.00 I  -.003301  .000073   .161382  .000055  I -.3961148  .0000040  1.2293 0.0028  I   -54.461     .293     -.939     .143 -0.003280  0.161360 -0.3961320   -54.400    -0.600  
+ 4 116 53020.00 I  -.005375  .000068   .162622  .000050  I -.3972758  .0000039  1.0795 0.0033  I   -54.740     .293     -.738     .143 -0.005390  0.162610 -0.3972730   -54.900    -0.600  
+ 4 117 53021.00 I  -.007599  .000050   .163770  .000046  I -.3982441  .0000053  0.8407 0.0029  I   -55.192     .296     -.564     .179 -0.007540  0.163700 -0.3982610   -55.300    -0.700  
+ 4 118 53022.00 I  -.010223  .000049   .165081  .000059  I -.3989457  .0000042  0.5676 0.0031  I   -55.710     .282     -.569     .340 -0.010170  0.165030 -0.3989770   -55.700    -0.700  
+ 4 119 53023.00 I  -.013233  .000052   .166330  .000086  I -.3993949  .0000031  0.3415 0.0026  I   -56.056     .248     -.777     .340 -0.013220  0.166280 -0.3994140   -55.900    -0.800  
+ 4 120 53024.00 I  -.016197  .000051   .167243  .000092  I -.3996602  .0000031  0.2100 0.0023  I   -56.077     .220    -1.037     .340 -0.016180  0.167220 -0.3996580   -55.900    -0.900  
+ 4 121 53025.00 I  -.018658  .000061   .168258  .000104  I -.3998530  .0000033  0.1930 0.0023  I   -55.842     .244    -1.234     .117 -0.018640  0.168310 -0.3998410   -55.600    -1.100  
+ 4 122 53026.00 I  -.021139  .000064   .169988  .000103  I -.4000827  .0000035  0.2857 0.0024  I   -55.472     .244    -1.277     .117 -0.021090  0.169990 -0.4000790   -55.300    -1.200  
+ 4 123 53027.00 I  -.024162  .000059   .171751  .000102  I -.4004467  .0000035  0.4455 0.0030  I   -55.057     .244    -1.314     .117 -0.023830  0.171790 -0.4004350   -54.900    -1.300  
+ 4 124 53028.00 I  -.026309  .000058   .173183  .000099  I -.4009745  .0000048  0.6078 0.0032  I   -54.694     .266    -1.358     .123 -0.026220  0.173120 -0.4009750   -54.800    -1.300  
+ 4 125 53029.00 I  -.027928  .000065   .174510  .000053  I -.4016567  .0000053  0.7534 0.0036  I   -54.517     .338    -1.256     .340 -0.027880  0.174430 -0.4016610   -54.800    -1.100  
+ 4 126 53030.00 I  -.029159  .000066   .175921  .000048  I -.4024644  .0000054  0.8483 0.0038  I   -54.690     .338    -1.005     .340 -0.029110  0.175870 -0.4024540   -55.000    -0.900  
+ 4 127 53031.00 I  -.030234  .000040   .177464  .000025  I -.4033160  .0000055  0.8313 0.0037  I   -55.141     .329     -.780     .340 -0.030220  0.177420 -0.4033020   -55.300    -0.700  
+ 4 128 53032.00 I  -.031666  .000044   .179219  .000030  I -.4040869  .0000052  0.6940 0.0038  I   -55.636     .309     -.764     .340 -0.031610  0.179160 -0.4040940   -55.500    -0.700  
+ 4 129 53033.00 I  -.033515  .000046   .181091  .000030  I -.4046819  .0000052  0.4903 0.0030  I   -55.982     .309     -.922     .340 -0.033490  0.181000 -0.4046910   -55.700    -0.800  
+ 4 130 53034.00 I  -.036001  .000045   .182952  .000029  I -.4050549  .0000031  0.2489 0.0035  I   -56.103     .309    -1.066     .340 -0.035950  0.182930 -0.4050420   -55.700    -1.000  
+ 4 131 53035.00 I  -.038965  .000042   .184614  .000041  I -.4051878  .0000047  0.0319 0.0027  I   -55.988     .229    -1.133     .340 -0.038950  0.184640 -0.4051900   -55.600    -1.200  
+ 4 2 1 53036.00 I  -.042056  .000061   .185945  .000071  I -.4051408  .0000045 -0.1188 0.0033  I   -55.661     .215    -1.171     .127 -0.042020  0.185890 -0.4051460   -55.300    -1.300  
+ 4 2 2 53037.00 I  -.045030  .000060   .187071  .000067  I -.4049664  .0000047 -0.2210 0.0031  I   -55.286     .208    -1.332     .127 -0.044930  0.186970 -0.4049600   -55.000    -1.500  
+ 4 2 3 53038.00 I  -.047780  .000056   .188139  .000071  I -.4047150  .0000042 -0.2745 0.0039  I   -55.040     .161    -1.596     .149 -0.047970  0.188030 -0.4047120   -54.800    -1.600  
+ 4 2 4 53039.00 I  -.051232  .000058   .189043  .000077  I -.4044364  .0000063 -0.2709 0.0038  I   -54.939     .145    -1.815     .152 -0.051200  0.188970 -0.4044510   -54.600    -1.700  
+ 4 2 5 53040.00 I  -.054195  .000062   .189858  .000077  I -.4042062  .0000063 -0.1684 0.0045  I   -54.847     .145    -1.866     .152 -0.054160  0.189780 -0.4042020   -54.500    -1.700  
+ 4 2 6 53041.00 I  -.056738  .000060   .190689  .000076  I -.4041262  .0000064  0.0137 0.0046  I   -54.656     .145    -1.756     .152 -0.056640  0.190710 -0.4041170   -54.400    -1.800  
+ 4 2 7 53042.00 I  -.058821  .000042   .192020  .000065  I -.4042553  .0000066  0.2607 0.0044  I   -54.412     .137    -1.598     .151 -0.058780  0.191970 -0.4042390   -54.300    -1.800  
+ 4 2 8 53043.00 I  -.060682  .000050   .193628  .000083  I -.4046569  .0000059  0.5355 0.0045  I   -54.251     .190    -1.522     .140 -0.060610  0.193540 -0.4046350   -54.200    -1.700  
+ 4 2 9 53044.00 I  -.062590  .000053   .195344  .000085  I -.4053066  .0000060  0.7512 0.0035  I   -54.236     .190    -1.559     .140 -0.062540  0.195330 -0.4052940   -54.300    -1.600  
+ 4 210 53045.00 I  -.064870  .000048   .197068  .000078  I -.4061326  .0000036  0.8866 0.0034  I   -54.363     .194    -1.640     .155 -0.064880  0.197140 -0.4061210   -54.300    -1.500  
+ 4 211 53046.00 I  -.067746  .000048   .199078  .000087  I -.4070517  .0000033  0.9375 0.0025  I   -54.587     .170    -1.669     .161 -0.067650  0.199070 -0.4070350   -54.500    -1.400  
+ 4 212 53047.00 I  -.070770  .000045   .200926  .000090  I -.4079707  .0000034  0.8775 0.0024  I   -54.851     .170    -1.607     .161 -0.070720  0.200890 -0.4079620   -54.700    -1.300  
+ 4 213 53048.00 I  -.073863  .000045   .202589  .000084  I -.4087685  .0000034  0.7028 0.0021  I   -55.095     .170    -1.498     .161 -0.073760  0.202610 -0.4087570   -54.900    -1.300  
+ 4 214 53049.00 I  -.076809  .000031   .204460  .000067  I -.4093573  .0000026  0.4712 0.0021  I   -55.325     .132    -1.423     .150 -0.076740  0.204440 -0.4093720   -55.100    -1.300  
+ 4 215 53050.00 I  -.079498  .000033   .206272  .000075  I -.4097155  .0000025  0.2534 0.0018  I   -55.385     .116    -1.463     .129 -0.079460  0.206200 -0.4097500   -55.100    -1.400  
+ 4 216 53051.00 I  -.081563  .000035   .208061  .000076  I -.4098881  .0000025  0.1077 0.0020  I   -55.305     .169    -1.621     .116 -0.081510  0.208070 -0.4099010   -55.100    -1.500  
+ 4 217 53052.00 I  -.082858  .000041   .210006  .000090  I -.4099668  .0000031  0.0698 0.0020  I   -55.105     .348    -1.830     .130 -0.082870  0.210050 -0.4099550   -54.900    -1.800  
+ 4 218 53053.00 I  -.084378  .000051   .212353  .000110  I -.4100719  .0000031  0.1646 0.0023  I   -54.856     .313    -1.995     .117 -0.084210  0.212270 -0.4100770   -54.600    -2.000  
+ 4 219 53054.00 I  -.086640  .000048   .214811  .000105  I -.4103323  .0000033  0.3683 0.0023  I   -54.616     .313    -2.072     .117 -0.086570  0.214860 -0.4103380   -54.400    -2.100  
+ 4 220 53055.00 I  -.090048  .000045   .217043  .000093  I -.4108259  .0000034  0.6241 0.0030  I   -54.378     .311    -2.117     .113 -0.089840  0.217220 -0.4108150   -54.300    -2.100  
+ 4 221 53056.00 I  -.093073  .000054   .219531  .000095  I -.4115704  .0000049  0.8495 0.0024  I   -54.168     .359    -2.091     .118 -0.093010  0.219500 -0.4115850   -54.300    -2.100  
+ 4 222 53057.00 I  -.095702  .000062   .222041  .000102  I -.4125003  .0000034  1.0012 0.0029  I   -54.053     .333    -2.024     .122 -0.095640  0.221970 -0.4125160   -54.300    -2.000  
+ 4 223 53058.00 I  -.097955  .000056   .224286  .000092  I -.4135463  .0000032  1.0734 0.0022  I   -54.143     .209    -1.939     .340 -0.097910  0.224270 -0.4135320   -54.400    -1.900  
+ 4 224 53059.00 I  -.099789  .000055   .226364  .000068  I -.4146110  .0000027  1.0372 0.0022  I   -54.460     .378    -1.922     .340 -0.099810  0.226380 -0.4145990   -54.500    -1.900  
+ 4 225 53060.00 I  -.101338  .000077   .228642  .000070  I -.4155850  .0000029  0.8939 0.0021  I   -54.885     .338    -2.035     .340 -0.101260  0.228610 -0.4155980   -54.600    -2.000  
+ 4 226 53061.00 I  -.102537  .000074   .231016  .000075  I -.4163810  .0000032  0.6971 0.0022  I   -55.230     .338    -2.216     .340 -0.102480  0.230940 -0.4163790   -54.700    -2.200  
+ 4 227 53062.00 I  -.104291  .000071   .233424  .000069  I -.4169806  .0000033  0.5046 0.0028  I   -55.343     .338    -2.330     .340 -0.103900  0.233390 -0.4169680   -54.600    -2.400  
+ 4 228 53063.00 I  -.105954  .000069   .235830  .000049  I -.4173787  .0000047  0.2777 0.0027  I   -55.261     .455    -2.309     .340 -0.105970  0.235800 -0.4173890   -54.500    -2.500  
+ 4 229 53064.00 I  -.108397  .000066   .237913  .000045  I -.4175324  .0000042  0.0400 0.0032  I   -54.831     .373    -2.338     .340 -0.108330  0.237830 -0.4175520   -54.200    -2.600  
+ 4 3 1 53065.00 I  -.110491  .000060   .239912  .000044  I -.4174875  .0000042 -0.1112 0.0027  I   -54.292     .373    -2.495     .340 -0.110480  0.239820 -0.4174860   -53.900    -2.600  
+ 4 3 2 53066.00 I  -.112159  .000052   .242099  .000055  I -.4173486  .0000033 -0.1467 0.0026  I   -53.828     .305    -2.763     .340 -0.112280  0.242030 -0.4173340   -53.600    -2.700  
+ 4 3 3 53067.00 I  -.114042  .000064   .244217  .000063  I -.4172252  .0000030 -0.0890 0.0023  I   -53.572     .266    -3.017     .112 -0.113870  0.244170 -0.4172170   -53.400    -2.900  
+ 4 3 4 53068.00 I  -.115336  .000065   .246373  .000067  I -.4171986  .0000031  0.0525 0.0021  I   -53.530     .266    -3.146     .112 -0.115450  0.246340 -0.4171940   -53.300    -3.100  
+ 4 3 5 53069.00 I  -.117603  .000061   .248810  .000070  I -.4173536  .0000029  0.2640 0.0020  I   -53.585     .266    -3.125     .112 -0.117240  0.248810 -0.4173440   -53.100    -3.200  
+ 4 3 6 53070.00 I  -.118999  .000074   .251503  .000074  I -.4177371  .0000025  0.5068 0.0019  I   -53.658     .346    -2.977     .154 -0.118920  0.251420 -0.4177250   -53.000    -3.200  
+ 4 3 7 53071.00 I  -.120336  .000080   .254069  .000075  I -.4183644  .0000024  0.7412 0.0018  I   -53.590     .308    -2.832     .143 -0.120260  0.254030 -0.4183150   -52.900    -3.000  
+ 4 3 8 53072.00 I  -.121594  .000088   .256227  .000077  I -.4191954  .0000027  0.9035 0.0018  I   -53.561     .268    -2.758     .158 -0.121520  0.256150 -0.4191520   -53.000    -2.800  
+ 4 3 9 53073.00 I  -.122122  .000069   .258077  .000068  I -.4201289  .0000028  0.9385 0.0020  I   -53.713     .255    -2.786     .126 -0.122270  0.258000 -0.4201170   -53.300    -2.700  
+ 4 310 53074.00 I  -.123028  .000069   .260069  .000080  I -.4210231  .0000029  0.8256 0.0024  I   -54.060     .224    -2.873     .109 -0.122910  0.260000 -0.4210240   -54.000    -2.800  
+ 4 311 53075.00 I  -.123778  .000074   .262111  .000077  I -.4217423  .0000038  0.5994 0.0024  I   -54.444     .224    -2.951     .109 -0.123690  0.262090 -0.4217560   -54.400    -2.900  
+ 4 312 53076.00 I  -.124453  .000069   .264041  .000080  I -.4222139  .0000039  0.3490 0.0037  I   -54.663     .224    -2.992     .109 -0.124390  0.264080 -0.4222000   -54.600    -3.000  
+ 4 313 53077.00 I  -.125195  .000051   .266227  .000081  I -.4224543  .0000064  0.1404 0.0035  I   -54.689     .391    -2.989     .120 -0.125150  0.266190 -0.4224630   -54.500    -3.100  
+ 4 314 53078.00 I  -.126023  .000046   .268480  .000073  I -.4225155  .0000059 -0.0057 0.0043  I   -54.399     .414    -3.020     .340 -0.125960  0.268470 -0.4225910   -54.100    -3.100  
+ 4 315 53079.00 I  -.126916  .000045   .270668  .000069  I -.4224794  .0000058 -0.0423 0.0044  I   -53.973     .414    -3.087     .340 -0.126830  0.270610 -0.4225390   -53.500    -3.100  
+ 4 316 53080.00 I  -.128139  .000055   .272811  .000039  I -.4224683  .0000064  0.0333 0.0047  I   -53.526     .553    -3.199     .340 -0.128020  0.272740 -0.4224570   -52.900    -3.100  
+ 4 317 53081.00 I  -.129178  .000057   .274874  .000038  I -.4225790  .0000073  0.2078 0.0053  I   -53.153     .466    -3.328     .340 -0.129130  0.274780 -0.4225720   -52.600    -3.200  
+ 4 318 53082.00 I  -.130049  .000059   .277122  .000035  I -.4229104  .0000084  0.4619 0.0055  I   -52.919     .466    -3.416     .340 -0.130030  0.277030 -0.4229130   -52.600    -3.300  
+ 4 319 53083.00 I  -.131304  .000062   .279565  .000034  I -.4235105  .0000081  0.7390 0.0065  I   -52.835     .466    -3.414     .340 -0.131010  0.279470 -0.4234930   -52.700    -3.400  
+ 4 320 53084.00 I  -.131697  .000068   .281978  .000039  I -.4243780  .0000098  0.9848 0.0057  I   -52.840     .335    -3.307     .106 -0.131650  0.281880 -0.4243930   -52.800    -3.400  
+ 4 321 53085.00 I  -.131870  .000068   .284727  .000048  I -.4254451  .0000080  1.1257 0.0064  I   -52.883     .288    -3.163     .340 -0.131780  0.284630 -0.4255200   -53.000    -3.300  
+ 4 322 53086.00 I  -.131969  .000075   .287888  .000052  I -.4265916  .0000081  1.1531 0.0053  I   -52.936     .288    -3.065     .340 -0.131850  0.287800 -0.4266280   -53.100    -3.200  
+ 4 323 53087.00 I  -.131752  .000060   .291271  .000057  I -.4277318  .0000071  1.1220 0.0049  I   -53.051     .254    -3.096     .340 -0.131810  0.291260 -0.4277180   -53.100    -3.200  
+ 4 324 53088.00 I  -.132110  .000060   .294885  .000067  I -.4288185  .0000056  1.0395 0.0045  I   -53.258     .294    -3.257     .340 -0.132020  0.294870 -0.4288330   -53.100    -3.200  
+ 4 325 53089.00 I  -.132884  .000061   .298383  .000067  I -.4297922  .0000055  0.9013 0.0038  I   -53.471     .294    -3.447     .340 -0.132830  0.298330 -0.4298080   -53.000    -3.400  
+ 4 326 53090.00 I  -.134150  .000062   .301745  .000060  I -.4306106  .0000052  0.7315 0.0039  I   -53.538     .294    -3.556     .340 -0.134010  0.301770 -0.4306060   -53.000    -3.600  
+ 4 327 53091.00 I  -.135581  .000052   .305184  .000061  I -.4312531  .0000055  0.5554 0.0032  I   -53.405     .345    -3.587     .102 -0.135510  0.305200 -0.4312590   -52.800    -3.700  
+ 4 328 53092.00 I  -.136937  .000060   .308389  .000081  I -.4317347  .0000038  0.4193 0.0033  I   -53.051     .301    -3.674     .340 -0.136880  0.308330 -0.4317360   -52.600    -3.900  
+ 4 329 53093.00 I  -.137966  .000061   .311513  .000079  I -.4321212  .0000037  0.3719 0.0025  I   -52.560     .301    -3.881     .340 -0.137840  0.311480 -0.4321140   -52.400    -4.000  
+ 4 330 53094.00 I  -.138634  .000061   .314635  .000073  I -.4325099  .0000032  0.4188 0.0024  I   -52.010     .204    -4.140     .340 -0.138680  0.314710 -0.4325020   -52.000    -4.100  
+ 4 331 53095.00 I  -.139515  .000065   .317748  .000072  I -.4329864  .0000031  0.5484 0.0023  I   -51.575     .254    -4.347     .108 -0.139440  0.317740 -0.4329880   -51.700    -4.300  
+ 4 4 1 53096.00 I  -.140248  .000065   .320643  .000076  I -.4336295  .0000034  0.7464 0.0022  I   -51.461     .254    -4.481     .108 -0.140150  0.320590 -0.4336250   -51.400    -4.500  
+ 4 4 2 53097.00 I  -.140804  .000071   .323365  .000071  I -.4344855  .0000031  0.9634 0.0023  I   -51.665     .254    -4.562     .108 -0.140650  0.323290 -0.4344790   -51.300    -4.600  
+ 4 4 3 53098.00 I  -.140861  .000064   .326042  .000041  I -.4355652  .0000031  1.2070 0.0021  I   -51.948     .435    -4.493     .259 -0.140730  0.325970 -0.4355490   -51.400    -4.600  
+ 4 4 4 53099.00 I  -.141000  .000065   .328657  .000045  I -.4368965  .0000028  1.4414 0.0021  I   -52.016     .455    -4.318     .166 -0.140850  0.328620 -0.4368240   -51.600    -4.400  
+ 4 4 5 53100.00 I  -.141192  .000062   .331008  .000050  I -.4384084  .0000028  1.5570 0.0024  I   -52.007     .409    -4.039     .198 -0.141110  0.330940 -0.4383520   -52.100    -4.100  
+ 4 4 6 53101.00 I  -.140714  .000057   .333326  .000066  I -.4399626  .0000040  1.5290 0.0023  I   -52.215     .380    -3.846     .166 -0.140720  0.333270 -0.4399620   -52.500    -4.000  
+ 4 4 7 53102.00 I  -.140149  .000053   .336180  .000070  I -.4414172  .0000036  1.3535 0.0034  I   -52.703     .380    -3.878     .166 -0.140070  0.336140 -0.4414210   -52.700    -4.100  
+ 4 4 8 53103.00 I  -.139967  .000052   .339273  .000066  I -.4426289  .0000056  1.0558 0.0033  I   -53.187     .380    -4.088     .166 -0.139870  0.339300 -0.4426250   -53.000    -4.100  
+ 4 4 9 53104.00 I  -.139743  .000041   .342518  .000074  I -.4435322  .0000056  0.7682 0.0047  I   -53.342     .380    -4.317     .166 -0.139720  0.342460 -0.4435230   -53.300    -4.200  
+ 4 410 53105.00 I  -.139228  .000040   .345818  .000079  I -.4441832  .0000075  0.5344 0.0041  I   -53.112     .127    -4.460     .178 -0.139160  0.345730 -0.4441910   -53.200    -4.200  
+ 4 411 53106.00 I  -.138787  .000041   .349170  .000075  I -.4446215  .0000061  0.3621 0.0052  I   -52.691     .119    -4.524     .340 -0.138700  0.349120 -0.4446890   -52.800    -4.300  
+ 4 412 53107.00 I  -.138905  .000039   .352330  .000076  I -.4449578  .0000073  0.3411 0.0038  I   -52.262     .205    -4.562     .340 -0.138820  0.352320 -0.4450120   -52.300    -4.400  
+ 4 413 53108.00 I  -.139082  .000054   .355170  .000071  I -.4453570  .0000045  0.4801 0.0038  I   -51.886     .187    -4.603     .340 -0.139050  0.355180 -0.4453520   -51.800    -4.500  
+ 4 414 53109.00 I  -.139115  .000058   .357994  .000076  I -.4459439  .0000024  0.6968 0.0026  I   -51.560     .235    -4.641     .340 -0.139020  0.357970 -0.4459340   -51.500    -4.600  
+ 4 415 53110.00 I  -.138580  .000058   .360790  .000064  I -.4467417  .0000024  0.8869 0.0018  I   -51.317     .235    -4.643     .340 -0.138500  0.360750 -0.4467570   -51.300    -4.500  
+ 4 416 53111.00 I  -.137662  .000058   .363695  .000064  I -.4476964  .0000026  1.0131 0.0018  I   -51.236     .235    -4.559     .340 -0.137280  0.363660 -0.4476920   -51.200    -4.400  
+ 4 417 53112.00 I  -.135955  .000074   .367039  .000059  I -.4487422  .0000027  1.0621 0.0018  I   -51.344     .275    -4.359     .124 -0.135880  0.367000 -0.4487340   -51.200    -4.200  
+ 4 418 53113.00 I  -.134731  .000076   .370453  .000059  I -.4497902  .0000026  1.0198 0.0019  I   -51.543     .388    -4.089     .144 -0.134630  0.370400 -0.4498170   -51.300    -3.900  
+ 4 419 53114.00 I  -.133524  .000073   .373815  .000056  I -.4507553  .0000026  0.8978 0.0023  I   -51.689     .388    -3.888     .144 -0.133420  0.373690 -0.4507790   -51.300    -3.800  
+ 4 420 53115.00 I  -.132568  .000068   .377234  .000057  I -.4515622  .0000038  0.7048 0.0024  I   -51.740     .550    -3.894     .148 -0.132720  0.377200 -0.4515530   -51.300    -3.700  
+ 4 421 53116.00 I  -.132997  .000077   .380324  .000064  I -.4521541  .0000040  0.4794 0.0028  I   -51.660     .418    -4.075     .340 -0.132860  0.380270 -0.4521440   -51.300    -3.900  
+ 4 422 53117.00 I  -.133111  .000072   .382857  .000064  I -.4525177  .0000042  0.2442 0.0029  I   -51.707     .418    -4.367     .340 -0.133030  0.382740 -0.4525130   -51.200    -4.100  
+ 4 423 53118.00 I  -.132957  .000069   .385157  .000066  I -.4526419  .0000041  0.0072 0.0032  I   -51.718     .418    -4.562     .340 -0.132900  0.385140 -0.4526290   -51.200    -4.400  
+ 4 424 53119.00 I  -.132759  .000060   .387283  .000057  I -.4525565  .0000049 -0.1566 0.0031  I   -51.588     .353    -4.654     .340 -0.132680  0.387240 -0.4525500   -51.200    -4.700  
+ 4 425 53120.00 I  -.132086  .000067   .389107  .000055  I -.4523604  .0000046 -0.2251 0.0034  I   -51.481     .419    -4.778     .340 -0.132000  0.389000 -0.4523700   -51.200    -4.900  
+ 4 426 53121.00 I  -.130578  .000068   .390893  .000058  I -.4521354  .0000046 -0.2061 0.0033  I   -51.281     .419    -4.997     .340 -0.130460  0.390820 -0.4521400   -51.100    -5.100  
+ 4 427 53122.00 I  -.128362  .000068   .392863  .000040  I -.4519818  .0000047 -0.0861 0.0031  I   -50.896     .395    -5.203     .340 -0.128460  0.392810 -0.4519700   -51.000    -5.200  
+ 4 428 53123.00 I  -.126734  .000083   .395216  .000053  I -.4519886  .0000042  0.1101 0.0032  I   -50.413     .330    -5.284     .126 -0.126640  0.395120 -0.4519830   -50.700    -5.200  
+ 4 429 53124.00 I  -.125093  .000085   .398005  .000050  I -.4522144  .0000044  0.3436 0.0030  I   -50.160     .330    -5.302     .126 -0.125000  0.397910 -0.4522110   -50.400    -5.300  
+ 4 430 53125.00 I  -.123717  .000077   .401060  .000050  I -.4526883  .0000043  0.6147 0.0034  I   -50.344     .330    -5.381     .126 -0.123340  0.401040 -0.4526730   -50.300    -5.200  
+ 4 5 1 53126.00 I  -.121531  .000059   .404238  .000050  I -.4534459  .0000052  0.8921 0.0031  I   -50.751     .157    -5.461     .144 -0.121380  0.404210 -0.4534520   -50.300    -5.100  
+ 4 5 2 53127.00 I  -.119766  .000051   .407433  .000052  I -.4544442  .0000045  1.0845 0.0036  I   -51.038     .169    -5.319     .121 -0.119660  0.407360 -0.4544520   -50.500    -4.800  
+ 4 5 3 53128.00 I  -.118495  .000049   .410523  .000049  I -.4555747  .0000049  1.1563 0.0036  I   -51.220     .169    -4.895     .121 -0.118390  0.410450 -0.4555700   -51.000    -4.600  
+ 4 5 4 53129.00 I  -.117063  .000032   .413497  .000054  I -.4567189  .0000056  1.1145 0.0035  I   -51.608     .242    -4.458     .340 -0.117060  0.413470 -0.4567090   -51.600    -4.500  
+ 4 5 5 53130.00 I  -.115916  .000031   .416444  .000057  I -.4577677  .0000051  0.9647 0.0039  I   -52.325     .217    -4.360     .340 -0.115790  0.416380 -0.4577810   -52.200    -4.500  
+ 4 5 6 53131.00 I  -.115002  .000031   .419218  .000057  I -.4586251  .0000053  0.7453 0.0036  I   -52.882     .217    -4.611     .340 -0.114930  0.419100 -0.4586060   -52.600    -4.700  
+ 4 5 7 53132.00 I  -.113991  .000033   .421556  .000061  I -.4592559  .0000051  0.5187 0.0041  I   -52.928     .217    -4.982     .340 -0.113920  0.421550 -0.4592340   -52.800    -5.000  
+ 4 5 8 53133.00 I  -.112547  .000036   .423888  .000062  I -.4596849  .0000062  0.3594 0.0034  I   -52.484     .249    -5.252     .340 -0.112480  0.423880 -0.4597010   -52.700    -5.200  
+ 4 5 9 53134.00 I  -.111160  .000032   .426264  .000058  I -.4600193  .0000044  0.3339 0.0038  I   -51.911     .241    -5.400     .340 -0.111080  0.426160 -0.4600310   -52.300    -5.400  
+ 4 510 53135.00 I  -.109687  .000023   .428824  .000057  I -.4603924  .0000043  0.4274 0.0030  I   -51.517     .236    -5.483     .340 -0.109620  0.428730 -0.4603710   -51.900    -5.500  
+ 4 511 53136.00 I  -.107952  .000028   .431626  .000040  I -.4608927  .0000042  0.5765 0.0032  I   -51.348     .278    -5.489     .340 -0.107920  0.431630 -0.4608740   -51.400    -5.500  
+ 4 512 53137.00 I  -.106062  .000037   .434487  .000038  I -.4615510  .0000047  0.7423 0.0032  I   -51.294     .243    -5.393     .340 -0.105990  0.434460 -0.4615630   -51.100    -5.400  
+ 4 513 53138.00 I  -.103997  .000039   .437286  .000036  I -.4623751  .0000047  0.9016 0.0033  I   -51.244     .243    -5.179     .340 -0.103920  0.437210 -0.4623610   -51.000    -5.200  
+ 4 514 53139.00 I  -.102431  .000037   .440008  .000035  I -.4633384  .0000045  1.0135 0.0038  I   -51.228     .243    -4.938     .340 -0.102230  0.439990 -0.4633250   -51.100    -4.900  
+ 4 515 53140.00 I  -.101285  .000044   .442347  .000039  I -.4643778  .0000059  1.0526 0.0032  I   -51.342     .256    -4.688     .340 -0.101230  0.442280 -0.4643800   -51.400    -4.500  
+ 4 516 53141.00 I  -.100663  .000040   .444171  .000051  I -.4654145  .0000046  1.0045 0.0040  I   -51.607     .208    -4.428     .340 -0.100590  0.444050 -0.4654470   -51.700    -4.300  
+ 4 517 53142.00 I  -.100222  .000044   .445634  .000057  I -.4663622  .0000054  0.8825 0.0035  I   -51.895     .215    -4.242     .340 -0.100120  0.445550 -0.4663810   -52.000    -4.200  
+ 4 518 53143.00 I  -.099643  .000047   .446834  .000061  I -.4671623  .0000053  0.7090 0.0037  I   -52.053     .248    -4.287     .153 -0.099630  0.446880 -0.4671500   -52.100    -4.300  
+ 4 519 53144.00 I  -.098872  .000046   .448195  .000059  I -.4677718  .0000051  0.5104 0.0037  I   -52.067     .248    -4.613     .153 -0.098880  0.448150 -0.4677680   -52.100    -4.600  
+ 4 520 53145.00 I  -.097892  .000043   .449518  .000059  I -.4681787  .0000052  0.2987 0.0035  I   -52.023     .248    -5.047     .153 -0.097620  0.449480 -0.4681660   -52.100    -5.000  
+ 4 521 53146.00 I  -.096351  .000043   .451032  .000060  I -.4683770  .0000049  0.1103 0.0048  I   -51.996     .248    -5.335     .153 -0.096230  0.450990 -0.4683520   -52.200    -5.300  
+ 4 522 53147.00 I  -.095216  .000048   .452371  .000051  I -.4684214  .0000080 -0.0119 0.0042  I   -51.986     .245    -5.396     .196 -0.095120  0.452300 -0.4684340   -52.400    -5.400  
+ 4 523 53148.00 I  -.094283  .000055   .453634  .000062  I -.4683734  .0000067 -0.0734 0.0054  I   -52.101     .213    -5.402     .182 -0.094210  0.453520 -0.4684300   -52.600    -5.400  
+ 4 524 53149.00 I  -.093244  .000046   .455065  .000049  I -.4683010  .0000072 -0.0557 0.0049  I   -52.215     .451    -5.476     .211 -0.093170  0.454970 -0.4683400   -52.500    -5.400  
+ 4 525 53150.00 I  -.091746  .000047   .456635  .000045  I -.4682783  .0000072  0.0110 0.0050  I   -52.133     .408    -5.552     .192 -0.091820  0.456610 -0.4682760   -52.100    -5.400  
+ 4 526 53151.00 I  -.090929  .000056   .458356  .000048  I -.4683310  .0000070  0.1018 0.0050  I   -51.802     .412    -5.497     .195 -0.090800  0.458290 -0.4683110   -51.500    -5.600  
+ 4 527 53152.00 I  -.090161  .000057   .459926  .000050  I -.4685068  .0000070  0.2674 0.0045  I   -51.502     .412    -5.362     .195 -0.090100  0.459820 -0.4684840   -51.100    -5.600  
+ 4 528 53153.00 I  -.089505  .000054   .461504  .000054  I -.4688631  .0000057  0.4248 0.0054  I   -51.572     .412    -5.327     .195 -0.089290  0.461430 -0.4688530   -51.200    -5.500  
+ 4 529 53154.00 I  -.088327  .000043   .463072  .000046  I -.4693344  .0000081  0.5160 0.0042  I   -51.996     .529    -5.346     .275 -0.088260  0.463050 -0.4693440   -51.600    -5.200  
+ 4 530 53155.00 I  -.087159  .000044   .464429  .000059  I -.4698815  .0000063  0.5664 0.0048  I   -52.507     .324    -5.277     .193 -0.087050  0.464430 -0.4699190   -52.200    -4.900  
+ 4 531 53156.00 I  -.085652  .000058   .465710  .000072  I -.4704374  .0000052  0.5275 0.0040  I   -52.991     .275    -4.908     .161 -0.085550  0.465620 -0.4704730   -53.000    -4.600  
+ 4 6 1 53157.00 I  -.083861  .000049   .467217  .000076  I -.4708996  .0000050  0.3780 0.0036  I   -53.601     .170    -4.453     .340 -0.083740  0.467120 -0.4709090   -53.800    -4.300  
+ 4 6 2 53158.00 I  -.081805  .000050   .468919  .000081  I -.4711655  .0000049  0.1448 0.0035  I   -54.338     .141    -4.292     .340 -0.081900  0.468990 -0.4711550   -54.300    -4.200  
+ 4 6 3 53159.00 I  -.079966  .000054   .470697  .000072  I -.4711933  .0000049 -0.0760 0.0035  I   -54.846     .141    -4.528     .340 -0.079860  0.470660 -0.4711760   -54.600    -4.400  
+ 4 6 4 53160.00 I  -.077622  .000058   .472199  .000072  I -.4710285  .0000051 -0.2518 0.0035  I   -54.789     .141    -4.911     .340 -0.077750  0.472270 -0.4710280   -54.500    -4.700  
+ 4 6 5 53161.00 I  -.075844  .000053   .473768  .000069  I -.4707260  .0000050 -0.3185 0.0037  I   -54.246     .263    -5.194     .117 -0.075560  0.473570 -0.4707200   -54.400    -5.000  
+ 4 6 6 53162.00 I  -.074538  .000055   .475431  .000074  I -.4704486  .0000054 -0.2137 0.0037  I   -53.616     .376    -5.367     .145 -0.074410  0.475460 -0.4705960   -54.200    -5.100  
+ 4 6 7 53163.00 I  -.073384  .000058   .476953  .000070  I -.4703249  .0000054 -0.0300 0.0038  I   -53.236     .350    -5.497     .170 -0.073240  0.476850 -0.4704280   -54.000    -5.200  
+ 4 6 8 53164.00 I  -.071790  .000061   .478291  .000060  I -.4703857  .0000054  0.1452 0.0038  I   -53.205     .411    -5.507     .187 -0.071780  0.478280 -0.4703790   -53.700    -5.300  
+ 4 6 9 53165.00 I  -.070023  .000064   .479927  .000062  I -.4706120  .0000053  0.3106 0.0037  I   -53.438     .349    -5.272     .164 -0.069820  0.479820 -0.4706000   -53.300    -5.400  
+ 4 610 53166.00 I  -.068415  .000063   .481560  .000061  I -.4709900  .0000052  0.4251 0.0033  I   -53.752     .349    -4.856     .164 -0.068360  0.481590 -0.4710010   -53.400    -5.100  
+ 4 611 53167.00 I  -.066916  .000066   .483053  .000061  I -.4714385  .0000039  0.4683 0.0035  I   -53.995     .349    -4.488     .164 -0.066580  0.482870 -0.4714330   -53.700    -4.600  
+ 4 612 53168.00 I  -.064946  .000052   .484490  .000040  I -.4719083  .0000048  0.4566 0.0032  I   -54.173     .237    -4.302     .140 -0.064920  0.484510 -0.4719020   -53.900    -4.200  
+ 4 613 53169.00 I  -.062809  .000060   .485929  .000048  I -.4723215  .0000050  0.3544 0.0035  I   -54.418     .354    -4.242     .340 -0.062670  0.485760 -0.4723950   -54.000    -4.000  
+ 4 614 53170.00 I  -.060448  .000055   .487271  .000053  I -.4725890  .0000050  0.1679 0.0039  I   -54.761     .351    -4.239     .106 -0.060290  0.487340 -0.4726390   -54.100    -4.100  
+ 4 615 53171.00 I  -.057872  .000045   .488518  .000063  I -.4726355  .0000059 -0.0841 0.0039  I   -55.061     .424    -4.370     .113 -0.057860  0.488480 -0.4726280   -54.400    -4.300  
+ 4 616 53172.00 I  -.054925  .000049   .489957  .000067  I -.4724252  .0000061 -0.3231 0.0043  I   -55.187     .388    -4.723     .111 -0.054740  0.489970 -0.4724330   -55.000    -4.500  
+ 4 617 53173.00 I  -.051591  .000048   .491565  .000068  I -.4720151  .0000063 -0.4847 0.0045  I   -55.181     .388    -5.181     .111 -0.051580  0.491350 -0.4720090   -55.400    -4.900  
+ 4 618 53174.00 I  -.048338  .000050   .493356  .000060  I -.4714770  .0000065 -0.5826 0.0051  I   -55.174     .388    -5.476     .111 -0.048070  0.493340 -0.4714770   -55.300    -5.300  
+ 4 619 53175.00 I  -.045151  .000046   .495324  .000063  I -.4708767  .0000080 -0.6002 0.0048  I   -55.250     .308    -5.462     .125 -0.045250  0.495410 -0.4708420   -55.300    -5.400  
+ 4 620 53176.00 I  -.041917  .000078   .497013  .000075  I -.4702972  .0000071 -0.5561 0.0053  I   -55.425     .288    -5.272     .340 -0.041700  0.496900 -0.4702260   -55.300    -5.400  
+ 4 621 53177.00 I  -.038587  .000075   .498380  .000073  I -.4697795  .0000071 -0.4668 0.0051  I   -55.643     .288    -5.124     .340 -0.038620  0.498330 -0.4697110   -55.300    -5.300  
+ 4 622 53178.00 I  -.035038  .000080   .499642  .000083  I -.4693810  .0000074 -0.3251 0.0052  I   -55.762     .277    -5.064     .125 -0.035040  0.499680 -0.4693630   -55.200    -5.100  
+ 4 623 53179.00 I  -.031932  .000081   .500942  .000089  I -.4691325  .0000075 -0.1737 0.0053  I   -55.669     .312    -4.978     .164 -0.031760  0.500860 -0.4691500   -55.200    -5.000  
+ 4 624 53180.00 I  -.028534  .000080   .502083  .000090  I -.4690415  .0000075  0.0015 0.0051  I   -55.478     .312    -4.827     .164 -0.028540  0.502170 -0.4690560   -55.200    -5.000  
+ 4 625 53181.00 I  -.025193  .000078   .503189  .000078  I -.4691332  .0000070  0.1698 0.0054  I   -55.476     .312    -4.719     .164 -0.024900  0.503120 -0.4691160   -55.500    -4.900  
+ 4 626 53182.00 I  -.022008  .000050   .504710  .000071  I -.4693442  .0000079  0.2272 0.0048  I   -55.825     .282    -4.720     .207 -0.022050  0.504870 -0.4693900   -55.900    -4.800  
+ 4 627 53183.00 I  -.019193  .000068   .506084  .000082  I -.4695550  .0000065  0.1866 0.0054  I   -56.434     .231    -4.706     .184 -0.019040  0.505910 -0.4695710   -56.500    -4.500  
+ 4 628 53184.00 I  -.016272  .000064   .507094  .000078  I -.4696938  .0000073  0.0750 0.0055  I   -57.147     .231    -4.546     .184 -0.016150  0.507110 -0.4696610   -57.100    -4.300  
+ 4 629 53185.00 I  -.013092  .000059   .507954  .000066  I -.4696846  .0000088 -0.0979 0.0055  I   -57.873     .163    -4.337     .158 -0.013090  0.507900 -0.4696690   -57.700    -4.200  
+ 4 630 53186.00 I  -.010372  .000058   .509048  .000084  I -.4694788  .0000082 -0.3285 0.0060  I   -58.474     .210    -4.317     .164 -0.010180  0.508950 -0.4694860   -58.000    -4.300  
+ 4 7 1 53187.00 I  -.007575  .000058   .510126  .000084  I -.4690288  .0000083 -0.5554 0.0058  I   -58.723     .210    -4.542     .164 -0.007570  0.510130 -0.4689890   -58.100    -4.500  
+ 4 7 2 53188.00 I  -.004600  .000060   .510900  .000081  I -.4683871  .0000083 -0.7249 0.0084  I   -58.525     .210    -4.803     .164 -0.004540  0.510830 -0.4683790   -58.000    -4.800  
+ 4 7 3 53189.00 I  -.001920  .000037   .511647  .000070  I -.4676191  .0000146 -0.7742 0.0062  I   -58.071     .328    -4.925     .202 -0.001750  0.511710 -0.4676050   -57.900    -5.100  
+ 4 7 4 53190.00 I   .000401  .000040   .512396  .000071  I -.4669017  .0000091 -0.6345 0.0076  I   -57.656     .310    -4.981     .190  0.000410  0.512320 -0.4671130   -57.700    -5.200  
+ 4 7 5 53191.00 I   .002673  .000069   .513106  .000070  I -.4663809  .0000040 -0.4025 0.0047  I   -57.444     .279    -5.093     .165  0.002740  0.512910 -0.4665540   -57.700    -5.200  
+ 4 7 6 53192.00 I   .005049  .000075   .513764  .000052  I -.4660892  .0000025 -0.1930 0.0023  I   -57.499     .289    -5.165     .143  0.005140  0.513650 -0.4661270   -57.700    -5.100  
+ 4 7 7 53193.00 I   .007454  .000087   .514361  .000066  I -.4659612  .0000023 -0.0847 0.0017  I   -57.852     .362    -4.989     .120  0.007380  0.514200 -0.4659470   -57.900    -4.800  
+ 4 7 8 53194.00 I   .009556  .000097   .514766  .000064  I -.4658828  .0000022 -0.0873 0.0017  I   -58.406     .362    -4.582     .120  0.009680  0.514750 -0.4659020   -58.100    -4.500  
+ 4 7 9 53195.00 I   .012039  .000096   .515216  .000056  I -.4657611  .0000025 -0.1665 0.0017  I   -58.912     .350    -4.237     .340  0.012350  0.515160 -0.4657470   -58.300    -4.200  
+ 4 710 53196.00 I   .015246  .000094   .516120  .000052  I -.4655330  .0000027 -0.2962 0.0026  I   -59.201     .330    -4.182     .340  0.015460  0.516110 -0.4655440   -58.600    -4.000  
+ 4 711 53197.00 I   .018248  .000089   .517022  .000046  I -.4651594  .0000045 -0.4538 0.0028  I   -59.368     .340    -4.343     .340  0.018290  0.517010 -0.4651960   -59.000    -4.000  
+ 4 712 53198.00 I   .021364  .000088   .517837  .000045  I -.4646179  .0000049 -0.6341 0.0037  I   -59.584     .337    -4.515     .340  0.021370  0.517650 -0.4646290   -59.300    -4.200  
+ 4 713 53199.00 I   .024113  .000060   .518714  .000042  I -.4638838  .0000058 -0.8368 0.0037  I   -59.834     .195    -4.655     .340  0.024340  0.518770 -0.4638740   -59.600    -4.500  
+ 4 714 53200.00 I   .026250  .000061   .519365  .000056  I -.4629601  .0000056 -0.9921 0.0039  I   -59.973     .176    -4.874     .340  0.026250  0.519040 -0.4629580   -59.800    -4.900  
+ 4 715 53201.00 I   .028217  .000059   .519926  .000056  I -.4619325  .0000053 -1.0487 0.0039  I   -59.978     .176    -5.185     .340  0.028290  0.519920 -0.4619040   -59.800    -5.200  
+ 4 716 53202.00 I   .030203  .000058   .520327  .000054  I -.4608838  .0000054 -1.0421 0.0038  I   -59.958     .176    -5.409     .340  0.030460  0.520300 -0.4608800   -59.800    -5.400  
+ 4 717 53203.00 I   .032705  .000038   .520670  .000056  I -.4598706  .0000055 -0.9687 0.0035  I   -59.985     .214    -5.367     .102  0.032540  0.520650 -0.4598740   -59.800    -5.400  
+ 4 718 53204.00 I   .035672  .000056   .520840  .000054  I -.4589705  .0000043 -0.8230 0.0035  I   -60.037     .190    -5.103     .340  0.035970  0.520750 -0.4591510   -59.900    -5.200  
+ 4 719 53205.00 I   .038660  .000060   .520771  .000052  I -.4582343  .0000043 -0.6481 0.0030  I   -60.095     .330    -4.833     .340  0.038570  0.520680 -0.4583560   -59.900    -4.900  
+ 4 720 53206.00 I   .041511  .000057   .520529  .000041  I -.4576796  .0000043 -0.4574 0.0032  I   -60.153     .407    -4.704     .340  0.041520  0.520480 -0.4576720   -59.900    -4.700  
+ 4 721 53207.00 I   .043961  .000066   .520203  .000063  I -.4573299  .0000048 -0.2355 0.0032  I   -60.166     .391    -4.686     .340  0.044090  0.520190 -0.4573140   -59.900    -4.600  
+ 4 722 53208.00 I   .046939  .000067   .519847  .000064  I -.4571998  .0000048 -0.0400 0.0034  I   -60.113     .391    -4.669     .340  0.046900  0.519710 -0.4572010   -59.900    -4.600  
+ 4 723 53209.00 I   .049952  .000060   .519564  .000057  I -.4572198  .0000047  0.0651 0.0049  I   -60.105     .391    -4.615     .340  0.050240  0.519410 -0.4572220   -60.200    -4.600  
+ 4 724 53210.00 I   .053021  .000055   .519248  .000066  I -.4573009  .0000085  0.0829 0.0050  I   -60.320     .432    -4.562     .144  0.053030  0.519170 -0.4573080   -60.600    -4.600  
+ 4 725 53211.00 I   .056051  .000065   .519070  .000073  I -.4573547  .0000089  0.0078 0.0061  I   -60.829     .253    -4.530     .187  0.056170  0.518960 -0.4575160   -61.200    -4.500  
+ 4 726 53212.00 I   .059028  .000070   .519102  .000071  I -.4572835  .0000088 -0.1665 0.0065  I   -61.514     .253    -4.513     .187  0.059160  0.518990 -0.4573630   -61.700    -4.400  
+ 4 727 53213.00 I   .061412  .000057   .519119  .000062  I -.4570009  .0000096 -0.4032 0.0063  I   -62.137     .250    -4.549     .209  0.061620  0.519010 -0.4569860   -62.100    -4.300  
+ 4 728 53214.00 I   .063962  .000063   .518775  .000095  I -.4564814  .0000090 -0.6269 0.0067  I   -62.446     .326    -4.685     .192  0.064010  0.518560 -0.4565000   -62.000    -4.500  
+ 4 729 53215.00 I   .066369  .000063   .518305  .000107  I -.4557825  .0000094 -0.7442 0.0063  I   -62.337     .326    -4.863     .192  0.066520  0.518320 -0.4557640   -61.800    -4.700  
+ 4 730 53216.00 I   .068319  .000063   .517607  .000108  I -.4550403  .0000089 -0.7195 0.0061  I   -61.963     .326    -4.924     .192  0.068510  0.517600 -0.4550260   -61.400    -4.900  
+ 4 731 53217.00 I   .070361  .000047   .516935  .000098  I -.4543862  .0000078 -0.5666 0.0055  I   -61.633     .425    -4.800     .114  0.070360  0.516990 -0.4544200   -61.200    -5.100  
+ 4 8 1 53218.00 I   .072781  .000043   .516275  .000090  I -.4539457  .0000063 -0.2977 0.0052  I   -61.521     .372    -4.645     .340  0.073010  0.516150 -0.4539160   -61.200    -5.100  
+ 4 8 2 53219.00 I   .075510  .000043   .515710  .000083  I -.4538001  .0000070 -0.0008 0.0052  I   -61.553     .372    -4.644     .340  0.075510  0.515600 -0.4537780   -61.300    -5.000  
+ 4 8 3 53220.00 I   .078334  .000040   .515337  .000041  I -.4539125  .0000084  0.2015 0.0054  I   -61.649     .286    -4.753     .340                                                     
+ 4 8 4 53221.00 I   .081083  .000059   .515209  .000058  I -.4541573  .0000081  0.2665 0.0057  I   -61.898     .243    -4.747     .340                                                     
+ 4 8 5 53222.00 I   .083897  .000056   .515109  .000058  I -.4544068  .0000078  0.2155 0.0056  I   -62.389     .243    -4.551     .340                                                     
+ 4 8 6 53223.00 I   .086289  .000056   .514972  .000062  I -.4545710  .0000078  0.1127 0.0078  I   -62.967     .243    -4.364     .340                                                     
+ 4 8 7 53224.00 I   .088893  .000061   .514756  .000060  I -.4546235  .0000134 -0.0162 0.0066  I   -63.362     .198    -4.403     .131                                                     
+ 4 8 8 53225.00 I   .091703  .000068   .514261  .000055  I -.4545264  .0000107 -0.1816 0.0084  I   -63.499     .204    -4.619     .180                                                     
+ 4 8 9 53226.00 I   .094703  .000073   .513748  .000056  I -.4542593  .0000101 -0.3498 0.0077  I   -63.512     .204    -4.789     .180                                                     
+ 4 810 53227.00 I   .097328  .000057   .513284  .000048  I -.4538279  .0000110 -0.5146 0.0075  I   -63.499     .190    -4.820     .252                                                     
+ 4 811 53228.00 I   .099793  .000053   .512913  .000044  I -.4532509  .0000110 -0.6170 0.0077  I   -63.429     .190    -4.835     .252                                                     
+ 4 812 53229.00 I   .102671  .000053   .512912  .000045  I -.4526176  .0000109 -0.6481 0.0071  I   -63.295     .190    -4.959     .252                                                     
+ 4 813 53230.00 I   .105716  .000053   .513243  .000051  I -.4519727  .0000091 -0.6250 0.0075  I   -63.171     .190    -5.123     .252                                                     
+ 4 814 53231.00 I   .108723  .000025   .513578  .000059  I -.4513936  .0000103 -0.5240 0.0059  I   -63.092     .128    -5.149     .182                                                     
+ 4 815 53232.00 I   .111601  .000036   .513710  .000073  I -.4509461  .0000075 -0.3589 0.0063  I   -63.011     .740    -4.970     .131                                                     
+ 4 816 53233.00 I   .114518  .000039   .513525  .000078  I -.4506962  .0000074 -0.1327 0.0053  I   -62.912     .740    -4.710     .131                                                     
+ 4 817 53234.00 I   .117350  .000044   .513055  .000071  I -.4506875  .0000074  0.1139 0.0051  I   -62.857     .740    -4.550     .340                                                     
+ 4 818 53235.00 I   .119692  .000074   .512403  .000087  I -.4509139  .0000071  0.3302 0.0052  I   -62.883     .160    -4.566     .114                                                     
+ 4 819 53236.00 I   .122032  .000073   .511787  .000084  I -.4513301  .0000072  0.4931 0.0050  I   -62.940     .160    -4.674     .114                                                     
+ 4 820 53237.00 I   .124064  .000080   .511184  .000087  I -.4518682  .0000069  0.5603 0.0050  I   -63.005     .160    -4.739     .114                                                     
+ 4 821 53238.00 I   .126381  .000083   .510397  .000089  I -.4524049  .0000070  0.4901 0.0043  I   -63.161     .200    -4.703     .133                                                     
+ 4 822 53239.00 I   .128317  .000078   .509289  .000087  I -.4528121  .0000052  0.3109 0.0046  I   -63.495     .172    -4.622     .113                                                     
+ 4 823 53240.00 I   .130124  .000087   .507871  .000091  I -.4530115  .0000061  0.0861 0.0042  I   -63.939     .172    -4.597     .113                                                     
+ 4 824 53241.00 I   .132327  .000037   .506361  .000067  I -.4529954  .0000067 -0.1055 0.0050  I   -64.263     .740    -4.676     .340                                                     
+ 4 825 53242.00 I   .134350  .000050   .504927  .000068  I -.4528134  .0000080 -0.2584 0.0052  I   -64.246     .126    -4.815     .340                                                     
+ 4 826 53243.00 I   .136176  .000051   .503711  .000068  I -.4524934  .0000079 -0.3669 0.0057  I   -63.877     .126    -4.893     .340                                                     
+ 4 827 53244.00 I   .138473  .000054   .502455  .000068  I -.4521208  .0000080 -0.3518 0.0087  I   -63.406     .126    -4.799     .340                                                     
+ 4 828 53245.00 I   .141017  .000057   .501217  .000063  I -.4518467  .0000155 -0.1661 0.0076  P   -63.172     .600    -4.511     .600                                                     
+ 4 829 53246.00 I   .143724  .000058   .499942  .000066  I -.4518233  .0000130  0.1237 0.0100  P   -63.216     .600    -4.226     .600                                                     
+ 4 830 53247.00 I   .146735  .000058   .498642  .000065  I -.4520879  .0000126  0.3948 0.0091  P   -63.377     .600    -4.094     .600                                                     
+ 4 831 53248.00 I   .149528  .000048   .497266  .000060  I -.4525797  .0000126  0.5664 0.0090  P   -63.473     .600    -4.134     .600                                                     
+ 4 9 1 53249.00 I   .152127  .000048   .495657  .000060  I -.4531729  .0000128  0.5948 0.0103  P   -63.565     .600    -4.206     .600                                                     
+ 4 9 2 53250.00 I   .154737  .000045   .493902  .000060  I -.4537242  .0000163  0.4880 0.0104  P   -63.844     .600    -4.210     .600                                                     
+ 4 9 3 53251.00 I   .157024  .000046   .491950  .000057  I -.4541177  .0000163  0.2875 0.0116  P   -64.326     .600    -4.205     .600                                                     
+ 4 9 4 53252.00 I   .159212  .000045   .489734  .000056  I -.4542779  .0000166  0.0231 0.0115  P   -64.786     .600    -4.298     .600                                                     
+ 4 9 5 53253.00 I   .161557  .000043   .487316  .000049  I -.4541614  .0000163 -0.2489 0.0109  P   -64.991     .600    -4.446     .600                                                     
+ 4 9 6 53254.00 I   .163658  .000033   .484857  .000040  I -.4537921  .0000140 -0.4849 0.0108  P   -64.896     .600    -4.501     .600                                                     
+ 4 9 7 53255.00 I   .165419  .000032   .482637  .000037  I -.4532001  .0000143 -0.6952 0.0087  P   -64.606     .600    -4.416     .600                                                     
+ 4 9 8 53256.00 I   .167322  .000027   .480727  .000026  I -.4524551  .0000105 -0.7451 0.0087  P   -64.240     .600    -4.329     .600                                                     
+ 4 9 9 53257.00 I   .169420  .000023   .478990  .000018  I -.4516544  .0000098                 P   -63.885     .600    -4.385     .600                                                     
+ 4 910 53258.00 P  0.171467 0.004200  0.477353 0.004200  P -.4509247  .0000094                 P   -63.605     .600    -4.550     .600                                                     
+ 4 911 53259.00 P  0.173411 0.005100  0.475723 0.005100  P -.4503884  .0000096                 P   -63.419     .600    -4.649     .600                                                     
+ 4 912 53260.00 P  0.175264 0.005713  0.474087 0.005713  P -.4501214  .0000120                 P   -63.312     .600    -4.560     .600                                                     
+ 4 913 53261.00 P  0.177037 0.006192  0.472436 0.006192  P -.4501491  .0000114                 P   -63.272     .600    -4.327     .600                                                     
+ 4 914 53262.00 P  0.178738 0.006591  0.470764 0.006591  P -.4504461  .0000106                 P   -63.307     .600    -4.111     .600                                                     
+ 4 915 53263.00 P  0.180376 0.006936  0.469070 0.006936  P-0.4509294 0.0003000                 P   -63.406     .600    -4.047     .600                                                     
+ 4 916 53264.00 P  0.181956 0.007242  0.467351 0.007242  P-0.4514721 0.0005048                 P   -63.522     .600    -4.143     .600                                                     
+ 4 917 53265.00 P  0.183483 0.007518  0.465607 0.007518  P-0.4519581 0.0006844                 P   -63.631     .600    -4.283     .600                                                     
+ 4 918 53266.00 P  0.184961 0.007770  0.463838 0.007770  P-0.4523358 0.0008494                 P   -63.761     .600    -4.340     .600                                                     
+ 4 919 53267.00 P  0.186394 0.008003  0.462044 0.008003  P-0.4525694 0.0010043                 P   -63.935     .600    -4.296     .600                                                     
+ 4 920 53268.00 P  0.187784 0.008219  0.460226 0.008219  P-0.4526379 0.0011516                 P   -64.084     .600    -4.237     .600                                                     
+ 4 921 53269.00 P  0.189133 0.008422  0.458385 0.008422  P-0.4525611 0.0012929                 P   -64.063     .600    -4.241     .600                                                     
+ 4 922 53270.00 P  0.190444 0.008613  0.456520 0.008613  P-0.4524069 0.0014292                 P   -63.767     .600    -4.287     .600                                                     
+ 4 923 53271.00 P  0.191717 0.008794  0.454633 0.008794  P-0.4522814 0.0015613                 P   -63.254     .600    -4.291     .600                                                     
+ 4 924 53272.00 P  0.192953 0.008965  0.452724 0.008965  P-0.4523216 0.0016899                 P   -62.740     .600    -4.187     .600                                                     
+ 4 925 53273.00 P  0.194154 0.009129  0.450794 0.009129  P-0.4526384 0.0018152                 P   -62.445     .600    -3.986     .600                                                     
+ 4 926 53274.00 P  0.195320 0.009285  0.448843 0.009285  P-0.4532626 0.0019377                 P   -62.421     .600    -3.759     .600                                                     
+ 4 927 53275.00 P  0.196451 0.009435  0.446873 0.009435  P-0.4541610 0.0020577                 P   -62.529     .600    -3.584     .600                                                     
+ 4 928 53276.00 P  0.197548 0.009579  0.444882 0.009579  P-0.4552339 0.0021755                 P   -62.603     .600    -3.495     .600                                                     
+ 4 929 53277.00 P  0.198610 0.009717  0.442876 0.009717  P-0.4563520 0.0022911                 P   -62.624     .600    -3.476     .600                                                     
+ 4 930 53278.00 P  0.199639 0.009851  0.440847 0.009851  P-0.4573954 0.0024048                 P   -62.720     .600    -3.511     .600                                                     
+ 410 1 53279.00 P  0.200633 0.009980  0.438801 0.009980  P-0.4582793 0.0025168                 P   -62.992     .600    -3.612     .600                                                     
+ 410 2 53280.00 P  0.201593 0.010105  0.436738 0.010105  P-0.4589605 0.0026272                 P   -63.350     .600    -3.771     .600                                                     
+ 410 3 53281.00 P  0.202519 0.010226  0.434658 0.010226  P-0.4594370 0.0027360                 P   -63.560     .600    -3.904     .600                                                     
+ 410 4 53282.00 P  0.203410 0.010344  0.432562 0.010344  P-0.4597357 0.0028434                 P   -63.441     .600    -3.908     .600                                                     
+ 410 5 53283.00 P  0.204268 0.010458  0.430450 0.010458  P-0.4599121 0.0029495                 P   -63.020     .600    -3.802     .600                                                     
+ 410 6 53284.00 P  0.205090 0.010569  0.428324 0.010569  P-0.4600421 0.0030543                 P   -62.477     .600    -3.737     .600                                                     
+ 410 7 53285.00 P  0.205879 0.010677  0.426182 0.010677  P-0.4602003 0.0031580                 P   -61.967     .600    -3.823     .600                                                     
+ 410 8 53286.00 P  0.206632 0.010783  0.424026 0.010783  P-0.4604591 0.0032605                 P   -61.539     .600    -3.988     .600                                                     
+ 410 9 53287.00 P  0.207351 0.010885  0.421857 0.010885  P-0.4608814 0.0033620                 P   -61.222     .600    -4.054     .600                                                     
+ 41010 53288.00 P  0.208034 0.010986  0.419674 0.010986  P-0.4615152 0.0034624                 P   -61.099     .600    -3.928     .600                                                     
+ 41011 53289.00 P  0.208683 0.011084  0.417479 0.011084  P-0.4623817 0.0035619                 P   -61.220     .600    -3.664     .600                                                     
+ 41012 53290.00 P  0.209297 0.011180  0.415272 0.011180  P-0.4634664 0.0036605                 P   -61.490     .600    -3.385     .600                                                     
+ 41013 53291.00 P  0.209875 0.011274  0.413054 0.011274  P-0.4647095 0.0037582                 P   -61.727     .600    -3.195     .600                                                     
+ 41014 53292.00 P  0.210419 0.011365  0.410825 0.011365  P-0.4660094 0.0038551                 P   -61.835     .600    -3.154     .600                                                     
+ 41015 53293.00 P  0.210927 0.011455  0.408585 0.011455  P-0.4672379 0.0039512                 P   -61.854     .600    -3.251     .600                                                     
+ 41016 53294.00 P  0.211399 0.011544  0.406335 0.011544  P-0.4682771 0.0040465                 P   -61.852     .600    -3.399     .600                                                     
+ 41017 53295.00 P  0.211837 0.011630  0.404076 0.011630  P-0.4690588 0.0041411                 P   -61.826     .600    -3.484     .600                                                     
+ 41018 53296.00 P  0.212239 0.011715  0.401809 0.011715  P-0.4695842 0.0042349                 P   -61.727     .600    -3.468     .600                                                     
+ 41019 53297.00 P  0.212606 0.011798  0.399533 0.011798  P-0.4699288 0.0043281                 P   -61.512     .600    -3.407     .600                                                     
+ 41020 53298.00 P  0.212937 0.011880  0.397249 0.011880  P-0.4702173 0.0044206                 P   -61.163     .600    -3.369     .600                                                     
+ 41021 53299.00 P  0.213233 0.011961  0.394959 0.011961  P-0.4705836 0.0045125                 P   -60.705     .600    -3.358     .600                                                     
+ 41022 53300.00 P  0.213494 0.012040  0.392661 0.012040  P-0.4711389 0.0046037                 P   -60.231     .600    -3.329     .600                                                     
+ 41023 53301.00 P  0.213720 0.012118  0.390358 0.012118  P-0.4719346 0.0046944                 P   -59.867     .600    -3.247     .600                                                     
+ 41024 53302.00 P  0.213911 0.012194  0.388050 0.012194  P-0.4729557 0.0047844                 P   -59.696     .600    -3.112     .600                                                     
+ 41025 53303.00 P  0.214067 0.012269  0.385736 0.012269  P-0.4741376 0.0048740                 P   -59.701     .600    -2.940     .600                                                     
+ 41026 53304.00 P  0.214188 0.012343  0.383419 0.012343  P-0.4753802 0.0049629                 P   -59.782     .600    -2.749     .600                                                     
+ 41027 53305.00 P  0.214244 0.012416  0.381097 0.012416  P-0.4765759 0.0050514                 P   -59.837     .600    -2.585     .600                                                     
+ 41028 53306.00 P  0.214299 0.012488  0.378772 0.012488  P-0.4776326 0.0051393                 P   -59.839     .600    -2.523     .600                                                     
+ 41029 53307.00 P  0.214319 0.012559  0.376445 0.012559  P-0.4784898 0.0052268                 P   -59.858     .600    -2.623     .600                                                     
+ 41030 53308.00 P  0.214305 0.012629  0.374115 0.012629  P-0.4791295 0.0053137                 P   -59.949     .600    -2.851     .600                                                     
+ 41031 53309.00 P  0.214256 0.012698  0.371785 0.012698  P-0.4795725 0.0054002                 P   -60.031     .600    -3.063     .600                                                     
+ 411 1 53310.00 P  0.214173 0.012766  0.369453 0.012766  P-0.4798642 0.0054862                 P   -59.933     .600    -3.127     .600                                                     
+ 411 2 53311.00 P  0.214056 0.012833  0.367120 0.012833  P-0.4800693 0.0055718                 P   -59.593     .600    -3.064     .600                                                     
+ 411 3 53312.00 P  0.213905 0.012899  0.364788 0.012899  P-0.4802650 0.0056570                 P   -59.120     .600    -3.029     .600                                                     
+ 411 4 53313.00 P  0.213721 0.012964  0.362456 0.012964  P-0.4805271 0.0057417                 P   -58.635     .600    -3.108     .600                                                     
+ 411 5 53314.00 P  0.213503 0.013028  0.360126 0.013028  P-0.4809198 0.0058260                 P   -58.155     .600    -3.196     .600                                                     
+ 411 6 53315.00 P  0.213252 0.013092  0.357798 0.013092  P-0.4814890 0.0059099                 P   -57.729     .600    -3.129     .600                                                     
+ 411 7 53316.00 P  0.212968 0.013155  0.355472 0.013155  P-0.4822615 0.0059934                 P   -57.552     .600    -2.892     .600                                                     
+ 411 8 53317.00 P  0.212652 0.013217  0.353148 0.013217  P-0.4832419 0.0060766                 P   -57.772     .600    -2.612     .600                                                     
+ 411 9 53318.00 P  0.212303 0.013278  0.350829 0.013278  P-0.4844015 0.0061593                 P   -58.248     .600    -2.372     .600                                                     
+ 41110 53319.00 P  0.211922 0.013339  0.348513 0.013339  P-0.4856693 0.0062417                 P   -58.656     .600    -2.159     .600                                                     
+ 41111 53320.00 P  0.211509 0.013399  0.346202 0.013399  P-0.4869359 0.0063237                 P   -58.830     .600    -1.987     .600                                                     
+ 41112 53321.00 P  0.211064 0.013458  0.343895 0.013458  P-0.4880774 0.0064054                 P   -58.840     .600    -1.960     .600                                                     
+ 41113 53322.00 P  0.210588 0.013517  0.341595 0.013517  P-0.4889940 0.0064868                 P   -58.763     .600    -2.124     .600                                                     
+ 41114 53323.00 P  0.210080 0.013574  0.339300 0.013574  P-0.4896480 0.0065677                 P   -58.573     .600    -2.343     .600                                                     
+ 41115 53324.00 P  0.209542 0.013632  0.337013 0.013632  P-0.4900829 0.0066484                 P   -58.275     .600    -2.425     .600                                                     
+ 41116 53325.00 P  0.208973 0.013688  0.334732 0.013688  P-0.4904113 0.0067288                 P   -57.988     .600    -2.343     .600                                                     
+ 41117 53326.00 P  0.208374 0.013744  0.332459 0.013744  P-0.4907765 0.0068088                 P   -57.796     .600    -2.241     .600                                                     
+ 41118 53327.00 P  0.207745 0.013800  0.330195 0.013800  P-0.4913008 0.0068885                 P   -57.631     .600    -2.220     .600                                                     
+ 41119 53328.00 P  0.207086 0.013855  0.327939 0.013855  P-0.4920473 0.0069679                 P   -57.402     .600    -2.228     .600                                                     
+ 41120 53329.00 P  0.206397 0.013909  0.325692 0.013909  P-0.4930066 0.0070470                 P   -57.147     .600    -2.156     .600                                                     
+ 41121 53330.00 P  0.205680 0.013963  0.323456 0.013963  P-0.4941120 0.0071258                 P   -56.995     .600    -1.986     .600                                                     
+ 41122 53331.00 P  0.204933 0.014016  0.321229 0.014016  P-0.4952659 0.0072044                 P   -57.018     .600    -1.781     .600                                                     
+ 41123 53332.00 P  0.204158 0.014069  0.319013 0.014069  P-0.4963647 0.0072826                 P   -57.155     .600    -1.586     .600                                                     
+ 41124 53333.00 P  0.203355 0.014121  0.316809 0.014121  P-0.4973191 0.0073606                 P   -57.259     .600    -1.417     .600                                                     
+ 41125 53334.00 P  0.202524 0.014173  0.314617 0.014173  P-0.4980683 0.0074383                 P   -57.213     .600    -1.326     .600                                                     
+ 41126 53335.00 P  0.201665 0.014224  0.312436 0.014224  P-0.4985873 0.0075157                                                                                                             
+ 41127 53336.00 P  0.200779 0.014275  0.310269 0.014275  P-0.4988853 0.0075928                                                                                                             
+ 41128 53337.00 P  0.199866 0.014326  0.308115 0.014326  P-0.4990014 0.0076697                                                                                                             
+ 41129 53338.00 P  0.198926 0.014376  0.305974 0.014376  P-0.4989981 0.0077464                                                                                                             
+ 41130 53339.00 P  0.197960 0.014425  0.303848 0.014425  P-0.4989511 0.0078228                                                                                                             
+ 412 1 53340.00 P  0.196967 0.014474  0.301736 0.014474  P-0.4989372 0.0078989                                                                                                             
+ 412 2 53341.00 P  0.195949 0.014523  0.299639 0.014523  P-0.4990270 0.0079748                                                                                                             
+ 412 3 53342.00 P  0.194906 0.014571  0.297558 0.014571  P-0.4992734 0.0080505                                                                                                             
+ 412 4 53343.00 P  0.193837 0.014619  0.295494 0.014619  P-0.4997076 0.0081259                                                                                                             
+ 412 5 53344.00 P  0.192744 0.014666  0.293445 0.014666  P-0.5003367 0.0082011                                                                                                             
+ 412 6 53345.00 P  0.191626 0.014713  0.291413 0.014713  P-0.5011417 0.0082761                                                                                                             
+ 412 7 53346.00 P  0.190485 0.014760  0.289399 0.014760  P-0.5020732 0.0083508                                                                                                             
+ 412 8 53347.00 P  0.189319 0.014806  0.287403 0.014806  P-0.5030459 0.0084254                                                                                                             
+ 412 9 53348.00 P  0.188130 0.014852  0.285424 0.014852  P-0.5039492 0.0084997                                                                                                             
+ 41210 53349.00 P  0.186918 0.014897  0.283464 0.014897  P-0.5046735 0.0085737                                                                                                             
+ 41211 53350.00 P  0.185683 0.014943  0.281523 0.014943  P-0.5051471 0.0086476                                                                                                             
+ 41212 53351.00 P  0.184425 0.014987  0.279602 0.014987  P-0.5053720 0.0087213                                                                                                             
+ 41213 53352.00 P  0.183146 0.015032  0.277700 0.015032  P-0.5054332 0.0087948                                                                                                             
+ 41214 53353.00 P  0.181844 0.015076  0.275819 0.015076  P-0.5054706 0.0088680                                                                                                             
+ 41215 53354.00 P  0.180522 0.015120  0.273958 0.015120  P-0.5056282 0.0089411                                                                                                             
+ 41216 53355.00 P  0.179178 0.015163  0.272118 0.015163  P-0.5059987 0.0090139                                                                                                             
+ 41217 53356.00 P  0.177813 0.015206  0.270299 0.015206  P-0.5065953 0.0090866                                                                                                             
+ 41218 53357.00 P  0.176428 0.015249  0.268502 0.015249  P-0.5073581 0.0091591                                                                                                             
+ 41219 53358.00 P  0.175023 0.015292  0.266726 0.015292  P-0.5081832 0.0092314                                                                                                             
+ 41220 53359.00 P  0.173598 0.015334  0.264974 0.015334  P-0.5089593 0.0093035                                                                                                             
+ 41221 53360.00 P  0.172153 0.015376  0.263243 0.015376  P-0.5095954 0.0093754                                                                                                             
+ 41222 53361.00 P  0.170690 0.015418  0.261536 0.015418  P-0.5100343 0.0094471                                                                                                             
+ 41223 53362.00 P  0.169208 0.015459  0.259852 0.015459  P-0.5102545 0.0095186                                                                                                             
+ 41224 53363.00 P  0.167707 0.015500  0.258192 0.015500  P-0.5103288 0.0095900                                                                                                             
+ 41225 53364.00 P  0.166188 0.015541  0.256555 0.015541  P-0.5102251 0.0096612                                                                                                             
+ 41226 53365.00 P  0.164651 0.015581  0.254943 0.015581  P-0.5099981 0.0097322                                                                                                             
+ 41227 53366.00 P  0.163097 0.015622  0.253355 0.015622  P-0.5097180 0.0098031                                                                                                             
+ 41228 53367.00 P  0.161526 0.015662  0.251792 0.015662  P-0.5094608 0.0098738                                                                                                             
+ 41229 53368.00 P  0.159938 0.015701  0.250255 0.015701  P-0.5092973 0.0099443                                                                                                             
+ 41230 53369.00 P  0.158334 0.015741  0.248742 0.015741  P-0.5092826 0.0100146                                                                                                             
+ 41231 53370.00 P  0.156714 0.015780  0.247255 0.015780  P-0.5094488 0.0100848                                                                                                             
+ 5 1 1 53371.00 P  0.155077 0.015819  0.245794 0.015819  P-0.5098034 0.0101548                                                                                                             
+ 5 1 2 53372.00 P  0.153426 0.015858  0.244359 0.015858  P-0.5103293 0.0102247                                                                                                             
+ 5 1 3 53373.00 P  0.151759 0.015896  0.242950 0.015896  P-0.5109851 0.0102944                                                                                                             
+ 5 1 4 53374.00 P  0.150077 0.015935  0.241568 0.015935  P-0.5117037 0.0103639                                                                                                             
+ 5 1 5 53375.00 P  0.148381 0.015973  0.240213 0.015973  P-0.5123955 0.0104333                                                                                                             
+ 5 1 6 53376.00 P  0.146671 0.016010  0.238885 0.016010  P-0.5129620 0.0105026                                                                                                             
+ 5 1 7 53377.00 P  0.144947 0.016048  0.237584 0.016048  P-0.5133239 0.0105716                                                                                                             
+ 5 1 8 53378.00 P  0.143210 0.016085  0.236310 0.016085  P-0.5134554 0.0106406                                                                                                             
+ 5 1 9 53379.00 P  0.141459 0.016122  0.235064 0.016122  P-0.5134074 0.0107094                                                                                                             
+ 5 110 53380.00 P  0.139696 0.016159  0.233845 0.016159  P-0.5133019 0.0107780                                                                                                             
+ 5 111 53381.00 P  0.137920 0.016196  0.232655 0.016196  P-0.5132921 0.0108465                                                                                                             
+ 5 112 53382.00 P  0.136132 0.016232  0.231492 0.016232  P-0.5135043 0.0109149                                                                                                             
+ 5 113 53383.00 P  0.134333 0.016269  0.230358 0.016269  P-0.5139901 0.0109831                                                                                                             
+ 5 114 53384.00 P  0.132521 0.016305  0.229252 0.016305  P-0.5147105 0.0110512                                                                                                             
+ 5 115 53385.00 P  0.130699 0.016341  0.228175 0.016341  P-0.5155576 0.0111191                                                                                                             
+ 5 116 53386.00 P  0.128866 0.016376  0.227126 0.016376  P-0.5163974 0.0111869                                                                                                             
+ 5 117 53387.00 P  0.127022 0.016412  0.226107 0.016412  P-0.5171127 0.0112546                                                                                                             
+ 5 118 53388.00 P  0.125168 0.016447  0.225116 0.016447  P-0.5176277 0.0113221                                                                                                             
+ 5 119 53389.00 P  0.123305 0.016482  0.224154 0.016482  P-0.5179132 0.0113895                                                                                                             
+ 5 120 53390.00 P  0.121431 0.016517  0.223221 0.016517  P-0.5179776 0.0114567                                                                                                             
+ 5 121 53391.00 P  0.119549 0.016552  0.222318 0.016552  P-0.5178570 0.0115239                                                                                                             
+ 5 122 53392.00 P  0.117658 0.016586  0.221444 0.016586  P-0.5176063 0.0115909                                                                                                             
+ 5 123 53393.00 P  0.115758 0.016620  0.220599 0.016620  P-0.5172938 0.0116577                                                                                                             
+ 5 124 53394.00 P  0.113850 0.016654  0.219783 0.016654  P-0.5169945 0.0117245                                                                                                             
+ 5 125 53395.00 P  0.111934 0.016688  0.218998 0.016688  P-0.5167813 0.0117911                                                                                                             
+ 5 126 53396.00 P  0.110011 0.016722  0.218241 0.016722  P-0.5167145 0.0118576                                                                                                             
+ 5 127 53397.00 P  0.108080 0.016756  0.217515 0.016756  P-0.5168331 0.0119240                                                                                                             
+ 5 128 53398.00 P  0.106142 0.016789  0.216818 0.016789  P-0.5171485 0.0119902                                                                                                             
+ 5 129 53399.00 P  0.104198 0.016822  0.216151 0.016822  P-0.5176434 0.0120563                                                                                                             
+ 5 130 53400.00 P  0.102248 0.016856  0.215513 0.016856  P-0.5182740 0.0121223                                                                                                             
+ 5 131 53401.00 P  0.100292 0.016888  0.214906 0.016888  P-0.5189751 0.0121882                                                                                                             
+ 5 2 1 53402.00 P  0.098330 0.016921  0.214328 0.016921  P-0.5196660 0.0122540                                                                                                             
+ 5 2 2 53403.00 P  0.096363 0.016954  0.213780 0.016954  P-0.5202611 0.0123196                                                                                                             
+ 5 2 3 53404.00 P  0.094391 0.016986  0.213261 0.016986  P-0.5206869 0.0123852                                                                                                             
+ 5 2 4 53405.00 P  0.092415 0.017019  0.212773 0.017019  P-0.5209070 0.0124506                                                                                                             
+ 5 2 5 53406.00 P  0.090434 0.017051  0.212314 0.017051  P-0.5209454 0.0125159                                                                                                             
+ 5 2 6 53407.00 P  0.088449 0.017083  0.211885 0.017083  P-0.5208947 0.0125811                                                                                                             
+ 5 2 7 53408.00 P  0.086461 0.017114  0.211486 0.017114  P-0.5208967 0.0126462                                                                                                             
+ 5 2 8 53409.00 P  0.084470 0.017146  0.211116 0.017146  P-0.5210965 0.0127112                                                                                                             
+ 5 2 9 53410.00 P  0.082475 0.017178  0.210776 0.017178  P-0.5215885 0.0127760                                                                                                             
+ 5 210 53411.00 P  0.080479 0.017209  0.210465 0.017209  P-0.5223791 0.0128408                                                                                                             
+ 5 211 53412.00 P  0.078480 0.017240  0.210184 0.017240  P-0.5233845 0.0129054                                                                                                             
+ 5 212 53413.00 P  0.076479 0.017271  0.209933 0.017271  P-0.5244640 0.0129699                                                                                                             
+ 5 213 53414.00 P  0.074476 0.017302  0.209711 0.017302  P-0.5254701 0.0130344                                                                                                             
+ 5 214 53415.00 P  0.072473 0.017333  0.209518 0.017333  P-0.5262913 0.0130987                                                                                                             
+ 5 215 53416.00 P  0.070468 0.017364  0.209355 0.017364  P-0.5268723 0.0131629                                                                                                             
+ 5 216 53417.00 P  0.068463 0.017394  0.209221 0.017394  P-0.5272107 0.0132270                                                                                                             
+ 5 217 53418.00 P  0.066458 0.017425  0.209116 0.017425  P-0.5273423 0.0132910                                                                                                             
+ 5 218 53419.00 P  0.064453 0.017455  0.209039 0.017455  P-0.5273257 0.0133550                                                                                                             
+ 5 219 53420.00 P  0.062449 0.017485  0.208992 0.017485  P-0.5272315 0.0134188                                                                                                             
+ 5 220 53421.00 P  0.060445 0.017515  0.208974 0.017515  P-0.5271361 0.0134825                                                                                                             
+ 5 221 53422.00 P  0.058443 0.017545  0.208984 0.017545  P-0.5271148 0.0135461                                                                                                             
+ 5 222 53423.00 P  0.056442 0.017574  0.209023 0.017574  P-0.5272339 0.0136096                                                                                                             
+ 5 223 53424.00 P  0.054443 0.017604  0.209090 0.017604  P-0.5275409 0.0136730                                                                                                             
+ 5 224 53425.00 P  0.052447 0.017633  0.209186 0.017633  P-0.5280573 0.0137363                                                                                                             
+ 5 225 53426.00 P  0.050453 0.017663  0.209309 0.017663  P-0.5287729 0.0137995                                                                                                             
+ 5 226 53427.00 P  0.048462 0.017692  0.209461 0.017692  P-0.5296448 0.0138627                                                                                                             
+ 5 227 53428.00 P  0.046475 0.017721  0.209641 0.017721  P-0.5306033 0.0139257                                                                                                             
+ 5 228 53429.00 P  0.044491 0.017750  0.209848 0.017750  P-0.5315616 0.0139886                                                                                                             
+ 5 3 1 53430.00 P  0.042511 0.017779  0.210083 0.017779  P-0.5324305 0.0140514                                                                                                             
+ 5 3 2 53431.00 P  0.040536 0.017808  0.210346 0.017808  P-0.5331361 0.0141142                                                                                                             
+ 5 3 3 53432.00 P  0.038565 0.017836  0.210636 0.017836  P-0.5336392 0.0141768                                                                                                             
+ 5 3 4 53433.00 P  0.036600 0.017865  0.210953 0.017865  P-0.5339518 0.0142394                                                                                                             
+ 5 3 5 53434.00 P  0.034640 0.017893  0.211297 0.017893  P-0.5341455 0.0143019                                                                                                             
+ 5 3 6 53435.00 P  0.032686 0.017921  0.211667 0.017921  P-0.5343417 0.0143642                                                                                                             
+ 5 3 7 53436.00 P  0.030739 0.017949  0.212065 0.017949  P-0.5346819 0.0144265                                                                                                             
+ 5 3 8 53437.00 P  0.028797 0.017977  0.212488 0.017977  P-0.5352835 0.0144887                                                                                                             
+ 5 3 9 53438.00 P  0.026863 0.018005  0.212938 0.018005  P-0.5361962 0.0145508                                                                                                             
+ 5 310 53439.00 P  0.024936 0.018033  0.213414 0.018033  P-0.5373812 0.0146129                                                                                                             
+ 5 311 53440.00 P  0.023017 0.018061  0.213916 0.018061  P-0.5387212 0.0146748                                                                                                             
+ 5 312 53441.00 P  0.021106 0.018088  0.214444 0.018088  P-0.5400604 0.0147367                                                                                                             
+ 5 313 53442.00 P  0.019204 0.018116  0.214997 0.018116  P-0.5412527 0.0147984                                                                                                             
+ 5 314 53443.00 P  0.017310 0.018143  0.215575 0.018143  P-0.5421992 0.0148601                                                                                                             
+ 5 315 53444.00 P  0.015425 0.018170  0.216178 0.018170  P-0.5428621 0.0149217                                                                                                             
+ 5 316 53445.00 P  0.013550 0.018198  0.216807 0.018198  P-0.5432584 0.0149832                                                                                                             
+ 5 317 53446.00 P  0.011684 0.018225  0.217459 0.018225  P-0.5434432 0.0150446                                                                                                             
+ 5 318 53447.00 P  0.009829 0.018252  0.218137 0.018252  P-0.5434936 0.0151060                                                                                                             
+ 5 319 53448.00 P  0.008012 0.018278  0.218824 0.018278  P-0.5434951 0.0151672                                                                                                             
+ 5 320 53449.00 P  0.006205 0.018305  0.219536 0.018305  P-0.5435302 0.0152284                                                                                                             
+ 5 321 53450.00 P  0.004410 0.018332  0.220271 0.018332  P-0.5436681 0.0152895                                                                                                             
+ 5 322 53451.00 P  0.002626 0.018358  0.221030 0.018358  P-0.5439554 0.0153505                                                                                                             
+ 5 323 53452.00 P  0.000854 0.018385  0.221812 0.018385  P-0.5444110 0.0154114                                                                                                             
+ 5 324 53453.00 P -0.000905 0.018411  0.222617 0.018411  P-0.5450251 0.0154723                                                                                                             
+ 5 325 53454.00 P -0.002651 0.018437  0.223445 0.018437  P-0.5457597 0.0155331                                                                                                             
+ 5 326 53455.00 P -0.004384 0.018464  0.224295 0.018464  P-0.5465522 0.0155938                                                                                                             
+ 5 327 53456.00 P -0.006103 0.018490  0.225168 0.018490  P-0.5473227 0.0156544                                                                                                             
+ 5 328 53457.00 P -0.007809 0.018516  0.226063 0.018516  P-0.5479887 0.0157149                                                                                                             
+ 5 329 53458.00 P -0.009500 0.018541  0.226979 0.018541  P-0.5484844 0.0157754                                                                                                             
+ 5 330 53459.00 P -0.011177 0.018567  0.227918 0.018567  P-0.5487794 0.0158358                                                                                                             
+ 5 331 53460.00 P -0.012839 0.018593  0.228877 0.018593  P-0.5488933 0.0158961                                                                                                             
+ 5 4 1 53461.00 P -0.014485 0.018619  0.229858 0.018619  P-0.5488997 0.0159563                                                                                                             
+ 5 4 2 53462.00 P -0.016115 0.018644  0.230860 0.018644  P-0.5489169 0.0160165                                                                                                             
+ 5 4 3 53463.00 P -0.017730 0.018669  0.231882 0.018669  P-0.5490819 0.0160765                                                                                                             
+ 5 4 4 53464.00 P -0.019328 0.018695  0.232924 0.018695  P-0.5495117 0.0161366                                                                                                             
+ 5 4 5 53465.00 P -0.020909 0.018720  0.233987 0.018720  P-0.5502646 0.0161965                                                                                                             
+ 5 4 6 53466.00 P -0.022474 0.018745  0.235069 0.018745  P-0.5513150 0.0162563                                                                                                             
+ 5 4 7 53467.00 P -0.024020 0.018770  0.236171 0.018770  P-0.5525573 0.0163161                                                                                                             
+ 5 4 8 53468.00 P -0.025549 0.018795  0.237292 0.018795  P-0.5538381 0.0163758                                                                                                             
+ 5 4 9 53469.00 P -0.027060 0.018820  0.238432 0.018820  P-0.5550027 0.0164355                                                                                                             
+ 5 410 53470.00 P -0.028552 0.018845  0.239591 0.018845  P-0.5559384 0.0164951                                                                                                             
+ 5 411 53471.00 P -0.030026 0.018870  0.240768 0.018870  P-0.5565964 0.0165546                                                                                                             
+ 5 412 53472.00 P -0.031480 0.018894  0.241963 0.018894  P-0.5569916 0.0166140                                                                                                             
+ 5 413 53473.00 P -0.032915 0.018919  0.243176 0.018919  P-0.5571830 0.0166733                                                                                                             
+ 5 414 53474.00 P -0.034331 0.018943  0.244407 0.018943  P-0.5572454 0.0167326                                                                                                             
+ 5 415 53475.00 P -0.035726 0.018968  0.245656 0.018968  P-0.5572518 0.0167919                                                                                                             
+ 5 416 53476.00 P -0.037100 0.018992  0.246921 0.018992  P-0.5572716 0.0168510                                                                                                             
+ 5 417 53477.00 P -0.038454 0.019016  0.248203 0.019016  P-0.5573643 0.0169101                                                                                                             
+ 5 418 53478.00 P -0.039787 0.019041  0.249501 0.019041  P-0.5575677 0.0169691                                                                                                             
+ 5 419 53479.00 P -0.041099 0.019065  0.250816 0.019065  P-0.5579013 0.0170280                                                                                                             
+ 5 420 53480.00 P -0.042388 0.019089  0.252147 0.019089  P-0.5583943 0.0170869                                                                                                             
+ 5 421 53481.00 P -0.043656 0.019113  0.253493 0.019113  P-0.5590472 0.0171457                                                                                                             
+ 5 422 53482.00 P -0.044902 0.019136  0.254855 0.019136  P-0.5598039 0.0172045                                                                                                             
+ 5 423 53483.00 P -0.046125 0.019160  0.256232 0.019160  P-0.5605783 0.0172631                                                                                                             
+ 5 424 53484.00 P -0.047326 0.019184  0.257623 0.019184  P-0.5613063 0.0173218                                                                                                             
+ 5 425 53485.00 P -0.048503 0.019208  0.259029 0.019208  P-0.5618863 0.0173803                                                                                                             
+ 5 426 53486.00 P -0.049657 0.019231  0.260450 0.019231  P-0.5622709 0.0174388                                                                                                             
+ 5 427 53487.00 P -0.050788 0.019255  0.261884 0.019255  P-0.5624379 0.0174972                                                                                                             
+ 5 428 53488.00 P -0.051894 0.019278  0.263332 0.019278  P-0.5624141 0.0175555                                                                                                             
+ 5 429 53489.00 P -0.052977 0.019301  0.264793 0.019301  P-0.5622979 0.0176138                                                                                                             
+ 5 430 53490.00 P -0.054035 0.019325  0.266267 0.019325  P-0.5622364 0.0176720                                                                                                             
+ 5 5 1 53491.00 P -0.055069 0.019348  0.267754 0.019348  P-0.5623966 0.0177302                                                                                                             
+ 5 5 2 53492.00 P -0.056077 0.019371  0.269253 0.019371  P-0.5628463 0.0177883                                                                                                             
+ 5 5 3 53493.00 P -0.057061 0.019394  0.270764 0.019394  P-0.5635855 0.0178463                                                                                                             
+ 5 5 4 53494.00 P -0.058019 0.019417  0.272287 0.019417  P-0.5645240 0.0179043                                                                                                             
+ 5 5 5 53495.00 P -0.058952 0.019440  0.273822 0.019440  P-0.5655133 0.0179622                                                                                                             
+ 5 5 6 53496.00 P -0.059860 0.019463  0.275368 0.019463  P-0.5664359 0.0180200                                                                                                             
+ 5 5 7 53497.00 P -0.060741 0.019485  0.276925 0.019485  P-0.5672243 0.0180778                                                                                                             
+ 5 5 8 53498.00 P -0.061597 0.019508  0.278493 0.019508  P-0.5678252 0.0181355                                                                                                             
+ 5 5 9 53499.00 P -0.062426 0.019531  0.280071 0.019531  P-0.5682104 0.0181932                                                                                                             
+ 5 510 53500.00 P -0.063228 0.019553  0.281658 0.019553  P-0.5684041 0.0182508                                                                                                             
+ 5 511 53501.00 P -0.064004 0.019576  0.283256 0.019576  P-0.5684424 0.0183083                                                                                                             
+ 5 512 53502.00 P -0.064754 0.019598  0.284863 0.019598  P-0.5683919 0.0183658                                                                                                             
+ 5 513 53503.00 P -0.065476 0.019621  0.286479 0.019621  P-0.5683328 0.0184232                                                                                                             
+ 5 514 53504.00 P -0.066171 0.019643  0.288104 0.019643  P-0.5683574 0.0184806                                                                                                             
+ 5 515 53505.00 P -0.066840 0.019665  0.289738 0.019665  P-0.5685207 0.0185379                                                                                                             
+ 5 516 53506.00 P -0.067480 0.019687  0.291379 0.019687  P-0.5688847 0.0185951                                                                                                             
+ 5 517 53507.00 P -0.068094 0.019709  0.293029 0.019709  P-0.5694687 0.0186523                                                                                                             
+ 5 518 53508.00 P -0.068680 0.019731  0.294686 0.019731  P-0.5702051 0.0187094                                                                                                             
+ 5 519 53509.00 P -0.069238 0.019753  0.296350 0.019753  P-0.5710462 0.0187665                                                                                                             
+ 5 520 53510.00 P -0.069768 0.019775  0.298021 0.019775  P-0.5719304 0.0188235                                                                                                             
+ 5 521 53511.00 P -0.070271 0.019797  0.299699 0.019797  P-0.5727614 0.0188805                                                                                                             
+ 5 522 53512.00 P -0.070745 0.019819  0.301383 0.019819  P-0.5734194 0.0189374                                                                                                             
+ 5 523 53513.00 P -0.071192 0.019841  0.303073 0.019841  P-0.5738198 0.0189942                                                                                                             
+ 5 524 53514.00 P -0.071610 0.019862  0.304769 0.019862  P-0.5738968 0.0190510                                                                                                             
+ 5 525 53515.00 P -0.072001 0.019884  0.306470 0.019884  P-0.5736789 0.0191077                                                                                                             
+ 5 526 53516.00 P -0.072363 0.019906  0.308177 0.019906  P-0.5732932 0.0191644                                                                                                             
+ 5 527 53517.00 P -0.072697 0.019927  0.309888 0.019927  P-0.5728922 0.0192210                                                                                                             
+ 5 528 53518.00 P -0.073003 0.019948  0.311603 0.019948  P-0.5726124 0.0192776                                                                                                             
+ 5 529 53519.00 P -0.073281 0.019970  0.313323 0.019970  P-0.5725106 0.0193341                                                                                                             
+ 5 530 53520.00 P -0.073530 0.019991  0.315046 0.019991  P-0.5725870 0.0193905                                                                                                             
+ 5 531 53521.00 P -0.073751 0.020012  0.316773 0.020012  P-0.5728159 0.0194469                                                                                                             
+ 5 6 1 53522.00 P -0.073944 0.020034  0.318504 0.020034  P-0.5731251 0.0195032                                                                                                             
+ 5 6 2 53523.00 P -0.074109 0.020055  0.320237 0.020055  P-0.5734127 0.0195595                                                                                                             
+ 5 6 3 53524.00 P -0.074245 0.020076  0.321972 0.020076  P-0.5735879 0.0196158                                                                                                             
+ 5 6 4 53525.00 P -0.074354 0.020097  0.323710 0.020097  P-0.5735794 0.0196719                                                                                                             
+ 5 6 5 53526.00 P -0.074434 0.020118  0.325450 0.020118  P-0.5733438 0.0197281                                                                                                             
+ 5 6 6 53527.00 P -0.074486 0.020139  0.327191 0.020139  P-0.5728598 0.0197841                                                                                                             
+ 5 6 7 53528.00 P -0.074510 0.020160  0.328933 0.020160  P-0.5721281 0.0198402                                                                                                             
+ 5 6 8 53529.00 P -0.074506 0.020180  0.330677 0.020180  P-0.5712797 0.0198961                                                                                                             
+ 5 6 9 53530.00 P -0.074475 0.020201  0.332421 0.020201  P-0.5704031 0.0199521                                                                                                             
+ 5 610 53531.00 P -0.074416 0.020222  0.334166 0.020222  P-0.5695097 0.0200079                                                                                                             
+ 5 611 53532.00 P -0.074329 0.020242  0.335910 0.020242  P-0.5686014 0.0200637                                                                                                             
+ 5 612 53533.00 P -0.074214 0.020263  0.337654 0.020263  P-0.5677307 0.0201195                                                                                                             
+ 5 613 53534.00 P -0.074072 0.020284  0.339398 0.020284  P-0.5669817 0.0201752                                                                                                             
+ 5 614 53535.00 P -0.073903 0.020304  0.341141 0.020304  P-0.5663464 0.0202309                                                                                                             
+ 5 615 53536.00 P -0.073707 0.020324  0.342882 0.020324  P-0.5658082 0.0202865                                                                                                             
+ 5 616 53537.00 P -0.073484 0.020345  0.344622 0.020345  P-0.5653532 0.0203420                                                                                                             
+ 5 617 53538.00 P -0.073233 0.020365  0.346360 0.020365  P-0.5649379 0.0203975                                                                                                             
+ 5 618 53539.00 P -0.072956 0.020385  0.348095 0.020385  P-0.5644983 0.0204530                                                                                                             
+ 5 619 53540.00 P -0.072653 0.020406  0.349828 0.020406  P-0.5639137 0.0205084                                                                                                             
+ 5 620 53541.00 P -0.072323 0.020426  0.351559 0.020426  P-0.5631150 0.0205638                                                                                                             
+ 5 621 53542.00 P -0.071967 0.020446  0.353286 0.020446  P-0.5620583 0.0206191                                                                                                             
+ 5 622 53543.00 P -0.071585 0.020466  0.355009 0.020466  P-0.5608633 0.0206743                                                                                                             
+ 5 623 53544.00 P -0.071178 0.020486  0.356729 0.020486  P-0.5596658 0.0207295                                                                                                             
+ 5 624 53545.00 P -0.070745 0.020506  0.358445 0.020506  P-0.5585709 0.0207847                                                                                                             
+ 5 625 53546.00 P -0.070286 0.020526  0.360156 0.020526  P-0.5576565 0.0208398                                                                                                             
+ 5 626 53547.00 P -0.069802 0.020546  0.361863 0.020546  P-0.5569753 0.0208949                                                                                                             
+ 5 627 53548.00 P -0.069294 0.020566  0.363565 0.020566  P-0.5565155 0.0209499                                                                                                             
+ 5 628 53549.00 P -0.068761 0.020585  0.365261 0.020585  P-0.5561814 0.0210048                                                                                                             
+ 5 629 53550.00 P -0.068203 0.020605  0.366951 0.020605  P-0.5558311 0.0210598                                                                                                             
+ 5 630 53551.00 P -0.067621 0.020625  0.368636 0.020625  P-0.5553461 0.0211146                                                                                                             
+ 5 7 1 53552.00 P -0.067016 0.020644  0.370314 0.020644  P-0.5546563 0.0211695                                                                                                             
+ 5 7 2 53553.00 P -0.066386 0.020664  0.371986 0.020664  P-0.5537249 0.0212242                                                                                                             
+ 5 7 3 53554.00 P -0.065734 0.020683  0.373650 0.020683  P-0.5525553 0.0212790                                                                                                             
+ 5 7 4 53555.00 P -0.065058 0.020703  0.375308 0.020703  P-0.5511996 0.0213337                                                                                                             
+ 5 7 5 53556.00 P -0.064360 0.020722  0.376958 0.020722  P-0.5497363 0.0213883                                                                                                             
+ 5 7 6 53557.00 P -0.063639 0.020742  0.378600 0.020742  P-0.5482537 0.0214429                                                                                                             
+ 5 7 7 53558.00 P -0.062895 0.020761  0.380234 0.020761  P-0.5468062 0.0214974                                                                                                             
+ 5 7 8 53559.00 P -0.062130 0.020780  0.381860 0.020780  P-0.5454592 0.0215519                                                                                                             
+ 5 7 9 53560.00 P -0.061344 0.020800  0.383477 0.020800  P-0.5442381 0.0216064                                                                                                             
+ 5 710 53561.00 P -0.060536 0.020819  0.385084 0.020819  P-0.5431233 0.0216608                                                                                                             
+ 5 711 53562.00 P -0.059707 0.020838  0.386683 0.020838  P-0.5421922 0.0217152                                                                                                             
+ 5 712 53563.00 P -0.058858 0.020857  0.388272 0.020857  P-0.5414819 0.0217695                                                                                                             
+ 5 713 53564.00 P -0.057988 0.020876  0.389851 0.020876  P-0.5409254 0.0218238                                                                                                             
+ 5 714 53565.00 P -0.057099 0.020895  0.391419 0.020895  P-0.5404186 0.0218780                                                                                                             
+ 5 715 53566.00 P -0.056189 0.020914  0.392978 0.020914  P-0.5398830 0.0219322                                                                                                             
+ 5 716 53567.00 P -0.055261 0.020933  0.394525 0.020933  P-0.5392463 0.0219863                                                                                                             
+ 5 717 53568.00 P -0.054313 0.020952  0.396062 0.020952  P-0.5384172 0.0220404                                                                                                             
+ 5 718 53569.00 P -0.053347 0.020971  0.397587 0.020971  P-0.5373040 0.0220944                                                                                                             
+ 5 719 53570.00 P -0.052363 0.020989  0.399100 0.020989  P-0.5359209 0.0221485                                                                                                             
+ 5 720 53571.00 P -0.051361 0.021008  0.400601 0.021008  P-0.5344400 0.0222024                                                                                                             
+ 5 721 53572.00 P -0.050342 0.021027  0.402091 0.021027  P-0.5330005 0.0222563                                                                                                             
+ 5 722 53573.00 P -0.049305 0.021046  0.403567 0.021046  P-0.5317176 0.0223102                                                                                                             
+ 5 723 53574.00 P -0.048252 0.021064  0.405031 0.021064  P-0.5306862 0.0223640                                                                                                             
+ 5 724 53575.00 P -0.047182 0.021083  0.406482 0.021083  P-0.5299442 0.0224178                                                                                                             
+ 5 725 53576.00 P -0.046096 0.021101  0.407920 0.021101  P-0.5294145 0.0224716                                                                                                             
+ 5 726 53577.00 P -0.044994 0.021120  0.409344 0.021120  P-0.5289379 0.0225253                                                                                                             
+ 5 727 53578.00 P -0.043878 0.021138  0.410755 0.021138  P-0.5283369 0.0225790                                                                                                             
+ 5 728 53579.00 P -0.042746 0.021157  0.412151 0.021157  P-0.5274951 0.0226326                                                                                                             
+ 5 729 53580.00 P -0.041600 0.021175  0.413533 0.021175  P-0.5263843 0.0226862                                                                                                             
+ 5 730 53581.00 P -0.040439 0.021193  0.414900 0.021193  P-0.5250389 0.0227397                                                                                                             
+ 5 731 53582.00 P -0.039265 0.021212  0.416252 0.021212  P-0.5235308 0.0227932                                                                                                             
+ 5 8 1 53583.00 P -0.038078 0.021230  0.417590 0.021230  P-0.5219161 0.0228466                                                                                                             
+ 5 8 2 53584.00 P -0.036877 0.021248  0.418912 0.021248  P-0.5202708 0.0229000                                                                                                             
+ 5 8 3 53585.00 P -0.035664 0.021266  0.420218 0.021266  P-0.5187071 0.0229534                                                                                                             
+ 5 8 4 53586.00 P -0.034439 0.021285  0.421509 0.021285  P-0.5173021 0.0230067                                                                                                             
+ 5 8 5 53587.00 P -0.033202 0.021303  0.422783 0.021303  P-0.5161053 0.0230600                                                                                                             
+ 5 8 6 53588.00 P -0.031953 0.021321  0.424042 0.021321  P-0.5151366 0.0231133                                                                                                             
+ 5 8 7 53589.00 P -0.030693 0.021339  0.425283 0.021339  P-0.5143909 0.0231665                                                                                                             
+ 5 8 8 53590.00 P -0.029423 0.021357  0.426508 0.021357  P-0.5138229 0.0232197                                                                                                             
+ 5 8 9 53591.00 P -0.028142 0.021375  0.427717 0.021375  P-0.5133909 0.0232728                                                                                                             
+ 5 810 53592.00 P -0.026852 0.021393  0.428907 0.021393  P-0.5130107 0.0233259                                                                                                             
+ 5 811 53593.00 P -0.025551 0.021410  0.430081 0.021410  P-0.5125769 0.0233789                                                                                                             
+ 5 812 53594.00 P -0.024242 0.021428  0.431237 0.021428  P-0.5120121 0.0234319                                                                                                             
+ 5 813 53595.00 P -0.022924 0.021446  0.432375 0.021446  P-0.5112680 0.0234849                                                                                                             
+ 5 814 53596.00 P -0.021597 0.021464  0.433495 0.021464  P-0.5103416 0.0235378                                                                                                             
+ 5 815 53597.00 P -0.020262 0.021481  0.434597 0.021481  P-0.5092561 0.0235907                                                                                                             
+ 5 816 53598.00 P -0.018920 0.021499  0.435680 0.021499  P-0.5080685 0.0236435                                                                                                             
+ 5 817 53599.00 P -0.017570 0.021517  0.436745 0.021517  P-0.5068980 0.0236963                                                                                                             
+ 5 818 53600.00 P -0.016213 0.021534  0.437791 0.021534  P-0.5058864 0.0237491                                                                                                             
+ 5 819 53601.00 P -0.014850 0.021552  0.438819 0.021552  P-0.5051650 0.0238018                                                                                                             
+ 5 820 53602.00 P -0.013480 0.021569  0.439827 0.021569  P-0.5047915 0.0238545                                                                                                             
+ 5 821 53603.00 P -0.012105 0.021587  0.440815 0.021587  P-0.5047204 0.0239072                                                                                                             
+ 5 822 53604.00 P -0.010724 0.021604  0.441785 0.021604  P-0.5048754 0.0239598                                                                                                             
+ 5 823 53605.00 P -0.009338 0.021622  0.442734 0.021622  P-0.5050711 0.0240124                                                                                                             
+ 5 824 53606.00 P -0.007947 0.021639  0.443664 0.021639  P-0.5050958 0.0240649                                                                                                             
+ 5 825 53607.00 P -0.006551 0.021657  0.444574 0.021657  P-0.5048353 0.0241174                                                                                                             
+ 5 826 53608.00 P -0.005151 0.021674  0.445464 0.021674  P-0.5042904 0.0241699                                                                                                             
+ 5 827 53609.00 P -0.003748 0.021691  0.446334 0.021691  P-0.5035055 0.0242223                                                                                                             
+ 5 828 53610.00 P -0.002341 0.021708  0.447183 0.021708  P-0.5025326 0.0242747                                                                                                             
+ 5 829 53611.00 P -0.000930 0.021726  0.448012 0.021726  P-0.5014525 0.0243270                                                                                                             
+ 5 830 53612.00 P  0.000483 0.021743  0.448820 0.021743  P-0.5003552 0.0243793                                                                                                             
+ 5 831 53613.00 P  0.001898 0.021760  0.449608 0.021760  P-0.4993236 0.0244316                                                                                                             
+ 5 9 1 53614.00 P  0.003316 0.021777  0.450374 0.021777  P-0.4984066 0.0244838                                                                                                             
+ 5 9 2 53615.00 P  0.004736 0.021794  0.451120 0.021794  P-0.4976803 0.0245360                                                                                                             
+ 5 9 3 53616.00 P  0.006157 0.021811  0.451845 0.021811  P-0.4971752 0.0245882                                                                                                             
+ 5 9 4 53617.00 P  0.007580 0.021828  0.452548 0.021828  P-0.4968823 0.0246403                                                                                                             
+ 5 9 5 53618.00 P  0.009004 0.021845  0.453230 0.021845  P-0.4967654 0.0246924                                                                                                             
+ 5 9 6 53619.00 P  0.010428 0.021862  0.453891 0.021862  P-0.4967675 0.0247445                                                                                                             
+ 5 9 7 53620.00 P  0.011853 0.021879  0.454530 0.021879  P-0.4967874 0.0247965                                                                                                             
+ 5 9 8 53621.00 P  0.013278 0.021896  0.455148 0.021896  P-0.4967251 0.0248485                                                                                                             
+ 5 9 9 53622.00 P  0.014703 0.021912  0.455744 0.021912  P-0.4965391 0.0249004                                                                                                             
+ 5 910 53623.00 P  0.016128 0.021929  0.456319 0.021929  P-0.4961973 0.0249523                                                                                                             
+ 5 911 53624.00 P  0.017552 0.021946  0.456871 0.021946  P-0.4956907 0.0250042                                                                                                             
+ 5 912 53625.00 P  0.018975 0.021963  0.457402 0.021963  P-0.4951242 0.0250560                                                                                                             
+ 5 913 53626.00 P  0.020397 0.021979  0.457911 0.021979  P-0.4945260 0.0251078                                                                                                             
+ 5 914 53627.00 P  0.021817 0.021996  0.458399 0.021996  P-0.4940029 0.0251596                                                                                                             
+ 5 915 53628.00                                                                                                                                                                            
+ 5 916 53629.00                                                                                                                                                                            
+ 5 917 53630.00                                                                                                                                                                            
+ 5 918 53631.00                                                                                                                                                                            
+ 5 919 53632.00                                                                                                                                                                            
+ 5 920 53633.00                                                                                                                                                                            
+ 5 921 53634.00                                                                                                                                                                            
+ 5 922 53635.00                                                                                                                                                                            
+ 5 923 53636.00                                                                                                                                                                            
+ 5 924 53637.00                                                                                                                                                                            
+ 5 925 53638.00                                                                                                                                                                            
+ 5 926 53639.00                                                                                                                                                                            
+ 5 927 53640.00                                                                                                                                                                            
+ 5 928 53641.00                                                                                                                                                                            
+ 5 929 53642.00                                                                                                                                                                            
+ 5 930 53643.00                                                                                                                                                                            
+ 510 1 53644.00                                                                                                                                                                            
+ 510 2 53645.00                                                                                                                                                                            
+ 510 3 53646.00                                                                                                                                                                            
+ 510 4 53647.00                                                                                                                                                                            
+ 510 5 53648.00                                                                                                                                                                            
+ 510 6 53649.00                                                                                                                                                                            
+ 510 7 53650.00                                                                                                                                                                            
+ 510 8 53651.00                                                                                                                                                                            
+ 510 9 53652.00                                                                                                                                                                            
+ 51010 53653.00                                                                                                                                                                            
+ 51011 53654.00                                                                                                                                                                            
+ 51012 53655.00                                                                                                                                                                            
+ 51013 53656.00                                                                                                                                                                            
+ 51014 53657.00                                                                                                                                                                            
+ 51015 53658.00                                                                                                                                                                            
+ 51016 53659.00                                                                                                                                                                            
+ 51017 53660.00                                                                                                                                                                            
+ 51018 53661.00                                                                                                                                                                            
+ 51019 53662.00                                                                                                                                                                            
+ 51020 53663.00                                                                                                                                                                            
+ 51021 53664.00                                                                                                                                                                            
+ 51022 53665.00                                                                                                                                                                            
+ 51023 53666.00                                                                                                                                                                            
+ 51024 53667.00                                                                                                                                                                            
+ 51025 53668.00                                                                                                                                                                            
+ 51026 53669.00                                                                                                                                                                            
+ 51027 53670.00                                                                                                                                                                            
+ 51028 53671.00                                                                                                                                                                            
+ 51029 53672.00                                                                                                                                                                            
+ 51030 53673.00                                                                                                                                                                            
+ 51031 53674.00                                                                                                                                                                            
+ 511 1 53675.00                                                                                                                                                                            
+ 511 2 53676.00                                                                                                                                                                            
+ 511 3 53677.00                                                                                                                                                                            
Index: /tags/ipp-1-X/bug123/psLib/share/pslib/readme.eopc01
===================================================================
--- /tags/ipp-1-X/bug123/psLib/share/pslib/readme.eopc01	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/share/pslib/readme.eopc01	(revision 22331)
@@ -0,0 +1,82 @@
+This table comes from:
+
+ http://hpiers.obspm.fr/eoppc/eop/eopc01/eopc01.1900-2004
+ 
+As referenced in the Pan-STARRS ADD
+
+
+
+                              EOP(IERS) C 01
+                         ----------------------------
+ 
+ EOP(IERS) C 01 is a series of the earth Orientation Parameters given 
+ in the 1997 IERS system at 0.1 year interval (1846 - 1889) and 0.05 year 
+ interval (1890 - now). It is regularly recomputed to take advantage on one 
+ hand of the improvement of the various individual contributions and in the 
+ other hand of the refinement of the analyses procedures. This series is the
+ basis of the IERS system.
+ 
+ 
+ EOP(IERS) C 01 is based on the following data:
+ 
+ 
+ 1993 - now  : IERS solution of x, y, UT1-UTC, LOD, dPsi, dEpsilon (normal points),
+               based on VLBI, LLR, GPS  and SLR.
+               
+ 1980 - 1992 : IERS solution of x, y, UT1-UTC, dPsi, dEpsilon (normal points),
+               based on VLBI, LLR, GPS (from 1992), and SLR.
+
+ 1962 - 1979 : IERS and BIH solutions, giving x, y, UT1-UTC (normal points). 
+               Space techniques are introduced starting with 1969 (LLR: UT)
+               and 1972 (Doppler: polar motion).
+
+ 1900 - 1961 : Vondrak(1995), Solution derived from optical astrometry 
+               analyses the series give polar motion, celestial pole offsets 
+               and Universal Time (since 1956).
+     
+		
+ 
+ 1846 - 1899 :
+
+               The solution derived by L.V. Rikhlova (Fedorov et al., 1976) 
+               from three series of absolute declination programs (Pulkovo, 
+               Greenwhich, Washington). The frequency band of the variations 
+               kept encompasses only the annual and Chandler terms. The y
+               coordinate of the pole is missing from 1858.9 through 1860.9.
+ 
+ 
+ PRECISION AND ACCURACY
+
+ The individual values are accompanied by uncertainties which attempt to 
+ reflect their quality. For the IERS/BIH solutions, they are  derived from the
+ scattering of the independant measurements contributing to each normal point,
+ with added variance taking into account possible systematic errors. For the 
+ earlier period, they are based on the estimations given by Fedorov et al. 
+ (1976), scaled to match the agreement woth the IERS/BIH solution over
+ 1962-1968. In addition some isolated outliers are deweighted (uncertainty
+ multiplied by 3). 
+
+ The following remarks can be made concerning the drift and the annual term
+ before 1962:
+
+ Trend: as a result of the Fedorov et al. treatment, any drift in polar
+        motion existing before 1900 is ignored in the series. For the period
+        starting with 1900, although no external evidence is available for 
+        the pre-1972 polar motion, it should be mentionned that the low 
+        frequency spectrum of polar motion both before and after the advent 
+        of space techniques (giving the possibility of cross-checks) is that
+        pf random walk at a similar level.
+ 
+ Annual term: it is influenced by errors in nutation and local seasonal errors.
+        Comparisons of the Fedorov et al. solution with the IERS/BIH one over 
+        1962 - 1968 suggest that the amplitude of the annual term is accurate
+        to +/- 0.03" over 1900 - 1962.
+ 
+ REFERENCES
+ 
+ - Fedorov,E.P., Korsun,A.A, Mayor,S.P., Pantschenko,N.I., Tarady,V.K., and
+    Yatskiv,Y.S., 1972: Dvizhenie polyusa Zemli s 1890.0 po 1969.0. Naukova 
+    Dumka, Kiev. [English translation of the text available].
+ - Vondrak J., Ron C., Pesek I., Cepek A., 1995, Astron. and Astrophys. 
+    297,899-906.
+ - IERS Annual reports
Index: /tags/ipp-1-X/bug123/psLib/share/pslib/readme.ser7
===================================================================
--- /tags/ipp-1-X/bug123/psLib/share/pslib/readme.ser7	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/share/pslib/readme.ser7	(revision 22331)
@@ -0,0 +1,7 @@
+This file comes from the site:
+
+http://maia.usno.navy.mil (Click on General Information about Earth Orientation)
+
+This file may also be directly downloaded from:
+
+ftp://maia.usno.navy.mil/ser7/ser7.dat
Index: /tags/ipp-1-X/bug123/psLib/share/pslib/readme.tai_utc
===================================================================
--- /tags/ipp-1-X/bug123/psLib/share/pslib/readme.tai_utc	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/share/pslib/readme.tai_utc	(revision 22331)
@@ -0,0 +1,7 @@
+This file comes from the site:
+
+http://maia.usno.navy.mil (Click on table of leap seconds since 1961)
+
+This file may also be directly downloaded from:
+
+ftp://maia.usno.navy.mil/ser7/tai-utc.dat
Index: /tags/ipp-1-X/bug123/psLib/share/pslib/ser7.dat
===================================================================
--- /tags/ipp-1-X/bug123/psLib/share/pslib/ser7.dat	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/share/pslib/ser7.dat	(revision 22331)
@@ -0,0 +1,380 @@
+#  ser7.dat
+#
+#  This file comes from http://maia.usno.navy.mil (Click on General Information about Earth Orientation). This
+#  file may also be directly downloaded from ftp://maia.usno.navy.mil/ser7/ser7.dat. See readme.ser7 (located
+#  in the psLib/data directory) for details.
+#
+#  @author Ross Harman, MHPCC
+#
+#  @version $Revision: 1.1 $ $Name: not supported by cvs2svn $
+#  @date $Date: 2005-02-10 02:36:41 $
+#
+#
+#        MJD         PM-x        PM-y       UT1-UTC
+#      (days)      (arcsec)    (arcsec)      (sec)
+        psF64        psF64       psF64       psF64
+        53244       0.1377      0.5027     -0.45210
+        53245       0.1394      0.5015     -0.45190
+        53246       0.1411      0.5002     -0.45197
+        53247       0.1429      0.4989     -0.45234
+        53248       0.1447      0.4976     -0.45293
+        53249       0.1465      0.4962     -0.45361
+        53250       0.1484      0.4948     -0.45424
+        53251       0.1503      0.4934     -0.45476
+        53252       0.1521      0.4920     -0.45512
+        53253       0.1540      0.4905     -0.45530
+        53254       0.1558      0.4890     -0.45531
+        53255       0.1577      0.4874     -0.45519
+        53256       0.1595      0.4859     -0.45497
+        53257       0.1613      0.4843     -0.45474
+        53258       0.1631      0.4827     -0.45458
+        53259       0.1649      0.4810     -0.45456
+        53260       0.1667      0.4794     -0.45474
+        53261       0.1684      0.4777     -0.45514
+        53262       0.1701      0.4760     -0.45578
+        53263       0.1717      0.4742     -0.45660
+        53264       0.1734      0.4725     -0.45754
+        53265       0.1750      0.4707     -0.45849
+        53266       0.1765      0.4689     -0.45932
+        53267       0.1780      0.4671     -0.45996
+        53268       0.1795      0.4652     -0.46036
+        53269       0.1810      0.4634     -0.46055
+        53270       0.1824      0.4615     -0.46061
+        53271       0.1838      0.4596     -0.46068
+        53272       0.1852      0.4576     -0.46086
+        53273       0.1865      0.4557     -0.46126
+        53274       0.1878      0.4537     -0.46192
+        53275       0.1890      0.4517     -0.46280
+        53276       0.1902      0.4497     -0.46382
+        53277       0.1914      0.4477     -0.46486
+        53278       0.1925      0.4457     -0.46581
+        53279       0.1936      0.4436     -0.46658
+        53280       0.1946      0.4415     -0.46715
+        53281       0.1956      0.4394     -0.46750
+        53282       0.1966      0.4373     -0.46766
+        53283       0.1976      0.4352     -0.46772
+        53284       0.1985      0.4331     -0.46773
+        53285       0.1993      0.4309     -0.46778
+        53286       0.2001      0.4288     -0.46795
+        53287       0.2009      0.4266     -0.46830
+        53288       0.2017      0.4244     -0.46887
+        53289       0.2024      0.4222     -0.46968
+        53290       0.2031      0.4200     -0.47071
+        53291       0.2037      0.4178     -0.47191
+        53292       0.2043      0.4155     -0.47317
+        53293       0.2049      0.4133     -0.47435
+        53294       0.2054      0.4111     -0.47536
+        53295       0.2059      0.4088     -0.47610
+        53296       0.2063      0.4065     -0.47659
+        53297       0.2067      0.4042     -0.47691
+        53298       0.2071      0.4020     -0.47718
+        53299       0.2075      0.3997     -0.47755
+        53300       0.2078      0.3974     -0.47811
+        53301       0.2080      0.3951     -0.47893
+        53302       0.2083      0.3928     -0.47998
+        53303       0.2085      0.3905     -0.48119
+        53304       0.2086      0.3881     -0.48247
+        53305       0.2088      0.3858     -0.48369
+        53306       0.2089      0.3835     -0.48477
+        53307       0.2089      0.3812     -0.48565
+        53308       0.2090      0.3789     -0.48630
+        53309       0.2089      0.3765     -0.48674
+        53310       0.2089      0.3742     -0.48701
+        53311       0.2088      0.3719     -0.48718
+        53312       0.2088      0.3696     -0.48732
+        53313       0.2086      0.3672     -0.48753
+        53314       0.2085      0.3649     -0.48785
+        53315       0.2082      0.3626     -0.48835
+        53316       0.2080      0.3603     -0.48906
+        53317       0.2077      0.3579     -0.48997
+        53318       0.2074      0.3556     -0.49106
+        53319       0.2071      0.3533     -0.49226
+        53320       0.2067      0.3510     -0.49344
+        53321       0.2063      0.3487     -0.49449
+        53322       0.2059      0.3464     -0.49531
+        53323       0.2054      0.3441     -0.49585
+        53324       0.2049      0.3418     -0.49618
+        53325       0.2044      0.3396     -0.49639
+        53326       0.2038      0.3373     -0.49664
+        53327       0.2032      0.3350     -0.49705
+        53328       0.2026      0.3328     -0.49769
+        53329       0.2020      0.3305     -0.49854
+        53330       0.2013      0.3283     -0.49953
+        53331       0.2006      0.3261     -0.50058
+        53332       0.1999      0.3239     -0.50158
+        53333       0.1991      0.3217     -0.50243
+        53334       0.1983      0.3195     -0.50308
+        53335       0.1975      0.3173     -0.50350
+        53336       0.1967      0.3151     -0.50369
+        53337       0.1958      0.3130     -0.50370
+        53338       0.1949      0.3108     -0.50358
+        53339       0.1940      0.3087     -0.50342
+        53340       0.1931      0.3066     -0.50329
+        53341       0.1921      0.3045     -0.50327
+        53342       0.1911      0.3024     -0.50340
+        53343       0.1901      0.3004     -0.50372
+        53344       0.1890      0.2983     -0.50423
+        53345       0.1880      0.2963     -0.50493
+        53346       0.1869      0.2943     -0.50574
+        53347       0.1858      0.2923     -0.50660
+        53348       0.1846      0.2903     -0.50739
+        53349       0.1835      0.2883     -0.50808
+        53350       0.1823      0.2864     -0.50851
+        53351       0.1811      0.2844     -0.50870
+        53352       0.1799      0.2825     -0.50874
+        53353       0.1786      0.2807     -0.50875
+        53354       0.1773      0.2788     -0.50890
+        53355       0.1760      0.2769     -0.50927
+        53356       0.1747      0.2751     -0.50987
+        53357       0.1734      0.2733     -0.51064
+        53358       0.1720      0.2715     -0.51148
+        53359       0.1707      0.2698     -0.51228
+        53360       0.1693      0.2680     -0.51295
+        53361       0.1679      0.2663     -0.51342
+        53362       0.1664      0.2646     -0.51367
+        53363       0.1650      0.2629     -0.51371
+        53364       0.1635      0.2613     -0.51357
+        53365       0.1620      0.2596     -0.51330
+        53366       0.1605      0.2580     -0.51298
+        53367       0.1590      0.2565     -0.51268
+        53368       0.1575      0.2549     -0.51247
+        53369       0.1559      0.2534     -0.51241
+        53370       0.1543      0.2519     -0.51253
+        53371       0.1528      0.2504     -0.51283
+        53372       0.1511      0.2489     -0.51331
+        53373       0.1495      0.2475     -0.51391
+        53374       0.1479      0.2461     -0.51458
+        53375       0.1463      0.2447     -0.51522
+        53376       0.1446      0.2434     -0.51574
+        53377       0.1429      0.2420     -0.51605
+        53378       0.1412      0.2407     -0.51614
+        53379       0.1395      0.2395     -0.51605
+        53380       0.1378      0.2382     -0.51590
+        53381       0.1361      0.2370     -0.51585
+        53382       0.1344      0.2358     -0.51603
+        53383       0.1326      0.2347     -0.51648
+        53384       0.1308      0.2335     -0.51717
+        53385       0.1291      0.2324     -0.51800
+        53386       0.1273      0.2313     -0.51881
+        53387       0.1255      0.2303     -0.51951
+        53388       0.1237      0.2293     -0.52000
+        53389       0.1219      0.2283     -0.52027
+        53390       0.1200      0.2273     -0.52032
+        53391       0.1182      0.2264     -0.52018
+        53392       0.1164      0.2255     -0.51992
+        53393       0.1145      0.2246     -0.51959
+        53394       0.1126      0.2237     -0.51928
+        53395       0.1108      0.2229     -0.51905
+        53396       0.1089      0.2221     -0.51897
+        53397       0.1070      0.2213     -0.51908
+        53398       0.1051      0.2206     -0.51939
+        53399       0.1032      0.2199     -0.51987
+        53400       0.1013      0.2192     -0.52050
+        53401       0.0994      0.2186     -0.52119
+        53402       0.0975      0.2180     -0.52187
+        53403       0.0956      0.2174     -0.52246
+        53404       0.0936      0.2168     -0.52288
+        53405       0.0917      0.2163     -0.52309
+        53406       0.0898      0.2158     -0.52311
+        53407       0.0878      0.2153     -0.52305
+        53408       0.0859      0.2149     -0.52303
+        53409       0.0840      0.2144     -0.52321
+        53410       0.0820      0.2141     -0.52368
+        53411       0.0801      0.2137     -0.52444
+        53412       0.0781      0.2134     -0.52542
+        53413       0.0761      0.2131     -0.52646
+        53414       0.0742      0.2128     -0.52744
+        53415       0.0722      0.2126     -0.52822
+        53416       0.0703      0.2124     -0.52877
+        53417       0.0683      0.2122     -0.52907
+        53418       0.0663      0.2120     -0.52916
+        53419       0.0644      0.2119     -0.52910
+        53420       0.0624      0.2118     -0.52897
+        53421       0.0605      0.2117     -0.52883
+        53422       0.0585      0.2117     -0.52876
+        53423       0.0566      0.2117     -0.52882
+        53424       0.0546      0.2117     -0.52907
+        53425       0.0526      0.2118     -0.52951
+        53426       0.0507      0.2118     -0.53014
+        53427       0.0487      0.2119     -0.53091
+        53428       0.0468      0.2121     -0.53174
+        53429       0.0449      0.2122     -0.53254
+        53430       0.0429      0.2124     -0.53321
+        53431       0.0410      0.2126     -0.53368
+        53432       0.0391      0.2129     -0.53392
+        53433       0.0372      0.2131     -0.53393
+        53434       0.0352      0.2134     -0.53380
+        53435       0.0333      0.2138     -0.53366
+        53436       0.0314      0.2141     -0.53365
+        53437       0.0296      0.2145     -0.53389
+        53438       0.0277      0.2149     -0.53443
+        53439       0.0258      0.2154     -0.53526
+        53440       0.0239      0.2159     -0.53627
+        53441       0.0221      0.2164     -0.53733
+        53442       0.0202      0.2169     -0.53830
+        53443       0.0184      0.2174     -0.53908
+        53444       0.0166      0.2180     -0.53964
+        53445       0.0147      0.2186     -0.53998
+        53446       0.0129      0.2192     -0.54014
+        53447       0.0111      0.2198     -0.54018
+        53448       0.0093      0.2205     -0.54018
+        53449       0.0076      0.2212     -0.54022
+        53450       0.0058      0.2219     -0.54037
+        53451       0.0040      0.2227     -0.54069
+        53452       0.0023      0.2234     -0.54118
+        53453       0.0005      0.2242     -0.54185
+        53454      -0.0012      0.2250     -0.54266
+        53455      -0.0029      0.2258     -0.54356
+        53456      -0.0046      0.2267     -0.54447
+        53457      -0.0063      0.2276     -0.54530
+        53458      -0.0079      0.2285     -0.54598
+        53459      -0.0096      0.2294     -0.54647
+        53460      -0.0112      0.2303     -0.54675
+        53461      -0.0128      0.2313     -0.54688
+        53462      -0.0144      0.2323     -0.54699
+        53463      -0.0160      0.2333     -0.54724
+        53464      -0.0176      0.2343     -0.54775
+        53465      -0.0191      0.2353     -0.54858
+        53466      -0.0207      0.2364     -0.54970
+        53467      -0.0222      0.2375     -0.55097
+        53468      -0.0237      0.2386     -0.55228
+        53469      -0.0252      0.2397     -0.55354
+        53470      -0.0267      0.2408     -0.55465
+        53471      -0.0281      0.2420     -0.55556
+        53472      -0.0295      0.2431     -0.55626
+        53473      -0.0310      0.2443     -0.55677
+        53474      -0.0323      0.2455     -0.55715
+        53475      -0.0337      0.2468     -0.55748
+        53476      -0.0351      0.2480     -0.55785
+        53477      -0.0364      0.2493     -0.55833
+        53478      -0.0377      0.2505     -0.55899
+        53479      -0.0390      0.2518     -0.55988
+        53480      -0.0403      0.2531     -0.56095
+        53481      -0.0415      0.2545     -0.56216
+        53482      -0.0427      0.2558     -0.56347
+        53483      -0.0439      0.2572     -0.56478
+        53484      -0.0451      0.2585     -0.56599
+        53485      -0.0463      0.2599     -0.56699
+        53486      -0.0474      0.2613     -0.56769
+        53487      -0.0485      0.2627     -0.56808
+        53488      -0.0496      0.2641     -0.56824
+        53489      -0.0507      0.2656     -0.56830
+        53490      -0.0517      0.2670     -0.56839
+        53491      -0.0527      0.2685     -0.56860
+        53492      -0.0537      0.2700     -0.56897
+        53493      -0.0547      0.2714     -0.56955
+        53494      -0.0556      0.2729     -0.57032
+        53495      -0.0565      0.2744     -0.57119
+        53496      -0.0574      0.2760     -0.57204
+        53497      -0.0583      0.2775     -0.57277
+        53498      -0.0591      0.2790     -0.57329
+        53499      -0.0600      0.2806     -0.57354
+        53500      -0.0607      0.2821     -0.57350
+        53501      -0.0615      0.2837     -0.57328
+        53502      -0.0622      0.2853     -0.57298
+        53503      -0.0630      0.2869     -0.57261
+        53504      -0.0636      0.2885     -0.57218
+        53505      -0.0643      0.2901     -0.57175
+        53506      -0.0649      0.2917     -0.57143
+        53507      -0.0655      0.2933     -0.57124
+        53508      -0.0661      0.2949     -0.57117
+        53509      -0.0667      0.2966     -0.57124
+        53510      -0.0672      0.2982     -0.57139
+        53511      -0.0677      0.2999     -0.57158
+        53512      -0.0682      0.3015     -0.57166
+        53513      -0.0686      0.3032     -0.57155
+        53514      -0.0690      0.3048     -0.57116
+        53515      -0.0694      0.3065     -0.57057
+        53516      -0.0698      0.3082     -0.56989
+        53517      -0.0701      0.3098     -0.56921
+        53518      -0.0704      0.3115     -0.56860
+        53519      -0.0707      0.3132     -0.56818
+        53520      -0.0710      0.3149     -0.56799
+        53521      -0.0712      0.3166     -0.56800
+        53522      -0.0714      0.3183     -0.56809
+        53523      -0.0716      0.3200     -0.56815
+        53524      -0.0717      0.3217     -0.56808
+        53525      -0.0718      0.3234     -0.56781
+        53526      -0.0719      0.3251     -0.56728
+        53527      -0.0720      0.3268     -0.56651
+        53528      -0.0720      0.3285     -0.56557
+        53529      -0.0720      0.3302     -0.56454
+        53530      -0.0720      0.3319     -0.56347
+        53531      -0.0720      0.3336     -0.56244
+        53532      -0.0719      0.3353     -0.56148
+        53533      -0.0718      0.3370     -0.56060
+        53534      -0.0717      0.3387     -0.55990
+        53535      -0.0715      0.3404     -0.55943
+        53536      -0.0713      0.3421     -0.55916
+        53537      -0.0711      0.3438     -0.55897
+        53538      -0.0709      0.3455     -0.55881
+        53539      -0.0707      0.3472     -0.55859
+        53540      -0.0704      0.3489     -0.55820
+        53541      -0.0701      0.3506     -0.55751
+        53542      -0.0697      0.3523     -0.55650
+        53543      -0.0694      0.3540     -0.55529
+        53544      -0.0690      0.3557     -0.55402
+        53545      -0.0686      0.3573     -0.55279
+        53546      -0.0682      0.3590     -0.55173
+        53547      -0.0677      0.3607     -0.55093
+        53548      -0.0673      0.3623     -0.55037
+        53549      -0.0668      0.3640     -0.54994
+        53550      -0.0662      0.3656     -0.54947
+        53551      -0.0657      0.3673     -0.54884
+        53552      -0.0651      0.3689     -0.54798
+        53553      -0.0645      0.3705     -0.54689
+        53554      -0.0639      0.3721     -0.54560
+        53555      -0.0633      0.3738     -0.54414
+        53556      -0.0626      0.3754     -0.54257
+        53557      -0.0620      0.3770     -0.54101
+        53558      -0.0613      0.3786     -0.53952
+        53559      -0.0605      0.3801     -0.53819
+        53560      -0.0598      0.3817     -0.53705
+        53561      -0.0590      0.3833     -0.53611
+        53562      -0.0583      0.3848     -0.53535
+        53563      -0.0575      0.3864     -0.53475
+        53564      -0.0566      0.3879     -0.53425
+        53565      -0.0558      0.3895     -0.53374
+        53566      -0.0549      0.3910     -0.53315
+        53567      -0.0541      0.3925     -0.53243
+        53568      -0.0532      0.3940     -0.53152
+        53569      -0.0523      0.3955     -0.53042
+        53570      -0.0513      0.3969     -0.52913
+        53571      -0.0504      0.3984     -0.52776
+        53572      -0.0494      0.3998     -0.52644
+        53573      -0.0485      0.4013     -0.52532
+        53574      -0.0475      0.4027     -0.52451
+        53575      -0.0464      0.4041     -0.52400
+        53576      -0.0454      0.4055     -0.52377
+        53577      -0.0444      0.4069     -0.52366
+        53578      -0.0433      0.4083     -0.52344
+        53579      -0.0423      0.4096     -0.52299
+        53580      -0.0412      0.4110     -0.52228
+        53581      -0.0401      0.4123     -0.52130
+        53582      -0.0390      0.4136     -0.52010
+        53583      -0.0378      0.4149     -0.51872
+        53584      -0.0367      0.4162     -0.51725
+        53585      -0.0356      0.4175     -0.51578
+        53586      -0.0344      0.4188     -0.51436
+        53587      -0.0332      0.4200     -0.51310
+        53588      -0.0320      0.4212     -0.51204
+        53589      -0.0309      0.4224     -0.51120
+        53590      -0.0297      0.4236     -0.51055
+        53591      -0.0284      0.4248     -0.51006
+        53592      -0.0272      0.4260     -0.50966
+        53593      -0.0260      0.4271     -0.50922
+        53594      -0.0247      0.4283     -0.50872
+        53595      -0.0235      0.4294     -0.50809
+        53596      -0.0222      0.4305     -0.50729
+        53597      -0.0210      0.4315     -0.50638
+        53598      -0.0197      0.4326     -0.50535
+        53599      -0.0184      0.4336     -0.50431
+        53600      -0.0171      0.4347     -0.50339
+        53601      -0.0158      0.4357     -0.50273
+        53602      -0.0145      0.4367     -0.50244
+        53603      -0.0132      0.4376     -0.50247
+        53604      -0.0119      0.4386     -0.50267
+        53605      -0.0106      0.4395     -0.50286
+        53606      -0.0093      0.4404     -0.50287
+        53607      -0.0079      0.4413     -0.50263
+        53608      -0.0066      0.4422     -0.50217
Index: /tags/ipp-1-X/bug123/psLib/share/pslib/ser7.raw
===================================================================
--- /tags/ipp-1-X/bug123/psLib/share/pslib/ser7.raw	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/share/pslib/ser7.raw	(revision 22331)
@@ -0,0 +1,475 @@
+                                                                                
+      **********************************************************************    
+      *                                                                    *    
+      *                   I E R S   B U L L E T I N - A                    *    
+      *                                                                    *    
+      *           Rapid Service/Prediction of Earth Orientation            *    
+      **********************************************************************    
+      26 August 2004                                       Vol. XVII No. 034    
+      ______________________________________________________________________    
+      GENERAL INFORMATION:                                                      
+         To receive this information electronically, contact:                   
+            ser7@maia.usno.navy.mil or use http://maia.usno.navy.mil/           
+         MJD = Julian Date - 2 400 000.5 days                                   
+         UT2-UT1 = 0.022 sin(2*pi*T) - 0.012 cos(2*pi*T)                        
+                                     - 0.006 sin(4*pi*T) + 0.007 cos(4*pi*T)    
+            where pi = 3.14159265... and T is the date in Besselian years.      
+         TT = TAI + 32.184 seconds                                              
+         DUT1= (UT1-UTC) transmitted with time signals                          
+             =  -0.5 seconds beginning 29 April    2004 at 0000 UTC             
+         Beginning 1 January 1999:                                              
+            TAI-UTC(BIPM) = 32.000 000 seconds                                  
+      **********************************************************************    
+      *                 No leap second will be introduced                  *    
+      *                    in UTC on 31 December 2004.                     *    
+      *       Bulletin A is now compliant with IAU 2000 resolutions        *    
+      *                See notice at the end of this Bulletin A            *    
+      **********************************************************************    
+     ________________________________________________________________________   
+       The contributed observations used in the preparation of this Bulletin    
+       are available at ftp://maia.usno.navy.mil/bulla-data.html.  The          
+       contributed analysis results are based on data from Very Long Baseline   
+       Interferometry (VLBI), Satellite Laser Ranging (SLR), the Global         
+       Positioning System (GPS) satellites, Lunar Laser Ranging (LLR), and      
+       meteorological predictions of variations in Atmospheric Angular          
+       Momentum (AAM).                                                          
+     ________________________________________________________________________   
+                                                                                
+      COMBINED EARTH ORIENTATION PARAMETERS:                                    
+                                                                                
+                              IERS Rapid Service                                
+              MJD      x    error     y    error   UT1-UTC   error              
+                       "      "       "      "        s        s                
+    4  8 20  53237  .12423 .00003  .51109 .00006  -.451871  .000012          
+    4  8 21  53238  .12644 .00003  .51031 .00005  -.452406  .000014          
+    4  8 22  53239  .12829 .00003  .50925 .00005  -.452813  .000014          
+    4  8 23  53240  .13014 .00002  .50785 .00004  -.453011  .000012          
+    4  8 24  53241  .13227 .00002  .50627 .00004  -.452994  .000013          
+    4  8 25  53242  .13439 .00002  .50488 .00003  -.452786  .000012          
+    4  8 26  53243  .13604 .00002  .50376 .00003  -.452446  .000011          
+                                                                                
+      _______________________________________________________________________   
+                                                                                
+      PREDICTIONS:                                                              
+      The following formulas will not reproduce the predictions given below,    
+      but may be used to extend the predictions beyond the end of this table.   
+                                                                                
+      x =   .0530 +  .0660 cos A -  .0075 sin A +  .0182 cos C +  .1564 sin C   
+      y =   .3501 -  .0070 cos A -  .0542 sin A +  .1564 cos C -  .0182 sin C   
+         UT1-UTC =  -.4952 -  .00023 (MJD - 53248) - (UT2-UT1)                  
+                                                                                
+      where A = 2*pi*(MJD-53243)/365.25 and C = 2*pi*(MJD-53243)/435.           
+                                                                                
+         TAI-UTC(MJD 53244) = 32.0                                              
+      The accuracy may be estimated from the expressions:                       
+      S x,y = 0.0042 (MJD-53243)**0.28    S t = 0.0003 (MJD-53248)**0.75        
+      Estimated accuracies are:  Predictions     10 d   20 d   30 d   40 d      
+                                 Polar coord's  0.004  0.006  0.009  0.011      
+                                 UT1-UTC        0.0017 0.0028 0.0039 0.0048     
+                                                                                
+                    MJD      x(arcsec)   y(arcsec)   UT1-UTC(sec)               
+       2004  8 27  53244       0.1377      0.5027     -0.45210              
+       2004  8 28  53245       0.1394      0.5015     -0.45190              
+       2004  8 29  53246       0.1411      0.5002     -0.45197              
+       2004  8 30  53247       0.1429      0.4989     -0.45234              
+       2004  8 31  53248       0.1447      0.4976     -0.45293              
+       2004  9  1  53249       0.1465      0.4962     -0.45361              
+       2004  9  2  53250       0.1484      0.4948     -0.45424              
+       2004  9  3  53251       0.1503      0.4934     -0.45476              
+       2004  9  4  53252       0.1521      0.4920     -0.45512              
+       2004  9  5  53253       0.1540      0.4905     -0.45530              
+       2004  9  6  53254       0.1558      0.4890     -0.45531              
+       2004  9  7  53255       0.1577      0.4874     -0.45519              
+       2004  9  8  53256       0.1595      0.4859     -0.45497              
+       2004  9  9  53257       0.1613      0.4843     -0.45474              
+       2004  9 10  53258       0.1631      0.4827     -0.45458              
+       2004  9 11  53259       0.1649      0.4810     -0.45456              
+       2004  9 12  53260       0.1667      0.4794     -0.45474              
+       2004  9 13  53261       0.1684      0.4777     -0.45514              
+       2004  9 14  53262       0.1701      0.4760     -0.45578              
+       2004  9 15  53263       0.1717      0.4742     -0.45660              
+       2004  9 16  53264       0.1734      0.4725     -0.45754              
+       2004  9 17  53265       0.1750      0.4707     -0.45849              
+       2004  9 18  53266       0.1765      0.4689     -0.45932              
+       2004  9 19  53267       0.1780      0.4671     -0.45996              
+       2004  9 20  53268       0.1795      0.4652     -0.46036              
+       2004  9 21  53269       0.1810      0.4634     -0.46055              
+       2004  9 22  53270       0.1824      0.4615     -0.46061              
+       2004  9 23  53271       0.1838      0.4596     -0.46068              
+       2004  9 24  53272       0.1852      0.4576     -0.46086              
+       2004  9 25  53273       0.1865      0.4557     -0.46126              
+       2004  9 26  53274       0.1878      0.4537     -0.46192              
+       2004  9 27  53275       0.1890      0.4517     -0.46280              
+       2004  9 28  53276       0.1902      0.4497     -0.46382              
+       2004  9 29  53277       0.1914      0.4477     -0.46486              
+       2004  9 30  53278       0.1925      0.4457     -0.46581              
+       2004 10  1  53279       0.1936      0.4436     -0.46658              
+       2004 10  2  53280       0.1946      0.4415     -0.46715              
+       2004 10  3  53281       0.1956      0.4394     -0.46750              
+       2004 10  4  53282       0.1966      0.4373     -0.46766              
+       2004 10  5  53283       0.1976      0.4352     -0.46772              
+       2004 10  6  53284       0.1985      0.4331     -0.46773              
+       2004 10  7  53285       0.1993      0.4309     -0.46778              
+       2004 10  8  53286       0.2001      0.4288     -0.46795              
+       2004 10  9  53287       0.2009      0.4266     -0.46830              
+       2004 10 10  53288       0.2017      0.4244     -0.46887              
+       2004 10 11  53289       0.2024      0.4222     -0.46968              
+       2004 10 12  53290       0.2031      0.4200     -0.47071              
+       2004 10 13  53291       0.2037      0.4178     -0.47191              
+       2004 10 14  53292       0.2043      0.4155     -0.47317              
+       2004 10 15  53293       0.2049      0.4133     -0.47435              
+       2004 10 16  53294       0.2054      0.4111     -0.47536              
+       2004 10 17  53295       0.2059      0.4088     -0.47610              
+       2004 10 18  53296       0.2063      0.4065     -0.47659              
+       2004 10 19  53297       0.2067      0.4042     -0.47691              
+       2004 10 20  53298       0.2071      0.4020     -0.47718              
+       2004 10 21  53299       0.2075      0.3997     -0.47755              
+       2004 10 22  53300       0.2078      0.3974     -0.47811              
+       2004 10 23  53301       0.2080      0.3951     -0.47893              
+       2004 10 24  53302       0.2083      0.3928     -0.47998              
+       2004 10 25  53303       0.2085      0.3905     -0.48119              
+       2004 10 26  53304       0.2086      0.3881     -0.48247              
+       2004 10 27  53305       0.2088      0.3858     -0.48369              
+       2004 10 28  53306       0.2089      0.3835     -0.48477              
+       2004 10 29  53307       0.2089      0.3812     -0.48565              
+       2004 10 30  53308       0.2090      0.3789     -0.48630              
+       2004 10 31  53309       0.2089      0.3765     -0.48674              
+       2004 11  1  53310       0.2089      0.3742     -0.48701              
+       2004 11  2  53311       0.2088      0.3719     -0.48718              
+       2004 11  3  53312       0.2088      0.3696     -0.48732              
+       2004 11  4  53313       0.2086      0.3672     -0.48753              
+       2004 11  5  53314       0.2085      0.3649     -0.48785              
+       2004 11  6  53315       0.2082      0.3626     -0.48835              
+       2004 11  7  53316       0.2080      0.3603     -0.48906              
+       2004 11  8  53317       0.2077      0.3579     -0.48997              
+       2004 11  9  53318       0.2074      0.3556     -0.49106              
+       2004 11 10  53319       0.2071      0.3533     -0.49226              
+       2004 11 11  53320       0.2067      0.3510     -0.49344              
+       2004 11 12  53321       0.2063      0.3487     -0.49449              
+       2004 11 13  53322       0.2059      0.3464     -0.49531              
+       2004 11 14  53323       0.2054      0.3441     -0.49585              
+       2004 11 15  53324       0.2049      0.3418     -0.49618              
+       2004 11 16  53325       0.2044      0.3396     -0.49639              
+       2004 11 17  53326       0.2038      0.3373     -0.49664              
+       2004 11 18  53327       0.2032      0.3350     -0.49705              
+       2004 11 19  53328       0.2026      0.3328     -0.49769              
+       2004 11 20  53329       0.2020      0.3305     -0.49854              
+       2004 11 21  53330       0.2013      0.3283     -0.49953              
+       2004 11 22  53331       0.2006      0.3261     -0.50058              
+       2004 11 23  53332       0.1999      0.3239     -0.50158              
+       2004 11 24  53333       0.1991      0.3217     -0.50243              
+       2004 11 25  53334       0.1983      0.3195     -0.50308              
+       2004 11 26  53335       0.1975      0.3173     -0.50350              
+       2004 11 27  53336       0.1967      0.3151     -0.50369              
+       2004 11 28  53337       0.1958      0.3130     -0.50370              
+       2004 11 29  53338       0.1949      0.3108     -0.50358              
+       2004 11 30  53339       0.1940      0.3087     -0.50342              
+       2004 12  1  53340       0.1931      0.3066     -0.50329              
+       2004 12  2  53341       0.1921      0.3045     -0.50327              
+       2004 12  3  53342       0.1911      0.3024     -0.50340              
+       2004 12  4  53343       0.1901      0.3004     -0.50372              
+       2004 12  5  53344       0.1890      0.2983     -0.50423              
+       2004 12  6  53345       0.1880      0.2963     -0.50493              
+       2004 12  7  53346       0.1869      0.2943     -0.50574              
+       2004 12  8  53347       0.1858      0.2923     -0.50660              
+       2004 12  9  53348       0.1846      0.2903     -0.50739              
+       2004 12 10  53349       0.1835      0.2883     -0.50808              
+       2004 12 11  53350       0.1823      0.2864     -0.50851              
+       2004 12 12  53351       0.1811      0.2844     -0.50870              
+       2004 12 13  53352       0.1799      0.2825     -0.50874              
+       2004 12 14  53353       0.1786      0.2807     -0.50875              
+       2004 12 15  53354       0.1773      0.2788     -0.50890              
+       2004 12 16  53355       0.1760      0.2769     -0.50927              
+       2004 12 17  53356       0.1747      0.2751     -0.50987              
+       2004 12 18  53357       0.1734      0.2733     -0.51064              
+       2004 12 19  53358       0.1720      0.2715     -0.51148              
+       2004 12 20  53359       0.1707      0.2698     -0.51228              
+       2004 12 21  53360       0.1693      0.2680     -0.51295              
+       2004 12 22  53361       0.1679      0.2663     -0.51342              
+       2004 12 23  53362       0.1664      0.2646     -0.51367              
+       2004 12 24  53363       0.1650      0.2629     -0.51371              
+       2004 12 25  53364       0.1635      0.2613     -0.51357              
+       2004 12 26  53365       0.1620      0.2596     -0.51330              
+       2004 12 27  53366       0.1605      0.2580     -0.51298              
+       2004 12 28  53367       0.1590      0.2565     -0.51268              
+       2004 12 29  53368       0.1575      0.2549     -0.51247              
+       2004 12 30  53369       0.1559      0.2534     -0.51241              
+       2004 12 31  53370       0.1543      0.2519     -0.51253              
+       2005  1  1  53371       0.1528      0.2504     -0.51283              
+       2005  1  2  53372       0.1511      0.2489     -0.51331              
+       2005  1  3  53373       0.1495      0.2475     -0.51391              
+       2005  1  4  53374       0.1479      0.2461     -0.51458              
+       2005  1  5  53375       0.1463      0.2447     -0.51522              
+       2005  1  6  53376       0.1446      0.2434     -0.51574              
+       2005  1  7  53377       0.1429      0.2420     -0.51605              
+       2005  1  8  53378       0.1412      0.2407     -0.51614              
+       2005  1  9  53379       0.1395      0.2395     -0.51605              
+       2005  1 10  53380       0.1378      0.2382     -0.51590              
+       2005  1 11  53381       0.1361      0.2370     -0.51585              
+       2005  1 12  53382       0.1344      0.2358     -0.51603              
+       2005  1 13  53383       0.1326      0.2347     -0.51648              
+       2005  1 14  53384       0.1308      0.2335     -0.51717              
+       2005  1 15  53385       0.1291      0.2324     -0.51800              
+       2005  1 16  53386       0.1273      0.2313     -0.51881              
+       2005  1 17  53387       0.1255      0.2303     -0.51951              
+       2005  1 18  53388       0.1237      0.2293     -0.52000              
+       2005  1 19  53389       0.1219      0.2283     -0.52027              
+       2005  1 20  53390       0.1200      0.2273     -0.52032              
+       2005  1 21  53391       0.1182      0.2264     -0.52018              
+       2005  1 22  53392       0.1164      0.2255     -0.51992              
+       2005  1 23  53393       0.1145      0.2246     -0.51959              
+       2005  1 24  53394       0.1126      0.2237     -0.51928              
+       2005  1 25  53395       0.1108      0.2229     -0.51905              
+       2005  1 26  53396       0.1089      0.2221     -0.51897              
+       2005  1 27  53397       0.1070      0.2213     -0.51908              
+       2005  1 28  53398       0.1051      0.2206     -0.51939              
+       2005  1 29  53399       0.1032      0.2199     -0.51987              
+       2005  1 30  53400       0.1013      0.2192     -0.52050              
+       2005  1 31  53401       0.0994      0.2186     -0.52119              
+       2005  2  1  53402       0.0975      0.2180     -0.52187              
+       2005  2  2  53403       0.0956      0.2174     -0.52246              
+       2005  2  3  53404       0.0936      0.2168     -0.52288              
+       2005  2  4  53405       0.0917      0.2163     -0.52309              
+       2005  2  5  53406       0.0898      0.2158     -0.52311              
+       2005  2  6  53407       0.0878      0.2153     -0.52305              
+       2005  2  7  53408       0.0859      0.2149     -0.52303              
+       2005  2  8  53409       0.0840      0.2144     -0.52321              
+       2005  2  9  53410       0.0820      0.2141     -0.52368              
+       2005  2 10  53411       0.0801      0.2137     -0.52444              
+       2005  2 11  53412       0.0781      0.2134     -0.52542              
+       2005  2 12  53413       0.0761      0.2131     -0.52646              
+       2005  2 13  53414       0.0742      0.2128     -0.52744              
+       2005  2 14  53415       0.0722      0.2126     -0.52822              
+       2005  2 15  53416       0.0703      0.2124     -0.52877              
+       2005  2 16  53417       0.0683      0.2122     -0.52907              
+       2005  2 17  53418       0.0663      0.2120     -0.52916              
+       2005  2 18  53419       0.0644      0.2119     -0.52910              
+       2005  2 19  53420       0.0624      0.2118     -0.52897              
+       2005  2 20  53421       0.0605      0.2117     -0.52883              
+       2005  2 21  53422       0.0585      0.2117     -0.52876              
+       2005  2 22  53423       0.0566      0.2117     -0.52882              
+       2005  2 23  53424       0.0546      0.2117     -0.52907              
+       2005  2 24  53425       0.0526      0.2118     -0.52951              
+       2005  2 25  53426       0.0507      0.2118     -0.53014              
+       2005  2 26  53427       0.0487      0.2119     -0.53091              
+       2005  2 27  53428       0.0468      0.2121     -0.53174              
+       2005  2 28  53429       0.0449      0.2122     -0.53254              
+       2005  3  1  53430       0.0429      0.2124     -0.53321              
+       2005  3  2  53431       0.0410      0.2126     -0.53368              
+       2005  3  3  53432       0.0391      0.2129     -0.53392              
+       2005  3  4  53433       0.0372      0.2131     -0.53393              
+       2005  3  5  53434       0.0352      0.2134     -0.53380              
+       2005  3  6  53435       0.0333      0.2138     -0.53366              
+       2005  3  7  53436       0.0314      0.2141     -0.53365              
+       2005  3  8  53437       0.0296      0.2145     -0.53389              
+       2005  3  9  53438       0.0277      0.2149     -0.53443              
+       2005  3 10  53439       0.0258      0.2154     -0.53526              
+       2005  3 11  53440       0.0239      0.2159     -0.53627              
+       2005  3 12  53441       0.0221      0.2164     -0.53733              
+       2005  3 13  53442       0.0202      0.2169     -0.53830              
+       2005  3 14  53443       0.0184      0.2174     -0.53908              
+       2005  3 15  53444       0.0166      0.2180     -0.53964              
+       2005  3 16  53445       0.0147      0.2186     -0.53998              
+       2005  3 17  53446       0.0129      0.2192     -0.54014              
+       2005  3 18  53447       0.0111      0.2198     -0.54018              
+       2005  3 19  53448       0.0093      0.2205     -0.54018              
+       2005  3 20  53449       0.0076      0.2212     -0.54022              
+       2005  3 21  53450       0.0058      0.2219     -0.54037              
+       2005  3 22  53451       0.0040      0.2227     -0.54069              
+       2005  3 23  53452       0.0023      0.2234     -0.54118              
+       2005  3 24  53453       0.0005      0.2242     -0.54185              
+       2005  3 25  53454      -0.0012      0.2250     -0.54266              
+       2005  3 26  53455      -0.0029      0.2258     -0.54356              
+       2005  3 27  53456      -0.0046      0.2267     -0.54447              
+       2005  3 28  53457      -0.0063      0.2276     -0.54530              
+       2005  3 29  53458      -0.0079      0.2285     -0.54598              
+       2005  3 30  53459      -0.0096      0.2294     -0.54647              
+       2005  3 31  53460      -0.0112      0.2303     -0.54675              
+       2005  4  1  53461      -0.0128      0.2313     -0.54688              
+       2005  4  2  53462      -0.0144      0.2323     -0.54699              
+       2005  4  3  53463      -0.0160      0.2333     -0.54724              
+       2005  4  4  53464      -0.0176      0.2343     -0.54775              
+       2005  4  5  53465      -0.0191      0.2353     -0.54858              
+       2005  4  6  53466      -0.0207      0.2364     -0.54970              
+       2005  4  7  53467      -0.0222      0.2375     -0.55097              
+       2005  4  8  53468      -0.0237      0.2386     -0.55228              
+       2005  4  9  53469      -0.0252      0.2397     -0.55354              
+       2005  4 10  53470      -0.0267      0.2408     -0.55465              
+       2005  4 11  53471      -0.0281      0.2420     -0.55556              
+       2005  4 12  53472      -0.0295      0.2431     -0.55626              
+       2005  4 13  53473      -0.0310      0.2443     -0.55677              
+       2005  4 14  53474      -0.0323      0.2455     -0.55715              
+       2005  4 15  53475      -0.0337      0.2468     -0.55748              
+       2005  4 16  53476      -0.0351      0.2480     -0.55785              
+       2005  4 17  53477      -0.0364      0.2493     -0.55833              
+       2005  4 18  53478      -0.0377      0.2505     -0.55899              
+       2005  4 19  53479      -0.0390      0.2518     -0.55988              
+       2005  4 20  53480      -0.0403      0.2531     -0.56095              
+       2005  4 21  53481      -0.0415      0.2545     -0.56216              
+       2005  4 22  53482      -0.0427      0.2558     -0.56347              
+       2005  4 23  53483      -0.0439      0.2572     -0.56478              
+       2005  4 24  53484      -0.0451      0.2585     -0.56599              
+       2005  4 25  53485      -0.0463      0.2599     -0.56699              
+       2005  4 26  53486      -0.0474      0.2613     -0.56769              
+       2005  4 27  53487      -0.0485      0.2627     -0.56808              
+       2005  4 28  53488      -0.0496      0.2641     -0.56824              
+       2005  4 29  53489      -0.0507      0.2656     -0.56830              
+       2005  4 30  53490      -0.0517      0.2670     -0.56839              
+       2005  5  1  53491      -0.0527      0.2685     -0.56860              
+       2005  5  2  53492      -0.0537      0.2700     -0.56897              
+       2005  5  3  53493      -0.0547      0.2714     -0.56955              
+       2005  5  4  53494      -0.0556      0.2729     -0.57032              
+       2005  5  5  53495      -0.0565      0.2744     -0.57119              
+       2005  5  6  53496      -0.0574      0.2760     -0.57204              
+       2005  5  7  53497      -0.0583      0.2775     -0.57277              
+       2005  5  8  53498      -0.0591      0.2790     -0.57329              
+       2005  5  9  53499      -0.0600      0.2806     -0.57354              
+       2005  5 10  53500      -0.0607      0.2821     -0.57350              
+       2005  5 11  53501      -0.0615      0.2837     -0.57328              
+       2005  5 12  53502      -0.0622      0.2853     -0.57298              
+       2005  5 13  53503      -0.0630      0.2869     -0.57261              
+       2005  5 14  53504      -0.0636      0.2885     -0.57218              
+       2005  5 15  53505      -0.0643      0.2901     -0.57175              
+       2005  5 16  53506      -0.0649      0.2917     -0.57143              
+       2005  5 17  53507      -0.0655      0.2933     -0.57124              
+       2005  5 18  53508      -0.0661      0.2949     -0.57117              
+       2005  5 19  53509      -0.0667      0.2966     -0.57124              
+       2005  5 20  53510      -0.0672      0.2982     -0.57139              
+       2005  5 21  53511      -0.0677      0.2999     -0.57158              
+       2005  5 22  53512      -0.0682      0.3015     -0.57166              
+       2005  5 23  53513      -0.0686      0.3032     -0.57155              
+       2005  5 24  53514      -0.0690      0.3048     -0.57116              
+       2005  5 25  53515      -0.0694      0.3065     -0.57057              
+       2005  5 26  53516      -0.0698      0.3082     -0.56989              
+       2005  5 27  53517      -0.0701      0.3098     -0.56921              
+       2005  5 28  53518      -0.0704      0.3115     -0.56860              
+       2005  5 29  53519      -0.0707      0.3132     -0.56818              
+       2005  5 30  53520      -0.0710      0.3149     -0.56799              
+       2005  5 31  53521      -0.0712      0.3166     -0.56800              
+       2005  6  1  53522      -0.0714      0.3183     -0.56809              
+       2005  6  2  53523      -0.0716      0.3200     -0.56815              
+       2005  6  3  53524      -0.0717      0.3217     -0.56808              
+       2005  6  4  53525      -0.0718      0.3234     -0.56781              
+       2005  6  5  53526      -0.0719      0.3251     -0.56728              
+       2005  6  6  53527      -0.0720      0.3268     -0.56651              
+       2005  6  7  53528      -0.0720      0.3285     -0.56557              
+       2005  6  8  53529      -0.0720      0.3302     -0.56454              
+       2005  6  9  53530      -0.0720      0.3319     -0.56347              
+       2005  6 10  53531      -0.0720      0.3336     -0.56244              
+       2005  6 11  53532      -0.0719      0.3353     -0.56148              
+       2005  6 12  53533      -0.0718      0.3370     -0.56060              
+       2005  6 13  53534      -0.0717      0.3387     -0.55990              
+       2005  6 14  53535      -0.0715      0.3404     -0.55943              
+       2005  6 15  53536      -0.0713      0.3421     -0.55916              
+       2005  6 16  53537      -0.0711      0.3438     -0.55897              
+       2005  6 17  53538      -0.0709      0.3455     -0.55881              
+       2005  6 18  53539      -0.0707      0.3472     -0.55859              
+       2005  6 19  53540      -0.0704      0.3489     -0.55820              
+       2005  6 20  53541      -0.0701      0.3506     -0.55751              
+       2005  6 21  53542      -0.0697      0.3523     -0.55650              
+       2005  6 22  53543      -0.0694      0.3540     -0.55529              
+       2005  6 23  53544      -0.0690      0.3557     -0.55402              
+       2005  6 24  53545      -0.0686      0.3573     -0.55279              
+       2005  6 25  53546      -0.0682      0.3590     -0.55173              
+       2005  6 26  53547      -0.0677      0.3607     -0.55093              
+       2005  6 27  53548      -0.0673      0.3623     -0.55037              
+       2005  6 28  53549      -0.0668      0.3640     -0.54994              
+       2005  6 29  53550      -0.0662      0.3656     -0.54947              
+       2005  6 30  53551      -0.0657      0.3673     -0.54884              
+       2005  7  1  53552      -0.0651      0.3689     -0.54798              
+       2005  7  2  53553      -0.0645      0.3705     -0.54689              
+       2005  7  3  53554      -0.0639      0.3721     -0.54560              
+       2005  7  4  53555      -0.0633      0.3738     -0.54414              
+       2005  7  5  53556      -0.0626      0.3754     -0.54257              
+       2005  7  6  53557      -0.0620      0.3770     -0.54101              
+       2005  7  7  53558      -0.0613      0.3786     -0.53952              
+       2005  7  8  53559      -0.0605      0.3801     -0.53819              
+       2005  7  9  53560      -0.0598      0.3817     -0.53705              
+       2005  7 10  53561      -0.0590      0.3833     -0.53611              
+       2005  7 11  53562      -0.0583      0.3848     -0.53535              
+       2005  7 12  53563      -0.0575      0.3864     -0.53475              
+       2005  7 13  53564      -0.0566      0.3879     -0.53425              
+       2005  7 14  53565      -0.0558      0.3895     -0.53374              
+       2005  7 15  53566      -0.0549      0.3910     -0.53315              
+       2005  7 16  53567      -0.0541      0.3925     -0.53243              
+       2005  7 17  53568      -0.0532      0.3940     -0.53152              
+       2005  7 18  53569      -0.0523      0.3955     -0.53042              
+       2005  7 19  53570      -0.0513      0.3969     -0.52913              
+       2005  7 20  53571      -0.0504      0.3984     -0.52776              
+       2005  7 21  53572      -0.0494      0.3998     -0.52644              
+       2005  7 22  53573      -0.0485      0.4013     -0.52532              
+       2005  7 23  53574      -0.0475      0.4027     -0.52451              
+       2005  7 24  53575      -0.0464      0.4041     -0.52400              
+       2005  7 25  53576      -0.0454      0.4055     -0.52377              
+       2005  7 26  53577      -0.0444      0.4069     -0.52366              
+       2005  7 27  53578      -0.0433      0.4083     -0.52344              
+       2005  7 28  53579      -0.0423      0.4096     -0.52299              
+       2005  7 29  53580      -0.0412      0.4110     -0.52228              
+       2005  7 30  53581      -0.0401      0.4123     -0.52130              
+       2005  7 31  53582      -0.0390      0.4136     -0.52010              
+       2005  8  1  53583      -0.0378      0.4149     -0.51872              
+       2005  8  2  53584      -0.0367      0.4162     -0.51725              
+       2005  8  3  53585      -0.0356      0.4175     -0.51578              
+       2005  8  4  53586      -0.0344      0.4188     -0.51436              
+       2005  8  5  53587      -0.0332      0.4200     -0.51310              
+       2005  8  6  53588      -0.0320      0.4212     -0.51204              
+       2005  8  7  53589      -0.0309      0.4224     -0.51120              
+       2005  8  8  53590      -0.0297      0.4236     -0.51055              
+       2005  8  9  53591      -0.0284      0.4248     -0.51006              
+       2005  8 10  53592      -0.0272      0.4260     -0.50966              
+       2005  8 11  53593      -0.0260      0.4271     -0.50922              
+       2005  8 12  53594      -0.0247      0.4283     -0.50872              
+       2005  8 13  53595      -0.0235      0.4294     -0.50809              
+       2005  8 14  53596      -0.0222      0.4305     -0.50729              
+       2005  8 15  53597      -0.0210      0.4315     -0.50638              
+       2005  8 16  53598      -0.0197      0.4326     -0.50535              
+       2005  8 17  53599      -0.0184      0.4336     -0.50431              
+       2005  8 18  53600      -0.0171      0.4347     -0.50339              
+       2005  8 19  53601      -0.0158      0.4357     -0.50273              
+       2005  8 20  53602      -0.0145      0.4367     -0.50244              
+       2005  8 21  53603      -0.0132      0.4376     -0.50247              
+       2005  8 22  53604      -0.0119      0.4386     -0.50267              
+       2005  8 23  53605      -0.0106      0.4395     -0.50286              
+       2005  8 24  53606      -0.0093      0.4404     -0.50287              
+       2005  8 25  53607      -0.0079      0.4413     -0.50263              
+       2005  8 26  53608      -0.0066      0.4422     -0.50217              
+      These predictions are based on all announced leap seconds.                
+                                                                                
+    The IERS Conventions recommended software to predict celestial pole         
+    offsets is available at ftp://maia.usno.navy.mil/conventions/chapter5/      
+    ceppred.f and software for the calculation of the dX and dY with            
+    respect to IAU2000A Nutation/Precession Theory can be found at the          
+    http://maia.usno.navy.mil/conv2000.html web site in section chapter 5.      
+                                                                                
+  **************************************************************************    
+       Important Notice - IAU 2000 Resolution Compliancy Information            
+  **************************************************************************    
+                                                                                
+  Resolutions passed at the 24th General Assembly of the International          
+  Astronomical Union (IAU) recommend the implementation of a number of new      
+  procedures concerning the transformation between the celestial and            
+  terrestrial reference systems.  Information regarding these procedures        
+  is available in Chapter 5 of the IERS Conventions 2000 available at           
+  http://maia.usno.navy.mil/conv2000.html.                                      
+                                                                                
+  With these resolutions, beginning on 1 January 2003, IERS Bulletins A and     
+  B will publish new products in addition to those already published.  These    
+  products will include the celestial pole offsets X_obs-X_IAU2000A             
+  and Y_obs-Y_IAU2000A where                                                    
+                                                                                
+  X_obs and Y_obs are the observed X, Y coordinates of the Celestial            
+  Intermediate Pole in the Geocentric Celestial Reference System, and           
+                                                                                
+  X_IAU2000A and Y_IAU2000A are the celestial pole coordinates provided by      
+  using the IAU2000A Precession-Nutation theory.                                
+                                                                                
+  It is expected that Celestial Pole offsets related to the IAU1980 Nutation    
+  Theory will continue to be published through 31 December 2004.  The new       
+  celestial pole offsets related to the new IAU2000A Precession-Nutation        
+  theory will be produced in a separate data file as well as appended to        
+  to this file.                                                                 
+                                                                                
+  **************************************************************************    
+       Important Notice - IAU 2000 Resolution Compliancy Information            
+  **************************************************************************    
+                                                                                
Index: /tags/ipp-1-X/bug123/psLib/share/pslib/tai_utc.dat
===================================================================
--- /tags/ipp-1-X/bug123/psLib/share/pslib/tai_utc.dat	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/share/pslib/tai_utc.dat	(revision 22331)
@@ -0,0 +1,50 @@
+#  tai-utc.dat
+#
+#  This file comes from http://maia.usno.navy.mil (Click on table of leap seconds since 1961). This file may
+#  also be directly downloaded from ftp://maia.usno.navy.mil/ser7/tai-utc.dat. See readme.tai-utc (located in
+#  the psLib/data directory) for details.
+#
+#  @author Ross Harman, MHPCC
+#
+#  @version $Revision: 1.1 $ $Name: not supported by cvs2svn $
+#  @date $Date: 2005-02-10 02:36:41 $
+#
+#          JD           TAI-UTC    Const 1       Const 2
+#        (days)          (sec)      (none)       (none)
+          psF64	         psF64      psF64         psF64
+        2437300.5      1.4228180    37300.0     0.0012960
+        2437512.5      1.3728180    37300.0     0.0012960
+        2437665.5      1.8458580    37665.0     0.0011232
+        2438334.5      1.9458580    37665.0     0.0011232
+        2438395.5      3.2401300    38761.0     0.0012960
+        2438486.5      3.3401300    38761.0     0.0012960
+        2438639.5      3.4401300    38761.0     0.0012960
+        2438761.5      3.5401300    38761.0     0.0012960
+        2438820.5      3.6401300    38761.0     0.0012960
+        2438942.5      3.7401300    38761.0     0.0012960
+        2439004.5      3.8401300    38761.0     0.0012960
+        2439126.5      4.3131700    39126.0     0.0025920
+        2439887.5      4.2131700    39126.0     0.0025920
+        2441317.5     10.0000000    41317.0     0.0000000
+        2441499.5     11.0000000    41317.0     0.0000000
+        2441683.5     12.0000000    41317.0     0.0000000
+        2442048.5     13.0000000    41317.0     0.0000000
+        2442413.5     14.0000000    41317.0     0.0000000
+        2442778.5     15.0000000    41317.0     0.0000000
+        2443144.5     16.0000000    41317.0     0.0000000
+        2443509.5     17.0000000    41317.0     0.0000000
+        2443874.5     18.0000000    41317.0     0.0000000
+        2444239.5     19.0000000    41317.0     0.0000000
+        2444786.5     20.0000000    41317.0     0.0000000
+        2445151.5     21.0000000    41317.0     0.0000000
+        2445516.5     22.0000000    41317.0     0.0000000
+        2446247.5     23.0000000    41317.0     0.0000000
+        2447161.5     24.0000000    41317.0     0.0000000
+        2447892.5     25.0000000    41317.0     0.0000000
+        2448257.5     26.0000000    41317.0     0.0000000
+        2448804.5     27.0000000    41317.0     0.0000000
+        2449169.5     28.0000000    41317.0     0.0000000
+        2449534.5     29.0000000    41317.0     0.0000000
+        2450083.5     30.0000000    41317.0     0.0000000
+        2450630.5     31.0000000    41317.0     0.0000000
+        2451179.5     32.0000000    41317.0     0.0000000
Index: /tags/ipp-1-X/bug123/psLib/share/pslib/tai_utc.raw
===================================================================
--- /tags/ipp-1-X/bug123/psLib/share/pslib/tai_utc.raw	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/share/pslib/tai_utc.raw	(revision 22331)
@@ -0,0 +1,36 @@
+ 1961 JAN  1 =JD 2437300.5  TAI-UTC=   1.4228180 S + (MJD - 37300.) X 0.001296 S
+ 1961 AUG  1 =JD 2437512.5  TAI-UTC=   1.3728180 S + (MJD - 37300.) X 0.001296 S
+ 1962 JAN  1 =JD 2437665.5  TAI-UTC=   1.8458580 S + (MJD - 37665.) X 0.0011232S
+ 1963 NOV  1 =JD 2438334.5  TAI-UTC=   1.9458580 S + (MJD - 37665.) X 0.0011232S
+ 1964 JAN  1 =JD 2438395.5  TAI-UTC=   3.2401300 S + (MJD - 38761.) X 0.001296 S
+ 1964 APR  1 =JD 2438486.5  TAI-UTC=   3.3401300 S + (MJD - 38761.) X 0.001296 S
+ 1964 SEP  1 =JD 2438639.5  TAI-UTC=   3.4401300 S + (MJD - 38761.) X 0.001296 S
+ 1965 JAN  1 =JD 2438761.5  TAI-UTC=   3.5401300 S + (MJD - 38761.) X 0.001296 S
+ 1965 MAR  1 =JD 2438820.5  TAI-UTC=   3.6401300 S + (MJD - 38761.) X 0.001296 S
+ 1965 JUL  1 =JD 2438942.5  TAI-UTC=   3.7401300 S + (MJD - 38761.) X 0.001296 S
+ 1965 SEP  1 =JD 2439004.5  TAI-UTC=   3.8401300 S + (MJD - 38761.) X 0.001296 S
+ 1966 JAN  1 =JD 2439126.5  TAI-UTC=   4.3131700 S + (MJD - 39126.) X 0.002592 S
+ 1968 FEB  1 =JD 2439887.5  TAI-UTC=   4.2131700 S + (MJD - 39126.) X 0.002592 S
+ 1972 JAN  1 =JD 2441317.5  TAI-UTC=  10.0       S + (MJD - 41317.) X 0.0      S
+ 1972 JUL  1 =JD 2441499.5  TAI-UTC=  11.0       S + (MJD - 41317.) X 0.0      S
+ 1973 JAN  1 =JD 2441683.5  TAI-UTC=  12.0       S + (MJD - 41317.) X 0.0      S
+ 1974 JAN  1 =JD 2442048.5  TAI-UTC=  13.0       S + (MJD - 41317.) X 0.0      S
+ 1975 JAN  1 =JD 2442413.5  TAI-UTC=  14.0       S + (MJD - 41317.) X 0.0      S
+ 1976 JAN  1 =JD 2442778.5  TAI-UTC=  15.0       S + (MJD - 41317.) X 0.0      S
+ 1977 JAN  1 =JD 2443144.5  TAI-UTC=  16.0       S + (MJD - 41317.) X 0.0      S
+ 1978 JAN  1 =JD 2443509.5  TAI-UTC=  17.0       S + (MJD - 41317.) X 0.0      S
+ 1979 JAN  1 =JD 2443874.5  TAI-UTC=  18.0       S + (MJD - 41317.) X 0.0      S
+ 1980 JAN  1 =JD 2444239.5  TAI-UTC=  19.0       S + (MJD - 41317.) X 0.0      S
+ 1981 JUL  1 =JD 2444786.5  TAI-UTC=  20.0       S + (MJD - 41317.) X 0.0      S
+ 1982 JUL  1 =JD 2445151.5  TAI-UTC=  21.0       S + (MJD - 41317.) X 0.0      S
+ 1983 JUL  1 =JD 2445516.5  TAI-UTC=  22.0       S + (MJD - 41317.) X 0.0      S
+ 1985 JUL  1 =JD 2446247.5  TAI-UTC=  23.0       S + (MJD - 41317.) X 0.0      S
+ 1988 JAN  1 =JD 2447161.5  TAI-UTC=  24.0       S + (MJD - 41317.) X 0.0      S
+ 1990 JAN  1 =JD 2447892.5  TAI-UTC=  25.0       S + (MJD - 41317.) X 0.0      S
+ 1991 JAN  1 =JD 2448257.5  TAI-UTC=  26.0       S + (MJD - 41317.) X 0.0      S
+ 1992 JUL  1 =JD 2448804.5  TAI-UTC=  27.0       S + (MJD - 41317.) X 0.0      S
+ 1993 JUL  1 =JD 2449169.5  TAI-UTC=  28.0       S + (MJD - 41317.) X 0.0      S
+ 1994 JUL  1 =JD 2449534.5  TAI-UTC=  29.0       S + (MJD - 41317.) X 0.0      S
+ 1996 JAN  1 =JD 2450083.5  TAI-UTC=  30.0       S + (MJD - 41317.) X 0.0      S
+ 1997 JUL  1 =JD 2450630.5  TAI-UTC=  31.0       S + (MJD - 41317.) X 0.0      S
+ 1999 JAN  1 =JD 2451179.5  TAI-UTC=  32.0       S + (MJD - 41317.) X 0.0      S
Index: /tags/ipp-1-X/bug123/psLib/src/.cvsignore
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/.cvsignore	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/.cvsignore	(revision 22331)
@@ -0,0 +1,11 @@
+DoxygenLog
+Makefile.in
+.deps
+.libs
+Makefile
+config.h
+*.la
+*.lo
+stamp-h1
+libpslib.la.temp
+config.h.in
Index: /tags/ipp-1-X/bug123/psLib/src/Makefile.am
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/Makefile.am	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/Makefile.am	(revision 22331)
@@ -0,0 +1,36 @@
+SUBDIRS = astronomy collections dataManip dataIO image sysUtils
+
+INCLUDES = \
+	-I$(top_srcdir)/src/astronomy \
+	-I$(top_srcdir)/src/collections \
+	-I$(top_srcdir)/src/dataManip \
+	-I$(top_srcdir)/src/dataIO \
+	-I$(top_srcdir)/src/image \
+	-I$(top_srcdir)/src/sysUtils \
+	$(all_includes)
+
+lib_LTLIBRARIES = libpslib.la
+
+libpslib_la_LIBADD = \
+	$(top_builddir)/src/astronomy/libpslibastronomy.la \
+	$(top_builddir)/src/collections/libpslibcollections.la \
+	$(top_builddir)/src/dataManip/libpslibdataManip.la \
+	$(top_builddir)/src/dataIO/libpslibdataIO.la \
+	$(top_builddir)/src/image/libpslibimage.la \
+	$(top_builddir)/src/sysUtils/libpslibsysUtils.la 
+
+libpslib_la_SOURCES = psTest.c 
+libpslib_la_LDFLAGS = -version-info $(PSLIB_LT_VERSION) 
+
+EXTRA_DIST = parseErrorCodes.pl mainpage.dox psErrorCodes.dat psTest.h
+
+pslibincludedir = $(includedir)
+pslibinclude_HEADERS = \
+	psTest.h \
+	pslib.h \
+	pslib_strict.h
+
+install-exec-hook: libpslib.la
+	sed "s|\(^dependency_libs=.*\)|dependency_libs=\'$(PSLIB_LIBS)\'|" $(libdir)/libpslib.la > libpslib.la.temp
+	$(INSTALL) libpslib.la.temp $(libdir)/libpslib.la
+    
Index: /tags/ipp-1-X/bug123/psLib/src/astro/psCoord.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/astro/psCoord.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/astro/psCoord.c	(revision 22331)
@@ -0,0 +1,1225 @@
+/** @file  psCoord.c
+*
+*  @brief Contains basic coordinate transformation definitions and operations
+*
+*  This file defines the basic types for astronomical coordinate
+*  transformation
+*
+*  @ingroup CoordinateTransform
+*
+*  @author GLG, MHPCC
+*
+*  @version $Revision: 1.65 $ $Name: not supported by cvs2svn $
+*  @date $Date: 2005-04-19 05:46:24 $
+*
+*  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+*/
+/******************************************************************************/
+/*  INCLUDE FILES                                                             */
+/******************************************************************************/
+#include "psType.h"
+#include "psCoord.h"
+#include "psMemory.h"
+#include "psTime.h"
+#include "psConstants.h"
+#include "psError.h"
+#include "psLogMsg.h"
+#include "psAstronomyErrors.h"
+#include "psAstrometry.h"
+#include "psMatrix.h"
+#include <math.h>
+#include <float.h>
+/******************************************************************************/
+/*  DEFINE STATEMENTS                                                         */
+/******************************************************************************/
+
+// Modified Julian Day 01/01/1900 00:00:00
+#define MJD_1900 15021.0
+
+// Days in Julian century
+#define JULIAN_CENTURY 36525.0
+
+/******************************************************************************/
+/*  TYPE DEFINITIONS                                                          */
+/******************************************************************************/
+
+// None
+
+/*****************************************************************************/
+/*  GLOBAL VARIABLES                                                         */
+/*****************************************************************************/
+
+// None
+
+/*****************************************************************************/
+/*  FILE STATIC VARIABLES                                                    */
+/*****************************************************************************/
+
+// None
+
+/*****************************************************************************/
+/*  FUNCTION IMPLEMENTATION - LOCAL                                          */
+/*****************************************************************************/
+
+/*****************************************************************************/
+/* FUNCTION IMPLEMENTATION - PUBLIC                                          */
+/*****************************************************************************/
+static void planeFree(psPlane *p)
+{
+    // There are non dynamic allocated items
+}
+
+/*****************************************************************************
+p_psPlaneTransformLinearInvert(transform): : this is a private function which
+simply inverts the supplied psPlaneTransform transform.  It assumes that
+"transform" is linear.
+ 
+This program assumes that the inverse of the following linear equations:
+        X2 = A + (B * X1) + (C * Y1);
+        Y2 = D + (E * X1) + (F * Y1);
+is
+        Y1 = (Y2 - ((E/B) * X2) - D + ((E*A)/B)) / (F - ((C*E)/B));
+        X1 = (Y2 - ((F/C) * X2) - D + ((F*A)/C)) / (E - ((F*B)/C));
+or
+ X1 = (-D + ((F*A)/C)) / (E - ((F*B)/C)) +
+      (X2 * -((F/C) / (E - ((F*B)/C)))) +
+      (Y2 * (1.0 / (E - ((F*B)/C))));
+ Y1 = (-D + ((E*A)/B))/(F - ((C*E)/B)) +
+      (X2 * -((E/B) / (F - ((C*E)/B)))) +
+      (Y2 * (1.0 / (F - ((C*E)/B))));
+ 
+XXX: Since thre is now a general psPlaneTransformInvert() function, we
+should rename this.
+ *****************************************************************************/
+psPlaneTransform *p_psPlaneTransformLinearInvert(psPlaneTransform *transform)
+{
+    PS_PTR_CHECK_NULL(transform, 0);
+    PS_PTR_CHECK_NULL(transform->x, 0);
+    PS_PTR_CHECK_NULL(transform->y, 0);
+
+    psF64 A = 0.0;
+    psF64 B = 0.0;
+    psF64 C = 0.0;
+    psF64 D = 0.0;
+    psF64 E = 0.0;
+    psF64 F = 0.0;
+
+    A = transform->x->coeff[0][0];
+    if (transform->x->nX >= 2) {
+        B = transform->x->coeff[1][0];
+    }
+    if (transform->x->nY >= 2) {
+        C = transform->x->coeff[0][1];
+    }
+    D = transform->y->coeff[0][0];
+    if (transform->y->nX >= 2) {
+        E = transform->y->coeff[1][0];
+    }
+    if (transform->y->nY >= 2) {
+        F = transform->y->coeff[0][1];
+    }
+
+    psPlaneTransform *out = psPlaneTransformAlloc(2, 2);
+
+    out->x->coeff[0][0] = (-D + ((F*A)/C)) / (E - ((F*B)/C));
+    out->x->coeff[1][0] = -(F/C) / (E - ((F*B)/C));
+    out->x->coeff[0][1] =  1.0 / (E - ((F*B)/C));
+    out->y->coeff[0][0] = (-D + ((E*A)/B)) / (F - ((C*E)/B));
+    out->y->coeff[1][0] = -(E/B) / (F - ((C*E)/B));
+    out->y->coeff[0][1] =  1.0 / (F - ((C*E)/B));
+
+    return(out);
+}
+
+/*****************************************************************************
+p_psIsProjectionLinear(): this is a private function which simply determines
+if the supplied psPlaneTransform transform is linear: if any of the
+cooefficients of order 2 are higher are non-zero, then it is not linear.
+ *****************************************************************************/
+psS32 p_psIsProjectionLinear(psPlaneTransform *transform)
+{
+    PS_PTR_CHECK_NULL(transform, 0);
+    PS_PTR_CHECK_NULL(transform->x, 0);
+    PS_PTR_CHECK_NULL(transform->y, 0);
+
+    for (psS32 i=0;i<(transform->x->nX);i++) {
+        for (psS32 j=0;j<(transform->x->nY);j++) {
+            if (transform->x->coeff[i][j] != 0.0) {
+                if (!(((i == 0) && (j == 0)) ||
+                        ((i == 0) && (j == 1)) ||
+                        ((i == 1) && (j == 0)))) {
+                    return(0);
+                }
+            }
+        }
+    }
+
+    for (psS32 i=0;i<(transform->y->nX);i++) {
+        for (psS32 j=0;j<(transform->y->nY);j++) {
+            if (transform->y->coeff[i][j] != 0.0) {
+                if (!(((i == 0) && (j == 0)) ||
+                        ((i == 0) && (j == 1)) ||
+                        ((i == 1) && (j == 0)))) {
+                    return(0);
+                }
+            }
+        }
+    }
+
+    return(1);
+}
+
+// XXX: Must test psPlaneAlloc() and planeFree().
+// XXX: Must rewrite code and tests to use these functions.
+psPlane* psPlaneAlloc(void)
+{
+    psPlane *p = psAlloc(sizeof(psPlane));
+
+    psMemSetDeallocator(p, (psFreeFcn) planeFree);
+    return(p);
+}
+
+
+static void sphereFree(psSphere *s)
+{
+    // There are non dynamic allocated items
+}
+
+psSphere* psSphereAlloc(void)
+{
+    psSphere *s = psAlloc(sizeof(psSphere));
+
+    psMemSetDeallocator(s, (psFreeFcn) sphereFree);
+    return(s);
+}
+
+static void planeTransformFree(psPlaneTransform *pt)
+{
+    psFree(pt->x);
+    psFree(pt->y);
+}
+
+psPlaneTransform* psPlaneTransformAlloc(psS32 n1, psS32 n2)
+{
+    PS_INT_CHECK_NON_NEGATIVE(n1, NULL);
+    PS_INT_CHECK_NON_NEGATIVE(n2, NULL);
+
+    psPlaneTransform *pt = psAlloc(sizeof(psPlaneTransform));
+    pt->x = psDPolynomial2DAlloc(n1, n2, PS_POLYNOMIAL_ORD);
+    pt->y = psDPolynomial2DAlloc(n1, n2, PS_POLYNOMIAL_ORD);
+
+    psMemSetDeallocator(pt, (psFreeFcn) planeTransformFree);
+    return(pt);
+}
+
+psPlane* psPlaneTransformApply(psPlane* out,
+                               const psPlaneTransform* transform,
+                               const psPlane* coords)
+{
+    PS_PTR_CHECK_NULL(transform, NULL);
+    PS_PTR_CHECK_NULL(transform->x, NULL);
+    PS_PTR_CHECK_NULL(transform->y, NULL);
+    PS_PTR_CHECK_NULL(coords, NULL);
+
+    if (out == NULL) {
+        out = (psPlane* ) psAlloc(sizeof(psPlane));
+    }
+    out->x = psDPolynomial2DEval(
+                 transform->x,
+                 coords->x,
+                 coords->y
+             );
+    out->y = psDPolynomial2DEval(
+                 transform->y,
+                 coords->x,
+                 coords->y
+             );
+    return (out);
+}
+
+static void planeDistortFree(psPlaneDistort *pt)
+{
+    psFree(pt->x);
+    psFree(pt->y);
+}
+
+psPlaneDistort* psPlaneDistortAlloc(psS32 n1, psS32 n2, psS32 n3, psS32 n4)
+{
+    PS_INT_CHECK_NON_NEGATIVE(n1, NULL);
+    PS_INT_CHECK_NON_NEGATIVE(n2, NULL);
+    PS_INT_CHECK_NON_NEGATIVE(n3, NULL);
+    PS_INT_CHECK_NON_NEGATIVE(n4, NULL);
+
+    psPlaneDistort *pt = psAlloc(sizeof(psPlaneDistort));
+    pt->x = psDPolynomial4DAlloc(n1, n2, n3, n4, PS_POLYNOMIAL_ORD);
+    pt->y = psDPolynomial4DAlloc(n1, n2, n3, n4, PS_POLYNOMIAL_ORD);
+
+    psMemSetDeallocator(pt, (psFreeFcn) planeDistortFree);
+    return(pt);
+}
+
+/******************************************************************************
+This transformation takes into account parameters beyond an objects spatial
+coordinates: term3 and term4 (magnitude and color).
+ *****************************************************************************/
+psPlane* psPlaneDistortApply(psPlane* out,
+                             const psPlaneDistort* transform,
+                             const psPlane* coords,
+                             float color,
+                             float magnitude)
+{
+    PS_PTR_CHECK_NULL(transform, NULL);
+    PS_PTR_CHECK_NULL(transform->x, NULL);
+    PS_PTR_CHECK_NULL(transform->y, NULL);
+    PS_PTR_CHECK_NULL(coords, NULL);
+
+    if (out == NULL) {
+        out = (psPlane* ) psAlloc(sizeof(psPlane));
+    }
+    out->x = psDPolynomial4DEval(
+                 transform->x,
+                 coords->x,
+                 coords->y,
+                 color,
+                 magnitude
+             );
+    out->y = psDPolynomial4DEval(
+                 transform->y,
+                 coords->x,
+                 coords->y,
+                 color,
+                 magnitude
+             );
+    return (out);
+}
+
+/******************************************************************************
+alpha is LONGITUDE
+delta is LATITUDE
+ 
+    alphaP: Take the target pole in the source system; calculate its LONGITUDE
+     in the target system.  That longitude is alphaP.
+    DeltaP: Take the target pole in the source system; calculate its LATITUDE
+     in the target system.  That longitude is deltaP.
+    phiP:   This is the LONGITUDE of the ascending node in the target system.
+ *****************************************************************************/
+psSphereTransform* psSphereTransformAlloc(psF64 alphaP,
+        psF64 deltaP,
+        psF64 phiP)
+{
+    psSphereTransform* tmp = (psSphereTransform* ) psAlloc(sizeof(psSphereTransform));
+
+    tmp->cosDeltaP = cos(deltaP);
+    tmp->sinDeltaP = sin(deltaP);
+    tmp->alphaP = alphaP;
+    tmp->phiP = phiP;
+
+    return (tmp);
+}
+
+/******************************************************************************
+XXX: Private Function.
+ 
+piNormalize(): take an input angle in radians and convert it to the range 0:2*PI.
+ *****************************************************************************/
+psF32 piNormalize(psF32 angle)
+{
+    while (angle < FLT_EPSILON) {
+        angle+=PS_PI*2;
+    }
+
+    while (angle >= (PS_PI*2)) {
+        angle-=PS_PI*2;
+    }
+    return(angle);
+}
+
+/******************************************************************************
+XXX: We convert Right Ascension angles to the range 0:PI.  Is that acceptable?
+XXX: Should we do something for Declination as well?
+ *****************************************************************************/
+psSphere* psSphereTransformApply(psSphere* out,
+                                 const psSphereTransform* transform,
+                                 const psSphere* coord)
+{
+    PS_PTR_CHECK_NULL(transform, NULL);
+    PS_PTR_CHECK_NULL(coord, NULL);
+
+    if (out == NULL) {
+        out = (psSphere* ) psAlloc(sizeof(psSphere));
+    }
+
+    psF64 alpha = coord->r;
+    psF64 delta = coord->d;
+    psF64 alphaMinusAlphaP = alpha - transform->alphaP;
+
+    psF64 eq55 = (sin(delta) * transform->cosDeltaP) -
+                 (cos(delta) * transform->sinDeltaP * sin(alphaMinusAlphaP));
+    psF64 eq56 = (cos(delta) * transform->cosDeltaP * sin(alphaMinusAlphaP)) +
+                 (sin(delta) * transform->sinDeltaP);
+    psF64 eq57 = cos(delta) * cos(alphaMinusAlphaP);
+
+    psF64 theta = asin(eq55);
+    psF64 phi = atan2(eq56, eq57) + transform->phiP;
+    out->r = piNormalize(phi);
+    out->d = theta;
+
+    return(out);
+}
+
+psSphereTransform* psSphereTransformICRSToEcliptic(psTime *time)
+{
+    psF64 T;
+
+    // Check for null parameter
+    PS_PTR_CHECK_NULL(time, NULL);
+
+    // Convert psTime to MJD
+    psF64 MJD = psTimeToMJD(time);
+
+    // Check the specified MJD is greater than 1900
+    if ( MJD < MJD_1900 ) {
+        psError(PS_ERR_BAD_PARAMETER_TYPE,true,PS_ERRORTEXT_psCoord_INVALID_MJD);
+        return NULL;
+    }
+
+    // Calculate number of Julian centuries since 1900
+    T = ( MJD - MJD_1900 ) / JULIAN_CENTURY;
+
+    psF64 alphaP = 0.0;
+    psF64 deltaP = DEG_TO_RAD(23.0) +
+                   MIN_TO_RAD(27.0) +
+                   SEC_TO_RAD(8.26) -
+                   (SEC_TO_RAD(46.845) * T) -
+                   (SEC_TO_RAD(0.0059) * T * T) +
+                   (SEC_TO_RAD(0.00181) * T * T * T);
+    psF64 phiP = 0.0;
+
+    // Don't neglect the minus sign on deltaP (bug 244):
+    return (psSphereTransformAlloc(alphaP, deltaP, phiP));
+}
+
+
+psSphereTransform* psSphereTransformEclipticToICRS(psTime *time)
+{
+    psF64 T;
+
+    // Check for null parameter
+    PS_PTR_CHECK_NULL(time, NULL);
+
+    // Convert psTime to MJD
+    psF64 MJD = psTimeToMJD(time);
+
+    // Check the specified MJD is greater than 1900
+    if ( MJD < MJD_1900 ) {
+        psError(PS_ERR_BAD_PARAMETER_TYPE,true,PS_ERRORTEXT_psCoord_INVALID_MJD);
+        return NULL;
+    }
+
+    // Calculate number of Julian centuries since 1900
+    T = ( MJD - MJD_1900 ) / JULIAN_CENTURY;
+
+    psF64 alphaP = 0.0;
+    psF64 deltaP = DEG_TO_RAD(23.0) +
+                   MIN_TO_RAD(27.0) +
+                   SEC_TO_RAD(8.26) -
+                   (SEC_TO_RAD(46.845) * T) -
+                   (SEC_TO_RAD(0.0059) * T * T) +
+                   (SEC_TO_RAD(0.00181) * T * T * T);
+    psF64 phiP = 0.0;
+
+    return (psSphereTransformAlloc(alphaP, -deltaP, phiP));
+}
+
+// XXX: This is bug 245: alphaP swaps with phiP from psSphereTransformGalacticToICRS()
+psSphereTransform* psSphereTransformGalacticToICRS(void)
+{
+    psF64 alphaP = DEG_TO_RAD(32.93192);
+    psF64 deltaP = DEG_TO_RAD(-62.87175);
+    psF64 phiP = DEG_TO_RAD(282.85948);
+
+    return (psSphereTransformAlloc(alphaP, deltaP, phiP));
+}
+
+psSphereTransform* psSphereTransformICRSToGalactic(void)
+{
+    psF64 alphaP = DEG_TO_RAD(282.85948);
+    psF64 deltaP = DEG_TO_RAD(62.87175);
+    psF64 phiP = DEG_TO_RAD(32.93192);
+
+    return (psSphereTransformAlloc(alphaP, deltaP, phiP));
+}
+
+void projectionFree(psProjection *p)
+{
+    // There are no dynamically allocated items
+}
+
+psProjection* psProjectionAlloc(
+    psF64 R,
+    psF64 D,
+    psF64 Xs,
+    psF64 Ys,
+    psProjectionType type)
+{
+    psProjection *p = psAlloc(sizeof(psProjection));
+    p->D = D;
+    p->R = R;
+    p->Xs = Xs;
+    p->Ys = Ys;
+    p->type = type;
+
+    psMemSetDeallocator(p, (psFreeFcn) projectionFree);
+    return(p);
+}
+
+psPlane* psProject(const psSphere* coord,
+                   const psProjection* projection)
+{
+    PS_PTR_CHECK_NULL(coord, NULL);
+    PS_PTR_CHECK_NULL(projection, NULL);
+
+    psF64   theta = 0.0;
+    psF64   phi   = 0.0;
+
+    // Allocate return value
+    psPlane* out = psPlaneAlloc();
+
+    // Convert to projection spherical coordinate system
+    theta = asin( sin(coord->d)*sin(projection->D) +
+                  cos(coord->d)*cos(projection->D)*cos(coord->r-projection->R));
+    phi = atan2( -1.0*cos(coord->d)*sin(coord->r-projection->R),
+                 sin(coord->d)*cos(projection->D) - cos(coord->d)*sin(projection->D)*cos(coord->r-projection->R) );
+
+    // Perform the specified projection
+    // Gnomonic projection
+    if (projection->type == PS_PROJ_TAN) {
+        out->x = (cos(theta)*sin(phi))/sin(theta);
+        out->y = (-1.0*cos(theta)*cos(phi))/sin(theta);
+        // Othrographic projection
+    } else if (projection->type == PS_PROJ_SIN) {
+        out->x = cos(theta)*sin(phi);
+        out->y = -1.0*cos(theta)*cos(phi);
+        // Hammer-Aitoff projection
+    } else if ( projection->type == PS_PROJ_AIT) {
+        psF64 zeta = 1.0/sqrt(0.5*(1.0+cos(theta)*cos(phi/2.0)));
+        out->x = 2.0*zeta*cos(theta)*sin(phi/2.0);
+        out->y = zeta*sin(theta);
+        // Parabolic projection
+    } else if ( projection->type == PS_PROJ_PAR) {
+        out->x = phi*(2.0*cos(2.0*theta/3.0) - 1.0);
+        out->y = PS_PI*sin(theta/3.0);
+    } else {
+        psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                PS_ERRORTEXT_psCoord_PROJECTION_TYPE_UNKNOWN,
+                projection->type);
+        psFree(out);
+        return NULL;
+    }
+
+    // Apply plate scales
+    out->x *= projection->Xs;
+    out->y *= projection->Ys;
+
+    // Return output
+    return out;
+}
+
+psSphere* psDeproject(const psPlane* coord,
+                      const psProjection* projection)
+{
+    PS_PTR_CHECK_NULL(coord, NULL);
+    PS_PTR_CHECK_NULL(projection, NULL);
+
+    psF64  theta = 0.0;
+    psF64  phi   = 0.0;
+
+    // Allocate return sphere structure
+    psSphere* out = psSphereAlloc();
+
+    // Remove plate scales
+    psF64  x = coord->x/projection->Xs;
+    psF64  y = coord->y/projection->Ys;
+
+    // Perform inverse projection
+    // Gnonomic deprojection
+    if ( projection->type == PS_PROJ_TAN) {
+        phi = atan(-1.0*x/y);
+        theta = atan(1.0/sqrt(x*x+y*y));
+        // Orhtographic deprojection
+    } else if ( projection->type == PS_PROJ_SIN) {
+        phi = atan((-1.0*x)/y);
+        theta = atan( sqrt(1.0-(x*x+y*y)) / sqrt(x*x+y*y));
+        // Hammer-Aitoff deprojection
+    } else if ( projection->type == PS_PROJ_AIT) {
+        psF64 z = sqrt(1.0 - ((x/4.0)*(x/4.0)) - ((y/2.0)*(y/2.0)));
+        phi = 2.0*atan((z*x) / (2.0*(2.0*z*z-1.0)) );
+        theta = asin(y*z);
+        // Parabolic deprojection
+    } else if ( projection->type == PS_PROJ_PAR) {
+        psF64 rho = y/PS_PI;
+        phi = x/(1.0 - 4.0*rho*rho);
+        theta = 3.0*asin(rho);
+        // Invalid deprojection type
+    } else {
+        psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                PS_ERRORTEXT_psCoord_PROJECTION_TYPE_UNKNOWN,
+                projection->type);
+        psFree(out);
+        return NULL;
+    }
+
+    // Convert from projection spherical coordinates
+    out->d = asin( sin(theta)*sin(projection->D) +
+                   cos(theta)*cos(projection->D)*cos(phi) );
+    out->r = projection->R + atan2( -1.0*cos(theta)*sin(phi),
+                                    sin(theta)*cos(projection->D) -
+                                    cos(theta)*sin(projection->D)*cos(phi) );
+
+    // Return sphere coordinate
+    return out;
+}
+
+/******************************************************************************
+The basic idea is to project both positions onto the linear plane, with
+position1 at the center, then calculate the linear offset between those
+projections.
+ 
+XXX: Do I need to check for unacceptable transformation parameters?  Maybe,
+     if the points are on the North/South Pole, etc?
+ 
+XXX: Do I need to somehow scale this projection?
+ 
+XXX: Does PS_LINEAR mode make sense?  The result must be returned in psSphere
+     regardless of the mode.
+ 
+XXX: How to compound errors?
+ *****************************************************************************/
+psSphere* psSphereGetOffset(const psSphere* position1,
+                            const psSphere* position2,
+                            psSphereOffsetMode mode,
+                            psSphereOffsetUnit unit)
+{
+    PS_PTR_CHECK_NULL(position1, NULL);
+    PS_PTR_CHECK_NULL(position2, NULL);
+
+    // Check positions near 90 degree and issue warnings if necessary
+    if (position1->d >= DEG_TO_RAD(90.0)) {
+        psLogMsg(__func__, PS_LOG_WARN,
+                 "WARNING: psDeproject(): position1->d is larger than 90 degrees.  Returning NULL.");
+        return NULL;
+    }
+    if (position2->d >= DEG_TO_RAD(90.0)) {
+        psLogMsg(__func__, PS_LOG_WARN,
+                 "WARNING: psDeproject(): position2->d is larger than 90 degrees.  Returning NULL.");
+        return NULL;
+    }
+
+    // Allocate return structure
+    psSphere* tmp = psSphereAlloc();
+
+    // Mode is LINEAR - Use first position as projection center and project second point
+    // onto tangent plane, set point projected into psSphere structure x->r y->d
+    if (mode == PS_LINEAR) {
+        psProjection* proj = psProjectionAlloc(position1->r,
+                                               position1->d,
+                                               1.0,
+                                               1.0,
+                                               PS_PROJ_TAN);
+
+        // Perform projection onto tangent plane
+        psPlane* lin = psProject(position2, proj);
+
+        // Set return values
+        tmp->r = lin->x;
+        tmp->d = lin->y;
+
+        // Free data structures allocated
+        psFree(proj);
+        psFree(lin);
+
+        // Mode is SPHERICAL - Get difference between positiion 1 and position 2 and convert
+        // offset value from radians to desired units and return
+    } else if (mode == PS_SPHERICAL) {
+        tmp->r = position2->r - position1->r;
+        tmp->d = position2->d - position1->d;
+
+        // Wrap these to an acceptable range.  This assumes that all
+        // angles are in radians.
+        tmp->r = fmod(tmp->r, 2*PS_PI);
+        tmp->d = fmod(tmp->d, 2*PS_PI);
+        tmp->rErr = 0.0;
+        tmp->dErr = 0.0;
+
+        // Convert to desired units
+        if (unit == PS_ARCSEC) {
+            tmp->r = RAD_TO_SEC(tmp->r);
+            tmp->d = RAD_TO_SEC(tmp->d);
+        } else if (unit == PS_ARCMIN) {
+            tmp->r = RAD_TO_MIN(tmp->r);
+            tmp->d = RAD_TO_MIN(tmp->d);
+        } else if (unit == PS_DEGREE) {
+            tmp->r = RAD_TO_DEG(tmp->r);
+            tmp->d = RAD_TO_DEG(tmp->d);
+        } else if (unit == PS_RADIAN) {}
+        else {
+            psError(PS_ERR_BAD_PARAMETER_VALUE, true,
+                    PS_ERRORTEXT_psCoord_UNITS_UNKNOWN,
+                    unit);
+            psFree(tmp);
+            return NULL;
+        }
+        // Invalid mode
+    } else {
+
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true,
+                PS_ERRORTEXT_psCoord_OFFSET_MODE_UNKNOWN,
+                mode);
+        psFree(tmp);
+        return NULL;
+    }
+
+    // Return value
+    return tmp;
+}
+
+/******************************************************************************
+XXX: Do we need to check for unacceptable transformation parameters?  Maybe,
+     if the points are on the North/South Pole, etc?
+ 
+XXX: Do we need to somehow scale this projection?
+ 
+XXX: I copied the algorithm from the ADD exactly.
+ 
+XXX: Should we compound errors?
+ *****************************************************************************/
+
+psSphere* psSphereSetOffset(const psSphere* position,
+                            const psSphere* offset,
+                            psSphereOffsetMode mode,
+                            psSphereOffsetUnit unit)
+{
+    PS_PTR_CHECK_NULL(position, NULL);
+    PS_PTR_CHECK_NULL(offset, NULL);
+
+    psSphere* tmp;
+    psF64 tmpR = 0.0;
+    psF64 tmpD = 0.0;
+
+    // If mode is linear then set position to projection center
+    // and offset to linear coordinate then deproject to obtain
+    // new sphere coordinate
+    if (mode == PS_LINEAR) {
+
+        // Allocate plane coordinate and set coordinate
+        psPlane*  lin = psPlaneAlloc();
+        lin->x = offset->r;
+        lin->y = offset->d;
+
+        // Allocate and set projection structure
+        psProjection* proj = psProjectionAlloc(position->r,
+                                               position->d,
+                                               1.0,
+                                               1.0,
+                                               PS_PROJ_TAN);
+
+        // Project tangent plane coord to spherical coord
+        tmp = psDeproject(lin, proj);
+
+        // Free data structures used
+        psFree(proj);
+        psFree(lin);
+
+        // If mode is spherical then convert offset to radians, add the offset
+        // to the position and wrap to 0 to 2pi
+    } else if (mode == PS_SPHERICAL) {
+
+        // Convert offset unit to radians
+        if (unit == PS_ARCSEC) {
+            tmpR = SEC_TO_RAD(offset->r);
+            tmpD = SEC_TO_RAD(offset->d);
+        } else if (unit == PS_ARCMIN) {
+            tmpR = MIN_TO_RAD(offset->r);
+            tmpD = MIN_TO_RAD(offset->d);
+        } else if (unit == PS_DEGREE) {
+            tmpR = DEG_TO_RAD(offset->r);
+            tmpD = DEG_TO_RAD(offset->d);
+        } else if (unit == PS_RADIAN) {
+            tmpR = offset->r;
+            tmpD = offset->d;
+        } else {
+            psError(PS_ERR_BAD_PARAMETER_VALUE, true,
+                    PS_ERRORTEXT_psCoord_UNITS_UNKNOWN,
+                    unit);
+            return NULL;
+        }
+
+        // Allocate sphere structure to return
+        tmp = psSphereAlloc();
+
+        // Add offset and wrap to 0 to 2PI if necessary
+        tmp->r = position->r + tmpR;
+        tmp->r = fmod(tmp->r, 2.0*PS_PI);
+        tmp->d = position->d + tmpD;
+        tmp->d = fmod(tmp->d, 2.0*PS_PI);
+        tmp->rErr = 0.0;
+        tmp->dErr = 0.0;
+
+        // Invalid mode report error
+    } else {
+
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true,
+                PS_ERRORTEXT_psCoord_OFFSET_MODE_UNKNOWN,
+                mode);
+        return NULL;
+    }
+
+    return tmp;
+}
+
+
+
+/******************************************************************************
+psSpherePrecess(coords, fromTime, toTime):
+ 
+XXX: Use static memory for tmpST.
+ *****************************************************************************/
+psSphere *psSpherePrecess(psSphere *coords,
+                          const psTime *fromTime,
+                          const psTime *toTime)
+{
+    // Check input for NULL pointers
+    PS_PTR_CHECK_NULL(coords, NULL);
+    PS_PTR_CHECK_NULL(fromTime, NULL);
+    PS_PTR_CHECK_NULL(toTime, NULL);
+
+    // Calculate Julian centuries
+    psF64 fromMJD = psTimeToMJD(fromTime);
+    psF64 toMJD = psTimeToMJD(toTime);
+    psF64 T = (toMJD - fromMJD) / JULIAN_CENTURY;
+
+    // Calculate conversion constants
+    psF64 alphaP = DEG_TO_RAD(90.0) - ((DEG_TO_RAD(0.6406161) * T) +
+                                       (DEG_TO_RAD(0.0000839) * T * T) +
+                                       (DEG_TO_RAD(0.000005) * T * T * T));
+
+    psF64 deltaP = (DEG_TO_RAD(0.5567530) * T) -
+                   (DEG_TO_RAD(0.0001185) * T * T) -
+                   (DEG_TO_RAD(0.0000116) * T * T * T);
+
+    psF64 phiP = DEG_TO_RAD(90.0) + ((DEG_TO_RAD(0.6406161) * T) +
+                                     (DEG_TO_RAD(0.0003041) * T * T) +
+                                     (DEG_TO_RAD(0.0000051) * T * T * T));
+
+    // Create transform with proper constants
+    psSphereTransform *tmpST = psSphereTransformAlloc(alphaP, deltaP, phiP);
+
+    // Apply transform to coordinates
+    psSphere *out = psSphereTransformApply(NULL, tmpST, coords);
+
+    psFree(tmpST);
+
+    return(out);
+}
+
+/*****************************************************************************
+multiplyDPoly2D(trans1, trans2): Takes two 2-D polynomials as input and
+multiplies them.  Basically, for each non-zero coeff in the trans1 coeff[][]
+array, you must multiply by all non-zero coeffs in trans2.
+ 
+XXX: Inefficient in that the out polynomial is allocated every time.
+ *****************************************************************************/
+
+psDPolynomial2D *multiplyDPoly2D(psDPolynomial2D *trans1,
+                                 psDPolynomial2D *trans2)
+{
+    //TRACE: printf("multiplyDPoly2D(%d %d: %d %d)\n", trans1->nX, trans1->nY, trans2->nX, trans2->nY);
+    psS32 orderX = (trans1->nX + trans2->nX) - 1;
+    psS32 orderY = (trans1->nY + trans2->nY) - 1;
+
+    psDPolynomial2D *out = psDPolynomial2DAlloc(orderX, orderY, PS_POLYNOMIAL_ORD);
+    //TRACE: printf("Creating poly (%d, %d)\n", orderX, orderY);
+    for (psS32 i = 0 ; i < out->nX; i++) {
+        for (psS32 j = 0 ; j < out->nY; j++) {
+            out->coeff[i][j] = 0.0;
+            out->mask[i][j] = 0;
+        }
+    }
+
+    for (psS32 t1x = 0 ; t1x < trans1->nX ; t1x++) {
+        for (psS32 t1y = 0 ; t1y < trans1->nY ; t1y++) {
+            if (0.0 != trans1->coeff[t1x][t1y]) {
+                for (psS32 t2x = 0 ; t2x < trans2->nX ; t2x++) {
+                    for (psS32 t2y = 0 ; t2y < trans2->nY ; t2y++) {
+                        /* Possible debug-only macro which checks these coords?
+                        if ((t1x+t2x) >= orderX)
+                            printf("BAD 1\n");
+                        if ((t1y+t2y) >= orderY)
+                            printf("BAD 2\n");
+                        */
+                        out->coeff[t1x+t2x][t1y+t2y]+= (trans1->coeff[t1x][t1y] * trans2->coeff[t2x][t2y]);
+                    }
+                }
+            }
+        }
+    }
+    return(out);
+}
+
+
+/*****************************************************************************
+psPlaneTransformCombine(out, trans1, trans2)
+ 
+XXX: Much room for optimization.  Currently, we call the polyMultiply
+routine far too many times.
+ *****************************************************************************/
+psPlaneTransform *psPlaneTransformCombine(psPlaneTransform *out,
+        const psPlaneTransform *trans1,
+        const psPlaneTransform *trans2)
+{
+    PS_PTR_CHECK_NULL(trans1, NULL);
+    PS_PTR_CHECK_NULL(trans2, NULL);
+    //TRACE: printf("psPlaneTransformCombine(%d, %d, %d, %d: %d, %d, %d, %d)\n", trans1->x->nX, trans1->x->nY, trans1->y->nX, trans1->y->nY, trans2->x->nX, trans2->x->nY, trans2->y->nX, trans2->y->nY);
+    //
+    // Determine the size of the new psPlaneTransform.
+    //
+    // PS_MAX(  Number of x terms in T2->x * number of x terms in T1->x,
+    //          Number of y terms in T2->x * number of x terms in T1->y,
+    psS32 orderXnX = PS_MAX((trans2->x->nX * trans1->x->nX),
+                            (trans2->x->nY * trans1->y->nX));
+    psS32 orderXnY = PS_MAX((trans2->x->nX * trans1->x->nY),
+                            (trans2->x->nY * trans1->y->nY));
+
+    psS32 orderYnX = PS_MAX((trans2->y->nX * trans1->x->nX),
+                            (trans2->y->nY * trans1->y->nX));
+    psS32 orderYnY = PS_MAX((trans2->y->nX * trans1->x->nY),
+                            (trans2->y->nY * trans1->y->nY));
+    psS32 orderX = PS_MAX(orderXnX, orderYnX);
+    psS32 orderY = PS_MAX(orderXnY, orderYnY);
+
+    //
+    // Allocate the new psPlaneTransform, if necessary.
+    //
+    psPlaneTransform *myPT = NULL;
+    if (out == NULL) {
+        myPT = psPlaneTransformAlloc(orderX, orderY);
+    } else {
+        if ((out->x->nX == orderX) && (out->x->nY == orderY) &&
+                (out->y->nX == orderX) && (out->y->nY == orderY)) {
+            myPT = out;
+        } else {
+            psFree(out);
+            myPT = psPlaneTransformAlloc(orderX, orderY);
+        }
+    }
+
+    //
+    // Initialize the new psPlaneTransform, if necessary.
+    //
+    for (psS32 i = 0 ; i < orderX ; i++) {
+        for (psS32 j = 0 ; j < orderY ; j++) {
+            myPT->x->coeff[i][j] = 0.0;
+            myPT->x->mask[i][j] = 0;
+            myPT->y->coeff[i][j] = 0.0;
+            myPT->y->mask[i][j] = 0;
+        }
+    }
+
+    //
+    // For each term (a * x^i * y^j) in trans2, we substitute the appropriate
+    // equation from trans1, and raise it to the appropriate power.  This is
+    // done via the multiplyDPoly2D().  The result is a polynomial (currPoly)
+    // and its coefficients are added into the myPT coeff matrix.
+    //
+    // XXX: This is horribly inefficient in that the trans1 polys are repeatedly
+    // multiplied against themselves.  This can easily be improved.
+    //
+
+    for (psS32 t2x = 0 ; t2x < trans2->x->nX ; t2x++) {
+        for (psS32 t2y = 0 ; t2y < trans2->x->nY ; t2y++) {
+            psDPolynomial2D *currPoly = psDPolynomial2DAlloc(1, 1, PS_POLYNOMIAL_ORD);
+
+            currPoly->coeff[0][0] = 1.0;
+            currPoly->mask[0][0] = 0;
+            psDPolynomial2D *newPoly = NULL;
+
+            if (trans2->x->mask[t2x][t2y] == 0) {
+                // Must raise trans1->y to the t2y-power.
+                for (psS32 c = 0 ; c < t2y; c++) {
+                    newPoly = multiplyDPoly2D(currPoly, trans1->y);
+                    psFree(currPoly);
+                    currPoly = newPoly;
+                }
+
+                // Must raise trans1->x to the t2x-power.
+                for (psS32 c = 0 ; c < t2x; c++) {
+                    newPoly = multiplyDPoly2D(currPoly, trans1->x);
+                    psFree(currPoly);
+                    currPoly = newPoly;
+                }
+
+                // Set the appropriate coeffs in myPT->x
+                for (psS32 i = 0 ; i < currPoly->nX ; i++) {
+                    for (psS32 j = 0 ; j < currPoly->nY ; j++) {
+                        myPT->x->coeff[i][j]+= currPoly->coeff[i][j] * trans2->x->coeff[t2x][t2y];
+                    }
+                }
+            }
+            psFree(currPoly);
+        }
+    }
+
+
+    for (psS32 t2x = 0 ; t2x < trans2->y->nX ; t2x++) {
+        for (psS32 t2y = 0 ; t2y < trans2->y->nY ; t2y++) {
+            psDPolynomial2D *currPoly = psDPolynomial2DAlloc(1, 1, PS_POLYNOMIAL_ORD);
+            currPoly->coeff[0][0] = 1.0;
+            currPoly->mask[0][0] = 0;
+            psDPolynomial2D *newPoly = NULL;
+
+            if (trans2->y->mask[t2x][t2y] == 0) {
+
+                // Must raise trans1->y to the t2y-power.
+                for (psS32 c = 0 ; c < t2y; c++) {
+                    newPoly = multiplyDPoly2D(currPoly, trans1->y);
+                    psFree(currPoly);
+                    currPoly = newPoly;
+                }
+
+                // Must raise trans1->x to the t2x-power.
+                for (psS32 c = 0 ; c < t2x; c++) {
+                    newPoly = multiplyDPoly2D(currPoly, trans1->x);
+                    psFree(currPoly);
+                    currPoly = newPoly;
+                }
+
+                // Set the appropriate coeffs in myPT->x
+                for (psS32 i = 0 ; i < currPoly->nX ; i++) {
+                    for (psS32 j = 0 ; j < currPoly->nY ; j++) {
+                        myPT->y->coeff[i][j]+= currPoly->coeff[i][j] * trans2->y->coeff[t2x][t2y];
+                    }
+                }
+            }
+            psFree(currPoly);
+        }
+    }
+
+    //TRACE: printf("Exiting combine()\n");
+    return(myPT);
+}
+
+/*****************************************************************************
+psPlaneTransformFit(trans, source, dest, nRejIter, sigmaClip)
+ 
+XXX: What about nRejIter?  Iterations?
+XXX: Use static vectors for internal data.
+ *****************************************************************************/
+bool psPlaneTransformFit(psPlaneTransform *trans,
+                         const psArray *source,
+                         const psArray *dest,
+                         int nRejIter,
+                         float sigmaClip)
+{
+    PS_PTR_CHECK_NULL(trans, NULL);
+    PS_PTR_CHECK_NULL(source, NULL);
+    PS_PTR_CHECK_NULL(dest, NULL);
+
+    psS32 numCoords = PS_MIN(source->n, dest->n);
+    psS32 order = PS_MAX(trans->x->nX, trans->x->nY);
+
+    //
+    // Create fake polynomial to use in evaluation
+    //
+    psDPolynomial2D *fakePoly = psDPolynomial2DAlloc(order, order, PS_POLYNOMIAL_ORD);
+    for (int i = 0; i < order; i++) {
+        for (int j = 0; j < order; j++) {
+            fakePoly->coeff[i][j] = 1.0;
+            fakePoly->mask[i][j] = 1;       // Mask all coefficients; unmask to evaluate
+        }
+    }
+
+    //
+    // Initialize the matrix and vectors
+    //
+    psS32 nCoeff = order * (order + 1) / 2; // Number of polynomial coefficients
+    psImage *matrix = psImageAlloc(nCoeff, nCoeff, PS_TYPE_F64); // Matrix for solution
+    psVector *xVector = psVectorAlloc(nCoeff, PS_TYPE_F64); // Vector for solution in x
+    psVector *yVector = psVectorAlloc(nCoeff, PS_TYPE_F64); // Vector for solution in y
+    for (psS32 i = 0; i < nCoeff; i++) {
+        for (psS32 j = 0; j < nCoeff; j++) {
+            matrix->data.F64[i][j] = 0.0;
+        }
+        xVector->data.F64[i] = 0.0;
+        yVector->data.F64[i] = 0.0;
+    }
+
+    //
+    // Iterate over the grid points
+    //
+    for (psS32 g = 0; g < numCoords; g++) {
+        // Iterate over the polynomial coefficients, accumulating the matrix and vectors
+
+        for (psS32 i = 0, ijIndex = 0; i < order; i++) {
+            for (psS32 j = 0; j < order - i; j++, ijIndex++) {
+                fakePoly->mask[i][j] = 0;
+                psF64 xIn = ((psPlane *) source->data[g])->x;
+                psF64 yIn = ((psPlane *) source->data[g])->y;
+                psF64 xOut = ((psPlane *) dest->data[g])->x;
+                psF64 yOut = ((psPlane *) dest->data[g])->y;
+                psF64 ijPoly = psDPolynomial2DEval(fakePoly, xIn, yIn);
+                fakePoly->mask[i][j] = 1;
+
+                for (psS32 m = 0, mnIndex = 0; m < order; m++) {
+                    for (psS32 n = 0; n < order - m; n++, mnIndex++) {
+                        fakePoly->mask[m][n] = 0;
+                        psF64 mnPoly = psDPolynomial2DEval(fakePoly, xIn, yIn);
+                        fakePoly->mask[m][n] = 1;
+
+                        matrix->data.F64[ijIndex][mnIndex] += ijPoly * mnPoly;
+                    }
+                }
+
+                xVector->data.F64[ijIndex] += ijPoly * xOut;
+                yVector->data.F64[ijIndex] += ijPoly * yOut;
+            }
+        }
+    }
+
+    //
+    // Solution via LU Decomposition
+    //
+    psVector *permutation = psVectorAlloc(nCoeff, PS_TYPE_F64); // Permutation vector for LU Decomposition
+    psImage *luMatrix = psMatrixLUD(NULL, &permutation, matrix); // LU decomposed matrix
+    psVector *xSolution = psMatrixLUSolve(NULL, luMatrix, xVector, permutation); // Solution in x
+    psVector *ySolution = psMatrixLUSolve(NULL, luMatrix, yVector, permutation); // Solution in y
+
+    //
+    // XXX: Should check the output of the matrix routines and return false if bad.
+    //
+
+    //
+    // Stuff coefficients into transformation
+    //
+    for (psS32 i = 0, ijIndex = 0; i < order; i++) {
+        for (psS32 j = 0; j < order - i; j++, ijIndex++) {
+            trans->x->coeff[i][j] = xSolution->data.F64[ijIndex];
+            trans->y->coeff[i][j] = ySolution->data.F64[ijIndex];
+        }
+    }
+
+    psFree(fakePoly);
+    psFree(permutation);
+    psFree(luMatrix);
+    psFree(xSolution);
+    psFree(ySolution);
+    psFree(matrix);
+    psFree(xVector);
+    psFree(yVector);
+
+    return(true);
+}
+
+
+/*****************************************************************************
+psPlaneTransformInvert(out, in, region, nSamples)
+ 
+// XXX: Use static data structures.
+ *****************************************************************************/
+psPlaneTransform *psPlaneTransformInvert(psPlaneTransform *out,
+        const psPlaneTransform *in,
+        psRegion *region,
+        int nSamples)
+{
+    PS_PTR_CHECK_NULL(in, NULL);
+    //
+    // If the transform is linear, then invert it exactly and return.
+    //
+    if (p_psIsProjectionLinear((psPlaneTransform *) in)) {
+        return(p_psPlaneTransformLinearInvert((psPlaneTransform *) in));
+    }
+    PS_PTR_CHECK_NULL(region, NULL);
+    PS_INT_COMPARE(1, nSamples, NULL);
+
+    // Ensure that the input transformation is symmetrical.
+    if ((in->x->nX != in->x->nY) ||
+            (in->y->nX != in->y->nY) ||
+            (in->x->nX != in->y->nX)) {
+        psError(PS_ERR_BAD_PARAMETER_TYPE, true, "Input transformation must have same nX==nY.");
+    }
+    psS32 order = PS_MAX(in->x->nX, in->x->nY);
+
+    psPlaneTransform *myPT = NULL;
+    psPlane *inCoord = psPlaneAlloc();
+    psPlane *outCoord = psPlaneAlloc();
+
+    //
+    // Allocate a new psPlaneTransform if "out" is NULL, or has the wrong size.
+    //
+    if (out == NULL) {
+        myPT = psPlaneTransformAlloc(order, order);
+    } else {
+        if ((out->x->nX == order) && (out->x->nY == order) &&
+                (out->y->nX == order) && (out->y->nY == order)) {
+            myPT = out;
+        } else {
+            psFree(out);
+            myPT = psPlaneTransformAlloc(order, order);
+        }
+    }
+
+    //
+    // Copy the input transform to myPT.
+    //
+    for (psS32 i = 0 ; i < in->x->nX ; i++) {
+        for (psS32 j = 0 ; j < in->x->nY ; j++) {
+            myPT->x->coeff[i][j] = in->x->coeff[i][j];
+        }
+    }
+    for (psS32 i = 0 ; i < in->y->nX ; i++) {
+        for (psS32 j = 0 ; j < in->y->nY ; j++) {
+            myPT->y->coeff[i][j] = in->y->coeff[i][j];
+        }
+    }
+
+    //
+    // Create a grid of xin,yin --> xout,yout
+    //
+    psArray *inData = psArrayAlloc(nSamples * nSamples);
+    psArray *outData = psArrayAlloc(nSamples * nSamples);
+    for (psS32 i = 0 ; i < inData->n; i++) {
+        inData->data[i] = (psPtr *) psPlaneAlloc();
+        outData->data[i] = (psPtr *) psPlaneAlloc();
+    }
+
+    //
+    // Initialize the grid.
+    //
+    psS32 cnt = 0;
+    for (int yint = 0; yint < nSamples; yint++) {
+        inCoord->y = region->y0 + ((psF32) yint) * ((region->y1 - region->y0) / ((psF32) nSamples));
+        for (int xint = 0; xint < nSamples; xint++) {
+            inCoord->x = region->x0 + ((psF32) xint) * ((region->x1 - region->x0) / ((psF32) nSamples));
+            (void)psPlaneTransformApply(outCoord, in, inCoord);
+
+            ((psPlane *) outData->data[cnt])->x = inCoord->x;
+            ((psPlane *) outData->data[cnt])->y = inCoord->y;
+            ((psPlane *) inData->data[cnt])->x = outCoord->x;
+            ((psPlane *) inData->data[cnt])->y = outCoord->y;
+
+            cnt++;
+        }
+    }
+    bool rc = psPlaneTransformFit(myPT, inData, outData, 10, 100.0);
+
+    psFree(inCoord);
+    psFree(outCoord);
+    psFree(inData);
+    psFree(outData);
+
+    if (rc == true) {
+        return(myPT);
+    }
+
+    // XXX: Generate an error message, or warning message.
+    return(NULL);
+}
Index: /tags/ipp-1-X/bug123/psLib/src/astro/psCoord.h
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/astro/psCoord.h	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/astro/psCoord.h	(revision 22331)
@@ -0,0 +1,436 @@
+/** @file  psCoord.h
+*
+*  @brief Contains basic coordinate transformation definitions and operations
+*
+*  This file defines the basic types for astronomical coordinate
+*  transformation
+*
+*  @ingroup CoordinateTransform
+*
+*  @author GLG, MHPCC
+*
+*  @version $Revision: 1.30 $ $Name: not supported by cvs2svn $
+*  @date $Date: 2005-03-31 23:01:46 $
+*
+*  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+*/
+
+#ifndef PS_COORD_H
+#define PS_COORD_H
+
+#include "psType.h"
+#include "psImage.h"
+#include "psArray.h"
+#include "psList.h"
+#include "psFunctions.h"
+#include "psTime.h"
+
+/// @addtogroup CoordinateTransform
+/// @{
+
+/** Euclidiean Coordinate System.
+ *
+ *  Both detector and sky positions will be used extensively in the IPP. One
+ *  coordinate system to be used is linear coordinates which conform to
+ *  Euclidean geometry.
+ *
+ */
+typedef struct
+{
+    double x;                   ///< x position
+    double y;                   ///< y position
+    double xErr;                ///< Error in x position
+    double yErr;                ///< Error in y position
+}
+psPlane;
+
+/** Angular Coordinate System
+ *
+ *  Both detector and sky positions will be used extensively in the IPP. One
+ *  coordinate system to be used is angular coordinates for which additional
+ *  care must often be taken in comparison to a euclidiean coordinate system.
+ *
+ */
+typedef struct psSphere
+{
+    double r;                   ///< RA
+    double d;                   ///< Dec
+    double rErr;                ///< Error in RA
+    double dErr;                ///< Error in Dec
+}
+psSphere;
+
+/** 2D Polynomial Transform
+ *
+ *  A transform between coordinate systems that consists simply of two 2D
+ *  polynomials to transform both components - the output coordinates depend
+ *  only on the input coordinates and no other quantities of objects at those
+ *  coordinates.
+ *
+ */
+typedef struct
+{
+    psDPolynomial2D* x;         ///< 2D polynomial transform of X coordinates
+    psDPolynomial2D* y;         ///< 2D polynomial transform of Y coordinates
+}
+psPlaneTransform;
+
+/** 4D Polynomial Transform
+ *
+ *  A transform between coordinate systems that consists of two 4D polynomials
+ *  in which the output coordinates are also specified to be a function of the
+ *  magnitude and color of the object with the given coordinates. This type of
+ *  coordinate transformation is necessary to represent the (color-dependent)
+ *  optical distortions caused by the atmosphere and camera optics, and the
+ *  possibly effects of charge transfer inefficiency.
+ *
+ *  The lowest two terms are the x and y axis of the target system.  The higher
+ *  two terms may represent magnitude and color terms.
+ */
+typedef struct
+{
+    psDPolynomial4D* x;         ///< 4D polynomial transform of X coordinates
+    psDPolynomial4D* y;         ///< 4D polynomial transform of Y coordinates
+}
+psPlaneDistort;
+
+/** Spherical Transform Definition
+ *
+ *  We need to be able to convert between ICRS, Galactic and Ecliptic
+ *  coordinates, and potentially between arbitrary spherical coordinate
+ *  systems. All of these basic spherical transformations represent rotations
+ *  of the spherical coordinate reference. We specify a general
+ *  transformation function which takes a structure, psSphereTransform,
+ *  defining the transformation between two spherical coordinate systems
+ *
+ */
+typedef struct
+{
+    double alphaP;                    ///< Longitude of the target system pole in the source system
+    double cosDeltaP;                 ///< Cosine of target pole latitude in the source system
+    double sinDeltaP;                 ///< Sine of target pole latitude in the source system
+    double phiP;                      ///< Longitude of the ascending node in the target system
+}
+psSphereTransform;
+
+/** Projection type for projection/deprojection
+ *
+ *  @see psProject, psDeproject
+ *
+ */
+typedef enum {
+    PS_PROJ_TAN,                ///< Tangent projection
+    PS_PROJ_SIN,                ///< Sine projection
+    PS_PROJ_AIT,                ///< Aitoff projection
+    PS_PROJ_PAR,                ///< Par projection
+    //    PS_PROJ_GLS,                ///< GLS projection
+    //    PS_PROJ_CAR,                ///< CAR projection
+    //    PS_PROJ_MER,                ///< MER projection
+    PS_PROJ_NTYPE               ///< Number of types; must be last.
+} psProjectionType;
+
+/** Parameter set for projection/deprojection
+ *
+ *  @see psProject, psDeproject
+ *
+ */
+typedef struct
+{
+    double R;                   ///< Coordinates of projection center
+    double D;                   ///< Coordinates of projection center
+    double Xs;                  ///< plate-scale in X direction
+    double Ys;                  ///< plate-scale in Y direction
+    psProjectionType type;      ///< Projection type
+}
+psProjection;
+
+/** Mode for Offset calculation between two sky positions
+ *
+ *  @see  psSphereGetOffset, psSphereSetOffset
+ *
+ */
+typedef enum {
+    PS_SPHERICAL,               ///< offset corresponds to an angular offset
+    PS_LINEAR                   ///< offset corresponds to a linear offset
+} psSphereOffsetMode;
+
+/** The units of the offset
+ *
+ *  @see  psSphereGetOffset, psSphereSetOffset
+ *
+ */
+typedef enum {
+    PS_ARCSEC,                  ///< Arcseconds
+    PS_ARCMIN,                  ///< Arcminutes
+    PS_DEGREE,                  ///< Degrees
+    PS_RADIAN                   ///< Radians
+} psSphereOffsetUnit;
+
+/** Allocates a psPlane
+ *
+ *  @return psPlane*     resulting plane structure.
+ */
+
+psPlane* psPlaneAlloc(void);
+
+/** Allocates a psSphere
+ *
+ *  @return psSphere*     resulting sphere structure.
+ */
+
+psSphere* psSphereAlloc(void);
+
+
+/** Allocates a psPlaneTransform transform.
+ *
+ *  @return psPlaneTransform*     resulting plane transform
+ */
+
+psPlaneTransform* psPlaneTransformAlloc(
+    psS32 n1,  ///< The order of the x term in the transform.
+    psS32 n2   ///< The order of the y term in the transform.
+);
+
+/** Applies the psPlaneTransform transform to a specified coordinate
+ *
+ *  @return psPlane*     resulting coordinate based on transform
+ */
+psPlane* psPlaneTransformApply(
+    psPlane* out,                      ///< a psPlane to recycle.  If NULL, a new one is generated.
+    const psPlaneTransform* transform, ///< the transform to apply
+    const psPlane* coords              ///< the coordinate to apply the transform above.
+);
+
+/** Allocates a psPlaneDistort transform.
+ *
+ *  @return psPlaneDistort*     resulting plane distort transform
+ */
+
+psPlaneDistort* psPlaneDistortAlloc(
+    psS32 n1,  ///< The order of the w term in the transform.
+    psS32 n2,  ///< The order of the x term in the transform.
+    psS32 n3,  ///< The order of the y term in the transform.
+    psS32 n4   ///< The order of the z term in the transform.
+);
+
+
+/** Applies the psPlaneDistort transform to a specified coordinate
+ *
+ *  @return psPlane*     resulting coordinate based on transform
+ */
+psPlane* psPlaneDistortApply(
+    psPlane* out,                      ///< a psPlane to recycle.  If NULL, a new one is generated.
+    const psPlaneDistort* transform,   ///< the transform to apply
+    const psPlane* coords,             ///< the coordinate to apply the transform above.
+    float term3,                       ///< third term -- maybe magnitude
+    float term4                        ///< forth term -- maybe color
+);
+
+/** Allocator for psSphereTransform
+ *
+ *  @return psSphereTransform*         newly allocated struct
+ */
+
+psSphereTransform* psSphereTransformAlloc(
+    double alphaP,                      ///< north pole latitude
+    double deltaP,                      ///< north pole longitude?
+    double phiP                         ///< defines the longitude in the input system of the equatorial intersection between the two systems (e.g, the first point of Ares).
+);
+
+/** Applies the psSphereTransform transform for a specified coordinate
+ *
+ *  @return psSphere*      resulting coordinate based on transform
+ */
+psSphere* psSphereTransformApply(
+    psSphere* out,                     ///< a psSphere to recycle.  If NULL, a new one is generated.
+    const psSphereTransform* transform,///< the transform to apply
+    const psSphere* coord              ///< the coordinate to apply the transform above.x
+);
+
+/** Creates the appropriate transform for converting from ICRS to Ecliptic
+ *  coordinate systems.
+ *
+ *  @return psSphereTransform*     transform for ICRS->Ecliptic coordinate systems
+ */
+psSphereTransform* psSphereTransformICRSToEcliptic(
+    psTime *time                        ///< the time for which the resulting transform will be valid
+);
+
+/** Creates the appropriate transform for converting from Ecliptic to ICRS
+ *  coordinate systems.
+ *
+ *  @return psSphereTransform*     transform for Ecliptic->ICRS coordinate systems
+ */
+psSphereTransform* psSphereTransformEclipticToICRS(
+    psTime *time                        ///< the time for which the resulting transform will be valid
+);
+
+/** Creates the appropriate transform for converting from ICRS to Galactic
+ *  coordinate systems.
+ *
+ */
+psSphereTransform* psSphereTransformICRSToGalactic(void);
+
+/** Creates the appropriate transform for converting from Galactic to ICRS
+ *  coordinate systems.
+ *
+ */
+psSphereTransform* psSphereTransformGalacticToICRS(void);
+
+/** Allocates memory for a psProjection structure
+ *
+ *  @return psProjection*    psProjection structure
+ */
+psProjection* psProjectionAlloc(
+    psF64 R,                   ///< Right-ascension of projection center.
+    psF64 D,                   ///< Declination of projection center.
+    psF64 Xs,                  ///< Scale in x-dimension
+    psF64 Ys,                  ///< Scale in y-dimension
+    psProjectionType type
+);
+
+/** Projects a spherical coordinate to a linear coordinate system
+ *
+ *  @return psPlane*    projected coordinate
+ */
+psPlane* psProject(
+    const psSphere* coord,             ///< coordinate to project
+    const psProjection* projection     ///< parameters of the projection
+);
+
+/** Reverse projection of a linear coordinate to a spherical coordinate system
+ *
+ *  @return psPlane*    projected coordinate
+ */
+psSphere* psDeproject(
+    const psPlane* coord,              ///< coordinate to project
+    const psProjection* projection     ///< parameters of the projection
+);
+
+/** Determines the offset (RA,Dec) on the sky between two positions.
+ *
+ *  Both an offset mode and an offset unit may be defined. The mode may be
+ *  either PS_SPHERICAL, in which case the specified offset corresponds to an
+ *  offset in angles, or it may be PS_LINEAR, in which case the offset
+ *  corresponds to a linear offset in a local projection. The offset unit may
+ *  be in one of PS_ARCSEC, PS_ARCMIN, PS_DEGREE, and PS_RADIAN, which
+ *  specifies the units of the offset only.
+ *
+ *  @return psSphere*    the offset between position1 and position2
+ */
+psSphere* psSphereGetOffset(
+    const psSphere* position1,
+    const psSphere* position2,
+    psSphereOffsetMode mode,
+    psSphereOffsetUnit unit
+);
+
+/** Applies the given offset to a coordinate.
+ *
+ *  Both an offset mode and an offset unit may be defined. The mode may be
+ *  either PS_SPHERICAL, in which case the specified offset corresponds to an
+ *  offset in angles, or it may be PS_LINEAR, in which case the offset
+ *  corresponds to a linear offset in a local projection. The offset unit may
+ *  be in one of PS_ARCSEC, PS_ARCMIN, PS_DEGREE, and PS_RADIAN, which
+ *  specifies the units of the offset only.
+ *
+ *  @return psSphere*    the given position with the given offset applied.
+ */
+psSphere* psSphereSetOffset(
+    const psSphere* position,
+    const psSphere* offset,
+    psSphereOffsetMode mode,
+    psSphereOffsetUnit unit
+);
+
+/** Generates the complete spherical rotation to account for precession
+ *  between two times.  The equinoxes shall be Julian equinoxes.
+ *
+ *  @return psSphere* the resulting spherical rotation
+ */
+psSphere* psSpherePrecess(
+    psSphere *coords,                  ///< coordinates (modified in-place)
+    const psTime *fromTime,            ///< equinox of coords input
+    const psTime *toTime               ///< equinox of coords output
+);
+
+// XXX: Doxygenate.
+psPlaneTransform *p_psPlaneTransformLinearInvert(
+    psPlaneTransform *transform
+);
+
+// XXX: Doxygenate
+psS32 p_psIsProjectionLinear(
+    psPlaneTransform *transform
+);
+
+/** inverts a given transformation.
+ *
+ *  It may assume that the input transformation is one-to-one, and that the
+ *  inverse transformation may be specified through using polynomials of the
+ *  same type and order as the forward transformation. In the event that the
+ *  input transformation is linear, an exact solution may be calculated;
+ *  otherwise nSamples samples in each axis, covering the region specified by
+ *  region shall be used as a grid to fit the best inverse transformation. The
+ *  function shall return NULL if it was unable to generate the inverse
+ *  transformation; otherwise it shall return the inverse transformation. In
+ *  the event that out is NULL, a new psPlaneTransform shall be allocated and
+ *  returned.
+ *
+ *  @return psPlaneTransform*  the resulting inverted transform
+ */
+psPlaneTransform* psPlaneTransformInvert(
+    psPlaneTransform *out,             ///< a transform to recycle, or NULL if one is to be created.
+    const psPlaneTransform *in,        ///< transform to invert
+    psRegion *region,                  ///< region to fit for non-linear transform inversion
+    int nSamples                       ///< number of samples in each axis for fit
+);
+
+/** Creates a single transformation that has the effect of performing trans1
+ *  followed by trans2.
+ *
+ *  psPlaneTransformCombine takes two transformations (trans1 and trans2) and
+ *  returns a single transformation that has the effect of performing trans1
+ *  followed by trans2. In the event that the input transformation is linear,
+ *  an exact solution may be calculated; otherwise nSamples samples in each
+ *  axis, covering the region specified by region shall be used as a grid to
+ *  fit the best inverse transformation. The function shall return NULL if it
+ *  was unable to generate the transformation; otherwise it shall return the
+ *  transformation.
+ *
+ *  @return psPlaneTransform*    resulting transformation
+ */
+psPlaneTransform* psPlaneTransformCombine(
+    psPlaneTransform *out,             ///< a transform to recycle, or NULL if one is to be created.
+    const psPlaneTransform *trans1,    ///< first transform to combine
+    const psPlaneTransform *trans2     ///< first transform to combine
+);
+
+
+/** takes two arrays containing matched coordinates and returns the
+ *  best-fitting transformation.
+ *
+ *  psPlaneTransformFit takes two arrays containing matched coordinates (i.e.,
+ *  coordinates in the source array correspond to the coordinates in the dest
+ *  array) and returns the best-fitting transformation. The source and dest
+ *  will contain psCoords. In the event that the number of coordinates in each
+ *  is not identical, the function shall generate a warning, and extra
+ *  coordinates in the longer of the two shall be ignored. The trans transform
+ *  may not be NULL, since it specifies the desired order, polynomial type and
+ *  any polynomial terms to mask. nRejIter rejection iterations shall be
+ *  performed, wherein coordinates lying more than sigmaClip standard
+ *  deviations from the fit shall be rejected.
+ *
+ *  @return bool        TRUE if successful, otherwise FALSE.
+ */
+bool psPlaneTransformFit(
+    psPlaneTransform *trans,
+    const psArray *source,
+    const psArray *dest,
+    int nRejIter,
+    float sigmaClip
+);
+
+/// @}
+
+#endif
Index: /tags/ipp-1-X/bug123/psLib/src/astro/psTime.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/astro/psTime.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/astro/psTime.c	(revision 22331)
@@ -0,0 +1,1178 @@
+/** @file  psTime.c
+ *
+ *  @brief Definitions for time, time utilities, and conversion functions for use with psLib astronomy
+ *  functions.
+ *
+ *  A collection of functions are required by psLib to manipulate time data. These functions primarily consist
+ *  of conversions between specific time formats.  They use the UNIX timeval time system as the
+ *  base upon which International Atomic Time (TAI) and Universal Time Coordinated (UTC) are calculated.
+ *
+ *  @author Ross Harman, MHPCC
+ *
+ *  @version $Revision: 1.59 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-04-19 02:13:53 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <math.h>
+#include <ctype.h>
+
+#include "psTime.h"
+#include "psError.h"
+#include "psMemory.h"
+#include "psAbort.h"
+#include "psImage.h"
+#include "psCoord.h"
+#include "psString.h"
+#include "psMetadata.h"
+#include "psMetadataIO.h"
+#include "psLookupTable.h"
+#include "psConstants.h"
+#include "psAstronomyErrors.h"
+
+#include "config.h"
+
+#define MAX_STRING_LENGTH 256
+
+/** Sidereal angular conversion from seconds to radians for GMST in seconds (i.e. pi/(180*240)) */
+#define S2R (7.272205216643039903848711535369e-5)
+
+/** Two times pi with double precision accuracy */
+#define TWOPI (2.0*PS_PI)
+
+/** Conversion from radians to degrees */
+#define R2DEG = (180.0/PS_PI)
+
+                /** Maximum length of time string */
+                #define MAX_TIME_STRING_LENGTH 256
+
+                /** Seconds per minute */
+                #define  SEC_PER_MINUTE 60.0
+
+                /** Seconds per hour */
+                #define  SEC_PER_HOUR (60.0*SEC_PER_MINUTE)
+
+                /** Seconds per day */
+                #define  SEC_PER_DAY (24.0*SEC_PER_HOUR)
+
+                /** Seconds per year */
+                #define  SEC_PER_YEAR (365.0*SEC_PER_DAY)
+
+                /** Microseconds per day */
+                #define NSEC_PER_DAY 86400000000000.0
+
+                /** Time metadata read from config file */
+                static psMetadata *timeMetadata = NULL;
+
+/** Static function prototypes */
+static char *cleanString(char *inString, int sLen);
+static char* getToken(char **inString, char *delimiter, psParseErrorType *status);
+psF64 searchTables(psF64 index, psU64 column, psLookupStatusType *status, char *metadataTableNames[], psU32 nTables);
+
+
+/** Removes leading and trailing whitespace and # characters from a string. The cleaned string is a new null
+ *  terminated copy of the original input string. */
+static char *cleanString(char *inString, int sLen)
+{
+    char *ptrB = NULL;
+    char *ptrE = NULL;
+    char *cleaned = NULL;
+
+
+    ptrB = inString;
+
+    /* Skip over leading # or whitespace */
+    while (isspace(*ptrB) || *ptrB=='#') {
+        ptrB++;
+    }
+
+    /* Skip over trailing whitespace, null terminators, and # characters */
+    ptrE = inString + sLen;
+    while(isspace(*ptrE) || *ptrE=='\0' || *ptrE=='#') {
+        ptrE--;
+    }
+
+    // Length, sLen, does not include '\0'
+    sLen = ptrE - ptrB + 1;
+
+    // Adds '\0' to end of string and +1 to sLen
+    cleaned = psStringNCopy(ptrB, sLen);
+
+    return cleaned;
+}
+
+/** Returns cleaned token based on delimiter, but not including delimiter. Also changes the pointer location
+ * the beginning of the string. Tokens are newly allocated null terminated strings. */
+static char* getToken(char **inString, char *delimiter, psParseErrorType *status)
+{
+    char *cleanToken = NULL;
+    int sLen = 0;
+
+
+    // Skip over leading whitespace
+    while(isspace(**inString)) {
+        (*inString)++;
+    }
+
+    // Length of token, not including delimiter
+    sLen = strcspn(*inString, delimiter);
+    if(sLen) {
+
+        // Create new, cleaned, and null terminated token
+        cleanToken = cleanString(*inString, sLen);
+
+        // Move to end of token
+        (*inString) += sLen;
+    } else if(**inString!='\0' && sLen==0) {
+        *status = PS_PARSE_ERROR_GENERAL;
+    }
+
+    return cleanToken;
+}
+
+// get the psTime.config filename by checking environment variable first, then original installation area.
+char* p_psGetConfigFileName()
+{
+    char* filename = getenv("PS_CONFIG_FILE");
+
+    if (filename == NULL) { // environment variable not found
+        filename = PS_CONFIG_FILE_DEFAULT; // this should come from configure.ac
+    }
+
+    return filename;
+}
+
+
+/** Searches time tables in priority order and performs interpolation if input index value is within a table.
+ * If the index value is out of range, the status is set accordingly. */
+psF64 searchTables(psF64 index, psU64 column, psLookupStatusType *status, char *metadataTableNames[], psU32 nTables)
+{
+    psU32 i = 0;
+    char *tableName = NULL;
+    psF64 result = 0.0;
+    psLookupTable *table = NULL;
+    psMetadataItem *tableMetadataItem = NULL;
+
+
+
+    // Check time metadata. Function call reports errors.
+    if(timeMetadata == NULL) {
+        if(!p_psTimeInit(p_psGetConfigFileName()))
+            return 0.0;
+    }
+
+    // Search each table in priority order: ser7, eopc,finals
+    for(i=0; i<nTables; i++) {
+
+        // Get table from metadata
+        tableName = metadataTableNames[i];
+        tableMetadataItem = psMetadataLookup(timeMetadata, tableName);
+        if(tableMetadataItem == NULL) {
+            psError(PS_ERR_BAD_PARAMETER_VALUE, true, PS_ERRORTEXT_psTime_LOOKUP_METADATA_FAILED,
+                    tableName);
+            return 0.0;
+        }
+        table = (psLookupTable*)tableMetadataItem->data.V;
+        PS_PTR_CHECK_NULL(table,0.0);
+
+        // Attempt to interpolate table
+        *status = PS_LOOKUP_SUCCESS;
+        result = psLookupTableInterpolate(table, index, 2, status);
+        if(*status == PS_LOOKUP_SUCCESS) {
+            return result;
+        } else if(*status == PS_LOOKUP_ERROR) {
+            psError(PS_ERR_BAD_PARAMETER_VALUE, true, PS_ERRORTEXT_psTime_INTERPOLATION_FAILED_NAME,
+                    tableName);
+            return 0.0;
+        }
+    }
+
+    return result;
+}
+
+bool p_psTimeInit(const char *fileName)
+{
+    bool foundTable = false;
+    char *tableDir = NULL;
+    char *tableNames = NULL;
+    char *namesPtr = NULL;
+    char *metadataNamesPtr = NULL;
+    char *tableName = NULL;
+    char *fullTableName = NULL;
+    psS32 i = 0;
+    psS32 j = 0;
+    psS32 numTables = 0;
+    psU32 nFail = 0;
+    psVector *tablesFrom = NULL;
+    psVector *tablesTo = NULL;
+    psMetadataItem *metadataItem = NULL;
+    psLookupTable *table = NULL;
+    psParseErrorType status = PS_PARSE_SUCCESS;
+    char metadataTableNames[4][MAX_STRING_LENGTH] = {"ser7", "eopc",  "finals", "tai"};
+
+    // Read time config file
+    timeMetadata = psMetadataParseConfig(timeMetadata, &nFail, fileName, true);
+    if(timeMetadata == NULL) {
+        return false;
+    } else if(nFail != 0) {
+        return false;
+    }
+
+    // Get number of tables
+    metadataItem = psMetadataLookup(timeMetadata, "psLib.time.tables.n");
+    if(metadataItem == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true, PS_ERRORTEXT_psTime_LOOKUP_METADATA_FAILED,
+                "psLib.time.tables.n");
+        return false;
+    }
+    numTables = (psS32)metadataItem->data.S32;
+
+    // Get lower range of tables
+    metadataItem = psMetadataLookup(timeMetadata, "psLib.time.tables.from");
+    if(metadataItem == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true, PS_ERRORTEXT_psTime_LOOKUP_METADATA_FAILED,
+                "psLib.time.tables.from");
+        return false;
+    }
+    tablesFrom = psVectorCopy(tablesFrom, metadataItem->data.V, PS_TYPE_F64);
+    if(tablesFrom->n != numTables) {
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true, PS_ERRORTEXT_psTime_BAD_VECTOR, tablesFrom->n, numTables);
+        psFree(tablesFrom);
+        return false;
+    }
+
+    // Get upper range of tables
+    metadataItem = psMetadataLookup(timeMetadata, "psLib.time.tables.to");
+    if(metadataItem == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true, PS_ERRORTEXT_psTime_LOOKUP_METADATA_FAILED,
+                "psLib.time.tables.to");
+        return false;
+    }
+    tablesTo = psVectorCopy(tablesTo, metadataItem->data.V, PS_TYPE_F64);
+    if(tablesTo->n != numTables) {
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true, PS_ERRORTEXT_psTime_BAD_VECTOR, tablesTo->n, numTables);
+        psFree(tablesFrom);
+        psFree(tablesTo);
+        return false;
+    }
+
+    // Get path to time data files
+    metadataItem = psMetadataLookup(timeMetadata, "psLib.time.tables.dir");
+    if(metadataItem == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true, PS_ERRORTEXT_psTime_LOOKUP_METADATA_FAILED,
+                "psLib.time.tables.dir");
+        psFree(tablesFrom);
+        psFree(tablesTo);
+        return false;
+    }
+    tableDir = psStringCopy(metadataItem->data.V);
+
+    // Table file names
+    metadataItem = psMetadataLookup(timeMetadata, "psLib.time.tables.files");
+    if(metadataItem == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true, PS_ERRORTEXT_psTime_LOOKUP_METADATA_FAILED,
+                "psLib.time.tables.files");
+
+        psFree(tablesFrom);
+        psFree(tablesTo);
+        psFree(tableDir);
+        return false;
+    }
+    tableNames = psStringCopy(metadataItem->data.V);
+
+    // Read time tables
+    namesPtr = tableNames;
+    while((tableName=getToken(&namesPtr, " ", &status)) != NULL) {
+
+        // Form path with table name, adding one to length for last '/' that may not occur in string in cong file
+        fullTableName = (char*)psAlloc(strlen(tableDir)+strlen(tableName)+1+1);
+
+        // Old strings may come back from psAlloc(), so set initial position to EOL
+        fullTableName[0]='\0';
+        strcat(fullTableName, tableDir);
+        strcat(fullTableName, "/");
+        strcat(fullTableName, tableName);
+
+        // Create and read table
+        if(i < numTables) {
+            table = psLookupTableAlloc(fullTableName, tablesFrom->data.F64[i], tablesTo->data.F64[i]);
+            table = psLookupTableRead(table);
+        } else {
+            psError(PS_ERR_BAD_PARAMETER_VALUE, true, PS_ERRORTEXT_psTime_BAD_TABLE_COUNT, i+1, numTables);
+        }
+
+        // Place tables into metadata slightly altered names as keys to create consistent naming conventions
+        foundTable = false;
+        for(j=0; j<numTables; j++) {
+            metadataNamesPtr = strstr(tableName, metadataTableNames[j]);
+            if(metadataNamesPtr != NULL) {
+                psMetadataAdd(timeMetadata, PS_LIST_TAIL, strcat(metadataTableNames[j], "Table"),
+                              PS_META_LOOKUPTABLE, NULL, table);
+                foundTable = true;
+            } else if(foundTable==false && j==numTables-1) {
+                psError(PS_ERR_BAD_PARAMETER_VALUE, true, PS_ERRORTEXT_psTime_BAD_TABLE_COUNT, j, numTables);
+            }
+        }
+
+        psFree(fullTableName);
+        psFree(tableName);
+        psFree(table);
+        i++;
+    }
+
+    if(numTables != i) {
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true, PS_ERRORTEXT_psTime_BAD_TABLE_COUNT, i, numTables);
+    }
+
+    psFree(tableDir);
+    psFree(tableNames);
+    psFree(tablesFrom);
+    psFree(tablesTo);
+
+    return true;
+}
+
+bool p_psTimeFinalize(void)
+{
+    if(timeMetadata != NULL) {
+        psFree(timeMetadata);
+        timeMetadata = NULL;
+    }
+
+    return true;
+}
+
+psTime* psTimeAlloc(psTimeType type)
+{
+    psTime *outTime = NULL;
+
+
+    // Error checks
+    if(type!=PS_TIME_TAI && type!=PS_TIME_UTC) {
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true,
+                PS_ERRORTEXT_psTime_TYPE_UNKNOWN,
+                type);
+        return NULL;
+    }
+
+    outTime = (psTime*)psAlloc(sizeof(psTime));
+
+    outTime->sec = 0;
+    outTime->nsec = 0;
+    outTime->type = type;
+    outTime->leapsecond = false;
+
+    return outTime;
+}
+
+psTime* psTimeGetNow(psTimeType type)
+{
+    struct timeval now;
+    psTime *time = NULL;
+
+
+    // Allocate psTime struct
+    time = psTimeAlloc(type);
+
+    if (gettimeofday(&now, (struct timezone *)0) == -1) {
+        psError(PS_ERR_OS_CALL_FAILED, true,
+                PS_ERRORTEXT_psTime_GET_TOD_FAILED);
+        return NULL;
+    }
+
+    // Convert timeval time to psTime
+    time->sec = now.tv_sec;
+    time->nsec = now.tv_usec*1000;
+
+    // Add most leapseconds to UTC time to get TAI time if necessary
+    if(type == PS_TIME_TAI) {
+        time->sec += psTimeGetTAIDelta(time);
+    }
+
+    return time;
+}
+
+psTime* psTimeConvert(psTime *time, psTimeType type)
+{
+    double delta = 0.0;
+
+
+    // Error checks
+    PS_PTR_CHECK_NULL(time,NULL);
+    PS_INT_CHECK_RANGE(time->nsec,0,1e9-1,NULL);
+
+    if (time->type == type) { // time already right type.  That was easy!
+        return time;
+    }
+
+    delta = psTimeGetTAIDelta(time);
+
+    if (type == PS_TIME_UTC) {
+        time->sec = time->sec - delta;    // User wants UTC time. Subtract leapseconds.
+    } else if(type == PS_TIME_TAI) {
+        time->sec = time->sec + delta;    // User wants TAI time. Add leapseconds.
+    } else {
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true, PS_ERRORTEXT_psTime_TYPE_UNKNOWN, type);
+    }
+
+    return time;
+}
+
+double psTimeToLMST(psTime *time, double longitude)
+{
+    psF64  jdTdtDays    =  0.0;
+    psF64  jdUt1Days    =  0.0;
+    psF64  mjdUt1Days   =  0.0;
+    psF64  lmstRad      =  0.0;
+    psF64  fracDays     =  0.0;
+    psF64  gmstRad      =  0.0;
+    psF64  t            =  0.0;
+    psF64  tu           =  0.0;
+    psF64  ut1UtcDbl    =  0.0;
+    psF64  const1       =  24110.5493771;
+    psF64  const2       =  8639877.3173760;
+    psF64  const3       =  307.4771600;
+    psF64  const4       =  0.0931118;
+    psF64  const5       = -0.0000062;
+    psF64  const6       =  0.0000013;
+    psTime *ut1UtcDelta = NULL;
+    psTime *tdtTime     = NULL;
+    psTime *taiTime     = NULL;
+    psTime *utcTime     = NULL;
+    psTime *ut1Time     = NULL;
+
+
+    // Error checks
+    PS_PTR_CHECK_NULL(time,NAN);
+    PS_INT_CHECK_RANGE(time->nsec,0,1e9-1,NAN);
+
+    // Calculate TAI or UTC time based on type of time user passes
+    if(time->type == PS_TIME_TAI) {
+        taiTime = psMemIncrRefCounter(time);
+        utcTime = psTimeAlloc(PS_TIME_UTC);
+        utcTime->sec = taiTime->sec - psTimeGetTAIDelta(time);
+        utcTime->nsec = taiTime->nsec;
+    } else if(time->type == PS_TIME_UTC) {
+        utcTime = psMemIncrRefCounter(time);
+        taiTime = psTimeAlloc(PS_TIME_TAI);
+        taiTime->sec = utcTime->sec + psTimeGetTAIDelta(time);
+        taiTime->nsec = utcTime->nsec;
+    }
+
+    // Convert Universal Time (UTC) to  UT1
+    ut1UtcDbl = psTimeGetUT1Delta(taiTime);
+    utcTime->type = PS_TIME_TAI; // Don't allow addition of leapseconds to ut1Time
+    ut1Time = psTimeMath(utcTime, ut1UtcDbl);
+    utcTime->type = PS_TIME_UTC;
+
+
+    // Calculate UT1 as Julian Centuries since J2000.0
+    jdUt1Days = psTimeToJD(ut1Time);
+    mjdUt1Days = psTimeToMJD(ut1Time);
+    t = (jdUt1Days - 2451545.0)/36525.0;
+
+    // Calculate Terrestial Dynamical Time (TDT)
+    tdtTime = psTimeMath(taiTime, 32.184);
+
+    // Calculate TDT as Julian centuries since J2000.0
+    jdTdtDays = psTimeToJD(tdtTime);
+    tu = (jdTdtDays - 2451545.0)/36525.0;
+
+    // Calculate fractional part of MJD
+    fracDays = fmod(mjdUt1Days, 1.0);
+
+    // Calculate Greenwich Mean Sidereal Time (GMST) in radians. Equation set up to minimize multiplications.
+    gmstRad = fracDays*TWOPI+(const1+const2*tu+t*(const3+t*(const4+t*(const5+const6*t))))*S2R;
+
+    // Place GMST between 0 and 2*pi
+    gmstRad = fmod(gmstRad, TWOPI);
+
+    // Calculate Local Mean Sidereal Time (LMST) in radians
+    lmstRad = gmstRad + longitude;
+
+    // Free temporary structs
+    psFree(ut1UtcDelta);
+    psFree(ut1Time);
+    psFree(tdtTime);
+    psFree(utcTime);
+    psFree(taiTime);
+
+    return lmstRad;
+}
+
+double psTimeGetUT1Delta(const psTime *time)
+{
+    psU32 nTables = 3;
+    psF64 mjd = 0.0;
+    psF64 result = 0.0;
+    psF64 dut2ut1 = 0.0;
+    psF64 t = 0.0;
+    psVector *dut = NULL;
+    psMetadataItem *tableMetadataItem = NULL;
+    psLookupStatusType status = PS_LOOKUP_SUCCESS;
+    char *metadataTableNames[3] = {"ser7Table", "eopcTable",  "finalsTable"};
+
+
+    // Error checks
+    PS_PTR_CHECK_NULL(time,NAN);
+    PS_INT_CHECK_RANGE(time->nsec,0,1e9-1,NAN);
+
+    if(time->type != PS_TIME_TAI) {
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true, PS_ERRORTEXT_psTime_TYPE_INCORRECT, time->type);
+        return 0.0;
+    }
+
+    // Attempt to find value through table lookup and interpolation
+    mjd = psTimeToMJD(time);
+    result = searchTables(mjd, 0, &status, metadataTableNames, nTables);
+
+    // Value could not be found through table lookup and interpolation
+    if(status == PS_LOOKUP_PAST_TOP) {
+
+        // Date too early for tables. Get default time delta value from metadata, and issue warning.
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true, PS_ERRORTEXT_psTime_TIME_PREDATES_TABLES, mjd, "UT1-UTC");
+
+        tableMetadataItem = psMetadataLookup(timeMetadata, "psLib.time.before.dut");
+        if(tableMetadataItem == NULL) {
+            psError(PS_ERR_BAD_PARAMETER_VALUE, true, PS_ERRORTEXT_psTime_LOOKUP_METADATA_FAILED, "psLib.time.before.dut");
+            return 0.0;
+        }
+        result = tableMetadataItem->data.F64;
+
+    } else if(status == PS_LOOKUP_PAST_BOTTOM) {
+        /* Date too late for tables. Issue warning and use following formulae for predicting
+           ahead of the most recent available table entry.
+             ut1-utc = [0] + [1]*(MJD - [2]) - (ut2-ut1)
+             [0, 1, 2] = @psLib.time.predict.dut
+             ut2-ut1 = 0.022 sin(2*pi*t) - 0.012 cos(2*pi*t) - 0.006 sin(4*pi*t) + 0.007 cos(4*pi*t)
+             t = 2000.0 + (MJD - 51544.03)/365.2422
+        */
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true, PS_ERRORTEXT_psTime_TIME_POSTDATES_TABLES, mjd, "UT1-UTC");
+
+        tableMetadataItem = psMetadataLookup(timeMetadata, "psLib.time.predict.dut");
+        if(tableMetadataItem == NULL) {
+            psError(PS_ERR_BAD_PARAMETER_VALUE, true, PS_ERRORTEXT_psTime_LOOKUP_METADATA_FAILED, "psLib.time.predict.dut");
+            return 0.0;
+        }
+        dut = (psVector*)tableMetadataItem->data.V;
+        PS_PTR_CHECK_NULL(dut,0.0);
+
+        t = 2000.0 + (mjd - 51544.03)/365.2422;
+        dut2ut1 = 0.022*sin(TWOPI*t) - 0.012*cos(TWOPI*t) - 0.006*sin(4.0*PS_PI*t) + 0.007*cos(4.0*PS_PI*t);
+        result = dut->data.F64[0] + dut->data.F64[1]*(mjd - dut->data.F64[2]) - dut2ut1;
+
+    } else if(status != PS_LOOKUP_SUCCESS) {
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true, PS_ERRORTEXT_psTime_INTERPOLATION_FAILED);
+        return 0.0;
+    }
+
+    return result;
+}
+
+struct psSphere* psTimeGetPoleCoords(const psTime* time)
+{
+    psU32 nTables = 3;
+    psF64 x = 0.0;
+    psF64 y = 0.0;
+    psF64 mjd = 0.0;
+    psF64 a = 0.0;
+    psF64 c = 0.0;
+    psF64 mjdPred = 0.0;
+    struct psSphere* output = NULL;
+    psLookupStatusType xStatus = PS_LOOKUP_SUCCESS;
+    psLookupStatusType yStatus = PS_LOOKUP_SUCCESS;
+    psMetadataItem *tableMetadataItem = NULL;
+    char *metadataTableNames[3] = {"ser7Table", "eopcTable",  "finalsTable"};
+    psVector *xp = NULL;
+    psVector *yp = NULL;
+
+    // Error checks
+    PS_PTR_CHECK_NULL(time,NULL);
+    PS_INT_CHECK_RANGE(time->nsec,0,1e9-1,NULL);
+
+    if(time->type != PS_TIME_TAI)
+    {
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true, PS_ERRORTEXT_psTime_TYPE_INCORRECT, time->type);
+        return NULL;
+    }
+
+    // Attempt to find value through table lookup and interpolation
+    mjd = psTimeToMJD(time);
+    x = searchTables(mjd, 0, &xStatus, metadataTableNames, nTables);
+    y = searchTables(mjd, 0, &yStatus, metadataTableNames, nTables);
+
+    // Value could not be found through table lookup and interpolation
+    if(xStatus==PS_LOOKUP_PAST_TOP && yStatus==PS_LOOKUP_PAST_TOP)
+    {
+
+        // Date too earlier for tables. Get default polar coodinate values from metadata, and issue warning.
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true, PS_ERRORTEXT_psTime_TIME_PREDATES_TABLES, mjd, "polar motion");
+
+        tableMetadataItem = psMetadataLookup(timeMetadata, "psLib.time.before.xp");
+        if(tableMetadataItem == NULL) {
+            psError(PS_ERR_BAD_PARAMETER_VALUE, true, PS_ERRORTEXT_psTime_LOOKUP_METADATA_FAILED, "psLib.time.before.xp");
+            return NULL;
+        }
+        x = tableMetadataItem->data.F64;
+
+        tableMetadataItem = psMetadataLookup(timeMetadata, "psLib.time.before.yp");
+        if(tableMetadataItem == NULL) {
+            psError(PS_ERR_BAD_PARAMETER_VALUE, true, PS_ERRORTEXT_psTime_LOOKUP_METADATA_FAILED, "psLib.time.before.yp");
+            return NULL;
+        }
+        y = tableMetadataItem->data.F64;
+
+    } else if(xStatus==PS_LOOKUP_PAST_BOTTOM && yStatus==PS_LOOKUP_PAST_BOTTOM)
+    {
+
+        /* Date too late for tables. Issue warning and use following formulae for predicting
+           ahead of the most recent available table entry.
+              x = [0] + [1]*cos a + [2]*sin a + [3]*cos c + [4]*sin c
+              [0], [1], [2], [3] = @psLib.time.predict.xp
+              y = [0] + [1]*cos a + [2]*sin a + [3]*cos c + [4]*sin c
+              [0], [1], [2], [3] = @psLib.time.predict.yp
+              a = 2*pi*(mjd - pslib.time.predict.mjd)/365.25
+              c = 2*pi*(mjd - pslib.time.predict.mjd)/435.0
+        */
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true, PS_ERRORTEXT_psTime_TIME_POSTDATES_TABLES, mjd, "polar motion");
+
+
+        // Get predicted MJD
+        tableMetadataItem = psMetadataLookup(timeMetadata, "psLib.time.predict.mjd");
+        if(tableMetadataItem == NULL) {
+            psError(PS_ERR_BAD_PARAMETER_VALUE, true, PS_ERRORTEXT_psTime_LOOKUP_METADATA_FAILED,
+                    "psLib.time.predict.mjd");
+            return NULL;
+        }
+        mjdPred = tableMetadataItem->data.F64;
+
+        // Get xp
+        tableMetadataItem = psMetadataLookup(timeMetadata, "psLib.time.predict.xp");
+        if(tableMetadataItem == NULL) {
+            psError(PS_ERR_BAD_PARAMETER_VALUE, true, PS_ERRORTEXT_psTime_LOOKUP_METADATA_FAILED, "psLib.time.predict.xp");
+            return NULL;
+        }
+        xp = (psVector*)tableMetadataItem->data.V;
+        PS_PTR_CHECK_NULL(xp,NULL);
+
+        // Get yp
+        tableMetadataItem = psMetadataLookup(timeMetadata, "psLib.time.predict.yp");
+        if(tableMetadataItem == NULL) {
+            psError(PS_ERR_BAD_PARAMETER_VALUE, true, PS_ERRORTEXT_psTime_LOOKUP_METADATA_FAILED, "psLib.time.predict.yp");
+            return NULL;
+        }
+        yp = (psVector*)tableMetadataItem->data.V;
+        PS_PTR_CHECK_NULL(yp,NULL);
+
+        // Calculate "a" and "c" constants
+        a = TWOPI*(mjd - mjdPred)/365.25;
+        c = TWOPI*(mjd - mjdPred)/435.0;
+
+        // Calculate x and y polar coordinates
+        x = xp->data.F64[0] +
+            xp->data.F64[1]*cos(a) +
+            xp->data.F64[2]*sin(a) +
+            xp->data.F64[3]*cos(c) +
+            xp->data.F64[4]*sin(c);
+
+        y = yp->data.F64[0] +
+            yp->data.F64[1]*cos(a) +
+            yp->data.F64[2]*sin(a) +
+            yp->data.F64[3]*cos(c) +
+            yp->data.F64[4]*sin(c);
+
+    } else if(xStatus!=PS_LOOKUP_SUCCESS || yStatus!=PS_LOOKUP_SUCCESS)
+    {
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true, PS_ERRORTEXT_psTime_INTERPOLATION_FAILED);
+        return NULL;
+    }
+
+    // Create output sphere and convert arcsec to radians (i.e. x/60/60*PS_PI/180)
+    output = psAlloc(sizeof(psSphere));
+    output->r = x * PS_PI / 648000.0;
+    output->d = y * PS_PI / 648000.0;
+
+    return output;
+}
+
+double psTimeGetTAIDelta(const psTime *time)
+{
+    psU64 i = 0;
+    psF64 jd = 0.0;
+    psF64 mjd = 0.0;
+    psF64 out = 0.0;
+    psF64 const1 = 0.0;
+    psF64 const2 = 0.0;
+    psF64 const3 = 0.0;
+    psLookupTable* table = NULL;
+    psMetadataItem *tableMetadataItem = NULL;
+    psVector *stats = NULL;
+    psVector *results = NULL;
+
+    // Error checks
+    PS_PTR_CHECK_NULL(time,NAN);
+    PS_INT_CHECK_RANGE(time->nsec,0,1e9-1,NAN);
+
+    // Check time metadata
+    if(timeMetadata == NULL) {
+        if(!p_psTimeInit(p_psGetConfigFileName())) {
+            psError(PS_ERR_BAD_PARAMETER_VALUE, true, PS_ERRORTEXT_psTime_FILE_NOT_FOUND, "psTime.config");
+            return 0.0;
+        }
+    }
+
+    // Get table from metadata
+    tableMetadataItem = psMetadataLookup(timeMetadata, "taiTable");
+    if(tableMetadataItem == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true, PS_ERRORTEXT_psTime_LOOKUP_METADATA_FAILED, "taiTable");
+        return 0.0;
+    }
+    table = (psLookupTable*)tableMetadataItem->data.V;
+    PS_PTR_CHECK_NULL(table,0);
+
+    // Determine Julian and modified Julian dates used in table lookup and time delta calculation
+    jd = psTimeToJD(time);
+    mjd = psTimeToMJD(time);
+
+    stats = psVectorAlloc(table->numCols, PS_TYPE_U32);
+    results = psLookupTableInterpolateAll(table, jd, stats);
+
+    // Check for successful interpolation
+    for(i=0; i<stats->n; i++) {
+        if(stats->data.U32[i] == PS_LOOKUP_ERROR) {
+            psError(PS_ERR_BAD_PARAMETER_VALUE, true, PS_ERRORTEXT_psTime_INTERPOLATION_FAILED);
+        }
+    }
+
+    const1 = results->data.F64[0];
+    const2 = results->data.F64[1];
+    const3 = results->data.F64[2];
+    out = const1 + (mjd - const2) * const3;
+
+    psFree(stats);
+    psFree(results);
+
+    return out;
+}
+
+
+psS64 psTimeLeapSecondDelta(const psTime *time1, const psTime *time2)
+{
+    psS64 diff = 0;
+
+
+    // Error checks
+    PS_PTR_CHECK_NULL(time1,0);
+    PS_PTR_CHECK_NULL(time2,0);
+    PS_INT_CHECK_RANGE(time1->nsec,0,1e9-1,0);
+    PS_INT_CHECK_RANGE(time2->nsec,0,1e9-1,0);
+    diff = abs((psS64)psTimeGetTAIDelta((psTime*)time1)-(psS64)psTimeGetTAIDelta((psTime*)time2));
+
+    return diff;
+}
+
+double psTimeToJD(const psTime *time)
+{
+    double jd = 0.0;
+
+    // Error checks
+    PS_PTR_CHECK_NULL(time,NAN);
+    PS_INT_CHECK_RANGE(time->nsec,0,1e9-1,NAN);
+
+    // Julian date conversion
+    if(time->sec < 0) {
+        jd = time->sec / SEC_PER_DAY - time->nsec / NSEC_PER_DAY + 2440587.5; // psTime earlier than epoch
+    } else {
+        jd = time->sec / SEC_PER_DAY + time->nsec / NSEC_PER_DAY + 2440587.5; // psTime greater than epoch
+    }
+
+    return jd;
+}
+
+double psTimeToMJD(const psTime *time)
+{
+    double mjd = 0.0;
+
+
+    // Error checks
+    PS_PTR_CHECK_NULL(time,NAN);
+    PS_INT_CHECK_RANGE(time->nsec,0,1e9-1,NAN);
+
+    // Modified Julian date conversion
+    if(time->sec < 0) {
+        mjd = time->sec / SEC_PER_DAY - time->nsec / NSEC_PER_DAY + 40587.0; // psTime earlier than epoch
+    } else {
+        mjd = time->sec / SEC_PER_DAY + time->nsec / NSEC_PER_DAY + 40587.0; // psTime greater than epoch
+    }
+
+    return mjd;
+}
+
+char* psTimeToISO(const psTime *time)
+{
+    psS32 ms = 0;
+    char *timeString = NULL;
+    char *tempString = NULL;
+    struct tm *tmTime = NULL;
+    time_t sec;
+
+
+    // Error checks
+    PS_PTR_CHECK_NULL(time,NULL);
+    PS_INT_CHECK_RANGE(time->nsec,0,1e9-1,NULL);
+
+    tempString = psAlloc(MAX_TIME_STRING_LENGTH);
+    timeString = psAlloc(MAX_TIME_STRING_LENGTH);
+
+    ms = time->nsec / 1000000;
+    sec = time->sec;
+
+    // tmTime variable is statically allocated, no need to free
+    tmTime = gmtime(&sec);
+
+    // Converts psTime to YYYY-MM-DDThh:mm:ss.sss in string form
+    if (!strftime(tempString, MAX_TIME_STRING_LENGTH, "%Y-%m-%dT%H:%M:%S", tmTime)) {
+        psError(PS_ERR_OS_CALL_FAILED, true, PS_ERRORTEXT_psTime_CONVERT_TIME_TO_STRING_FAILED);
+    }
+
+    if (snprintf(timeString, MAX_TIME_STRING_LENGTH, "%s.%3.3dZ", tempString, ms) < 0) {
+        psError(PS_ERR_OS_CALL_FAILED, true, PS_ERRORTEXT_psTime_APPEND_MSEC_FAILED);
+    }
+    psFree(tempString);
+
+    return timeString;
+}
+
+struct timeval psTimeToTimeval(const psTime *time)
+{
+    struct timeval timevalTime;
+
+    timevalTime.tv_sec = 0;
+    timevalTime.tv_usec = 0;
+
+    // Error checks
+    PS_PTR_CHECK_NULL(time,timevalTime);
+    PS_INT_CHECK_RANGE(time->nsec,0,1e9-1,timevalTime);
+
+    timevalTime.tv_sec = time->sec;
+    timevalTime.tv_usec = time->nsec / 1000;
+
+    return timevalTime;
+}
+
+struct tm* psTimeToTM(const psTime *time)
+{
+    psS64 cent = 0;
+    psS64 year = 0;
+    psS64 month = 0;
+    psS64 day = 0;
+    psS64 hour = 0;
+    psS64 minute = 0;
+    psS64 seconds = 0;
+    psS64 temp = 0;
+    struct tm* tmTime = NULL;
+
+
+    // Error checks
+    PS_PTR_CHECK_NULL(time,NULL);
+    PS_INT_CHECK_RANGE(time->nsec,0,1e9-1,NULL);
+
+    seconds = time->sec%60;
+    minute = time->sec/60%60;
+    hour = time->sec/3600%24;
+    day = (time->sec+62135596800)/86400;
+
+    // Add 306 days to make relative to Mar 1, 0; also adjust day to be within a range (1..2**28-1) where our
+    // calculations will work with 32bit ints
+    if(day > (pow(2, 28)-307))
+    {
+        temp = (day - 146097+306)/146097+1;         // Avoid overflow if day close to maxint
+        day -= temp * 146097-306;
+    } else if((day += 306) <= 0)
+    {
+        temp = -( -day / 146097 + 1);               // Avoid ambiguity in C division of negatives
+        day -= temp * 146097;
+    }
+
+    cent = (day*4-1)/146097;                        // Calc number of centuries day is after 29 Feb of yr 0
+    day -= cent*146097/4;                           // 4 centuries = 146097 days
+    year = (day*4-1)/1461;                          // Calc number of years into the century
+    day -= year*1461/4;                             // Again March-based (4 yrs =\u02dc 146[01] days)
+    month = (day*12+1093)/367;                      // Get the month (3..14 represent March through
+    day -= (month*367-1094)/12;                     // February of following year)
+    year += cent*100+temp*400;                      // Get the real year, which is off by
+
+    // One if month is January or February
+    if(month > 12)
+    {
+        year++;
+        month -= 12;
+    }
+
+    // Allocate output
+    tmTime = (struct tm*)psAlloc(sizeof(struct tm));
+
+    tmTime->tm_year = year - 1900;
+    tmTime->tm_mon = month - 1;
+    tmTime->tm_mday = day + 1;
+    tmTime->tm_hour = hour;
+    tmTime->tm_min = minute;
+    tmTime->tm_sec = seconds;
+    tmTime->tm_isdst = -1;
+
+    return tmTime;
+}
+
+psTime* psTimeFromJD(double time)
+{
+    double days = 0.0;
+    double seconds = 0.0;
+    psTime *outTime = NULL;
+
+
+    // Allocate psTime struct
+    outTime = psTimeAlloc(PS_TIME_TAI);
+
+    // Julian date conversion courtesy of Eugene Magnier
+    days = time - 2440587.5;
+    seconds = days * SEC_PER_DAY;
+    if(seconds < 0.0) {
+        outTime->nsec = (seconds - (psS64)seconds) * -1000000000.0;  // psTime earlier than epoch
+    } else {
+        outTime->nsec = (seconds - (psS64)seconds) * 1000000000.0;   // psTime greater than epoch
+    }
+    outTime->sec = seconds;
+
+    // Error check
+    PS_INT_CHECK_RANGE(outTime->nsec,0,1e9-1,outTime);
+
+    return outTime;
+}
+
+psTime* psTimeFromMJD(double time)
+{
+    double days = 0.0;
+    double seconds = 0.0;
+    psTime *outTime = NULL;
+
+
+    // Allocate psTime struct
+    outTime = psTimeAlloc(PS_TIME_TAI);
+
+    // Modified Julian date conversion courtesy of Eugene Magnier
+    days = time - 40587.0;
+    seconds = days * SEC_PER_DAY;
+    if(seconds < 0.0) {
+        outTime->nsec = (seconds - (psS64)seconds) * -1000000000.0;  // psTime earlier than epoch
+    } else {
+        outTime->nsec = (seconds - (psS64)seconds) * 1000000000.0;   // psTime greater than epoch
+    }
+    outTime->sec = seconds;
+
+    // Error check
+    PS_INT_CHECK_RANGE(outTime->nsec,0,1e9-1,outTime);
+
+    return outTime;
+}
+
+psTime* psTimeFromISO(const char *time)
+{
+    psS32 millisecond;
+    struct tm tmTime;
+    psTime *outTime = NULL;
+
+    // Convert YYYY-MM-DDThh:mm:ss.sss in string form to tm time
+    if (sscanf(time, "%d-%d-%dT%d:%d:%d.%d", &tmTime.tm_year, &tmTime.tm_mon, &tmTime.tm_mday,
+               &tmTime.tm_hour, &tmTime.tm_min, &tmTime.tm_sec,&millisecond) < 7) {
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true, PS_ERRORTEXT_psTime_ISOTIME_MALFORMED, time);
+        return NULL;
+    }
+
+    PS_INT_CHECK_NON_NEGATIVE(tmTime.tm_year, outTime);
+    PS_INT_CHECK_RANGE(tmTime.tm_mon,1,12,outTime);
+    PS_INT_CHECK_RANGE(tmTime.tm_mday,1,31,outTime);
+    PS_INT_CHECK_RANGE(tmTime.tm_hour,0,23,outTime);
+    PS_INT_CHECK_RANGE(tmTime.tm_min,0,59,outTime);
+    PS_INT_CHECK_RANGE(tmTime.tm_sec,0,59,outTime);
+    PS_INT_CHECK_RANGE(millisecond,0,999,outTime);
+
+    tmTime.tm_year -= 1900;
+    tmTime.tm_mon--;
+    tmTime.tm_isdst = -1;
+
+    // Convert tm time to psTime
+    outTime = psTimeFromTM(&tmTime);
+    outTime->nsec = millisecond * 1000000;
+
+    return outTime;
+}
+
+psTime* psTimeFromTimeval(const struct timeval *time)
+{
+    psTime *outTime = NULL;
+
+
+    // Error check
+    PS_PTR_CHECK_NULL(time,NULL);
+
+    // Allocate psTime struct
+    outTime = psTimeAlloc(PS_TIME_TAI);
+
+    // Convert to psTime
+    outTime->sec = time->tv_sec;
+    outTime->nsec = time->tv_usec * 1000;
+
+    // Error check
+    PS_INT_CHECK_RANGE(outTime->nsec,0,1e9-1,outTime);
+
+    return outTime;
+}
+
+psTime* psTimeFromTM(const struct tm* time)
+{
+    psS64 year;
+    psS64 month;
+    psS64 day;
+    psS64 hour;
+    psS64 minute;
+    psS64 seconds;
+    psS64 temp;
+    psTime *outTime = NULL;
+
+
+    // Error check
+    PS_PTR_CHECK_NULL(time,NULL);
+
+    // Allocate psTime struct
+    outTime = psTimeAlloc(PS_TIME_TAI);
+
+    // Extract data from TM struct
+    year = time->tm_year + 1900;
+    month = time->tm_mon + 1;
+    day = time->tm_mday;
+    hour = time->tm_hour;
+    minute = time->tm_min;
+    seconds = time->tm_sec;
+
+    // Make month in range 3..14 (treat Jan & Feb as months 13..14 of prev year)
+    if( month <= 2 )
+    {
+        year -= (temp = (14 - month) / 12);
+        month += 12 * temp;
+    } else if(month > 14)
+    {
+        year += (temp = (month - 3) / 12);
+        month -= 12 * temp;
+    }
+
+    // Make year positive
+    if (year < 0 )
+    {
+        day -= 146097 * (temp = (399 - year) / 400);
+        year += 400 * temp;
+    }
+
+    // Add day of month, days of previous 0-11 month period that began w/March, days of previous 0-399 year
+    // period that began w/March of a 400-multiple year), days of any 400-year periods before that, and 306
+    // days to adjust from Mar 1, year 0-relative to Jan 1, year 1-relative. Add hours, minutes, and seconds.
+    day += (month * 367 - 1094) / 12 + year % 100 * 1461 / 4 + (year/100 * 36524 + year/400) - 306;
+    outTime->sec = (((day - 1) * SEC_PER_DAY) - 62135596800) + hour*SEC_PER_HOUR + minute*SEC_PER_MINUTE + seconds;
+
+    // C's TM does not define a microsecond field. Microseconds must be manipulated by calling function.
+    outTime->nsec = 0;
+
+    // Error check
+    PS_INT_CHECK_RANGE(outTime->nsec,0,1e9-1,outTime);
+
+    return outTime;
+}
+
+psTime* psTimeMath(const psTime *time, psF64 delta)
+{
+    psF64 sec = 0.0;
+    psTime *outTime = NULL;
+    psTime *tempTime = NULL;
+
+
+    // Error checks
+    PS_PTR_CHECK_NULL(time,NULL);
+    PS_INT_CHECK_RANGE(time->nsec,0,1e9-1,NULL);
+
+    // Convert time to TAI if necessary, but without changing input arguments
+    if(time->type == PS_TIME_UTC) {
+        tempTime = psTimeAlloc(PS_TIME_UTC);
+        tempTime->sec = time->sec;
+        tempTime->nsec = time->nsec;
+        tempTime = psTimeConvert(tempTime, PS_TIME_TAI);
+    } else {
+        tempTime = psMemIncrRefCounter((psTime*)time);
+    }
+
+    // Create output time
+    outTime = psTimeAlloc(PS_TIME_TAI);
+    sec = delta + (psF64)tempTime->sec + (psF64)tempTime->nsec/1e9;
+    outTime->sec = sec;
+    outTime->nsec = (sec - outTime->sec)*1e9;
+
+    // Error check
+    PS_INT_CHECK_RANGE(outTime->nsec,0,1e9-1,outTime);
+
+    // Convert result to same time type as input
+    if(time->type == PS_TIME_UTC) {
+        outTime = psTimeConvert(outTime, PS_TIME_UTC);
+    }
+
+    psFree(tempTime);
+
+    return outTime;
+}
+
+psF64 psTimeDelta(const psTime *time1, const psTime *time2)
+{
+    psF64 out = 0.0;
+    psF64 uSec1 = 0.0;
+    psF64 uSec2 = 0.0;
+    psTime *tempTime1 = NULL;
+    psTime *tempTime2 = NULL;
+
+
+    // Error checks
+    PS_PTR_CHECK_NULL(time1,0.0);
+    PS_INT_CHECK_RANGE(time1->nsec,0,1e9-1,0.0);
+    PS_PTR_CHECK_NULL(time2,0.0);
+    PS_INT_CHECK_RANGE(time2->nsec,0,1e9-1,0.0);
+
+    // Convert time to TAI if necessary, but without changing input arguments
+    if(time1->type == PS_TIME_UTC) {
+        tempTime1 = psTimeAlloc(PS_TIME_UTC);
+        tempTime1->sec = time1->sec;
+        tempTime1->nsec = time1->nsec;
+        tempTime1 = psTimeConvert(tempTime1, PS_TIME_TAI);
+    } else {
+        tempTime1 = psMemIncrRefCounter((psTime*)time1);
+    }
+    if(time2->type == PS_TIME_UTC) {
+        tempTime2 = psTimeAlloc(PS_TIME_UTC);
+        tempTime2->sec = time2->sec;
+        tempTime2->nsec = time2->nsec;
+        tempTime2 = psTimeConvert(tempTime2, PS_TIME_TAI);
+    } else {
+        tempTime2 = psMemIncrRefCounter((psTime*)time2);
+    }
+
+    uSec1 = tempTime1->sec >= 0 ? 1.0 : -1.0;
+    uSec1 = uSec1*tempTime1->nsec/1e9;
+    uSec2 = tempTime2->sec >= 0 ? 1.0 : -1.0;
+    uSec2 = uSec2*tempTime2->nsec/1e9;
+    out = (tempTime1->sec-tempTime2->sec) + (uSec1-uSec2);
+
+    psFree(tempTime1);
+    psFree(tempTime2);
+
+    return out;
+}
+
Index: /tags/ipp-1-X/bug123/psLib/src/astro/psTime.h
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/astro/psTime.h	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/astro/psTime.h	(revision 22331)
@@ -0,0 +1,308 @@
+/** @file  psTime.h
+ *
+ *  @brief Definitions for time, time utilities, and conversion functions for use with psLib astronomy
+ *  functions.
+ *
+ *  A collection of functions are required by psLib to manipulate time data. These functions primarily consist
+ *  of conversions between specific time formats.  They use the UNIX timeval time system as the
+ *  base upon which International Atomic Time (TAI) and Universal Time Coordinated (UTC) are calculated.
+ *
+ *  @author Ross Harman, MHPCC
+ *
+ *  @version $Revision: 1.28 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-04-19 02:44:12 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+
+
+#ifndef PSTIME_H
+#define PSTIME_H
+
+#include <time.h>
+#include <sys/types.h>
+#include <sys/time.h>
+
+#include "psType.h"
+#include "psImage.h"
+
+struct psSphere;
+
+/// @addtogroup Time
+/// @{
+
+
+/** Time type.
+ *
+ * Enumeration for psTime types, TAI or UTC time.
+ */
+typedef enum {
+    PS_TIME_TAI,        ///< Temps Atomique International (TAI) time (time with leapseconds).
+    PS_TIME_UTC,        ///< Universal Time Coordinated (UTC) time (time without leapseconds).
+    PS_TIME_UT1,        ///< Universal Time corrected for polar motion
+    PS_TIME_TT,         ///< Terrestrial Time
+} psTimeType;
+
+/** Time Bulletin type
+ *
+ * Enumeration for psTimeBulletin type, A or B.
+ */
+typedef enum {
+    PS_IERS_A,          ///< IERS Bulletin A
+    PS_IERS_B,          ///< IERS Bulletin B
+} psTimeBulletin;
+
+/** Definition of psTime.
+ *
+ *  The psTime struct is used by psLib to represent time values critical to
+ *  astronomical calculations.  This structure represents a time which is
+ *  equivalent to TAI (International Atomic Time) and is measured in both
+ *  seconds and microseconds.
+ */
+typedef struct psTime
+{
+    psS64 sec;          ///< Seconds since epoch, Jan 1, 1970.
+    psU32 nsec;         ///< Nanoseconds since last second.
+    psBool leapsecond;  ///< if time falls on UTC leapsecond
+    psTimeType type;    ///< Type of time.
+}
+psTime;
+
+
+/** Initialize time data.
+ *
+ * Reads config and data files associated with various time conversions.
+ *
+ * @return  bool: True for success, false for failure.
+ */
+psBool p_psTimeInit(const char *fileName);
+
+/** Free memory persistant time data.
+ *
+ * Frees time data to be held in memory until the end of successful program execution.
+ *
+ * @return  void: void.
+ */
+psBool p_psTimeFinalize(void);
+
+/** Allocate time struct.
+ *
+ * Allocates an empty time struct. User must specify the psTimeType (PS_TIME_TAI or PS_TIME_UTC) in the argument.
+ * The seconds and microseconds members of the struct are set to zero.
+ *
+ * @return  psTime*: Struct with empty time.
+ */
+psTime* psTimeAlloc(
+    psTimeType type                     ///< Type of time to create (UTC or TAI).
+);
+
+/** Get current time.
+ *
+ * Gets current time from the system clock. User must specify the psTimeType (PS_TIME_TAI or PS_TIME_UTC) in
+ * the argument.
+ *
+ *  @return  psTime*: Struct with current time.
+ */
+psTime* psTimeGetNow(
+    psTimeType type                     ///< Type of time to get (UTC or TAI).
+);
+
+/** Convert psTime to UTC or TAI time.
+ *
+ *  Converts psTime to UTC or TAI time based on the psTimeType argument.
+ *
+ *  @return  psTime*: Pointer to psTime.
+ */
+psTime* psTimeConvert(
+    psTime *time,                       ///< Time to be converted.
+    psTimeType type                     ///< Type to be converted to.
+);
+
+/** Convert psTime to Local Mean Sidereal Time (LMST).
+ *
+ *  Converts psTime at the given longitude to LMST time. If the input time is not in UTC format, then it is
+ *  converted.
+ *
+ *  @return  double: LST Time.
+ */
+double psTimeToLMST(
+    psTime *time,                       ///< psTime to be converted.
+    double longitude                    ///< Longitude.
+);
+
+/** Determine UT1 - UTC from table lookup.
+ *
+ *  This function is necessary to for various SLALIB functions.
+ *
+ *  @return  double: Time difference.
+ */
+double psTimeGetUT1Delta(
+    const psTime *time                  ///< psTime to be looked up.
+);
+
+/** Determine TAI - UTC from table lookup.
+ *
+ *  This function is necessary to for various psTime functions.
+ *
+ *  @return  double: Time difference.
+ */
+double psTimeGetTAIDelta(
+    const psTime *time                  ///< psTime to be looked up.
+);
+
+/** Determine polar coordinates at a given time.
+ *
+ *  Determines the orientation of the polar axis at the given time.
+ *
+ *  @return  psSphere*: Spherical coordinates of Earth's polar axias.
+ */
+struct psSphere* psTimeGetPoleCoords(
+                const psTime *time                  ///< psTime determine polar orientation.
+            );
+
+/** Calculate the number of leapseconds between two times.
+ *
+ *  Calculates the number of leapseconds between two times.
+ *
+ *  @return  psS64: leapseconds added between given times
+ */
+psS64 psTimeLeapSecondDelta(
+    const psTime* time1,                ///< First input time.
+    const psTime* time2                 ///< Second input time.
+);
+
+/** Convert psTime to Julian date time.
+ *
+ *  Converts psTime to Julian date (JD) time. This function does not add or subtract leapseconds.
+ *
+ *  @return  double: Julian Date (JD) time.
+ */
+double psTimeToJD(
+    const psTime* time                  ///< Input time to be converted.
+);
+/** Convert psTime to modified Julian date time.
+ *
+ *  Converts psTime to modified Julian date (MJD) time. This function does not add or subtract leapseconds.
+ *
+ *  @return  double: Modified Julian Days (MJD) time.
+ */
+double psTimeToMJD(
+    const psTime* time                  ///< Input time to be converted.
+);
+
+/** Convert psTime to ISO8601 formatted string.
+ *
+ *  Converts psTime to a null terminated string in the form of YYYY-MM-DDThh:mm:ss.sss. This function does not
+ *  add or subtract leapseconds.
+ *
+ *  @return  char*: Pointer null terminated array of chars in ISO time.
+ */
+char* psTimeToISO(
+    const psTime* time                  ///< Input time to be converted.
+);
+
+/** Convert psTime to timeval time.
+ *
+ *  Converts psTime to timeval time. This function does not add or subtract leapseconds.
+ *
+ *  @return  timeval: timeval struct time.
+ */
+struct timeval psTimeToTimeval(
+                const psTime* time                  ///< Input time to be converted.
+            );
+
+/** Convert psTime to tm time.
+ *
+ * Converts psTime to tm time. This function is based on a Perl algorithm availble in the Pan-STARRS Image
+ * processing Algorithm Design Description (ADD). This function does not add or subtract leapseconds.
+ *
+ *  @return  tm: tm struct time.
+ */
+struct tm* psTimeToTM(
+                const psTime *time                  ///< Input time to be converted.
+            );
+
+/** Convert JD to psTime.
+ *
+ *  Converts JD time to psTime. This function does not add or subtract leapseconds.
+ *
+ *  @return  psTime: time.
+ */
+psTime* psTimeFromJD(
+    double time                         ///< Input time to be converted.
+);
+
+/** Convert MJD to psTime.
+ *
+ *  Converts MJD time to psTime. This function does not add or subtract leapseconds.
+ *
+ *  @return  psTime: time.
+ */
+psTime* psTimeFromMJD(
+    double time                         ///< Input time to be converted.
+);
+
+/** Convert ISO to psTime.
+ *
+ *  Converts ISO time to psTime. This function does not add or subtract leapseconds.
+ *
+ *  @return  psTime*: time
+ */
+psTime* psTimeFromISO(
+    const char* time                    ///< Input time to be converted.
+);
+
+/** Convert timeval to psTime.
+ *
+ *  Converts timeval time to psTime. This function does not add or subtract leapseconds.
+ *
+ *  @return  psTime*: time.
+ */
+psTime* psTimeFromTimeval(
+    const struct timeval *time          ///< Input time to be converted.
+);
+
+/** Convert tm time to psTime.
+ *
+ *  Converts tm time to psTime. This function is based on a Perl algorithm availble in the Pan-STARRS Image
+ * processing Algorithm Design Description (ADD). This function does not add or subtract leapseconds.
+ *
+ *  @return  psTime*: time.
+ */
+psTime* psTimeFromTM(
+    const struct tm *time               ///< Input time to be converted.
+);
+
+/** Adds delta to time. Result is in TAI time.
+ *
+ *  Adds delta to time. Input time is converted to TAI format if necessary.
+ *
+ *  @return  psTime*: time.
+ */
+psTime* psTimeMath(
+    const psTime *time,                 ///< Time.
+    psF64 delta                         ///< Time delta.
+);
+
+/** Determine difference between two times. Result is in TAI time.
+ *
+ *  Determine difference between two times. Input times are converted to TAI format if necessary.
+ *
+ *  @return psF64: Time difference.
+ */
+psF64 psTimeDelta(
+    const psTime *time1,                ///< First time.
+    const psTime *time2                 ///< Second time.
+);
+
+/** Get the filename of the psLib configuration file.
+ *
+ *  @return char*          If a PS_CONFIG_FILE environment variable exists,
+ *                         that is returned, otherwise the default location
+ *                         dependent on the installation location.
+ */
+char* p_psGetConfigFileName();
+
+/// @}
+
+#endif
Index: /tags/ipp-1-X/bug123/psLib/src/astronomy/.cvsignore
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/astronomy/.cvsignore	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/astronomy/.cvsignore	(revision 22331)
@@ -0,0 +1,7 @@
+Makefile.in
+.deps
+.libs
+Makefile
+*.lo
+*.la
+
Index: /tags/ipp-1-X/bug123/psLib/src/astronomy/Makefile.am
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/astronomy/Makefile.am	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/astronomy/Makefile.am	(revision 22331)
@@ -0,0 +1,35 @@
+#Makefile for astronomy functions of psLib
+#
+AM_CFLAGS=$(CFLAGS) -DPS_CONFIG_FILE_DEFAULT=\"$(sysconfdir)/pslib/psTime.config\"
+
+INCLUDES = \
+	-I$(top_srcdir)/src/collections \
+	-I$(top_srcdir)/src/dataManip \
+	-I$(top_srcdir)/src/dataIO \
+	-I$(top_srcdir)/src/image \
+	-I$(top_srcdir)/src/sysUtils \
+	$(all_includes)
+
+noinst_LTLIBRARIES = libpslibastronomy.la
+libpslibastronomy_la_SOURCES = \
+	psTime.c \
+	psCoord.c \
+	psAstrometry.c \
+        aoppa.f aopqk.f oapqk.f airmas.f eqeqx.f geoc.f refco.f aoppat.f \
+        dranrm.f dcs2c.f refz.f refro.f dcc2s.f gmst.f atms.f atmt.f nutc.f drange.f
+
+BUILT_SOURCES = psAstronomyErrors.h
+
+EXTRA_DIST = psAstronomyErrors.dat psAstronomyErrors.h astronomy.i
+
+psAstronomyErrors.h: psAstronomyErrors.dat
+	perl $(top_srcdir)/src/parseErrorCodes.pl --data=$? $@
+
+pslibincludedir = $(includedir)
+pslibinclude_HEADERS = \
+	psTime.h \
+	psCoord.h \
+	psAstrometry.h \
+	psPhotometry.h \
+	slalib.h
+
Index: /tags/ipp-1-X/bug123/psLib/src/astronomy/airmas.f
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/astronomy/airmas.f	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/astronomy/airmas.f	(revision 22331)
@@ -0,0 +1,75 @@
+      DOUBLE PRECISION FUNCTION sla_AIRMAS (ZD)
+*+
+*     - - - - - - -
+*      A I R M A S
+*     - - - - - - -
+*
+*  Air mass at given zenith distance (double precision)
+*
+*  Given:
+*     ZD     d     Observed zenith distance (radians)
+*
+*  The result is an estimate of the air mass, in units of that
+*  at the zenith.
+*
+*  Notes:
+*
+*  1)  The "observed" zenith distance referred to above means "as
+*      affected by refraction".
+*
+*  2)  Uses Hardie's (1962) polynomial fit to Bemporad's data for
+*      the relative air mass, X, in units of thickness at the zenith
+*      as tabulated by Schoenberg (1929). This is adequate for all
+*      normal needs as it is accurate to better than 0.1% up to X =
+*      6.8 and better than 1% up to X = 10. Bemporad's tabulated
+*      values are unlikely to be trustworthy to such accuracy
+*      because of variations in density, pressure and other
+*      conditions in the atmosphere from those assumed in his work.
+*
+*  3)  The sign of the ZD is ignored.
+*
+*  4)  At zenith distances greater than about ZD = 87 degrees the
+*      air mass is held constant to avoid arithmetic overflows.
+*
+*  References:
+*     Hardie, R.H., 1962, in "Astronomical Techniques"
+*        ed. W.A. Hiltner, University of Chicago Press, p180.
+*     Schoenberg, E., 1929, Hdb. d. Ap.,
+*        Berlin, Julius Springer, 2, 268.
+*
+*  Original code by P.W.Hill, St Andrews
+*
+*  P.T.Wallace   Starlink   18 March 1999
+*
+*  Copyright (C) 1999 Rutherford Appleton Laboratory
+*
+*  License:
+*    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 (see SLA_CONDITIONS); if not, write to the 
+*    Free Software Foundation, Inc., 59 Temple Place, Suite 330, 
+*    Boston, MA  02111-1307  USA
+*
+*-
+
+      IMPLICIT NONE
+
+      DOUBLE PRECISION ZD
+
+      DOUBLE PRECISION SECZM1
+
+
+      SECZM1 = 1D0/(COS(MIN(1.52D0,ABS(ZD))))-1D0
+      sla_AIRMAS = 1D0 + SECZM1*(0.9981833D0
+     :             - SECZM1*(0.002875D0 + 0.0008083D0*SECZM1))
+
+      END
Index: /tags/ipp-1-X/bug123/psLib/src/astronomy/aoppa.f
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/astronomy/aoppa.f	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/astronomy/aoppa.f	(revision 22331)
@@ -0,0 +1,193 @@
+      SUBROUTINE sla_AOPPA (DATE, DUT, ELONGM, PHIM, HM,
+     :                      XP, YP, TDK, PMB, RH, WL, TLR, AOPRMS)
+*+
+*     - - - - - -
+*      A O P P A
+*     - - - - - -
+*
+*  Precompute apparent to observed place parameters required by
+*  sla_AOPQK and sla_OAPQK.
+*
+*  Given:
+*     DATE   d      UTC date/time (modified Julian Date, JD-2400000.5)
+*     DUT    d      delta UT:  UT1-UTC (UTC seconds)
+*     ELONGM d      mean longitude of the observer (radians, east +ve)
+*     PHIM   d      mean geodetic latitude of the observer (radians)
+*     HM     d      observer's height above sea level (metres)
+*     XP     d      polar motion x-coordinate (radians)
+*     YP     d      polar motion y-coordinate (radians)
+*     TDK    d      local ambient temperature (DegK; std=273.15D0)
+*     PMB    d      local atmospheric pressure (mB; std=1013.25D0)
+*     RH     d      local relative humidity (in the range 0D0-1D0)
+*     WL     d      effective wavelength (micron, e.g. 0.55D0)
+*     TLR    d      tropospheric lapse rate (DegK/metre, e.g. 0.0065D0)
+*
+*  Returned:
+*     AOPRMS d(14)  star-independent apparent-to-observed parameters:
+*
+*       (1)      geodetic latitude (radians)
+*       (2,3)    sine and cosine of geodetic latitude
+*       (4)      magnitude of diurnal aberration vector
+*       (5)      height (HM)
+*       (6)      ambient temperature (TDK)
+*       (7)      pressure (PMB)
+*       (8)      relative humidity (RH)
+*       (9)      wavelength (WL)
+*       (10)     lapse rate (TLR)
+*       (11,12)  refraction constants A and B (radians)
+*       (13)     longitude + eqn of equinoxes + sidereal DUT (radians)
+*       (14)     local apparent sidereal time (radians)
+*
+*  Notes:
+*
+*   1)  It is advisable to take great care with units, as even
+*       unlikely values of the input parameters are accepted and
+*       processed in accordance with the models used.
+*
+*   2)  The DATE argument is UTC expressed as an MJD.  This is,
+*       strictly speaking, improper, because of leap seconds.  However,
+*       as long as the delta UT and the UTC are consistent there
+*       are no difficulties, except during a leap second.  In this
+*       case, the start of the 61st second of the final minute should
+*       begin a new MJD day and the old pre-leap delta UT should
+*       continue to be used.  As the 61st second completes, the MJD
+*       should revert to the start of the day as, simultaneously,
+*       the delta UTC changes by one second to its post-leap new value.
+*
+*   3)  The delta UT (UT1-UTC) is tabulated in IERS circulars and
+*       elsewhere.  It increases by exactly one second at the end of
+*       each UTC leap second, introduced in order to keep delta UT
+*       within +/- 0.9 seconds.
+*
+*   4)  IMPORTANT -- TAKE CARE WITH THE LONGITUDE SIGN CONVENTION.
+*       The longitude required by the present routine is east-positive,
+*       in accordance with geographical convention (and right-handed).
+*       In particular, note that the longitudes returned by the
+*       sla_OBS routine are west-positive, following astronomical
+*       usage, and must be reversed in sign before use in the present
+*       routine.
+*
+*   5)  The polar coordinates XP,YP can be obtained from IERS
+*       circulars and equivalent publications.  The maximum amplitude
+*       is about 0.3 arcseconds.  If XP,YP values are unavailable,
+*       use XP=YP=0D0.  See page B60 of the 1988 Astronomical Almanac
+*       for a definition of the two angles.
+*
+*   6)  The height above sea level of the observing station, HM,
+*       can be obtained from the Astronomical Almanac (Section J
+*       in the 1988 edition), or via the routine sla_OBS.  If P,
+*       the pressure in millibars, is available, an adequate
+*       estimate of HM can be obtained from the expression
+*
+*             HM ~ -29.3D0*TSL*LOG(P/1013.25D0).
+*
+*       where TSL is the approximate sea-level air temperature in
+*       deg K (see Astrophysical Quantities, C.W.Allen, 3rd edition,
+*       section 52).  Similarly, if the pressure P is not known,
+*       it can be estimated from the height of the observing
+*       station, HM as follows:
+*
+*             P ~ 1013.25D0*EXP(-HM/(29.3D0*TSL)).
+*
+*       Note, however, that the refraction is proportional to the
+*       pressure and that an accurate P value is important for
+*       precise work.
+*
+*   7)  Repeated, computationally-expensive, calls to sla_AOPPA for
+*       times that are very close together can be avoided by calling
+*       sla_AOPPA just once and then using sla_AOPPAT for the subsequent
+*       times.  Fresh calls to sla_AOPPA will be needed only when
+*       changes in the precession have grown to unacceptable levels or
+*       when anything affecting the refraction has changed.
+*
+*  Called:  sla_GEOC, sla_REFCO, sla_EQEQX, sla_AOPPAT
+*
+*  P.T.Wallace   Starlink   24 October 2003
+*
+*  Copyright (C) 2003 P.T.Wallace and CCLRC
+*
+*  License:
+*    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 (see SLA_CONDITIONS); if not, write to the 
+*    Free Software Foundation, Inc., 59 Temple Place, Suite 330, 
+*    Boston, MA  02111-1307  USA
+*
+*-
+
+      IMPLICIT NONE
+
+      DOUBLE PRECISION DATE,DUT,ELONGM,PHIM,HM,XP,YP,TDK,PMB,
+     :                 RH,WL,TLR,AOPRMS(14)
+
+      DOUBLE PRECISION sla_EQEQX
+
+*  2Pi
+      DOUBLE PRECISION D2PI
+      PARAMETER (D2PI=6.283185307179586476925287D0)
+
+*  Seconds of time to radians
+      DOUBLE PRECISION S2R
+      PARAMETER (S2R=7.272205216643039903848712D-5)
+
+*  Speed of light (AU per day)
+      DOUBLE PRECISION C
+      PARAMETER (C=173.14463331D0)
+
+*  Ratio between solar and sidereal time
+      DOUBLE PRECISION SOLSID
+      PARAMETER (SOLSID=1.00273790935D0)
+
+      DOUBLE PRECISION CPHIM,XT,YT,ZT,XC,YC,ZC,ELONG,PHI,UAU,VAU
+
+
+
+*  Observer's location corrected for polar motion
+      CPHIM = COS(PHIM)
+      XT = COS(ELONGM)*CPHIM
+      YT = SIN(ELONGM)*CPHIM
+      ZT = SIN(PHIM)
+      XC = XT-XP*ZT
+      YC = YT+YP*ZT
+      ZC = XP*XT-YP*YT+ZT
+      IF (XC.EQ.0D0.AND.YC.EQ.0D0) THEN
+         ELONG = 0D0
+      ELSE
+         ELONG = ATAN2(YC,XC)
+      END IF
+      PHI = ATAN2(ZC,SQRT(XC*XC+YC*YC))
+      AOPRMS(1) = PHI
+      AOPRMS(2) = SIN(PHI)
+      AOPRMS(3) = COS(PHI)
+
+*  Magnitude of the diurnal aberration vector
+      CALL sla_GEOC(PHI,HM,UAU,VAU)
+      AOPRMS(4) = D2PI*UAU*SOLSID/C
+
+*  Copy the refraction parameters and compute the A & B constants
+      AOPRMS(5) = HM
+      AOPRMS(6) = TDK
+      AOPRMS(7) = PMB
+      AOPRMS(8) = RH
+      AOPRMS(9) = WL
+      AOPRMS(10) = TLR
+      CALL sla_REFCO(HM,TDK,PMB,RH,WL,PHI,TLR,1D-10,
+     :               AOPRMS(11),AOPRMS(12))
+
+*  Longitude + equation of the equinoxes + sidereal equivalent of DUT
+*  (ignoring change in equation of the equinoxes between UTC and TDB)
+      AOPRMS(13) = ELONG+sla_EQEQX(DATE)+DUT*SOLSID*S2R
+
+*  Sidereal time
+      CALL sla_AOPPAT(DATE,AOPRMS)
+
+      END
Index: /tags/ipp-1-X/bug123/psLib/src/astronomy/aoppat.f
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/astronomy/aoppat.f	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/astronomy/aoppat.f	(revision 22331)
@@ -0,0 +1,62 @@
+      SUBROUTINE sla_AOPPAT (DATE, AOPRMS)
+*+
+*     - - - - - - -
+*      A O P P A T
+*     - - - - - - -
+*
+*  Recompute the sidereal time in the apparent to observed place
+*  star-independent parameter block.
+*
+*  Given:
+*     DATE   d      UTC date/time (modified Julian Date, JD-2400000.5)
+*                   (see AOPPA source for comments on leap seconds)
+*
+*     AOPRMS d(14)  star-independent apparent-to-observed parameters
+*
+*       (1-12)   not required
+*       (13)     longitude + eqn of equinoxes + sidereal DUT
+*       (14)     not required
+*
+*  Returned:
+*     AOPRMS d(14)  star-independent apparent-to-observed parameters:
+*
+*       (1-13)   not changed
+*       (14)     local apparent sidereal time (radians)
+*
+*  For more information, see sla_AOPPA.
+*
+*  Called:  sla_GMST
+*
+*  P.T.Wallace   Starlink   1 July 1993
+*
+*  Copyright (C) 1995 Rutherford Appleton Laboratory
+*
+*  License:
+*    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 (see SLA_CONDITIONS); if not, write to the 
+*    Free Software Foundation, Inc., 59 Temple Place, Suite 330, 
+*    Boston, MA  02111-1307  USA
+*
+*-
+
+      IMPLICIT NONE
+
+      DOUBLE PRECISION DATE,AOPRMS(14)
+
+      DOUBLE PRECISION sla_GMST
+
+
+
+      AOPRMS(14) = sla_GMST(DATE)+AOPRMS(13)
+
+      END
Index: /tags/ipp-1-X/bug123/psLib/src/astronomy/aopqk.f
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/astronomy/aopqk.f	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/astronomy/aopqk.f	(revision 22331)
@@ -0,0 +1,259 @@
+      SUBROUTINE sla_AOPQK (RAP, DAP, AOPRMS, AOB, ZOB, HOB, DOB, ROB)
+*+
+*     - - - - - -
+*      A O P Q K
+*     - - - - - -
+*
+*  Quick apparent to observed place (but see note 8, below, for
+*  remarks about speed).
+*
+*  Given:
+*     RAP    d      geocentric apparent right ascension
+*     DAP    d      geocentric apparent declination
+*     AOPRMS d(14)  star-independent apparent-to-observed parameters:
+*
+*       (1)      geodetic latitude (radians)
+*       (2,3)    sine and cosine of geodetic latitude
+*       (4)      magnitude of diurnal aberration vector
+*       (5)      height (HM)
+*       (6)      ambient temperature (T)
+*       (7)      pressure (P)
+*       (8)      relative humidity (RH)
+*       (9)      wavelength (WL)
+*       (10)     lapse rate (TLR)
+*       (11,12)  refraction constants A and B (radians)
+*       (13)     longitude + eqn of equinoxes + sidereal DUT (radians)
+*       (14)     local apparent sidereal time (radians)
+*
+*  Returned:
+*     AOB    d      observed azimuth (radians: N=0,E=90)
+*     ZOB    d      observed zenith distance (radians)
+*     HOB    d      observed Hour Angle (radians)
+*     DOB    d      observed Declination (radians)
+*     ROB    d      observed Right Ascension (radians)
+*
+*  Notes:
+*
+*   1)  This routine returns zenith distance rather than elevation
+*       in order to reflect the fact that no allowance is made for
+*       depression of the horizon.
+*
+*   2)  The accuracy of the result is limited by the corrections for
+*       refraction.  Providing the meteorological parameters are
+*       known accurately and there are no gross local effects, the
+*       observed RA,Dec predicted by this routine should be within
+*       about 0.1 arcsec for a zenith distance of less than 70 degrees.
+*       Even at a topocentric zenith distance of 90 degrees, the
+*       accuracy in elevation should be better than 1 arcmin;  useful
+*       results are available for a further 3 degrees, beyond which
+*       the sla_REFRO routine returns a fixed value of the refraction.
+*       The complementary routines sla_AOP (or sla_AOPQK) and sla_OaAP
+*       (or sla_OAPQK) are self-consistent to better than 1 micro-
+*       arcsecond all over the celestial sphere.
+*
+*   3)  It is advisable to take great care with units, as even
+*       unlikely values of the input parameters are accepted and
+*       processed in accordance with the models used.
+*
+*   4)  "Apparent" place means the geocentric apparent right ascension
+*       and declination, which is obtained from a catalogue mean place
+*       by allowing for space motion, parallax, precession, nutation,
+*       annual aberration, and the Sun's gravitational lens effect.  For
+*       star positions in the FK5 system (i.e. J2000), these effects can
+*       be applied by means of the sla_MAP etc routines.  Starting from
+*       other mean place systems, additional transformations will be
+*       needed;  for example, FK4 (i.e. B1950) mean places would first
+*       have to be converted to FK5, which can be done with the
+*       sla_FK425 etc routines.
+*
+*   5)  "Observed" Az,El means the position that would be seen by a
+*       perfect theodolite located at the observer.  This is obtained
+*       from the geocentric apparent RA,Dec by allowing for Earth
+*       orientation and diurnal aberration, rotating from equator
+*       to horizon coordinates, and then adjusting for refraction.
+*       The HA,Dec is obtained by rotating back into equatorial
+*       coordinates, using the geodetic latitude corrected for polar
+*       motion, and is the position that would be seen by a perfect
+*       equatorial located at the observer and with its polar axis
+*       aligned to the Earth's axis of rotation (n.b. not to the
+*       refracted pole).  Finally, the RA is obtained by subtracting
+*       the HA from the local apparent ST.
+*
+*   6)  To predict the required setting of a real telescope, the
+*       observed place produced by this routine would have to be
+*       adjusted for the tilt of the azimuth or polar axis of the
+*       mounting (with appropriate corrections for mount flexures),
+*       for non-perpendicularity between the mounting axes, for the
+*       position of the rotator axis and the pointing axis relative
+*       to it, for tube flexure, for gear and encoder errors, and
+*       finally for encoder zero points.  Some telescopes would, of
+*       course, exhibit other properties which would need to be
+*       accounted for at the appropriate point in the sequence.
+*
+*   7)  The star-independent apparent-to-observed-place parameters
+*       in AOPRMS may be computed by means of the sla_AOPPA routine.
+*       If nothing has changed significantly except the time, the
+*       sla_AOPPAT routine may be used to perform the requisite
+*       partial recomputation of AOPRMS.
+*
+*   8)  At zenith distances beyond about 76 degrees, the need for
+*       special care with the corrections for refraction causes a
+*       marked increase in execution time.  Moreover, the effect
+*       gets worse with increasing zenith distance.  Adroit
+*       programming in the calling application may allow the
+*       problem to be reduced.  Prepare an alternative AOPRMS array,
+*       computed for zero air-pressure;  this will disable the
+*       refraction corrections and cause rapid execution.  Using
+*       this AOPRMS array, a preliminary call to the present routine
+*       will, depending on the application, produce a rough position
+*       which may be enough to establish whether the full, slow
+*       calculation (using the real AOPRMS array) is worthwhile.
+*       For example, there would be no need for the full calculation
+*       if the preliminary call had already established that the
+*       source was well below the elevation limits for a particular
+*       telescope.
+*
+*  9)   The azimuths etc produced by the present routine are with
+*       respect to the celestial pole.  Corrections to the terrestrial
+*       pole can be computed using sla_POLMO.
+*
+*  Called:  sla_DCS2C, sla_REFZ, sla_REFRO, sla_DCC2S, sla_DRANRM
+*
+*  P.T.Wallace   Starlink   24 October 2003
+*
+*  Copyright (C) 2003 Rutherford Appleton Laboratory
+*
+*  License:
+*    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 (see SLA_CONDITIONS); if not, write to the 
+*    Free Software Foundation, Inc., 59 Temple Place, Suite 330, 
+*    Boston, MA  02111-1307  USA
+*
+*-
+
+      IMPLICIT NONE
+
+      DOUBLE PRECISION RAP,DAP,AOPRMS(14),AOB,ZOB,HOB,DOB,ROB
+
+*  Breakpoint for fast/slow refraction algorithm:
+*  ZD greater than arctan(4), (see sla_REFCO routine)
+*  or vector Z less than cosine(arctan(Z)) = 1/sqrt(17)
+      DOUBLE PRECISION ZBREAK
+      PARAMETER (ZBREAK=0.242535625D0)
+
+      INTEGER I
+
+      DOUBLE PRECISION SPHI,CPHI,ST,V(3),XHD,YHD,ZHD,DIURAB,F,
+     :                 XHDT,YHDT,ZHDT,XAET,YAET,ZAET,AZOBS,
+     :                 ZDT,REFA,REFB,ZDOBS,DZD,DREF,CE,
+     :                 XAEO,YAEO,ZAEO,HMOBS,DCOBS,RAOBS
+
+      DOUBLE PRECISION sla_DRANRM
+
+
+
+*  Sin, cos of latitude
+      SPHI = AOPRMS(2)
+      CPHI = AOPRMS(3)
+
+*  Local apparent sidereal time
+      ST = AOPRMS(14)
+
+*  Apparent RA,Dec to Cartesian -HA,Dec
+      CALL sla_DCS2C(RAP-ST,DAP,V)
+      XHD = V(1)
+      YHD = V(2)
+      ZHD = V(3)
+
+*  Diurnal aberration
+      DIURAB = AOPRMS(4)
+      F = (1D0-DIURAB*YHD)
+      XHDT = F*XHD
+      YHDT = F*(YHD+DIURAB)
+      ZHDT = F*ZHD
+
+*  Cartesian -HA,Dec to Cartesian Az,El (S=0,E=90)
+      XAET = SPHI*XHDT-CPHI*ZHDT
+      YAET = YHDT
+      ZAET = CPHI*XHDT+SPHI*ZHDT
+
+*  Azimuth (N=0,E=90)
+      IF (XAET.EQ.0D0.AND.YAET.EQ.0D0) THEN
+         AZOBS = 0D0
+      ELSE
+         AZOBS = ATAN2(YAET,-XAET)
+      END IF
+
+*  Topocentric zenith distance
+      ZDT = ATAN2(SQRT(XAET*XAET+YAET*YAET),ZAET)
+
+*
+*  Refraction
+*  ----------
+
+*  Fast algorithm using two constant model
+      REFA = AOPRMS(11)
+      REFB = AOPRMS(12)
+      CALL sla_REFZ(ZDT,REFA,REFB,ZDOBS)
+
+*  Large zenith distance?
+      IF (COS(ZDOBS).LT.ZBREAK) THEN
+
+*     Yes: use rigorous algorithm
+
+*     Initialize loop (maximum of 10 iterations)
+         I = 1
+         DZD = 1D1
+         DO WHILE (ABS(DZD).GT.1D-10.AND.I.LE.10)
+
+*        Compute refraction using current estimate of observed ZD
+            CALL sla_REFRO(ZDOBS,AOPRMS(5),AOPRMS(6),AOPRMS(7),
+     :                     AOPRMS(8),AOPRMS(9),AOPRMS(1),
+     :                     AOPRMS(10),1D-8,DREF)
+
+*        Remaining discrepancy
+            DZD = ZDOBS+DREF-ZDT
+
+*        Update the estimate
+            ZDOBS = ZDOBS-DZD
+
+*        Increment the iteration counter
+            I = I+1
+         END DO
+      END IF
+
+*  To Cartesian Az/ZD
+      CE = SIN(ZDOBS)
+      XAEO = -COS(AZOBS)*CE
+      YAEO = SIN(AZOBS)*CE
+      ZAEO = COS(ZDOBS)
+
+*  Cartesian Az/ZD to Cartesian -HA,Dec
+      V(1) = SPHI*XAEO+CPHI*ZAEO
+      V(2) = YAEO
+      V(3) = -CPHI*XAEO+SPHI*ZAEO
+
+*  To spherical -HA,Dec
+      CALL sla_DCC2S(V,HMOBS,DCOBS)
+
+*  Right Ascension
+      RAOBS = sla_DRANRM(ST+HMOBS)
+
+*  Return the results
+      AOB = AZOBS
+      ZOB = ZDOBS
+      HOB = -HMOBS
+      DOB = DCOBS
+      ROB = RAOBS
+
+      END
Index: /tags/ipp-1-X/bug123/psLib/src/astronomy/astronomy.i
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/astronomy/astronomy.i	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/astronomy/astronomy.i	(revision 22331)
@@ -0,0 +1,23 @@
+/* astronomy headers */
+%include "psAstrometry.h"
+%include "psAstronomyErrors.h"
+%include "psCoord.h"
+
+%include "psMetadata.h"
+%extend psMetadataItem {
+    const char *get_STR(void) {
+       if (self->type != PS_META_STR) {
+	  return NULL;
+       } else {
+	  return self->data.V;
+       }
+    }
+}
+
+%apply unsigned int *OUTPUT { unsigned int *nFail }; /* for psMetadataParseConfig */
+%include "psMetadataIO.h"
+%clear psU32 *nFail;
+
+%include "psPhotometry.h"
+%include "psTime.h"
+
Index: /tags/ipp-1-X/bug123/psLib/src/astronomy/atms.f
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/astronomy/atms.f	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/astronomy/atms.f	(revision 22331)
@@ -0,0 +1,57 @@
+      SUBROUTINE sla__ATMS (RT, TT, DNT, GAMAL, R, DN, RDNDR)
+*+
+*     - - - - -
+*      A T M S
+*     - - - - -
+*
+*  Internal routine used by REFRO
+*
+*  Refractive index and derivative with respect to height for the
+*  stratosphere.
+*
+*  Given:
+*    RT      d    height of tropopause from centre of the Earth (metre)
+*    TT      d    temperature at the tropopause (deg K)
+*    DNT     d    refractive index at the tropopause
+*    GAMAL   d    constant of the atmospheric model = G*MD/R
+*    R       d    current distance from the centre of the Earth (metre)
+*
+*  Returned:
+*    DN      d    refractive index at R
+*    RDNDR   d    R * rate the refractive index is changing at R
+*
+*  P.T.Wallace   Starlink   14 July 1995
+*
+*  Copyright (C) 1995 Rutherford Appleton Laboratory
+*
+*  License:
+*    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 (see SLA_CONDITIONS); if not, write to the 
+*    Free Software Foundation, Inc., 59 Temple Place, Suite 330, 
+*    Boston, MA  02111-1307  USA
+*
+*-
+
+      IMPLICIT NONE
+
+      DOUBLE PRECISION RT,TT,DNT,GAMAL,R,DN,RDNDR
+
+      DOUBLE PRECISION B,W
+
+
+      B = GAMAL/TT
+      W = (DNT-1D0)*EXP(-B*(R-RT))
+      DN = 1D0+W
+      RDNDR = -R*B*W
+
+      END
Index: /tags/ipp-1-X/bug123/psLib/src/astronomy/atmt.f
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/astronomy/atmt.f	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/astronomy/atmt.f	(revision 22331)
@@ -0,0 +1,71 @@
+      SUBROUTINE sla__ATMT (R0, T0, ALPHA, GAMM2, DELM2,
+     :                      C1, C2, C3, C4, C5, C6, R, T, DN, RDNDR)
+*+
+*     - - - - -
+*      A T M T
+*     - - - - -
+*
+*  Internal routine used by REFRO
+*
+*  Refractive index and derivative with respect to height for the
+*  troposphere.
+*
+*  Given:
+*    R0      d    height of observer from centre of the Earth (metre)
+*    T0      d    temperature at the observer (deg K)
+*    ALPHA   d    alpha          )
+*    GAMM2   d    gamma minus 2  ) see HMNAO paper
+*    DELM2   d    delta minus 2  )
+*    C1      d    useful term  )
+*    C2      d    useful term  )
+*    C3      d    useful term  ) see source
+*    C4      d    useful term  ) of sla_REFRO
+*    C5      d    useful term  )
+*    C6      d    useful term  )
+*    R       d    current distance from the centre of the Earth (metre)
+*
+*  Returned:
+*    T       d    temperature at R (deg K)
+*    DN      d    refractive index at R
+*    RDNDR   d    R * rate the refractive index is changing at R
+*
+*  Note that in the optical case C5 and C6 are zero.
+*
+*  P.T.Wallace   Starlink   30 May 1997
+*
+*  Copyright (C) 1997 Rutherford Appleton Laboratory
+*
+*  License:
+*    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 (see SLA_CONDITIONS); if not, write to the 
+*    Free Software Foundation, Inc., 59 Temple Place, Suite 330, 
+*    Boston, MA  02111-1307  USA
+*
+*-
+
+      IMPLICIT NONE
+
+      DOUBLE PRECISION R0,T0,ALPHA,GAMM2,DELM2,C1,C2,C3,C4,C5,C6,
+     :                 R,T,DN,RDNDR
+
+      DOUBLE PRECISION TT0,TT0GM2,TT0DM2
+
+
+      T = MAX(MIN(T0-ALPHA*(R-R0),320D0),100D0)
+      TT0 = T/T0
+      TT0GM2 = TT0**GAMM2
+      TT0DM2 = TT0**DELM2
+      DN = 1D0+(C1*TT0GM2-(C2-C5/T)*TT0DM2)*TT0
+      RDNDR = R*(-C3*TT0GM2+(C4-C6/TT0)*TT0DM2)
+
+      END
Index: /tags/ipp-1-X/bug123/psLib/src/astronomy/dcc2s.f
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/astronomy/dcc2s.f	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/astronomy/dcc2s.f	(revision 22331)
@@ -0,0 +1,70 @@
+      SUBROUTINE sla_DCC2S (V, A, B)
+*+
+*     - - - - - -
+*      D C C 2 S
+*     - - - - - -
+*
+*  Direction cosines to spherical coordinates (double precision)
+*
+*  Given:
+*     V     d(3)   x,y,z vector
+*
+*  Returned:
+*     A,B   d      spherical coordinates in radians
+*
+*  The spherical coordinates are longitude (+ve anticlockwise
+*  looking from the +ve latitude pole) and latitude.  The
+*  Cartesian coordinates are right handed, with the x axis
+*  at zero longitude and latitude, and the z axis at the
+*  +ve latitude pole.
+*
+*  If V is null, zero A and B are returned.
+*  At either pole, zero A is returned.
+*
+*  P.T.Wallace   Starlink   July 1989
+*
+*  Copyright (C) 1995 Rutherford Appleton Laboratory
+*
+*  License:
+*    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 (see SLA_CONDITIONS); if not, write to the 
+*    Free Software Foundation, Inc., 59 Temple Place, Suite 330, 
+*    Boston, MA  02111-1307  USA
+*
+*-
+
+      IMPLICIT NONE
+
+      DOUBLE PRECISION V(3),A,B
+
+      DOUBLE PRECISION X,Y,Z,R
+
+
+      X = V(1)
+      Y = V(2)
+      Z = V(3)
+      R = SQRT(X*X+Y*Y)
+
+      IF (R.EQ.0D0) THEN
+         A = 0D0
+      ELSE
+         A = ATAN2(Y,X)
+      END IF
+
+      IF (Z.EQ.0D0) THEN
+         B = 0D0
+      ELSE
+         B = ATAN2(Z,R)
+      END IF
+
+      END
Index: /tags/ipp-1-X/bug123/psLib/src/astronomy/dcs2c.f
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/astronomy/dcs2c.f	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/astronomy/dcs2c.f	(revision 22331)
@@ -0,0 +1,58 @@
+      SUBROUTINE sla_DCS2C (A, B, V)
+*+
+*     - - - - - -
+*      D C S 2 C
+*     - - - - - -
+*
+*  Spherical coordinates to direction cosines (double precision)
+*
+*  Given:
+*     A,B       dp      spherical coordinates in radians
+*                        (RA,Dec), (Long,Lat) etc
+*
+*  Returned:
+*     V         dp(3)   x,y,z unit vector
+*
+*  The spherical coordinates are longitude (+ve anticlockwise
+*  looking from the +ve latitude pole) and latitude.  The
+*  Cartesian coordinates are right handed, with the x axis
+*  at zero longitude and latitude, and the z axis at the
+*  +ve latitude pole.
+*
+*  P.T.Wallace   Starlink   October 1984
+*
+*  Copyright (C) 1995 Rutherford Appleton Laboratory
+*
+*  License:
+*    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 (see SLA_CONDITIONS); if not, write to the 
+*    Free Software Foundation, Inc., 59 Temple Place, Suite 330, 
+*    Boston, MA  02111-1307  USA
+*
+*-
+
+      IMPLICIT NONE
+
+      DOUBLE PRECISION A,B,V(3)
+
+      DOUBLE PRECISION COSB
+
+
+
+      COSB=COS(B)
+
+      V(1)=COS(A)*COSB
+      V(2)=SIN(A)*COSB
+      V(3)=SIN(B)
+
+      END
Index: /tags/ipp-1-X/bug123/psLib/src/astronomy/drange.f
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/astronomy/drange.f	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/astronomy/drange.f	(revision 22331)
@@ -0,0 +1,49 @@
+      DOUBLE PRECISION FUNCTION sla_DRANGE (ANGLE)
+*+
+*     - - - - - - -
+*      D R A N G E
+*     - - - - - - -
+*
+*  Normalize angle into range +/- pi  (double precision)
+*
+*  Given:
+*     ANGLE     dp      the angle in radians
+*
+*  The result (double precision) is ANGLE expressed in the range +/- pi.
+*
+*  P.T.Wallace   Starlink   23 November 1995
+*
+*  Copyright (C) 1995 Rutherford Appleton Laboratory
+*
+*  License:
+*    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 (see SLA_CONDITIONS); if not, write to the 
+*    Free Software Foundation, Inc., 59 Temple Place, Suite 330, 
+*    Boston, MA  02111-1307  USA
+*
+*-
+
+      IMPLICIT NONE
+
+      DOUBLE PRECISION ANGLE
+
+      DOUBLE PRECISION DPI,D2PI
+      PARAMETER (DPI=3.141592653589793238462643D0)
+      PARAMETER (D2PI=6.283185307179586476925287D0)
+
+
+      sla_DRANGE=MOD(ANGLE,D2PI)
+      IF (ABS(sla_DRANGE).GE.DPI)
+     :          sla_DRANGE=sla_DRANGE-SIGN(D2PI,ANGLE)
+
+      END
Index: /tags/ipp-1-X/bug123/psLib/src/astronomy/dranrm.f
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/astronomy/dranrm.f	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/astronomy/dranrm.f	(revision 22331)
@@ -0,0 +1,48 @@
+      DOUBLE PRECISION FUNCTION sla_DRANRM (ANGLE)
+*+
+*     - - - - - - -
+*      D R A N R M
+*     - - - - - - -
+*
+*  Normalize angle into range 0-2 pi  (double precision)
+*
+*  Given:
+*     ANGLE     dp      the angle in radians
+*
+*  The result is ANGLE expressed in the range 0-2 pi (double
+*  precision).
+*
+*  P.T.Wallace   Starlink   23 November 1995
+*
+*  Copyright (C) 1995 Rutherford Appleton Laboratory
+*
+*  License:
+*    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 (see SLA_CONDITIONS); if not, write to the 
+*    Free Software Foundation, Inc., 59 Temple Place, Suite 330, 
+*    Boston, MA  02111-1307  USA
+*
+*-
+
+      IMPLICIT NONE
+
+      DOUBLE PRECISION ANGLE
+
+      DOUBLE PRECISION D2PI
+      PARAMETER (D2PI=6.283185307179586476925286766559D0)
+
+
+      sla_DRANRM=MOD(ANGLE,D2PI)
+      IF (sla_DRANRM.LT.0D0) sla_DRANRM=sla_DRANRM+D2PI
+
+      END
Index: /tags/ipp-1-X/bug123/psLib/src/astronomy/eqeqx.f
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/astronomy/eqeqx.f	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/astronomy/eqeqx.f	(revision 22331)
@@ -0,0 +1,74 @@
+      DOUBLE PRECISION FUNCTION sla_EQEQX (DATE)
+*+
+*     - - - - - -
+*      E Q E Q X
+*     - - - - - -
+*
+*  Equation of the equinoxes  (IAU 1994, double precision)
+*
+*  Given:
+*     DATE    dp      TDB (loosely ET) as Modified Julian Date
+*                                          (JD-2400000.5)
+*
+*  The result is the equation of the equinoxes (double precision)
+*  in radians:
+*
+*     Greenwich apparent ST = GMST + sla_EQEQX
+*
+*  References:  IAU Resolution C7, Recommendation 3 (1994)
+*               Capitaine, N. & Gontier, A.-M., Astron. Astrophys.,
+*               275, 645-650 (1993)
+*
+*  Called:  sla_NUTC
+*
+*  Patrick Wallace   Starlink   23 August 1996
+*
+*  Copyright (C) 1996 Rutherford Appleton Laboratory
+*
+*  License:
+*    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 (see SLA_CONDITIONS); if not, write to the 
+*    Free Software Foundation, Inc., 59 Temple Place, Suite 330, 
+*    Boston, MA  02111-1307  USA
+*
+*-
+
+      IMPLICIT NONE
+
+      DOUBLE PRECISION DATE
+
+*  Turns to arc seconds and arc seconds to radians
+      DOUBLE PRECISION T2AS,AS2R
+      PARAMETER (T2AS=1296000D0,
+     :           AS2R=0.484813681109535994D-5)
+
+      DOUBLE PRECISION T,OM,DPSI,DEPS,EPS0
+
+
+
+*  Interval between basic epoch J2000.0 and current epoch (JC)
+      T=(DATE-51544.5D0)/36525D0
+
+*  Longitude of the mean ascending node of the lunar orbit on the
+*   ecliptic, measured from the mean equinox of date
+      OM=AS2R*(450160.280D0+(-5D0*T2AS-482890.539D0
+     :         +(7.455D0+0.008D0*T)*T)*T)
+
+*  Nutation
+      CALL sla_NUTC(DATE,DPSI,DEPS,EPS0)
+
+*  Equation of the equinoxes
+      sla_EQEQX=DPSI*COS(EPS0)+AS2R*(0.00264D0*SIN(OM)+
+     :                               0.000063D0*SIN(OM+OM))
+
+      END
Index: /tags/ipp-1-X/bug123/psLib/src/astronomy/geoc.f
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/astronomy/geoc.f	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/astronomy/geoc.f	(revision 22331)
@@ -0,0 +1,74 @@
+      SUBROUTINE sla_GEOC (P, H, R, Z)
+*+
+*     - - - - -
+*      G E O C
+*     - - - - -
+*
+*  Convert geodetic position to geocentric (double precision)
+*
+*  Given:
+*     P     dp     latitude (geodetic, radians)
+*     H     dp     height above reference spheroid (geodetic, metres)
+*
+*  Returned:
+*     R     dp     distance from Earth axis (AU)
+*     Z     dp     distance from plane of Earth equator (AU)
+*
+*  Notes:
+*     1)  Geocentric latitude can be obtained by evaluating ATAN2(Z,R).
+*     2)  IAU 1976 constants are used.
+*
+*  Reference:
+*     Green,R.M., Spherical Astronomy, CUP 1985, p98.
+*
+*  P.T.Wallace   Starlink   4th October 1989
+*
+*  Copyright (C) 1995 Rutherford Appleton Laboratory
+*
+*  License:
+*    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 (see SLA_CONDITIONS); if not, write to the 
+*    Free Software Foundation, Inc., 59 Temple Place, Suite 330, 
+*    Boston, MA  02111-1307  USA
+*
+*-
+
+      IMPLICIT NONE
+
+      DOUBLE PRECISION P,H,R,Z
+
+*  Earth equatorial radius (metres)
+      DOUBLE PRECISION A0
+      PARAMETER (A0=6378140D0)
+
+*  Reference spheroid flattening factor and useful function
+      DOUBLE PRECISION F,B
+      PARAMETER (F=1D0/298.257D0,B=(1D0-F)**2)
+
+*  Astronomical unit in metres
+      DOUBLE PRECISION AU
+      PARAMETER (AU=1.49597870D11)
+
+      DOUBLE PRECISION SP,CP,C,S
+
+
+
+*  Geodetic to geocentric conversion
+      SP=SIN(P)
+      CP=COS(P)
+      C=1D0/SQRT(CP*CP+B*SP*SP)
+      S=B*C
+      R=(A0*C+H)*CP/AU
+      Z=(A0*S+H)*SP/AU
+
+      END
Index: /tags/ipp-1-X/bug123/psLib/src/astronomy/gmst.f
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/astronomy/gmst.f	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/astronomy/gmst.f	(revision 22331)
@@ -0,0 +1,77 @@
+      DOUBLE PRECISION FUNCTION sla_GMST (UT1)
+*+
+*     - - - - -
+*      G M S T
+*     - - - - -
+*
+*  Conversion from universal time to sidereal time (double precision)
+*
+*  Given:
+*    UT1    dp     universal time (strictly UT1) expressed as
+*                  modified Julian Date (JD-2400000.5)
+*
+*  The result is the Greenwich mean sidereal time (double
+*  precision, radians).
+*
+*  The IAU 1982 expression (see page S15 of 1984 Astronomical Almanac)
+*  is used, but rearranged to reduce rounding errors.  This expression
+*  is always described as giving the GMST at 0 hours UT.  In fact, it
+*  gives the difference between the GMST and the UT, which happens to
+*  equal the GMST (modulo 24 hours) at 0 hours UT each day.  In this
+*  routine, the entire UT is used directly as the argument for the
+*  standard formula, and the fractional part of the UT is added
+*  separately.  Note that the factor 1.0027379... does not appear in the
+*  IAU 1982 expression explicitly but in the form of the coefficient
+*  8640184.812866, which is 86400x36525x0.0027379...
+*
+*  See also the routine sla_GMSTA, which delivers better numerical
+*  precision by accepting the UT date and time as separate arguments.
+*
+*  Called:  sla_DRANRM
+*
+*  P.T.Wallace   Starlink   14 October 2001
+*
+*  Copyright (C) 2001 Rutherford Appleton Laboratory
+*
+*  License:
+*    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 (see SLA_CONDITIONS); if not, write to the 
+*    Free Software Foundation, Inc., 59 Temple Place, Suite 330, 
+*    Boston, MA  02111-1307  USA
+*
+*-
+
+      IMPLICIT NONE
+
+      DOUBLE PRECISION UT1
+
+      DOUBLE PRECISION sla_DRANRM
+
+      DOUBLE PRECISION D2PI,S2R
+      PARAMETER (D2PI=6.283185307179586476925286766559D0,
+     :           S2R=7.272205216643039903848711535369D-5)
+
+      DOUBLE PRECISION TU
+
+
+
+*  Julian centuries from fundamental epoch J2000 to this UT
+      TU=(UT1-51544.5D0)/36525D0
+
+*  GMST at this UT
+      sla_GMST=sla_DRANRM(MOD(UT1,1D0)*D2PI+
+     :                    (24110.54841D0+
+     :                    (8640184.812866D0+
+     :                    (0.093104D0-6.2D-6*TU)*TU)*TU)*S2R)
+
+      END
Index: /tags/ipp-1-X/bug123/psLib/src/astronomy/nutc.f
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/astronomy/nutc.f	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/astronomy/nutc.f	(revision 22331)
@@ -0,0 +1,830 @@
+      SUBROUTINE sla_NUTC (DATE, DPSI, DEPS, EPS0)
+*+
+*     - - - - -
+*      N U T C
+*     - - - - -
+*
+*  Nutation:  longitude & obliquity components and mean obliquity,
+*  using the Shirai & Fukushima (2001) theory.
+*
+*  Given:
+*     DATE        d    TDB (loosely ET) as Modified Julian Date
+*                                            (JD-2400000.5)
+*  Returned:
+*     DPSI,DEPS   d    nutation in longitude,obliquity
+*     EPS0        d    mean obliquity
+*
+*  Notes:
+*
+*  1  The routine predicts forced nutation (but not free core nutation)
+*     plus corrections to the IAU 1976 precession model.
+*
+*  2  Earth attitude predictions made by combining the present nutation
+*     model with IAU 1976 precession are accurate to 1 mas (with respect
+*     to the ICRF) for a few decades around 2000.
+*
+*  3  The sla_NUTC80 routine is the equivalent of the present routine
+*     but using the IAU 1980 nutation theory.  The older theory is less
+*     accurate, leading to errors as large as 350 mas over the interval
+*     1900-2100, mainly because of the error in the IAU 1976 precession.
+*
+*  References:
+*
+*     Shirai, T. & Fukushima, T., Astron.J. 121, 3270-3283 (2001).
+*
+*     Fukushima, T., 1991, Astron.Astrophys. 244, L11 (1991).
+*
+*     Simon, J. L., Bretagnon, P., Chapront, J., Chapront-Touze, M.,
+*     Francou, G. & Laskar, J., Astron.Astrophys. 282, 663 (1994).
+*
+*  P.T.Wallace   Starlink   7 October 2001
+*
+*  Copyright (C) 2001 Rutherford Appleton Laboratory
+*
+*  License:
+*    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 (see SLA_CONDITIONS); if not, write to the 
+*    Free Software Foundation, Inc., 59 Temple Place, Suite 330, 
+*    Boston, MA  02111-1307  USA
+*
+*-
+
+      IMPLICIT NONE
+
+      DOUBLE PRECISION DATE,DPSI,DEPS,EPS0
+
+*  Degrees to radians
+      DOUBLE PRECISION DD2R
+      PARAMETER (DD2R=1.745329251994329576923691D-2)
+
+*  Arc seconds to radians
+      DOUBLE PRECISION DAS2R
+      PARAMETER (DAS2R=4.848136811095359935899141D-6)
+
+*  Arc seconds in a full circle
+      DOUBLE PRECISION TURNAS
+      PARAMETER (TURNAS=1296000D0)
+
+*  Reference epoch (J2000), MJD
+      DOUBLE PRECISION DJM0
+      PARAMETER (DJM0=51544.5D0 )
+
+*  Days per Julian century
+      DOUBLE PRECISION DJC
+      PARAMETER (DJC=36525D0)
+
+      INTEGER I,J
+      DOUBLE PRECISION T,EL,ELP,F,D,OM,VE,MA,JU,SA,THETA,C,S,DP,DE
+
+*  Number of terms in the nutation model
+      INTEGER NTERMS
+      PARAMETER (NTERMS=194)
+
+*  The SF2001 forced nutation model
+      INTEGER NA(9,NTERMS)
+      DOUBLE PRECISION PSI(4,NTERMS), EPS(4,NTERMS)
+
+*  Coefficients of fundamental angles
+      DATA ( ( NA(I,J), I=1,9 ), J=1,10 ) /
+     :    0,   0,   0,   0,  -1,   0,   0,   0,   0,
+     :    0,   0,   2,  -2,   2,   0,   0,   0,   0,
+     :    0,   0,   2,   0,   2,   0,   0,   0,   0,
+     :    0,   0,   0,   0,  -2,   0,   0,   0,   0,
+     :    0,   1,   0,   0,   0,   0,   0,   0,   0,
+     :    0,   1,   2,  -2,   2,   0,   0,   0,   0,
+     :    1,   0,   0,   0,   0,   0,   0,   0,   0,
+     :    0,   0,   2,   0,   1,   0,   0,   0,   0,
+     :    1,   0,   2,   0,   2,   0,   0,   0,   0,
+     :    0,  -1,   2,  -2,   2,   0,   0,   0,   0 /
+      DATA ( ( NA(I,J), I=1,9 ), J=11,20 ) /
+     :    0,   0,   2,  -2,   1,   0,   0,   0,   0,
+     :   -1,   0,   2,   0,   2,   0,   0,   0,   0,
+     :   -1,   0,   0,   2,   0,   0,   0,   0,   0,
+     :    1,   0,   0,   0,   1,   0,   0,   0,   0,
+     :    1,   0,   0,   0,  -1,   0,   0,   0,   0,
+     :   -1,   0,   2,   2,   2,   0,   0,   0,   0,
+     :    1,   0,   2,   0,   1,   0,   0,   0,   0,
+     :   -2,   0,   2,   0,   1,   0,   0,   0,   0,
+     :    0,   0,   0,   2,   0,   0,   0,   0,   0,
+     :    0,   0,   2,   2,   2,   0,   0,   0,   0 /
+      DATA ( ( NA(I,J), I=1,9 ), J=21,30 ) /
+     :    2,   0,   0,  -2,   0,   0,   0,   0,   0,
+     :    2,   0,   2,   0,   2,   0,   0,   0,   0,
+     :    1,   0,   2,  -2,   2,   0,   0,   0,   0,
+     :   -1,   0,   2,   0,   1,   0,   0,   0,   0,
+     :    2,   0,   0,   0,   0,   0,   0,   0,   0,
+     :    0,   0,   2,   0,   0,   0,   0,   0,   0,
+     :    0,   1,   0,   0,   1,   0,   0,   0,   0,
+     :   -1,   0,   0,   2,   1,   0,   0,   0,   0,
+     :    0,   2,   2,  -2,   2,   0,   0,   0,   0,
+     :    0,   0,   2,  -2,   0,   0,   0,   0,   0 /
+      DATA ( ( NA(I,J), I=1,9 ), J=31,40 ) /
+     :   -1,   0,   0,   2,  -1,   0,   0,   0,   0,
+     :    0,   1,   0,   0,  -1,   0,   0,   0,   0,
+     :    0,   2,   0,   0,   0,   0,   0,   0,   0,
+     :   -1,   0,   2,   2,   1,   0,   0,   0,   0,
+     :    1,   0,   2,   2,   2,   0,   0,   0,   0,
+     :    0,   1,   2,   0,   2,   0,   0,   0,   0,
+     :   -2,   0,   2,   0,   0,   0,   0,   0,   0,
+     :    0,   0,   2,   2,   1,   0,   0,   0,   0,
+     :    0,  -1,   2,   0,   2,   0,   0,   0,   0,
+     :    0,   0,   0,   2,   1,   0,   0,   0,   0 /
+      DATA ( ( NA(I,J), I=1,9 ), J=41,50 ) /
+     :    1,   0,   2,  -2,   1,   0,   0,   0,   0,
+     :    2,   0,   0,  -2,  -1,   0,   0,   0,   0,
+     :    2,   0,   2,  -2,   2,   0,   0,   0,   0,
+     :    2,   0,   2,   0,   1,   0,   0,   0,   0,
+     :    0,   0,   0,   2,  -1,   0,   0,   0,   0,
+     :    0,  -1,   2,  -2,   1,   0,   0,   0,   0,
+     :   -1,  -1,   0,   2,   0,   0,   0,   0,   0,
+     :    2,   0,   0,  -2,   1,   0,   0,   0,   0,
+     :    1,   0,   0,   2,   0,   0,   0,   0,   0,
+     :    0,   1,   2,  -2,   1,   0,   0,   0,   0 /
+      DATA ( ( NA(I,J), I=1,9 ), J=51,60 ) /
+     :    1,  -1,   0,   0,   0,   0,   0,   0,   0,
+     :   -2,   0,   2,   0,   2,   0,   0,   0,   0,
+     :    0,  -1,   0,   2,   0,   0,   0,   0,   0,
+     :    3,   0,   2,   0,   2,   0,   0,   0,   0,
+     :    0,   0,   0,   1,   0,   0,   0,   0,   0,
+     :    1,  -1,   2,   0,   2,   0,   0,   0,   0,
+     :    1,   0,   0,  -1,   0,   0,   0,   0,   0,
+     :   -1,  -1,   2,   2,   2,   0,   0,   0,   0,
+     :   -1,   0,   2,   0,   0,   0,   0,   0,   0,
+     :    2,   0,   0,   0,  -1,   0,   0,   0,   0 /
+      DATA ( ( NA(I,J), I=1,9 ), J=61,70 ) /
+     :    0,  -1,   2,   2,   2,   0,   0,   0,   0,
+     :    1,   1,   2,   0,   2,   0,   0,   0,   0,
+     :    2,   0,   0,   0,   1,   0,   0,   0,   0,
+     :    1,   1,   0,   0,   0,   0,   0,   0,   0,
+     :    1,   0,  -2,   2,  -1,   0,   0,   0,   0,
+     :    1,   0,   2,   0,   0,   0,   0,   0,   0,
+     :   -1,   1,   0,   1,   0,   0,   0,   0,   0,
+     :    1,   0,   0,   0,   2,   0,   0,   0,   0,
+     :   -1,   0,   1,   0,   1,   0,   0,   0,   0,
+     :    0,   0,   2,   1,   2,   0,   0,   0,   0 /
+      DATA ( ( NA(I,J), I=1,9 ), J=71,80 ) /
+     :   -1,   1,   0,   1,   1,   0,   0,   0,   0,
+     :   -1,   0,   2,   4,   2,   0,   0,   0,   0,
+     :    0,  -2,   2,  -2,   1,   0,   0,   0,   0,
+     :    1,   0,   2,   2,   1,   0,   0,   0,   0,
+     :    1,   0,   0,   0,  -2,   0,   0,   0,   0,
+     :   -2,   0,   2,   2,   2,   0,   0,   0,   0,
+     :    1,   1,   2,  -2,   2,   0,   0,   0,   0,
+     :   -2,   0,   2,   4,   2,   0,   0,   0,   0,
+     :   -1,   0,   4,   0,   2,   0,   0,   0,   0,
+     :    2,   0,   2,  -2,   1,   0,   0,   0,   0 /
+      DATA ( ( NA(I,J), I=1,9 ), J=81,90 ) /
+     :    1,   0,   0,  -1,  -1,   0,   0,   0,   0,
+     :    2,   0,   2,   2,   2,   0,   0,   0,   0,
+     :    1,   0,   0,   2,   1,   0,   0,   0,   0,
+     :    3,   0,   0,   0,   0,   0,   0,   0,   0,
+     :    0,   0,   2,  -2,  -1,   0,   0,   0,   0,
+     :    3,   0,   2,  -2,   2,   0,   0,   0,   0,
+     :    0,   0,   4,  -2,   2,   0,   0,   0,   0,
+     :   -1,   0,   0,   4,   0,   0,   0,   0,   0,
+     :    0,   1,   2,   0,   1,   0,   0,   0,   0,
+     :    0,   0,   2,  -2,   3,   0,   0,   0,   0 /
+      DATA ( ( NA(I,J), I=1,9 ), J=91,100 ) /
+     :   -2,   0,   0,   4,   0,   0,   0,   0,   0,
+     :   -1,  -1,   0,   2,   1,   0,   0,   0,   0,
+     :   -2,   0,   2,   0,  -1,   0,   0,   0,   0,
+     :    0,   0,   2,   0,  -1,   0,   0,   0,   0,
+     :    0,  -1,   2,   0,   1,   0,   0,   0,   0,
+     :    0,   1,   0,   0,   2,   0,   0,   0,   0,
+     :    0,   0,   2,  -1,   2,   0,   0,   0,   0,
+     :    2,   1,   0,  -2,   0,   0,   0,   0,   0,
+     :    0,   0,   2,   4,   2,   0,   0,   0,   0,
+     :   -1,  -1,   0,   2,  -1,   0,   0,   0,   0 /
+      DATA ( ( NA(I,J), I=1,9 ), J=101,110 ) /
+     :   -1,   1,   0,   2,   0,   0,   0,   0,   0,
+     :    1,  -1,   0,   0,   1,   0,   0,   0,   0,
+     :    0,  -1,   2,  -2,   0,   0,   0,   0,   0,
+     :    0,   1,   0,   0,  -2,   0,   0,   0,   0,
+     :    1,  -1,   2,   2,   2,   0,   0,   0,   0,
+     :    1,   0,   0,   2,  -1,   0,   0,   0,   0,
+     :   -1,   1,   2,   2,   2,   0,   0,   0,   0,
+     :    3,   0,   2,   0,   1,   0,   0,   0,   0,
+     :    0,   1,   2,   2,   2,   0,   0,   0,   0,
+     :    1,   0,   2,  -2,   0,   0,   0,   0,   0 /
+      DATA ( ( NA(I,J), I=1,9 ), J=111,120 ) /
+     :   -1,   0,  -2,   4,  -1,   0,   0,   0,   0,
+     :   -1,  -1,   2,   2,   1,   0,   0,   0,   0,
+     :    0,  -1,   2,   2,   1,   0,   0,   0,   0,
+     :    2,  -1,   2,   0,   2,   0,   0,   0,   0,
+     :    0,   0,   0,   2,   2,   0,   0,   0,   0,
+     :    1,  -1,   2,   0,   1,   0,   0,   0,   0,
+     :   -1,   1,   2,   0,   2,   0,   0,   0,   0,
+     :    0,   1,   0,   2,   0,   0,   0,   0,   0,
+     :    0,   1,   2,  -2,   0,   0,   0,   0,   0,
+     :    0,   3,   2,  -2,   2,   0,   0,   0,   0 /
+      DATA ( ( NA(I,J), I=1,9 ), J=121,130 ) /
+     :    0,   0,   0,   1,   1,   0,   0,   0,   0,
+     :   -1,   0,   2,   2,   0,   0,   0,   0,   0,
+     :    2,   1,   2,   0,   2,   0,   0,   0,   0,
+     :    1,   1,   0,   0,   1,   0,   0,   0,   0,
+     :    2,   0,   0,   2,   0,   0,   0,   0,   0,
+     :    1,   1,   2,   0,   1,   0,   0,   0,   0,
+     :   -1,   0,   0,   2,   2,   0,   0,   0,   0,
+     :    1,   0,  -2,   2,   0,   0,   0,   0,   0,
+     :    0,  -1,   0,   2,  -1,   0,   0,   0,   0,
+     :   -1,   0,   1,   0,   2,   0,   0,   0,   0 /
+      DATA ( ( NA(I,J), I=1,9 ), J=131,140 ) /
+     :    0,   1,   0,   1,   0,   0,   0,   0,   0,
+     :    1,   0,  -2,   2,  -2,   0,   0,   0,   0,
+     :    0,   0,   0,   1,  -1,   0,   0,   0,   0,
+     :    1,  -1,   0,   0,  -1,   0,   0,   0,   0,
+     :    0,   0,   0,   4,   0,   0,   0,   0,   0,
+     :    1,  -1,   0,   2,   0,   0,   0,   0,   0,
+     :    1,   0,   2,   1,   2,   0,   0,   0,   0,
+     :    1,   0,   2,  -1,   2,   0,   0,   0,   0,
+     :   -1,   0,   0,   2,  -2,   0,   0,   0,   0,
+     :    0,   0,   2,   1,   1,   0,   0,   0,   0 /
+      DATA ( ( NA(I,J), I=1,9 ), J=141,150 ) /
+     :   -1,   0,   2,   0,  -1,   0,   0,   0,   0,
+     :   -1,   0,   2,   4,   1,   0,   0,   0,   0,
+     :    0,   0,   2,   2,   0,   0,   0,   0,   0,
+     :    1,   1,   2,  -2,   1,   0,   0,   0,   0,
+     :    0,   0,   1,   0,   1,   0,   0,   0,   0,
+     :   -1,   0,   2,  -1,   1,   0,   0,   0,   0,
+     :   -2,   0,   2,   2,   1,   0,   0,   0,   0,
+     :    2,  -1,   0,   0,   0,   0,   0,   0,   0,
+     :    4,   0,   2,   0,   2,   0,   0,   0,   0,
+     :    2,   1,   2,  -2,   2,   0,   0,   0,   0 /
+      DATA ( ( NA(I,J), I=1,9 ), J=151,160 ) /
+     :    0,   1,   2,   1,   2,   0,   0,   0,   0,
+     :    1,   0,   4,  -2,   2,   0,   0,   0,   0,
+     :    1,   1,   0,   0,  -1,   0,   0,   0,   0,
+     :   -2,   0,   2,   4,   1,   0,   0,   0,   0,
+     :    2,   0,   2,   0,   0,   0,   0,   0,   0,
+     :   -1,   0,   1,   0,   0,   0,   0,   0,   0,
+     :    1,   0,   0,   1,   0,   0,   0,   0,   0,
+     :    0,   1,   0,   2,   1,   0,   0,   0,   0,
+     :   -1,   0,   4,   0,   1,   0,   0,   0,   0,
+     :   -1,   0,   0,   4,   1,   0,   0,   0,   0 /
+      DATA ( ( NA(I,J), I=1,9 ), J=161,170 ) /
+     :    2,   0,   2,   2,   1,   0,   0,   0,   0,
+     :    2,   1,   0,   0,   0,   0,   0,   0,   0,
+     :    0,   0,   5,  -5,   5,  -3,   0,   0,   0,
+     :    0,   0,   0,   0,   0,   0,   0,   2,   0,
+     :    0,   0,   1,  -1,   1,   0,   0,  -1,   0,
+     :    0,   0,  -1,   1,  -1,   1,   0,   0,   0,
+     :    0,   0,  -1,   1,   0,   0,   2,   0,   0,
+     :    0,   0,   3,  -3,   3,   0,   0,  -1,   0,
+     :    0,   0,  -8,   8,  -7,   5,   0,   0,   0,
+     :    0,   0,  -1,   1,  -1,   0,   2,   0,   0 /
+      DATA ( ( NA(I,J), I=1,9 ), J=171,180 ) /
+     :    0,   0,  -2,   2,  -2,   2,   0,   0,   0,
+     :    0,   0,  -6,   6,  -6,   4,   0,   0,   0,
+     :    0,   0,  -2,   2,  -2,   0,   8,  -3,   0,
+     :    0,   0,   6,  -6,   6,   0,  -8,   3,   0,
+     :    0,   0,   4,  -4,   4,  -2,   0,   0,   0,
+     :    0,   0,  -3,   3,  -3,   2,   0,   0,   0,
+     :    0,   0,   4,  -4,   3,   0,  -8,   3,   0,
+     :    0,   0,  -4,   4,  -5,   0,   8,  -3,   0,
+     :    0,   0,   0,   0,   0,   2,   0,   0,   0,
+     :    0,   0,  -4,   4,  -4,   3,   0,   0,   0 /
+      DATA ( ( NA(I,J), I=1,9 ), J=181,190 ) /
+     :    0,   1,  -1,   1,  -1,   0,   0,   1,   0,
+     :    0,   0,   0,   0,   0,   0,   0,   1,   0,
+     :    0,   0,   1,  -1,   1,   1,   0,   0,   0,
+     :    0,   0,   2,  -2,   2,   0,  -2,   0,   0,
+     :    0,  -1,  -7,   7,  -7,   5,   0,   0,   0,
+     :   -2,   0,   2,   0,   2,   0,   0,  -2,   0,
+     :   -2,   0,   2,   0,   1,   0,   0,  -3,   0,
+     :    0,   0,   2,  -2,   2,   0,   0,  -2,   0,
+     :    0,   0,   1,  -1,   1,   0,   0,   1,   0,
+     :    0,   0,   0,   0,   0,   0,   0,   0,   2 /
+      DATA ( ( NA(I,J), I=1,9 ), J=191,NTERMS ) /
+     :    0,   0,   0,   0,   0,   0,   0,   0,   1,
+     :    2,   0,  -2,   0,  -2,   0,   0,   3,   0,
+     :    0,   0,   1,  -1,   1,   0,   0,  -2,   0,
+     :    0,   0,  -7,   7,  -7,   5,   0,   0,   0 /
+
+*  Nutation series: longitude
+      DATA ( ( PSI(I,J), I=1,4 ), J=1,10 ) /
+     :  3341.5D0, 17206241.8D0,  3.1D0, 17409.5D0,
+     : -1716.8D0, -1317185.3D0,  1.4D0,  -156.8D0,
+     :   285.7D0,  -227667.0D0,  0.3D0,   -23.5D0,
+     :   -68.6D0,  -207448.0D0,  0.0D0,   -21.4D0,
+     :   950.3D0,   147607.9D0, -2.3D0,  -355.0D0,
+     :   -66.7D0,   -51689.1D0,  0.2D0,   122.6D0,
+     :  -108.6D0,    71117.6D0,  0.0D0,     7.0D0,
+     :    35.6D0,   -38740.2D0,  0.1D0,   -36.2D0,
+     :    85.4D0,   -30127.6D0,  0.0D0,    -3.1D0,
+     :     9.0D0,    21583.0D0,  0.1D0,   -50.3D0 /
+      DATA ( ( PSI(I,J), I=1,4 ), J=11,20 ) /
+     :    22.1D0,    12822.8D0,  0.0D0,    13.3D0,
+     :     3.4D0,    12350.8D0,  0.0D0,     1.3D0,
+     :   -21.1D0,    15699.4D0,  0.0D0,     1.6D0,
+     :     4.2D0,     6313.8D0,  0.0D0,     6.2D0,
+     :   -22.8D0,     5796.9D0,  0.0D0,     6.1D0,
+     :    15.7D0,    -5961.1D0,  0.0D0,    -0.6D0,
+     :    13.1D0,    -5159.1D0,  0.0D0,    -4.6D0,
+     :     1.8D0,     4592.7D0,  0.0D0,     4.5D0,
+     :   -17.5D0,     6336.0D0,  0.0D0,     0.7D0,
+     :    16.3D0,    -3851.1D0,  0.0D0,    -0.4D0 /
+      DATA ( ( PSI(I,J), I=1,4 ), J=21,30 ) /
+     :    -2.8D0,     4771.7D0,  0.0D0,     0.5D0,
+     :    13.8D0,    -3099.3D0,  0.0D0,    -0.3D0,
+     :     0.2D0,     2860.3D0,  0.0D0,     0.3D0,
+     :     1.4D0,     2045.3D0,  0.0D0,     2.0D0,
+     :    -8.6D0,     2922.6D0,  0.0D0,     0.3D0,
+     :    -7.7D0,     2587.9D0,  0.0D0,     0.2D0,
+     :     8.8D0,    -1408.1D0,  0.0D0,     3.7D0,
+     :     1.4D0,     1517.5D0,  0.0D0,     1.5D0,
+     :    -1.9D0,    -1579.7D0,  0.0D0,     7.7D0,
+     :     1.3D0,    -2178.6D0,  0.0D0,    -0.2D0 /
+      DATA ( ( PSI(I,J), I=1,4 ), J=31,40 ) /
+     :    -4.8D0,     1286.8D0,  0.0D0,     1.3D0,
+     :     6.3D0,     1267.2D0,  0.0D0,    -4.0D0,
+     :    -1.0D0,     1669.3D0,  0.0D0,    -8.3D0,
+     :     2.4D0,    -1020.0D0,  0.0D0,    -0.9D0,
+     :     4.5D0,     -766.9D0,  0.0D0,     0.0D0,
+     :    -1.1D0,      756.5D0,  0.0D0,    -1.7D0,
+     :    -1.4D0,    -1097.3D0,  0.0D0,    -0.5D0,
+     :     2.6D0,     -663.0D0,  0.0D0,    -0.6D0,
+     :     0.8D0,     -714.1D0,  0.0D0,     1.6D0,
+     :     0.4D0,     -629.9D0,  0.0D0,    -0.6D0 /
+      DATA ( ( PSI(I,J), I=1,4 ), J=41,50 ) /
+     :     0.3D0,      580.4D0,  0.0D0,     0.6D0,
+     :    -1.6D0,      577.3D0,  0.0D0,     0.5D0,
+     :    -0.9D0,      644.4D0,  0.0D0,     0.0D0,
+     :     2.2D0,     -534.0D0,  0.0D0,    -0.5D0,
+     :    -2.5D0,      493.3D0,  0.0D0,     0.5D0,
+     :    -0.1D0,     -477.3D0,  0.0D0,    -2.4D0,
+     :    -0.9D0,      735.0D0,  0.0D0,    -1.7D0,
+     :     0.7D0,      406.2D0,  0.0D0,     0.4D0,
+     :    -2.8D0,      656.9D0,  0.0D0,     0.0D0,
+     :     0.6D0,      358.0D0,  0.0D0,     2.0D0 /
+      DATA ( ( PSI(I,J), I=1,4 ), J=51,60 ) /
+     :    -0.7D0,      472.5D0,  0.0D0,    -1.1D0,
+     :    -0.1D0,     -300.5D0,  0.0D0,     0.0D0,
+     :    -1.2D0,      435.1D0,  0.0D0,    -1.0D0,
+     :     1.8D0,     -289.4D0,  0.0D0,     0.0D0,
+     :     0.6D0,     -422.6D0,  0.0D0,     0.0D0,
+     :     0.8D0,     -287.6D0,  0.0D0,     0.6D0,
+     :   -38.6D0,     -392.3D0,  0.0D0,     0.0D0,
+     :     0.7D0,     -281.8D0,  0.0D0,     0.6D0,
+     :     0.6D0,     -405.7D0,  0.0D0,     0.0D0,
+     :    -1.2D0,      229.0D0,  0.0D0,     0.2D0 /
+      DATA ( ( PSI(I,J), I=1,4 ), J=61,70 ) /
+     :     1.1D0,     -264.3D0,  0.0D0,     0.5D0,
+     :    -0.7D0,      247.9D0,  0.0D0,    -0.5D0,
+     :    -0.2D0,      218.0D0,  0.0D0,     0.2D0,
+     :     0.6D0,     -339.0D0,  0.0D0,     0.8D0,
+     :    -0.7D0,      198.7D0,  0.0D0,     0.2D0,
+     :    -1.5D0,      334.0D0,  0.0D0,     0.0D0,
+     :     0.1D0,      334.0D0,  0.0D0,     0.0D0,
+     :    -0.1D0,     -198.1D0,  0.0D0,     0.0D0,
+     :  -106.6D0,        0.0D0,  0.0D0,     0.0D0,
+     :    -0.5D0,      165.8D0,  0.0D0,     0.0D0 /
+      DATA ( ( PSI(I,J), I=1,4 ), J=71,80 ) /
+     :     0.0D0,      134.8D0,  0.0D0,     0.0D0,
+     :     0.9D0,     -151.6D0,  0.0D0,     0.0D0,
+     :     0.0D0,     -129.7D0,  0.0D0,     0.0D0,
+     :     0.8D0,     -132.8D0,  0.0D0,    -0.1D0,
+     :     0.5D0,     -140.7D0,  0.0D0,     0.0D0,
+     :    -0.1D0,      138.4D0,  0.0D0,     0.0D0,
+     :     0.0D0,      129.0D0,  0.0D0,    -0.3D0,
+     :     0.5D0,     -121.2D0,  0.0D0,     0.0D0,
+     :    -0.3D0,      114.5D0,  0.0D0,     0.0D0,
+     :    -0.1D0,      101.8D0,  0.0D0,     0.0D0 /
+      DATA ( ( PSI(I,J), I=1,4 ), J=81,90 ) /
+     :    -3.6D0,     -101.9D0,  0.0D0,     0.0D0,
+     :     0.8D0,     -109.4D0,  0.0D0,     0.0D0,
+     :     0.2D0,      -97.0D0,  0.0D0,     0.0D0,
+     :    -0.7D0,      157.3D0,  0.0D0,     0.0D0,
+     :     0.2D0,      -83.3D0,  0.0D0,     0.0D0,
+     :    -0.3D0,       93.3D0,  0.0D0,     0.0D0,
+     :    -0.1D0,       92.1D0,  0.0D0,     0.0D0,
+     :    -0.5D0,      133.6D0,  0.0D0,     0.0D0,
+     :    -0.1D0,       81.5D0,  0.0D0,     0.0D0,
+     :     0.0D0,      123.9D0,  0.0D0,     0.0D0 /
+      DATA ( ( PSI(I,J), I=1,4 ), J=91,100 ) /
+     :    -0.3D0,      128.1D0,  0.0D0,     0.0D0,
+     :     0.1D0,       74.1D0,  0.0D0,    -0.3D0,
+     :    -0.2D0,      -70.3D0,  0.0D0,     0.0D0,
+     :    -0.4D0,       66.6D0,  0.0D0,     0.0D0,
+     :     0.1D0,      -66.7D0,  0.0D0,     0.0D0,
+     :    -0.7D0,       69.3D0,  0.0D0,    -0.3D0,
+     :     0.0D0,      -70.4D0,  0.0D0,     0.0D0,
+     :    -0.1D0,      101.5D0,  0.0D0,     0.0D0,
+     :     0.5D0,      -69.1D0,  0.0D0,     0.0D0,
+     :    -0.2D0,       58.5D0,  0.0D0,     0.2D0 /
+      DATA ( ( PSI(I,J), I=1,4 ), J=101,110 ) /
+     :     0.1D0,      -94.9D0,  0.0D0,     0.2D0,
+     :     0.0D0,       52.9D0,  0.0D0,    -0.2D0,
+     :     0.1D0,       86.7D0,  0.0D0,    -0.2D0,
+     :    -0.1D0,      -59.2D0,  0.0D0,     0.2D0,
+     :     0.3D0,      -58.8D0,  0.0D0,     0.1D0,
+     :    -0.3D0,       49.0D0,  0.0D0,     0.0D0,
+     :    -0.2D0,       56.9D0,  0.0D0,    -0.1D0,
+     :     0.3D0,      -50.2D0,  0.0D0,     0.0D0,
+     :    -0.2D0,       53.4D0,  0.0D0,    -0.1D0,
+     :     0.1D0,      -76.5D0,  0.0D0,     0.0D0 /
+      DATA ( ( PSI(I,J), I=1,4 ), J=111,120 ) /
+     :    -0.2D0,       45.3D0,  0.0D0,     0.0D0,
+     :     0.1D0,      -46.8D0,  0.0D0,     0.0D0,
+     :     0.2D0,      -44.6D0,  0.0D0,     0.0D0,
+     :     0.2D0,      -48.7D0,  0.0D0,     0.0D0,
+     :     0.1D0,      -46.8D0,  0.0D0,     0.0D0,
+     :     0.1D0,      -42.0D0,  0.0D0,     0.0D0,
+     :     0.0D0,       46.4D0,  0.0D0,    -0.1D0,
+     :     0.2D0,      -67.3D0,  0.0D0,     0.1D0,
+     :     0.0D0,      -65.8D0,  0.0D0,     0.2D0,
+     :    -0.1D0,      -43.9D0,  0.0D0,     0.3D0 /
+      DATA ( ( PSI(I,J), I=1,4 ), J=121,130 ) /
+     :     0.0D0,      -38.9D0,  0.0D0,     0.0D0,
+     :    -0.3D0,       63.9D0,  0.0D0,     0.0D0,
+     :    -0.2D0,       41.2D0,  0.0D0,     0.0D0,
+     :     0.0D0,      -36.1D0,  0.0D0,     0.2D0,
+     :    -0.3D0,       58.5D0,  0.0D0,     0.0D0,
+     :    -0.1D0,       36.1D0,  0.0D0,     0.0D0,
+     :     0.0D0,      -39.7D0,  0.0D0,     0.0D0,
+     :     0.1D0,      -57.7D0,  0.0D0,     0.0D0,
+     :    -0.2D0,       33.4D0,  0.0D0,     0.0D0,
+     :    36.4D0,        0.0D0,  0.0D0,     0.0D0 /
+      DATA ( ( PSI(I,J), I=1,4 ), J=131,140 ) /
+     :    -0.1D0,       55.7D0,  0.0D0,    -0.1D0,
+     :     0.1D0,      -35.4D0,  0.0D0,     0.0D0,
+     :     0.1D0,      -31.0D0,  0.0D0,     0.0D0,
+     :    -0.1D0,       30.1D0,  0.0D0,     0.0D0,
+     :    -0.3D0,       49.2D0,  0.0D0,     0.0D0,
+     :    -0.2D0,       49.1D0,  0.0D0,     0.0D0,
+     :    -0.1D0,       33.6D0,  0.0D0,     0.0D0,
+     :     0.1D0,      -33.5D0,  0.0D0,     0.0D0,
+     :     0.1D0,      -31.0D0,  0.0D0,     0.0D0,
+     :    -0.1D0,       28.0D0,  0.0D0,     0.0D0 /
+      DATA ( ( PSI(I,J), I=1,4 ), J=141,150 ) /
+     :     0.1D0,      -25.2D0,  0.0D0,     0.0D0,
+     :     0.1D0,      -26.2D0,  0.0D0,     0.0D0,
+     :    -0.2D0,       41.5D0,  0.0D0,     0.0D0,
+     :     0.0D0,       24.5D0,  0.0D0,     0.1D0,
+     :   -16.2D0,        0.0D0,  0.0D0,     0.0D0,
+     :     0.0D0,      -22.3D0,  0.0D0,     0.0D0,
+     :     0.0D0,       23.1D0,  0.0D0,     0.0D0,
+     :    -0.1D0,       37.5D0,  0.0D0,     0.0D0,
+     :     0.2D0,      -25.7D0,  0.0D0,     0.0D0,
+     :     0.0D0,       25.2D0,  0.0D0,     0.0D0 /
+      DATA ( ( PSI(I,J), I=1,4 ), J=151,160 ) /
+     :     0.1D0,      -24.5D0,  0.0D0,     0.0D0,
+     :    -0.1D0,       24.3D0,  0.0D0,     0.0D0,
+     :     0.1D0,      -20.7D0,  0.0D0,     0.0D0,
+     :     0.1D0,      -20.8D0,  0.0D0,     0.0D0,
+     :    -0.2D0,       33.4D0,  0.0D0,     0.0D0,
+     :    32.9D0,        0.0D0,  0.0D0,     0.0D0,
+     :     0.1D0,      -32.6D0,  0.0D0,     0.0D0,
+     :     0.0D0,       19.9D0,  0.0D0,     0.0D0,
+     :    -0.1D0,       19.6D0,  0.0D0,     0.0D0,
+     :     0.0D0,      -18.7D0,  0.0D0,     0.0D0 /
+      DATA ( ( PSI(I,J), I=1,4 ), J=161,170 ) /
+     :     0.1D0,      -19.0D0,  0.0D0,     0.0D0,
+     :     0.1D0,      -28.6D0,  0.0D0,     0.0D0,
+     :     4.0D0,      178.8D0,-11.8D0,     0.3D0,
+     :    39.8D0,     -107.3D0, -5.6D0,    -1.0D0,
+     :     9.9D0,      164.0D0, -4.1D0,     0.1D0,
+     :    -4.8D0,     -135.3D0, -3.4D0,    -0.1D0,
+     :    50.5D0,       75.0D0,  1.4D0,    -1.2D0,
+     :    -1.1D0,      -53.5D0,  1.3D0,     0.0D0,
+     :   -45.0D0,       -2.4D0, -0.4D0,     6.6D0,
+     :   -11.5D0,      -61.0D0, -0.9D0,     0.4D0 /
+      DATA ( ( PSI(I,J), I=1,4 ), J=171,180 ) /
+     :     4.4D0,      -68.4D0, -3.4D0,     0.0D0,
+     :     7.7D0,      -47.1D0, -4.7D0,    -1.0D0,
+     :   -42.9D0,      -12.6D0, -1.2D0,     4.2D0,
+     :   -42.8D0,       12.7D0, -1.2D0,    -4.2D0,
+     :    -7.6D0,      -44.1D0,  2.1D0,    -0.5D0,
+     :   -64.1D0,        1.7D0,  0.2D0,     4.5D0,
+     :    36.4D0,      -10.4D0,  1.0D0,     3.5D0,
+     :    35.6D0,       10.2D0,  1.0D0,    -3.5D0,
+     :    -1.7D0,       39.5D0,  2.0D0,     0.0D0,
+     :    50.9D0,       -8.2D0, -0.8D0,    -5.0D0 /
+      DATA ( ( PSI(I,J), I=1,4 ), J=181,190 ) /
+     :     0.0D0,       52.3D0,  1.2D0,     0.0D0,
+     :   -42.9D0,      -17.8D0,  0.4D0,     0.0D0,
+     :     2.6D0,       34.3D0,  0.8D0,     0.0D0,
+     :    -0.8D0,      -48.6D0,  2.4D0,    -0.1D0,
+     :    -4.9D0,       30.5D0,  3.7D0,     0.7D0,
+     :     0.0D0,      -43.6D0,  2.1D0,     0.0D0,
+     :     0.0D0,      -25.4D0,  1.2D0,     0.0D0,
+     :     2.0D0,       40.9D0, -2.0D0,     0.0D0,
+     :    -2.1D0,       26.1D0,  0.6D0,     0.0D0,
+     :    22.6D0,       -3.2D0, -0.5D0,    -0.5D0 /
+      DATA ( ( PSI(I,J), I=1,4 ), J=191,NTERMS ) /
+     :    -7.6D0,       24.9D0, -0.4D0,    -0.2D0,
+     :    -6.2D0,       34.9D0,  1.7D0,     0.3D0,
+     :     2.0D0,       17.4D0, -0.4D0,     0.1D0,
+     :    -3.9D0,       20.5D0,  2.4D0,     0.6D0 /
+
+*  Nutation series: obliquity
+      DATA ( ( EPS(I,J), I=1,4 ), J=1,10 ) /
+     : 9205365.8D0, -1506.2D0,  885.7D0, -0.2D0,
+     :  573095.9D0,  -570.2D0, -305.0D0, -0.3D0,
+     :   97845.5D0,   147.8D0,  -48.8D0, -0.2D0,
+     :  -89753.6D0,    28.0D0,   46.9D0,  0.0D0,
+     :    7406.7D0,  -327.1D0,  -18.2D0,  0.8D0,
+     :   22442.3D0,   -22.3D0,  -67.6D0,  0.0D0,
+     :    -683.6D0,    46.8D0,    0.0D0,  0.0D0,
+     :   20070.7D0,    36.0D0,    1.6D0,  0.0D0,
+     :   12893.8D0,    39.5D0,   -6.2D0,  0.0D0,
+     :   -9593.2D0,    14.4D0,   30.2D0, -0.1D0 /
+      DATA ( ( EPS(I,J), I=1,4 ), J=11,20 ) /
+     :   -6899.5D0,     4.8D0,   -0.6D0,  0.0D0,
+     :   -5332.5D0,    -0.1D0,    2.7D0,  0.0D0,
+     :    -125.2D0,    10.5D0,    0.0D0,  0.0D0,
+     :   -3323.4D0,    -0.9D0,   -0.3D0,  0.0D0,
+     :    3142.3D0,     8.9D0,    0.3D0,  0.0D0,
+     :    2552.5D0,     7.3D0,   -1.2D0,  0.0D0,
+     :    2634.4D0,     8.8D0,    0.2D0,  0.0D0,
+     :   -2424.4D0,     1.6D0,   -0.4D0,  0.0D0,
+     :    -123.3D0,     3.9D0,    0.0D0,  0.0D0,
+     :    1642.4D0,     7.3D0,   -0.8D0,  0.0D0 /
+      DATA ( ( EPS(I,J), I=1,4 ), J=21,30 ) /
+     :      47.9D0,     3.2D0,    0.0D0,  0.0D0,
+     :    1321.2D0,     6.2D0,   -0.6D0,  0.0D0,
+     :   -1234.1D0,    -0.3D0,    0.6D0,  0.0D0,
+     :   -1076.5D0,    -0.3D0,    0.0D0,  0.0D0,
+     :     -61.6D0,     1.8D0,    0.0D0,  0.0D0,
+     :     -55.4D0,     1.6D0,    0.0D0,  0.0D0,
+     :     856.9D0,    -4.9D0,   -2.1D0,  0.0D0,
+     :    -800.7D0,    -0.1D0,    0.0D0,  0.0D0,
+     :     685.1D0,    -0.6D0,   -3.8D0,  0.0D0,
+     :     -16.9D0,    -1.5D0,    0.0D0,  0.0D0 /
+      DATA ( ( EPS(I,J), I=1,4 ), J=31,40 ) /
+     :     695.7D0,     1.8D0,    0.0D0,  0.0D0,
+     :     642.2D0,    -2.6D0,   -1.6D0,  0.0D0,
+     :      13.3D0,     1.1D0,   -0.1D0,  0.0D0,
+     :     521.9D0,     1.6D0,    0.0D0,  0.0D0,
+     :     325.8D0,     2.0D0,   -0.1D0,  0.0D0,
+     :    -325.1D0,    -0.5D0,    0.9D0,  0.0D0,
+     :      10.1D0,     0.3D0,    0.0D0,  0.0D0,
+     :     334.5D0,     1.6D0,    0.0D0,  0.0D0,
+     :     307.1D0,     0.4D0,   -0.9D0,  0.0D0,
+     :     327.2D0,     0.5D0,    0.0D0,  0.0D0 /
+      DATA ( ( EPS(I,J), I=1,4 ), J=41,50 ) /
+     :    -304.6D0,    -0.1D0,    0.0D0,  0.0D0,
+     :     304.0D0,     0.6D0,    0.0D0,  0.0D0,
+     :    -276.8D0,    -0.5D0,    0.1D0,  0.0D0,
+     :     268.9D0,     1.3D0,    0.0D0,  0.0D0,
+     :     271.8D0,     1.1D0,    0.0D0,  0.0D0,
+     :     271.5D0,    -0.4D0,   -0.8D0,  0.0D0,
+     :      -5.2D0,     0.5D0,    0.0D0,  0.0D0,
+     :    -220.5D0,     0.1D0,    0.0D0,  0.0D0,
+     :     -20.1D0,     0.3D0,    0.0D0,  0.0D0,
+     :    -191.0D0,     0.1D0,    0.5D0,  0.0D0 /
+      DATA ( ( EPS(I,J), I=1,4 ), J=51,60 ) /
+     :      -4.1D0,     0.3D0,    0.0D0,  0.0D0,
+     :     130.6D0,    -0.1D0,    0.0D0,  0.0D0,
+     :       3.0D0,     0.3D0,    0.0D0,  0.0D0,
+     :     122.9D0,     0.8D0,    0.0D0,  0.0D0,
+     :       3.7D0,    -0.3D0,    0.0D0,  0.0D0,
+     :     123.1D0,     0.4D0,   -0.3D0,  0.0D0,
+     :     -52.7D0,    15.3D0,    0.0D0,  0.0D0,
+     :     120.7D0,     0.3D0,   -0.3D0,  0.0D0,
+     :       4.0D0,    -0.3D0,    0.0D0,  0.0D0,
+     :     126.5D0,     0.5D0,    0.0D0,  0.0D0 /
+      DATA ( ( EPS(I,J), I=1,4 ), J=61,70 ) /
+     :     112.7D0,     0.5D0,   -0.3D0,  0.0D0,
+     :    -106.1D0,    -0.3D0,    0.3D0,  0.0D0,
+     :    -112.9D0,    -0.2D0,    0.0D0,  0.0D0,
+     :       3.6D0,    -0.2D0,    0.0D0,  0.0D0,
+     :     107.4D0,     0.3D0,    0.0D0,  0.0D0,
+     :     -10.9D0,     0.2D0,    0.0D0,  0.0D0,
+     :      -0.9D0,     0.0D0,    0.0D0,  0.0D0,
+     :      85.4D0,     0.0D0,    0.0D0,  0.0D0,
+     :       0.0D0,   -88.8D0,    0.0D0,  0.0D0,
+     :     -71.0D0,    -0.2D0,    0.0D0,  0.0D0 /
+      DATA ( ( EPS(I,J), I=1,4 ), J=71,80 ) /
+     :     -70.3D0,     0.0D0,    0.0D0,  0.0D0,
+     :      64.5D0,     0.4D0,    0.0D0,  0.0D0,
+     :      69.8D0,     0.0D0,    0.0D0,  0.0D0,
+     :      66.1D0,     0.4D0,    0.0D0,  0.0D0,
+     :     -61.0D0,    -0.2D0,    0.0D0,  0.0D0,
+     :     -59.5D0,    -0.1D0,    0.0D0,  0.0D0,
+     :     -55.6D0,     0.0D0,    0.2D0,  0.0D0,
+     :      51.7D0,     0.2D0,    0.0D0,  0.0D0,
+     :     -49.0D0,    -0.1D0,    0.0D0,  0.0D0,
+     :     -52.7D0,    -0.1D0,    0.0D0,  0.0D0 /
+      DATA ( ( EPS(I,J), I=1,4 ), J=81,90 ) /
+     :     -49.6D0,     1.4D0,    0.0D0,  0.0D0,
+     :      46.3D0,     0.4D0,    0.0D0,  0.0D0,
+     :      49.6D0,     0.1D0,    0.0D0,  0.0D0,
+     :      -5.1D0,     0.1D0,    0.0D0,  0.0D0,
+     :     -44.0D0,    -0.1D0,    0.0D0,  0.0D0,
+     :     -39.9D0,    -0.1D0,    0.0D0,  0.0D0,
+     :     -39.5D0,    -0.1D0,    0.0D0,  0.0D0,
+     :      -3.9D0,     0.1D0,    0.0D0,  0.0D0,
+     :     -42.1D0,    -0.1D0,    0.0D0,  0.0D0,
+     :     -17.2D0,     0.1D0,    0.0D0,  0.0D0 /
+      DATA ( ( EPS(I,J), I=1,4 ), J=91,100 ) /
+     :      -2.3D0,     0.1D0,    0.0D0,  0.0D0,
+     :     -39.2D0,     0.0D0,    0.0D0,  0.0D0,
+     :     -38.4D0,     0.1D0,    0.0D0,  0.0D0,
+     :      36.8D0,     0.2D0,    0.0D0,  0.0D0,
+     :      34.6D0,     0.1D0,    0.0D0,  0.0D0,
+     :     -32.7D0,     0.3D0,    0.0D0,  0.0D0,
+     :      30.4D0,     0.0D0,    0.0D0,  0.0D0,
+     :       0.4D0,     0.1D0,    0.0D0,  0.0D0,
+     :      29.3D0,     0.2D0,    0.0D0,  0.0D0,
+     :      31.6D0,     0.1D0,    0.0D0,  0.0D0 /
+      DATA ( ( EPS(I,J), I=1,4 ), J=101,110 ) /
+     :       0.8D0,    -0.1D0,    0.0D0,  0.0D0,
+     :     -27.9D0,     0.0D0,    0.0D0,  0.0D0,
+     :       2.9D0,     0.0D0,    0.0D0,  0.0D0,
+     :     -25.3D0,     0.0D0,    0.0D0,  0.0D0,
+     :      25.0D0,     0.1D0,    0.0D0,  0.0D0,
+     :      27.5D0,     0.1D0,    0.0D0,  0.0D0,
+     :     -24.4D0,    -0.1D0,    0.0D0,  0.0D0,
+     :      24.9D0,     0.2D0,    0.0D0,  0.0D0,
+     :     -22.8D0,    -0.1D0,    0.0D0,  0.0D0,
+     :       0.9D0,    -0.1D0,    0.0D0,  0.0D0 /
+      DATA ( ( EPS(I,J), I=1,4 ), J=111,120 ) /
+     :      24.4D0,     0.1D0,    0.0D0,  0.0D0,
+     :      23.9D0,     0.1D0,    0.0D0,  0.0D0,
+     :      22.5D0,     0.1D0,    0.0D0,  0.0D0,
+     :      20.8D0,     0.1D0,    0.0D0,  0.0D0,
+     :      20.1D0,     0.0D0,    0.0D0,  0.0D0,
+     :      21.5D0,     0.1D0,    0.0D0,  0.0D0,
+     :     -20.0D0,     0.0D0,    0.0D0,  0.0D0,
+     :       1.4D0,     0.0D0,    0.0D0,  0.0D0,
+     :      -0.2D0,    -0.1D0,    0.0D0,  0.0D0,
+     :      19.0D0,     0.0D0,   -0.1D0,  0.0D0 /
+      DATA ( ( EPS(I,J), I=1,4 ), J=121,130 ) /
+     :      20.5D0,     0.0D0,    0.0D0,  0.0D0,
+     :      -2.0D0,     0.0D0,    0.0D0,  0.0D0,
+     :     -17.6D0,    -0.1D0,    0.0D0,  0.0D0,
+     :      19.0D0,     0.0D0,    0.0D0,  0.0D0,
+     :      -2.4D0,     0.0D0,    0.0D0,  0.0D0,
+     :     -18.4D0,    -0.1D0,    0.0D0,  0.0D0,
+     :      17.1D0,     0.0D0,    0.0D0,  0.0D0,
+     :       0.4D0,     0.0D0,    0.0D0,  0.0D0,
+     :      18.4D0,     0.1D0,    0.0D0,  0.0D0,
+     :       0.0D0,    17.4D0,    0.0D0,  0.0D0 /
+      DATA ( ( EPS(I,J), I=1,4 ), J=131,140 ) /
+     :      -0.6D0,     0.0D0,    0.0D0,  0.0D0,
+     :     -15.4D0,     0.0D0,    0.0D0,  0.0D0,
+     :     -16.8D0,    -0.1D0,    0.0D0,  0.0D0,
+     :      16.3D0,     0.0D0,    0.0D0,  0.0D0,
+     :      -2.0D0,     0.0D0,    0.0D0,  0.0D0,
+     :      -1.5D0,     0.0D0,    0.0D0,  0.0D0,
+     :     -14.3D0,    -0.1D0,    0.0D0,  0.0D0,
+     :      14.4D0,     0.0D0,    0.0D0,  0.0D0,
+     :     -13.4D0,     0.0D0,    0.0D0,  0.0D0,
+     :     -14.3D0,    -0.1D0,    0.0D0,  0.0D0 /
+      DATA ( ( EPS(I,J), I=1,4 ), J=141,150 ) /
+     :     -13.7D0,     0.0D0,    0.0D0,  0.0D0,
+     :      13.1D0,     0.1D0,    0.0D0,  0.0D0,
+     :      -1.7D0,     0.0D0,    0.0D0,  0.0D0,
+     :     -12.8D0,     0.0D0,    0.0D0,  0.0D0,
+     :       0.0D0,   -14.4D0,    0.0D0,  0.0D0,
+     :      12.4D0,     0.0D0,    0.0D0,  0.0D0,
+     :     -12.0D0,     0.0D0,    0.0D0,  0.0D0,
+     :      -0.8D0,     0.0D0,    0.0D0,  0.0D0,
+     :      10.9D0,     0.1D0,    0.0D0,  0.0D0,
+     :     -10.8D0,     0.0D0,    0.0D0,  0.0D0 /
+      DATA ( ( EPS(I,J), I=1,4 ), J=151,160 ) /
+     :      10.5D0,     0.0D0,    0.0D0,  0.0D0,
+     :     -10.4D0,     0.0D0,    0.0D0,  0.0D0,
+     :     -11.2D0,     0.0D0,    0.0D0,  0.0D0,
+     :      10.5D0,     0.1D0,    0.0D0,  0.0D0,
+     :      -1.4D0,     0.0D0,    0.0D0,  0.0D0,
+     :       0.0D0,     0.1D0,    0.0D0,  0.0D0,
+     :       0.7D0,     0.0D0,    0.0D0,  0.0D0,
+     :     -10.3D0,     0.0D0,    0.0D0,  0.0D0,
+     :     -10.0D0,     0.0D0,    0.0D0,  0.0D0,
+     :       9.6D0,     0.0D0,    0.0D0,  0.0D0 /
+      DATA ( ( EPS(I,J), I=1,4 ), J=161,170 ) /
+     :       9.4D0,     0.1D0,    0.0D0,  0.0D0,
+     :       0.6D0,     0.0D0,    0.0D0,  0.0D0,
+     :     -87.7D0,     4.4D0,   -0.4D0, -6.3D0,
+     :      46.3D0,    22.4D0,    0.5D0, -2.4D0,
+     :      15.6D0,    -3.4D0,    0.1D0,  0.4D0,
+     :       5.2D0,     5.8D0,    0.2D0, -0.1D0,
+     :     -30.1D0,    26.9D0,    0.7D0,  0.0D0,
+     :      23.2D0,    -0.5D0,    0.0D0,  0.6D0,
+     :       1.0D0,    23.2D0,    3.4D0,  0.0D0,
+     :     -12.2D0,    -4.3D0,    0.0D0,  0.0D0 /
+      DATA ( ( EPS(I,J), I=1,4 ), J=171,180 ) /
+     :      -2.1D0,    -3.7D0,   -0.2D0,  0.1D0,
+     :     -18.6D0,    -3.8D0,   -0.4D0,  1.8D0,
+     :       5.5D0,   -18.7D0,   -1.8D0, -0.5D0,
+     :      -5.5D0,   -18.7D0,    1.8D0, -0.5D0,
+     :      18.4D0,    -3.6D0,    0.3D0,  0.9D0,
+     :      -0.6D0,     1.3D0,    0.0D0,  0.0D0,
+     :      -5.6D0,   -19.5D0,    1.9D0,  0.0D0,
+     :       5.5D0,   -19.1D0,   -1.9D0,  0.0D0,
+     :     -17.3D0,    -0.8D0,    0.0D0,  0.9D0,
+     :      -3.2D0,    -8.3D0,   -0.8D0,  0.3D0 /
+      DATA ( ( EPS(I,J), I=1,4 ), J=181,190 ) /
+     :      -0.1D0,     0.0D0,    0.0D0,  0.0D0,
+     :      -5.4D0,     7.8D0,   -0.3D0,  0.0D0,
+     :     -14.8D0,     1.4D0,    0.0D0,  0.3D0,
+     :      -3.8D0,     0.4D0,    0.0D0, -0.2D0,
+     :      12.6D0,     3.2D0,    0.5D0, -1.5D0,
+     :       0.1D0,     0.0D0,    0.0D0,  0.0D0,
+     :     -13.6D0,     2.4D0,   -0.1D0,  0.0D0,
+     :       0.9D0,     1.2D0,    0.0D0,  0.0D0,
+     :     -11.9D0,    -0.5D0,    0.0D0,  0.3D0,
+     :       0.4D0,    12.0D0,    0.3D0, -0.2D0 /
+      DATA ( ( EPS(I,J), I=1,4 ), J=191,NTERMS ) /
+     :       8.3D0,     6.1D0,   -0.1D0,  0.1D0,
+     :       0.0D0,     0.0D0,    0.0D0,  0.0D0,
+     :       0.4D0,   -10.8D0,    0.3D0,  0.0D0,
+     :       9.6D0,     2.2D0,    0.3D0, -1.2D0 /
+
+
+
+*  Interval between fundamental epoch J2000.0 and given epoch (JC).
+      T = (DATE-DJM0)/DJC
+
+*  Mean anomaly of the Moon.
+      EL  = 134.96340251D0*DD2R+
+     :      MOD(T*(1717915923.2178D0+
+     :          T*(        31.8792D0+
+     :          T*(         0.051635D0+
+     :          T*(       - 0.00024470D0)))),TURNAS)*DAS2R
+
+*  Mean anomaly of the Sun.
+      ELP = 357.52910918D0*DD2R+
+     :      MOD(T*( 129596581.0481D0+
+     :          T*(       - 0.5532D0+
+     :          T*(         0.000136D0+
+     :          T*(       - 0.00001149D0)))),TURNAS)*DAS2R
+
+*  Mean argument of the latitude of the Moon.
+      F   =  93.27209062D0*DD2R+
+     :      MOD(T*(1739527262.8478D0+
+     :          T*(      - 12.7512D0+
+     :          T*(      -  0.001037D0+
+     :          T*(         0.00000417D0)))),TURNAS)*DAS2R
+
+*  Mean elongation of the Moon from the Sun.
+      D   = 297.85019547D0*DD2R+
+     :      MOD(T*(1602961601.2090D0+
+     :          T*(       - 6.3706D0+
+     :          T*(         0.006539D0+
+     :          T*(       - 0.00003169D0)))),TURNAS)*DAS2R
+
+*  Mean longitude of the ascending node of the Moon.
+      OM  = 125.04455501D0*DD2R+
+     :      MOD(T*( - 6962890.5431D0+
+     :          T*(         7.4722D0+
+     :          T*(         0.007702D0+
+     :          T*(       - 0.00005939D0)))),TURNAS)*DAS2R
+
+*  Mean longitude of Venus.
+      VE    = 181.97980085D0*DD2R+MOD(210664136.433548D0*T,TURNAS)*DAS2R
+
+*  Mean longitude of Mars.
+      MA    = 355.43299958D0*DD2R+MOD( 68905077.493988D0*T,TURNAS)*DAS2R
+
+*  Mean longitude of Jupiter.
+      JU    =  34.35151874D0*DD2R+MOD( 10925660.377991D0*T,TURNAS)*DAS2R
+
+*  Mean longitude of Saturn.
+      SA    =  50.07744430D0*DD2R+MOD(  4399609.855732D0*T,TURNAS)*DAS2R
+
+*  Geodesic nutation (Fukushima 1991) in microarcsec.
+      DP = -153.1D0*SIN(ELP)-1.9D0*SIN(2D0*ELP)
+      DE = 0D0
+
+*  Shirai & Fukushima (2001) nutation series.
+      DO J=NTERMS,1,-1
+         THETA = DBLE(NA(1,J))*EL+
+     :           DBLE(NA(2,J))*ELP+
+     :           DBLE(NA(3,J))*F+
+     :           DBLE(NA(4,J))*D+
+     :           DBLE(NA(5,J))*OM+
+     :           DBLE(NA(6,J))*VE+
+     :           DBLE(NA(7,J))*MA+
+     :           DBLE(NA(8,J))*JU+
+     :           DBLE(NA(9,J))*SA
+         C = COS(THETA)
+         S = SIN(THETA)
+         DP = DP+(PSI(1,J)+PSI(3,J)*T)*C+(PSI(2,J)+PSI(4,J)*T)*S
+         DE = DE+(EPS(1,J)+EPS(3,J)*T)*C+(EPS(2,J)+EPS(4,J)*T)*S
+      END DO
+
+*  Change of units, and addition of the precession correction.
+      DPSI = (DP*1D-6-0.042888D0-0.29856D0*T)*DAS2R
+      DEPS = (DE*1D-6-0.005171D0-0.02408D0*T)*DAS2R
+
+*  Mean obliquity of date (Simon et al. 1994).
+      EPS0 = (84381.412D0+
+     :         (-46.80927D0+
+     :          (-0.000152D0+
+     :           (0.0019989D0+
+     :          (-0.00000051D0+
+     :          (-0.000000025D0)*T)*T)*T)*T)*T)*DAS2R
+
+      END
Index: /tags/ipp-1-X/bug123/psLib/src/astronomy/oapqk.f
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/astronomy/oapqk.f	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/astronomy/oapqk.f	(revision 22331)
@@ -0,0 +1,250 @@
+      SUBROUTINE sla_OAPQK (TYPE, OB1, OB2, AOPRMS, RAP, DAP)
+*+
+*     - - - - - -
+*      O A P Q K
+*     - - - - - -
+*
+*  Quick observed to apparent place
+*
+*  Given:
+*     TYPE   c*(*)  type of coordinates - 'R', 'H' or 'A' (see below)
+*     OB1    d      observed Az, HA or RA (radians; Az is N=0,E=90)
+*     OB2    d      observed ZD or Dec (radians)
+*     AOPRMS d(14)  star-independent apparent-to-observed parameters:
+*
+*       (1)      geodetic latitude (radians)
+*       (2,3)    sine and cosine of geodetic latitude
+*       (4)      magnitude of diurnal aberration vector
+*       (5)      height (HM)
+*       (6)      ambient temperature (T)
+*       (7)      pressure (P)
+*       (8)      relative humidity (RH)
+*       (9)      wavelength (WL)
+*       (10)     lapse rate (TLR)
+*       (11,12)  refraction constants A and B (radians)
+*       (13)     longitude + eqn of equinoxes + sidereal DUT (radians)
+*       (14)     local apparent sidereal time (radians)
+*
+*  Returned:
+*     RAP    d      geocentric apparent right ascension
+*     DAP    d      geocentric apparent declination
+*
+*  Notes:
+*
+*  1)  Only the first character of the TYPE argument is significant.
+*      'R' or 'r' indicates that OBS1 and OBS2 are the observed Right
+*      Ascension and Declination;  'H' or 'h' indicates that they are
+*      Hour Angle (West +ve) and Declination;  anything else ('A' or
+*      'a' is recommended) indicates that OBS1 and OBS2 are Azimuth
+*      (North zero, East is 90 deg) and zenith distance.  (Zenith
+*      distance is used rather than elevation in order to reflect the
+*      fact that no allowance is made for depression of the horizon.)
+*
+*  2)  The accuracy of the result is limited by the corrections for
+*      refraction.  Providing the meteorological parameters are
+*      known accurately and there are no gross local effects, the
+*      predicted apparent RA,Dec should be within about 0.1 arcsec
+*      for a zenith distance of less than 70 degrees.  Even at a
+*      topocentric zenith distance of 90 degrees, the accuracy in
+*      elevation should be better than 1 arcmin;  useful results
+*      are available for a further 3 degrees, beyond which the
+*      sla_REFRO routine returns a fixed value of the refraction.
+*      The complementary routines sla_AOP (or sla_AOPQK) and sla_OAP
+*      (or sla_OAPQK) are self-consistent to better than 1 micro-
+*      arcsecond all over the celestial sphere.
+*
+*  3)  It is advisable to take great care with units, as even
+*      unlikely values of the input parameters are accepted and
+*      processed in accordance with the models used.
+*
+*  5)  "Observed" Az,El means the position that would be seen by a
+*      perfect theodolite located at the observer.  This is
+*      related to the observed HA,Dec via the standard rotation, using
+*      the geodetic latitude (corrected for polar motion), while the
+*      observed HA and RA are related simply through the local
+*      apparent ST.  "Observed" RA,Dec or HA,Dec thus means the
+*      position that would be seen by a perfect equatorial located
+*      at the observer and with its polar axis aligned to the
+*      Earth's axis of rotation (n.b. not to the refracted pole).
+*      By removing from the observed place the effects of
+*      atmospheric refraction and diurnal aberration, the
+*      geocentric apparent RA,Dec is obtained.
+*
+*  5)  Frequently, mean rather than apparent RA,Dec will be required,
+*      in which case further transformations will be necessary.  The
+*      sla_AMP etc routines will convert the apparent RA,Dec produced
+*      by the present routine into an "FK5" (J2000) mean place, by
+*      allowing for the Sun's gravitational lens effect, annual
+*      aberration, nutation and precession.  Should "FK4" (1950)
+*      coordinates be needed, the routines sla_FK524 etc will also
+*      need to be applied.
+*
+*  6)  To convert to apparent RA,Dec the coordinates read from a
+*      real telescope, corrections would have to be applied for
+*      encoder zero points, gear and encoder errors, tube flexure,
+*      the position of the rotator axis and the pointing axis
+*      relative to it, non-perpendicularity between the mounting
+*      axes, and finally for the tilt of the azimuth or polar axis
+*      of the mounting (with appropriate corrections for mount
+*      flexures).  Some telescopes would, of course, exhibit other
+*      properties which would need to be accounted for at the
+*      appropriate point in the sequence.
+*
+*  7)  The star-independent apparent-to-observed-place parameters
+*      in AOPRMS may be computed by means of the sla_AOPPA routine.
+*      If nothing has changed significantly except the time, the
+*      sla_AOPPAT routine may be used to perform the requisite
+*      partial recomputation of AOPRMS.
+*
+*  8) The azimuths etc used by the present routine are with respect
+*     to the celestial pole.  Corrections from the terrestrial pole
+*     can be computed using sla_POLMO.
+*
+*  Called:  sla_DCS2C, sla_DCC2S, sla_REFRO, sla_DRANRM
+*
+*  P.T.Wallace   Starlink   23 June 1997
+*
+*  Copyright (C) 1996 Rutherford Appleton Laboratory
+*
+*  License:
+*    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 (see SLA_CONDITIONS); if not, write to the 
+*    Free Software Foundation, Inc., 59 Temple Place, Suite 330, 
+*    Boston, MA  02111-1307  USA
+*
+*-
+
+      IMPLICIT NONE
+
+      CHARACTER*(*) TYPE
+      DOUBLE PRECISION OB1,OB2,AOPRMS(14),RAP,DAP
+
+*  Breakpoint for fast/slow refraction algorithm:
+*  ZD greater than arctan(4), (see sla_REFCO routine)
+*  or vector Z less than cosine(arctan(Z)) = 1/sqrt(17)
+      DOUBLE PRECISION ZBREAK
+      PARAMETER (ZBREAK=0.242535625D0)
+
+      CHARACTER C
+      DOUBLE PRECISION C1,C2,SPHI,CPHI,ST,CE,XAEO,YAEO,ZAEO,V(3),
+     :                 XMHDO,YMHDO,ZMHDO,AZ,SZ,ZDO,TZ,DREF,ZDT,
+     :                 XAET,YAET,ZAET,XMHDA,YMHDA,ZMHDA,DIURAB,F,HMA
+
+      DOUBLE PRECISION sla_DRANRM
+
+
+
+*  Coordinate type
+      C = TYPE(1:1)
+
+*  Coordinates
+      C1 = OB1
+      C2 = OB2
+
+*  Sin, cos of latitude
+      SPHI = AOPRMS(2)
+      CPHI = AOPRMS(3)
+
+*  Local apparent sidereal time
+      ST = AOPRMS(14)
+
+*  Standardise coordinate type
+      IF (C.EQ.'R'.OR.C.EQ.'r') THEN
+         C = 'R'
+      ELSE IF (C.EQ.'H'.OR.C.EQ.'h') THEN
+         C = 'H'
+      ELSE
+         C = 'A'
+      END IF
+
+*  If Az,ZD convert to Cartesian (S=0,E=90)
+      IF (C.EQ.'A') THEN
+         CE = SIN(C2)
+         XAEO = -COS(C1)*CE
+         YAEO = SIN(C1)*CE
+         ZAEO = COS(C2)
+      ELSE
+
+*     If RA,Dec convert to HA,Dec
+         IF (C.EQ.'R') THEN
+            C1 = ST-C1
+         END IF
+
+*     To Cartesian -HA,Dec
+         CALL sla_DCS2C(-C1,C2,V)
+         XMHDO = V(1)
+         YMHDO = V(2)
+         ZMHDO = V(3)
+
+*     To Cartesian Az,El (S=0,E=90)
+         XAEO = SPHI*XMHDO-CPHI*ZMHDO
+         YAEO = YMHDO
+         ZAEO = CPHI*XMHDO+SPHI*ZMHDO
+      END IF
+
+*  Azimuth (S=0,E=90)
+      IF (XAEO.NE.0D0.OR.YAEO.NE.0D0) THEN
+         AZ = ATAN2(YAEO,XAEO)
+      ELSE
+         AZ = 0D0
+      END IF
+
+*  Sine of observed ZD, and observed ZD
+      SZ = SQRT(XAEO*XAEO+YAEO*YAEO)
+      ZDO = ATAN2(SZ,ZAEO)
+
+*
+*  Refraction
+*  ----------
+
+*  Large zenith distance?
+      IF (ZAEO.GE.ZBREAK) THEN
+
+*     Fast algorithm using two constant model
+         TZ = SZ/ZAEO
+         DREF = AOPRMS(11)*TZ+AOPRMS(12)*TZ*TZ*TZ
+
+      ELSE
+
+*     Rigorous algorithm for large ZD
+         CALL sla_REFRO(ZDO,AOPRMS(5),AOPRMS(6),AOPRMS(7),AOPRMS(8),
+     :                  AOPRMS(9),AOPRMS(1),AOPRMS(10),1D-8,DREF)
+      END IF
+
+      ZDT = ZDO+DREF
+
+*  To Cartesian Az,ZD
+      CE = SIN(ZDT)
+      XAET = COS(AZ)*CE
+      YAET = SIN(AZ)*CE
+      ZAET = COS(ZDT)
+
+*  Cartesian Az,ZD to Cartesian -HA,Dec
+      XMHDA = SPHI*XAET+CPHI*ZAET
+      YMHDA = YAET
+      ZMHDA = -CPHI*XAET+SPHI*ZAET
+
+*  Diurnal aberration
+      DIURAB = -AOPRMS(4)
+      F = (1D0-DIURAB*YMHDA)
+      V(1) = F*XMHDA
+      V(2) = F*(YMHDA+DIURAB)
+      V(3) = F*ZMHDA
+
+*  To spherical -HA,Dec
+      CALL sla_DCC2S(V,HMA,DAP)
+
+*  Right Ascension
+      RAP = sla_DRANRM(ST+HMA)
+
+      END
Index: /tags/ipp-1-X/bug123/psLib/src/astronomy/psAstrometry.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/astronomy/psAstrometry.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/astronomy/psAstrometry.c	(revision 22331)
@@ -0,0 +1,830 @@
+/** @file  psAstrometry.c
+ *
+ *  @brief This file defines the basic types for astronomical coordinate
+ *  transformation
+ *
+ *  @ingroup AstroImage
+ *
+ *  @author GLG, MHPCC
+ *
+ *  @version $Revision: 1.65 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-04-19 00:17:05 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+
+/******************************************************************************/
+/*  INCLUDE FILES                                                             */
+/******************************************************************************/
+#include <string.h>
+#include <math.h>
+
+#include "psFunctions.h"
+#include "psAstrometry.h"
+#include "psMemory.h"
+#include "psError.h"
+#include "psConstants.h"
+#include "psAstronomyErrors.h"
+#include "psMatrix.h"
+#include "psTrace.h"
+#include "psLogMsg.h"
+
+#include "slalib.h"
+
+/*****************************************************************************
+checkValidImageCoords(): this is a private function which simply
+determines if the supplied x,y coordinates are in the range for the supplied
+psImage.
+ *****************************************************************************/
+static psS32 checkValidImageCoords(double x,
+                                   double y,
+                                   psImage* tmpImage)
+{
+    PS_IMAGE_CHECK_NULL(tmpImage, 0);
+
+    if ((x < 0.0) || (x > (double)tmpImage->numCols) ||
+            (y < 0.0) || (y > (double)tmpImage->numRows)) {
+        return (0);
+    }
+
+    return (1);
+}
+
+
+static void FPAFree(psFPA* fpa)
+{
+    if (fpa != NULL) {
+        psFree(fpa->chips);
+        psFree(fpa->grommit);
+        psFree((psExposure*)fpa->exposure);
+        psFree(fpa->metadata);
+        psFree(fpa->fromTangentPlane);
+        psFree(fpa->toTangentPlane);
+        psFree(fpa->pattern);
+        psFree(fpa->colorPlus);
+        psFree(fpa->colorMinus);
+        psFree(fpa->projection);
+    }
+}
+
+static void chipFree(psChip* chip)
+{
+    if (chip != NULL) {
+        psFree(chip->cells);
+        psFree(chip->metadata);
+        psFree(chip->toFPA);
+        psFree(chip->fromFPA);
+    }
+}
+
+static void cellFree(psCell* cell)
+{
+    if (cell != NULL) {
+        psFree(cell->readouts);
+        psFree(cell->metadata);
+        psFree(cell->toChip);
+        psFree(cell->fromChip);
+        psFree(cell->toFPA);
+        psFree(cell->toTP);
+        psFree(cell->toSky);
+    }
+}
+
+static void readoutFree(psReadout* readout)
+{
+    if (readout != NULL) {
+        psFree(readout->image);
+        psFree(readout->mask);
+        psFree(readout->objects);
+        psFree(readout->metadata);
+    }
+}
+
+static void observatoryFree(psObservatory* obs)
+{
+    if (obs != NULL) {
+        psFree((psPtr)obs->name);
+    }
+}
+
+static void exposureFree(psExposure* exp)
+{
+    if (exp != NULL) {
+        psFree((psPtr)exp->time);
+        psFree((psPtr)exp->observatory);
+        psFree((psPtr)exp->cameraName);
+        psFree((psPtr)exp->telescopeName);
+    }
+}
+
+static void fixedPatternFree(psFixedPattern* fp)
+{
+    if (fp != NULL) {
+        for (psS32 i = 0; i < fp->p_ps_xRows; i++) {
+            psFree(fp->x[i]);
+        }
+
+        for (psS32 j = 0; j < fp->p_ps_yRows; j++) {
+            psFree(fp->y[j]);
+        }
+
+        psFree(fp->x);
+        psFree(fp->y);
+    }
+}
+
+/*****************************************************************************/
+/* FUNCTION IMPLEMENTATION - PUBLIC                                          */
+/*****************************************************************************/
+
+/*
+ * XXX: Verify that you interpreted the SDR correctly.
+ *
+ * XXX: This assumes that x,y must be of type F64
+ */
+psFixedPattern* psFixedPatternAlloc(double x0,
+                                    double y0,
+                                    double xScale,
+                                    double yScale,
+                                    const psImage *x,
+                                    const psImage *y)
+{
+    psFixedPattern *tmp;
+    psS32 i;
+    psS32 j;
+
+    PS_IMAGE_CHECK_NULL(x, NULL);
+    PS_IMAGE_CHECK_NULL(y, NULL);
+    PS_IMAGE_CHECK_TYPE(x, PS_TYPE_F64, NULL);
+    PS_IMAGE_CHECK_TYPE(y, PS_TYPE_F64, NULL);
+
+    tmp = (psFixedPattern *) psAlloc(sizeof(psFixedPattern));
+    // XXX: Is this correct?
+    tmp->nX = (x->numCols * x->numRows);
+    tmp->nY = (y->numCols * y->numRows);
+    tmp->x0 = x0;
+    tmp->y0 = y0;
+    tmp->xScale = xScale;
+    tmp->yScale = yScale;
+    tmp->p_ps_xRows = x->numRows;
+    tmp->p_ps_xCols = x->numCols;
+    tmp->p_ps_yRows = y->numRows;
+    tmp->p_ps_yCols = y->numCols;
+    tmp->x = (double **) psAlloc(x->numRows * sizeof(double *));
+    for (i=0;i<x->numRows;i++) {
+        (tmp->x)[i] = (double *) psAlloc(x->numCols * sizeof(double));
+    }
+    for (i=0;i<x->numRows;i++) {
+        for (j=0;j<x->numCols;j++) {
+            (tmp->x)[i][j] = x->data.F64[i][j];
+        }
+    }
+
+    tmp->y = (double **) psAlloc(y->numRows * sizeof(double *));
+    for (i=0;i<y->numRows;i++) {
+        (tmp->y)[i] = (double *) psAlloc(y->numCols * sizeof(double));
+    }
+    for (i=0;i<y->numRows;i++) {
+        for (j=0;j<y->numCols;j++) {
+            (tmp->y)[i][j] = y->data.F64[i][j];
+        }
+    }
+
+    psMemSetDeallocator(tmp,(psFreeFcn)fixedPatternFree);
+
+    return(tmp);
+}
+
+
+psExposure* psExposureAlloc(double ra,
+                            double dec,
+                            double hourAngle,
+                            double zenithDistance,
+                            double azimuth,
+                            const psTime* time,
+                            float rotAngle,
+                            float temperature,
+                            float pressure,
+                            float humidity,
+                            float exposureTime,
+                            float wavelength,
+                            const psObservatory* observatory)
+{
+    PS_PTR_CHECK_NULL(observatory, NULL);
+
+    psExposure* exp = psAlloc(sizeof(psExposure));
+    *(double *)&exp->ra = ra;
+    *(double *)&exp->dec = dec;
+    *(double *)&exp->hourAngle = hourAngle;
+    *(double *)&exp->zenithDistance = zenithDistance;
+    *(double *)&exp->azimuth = azimuth;
+    *(float *)&exp->rotAngle = rotAngle;
+    *(float *)&exp->temperature = temperature;
+    *(float *)&exp->pressure = pressure;
+    *(float *)&exp->humidity = humidity;
+    *(float *)&exp->exposureTime = exposureTime;
+    *(float *)&exp->wavelength = wavelength;
+
+    exp->time = psMemIncrRefCounter((psPtr)time);
+    exp->observatory = psMemIncrRefCounter((psPtr)observatory);
+
+    // XXX: how is this value derived?
+    *(double *)&exp->lst = psTimeToLMST((psTime*)time,observatory->longitude);
+    *(float *)&exp->positionAngle = 0.0f; // XXX: need input, see Bug #207
+    *(float *)&exp->parallacticAngle = 0.0f; // XXX: need input, see Bug #207
+    *(float *)&exp->airmass = slaAirmas(zenithDistance);
+    *(float *)&exp->parallacticFactor = 0.0f;
+    exp->cameraName = NULL;
+    exp->telescopeName = NULL;
+
+    psMemSetDeallocator(exp,(psFreeFcn)exposureFree);
+
+    return exp;
+}
+
+psObservatory* psObservatoryAlloc(const char* name,
+                                  double latitude,
+                                  double longitude,
+                                  double height,
+                                  double tlr)
+{
+    psObservatory* obs = psAlloc(sizeof(psObservatory));
+
+    if (name == NULL) {
+        obs->name = NULL;
+    } else {
+        obs->name = psAlloc(strlen(name)+1);
+        strcpy((char*)obs->name, name);
+    }
+
+    *(double *)&obs->latitude = latitude;
+    *(double *)&obs->longitude = longitude;
+    *(double *)&obs->height = height;
+    *(double *)&obs->tlr = tlr;
+
+    psMemSetDeallocator(obs,(psFreeFcn)observatoryFree);
+
+    return obs;
+}
+
+psFPA* psFPAAlloc(psS32 nChips,
+                  const psExposure* exp)
+{
+    PS_INT_CHECK_NON_NEGATIVE(nChips, NULL);
+
+    psFPA* newFPA = psAlloc(sizeof(psFPA));
+
+    // create array of NULL chips of the size nChips
+    newFPA->chips = psArrayAlloc(nChips);
+    psPtr* chips = newFPA->chips->data;
+    for (psS32 i=0;i<nChips;i++) {
+        chips[i] = NULL;
+    }
+    newFPA->chips->n = 0; // per requirement
+
+    newFPA->metadata = NULL;
+    newFPA->fromTangentPlane = NULL;
+    newFPA->toTangentPlane = NULL;
+    newFPA->pattern = NULL;
+
+    if (exp != NULL) {
+        newFPA->exposure = psMemIncrRefCounter((psExposure*)exp);
+        newFPA->grommit = psGrommitAlloc(exp);
+    } else {
+        newFPA->exposure = NULL;
+        newFPA->grommit = NULL;
+    }
+
+    newFPA->colorPlus = NULL;
+    newFPA->colorMinus = NULL;
+    newFPA->projection = NULL;
+
+    newFPA->rmsX = 0.0f;
+    newFPA->rmsY = 0.0f;
+    newFPA->chi2 = 0.0f;
+
+    psMemSetDeallocator(newFPA,(psFreeFcn)FPAFree);
+
+    return newFPA;
+}
+
+/*
+ * psChip constructor
+ */
+psChip* psChipAlloc(psS32 nCells,
+                    psFPA *parentFPA)
+{
+    PS_INT_CHECK_NON_NEGATIVE(nCells, NULL);
+
+    psChip* chip = psAlloc(sizeof(psChip));
+
+    // create array of NULL psCells
+    int n = (nCells > 0) ? nCells : 1;
+    chip->cells = psArrayAlloc(n);
+    psPtr* cells = chip->cells->data;
+    for (psS32 i=0;i<n;i++) {
+        cells[i] = NULL;
+    }
+    chip->cells->n = 0; // per requirement
+
+    *(int*)&chip->row0 = 0;
+    *(int*)&chip->col0 = 0;
+
+    chip->metadata = NULL;
+
+    chip->toFPA = NULL;
+    chip->fromFPA = NULL;
+
+    chip->parent = parentFPA;
+
+    psMemSetDeallocator(chip,(psFreeFcn)chipFree);
+
+    return chip;
+
+}
+
+/*
+ * psCell constructor
+ */
+psCell* psCellAlloc(psS32 nReadouts,
+                    psChip* parentChip)
+{
+    PS_INT_CHECK_NON_NEGATIVE(nReadouts, NULL);
+
+    psCell* cell = psAlloc(sizeof(psCell));
+
+    // create array of NULL psReadouts
+    int n = (nReadouts > 0) ? nReadouts : 1;
+    cell->readouts = psArrayAlloc(n);
+    psPtr* readouts = cell->readouts->data;
+    for (psS32 i=0;i<n;i++) {
+        readouts[i] = NULL;
+    }
+    cell->readouts->n = 0; // per requirement
+
+    *(int*)&cell->row0 = 0;
+    *(int*)&cell->col0 = 0;
+
+    cell->metadata = NULL;
+
+    cell->toChip = NULL;
+    cell->fromChip = NULL;
+    cell->toFPA = NULL;
+    cell->toTP = NULL;
+    cell->toSky = NULL;
+
+    cell->parent = parentChip;
+
+    psMemSetDeallocator(cell,(psFreeFcn)cellFree);
+
+    return cell;
+
+
+}
+
+psReadout* psReadoutAlloc()
+{
+    psReadout* readout = psAlloc(sizeof(psReadout));
+
+    *(psU32*)&readout->colBins = 1;
+    *(psU32*)&readout->rowBins = 1;
+    *(psU32*)&readout->rowParity = 0;
+    *(psU32*)&readout->colParity = 0;
+    *(psS32*)&readout->col0 = 0;
+    *(psS32*)&readout->row0 = 0;
+
+    readout->image = NULL;
+    readout->mask = NULL;
+    readout->objects = NULL;
+    readout->metadata = NULL;
+
+    psMemSetDeallocator(readout,(psFreeFcn)readoutFree);
+
+    return readout;
+}
+
+psGrommit* psGrommitAlloc(const psExposure* exp)
+{
+    PS_PTR_CHECK_NULL(exp, NULL);
+
+    double date = psTimeToMJD(exp->time);
+    double dut = psTimeGetUT1Delta(exp->time);
+    double elongm = exp->observatory->longitude;
+    double phim = exp->observatory->latitude;
+    double hm = exp->observatory->height;
+
+    psSphere* polarMotion = psTimeGetPoleCoords(exp->time);
+    double xp = polarMotion->r;
+    double yp = polarMotion->d;
+    psFree(polarMotion);
+
+    double tdk = exp->temperature;
+    double pmb = exp->pressure;
+    double rh = exp->humidity;
+    double wl = exp->wavelength;
+    double tlr = exp->observatory->tlr;
+
+    psGrommit* grommit = (psGrommit* ) psAlloc(sizeof(psGrommit));
+
+    slaAoppa(date, dut, elongm, phim, hm, xp, yp,
+             tdk, pmb, rh, wl, tlr, (double*)grommit);
+
+    return (grommit);
+}
+
+psCell* psCellInFPA(const psPlane* fpaCoord,
+                    const psFPA* FPA)
+{
+    PS_PTR_CHECK_NULL(fpaCoord, NULL);
+    PS_PTR_CHECK_NULL(FPA, NULL);
+
+    psChip* tmpChip = NULL;
+    psPlane chipCoord;
+    psCell* outCell = NULL;
+
+    // Determine which chip contains the fpaCoords.
+    tmpChip = psChipInFPA(fpaCoord, FPA);
+    if (tmpChip == NULL) {
+        return(NULL);
+    }
+
+    // Convert to those chip coordinates.
+    psCoordFPAToChip(&chipCoord, fpaCoord, tmpChip);
+
+    // Determine which cell contains those chip coordinates.
+    outCell = psCellInChip(&chipCoord, tmpChip);
+
+    return (outCell);
+}
+
+psChip* psChipInFPA(const psPlane* fpaCoord,
+                    const psFPA* FPA)
+{
+    PS_PTR_CHECK_NULL(fpaCoord, NULL);
+    PS_PTR_CHECK_NULL(FPA, NULL);
+    PS_PTR_CHECK_NULL(FPA->chips, NULL);
+
+    psArray* chips = FPA->chips;
+    psS32 nChips = chips->n;
+    psPlane chipCoord;
+    psCell *tmpCell = NULL;
+
+    // Loop through every chip in this FPA.  Convert the original FPA
+    // coordinates to chip coordinates for that chip.  Then, determine if any
+    // cells in that chip contain those chip coordinates.
+
+    for (psS32 i = 0; i < nChips; i++) {
+        psChip* tmpChip = chips->data[i];
+        PS_PTR_CHECK_NULL(tmpChip, NULL);
+        PS_PTR_CHECK_NULL(tmpChip->fromFPA, NULL);
+
+        psPlaneTransformApply(&chipCoord, tmpChip->fromFPA, fpaCoord);
+
+        tmpCell = psCellInChip(&chipCoord, tmpChip);
+        if (tmpCell != NULL) {
+            return(tmpChip);
+        }
+    }
+
+    // XXX: Print warning here?
+    return (NULL);
+}
+
+psCell* psCellInChip(const psPlane* chipCoord,
+                     const psChip* chip)
+{
+    PS_PTR_CHECK_NULL(chipCoord, NULL);
+    PS_PTR_CHECK_NULL(chip, NULL);
+
+    psPlane cellCoord;
+    psArray* cells;
+
+    cells = chip->cells;
+    if (cells == NULL) {
+        return NULL;
+    }
+
+    // We loop over each cell in the chip.  We transform the chipCoord into
+    // a cellCoord for that cell and determine if that cellCoord is valid.
+    // If so, then we return that cell.
+
+    for (psS32 i = 0; i < cells->n; i++) {
+        psCell* tmpCell = (psCell* ) cells->data[i];
+        PS_PTR_CHECK_NULL(tmpCell, NULL);
+        PS_PTR_CHECK_NULL(tmpCell->fromChip, NULL);
+        psArray* readouts = tmpCell->readouts;
+
+        if (readouts != NULL) {
+            for (psS32 j = 0; j < readouts->n; j++) {
+                psReadout* tmpReadout = readouts->data[j];
+                PS_READOUT_CHECK_NULL(tmpReadout, NULL);
+
+                psPlaneTransformApply(&cellCoord,
+                                      tmpCell->fromChip,
+                                      chipCoord);
+
+                if (checkValidImageCoords(cellCoord.x,
+                                          cellCoord.y,
+                                          tmpReadout->image)) {
+                    return (tmpCell);
+                }
+            }
+        }
+    }
+
+    return (NULL);
+}
+
+psPlane* psCoordCellToChip(psPlane* outCoord,
+                           const psPlane* inCoord,
+                           const psCell* cell)
+{
+    PS_PTR_CHECK_NULL(inCoord, NULL);
+    PS_PTR_CHECK_NULL(cell, NULL);
+
+    return (psPlaneTransformApply(outCoord, cell->toChip, inCoord));
+}
+
+psPlane* psCoordChipToFPA(psPlane* outCoord,
+                          const psPlane* inCoord,
+                          const psChip* chip)
+{
+    PS_PTR_CHECK_NULL(inCoord, NULL);
+    PS_PTR_CHECK_NULL(chip, NULL);
+
+    return (psPlaneTransformApply(outCoord, chip->toFPA, inCoord));
+}
+
+psPlane* psCoordFPAToTP(psPlane* outCoord,
+                        const psPlane* inCoord,
+                        double color,
+                        double magnitude,
+                        const psFPA* fpa)
+{
+    PS_PTR_CHECK_NULL(inCoord, NULL);
+    PS_PTR_CHECK_NULL(fpa, NULL);
+
+    return(psPlaneDistortApply(outCoord, fpa->toTangentPlane, inCoord,
+                               color, magnitude));
+}
+
+/*****************************************************************************
+XXX: What about units for the (x,y) coords?
+ *****************************************************************************/
+psSphere* psCoordTPToSky(psSphere* outSphere,
+                         const psPlane* tpCoord,
+                         const psGrommit* grommit)
+{
+    PS_PTR_CHECK_NULL(tpCoord, NULL);
+    PS_PTR_CHECK_NULL(grommit, NULL);
+
+    double AOB = 0.0;
+    double ZOB = 0.0;
+    double HOB = 0.0;
+    if (outSphere == NULL) {
+        outSphere = (psSphere* ) psAlloc(sizeof(psSphere));
+    }
+
+    slaAopqk(tpCoord->x, tpCoord->y, (double*)grommit,
+             &AOB, &ZOB, &HOB, &outSphere->r, &outSphere->d);
+
+    return (outSphere);
+}
+
+psPlane* psCoordCellToFPA(psPlane* fpaCoord,
+                          const psPlane* cellCoord,
+                          const psCell* cell)
+{
+    PS_PTR_CHECK_NULL(cellCoord, NULL);
+    PS_PTR_CHECK_NULL(cell, NULL);
+
+    return (psPlaneTransformApply(fpaCoord, cell->toFPA, cellCoord));
+}
+
+psSphere* psCoordCellToSky(psSphere* skyCoord,
+                           const psPlane* cellCoord,
+                           double color,
+                           double magnitude,
+                           const psCell* cell)
+{
+    PS_PTR_CHECK_NULL(cellCoord, NULL);
+    PS_PTR_CHECK_NULL(cell, NULL);
+    PS_PTR_CHECK_NULL(cell->toFPA, NULL);
+    PS_PTR_CHECK_NULL(cell->parent, NULL);
+    PS_PTR_CHECK_NULL(cell->parent->parent, NULL);
+    PS_PTR_CHECK_NULL(cell->parent->parent->toTangentPlane, NULL);
+    PS_PTR_CHECK_NULL(cell->parent->parent->exposure, NULL);
+
+    psPlane* fpaCoord = NULL;
+    psPlane* tpCoord = NULL;
+    psFPA* parFPA = (cell->parent)->parent;
+    psGrommit* tmpGrommit = NULL;
+
+    // Convert the input cell coordinates to FPA coordinates.
+    fpaCoord = psPlaneTransformApply(fpaCoord, cell->toFPA, cellCoord);
+
+    // Convert the FPA coordinates to tangent plane Coordinates.
+    tpCoord = psPlaneDistortApply(tpCoord, parFPA->toTangentPlane,
+                                  fpaCoord, color, magnitude);
+
+    // Generate a grommit for this FPA.
+    tmpGrommit = psGrommitAlloc(parFPA->exposure);
+
+    // Convert the tangent plane Coordinates to sky coordinates.
+    skyCoord = psCoordTPToSky(skyCoord, tpCoord, tmpGrommit);
+
+    psFree(fpaCoord);
+    psFree(tpCoord);
+    psFree(tmpGrommit);
+
+    return(skyCoord);
+}
+
+psSphere* psCoordCellToSkyQuick(psSphere* outSphere,
+                                const psPlane* cellCoord,
+                                const psCell* cell)
+{
+    PS_PTR_CHECK_NULL(cellCoord, NULL);
+    PS_PTR_CHECK_NULL(cell, NULL);
+    PS_PTR_CHECK_NULL(cell->toSky, NULL);
+    PS_PTR_CHECK_NULL(cell->parent, NULL);
+    PS_PTR_CHECK_NULL(cell->parent->parent, NULL);
+    PS_PTR_CHECK_NULL(cell->parent->parent->projection, NULL);
+    if (cell->toSky) {
+        // XXX: Should we use toTP or toSky?
+        psLogMsg(__func__, PS_LOG_WARN,
+                 "WARNING: psCoordCellToSkyQuick(): The cell->toSky transform is ignored.  The cell->toTP transform is being used.");
+    }
+
+    psPlane *tpCoord = NULL;
+    psChip *chip = cell->parent;
+    psFPA *FPA = chip->parent;
+    psProjectionType oldProjectionType;
+
+    if (outSphere == NULL) {
+        outSphere = (psSphere* ) psAlloc(sizeof(psSphere));
+    }
+
+    // Determine the tangent plane coordinates.
+    tpCoord = psPlaneTransformApply(NULL, cell->toTP, cellCoord);
+
+    // Save the old projection type and set the new projection type to TAN.
+    oldProjectionType = FPA->projection->type;
+    FPA->projection->type = PS_PROJ_TAN;
+
+    // Deproject the tangent plane coordinates a sphere.
+    outSphere = psDeproject(tpCoord, FPA->projection);
+
+    // Restore old projection type.  Free memory.
+    FPA->projection->type = oldProjectionType;
+    psFree(tpCoord);
+
+    return (outSphere);
+}
+
+/*****************************************************************************
+XXX: What about units for the (x,y) coords?
+ *****************************************************************************/
+psPlane* psCoordSkyToTP(psPlane* tpCoord,
+                        const psSphere* in,
+                        const psGrommit* grommit)
+{
+    PS_PTR_CHECK_NULL(in, NULL);
+    PS_PTR_CHECK_NULL(grommit, NULL);
+
+    char* type = "RA";
+
+    if (tpCoord == NULL) {
+        tpCoord = (psPlane* ) psAlloc(sizeof(psPlane));
+    }
+
+    slaOapqk(type, in->r, in->d, (double*)grommit, &tpCoord->x, &tpCoord->y);
+
+    return(tpCoord);
+}
+
+
+psPlane* psCoordTPToFPA(psPlane* fpaCoord,
+                        const psPlane* tpCoord,
+                        double color,
+                        double magnitude,
+                        const psFPA* fpa)
+{
+    PS_PTR_CHECK_NULL(tpCoord, NULL);
+    PS_PTR_CHECK_NULL(fpa, NULL);
+    PS_PTR_CHECK_NULL(fpa->fromTangentPlane, NULL);
+
+    return (psPlaneDistortApply(fpaCoord, fpa->fromTangentPlane,
+                                tpCoord, color, magnitude));
+}
+
+psPlane* psCoordFPAToChip(psPlane* chipCoord,
+                          const psPlane* fpaCoord,
+                          const psChip* chip)
+{
+    PS_PTR_CHECK_NULL(fpaCoord, NULL);
+    PS_PTR_CHECK_NULL(chip, NULL);
+    PS_PTR_CHECK_NULL(chip->fromFPA, NULL);
+
+    chipCoord = psPlaneTransformApply(chipCoord, chip->fromFPA, fpaCoord);
+    return(chipCoord);
+}
+
+psPlane* psCoordChipToCell(psPlane* cellCoord,
+                           const psPlane* chipCoord,
+                           const psCell* cell)
+{
+    PS_PTR_CHECK_NULL(chipCoord, NULL);
+    PS_PTR_CHECK_NULL(cell, NULL);
+    PS_PTR_CHECK_NULL(cell->fromChip, NULL);
+
+    cellCoord = psPlaneTransformApply(cellCoord, cell->fromChip, chipCoord);
+    return(cellCoord);
+}
+
+psPlane* psCoordSkyToCell(psPlane* cellCoord,
+                          const psSphere* skyCoord,
+                          double color,
+                          double magnitude,
+                          const psCell* cell)
+{
+    PS_PTR_CHECK_NULL(skyCoord, NULL);
+    PS_PTR_CHECK_NULL(cell, NULL);
+    PS_PTR_CHECK_NULL(cell->parent, NULL);
+    PS_PTR_CHECK_NULL(cell->parent->parent, NULL);
+    PS_PTR_CHECK_NULL(cell->parent->parent->grommit, NULL);
+
+    psChip *parChip = cell->parent;
+    psFPA *parFPA = parChip->parent;
+    psGrommit* grommit = parFPA->grommit;
+
+    // Convert the skyCoords to tangent plane coords.
+    psPlane *tpCoord = psCoordSkyToTP(tpCoord, skyCoord, grommit);
+
+    // Convert the tangent plane coords to FPA coords.
+    psPlane *fpaCoord = psCoordTPToFPA(fpaCoord, tpCoord, color,
+                                       magnitude, parFPA);
+
+    // Convert the FPA coords to chip coords.
+    psPlane *chipCoord = psCoordFPAToChip(chipCoord, fpaCoord, parChip);
+
+    // Convert the chip coords to cell coords.
+    cellCoord = psCoordChipToCell(cellCoord, chipCoord, cell);
+
+    psFree(tpCoord);
+    psFree(fpaCoord);
+    psFree(chipCoord);
+
+    return (cellCoord);
+}
+
+psPlane* psCoordSkyToCellQuick(psPlane* cellCoord,
+                               const psSphere* skyCoord,
+                               const psCell* cell)
+{
+    PS_PTR_CHECK_NULL(skyCoord, NULL);
+    PS_PTR_CHECK_NULL(cell, NULL);
+    PS_PTR_CHECK_NULL(cell->parent, NULL);
+    PS_PTR_CHECK_NULL(cell->parent->parent, NULL);
+    PS_PTR_CHECK_NULL(cell->parent->parent->projection, NULL);
+    PS_PTR_CHECK_NULL(cell->toTP, NULL);
+    if (cell->toSky) {
+        // XXX: Should we use toTP or toSky?
+        psLogMsg(__func__, PS_LOG_WARN,
+                 "WARNING: psCoordSkyToCellQuick(): The cell->toSky transform is ignored.  The cell->toTP transform is being used.");
+    }
+
+    psPlane *tpCoord = NULL;
+    psChip *whichChip = cell->parent;
+    psFPA *whichFPA = whichChip->parent;
+    psProjectionType oldProjectionType;
+    psPlaneTransform *TPtoCell = NULL;
+
+    // Save the old projection type and set the new projection type to TAN.
+    oldProjectionType = whichFPA->projection->type;
+    whichFPA->projection->type = PS_PROJ_TAN;
+
+    if (cellCoord == NULL) {
+        cellCoord = (psPlane* ) psAlloc(sizeof(psPlane));
+    }
+
+    tpCoord = psProject(skyCoord, whichFPA->projection);
+
+    // generate an error if cell->toTP is not linear.
+    if (0 == p_psIsProjectionLinear(cell->toTP)) {
+        psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                PS_ERRORTEXT_psAstrometry_NONLINEAR_TRANSFORM,
+                "cell to tangent plane");
+    }
+
+    TPtoCell = p_psPlaneTransformLinearInvert(cell->toTP);
+    cellCoord = psPlaneTransformApply(cellCoord, TPtoCell, tpCoord);
+
+    // Restore old projection type.  Free memory.
+    whichFPA->projection->type = oldProjectionType;
+    psFree(tpCoord);
+    return (cellCoord);
+}
+
+
+
Index: /tags/ipp-1-X/bug123/psLib/src/astronomy/psAstrometry.h
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/astronomy/psAstrometry.h	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/astronomy/psAstrometry.h	(revision 22331)
@@ -0,0 +1,537 @@
+/** @file  psAstrometry.h
+*
+*  @brief This file defines the basic types for astronomical coordinate
+*  transformation
+*
+*  @ingroup AstroImage
+*
+*  @author GLG, MHPCC
+*
+*  @version $Revision: 1.39 $ $Name: not supported by cvs2svn $
+*  @date $Date: 2005-03-31 23:01:46 $
+*
+*  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+*/
+
+#ifndef PS_ASTROMETRY_H
+#define PS_ASTROMETRY_H
+
+#include "psType.h"
+#include "psImage.h"
+#include "psArray.h"
+#include "psList.h"
+#include "psFunctions.h"
+#include "psMetadata.h"
+#include "psCoord.h"
+#include "psPhotometry.h"
+
+struct psCell;
+struct psChip;
+struct psFPA;
+struct psExposure;
+
+/// @addtogroup AstroImage
+/// @{
+
+/** Wallace's Grommit
+ *
+ *  SLALib requires several elements to perform the transformations between
+ *  the tangent plane and the sky.  Pre-computing these quantities for each
+ *  exposure means that subsequent transformations are faster.  For historical
+ *  reasons, this structure is known colloquially as "Wallace's Grommit".
+ *
+ */
+typedef struct
+{
+    const double latitude;             ///< geodetic latitude (radians)
+    const double sinLat;               ///< sine of geodetic latitude
+    const double cosLat;               ///< cosine of geodetic latitude
+    const double abberationMag;        ///< magnitude of diurnal aberration vector
+    const double height;               ///< height (HM)
+    const double temperature;          ///< ambient temperature (TDK)
+    const double pressure;             ///< pressure (PMB)
+    const double humidity;             ///< relative humidity (RH)
+    const double wavelength;           ///< wavelength (WL)
+    const double lapseRate;            ///< lapse rate (TLR)
+    const double refractA;             ///< refraction constant A (radians)
+    const double refractB;             ///< refraction constant B (radians)
+    const double longitudeOffset;      ///< longitude + ... (radians)
+    const double siderealTime;         ///< local apparent sidereal time (radians)
+}
+psGrommit;
+
+/** Fixed Pattern Corrections
+ *
+ *  The fixed pattern is a correction to the general astrometric solution
+ *  formed by summing the residuals from many observations. The intent is to
+ *  correct for higher-order distortions in the camera system on a coarse
+ *  grid (larger than individual pixels, but smaller than a single cell).
+ *  Hence, in addition to the offsets, we need to specify the size and scale
+ *  of the grid in x and y as well as the origin of the grid.
+ */
+typedef struct
+{
+    psS32 nX;                            ///< Number of elements in x direction
+    psS32 nY;                            ///< Number of elements in y direction
+    double x0;                         ///< X Position of 0,0 corner on focal plane
+    double y0;                         ///< Y Position of 0,0 corner on focal plane
+    double xScale;                     ///< Scale of the grid in x direction
+    double yScale;                     ///< Scale of the grid in x direction
+    /// XXX: I added the following memvers to facilitate the psFreeing of the x,y data structures.
+    psS32 p_ps_xRows;                    ///< Number of rows in the x member
+    psS32 p_ps_xCols;                    ///< Number of cols in the x member
+    psS32 p_ps_yRows;                    ///< Number of rows in the y member
+    psS32 p_ps_yCols;                    ///< Number of cols in the y member
+    double **x;                        ///< The grid of offsets in x
+    double **y;                        ///< The grid of offsets in y
+}
+psFixedPattern;
+
+/** Readout data structure.
+ *
+ *  A readout is the result of a single read of a cell (or a portion thereof).
+ *  It contains a pointer to the pixel data, and additional pointers to the
+ *  objects found in the readout, and the readout metadata.  It also contains
+ *  the offset from the lower-left corner of the chip, in the case that the
+ *  CCD was windowed.
+ *
+ */
+typedef struct
+{
+    const psS32 col0;                  ///< Offset from the left of chip.
+    const psS32 row0;                  ///< Offset from the bottom of chip.
+
+    const int colParity;               ///< Column Readout Direction
+    const int rowParity;               ///< Row Readout Direction
+
+    const psU32 colBins;               ///< Amount of binning in x-dimension
+    const psU32 rowBins;               ///< Amount of binning in y-dimension
+
+    psImage* image;                    ///< Imaging area of readout
+    psImage* mask;                     ///< Mask area for readout
+    psList* objects;                   ///< Objects derived from Readout
+    psMetadata* metadata;              ///< Readout-level metadata
+}
+psReadout;
+
+/** Cell data structure
+ *
+ *  A cell consists of one or more readouts.  It also contains a pointer to the
+ *  cell's metadata, and its parent chip.  On the astrometry side, it also
+ *  contains coordinate transforms from the cell to chip, from the cell to
+ *  focal-plane, as well as a "quick and dirty" tranform from the cell to
+ *  sky coordinates.
+ *
+ */
+typedef struct
+{
+    const psS32 col0;                  ///< Offset from the left of chip
+    const psS32 row0;                  ///< Offset from the bottom of chip
+
+    psArray* readouts;                 ///< readouts from the cell
+
+    psMetadata* metadata;              ///< cell-level metadata
+
+    psPlaneTransform* toChip;          ///< transformations from cell to chip coordinates
+    psPlaneTransform* fromChip;        ///< transformations from cell to chip coordinates
+    psPlaneTransform* toFPA;           ///< transformations from cell to FPA coordinates
+    psPlaneTransform* toTP;            ///< transformations from cell to FPA coordinates
+    psPlaneTransform* toSky;           ///< transformations from cell to tangent plane coordinates
+
+    struct psChip* parent;             ///< chip in which contains this cell
+}
+psCell;
+
+/** Chip data structure
+ *
+ *  A chip consists of one or more cells (according to the number of amplifiers
+ *  on the CCD). It contains a pointer to the chip's metadata, and a pointer
+ *  to the parent focal plane.  For astrometry, it contains a coordinate
+ *  transform from the chip to the focal plane, and vis-versa.
+ *
+ */
+typedef struct psChip
+{
+    const psS32 col0;                  ///< Offset from the left of FPA
+    const psS32 row0;                  ///< Offset from the bottom of FPA
+
+    psArray* cells;                    ///< cells in the chip
+
+    psMetadata* metadata;              ///< chip-level metadata
+
+    psPlaneTransform* toFPA;           ///< transformation from chip to FPA coordinates
+    psPlaneTransform* fromFPA;         ///< transformation from FPA to chip coordinates
+
+    struct psFPA* parent;              ///< FPA which contains this chip
+}
+psChip;
+
+/** A Focal-Plane
+ *
+ *  A focal plane consists of one or more chips (according to the number of
+ *  contiguous silicon).  It contains pointers to the focal-plane's metadata
+ *  and the exposure information.  For astrometry, it contains a transformation
+ *  from the focal plane to the tangent plane and the fixed pattern residuals.
+ *  Since colors are involved in the transformation, it is necessary to specify
+ *  the color the transformation is defined.  We also include some values to
+ *  characterize the quality of the transformation: the root square deviation
+ *  for the x and y transformation fits, and the chi-squared for the
+ *  transformation fit.
+ *
+ */
+typedef struct psFPA
+{
+    psArray* chips;                    ///< chips in the focal plane array
+    psMetadata* metadata;              ///< focal-plane's metadata
+
+    psPlaneDistort* fromTangentPlane;  ///< transformation from tangent plane to focal plane
+    psPlaneDistort* toTangentPlane;    ///< transformation from focal plane to tangent plane
+    psFixedPattern* pattern;           ///< fixed pattern residual offsets
+
+    const struct psExposure* exposure; ///< information about this exposure
+    psGrommit *grommit;                ///< Wallace's grommit
+
+    psPhotSystem* colorPlus;           ///< Color reference
+    psPhotSystem* colorMinus;          ///< Color reference
+    psProjection *projection;          ///< projection
+
+    float rmsX;                        ///< RMS for x transformation fits
+    float rmsY;                        ///< RMS for y transformation fits
+    float chi2;                        ///< chi^2 of astrometric solution
+}
+psFPA;
+
+/** Observatory Information
+ *
+ *  A container for the observatory data that doesn't change per exposure.
+ *
+ */
+typedef struct
+{
+    const char* name;                  ///< Name of observatory
+    const double latitude;             ///< Latitude of observatory, east positive (degrees?)
+    const double longitude;            ///< Longitude of observatory (degrees?)
+    const double height;               ///< Height of observatory in meters
+    const double tlr;                  ///< Tropospheric Lapse Rate
+}
+psObservatory;
+
+/** Exposure Information
+ *
+ *  Several quantities from the telescope in order to make a first guess at
+ *  the astrometric solution.  From these quantities, further quantities can
+ *  be derivedand stored for later use.
+ *
+ */
+typedef struct psExposure
+{
+    const double ra;                   ///< Telescope boresight, right ascention
+    const double dec;                  ///< Telescope boresight, declination
+    const double hourAngle;            ///< Hour angle
+    const double zenithDistance;       ///< Zenith distance
+    const double azimuth;              ///< Azimuth
+    const psTime* time;                ///< Time of observation
+    const float rotAngle;              ///< Rotator position angle in degrees? XXX: see bug#209
+    const float temperature;           ///< Air temperature in Kelvin
+    const float pressure;              ///< Air pressure in mB
+    const float humidity;              ///< Relative humidity, for refraction
+    const float exposureTime;          ///< Exposure time
+    const float wavelength;            ///< Wavelength in microns
+    const psObservatory* observatory;  ///< Observatory data
+
+    /* Derived quantities */
+    const double lst;                  ///< Local Sidereal Time
+    const float positionAngle;         ///< Position angle
+    const float parallacticAngle;      ///< Parallactic angle
+    const float airmass;               ///< Airmass, calculated from zenith distance
+    const float parallacticFactor;     ///< Parallactic factor
+    const char* cameraName;            ///< name of camera which provided exposure
+    const char* telescopeName;         ///< name of telescope which provided exposure
+}
+psExposure;
+
+/** Allocator for psFixedPattern struct
+ *
+ *  Allocates a new psFixedPattern struct with the attributes coorsponding
+ *  to the parameters set to the said input values.
+ *
+ *  @return psFixedPattern*     New psFixedPattern struct.
+ */
+psFixedPattern* psFixedPatternAlloc(
+    double x0,           ///< X Position of 0,0 corner on focal plane
+    double y0,           ///< Y Position of 0,0 corner on focal plane
+    double xScale,       ///< Scale of the grid in x direction
+    double yScale,       ///< Scale of the grid in x direction
+    const psImage *x,    ///< The grid of offsets in x
+    const psImage *y     ///< The grid of offsets in y
+);
+
+
+/** Allocator for psExposure
+ *
+ *  We need several quantities from the telescope in order to make a first
+ *  guess at the astrometric solution. From these quantities, further
+ *  quantities can be derived and stored for later use.
+ *
+ *  @return     psExposure*    New psExposure struct
+ */
+psExposure* psExposureAlloc(
+    double ra,                         ///< Telescope boresight, right ascention
+    double dec,                        ///< Telescope boresight, declination
+    double hourAngle,                  ///< Hour angle
+    double zenithDistance,             ///< Zenith distance
+    double azimuth,                    ///< Azimuth
+    const psTime* time,                ///< time of observation
+    float rotAngle,                    ///< Rotator position angle
+    float temperature,                 ///< Temperature
+    float pressure,                    ///< Pressure
+    float humidity,                    ///< Relative humidity
+    float exposureTime,                ///< Exposure time
+    float wavelength,                  ///< wavelength
+    const psObservatory* observatory   ///< Observatory data
+);
+
+/** Allocator for psObservatory
+ *
+ *  This function shall construct a new psObservatory with attributes
+ *  cooresponding to the function parameters.
+ *
+ *  @return psObservatory*    new psObservatory struct
+ */
+psObservatory* psObservatoryAlloc(
+    const char* name,                  ///< Name of observatory
+    double latitude,                   ///< Latitude of observatory, east positive
+    double longitude,                  ///< Longitude of observatory
+    double height,                     ///< Height of observatory
+    double tlr                         ///< Tropospheric Lapse Rate
+);
+
+/** Allocator for psFPA
+ *
+ *  This function shall make an empty psFPA, with the nChips allocated
+ *  pointers to psChips being set to NULL; all other pointers in the structure
+ *  shall be initialized to NULL, apart from the grommit, which shall be
+ *  constructed on the basis of the exp parameter.
+ *
+ *  @return psFPA*    a newly allocated psFPA
+ */
+psFPA* psFPAAlloc(
+    psS32 nChips,                        ///< number of chips in the FPA
+    const psExposure* exp              ///< the exposure information
+);
+
+/** Allocates a psChip
+ *
+ *  This allocator shall make an empty psChip, with the nCells allocated
+ *  pointers to psCells being set to NULL; all other pointers in the structure
+ *  shall be initialized to NULL.
+ *
+ *  @return psChip*    newly allocated psChip
+ */
+psChip* psChipAlloc(
+    psS32 nCells,                        ///< number of cells in Chip
+    psFPA* parentFPA                   ///< parent FPA
+);
+
+/** Allocates a psCell
+ *
+ *  The constructor shall make an empty psCell, with the nReadouts allocated
+ *  pointers to psReadouts being set to NULL; all other pointers in the
+ *  structure shall be initialized to NULL.
+ *
+ *  @return psCell*    newly allocated psCell
+ */
+psCell* psCellAlloc(
+    psS32 nReadouts,                     ///< number of readouts in cell
+    psChip* parentChip                 ///< parent Chip
+);
+
+/** Allocates a psReadout
+ *
+ *  All pointers in the structure other than the image shall be initialized
+ *  to NULL.
+ *
+ *  @return psReadout*    newly allocated psReadout with all internal pointers set to NULL
+ */
+psReadout* psReadoutAlloc();
+
+/** Allocates a Wallace's Grommit structure.
+ *
+ *  The psGrommit is calculated from telescope information for the particular
+ *  exposure.
+ *
+ *  @return psGrommit* New grommit structure.
+ */
+psGrommit* psGrommitAlloc(
+    const psExposure* exp              ///< the cooresponding exposure structure.
+);
+
+/** Find cooresponding cell for given FPA coordinate
+ *
+ *  @return psCell*    the cell cooresponding to the coord in FPA
+ */
+psCell* psCellInFPA(
+    const psPlane* coord,              ///< the coordinate in FPA plane
+    const psFPA* FPA                   ///< the FPA to search for the cell
+);
+
+/** Find cooresponding chip for given FPA coordinate
+ *
+ *  @return psChip*    the chip cooresponding to coord
+ */
+psChip* psChipInFPA(
+    const psPlane* coord,              ///< the coordinate in FPA plane
+    const psFPA* FPA                   ///< the FPA to search for the cell
+);
+
+/** Find cooresponding cell for given Chip coordinate
+ *
+ *  @return psCell*    the cell cooresponding to coord
+ */
+psCell* psCellInChip(
+    const psPlane* coord,              ///< the coordinate in Chip plane
+    const psChip* chip                 ///< the chip to search for the cell
+);
+
+/** Translate a cell coordinate into a chip coordinate
+ *
+ *  @return psPlane*    the resulting chip coordinate
+ */
+psPlane* psCoordCellToChip(
+    psPlane* out,                      ///< a plane struct to recycle. If NULL, a new struct is created
+    const psPlane* in,                 ///< the coordinate within Cell
+    const psCell* cell                 ///< the Cell in interest
+);
+
+/** Translate a chip coordinate into a FPA coordinate
+ *
+ *  @return psPlane*    the resulting FPA coordinate
+ */
+psPlane* psCoordChipToFPA(
+    psPlane* out,                      ///< a plane struct to recycle. If NULL, a new struct is created
+    const psPlane* in,                 ///< the coordinate within Chip
+    const psChip* chip                 ///< the chip in interest
+);
+
+/** Translate a FPA coordinate into a Tangent Plane coordinate
+ *
+ *  @return psPlane*    the resulting Tangent Plane coordinate
+ */
+psPlane* psCoordFPAToTP(
+    psPlane* out,                      ///< a plane struct to recycle. If NULL, a new struct is created
+    const psPlane* in,                 ///< the coordinate within FPA
+    double color,                      ///< Color of source
+    double magnitude,                  ///< Magnitude of source
+    const psFPA* fpa                   ///< the FPA in interest
+);
+
+/** Translate a Tangent Plane coordinate into a Sky coordinate
+ *
+ *  @return psSphere*    the resulting Sky coordinate
+ */
+psSphere* psCoordTPToSky(
+    psSphere* out,                     ///< a sphere struct to recycle. If NULL, a new struct is created
+    const psPlane* in,                 ///< the coordinate within Tangent Plane
+    const psGrommit* grommit           ///< the grommit of the tangent plane
+);
+
+/** Translate a cell coordinate into a FPA coordinate
+ *
+ *  @return psPlane*    the resulting FPA coordinate
+ */
+psPlane* psCoordCellToFPA(
+    psPlane* out,                      ///< a plane struct to recycle. If NULL, a new struct is created
+    const psPlane* in,                 ///< the coordinate within cell
+    const psCell* cell                 ///< the cell in interest
+);
+
+/** Translate a cell coordinate into a Sky coordinate
+ *
+ *  @return psSphere*    the resulting Sky coordinate
+ */
+psSphere* psCoordCellToSky(
+    psSphere* out,                     ///< a sphere struct to recycle. If NULL, a new struct is created
+    const psPlane* in,                 ///< the coordinate within cell
+    double color,                      ///< Color of source
+    double magnitude,                  ///< Magnitude of source
+    const psCell* cell                 ///< the cell in interest
+);
+
+/** Translate a cell coordinate into a Sky coordinate using a 'quick and
+ *  dirty' method
+ *
+ *  @return psSphere*    the resulting Sky coordinate
+ */
+psSphere* psCoordCellToSkyQuick(
+    psSphere* out,                     ///< a sphere struct to recycle. If NULL, a new struct is created
+    const psPlane* in,                 ///< the coordinate within cell
+    const psCell* cell                 ///< the cell in interest
+);
+
+/** Translate a Sky coordinate into a Tangent Plane coordinate
+ *
+ *  @return psPlane*    the resulting Tangent Plane coordinate
+ */
+psPlane* psCoordSkyToTP(
+    psPlane* out,                      ///< a plane struct to recycle. If NULL, a new struct is created
+    const psSphere* in,                ///< the sky coordinate
+    const psGrommit* grommit           ///< the grommit
+);
+
+/** Translate a Tangent Plane coordinate into a FPA coordinate
+ *
+ *  @return psPlane*    the resulting FPA coordinate
+ */
+psPlane* psCoordTPToFPA(
+    psPlane* out,                      ///< a plane struct to recycle. If NULL, a new struct is created
+    const psPlane* in,                 ///< the coordinate within tangent plane
+    double color,                      ///< Color of source
+    double magnitude,                  ///< Magnitude of source
+    const psFPA* fpa                   ///< the FPA of interest
+);
+
+/** Translate a FPA coordinate into a chip coordinate
+ *
+ *  @return psPlane*    the resulting chip coordinate
+ */
+psPlane* psCoordFPAToChip(
+    psPlane* out,                      ///< a plane struct to recycle. If NULL, a new struct is created
+    const psPlane* in,                 ///< the FPA coordinate
+    const psChip* chip                 ///< the chip of interest
+);
+
+/** Translate a chip coordinate into a cell coordinate
+ *
+ *  @return psPlane*    the resulting cell coordinate
+ */
+psPlane* psCoordChipToCell(
+    psPlane* out,                      ///< a plane struct to recycle. If NULL, a new struct is created
+    const psPlane* in,                 ///< the Chip coordinate
+    const psCell* cell                 ///< the cell of interest
+);
+
+/** Translate a sky coordinate into a cell coordinate
+ *
+ *  @return psPlane*    the resulting cell coordinate
+ */
+psPlane* psCoordSkyToCell(
+    psPlane* out,                      ///< a plane struct to recycle. If NULL, a new struct is created
+    const psSphere* in,                ///< the Sky coordinate
+    double color,                      ///< Color of source
+    double magnitude,                  ///< Magnitude of source
+    const psCell* cell                 ///< the cell of interest
+);
+
+/** Translate a sky coordinate into a cell coordinate using a 'quick and
+ *  dirty' method
+ *
+ *  @return psPlane*    the resulting cell coordinate
+ */
+psPlane* psCoordSkyToCellQuick(
+    psPlane* out,                      ///< a plane struct to recycle. If NULL, a new struct is created
+    const psSphere* in,                ///< the Sky coordinate
+    const psCell* cell                 ///< the cell of interest
+);
+
+
+#endif
Index: /tags/ipp-1-X/bug123/psLib/src/astronomy/psAstronomyErrors.dat
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/astronomy/psAstronomyErrors.dat	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/astronomy/psAstronomyErrors.dat	(revision 22331)
@@ -0,0 +1,68 @@
+#
+#  This file is used to generate psAstronomyErrors.h content
+#
+#  Format is:
+#  ERRORNAME(one word)    ERROR_TEXT
+#
+#  N.B. in code, the ERRORNAME appears as PS_ERRORTEXT_ERRORNAME
+####################################################################
+psTime_FILE_NOT_FOUND                  Failed to open file %s.
+psTime_FILE_TOO_MANY_ROWS              Too many rows found in file %s. Max number of rows allowed is %d.
+psTime_TIME_POSTDATES_TABLE            Specified psTime postdates (%g) the table of %s information.
+psTime_TIME_PREDATES_TABLE             Specified psTime predates (%g) the table of %s information.
+psTime_TIME_POSTDATES_TABLES           Specified psTime postdates (%g) all tables of %s information.
+psTime_TIME_PREDATES_TABLES            Specified psTime predates (%g) all tables of %s information.
+psTime_TABLE_DUPLICATE_ROWS            The %s table was found to have two rows of the same time value.
+psTime_TYPE_UNKNOWN                    Specified type, %d, is not supported.
+psTime_TYPE_INCORRECT                  Specified type, %d, is incorrect.
+psTime_TYPE_MISMATCH                   Specified psTime parameters must have same type.
+psTime_GET_TOD_FAILED                  Failed to determine the current time from gettimeofday function.
+psTime_CONVERT_TIME_TO_STRING_FAILED   Failed to convert a time via strftime function.
+psTime_APPEND_MSEC_FAILED              Failed to append millisecond to time string with snprintf function.
+psTime_USEC_INVALID                    The psTime usec attribute value, %u, is invalid.  Must be less than 1e6.
+psTime_ISOTIME_MALFORMED               Specified ISO Time string, '%s', is malformed.  Must be in 'YYYY-MM-DDThh:mm:ss.sss' format.
+psTime_INTERPOLATION_FAILED            Failed time table interpolation.
+psTime_INTERPOLATION_FAILED_NAME       Failed time table interpolation for '%s'.
+psTime_LOOKUP_METADATA_FAILED          Failed find '%s' in time metadata.
+psTime_BAD_TABLE_COUNT                 Incorrect number of table files entered. Found: %d. Expected: %d.
+psTime_BAD_VECTOR                      Incorrect vector size. Size: %d, Expected %d.
+#
+psCoord_PROJECTION_TYPE_UNDEFINED      The projection type, %s, is undefined.
+psCoord_PROJECTION_TYPE_UNKNOWN        The projection type, %d, is unknown.
+psCoord_UNITS_UNKNOWN                  Specified units, 0x%x, is not supported.
+psCoord_OFFSET_MODE_UNKNOWN            Specified offset mode, 0x%x, is not supported.
+psCoord_INVALID_MJD                    Specified time is less than 1900.
+#
+psAstrometry_NONLINEAR_TRANSFORM       The %s transfrom is not linear.  Only linear transforms are supported.
+#
+psMetadata_METATYPE_INVALID            Specified psMetadataType, %d, is not supported.
+psMetadata_FORMAT_INVALID              Specified print format, %%%c, is not supported.
+psMetadata_METATYPE_MISMATCH           Specified psMetadataType, %d, is incorrect. Expected %d.
+psMetadata_ADD_LIST_FAILED             Failed to add metadata item, %s, to items list.
+psMetadata_ADD_TABLE_FAILED            Failed to add metadata item, %s, to items table.
+psMetadata_REMOVE_LIST_FAILED          Failed to remove metadata item, %s, from metadata list.
+psMetadata_REMOVE_LIST_INDEX_FAILED    Failed to remove metadata item, at index %d, from metadata list.
+psMetadata_REMOVE_TABLE_FAILED         Failed to remove metadata item, %s, from metadata table.
+psMetadata_ADD_COLLECTION_FAILED       Failed to add metadata item, %s, to metadata collection list.
+psMetadata_ADD_FAILED                  Failed to add metadata item to metadata collection list.
+psMetadata_FIND_FAILED                 Could not find metadata item, %s.
+psMetadata_FIND_INDEX_FAILED           Could not find metadata item at index %d.
+psMetadata_DUPLICATE_NOT_ALLOWED       Duplicate metadata item name is not allowed.  Use a psMetadataFlags option to allow such action.
+psMetadata_REGEX_INVALID               Specified regular expression is invalid.  %s.
+psMetadata_LOCATION_INVALID            Specified location, %d, is invalid.
+#
+psMetadataIO_TYPE_INVALID              Specified type, %d, is not supported.
+psMetadataIO_EXTNUM_NOTPOSITIVE        Specified extension number, %d, is invalid.  Value must be positive if no extension name is given.
+psMetadataIO_FITS_METATYPE_INVALID     Specified FITS metadata type, %c, is not supported.
+psMetadataIO_ADD_FAILED                Failed to add metadata item, %s.
+psMetadataIO_FILE_OPEN_FAILED          Failed to open file '%s'. Check if it exists and it has the proper permissions.
+psMetadataIO_FILE_MULTIPLE_CHAR        More than one '%c' character not allowed.  Found on line %u of %s.
+psMetadataIO_FILE_ELEMENT_NULL         Failed to read a metadata %s on line %u of %s.
+psMetadataIO_FILE_TYPE_INVALID         Metadata type '%s', found on line %u of %s, is not invalid.
+psMetadataIO_OVERWRITE_ITEM            Duplicate Metadata item, %s, found on line %u of %s.  Overwrite not allowed.
+psMetadataIO_PARSE_FAILED              Failed to parse the value '%s' of metadata item %s, type %s, on line %u of %s.
+psMetadataIO_NO_NAME                   Failed to find key 'name' in table on line %u of %s.
+psMetadataIO_TYPE_INVALID_LINE_FILE    Specified type, %s, is not supported on line %u of %s.
+psMetadataIO_TAG_MISMATCH              Start tag, %s and end tag, %s do not agree.
+psMetadataIO_TAG_UNKNOWN               Invalid end tag name, %s.
+
Index: /tags/ipp-1-X/bug123/psLib/src/astronomy/psAstronomyErrors.h
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/astronomy/psAstronomyErrors.h	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/astronomy/psAstronomyErrors.h	(revision 22331)
@@ -0,0 +1,87 @@
+/** @file  psAstronomyErrors.h
+ *
+ *  @brief Contains the error text for the astronomy functions
+ *
+ *  @ingroup ErrorHandling
+ *
+ *  @author Robert DeSonia, MHPCC
+ *
+ *  @version $Revision: 1.14 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-03-17 19:01:01 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+
+#ifndef PS_ASTRONOMY_ERRORS_H
+#define PS_ASTRONOMY_ERRORS_H
+
+/* N.B., lines between '//~Start' and '//~End' are automatic generated from
+ * the template following the '//~Start'.  The template is used to generate
+ * the other lines by, for each error text in psAstronomyErrors.dat, the following
+ * substitutions are made:
+ *     $1  The error text macro name (first word in the psAstronomyErrors.dat lines)
+ *     $2  The error text (rest of the line in psAstronomyErrors.dat)
+ *     $n  The order of the source line in psAstronomyErrors.dat (comments excluded)
+ *
+ * DO NOT EDIT THE LINES BETWEEN //~Start and //~End!  ANY CHANGES WILL BE OVERWRITTEN.
+ */
+
+//~Start #define PS_ERRORTEXT_$1 "$2"
+#define PS_ERRORTEXT_psTime_FILE_NOT_FOUND "Failed to open file %s."
+#define PS_ERRORTEXT_psTime_FILE_TOO_MANY_ROWS "Too many rows found in file %s. Max number of rows allowed is %d."
+#define PS_ERRORTEXT_psTime_TIME_POSTDATES_TABLE "Specified psTime postdates (%g) the table of %s information."
+#define PS_ERRORTEXT_psTime_TIME_PREDATES_TABLE "Specified psTime predates (%g) the table of %s information."
+#define PS_ERRORTEXT_psTime_TIME_POSTDATES_TABLES "Specified psTime postdates (%g) all tables of %s information."
+#define PS_ERRORTEXT_psTime_TIME_PREDATES_TABLES "Specified psTime predates (%g) all tables of %s information."
+#define PS_ERRORTEXT_psTime_TABLE_DUPLICATE_ROWS "The %s table was found to have two rows of the same time value."
+#define PS_ERRORTEXT_psTime_TYPE_UNKNOWN "Specified type, %d, is not supported."
+#define PS_ERRORTEXT_psTime_TYPE_INCORRECT "Specified type, %d, is incorrect."
+#define PS_ERRORTEXT_psTime_TYPE_MISMATCH "Specified psTime parameters must have same type."
+#define PS_ERRORTEXT_psTime_GET_TOD_FAILED "Failed to determine the current time from gettimeofday function."
+#define PS_ERRORTEXT_psTime_CONVERT_TIME_TO_STRING_FAILED "Failed to convert a time via strftime function."
+#define PS_ERRORTEXT_psTime_APPEND_MSEC_FAILED "Failed to append millisecond to time string with snprintf function."
+#define PS_ERRORTEXT_psTime_USEC_INVALID "The psTime usec attribute value, %u, is invalid.  Must be less than 1e6."
+#define PS_ERRORTEXT_psTime_ISOTIME_MALFORMED "Specified ISO Time string, '%s', is malformed.  Must be in 'YYYY-MM-DDThh:mm:ss.sss' format."
+#define PS_ERRORTEXT_psTime_INTERPOLATION_FAILED "Failed time table interpolation."
+#define PS_ERRORTEXT_psTime_INTERPOLATION_FAILED_NAME "Failed time table interpolation for '%s'."
+#define PS_ERRORTEXT_psTime_LOOKUP_METADATA_FAILED "Failed find '%s' in time metadata."
+#define PS_ERRORTEXT_psTime_BAD_TABLE_COUNT "Incorrect number of table files entered. Found: %d. Expected: %d."
+#define PS_ERRORTEXT_psTime_BAD_VECTOR "Incorrect vector size. Size: %d, Expected %d."
+#define PS_ERRORTEXT_psCoord_PROJECTION_TYPE_UNDEFINED "The projection type, %s, is undefined."
+#define PS_ERRORTEXT_psCoord_PROJECTION_TYPE_UNKNOWN "The projection type, %d, is unknown."
+#define PS_ERRORTEXT_psCoord_UNITS_UNKNOWN "Specified units, 0x%x, is not supported."
+#define PS_ERRORTEXT_psCoord_OFFSET_MODE_UNKNOWN "Specified offset mode, 0x%x, is not supported."
+#define PS_ERRORTEXT_psCoord_INVALID_MJD "Specified time is less than 1900."
+#define PS_ERRORTEXT_psAstrometry_NONLINEAR_TRANSFORM "The %s transfrom is not linear.  Only linear transforms are supported."
+#define PS_ERRORTEXT_psMetadata_METATYPE_INVALID "Specified psMetadataType, %d, is not supported."
+#define PS_ERRORTEXT_psMetadata_FORMAT_INVALID "Specified print format, %%%c, is not supported."
+#define PS_ERRORTEXT_psMetadata_METATYPE_MISMATCH "Specified psMetadataType, %d, is incorrect. Expected %d."
+#define PS_ERRORTEXT_psMetadata_ADD_LIST_FAILED "Failed to add metadata item, %s, to items list."
+#define PS_ERRORTEXT_psMetadata_ADD_TABLE_FAILED "Failed to add metadata item, %s, to items table."
+#define PS_ERRORTEXT_psMetadata_REMOVE_LIST_FAILED "Failed to remove metadata item, %s, from metadata list."
+#define PS_ERRORTEXT_psMetadata_REMOVE_LIST_INDEX_FAILED "Failed to remove metadata item, at index %d, from metadata list."
+#define PS_ERRORTEXT_psMetadata_REMOVE_TABLE_FAILED "Failed to remove metadata item, %s, from metadata table."
+#define PS_ERRORTEXT_psMetadata_ADD_COLLECTION_FAILED "Failed to add metadata item, %s, to metadata collection list."
+#define PS_ERRORTEXT_psMetadata_ADD_FAILED "Failed to add metadata item to metadata collection list."
+#define PS_ERRORTEXT_psMetadata_FIND_FAILED "Could not find metadata item, %s."
+#define PS_ERRORTEXT_psMetadata_FIND_INDEX_FAILED "Could not find metadata item at index %d."
+#define PS_ERRORTEXT_psMetadata_DUPLICATE_NOT_ALLOWED "Duplicate metadata item name is not allowed.  Use a psMetadataFlags option to allow such action."
+#define PS_ERRORTEXT_psMetadata_REGEX_INVALID "Specified regular expression is invalid.  %s."
+#define PS_ERRORTEXT_psMetadata_LOCATION_INVALID "Specified location, %d, is invalid."
+#define PS_ERRORTEXT_psMetadataIO_TYPE_INVALID "Specified type, %d, is not supported."
+#define PS_ERRORTEXT_psMetadataIO_EXTNUM_NOTPOSITIVE "Specified extension number, %d, is invalid.  Value must be positive if no extension name is given."
+#define PS_ERRORTEXT_psMetadataIO_FITS_METATYPE_INVALID "Specified FITS metadata type, %c, is not supported."
+#define PS_ERRORTEXT_psMetadataIO_ADD_FAILED "Failed to add metadata item, %s."
+#define PS_ERRORTEXT_psMetadataIO_FILE_OPEN_FAILED "Failed to open file '%s'. Check if it exists and it has the proper permissions."
+#define PS_ERRORTEXT_psMetadataIO_FILE_MULTIPLE_CHAR "More than one '%c' character not allowed.  Found on line %u of %s."
+#define PS_ERRORTEXT_psMetadataIO_FILE_ELEMENT_NULL "Failed to read a metadata %s on line %u of %s."
+#define PS_ERRORTEXT_psMetadataIO_FILE_TYPE_INVALID "Metadata type '%s', found on line %u of %s, is not invalid."
+#define PS_ERRORTEXT_psMetadataIO_OVERWRITE_ITEM "Duplicate Metadata item, %s, found on line %u of %s.  Overwrite not allowed."
+#define PS_ERRORTEXT_psMetadataIO_PARSE_FAILED "Failed to parse the value '%s' of metadata item %s, type %s, on line %u of %s."
+#define PS_ERRORTEXT_psMetadataIO_NO_NAME "Failed to find key 'name' in table on line %u of %s."
+#define PS_ERRORTEXT_psMetadataIO_TYPE_INVALID_LINE_FILE "Specified type, %s, is not supported on line %u of %s."
+#define PS_ERRORTEXT_psMetadataIO_TAG_MISMATCH "Start tag, %s and end tag, %s do not agree."
+#define PS_ERRORTEXT_psMetadataIO_TAG_UNKNOWN "Invalid end tag name, %s."
+//~End
+
+#endif
Index: /tags/ipp-1-X/bug123/psLib/src/astronomy/psCoord.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/astronomy/psCoord.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/astronomy/psCoord.c	(revision 22331)
@@ -0,0 +1,1225 @@
+/** @file  psCoord.c
+*
+*  @brief Contains basic coordinate transformation definitions and operations
+*
+*  This file defines the basic types for astronomical coordinate
+*  transformation
+*
+*  @ingroup CoordinateTransform
+*
+*  @author GLG, MHPCC
+*
+*  @version $Revision: 1.65 $ $Name: not supported by cvs2svn $
+*  @date $Date: 2005-04-19 05:46:24 $
+*
+*  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+*/
+/******************************************************************************/
+/*  INCLUDE FILES                                                             */
+/******************************************************************************/
+#include "psType.h"
+#include "psCoord.h"
+#include "psMemory.h"
+#include "psTime.h"
+#include "psConstants.h"
+#include "psError.h"
+#include "psLogMsg.h"
+#include "psAstronomyErrors.h"
+#include "psAstrometry.h"
+#include "psMatrix.h"
+#include <math.h>
+#include <float.h>
+/******************************************************************************/
+/*  DEFINE STATEMENTS                                                         */
+/******************************************************************************/
+
+// Modified Julian Day 01/01/1900 00:00:00
+#define MJD_1900 15021.0
+
+// Days in Julian century
+#define JULIAN_CENTURY 36525.0
+
+/******************************************************************************/
+/*  TYPE DEFINITIONS                                                          */
+/******************************************************************************/
+
+// None
+
+/*****************************************************************************/
+/*  GLOBAL VARIABLES                                                         */
+/*****************************************************************************/
+
+// None
+
+/*****************************************************************************/
+/*  FILE STATIC VARIABLES                                                    */
+/*****************************************************************************/
+
+// None
+
+/*****************************************************************************/
+/*  FUNCTION IMPLEMENTATION - LOCAL                                          */
+/*****************************************************************************/
+
+/*****************************************************************************/
+/* FUNCTION IMPLEMENTATION - PUBLIC                                          */
+/*****************************************************************************/
+static void planeFree(psPlane *p)
+{
+    // There are non dynamic allocated items
+}
+
+/*****************************************************************************
+p_psPlaneTransformLinearInvert(transform): : this is a private function which
+simply inverts the supplied psPlaneTransform transform.  It assumes that
+"transform" is linear.
+ 
+This program assumes that the inverse of the following linear equations:
+        X2 = A + (B * X1) + (C * Y1);
+        Y2 = D + (E * X1) + (F * Y1);
+is
+        Y1 = (Y2 - ((E/B) * X2) - D + ((E*A)/B)) / (F - ((C*E)/B));
+        X1 = (Y2 - ((F/C) * X2) - D + ((F*A)/C)) / (E - ((F*B)/C));
+or
+ X1 = (-D + ((F*A)/C)) / (E - ((F*B)/C)) +
+      (X2 * -((F/C) / (E - ((F*B)/C)))) +
+      (Y2 * (1.0 / (E - ((F*B)/C))));
+ Y1 = (-D + ((E*A)/B))/(F - ((C*E)/B)) +
+      (X2 * -((E/B) / (F - ((C*E)/B)))) +
+      (Y2 * (1.0 / (F - ((C*E)/B))));
+ 
+XXX: Since thre is now a general psPlaneTransformInvert() function, we
+should rename this.
+ *****************************************************************************/
+psPlaneTransform *p_psPlaneTransformLinearInvert(psPlaneTransform *transform)
+{
+    PS_PTR_CHECK_NULL(transform, 0);
+    PS_PTR_CHECK_NULL(transform->x, 0);
+    PS_PTR_CHECK_NULL(transform->y, 0);
+
+    psF64 A = 0.0;
+    psF64 B = 0.0;
+    psF64 C = 0.0;
+    psF64 D = 0.0;
+    psF64 E = 0.0;
+    psF64 F = 0.0;
+
+    A = transform->x->coeff[0][0];
+    if (transform->x->nX >= 2) {
+        B = transform->x->coeff[1][0];
+    }
+    if (transform->x->nY >= 2) {
+        C = transform->x->coeff[0][1];
+    }
+    D = transform->y->coeff[0][0];
+    if (transform->y->nX >= 2) {
+        E = transform->y->coeff[1][0];
+    }
+    if (transform->y->nY >= 2) {
+        F = transform->y->coeff[0][1];
+    }
+
+    psPlaneTransform *out = psPlaneTransformAlloc(2, 2);
+
+    out->x->coeff[0][0] = (-D + ((F*A)/C)) / (E - ((F*B)/C));
+    out->x->coeff[1][0] = -(F/C) / (E - ((F*B)/C));
+    out->x->coeff[0][1] =  1.0 / (E - ((F*B)/C));
+    out->y->coeff[0][0] = (-D + ((E*A)/B)) / (F - ((C*E)/B));
+    out->y->coeff[1][0] = -(E/B) / (F - ((C*E)/B));
+    out->y->coeff[0][1] =  1.0 / (F - ((C*E)/B));
+
+    return(out);
+}
+
+/*****************************************************************************
+p_psIsProjectionLinear(): this is a private function which simply determines
+if the supplied psPlaneTransform transform is linear: if any of the
+cooefficients of order 2 are higher are non-zero, then it is not linear.
+ *****************************************************************************/
+psS32 p_psIsProjectionLinear(psPlaneTransform *transform)
+{
+    PS_PTR_CHECK_NULL(transform, 0);
+    PS_PTR_CHECK_NULL(transform->x, 0);
+    PS_PTR_CHECK_NULL(transform->y, 0);
+
+    for (psS32 i=0;i<(transform->x->nX);i++) {
+        for (psS32 j=0;j<(transform->x->nY);j++) {
+            if (transform->x->coeff[i][j] != 0.0) {
+                if (!(((i == 0) && (j == 0)) ||
+                        ((i == 0) && (j == 1)) ||
+                        ((i == 1) && (j == 0)))) {
+                    return(0);
+                }
+            }
+        }
+    }
+
+    for (psS32 i=0;i<(transform->y->nX);i++) {
+        for (psS32 j=0;j<(transform->y->nY);j++) {
+            if (transform->y->coeff[i][j] != 0.0) {
+                if (!(((i == 0) && (j == 0)) ||
+                        ((i == 0) && (j == 1)) ||
+                        ((i == 1) && (j == 0)))) {
+                    return(0);
+                }
+            }
+        }
+    }
+
+    return(1);
+}
+
+// XXX: Must test psPlaneAlloc() and planeFree().
+// XXX: Must rewrite code and tests to use these functions.
+psPlane* psPlaneAlloc(void)
+{
+    psPlane *p = psAlloc(sizeof(psPlane));
+
+    psMemSetDeallocator(p, (psFreeFcn) planeFree);
+    return(p);
+}
+
+
+static void sphereFree(psSphere *s)
+{
+    // There are non dynamic allocated items
+}
+
+psSphere* psSphereAlloc(void)
+{
+    psSphere *s = psAlloc(sizeof(psSphere));
+
+    psMemSetDeallocator(s, (psFreeFcn) sphereFree);
+    return(s);
+}
+
+static void planeTransformFree(psPlaneTransform *pt)
+{
+    psFree(pt->x);
+    psFree(pt->y);
+}
+
+psPlaneTransform* psPlaneTransformAlloc(psS32 n1, psS32 n2)
+{
+    PS_INT_CHECK_NON_NEGATIVE(n1, NULL);
+    PS_INT_CHECK_NON_NEGATIVE(n2, NULL);
+
+    psPlaneTransform *pt = psAlloc(sizeof(psPlaneTransform));
+    pt->x = psDPolynomial2DAlloc(n1, n2, PS_POLYNOMIAL_ORD);
+    pt->y = psDPolynomial2DAlloc(n1, n2, PS_POLYNOMIAL_ORD);
+
+    psMemSetDeallocator(pt, (psFreeFcn) planeTransformFree);
+    return(pt);
+}
+
+psPlane* psPlaneTransformApply(psPlane* out,
+                               const psPlaneTransform* transform,
+                               const psPlane* coords)
+{
+    PS_PTR_CHECK_NULL(transform, NULL);
+    PS_PTR_CHECK_NULL(transform->x, NULL);
+    PS_PTR_CHECK_NULL(transform->y, NULL);
+    PS_PTR_CHECK_NULL(coords, NULL);
+
+    if (out == NULL) {
+        out = (psPlane* ) psAlloc(sizeof(psPlane));
+    }
+    out->x = psDPolynomial2DEval(
+                 transform->x,
+                 coords->x,
+                 coords->y
+             );
+    out->y = psDPolynomial2DEval(
+                 transform->y,
+                 coords->x,
+                 coords->y
+             );
+    return (out);
+}
+
+static void planeDistortFree(psPlaneDistort *pt)
+{
+    psFree(pt->x);
+    psFree(pt->y);
+}
+
+psPlaneDistort* psPlaneDistortAlloc(psS32 n1, psS32 n2, psS32 n3, psS32 n4)
+{
+    PS_INT_CHECK_NON_NEGATIVE(n1, NULL);
+    PS_INT_CHECK_NON_NEGATIVE(n2, NULL);
+    PS_INT_CHECK_NON_NEGATIVE(n3, NULL);
+    PS_INT_CHECK_NON_NEGATIVE(n4, NULL);
+
+    psPlaneDistort *pt = psAlloc(sizeof(psPlaneDistort));
+    pt->x = psDPolynomial4DAlloc(n1, n2, n3, n4, PS_POLYNOMIAL_ORD);
+    pt->y = psDPolynomial4DAlloc(n1, n2, n3, n4, PS_POLYNOMIAL_ORD);
+
+    psMemSetDeallocator(pt, (psFreeFcn) planeDistortFree);
+    return(pt);
+}
+
+/******************************************************************************
+This transformation takes into account parameters beyond an objects spatial
+coordinates: term3 and term4 (magnitude and color).
+ *****************************************************************************/
+psPlane* psPlaneDistortApply(psPlane* out,
+                             const psPlaneDistort* transform,
+                             const psPlane* coords,
+                             float color,
+                             float magnitude)
+{
+    PS_PTR_CHECK_NULL(transform, NULL);
+    PS_PTR_CHECK_NULL(transform->x, NULL);
+    PS_PTR_CHECK_NULL(transform->y, NULL);
+    PS_PTR_CHECK_NULL(coords, NULL);
+
+    if (out == NULL) {
+        out = (psPlane* ) psAlloc(sizeof(psPlane));
+    }
+    out->x = psDPolynomial4DEval(
+                 transform->x,
+                 coords->x,
+                 coords->y,
+                 color,
+                 magnitude
+             );
+    out->y = psDPolynomial4DEval(
+                 transform->y,
+                 coords->x,
+                 coords->y,
+                 color,
+                 magnitude
+             );
+    return (out);
+}
+
+/******************************************************************************
+alpha is LONGITUDE
+delta is LATITUDE
+ 
+    alphaP: Take the target pole in the source system; calculate its LONGITUDE
+     in the target system.  That longitude is alphaP.
+    DeltaP: Take the target pole in the source system; calculate its LATITUDE
+     in the target system.  That longitude is deltaP.
+    phiP:   This is the LONGITUDE of the ascending node in the target system.
+ *****************************************************************************/
+psSphereTransform* psSphereTransformAlloc(psF64 alphaP,
+        psF64 deltaP,
+        psF64 phiP)
+{
+    psSphereTransform* tmp = (psSphereTransform* ) psAlloc(sizeof(psSphereTransform));
+
+    tmp->cosDeltaP = cos(deltaP);
+    tmp->sinDeltaP = sin(deltaP);
+    tmp->alphaP = alphaP;
+    tmp->phiP = phiP;
+
+    return (tmp);
+}
+
+/******************************************************************************
+XXX: Private Function.
+ 
+piNormalize(): take an input angle in radians and convert it to the range 0:2*PI.
+ *****************************************************************************/
+psF32 piNormalize(psF32 angle)
+{
+    while (angle < FLT_EPSILON) {
+        angle+=PS_PI*2;
+    }
+
+    while (angle >= (PS_PI*2)) {
+        angle-=PS_PI*2;
+    }
+    return(angle);
+}
+
+/******************************************************************************
+XXX: We convert Right Ascension angles to the range 0:PI.  Is that acceptable?
+XXX: Should we do something for Declination as well?
+ *****************************************************************************/
+psSphere* psSphereTransformApply(psSphere* out,
+                                 const psSphereTransform* transform,
+                                 const psSphere* coord)
+{
+    PS_PTR_CHECK_NULL(transform, NULL);
+    PS_PTR_CHECK_NULL(coord, NULL);
+
+    if (out == NULL) {
+        out = (psSphere* ) psAlloc(sizeof(psSphere));
+    }
+
+    psF64 alpha = coord->r;
+    psF64 delta = coord->d;
+    psF64 alphaMinusAlphaP = alpha - transform->alphaP;
+
+    psF64 eq55 = (sin(delta) * transform->cosDeltaP) -
+                 (cos(delta) * transform->sinDeltaP * sin(alphaMinusAlphaP));
+    psF64 eq56 = (cos(delta) * transform->cosDeltaP * sin(alphaMinusAlphaP)) +
+                 (sin(delta) * transform->sinDeltaP);
+    psF64 eq57 = cos(delta) * cos(alphaMinusAlphaP);
+
+    psF64 theta = asin(eq55);
+    psF64 phi = atan2(eq56, eq57) + transform->phiP;
+    out->r = piNormalize(phi);
+    out->d = theta;
+
+    return(out);
+}
+
+psSphereTransform* psSphereTransformICRSToEcliptic(psTime *time)
+{
+    psF64 T;
+
+    // Check for null parameter
+    PS_PTR_CHECK_NULL(time, NULL);
+
+    // Convert psTime to MJD
+    psF64 MJD = psTimeToMJD(time);
+
+    // Check the specified MJD is greater than 1900
+    if ( MJD < MJD_1900 ) {
+        psError(PS_ERR_BAD_PARAMETER_TYPE,true,PS_ERRORTEXT_psCoord_INVALID_MJD);
+        return NULL;
+    }
+
+    // Calculate number of Julian centuries since 1900
+    T = ( MJD - MJD_1900 ) / JULIAN_CENTURY;
+
+    psF64 alphaP = 0.0;
+    psF64 deltaP = DEG_TO_RAD(23.0) +
+                   MIN_TO_RAD(27.0) +
+                   SEC_TO_RAD(8.26) -
+                   (SEC_TO_RAD(46.845) * T) -
+                   (SEC_TO_RAD(0.0059) * T * T) +
+                   (SEC_TO_RAD(0.00181) * T * T * T);
+    psF64 phiP = 0.0;
+
+    // Don't neglect the minus sign on deltaP (bug 244):
+    return (psSphereTransformAlloc(alphaP, deltaP, phiP));
+}
+
+
+psSphereTransform* psSphereTransformEclipticToICRS(psTime *time)
+{
+    psF64 T;
+
+    // Check for null parameter
+    PS_PTR_CHECK_NULL(time, NULL);
+
+    // Convert psTime to MJD
+    psF64 MJD = psTimeToMJD(time);
+
+    // Check the specified MJD is greater than 1900
+    if ( MJD < MJD_1900 ) {
+        psError(PS_ERR_BAD_PARAMETER_TYPE,true,PS_ERRORTEXT_psCoord_INVALID_MJD);
+        return NULL;
+    }
+
+    // Calculate number of Julian centuries since 1900
+    T = ( MJD - MJD_1900 ) / JULIAN_CENTURY;
+
+    psF64 alphaP = 0.0;
+    psF64 deltaP = DEG_TO_RAD(23.0) +
+                   MIN_TO_RAD(27.0) +
+                   SEC_TO_RAD(8.26) -
+                   (SEC_TO_RAD(46.845) * T) -
+                   (SEC_TO_RAD(0.0059) * T * T) +
+                   (SEC_TO_RAD(0.00181) * T * T * T);
+    psF64 phiP = 0.0;
+
+    return (psSphereTransformAlloc(alphaP, -deltaP, phiP));
+}
+
+// XXX: This is bug 245: alphaP swaps with phiP from psSphereTransformGalacticToICRS()
+psSphereTransform* psSphereTransformGalacticToICRS(void)
+{
+    psF64 alphaP = DEG_TO_RAD(32.93192);
+    psF64 deltaP = DEG_TO_RAD(-62.87175);
+    psF64 phiP = DEG_TO_RAD(282.85948);
+
+    return (psSphereTransformAlloc(alphaP, deltaP, phiP));
+}
+
+psSphereTransform* psSphereTransformICRSToGalactic(void)
+{
+    psF64 alphaP = DEG_TO_RAD(282.85948);
+    psF64 deltaP = DEG_TO_RAD(62.87175);
+    psF64 phiP = DEG_TO_RAD(32.93192);
+
+    return (psSphereTransformAlloc(alphaP, deltaP, phiP));
+}
+
+void projectionFree(psProjection *p)
+{
+    // There are no dynamically allocated items
+}
+
+psProjection* psProjectionAlloc(
+    psF64 R,
+    psF64 D,
+    psF64 Xs,
+    psF64 Ys,
+    psProjectionType type)
+{
+    psProjection *p = psAlloc(sizeof(psProjection));
+    p->D = D;
+    p->R = R;
+    p->Xs = Xs;
+    p->Ys = Ys;
+    p->type = type;
+
+    psMemSetDeallocator(p, (psFreeFcn) projectionFree);
+    return(p);
+}
+
+psPlane* psProject(const psSphere* coord,
+                   const psProjection* projection)
+{
+    PS_PTR_CHECK_NULL(coord, NULL);
+    PS_PTR_CHECK_NULL(projection, NULL);
+
+    psF64   theta = 0.0;
+    psF64   phi   = 0.0;
+
+    // Allocate return value
+    psPlane* out = psPlaneAlloc();
+
+    // Convert to projection spherical coordinate system
+    theta = asin( sin(coord->d)*sin(projection->D) +
+                  cos(coord->d)*cos(projection->D)*cos(coord->r-projection->R));
+    phi = atan2( -1.0*cos(coord->d)*sin(coord->r-projection->R),
+                 sin(coord->d)*cos(projection->D) - cos(coord->d)*sin(projection->D)*cos(coord->r-projection->R) );
+
+    // Perform the specified projection
+    // Gnomonic projection
+    if (projection->type == PS_PROJ_TAN) {
+        out->x = (cos(theta)*sin(phi))/sin(theta);
+        out->y = (-1.0*cos(theta)*cos(phi))/sin(theta);
+        // Othrographic projection
+    } else if (projection->type == PS_PROJ_SIN) {
+        out->x = cos(theta)*sin(phi);
+        out->y = -1.0*cos(theta)*cos(phi);
+        // Hammer-Aitoff projection
+    } else if ( projection->type == PS_PROJ_AIT) {
+        psF64 zeta = 1.0/sqrt(0.5*(1.0+cos(theta)*cos(phi/2.0)));
+        out->x = 2.0*zeta*cos(theta)*sin(phi/2.0);
+        out->y = zeta*sin(theta);
+        // Parabolic projection
+    } else if ( projection->type == PS_PROJ_PAR) {
+        out->x = phi*(2.0*cos(2.0*theta/3.0) - 1.0);
+        out->y = PS_PI*sin(theta/3.0);
+    } else {
+        psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                PS_ERRORTEXT_psCoord_PROJECTION_TYPE_UNKNOWN,
+                projection->type);
+        psFree(out);
+        return NULL;
+    }
+
+    // Apply plate scales
+    out->x *= projection->Xs;
+    out->y *= projection->Ys;
+
+    // Return output
+    return out;
+}
+
+psSphere* psDeproject(const psPlane* coord,
+                      const psProjection* projection)
+{
+    PS_PTR_CHECK_NULL(coord, NULL);
+    PS_PTR_CHECK_NULL(projection, NULL);
+
+    psF64  theta = 0.0;
+    psF64  phi   = 0.0;
+
+    // Allocate return sphere structure
+    psSphere* out = psSphereAlloc();
+
+    // Remove plate scales
+    psF64  x = coord->x/projection->Xs;
+    psF64  y = coord->y/projection->Ys;
+
+    // Perform inverse projection
+    // Gnonomic deprojection
+    if ( projection->type == PS_PROJ_TAN) {
+        phi = atan(-1.0*x/y);
+        theta = atan(1.0/sqrt(x*x+y*y));
+        // Orhtographic deprojection
+    } else if ( projection->type == PS_PROJ_SIN) {
+        phi = atan((-1.0*x)/y);
+        theta = atan( sqrt(1.0-(x*x+y*y)) / sqrt(x*x+y*y));
+        // Hammer-Aitoff deprojection
+    } else if ( projection->type == PS_PROJ_AIT) {
+        psF64 z = sqrt(1.0 - ((x/4.0)*(x/4.0)) - ((y/2.0)*(y/2.0)));
+        phi = 2.0*atan((z*x) / (2.0*(2.0*z*z-1.0)) );
+        theta = asin(y*z);
+        // Parabolic deprojection
+    } else if ( projection->type == PS_PROJ_PAR) {
+        psF64 rho = y/PS_PI;
+        phi = x/(1.0 - 4.0*rho*rho);
+        theta = 3.0*asin(rho);
+        // Invalid deprojection type
+    } else {
+        psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                PS_ERRORTEXT_psCoord_PROJECTION_TYPE_UNKNOWN,
+                projection->type);
+        psFree(out);
+        return NULL;
+    }
+
+    // Convert from projection spherical coordinates
+    out->d = asin( sin(theta)*sin(projection->D) +
+                   cos(theta)*cos(projection->D)*cos(phi) );
+    out->r = projection->R + atan2( -1.0*cos(theta)*sin(phi),
+                                    sin(theta)*cos(projection->D) -
+                                    cos(theta)*sin(projection->D)*cos(phi) );
+
+    // Return sphere coordinate
+    return out;
+}
+
+/******************************************************************************
+The basic idea is to project both positions onto the linear plane, with
+position1 at the center, then calculate the linear offset between those
+projections.
+ 
+XXX: Do I need to check for unacceptable transformation parameters?  Maybe,
+     if the points are on the North/South Pole, etc?
+ 
+XXX: Do I need to somehow scale this projection?
+ 
+XXX: Does PS_LINEAR mode make sense?  The result must be returned in psSphere
+     regardless of the mode.
+ 
+XXX: How to compound errors?
+ *****************************************************************************/
+psSphere* psSphereGetOffset(const psSphere* position1,
+                            const psSphere* position2,
+                            psSphereOffsetMode mode,
+                            psSphereOffsetUnit unit)
+{
+    PS_PTR_CHECK_NULL(position1, NULL);
+    PS_PTR_CHECK_NULL(position2, NULL);
+
+    // Check positions near 90 degree and issue warnings if necessary
+    if (position1->d >= DEG_TO_RAD(90.0)) {
+        psLogMsg(__func__, PS_LOG_WARN,
+                 "WARNING: psDeproject(): position1->d is larger than 90 degrees.  Returning NULL.");
+        return NULL;
+    }
+    if (position2->d >= DEG_TO_RAD(90.0)) {
+        psLogMsg(__func__, PS_LOG_WARN,
+                 "WARNING: psDeproject(): position2->d is larger than 90 degrees.  Returning NULL.");
+        return NULL;
+    }
+
+    // Allocate return structure
+    psSphere* tmp = psSphereAlloc();
+
+    // Mode is LINEAR - Use first position as projection center and project second point
+    // onto tangent plane, set point projected into psSphere structure x->r y->d
+    if (mode == PS_LINEAR) {
+        psProjection* proj = psProjectionAlloc(position1->r,
+                                               position1->d,
+                                               1.0,
+                                               1.0,
+                                               PS_PROJ_TAN);
+
+        // Perform projection onto tangent plane
+        psPlane* lin = psProject(position2, proj);
+
+        // Set return values
+        tmp->r = lin->x;
+        tmp->d = lin->y;
+
+        // Free data structures allocated
+        psFree(proj);
+        psFree(lin);
+
+        // Mode is SPHERICAL - Get difference between positiion 1 and position 2 and convert
+        // offset value from radians to desired units and return
+    } else if (mode == PS_SPHERICAL) {
+        tmp->r = position2->r - position1->r;
+        tmp->d = position2->d - position1->d;
+
+        // Wrap these to an acceptable range.  This assumes that all
+        // angles are in radians.
+        tmp->r = fmod(tmp->r, 2*PS_PI);
+        tmp->d = fmod(tmp->d, 2*PS_PI);
+        tmp->rErr = 0.0;
+        tmp->dErr = 0.0;
+
+        // Convert to desired units
+        if (unit == PS_ARCSEC) {
+            tmp->r = RAD_TO_SEC(tmp->r);
+            tmp->d = RAD_TO_SEC(tmp->d);
+        } else if (unit == PS_ARCMIN) {
+            tmp->r = RAD_TO_MIN(tmp->r);
+            tmp->d = RAD_TO_MIN(tmp->d);
+        } else if (unit == PS_DEGREE) {
+            tmp->r = RAD_TO_DEG(tmp->r);
+            tmp->d = RAD_TO_DEG(tmp->d);
+        } else if (unit == PS_RADIAN) {}
+        else {
+            psError(PS_ERR_BAD_PARAMETER_VALUE, true,
+                    PS_ERRORTEXT_psCoord_UNITS_UNKNOWN,
+                    unit);
+            psFree(tmp);
+            return NULL;
+        }
+        // Invalid mode
+    } else {
+
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true,
+                PS_ERRORTEXT_psCoord_OFFSET_MODE_UNKNOWN,
+                mode);
+        psFree(tmp);
+        return NULL;
+    }
+
+    // Return value
+    return tmp;
+}
+
+/******************************************************************************
+XXX: Do we need to check for unacceptable transformation parameters?  Maybe,
+     if the points are on the North/South Pole, etc?
+ 
+XXX: Do we need to somehow scale this projection?
+ 
+XXX: I copied the algorithm from the ADD exactly.
+ 
+XXX: Should we compound errors?
+ *****************************************************************************/
+
+psSphere* psSphereSetOffset(const psSphere* position,
+                            const psSphere* offset,
+                            psSphereOffsetMode mode,
+                            psSphereOffsetUnit unit)
+{
+    PS_PTR_CHECK_NULL(position, NULL);
+    PS_PTR_CHECK_NULL(offset, NULL);
+
+    psSphere* tmp;
+    psF64 tmpR = 0.0;
+    psF64 tmpD = 0.0;
+
+    // If mode is linear then set position to projection center
+    // and offset to linear coordinate then deproject to obtain
+    // new sphere coordinate
+    if (mode == PS_LINEAR) {
+
+        // Allocate plane coordinate and set coordinate
+        psPlane*  lin = psPlaneAlloc();
+        lin->x = offset->r;
+        lin->y = offset->d;
+
+        // Allocate and set projection structure
+        psProjection* proj = psProjectionAlloc(position->r,
+                                               position->d,
+                                               1.0,
+                                               1.0,
+                                               PS_PROJ_TAN);
+
+        // Project tangent plane coord to spherical coord
+        tmp = psDeproject(lin, proj);
+
+        // Free data structures used
+        psFree(proj);
+        psFree(lin);
+
+        // If mode is spherical then convert offset to radians, add the offset
+        // to the position and wrap to 0 to 2pi
+    } else if (mode == PS_SPHERICAL) {
+
+        // Convert offset unit to radians
+        if (unit == PS_ARCSEC) {
+            tmpR = SEC_TO_RAD(offset->r);
+            tmpD = SEC_TO_RAD(offset->d);
+        } else if (unit == PS_ARCMIN) {
+            tmpR = MIN_TO_RAD(offset->r);
+            tmpD = MIN_TO_RAD(offset->d);
+        } else if (unit == PS_DEGREE) {
+            tmpR = DEG_TO_RAD(offset->r);
+            tmpD = DEG_TO_RAD(offset->d);
+        } else if (unit == PS_RADIAN) {
+            tmpR = offset->r;
+            tmpD = offset->d;
+        } else {
+            psError(PS_ERR_BAD_PARAMETER_VALUE, true,
+                    PS_ERRORTEXT_psCoord_UNITS_UNKNOWN,
+                    unit);
+            return NULL;
+        }
+
+        // Allocate sphere structure to return
+        tmp = psSphereAlloc();
+
+        // Add offset and wrap to 0 to 2PI if necessary
+        tmp->r = position->r + tmpR;
+        tmp->r = fmod(tmp->r, 2.0*PS_PI);
+        tmp->d = position->d + tmpD;
+        tmp->d = fmod(tmp->d, 2.0*PS_PI);
+        tmp->rErr = 0.0;
+        tmp->dErr = 0.0;
+
+        // Invalid mode report error
+    } else {
+
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true,
+                PS_ERRORTEXT_psCoord_OFFSET_MODE_UNKNOWN,
+                mode);
+        return NULL;
+    }
+
+    return tmp;
+}
+
+
+
+/******************************************************************************
+psSpherePrecess(coords, fromTime, toTime):
+ 
+XXX: Use static memory for tmpST.
+ *****************************************************************************/
+psSphere *psSpherePrecess(psSphere *coords,
+                          const psTime *fromTime,
+                          const psTime *toTime)
+{
+    // Check input for NULL pointers
+    PS_PTR_CHECK_NULL(coords, NULL);
+    PS_PTR_CHECK_NULL(fromTime, NULL);
+    PS_PTR_CHECK_NULL(toTime, NULL);
+
+    // Calculate Julian centuries
+    psF64 fromMJD = psTimeToMJD(fromTime);
+    psF64 toMJD = psTimeToMJD(toTime);
+    psF64 T = (toMJD - fromMJD) / JULIAN_CENTURY;
+
+    // Calculate conversion constants
+    psF64 alphaP = DEG_TO_RAD(90.0) - ((DEG_TO_RAD(0.6406161) * T) +
+                                       (DEG_TO_RAD(0.0000839) * T * T) +
+                                       (DEG_TO_RAD(0.000005) * T * T * T));
+
+    psF64 deltaP = (DEG_TO_RAD(0.5567530) * T) -
+                   (DEG_TO_RAD(0.0001185) * T * T) -
+                   (DEG_TO_RAD(0.0000116) * T * T * T);
+
+    psF64 phiP = DEG_TO_RAD(90.0) + ((DEG_TO_RAD(0.6406161) * T) +
+                                     (DEG_TO_RAD(0.0003041) * T * T) +
+                                     (DEG_TO_RAD(0.0000051) * T * T * T));
+
+    // Create transform with proper constants
+    psSphereTransform *tmpST = psSphereTransformAlloc(alphaP, deltaP, phiP);
+
+    // Apply transform to coordinates
+    psSphere *out = psSphereTransformApply(NULL, tmpST, coords);
+
+    psFree(tmpST);
+
+    return(out);
+}
+
+/*****************************************************************************
+multiplyDPoly2D(trans1, trans2): Takes two 2-D polynomials as input and
+multiplies them.  Basically, for each non-zero coeff in the trans1 coeff[][]
+array, you must multiply by all non-zero coeffs in trans2.
+ 
+XXX: Inefficient in that the out polynomial is allocated every time.
+ *****************************************************************************/
+
+psDPolynomial2D *multiplyDPoly2D(psDPolynomial2D *trans1,
+                                 psDPolynomial2D *trans2)
+{
+    //TRACE: printf("multiplyDPoly2D(%d %d: %d %d)\n", trans1->nX, trans1->nY, trans2->nX, trans2->nY);
+    psS32 orderX = (trans1->nX + trans2->nX) - 1;
+    psS32 orderY = (trans1->nY + trans2->nY) - 1;
+
+    psDPolynomial2D *out = psDPolynomial2DAlloc(orderX, orderY, PS_POLYNOMIAL_ORD);
+    //TRACE: printf("Creating poly (%d, %d)\n", orderX, orderY);
+    for (psS32 i = 0 ; i < out->nX; i++) {
+        for (psS32 j = 0 ; j < out->nY; j++) {
+            out->coeff[i][j] = 0.0;
+            out->mask[i][j] = 0;
+        }
+    }
+
+    for (psS32 t1x = 0 ; t1x < trans1->nX ; t1x++) {
+        for (psS32 t1y = 0 ; t1y < trans1->nY ; t1y++) {
+            if (0.0 != trans1->coeff[t1x][t1y]) {
+                for (psS32 t2x = 0 ; t2x < trans2->nX ; t2x++) {
+                    for (psS32 t2y = 0 ; t2y < trans2->nY ; t2y++) {
+                        /* Possible debug-only macro which checks these coords?
+                        if ((t1x+t2x) >= orderX)
+                            printf("BAD 1\n");
+                        if ((t1y+t2y) >= orderY)
+                            printf("BAD 2\n");
+                        */
+                        out->coeff[t1x+t2x][t1y+t2y]+= (trans1->coeff[t1x][t1y] * trans2->coeff[t2x][t2y]);
+                    }
+                }
+            }
+        }
+    }
+    return(out);
+}
+
+
+/*****************************************************************************
+psPlaneTransformCombine(out, trans1, trans2)
+ 
+XXX: Much room for optimization.  Currently, we call the polyMultiply
+routine far too many times.
+ *****************************************************************************/
+psPlaneTransform *psPlaneTransformCombine(psPlaneTransform *out,
+        const psPlaneTransform *trans1,
+        const psPlaneTransform *trans2)
+{
+    PS_PTR_CHECK_NULL(trans1, NULL);
+    PS_PTR_CHECK_NULL(trans2, NULL);
+    //TRACE: printf("psPlaneTransformCombine(%d, %d, %d, %d: %d, %d, %d, %d)\n", trans1->x->nX, trans1->x->nY, trans1->y->nX, trans1->y->nY, trans2->x->nX, trans2->x->nY, trans2->y->nX, trans2->y->nY);
+    //
+    // Determine the size of the new psPlaneTransform.
+    //
+    // PS_MAX(  Number of x terms in T2->x * number of x terms in T1->x,
+    //          Number of y terms in T2->x * number of x terms in T1->y,
+    psS32 orderXnX = PS_MAX((trans2->x->nX * trans1->x->nX),
+                            (trans2->x->nY * trans1->y->nX));
+    psS32 orderXnY = PS_MAX((trans2->x->nX * trans1->x->nY),
+                            (trans2->x->nY * trans1->y->nY));
+
+    psS32 orderYnX = PS_MAX((trans2->y->nX * trans1->x->nX),
+                            (trans2->y->nY * trans1->y->nX));
+    psS32 orderYnY = PS_MAX((trans2->y->nX * trans1->x->nY),
+                            (trans2->y->nY * trans1->y->nY));
+    psS32 orderX = PS_MAX(orderXnX, orderYnX);
+    psS32 orderY = PS_MAX(orderXnY, orderYnY);
+
+    //
+    // Allocate the new psPlaneTransform, if necessary.
+    //
+    psPlaneTransform *myPT = NULL;
+    if (out == NULL) {
+        myPT = psPlaneTransformAlloc(orderX, orderY);
+    } else {
+        if ((out->x->nX == orderX) && (out->x->nY == orderY) &&
+                (out->y->nX == orderX) && (out->y->nY == orderY)) {
+            myPT = out;
+        } else {
+            psFree(out);
+            myPT = psPlaneTransformAlloc(orderX, orderY);
+        }
+    }
+
+    //
+    // Initialize the new psPlaneTransform, if necessary.
+    //
+    for (psS32 i = 0 ; i < orderX ; i++) {
+        for (psS32 j = 0 ; j < orderY ; j++) {
+            myPT->x->coeff[i][j] = 0.0;
+            myPT->x->mask[i][j] = 0;
+            myPT->y->coeff[i][j] = 0.0;
+            myPT->y->mask[i][j] = 0;
+        }
+    }
+
+    //
+    // For each term (a * x^i * y^j) in trans2, we substitute the appropriate
+    // equation from trans1, and raise it to the appropriate power.  This is
+    // done via the multiplyDPoly2D().  The result is a polynomial (currPoly)
+    // and its coefficients are added into the myPT coeff matrix.
+    //
+    // XXX: This is horribly inefficient in that the trans1 polys are repeatedly
+    // multiplied against themselves.  This can easily be improved.
+    //
+
+    for (psS32 t2x = 0 ; t2x < trans2->x->nX ; t2x++) {
+        for (psS32 t2y = 0 ; t2y < trans2->x->nY ; t2y++) {
+            psDPolynomial2D *currPoly = psDPolynomial2DAlloc(1, 1, PS_POLYNOMIAL_ORD);
+
+            currPoly->coeff[0][0] = 1.0;
+            currPoly->mask[0][0] = 0;
+            psDPolynomial2D *newPoly = NULL;
+
+            if (trans2->x->mask[t2x][t2y] == 0) {
+                // Must raise trans1->y to the t2y-power.
+                for (psS32 c = 0 ; c < t2y; c++) {
+                    newPoly = multiplyDPoly2D(currPoly, trans1->y);
+                    psFree(currPoly);
+                    currPoly = newPoly;
+                }
+
+                // Must raise trans1->x to the t2x-power.
+                for (psS32 c = 0 ; c < t2x; c++) {
+                    newPoly = multiplyDPoly2D(currPoly, trans1->x);
+                    psFree(currPoly);
+                    currPoly = newPoly;
+                }
+
+                // Set the appropriate coeffs in myPT->x
+                for (psS32 i = 0 ; i < currPoly->nX ; i++) {
+                    for (psS32 j = 0 ; j < currPoly->nY ; j++) {
+                        myPT->x->coeff[i][j]+= currPoly->coeff[i][j] * trans2->x->coeff[t2x][t2y];
+                    }
+                }
+            }
+            psFree(currPoly);
+        }
+    }
+
+
+    for (psS32 t2x = 0 ; t2x < trans2->y->nX ; t2x++) {
+        for (psS32 t2y = 0 ; t2y < trans2->y->nY ; t2y++) {
+            psDPolynomial2D *currPoly = psDPolynomial2DAlloc(1, 1, PS_POLYNOMIAL_ORD);
+            currPoly->coeff[0][0] = 1.0;
+            currPoly->mask[0][0] = 0;
+            psDPolynomial2D *newPoly = NULL;
+
+            if (trans2->y->mask[t2x][t2y] == 0) {
+
+                // Must raise trans1->y to the t2y-power.
+                for (psS32 c = 0 ; c < t2y; c++) {
+                    newPoly = multiplyDPoly2D(currPoly, trans1->y);
+                    psFree(currPoly);
+                    currPoly = newPoly;
+                }
+
+                // Must raise trans1->x to the t2x-power.
+                for (psS32 c = 0 ; c < t2x; c++) {
+                    newPoly = multiplyDPoly2D(currPoly, trans1->x);
+                    psFree(currPoly);
+                    currPoly = newPoly;
+                }
+
+                // Set the appropriate coeffs in myPT->x
+                for (psS32 i = 0 ; i < currPoly->nX ; i++) {
+                    for (psS32 j = 0 ; j < currPoly->nY ; j++) {
+                        myPT->y->coeff[i][j]+= currPoly->coeff[i][j] * trans2->y->coeff[t2x][t2y];
+                    }
+                }
+            }
+            psFree(currPoly);
+        }
+    }
+
+    //TRACE: printf("Exiting combine()\n");
+    return(myPT);
+}
+
+/*****************************************************************************
+psPlaneTransformFit(trans, source, dest, nRejIter, sigmaClip)
+ 
+XXX: What about nRejIter?  Iterations?
+XXX: Use static vectors for internal data.
+ *****************************************************************************/
+bool psPlaneTransformFit(psPlaneTransform *trans,
+                         const psArray *source,
+                         const psArray *dest,
+                         int nRejIter,
+                         float sigmaClip)
+{
+    PS_PTR_CHECK_NULL(trans, NULL);
+    PS_PTR_CHECK_NULL(source, NULL);
+    PS_PTR_CHECK_NULL(dest, NULL);
+
+    psS32 numCoords = PS_MIN(source->n, dest->n);
+    psS32 order = PS_MAX(trans->x->nX, trans->x->nY);
+
+    //
+    // Create fake polynomial to use in evaluation
+    //
+    psDPolynomial2D *fakePoly = psDPolynomial2DAlloc(order, order, PS_POLYNOMIAL_ORD);
+    for (int i = 0; i < order; i++) {
+        for (int j = 0; j < order; j++) {
+            fakePoly->coeff[i][j] = 1.0;
+            fakePoly->mask[i][j] = 1;       // Mask all coefficients; unmask to evaluate
+        }
+    }
+
+    //
+    // Initialize the matrix and vectors
+    //
+    psS32 nCoeff = order * (order + 1) / 2; // Number of polynomial coefficients
+    psImage *matrix = psImageAlloc(nCoeff, nCoeff, PS_TYPE_F64); // Matrix for solution
+    psVector *xVector = psVectorAlloc(nCoeff, PS_TYPE_F64); // Vector for solution in x
+    psVector *yVector = psVectorAlloc(nCoeff, PS_TYPE_F64); // Vector for solution in y
+    for (psS32 i = 0; i < nCoeff; i++) {
+        for (psS32 j = 0; j < nCoeff; j++) {
+            matrix->data.F64[i][j] = 0.0;
+        }
+        xVector->data.F64[i] = 0.0;
+        yVector->data.F64[i] = 0.0;
+    }
+
+    //
+    // Iterate over the grid points
+    //
+    for (psS32 g = 0; g < numCoords; g++) {
+        // Iterate over the polynomial coefficients, accumulating the matrix and vectors
+
+        for (psS32 i = 0, ijIndex = 0; i < order; i++) {
+            for (psS32 j = 0; j < order - i; j++, ijIndex++) {
+                fakePoly->mask[i][j] = 0;
+                psF64 xIn = ((psPlane *) source->data[g])->x;
+                psF64 yIn = ((psPlane *) source->data[g])->y;
+                psF64 xOut = ((psPlane *) dest->data[g])->x;
+                psF64 yOut = ((psPlane *) dest->data[g])->y;
+                psF64 ijPoly = psDPolynomial2DEval(fakePoly, xIn, yIn);
+                fakePoly->mask[i][j] = 1;
+
+                for (psS32 m = 0, mnIndex = 0; m < order; m++) {
+                    for (psS32 n = 0; n < order - m; n++, mnIndex++) {
+                        fakePoly->mask[m][n] = 0;
+                        psF64 mnPoly = psDPolynomial2DEval(fakePoly, xIn, yIn);
+                        fakePoly->mask[m][n] = 1;
+
+                        matrix->data.F64[ijIndex][mnIndex] += ijPoly * mnPoly;
+                    }
+                }
+
+                xVector->data.F64[ijIndex] += ijPoly * xOut;
+                yVector->data.F64[ijIndex] += ijPoly * yOut;
+            }
+        }
+    }
+
+    //
+    // Solution via LU Decomposition
+    //
+    psVector *permutation = psVectorAlloc(nCoeff, PS_TYPE_F64); // Permutation vector for LU Decomposition
+    psImage *luMatrix = psMatrixLUD(NULL, &permutation, matrix); // LU decomposed matrix
+    psVector *xSolution = psMatrixLUSolve(NULL, luMatrix, xVector, permutation); // Solution in x
+    psVector *ySolution = psMatrixLUSolve(NULL, luMatrix, yVector, permutation); // Solution in y
+
+    //
+    // XXX: Should check the output of the matrix routines and return false if bad.
+    //
+
+    //
+    // Stuff coefficients into transformation
+    //
+    for (psS32 i = 0, ijIndex = 0; i < order; i++) {
+        for (psS32 j = 0; j < order - i; j++, ijIndex++) {
+            trans->x->coeff[i][j] = xSolution->data.F64[ijIndex];
+            trans->y->coeff[i][j] = ySolution->data.F64[ijIndex];
+        }
+    }
+
+    psFree(fakePoly);
+    psFree(permutation);
+    psFree(luMatrix);
+    psFree(xSolution);
+    psFree(ySolution);
+    psFree(matrix);
+    psFree(xVector);
+    psFree(yVector);
+
+    return(true);
+}
+
+
+/*****************************************************************************
+psPlaneTransformInvert(out, in, region, nSamples)
+ 
+// XXX: Use static data structures.
+ *****************************************************************************/
+psPlaneTransform *psPlaneTransformInvert(psPlaneTransform *out,
+        const psPlaneTransform *in,
+        psRegion *region,
+        int nSamples)
+{
+    PS_PTR_CHECK_NULL(in, NULL);
+    //
+    // If the transform is linear, then invert it exactly and return.
+    //
+    if (p_psIsProjectionLinear((psPlaneTransform *) in)) {
+        return(p_psPlaneTransformLinearInvert((psPlaneTransform *) in));
+    }
+    PS_PTR_CHECK_NULL(region, NULL);
+    PS_INT_COMPARE(1, nSamples, NULL);
+
+    // Ensure that the input transformation is symmetrical.
+    if ((in->x->nX != in->x->nY) ||
+            (in->y->nX != in->y->nY) ||
+            (in->x->nX != in->y->nX)) {
+        psError(PS_ERR_BAD_PARAMETER_TYPE, true, "Input transformation must have same nX==nY.");
+    }
+    psS32 order = PS_MAX(in->x->nX, in->x->nY);
+
+    psPlaneTransform *myPT = NULL;
+    psPlane *inCoord = psPlaneAlloc();
+    psPlane *outCoord = psPlaneAlloc();
+
+    //
+    // Allocate a new psPlaneTransform if "out" is NULL, or has the wrong size.
+    //
+    if (out == NULL) {
+        myPT = psPlaneTransformAlloc(order, order);
+    } else {
+        if ((out->x->nX == order) && (out->x->nY == order) &&
+                (out->y->nX == order) && (out->y->nY == order)) {
+            myPT = out;
+        } else {
+            psFree(out);
+            myPT = psPlaneTransformAlloc(order, order);
+        }
+    }
+
+    //
+    // Copy the input transform to myPT.
+    //
+    for (psS32 i = 0 ; i < in->x->nX ; i++) {
+        for (psS32 j = 0 ; j < in->x->nY ; j++) {
+            myPT->x->coeff[i][j] = in->x->coeff[i][j];
+        }
+    }
+    for (psS32 i = 0 ; i < in->y->nX ; i++) {
+        for (psS32 j = 0 ; j < in->y->nY ; j++) {
+            myPT->y->coeff[i][j] = in->y->coeff[i][j];
+        }
+    }
+
+    //
+    // Create a grid of xin,yin --> xout,yout
+    //
+    psArray *inData = psArrayAlloc(nSamples * nSamples);
+    psArray *outData = psArrayAlloc(nSamples * nSamples);
+    for (psS32 i = 0 ; i < inData->n; i++) {
+        inData->data[i] = (psPtr *) psPlaneAlloc();
+        outData->data[i] = (psPtr *) psPlaneAlloc();
+    }
+
+    //
+    // Initialize the grid.
+    //
+    psS32 cnt = 0;
+    for (int yint = 0; yint < nSamples; yint++) {
+        inCoord->y = region->y0 + ((psF32) yint) * ((region->y1 - region->y0) / ((psF32) nSamples));
+        for (int xint = 0; xint < nSamples; xint++) {
+            inCoord->x = region->x0 + ((psF32) xint) * ((region->x1 - region->x0) / ((psF32) nSamples));
+            (void)psPlaneTransformApply(outCoord, in, inCoord);
+
+            ((psPlane *) outData->data[cnt])->x = inCoord->x;
+            ((psPlane *) outData->data[cnt])->y = inCoord->y;
+            ((psPlane *) inData->data[cnt])->x = outCoord->x;
+            ((psPlane *) inData->data[cnt])->y = outCoord->y;
+
+            cnt++;
+        }
+    }
+    bool rc = psPlaneTransformFit(myPT, inData, outData, 10, 100.0);
+
+    psFree(inCoord);
+    psFree(outCoord);
+    psFree(inData);
+    psFree(outData);
+
+    if (rc == true) {
+        return(myPT);
+    }
+
+    // XXX: Generate an error message, or warning message.
+    return(NULL);
+}
Index: /tags/ipp-1-X/bug123/psLib/src/astronomy/psCoord.h
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/astronomy/psCoord.h	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/astronomy/psCoord.h	(revision 22331)
@@ -0,0 +1,436 @@
+/** @file  psCoord.h
+*
+*  @brief Contains basic coordinate transformation definitions and operations
+*
+*  This file defines the basic types for astronomical coordinate
+*  transformation
+*
+*  @ingroup CoordinateTransform
+*
+*  @author GLG, MHPCC
+*
+*  @version $Revision: 1.30 $ $Name: not supported by cvs2svn $
+*  @date $Date: 2005-03-31 23:01:46 $
+*
+*  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+*/
+
+#ifndef PS_COORD_H
+#define PS_COORD_H
+
+#include "psType.h"
+#include "psImage.h"
+#include "psArray.h"
+#include "psList.h"
+#include "psFunctions.h"
+#include "psTime.h"
+
+/// @addtogroup CoordinateTransform
+/// @{
+
+/** Euclidiean Coordinate System.
+ *
+ *  Both detector and sky positions will be used extensively in the IPP. One
+ *  coordinate system to be used is linear coordinates which conform to
+ *  Euclidean geometry.
+ *
+ */
+typedef struct
+{
+    double x;                   ///< x position
+    double y;                   ///< y position
+    double xErr;                ///< Error in x position
+    double yErr;                ///< Error in y position
+}
+psPlane;
+
+/** Angular Coordinate System
+ *
+ *  Both detector and sky positions will be used extensively in the IPP. One
+ *  coordinate system to be used is angular coordinates for which additional
+ *  care must often be taken in comparison to a euclidiean coordinate system.
+ *
+ */
+typedef struct psSphere
+{
+    double r;                   ///< RA
+    double d;                   ///< Dec
+    double rErr;                ///< Error in RA
+    double dErr;                ///< Error in Dec
+}
+psSphere;
+
+/** 2D Polynomial Transform
+ *
+ *  A transform between coordinate systems that consists simply of two 2D
+ *  polynomials to transform both components - the output coordinates depend
+ *  only on the input coordinates and no other quantities of objects at those
+ *  coordinates.
+ *
+ */
+typedef struct
+{
+    psDPolynomial2D* x;         ///< 2D polynomial transform of X coordinates
+    psDPolynomial2D* y;         ///< 2D polynomial transform of Y coordinates
+}
+psPlaneTransform;
+
+/** 4D Polynomial Transform
+ *
+ *  A transform between coordinate systems that consists of two 4D polynomials
+ *  in which the output coordinates are also specified to be a function of the
+ *  magnitude and color of the object with the given coordinates. This type of
+ *  coordinate transformation is necessary to represent the (color-dependent)
+ *  optical distortions caused by the atmosphere and camera optics, and the
+ *  possibly effects of charge transfer inefficiency.
+ *
+ *  The lowest two terms are the x and y axis of the target system.  The higher
+ *  two terms may represent magnitude and color terms.
+ */
+typedef struct
+{
+    psDPolynomial4D* x;         ///< 4D polynomial transform of X coordinates
+    psDPolynomial4D* y;         ///< 4D polynomial transform of Y coordinates
+}
+psPlaneDistort;
+
+/** Spherical Transform Definition
+ *
+ *  We need to be able to convert between ICRS, Galactic and Ecliptic
+ *  coordinates, and potentially between arbitrary spherical coordinate
+ *  systems. All of these basic spherical transformations represent rotations
+ *  of the spherical coordinate reference. We specify a general
+ *  transformation function which takes a structure, psSphereTransform,
+ *  defining the transformation between two spherical coordinate systems
+ *
+ */
+typedef struct
+{
+    double alphaP;                    ///< Longitude of the target system pole in the source system
+    double cosDeltaP;                 ///< Cosine of target pole latitude in the source system
+    double sinDeltaP;                 ///< Sine of target pole latitude in the source system
+    double phiP;                      ///< Longitude of the ascending node in the target system
+}
+psSphereTransform;
+
+/** Projection type for projection/deprojection
+ *
+ *  @see psProject, psDeproject
+ *
+ */
+typedef enum {
+    PS_PROJ_TAN,                ///< Tangent projection
+    PS_PROJ_SIN,                ///< Sine projection
+    PS_PROJ_AIT,                ///< Aitoff projection
+    PS_PROJ_PAR,                ///< Par projection
+    //    PS_PROJ_GLS,                ///< GLS projection
+    //    PS_PROJ_CAR,                ///< CAR projection
+    //    PS_PROJ_MER,                ///< MER projection
+    PS_PROJ_NTYPE               ///< Number of types; must be last.
+} psProjectionType;
+
+/** Parameter set for projection/deprojection
+ *
+ *  @see psProject, psDeproject
+ *
+ */
+typedef struct
+{
+    double R;                   ///< Coordinates of projection center
+    double D;                   ///< Coordinates of projection center
+    double Xs;                  ///< plate-scale in X direction
+    double Ys;                  ///< plate-scale in Y direction
+    psProjectionType type;      ///< Projection type
+}
+psProjection;
+
+/** Mode for Offset calculation between two sky positions
+ *
+ *  @see  psSphereGetOffset, psSphereSetOffset
+ *
+ */
+typedef enum {
+    PS_SPHERICAL,               ///< offset corresponds to an angular offset
+    PS_LINEAR                   ///< offset corresponds to a linear offset
+} psSphereOffsetMode;
+
+/** The units of the offset
+ *
+ *  @see  psSphereGetOffset, psSphereSetOffset
+ *
+ */
+typedef enum {
+    PS_ARCSEC,                  ///< Arcseconds
+    PS_ARCMIN,                  ///< Arcminutes
+    PS_DEGREE,                  ///< Degrees
+    PS_RADIAN                   ///< Radians
+} psSphereOffsetUnit;
+
+/** Allocates a psPlane
+ *
+ *  @return psPlane*     resulting plane structure.
+ */
+
+psPlane* psPlaneAlloc(void);
+
+/** Allocates a psSphere
+ *
+ *  @return psSphere*     resulting sphere structure.
+ */
+
+psSphere* psSphereAlloc(void);
+
+
+/** Allocates a psPlaneTransform transform.
+ *
+ *  @return psPlaneTransform*     resulting plane transform
+ */
+
+psPlaneTransform* psPlaneTransformAlloc(
+    psS32 n1,  ///< The order of the x term in the transform.
+    psS32 n2   ///< The order of the y term in the transform.
+);
+
+/** Applies the psPlaneTransform transform to a specified coordinate
+ *
+ *  @return psPlane*     resulting coordinate based on transform
+ */
+psPlane* psPlaneTransformApply(
+    psPlane* out,                      ///< a psPlane to recycle.  If NULL, a new one is generated.
+    const psPlaneTransform* transform, ///< the transform to apply
+    const psPlane* coords              ///< the coordinate to apply the transform above.
+);
+
+/** Allocates a psPlaneDistort transform.
+ *
+ *  @return psPlaneDistort*     resulting plane distort transform
+ */
+
+psPlaneDistort* psPlaneDistortAlloc(
+    psS32 n1,  ///< The order of the w term in the transform.
+    psS32 n2,  ///< The order of the x term in the transform.
+    psS32 n3,  ///< The order of the y term in the transform.
+    psS32 n4   ///< The order of the z term in the transform.
+);
+
+
+/** Applies the psPlaneDistort transform to a specified coordinate
+ *
+ *  @return psPlane*     resulting coordinate based on transform
+ */
+psPlane* psPlaneDistortApply(
+    psPlane* out,                      ///< a psPlane to recycle.  If NULL, a new one is generated.
+    const psPlaneDistort* transform,   ///< the transform to apply
+    const psPlane* coords,             ///< the coordinate to apply the transform above.
+    float term3,                       ///< third term -- maybe magnitude
+    float term4                        ///< forth term -- maybe color
+);
+
+/** Allocator for psSphereTransform
+ *
+ *  @return psSphereTransform*         newly allocated struct
+ */
+
+psSphereTransform* psSphereTransformAlloc(
+    double alphaP,                      ///< north pole latitude
+    double deltaP,                      ///< north pole longitude?
+    double phiP                         ///< defines the longitude in the input system of the equatorial intersection between the two systems (e.g, the first point of Ares).
+);
+
+/** Applies the psSphereTransform transform for a specified coordinate
+ *
+ *  @return psSphere*      resulting coordinate based on transform
+ */
+psSphere* psSphereTransformApply(
+    psSphere* out,                     ///< a psSphere to recycle.  If NULL, a new one is generated.
+    const psSphereTransform* transform,///< the transform to apply
+    const psSphere* coord              ///< the coordinate to apply the transform above.x
+);
+
+/** Creates the appropriate transform for converting from ICRS to Ecliptic
+ *  coordinate systems.
+ *
+ *  @return psSphereTransform*     transform for ICRS->Ecliptic coordinate systems
+ */
+psSphereTransform* psSphereTransformICRSToEcliptic(
+    psTime *time                        ///< the time for which the resulting transform will be valid
+);
+
+/** Creates the appropriate transform for converting from Ecliptic to ICRS
+ *  coordinate systems.
+ *
+ *  @return psSphereTransform*     transform for Ecliptic->ICRS coordinate systems
+ */
+psSphereTransform* psSphereTransformEclipticToICRS(
+    psTime *time                        ///< the time for which the resulting transform will be valid
+);
+
+/** Creates the appropriate transform for converting from ICRS to Galactic
+ *  coordinate systems.
+ *
+ */
+psSphereTransform* psSphereTransformICRSToGalactic(void);
+
+/** Creates the appropriate transform for converting from Galactic to ICRS
+ *  coordinate systems.
+ *
+ */
+psSphereTransform* psSphereTransformGalacticToICRS(void);
+
+/** Allocates memory for a psProjection structure
+ *
+ *  @return psProjection*    psProjection structure
+ */
+psProjection* psProjectionAlloc(
+    psF64 R,                   ///< Right-ascension of projection center.
+    psF64 D,                   ///< Declination of projection center.
+    psF64 Xs,                  ///< Scale in x-dimension
+    psF64 Ys,                  ///< Scale in y-dimension
+    psProjectionType type
+);
+
+/** Projects a spherical coordinate to a linear coordinate system
+ *
+ *  @return psPlane*    projected coordinate
+ */
+psPlane* psProject(
+    const psSphere* coord,             ///< coordinate to project
+    const psProjection* projection     ///< parameters of the projection
+);
+
+/** Reverse projection of a linear coordinate to a spherical coordinate system
+ *
+ *  @return psPlane*    projected coordinate
+ */
+psSphere* psDeproject(
+    const psPlane* coord,              ///< coordinate to project
+    const psProjection* projection     ///< parameters of the projection
+);
+
+/** Determines the offset (RA,Dec) on the sky between two positions.
+ *
+ *  Both an offset mode and an offset unit may be defined. The mode may be
+ *  either PS_SPHERICAL, in which case the specified offset corresponds to an
+ *  offset in angles, or it may be PS_LINEAR, in which case the offset
+ *  corresponds to a linear offset in a local projection. The offset unit may
+ *  be in one of PS_ARCSEC, PS_ARCMIN, PS_DEGREE, and PS_RADIAN, which
+ *  specifies the units of the offset only.
+ *
+ *  @return psSphere*    the offset between position1 and position2
+ */
+psSphere* psSphereGetOffset(
+    const psSphere* position1,
+    const psSphere* position2,
+    psSphereOffsetMode mode,
+    psSphereOffsetUnit unit
+);
+
+/** Applies the given offset to a coordinate.
+ *
+ *  Both an offset mode and an offset unit may be defined. The mode may be
+ *  either PS_SPHERICAL, in which case the specified offset corresponds to an
+ *  offset in angles, or it may be PS_LINEAR, in which case the offset
+ *  corresponds to a linear offset in a local projection. The offset unit may
+ *  be in one of PS_ARCSEC, PS_ARCMIN, PS_DEGREE, and PS_RADIAN, which
+ *  specifies the units of the offset only.
+ *
+ *  @return psSphere*    the given position with the given offset applied.
+ */
+psSphere* psSphereSetOffset(
+    const psSphere* position,
+    const psSphere* offset,
+    psSphereOffsetMode mode,
+    psSphereOffsetUnit unit
+);
+
+/** Generates the complete spherical rotation to account for precession
+ *  between two times.  The equinoxes shall be Julian equinoxes.
+ *
+ *  @return psSphere* the resulting spherical rotation
+ */
+psSphere* psSpherePrecess(
+    psSphere *coords,                  ///< coordinates (modified in-place)
+    const psTime *fromTime,            ///< equinox of coords input
+    const psTime *toTime               ///< equinox of coords output
+);
+
+// XXX: Doxygenate.
+psPlaneTransform *p_psPlaneTransformLinearInvert(
+    psPlaneTransform *transform
+);
+
+// XXX: Doxygenate
+psS32 p_psIsProjectionLinear(
+    psPlaneTransform *transform
+);
+
+/** inverts a given transformation.
+ *
+ *  It may assume that the input transformation is one-to-one, and that the
+ *  inverse transformation may be specified through using polynomials of the
+ *  same type and order as the forward transformation. In the event that the
+ *  input transformation is linear, an exact solution may be calculated;
+ *  otherwise nSamples samples in each axis, covering the region specified by
+ *  region shall be used as a grid to fit the best inverse transformation. The
+ *  function shall return NULL if it was unable to generate the inverse
+ *  transformation; otherwise it shall return the inverse transformation. In
+ *  the event that out is NULL, a new psPlaneTransform shall be allocated and
+ *  returned.
+ *
+ *  @return psPlaneTransform*  the resulting inverted transform
+ */
+psPlaneTransform* psPlaneTransformInvert(
+    psPlaneTransform *out,             ///< a transform to recycle, or NULL if one is to be created.
+    const psPlaneTransform *in,        ///< transform to invert
+    psRegion *region,                  ///< region to fit for non-linear transform inversion
+    int nSamples                       ///< number of samples in each axis for fit
+);
+
+/** Creates a single transformation that has the effect of performing trans1
+ *  followed by trans2.
+ *
+ *  psPlaneTransformCombine takes two transformations (trans1 and trans2) and
+ *  returns a single transformation that has the effect of performing trans1
+ *  followed by trans2. In the event that the input transformation is linear,
+ *  an exact solution may be calculated; otherwise nSamples samples in each
+ *  axis, covering the region specified by region shall be used as a grid to
+ *  fit the best inverse transformation. The function shall return NULL if it
+ *  was unable to generate the transformation; otherwise it shall return the
+ *  transformation.
+ *
+ *  @return psPlaneTransform*    resulting transformation
+ */
+psPlaneTransform* psPlaneTransformCombine(
+    psPlaneTransform *out,             ///< a transform to recycle, or NULL if one is to be created.
+    const psPlaneTransform *trans1,    ///< first transform to combine
+    const psPlaneTransform *trans2     ///< first transform to combine
+);
+
+
+/** takes two arrays containing matched coordinates and returns the
+ *  best-fitting transformation.
+ *
+ *  psPlaneTransformFit takes two arrays containing matched coordinates (i.e.,
+ *  coordinates in the source array correspond to the coordinates in the dest
+ *  array) and returns the best-fitting transformation. The source and dest
+ *  will contain psCoords. In the event that the number of coordinates in each
+ *  is not identical, the function shall generate a warning, and extra
+ *  coordinates in the longer of the two shall be ignored. The trans transform
+ *  may not be NULL, since it specifies the desired order, polynomial type and
+ *  any polynomial terms to mask. nRejIter rejection iterations shall be
+ *  performed, wherein coordinates lying more than sigmaClip standard
+ *  deviations from the fit shall be rejected.
+ *
+ *  @return bool        TRUE if successful, otherwise FALSE.
+ */
+bool psPlaneTransformFit(
+    psPlaneTransform *trans,
+    const psArray *source,
+    const psArray *dest,
+    int nRejIter,
+    float sigmaClip
+);
+
+/// @}
+
+#endif
Index: /tags/ipp-1-X/bug123/psLib/src/astronomy/psPhotometry.h
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/astronomy/psPhotometry.h	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/astronomy/psPhotometry.h	(revision 22331)
@@ -0,0 +1,75 @@
+
+/** @file  psPhotometry.h
+*
+*  @brief Contains basic photometric structures.
+*
+*  This file defines the basic photometric structures.
+*
+*  @ingroup Photometry
+*
+*  @author George Gusciora, MHPCC
+*
+*  @version $Revision: 1.10 $ $Name: not supported by cvs2svn $
+*  @date $Date: 2005-02-17 19:26:23 $
+*
+*  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+*/
+
+#ifndef PS_PHOTOMETRIC_H
+#define PS_PHOTOMETRIC_H
+
+#include "psType.h"
+#include "psImage.h"
+#include "psArray.h"
+#include "psList.h"
+#include "psFunctions.h"
+
+/// @addtogroup Photometry
+/// @{
+
+/** The photometric system description
+ *
+ *  The photometric system is defined by the psPhotSystem structure. A 
+ *  photometric system is identified by a human-readable name (ie, SDSS.g, 
+ *  Landolt92.B, GPC1.OTA32.r). Each photometric system is given a unique 
+ *  identifier ID. Observations taken with a specific camera, detector, and 
+ *  filter represent their own photometric system, and it may be necessary to 
+ *  perform transformations between these systems. Photometric systems 
+ *  associated with observations from a specific camera/ detector/filter 
+ *  combination can be associated with those components.
+ *
+ */
+
+typedef struct
+{
+    const psS32 ID;                    ///< ID number for this photometric system
+    const char *name;                  ///< Name of photometric system
+    const char *camera;                ///< Camera for photometric system
+    const char *filter;                ///< Filter used for photometric system
+    const char *detector;              ///< Detector used for photometric system
+}
+psPhotSystem;
+
+/** Photometric system transformation
+ *
+ *  This structure defines the transformation between two photometric systems.
+ *
+ */
+
+typedef struct
+{
+    const psPhotSystem src;            ///< Source photometric system
+    const psPhotSystem dst;            ///< Destination photometric system
+    const psPhotSystem pP;             ///< Primary color reference
+    const psPhotSystem pM;             ///< Primary color reference
+    const psPhotSystem sP;             ///< Secondary color reference
+    const psPhotSystem sM;             ///< Secondary color reference
+    float pA;                          ///< Color offset for references
+    float sA;                          ///< Color offset for references
+    psPolynomial3D transform;          ///< Transformation from source to destination
+}
+psPhotTransform;
+
+/// @}
+
+#endif
Index: /tags/ipp-1-X/bug123/psLib/src/astronomy/psTime.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/astronomy/psTime.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/astronomy/psTime.c	(revision 22331)
@@ -0,0 +1,1178 @@
+/** @file  psTime.c
+ *
+ *  @brief Definitions for time, time utilities, and conversion functions for use with psLib astronomy
+ *  functions.
+ *
+ *  A collection of functions are required by psLib to manipulate time data. These functions primarily consist
+ *  of conversions between specific time formats.  They use the UNIX timeval time system as the
+ *  base upon which International Atomic Time (TAI) and Universal Time Coordinated (UTC) are calculated.
+ *
+ *  @author Ross Harman, MHPCC
+ *
+ *  @version $Revision: 1.59 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-04-19 02:13:53 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <math.h>
+#include <ctype.h>
+
+#include "psTime.h"
+#include "psError.h"
+#include "psMemory.h"
+#include "psAbort.h"
+#include "psImage.h"
+#include "psCoord.h"
+#include "psString.h"
+#include "psMetadata.h"
+#include "psMetadataIO.h"
+#include "psLookupTable.h"
+#include "psConstants.h"
+#include "psAstronomyErrors.h"
+
+#include "config.h"
+
+#define MAX_STRING_LENGTH 256
+
+/** Sidereal angular conversion from seconds to radians for GMST in seconds (i.e. pi/(180*240)) */
+#define S2R (7.272205216643039903848711535369e-5)
+
+/** Two times pi with double precision accuracy */
+#define TWOPI (2.0*PS_PI)
+
+/** Conversion from radians to degrees */
+#define R2DEG = (180.0/PS_PI)
+
+                /** Maximum length of time string */
+                #define MAX_TIME_STRING_LENGTH 256
+
+                /** Seconds per minute */
+                #define  SEC_PER_MINUTE 60.0
+
+                /** Seconds per hour */
+                #define  SEC_PER_HOUR (60.0*SEC_PER_MINUTE)
+
+                /** Seconds per day */
+                #define  SEC_PER_DAY (24.0*SEC_PER_HOUR)
+
+                /** Seconds per year */
+                #define  SEC_PER_YEAR (365.0*SEC_PER_DAY)
+
+                /** Microseconds per day */
+                #define NSEC_PER_DAY 86400000000000.0
+
+                /** Time metadata read from config file */
+                static psMetadata *timeMetadata = NULL;
+
+/** Static function prototypes */
+static char *cleanString(char *inString, int sLen);
+static char* getToken(char **inString, char *delimiter, psParseErrorType *status);
+psF64 searchTables(psF64 index, psU64 column, psLookupStatusType *status, char *metadataTableNames[], psU32 nTables);
+
+
+/** Removes leading and trailing whitespace and # characters from a string. The cleaned string is a new null
+ *  terminated copy of the original input string. */
+static char *cleanString(char *inString, int sLen)
+{
+    char *ptrB = NULL;
+    char *ptrE = NULL;
+    char *cleaned = NULL;
+
+
+    ptrB = inString;
+
+    /* Skip over leading # or whitespace */
+    while (isspace(*ptrB) || *ptrB=='#') {
+        ptrB++;
+    }
+
+    /* Skip over trailing whitespace, null terminators, and # characters */
+    ptrE = inString + sLen;
+    while(isspace(*ptrE) || *ptrE=='\0' || *ptrE=='#') {
+        ptrE--;
+    }
+
+    // Length, sLen, does not include '\0'
+    sLen = ptrE - ptrB + 1;
+
+    // Adds '\0' to end of string and +1 to sLen
+    cleaned = psStringNCopy(ptrB, sLen);
+
+    return cleaned;
+}
+
+/** Returns cleaned token based on delimiter, but not including delimiter. Also changes the pointer location
+ * the beginning of the string. Tokens are newly allocated null terminated strings. */
+static char* getToken(char **inString, char *delimiter, psParseErrorType *status)
+{
+    char *cleanToken = NULL;
+    int sLen = 0;
+
+
+    // Skip over leading whitespace
+    while(isspace(**inString)) {
+        (*inString)++;
+    }
+
+    // Length of token, not including delimiter
+    sLen = strcspn(*inString, delimiter);
+    if(sLen) {
+
+        // Create new, cleaned, and null terminated token
+        cleanToken = cleanString(*inString, sLen);
+
+        // Move to end of token
+        (*inString) += sLen;
+    } else if(**inString!='\0' && sLen==0) {
+        *status = PS_PARSE_ERROR_GENERAL;
+    }
+
+    return cleanToken;
+}
+
+// get the psTime.config filename by checking environment variable first, then original installation area.
+char* p_psGetConfigFileName()
+{
+    char* filename = getenv("PS_CONFIG_FILE");
+
+    if (filename == NULL) { // environment variable not found
+        filename = PS_CONFIG_FILE_DEFAULT; // this should come from configure.ac
+    }
+
+    return filename;
+}
+
+
+/** Searches time tables in priority order and performs interpolation if input index value is within a table.
+ * If the index value is out of range, the status is set accordingly. */
+psF64 searchTables(psF64 index, psU64 column, psLookupStatusType *status, char *metadataTableNames[], psU32 nTables)
+{
+    psU32 i = 0;
+    char *tableName = NULL;
+    psF64 result = 0.0;
+    psLookupTable *table = NULL;
+    psMetadataItem *tableMetadataItem = NULL;
+
+
+
+    // Check time metadata. Function call reports errors.
+    if(timeMetadata == NULL) {
+        if(!p_psTimeInit(p_psGetConfigFileName()))
+            return 0.0;
+    }
+
+    // Search each table in priority order: ser7, eopc,finals
+    for(i=0; i<nTables; i++) {
+
+        // Get table from metadata
+        tableName = metadataTableNames[i];
+        tableMetadataItem = psMetadataLookup(timeMetadata, tableName);
+        if(tableMetadataItem == NULL) {
+            psError(PS_ERR_BAD_PARAMETER_VALUE, true, PS_ERRORTEXT_psTime_LOOKUP_METADATA_FAILED,
+                    tableName);
+            return 0.0;
+        }
+        table = (psLookupTable*)tableMetadataItem->data.V;
+        PS_PTR_CHECK_NULL(table,0.0);
+
+        // Attempt to interpolate table
+        *status = PS_LOOKUP_SUCCESS;
+        result = psLookupTableInterpolate(table, index, 2, status);
+        if(*status == PS_LOOKUP_SUCCESS) {
+            return result;
+        } else if(*status == PS_LOOKUP_ERROR) {
+            psError(PS_ERR_BAD_PARAMETER_VALUE, true, PS_ERRORTEXT_psTime_INTERPOLATION_FAILED_NAME,
+                    tableName);
+            return 0.0;
+        }
+    }
+
+    return result;
+}
+
+bool p_psTimeInit(const char *fileName)
+{
+    bool foundTable = false;
+    char *tableDir = NULL;
+    char *tableNames = NULL;
+    char *namesPtr = NULL;
+    char *metadataNamesPtr = NULL;
+    char *tableName = NULL;
+    char *fullTableName = NULL;
+    psS32 i = 0;
+    psS32 j = 0;
+    psS32 numTables = 0;
+    psU32 nFail = 0;
+    psVector *tablesFrom = NULL;
+    psVector *tablesTo = NULL;
+    psMetadataItem *metadataItem = NULL;
+    psLookupTable *table = NULL;
+    psParseErrorType status = PS_PARSE_SUCCESS;
+    char metadataTableNames[4][MAX_STRING_LENGTH] = {"ser7", "eopc",  "finals", "tai"};
+
+    // Read time config file
+    timeMetadata = psMetadataParseConfig(timeMetadata, &nFail, fileName, true);
+    if(timeMetadata == NULL) {
+        return false;
+    } else if(nFail != 0) {
+        return false;
+    }
+
+    // Get number of tables
+    metadataItem = psMetadataLookup(timeMetadata, "psLib.time.tables.n");
+    if(metadataItem == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true, PS_ERRORTEXT_psTime_LOOKUP_METADATA_FAILED,
+                "psLib.time.tables.n");
+        return false;
+    }
+    numTables = (psS32)metadataItem->data.S32;
+
+    // Get lower range of tables
+    metadataItem = psMetadataLookup(timeMetadata, "psLib.time.tables.from");
+    if(metadataItem == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true, PS_ERRORTEXT_psTime_LOOKUP_METADATA_FAILED,
+                "psLib.time.tables.from");
+        return false;
+    }
+    tablesFrom = psVectorCopy(tablesFrom, metadataItem->data.V, PS_TYPE_F64);
+    if(tablesFrom->n != numTables) {
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true, PS_ERRORTEXT_psTime_BAD_VECTOR, tablesFrom->n, numTables);
+        psFree(tablesFrom);
+        return false;
+    }
+
+    // Get upper range of tables
+    metadataItem = psMetadataLookup(timeMetadata, "psLib.time.tables.to");
+    if(metadataItem == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true, PS_ERRORTEXT_psTime_LOOKUP_METADATA_FAILED,
+                "psLib.time.tables.to");
+        return false;
+    }
+    tablesTo = psVectorCopy(tablesTo, metadataItem->data.V, PS_TYPE_F64);
+    if(tablesTo->n != numTables) {
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true, PS_ERRORTEXT_psTime_BAD_VECTOR, tablesTo->n, numTables);
+        psFree(tablesFrom);
+        psFree(tablesTo);
+        return false;
+    }
+
+    // Get path to time data files
+    metadataItem = psMetadataLookup(timeMetadata, "psLib.time.tables.dir");
+    if(metadataItem == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true, PS_ERRORTEXT_psTime_LOOKUP_METADATA_FAILED,
+                "psLib.time.tables.dir");
+        psFree(tablesFrom);
+        psFree(tablesTo);
+        return false;
+    }
+    tableDir = psStringCopy(metadataItem->data.V);
+
+    // Table file names
+    metadataItem = psMetadataLookup(timeMetadata, "psLib.time.tables.files");
+    if(metadataItem == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true, PS_ERRORTEXT_psTime_LOOKUP_METADATA_FAILED,
+                "psLib.time.tables.files");
+
+        psFree(tablesFrom);
+        psFree(tablesTo);
+        psFree(tableDir);
+        return false;
+    }
+    tableNames = psStringCopy(metadataItem->data.V);
+
+    // Read time tables
+    namesPtr = tableNames;
+    while((tableName=getToken(&namesPtr, " ", &status)) != NULL) {
+
+        // Form path with table name, adding one to length for last '/' that may not occur in string in cong file
+        fullTableName = (char*)psAlloc(strlen(tableDir)+strlen(tableName)+1+1);
+
+        // Old strings may come back from psAlloc(), so set initial position to EOL
+        fullTableName[0]='\0';
+        strcat(fullTableName, tableDir);
+        strcat(fullTableName, "/");
+        strcat(fullTableName, tableName);
+
+        // Create and read table
+        if(i < numTables) {
+            table = psLookupTableAlloc(fullTableName, tablesFrom->data.F64[i], tablesTo->data.F64[i]);
+            table = psLookupTableRead(table);
+        } else {
+            psError(PS_ERR_BAD_PARAMETER_VALUE, true, PS_ERRORTEXT_psTime_BAD_TABLE_COUNT, i+1, numTables);
+        }
+
+        // Place tables into metadata slightly altered names as keys to create consistent naming conventions
+        foundTable = false;
+        for(j=0; j<numTables; j++) {
+            metadataNamesPtr = strstr(tableName, metadataTableNames[j]);
+            if(metadataNamesPtr != NULL) {
+                psMetadataAdd(timeMetadata, PS_LIST_TAIL, strcat(metadataTableNames[j], "Table"),
+                              PS_META_LOOKUPTABLE, NULL, table);
+                foundTable = true;
+            } else if(foundTable==false && j==numTables-1) {
+                psError(PS_ERR_BAD_PARAMETER_VALUE, true, PS_ERRORTEXT_psTime_BAD_TABLE_COUNT, j, numTables);
+            }
+        }
+
+        psFree(fullTableName);
+        psFree(tableName);
+        psFree(table);
+        i++;
+    }
+
+    if(numTables != i) {
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true, PS_ERRORTEXT_psTime_BAD_TABLE_COUNT, i, numTables);
+    }
+
+    psFree(tableDir);
+    psFree(tableNames);
+    psFree(tablesFrom);
+    psFree(tablesTo);
+
+    return true;
+}
+
+bool p_psTimeFinalize(void)
+{
+    if(timeMetadata != NULL) {
+        psFree(timeMetadata);
+        timeMetadata = NULL;
+    }
+
+    return true;
+}
+
+psTime* psTimeAlloc(psTimeType type)
+{
+    psTime *outTime = NULL;
+
+
+    // Error checks
+    if(type!=PS_TIME_TAI && type!=PS_TIME_UTC) {
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true,
+                PS_ERRORTEXT_psTime_TYPE_UNKNOWN,
+                type);
+        return NULL;
+    }
+
+    outTime = (psTime*)psAlloc(sizeof(psTime));
+
+    outTime->sec = 0;
+    outTime->nsec = 0;
+    outTime->type = type;
+    outTime->leapsecond = false;
+
+    return outTime;
+}
+
+psTime* psTimeGetNow(psTimeType type)
+{
+    struct timeval now;
+    psTime *time = NULL;
+
+
+    // Allocate psTime struct
+    time = psTimeAlloc(type);
+
+    if (gettimeofday(&now, (struct timezone *)0) == -1) {
+        psError(PS_ERR_OS_CALL_FAILED, true,
+                PS_ERRORTEXT_psTime_GET_TOD_FAILED);
+        return NULL;
+    }
+
+    // Convert timeval time to psTime
+    time->sec = now.tv_sec;
+    time->nsec = now.tv_usec*1000;
+
+    // Add most leapseconds to UTC time to get TAI time if necessary
+    if(type == PS_TIME_TAI) {
+        time->sec += psTimeGetTAIDelta(time);
+    }
+
+    return time;
+}
+
+psTime* psTimeConvert(psTime *time, psTimeType type)
+{
+    double delta = 0.0;
+
+
+    // Error checks
+    PS_PTR_CHECK_NULL(time,NULL);
+    PS_INT_CHECK_RANGE(time->nsec,0,1e9-1,NULL);
+
+    if (time->type == type) { // time already right type.  That was easy!
+        return time;
+    }
+
+    delta = psTimeGetTAIDelta(time);
+
+    if (type == PS_TIME_UTC) {
+        time->sec = time->sec - delta;    // User wants UTC time. Subtract leapseconds.
+    } else if(type == PS_TIME_TAI) {
+        time->sec = time->sec + delta;    // User wants TAI time. Add leapseconds.
+    } else {
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true, PS_ERRORTEXT_psTime_TYPE_UNKNOWN, type);
+    }
+
+    return time;
+}
+
+double psTimeToLMST(psTime *time, double longitude)
+{
+    psF64  jdTdtDays    =  0.0;
+    psF64  jdUt1Days    =  0.0;
+    psF64  mjdUt1Days   =  0.0;
+    psF64  lmstRad      =  0.0;
+    psF64  fracDays     =  0.0;
+    psF64  gmstRad      =  0.0;
+    psF64  t            =  0.0;
+    psF64  tu           =  0.0;
+    psF64  ut1UtcDbl    =  0.0;
+    psF64  const1       =  24110.5493771;
+    psF64  const2       =  8639877.3173760;
+    psF64  const3       =  307.4771600;
+    psF64  const4       =  0.0931118;
+    psF64  const5       = -0.0000062;
+    psF64  const6       =  0.0000013;
+    psTime *ut1UtcDelta = NULL;
+    psTime *tdtTime     = NULL;
+    psTime *taiTime     = NULL;
+    psTime *utcTime     = NULL;
+    psTime *ut1Time     = NULL;
+
+
+    // Error checks
+    PS_PTR_CHECK_NULL(time,NAN);
+    PS_INT_CHECK_RANGE(time->nsec,0,1e9-1,NAN);
+
+    // Calculate TAI or UTC time based on type of time user passes
+    if(time->type == PS_TIME_TAI) {
+        taiTime = psMemIncrRefCounter(time);
+        utcTime = psTimeAlloc(PS_TIME_UTC);
+        utcTime->sec = taiTime->sec - psTimeGetTAIDelta(time);
+        utcTime->nsec = taiTime->nsec;
+    } else if(time->type == PS_TIME_UTC) {
+        utcTime = psMemIncrRefCounter(time);
+        taiTime = psTimeAlloc(PS_TIME_TAI);
+        taiTime->sec = utcTime->sec + psTimeGetTAIDelta(time);
+        taiTime->nsec = utcTime->nsec;
+    }
+
+    // Convert Universal Time (UTC) to  UT1
+    ut1UtcDbl = psTimeGetUT1Delta(taiTime);
+    utcTime->type = PS_TIME_TAI; // Don't allow addition of leapseconds to ut1Time
+    ut1Time = psTimeMath(utcTime, ut1UtcDbl);
+    utcTime->type = PS_TIME_UTC;
+
+
+    // Calculate UT1 as Julian Centuries since J2000.0
+    jdUt1Days = psTimeToJD(ut1Time);
+    mjdUt1Days = psTimeToMJD(ut1Time);
+    t = (jdUt1Days - 2451545.0)/36525.0;
+
+    // Calculate Terrestial Dynamical Time (TDT)
+    tdtTime = psTimeMath(taiTime, 32.184);
+
+    // Calculate TDT as Julian centuries since J2000.0
+    jdTdtDays = psTimeToJD(tdtTime);
+    tu = (jdTdtDays - 2451545.0)/36525.0;
+
+    // Calculate fractional part of MJD
+    fracDays = fmod(mjdUt1Days, 1.0);
+
+    // Calculate Greenwich Mean Sidereal Time (GMST) in radians. Equation set up to minimize multiplications.
+    gmstRad = fracDays*TWOPI+(const1+const2*tu+t*(const3+t*(const4+t*(const5+const6*t))))*S2R;
+
+    // Place GMST between 0 and 2*pi
+    gmstRad = fmod(gmstRad, TWOPI);
+
+    // Calculate Local Mean Sidereal Time (LMST) in radians
+    lmstRad = gmstRad + longitude;
+
+    // Free temporary structs
+    psFree(ut1UtcDelta);
+    psFree(ut1Time);
+    psFree(tdtTime);
+    psFree(utcTime);
+    psFree(taiTime);
+
+    return lmstRad;
+}
+
+double psTimeGetUT1Delta(const psTime *time)
+{
+    psU32 nTables = 3;
+    psF64 mjd = 0.0;
+    psF64 result = 0.0;
+    psF64 dut2ut1 = 0.0;
+    psF64 t = 0.0;
+    psVector *dut = NULL;
+    psMetadataItem *tableMetadataItem = NULL;
+    psLookupStatusType status = PS_LOOKUP_SUCCESS;
+    char *metadataTableNames[3] = {"ser7Table", "eopcTable",  "finalsTable"};
+
+
+    // Error checks
+    PS_PTR_CHECK_NULL(time,NAN);
+    PS_INT_CHECK_RANGE(time->nsec,0,1e9-1,NAN);
+
+    if(time->type != PS_TIME_TAI) {
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true, PS_ERRORTEXT_psTime_TYPE_INCORRECT, time->type);
+        return 0.0;
+    }
+
+    // Attempt to find value through table lookup and interpolation
+    mjd = psTimeToMJD(time);
+    result = searchTables(mjd, 0, &status, metadataTableNames, nTables);
+
+    // Value could not be found through table lookup and interpolation
+    if(status == PS_LOOKUP_PAST_TOP) {
+
+        // Date too early for tables. Get default time delta value from metadata, and issue warning.
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true, PS_ERRORTEXT_psTime_TIME_PREDATES_TABLES, mjd, "UT1-UTC");
+
+        tableMetadataItem = psMetadataLookup(timeMetadata, "psLib.time.before.dut");
+        if(tableMetadataItem == NULL) {
+            psError(PS_ERR_BAD_PARAMETER_VALUE, true, PS_ERRORTEXT_psTime_LOOKUP_METADATA_FAILED, "psLib.time.before.dut");
+            return 0.0;
+        }
+        result = tableMetadataItem->data.F64;
+
+    } else if(status == PS_LOOKUP_PAST_BOTTOM) {
+        /* Date too late for tables. Issue warning and use following formulae for predicting
+           ahead of the most recent available table entry.
+             ut1-utc = [0] + [1]*(MJD - [2]) - (ut2-ut1)
+             [0, 1, 2] = @psLib.time.predict.dut
+             ut2-ut1 = 0.022 sin(2*pi*t) - 0.012 cos(2*pi*t) - 0.006 sin(4*pi*t) + 0.007 cos(4*pi*t)
+             t = 2000.0 + (MJD - 51544.03)/365.2422
+        */
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true, PS_ERRORTEXT_psTime_TIME_POSTDATES_TABLES, mjd, "UT1-UTC");
+
+        tableMetadataItem = psMetadataLookup(timeMetadata, "psLib.time.predict.dut");
+        if(tableMetadataItem == NULL) {
+            psError(PS_ERR_BAD_PARAMETER_VALUE, true, PS_ERRORTEXT_psTime_LOOKUP_METADATA_FAILED, "psLib.time.predict.dut");
+            return 0.0;
+        }
+        dut = (psVector*)tableMetadataItem->data.V;
+        PS_PTR_CHECK_NULL(dut,0.0);
+
+        t = 2000.0 + (mjd - 51544.03)/365.2422;
+        dut2ut1 = 0.022*sin(TWOPI*t) - 0.012*cos(TWOPI*t) - 0.006*sin(4.0*PS_PI*t) + 0.007*cos(4.0*PS_PI*t);
+        result = dut->data.F64[0] + dut->data.F64[1]*(mjd - dut->data.F64[2]) - dut2ut1;
+
+    } else if(status != PS_LOOKUP_SUCCESS) {
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true, PS_ERRORTEXT_psTime_INTERPOLATION_FAILED);
+        return 0.0;
+    }
+
+    return result;
+}
+
+struct psSphere* psTimeGetPoleCoords(const psTime* time)
+{
+    psU32 nTables = 3;
+    psF64 x = 0.0;
+    psF64 y = 0.0;
+    psF64 mjd = 0.0;
+    psF64 a = 0.0;
+    psF64 c = 0.0;
+    psF64 mjdPred = 0.0;
+    struct psSphere* output = NULL;
+    psLookupStatusType xStatus = PS_LOOKUP_SUCCESS;
+    psLookupStatusType yStatus = PS_LOOKUP_SUCCESS;
+    psMetadataItem *tableMetadataItem = NULL;
+    char *metadataTableNames[3] = {"ser7Table", "eopcTable",  "finalsTable"};
+    psVector *xp = NULL;
+    psVector *yp = NULL;
+
+    // Error checks
+    PS_PTR_CHECK_NULL(time,NULL);
+    PS_INT_CHECK_RANGE(time->nsec,0,1e9-1,NULL);
+
+    if(time->type != PS_TIME_TAI)
+    {
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true, PS_ERRORTEXT_psTime_TYPE_INCORRECT, time->type);
+        return NULL;
+    }
+
+    // Attempt to find value through table lookup and interpolation
+    mjd = psTimeToMJD(time);
+    x = searchTables(mjd, 0, &xStatus, metadataTableNames, nTables);
+    y = searchTables(mjd, 0, &yStatus, metadataTableNames, nTables);
+
+    // Value could not be found through table lookup and interpolation
+    if(xStatus==PS_LOOKUP_PAST_TOP && yStatus==PS_LOOKUP_PAST_TOP)
+    {
+
+        // Date too earlier for tables. Get default polar coodinate values from metadata, and issue warning.
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true, PS_ERRORTEXT_psTime_TIME_PREDATES_TABLES, mjd, "polar motion");
+
+        tableMetadataItem = psMetadataLookup(timeMetadata, "psLib.time.before.xp");
+        if(tableMetadataItem == NULL) {
+            psError(PS_ERR_BAD_PARAMETER_VALUE, true, PS_ERRORTEXT_psTime_LOOKUP_METADATA_FAILED, "psLib.time.before.xp");
+            return NULL;
+        }
+        x = tableMetadataItem->data.F64;
+
+        tableMetadataItem = psMetadataLookup(timeMetadata, "psLib.time.before.yp");
+        if(tableMetadataItem == NULL) {
+            psError(PS_ERR_BAD_PARAMETER_VALUE, true, PS_ERRORTEXT_psTime_LOOKUP_METADATA_FAILED, "psLib.time.before.yp");
+            return NULL;
+        }
+        y = tableMetadataItem->data.F64;
+
+    } else if(xStatus==PS_LOOKUP_PAST_BOTTOM && yStatus==PS_LOOKUP_PAST_BOTTOM)
+    {
+
+        /* Date too late for tables. Issue warning and use following formulae for predicting
+           ahead of the most recent available table entry.
+              x = [0] + [1]*cos a + [2]*sin a + [3]*cos c + [4]*sin c
+              [0], [1], [2], [3] = @psLib.time.predict.xp
+              y = [0] + [1]*cos a + [2]*sin a + [3]*cos c + [4]*sin c
+              [0], [1], [2], [3] = @psLib.time.predict.yp
+              a = 2*pi*(mjd - pslib.time.predict.mjd)/365.25
+              c = 2*pi*(mjd - pslib.time.predict.mjd)/435.0
+        */
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true, PS_ERRORTEXT_psTime_TIME_POSTDATES_TABLES, mjd, "polar motion");
+
+
+        // Get predicted MJD
+        tableMetadataItem = psMetadataLookup(timeMetadata, "psLib.time.predict.mjd");
+        if(tableMetadataItem == NULL) {
+            psError(PS_ERR_BAD_PARAMETER_VALUE, true, PS_ERRORTEXT_psTime_LOOKUP_METADATA_FAILED,
+                    "psLib.time.predict.mjd");
+            return NULL;
+        }
+        mjdPred = tableMetadataItem->data.F64;
+
+        // Get xp
+        tableMetadataItem = psMetadataLookup(timeMetadata, "psLib.time.predict.xp");
+        if(tableMetadataItem == NULL) {
+            psError(PS_ERR_BAD_PARAMETER_VALUE, true, PS_ERRORTEXT_psTime_LOOKUP_METADATA_FAILED, "psLib.time.predict.xp");
+            return NULL;
+        }
+        xp = (psVector*)tableMetadataItem->data.V;
+        PS_PTR_CHECK_NULL(xp,NULL);
+
+        // Get yp
+        tableMetadataItem = psMetadataLookup(timeMetadata, "psLib.time.predict.yp");
+        if(tableMetadataItem == NULL) {
+            psError(PS_ERR_BAD_PARAMETER_VALUE, true, PS_ERRORTEXT_psTime_LOOKUP_METADATA_FAILED, "psLib.time.predict.yp");
+            return NULL;
+        }
+        yp = (psVector*)tableMetadataItem->data.V;
+        PS_PTR_CHECK_NULL(yp,NULL);
+
+        // Calculate "a" and "c" constants
+        a = TWOPI*(mjd - mjdPred)/365.25;
+        c = TWOPI*(mjd - mjdPred)/435.0;
+
+        // Calculate x and y polar coordinates
+        x = xp->data.F64[0] +
+            xp->data.F64[1]*cos(a) +
+            xp->data.F64[2]*sin(a) +
+            xp->data.F64[3]*cos(c) +
+            xp->data.F64[4]*sin(c);
+
+        y = yp->data.F64[0] +
+            yp->data.F64[1]*cos(a) +
+            yp->data.F64[2]*sin(a) +
+            yp->data.F64[3]*cos(c) +
+            yp->data.F64[4]*sin(c);
+
+    } else if(xStatus!=PS_LOOKUP_SUCCESS || yStatus!=PS_LOOKUP_SUCCESS)
+    {
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true, PS_ERRORTEXT_psTime_INTERPOLATION_FAILED);
+        return NULL;
+    }
+
+    // Create output sphere and convert arcsec to radians (i.e. x/60/60*PS_PI/180)
+    output = psAlloc(sizeof(psSphere));
+    output->r = x * PS_PI / 648000.0;
+    output->d = y * PS_PI / 648000.0;
+
+    return output;
+}
+
+double psTimeGetTAIDelta(const psTime *time)
+{
+    psU64 i = 0;
+    psF64 jd = 0.0;
+    psF64 mjd = 0.0;
+    psF64 out = 0.0;
+    psF64 const1 = 0.0;
+    psF64 const2 = 0.0;
+    psF64 const3 = 0.0;
+    psLookupTable* table = NULL;
+    psMetadataItem *tableMetadataItem = NULL;
+    psVector *stats = NULL;
+    psVector *results = NULL;
+
+    // Error checks
+    PS_PTR_CHECK_NULL(time,NAN);
+    PS_INT_CHECK_RANGE(time->nsec,0,1e9-1,NAN);
+
+    // Check time metadata
+    if(timeMetadata == NULL) {
+        if(!p_psTimeInit(p_psGetConfigFileName())) {
+            psError(PS_ERR_BAD_PARAMETER_VALUE, true, PS_ERRORTEXT_psTime_FILE_NOT_FOUND, "psTime.config");
+            return 0.0;
+        }
+    }
+
+    // Get table from metadata
+    tableMetadataItem = psMetadataLookup(timeMetadata, "taiTable");
+    if(tableMetadataItem == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true, PS_ERRORTEXT_psTime_LOOKUP_METADATA_FAILED, "taiTable");
+        return 0.0;
+    }
+    table = (psLookupTable*)tableMetadataItem->data.V;
+    PS_PTR_CHECK_NULL(table,0);
+
+    // Determine Julian and modified Julian dates used in table lookup and time delta calculation
+    jd = psTimeToJD(time);
+    mjd = psTimeToMJD(time);
+
+    stats = psVectorAlloc(table->numCols, PS_TYPE_U32);
+    results = psLookupTableInterpolateAll(table, jd, stats);
+
+    // Check for successful interpolation
+    for(i=0; i<stats->n; i++) {
+        if(stats->data.U32[i] == PS_LOOKUP_ERROR) {
+            psError(PS_ERR_BAD_PARAMETER_VALUE, true, PS_ERRORTEXT_psTime_INTERPOLATION_FAILED);
+        }
+    }
+
+    const1 = results->data.F64[0];
+    const2 = results->data.F64[1];
+    const3 = results->data.F64[2];
+    out = const1 + (mjd - const2) * const3;
+
+    psFree(stats);
+    psFree(results);
+
+    return out;
+}
+
+
+psS64 psTimeLeapSecondDelta(const psTime *time1, const psTime *time2)
+{
+    psS64 diff = 0;
+
+
+    // Error checks
+    PS_PTR_CHECK_NULL(time1,0);
+    PS_PTR_CHECK_NULL(time2,0);
+    PS_INT_CHECK_RANGE(time1->nsec,0,1e9-1,0);
+    PS_INT_CHECK_RANGE(time2->nsec,0,1e9-1,0);
+    diff = abs((psS64)psTimeGetTAIDelta((psTime*)time1)-(psS64)psTimeGetTAIDelta((psTime*)time2));
+
+    return diff;
+}
+
+double psTimeToJD(const psTime *time)
+{
+    double jd = 0.0;
+
+    // Error checks
+    PS_PTR_CHECK_NULL(time,NAN);
+    PS_INT_CHECK_RANGE(time->nsec,0,1e9-1,NAN);
+
+    // Julian date conversion
+    if(time->sec < 0) {
+        jd = time->sec / SEC_PER_DAY - time->nsec / NSEC_PER_DAY + 2440587.5; // psTime earlier than epoch
+    } else {
+        jd = time->sec / SEC_PER_DAY + time->nsec / NSEC_PER_DAY + 2440587.5; // psTime greater than epoch
+    }
+
+    return jd;
+}
+
+double psTimeToMJD(const psTime *time)
+{
+    double mjd = 0.0;
+
+
+    // Error checks
+    PS_PTR_CHECK_NULL(time,NAN);
+    PS_INT_CHECK_RANGE(time->nsec,0,1e9-1,NAN);
+
+    // Modified Julian date conversion
+    if(time->sec < 0) {
+        mjd = time->sec / SEC_PER_DAY - time->nsec / NSEC_PER_DAY + 40587.0; // psTime earlier than epoch
+    } else {
+        mjd = time->sec / SEC_PER_DAY + time->nsec / NSEC_PER_DAY + 40587.0; // psTime greater than epoch
+    }
+
+    return mjd;
+}
+
+char* psTimeToISO(const psTime *time)
+{
+    psS32 ms = 0;
+    char *timeString = NULL;
+    char *tempString = NULL;
+    struct tm *tmTime = NULL;
+    time_t sec;
+
+
+    // Error checks
+    PS_PTR_CHECK_NULL(time,NULL);
+    PS_INT_CHECK_RANGE(time->nsec,0,1e9-1,NULL);
+
+    tempString = psAlloc(MAX_TIME_STRING_LENGTH);
+    timeString = psAlloc(MAX_TIME_STRING_LENGTH);
+
+    ms = time->nsec / 1000000;
+    sec = time->sec;
+
+    // tmTime variable is statically allocated, no need to free
+    tmTime = gmtime(&sec);
+
+    // Converts psTime to YYYY-MM-DDThh:mm:ss.sss in string form
+    if (!strftime(tempString, MAX_TIME_STRING_LENGTH, "%Y-%m-%dT%H:%M:%S", tmTime)) {
+        psError(PS_ERR_OS_CALL_FAILED, true, PS_ERRORTEXT_psTime_CONVERT_TIME_TO_STRING_FAILED);
+    }
+
+    if (snprintf(timeString, MAX_TIME_STRING_LENGTH, "%s.%3.3dZ", tempString, ms) < 0) {
+        psError(PS_ERR_OS_CALL_FAILED, true, PS_ERRORTEXT_psTime_APPEND_MSEC_FAILED);
+    }
+    psFree(tempString);
+
+    return timeString;
+}
+
+struct timeval psTimeToTimeval(const psTime *time)
+{
+    struct timeval timevalTime;
+
+    timevalTime.tv_sec = 0;
+    timevalTime.tv_usec = 0;
+
+    // Error checks
+    PS_PTR_CHECK_NULL(time,timevalTime);
+    PS_INT_CHECK_RANGE(time->nsec,0,1e9-1,timevalTime);
+
+    timevalTime.tv_sec = time->sec;
+    timevalTime.tv_usec = time->nsec / 1000;
+
+    return timevalTime;
+}
+
+struct tm* psTimeToTM(const psTime *time)
+{
+    psS64 cent = 0;
+    psS64 year = 0;
+    psS64 month = 0;
+    psS64 day = 0;
+    psS64 hour = 0;
+    psS64 minute = 0;
+    psS64 seconds = 0;
+    psS64 temp = 0;
+    struct tm* tmTime = NULL;
+
+
+    // Error checks
+    PS_PTR_CHECK_NULL(time,NULL);
+    PS_INT_CHECK_RANGE(time->nsec,0,1e9-1,NULL);
+
+    seconds = time->sec%60;
+    minute = time->sec/60%60;
+    hour = time->sec/3600%24;
+    day = (time->sec+62135596800)/86400;
+
+    // Add 306 days to make relative to Mar 1, 0; also adjust day to be within a range (1..2**28-1) where our
+    // calculations will work with 32bit ints
+    if(day > (pow(2, 28)-307))
+    {
+        temp = (day - 146097+306)/146097+1;         // Avoid overflow if day close to maxint
+        day -= temp * 146097-306;
+    } else if((day += 306) <= 0)
+    {
+        temp = -( -day / 146097 + 1);               // Avoid ambiguity in C division of negatives
+        day -= temp * 146097;
+    }
+
+    cent = (day*4-1)/146097;                        // Calc number of centuries day is after 29 Feb of yr 0
+    day -= cent*146097/4;                           // 4 centuries = 146097 days
+    year = (day*4-1)/1461;                          // Calc number of years into the century
+    day -= year*1461/4;                             // Again March-based (4 yrs =\u02dc 146[01] days)
+    month = (day*12+1093)/367;                      // Get the month (3..14 represent March through
+    day -= (month*367-1094)/12;                     // February of following year)
+    year += cent*100+temp*400;                      // Get the real year, which is off by
+
+    // One if month is January or February
+    if(month > 12)
+    {
+        year++;
+        month -= 12;
+    }
+
+    // Allocate output
+    tmTime = (struct tm*)psAlloc(sizeof(struct tm));
+
+    tmTime->tm_year = year - 1900;
+    tmTime->tm_mon = month - 1;
+    tmTime->tm_mday = day + 1;
+    tmTime->tm_hour = hour;
+    tmTime->tm_min = minute;
+    tmTime->tm_sec = seconds;
+    tmTime->tm_isdst = -1;
+
+    return tmTime;
+}
+
+psTime* psTimeFromJD(double time)
+{
+    double days = 0.0;
+    double seconds = 0.0;
+    psTime *outTime = NULL;
+
+
+    // Allocate psTime struct
+    outTime = psTimeAlloc(PS_TIME_TAI);
+
+    // Julian date conversion courtesy of Eugene Magnier
+    days = time - 2440587.5;
+    seconds = days * SEC_PER_DAY;
+    if(seconds < 0.0) {
+        outTime->nsec = (seconds - (psS64)seconds) * -1000000000.0;  // psTime earlier than epoch
+    } else {
+        outTime->nsec = (seconds - (psS64)seconds) * 1000000000.0;   // psTime greater than epoch
+    }
+    outTime->sec = seconds;
+
+    // Error check
+    PS_INT_CHECK_RANGE(outTime->nsec,0,1e9-1,outTime);
+
+    return outTime;
+}
+
+psTime* psTimeFromMJD(double time)
+{
+    double days = 0.0;
+    double seconds = 0.0;
+    psTime *outTime = NULL;
+
+
+    // Allocate psTime struct
+    outTime = psTimeAlloc(PS_TIME_TAI);
+
+    // Modified Julian date conversion courtesy of Eugene Magnier
+    days = time - 40587.0;
+    seconds = days * SEC_PER_DAY;
+    if(seconds < 0.0) {
+        outTime->nsec = (seconds - (psS64)seconds) * -1000000000.0;  // psTime earlier than epoch
+    } else {
+        outTime->nsec = (seconds - (psS64)seconds) * 1000000000.0;   // psTime greater than epoch
+    }
+    outTime->sec = seconds;
+
+    // Error check
+    PS_INT_CHECK_RANGE(outTime->nsec,0,1e9-1,outTime);
+
+    return outTime;
+}
+
+psTime* psTimeFromISO(const char *time)
+{
+    psS32 millisecond;
+    struct tm tmTime;
+    psTime *outTime = NULL;
+
+    // Convert YYYY-MM-DDThh:mm:ss.sss in string form to tm time
+    if (sscanf(time, "%d-%d-%dT%d:%d:%d.%d", &tmTime.tm_year, &tmTime.tm_mon, &tmTime.tm_mday,
+               &tmTime.tm_hour, &tmTime.tm_min, &tmTime.tm_sec,&millisecond) < 7) {
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true, PS_ERRORTEXT_psTime_ISOTIME_MALFORMED, time);
+        return NULL;
+    }
+
+    PS_INT_CHECK_NON_NEGATIVE(tmTime.tm_year, outTime);
+    PS_INT_CHECK_RANGE(tmTime.tm_mon,1,12,outTime);
+    PS_INT_CHECK_RANGE(tmTime.tm_mday,1,31,outTime);
+    PS_INT_CHECK_RANGE(tmTime.tm_hour,0,23,outTime);
+    PS_INT_CHECK_RANGE(tmTime.tm_min,0,59,outTime);
+    PS_INT_CHECK_RANGE(tmTime.tm_sec,0,59,outTime);
+    PS_INT_CHECK_RANGE(millisecond,0,999,outTime);
+
+    tmTime.tm_year -= 1900;
+    tmTime.tm_mon--;
+    tmTime.tm_isdst = -1;
+
+    // Convert tm time to psTime
+    outTime = psTimeFromTM(&tmTime);
+    outTime->nsec = millisecond * 1000000;
+
+    return outTime;
+}
+
+psTime* psTimeFromTimeval(const struct timeval *time)
+{
+    psTime *outTime = NULL;
+
+
+    // Error check
+    PS_PTR_CHECK_NULL(time,NULL);
+
+    // Allocate psTime struct
+    outTime = psTimeAlloc(PS_TIME_TAI);
+
+    // Convert to psTime
+    outTime->sec = time->tv_sec;
+    outTime->nsec = time->tv_usec * 1000;
+
+    // Error check
+    PS_INT_CHECK_RANGE(outTime->nsec,0,1e9-1,outTime);
+
+    return outTime;
+}
+
+psTime* psTimeFromTM(const struct tm* time)
+{
+    psS64 year;
+    psS64 month;
+    psS64 day;
+    psS64 hour;
+    psS64 minute;
+    psS64 seconds;
+    psS64 temp;
+    psTime *outTime = NULL;
+
+
+    // Error check
+    PS_PTR_CHECK_NULL(time,NULL);
+
+    // Allocate psTime struct
+    outTime = psTimeAlloc(PS_TIME_TAI);
+
+    // Extract data from TM struct
+    year = time->tm_year + 1900;
+    month = time->tm_mon + 1;
+    day = time->tm_mday;
+    hour = time->tm_hour;
+    minute = time->tm_min;
+    seconds = time->tm_sec;
+
+    // Make month in range 3..14 (treat Jan & Feb as months 13..14 of prev year)
+    if( month <= 2 )
+    {
+        year -= (temp = (14 - month) / 12);
+        month += 12 * temp;
+    } else if(month > 14)
+    {
+        year += (temp = (month - 3) / 12);
+        month -= 12 * temp;
+    }
+
+    // Make year positive
+    if (year < 0 )
+    {
+        day -= 146097 * (temp = (399 - year) / 400);
+        year += 400 * temp;
+    }
+
+    // Add day of month, days of previous 0-11 month period that began w/March, days of previous 0-399 year
+    // period that began w/March of a 400-multiple year), days of any 400-year periods before that, and 306
+    // days to adjust from Mar 1, year 0-relative to Jan 1, year 1-relative. Add hours, minutes, and seconds.
+    day += (month * 367 - 1094) / 12 + year % 100 * 1461 / 4 + (year/100 * 36524 + year/400) - 306;
+    outTime->sec = (((day - 1) * SEC_PER_DAY) - 62135596800) + hour*SEC_PER_HOUR + minute*SEC_PER_MINUTE + seconds;
+
+    // C's TM does not define a microsecond field. Microseconds must be manipulated by calling function.
+    outTime->nsec = 0;
+
+    // Error check
+    PS_INT_CHECK_RANGE(outTime->nsec,0,1e9-1,outTime);
+
+    return outTime;
+}
+
+psTime* psTimeMath(const psTime *time, psF64 delta)
+{
+    psF64 sec = 0.0;
+    psTime *outTime = NULL;
+    psTime *tempTime = NULL;
+
+
+    // Error checks
+    PS_PTR_CHECK_NULL(time,NULL);
+    PS_INT_CHECK_RANGE(time->nsec,0,1e9-1,NULL);
+
+    // Convert time to TAI if necessary, but without changing input arguments
+    if(time->type == PS_TIME_UTC) {
+        tempTime = psTimeAlloc(PS_TIME_UTC);
+        tempTime->sec = time->sec;
+        tempTime->nsec = time->nsec;
+        tempTime = psTimeConvert(tempTime, PS_TIME_TAI);
+    } else {
+        tempTime = psMemIncrRefCounter((psTime*)time);
+    }
+
+    // Create output time
+    outTime = psTimeAlloc(PS_TIME_TAI);
+    sec = delta + (psF64)tempTime->sec + (psF64)tempTime->nsec/1e9;
+    outTime->sec = sec;
+    outTime->nsec = (sec - outTime->sec)*1e9;
+
+    // Error check
+    PS_INT_CHECK_RANGE(outTime->nsec,0,1e9-1,outTime);
+
+    // Convert result to same time type as input
+    if(time->type == PS_TIME_UTC) {
+        outTime = psTimeConvert(outTime, PS_TIME_UTC);
+    }
+
+    psFree(tempTime);
+
+    return outTime;
+}
+
+psF64 psTimeDelta(const psTime *time1, const psTime *time2)
+{
+    psF64 out = 0.0;
+    psF64 uSec1 = 0.0;
+    psF64 uSec2 = 0.0;
+    psTime *tempTime1 = NULL;
+    psTime *tempTime2 = NULL;
+
+
+    // Error checks
+    PS_PTR_CHECK_NULL(time1,0.0);
+    PS_INT_CHECK_RANGE(time1->nsec,0,1e9-1,0.0);
+    PS_PTR_CHECK_NULL(time2,0.0);
+    PS_INT_CHECK_RANGE(time2->nsec,0,1e9-1,0.0);
+
+    // Convert time to TAI if necessary, but without changing input arguments
+    if(time1->type == PS_TIME_UTC) {
+        tempTime1 = psTimeAlloc(PS_TIME_UTC);
+        tempTime1->sec = time1->sec;
+        tempTime1->nsec = time1->nsec;
+        tempTime1 = psTimeConvert(tempTime1, PS_TIME_TAI);
+    } else {
+        tempTime1 = psMemIncrRefCounter((psTime*)time1);
+    }
+    if(time2->type == PS_TIME_UTC) {
+        tempTime2 = psTimeAlloc(PS_TIME_UTC);
+        tempTime2->sec = time2->sec;
+        tempTime2->nsec = time2->nsec;
+        tempTime2 = psTimeConvert(tempTime2, PS_TIME_TAI);
+    } else {
+        tempTime2 = psMemIncrRefCounter((psTime*)time2);
+    }
+
+    uSec1 = tempTime1->sec >= 0 ? 1.0 : -1.0;
+    uSec1 = uSec1*tempTime1->nsec/1e9;
+    uSec2 = tempTime2->sec >= 0 ? 1.0 : -1.0;
+    uSec2 = uSec2*tempTime2->nsec/1e9;
+    out = (tempTime1->sec-tempTime2->sec) + (uSec1-uSec2);
+
+    psFree(tempTime1);
+    psFree(tempTime2);
+
+    return out;
+}
+
Index: /tags/ipp-1-X/bug123/psLib/src/astronomy/psTime.h
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/astronomy/psTime.h	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/astronomy/psTime.h	(revision 22331)
@@ -0,0 +1,308 @@
+/** @file  psTime.h
+ *
+ *  @brief Definitions for time, time utilities, and conversion functions for use with psLib astronomy
+ *  functions.
+ *
+ *  A collection of functions are required by psLib to manipulate time data. These functions primarily consist
+ *  of conversions between specific time formats.  They use the UNIX timeval time system as the
+ *  base upon which International Atomic Time (TAI) and Universal Time Coordinated (UTC) are calculated.
+ *
+ *  @author Ross Harman, MHPCC
+ *
+ *  @version $Revision: 1.28 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-04-19 02:44:12 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+
+
+#ifndef PSTIME_H
+#define PSTIME_H
+
+#include <time.h>
+#include <sys/types.h>
+#include <sys/time.h>
+
+#include "psType.h"
+#include "psImage.h"
+
+struct psSphere;
+
+/// @addtogroup Time
+/// @{
+
+
+/** Time type.
+ *
+ * Enumeration for psTime types, TAI or UTC time.
+ */
+typedef enum {
+    PS_TIME_TAI,        ///< Temps Atomique International (TAI) time (time with leapseconds).
+    PS_TIME_UTC,        ///< Universal Time Coordinated (UTC) time (time without leapseconds).
+    PS_TIME_UT1,        ///< Universal Time corrected for polar motion
+    PS_TIME_TT,         ///< Terrestrial Time
+} psTimeType;
+
+/** Time Bulletin type
+ *
+ * Enumeration for psTimeBulletin type, A or B.
+ */
+typedef enum {
+    PS_IERS_A,          ///< IERS Bulletin A
+    PS_IERS_B,          ///< IERS Bulletin B
+} psTimeBulletin;
+
+/** Definition of psTime.
+ *
+ *  The psTime struct is used by psLib to represent time values critical to
+ *  astronomical calculations.  This structure represents a time which is
+ *  equivalent to TAI (International Atomic Time) and is measured in both
+ *  seconds and microseconds.
+ */
+typedef struct psTime
+{
+    psS64 sec;          ///< Seconds since epoch, Jan 1, 1970.
+    psU32 nsec;         ///< Nanoseconds since last second.
+    psBool leapsecond;  ///< if time falls on UTC leapsecond
+    psTimeType type;    ///< Type of time.
+}
+psTime;
+
+
+/** Initialize time data.
+ *
+ * Reads config and data files associated with various time conversions.
+ *
+ * @return  bool: True for success, false for failure.
+ */
+psBool p_psTimeInit(const char *fileName);
+
+/** Free memory persistant time data.
+ *
+ * Frees time data to be held in memory until the end of successful program execution.
+ *
+ * @return  void: void.
+ */
+psBool p_psTimeFinalize(void);
+
+/** Allocate time struct.
+ *
+ * Allocates an empty time struct. User must specify the psTimeType (PS_TIME_TAI or PS_TIME_UTC) in the argument.
+ * The seconds and microseconds members of the struct are set to zero.
+ *
+ * @return  psTime*: Struct with empty time.
+ */
+psTime* psTimeAlloc(
+    psTimeType type                     ///< Type of time to create (UTC or TAI).
+);
+
+/** Get current time.
+ *
+ * Gets current time from the system clock. User must specify the psTimeType (PS_TIME_TAI or PS_TIME_UTC) in
+ * the argument.
+ *
+ *  @return  psTime*: Struct with current time.
+ */
+psTime* psTimeGetNow(
+    psTimeType type                     ///< Type of time to get (UTC or TAI).
+);
+
+/** Convert psTime to UTC or TAI time.
+ *
+ *  Converts psTime to UTC or TAI time based on the psTimeType argument.
+ *
+ *  @return  psTime*: Pointer to psTime.
+ */
+psTime* psTimeConvert(
+    psTime *time,                       ///< Time to be converted.
+    psTimeType type                     ///< Type to be converted to.
+);
+
+/** Convert psTime to Local Mean Sidereal Time (LMST).
+ *
+ *  Converts psTime at the given longitude to LMST time. If the input time is not in UTC format, then it is
+ *  converted.
+ *
+ *  @return  double: LST Time.
+ */
+double psTimeToLMST(
+    psTime *time,                       ///< psTime to be converted.
+    double longitude                    ///< Longitude.
+);
+
+/** Determine UT1 - UTC from table lookup.
+ *
+ *  This function is necessary to for various SLALIB functions.
+ *
+ *  @return  double: Time difference.
+ */
+double psTimeGetUT1Delta(
+    const psTime *time                  ///< psTime to be looked up.
+);
+
+/** Determine TAI - UTC from table lookup.
+ *
+ *  This function is necessary to for various psTime functions.
+ *
+ *  @return  double: Time difference.
+ */
+double psTimeGetTAIDelta(
+    const psTime *time                  ///< psTime to be looked up.
+);
+
+/** Determine polar coordinates at a given time.
+ *
+ *  Determines the orientation of the polar axis at the given time.
+ *
+ *  @return  psSphere*: Spherical coordinates of Earth's polar axias.
+ */
+struct psSphere* psTimeGetPoleCoords(
+                const psTime *time                  ///< psTime determine polar orientation.
+            );
+
+/** Calculate the number of leapseconds between two times.
+ *
+ *  Calculates the number of leapseconds between two times.
+ *
+ *  @return  psS64: leapseconds added between given times
+ */
+psS64 psTimeLeapSecondDelta(
+    const psTime* time1,                ///< First input time.
+    const psTime* time2                 ///< Second input time.
+);
+
+/** Convert psTime to Julian date time.
+ *
+ *  Converts psTime to Julian date (JD) time. This function does not add or subtract leapseconds.
+ *
+ *  @return  double: Julian Date (JD) time.
+ */
+double psTimeToJD(
+    const psTime* time                  ///< Input time to be converted.
+);
+/** Convert psTime to modified Julian date time.
+ *
+ *  Converts psTime to modified Julian date (MJD) time. This function does not add or subtract leapseconds.
+ *
+ *  @return  double: Modified Julian Days (MJD) time.
+ */
+double psTimeToMJD(
+    const psTime* time                  ///< Input time to be converted.
+);
+
+/** Convert psTime to ISO8601 formatted string.
+ *
+ *  Converts psTime to a null terminated string in the form of YYYY-MM-DDThh:mm:ss.sss. This function does not
+ *  add or subtract leapseconds.
+ *
+ *  @return  char*: Pointer null terminated array of chars in ISO time.
+ */
+char* psTimeToISO(
+    const psTime* time                  ///< Input time to be converted.
+);
+
+/** Convert psTime to timeval time.
+ *
+ *  Converts psTime to timeval time. This function does not add or subtract leapseconds.
+ *
+ *  @return  timeval: timeval struct time.
+ */
+struct timeval psTimeToTimeval(
+                const psTime* time                  ///< Input time to be converted.
+            );
+
+/** Convert psTime to tm time.
+ *
+ * Converts psTime to tm time. This function is based on a Perl algorithm availble in the Pan-STARRS Image
+ * processing Algorithm Design Description (ADD). This function does not add or subtract leapseconds.
+ *
+ *  @return  tm: tm struct time.
+ */
+struct tm* psTimeToTM(
+                const psTime *time                  ///< Input time to be converted.
+            );
+
+/** Convert JD to psTime.
+ *
+ *  Converts JD time to psTime. This function does not add or subtract leapseconds.
+ *
+ *  @return  psTime: time.
+ */
+psTime* psTimeFromJD(
+    double time                         ///< Input time to be converted.
+);
+
+/** Convert MJD to psTime.
+ *
+ *  Converts MJD time to psTime. This function does not add or subtract leapseconds.
+ *
+ *  @return  psTime: time.
+ */
+psTime* psTimeFromMJD(
+    double time                         ///< Input time to be converted.
+);
+
+/** Convert ISO to psTime.
+ *
+ *  Converts ISO time to psTime. This function does not add or subtract leapseconds.
+ *
+ *  @return  psTime*: time
+ */
+psTime* psTimeFromISO(
+    const char* time                    ///< Input time to be converted.
+);
+
+/** Convert timeval to psTime.
+ *
+ *  Converts timeval time to psTime. This function does not add or subtract leapseconds.
+ *
+ *  @return  psTime*: time.
+ */
+psTime* psTimeFromTimeval(
+    const struct timeval *time          ///< Input time to be converted.
+);
+
+/** Convert tm time to psTime.
+ *
+ *  Converts tm time to psTime. This function is based on a Perl algorithm availble in the Pan-STARRS Image
+ * processing Algorithm Design Description (ADD). This function does not add or subtract leapseconds.
+ *
+ *  @return  psTime*: time.
+ */
+psTime* psTimeFromTM(
+    const struct tm *time               ///< Input time to be converted.
+);
+
+/** Adds delta to time. Result is in TAI time.
+ *
+ *  Adds delta to time. Input time is converted to TAI format if necessary.
+ *
+ *  @return  psTime*: time.
+ */
+psTime* psTimeMath(
+    const psTime *time,                 ///< Time.
+    psF64 delta                         ///< Time delta.
+);
+
+/** Determine difference between two times. Result is in TAI time.
+ *
+ *  Determine difference between two times. Input times are converted to TAI format if necessary.
+ *
+ *  @return psF64: Time difference.
+ */
+psF64 psTimeDelta(
+    const psTime *time1,                ///< First time.
+    const psTime *time2                 ///< Second time.
+);
+
+/** Get the filename of the psLib configuration file.
+ *
+ *  @return char*          If a PS_CONFIG_FILE environment variable exists,
+ *                         that is returned, otherwise the default location
+ *                         dependent on the installation location.
+ */
+char* p_psGetConfigFileName();
+
+/// @}
+
+#endif
Index: /tags/ipp-1-X/bug123/psLib/src/astronomy/refco.f
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/astronomy/refco.f	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/astronomy/refco.f	(revision 22331)
@@ -0,0 +1,87 @@
+      SUBROUTINE sla_REFCO (HM, TDK, PMB, RH, WL, PHI, TLR, EPS,
+     :                      REFA, REFB)
+*+
+*     - - - - - -
+*      R E F C O
+*     - - - - - -
+*
+*  Determine the constants A and B in the atmospheric refraction
+*  model dZ = A tan Z + B tan**3 Z.
+*
+*  Z is the "observed" zenith distance (i.e. affected by refraction)
+*  and dZ is what to add to Z to give the "topocentric" (i.e. in vacuo)
+*  zenith distance.
+*
+*  Given:
+*    HM      d     height of the observer above sea level (metre)
+*    TDK     d     ambient temperature at the observer (deg K)
+*    PMB     d     pressure at the observer (millibar)
+*    RH      d     relative humidity at the observer (range 0-1)
+*    WL      d     effective wavelength of the source (micrometre)
+*    PHI     d     latitude of the observer (radian, astronomical)
+*    TLR     d     temperature lapse rate in the troposphere (degK/metre)
+*    EPS     d     precision required to terminate iteration (radian)
+*
+*  Returned:
+*    REFA    d     tan Z coefficient (radian)
+*    REFB    d     tan**3 Z coefficient (radian)
+*
+*  Called:  sla_REFRO
+*
+*  Notes:
+*
+*  1  Typical values for the TLR and EPS arguments might be 0.0065D0 and
+*     1D-10 respectively.
+*
+*  2  The radio refraction is chosen by specifying WL > 100 micrometres.
+*
+*  3  The routine is a slower but more accurate alternative to the
+*     sla_REFCOQ routine.  The constants it produces give perfect
+*     agreement with sla_REFRO at zenith distances arctan(1) (45 deg)
+*     and arctan(4) (about 76 deg).  It achieves 0.5 arcsec accuracy
+*     for ZD < 80 deg, 0.01 arcsec accuracy for ZD < 60 deg, and
+*     0.001 arcsec accuracy for ZD < 45 deg.
+*
+*  P.T.Wallace   Starlink   3 June 1997
+*
+*  Copyright (C) 1997 Rutherford Appleton Laboratory
+*
+*  License:
+*    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 (see SLA_CONDITIONS); if not, write to the 
+*    Free Software Foundation, Inc., 59 Temple Place, Suite 330, 
+*    Boston, MA  02111-1307  USA
+*
+*-
+
+      IMPLICIT NONE
+
+      DOUBLE PRECISION HM,TDK,PMB,RH,WL,PHI,TLR,EPS,REFA,REFB
+
+      DOUBLE PRECISION ATN1,ATN4,R1,R2
+
+*  Sample zenith distances: arctan(1) and arctan(4)
+      PARAMETER (ATN1=0.7853981633974483D0,
+     :           ATN4=1.325817663668033D0)
+
+
+
+*  Determine refraction for the two sample zenith distances
+      CALL sla_REFRO(ATN1,HM,TDK,PMB,RH,WL,PHI,TLR,EPS,R1)
+      CALL sla_REFRO(ATN4,HM,TDK,PMB,RH,WL,PHI,TLR,EPS,R2)
+
+*  Solve for refraction constants
+      REFA = (64D0*R1-R2)/60D0
+      REFB = (R2-4D0*R1)/60D0
+
+      END
Index: /tags/ipp-1-X/bug123/psLib/src/astronomy/refro.f
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/astronomy/refro.f	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/astronomy/refro.f	(revision 22331)
@@ -0,0 +1,401 @@
+      SUBROUTINE sla_REFRO (ZOBS, HM, TDK, PMB, RH, WL, PHI, TLR,
+     :                      EPS, REF)
+*+
+*     - - - - - -
+*      R E F R O
+*     - - - - - -
+*
+*  Atmospheric refraction for radio and optical/IR wavelengths.
+*
+*  Given:
+*    ZOBS    d  observed zenith distance of the source (radian)
+*    HM      d  height of the observer above sea level (metre)
+*    TDK     d  ambient temperature at the observer (deg K)
+*    PMB     d  pressure at the observer (millibar)
+*    RH      d  relative humidity at the observer (range 0-1)
+*    WL      d  effective wavelength of the source (micrometre)
+*    PHI     d  latitude of the observer (radian, astronomical)
+*    TLR     d  temperature lapse rate in the troposphere (K/metre)
+*    EPS     d  precision required to terminate iteration (radian)
+*
+*  Returned:
+*    REF     d  refraction: in vacuo ZD minus observed ZD (radian)
+*
+*  Notes:
+*
+*  1  A suggested value for the TLR argument is 0.0065D0.  The
+*     refraction is significantly affected by TLR, and if studies
+*     of the local atmosphere have been carried out a better TLR
+*     value may be available.  The sign of the supplied TLR value
+*     is ignored.
+*
+*  2  A suggested value for the EPS argument is 1D-8.  The result is
+*     usually at least two orders of magnitude more computationally
+*     precise than the supplied EPS value.
+*
+*  3  The routine computes the refraction for zenith distances up
+*     to and a little beyond 90 deg using the method of Hohenkerk
+*     and Sinclair (NAO Technical Notes 59 and 63, subsequently adopted
+*     in the Explanatory Supplement, 1992 edition - see section 3.281).
+*
+*  4  The code is a development of the optical/IR refraction subroutine
+*     AREF of C.Hohenkerk (HMNAO, September 1984), with extensions to
+*     support the radio case.  Apart from merely cosmetic changes, the
+*     following modifications to the original HMNAO optical/IR refraction
+*     code have been made:
+*
+*     .  The angle arguments have been changed to radians.
+*
+*     .  Any value of ZOBS is allowed (see note 6, below).
+*
+*     .  Other argument values have been limited to safe values.
+*
+*     .  Murray's values for the gas constants have been used
+*        (Vectorial Astrometry, Adam Hilger, 1983).
+*
+*     .  The numerical integration phase has been rearranged for
+*        extra clarity.
+*
+*     .  A better model for Ps(T) has been adopted (taken from
+*        Gill, Atmosphere-Ocean Dynamics, Academic Press, 1982).
+*
+*     .  More accurate expressions for Pwo have been adopted
+*        (again from Gill 1982).
+*
+*     .  Provision for radio wavelengths has been added using
+*        expressions devised by A.T.Sinclair, RGO (private
+*        communication 1989).  The refractivity model currently
+*        used is from J.M.Rueger, "Refractive Index Formulae for
+*        Electronic Distance Measurement with Radio and Millimetre
+*        Waves", in Unisurv Report S-68 (2002), School of Surveying
+*        and Spatial Information Systems, University of New South
+*        Wales, Sydney, Australia.
+*
+*     .  Various small changes have been made to gain speed.
+*
+*     None of the changes significantly affects the optical/IR results
+*     with respect to the algorithm given in the 1992 Explanatory
+*     Supplement.  For example, at 70 deg zenith distance the present
+*     routine agrees with the ES algorithm to better than 0.05 arcsec
+*     for any reasonable combination of parameters.  However, the
+*     improved water-vapour expressions do make a significant difference
+*     in the radio band, at 70 deg zenith distance reaching almost
+*     4 arcsec for a hot, humid, low-altitude site during a period of
+*     low pressure.
+*
+*  5  The radio refraction is chosen by specifying WL > 100 micrometres.
+*     Because the algorithm takes no account of the ionosphere, the
+*     accuracy deteriorates at low frequencies, below about 30 MHz.
+*
+*  6  Before use, the value of ZOBS is expressed in the range +/- pi.
+*     If this ranged ZOBS is -ve, the result REF is computed from its
+*     absolute value before being made -ve to match.  In addition, if
+*     it has an absolute value greater than 93 deg, a fixed REF value
+*     equal to the result for ZOBS = 93 deg is returned, appropriately
+*     signed.
+*
+*  7  As in the original Hohenkerk and Sinclair algorithm, fixed values
+*     of the water vapour polytrope exponent, the height of the
+*     tropopause, and the height at which refraction is negligible are
+*     used.
+*
+*  8  The radio refraction has been tested against work done by
+*     Iain Coulson, JACH, (private communication 1995) for the
+*     James Clerk Maxwell Telescope, Mauna Kea.  For typical conditions,
+*     agreement at the 0.1 arcsec level is achieved for moderate ZD,
+*     worsening to perhaps 0.5-1.0 arcsec at ZD 80 deg.  At hot and
+*     humid sea-level sites the accuracy will not be as good.
+*
+*  9  It should be noted that the relative humidity RH is formally
+*     defined in terms of "mixing ratio" rather than pressures or
+*     densities as is often stated.  It is the mass of water per unit
+*     mass of dry air divided by that for saturated air at the same
+*     temperature and pressure (see Gill 1982).
+*
+*  10 The algorithm is designed for observers in the troposphere.  The
+*     supplied temperature, pressure and lapse rate are assumed to be
+*     for a point in the troposphere and are used to define a model
+*     atmosphere with the tropopause at 11km altitude and a constant
+*     temperature above that.  However, in practice, the refraction
+*     values returned for stratospheric observers, at altitudes up to
+*     25km, are quite usable.
+*
+*  Called:  sla_DRANGE, sla__ATMT, sla__ATMS
+*
+*  P.T.Wallace   Starlink   28 May 2002
+*
+*  Copyright (C) 2002 Rutherford Appleton Laboratory
+*
+*  License:
+*    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 (see SLA_CONDITIONS); if not, write to the 
+*    Free Software Foundation, Inc., 59 Temple Place, Suite 330, 
+*    Boston, MA  02111-1307  USA
+*
+*-
+
+      IMPLICIT NONE
+
+      DOUBLE PRECISION ZOBS,HM,TDK,PMB,RH,WL,PHI,TLR,EPS,REF
+
+*
+*  Fixed parameters
+*
+      DOUBLE PRECISION D93,GCR,DMD,DMW,S,DELTA,HT,HS
+      INTEGER ISMAX
+*  93 degrees in radians
+      PARAMETER (D93=1.623156204D0)
+*  Universal gas constant
+      PARAMETER (GCR=8314.32D0)
+*  Molecular weight of dry air
+      PARAMETER (DMD=28.9644D0)
+*  Molecular weight of water vapour
+      PARAMETER (DMW=18.0152D0)
+*  Mean Earth radius (metre)
+      PARAMETER (S=6378120D0)
+*  Exponent of temperature dependence of water vapour pressure
+      PARAMETER (DELTA=18.36D0)
+*  Height of tropopause (metre)
+      PARAMETER (HT=11000D0)
+*  Upper limit for refractive effects (metre)
+      PARAMETER (HS=80000D0)
+*  Numerical integration: maximum number of strips.
+      PARAMETER (ISMAX=16384)
+
+      INTEGER IS,K,N,I,J
+      LOGICAL OPTIC,LOOP
+      DOUBLE PRECISION ZOBS1,ZOBS2,HMOK,TDKOK,PMBOK,RHOK,WLOK,ALPHA,
+     :                 TOL,WLSQ,GB,A,GAMAL,GAMMA,GAMM2,DELM2,
+     :                 TDC,PSAT,PWO,W,
+     :                 C1,C2,C3,C4,C5,C6,R0,TEMPO,DN0,RDNDR0,SK0,F0,
+     :                 RT,TT,DNT,RDNDRT,SINE,ZT,FT,DNTS,RDNDRP,ZTS,FTS,
+     :                 RS,DNS,RDNDRS,ZS,FS,REFOLD,Z0,ZRANGE,FB,FF,FO,FE,
+     :                 H,R,SZ,RG,DR,TG,DN,RDNDR,T,F,REFP,REFT
+
+      DOUBLE PRECISION sla_DRANGE
+
+*  The refraction integrand
+      DOUBLE PRECISION REFI
+      REFI(DN,RDNDR) = RDNDR/(DN+RDNDR)
+
+
+
+*  Transform ZOBS into the normal range.
+      ZOBS1 = sla_DRANGE(ZOBS)
+      ZOBS2 = MIN(ABS(ZOBS1),D93)
+
+*  Keep other arguments within safe bounds.
+      HMOK = MIN(MAX(HM,-1D3),HS)
+      TDKOK = MIN(MAX(TDK,100D0),500D0)
+      PMBOK = MIN(MAX(PMB,0D0),10000D0)
+      RHOK = MIN(MAX(RH,0D0),1D0)
+      WLOK = MAX(WL,0.1D0)
+      ALPHA = MIN(MAX(ABS(TLR),0.001D0),0.01D0)
+
+*  Tolerance for iteration.
+      TOL = MIN(MAX(ABS(EPS),1D-12),0.1D0)/2D0
+
+*  Decide whether optical/IR or radio case - switch at 100 microns.
+      OPTIC = WLOK.LE.100D0
+
+*  Set up model atmosphere parameters defined at the observer.
+      WLSQ = WLOK*WLOK
+      GB = 9.784D0*(1D0-0.0026D0*COS(PHI+PHI)-0.00000028D0*HMOK)
+      IF (OPTIC) THEN
+         A = (287.604D0+(1.6288D0+0.0136D0/WLSQ)/WLSQ)
+     :                                              *273.15D-6/1013.25D0
+      ELSE
+         A = 77.6890D-6
+      END IF
+      GAMAL = (GB*DMD)/GCR
+      GAMMA = GAMAL/ALPHA
+      GAMM2 = GAMMA-2D0
+      DELM2 = DELTA-2D0
+      TDC = TDKOK-273.15D0
+      PSAT = 10D0**((0.7859D0+0.03477D0*TDC)/(1D0+0.00412D0*TDC))*
+     :                                (1D0+PMBOK*(4.5D-6+6D-10*TDC*TDC))
+      IF (PMBOK.GT.0D0) THEN
+         PWO = RHOK*PSAT/(1D0-(1D0-RHOK)*PSAT/PMBOK)
+      ELSE
+         PWO = 0D0
+      END IF
+      W = PWO*(1D0-DMW/DMD)*GAMMA/(DELTA-GAMMA)
+      C1 = A*(PMBOK+W)/TDKOK
+      IF (OPTIC) THEN
+         C2 = (A*W+11.2684D-6*PWO)/TDKOK
+      ELSE
+         C2 = (A*W+6.3938D-6*PWO)/TDKOK
+      END IF
+      C3 = (GAMMA-1D0)*ALPHA*C1/TDKOK
+      C4 = (DELTA-1D0)*ALPHA*C2/TDKOK
+      IF (OPTIC) THEN
+         C5 = 0D0
+         C6 = 0D0
+      ELSE
+         C5 = 375463D-6*PWO/TDKOK
+         C6 = C5*DELM2*ALPHA/(TDKOK*TDKOK)
+      END IF
+
+*  Conditions at the observer.
+      R0 = S+HMOK
+      CALL sla__ATMT(R0,TDKOK,ALPHA,GAMM2,DELM2,C1,C2,C3,C4,C5,C6,
+     :                                              R0,TEMPO,DN0,RDNDR0)
+      SK0 = DN0*R0*SIN(ZOBS2)
+      F0 = REFI(DN0,RDNDR0)
+
+*  Conditions in the troposphere at the tropopause.
+      RT = S+MAX(HT,HMOK)
+      CALL sla__ATMT(R0,TDKOK,ALPHA,GAMM2,DELM2,C1,C2,C3,C4,C5,C6,
+     :                                                 RT,TT,DNT,RDNDRT)
+      SINE = SK0/(RT*DNT)
+      ZT = ATAN2(SINE,SQRT(MAX(1D0-SINE*SINE,0D0)))
+      FT = REFI(DNT,RDNDRT)
+
+*  Conditions in the stratosphere at the tropopause.
+      CALL sla__ATMS(RT,TT,DNT,GAMAL,RT,DNTS,RDNDRP)
+      SINE = SK0/(RT*DNTS)
+      ZTS = ATAN2(SINE,SQRT(MAX(1D0-SINE*SINE,0D0)))
+      FTS = REFI(DNTS,RDNDRP)
+
+*  Conditions at the stratosphere limit.
+      RS = S+HS
+      CALL sla__ATMS(RT,TT,DNT,GAMAL,RS,DNS,RDNDRS)
+      SINE = SK0/(RS*DNS)
+      ZS = ATAN2(SINE,SQRT(MAX(1D0-SINE*SINE,0D0)))
+      FS = REFI(DNS,RDNDRS)
+
+*
+*  Integrate the refraction integral in two parts;  first in the
+*  troposphere (K=1), then in the stratosphere (K=2).
+*
+      DO K = 1,2
+
+*     Initialize previous refraction to ensure at least two iterations.
+         REFOLD = 1D0
+
+*     Start off with 8 strips.
+         IS = 8
+
+*     Start Z, Z range, and start and end values.
+         IF (K.EQ.1) THEN
+            Z0 = ZOBS2
+            ZRANGE = ZT-Z0
+            FB = F0
+            FF = FT
+         ELSE
+            Z0 = ZTS
+            ZRANGE = ZS-Z0
+            FB = FTS
+            FF = FS
+         END IF
+
+*     Sums of odd and even values.
+         FO = 0D0
+         FE = 0D0
+
+*     First time through the loop we have to do every point.
+         N = 1
+
+*     Start of iteration loop (terminates at specified precision).
+         LOOP = .TRUE.
+         DO WHILE (LOOP)
+
+*        Strip width.
+            H = ZRANGE/DBLE(IS)
+
+*        Initialize distance from Earth centre for quadrature pass.
+            IF (K.EQ.1) THEN
+               R = R0
+            ELSE
+               R = RT
+            END IF
+
+*        One pass (no need to compute evens after first time).
+            DO I=1,IS-1,N
+
+*           Sine of observed zenith distance.
+               SZ = SIN(Z0+H*DBLE(I))
+
+*           Find R (to the nearest metre, maximum four iterations).
+               IF (SZ.GT.1D-20) THEN
+                  W = SK0/SZ
+                  RG = R
+                  DR = 1D6
+                  J = 0
+                  DO WHILE (ABS(DR).GT.1D0.AND.J.LT.4)
+                     J=J+1
+                     IF (K.EQ.1) THEN
+                        CALL sla__ATMT(R0,TDKOK,ALPHA,GAMM2,DELM2,
+     :                                 C1,C2,C3,C4,C5,C6,RG,TG,DN,RDNDR)
+                     ELSE
+                        CALL sla__ATMS(RT,TT,DNT,GAMAL,RG,DN,RDNDR)
+                     END IF
+                     DR = (RG*DN-W)/(DN+RDNDR)
+                     RG = RG-DR
+                  END DO
+                  R = RG
+               END IF
+
+*           Find the refractive index and integrand at R.
+               IF (K.EQ.1) THEN
+                  CALL sla__ATMT(R0,TDKOK,ALPHA,GAMM2,DELM2,
+     :                                   C1,C2,C3,C4,C5,C6,R,T,DN,RDNDR)
+               ELSE
+                  CALL sla__ATMS(RT,TT,DNT,GAMAL,R,DN,RDNDR)
+               END IF
+               F = REFI(DN,RDNDR)
+
+*           Accumulate odd and (first time only) even values.
+               IF (N.EQ.1.AND.MOD(I,2).EQ.0) THEN
+                  FE = FE+F
+               ELSE
+                  FO = FO+F
+               END IF
+            END DO
+
+*        Evaluate the integrand using Simpson's Rule.
+            REFP = H*(FB+4D0*FO+2D0*FE+FF)/3D0
+
+*        Has the required precision been achieved (or can't be)?
+            IF (ABS(REFP-REFOLD).GT.TOL.AND.IS.LT.ISMAX) THEN
+
+*           No: prepare for next iteration.
+
+*           Save current value for convergence test.
+               REFOLD = REFP
+
+*           Double the number of strips.
+               IS = IS+IS
+
+*           Sum of all current values = sum of next pass's even values.
+               FE = FE+FO
+
+*           Prepare for new odd values.
+               FO = 0D0
+
+*           Skip even values next time.
+               N = 2
+            ELSE
+
+*           Yes: save troposphere component and terminate the loop.
+               IF (K.EQ.1) REFT = REFP
+               LOOP = .FALSE.
+            END IF
+         END DO
+      END DO
+
+*  Result.
+      REF = REFT+REFP
+      IF (ZOBS1.LT.0D0) REF = -REF
+
+      END
Index: /tags/ipp-1-X/bug123/psLib/src/astronomy/refz.f
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/astronomy/refz.f	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/astronomy/refz.f	(revision 22331)
@@ -0,0 +1,156 @@
+      SUBROUTINE sla_REFZ (ZU, REFA, REFB, ZR)
+*+
+*     - - - - -
+*      R E F Z
+*     - - - - -
+*
+*  Adjust an unrefracted zenith distance to include the effect of
+*  atmospheric refraction, using the simple A tan Z + B tan**3 Z
+*  model (plus special handling for large ZDs).
+*
+*  Given:
+*    ZU    dp    unrefracted zenith distance of the source (radian)
+*    REFA  dp    tan Z coefficient (radian)
+*    REFB  dp    tan**3 Z coefficient (radian)
+*
+*  Returned:
+*    ZR    dp    refracted zenith distance (radian)
+*
+*  Notes:
+*
+*  1  This routine applies the adjustment for refraction in the
+*     opposite sense to the usual one - it takes an unrefracted
+*     (in vacuo) position and produces an observed (refracted)
+*     position, whereas the A tan Z + B tan**3 Z model strictly
+*     applies to the case where an observed position is to have the
+*     refraction removed.  The unrefracted to refracted case is
+*     harder, and requires an inverted form of the text-book
+*     refraction models;  the formula used here is based on the
+*     Newton-Raphson method.  For the utmost numerical consistency
+*     with the refracted to unrefracted model, two iterations are
+*     carried out, achieving agreement at the 1D-11 arcseconds level
+*     for a ZD of 80 degrees.  The inherent accuracy of the model
+*     is, of course, far worse than this - see the documentation for
+*     sla_REFCO for more information.
+*
+*  2  At ZD 83 degrees, the rapidly-worsening A tan Z + B tan**3 Z
+*     model is abandoned and an empirical formula takes over.  Over a
+*     wide range of observer heights and corresponding temperatures and
+*     pressures, the following levels of accuracy (arcsec) are
+*     typically achieved, relative to numerical integration through a
+*     model atmosphere:
+*
+*              ZR    error
+*
+*              80      0.4
+*              81      0.8
+*              82      1.5
+*              83      3.2
+*              84      4.9
+*              85      5.8
+*              86      6.1
+*              87      7.1
+*              88     10
+*              89     20
+*              90     40
+*              91    100         } relevant only to
+*              92    200         } high-elevation sites
+*
+*     The high-ZD model is scaled to match the normal model at the
+*     transition point;  there is no glitch.
+*
+*  3  Beyond 93 deg zenith distance, the refraction is held at its
+*     93 deg value.
+*
+*  4  See also the routine sla_REFV, which performs the adjustment in
+*     Cartesian Az/El coordinates, and with the emphasis on speed
+*     rather than numerical accuracy.
+*
+*  P.T.Wallace   Starlink   19 September 1995
+*
+*  Copyright (C) 1995 Rutherford Appleton Laboratory
+*
+*  License:
+*    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 (see SLA_CONDITIONS); if not, write to the 
+*    Free Software Foundation, Inc., 59 Temple Place, Suite 330, 
+*    Boston, MA  02111-1307  USA
+*
+*-
+
+      IMPLICIT NONE
+
+      DOUBLE PRECISION ZU,REFA,REFB,ZR
+
+*  Radians to degrees
+      DOUBLE PRECISION R2D
+      PARAMETER (R2D=57.29577951308232D0)
+
+*  Largest usable ZD (deg)
+      DOUBLE PRECISION D93
+      PARAMETER (D93=93D0)
+
+*  Coefficients for high ZD model (used beyond ZD 83 deg)
+      DOUBLE PRECISION C1,C2,C3,C4,C5
+      PARAMETER (C1=+0.55445D0,
+     :           C2=-0.01133D0,
+     :           C3=+0.00202D0,
+     :           C4=+0.28385D0,
+     :           C5=+0.02390D0)
+
+*  ZD at which one model hands over to the other (radians)
+      DOUBLE PRECISION Z83
+      PARAMETER (Z83=83D0/R2D)
+
+*  High-ZD-model prediction (deg) for that point
+      DOUBLE PRECISION REF83
+      PARAMETER (REF83=(C1+C2*7D0+C3*49D0)/(1D0+C4*7D0+C5*49D0))
+
+      DOUBLE PRECISION ZU1,ZL,S,C,T,TSQ,TCU,REF,E,E2
+
+
+
+*  Perform calculations for ZU or 83 deg, whichever is smaller
+      ZU1 = MIN(ZU,Z83)
+
+*  Functions of ZD
+      ZL = ZU1
+      S = SIN(ZL)
+      C = COS(ZL)
+      T = S/C
+      TSQ = T*T
+      TCU = T*TSQ
+
+*  Refracted ZD (mathematically to better than 1 mas at 70 deg)
+      ZL = ZL-(REFA*T+REFB*TCU)/(1D0+(REFA+3D0*REFB*TSQ)/(C*C))
+
+*  Further iteration
+      S = SIN(ZL)
+      C = COS(ZL)
+      T = S/C
+      TSQ = T*T
+      TCU = T*TSQ
+      REF = ZU1-ZL+
+     :          (ZL-ZU1+REFA*T+REFB*TCU)/(1D0+(REFA+3D0*REFB*TSQ)/(C*C))
+
+*  Special handling for large ZU
+      IF (ZU.GT.ZU1) THEN
+         E = 90D0-MIN(D93,ZU*R2D)
+         E2 = E*E
+         REF = (REF/REF83)*(C1+C2*E+C3*E2)/(1D0+C4*E+C5*E2)
+      END IF
+
+*  Return refracted ZD
+      ZR = ZU-REF
+
+      END
Index: /tags/ipp-1-X/bug123/psLib/src/astronomy/slalib.h
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/astronomy/slalib.h	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/astronomy/slalib.h	(revision 22331)
@@ -0,0 +1,129 @@
+/** @file  slalib.h
+*
+*  @brief Simple wrapper of the required fortran SLALIB functions
+*
+*  @ingroup AstroImage
+*
+*  @author Robert DeSonia, MHPCC
+*
+*  @version $Revision: 1.12 $ $Name: not supported by cvs2svn $
+*  @date $Date: 2005-02-17 19:26:23 $
+*
+*  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+*/
+
+#ifndef SLALIB_H
+#define SLALIB_H
+
+#include "config.h"
+
+#define fslaAoppa F77_FUNC_(sla_aoppa,SLA_AOPPA)
+extern void fslaAoppa(
+        const double* date,
+        const double* dut,
+        const double* elongm,
+        const double* phim,
+        const double* him,
+        const double* xp,
+        const double* yp,
+        const double* tdk,
+        const double* pmb,
+        const double* rh,
+        const double* wl,
+        const double* tlr,
+        double* AOPRMS
+    );
+
+#define fslaAopqk F77_FUNC_(sla_aopqk,SLA_AOPQK)
+extern void fslaAopqk(
+        const double* RAP,
+        const double* DAP,
+        double* AOPRMS,
+        double* AOB,
+        double* ZOB,
+        double* HOB,
+        double* DOB,
+        double* ROB
+    );
+
+#define fslaOapqk F77_FUNC_(sla_oapqk,SLA_OAPQK)
+extern void fslaOapqk(
+        char* TYPE,
+        const double* OB1,
+        const double* OB2,
+        double* AOPRMS,
+        double* RAP,
+        double* DAP
+    );
+
+#define fslaAirmas F77_FUNC_(sla_airmas,SLA_AIRMAS)
+extern double fslaAirmas(
+        const double* zenithDistance
+    );
+
+/*
+    void slaAoppa(date, dut, elongm, phim, hm, xp, yp, tdk, pmb, rh, wl, tlr, aoprms)
+    
+    PARAMETERS
+    
+    double date
+    double dut
+    double elongm
+    double phim
+    double hm
+    double xp
+    double yp
+    double tdk
+    double pmb
+    double rh
+    double wl
+    double tlr
+    double *aoprms
+*/
+#define slaAoppa(date,dut,elongm,phim,him,xp,yp,tdk,pmb,rh,wl,tlr,AOPRMS) \
+fslaAoppa(&date,&dut,&elongm,&phim,&him,&xp,&yp,&tdk,&pmb,&rh,&wl,&tlr,AOPRMS)
+
+/*
+    void slaAopqk(rap, dap, aoprms, aob, zob, hob, dob, rob)
+    
+    PARAMETERS
+    
+    double rap
+    double dap
+    double *aoprms
+    double *aob
+    double *zob
+    double *hob
+    double *dob
+    double *rob
+*/
+
+#define slaAopqk(RAP,DAP,AOPRMS,AOB,ZOB,HOB,DOB,ROB) \
+fslaAopqk(&RAP,&DAP,AOPRMS,AOB,ZOB,HOB,DOB,ROB)
+
+/*
+    void slaOapqk(type, ob1, ob2, aoprms, rap, dap)
+    
+    PARAMETERS
+    
+    char *type
+    double ob1
+    double ob2
+    double *aoprms
+    double *rap
+    double *dap
+*/
+
+#define slaOapqk(TYPE, OB1, OB2, AOPRMS, RAP, DAP) \
+fslaOapqk(TYPE, &OB1, &OB2, AOPRMS, RAP, DAP)
+
+/*
+    double slaAirmas(zd)
+    
+    PARAMETERS
+    
+    double zd
+*/
+#define slaAirmas(ZD) fslaAirmas(&ZD)
+
+#endif
Index: /tags/ipp-1-X/bug123/psLib/src/collections/.cvsignore
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/collections/.cvsignore	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/collections/.cvsignore	(revision 22331)
@@ -0,0 +1,7 @@
+Makefile.in
+.deps
+.libs
+Makefile
+*.lo
+*.la
+
Index: /tags/ipp-1-X/bug123/psLib/src/collections/Makefile.am
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/collections/Makefile.am	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/collections/Makefile.am	(revision 22331)
@@ -0,0 +1,42 @@
+#Makefile for collections functions of psLib
+#
+
+INCLUDES = \
+	-I$(top_srcdir)/src/astronomy \
+	-I$(top_srcdir)/src/dataManip \
+	-I$(top_srcdir)/src/dataIO \
+	-I$(top_srcdir)/src/image \
+	-I$(top_srcdir)/src/sysUtils \
+	$(all_includes)
+
+noinst_LTLIBRARIES = libpslibcollections.la
+
+libpslibcollections_la_SOURCES = \
+	psBitSet.c \
+	psVector.c \
+	psList.c \
+	psScalar.c \
+	psCompare.c \
+	psArray.c \
+	psHash.c \
+	psMetadata.c \
+	psMetadataIO.c
+
+BUILT_SOURCES = psCollectionsErrors.h
+EXTRA_DIST = psCollectionsErrors.dat psCollectionsErrors.h collections.i
+
+psCollectionsErrors.h:psCollectionsErrors.dat
+	perl $(top_srcdir)/src/parseErrorCodes.pl --data=$? $@
+
+pslibincludedir = $(includedir)
+pslibinclude_HEADERS = \
+	psBitSet.h \
+	psVector.h \
+	psList.h \
+	psScalar.h \
+	psCompare.h \
+	psArray.h \
+	psHash.h \
+	psMetadata.h \
+	psMetadataIO.h
+
Index: /tags/ipp-1-X/bug123/psLib/src/collections/collections.i
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/collections/collections.i	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/collections/collections.i	(revision 22331)
@@ -0,0 +1,9 @@
+/* collections headers */
+%include "psArray.h"
+%include "psBitSet.h"
+%include "psCollectionsErrors.h"
+%include "psCompare.h"
+%include "psHash.h"
+%include "psList.h"
+%include "psScalar.h"
+%include "psVector.h"
Index: /tags/ipp-1-X/bug123/psLib/src/collections/psArray.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/collections/psArray.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/collections/psArray.c	(revision 22331)
@@ -0,0 +1,207 @@
+
+/** @file  psArray.c
+ *
+ *  @brief Contains support for basic vector types
+ *
+ *  This file defines the basic type for a vector struct and functions useful
+ *  in manupulating vectors.
+ *
+ *  @author Ross Harman, MHPCC
+ *
+ *  @version $Revision: 1.27 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-04-07 20:27:41 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+
+/******************************************************************************/
+
+/*  INCLUDE FILES                                                             */
+
+/******************************************************************************/
+#include<stdlib.h>                         // for qsort, etc.
+#include<string.h>
+
+#include "psMemory.h"
+#include "psError.h"
+#include "psArray.h"
+#include "psLogMsg.h"
+
+#include "psCollectionsErrors.h"
+
+/*****************************************************************************
+  FUNCTION IMPLEMENTATION - LOCAL
+ *****************************************************************************/
+static void arrayFree(psArray* psArr);
+
+static void arrayFree(psArray* psArr)
+{
+    if (psArr == NULL) {
+        return;
+    }
+
+    psArrayElementFree(psArr);
+
+    psFree(psArr->data);
+}
+
+/*****************************************************************************
+  FUNCTION IMPLEMENTATION - PUBLIC
+ *****************************************************************************/
+psArray* psArrayAlloc(psU32 nalloc)
+{
+    psArray* psArr = NULL;
+
+    // Create vector struct
+    psArr = (psArray* ) psAlloc(sizeof(psArray));
+    psMemSetDeallocator(psArr, (psFreeFcn) arrayFree);
+
+    psArr->nalloc = nalloc;
+    psArr->n = nalloc;
+
+    // Create vector data array
+    psArr->data = psAlloc(nalloc * sizeof(psPtr));
+
+    return psArr;
+}
+
+psArray* psArrayRealloc(psArray* in, psU32 nalloc)
+{
+    if (in == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL,true,PS_ERRORTEXT_psArray_REALLOC_NULL);
+        return NULL;
+    } else if (in->nalloc != nalloc) {     // No need to realloc to same size
+        if (nalloc < in->n) {
+            for (psS32 i = nalloc; i < in->n; i++) {      // For reduction in vector size
+                psFree(in->data[i]);
+            }
+            in->n = nalloc;
+        }
+        // Realloc after decrementation to avoid accessing freed array elements
+        in->data = psRealloc(in->data, nalloc * sizeof(psPtr));
+        in->nalloc = nalloc;
+    }
+
+    return in;
+}
+
+psArray* psArrayAdd(psArray* psArr,
+                    int delta,
+                    psPtr data)
+{
+    if (psArr == NULL) {
+        return psArr;
+    }
+
+    int n = psArr->n;
+
+    if (n >= psArr->nalloc) {
+        // array needs to be expanded to make room for more elements
+        int d = (delta > 0) ? delta : 10; // as spec'ed in SDRS.
+        psArr = psArrayRealloc(psArr, n+d);
+    }
+
+    // add the element to the end of the array.
+    psArr->data[n] = psMemIncrRefCounter(data);
+    psArr->n = n+1;
+
+    return psArr;
+}
+
+psBool psArrayRemove(psArray* psArr,
+                     psPtr data)
+{
+    psBool success = false;
+
+    if (psArr == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psArray_ARRAY_NULL);
+        return false;
+    }
+
+    psS32 n = psArr->n;
+    psPtr* psArrData = psArr->data;
+    for (psS32 i = n-1; i >= 0; i--) {
+        if (psArrData[i] == data) {
+            memmove(&psArr->data[i],&psArr->data[i+1],(n-i-1)*sizeof(psPtr));
+            n--;
+            success = true;
+        }
+    }
+    psArr->n = n; // reset the array size to indicate the removed item(s)
+
+    return success;
+}
+
+void psArrayElementFree(psArray* psArr)
+{
+
+    if (psArr == NULL) {
+        return;
+    }
+
+    for (psS32 i = 0; i < psArr->n; i++) {
+        psFree(psArr->data[i]);
+        psArr->data[i] = NULL;
+    }
+}
+
+psArray* psArraySort(psArray* in, psComparePtrFcn compare)
+{
+    if (in == NULL) {
+        return NULL;
+    }
+
+    qsort(in->data, in->n, sizeof(psPtr), (int (*)(const void* , const void*))compare);
+
+    return in;
+}
+
+/// Set an element in the array.
+psBool psArraySet(psArray* in,                       ///< input array to set element in
+                  psU32 position,                    ///< the element position to set
+                  void* value)                       ///< the value to set it to
+{
+    if (in == NULL)
+    {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psArray_ARRAY_NULL);
+        return false;
+    }
+
+    if (position >= in->nalloc)
+    {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psArray_POSITION_BEYOND_NALLOC,
+                position, in->nalloc);
+        return false;
+    }
+
+    psFree(in->data[position]);
+    in->data[position] = value;
+
+    return true;
+}
+
+/// Get an element in the array.
+void* psArrayGet(psArray* in, psU32 position )
+{
+    if (in == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psArray_ARRAY_NULL);
+        return NULL;
+    }
+
+    if (position >= in->nalloc) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psArray_POSITION_BEYOND_NALLOC,
+                position, in->nalloc);
+        return NULL;
+    }
+
+    return in->data[position];
+}
+
+
+
+
Index: /tags/ipp-1-X/bug123/psLib/src/collections/psArray.h
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/collections/psArray.h	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/collections/psArray.h	(revision 22331)
@@ -0,0 +1,150 @@
+
+/** @file  psArray.h
+ *
+ *  @brief Contains basic array definitions and operations
+ *
+ *  This file defines the basic type for a array struct and functions useful
+ *  in manupulating arrays.
+ *
+ *  @ingroup Array
+ *
+ *  @author Robert DeSonia, MHPCC
+ *  @author Ross Harman, MHPCC
+ *
+ *  @version $Revision: 1.22 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-02-17 19:26:23 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+
+#ifndef PS_ARRAY_H
+#define PS_ARRAY_H
+
+#include "psType.h"
+#include "psCompare.h"
+
+/// @addtogroup Array
+/// @{
+
+/** An array to support primitive types.
+ *
+ * Struct for maintaining an array of frequently used primitive types.
+ *
+ */
+typedef struct
+{
+    psU32 nalloc;        ///< Total number of elements available.
+    psU32 n;             ///< Number of elements in use.
+    psPtr* data;                ///< An Array of pointer elements
+}
+psArray;
+
+/*****************************************************************************/
+
+/* FUNCTION PROTOTYPES                                                       */
+
+/*****************************************************************************/
+
+/** Allocate an array.
+ *
+ * Uses psLib memory allocation functions to create an array collection of 
+ * data
+ *
+ * @return psArray* : Pointer to psArray.
+ *
+ */
+psArray* psArrayAlloc(
+    psU32 nalloc                       ///< Total number of elements to make available.
+);
+
+/** Reallocate an array.
+ *
+ * Uses psLib memory allocation functions to reallocate an array collection 
+ * of data. 
+ *
+ * @return psArray* : Pointer to psArray.
+ *
+ */
+psArray* psArrayRealloc(
+    psArray* psArr,                    ///< array to reallocate.
+    psU32 nalloc                       ///< Total number of elements to make available.
+);
+
+/** Add an element to the end the array, expanding the array storage if
+ *  necessary.
+ *
+ *  @return psArray*        The array with the element added
+ */
+psArray* psArrayAdd(
+    psArray* psArr,                    ///< array to operate on
+    int delta,
+    ///< the amount to expand array, if necessary.  If less than one, 10 will be used.
+    psPtr data                         ///< the data pointer to add to psArray
+);
+
+/** Remove an element from the array
+ *
+ *  Finds and removes the specified data pointer from the list.  
+ *
+ * @return bool:  TRUE if the specified data pointer was found and removed, 
+ *                otherwise FALSE.
+ *
+ */
+psBool psArrayRemove(
+    psArray* psArr,                    ///< array to operate on
+    psPtr data                         ///< the data pointer to remove from psArray
+);
+
+/** Deallocate/Dereference elements of an array.
+ *
+ * Uses psLib memory allocation functions to deallocate/dereference elements 
+ * of a array of void pointers.  The array psArr is not freed, and its elements
+ * will all be set to NULL.
+ *
+ */
+void psArrayElementFree(
+    psArray* psArr                     ///< Void pointer array to destroy.
+);
+
+/** Sort the array according to an external compare function.
+ *
+ *  Sorts an array via the specification of a comparison function
+ *  to specify how the objects on the array should be sorted.
+ *
+ *  The comparison function must return an integer less than, equal to, or 
+ *  greater than zero if the first argument is considered to be respectively 
+ *  less than, equal to, or greater than the second. 
+ *
+ *  If two members compare as equal, their order in the sorted array is 
+ *  undefined.
+ *
+ *  @return psArray* The sorted array.
+ */
+psArray* psArraySort(
+    psArray* in,                       ///< input array to sort.
+    psComparePtrFcn compare            ///< the compare function
+);
+
+/** Set an element in the array.  If the current element is non-NULL, the old
+ *  element is freed.
+ *
+ *  @return psBool  TRUE if the element was set successfully, otherwise FALSE
+ */
+psBool psArraySet(
+    psArray* in,                       ///< input array to set element in
+    psU32 position,                    ///< the element position to set
+    void* value                        ///< the value to set it to
+);
+
+/** Get an element from the array.
+ *
+ *  @return void*   the element at given position.
+ */
+void* psArrayGet(
+    psArray* in,                       ///< input array to get element from
+    psU32 position                     ///< the element position to get
+);
+
+/// @}
+
+#endif
Index: /tags/ipp-1-X/bug123/psLib/src/collections/psBitSet.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/collections/psBitSet.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/collections/psBitSet.c	(revision 22331)
@@ -0,0 +1,295 @@
+/** @file  psBitSet.c
+ *
+ *  @brief Creates an array of bytes of arbitrary length for storing individual bits.
+ *
+ *  Bit masks are useful tools for toggling various flags and options. This set of functions module provides
+ *  a mechanism to create an array of bits of arbitrary length and manipulate them with basic binary
+ *  operations. A print function is also provided to display the entire set of bits in binary format as a
+ *  string.
+ *
+ *  @author Ross Harman, MHPCC
+ *  @author Robert DeSonia, MHPCC
+ *
+ *  @version $Revision: 1.24 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-04-07 20:27:41 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+
+#include <string.h>
+#include <stdio.h>
+#include <ctype.h>
+#include <math.h>
+
+#include "psBitSet.h"
+#include "psMemory.h"
+#include "psError.h"
+#include "psAbort.h"
+#include "psString.h"
+
+#include "psCollectionsErrors.h"
+
+enum {
+    UNKNOWN_OP,
+    AND_OP,
+    OR_OP,
+    XOR_OP,
+    NOT_OP
+};
+
+static void bitSetFree(psBitSet* inBitSet);
+
+/** Private function to create a mask.
+ *
+ *  Creates an eight bit mask with the given bit set. All other bits in the byte are zero. The input bit uses
+ *  zero-based indexing, and is the cumulitive index within the array, not the localized byte's bit position.
+ *
+ *  @return  char*: Pointer to byte in which bit is contained.
+ */
+static char mask(psS32 bit)
+{
+    char mask = (char)0x01;
+
+    // Ignore splint warning about negative bit shifts
+    /* @i@ */
+    mask = mask << (bit % 8);
+
+    return mask;
+}
+
+static void bitSetFree(psBitSet* inBitSet)
+{
+    if (inBitSet == NULL) {
+        return;
+    }
+    psFree(inBitSet->bits);
+}
+
+psBitSet* psBitSetAlloc(psS32 n)
+{
+    psS32 numBytes = 0;
+    psBitSet* newObj = NULL;
+
+    if (n < 0) {
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true,
+                PS_ERRORTEXT_psBitSet_ALLOC_NEG_SIZE,
+                n);
+        return NULL;
+    }
+
+    numBytes = ceil(n / 8.0);
+    newObj = psAlloc(sizeof(psBitSet));
+    psMemSetDeallocator(newObj, (psFreeFcn) bitSetFree);
+    newObj->n = numBytes;
+
+    // Ignore splint warning about releasing pointer members, since they've not been allocated yet
+    /* @i@ */
+    newObj->bits = psAlloc(sizeof(char) * numBytes);
+
+    memset(newObj->bits, 0, numBytes);
+
+    return newObj;
+}
+
+psBitSet* psBitSetSet(psBitSet* inBitSet,
+                      psS32 bit)
+{
+    char *byte = NULL;
+
+    if (inBitSet == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psBitSet_SET_NULL);
+        return inBitSet;
+    } else if ( (bit < 0) ||
+                (bit > inBitSet->n * 8 - 1) ) {
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true,
+                PS_ERRORTEXT_psBitSet_BIT_OUTOFRANGE,
+                bit,inBitSet->n * 8 - 1);
+        return inBitSet;
+    }
+    // Variable byte is the byte in the array that contains the bit to be set
+    byte = inBitSet->bits + bit / 8;
+    *byte |= mask(bit);
+
+    return inBitSet;
+}
+
+psBitSet* psBitSetClear(psBitSet* inBitSet,
+                        psS32 bit)
+{
+    char *byte = NULL;
+
+    if (inBitSet == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psBitSet_SET_NULL);
+        return inBitSet;
+    } else if ( (bit < 0) ||
+                (bit > inBitSet->n * 8 - 1) ) {
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true,
+                PS_ERRORTEXT_psBitSet_BIT_OUTOFRANGE,
+                bit,inBitSet->n * 8 - 1);
+        return inBitSet;
+    }
+    // Variable byte is the byte in the array that contains the bit to be set
+    byte = inBitSet->bits + bit / 8;
+    *byte &= ! mask(bit);
+
+    return inBitSet;
+}
+
+psBool psBitSetTest(const psBitSet* inBitSet,
+                    psS32 bit)
+{
+    char *byte = NULL;
+
+    if (inBitSet == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psBitSet_SET_NULL);
+        return false;
+    } else if ( (bit < 0) ||
+                (bit > inBitSet->n * 8 - 1) ) {
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true,
+                PS_ERRORTEXT_psBitSet_BIT_OUTOFRANGE,
+                bit,inBitSet->n * 8 - 1);
+        return false;
+    }
+
+    // Variable byte is the byte in the array that contains the bit to be tested
+    byte = inBitSet->bits + bit / 8;
+    return ((*byte & mask(bit)) != 0);
+}
+
+psBitSet* psBitSetOp(psBitSet* outBitSet,
+                     const psBitSet* inBitSet1,
+                     char *operator,
+                     const psBitSet* inBitSet2)
+{
+    psS32 i = 0;
+    psS32 n = 0;
+    char* outBits = NULL;
+    char* inBits1 = NULL;
+    char* inBits2 = NULL;
+    psS32 op = UNKNOWN_OP;
+
+    if (inBitSet1 == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psBitSet_FIRST_OPERAND_NULL);
+        psFree(outBitSet);
+        return NULL;
+    }
+    inBits1 = inBitSet1->bits;
+
+    if (operator == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psBitSet_OPERATOR_NULL);
+        psFree(outBitSet);
+        return NULL;
+    }
+
+    // parse the operator
+    if (strcmp(operator,"AND")==0) {
+        op = AND_OP;
+    } else if (strcmp(operator,"OR")==0) {
+        op = OR_OP;
+    } else if (strcmp(operator,"XOR")==0) {
+        op = XOR_OP;
+    } else if (strcmp(operator,"NOT")==0) {
+        op = NOT_OP;
+    } else {
+        psFree(outBitSet);
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true,
+                PS_ERRORTEXT_psBitSet_OPERATOR_INVALID,
+                operator);
+        return NULL;
+    }
+
+    if (op != NOT_OP) {
+        if (inBitSet2 == NULL) {
+            psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                    PS_ERRORTEXT_psBitSet_SECOND_OPERAND_NULL);
+            psFree(outBitSet);
+            return NULL;
+        }
+
+        if (inBitSet1->n != inBitSet2->n) {
+            psError(PS_ERR_BAD_PARAMETER_SIZE, true,
+                    PS_ERRORTEXT_psBitSet_OPERANDS_SIZE_DIFFER);
+            psFree(outBitSet);
+            return NULL;
+        }
+        inBits2 = inBitSet2->bits;
+    }
+
+    if (outBitSet == NULL) {
+        outBitSet = psBitSetAlloc(inBitSet1->n*8);
+    } else if (outBitSet->n != inBitSet1->n) {
+        outBitSet->n = inBitSet1->n;
+        outBitSet->bits = psRealloc(outBitSet->bits, inBitSet1->n);
+    }
+
+    n = outBitSet->n;
+    outBits = outBitSet->bits;
+
+    switch (op) {
+    case AND_OP:
+        for (i = 0; i < n; i++) {
+            outBits[i] = inBits1[i] & inBits2[i];
+        }
+        break;
+    case OR_OP:
+        for (i = 0; i < n; i++) {
+            outBits[i] = inBits1[i] | inBits2[i];
+        }
+        break;
+    case XOR_OP:
+        for (i = 0; i < n; i++) {
+            outBits[i] = inBits1[i] ^ inBits2[i];
+        }
+        break;
+    case NOT_OP:
+        for (i = 0; i < n; i++) {
+            outBits[i] = ~inBits1[i];
+        }
+        break;
+    default:
+        psAbort("psBitSetOp",
+                "Unexpected error - operator parsed successfully but not valid?");
+    }
+
+    return outBitSet;
+}
+
+psBitSet* psBitSetNot(psBitSet* outBitSet,
+                      const psBitSet* inBitSet)
+{
+    if (inBitSet == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psBitSet_OPERAND_NULL);
+        psFree(outBitSet);
+        return NULL;
+    }
+
+    outBitSet = psBitSetOp(outBitSet,inBitSet,"NOT",NULL);
+
+    if (outBitSet == NULL) {
+        psError(PS_ERR_UNKNOWN, false,
+                PS_ERRORTEXT_psBitSet_NOT_OP_FAILED);
+    }
+
+    return outBitSet;
+}
+
+char *psBitSetToString(const psBitSet* inBitSet)
+{
+    psS32 i = 0;
+    psS32 numBits = inBitSet->n * 8;
+    char *outString = psAlloc((size_t) numBits + 1);
+
+    for (i = 0; i < numBits; i++) {
+        outString[numBits - i - 1] = psBitSetTest(inBitSet, i) ? '1' : '0';
+    }
+
+    outString[numBits] = 0;
+
+    return outString;
+}
Index: /tags/ipp-1-X/bug123/psLib/src/collections/psBitSet.h
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/collections/psBitSet.h	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/collections/psBitSet.h	(revision 22331)
@@ -0,0 +1,145 @@
+/** @file  psBitSet.h
+ *
+ *  @brief Creates an array of bytes of arbitrary length for storing individual bits.
+ *
+ *  Bit masks are useful tools for toggling various flags and options. This set of functions module provides
+ *  a mechanism to create an array of bits of arbitrary length and manipulate them with basic binary
+ *  operations. A print function is also provided to display the entire set of bits in binary format as a
+ *  string.
+ *
+ *  @ingroup BitSet
+ *
+ *  @author Ross Harman, MHPCC
+ *
+ *  @version $Revision: 1.17 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-02-17 19:26:23 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+
+#ifndef PSBITSET_H
+#define PSBITSET_H
+
+#include "psType.h"
+
+/// @addtogroup BitSet
+/// @{
+
+/******************************************************************************/
+/*  TYPE DEFINITIONS                                                          */
+/******************************************************************************/
+
+/** Struct containing array of bytes to hold bit data and corresponding array length.
+ *
+ *  The bits in the struct are assembled in as an array of bytes with eight bits per byte. The bits are
+ *  arranged with the LSB in first (right most) position of the first array element.
+ */
+typedef struct
+{
+    psS32 n;                             ///< Number of bytes in the array
+    char *bits;                        ///< Aray of bytes holding bits
+}
+psBitSet;
+
+/*****************************************************************************/
+/* FUNCTION PROTOTYPES                                                       */
+/*****************************************************************************/
+
+/** Allocate a psBitSet.
+ *
+ *  Create a psBitSet with the number of bits specified by the user. All bits are set to zero upon
+ *  allocation.
+ *
+ *  @return  psBitSet* : Pointer to struct containing array of bits and size of array.
+ */
+
+/*@null@*/
+psBitSet* psBitSetAlloc(
+    psS32 n                            ///< Number of bits in psBitSet array
+);
+
+/** Set a bit.
+ *
+ *  Sets a bit at a given bit location. The bit is set based on a zero index with the
+ *  first bit set in the zero bit slot of the zero element of the byte array. As an example, setting bit 3 in
+ *  an array with two elements would result in an psBitSet that looks like 00000000 00001000.
+ *
+ *  @return  psBitSet* : Pointer to struct containing psBitSet.
+ */
+psBitSet* psBitSetSet(
+    /* @returned@ */
+    psBitSet* inMask,                  ///< Pointer to psBitSet to be set.
+    psS32 bit                          ///< Bit to be set.
+);
+
+/** Clear a bit.
+ *
+ *  Clear a bit at a given bit location. The bit is cleared based on a zero 
+ *  index with the first bit set in the zero bit slot of the zero element of 
+ *  the byte array. 
+ *
+ *  @return  psBitSet* : Pointer to struct containing psBitSet.
+ */
+psBitSet* psBitSetClear(
+    /* @returned@ */
+    psBitSet* inMask,                  ///< Pointer to psBitSet to be cleared.
+    psS32 bit                          ///< Bit to be cleared.
+);
+
+/** Test the value of a bit.
+ *
+ *  Prints the value of a bit at a given bit location, either one or zero. The resulting bit is based on a
+ *  zero index format with the first bit set in the zero bit slot of the zero element of the byte array
+ *  As an example, testing bit 3 in a psBitSet with two bytes that looks like 00000000 00001000 would return a
+ *  value of one, since that is the value that was set.
+ *
+ *  @return  int: Value of bit, either one or zero.
+ */
+
+psBool psBitSetTest(
+    const psBitSet* inMask,            ///< Pointer psBitSet to be tested.
+    psS32 bit                          ///< Bit to be tested.
+);
+
+/** Perform a binary operation on two psBitSets
+ *
+ *  Perform an AND, OR, or XOR on two psBitSets. If the BitMasks are not the same size, the operation will not
+ *  be performed and an error message will be logged.
+ *
+ *  @return  psBitSet* : Pointer to struct containing result of binary operation.
+ */
+psBitSet* psBitSetOp(
+    /* @returned@ */
+    psBitSet* outMask,                 ///< Resulting psBitSet from binary operation
+    const psBitSet* inMask1,           ///< First psBitSet on which to operate
+    char *operator,                    ///< Bit operation
+    const psBitSet* inMask2            ///< First psBitSet on which to operate
+);
+
+/** Perform a not operation on a psBitSet
+ *
+ *  Toggles bits in a psBitset. All zero bits are set to one and all one bits are set to zero.
+ *
+ *  @return  psBitSet* : Pointer to struct containing result of operation.
+ */
+
+psBitSet* psBitSetNot(
+    psBitSet* outBitSet,               ///< Resulting psBitSet from operation
+    const psBitSet* inBitSet           ///< Input psBitSet
+);
+
+/** Convert the psBitSet to a string of ones and zeros.
+ *
+ *  Converts the contents of a psBitSet to a string representation of its binary form of ones and zeros. The
+ *  LSB is the right-most chracter. Each set of eight characters represents one byte.
+ *
+ *  @return  char*: Pointer to character array containing string data.
+ */
+
+char *psBitSetToString(
+    const psBitSet* inMask             ///< psBitSet to convert */
+);
+
+/// @}
+
+#endif
Index: /tags/ipp-1-X/bug123/psLib/src/collections/psCollectionsErrors.dat
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/collections/psCollectionsErrors.dat	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/collections/psCollectionsErrors.dat	(revision 22331)
@@ -0,0 +1,44 @@
+#
+#  This file is used to generate psCollectionsErrors.h content
+#
+#  Format is:
+#  ERRORNAME(one word)    ERRORTEXT
+#
+#  N.B. in code, the ERRORNAME appears as PS_ERRORTEXT_ERRORNAME
+####################################################################
+#
+psArray_REALLOC_NULL                   psArrayRealloc must be given a non-NULL psArray to resize.
+psArray_ARRAY_NULL                     Specified psArray can not be NULL.
+psArray_POSITION_BEYOND_NALLOC         Specified position, %d, is greater than the allocated size of the array, %d.
+#
+psVector_REALLOC_NULL                  psVectorRealloc must a given a non-NULL psVector to resize.  Desired datatype unknown.
+psVector_NOT_A_VECTOR                  The input psVector must have a vector dimension type.
+psVector_SORT_NULL                     psVectorSort can not sort a NULL psVector.
+psVector_UNSUPPORTED_TYPE              Input psVector is an unsupported type (0x%x).
+#
+psBitSet_ALLOC_NEG_SIZE                The number of bit in a psBitSet (%d) must be greater than zero.
+psBitSet_SET_NULL                      Can not operate on a NULL psBitSet.
+psBitSet_BIT_OUTOFRANGE                The specified bit position (%d) is invalid.  Position must be between 0 and %d.
+psBitSet_OPERATOR_NULL                 Specified operator is NULL.  Must specify desired operator.
+psBitSet_OPERATOR_INVALID              Specified operator, %s, is invalid.  Valid operators are AND, OR, and XOR.
+psBitSet_FIRST_OPERAND_NULL            First psBitSet operand can not be NULL.
+psBitSet_SECOND_OPERAND_NULL           Second psBitSet operand can not be NULL.
+psBitSet_OPERANDS_SIZE_DIFFER          The psBitSet operand must be the same size.
+psBitSet_NOT_OP_FAILED                 Could not perform NOT operation.
+psBitSet_OPERAND_NULL                  Operand can not be NULL.
+#
+psScalar_UNSUPPORTED_TYPE              Specified datatype (%d) is unsupported by psScalar.
+psScalar_COPY_NULL                     Can not copy a NULL psScalar.
+#
+psHash_KEY_NULL                        Input key can not be NULL.
+psHash_TABLE_NULL                      Input psHash can not be NULL.
+psHash_DATA_NULL                       Input data can not be NULL.
+#
+psList_LOCATION_INVALID                Specified location, %d, is invalid.
+psList_ITERATOR_INVALID                Specified iterator is not valid.
+psList_ITERATOR_NULL                   Specified iterator is NULL.
+psList_ITERATOR_NONMUTABLE             Specified iterator indicates list is non-mutable.
+psList_LIST_NULL                       Specified psList reference is NULL.
+psList_DATA_NULL                       Specified data item is NULL.
+psList_DATA_NOT_FOUND                  Specified data item is not found in the psList.
+
Index: /tags/ipp-1-X/bug123/psLib/src/collections/psCollectionsErrors.h
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/collections/psCollectionsErrors.h	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/collections/psCollectionsErrors.h	(revision 22331)
@@ -0,0 +1,63 @@
+/** @file  psCollectionsErrors.h
+ *
+ *  @brief Contains the error text for the collections functions
+ *
+ *  @ingroup ErrorHandling
+ *
+ *  @author Robert DeSonia, MHPCC
+ *
+ *  @version $Revision: 1.12 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-04-21 21:18:23 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+
+#ifndef PS_COLLECTIONS_ERRORS_H
+#define PS_COLLECTIONS_ERRORS_H
+
+/* N.B., lines between '//~Start' and '//~End' are automatic generated from
+ * the template following the '//~Start'.  The template is used to generate
+ * the other lines by, for each error text in psCollectionsErrors.dat, the following
+ * substitutions are made:
+ *     $1  The error text macro name (first word in the psCollectionsErrors.dat lines)
+ *     $2  The error text (rest of the line in psCollectionsErrors.dat)
+ *     $n  The order of the source line in psCollecitonsErrors.dat (comments excluded)
+ * 
+ * DO NOT EDIT THE LINES BETWEEN //~Start and //~End!  ANY CHANGES WILL BE OVERWRITTEN.
+ */
+
+#define PS_ERRORNAME_DOMAIN "psLib.collections."
+
+//~Start #define PS_ERRORTEXT_$1 "$2"
+#define PS_ERRORTEXT_psArray_REALLOC_NULL "psArrayRealloc must be given a non-NULL psArray to resize."
+#define PS_ERRORTEXT_psArray_ARRAY_NULL "Specified psArray can not be NULL."
+#define PS_ERRORTEXT_psArray_POSITION_BEYOND_NALLOC "Specified position, %d, is greater than the allocated size of the array, %d."
+#define PS_ERRORTEXT_psVector_REALLOC_NULL "psVectorRealloc must a given a non-NULL psVector to resize.  Desired datatype unknown."
+#define PS_ERRORTEXT_psVector_NOT_A_VECTOR "The input psVector must have a vector dimension type."
+#define PS_ERRORTEXT_psVector_SORT_NULL "psVectorSort can not sort a NULL psVector."
+#define PS_ERRORTEXT_psVector_UNSUPPORTED_TYPE "Input psVector is an unsupported type (0x%x)."
+#define PS_ERRORTEXT_psBitSet_ALLOC_NEG_SIZE "The number of bit in a psBitSet (%d) must be greater than zero."
+#define PS_ERRORTEXT_psBitSet_SET_NULL "Can not operate on a NULL psBitSet."
+#define PS_ERRORTEXT_psBitSet_BIT_OUTOFRANGE "The specified bit position (%d) is invalid.  Position must be between 0 and %d."
+#define PS_ERRORTEXT_psBitSet_OPERATOR_NULL "Specified operator is NULL.  Must specify desired operator."
+#define PS_ERRORTEXT_psBitSet_OPERATOR_INVALID "Specified operator, %s, is invalid.  Valid operators are AND, OR, and XOR."
+#define PS_ERRORTEXT_psBitSet_FIRST_OPERAND_NULL "First psBitSet operand can not be NULL."
+#define PS_ERRORTEXT_psBitSet_SECOND_OPERAND_NULL "Second psBitSet operand can not be NULL."
+#define PS_ERRORTEXT_psBitSet_OPERANDS_SIZE_DIFFER "The psBitSet operand must be the same size."
+#define PS_ERRORTEXT_psBitSet_NOT_OP_FAILED "Could not perform NOT operation."
+#define PS_ERRORTEXT_psBitSet_OPERAND_NULL "Operand can not be NULL."
+#define PS_ERRORTEXT_psScalar_UNSUPPORTED_TYPE "Specified datatype (%d) is unsupported by psScalar."
+#define PS_ERRORTEXT_psScalar_COPY_NULL "Can not copy a NULL psScalar."
+#define PS_ERRORTEXT_psHash_KEY_NULL "Input key can not be NULL."
+#define PS_ERRORTEXT_psHash_TABLE_NULL "Input psHash can not be NULL."
+#define PS_ERRORTEXT_psHash_DATA_NULL "Input data can not be NULL."
+#define PS_ERRORTEXT_psList_LOCATION_INVALID "Specified location, %d, is invalid."
+#define PS_ERRORTEXT_psList_ITERATOR_INVALID "Specified iterator is not valid."
+#define PS_ERRORTEXT_psList_ITERATOR_NULL "Specified iterator is NULL."
+#define PS_ERRORTEXT_psList_ITERATOR_NONMUTABLE "Specified iterator indicates list is non-mutable."
+#define PS_ERRORTEXT_psList_LIST_NULL "Specified psList reference is NULL."
+#define PS_ERRORTEXT_psList_DATA_NULL "Specified data item is NULL."
+#define PS_ERRORTEXT_psList_DATA_NOT_FOUND "Specified data item is not found in the psList."
+//~End
+
+#endif
Index: /tags/ipp-1-X/bug123/psLib/src/collections/psCompare.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/collections/psCompare.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/collections/psCompare.c	(revision 22331)
@@ -0,0 +1,119 @@
+
+/** @file psCompare.c
+ *  @brief Comparison functions for sorting routines
+ *  @ingroup Compare
+ *
+ *  @author Robert Lupton, Princeton University
+ *  @author Robert Daniel DeSonia, MHPCC
+ *
+ *  @version $Revision: 1.8 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-03-17 19:26:19 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+
+#include "psCompare.h"
+
+#define COMPARE_NUMERIC_PTR(TYPE) \
+int psCompare##TYPE##Ptr(const void** a, const void** b) { \
+    return **((ps##TYPE**)a) - **((ps##TYPE**)b); \
+}
+
+#define COMPARE_NUMERIC_PTR_DESCENDING(TYPE) \
+int psCompareDescending##TYPE##Ptr(const void** a, const void** b) { \
+    return **((ps##TYPE**)b) - **((ps##TYPE**)a); \
+}
+
+#define COMPARE_NUMERIC(TYPE) \
+int psCompare##TYPE(const void* a, const void* b) { \
+    return *((ps##TYPE*)a) - *((ps##TYPE*)b); \
+}
+
+#define COMPARE_NUMERIC_DESCENDING(TYPE) \
+int psCompareDescending##TYPE(const void* a, const void* b) { \
+    return *((ps##TYPE*)b) - *((ps##TYPE*)a); \
+}
+
+COMPARE_NUMERIC_PTR(S8)
+COMPARE_NUMERIC_PTR(S16)
+COMPARE_NUMERIC_PTR(S32)
+COMPARE_NUMERIC_PTR(S64)
+COMPARE_NUMERIC_PTR(U8)
+COMPARE_NUMERIC_PTR(U16)
+COMPARE_NUMERIC_PTR(U32)
+COMPARE_NUMERIC_PTR(U64)
+
+int psCompareF32Ptr(const void** a, const void** b)
+{
+    psF32 diff = **((psF32**)a) - **((psF32**)b);
+    return (diff>FLT_EPSILON) ? 1 : ((diff<FLT_EPSILON) ? -1 :0);
+}
+
+int psCompareF64Ptr(const void** a, const void** b)
+{
+    psF64 diff = **((psF64**)a) - **((psF64**)b);
+    return (diff>DBL_EPSILON) ? 1 : ((diff<DBL_EPSILON) ? -1 :0);
+}
+
+COMPARE_NUMERIC_PTR_DESCENDING(S8)
+COMPARE_NUMERIC_PTR_DESCENDING(S16)
+COMPARE_NUMERIC_PTR_DESCENDING(S32)
+COMPARE_NUMERIC_PTR_DESCENDING(S64)
+COMPARE_NUMERIC_PTR_DESCENDING(U8)
+COMPARE_NUMERIC_PTR_DESCENDING(U16)
+COMPARE_NUMERIC_PTR_DESCENDING(U32)
+COMPARE_NUMERIC_PTR_DESCENDING(U64)
+
+int psCompareDescendingF32Ptr(const void** a, const void** b)
+{
+    psF32 diff = **((psF32**)b) - **((psF32**)a);
+    return (diff>FLT_EPSILON) ? 1 : ((diff<FLT_EPSILON) ? -1 :0);
+}
+
+int psCompareDescendingF64Ptr(const void** a, const void** b)
+{
+    psF64 diff = **((psF64**)b) - **((psF64**)a);
+    return (diff>DBL_EPSILON) ? 1 : ((diff<DBL_EPSILON) ? -1 :0);
+}
+
+COMPARE_NUMERIC(S8)
+COMPARE_NUMERIC(S16)
+COMPARE_NUMERIC(S32)
+COMPARE_NUMERIC(S64)
+COMPARE_NUMERIC(U8)
+COMPARE_NUMERIC(U16)
+COMPARE_NUMERIC(U32)
+COMPARE_NUMERIC(U64)
+
+int psCompareF32(const void* a, const void* b)
+{
+    psF32 diff = *((psF32*)a) - *((psF32*)b);
+    return (diff>FLT_EPSILON) ? 1 : ((diff<FLT_EPSILON) ? -1 :0);
+}
+
+int psCompareF64(const void* a, const void* b)
+{
+    psF64 diff = *((psF64*)a) - *((psF64*)b);
+    return (diff>DBL_EPSILON) ? 1 : ((diff<DBL_EPSILON) ? -1 :0);
+}
+
+COMPARE_NUMERIC_DESCENDING(S8)
+COMPARE_NUMERIC_DESCENDING(S16)
+COMPARE_NUMERIC_DESCENDING(S32)
+COMPARE_NUMERIC_DESCENDING(S64)
+COMPARE_NUMERIC_DESCENDING(U8)
+COMPARE_NUMERIC_DESCENDING(U16)
+COMPARE_NUMERIC_DESCENDING(U32)
+COMPARE_NUMERIC_DESCENDING(U64)
+
+int psCompareDescendingF32(const void* a, const void* b)
+{
+    psF32 diff = *((psF32*)b) - *((psF32*)a);
+    return (diff>FLT_EPSILON) ? 1 : ((diff<FLT_EPSILON) ? -1 :0);
+}
+
+int psCompareDescendingF64(const void* a, const void* b)
+{
+    psF64 diff = *((psF64*)b) - *((psF64*)a);
+    return (diff>DBL_EPSILON) ? 1 : ((diff<DBL_EPSILON) ? -1 :0);
+}
Index: /tags/ipp-1-X/bug123/psLib/src/collections/psCompare.h
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/collections/psCompare.h	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/collections/psCompare.h	(revision 22331)
@@ -0,0 +1,508 @@
+/** @file psCompare.h
+ *  @brief Comparison functions for sorting routines
+ *
+ *  @author Robert Daniel DeSonia, MHPCC
+ *
+ *  @ingroup Compare
+ *
+ *  @version $Revision: 1.6 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-02-17 19:26:23 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+
+#if !defined(PS_COMPARE_H)
+#define PS_COMPARE_H
+
+#include "psType.h"
+
+/** @addtogroup Compare
+*  @{
+*/
+
+/** A comparison function for sorting elements that are pointers to data,
+ *  e.g., for psList of pointers to numeric values.
+ *
+ *  @return int      an integer less than, equal to, or greater than zero if 
+ *                   the first argument is considered to be respectively less 
+ *                   than, equal to, or greater than the second. 
+ */
+typedef int (*psComparePtrFcn) (
+    const void **a,                    ///< first comparison target
+    const void **b                     ///< second comparison target
+);
+
+/** A comparison function for sorting.
+ *
+ *  @return int      an integer less than, equal to, or greater than zero if 
+ *                   the first argument is considered to be respectively less 
+ *                   than, equal to, or greater than the second. 
+ */
+typedef int (*psCompareFcn) (
+    const void *a,                     ///< first comparison target
+    const void *b                      ///< second comparison target
+);
+
+/** Compare function of psS8 data.  For use with psListSort.
+ *
+ *  @return int      an integer less than, equal to, or greater than zero if 
+ *                   the first argument is considered to be respectively less 
+ *                   than, equal to, or greater than the second. 
+ */
+int psCompareS8Ptr(
+    const void **a,                    ///< first comparison target
+    const void **b                     ///< second comparison target
+);
+
+/** Compare function of psS16 data.  For use with psListSort.
+ *
+ *  @return int      an integer less than, equal to, or greater than zero if 
+ *                   the first argument is considered to be respectively less 
+ *                   than, equal to, or greater than the second. 
+ */
+int psCompareS16Ptr(
+    const void **a,                    ///< first comparison target
+    const void **b                     ///< second comparison target
+);
+
+/** Compare function of psS32 data.  For use with psListSort.
+ *
+ *  @return int      an integer less than, equal to, or greater than zero if 
+ *                   the first argument is considered to be respectively less 
+ *                   than, equal to, or greater than the second. 
+ */
+int psCompareS32Ptr(
+    const void **a,                    ///< first comparison target
+    const void **b                     ///< second comparison target
+);
+
+/** Compare function of psS64 data.  For use with psListSort.
+ *
+ *  @return int      an integer less than, equal to, or greater than zero if 
+ *                   the first argument is considered to be respectively less 
+ *                   than, equal to, or greater than the second. 
+ */
+int psCompareS64Ptr(
+    const void **a,                    ///< first comparison target
+    const void **b                     ///< second comparison target
+);
+
+/** Compare function of psU8 data.  For use with psListSort.
+ *
+ *  @return int      an integer less than, equal to, or greater than zero if 
+ *                   the first argument is considered to be respectively less 
+ *                   than, equal to, or greater than the second. 
+ */
+int psCompareU8Ptr(
+    const void **a,                    ///< first comparison target
+    const void **b                     ///< second comparison target
+);
+
+/** Compare function of psU16 data.  For use with psListSort.
+ *
+ *  @return int      an integer less than, equal to, or greater than zero if 
+ *                   the first argument is considered to be respectively less 
+ *                   than, equal to, or greater than the second. 
+ */
+int psCompareU16Ptr(
+    const void **a,                    ///< first comparison target
+    const void **b                     ///< second comparison target
+);
+
+/** Compare function of psU32 data.  For use with psListSort.
+ *
+ *  @return int      an integer less than, equal to, or greater than zero if 
+ *                   the first argument is considered to be respectively less 
+ *                   than, equal to, or greater than the second. 
+ */
+int psCompareU32Ptr(
+    const void **a,                    ///< first comparison target
+    const void **b                     ///< second comparison target
+);
+
+/** Compare function of psU64 data.  For use with psListSort.
+ *
+ *  @return int      an integer less than, equal to, or greater than zero if 
+ *                   the first argument is considered to be respectively less 
+ *                   than, equal to, or greater than the second. 
+ */
+int psCompareU64Ptr(
+    const void **a,                    ///< first comparison target
+    const void **b                     ///< second comparison target
+);
+
+/** Compare function of psF32 data.  For use with psListSort.
+ *
+ *  @return int      an integer less than, equal to, or greater than zero if 
+ *                   the first argument is considered to be respectively less 
+ *                   than, equal to, or greater than the second. 
+ */
+int psCompareF32Ptr(
+    const void **a,                    ///< first comparison target
+    const void **b                     ///< second comparison target
+);
+
+/** Compare function of psF64 data.  For use with psListSort.
+ *
+ *  @return int      an integer less than, equal to, or greater than zero if 
+ *                   the first argument is considered to be respectively less 
+ *                   than, equal to, or greater than the second. 
+ */
+int psCompareF64Ptr(
+    const void **a,                    ///< first comparison target
+    const void **b                     ///< second comparison target
+);
+
+/** Compare function of psS8 data.  For use with psListSort for descending ordering.
+ *
+ *  @return int      an integer less than, equal to, or greater than zero if 
+ *                   the first argument is considered to be respectively greater 
+ *                   than, equal to, or less than the second. 
+ */
+int psCompareDescendingS8Ptr(
+    const void **a,                    ///< first comparison target
+    const void **b                     ///< second comparison target
+);
+
+/** Compare function of psS16 data.  For use with psListSort for descending ordering.
+ *
+ *  @return int      an integer less than, equal to, or greater than zero if 
+ *                   the first argument is considered to be respectively greater 
+ *                   than, equal to, or less than the second. 
+ */
+int psCompareDescendingS16Ptr(
+    const void **a,                    ///< first comparison target
+    const void **b                     ///< second comparison target
+);
+
+/** Compare function of psS32 data.  For use with psListSort for descending ordering.
+ *
+ *  @return int      an integer less than, equal to, or greater than zero if 
+ *                   the first argument is considered to be respectively greater 
+ *                   than, equal to, or less than the second. 
+ */
+int psCompareDescendingS32Ptr(
+    const void **a,                    ///< first comparison target
+    const void **b                     ///< second comparison target
+);
+
+/** Compare function of psS64 data.  For use with psListSort for descending ordering.
+ *
+ *  @return int      an integer less than, equal to, or greater than zero if 
+ *                   the first argument is considered to be respectively greater 
+ *                   than, equal to, or less than the second. 
+ */
+int psCompareDescendingS64Ptr(
+    const void **a,                    ///< first comparison target
+    const void **b                     ///< second comparison target
+);
+
+/** Compare function of psU8 data.  For use with psListSort for descending ordering.
+ *
+ *  @return int      an integer less than, equal to, or greater than zero if 
+ *                   the first argument is considered to be respectively greater 
+ *                   than, equal to, or less than the second. 
+ */
+int psCompareDescendingU8Ptr(
+    const void **a,                    ///< first comparison target
+    const void **b                     ///< second comparison target
+);
+
+/** Compare function of psU16 data.  For use with psListSort for descending ordering.
+ *
+ *  @return int      an integer less than, equal to, or greater than zero if 
+ *                   the first argument is considered to be respectively greater 
+ *                   than, equal to, or less than the second. 
+ */
+int psCompareDescendingU16Ptr(
+    const void **a,                    ///< first comparison target
+    const void **b                     ///< second comparison target
+);
+
+/** Compare function of psU32 data.  For use with psListSort for descending ordering.
+ *
+ *  @return int      an integer less than, equal to, or greater than zero if 
+ *                   the first argument is considered to be respectively greater 
+ *                   than, equal to, or lessg than the second. 
+ */
+int psCompareDescendingU32Ptr(
+    const void **a,                    ///< first comparison target
+    const void **b                     ///< second comparison target
+);
+
+/** Compare function of psU64 data.  For use with psListSort for descending ordering.
+ *
+ *  @return int      an integer less than, equal to, or greater than zero if 
+ *                   the first argument is considered to be respectively greater 
+ *                   than, equal to, or lessg than the second. 
+ */
+int psCompareDescendingU64Ptr(
+    const void **a,                    ///< first comparison target
+    const void **b                     ///< second comparison target
+);
+
+/** Compare function of psF32 data.  For use with psListSort for descending ordering.
+ *
+ *  @return int      an integer less than, equal to, or greater than zero if 
+ *                   the first argument is considered to be respectively greater 
+ *                   than, equal to, or lessg than the second. 
+ */
+int psCompareDescendingF32Ptr(
+    const void **a,                    ///< first comparison target
+    const void **b                     ///< second comparison target
+);
+
+/** Compare function of psF64 data.  For use with psListSort for descending ordering.
+ *
+ *  @return int      an integer less than, equal to, or greater than zero if 
+ *                   the first argument is considered to be respectively greater 
+ *                   than, equal to, or lessg than the second. 
+ */
+int psCompareDescendingF64Ptr(
+    const void **a,                    ///< first comparison target
+    const void **b                     ///< second comparison target
+);
+
+/** Compare function of psS8 data.
+ *
+ *  @return int      an integer less than, equal to, or greater than zero if 
+ *                   the first argument is considered to be respectively less 
+ *                   than, equal to, or greater than the second. 
+ */
+int psCompareS8(
+    const void *a,                     ///< first comparison target
+    const void *b                      ///< second comparison target
+);
+
+
+/** Compare function of psS16 data.
+ *
+ *  @return int      an integer less than, equal to, or greater than zero if 
+ *                   the first argument is considered to be respectively less 
+ *                   than, equal to, or greater than the second. 
+ */
+int psCompareS16(
+    const void *a,                     ///< first comparison target
+    const void *b                      ///< second comparison target
+);
+
+
+/** Compare function of psS32 data.
+ *
+ *  @return int      an integer less than, equal to, or greater than zero if 
+ *                   the first argument is considered to be respectively less 
+ *                   than, equal to, or greater than the second. 
+ */
+int psCompareS32(
+    const void *a,                     ///< first comparison target
+    const void *b                      ///< second comparison target
+);
+
+
+/** Compare function of psS64 data.
+ *
+ *  @return int      an integer less than, equal to, or greater than zero if 
+ *                   the first argument is considered to be respectively less 
+ *                   than, equal to, or greater than the second. 
+ */
+int psCompareS64(
+    const void *a,                     ///< first comparison target
+    const void *b                      ///< second comparison target
+);
+
+
+/** Compare function of psU8 data.
+ *
+ *  @return int      an integer less than, equal to, or greater than zero if 
+ *                   the first argument is considered to be respectively less 
+ *                   than, equal to, or greater than the second. 
+ */
+int psCompareU8(
+    const void *a,                     ///< first comparison target
+    const void *b                      ///< second comparison target
+);
+
+
+/** Compare function of psU16 data.
+ *
+ *  @return int      an integer less than, equal to, or greater than zero if 
+ *                   the first argument is considered to be respectively less 
+ *                   than, equal to, or greater than the second. 
+ */
+int psCompareU16(
+    const void *a,                     ///< first comparison target
+    const void *b                      ///< second comparison target
+);
+
+
+/** Compare function of psU32 data.
+ *
+ *  @return int      an integer less than, equal to, or greater than zero if 
+ *                   the first argument is considered to be respectively less 
+ *                   than, equal to, or greater than the second. 
+ */
+int psCompareU32(
+    const void *a,                     ///< first comparison target
+    const void *b                      ///< second comparison target
+);
+
+
+/** Compare function of psU64 data.
+ *
+ *  @return int      an integer less than, equal to, or greater than zero if 
+ *                   the first argument is considered to be respectively less 
+ *                   than, equal to, or greater than the second. 
+ */
+int psCompareU64(
+    const void *a,                     ///< first comparison target
+    const void *b                      ///< second comparison target
+);
+
+
+/** Compare function of psF32 data.
+ *
+ *  @return int      an integer less than, equal to, or greater than zero if 
+ *                   the first argument is considered to be respectively less 
+ *                   than, equal to, or greater than the second. 
+ */
+int psCompareF32(
+    const void *a,                     ///< first comparison target
+    const void *b                      ///< second comparison target
+);
+
+
+/** Compare function of psF64 data.
+ *
+ *  @return int      an integer less than, equal to, or greater than zero if 
+ *                   the first argument is considered to be respectively less 
+ *                   than, equal to, or greater than the second. 
+ */
+int psCompareF64(
+    const void *a,                     ///< first comparison target
+    const void *b                      ///< second comparison target
+);
+
+
+/** Compare function of psS8 data.
+ *
+ *  @return int      an integer less than, equal to, or greater than zero if 
+ *                   the first argument is considered to be respectively greater 
+ *                   than, equal to, or less than the second. 
+ */
+int psCompareDescendingS8(
+    const void *a,                     ///< first comparison target
+    const void *b                      ///< second comparison target
+);
+
+
+/** Compare function of psS16 data.
+ *
+ *  @return int      an integer less than, equal to, or greater than zero if 
+ *                   the first argument is considered to be respectively greater 
+ *                   than, equal to, or less than the second. 
+ */
+int psCompareDescendingS16(
+    const void *a,                     ///< first comparison target
+    const void *b                      ///< second comparison target
+);
+
+
+/** Compare function of psS32 data.
+ *
+ *  @return int      an integer less than, equal to, or greater than zero if 
+ *                   the first argument is considered to be respectively greater 
+ *                   than, equal to, or less than the second. 
+ */
+int psCompareDescendingS32(
+    const void *a,                     ///< first comparison target
+    const void *b                      ///< second comparison target
+);
+
+
+/** Compare function of psS64 data.
+ *
+ *  @return int      an integer less than, equal to, or greater than zero if 
+ *                   the first argument is considered to be respectively greater 
+ *                   than, equal to, or less than the second. 
+ */
+int psCompareDescendingS64(
+    const void *a,                     ///< first comparison target
+    const void *b                      ///< second comparison target
+);
+
+
+/** Compare function of psU8 data.
+ *
+ *  @return int      an integer less than, equal to, or greater than zero if 
+ *                   the first argument is considered to be respectively greater 
+ *                   than, equal to, or less than the second. 
+ */
+int psCompareDescendingU8(
+    const void *a,                     ///< first comparison target
+    const void *b                      ///< second comparison target
+);
+
+
+/** Compare function of psU16 data.
+ *
+ *  @return int      an integer less than, equal to, or greater than zero if 
+ *                   the first argument is considered to be respectively greater 
+ *                   than, equal to, or less than the second. 
+ */
+int psCompareDescendingU16(
+    const void *a,                     ///< first comparison target
+    const void *b                      ///< second comparison target
+);
+
+
+/** Compare function of psU32 data.
+ *
+ *  @return int      an integer less than, equal to, or greater than zero if 
+ *                   the first argument is considered to be respectively greater 
+ *                   than, equal to, or less than the second. 
+ */
+int psCompareDescendingU32(
+    const void *a,                     ///< first comparison target
+    const void *b                      ///< second comparison target
+);
+
+
+/** Compare function of psU64 data.
+ *
+ *  @return int      an integer less than, equal to, or greater than zero if 
+ *                   the first argument is considered to be respectively greater 
+ *                   than, equal to, or less than the second. 
+ */
+int psCompareDescendingU64(
+    const void *a,                     ///< first comparison target
+    const void *b                      ///< second comparison target
+);
+
+
+/** Compare function of psF32 data.
+ *
+ *  @return int      an integer less than, equal to, or greater than zero if 
+ *                   the first argument is considered to be respectively greater 
+ *                   than, equal to, or less than the second. 
+ */
+int psCompareDescendingF32(
+    const void *a,                     ///< first comparison target
+    const void *b                      ///< second comparison target
+);
+
+
+/** Compare function of psF64 data.
+ *
+ *  @return int      an integer less than, equal to, or greater than zero if 
+ *                   the first argument is considered to be respectively greater 
+ *                   than, equal to, or less than the second. 
+ */
+int psCompareDescendingF64(
+    const void *a,                     ///< first comparison target
+    const void *b                      ///< second comparison target
+);
+
+
+/// @}
+
+#endif
Index: /tags/ipp-1-X/bug123/psLib/src/collections/psHash.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/collections/psHash.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/collections/psHash.c	(revision 22331)
@@ -0,0 +1,466 @@
+
+/** @file  psHash.c
+*
+*  @brief Contains support for basic hashing functions.
+*
+*  This file will hold the functions for defining a hash table with arbitrary
+*  data types, allocating/deallocating that hash table, adding and removing
+*  data from that hash table, and listing all keys defined in the hash table.
+*
+*  @author Robert Lupton, Princeton University
+*  @author George Gusciora, MHPCC
+*  @author Robert DeSonia, MHPCC
+*
+*  @version $Revision: 1.14 $ $Name: not supported by cvs2svn $
+*  @date $Date: 2005-04-07 20:27:41 $
+*
+*  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+*/
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include "psHash.h"
+#include "psMemory.h"
+#include "psString.h"
+#include "psTrace.h"
+#include "psError.h"
+
+#include "psCollectionsErrors.h"
+
+static psHashBucket* hashBucketAlloc(const char *key, psPtr data, psHashBucket* next);
+static void hashBucketFree(psHashBucket* bucket);
+static psPtr doHashWork(psHash* table, const char *key, psPtr data, psBool remove
+                           );
+static void hashFree(psHash* table);
+
+/******************************************************************************
+psHashKeyList(table): this function creates a linked list with an entry in
+that list for every key in the hash table.
+Inputs:
+    table: a hash table
+Return;
+    The linked list
+ *****************************************************************************/
+psList* psHashKeyList(psHash* table)
+{
+    psS32 i = 0;                  // Loop index variable
+    psList* myLinkList = NULL;  // The output data structure
+    psHashBucket* ptr = NULL;   // Used to step thru linked list.
+
+    if (table == NULL) {
+        return NULL;
+    }
+    // Create the linked list
+    myLinkList = psListAlloc(NULL);
+
+    // Loop through every bucket in the hash table.  If that bucket is not
+    // NULL, then add the bucket's key to the linked list.
+    for (i = 0; i < table->nbucket; i++) {
+        if (table->buckets[i] != NULL) {
+            // Since a bucket contains a linked list of keys/data, we must
+            // step trough each key in that linked list:
+
+            ptr = table->buckets[i];
+            while (ptr != NULL) {
+                psListAdd(myLinkList, PS_LIST_HEAD, ptr->key);
+                ptr = ptr->next;
+            }
+        }
+    }
+
+    // Return the linked list
+    return (myLinkList);
+}
+
+/******************************************************************************
+hashBucketAlloc(key, data, next): This procedure creates a new hash bucket
+with the specified key, data, and next.
+Inputs:
+    key:  the new bucket's key pointer
+    data: the new bucket's data pointer
+    next: the new bucket's key pointer
+Return:
+    the new hash bucket.
+ *****************************************************************************/
+static psHashBucket* hashBucketAlloc(const char *key,
+                                     psPtr data,
+                                     psHashBucket* next)
+{
+    // Allocate memory for the new hash bucket.
+    psHashBucket* bucket = psAlloc(sizeof(psHashBucket));
+
+    psMemSetDeallocator(bucket, (psFreeFcn) hashBucketFree);
+
+    // Initialize the bucket.
+    bucket->key = psStringCopy(key);
+
+    if (data == NULL) {
+        // NOTE: Should we flag a warning message?
+        bucket->data = NULL;
+    } else {
+        bucket->data = psMemIncrRefCounter(data);
+    }
+
+    bucket->next = next;
+
+    return bucket;
+}
+
+/******************************************************************************
+hashBucketFree(bucket): This procedure deallocates the specified
+hash bucket.
+Inputs:
+    bucket: the hash bucket to be freed.
+Return:
+    NONE
+ *****************************************************************************/
+static void hashBucketFree(psHashBucket* bucket)
+{
+    if (bucket == NULL) {
+        return;
+    }
+
+    psFree(bucket->key);
+
+    psFree(bucket->data);
+}
+
+/******************************************************************************
+psHashAlloc(nbucket): this procedure creates a new hash table with the
+specified number of buckets.
+Inputs:
+    nbucket: initial number of buckets
+Return:
+    The new hash table.
+ *****************************************************************************/
+psHash* psHashAlloc(psS32 nbucket)        // initial number of buckets
+{
+    psS32 i = 0;                  // loop index variable
+
+    // Create the new hash table.
+    psHash* table = psAlloc(sizeof(psHash));
+
+    psMemSetDeallocator(table, (psFreeFcn) hashFree);
+
+    // Allocate memory for the buckets.
+    table->buckets = psAlloc(nbucket * sizeof(psHashBucket* ));
+    table->nbucket = nbucket;
+
+    psTrace("utils.hash", 1, "Creating %d-element hash table\n", nbucket);
+
+    // Initialize all buckets to NULL.
+    for (i = 0; i < nbucket; i++)
+    {
+        table->buckets[i] = NULL;
+    }
+
+    // Return the new hash table.
+    return table;
+}
+
+/******************************************************************************
+hashFree(table): This procedure deallocates the specified hash
+table.  It loops through each bucket, and calls hashBucketFree() on that
+bucket.
+ 
+Inputs:
+    table: a hash table
+Return:
+    NONE
+ *****************************************************************************/
+static void hashFree(psHash* table)
+{
+    psS32 i = 0;                  // Loop index variable.
+
+    if (table == NULL) {
+        return;
+    }
+    // Loop through each bucket in the hash table.  If that bucket is not
+    // NULL, then free the bucket via a function call to hashBucketFree();
+    for (i = 0; i < table->nbucket; i++) {
+
+        // A bucket is composed of a linked list of buckets.
+        while (table->buckets[i] != NULL) {
+            psHashBucket* bucket = table->buckets[i];
+            table->buckets[i] = bucket->next;
+            psFree(bucket);
+        }
+    }
+
+    // Free the bucket structure, then the hash table.
+    psFree(table->buckets);
+}
+
+/******************************************************************************
+doHashWork(table, key, data, remove): This is an internal
+procedure which does the bulk of the work in using the hash table.  Depending
+upon the input parameters, it will either insert a new key/data into the hash
+table, retrieve the data for a specified key, or remove a key/data item.  If
+we try to insert a key that already exists in the hash table, then we deallocate
+the existing data/key item.
+Inputs:
+    table: a hash table
+    key: the key to insert, retrieve, or remove.  Must not be NULL.
+    data: the data to insert, if not NULL
+    remove: set to non-zero if the key/data should be removed from the table.
+Return:
+    NONE
+ 
+NOTE: consider removing this private function and simply putting the code
+into the psHashInsert(), psHashLookup(), and psHashRemove().  Why?  Because
+there is little common code between those functions.
+  *****************************************************************************/
+static psPtr doHashWork(psHash* table,
+                        const char *key,
+                        psPtr data, psBool remove
+                           )
+{
+    psS64 hash = 1;          // This will contain an integer value
+
+    // "hashed" from the key.
+    char *tmpchar = NULL;       // Used in computing the hash function.
+    psHashBucket* ptr = NULL;   // Used to retrieve the hash bucket.
+    psHashBucket* optr = NULL;  // "original pointer": used to step
+
+    // thru the linked list for a bucket.
+
+    // The following condition should never be true, since this is a private
+    // function, but I'm checking it anyway since future coders might change
+    // the way this procedure is called.
+    if ((table == NULL) || (key == NULL)) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psHash_KEY_NULL);
+        return NULL;
+    }
+    // NOTE: This is the originally supplied hash function.
+    // for (psS32 i = 0, len = strlen(key); i < len; i++) {
+    // hash = (hash << 1) ^ key[i];
+    // }
+    // hash &= (table->nbucket - 1);
+
+    // This hash algorithm is from Sedgewick.  NOTE: must reread to ensure that
+    // the size of the hash table is not required to be a prime number.
+    tmpchar = (char *)key;
+    for (hash = 0; *tmpchar != '\0'; tmpchar++) {
+        hash = (64 * hash + *tmpchar) % (table->nbucket);
+    }
+
+    // NOTE: This should not be necessary, but for now, I'm checking bounds
+    // anyway.
+    if ((hash < 0) || (hash >= table->nbucket)) {
+        psError(PS_ERR_UNKNOWN, true,
+                "Internal hash function out of range (%d)", hash);
+    }
+    // ptr will have the correct hash bucket.
+    ptr = table->buckets[hash];
+
+    // We know the correct hash bucket, now we need to know what to do.
+    // If the data parameter is NULL, then, by definition, this is a retrieve
+    // or a remove operation on the hash table.
+
+    if (data == NULL) {
+        if (remove
+           ) {
+            // We search through the linked list for this bucket in
+            // the hash table and look for an entry for this key.
+
+            optr = ptr;
+            while (ptr != NULL) {
+                // Determine if this entry holds the correct key.
+                if (strcmp(key, ptr->key) == 0) {
+                    // The following lines of code are fairly standard ways
+                    // of removing an item from a single-linked list.
+
+                    psPtr data = ptr->data;
+
+                    optr->next = ptr->next;
+                    if (ptr == table->buckets[hash]) {
+                        table->buckets[hash] = ptr->next;
+                    }
+                    psFree(ptr);
+
+                    // By definition, the data associated with that key
+                    // must be returned, not freed.
+                    return data;
+                }
+                optr = ptr;
+                ptr = ptr->next;
+            }
+            return NULL;                   // not in hash
+        }
+        else {
+            // If we get here, then a retrieve operation is requested.  So,
+            // we step trough the linked list at this bucket, and return the
+            // data once we find it, or return NULL if we don't.
+            while (ptr != NULL) {
+                if (strcmp(key, ptr->key) == 0) {
+                    return ptr->data;
+                }
+                ptr = ptr->next;
+            }
+            return NULL;                   // not in hash
+        }
+    } else {
+        // We get here if this procedure was called with non-NULL data.
+        // Therefore, we should insert that data into the hash table.
+        // First, we search through the linked list for this bucket in
+        // the hash table and look for a duplicate entry for this key.
+
+        while (ptr != NULL) {
+            if (strcmp(key, ptr->key) == 0) {
+                // We have found this key in the hash table.
+
+                psTrace("utils.hash.insert", 3, "Replacing data for %s\n", key);
+
+                // NOTE: I have changed this behavior from the originally
+                // supplied code.  Formerly, if itemFree was NULL, then
+                // the new data was not inserted into the hash table.
+
+                psFree(ptr->data);
+
+                ptr->data = psMemIncrRefCounter(data);
+                return data;
+            }
+            ptr = ptr->next;
+        }
+        // We did not found key in the linked list for this bucket of the hash
+        // table.  So, we insert this data at the head of that linked list.
+
+        table->buckets[hash] = hashBucketAlloc(key, data, table->buckets[hash]);
+        return data;
+    }
+}
+
+/******************************************************************************
+psHashAdd(table, key, data): this procedure, which is part of
+the public API, inserts a new key/data pair into the hash table.
+Inputs:
+    table: a hash table
+    key: the key to use
+    data: the data to insert.
+Return:
+    boolean value defining success or failure
+ *****************************************************************************/
+psBool psHashAdd(psHash* table,
+                 const char *key,
+                 psPtr data)
+{
+    if (table == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psHash_TABLE_NULL);
+        return false;
+    }
+    if (key == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psHash_KEY_NULL);
+        return false;
+    }
+    if (data == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psHash_DATA_NULL);
+        return false;
+    }
+
+    return (doHashWork(table, key, data, false) != NULL);
+}
+
+/******************************************************************************
+psHashLookup(table, key): this procedure, which is part of the public API,
+looks up the specified key in the hash table and returns the data associated
+with that key.
+ 
+Inputs:
+    table: a hash table
+    key: the key to use
+Return:
+    The data associated with that key.
+ *****************************************************************************/
+psPtr psHashLookup(psHash* table,      // table to lookup key in
+                   const char *key)     // key to lookup
+{
+    if (table == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psHash_TABLE_NULL);
+        return NULL;
+    }
+    if (key == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psHash_KEY_NULL);
+        return NULL;
+    }
+
+    return doHashWork(table, key, NULL, false);
+}
+
+/******************************************************************************
+psHashRemove(table, key): this procedure, which is part of the
+public API, removes the specified key from the hash table.
+Inputs:
+    table: a hash table
+    key: the key to remove
+Return:
+    boolean value defining success or failure
+ *****************************************************************************/
+psBool psHashRemove(psHash* table,
+                    const char *key)
+{
+    psPtr data = NULL;
+    psBool retVal = false;
+
+    if (table == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psHash_TABLE_NULL);
+        return false;
+    }
+    if (key == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psHash_KEY_NULL);
+        return false;
+    }
+
+    data = doHashWork(table, key, NULL, true);
+    if (data != NULL) {
+        retVal = true;
+    } else {
+        retVal = false;
+    }
+
+    return retVal;
+}
+
+psArray* psHashToArray(psHash* table)
+{
+
+    if (table == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psHash_TABLE_NULL);
+        return NULL;
+    }
+
+    // first, let's just count the number of data elements to know what size
+    // psArray we need to allocate.
+    int nElements = 0;
+    int nbucket = table->nbucket;
+    for (int i = 0; i < nbucket; i++) {
+        psHashBucket* tmpBucket = table->buckets[i];
+        while (tmpBucket != NULL) {
+            nElements++;
+            tmpBucket = tmpBucket->next;
+        }
+    }
+
+    psArray* result = psArrayAlloc(nElements);
+    result->n = nElements;
+
+    // now fill in the array with the hash table's data
+    psPtr* data = result->data;
+    for (int i = 0; i < nbucket; i++) {
+        psHashBucket* tmpBucket = table->buckets[i];
+        while (tmpBucket != NULL) {
+            *(data++) = psMemIncrRefCounter(tmpBucket->data);
+            tmpBucket = tmpBucket->next;
+        }
+    }
+
+    return result;
+}
Index: /tags/ipp-1-X/bug123/psLib/src/collections/psHash.h
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/collections/psHash.h	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/collections/psHash.h	(revision 22331)
@@ -0,0 +1,86 @@
+
+/** @file  psHash.h
+ *  @brief Contains support for basic hashing functions.
+ *  @ingroup HashTable
+ *
+ *  This file will hold the prototypes for defining a hash table with arbitrary
+ *  data types, allocating/deallocating that has table, adding and removing
+ *  data from that hash table, and listing all keys defined in the hash table.
+ *
+ *  @author Robert Lupton, Princeton University
+ *  @author George Gusciora, MHPCC
+ *  @author Robert DeSonia, MHPCC
+ *
+ *  @version $Revision: 1.7 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-02-17 19:26:23 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+#if !defined(PS_HASH_H)
+#define PS_HASH_H
+
+/** \addtogroup HashTable
+ *  \{
+ */
+
+#include "psList.h"
+
+/** A bucket that holds an item of data. */
+typedef struct psHashBucket
+{
+    char *key;                         ///< key for this item of data
+    psPtr data;                        ///< the data itself
+    struct psHashBucket* next;         ///< list of other possible keys
+}
+psHashBucket;
+
+//typedef struct HashTable psHash; ///< Opaque type for a hash table
+
+/** The hash-table itself. */
+typedef struct psHash
+{
+    psS32 nbucket;                     ///< Number of buckets in hash table.
+    psHashBucket* *buckets;            ///< The bucket data.
+}
+psHash;
+
+/// Allocate hash buckets in table.
+psHash* psHashAlloc(
+    psS32 nbucket                  ///< The number of buckets to allocate.
+);
+
+/// Insert entry into table.
+psBool psHashAdd(
+    psHash* table,                 ///< table to insert in
+    const char *key,               ///< key to use
+    psPtr data                     ///< data to insert
+);
+
+/// Lookup key in table.
+psPtr psHashLookup(
+    psHash* table,                 ///< table to lookup key in
+    const char *key                ///< key to lookup
+);
+
+/// Remove key from table.
+psBool psHashRemove(
+    psHash* table,                 ///< table to lookup key in
+    const char *key                ///< key to lookup
+);
+
+/// List all keys in table.
+psList* psHashKeyList(
+    psHash* table                  ///< table to list keys from.
+);
+
+/** Create a psArray from a psHash contents.
+ *
+ *  @return psArray*       A new psArray with duplicate contents of the input psHash
+ */
+psArray* psHashToArray(
+    psHash* table                  ///< table to convert to psArray
+);
+
+/* \} */// End of DataGroup Functions
+
+#endif
Index: /tags/ipp-1-X/bug123/psLib/src/collections/psList.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/collections/psList.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/collections/psList.c	(revision 22331)
@@ -0,0 +1,639 @@
+/** @file psList.c
+ *  @brief Support for doubly linked lists
+ *  @ingroup LinkedList
+ *
+ *  @author Robert Lupton, Princeton University
+ *  @author Robert Daniel DeSonia, MHPCC
+ *
+ *  @version $Revision: 1.35 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-04-07 20:27:41 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <pthread.h>                       // we need a mutex to make this stuff thread safe.
+
+#include "psError.h"
+#include "psAbort.h"
+#include "psMemory.h"
+#include "psList.h"
+#include "psTrace.h"
+#include "psLogMsg.h"
+
+#include "psCollectionsErrors.h"
+
+#define ITER_INIT_HEAD ((psPtr )1)         // next iteration should return head
+#define ITER_INIT_TAIL ((psPtr )2)         // next iteration should return tail
+
+// private functions.
+static void listFree(psList* list);
+static void listIteratorFree(psListIterator* iter);
+static psBool listIteratorRemove(psListIterator* iterator);
+
+static void listFree(psList* list)
+{
+    if (list == NULL) {
+        return;
+    }
+
+    pthread_mutex_lock(&list->lock)
+    ;
+
+    // remove the free function of iterators to avoid double removal from list
+    psArray* iterators = list->iterators;
+    for (int i = 0; i < iterators->n; i++) {
+        psMemSetDeallocator(iterators->data[i], NULL);
+    }
+
+    psFree(list->iterators);
+
+    for (psListElem* ptr = list->head; ptr != NULL;) {
+        psListElem* next = ptr->next;
+
+        psFree(ptr->data);
+        psFree(ptr);
+
+        ptr = next;
+    }
+
+    pthread_mutex_unlock(&list->lock)
+    ;
+
+    pthread_mutex_destroy(&list->lock)
+    ;
+
+}
+
+static void listIteratorFree(psListIterator* iter)
+{
+    if (iter == NULL) {
+        return;
+    }
+
+    // remove this iterator from the parent list
+    psArrayRemove(iter->list->iterators,iter);
+
+}
+
+static psBool listIteratorRemove(psListIterator* iterator)
+{
+    if (iterator == NULL || iterator->cursor == NULL) {
+        return false;
+    }
+
+    psListElem* elem = iterator->cursor;
+    psList* list = iterator->list;
+    int index = iterator->index;
+
+    pthread_mutex_lock(&list->lock)
+    ;
+
+    if (elem == list->head) {        // head of list?
+        list->head = elem->next;
+    } else {
+        elem->prev->next = elem->next;
+    }
+
+    if (elem == list->tail) {        // tail of list?
+        list->tail = elem->prev;
+    } else {
+        elem->next->prev = elem->prev;
+    }
+
+    psArray* iterators = list->iterators;
+    for (int i = 0; i < iterators->n; i++) {
+        psListIterator* iter = (psListIterator*) iterators->data[i];
+        if (iter->cursor == elem) {
+            iter->cursor = NULL;
+        } else if (iter->index > index && iter->index > 0) {
+            iter->index--;
+        }
+    }
+
+    list->size--;
+
+    pthread_mutex_unlock(&list->lock)
+    ;
+
+    // OK, delete orphaned list element and its data
+    psFree(elem->data);
+    psFree(elem);
+
+    return true;
+}
+
+psList* psListAlloc(psPtr data)
+{
+    psList* list = psAlloc(sizeof(psList));
+
+    psMemSetDeallocator(list, (psFreeFcn) listFree);
+
+    list->size = 0;
+    list->head = list->tail = NULL;
+    list->iterators = psArrayAlloc(16);
+    list->iterators->n = 0;
+
+    // create a default iterator
+    psListIteratorAlloc(list,PS_LIST_HEAD,true);
+
+    pthread_mutex_init(&(list->lock), NULL)
+    ;
+
+    if (data != NULL) {
+        psListAdd(list, PS_LIST_TAIL, data);
+    }
+
+    return list;
+}
+
+psListIterator* psListIteratorAlloc(psList* list, int location, bool mutable)
+{
+    psListIterator* iter = psAlloc(sizeof(psListIterator));
+
+    psMemSetDeallocator(iter, (psFreeFcn) listIteratorFree);
+
+    // initialize the attributes
+    iter->list = list;
+    iter->cursor = NULL;
+    iter->index = 0;
+    iter->offEnd = false;
+    iter->mutable = mutable;
+
+    // add to the list's array of iterators
+    psArray* listIterators = list->iterators;
+    int num = listIterators->n;
+    if ( num >= listIterators->nalloc) {
+        // need to resize the array to make more room for another iterator.
+        list->iterators = psArrayRealloc(listIterators,listIterators->nalloc*2);
+        listIterators = list->iterators;
+    }
+    listIterators->data[num] = iter;
+    listIterators->n = num+1;
+
+    if (! psListIteratorSet(iter,location)) {
+        psFree(iter);
+        iter = NULL;
+    }
+
+    return iter;
+}
+
+psBool psListIteratorSet(psListIterator* iterator,
+                         int location)
+{
+    if (iterator == NULL) {
+        return false;
+    }
+
+    psList* list = iterator->list;
+
+    if (location == PS_LIST_TAIL) {
+        iterator->cursor = list->tail;
+        iterator->index = list->size - 1;
+        iterator->offEnd = false;
+        return true;
+    }
+
+    if (location == PS_LIST_HEAD) {
+        iterator->cursor = list->head;
+        iterator->index = 0;
+        iterator->offEnd = false;
+        return true;
+    }
+
+    if (location < 0) {
+        location = list->size + location;
+    }
+
+    if (location < 0 || location >= (int)list->size) {
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true,
+                PS_ERRORTEXT_psList_LOCATION_INVALID,
+                location);
+        return false;
+    }
+
+    psListElem* cursor = iterator->cursor;
+    int index = iterator->index;
+    if (cursor == NULL) {      // set the cursor to the head if it is NULL
+        if (location > list->size/2) { // closer to tail or head?
+            cursor = list->tail;
+            index = list->size - 1;
+        } else {
+            cursor = list->head;
+            index = 0;
+        }
+    }
+
+    if (location < index) {
+        psS32 diff = index - location;
+
+        for (psS32 count = 0; count < diff; count++) {
+            cursor = cursor->prev; // shouldn't need to check for NULL
+        }
+    } else {
+        psS32 diff = location - index;
+
+        for (psS32 count = 0; count < diff; count++) {
+            cursor = cursor->next; // shouldn't need to check for NULL
+        }
+    }
+    iterator->cursor = cursor;
+    iterator->index = location;
+    iterator->offEnd = false;
+
+    return true;
+}
+
+psBool psListAdd(psList* list, psS32 location, psPtr data)
+{
+
+    if (list == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psList_LIST_NULL);
+        return false;
+    }
+
+    if (data == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psList_DATA_NULL);
+        return false;
+    }
+
+    if (location > 0 && location >= (int)list->size) {
+        psLogMsg(__func__,PS_LOG_WARN,
+                 "Specified location, %d, is beyond the end of the list.  "
+                 "Adding data item to tail.",
+                 location);
+        location = PS_LIST_TAIL;
+    }
+
+    // move ourselves to the given position
+    if (! psListIteratorSet(list->iterators->data[0],location)) {
+        return false;
+    }
+
+    if (location == PS_LIST_TAIL) {
+        // insert the element at the end of the list
+        return psListAddAfter(list->iterators->data[0],data);
+    } else {
+        return psListAddBefore(list->iterators->data[0],data);
+    }
+}
+
+bool psListAddAfter(psListIterator* iterator, void* data)
+{
+    if (data == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psList_DATA_NULL);
+        return false;
+    }
+
+    if (iterator == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psList_ITERATOR_NULL);
+        return false;
+    }
+
+    // Check if the list pointed by the iterator can be changed
+    if (!iterator->mutable) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psList_ITERATOR_NONMUTABLE);
+        return false;
+    }
+
+    psListElem* cursor = iterator->cursor;
+    psList* list = iterator->list;
+
+    if (cursor == NULL && list->head != NULL) {
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true,
+                PS_ERRORTEXT_psList_ITERATOR_INVALID);
+        return false;
+    }
+
+    psListElem* elem = psAlloc(sizeof(psListElem));
+
+    pthread_mutex_lock(&list->lock)
+    ;
+
+    // set the new list element's attributes
+    if (cursor == NULL) { // must be an empty list
+        elem->prev = NULL;
+        elem->next = NULL;
+        list->head = elem;
+        list->tail = elem;
+    } else {
+        elem->prev = cursor;
+        elem->next = cursor->next;
+        cursor->next = elem;
+        if (elem->next == NULL) {
+            list->tail = elem;
+        } else {
+            elem->next->prev = elem;
+        }
+    }
+
+    elem->data = psMemIncrRefCounter(data);
+
+    list->size++;
+
+    if (cursor == list->tail) {
+        list->tail = elem;
+    }
+
+    psArray* iterators = list->iterators;
+    int index = iterator->index;
+    for (int i = 0; i < iterators->n; i++) {
+        psListIterator* iter = (psListIterator*) iterators->data[i];
+        if (iter->index > index) {
+            iter->index++;
+        }
+    }
+
+    pthread_mutex_unlock(&list->lock)
+    ;
+
+    return true;
+}
+
+bool psListAddBefore(psListIterator* iterator, void* data)
+{
+    if (data == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psList_DATA_NULL);
+        return false;
+    }
+
+    if (iterator == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psList_ITERATOR_NULL);
+        return false;
+    }
+
+    // Check if the list pointed by the iterator can be changed
+    if (!iterator->mutable) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psList_ITERATOR_NONMUTABLE);
+        return false;
+    }
+
+    psListElem* cursor = iterator->cursor;
+    psList* list = iterator->list;
+
+    if (cursor == NULL && list->head != NULL) {
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true,
+                PS_ERRORTEXT_psList_ITERATOR_INVALID);
+        return false;
+    }
+
+    psListElem* elem = psAlloc(sizeof(psListElem));
+
+    pthread_mutex_lock(&list->lock)
+    ;
+
+    // set the new list element's attributes
+    if (cursor == NULL) { // empty list.
+        elem->prev = NULL;
+        elem->next = NULL;
+        list->head = elem;
+        list->tail = elem;
+    } else {
+        elem->prev = cursor->prev;
+        elem->next = cursor;
+        cursor->prev = elem;
+        if (elem->prev == NULL) {
+            list->head = elem;
+        } else {
+            elem->prev->next = elem;
+        }
+    }
+
+    elem->data = psMemIncrRefCounter(data);
+
+    list->size++;
+
+    if (cursor == list->head) {
+        list->head = elem;
+    }
+
+    psArray* iterators = list->iterators;
+    int index = iterator->index;
+    for (int i = 0; i < iterators->n; i++) {
+        psListIterator* iter = (psListIterator*) iterators->data[i];
+        if (iter->index >= index) {
+            iter->index++;
+        }
+    }
+
+    pthread_mutex_unlock(&list->lock)
+    ;
+
+    return true;
+}
+
+psBool psListRemove(psList* list,
+                    psS32 location)
+{
+    if (list == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psList_LIST_NULL);
+        return false;
+    }
+
+    // move ourselves to the given position
+    psListIterator* defaultIterator = list->iterators->data[0];
+    if (! psListIteratorSet(defaultIterator,location)) {
+        return false;
+    }
+
+    return listIteratorRemove(defaultIterator);
+}
+
+psBool psListRemoveData(psList* list,
+                        psPtr data)
+{
+    if (list == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psList_LIST_NULL);
+        return false;
+    }
+
+    if (data == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psList_DATA_NULL);
+        return false;
+    }
+
+    psListElem* elem = list->head;
+    int index = 0;
+    while (elem != NULL && elem->data != data) {
+        elem = elem->next;
+        index++;
+    }
+    if (elem == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psList_DATA_NOT_FOUND);
+        return false;
+    }
+
+    psListIterator* iterator = (psListIterator*)list->iterators->data[0];
+    iterator->index = index;
+    iterator->cursor = elem;
+
+    return listIteratorRemove(iterator);
+}
+
+psPtr psListGet(psList* list, psS32 location)
+{
+    if (list == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psList_LIST_NULL);
+        return NULL;
+    }
+
+    if (list->head == NULL) { // list empty?
+        return NULL;
+    }
+
+    psListIterator* iterator = list->iterators->data[0];
+
+    if (! psListIteratorSet(iterator,location)) {
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true,
+                PS_ERRORTEXT_psList_LOCATION_INVALID,
+                location);
+        return NULL;
+    }
+
+    return iterator->cursor->data;
+}
+
+/*
+ * and now return the previous/next element of the list
+ */
+psPtr psListGetAndIncrement(psListIterator* iterator)
+{
+    if (iterator == NULL ) {
+        return NULL;
+    }
+    if (( iterator->cursor == NULL) && (iterator->offEnd)) {
+        return NULL;
+    }
+    if ( (iterator->cursor == NULL) && (!iterator->offEnd)) {
+        iterator->cursor = iterator->list->head;
+        iterator->index = 0;
+        return NULL;
+    }
+
+    psPtr data = iterator->cursor->data;
+
+    iterator->cursor = iterator->cursor->next;
+    iterator->index++;
+    if (iterator->cursor == NULL) {
+        iterator->offEnd = true;
+    }
+
+    return data;
+}
+
+psPtr psListGetAndDecrement(psListIterator* iterator)
+{
+    if (iterator == NULL ) {
+        return NULL;
+    }
+    if ((iterator->cursor == NULL) && (!iterator->offEnd))  {
+        psLogMsg(__func__,PS_LOG_WARN,"Attempt to get previous with itertator cursor NULL and offEnd false");
+        return NULL;
+    }
+    if ( (iterator->cursor == NULL) && (iterator->offEnd) ) {
+        iterator->cursor = iterator->list->tail;
+        iterator->index = iterator->list->size-1;
+        iterator->offEnd = false;
+        return NULL;
+    }
+
+    psPtr data = iterator->cursor->data;
+
+    iterator->cursor = iterator->cursor->prev;
+    iterator->index--;
+
+    return data;
+}
+
+/*
+ * Convert a psList to/from a psVoidPtrArray
+ */
+psArray* psListToArray(psList* restrict list)
+{
+    psListElem* ptr;
+    psU32 n;
+    psArray* restrict arr;
+
+    if (list == NULL) {
+        return NULL;
+    }
+
+    if (list->size > 0) {
+        arr = psArrayAlloc(list->size);
+    } else {
+        arr = psArrayAlloc(1);
+    }
+
+    arr->n = list->size;
+
+    ptr = list->head;
+    n = list->size;
+    for (psS32 i = 0; i < n; i++) {
+        arr->data[i] = psMemIncrRefCounter(ptr->data);
+        ptr = ptr->next;
+    }
+
+    return arr;
+}
+
+psList* psArrayToList(psArray* arr)
+{
+    psU32 n;
+    psList* list;               // list of elements
+
+    if (arr == NULL) {
+        return NULL;
+    }
+
+    list = psListAlloc(NULL);
+    n = arr->n;
+    for (psS32 i = 0; i < n; i++) {
+        psListAdd(list, PS_LIST_TAIL, arr->data[i]);
+    }
+
+    return list;
+}
+
+psList* psListSort(psList* list, psComparePtrFcn compare)
+{
+    psArray* arr;
+
+    if (list == NULL) {
+        return NULL;
+    }
+    // convert to indexable vector for use by qsort.
+    arr = psListToArray(list);
+    psArray* iterators = psMemIncrRefCounter(list->iterators);
+    psFree(list);
+
+    arr = psArraySort(arr, compare);
+
+    // convert back to linked list
+    list = psArrayToList(arr);
+    psFree(list->iterators);
+    list->iterators = iterators;
+    psFree(arr);
+
+    // sorting should invalidate all iterator positions.
+    for (int i = 0; i < iterators->n; i++) {
+        ((psListIterator*)iterators->data[i])->cursor = NULL;
+    }
+
+    return list;
+}
+
Index: /tags/ipp-1-X/bug123/psLib/src/collections/psList.h
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/collections/psList.h	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/collections/psList.h	(revision 22331)
@@ -0,0 +1,228 @@
+#if !defined(PS_LIST_H)
+#define PS_LIST_H
+
+/** @file psList.h
+ *  @brief Support for doubly linked lists
+ *
+ *  @author Robert Lupton, Princeton University
+ *  @author Robert Daniel DeSonia, MHPCC
+ *
+ *  @ingroup LinkedList
+ *
+ *  @version $Revision: 1.23 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-03-11 23:17:46 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+
+#include <pthread.h>                   // we need a mutex to make this stuff thread safe.
+
+#include "psCompare.h"
+#include "psArray.h"
+
+/** @addtogroup LinkedList
+ *  @{
+ */
+
+/** Special values of index into list
+ *
+ *  This list of possible list position values should be contiguous non-positive values ending with
+ *  PS_LIST_UNKNOWN.  Any value less-than-or-equal-to PS_LIST_UNKNOWN is considered a undefined position.
+ *
+ */
+enum {
+    PS_LIST_HEAD = 0,                  ///< at head
+    PS_LIST_TAIL = -1,                 ///< at tail
+};
+
+/** Doubly-linked list element */
+typedef struct psListElem
+{
+    struct psListElem* prev;           ///< previous link in list
+    struct psListElem* next;           ///< next link in list
+    psPtr data;                        ///< real data item
+}
+psListElem;
+
+/** The psList Linked list structure.  User should not allocate this struct
+ *  directly; rather the psListAlloc should be used.
+ *
+ *  @see psListAlloc
+ */
+typedef struct
+{
+    psU32 size;                        ///< number of elements on list
+    psListElem* head;                  ///< first element on list (may be NULL)
+    psListElem* tail;                  ///< last element on list (may be NULL)
+    psArray* iterators;
+    ///< array of all iterators associated with this list.  First iterator is
+    ///< used internally to improve performance when using indexed access, all
+    ///< others are user-level iterators created by psListIteratorAlloc.
+
+    pthread_mutex_t lock;              ///< mutex to lock a node during changes
+}
+psList;
+
+/** The psList iterator structure.  This should be allocated via
+ *  psListIteratorAlloc and not directly.
+ *
+ *  The life span of a psListIterator object is ended by either a psFree
+ *  of this structure OR psFree of the psList in which it operates on.
+ *
+ *  @see psListIteratorAlloc, psListIteratorSet, psListGetAndIncrement, psListGetAndDecrement
+ */
+typedef struct
+{
+psList* list;                      ///< List iterator to works on
+psListElem* cursor;                ///< current cursor position
+int index;                         ///< the index number in the list
+bool offEnd;                       ///< Iterator off the end?
+bool mutable;                      ///< Is it permissible to modify the list?
+}
+psListIterator;
+
+
+/** Creates a psList linked list object.
+ *
+ *  @return psList* A new psList object.
+ */
+psList* psListAlloc(
+    psPtr data
+    ///< initial data item; may be NULL if no an empty psList is desired
+)
+;
+
+/** Creates a psListIterator object and associates it with a psList.
+ *
+ *  @return psListIterator* A new psListIterator object.
+ */
+psListIterator* psListIteratorAlloc(
+    psList* list,                      ///< the psList to iterate with
+    int location,                      ///< the initial starting point.
+    ///<  This can be a numeric index, PS_LIST_HEAD, or PS_LIST_TAIL.
+    bool mutable                       ///< Is it permissible to modify list?
+);
+
+/** Set the iterator of the list to a given position.  If location is invalid the
+ *  iterator position is not changed.
+ *
+ *  @return psBool        TRUE if iterator successfully set, otherwise FALSE.
+ */
+psBool psListIteratorSet(
+    psListIterator* iterator,            ///< list iterator
+    int location                         ///< index number, PS_LIST_HEAD, or PS_LIST_TAIL
+);
+
+/** Adds an element to a psList at position given.
+ *
+ *  @return psBool        TRUE if item was successfully added, otherwise FALSE.
+ */
+psBool psListAdd(
+    psList* list,                      ///< list to add item to
+    psS32 location,                    ///< index, PS_LIST_HEAD, PS_LIST_TAIL, or numbered location.
+    psPtr data                         ///< data item to add.  If NULL, list is not modified.
+);
+
+/** Adds an data item to a psList at position just after the list position given
+ *
+ *  @return psBool        TRUE if item was successfully added, otherwise FALSE.
+ */
+psBool psListAddAfter(
+    psListIterator* list,              ///< list position to add item to
+    psPtr data                         ///< data item to add.  If NULL, list is not modified.
+);
+
+/** Adds an data item to a psList at position just before the list position given
+ *
+ *  @return psBool        TRUE if item was successfully added, otherwise FALSE.
+ */
+psBool psListAddBefore(
+    psListIterator* list,              ///< list position to add item to
+    psPtr data                         ///< data item to add.  If NULL, list is not modified.
+);
+
+/** Remove an item at the specified location from a list.
+ *
+ *  @return psBool        TRUE if element is successfully removed, otherwise FALSE.
+ */
+psBool psListRemove(
+    psList* list,                      ///< list to remove element from
+    psS32 location                     ///< index of item
+);
+
+/** Remove an item from a list.
+ *
+ *  @return psBool        TRUE if element is successfully removed, otherwise FALSE.
+ */
+psBool psListRemoveData(
+    psList* list,                      ///< list to remove element from
+    psPtr data                         ///< data item to find and remove
+);
+
+/** Retrieve an item from a list.
+ *
+ *  @return psPtr       the item corresponding to the location parameter.  If
+ *                      location is invalid (e.g., a numbered index greater
+ *                      than the list size or if the list is empty), a
+ *                      NULL is returned.
+ */
+psPtr psListGet(
+    psList* list,                      ///< list to retrieve element from
+    psS32 location                     ///< index number, PS_LIST_HEAD, or PS_LIST_TAIL
+);
+
+/** Position the specified iterator to the next item in list.
+ *
+ *  @return psPtr       the data item at the original iterator position or NULL if the
+ *                      iterator went past the end of the list.
+ */
+psPtr psListGetAndIncrement(
+    psListIterator* iterator           ///< iterator to move
+);
+
+/** Position the specified iterator to the previous item in list.
+ *
+ *  @return psPtr       the data item at the original iterator position or NULL if the
+ *                      iterator went past the beginning of the list.
+ */
+psPtr psListGetAndDecrement(
+    psListIterator* iterator           ///< iterator to move
+);
+
+/** Convert a linked list to an array
+ *
+ *  @return psArray* A new psArray populated with elements from the list,
+ *                      or NULL if the given dlist parameter is NULL.
+ */
+psArray* psListToArray(
+    psList* dlist                      ///< List to convert
+);
+
+/** Convert array to a doubly-linked list
+ *
+ *  @return psList* A new psList populated with elements formt the psArray,
+ *                      or NULL is the given arr parameter is NULL.
+ */
+psList* psArrayToList(
+    psArray* arr                       ///< vector to convert
+);
+
+/** Sort a list via a comparison function.
+ *
+ *  The comparison function must return an integer less than, equal to, or 
+ *  greater than zero if the first argument is considered to be respectively 
+ *  less than, equal to, or greater than the second. 
+ *
+ *  If two members compare as equal, their order in the sorted array is 
+ *  undefined.
+ *
+ *  @return psList*     Sorted list.
+ */
+psList* psListSort(
+    psList* list,                      ///< the list to sort
+    psComparePtrFcn compare            ///< the comparison function
+);
+
+/// @} End of DataGroup Functions
+
+#endif
Index: /tags/ipp-1-X/bug123/psLib/src/collections/psMetadata.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/collections/psMetadata.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/collections/psMetadata.c	(revision 22331)
@@ -0,0 +1,729 @@
+/** @file  psMetadata.c
+*
+*
+*  @brief Contains metadata structures, enumerations and functions prototypes.
+*
+*  This file defines metadata item, metadata type, metadata flags, metadata containers, and function
+*  prototypes necessary creating psLib metadata APIs
+*
+*  @ingroup Metadata
+*
+*  @author Robert DeSonia, MHPCC
+*  @author Ross Harman, MHPCC
+*
+*  @version $Revision: 1.58 $ $Name: not supported by cvs2svn $
+*  @date $Date: 2005-04-07 20:27:41 $
+*
+*  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+*/
+
+/******************************************************************************/
+/*  INCLUDE FILES                                                             */
+/******************************************************************************/
+#include<stdio.h>
+#include<stdarg.h>
+#include<string.h>
+
+#include "fitsio.h"
+#include "psType.h"
+#include "psMemory.h"
+#include "psError.h"
+#include "psAbort.h"
+#include "psList.h"
+#include "psHash.h"
+#include "psVector.h"
+#include "psMetadata.h"
+#include "psLookupTable.h"
+#include "psString.h"
+#include "psAstronomyErrors.h"
+#include "psConstants.h"
+
+/******************************************************************************/
+/*  DEFINE STATEMENTS                                                         */
+/******************************************************************************/
+
+/** Maximum size of a string */
+#define MAX_STRING_LENGTH 1024
+
+/******************************************************************************/
+/*  TYPE DEFINITIONS                                                          */
+/******************************************************************************/
+
+// None
+
+/*****************************************************************************/
+/*  GLOBAL VARIABLES                                                         */
+/*****************************************************************************/
+
+// None
+
+/*****************************************************************************/
+/*  FILE STATIC VARIABLES                                                    */
+/*****************************************************************************/
+
+static psS32 metadataId = 0;
+
+/*****************************************************************************/
+/*  FUNCTION IMPLEMENTATION - LOCAL                                          */
+/*****************************************************************************/
+
+static psMetadataItem* makeMetaMulti(psHash* table, const char* key, psMetadataItem* existing)
+{
+
+    if (existing != NULL && existing->type == PS_META_MULTI) {
+        return existing;
+    }
+
+    // move any existing entry into a psList
+    psList* newList = psListAlloc(existing);
+
+    psMetadataItem* item = psMetadataItemAlloc(key,
+                           PS_META_MULTI,
+                           "",
+                           newList);
+
+    if (existing != NULL) {
+        psHashRemove(table,key); // take out the old entry
+    }
+
+    psHashAdd(table, key, item); // put in the new entry
+
+    // free local references of newly allocated items.
+    psFree(newList);
+    psFree(item);
+
+    return item;
+}
+
+static void metadataItemFree(psMetadataItem* metadataItem)
+{
+    psMetadataType type;
+
+    type = metadataItem->type;
+
+    if (metadataItem == NULL) {
+        return;
+    }
+
+    psFree(metadataItem->name);
+    psFree(metadataItem->comment);
+    if (! PS_META_IS_PRIMITIVE(type)) {
+        psFree(metadataItem->data.V);
+    }
+}
+
+static void metadataIteratorFree(psMetadataIterator* iter)
+{
+    if (iter == NULL) {
+        return;
+    }
+    psFree(iter->iter);
+
+    if (iter->preg != NULL) {
+        regfree(iter->preg);
+    }
+}
+
+static void metadataFree(psMetadata* metadata)
+{
+    if (metadata == NULL) {
+        return;
+    }
+    psFree(metadata->list);
+    psFree(metadata->table);
+}
+
+/*****************************************************************************/
+/* FUNCTION IMPLEMENTATION - PUBLIC                                          */
+/*****************************************************************************/
+
+psMetadataItem* psMetadataItemAlloc(const char *name, psMetadataType type,
+                                    const char *comment, ...)
+{
+    va_list argPtr;
+    psMetadataItem* metadataItem = NULL;
+
+    // Get the variable list parameters to pass to allocation function
+    va_start(argPtr, comment);
+
+    // Call metadata item allocation
+    metadataItem = psMetadataItemAllocV(name, type, comment, argPtr);
+
+    // Clean up stack after variable arguement has been used
+    va_end(argPtr);
+
+    return metadataItem;
+}
+
+#define METADATAITEM_ALLOC_TYPE(NAME,TYPE,METATYPE) \
+psMetadataItem* psMetadataItemAlloc##NAME(const char* name, \
+        const char* comment, \
+        TYPE value) \
+{ \
+    return psMetadataItemAlloc(name, METATYPE, comment, value); \
+}
+
+METADATAITEM_ALLOC_TYPE(Str,const char*,PS_META_STR)
+METADATAITEM_ALLOC_TYPE(F32,psF32,PS_META_F32)
+METADATAITEM_ALLOC_TYPE(F64,psF64,PS_META_F64)
+METADATAITEM_ALLOC_TYPE(S32,psS32,PS_META_S32)
+METADATAITEM_ALLOC_TYPE(Bool,psBool,PS_META_BOOL)
+
+psMetadataItem* psMetadataItemAllocV(const char *name, psMetadataType type,
+                                     const char *comment, va_list argPtr)
+{
+    psMetadataItem* metadataItem = NULL;
+
+
+    PS_PTR_CHECK_NULL(name,NULL);
+
+    // Allocate metadata item
+    metadataItem = (psMetadataItem*) psAlloc(sizeof(psMetadataItem));
+    metadataItem->data.V = NULL;
+
+    // Set deallocator
+    psMemSetDeallocator(metadataItem, (psFreeFcn) metadataItemFree);
+
+    // Allocate and set metadata item comment
+    metadataItem->comment = (char *)psAlloc(sizeof(char) * MAX_STRING_LENGTH);
+    if (comment == NULL) {
+        // Per SDRS, null isn't allowed, must use "" instead
+        strncpy(metadataItem->comment, "", MAX_STRING_LENGTH);
+    } else {
+        strncpy(metadataItem->comment, comment, MAX_STRING_LENGTH);
+    }
+
+    // Set metadata item unique id
+    *(psS32 *)(&metadataItem->id) = ++metadataId;
+
+    // Set metadata item type
+    metadataItem->type = type & PS_METADATA_TYPE_MASK;
+
+    // Allocate and set metadata item name
+    metadataItem->name = (char *)psAlloc(sizeof(char) * MAX_STRING_LENGTH);
+    vsprintf(metadataItem->name, name, argPtr);
+
+    // Set metadata item value
+    switch(metadataItem->type) {
+    case PS_META_BOOL:
+        metadataItem->data.B = (psBool)va_arg(argPtr, psS32);
+        break;
+    case PS_META_S32:
+        metadataItem->data.S32 = (psS32)va_arg(argPtr, psS32);
+        break;
+    case PS_META_F32:
+        metadataItem->data.F32 = (psF32)va_arg(argPtr, psF64);
+        break;
+    case PS_META_F64:
+        metadataItem->data.F64 = (psF64)va_arg(argPtr, psF64);
+        break;
+    case PS_META_STR:
+        // Perform copy of input strings
+        metadataItem->data.V = psStringNCopy(va_arg(argPtr, char *), MAX_STRING_LENGTH);
+        break;
+    case PS_META_LIST:
+    case PS_META_VEC:
+    case PS_META_HASH:
+    case PS_META_LOOKUPTABLE:
+    case PS_META_JPEG:
+    case PS_META_PNG:
+    case PS_META_ASTROM:
+    case PS_META_UNKNOWN:
+    case PS_META_MULTI:
+        // Copy of input data not performed due to variability of data types
+        metadataItem->data.V = psMemIncrRefCounter(va_arg(argPtr, psPtr));
+        break;
+    default:
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true, PS_ERRORTEXT_psMetadata_METATYPE_INVALID, type);
+        psFree(metadataItem);
+        metadataItem = NULL;
+    }
+
+    return metadataItem;
+}
+
+psMetadata* psMetadataAlloc(void)
+{
+    psList* list = NULL;
+    psHash* table = NULL;
+    psMetadata* metadata = NULL;
+
+    // Allocate metadata
+    metadata = (psMetadata*) psAlloc(sizeof(psMetadata));
+    // Set deallocator
+    psMemSetDeallocator(metadata, (psFreeFcn) metadataFree);
+
+    // Allocate metadata's internal containers
+    list = (psList*) psListAlloc(NULL);
+    table = (psHash*) psHashAlloc(10);
+
+    metadata->list = list;
+    metadata->table = table;
+
+    return metadata;
+}
+
+psBool psMetadataAddItem(psMetadata *md, psMetadataItem *metadataItem, psS32 location, psS32 flags)
+{
+    char * key = NULL;
+    psHash *mdTable = NULL;
+    psList *mdList = NULL;
+    psMetadataItem *existingEntry = NULL;
+
+    PS_PTR_CHECK_NULL(md,NULL);
+    PS_PTR_CHECK_NULL(md->table,NULL);
+    PS_PTR_CHECK_NULL(md->list,NULL);
+    PS_PTR_CHECK_NULL(metadataItem,NULL);
+    PS_PTR_CHECK_NULL(metadataItem->name,NULL);
+
+    mdTable = md->table;
+    mdList = md->list;
+    key = metadataItem->name;
+
+    // See if key is already in table
+    existingEntry = (psMetadataItem*)psHashLookup(mdTable, key);
+
+    if (metadataItem->type == PS_META_MULTI) {
+        // the incoming entry is PS_META_MULTI
+
+        // force the hash entry to be PS_META_MULTI
+        existingEntry = makeMetaMulti(mdTable,key,existingEntry);
+
+        // add all the items in the incoming entry to metadata
+        psList* list = metadataItem->data.list;
+        if (list != NULL) {
+            psListIterator* iter = psListIteratorAlloc(list,PS_LIST_HEAD,true);
+            psMetadataItem* listItem;
+            while ((listItem=(psMetadataItem*)psListGetAndIncrement(iter)) != NULL) {
+                psMetadataAddItem(md,listItem,location,flags);
+            }
+            psFree(iter);
+        }
+
+        return true; // all done.
+    }
+
+    // how the item is added to the hash depends on prior existence, flags, etc.
+    if(existingEntry != NULL) { // prior existence
+        if (existingEntry->type == PS_META_MULTI || (flags & PS_META_DUPLICATE_OK) != 0) {
+            // duplicate entries allowed - add another entry.
+
+            // make sure the existing entry is PS_META_MULTI
+            existingEntry = makeMetaMulti(mdTable,key,existingEntry);
+
+            // add to the hash's list of duplicate entries
+            if (! psListAdd(existingEntry->data.list, PS_LIST_TAIL, metadataItem) ) {
+                psError(PS_ERR_UNKNOWN,false,PS_ERRORTEXT_psMetadata_ADD_COLLECTION_FAILED,key);
+                return false;
+            }
+        } else if ((flags & PS_META_REPLACE) != 0) {
+            // replace entry instead of creating a duplicate entry.
+
+            // remove the existing entry from metadata
+            psMetadataRemove(md,0,key);
+
+            // treat as if new (added to list below)
+            if(!psHashAdd(mdTable, key, metadataItem)) {
+                psError(PS_ERR_UNKNOWN,false,PS_ERRORTEXT_psMetadata_ADD_TABLE_FAILED,key);
+                return false;
+            }
+        } else {
+            // default is to error on duplicate entry.
+            psError(PS_ERR_BAD_PARAMETER_VALUE, true,
+                    PS_ERRORTEXT_psMetadata_DUPLICATE_NOT_ALLOWED);
+            return false;
+        }
+    } else {
+        // OK, this is a new item.
+
+        // Node doesn't exist - Add new metadata item to metadata collection's hash
+        if(!psHashAdd(mdTable, key, metadataItem)) {
+            psError(PS_ERR_UNKNOWN,false,PS_ERRORTEXT_psMetadata_ADD_TABLE_FAILED,key);
+            return false;
+        }
+    }
+
+    if(!psListAdd(mdList, location, metadataItem)) {
+        psError(PS_ERR_UNKNOWN,false,PS_ERRORTEXT_psMetadata_ADD_COLLECTION_FAILED,key);
+        return false;
+    }
+
+    return true;
+}
+
+psBool psMetadataAdd(psMetadata *md, psS32 location, const char *name,
+                     psS32 type, const char *comment, ...)
+{
+    va_list argPtr;
+
+    va_start(argPtr, comment);
+    psBool result = psMetadataAddV(md,location,name,type,comment,argPtr);
+    va_end(argPtr);
+
+    return result;
+}
+
+psBool psMetadataAddV(psMetadata *md, psS32 location, const char *name,
+                      psS32 type, const char *comment, va_list list)
+{
+    psMetadataItem* metadataItem = NULL;
+
+    metadataItem = psMetadataItemAllocV(name, type & PS_METADATA_TYPE_MASK, comment, list);
+
+    if (!psMetadataAddItem(md, metadataItem, location, type & PS_METADATA_FLAGS_MASK)) {
+        psError(PS_ERR_UNKNOWN,false,PS_ERRORTEXT_psMetadata_ADD_FAILED);
+        psFree(metadataItem);
+        return false;
+    }
+    // Decrement reference count, since the metadata item is now in metadata collection and no longer needed
+    psFree(metadataItem);
+
+    return true;
+}
+
+#define METADATA_ADD_TYPE(NAME,TYPE,METATYPE) \
+psBool psMetadataAdd##NAME(psMetadata* md, psS32 where, const char* name, \
+                           const char* comment, TYPE value) { \
+    return psMetadataAdd(md,where,name, METATYPE,comment,value); \
+}
+
+METADATA_ADD_TYPE(S32,psS32,PS_META_S32)
+METADATA_ADD_TYPE(F32,psF32,PS_META_F32)
+METADATA_ADD_TYPE(F64,psF64,PS_META_F64)
+METADATA_ADD_TYPE(List,psList*,PS_META_LIST)
+METADATA_ADD_TYPE(Str,const char*,PS_META_STR)
+METADATA_ADD_TYPE(Vector,psVector*,PS_META_VEC)
+METADATA_ADD_TYPE(Image,psImage*,PS_META_IMG)
+METADATA_ADD_TYPE(Hash,psHash*,PS_META_HASH)
+METADATA_ADD_TYPE(LookupTable,psLookupTable*,PS_META_LOOKUPTABLE)
+METADATA_ADD_TYPE(Unknown,void*,PS_META_UNKNOWN)
+
+psBool psMetadataRemove(psMetadata *md, psS32 where, const char *key)
+{
+    PS_PTR_CHECK_NULL(md,NULL);
+
+    PS_PTR_CHECK_NULL(md->list,NULL);
+    psList* mdList = md->list;
+
+    PS_PTR_CHECK_NULL(md->table,NULL);
+    psHash* mdTable = md->table;
+
+    // Select removal by key or index
+    if (key != NULL) {
+        // Remove by key name
+        psMetadataItem* entry = psHashLookup(mdTable,key);
+        if (entry == NULL) {
+            psError(PS_ERR_UNKNOWN, false, PS_ERRORTEXT_psMetadata_REMOVE_TABLE_FAILED, key);
+            return false;
+        }
+        if (entry->type == PS_META_MULTI) {
+            psMetadataItem* listItem;
+            psListIterator* iter = psListIteratorAlloc(
+                                       entry->data.list,
+                                       PS_LIST_HEAD,true);
+            while ((listItem=psListGetAndIncrement(iter)) != NULL) {
+                psListRemoveData(mdList, listItem);
+            }
+            psFree(iter);
+            psHashRemove(mdTable,key);
+
+        } else {
+            psListRemoveData(mdList, entry);
+            psHashRemove(mdTable, key);
+        }
+    } else {
+        // Remove by index
+        psMetadataItem* entry = psListGet(mdList, where);
+        if (entry == NULL) {
+            psError(PS_ERR_BAD_PARAMETER_VALUE, true, PS_ERRORTEXT_psMetadata_FIND_INDEX_FAILED, where);
+            return false;
+        }
+        key = entry->name;
+
+        if (key == NULL) {
+            psError(PS_ERR_BAD_PARAMETER_VALUE, true, PS_ERRORTEXT_psMetadata_REMOVE_LIST_INDEX_FAILED, where);
+            return false;
+        }
+
+        psMetadataItem* tableItem = psHashLookup(mdTable, key);
+        if (tableItem == NULL) {
+            psError(PS_ERR_UNKNOWN, false, PS_ERRORTEXT_psMetadata_REMOVE_TABLE_FAILED, key);
+            return false;
+        }
+
+        if (tableItem->type == PS_META_MULTI) {
+            // multiple entries with same key, remove just the specified one
+            psListRemoveData(tableItem->data.list, entry);
+        } else {
+            if (!psHashRemove(mdTable, key)) {
+                psError(PS_ERR_UNKNOWN, false, PS_ERRORTEXT_psMetadata_REMOVE_TABLE_FAILED, key);
+                return false;
+            }
+        }
+        psListRemove(mdList, where);
+    }
+
+    return true;
+}
+
+psMetadataItem* psMetadataLookup(psMetadata *md, const char *key)
+{
+    psHash* mdTable = NULL;
+    psMetadataItem* entry = NULL;
+
+
+    PS_PTR_CHECK_NULL(md,NULL);
+    PS_PTR_CHECK_NULL(md->table,NULL);
+    PS_PTR_CHECK_NULL(key,NULL);
+
+    mdTable = md->table;
+    entry = (psMetadataItem*)psHashLookup(mdTable, key);
+
+    return entry;
+}
+
+void* psMetadataLookupPtr(psBool *status, psMetadata *md, const char *key)
+{
+    psMetadataItem *metadataItem = NULL;
+
+    if (status) {
+        *status = true;
+    }
+
+    metadataItem = psMetadataLookup(md, key);
+    if(metadataItem == NULL) {
+        if (status) {
+            *status = false;
+        }
+        return NULL;
+    }
+    if (metadataItem->type == PS_META_MULTI) {
+        // if multiple keys found, use the first.
+        metadataItem = (psMetadataItem*)((metadataItem->data.list)->head);
+    }
+
+    if(PS_META_IS_PRIMITIVE(metadataItem->type)) {
+        if (status) {
+            *status = false;
+        }
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true,
+                PS_ERRORTEXT_psMetadata_METATYPE_INVALID,
+                metadataItem->type);
+        return NULL;
+    } else {
+        return metadataItem->data.V;
+    }
+}
+
+#define psMetadataLookupNumTYPE(TYPE) \
+ps##TYPE psMetadataLookup##TYPE(psBool *status, psMetadata *md, const char *key) \
+{ \
+    psMetadataItem *metadataItem = NULL; \
+    ps##TYPE value = 0; \
+    \
+    if (status) { \
+        *status = true; \
+    } \
+    \
+    metadataItem = psMetadataLookup(md, key); \
+    if(metadataItem == NULL) { \
+        if (status) { \
+            *status = false; \
+        } \
+        return 0; \
+    } \
+    if (metadataItem->type == PS_META_MULTI) { \
+        /* if multiple keys found, use the first. */ \
+        metadataItem = (psMetadataItem*)((metadataItem->data.list)->head); \
+    } \
+    \
+    switch (metadataItem->type) { \
+    case PS_META_S32: \
+        value = (ps##TYPE)metadataItem->data.S32; \
+        break; \
+    case PS_META_F32: \
+        value = (ps##TYPE)metadataItem->data.F32; \
+        break; \
+    case PS_META_F64: \
+        value = (ps##TYPE)metadataItem->data.F64; \
+        break; \
+    case PS_META_BOOL: \
+        if (metadataItem->data.B) { \
+            value = 1; \
+        } \
+        break; \
+    default: \
+        /* if you get to this point, the value is not a number. */ \
+        if (status) { \
+            *status = false; \
+        } \
+        break; \
+    } \
+    \
+    /* psFree(metadataItem); currently, the lookup doesn't increment the ref count */ \
+    return value; \
+}
+
+psMetadataLookupNumTYPE(F32)
+psMetadataLookupNumTYPE(F64)
+psMetadataLookupNumTYPE(S32)
+psMetadataLookupNumTYPE(Bool)
+
+psMetadataItem* psMetadataGet(psMetadata *md, psS32 where)
+{
+    psMetadataItem* entry = NULL;
+
+    PS_PTR_CHECK_NULL(md,NULL);
+    PS_PTR_CHECK_NULL(md->list,NULL);
+
+    entry = (psMetadataItem*) psListGet(md->list, where);
+    if (entry == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true, PS_ERRORTEXT_psMetadata_FIND_INDEX_FAILED, where);
+        return NULL;
+    }
+
+    return entry;
+}
+
+psMetadataIterator* psMetadataIteratorAlloc(psMetadata* md,
+        int location,
+        const char* regex)
+{
+    PS_PTR_CHECK_NULL(md,NULL);
+    PS_PTR_CHECK_NULL(md->list,NULL);
+
+    psMetadataIterator* newIter = psAlloc(sizeof(psMetadataIterator));
+    newIter->preg = NULL;
+    newIter->iter = NULL;
+
+    // Set deallocator
+    psMemSetDeallocator(newIter, (psFreeFcn) metadataIteratorFree);
+
+    if (regex == NULL) {
+        newIter->iter = psListIteratorAlloc(md->list, location, false);
+        return newIter;
+    } else {
+        int regRtn = regcomp(newIter->preg,regex,0);
+        if (regRtn != 0) {
+            char errMsg[256];
+            regerror(regRtn, newIter->preg, errMsg, 256);
+            regfree(newIter->preg);
+            psError(PS_ERR_BAD_PARAMETER_VALUE, true,
+                    PS_ERRORTEXT_psMetadata_REGEX_INVALID,
+                    errMsg);
+            psFree(newIter);
+            return NULL;
+        }
+    }
+
+    psMetadataIteratorSet(newIter, location); // XXX: do we error if no match is found?
+
+    return newIter;
+}
+
+psBool psMetadataIteratorSet(psMetadataIterator* iterator,
+                             int location)
+{
+    int match;
+    psMetadataItem* cursor;
+
+    PS_PTR_CHECK_NULL(iterator,NULL);
+
+    psListIterator* iter = iterator->iter;
+    PS_PTR_CHECK_NULL(iterator->iter,NULL);
+
+    regex_t* preg = iterator->preg;
+
+    // handle trivial case where no regex subsetting is required.
+    if (preg == NULL) {
+        return psListIteratorSet(iter,location);
+    }
+
+    if (location < 0) {
+        // match from the tail
+        match = 0;
+        psListIteratorSet(iter,PS_LIST_TAIL);
+        while ( (cursor=(psMetadataItem*)iter->cursor) != NULL) {
+            if (regexec(preg, cursor->name, 0, NULL, 0) == 0) {
+                // this key is a match
+                match--;
+                if (match == location) {
+                    break;
+                }
+            }
+            (void)psListGetAndDecrement(iter);
+        }
+        return (match == location);
+    }
+
+    // find the n-th match from the head
+    match = -1;
+    psListIteratorSet(iter,PS_LIST_HEAD);
+    while ( (cursor=(psMetadataItem*)iter->cursor) != NULL) {
+        if (regexec(preg, cursor->name, 0, NULL, 0) == 0) {
+            // this key is a match
+            match++;
+            if (match == location) {
+                break;
+            }
+        }
+        (void)psListGetAndIncrement(iter);
+    }
+    return (match == location);
+}
+
+psMetadataItem* psMetadataGetAndIncrement(psMetadataIterator* iterator)
+{
+    psMetadataItem* oldValue;
+
+    PS_PTR_CHECK_NULL(iterator,NULL);
+
+    psListIterator* iter = iterator->iter;
+    PS_PTR_CHECK_NULL(iterator->iter,NULL);
+
+    regex_t* preg = iterator->preg;
+
+    // handle trivial case where no regex subsetting is required.
+    if (preg == NULL) {
+        return (psMetadataItem*)psListGetAndIncrement(iter);
+    }
+
+    oldValue = (psMetadataItem*)iter->cursor;
+
+    while (psListGetAndIncrement(iter) != NULL) {
+        if (iter->cursor != NULL &&
+                regexec(preg, ((psMetadataItem*)iter->cursor)->name, 0, NULL, 0) == 0) {
+            // this key is a match
+            break;
+        }
+    }
+    return oldValue;
+}
+
+psMetadataItem* psMetadataGetAndDecrement(psMetadataIterator* iterator)
+{
+    psMetadataItem* oldValue;
+
+    PS_PTR_CHECK_NULL(iterator,NULL);
+
+    psListIterator* iter = iterator->iter;
+    PS_PTR_CHECK_NULL(iterator->iter,NULL);
+
+    regex_t* preg = iterator->preg;
+
+    // handle trivial case where no regex subsetting is required.
+    if (preg == NULL) {
+        return (psMetadataItem*)psListGetAndDecrement(iter);
+    }
+
+    oldValue = (psMetadataItem*)iter->cursor;
+
+    while (psListGetAndDecrement(iter) != NULL) {
+        if (iter->cursor != NULL &&
+                regexec(preg, ((psMetadataItem*)iter->cursor)->name, 0, NULL, 0) == 0) {
+            // this key is a match
+            break;
+        }
+    }
+    return oldValue;
+}
Index: /tags/ipp-1-X/bug123/psLib/src/collections/psMetadata.h
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/collections/psMetadata.h	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/collections/psMetadata.h	(revision 22331)
@@ -0,0 +1,479 @@
+/** @file  psMetadata.h
+*
+*  @brief Contains metadata struuctures, enumerations and functions prototypes
+*
+*  This file defines metadata item, metadata type, metadata flags, metadata containers, and function
+*  prototypes necessary creating psLib metadata APIs
+*
+*  @ingroup Metadata
+*
+*  @author Robert DeSonia, MHPCC
+*  @author Ross Harman, MHPCC
+*
+*  @version $Revision: 1.44 $ $Name: not supported by cvs2svn $
+*  @date $Date: 2005-04-08 17:58:57 $
+*
+*  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+*/
+#ifndef PS_METADATA_H
+#define PS_METADATA_H
+
+#include <stdarg.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <regex.h>
+
+#include "psHash.h"
+#include "psList.h"
+#include "psImage.h"
+#include "psLookupTable.h"
+
+/// @addtogroup Metadata
+/// @{
+
+/** Metadata item type.
+ *
+ * Enumeration for maintaining metadata item types.
+ */
+typedef enum {
+    PS_META_S32 = PS_TYPE_S32,         ///< psS32 primitive data.
+    PS_META_F32 = PS_TYPE_F32,         ///< psF32 primitive data.
+    PS_META_F64 = PS_TYPE_F64,         ///< psF64 primitive data.
+    PS_META_BOOL = PS_TYPE_BOOL,       ///< psBool primitive data.
+    PS_META_LIST = 0x10000,            ///< List data (Stored as item.data.list).
+    PS_META_STR,                       ///< String data (Stored as item.data.V).
+    PS_META_VEC,                       ///< Vector data (Stored as item.data.V).
+    PS_META_IMG,                       ///< Image data (Stored as item.data.V).
+    PS_META_HASH,                      ///< Hash data (Stored as item.data.V).
+    PS_META_LOOKUPTABLE,               ///< Lookup table data (Stored as item.data.V).
+    PS_META_JPEG,                      ///< JPEG data (Stored as item.data.V).
+    PS_META_PNG,                       ///< PNG data (Stored as item.data.V).
+    PS_META_ASTROM,                    ///< Astrometric coefficients (Stored as item.data.V).
+    PS_META_UNKNOWN,                   ///< Other data (Stored as item.data.V).
+    PS_META_MULTI                      ///< Used internally, do not create an metadata item of this type.
+} psMetadataType;
+
+#define PS_META_IS_PRIMITIVE(TYPE) \
+(TYPE == PS_META_S32 || \
+ TYPE == PS_META_F32 || \
+ TYPE == PS_META_F64 || \
+ TYPE == PS_META_BOOL)
+
+#define PS_META_PRIMITIVE_TYPE(METATYPE) ( \
+        (METATYPE==PS_META_S32) ? PS_TYPE_S32 : \
+        (METATYPE==PS_META_F32) ? PS_TYPE_F32 : \
+        (METATYPE==PS_META_F64) ? PS_TYPE_F64 : \
+        (METATYPE==PS_META_BOOL) ? PS_TYPE_BOOL : 0 )
+
+/** Option flags for psMetadata functions
+ *
+ *  Enumeration for the modification of the behaviour in psMetadataAddItem.
+ * 
+ *  @see psMetadataAddItem
+ */
+typedef enum {
+    PS_META_DEFAULT = 0,               ///< default behaviour (duplicate entry is an error)
+    PS_META_REPLACE = 0x1000000,       ///< allow entry to be replaced
+    PS_META_DUPLICATE_OK = 0x2000000   ///< allow duplicate entries
+} psMetadataFlags;
+
+#define PS_METADATA_FLAGS_MASK 0xFF000000
+#define PS_METADATA_TYPE_MASK 0x00FFFFFF
+
+/** Metadata data structure.
+ *
+ *  Struct for holding metadata items. Metadata items are held in two
+ *  containers. The first employs a doubly-linked list to preserve the order
+ *  of the metadata. The second container employs a hash table which
+ *  allows fast lookup when given a metadata keyword.
+ */
+typedef struct psMetadata
+{
+    psList*  list;                     ///< Metadata in linked-list
+    psHash*  table;                    ///< Metadata in a hash table
+}
+psMetadata;
+
+/** Metadata iterator
+ *
+ *  Iterator for metadata.
+ */
+typedef struct
+{
+    psListIterator* iter;              ///< iterator for the psMetadata's psList
+    regex_t* preg;                     ///< the subsetting regular expression
+}
+psMetadataIterator;
+
+
+/** Metadata item data structure.
+ *
+ * Struct for maintaining metadata items of varying types. It also contains
+ * information about the item name, flags, comments, and other items with the same name.
+ */
+typedef struct psMetadataItem
+{
+    const psS32 id;                    ///< Unique ID for metadata item.
+    char *name;                        ///< Name of metadata item.
+    psMetadataType type;               ///< Type of metadata item.
+    union {
+        psBool B;                      ///< boolean data
+        psS32 S32;                     ///< Signed 32-bit integer data.
+        psF32 F32;                     ///< Single-precision float data.
+        psF64 F64;                     ///< Double-precision float data.
+        psList *list;                  ///< List data.
+        psMetadata *md;                ///< Metadata data.
+        psPtr V;                       ///< Pointer to other type of data.
+    } data;                            ///< Union for data types.
+    char *comment;                     ///< Optional comment ("", not NULL).
+}
+psMetadataItem;
+
+/** Create a metadata item.
+ *
+ *  Returns a fill psMetadataItem ready for insertion into the psMetadata
+ *  struct. The name argument specifies the name to use for this item, and
+ *  may include sprintf formatting codes. The format entry specifies both
+ *  the metadata type and optional flags and is created by bit-wise or of the
+ *  appropriate type and flag. The comment argument is a fixed string used to
+ *  comment the metadata item. The arguments to the name formatting codes and
+ *  the metadata itself are passed as arguments following the comment string.
+ *  The data must be a pointer for any of the elements stored in data.void.
+ *  The argument list must be interpreted appropriately by the va_list
+ *  operators in the function specified size and type.
+ *
+ * @return psMetadataItem* : Pointer metadata item.
+ */
+psMetadataItem* psMetadataItemAlloc(
+    const char *name,                  ///< Name of metadata item.
+    psMetadataType type,               ///< Type of metadata item.
+    const char *comment,               ///< Comment for metadata item.
+    ...                                ///< Arguments for name formatting and metadata item data.
+);
+
+/** Create a metadata item with specified string data.
+ *
+ *  Returns a fill psMetadataItem ready for insertion into the psMetadata
+ *  struct.
+ *
+ * @return psMetadataItem* : Pointer metadata item.
+ */
+psMetadataItem* psMetadataItemAllocStr(
+    const char* name,                  ///< Name of metadata item.
+    const char* comment,               ///< Comment for metadata item.
+    const char* value                  ///< the value of the metadata item.
+);
+
+/** Create a metadata item with specified psF32 data.
+ *
+ *  Returns a fill psMetadataItem ready for insertion into the psMetadata
+ *  struct.
+ *
+ * @return psMetadataItem* : Pointer metadata item.
+ */
+psMetadataItem* psMetadataItemAllocF32(
+    const char* name,                  ///< Name of metadata item.
+    const char* comment,               ///< Comment for metadata item.
+    psF32 value                        ///< the value of the metadata item.
+);
+
+/** Create a metadata item with specified psF64 data.
+ *
+ *  Returns a fill psMetadataItem ready for insertion into the psMetadata
+ *  struct.
+ *
+ * @return psMetadataItem* : Pointer metadata item.
+ */
+psMetadataItem* psMetadataItemAllocF64(
+    const char* name,                  ///< Name of metadata item.
+    const char* comment,               ///< Comment for metadata item.
+    psF64 value                        ///< the value of the metadata item.
+);
+
+/** Create a metadata item with specified psS32 data.
+ *
+ *  Returns a fill psMetadataItem ready for insertion into the psMetadata
+ *  struct.
+ *
+ * @return psMetadataItem* : Pointer metadata item.
+ */
+psMetadataItem* psMetadataItemAllocS32(
+    const char* name,                  ///< Name of metadata item.
+    const char* comment,               ///< Comment for metadata item.
+    psS32 value                        ///< the value of the metadata item.
+);
+
+/** Create a metadata item with specified psBool data.
+ *
+ *  Returns a fill psMetadataItem ready for insertion into the psMetadata
+ *  struct.
+ *
+ * @return psMetadataItem* : Pointer metadata item.
+ */
+psMetadataItem* psMetadataItemAllocBool(
+    const char* name,                  ///< Name of metadata item.
+    const char* comment,               ///< Comment for metadata item.
+    psBool value                       ///< the value of the metadata item.
+);
+
+#ifndef SWIG
+/** Create a metadata item with va_list.
+ *
+ *  Returns a fill psMetadataItem ready for insertion into the psMetadata
+ *  struct. The name argument specifies the name to use for this item, and
+ *  may include sprintf formatting codes. The format entry specifies both
+ *  the metadata type and optional flags and is created by bit-wise or of the
+ *  appropriate type and flag. The comment argument is a fixed string used to
+ *  comment the metadata item. The arguments to the name formatting codes and
+ *  the metadata itself are passed as arguments following the comment string.
+ *  The data must be a pointer for any of the elements stored in data.void.
+ *  The argument list must be interpreted appropriately by the va_list
+ *  operators in the function specified size and type.
+ *
+ * @return psMetadataItem* : Pointer metadata item.
+ */
+psMetadataItem* psMetadataItemAllocV(
+    const char *name,                  ///< Name of metadata item.
+    psMetadataType type,               ///< Type of metadata item.
+    const char *comment,               ///< Comment for metadata item.
+    va_list list                       ///< Arguments for name formatting and metadata item data.
+);
+#endif
+
+/** Create a metadata collection.
+ *
+ *  Returns an empty metadata container with fully allocated internal metadata
+ *  containers.
+ *
+ *  @return psMetadata* : Pointer metadata.
+ */
+psMetadata* psMetadataAlloc(void);
+
+/** Add existing metadata item to metadata collection.
+ *
+ *  Add a metadata item that has already been created to the metadata
+ *  collection.
+ *
+ *  @return bool: True for success, false for failure.
+ */
+psBool psMetadataAddItem(
+    psMetadata*  md,                   ///< Metadata collection to insert metadat item.
+    psMetadataItem*  item,             ///< Metadata item to be added.
+    psS32 location,                    ///< Location to be added.
+    psS32 flags                        ///< Options flag mask, see psMetadataFlags enum
+);
+
+/** Create and add a metadata item to metadata collection.
+ *
+ * Creates a new metadata item add to the metadata collection.
+ *
+ * @return bool: True for success, false for failure.
+ */
+psBool psMetadataAdd(
+    psMetadata* md,                    ///< Metadata collection to insert metadata item.
+    psS32 location,                    ///< Location to be added.
+    const char *name,                  ///< Name of metadata item.
+    int type,                          ///< Type of metadata item (psMetadataType) and options (psMetadataFlags)
+    const char *comment,               ///< Comment for metadata item.
+    ...                                ///< Arguments for name formatting and metadata item data.
+);
+
+#ifndef SWIG
+/** Create and add a metadata item to metadata collection.
+ *
+ * Creates a new metadata item add to the metadata collection.
+ *
+ * @return bool: True for success, false for failure.
+ */
+psBool psMetadataAddV(
+    psMetadata* md,                    ///< Metadata collection to insert metadat item.
+    psS32 location,                    ///< Location to be added.
+    const char *name,                  ///< Name of metadata item.
+    int type,                          ///< Type of metadata item (psMetadataType) and options (psMetadataFlags)
+    const char *comment,               ///< Comment for metadata item.
+    va_list list                       ///< Arguments for name formatting and metadata item data.
+);
+#endif
+
+psBool psMetadataAddS32(psMetadata* md, psS32 location, const char* name,
+                        const char* comment, psS32 value);
+psBool psMetadataAddF32(psMetadata* md, psS32 location, const char* name,
+                        const char* comment, psF32 value);
+psBool psMetadataAddF64(psMetadata* md, psS32 location, const char* name,
+                        const char* comment, psF64 value);
+psBool psMetadataAddList(psMetadata* md, psS32 location, const char* name,
+                         const char* comment, psList* value);
+psBool psMetadataAddStr(psMetadata* md, psS32 location, const char* name,
+                        const char* comment, const char* value);
+psBool psMetadataAddVector(psMetadata* md, psS32 location, const char* name,
+                           const char* comment, psVector* value);
+psBool psMetadataAddImage(psMetadata* md, psS32 location, const char* name,
+                          const char* comment, psImage* value);
+psBool psMetadataAddHash(psMetadata* md, psS32 location, const char* name,
+                         const char* comment, psHash* value);
+psBool psMetadataAddLookupTable(psMetadata* md, psS32 location, const char* name,
+                                const char* comment, psLookupTable* value);
+psBool psMetadataAddUnknown(psMetadata* md, psS32 location, const char* name,
+                            const char* comment, psPtr value);
+
+/** Remove an item from metadata collection.
+ *
+ *  Items may be removed from metadata by specifing a key or location. If the
+ *  name is null, the where argument is used instead. If name is not null,
+ *  where is set to PS_LIST_UNKNOWN. If the item is found, it is removed from
+ *  the metadata and true is returned.  If the key is not unique, then all
+ *  items corresponding to it are removed.
+ *
+ * @return bool: True for success, false for failure.
+ */
+psBool psMetadataRemove(
+    psMetadata*  md,           ///< Metadata collection to remove metadata item.
+    psS32 where,               ///< Location to be removed.
+    const char * key           ///< Name of metadata key.
+);
+
+/** Find an item in the metadata collection based on key name.
+ *
+ *  Items may be found in the metadata by providing a key. If the key is
+ *  non-unique, the first item is returned. If the item is not found, null is
+ *  returned.
+ *
+ * @return psMetadataItem* : Pointer metadata item.
+ */
+psMetadataItem* psMetadataLookup(
+    psMetadata * md,                   ///< Metadata collection to lookup metadata item.
+    const char * key                   ///< Name of metadata key.
+);
+
+/** Find an item in the metadata collection based on key name and return its double precision value.
+ *
+ *  Items may be found in the metadata by providing a key. If the key is
+ *  non-unique, the value of the first item is returned. If the item is not found, zero is
+ *  returned.
+ *
+ * @return psF64 : Value of metadata item.
+ */
+psF64 psMetadataLookupF64(
+    psBool *status,                    ///< Status of lookup.
+    psMetadata *md,                    ///< Metadata collection to lookup metadata item.
+    const char *key                    ///< Name of metadata key.
+);
+
+/** Find an item in the metadata collection based on key name and return its single precision value.
+ *
+ *  Items may be found in the metadata by providing a key. If the key is
+ *  non-unique, the value of the first item is returned. If the item is not found, zero is
+ *  returned.
+ *
+ * @return psF32 : Value of metadata item.
+ */
+psF32 psMetadataLookupF32(
+    psBool *status,                    ///< Status of lookup.
+    psMetadata *md,                    ///< Metadata collection to lookup metadata item.
+    const char *key                    ///< Name of metadata key.
+);
+
+/** Find an item in the metadata collection based on key name and return its integer value.
+ *
+ *  Items may be found in the metadata by providing a key. If the key is
+ *  non-unique, the value of the first item is returned. If the item is not found, zero is
+ *  returned.
+ *
+ * @return psS32 : Value of metadata item.
+ */
+psS32 psMetadataLookupS32(
+    psBool *status,                    ///< Status of lookup.
+    psMetadata *md,                    ///< Metadata collection to lookup metadata item.
+    const char *key                    ///< Name of metadata key.
+);
+
+/** Find an item in the metadata collection based on key name and return its boolean value.
+ *
+ *  Items may be found in the metadata by providing a key. If the key is
+ *  non-unique, the value of the first item is returned. If the item is not found, zero is
+ *  returned.
+ *
+ * @return psBool : Value of metadata item.
+ */
+psBool psMetadataLookupBool(
+    psBool *status,                    ///< Status of lookup.
+    psMetadata *md,                    ///< Metadata collection to lookup metadata item.
+    const char *key                    ///< Name of metadata key.
+);
+
+/** Find an item in the metadata collection based on key name and return its integer value.
+ *
+ *  Items may be found in the metadata by providing a key. If the key is
+ *  non-unique, the value of the first item is returned. If the item is not found, zero is
+ *  returned.
+ *
+ * @return void* : Value of metadata item.
+ */
+psPtr psMetadataLookupPtr(
+    psBool *status,                    ///< Status of lookup.
+    psMetadata* md,                    ///< Metadata collection to lookup metadata item.
+    const char *key                    ///< Name of metadata key.
+);
+
+/** Find an item in the metadata collection based on list index.
+ *
+ *  Items may be found in the metadata by their entry position in the list
+ *  container.
+ *
+ *  @return psMetadataItem* : Pointer metadata item.
+ */
+psMetadataItem* psMetadataGet(
+    psMetadata*  md,                   ///< Metadata collection to insert metadat item.
+    psS32 location                     ///< Location to be retrieved.
+);
+
+/** Creates a psMetadataIterator to iterate over the specified psMetadata.
+ *
+ *  Supports the subsetting of the metadata via keyword using regular
+ *  expression.  If no regular expression is specified, iteration
+ *  over the entire psMetadata is performed.
+ *
+ *  @return psMetadataIterator*        a new psMetadataIterator, of NULL if error occurred
+ */
+psMetadataIterator* psMetadataIteratorAlloc(
+    psMetadata* md,                    ///< the psMetadata to iterate with
+    int location,                      ///< the initial starting point (after subsetting).
+    const char* regex
+    ///< A regular expression for subsetting the psMetadata.  If NULL, no
+    ///< subsetting is performed.
+);
+
+/** Set the iterator of the psMetadat to a given position.  If location is
+ *  invalid the iterator position is not changed.
+ *
+ *  @return psBool        TRUE if iterator successfully set, otherwise FALSE.
+*/
+psBool psMetadataIteratorSet(
+    psMetadataIterator* iterator,      ///< psMetadata iterator
+    int location                       ///< index number, PS_LIST_HEAD, or PS_LIST_TAIL
+);
+
+/** Position the specified iterator to the next matching item in psMetadata,
+ *  given the regular expression of the iterator
+ *
+ *  @return psPtr       the psMetadataItem at the original iterator position
+ *                      or NULL if the iterator went past the end of the list.
+ */
+psMetadataItem* psMetadataGetAndIncrement(
+    psMetadataIterator* iterator           ///< iterator to move
+);
+
+/** Position the specified iterator to the previous matching item in psMetadata,
+ *  given the regular expression of the iterator
+ *
+ *  @return psPtr       the psMetadataItem at the original iterator position
+ *                      or NULL if the iterator went past the beginning of the
+ *                      list.
+ */
+psMetadataItem* psMetadataGetAndDecrement(
+    psMetadataIterator* iterator           ///< iterator to move
+);
+
+/// @}
+
+#endif
Index: /tags/ipp-1-X/bug123/psLib/src/collections/psMetadataIO.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/collections/psMetadataIO.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/collections/psMetadataIO.c	(revision 22331)
@@ -0,0 +1,1168 @@
+/** @file  psMetadataIO.c
+*
+*  @brief Contains metadata input/output functions.
+*
+*  This file defines functions to read and write metadata to/from an external file.
+*
+*  @ingroup Metadata
+*
+*  @author Ross Harman, MHPCC
+*
+*  @version $Revision: 1.24 $ $Name: not supported by cvs2svn $
+*  @date $Date: 2005-04-06 01:12:58 $
+*
+*  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+*/
+
+#include <libxml/parser.h>
+#include <fitsio.h>
+#include <string.h>
+#include <ctype.h>
+#include <limits.h>
+
+#include "psAbort.h"
+#include "psType.h"
+#include "psMemory.h"
+#include "psError.h"
+#include "psString.h"
+#include "psList.h"
+#include "psHash.h"
+#include "psVector.h"
+#include "psMetadata.h"
+#include "psMetadataIO.h"
+#include "psConstants.h"
+#include "psAstronomyErrors.h"
+
+
+/******************************************************************************/
+/*  DEFINE STATEMENTS                                                         */
+/******************************************************************************/
+
+/** Check for FITS errors */
+#define FITS_ERROR(STRING,PS_ERROR)                                                                          \
+fits_get_errstatus(status, fitsErr);                                                                         \
+psError(PS_ERR_IO,true, STRING, PS_ERROR, fitsErr);                                                          \
+status = 0;                                                                                                  \
+fits_close_file(fd, &status);                                                                                \
+if(status){                                                                                                  \
+    fits_get_errstatus(status, fitsErr);                                                                     \
+    psError(PS_ERR_IO,true, "Couldn't close FITS file. FITS error: %s", fitsErr);                            \
+}                                                                                                            \
+status = 0;                                                                                                  \
+psFree(output);                                                                                              \
+return NULL;
+
+/** Free and null temporary variables used by config file parser */
+#define CLEAR_TEMPS()                                                                                        \
+if(strName) {                                                                                                \
+    psFree(strName);                                                                                         \
+    strName = NULL;                                                                                          \
+}                                                                                                            \
+if(strType) {                                                                                                \
+    psFree(strType);                                                                                         \
+    strType = NULL;                                                                                          \
+}                                                                                                            \
+if(strValue) {                                                                                               \
+    psFree(strValue);                                                                                        \
+    strValue = NULL;                                                                                         \
+}                                                                                                            \
+if(strComment) {                                                                                             \
+    psFree(strComment);                                                                                      \
+    strComment = NULL;                                                                                       \
+}
+
+/** Maximum size of a FITS line */
+#define FITS_LINE_SIZE 80
+
+/** Maximum size of a string */
+#define MAX_STRING_LENGTH 256
+
+
+/******************************************************************************/
+/*  TYPE DEFINITIONS                                                          */
+/******************************************************************************/
+
+// None
+
+/*****************************************************************************/
+/*  GLOBAL VARIABLES                                                         */
+/*****************************************************************************/
+
+// None
+
+/*****************************************************************************/
+/*  FILE STATIC VARIABLES                                                    */
+/*****************************************************************************/
+
+// None
+
+/*****************************************************************************/
+/*  FUNCTION IMPLEMENTATION - LOCAL                                          */
+/*****************************************************************************/
+
+static void saxEndElement(void *ctx, const xmlChar *tagName);
+static void initVectorXml(void *ctx, char *tagName);
+static void initMetadataItemXml(void *ctx, char *tagName);
+static void saxStartElement(void *ctx, const xmlChar *tagName, const xmlChar **atts);
+
+/** Determines if a line is blank (whitespace only) or a commentline. It returns true if so. The input string
+ *  must be null terminated. */
+psBool ignoreLine(char *inString)
+{
+    while(*inString!='\0' && *inString!='#') {
+        if(!isspace(*inString)) {
+            return false;
+        }
+        inString++;
+    }
+
+    return true;
+}
+
+
+/** Removes leading and trailing whitespace and # characters from a string. The cleaned string is a new null
+ *  terminated copy of the original input string. */
+char *cleanString(char *inString, psS32 sLen)
+{
+    char *ptrB = NULL;
+    char *ptrE = NULL;
+    char *cleaned = NULL;
+
+
+    ptrB = inString;
+
+    /* Skip over leading # or whitespace */
+    while (isspace(*ptrB) || *ptrB=='#') {
+        ptrB++;
+    }
+
+    /* Skip over trailing whitespace, null terminators, and # characters */
+    ptrE = inString + sLen;
+    while(isspace(*ptrE) || *ptrE=='\0' || *ptrE=='#') {
+        ptrE--;
+    }
+
+    // Length, sLen, does not include '\0'
+    sLen = ptrE - ptrB + 1;
+
+    // Adds '\0' to end of string and +1 to sLen
+    cleaned = psStringNCopy(ptrB, sLen);
+
+    return cleaned;
+}
+
+/** Count repeat occurances of a single character within a line. The input string must be null terminated. */
+psS32 repeatedChars(char *inString, char ch)
+{
+    psS32 count = 0;
+
+
+    while(*inString!='\0') {
+        if(*inString == ch) {
+            count++;
+        }
+        inString++;
+    }
+
+    return count;
+}
+
+/** Returns cleaned token based on delimiter, but not including delimiter. Also changes the pointer location
+ * the beginning of the string. Tokens are newly allocated null terminated strings. */
+char* getToken(char **inString, char *delimiter, psS32 *status)
+{
+    char *cleanToken = NULL;
+    psS32 sLen = 0;
+
+
+    // Skip over leading whitespace
+    while(isspace(**inString)) {
+        (*inString)++;
+    }
+
+    // Length of token, not including delimiter
+    sLen = strcspn(*inString, delimiter);
+    if(sLen) {
+
+        // Create new, cleaned, and null terminated token
+        cleanToken = cleanString(*inString, sLen);
+
+        // Move to end of token
+        (*inString) += sLen;
+    } else if(**inString!='\0' && sLen==0) {
+        *status = 1;
+    }
+
+    return cleanToken;
+}
+
+/** Returns single parsed value as a double precision number. The input string must be cleaned and null
+ * terminated. */
+double parseValue(char *inString, psS32 *status)
+{
+    char *end = NULL;
+    double value = 0.0;
+
+
+    value = strtod(inString, &end);
+    if(*end != '\0') {
+        *status = 1;
+    } else if(inString==end) {
+        *status = 1;
+    }
+
+    return value;
+}
+
+/** Returns true or false. 'T', 't', '1', 'F', 'f', and '0' are acceptable, parsable variations. */
+psBool parseBool(char *inString, psS32 *status)
+{
+    psBool value = false;
+
+
+    if(*inString=='T' || *inString=='t' || *inString=='1') {
+        value = true;
+    } else if(*inString=='F' || *inString=='f' || *inString=='0') {
+        value = false;
+    } else {
+        *status = 1;
+    }
+
+    return value;
+}
+
+/** Returns parsed vector filled with with data. The input string must be null terminated. */
+psVector* parseVector(char *inString, psElemType elemType, psS32 *status)
+{
+    char *end = NULL;
+    char *saveValue = NULL;
+    psS32 i = 0;
+    psS32 numValues = 0;
+    double value = 0.0;
+    psVector *vec = NULL;
+
+
+    // Cycle through string and count entries
+    saveValue = inString;
+    while(*inString!='\0') {
+        strtod(inString, &end);
+        if(inString==end) {
+            *status = 1;
+            return NULL;
+        }
+        while(*end==' ' || *end==',') { // Commas or spaces may be used as delimiters for vector values
+            end++;
+        }
+        inString=end;
+        numValues++;
+    }
+
+    // Cycle through string and convert string values to values
+    if(numValues) {
+        inString = saveValue;
+        end = NULL;
+        vec = psVectorAlloc(numValues, elemType);
+
+        while(*inString!='\0') {
+            value = strtod(inString, &end);
+            if(inString==end) {
+                *status = 1;
+                return vec;
+            }
+            switch(elemType) {
+            case PS_TYPE_U8:
+                vec->data.U8[i++] = (psU8)value;
+                break;
+            case PS_TYPE_S32:
+                vec->data.S32[i++] = (psS32)value;
+                break;
+            case PS_TYPE_F32:
+                vec->data.F32[i++] = (psF32)value;
+                break;
+            case PS_TYPE_F64:
+                vec->data.F64[i++] = (psF64)value;
+                break;
+            default:
+                *status = 1;
+                psError(PS_ERR_BAD_PARAMETER_VALUE,true,
+                        PS_ERRORTEXT_psMetadataIO_TYPE_INVALID,
+                        elemType);
+            }
+
+            while(*end==' ' || *end==',') {
+                end++;
+            }
+            inString=end;
+        }
+    }
+
+    return vec;
+}
+
+/*****************************************************************************/
+/* FUNCTION IMPLEMENTATION - PUBLIC                                          */
+/*****************************************************************************/
+
+bool psMetadataItemPrint(FILE * fd, const char *format, const psMetadataItem* metadataItem)
+{
+    psMetadataType type;
+    psBool success = true;
+
+    PS_PTR_CHECK_NULL(fd, success);
+    PS_PTR_CHECK_NULL(format, success);
+    PS_PTR_CHECK_NULL(metadataItem, success);
+
+    type = metadataItem->type;
+
+    // determining the format type
+    char* fType = strchr(format,'%');
+    if (fType == NULL) {
+        // well, the format contains no reference to the metadataItem's data:
+        // that is truly trival to do!
+        fprintf(fd,format);
+        return success;
+    }
+
+    // skip over any format modifiers
+    const char* formatEnd = format+strlen(format);
+    while ( (fType < formatEnd) &&
+        (strchr(" +-01234567890.$#, hlL",*(++fType)) != NULL) ) {}
+
+    #define METADATAITEM_NUMERIC_CAST(FORMAT_TYPE) { \
+        switch(type) { \
+        case PS_META_BOOL: \
+            fprintf(fd, format, (FORMAT_TYPE) metadataItem->data.B); \
+            break; \
+        case PS_META_S32: \
+            fprintf(fd,format,(FORMAT_TYPE)  metadataItem->data.S32); \
+            break; \
+        case PS_META_F32: \
+            fprintf(fd, format,(FORMAT_TYPE)  metadataItem->data.F32); \
+            break; \
+        case PS_META_F64: \
+            fprintf(fd, format,(FORMAT_TYPE) metadataItem->data.F64); \
+            break; \
+        default: \
+            psError(PS_ERR_BAD_PARAMETER_TYPE,true, \
+                    PS_ERRORTEXT_psMetadata_METATYPE_INVALID, (int)type); \
+            success = false; \
+        } \
+    }
+
+    switch(*fType) {
+    case 'd':
+    case 'i':
+    case 'c':
+        METADATAITEM_NUMERIC_CAST(int)
+        break;
+    case 'o':
+    case 'u':
+    case 'x':
+    case 'X':
+        METADATAITEM_NUMERIC_CAST(unsigned int)
+        break;
+    case 'e':
+    case 'E':
+    case 'f':
+    case 'F':
+    case 'g':
+    case 'G':
+    case 'a':
+    case 'A':
+        METADATAITEM_NUMERIC_CAST(double)
+        break;
+    case 's':
+        if (type == PS_META_STR) {
+            fprintf(fd,format,(char*)metadataItem->data.V);
+        } else {
+            psError(PS_ERR_BAD_PARAMETER_TYPE,true,
+                    PS_ERRORTEXT_psMetadata_METATYPE_INVALID, (int)type);
+            success = false;
+        }
+        break;
+    case 'p':
+        fprintf(fd,format,metadataItem->data.V);
+        break;
+    default:
+        psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                PS_ERRORTEXT_psMetadata_FORMAT_INVALID, *fType);
+        break;
+    }
+
+    return success;
+}
+
+
+psMetadata* psMetadataReadHeader(psMetadata* output, char *extName, psS32 extNum, char *fileName)
+{
+    psBool tempBool;
+    psBool success;
+    char keyType;
+    char keyName[FITS_LINE_SIZE];
+    char keyValue[FITS_LINE_SIZE];
+    char keyComment[FITS_LINE_SIZE];
+    char fitsErr[MAX_STRING_LENGTH];
+    psS32 i;
+    psS32 hduType = 0;
+    psS32 status = 0;
+    psS32 numKeys = 0;
+    psS32 keyNum = 0;
+    fitsfile *fd = NULL;
+
+    PS_PTR_CHECK_NULL(fileName,NULL);
+
+    fits_open_file(&fd, fileName, READONLY, &status);
+    if(fd == NULL || status != 0) {
+        FITS_ERROR("FITS error while opening file: %s %s", fileName);
+        return NULL;
+    }
+
+    if (extName == NULL && extNum < 1) {
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true,
+                PS_ERRORTEXT_psMetadataIO_EXTNUM_NOTPOSITIVE,
+                extNum);
+        return NULL;
+    }
+
+    // Allocate metadata if user didn't
+    if (output == NULL) {
+        output = psMetadataAlloc();
+    }
+
+    // Move to user designated HDU number or HDU name in FITS file. HDU numbers starts at one.
+    if (extName != NULL) {
+        if (fits_movnam_hdu(fd, ANY_HDU, extName, 0, &status) != 0) {
+            FITS_ERROR("FITS error while locating header %s: %s", extName);
+        }
+    } else {
+        if (fits_movabs_hdu(fd, extNum, &hduType, &status) != 0) {
+            FITS_ERROR("FITS error while locating header %d: %s", extNum);
+        }
+    }
+
+    // Get number of key names
+    if (fits_get_hdrpos(fd, &numKeys, &keyNum, &status) != 0) {
+        FITS_ERROR("FITS error while reading key %d: %s", keyNum);
+    }
+
+    // Get each key name. Keywords start at one.
+    for (i = 1; i <= numKeys; i++) {
+        if (fits_read_keyn(fd, i, keyName, keyValue, keyComment, &status) != 0) {
+            FITS_ERROR("FITS error while reading key %d: %s", keyNum);
+        }
+        if (fits_get_keytype(keyValue, &keyType, &status) != 0) {
+            fits_get_errstatus(status, fitsErr);
+            if (status != VALUE_UNDEFINED) {
+                FITS_ERROR("FITS error while determining key %d type: %s", keyNum);
+            } else {
+                // Some keywords are still valid if they don't have a type (like COMMENTS and HISTORY)
+                keyType = 'C';
+                status = 0;
+            }
+        }
+
+        switch (keyType) {
+        case 'I':
+            success = psMetadataAdd(output, PS_LIST_TAIL, keyName,
+                                    PS_META_S32 | PS_META_DUPLICATE_OK,
+                                    keyComment, atoi(keyValue));
+            break;
+        case 'F':
+            success = psMetadataAdd(output, PS_LIST_TAIL, keyName,
+                                    PS_META_F64 | PS_META_DUPLICATE_OK,
+                                    keyComment, atof(keyValue));
+            break;
+        case 'C':
+            success = psMetadataAdd(output, PS_LIST_TAIL, keyName,
+                                    PS_META_STR | PS_META_DUPLICATE_OK,
+                                    keyComment, keyValue);
+            break;
+        case 'L':
+            tempBool = (keyValue[0] == 'T') ? 1 : 0;
+            success = psMetadataAdd(output, PS_LIST_TAIL, keyName,
+                                    PS_META_BOOL | PS_META_DUPLICATE_OK,
+                                    keyComment, tempBool);
+            break;
+        case 'U':
+        case 'X':
+        default:
+            psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_FITS_METATYPE_INVALID, keyType);
+            return output;
+        }
+
+        if (!success) {
+            psError(PS_ERR_UNKNOWN, false, PS_ERRORTEXT_psMetadataIO_ADD_FAILED, keyName);
+            return output;
+        }
+    }
+
+    return output;
+}
+
+psMetadata* psMetadataParseConfig(psMetadata* md, psU32 *nFail, const char *fileName, psBool overwrite)
+{
+    psBool tempBool;
+    char *line = NULL;
+    char *strName = NULL;
+    char *strType = NULL;
+    char *strValue = NULL;
+    char *strComment = NULL;
+    char *linePtr = NULL;
+    psElemType vecType = 0;
+    psS32 status = 0;
+    psU32 lineCount = 0;
+    psF64 tempDbl = 0.0;
+    psS32 tempInt = 0.0;
+    psVector *tempVec = NULL;
+    FILE *fp = NULL;
+    psMetadataType mdType;
+    psMetadataFlags flags;
+    psBool addStatus;
+
+    // Check for nulls
+    PS_PTR_CHECK_NULL(fileName,NULL);
+    if((fp=fopen(fileName, "r")) == NULL) {
+        psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_FILE_OPEN_FAILED, fileName);
+        return NULL;
+    }
+
+    // Allocate metadata if necessary
+    if (md == NULL) {
+        md = psMetadataAlloc();
+    }
+
+    // Create reusable line for continuous read
+    line = (char*)psAlloc(MAX_STRING_LENGTH*sizeof(char));
+
+    // While loop to parse the file
+    while(fgets(line, MAX_STRING_LENGTH, fp) != NULL) {
+
+        // Initialize variables for new line
+        linePtr = line;
+        lineCount++;
+        CLEAR_TEMPS();
+
+        // If line is not a comment or blank, then extract data
+        if(!ignoreLine(linePtr)) {
+
+            // Check for more than one '*' or '@' in a line
+            if(repeatedChars(linePtr, '@') > 1) {
+                (*nFail)++;
+                psError(PS_ERR_IO, true,
+                        PS_ERRORTEXT_psMetadataIO_FILE_MULTIPLE_CHAR, '@', lineCount, fileName);
+                continue;
+            } else if(repeatedChars(linePtr, '*') > 1) {
+                (*nFail)++;
+                psError(PS_ERR_IO, true,
+                        PS_ERRORTEXT_psMetadataIO_FILE_MULTIPLE_CHAR, '*', lineCount, fileName);
+                continue;
+            } else if(repeatedChars(linePtr, '~') > 0) {
+                (*nFail)++;
+                psError(PS_ERR_IO, true,
+                        PS_ERRORTEXT_psMetadataIO_FILE_MULTIPLE_CHAR, '~', lineCount, fileName);
+                continue;
+            }
+
+            // Get metadata item name
+            strName = getToken(&linePtr, " ", &status);
+            if(strName==NULL || status) {
+                (*nFail)++;
+                status = 0;
+                psError(PS_ERR_IO, true,
+                        PS_ERRORTEXT_psMetadataIO_FILE_ELEMENT_NULL, "name", lineCount, fileName);
+                continue;
+            }
+
+            flags = (overwrite) ? PS_META_REPLACE : PS_META_DEFAULT;
+
+            // Get the metadata item type
+            strType = getToken(&linePtr, " ", &status);
+            if(strType==NULL) {
+                (*nFail)++;
+                status = 0;
+                psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_FILE_ELEMENT_NULL, "type",lineCount,
+                        fileName);
+                continue;
+            } else {
+                char* tempStrType = strType;
+                if(*strType == '*') {
+                    flags = PS_META_DUPLICATE_OK;
+                    tempStrType = strType+1;
+                }
+
+                if(!strncmp(tempStrType, "STR", 3)) {
+                    mdType = PS_META_STR;
+                } else if(!strncmp(tempStrType, "BOOL", 4)) {
+                    mdType = PS_META_BOOL;
+                } else if(!strncmp(tempStrType, "S32", 3)) {
+                    mdType = PS_META_S32;
+                } else if(!strncmp(tempStrType, "F32", 3)) {
+                    mdType = PS_META_F32;
+                } else if(!strncmp(tempStrType, "F64", 3)) {
+                    mdType = PS_META_F64;
+                } else {
+                    (*nFail)++;
+                    psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_FILE_TYPE_INVALID, strType, lineCount,
+                            fileName);
+                    continue;
+                }
+            }
+
+            if(*strName == '@') {
+                vecType = PS_META_PRIMITIVE_TYPE(mdType);
+                mdType = PS_META_VEC;
+            }
+
+            // Get the metadata item value if there is one.
+            strValue = getToken(&linePtr, "#", &status);
+            if(status) {
+                (*nFail)++;
+                status = 0;
+                psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_FILE_ELEMENT_NULL, "comment", lineCount,
+                        fileName);
+                continue;
+            }
+            if(strValue==NULL) {
+                (*nFail)++;
+                status = 0;
+                psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_FILE_ELEMENT_NULL, "value", lineCount,
+                        fileName);
+                continue;
+            }
+
+            // Not all lines will have comments, so NULL is ok.
+            strComment = getToken(&linePtr,"~", &status);
+            if(status) {
+                (*nFail)++;
+                status = 0;
+                psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_FILE_ELEMENT_NULL, "comment", lineCount,
+                        fileName);
+                continue;
+            }
+
+            // Create and add metadata item to metadata and parse values
+            switch (mdType) {
+            case PS_META_STR:
+                addStatus = psMetadataAdd(md, PS_LIST_TAIL, strName,
+                                          mdType | flags,
+                                          strComment, strValue);
+                break;
+            case PS_META_VEC:
+                tempVec = parseVector(strValue, vecType, &status);
+                if(!status) {
+                    addStatus = psMetadataAdd(md, PS_LIST_TAIL, strName+1,
+                                              mdType | flags,
+                                              strComment, tempVec);
+                } else {
+                    status = 0;
+                    (*nFail)++;
+                    psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_PARSE_FAILED, strValue, strName,
+                            strType, lineCount, fileName);
+                    continue;
+                }
+                psFree(tempVec);
+                break;
+            case PS_META_BOOL:
+                tempBool = parseBool(strValue, &status);
+                if(!status) {
+                    addStatus = psMetadataAdd(md, PS_LIST_TAIL, strName,
+                                              mdType | flags,
+                                              strComment, tempBool);
+                } else {
+                    status = 0;
+                    (*nFail)++;
+                    psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_PARSE_FAILED, strValue, strName,
+                            strType, lineCount, fileName);
+                    continue;
+                }
+                break;
+            case PS_META_S32:
+                tempInt = (psS32)parseValue(strValue, &status);
+                if(!status) {
+                    addStatus = psMetadataAdd(md, PS_LIST_TAIL, strName,
+                                              mdType | flags,
+                                              strComment, tempInt);
+                } else {
+                    status = 0;
+                    (*nFail)++;
+                    psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_PARSE_FAILED, strValue, strName,
+                            strType, lineCount, fileName);
+                    continue;
+                }
+                break;
+            case PS_META_F32:
+            case PS_META_F64:
+                tempDbl = parseValue(strValue, &status);
+                if(!status) {
+                    addStatus = psMetadataAdd(md, PS_LIST_TAIL, strName,
+                                              mdType | flags,
+                                              strComment, tempDbl);
+                } else {
+                    status = 0;
+                    (*nFail)++;
+                    psError(PS_ERR_IO, true,
+                            PS_ERRORTEXT_psMetadataIO_PARSE_FAILED, strValue, strName, strType, lineCount,
+                            fileName);
+                    continue;
+                }
+                break;
+            default:
+                (*nFail)++;
+                psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_FILE_TYPE_INVALID, mdType, lineCount,
+                        fileName);
+                continue;
+            } // switch
+            if (! addStatus) {
+                (*nFail)++;
+                psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_OVERWRITE_ITEM, strName, lineCount,
+                        fileName);
+            }
+
+        } // if ignoreLine
+    } // while loop
+
+    psFree(line);
+
+    return md;
+}
+
+static void saxStartElement(void *ctx, const xmlChar *tagName, const xmlChar **atts)
+{
+    psU64 i = 0;
+    char* psTagName = NULL;
+    char *psAttName = NULL;
+    char *psAttValue = NULL;
+    const xmlChar *attName = NULL;
+    const xmlChar *attValue = NULL;
+    psMetadata* md = NULL;
+    psHash* htAtts = NULL;
+    xmlParserCtxtPtr ctxt = NULL;
+    xmlParserInputPtr input = NULL;
+
+
+    // Get and check initial data pointers
+    ctxt = (xmlParserCtxtPtr)ctx;
+    PS_PTR_CHECK_NULL_GENERAL(ctxt, return);
+    md = (psMetadata*)ctxt->sax->_private;
+    PS_PTR_CHECK_NULL_GENERAL(md, return);
+    input = (xmlParserInputPtr)ctxt->input;
+    PS_PTR_CHECK_NULL_GENERAL(input, return);
+
+    // Copy XML strings to psStrings to avoid libxml2/psLib memory corruption problems
+    psTagName = psStringCopy(tagName);
+
+    // Metadata containter for housing element attributes used by other SAX events
+    htAtts = psHashAlloc(10);
+
+
+    // Get tag name
+    if(psTagName != NULL) {
+        psHashAdd(htAtts, "tagName", psTagName);
+    } else {
+        PS_PTR_CHECK_NULL_GENERAL(psTagName, return);
+        psFree(htAtts);
+        psFree(psTagName);
+        return;
+    }
+
+    // Get all attribute names and attribute values
+    if(atts != NULL) {
+        attName = atts[i++];
+        attValue = atts[i++];
+        while(attName != NULL) {
+            if(attValue != NULL) {
+
+                // Copy XML strings to psStrings to avoid libxml2/psLib memory corruption problems
+                psAttName = psStringCopy(attName);
+                psAttValue = psStringCopy(attValue);
+                psHashAdd(htAtts, psAttName, psAttValue);
+                psFree(psAttName);
+                psFree(psAttValue);
+            } else {
+                PS_PTR_CHECK_NULL_GENERAL(psAttValue, return);
+                psFree(htAtts);
+                psFree(psTagName);
+                return;
+            }
+            attName = atts[i++];
+            attValue = atts[i++];
+        }
+    }
+
+    // Add attributes to metadata
+
+    psMetadataAdd(md, PS_LIST_TAIL, "htAtts",
+                  PS_META_HASH | PS_META_DUPLICATE_OK,
+                  NULL, htAtts);
+
+    psFree(psTagName);
+    psFree(htAtts);
+
+    return;
+}
+
+static void initMetadataItemXml(void *ctx, char *tagName)
+{
+    psBool overwrite = false;
+    psBool tempBool = false;
+    psS32 status = 0;
+    psU32 lineNumber = 0;
+    psF64 tempDbl = 0.0;
+    psS32 tempInt = 0.0;
+    psMetadataType mdType = PS_META_UNKNOWN;
+    char *fileName = NULL;
+    char *strName = NULL;
+    char *strType = NULL;
+    char *strValue = NULL;
+    psMetadata* md = NULL;
+    psHash* htAtts = NULL;
+    psMetadataItem *metadataItem = NULL;
+    xmlParserCtxtPtr ctxt = NULL;
+    xmlParserInputPtr input = NULL;
+
+
+    // Get and check initial data pointers
+    ctxt = (xmlParserCtxtPtr)ctx;
+    PS_PTR_CHECK_NULL_GENERAL(ctxt, return);
+    md = (psMetadata*)ctxt->sax->_private;
+    PS_PTR_CHECK_NULL_GENERAL(md, return);
+    input = (xmlParserInputPtr)ctxt->input;
+    PS_PTR_CHECK_NULL_GENERAL(input, return);
+    metadataItem = psMetadataLookup(md, "htAtts");
+    PS_PTR_CHECK_NULL_GENERAL(metadataItem, return);
+    PS_PTR_CHECK_NULL_GENERAL(metadataItem->data.list, return);
+    metadataItem = (psMetadataItem*)psListGet(metadataItem->data.list,PS_LIST_TAIL);
+    htAtts = (psHash*)metadataItem->data.list;
+    PS_PTR_CHECK_NULL_GENERAL(htAtts, return);
+    fileName = (char*)input->filename;
+    PS_PTR_CHECK_NULL_GENERAL(fileName, return);
+    lineNumber = input->line;
+
+    // Get attribute name
+    strName = psHashLookup(htAtts, "name");
+    if(strName == NULL) {
+        psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_NO_NAME, lineNumber, fileName);
+        return;
+    }
+
+    // Get attribute type, if there is one
+    strType = psHashLookup(htAtts, "psType");
+    if(strType!= NULL) {
+        if(xmlStrEqual(BAD_CAST strType, BAD_CAST "psString")) {
+            mdType = PS_META_STR;
+        } else if(xmlStrEqual(BAD_CAST strType, BAD_CAST "psBool")) {
+            mdType = PS_META_BOOL;
+        } else if(xmlStrEqual(BAD_CAST strType, BAD_CAST "psS32")) {
+            mdType = PS_META_S32;
+        } else if(xmlStrEqual(BAD_CAST strType, BAD_CAST "psF32")) {
+            mdType = PS_META_F32;
+        } else if(xmlStrEqual(BAD_CAST strType, BAD_CAST "psF64")) {
+            mdType = PS_META_F64;
+        } else {
+            psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_TYPE_INVALID_LINE_FILE, strType, lineNumber,
+                    fileName);
+            return;
+        }
+    }
+
+    // Get attribute value, if there is one
+    strValue = psHashLookup(htAtts, "value");
+
+    /* If metadata item is found, and is not a folder node, and overwrite is allowed, then remove
+    existing and allow switch/case below to add new item. If overwrite is false, then report error. If
+    found item is folder node, then psMetadataAdd will automatically add a new child. */
+    metadataItem = psMetadataLookup(md, "overwrite");
+    if(metadataItem != NULL) {
+        overwrite = parseBool((char*)strValue, &status);
+        if(status) {
+            status = 0;
+            psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_PARSE_FAILED, strValue, strName, strType,
+                    lineNumber, fileName);
+        }
+        metadataItem = psMetadataLookup(md, strName);
+        if(metadataItem != NULL) {
+            if(metadataItem->type != PS_META_LIST) {
+                if(overwrite) {
+                    psMetadataRemove(md, INT_MIN, strName);
+                } else {
+                    psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_OVERWRITE_ITEM, strName, lineNumber,
+                            fileName);
+                    return;
+                }
+            }
+        }
+    }
+
+    // Create metadata item and add to metadata
+    switch(mdType) {
+    case PS_META_LIST:
+        psMetadataAdd(md, PS_LIST_TAIL, strName,
+                      mdType | PS_META_DUPLICATE_OK,
+                      NULL, NULL);
+        break;
+    case PS_META_STR:
+        psMetadataAdd(md, PS_LIST_TAIL, strName,
+                      mdType | PS_META_DUPLICATE_OK,
+                      NULL, strValue);
+        break;
+    case PS_META_BOOL:
+        tempBool = parseBool((char*)strValue, &status);
+        if(!status) {
+            psMetadataAdd(md, PS_LIST_TAIL, strName,
+                          mdType | PS_META_DUPLICATE_OK,
+                          NULL, tempBool);
+        } else {
+            status = 0;
+            psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_PARSE_FAILED, strValue, strName, strType,
+                    lineNumber, fileName);
+        }
+        break;
+    case PS_META_S32:
+        tempInt = (psS32)parseValue((char*)strValue, &status);
+        if(!status) {
+            psMetadataAdd(md, PS_LIST_TAIL, strName,
+                          mdType | PS_META_DUPLICATE_OK,
+                          NULL, tempInt);
+        } else {
+            status = 0;
+            psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_PARSE_FAILED, strValue, strName, strType,
+                    lineNumber, fileName);
+        }
+        break;
+    case PS_META_F32:
+    case PS_META_F64:
+        tempDbl = parseValue((char*)strValue, &status);
+        if(!status) {
+            psMetadataAdd(md, PS_LIST_TAIL, strName,
+                          mdType | PS_META_DUPLICATE_OK,
+                          NULL, tempDbl);
+        } else {
+            status = 0;
+            psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_PARSE_FAILED, strValue, strName, strType,
+                    lineNumber, fileName);
+        }
+        break;
+    default:
+        psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_FILE_TYPE_INVALID, strType, lineNumber, fileName);
+    } // End switch
+
+    return;
+}
+
+
+static void initVectorXml(void *ctx, char *tagName)
+{
+    bool overwrite = false;
+    psS32 status = 0;
+    psU32 lineNumber = 0;
+    psElemType pType = 0;
+    char *strName = NULL;
+    char *strType = NULL;
+    char *strValue = NULL;
+    char *fileName = NULL;
+    psMetadataItem *table = NULL;
+    psMetadataItem *tables = NULL;
+    psMetadataItem *metadataItem = NULL;
+    psVector *vec = NULL;
+    psMetadata* md = NULL;
+    psHash* htAtts = NULL;
+    xmlParserCtxtPtr ctxt = NULL;
+    xmlParserInputPtr input = NULL;
+
+
+    // Get and check initial data pointers
+    ctxt = (xmlParserCtxtPtr)ctx;
+    PS_PTR_CHECK_NULL_GENERAL(ctxt, return);
+    md = (psMetadata*)ctxt->sax->_private;
+    PS_PTR_CHECK_NULL_GENERAL(md, return);
+    input = (xmlParserInputPtr)ctxt->input;
+    PS_PTR_CHECK_NULL_GENERAL(input, return);
+    tables = psMetadataLookup(md, "htAtts");
+    PS_PTR_CHECK_NULL_GENERAL(tables, return);
+    PS_PTR_CHECK_NULL_GENERAL(tables->data.list, return);
+    table = (psMetadataItem*)psListGet(tables->data.list,PS_LIST_TAIL);
+    htAtts = (psHash*)table->data.list;
+    PS_PTR_CHECK_NULL_GENERAL(htAtts, return);
+    fileName = (char*)input->filename;
+    PS_PTR_CHECK_NULL_GENERAL(fileName, return);
+    lineNumber = input->line;
+
+    // Get attribute name
+    strName = psHashLookup(htAtts, "name");
+    if(strName == NULL) {
+        psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_NO_NAME, lineNumber, fileName);
+        return;
+    }
+
+    // Get attribute type, if there is one
+    strType = psHashLookup(htAtts, "psType");
+    if(strType!= NULL) {
+        if(xmlStrEqual(BAD_CAST strType, BAD_CAST "psBool")) {
+            pType = PS_TYPE_U8;
+        } else if(xmlStrEqual(BAD_CAST strType, BAD_CAST "psS32")) {
+            pType = PS_TYPE_S32;
+        } else if(xmlStrEqual(BAD_CAST strType, BAD_CAST "psF32")) {
+            pType = PS_TYPE_F32;
+        } else if(xmlStrEqual(BAD_CAST strType, BAD_CAST "psF64")) {
+            pType = PS_TYPE_F64;
+        } else {
+            psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_TYPE_INVALID_LINE_FILE, strName, lineNumber,
+                    fileName);
+            return;
+        }
+    }
+
+    strValue = psHashLookup(htAtts, "value");
+    PS_PTR_CHECK_NULL_GENERAL(strValue, return);
+
+
+    /* If metadata item is found, and is not a folder node, and overwrite is allowed, then remove
+    existing and allow switch/case below to add new item. If overwrite is false, then report error. If
+    found item is folder node, then psMetadataAdd will automatically add a new child. */
+    metadataItem = psMetadataLookup(md, "overwrite");
+    if(metadataItem != NULL) {
+        overwrite = parseBool((char*)strValue, &status);
+        if(status) {
+            status = 0;
+            psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_PARSE_FAILED, strValue, strName, strType,
+                    input->line, input->filename);
+        }
+        metadataItem = psMetadataLookup(md, strName);
+        if(metadataItem != NULL) {
+            if(metadataItem->type != PS_META_LIST) {
+                if(overwrite) {
+                    psMetadataRemove(md, INT_MIN, strName);
+                } else {
+                    psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_OVERWRITE_ITEM, strName, lineNumber,
+                            fileName);
+                    return;
+                }
+            }
+        }
+    }
+
+    // Get value
+    vec = parseVector((char*)strValue, pType, &status);
+    if(!status) {
+        psMetadataAdd(md, PS_LIST_TAIL, strName+1,
+                      PS_META_VEC | PS_META_DUPLICATE_OK,
+                      NULL, vec);
+    } else {
+        psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_PARSE_FAILED, strValue, strName, strType,
+                lineNumber, fileName);
+    }
+    psFree(vec);
+}
+
+static void saxEndElement(void *ctx, const xmlChar *tagName)
+{
+    char *psStartTagName = NULL;
+    char *psEndTagName = NULL;
+    psMetadata* md = NULL;
+    psHash* htAtts = NULL;
+    psMetadataItem *table = NULL;
+    psMetadataItem *tables = NULL;
+    xmlParserCtxtPtr ctxt = NULL;
+    xmlParserInputPtr input = NULL;
+
+
+    // Get and check initial data pointers
+    ctxt = (xmlParserCtxtPtr)ctx;
+    PS_PTR_CHECK_NULL_GENERAL(ctxt, return);
+    md = (psMetadata*)ctxt->sax->_private;
+    PS_PTR_CHECK_NULL_GENERAL(md, return);
+    input = (xmlParserInputPtr)ctxt->input;
+    PS_PTR_CHECK_NULL_GENERAL(input, return);
+    tables = psMetadataLookup(md, "htAtts");
+    PS_PTR_CHECK_NULL_GENERAL(tables, return);
+    PS_PTR_CHECK_NULL_GENERAL(tables->data.list, return);
+    table = (psMetadataItem*)psListGet(tables->data.list,PS_LIST_TAIL);
+    htAtts = (psHash*)table->data.list;
+    PS_PTR_CHECK_NULL_GENERAL(htAtts, return);
+
+    // Copy XML strings to psStrings to avoid libxml2/psLib memory corruption problems
+    psEndTagName = psStringCopy(tagName);
+
+    // Compare start and end tag names
+    psStartTagName = psHashLookup(htAtts, "tagName");
+    PS_PTR_CHECK_NULL_GENERAL(psStartTagName, return);
+    if(strcmp(psEndTagName, psStartTagName)) {
+        psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_TAG_MISMATCH, psStartTagName, psEndTagName);
+    }
+
+    // Initialize psLib structs
+    if(!strcmp(psEndTagName, "psMetadataItem")) {
+        initMetadataItemXml(ctx, psEndTagName);
+    } else if(!strcmp(psEndTagName, "psVector")) {
+        initVectorXml(ctx, psEndTagName);
+    } else if(strcmp(psEndTagName, "psRoot")) {
+        psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_TAG_UNKNOWN, psEndTagName);
+    }
+
+    // Free temporary metadata item and its hash table
+    psListRemove(tables->data.list, PS_LIST_TAIL);
+
+    psFree(psEndTagName);
+
+    return;
+}
+
+psMetadata*  psMetadataParseConfigXml(psMetadata* md, psU32 *nFail, const char *fileName, psBool overwrite)
+{
+    xmlSAXHandler saxHandler;
+
+
+    // Error checks
+    PS_PTR_CHECK_NULL(fileName, NULL);
+
+    // Allocate metadata if necessary
+    if (md == NULL) {
+        md = psMetadataAlloc();
+    }
+
+    // Sax handler initializations
+    saxHandler.internalSubset           = NULL;
+    saxHandler.isStandalone             = NULL;
+    saxHandler.hasInternalSubset        = NULL;
+    saxHandler.hasExternalSubset        = NULL;
+    saxHandler.resolveEntity            = NULL;
+    saxHandler.getEntity                = NULL;
+    saxHandler.entityDecl               = NULL;
+    saxHandler.notationDecl             = NULL;
+    saxHandler.attributeDecl            = NULL;
+    saxHandler.elementDecl              = NULL;
+    saxHandler.unparsedEntityDecl       = NULL;
+    saxHandler.setDocumentLocator       = NULL;
+    saxHandler.startDocument            = NULL;
+    saxHandler.endDocument              = NULL;
+    saxHandler.startElement             = saxStartElement;
+    saxHandler.endElement               = saxEndElement;
+    saxHandler.reference                = NULL;
+    saxHandler.characters               = NULL;
+    saxHandler.ignorableWhitespace      = NULL;
+    saxHandler.processingInstruction    = NULL;
+    saxHandler.comment                  = NULL;
+    saxHandler.warning                  = xmlParserError;
+    saxHandler.error                    = xmlParserError;
+    saxHandler.fatalError               = xmlParserError;
+    saxHandler.getParameterEntity       = NULL;
+    saxHandler.cdataBlock               = NULL;
+    saxHandler.externalSubset           = NULL;
+    saxHandler.initialized              = 1;
+    saxHandler._private                 = md;
+    saxHandler.startElementNs           = NULL;
+    saxHandler.endElementNs             = NULL;
+    saxHandler.serror                   = NULL;
+
+    // Parse XML file
+    if (xmlSAXUserParseFile(&saxHandler, NULL, fileName)) {
+        psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_FILE_OPEN_FAILED, fileName);
+        return NULL;
+    }
+
+    // Parser and memory cleanups for libxml2
+    xmlCleanupParser();
+    xmlMemoryDump();
+
+    return md;
+}
Index: /tags/ipp-1-X/bug123/psLib/src/collections/psMetadataIO.h
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/collections/psMetadataIO.h	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/collections/psMetadataIO.h	(revision 22331)
@@ -0,0 +1,85 @@
+/** @file  psMetadataIO.h
+ *
+ *  @brief Contains metadata input/output functions.
+ *
+ *  This file defines functions to read and write metadata to/from an external file.
+ *
+ *  @ingroup Metadata
+ *
+ *  @author Ross Harman, MHPCC
+ *  @author Robert DeSonia, MHPCC
+ *
+ *  @version $Revision: 1.9 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-03-07 20:58:50 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+#ifndef PS_METADATAIO_H
+#define PS_METADATAIO_H
+
+/// @addtogroup Metadata
+/// @{
+
+
+/** Print metadata item to file.
+ *
+ *  Metadata items may be printed to an open file descriptor based on a
+ *  provided format. The format is a sprintf format statement with exactly
+ *  one % formatting command. If the metadata item type is a numeric type,
+ *  this formatting command must also be numeric, and the type conversion
+ *  performed to the value to match the format type. If the metadata type is
+ *  a string, the fromatting command must also be for a string. If the
+ *  metadata type is any other data type, printing is not allowed.
+ *
+ * @return psMetadataItem* : Pointer metadata item.
+ */
+bool psMetadataItemPrint(
+    FILE * fd,                         ///< Pointer to file to write metadata item.
+    const char *format,                ///< Format to print metadata item.
+    const psMetadataItem* metadataItem ///< Metadata item to print.
+);
+
+/** Read metadata header.
+ *
+ *  Read a metadata header from file. If the file is not found, an error is
+ *  reported.
+ *
+ *  @return psMetadata* : Pointer to resulting metadata.
+ */
+psMetadata* psMetadataReadHeader(
+    psMetadata* output,                ///< Resulting metadata from read.
+    char *extName,                     ///< File name extension string.
+    psS32 extNum,                      ///< File name extension number. Starts at 1.
+    char *fileName                     ///< Name of file to read.
+);
+
+/** Read metadata configuration file.
+ *
+ *  Loads pre-defined settings by parsing a configuration file into a psMetadata structure.
+ *
+ *  @return psMetadata* : Resulting metadata from read.
+ */
+psMetadata* psMetadataParseConfig(
+    psMetadata* md,                    ///< Resulting metadata from read.
+    psU32 *nFail,                      ///< Number of failed lines.
+    const char *fileName,              ///< Name of file to read.
+    psBool overwrite                   ///< Allow overwrite of duplicate specifications.
+);
+
+/** Read XML metadata configuration file.
+ *
+ *  Loads pre-defined XML settings by parsing a configuration file into a psMetadata structure.
+ *
+ *  @return psMetadata* : Resulting metadata from read.
+ */
+
+psMetadata*  psMetadataParseConfigXml(
+    psMetadata* md,                    ///< Resulting metadata from read.
+    psU32 *nFail,                      ///< Number of failed lines.
+    const char *fileName,              ///< Name of file to read.
+    psBool overwrite                   ///< Allow overwrite of duplicate specifications.
+);
+
+/// @}
+
+#endif
Index: /tags/ipp-1-X/bug123/psLib/src/collections/psScalar.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/collections/psScalar.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/collections/psScalar.c	(revision 22331)
@@ -0,0 +1,139 @@
+/** @file  psScalar.c
+ *
+ *  @brief Contains basic scalar definitions and operations
+ *
+ *  This file defines the basic type for a scalar struct and functions useful
+ *  in manupulating scalars.
+ * *
+ *  @author Ross Harman, MHPCC
+ *
+ *  @version $Revision: 1.14 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-02-17 19:26:23 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+
+#include "psMemory.h"
+#include "psError.h"
+#include "psScalar.h"
+#include "psLogMsg.h"
+#include "psAbort.h"
+
+#include "psCollectionsErrors.h"
+
+psScalar* psScalarAlloc(psC64 value, psElemType dataType)
+{
+    psScalar* scalar = NULL;
+
+    // Create scalar
+    scalar = (psScalar* ) psAlloc(sizeof(psScalar));
+
+    scalar->type.dimen = PS_DIMEN_SCALAR;
+    scalar->type.type = dataType;
+
+    switch (dataType) {
+    case PS_TYPE_S8:
+        scalar->data.S8 = (psS8) value;
+        break;
+    case PS_TYPE_U8:
+        scalar->data.U8 = (psU8) value;
+        break;
+    case PS_TYPE_S16:
+        scalar->data.S16 = (psS16) value;
+        break;
+    case PS_TYPE_U16:
+        scalar->data.U16 = (psU16) value;
+        break;
+    case PS_TYPE_S32:
+        scalar->data.S32 = (psS32) value;
+        break;
+    case PS_TYPE_U32:
+        scalar->data.U32 = (psU32) value;
+        break;
+    case PS_TYPE_S64:
+        scalar->data.S64 = (psS64) value;
+        break;
+    case PS_TYPE_U64:
+        scalar->data.U64 = (psU64) value;
+        break;
+    case PS_TYPE_F32:
+        scalar->data.F32 = (psF32) value;
+        break;
+    case PS_TYPE_F64:
+        scalar->data.F64 = (psF64) value;
+        break;
+    case PS_TYPE_C32:
+        scalar->data.C32 = (psC32) value;
+        break;
+    case PS_TYPE_C64:
+        scalar->data.C64 = (psC64) value;
+        break;
+    default:
+        psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                PS_ERRORTEXT_psScalar_UNSUPPORTED_TYPE,
+                dataType);
+        psFree(scalar);
+        return NULL;
+    }
+
+    return scalar;
+}
+
+psScalar* psScalarCopy(psScalar *scalar)
+{
+    psElemType dataType;
+    psScalar *newScalar = NULL;
+
+    if (scalar == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psScalar_COPY_NULL);
+        return NULL;
+    }
+
+    dataType = scalar->type.type;
+    switch (dataType) {
+    case PS_TYPE_S8:
+        newScalar =  psScalarAlloc(scalar->data.S8, dataType);
+        break;
+    case PS_TYPE_U8:
+        newScalar =  psScalarAlloc(scalar->data.U8, dataType);
+        break;
+    case PS_TYPE_S16:
+        newScalar =  psScalarAlloc(scalar->data.S16, dataType);
+        break;
+    case PS_TYPE_U16:
+        newScalar =  psScalarAlloc(scalar->data.U16, dataType);
+        break;
+    case PS_TYPE_S32:
+        newScalar =  psScalarAlloc(scalar->data.S32, dataType);
+        break;
+    case PS_TYPE_U32:
+        newScalar =  psScalarAlloc(scalar->data.U32, dataType);
+        break;
+    case PS_TYPE_S64:
+        newScalar =  psScalarAlloc(scalar->data.S64, dataType);
+        break;
+    case PS_TYPE_U64:
+        newScalar =  psScalarAlloc(scalar->data.U64, dataType);
+        break;
+    case PS_TYPE_F32:
+        newScalar =  psScalarAlloc(scalar->data.F32, dataType);
+        break;
+    case PS_TYPE_F64:
+        newScalar =  psScalarAlloc(scalar->data.F64, dataType);
+        break;
+    case PS_TYPE_C32:
+        newScalar =  psScalarAlloc(scalar->data.C32, dataType);
+        break;
+    case PS_TYPE_C64:
+        newScalar =  psScalarAlloc(scalar->data.C64, dataType);
+        break;
+    default:
+        psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                PS_ERRORTEXT_psScalar_UNSUPPORTED_TYPE,
+                dataType);
+        return NULL;
+    }
+
+    return newScalar;
+}
Index: /tags/ipp-1-X/bug123/psLib/src/collections/psScalar.h
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/collections/psScalar.h	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/collections/psScalar.h	(revision 22331)
@@ -0,0 +1,84 @@
+
+/** @file  psScalar.h
+ *
+ *  @brief Contains basic scalar definitions and operations
+ *
+ *  This file defines the basic type for a scalar struct and functions useful
+ *  in manupulating scalars.
+ *
+ *  @ingroup Scalar
+ *
+ *  @author Ross Harman, MHPCC
+ *
+ *  @version $Revision: 1.11 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-02-17 19:26:23 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+
+#ifndef PS_SCALAR_H
+#define PS_SCALAR_H
+
+#include "psType.h"
+
+/// @addtogroup Scalar
+/// @{
+
+/** Basic scalar data structure.
+ *
+ * Struct for maintaining a scalar of frequently used primitive types.
+ *
+ */
+typedef struct
+{
+    psType type;                ///< Type of data.
+
+    union {
+        psU8 U8;                ///< Unsigned 8-bit integer data.
+        psU16 U16;              ///< Unsigned 16-bit integer data.
+        psU32 U32;              ///< Unsigned 32-bit integer data.
+        psU64 U64;              ///< Unsigned 64-bit integer data.
+        psS8 S8;                ///< Signed 8-bit integer data.
+        psS16 S16;              ///< Signed 16-bit integer data.
+        psS32 S32;              ///< Signed 32-bit integer data.
+        psS64 S64;              ///< Signed 64-bit integer data.
+        psF32 F32;              ///< Single-precision float data.
+        psF64 F64;              ///< Double-precision float data.
+        psC32 C32;              ///< Single-precision complex data.
+        psC64 C64;              ///< Double-precision complex data.
+    } data;                     ///< Union for data types.
+}
+psScalar;
+
+/*****************************************************************************/
+
+/* FUNCTION PROTOTYPES                                                       */
+
+/*****************************************************************************/
+
+/** Allocate a scalar.
+ *
+ * Uses psLib memory allocation functions to create scalar data as defined by the psType type.
+ * Accepts a complex 64 bit float for input value, as max size, but resizes according to
+ * correct type.
+ *
+ * @return psScalar*   Pointer to a new psScalar.
+ */
+psScalar* psScalarAlloc(
+    psC64 value,                       ///< Data to be put into psScalar.
+    psElemType dataType                ///< Type of data to be held by psScalar.
+);
+
+/** Copy a scalar.
+ *
+ * Uses psLib memory allocation functions to copy a scalar.
+ *
+ * @return psScalar*    A copy of the input scalar
+ */
+psScalar* psScalarCopy(
+    psScalar *scalar                   ///< Scalar to copy.
+);
+
+/// @}
+
+#endif
Index: /tags/ipp-1-X/bug123/psLib/src/collections/psVector.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/collections/psVector.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/collections/psVector.c	(revision 22331)
@@ -0,0 +1,527 @@
+/** @file  psVector.c
+*
+*  @brief Contains support for basic vector types
+*
+*  This file defines the basic type for a vector struct and functions useful
+*  in manupulating vectors.
+*
+*  @author Ross Harman, MHPCC
+*  @author Robert DeSonia, MHPCC
+*
+*  @version $Revision: 1.40 $ $Name: not supported by cvs2svn $
+*  @date $Date: 2005-04-21 21:21:01 $
+*
+*  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+*/
+
+#include <string.h>                        // for memcpy
+#include <stdlib.h>
+#include <stdio.h>
+#include <math.h>
+
+#include "psMemory.h"
+#include "psError.h"
+#include "psVector.h"
+#include "psLogMsg.h"
+#include "psCompare.h"
+
+#include "psCollectionsErrors.h"
+
+typedef struct
+{
+    p_psVectorData data; // need this first for psVectorSortIndex to work.
+    psU32 index;
+}
+indexedVector;
+
+static void vectorFree(psVector* psVec);
+
+static void vectorFree(psVector* psVec)
+{
+    if (psVec == NULL) {
+        return;
+    }
+
+    psFree(psVec->data.U8);
+}
+
+// FUNCTION IMPLEMENTATION - PUBLIC
+
+psVector* psVectorAlloc(psU32 nalloc, psElemType elemType)
+{
+    psVector* psVec = NULL;
+    psS32 elementSize = 0;
+
+    elementSize = PSELEMTYPE_SIZEOF(elemType);
+
+    // Create vector struct
+    psVec = (psVector* ) psAlloc(sizeof(psVector));
+    psMemSetDeallocator(psVec, (psFreeFcn) vectorFree);
+
+    psVec->type.dimen = PS_DIMEN_VECTOR;
+    psVec->type.type = elemType;
+    *(int*)&psVec->nalloc = nalloc;
+    psVec->n = nalloc;
+
+    // Create vector data array
+    psVec->data.U8 = psAlloc(nalloc * elementSize);
+
+    return psVec;
+}
+
+psVector* psVectorRealloc(psVector* in, psU32 nalloc)
+{
+    psS32 elementSize = 0;
+    psElemType elemType;
+
+    if (in == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psVector_REALLOC_NULL);
+        return NULL;
+    } else if (in->nalloc != nalloc) {     // No need to realloc to same size
+        elemType = in->type.type;
+        elementSize = PSELEMTYPE_SIZEOF(elemType);
+        if (nalloc < in->n) {
+            in->n = nalloc;
+        }
+        // Realloc after decrementation to avoid accessing freed array elements
+        in->data.U8 = psRealloc(in->data.U8, nalloc * elementSize);
+        *(int*)&in->nalloc = nalloc;
+    }
+
+    return in;
+}
+
+psVector* psVectorRecycle(psVector* in, psU32 n, psElemType type)
+{
+    psS32 byteSize;
+
+    if (in == NULL) {
+        return psVectorAlloc(n, type);
+    }
+
+    if (in->type.dimen !=  PS_DIMEN_VECTOR &&
+            in->type.dimen !=  PS_DIMEN_TRANSV) {
+        psFree(in);
+        psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                PS_ERRORTEXT_psVector_NOT_A_VECTOR);
+        return NULL;
+    }
+
+    byteSize = n * PSELEMTYPE_SIZEOF(type);
+
+    // need to increase data buffer?
+    if (byteSize > in->nalloc*PSELEMTYPE_SIZEOF(in->type.type)) {
+        in->data.U8 = psRealloc(in->data.U8, byteSize);
+        *(int*)&in->nalloc = n;
+    }
+
+    in->type.dimen = PS_DIMEN_VECTOR;
+    in->type.type = type;
+    in->n = n;
+    return in;
+}
+
+psVector* psVectorCopy(psVector* out, const psVector* in, psElemType type)
+{
+    if (in == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psVector_SORT_NULL);
+        psFree(out);
+        return NULL;
+    }
+
+    psS32 nElements = in->n;
+
+    out = psVectorRecycle(out, nElements, type);
+
+    #define PSVECTOR_COPY(INTYPE,OUTTYPE) { \
+        ps##INTYPE *inVec = in->data.INTYPE; \
+        ps##OUTTYPE *outVec = out->data.OUTTYPE; \
+        for (psS32 col=0;col<nElements;col++) { \
+            *(outVec++) = *(inVec++); \
+        } \
+    }
+
+    #define PSVECTOR_COPY_CASE(OUTTYPE) \
+case PS_TYPE_##OUTTYPE: { \
+        switch (in->type.type) { \
+        case PS_TYPE_S8: \
+            PSVECTOR_COPY(S8,OUTTYPE); \
+            break; \
+        case PS_TYPE_S16: \
+            PSVECTOR_COPY(S16,OUTTYPE); \
+            break; \
+        case PS_TYPE_S32: \
+            PSVECTOR_COPY(S32,OUTTYPE); \
+            break; \
+        case PS_TYPE_S64: \
+            PSVECTOR_COPY(S64,OUTTYPE); \
+            break; \
+        case PS_TYPE_U8: \
+            PSVECTOR_COPY(U8,OUTTYPE); \
+            break; \
+        case PS_TYPE_U16: \
+            PSVECTOR_COPY(U16,OUTTYPE); \
+            break; \
+        case PS_TYPE_U32: \
+            PSVECTOR_COPY(U32,OUTTYPE); \
+            break; \
+        case PS_TYPE_U64: \
+            PSVECTOR_COPY(U64,OUTTYPE); \
+            break; \
+        case PS_TYPE_F32: \
+            PSVECTOR_COPY(F32,OUTTYPE); \
+            break; \
+        case PS_TYPE_F64: \
+            PSVECTOR_COPY(F64,OUTTYPE); \
+            break; \
+        case PS_TYPE_C32: \
+            PSVECTOR_COPY(C32,OUTTYPE); \
+            break; \
+        case PS_TYPE_C64: \
+            PSVECTOR_COPY(C64,OUTTYPE); \
+            break; \
+        default: { \
+                char* typeStr; \
+                PS_TYPE_NAME(typeStr,type); \
+                psError(PS_ERR_BAD_PARAMETER_TYPE, true, \
+                        PS_ERRORTEXT_psVector_UNSUPPORTED_TYPE, \
+                        typeStr); \
+                psFree(out); \
+            } \
+        } \
+        break; \
+    }
+
+    switch (type) {
+        PSVECTOR_COPY_CASE(S8);
+        PSVECTOR_COPY_CASE(S16);
+        PSVECTOR_COPY_CASE(S32);
+        PSVECTOR_COPY_CASE(S64);
+        PSVECTOR_COPY_CASE(U8);
+        PSVECTOR_COPY_CASE(U16);
+        PSVECTOR_COPY_CASE(U32);
+        PSVECTOR_COPY_CASE(U64);
+        PSVECTOR_COPY_CASE(F32);
+        PSVECTOR_COPY_CASE(F64);
+        PSVECTOR_COPY_CASE(C32);
+        PSVECTOR_COPY_CASE(C64);
+    default: {
+            char* typeStr;
+            PS_TYPE_NAME(typeStr,type);
+            psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                    PS_ERRORTEXT_psVector_UNSUPPORTED_TYPE,
+                    typeStr);
+            psFree(out);
+
+            break;
+        }
+    }
+    return out;
+
+
+}
+
+psVector* psVectorSort(psVector* outVector, const psVector* inVector)
+{
+    psS32 N = 0;
+    psS32 elSize = 0;
+    psPtr inVec = NULL;
+    psPtr outVec = NULL;
+    psElemType inType = 0;
+
+    if (inVector == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psVector_SORT_NULL);
+        psFree(outVector);
+        return NULL;
+    }
+
+    inType = inVector->type.type;
+    N = inVector->n;
+    inVec = (psPtr)inVector->data.U8;
+    elSize = PSELEMTYPE_SIZEOF(inType);
+
+    if (outVector == NULL) {
+        outVector = psVectorAlloc(N, inType);
+    }
+
+    // check to see if output vector needs to be resized/retyped
+    if ( (N > outVector->nalloc) ||
+            (inType != outVector->type.type) ) {
+        // reshape the output vector to match the input vector's size/type.
+        outVector = psVectorRecycle(outVector,N,inType);
+    }
+    outVector->n = N;
+    outVec = outVector->data.U8;
+
+    if (N == 0) {
+        // no need to sort anything, as there are no elements in input vector.
+        return outVector;
+    }
+
+    // Copy input vector values into output vector if not in-place sorting
+    if (inVector != outVector) {
+        memcpy(outVec, inVec, elSize * N);
+    }
+
+    // Sort output vector
+    switch (inType) {
+    case PS_TYPE_U8:
+        qsort(outVec, N, elSize, psCompareU8);
+        break;
+    case PS_TYPE_U16:
+        qsort(outVec, N, elSize, psCompareU16);
+        break;
+    case PS_TYPE_U32:
+        qsort(outVec, N, elSize, psCompareU32);
+        break;
+    case PS_TYPE_U64:
+        qsort(outVec, N, elSize, psCompareU64);
+        break;
+    case PS_TYPE_S8:
+        qsort(outVec, N, elSize, psCompareS8);
+        break;
+    case PS_TYPE_S16:
+        qsort(outVec, N, elSize, psCompareS16);
+        break;
+    case PS_TYPE_S32:
+        qsort(outVec, N, elSize, psCompareS32);
+        break;
+    case PS_TYPE_S64:
+        qsort(outVec, N, elSize, psCompareS64);
+        break;
+    case PS_TYPE_F32:
+        qsort(outVec, N, elSize, psCompareF32);
+        break;
+    case PS_TYPE_F64:
+        qsort(outVec, N, elSize, psCompareF64);
+        break;
+    default:
+        psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                PS_ERRORTEXT_psVector_UNSUPPORTED_TYPE,
+                inType);
+        psFree(outVector);
+        return NULL;
+    }
+
+    return outVector;
+}
+
+psVector* psVectorSortIndex(psVector* outVector, const psVector* inVector)
+{
+    psS32 N = 0;
+    psElemType inType = 0;
+
+    if (inVector == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psVector_SORT_NULL);
+        psFree(outVector);
+        return NULL;
+    }
+
+    inType = inVector->type.type;
+    N = inVector->n;
+
+    if (N == 0) {
+        // no need to sort anything, as there are no elements in input vector.
+        return outVector;
+    }
+
+    // ok, let's create a temporary indexed vector
+    indexedVector* idxVector = psAlloc(sizeof(indexedVector)*N);
+    int elSize = PSELEMTYPE_SIZEOF(inType);
+    for (int i = 0; i < N; i++) {
+        idxVector[i].data.U8 = inVector->data.U8+i*elSize;
+        idxVector[i].index = i;
+    }
+
+    // Sort indexed vector
+    // n.b., since first element in indexedVector is a pointer to the data,
+    // we can use the 'Ptr' version of the standard compare functions
+    switch (inType) {
+    case PS_TYPE_U8:
+        qsort(idxVector, N, sizeof(indexedVector), (psCompareFcn)psCompareU8Ptr);
+        break;
+    case PS_TYPE_U16:
+        qsort(idxVector, N, sizeof(indexedVector), (psCompareFcn)psCompareU16Ptr);
+        break;
+    case PS_TYPE_U32:
+        qsort(idxVector, N, sizeof(indexedVector), (psCompareFcn)psCompareU32Ptr);
+        break;
+    case PS_TYPE_U64:
+        qsort(idxVector, N, sizeof(indexedVector), (psCompareFcn)psCompareU64Ptr);
+        break;
+    case PS_TYPE_S8:
+        qsort(idxVector, N, sizeof(indexedVector), (psCompareFcn)psCompareS8Ptr);
+        break;
+    case PS_TYPE_S16:
+        qsort(idxVector, N, sizeof(indexedVector), (psCompareFcn)psCompareS16Ptr);
+        break;
+    case PS_TYPE_S32:
+        qsort(idxVector, N, sizeof(indexedVector), (psCompareFcn)psCompareS32Ptr);
+        break;
+    case PS_TYPE_S64:
+        qsort(idxVector, N, sizeof(indexedVector), (psCompareFcn)psCompareS64Ptr);
+        break;
+    case PS_TYPE_F32:
+        qsort(idxVector, N, sizeof(indexedVector), (psCompareFcn)psCompareF32Ptr);
+        break;
+    case PS_TYPE_F64:
+        qsort(idxVector, N, sizeof(indexedVector), (psCompareFcn)psCompareF64Ptr);
+        break;
+    default:
+        psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                PS_ERRORTEXT_psVector_UNSUPPORTED_TYPE,
+                inType);
+        psFree(idxVector);
+        psFree(outVector);
+        return NULL;
+    }
+
+    // extract the indices to the output vector
+    outVector = psVectorRecycle(outVector, N, PS_TYPE_U32);
+    psU32* outData = outVector->data.U32;
+    for (int i = 0; i < N; i++) {
+        outData[i] = idxVector[i].index;
+    }
+
+    // Free temp memory
+    psFree(idxVector);
+
+    return outVector;
+}
+
+char* psVectorToString(psVector* vector, int maxLength)
+{
+
+    if (maxLength < 5) {
+        return NULL;
+    }
+
+    char* str = psAlloc(sizeof(char)*maxLength+1);
+
+    if (vector == NULL) {
+        snprintf(str,maxLength, "NULL");
+        return str;
+    }
+
+    int size = vector->n;
+
+    if (size == 0) {
+        snprintf(str,maxLength, "[]");
+        return str;
+    }
+
+    char* tempStr = psAlloc(sizeof(char)*maxLength+1);
+    *str = '\0';
+    bool full = false;
+
+    #define APPEND_ELEMENTS_CASE(TYPE, NATIVE_TYPE, FORMAT) \
+case PS_TYPE_##TYPE: \
+    for (lcv=0; lcv < size && ! full; lcv++) { \
+        snprintf(tempStr, maxLength, "%s" FORMAT, prefix, (NATIVE_TYPE) (vector->data.TYPE[lcv])); \
+        strncat(str,tempStr,maxLength); \
+        full = (strlen(str) > maxLength-2); \
+        prefix = ","; \
+    } \
+    break;
+
+    #define APPEND_ELEMENTS_CASE_COMPLEX(TYPE,CREAL,CIMAG) \
+case PS_TYPE_##TYPE: \
+    for (lcv=0; lcv < size && ! full; lcv++) { \
+        snprintf(tempStr, maxLength, "%s%g%+gi", prefix, \
+                 CREAL(vector->data.TYPE[lcv]), \
+                 CIMAG(vector->data.TYPE[lcv])); \
+        full = (strlen(str) > maxLength-2); \
+        prefix = ","; \
+    } \
+    break;
+
+    int lcv;
+    char* prefix = "[";
+    switch(vector->type.type) {
+        APPEND_ELEMENTS_CASE(S8,char,"%hd")
+        APPEND_ELEMENTS_CASE(S16,short int,"%hd")
+        APPEND_ELEMENTS_CASE(S32,int,"%d")
+        APPEND_ELEMENTS_CASE(S64,long,"%ld")
+        APPEND_ELEMENTS_CASE(U8,unsigned char,"%hu")
+        APPEND_ELEMENTS_CASE(U16,unsigned short,"%hu")
+        APPEND_ELEMENTS_CASE(U32,unsigned int, "%u")
+        APPEND_ELEMENTS_CASE(U64,unsigned long,"%lu")
+        APPEND_ELEMENTS_CASE(F32,double,"%g")
+        APPEND_ELEMENTS_CASE(F64,double,"%g")
+        APPEND_ELEMENTS_CASE_COMPLEX(C32,crealf,cimagf)
+        APPEND_ELEMENTS_CASE_COMPLEX(C64,creal,cimag)
+    default:
+        snprintf(str,maxLength,"[...]");
+        break;
+    }
+
+    if (full) {
+        // couldn't all fit in given string length
+
+        // remove elements until there is room for ",...]"
+        while (strlen(str) > maxLength - 5) {
+            char* lastComma = strrchr(str,',');
+            if (lastComma == NULL) { // no comma, must be first number
+                str[1] = '\0';
+            } else {
+                *lastComma = '\0';
+            }
+        }
+        strncat(str,",...]",maxLength);
+    } else {
+        strncat(str,"]",maxLength);
+    }
+
+    psFree(tempStr);
+
+    return str;
+}
+
+psF64 p_psVectorGetElementF64(psVector* vector,
+                              int position)
+{
+    if (vector == NULL) {
+        return NAN;
+    }
+    if (position < 0 || position >= vector->n) {
+        return NAN;
+    }
+
+    switch (vector->type.type) {
+    case PS_TYPE_U8:
+        return vector->data.U8[position];
+        break;
+    case PS_TYPE_U16:
+        return vector->data.U16[position];
+        break;
+    case PS_TYPE_U32:
+        return vector->data.U32[position];
+        break;
+    case PS_TYPE_U64:
+        return vector->data.U64[position];
+        break;
+    case PS_TYPE_S8:
+        return vector->data.S8[position];
+        break;
+    case PS_TYPE_S16:
+        return vector->data.S16[position];
+        break;
+    case PS_TYPE_S32:
+        return vector->data.S32[position];
+        break;
+    case PS_TYPE_S64:
+        return vector->data.S64[position];
+        break;
+    case PS_TYPE_F32:
+        return vector->data.F32[position];
+        break;
+    case PS_TYPE_F64:
+        return vector->data.F64[position];
+    default:
+        return NAN;
+    }
+}
Index: /tags/ipp-1-X/bug123/psLib/src/collections/psVector.h
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/collections/psVector.h	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/collections/psVector.h	(revision 22331)
@@ -0,0 +1,167 @@
+/** @file  psVector.h
+ *
+ *  @brief Contains basic vector definitions and operations
+ *
+ *  This file defines the basic type for a vector struct and functions useful
+ *  in manupulating vectors.
+ *
+ *  @ingroup Vector
+ *
+ *  @author Robert DeSonia, MHPCC
+ *  @author Ross Harman, MHPCC
+ *
+ *  @version $Revision: 1.32 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-04-21 21:18:23 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+
+#ifndef PS_VECTOR_H
+#define PS_VECTOR_H
+
+#include "psType.h"
+
+/// @addtogroup Vector
+/// @{
+
+///< Union of psVector data types.
+typedef union {
+    psU8* U8;               ///< Unsigned 8-bit integer data.
+    psU16* U16;             ///< Unsigned 16-bit integer data.
+    psU32* U32;             ///< Unsigned 32-bit integer data.
+    psU64* U64;             ///< Unsigned 64-bit integer data.
+    psS8* S8;               ///< Signed 8-bit integer data.
+    psS16* S16;             ///< Signed 16-bit integer data.
+    psS32* S32;             ///< Signed 32-bit integer data.
+    psS64* S64;             ///< Signed 64-bit integer data.
+    psF32* F32;             ///< Single-precision float data.
+    psF64* F64;             ///< Double-precision float data.
+    psC32* C32;             ///< Single-precision complex data.
+    psC64* C64;             ///< Double-precision complex data.
+} p_psVectorData;
+
+/** An vector to support primitive types.
+ *
+ * Struct for maintaining an vector of frequently used primitive types.
+ *
+ */
+typedef struct
+{
+    psType type;                ///< Type of data.
+    int n;                      ///< Number of elements in use.
+    const int nalloc;           ///< Total number of elements available.
+    p_psVectorData data;        ///< Union for data types.
+}
+psVector;
+
+/*****************************************************************************/
+
+/* FUNCTION PROTOTYPES                                                       */
+
+/*****************************************************************************/
+
+
+/** Allocate a vector.
+ *
+ *  Uses psLib memory allocation functions to create a vector collection of
+ *  data as defined by the psType type.
+ *
+ * @return psVector*    Pointer to psVector.
+ */
+psVector* psVectorAlloc(
+    psU32 nalloc,               ///< Total number of elements to make available.
+    psElemType dataType                ///< Type of data to be held by vector.
+);
+
+/** Reallocate a vector.
+ *
+ *  Uses psLib memory allocation functions to reallocate a vector collection
+ *  of data. The vector is reallocated according to the psType type member
+ *  contained within the vector.
+ *
+ *  @return psVector*      Pointer to psVector.
+ *
+ */
+psVector* psVectorRealloc(
+    psVector* psVec,                   ///< Vector to reallocate.
+    psU32 nalloc                       ///< Total number of elements to make available.
+);
+
+/** Recycle a vector.
+ *
+ *  Uses psLib memory allocation functions to reallocate a vector collection
+ *  of data. The vector is reallocated according to the psElemType type
+ *  parameter.
+ *
+ * @return psVector*       Pointer to psVector.
+ *
+ */
+psVector* psVectorRecycle(
+    psVector* psVec,
+    ///< Vector to recycle.  If NULL, a new vector is created.  No effort
+    ///< taken to preserve the values.
+
+    psU32 nalloc,                      ///< Total number of elements to make available.
+    psElemType type                    ///< the datatype of the returned vector
+);
+
+/** Copy a vector, converting types.
+ *
+ *  Performs a deep copy of the elements of one psVector to a new psVector,
+ *  converting numeric types to a specified type.
+ *
+ * @return psVector*       Pointer to resulting psVector.
+ *
+ */
+psVector* psVectorCopy(
+    psVector* out,                     ///< if non-NULL, a psVector to recycle
+    const psVector* in,                ///< the vector to copy.
+    psElemType type                    ///< the data type of the resulting psVector
+);
+
+/** Sort an array of floats.
+ *
+ *  Sorts an array of floats in ascending order.  This function is valid for
+ *  all non-complex data types.
+ *
+ *  @return  psVector*     Pointer to sorted psVector.
+ */
+psVector* psVectorSort(
+    psVector* outVector,               ///< the output vector to recycle, or NULL if new vector desired.
+    const psVector* inVector           ///< the vector to sort.
+);
+
+/** Creates an array of indices based on sort ordered of array.
+ *
+ *  Sorts a vector and creates an integer array holding indices of
+ *  sorted float values based on pre-sort index positions.
+ *
+ *  @return  psVector*     vector of the indices of sort.
+ */
+psVector* psVectorSortIndex(
+    psVector* outVector,               ///< vector to recycle
+    const psVector* inVector           ///< vector to sort
+);
+
+/** Creates a string from a psVector's values in the form "[x0,x1,x2]".
+ *
+ *  @return psPtr          a newly allocated string
+ */
+char* psVectorToString(
+    psVector* vector,                  ///< vector to create a string from
+    int maxLength                      ///< the maximum length of the resulting string
+);
+
+/** Returns an element in the vector as a psF64 value
+ *
+ *  @return psF64          the value at specified position, or NAN if position is invalid.
+ */
+psF64 p_psVectorGetElementF64(
+    psVector* vector,                  ///< vector to retrieve element
+    int position                       ///< the vector position to get
+);
+
+
+/// @}
+
+#endif
Index: /tags/ipp-1-X/bug123/psLib/src/dataIO/.cvsignore
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/dataIO/.cvsignore	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/dataIO/.cvsignore	(revision 22331)
@@ -0,0 +1,7 @@
+Makefile.in
+.deps
+.libs
+Makefile
+*.lo
+*.la
+
Index: /tags/ipp-1-X/bug123/psLib/src/dataIO/Makefile.am
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/dataIO/Makefile.am	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/dataIO/Makefile.am	(revision 22331)
@@ -0,0 +1,30 @@
+#Makefile for dataIO functions of psLib
+#
+INCLUDES = \
+	-I$(top_srcdir)/src/astronomy \
+	-I$(top_srcdir)/src/collections \
+	-I$(top_srcdir)/src/dataManip \
+	-I$(top_srcdir)/src/image \
+	-I$(top_srcdir)/src/sysUtils \
+	$(all_includes)
+
+noinst_LTLIBRARIES = libpslibdataIO.la
+
+libpslibdataIO_la_SOURCES = \
+	psLookupTable.c \
+	psFits.c \
+	psDB.c
+
+
+BUILT_SOURCES = psFileUtilsErrors.h
+EXTRA_DIST = psFileUtilsErrors.dat psFileUtilsErrors.h dataIO.i
+
+psFileUtilsErrors.h: psFileUtilsErrors.dat
+	perl $(top_srcdir)/src/parseErrorCodes.pl --data=$? $@
+
+pslibincludedir = $(includedir)
+pslibinclude_HEADERS = \
+	psLookupTable.h \
+	psFits.h \
+	psDB.h
+
Index: /tags/ipp-1-X/bug123/psLib/src/dataIO/dataIO.i
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/dataIO/dataIO.i	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/dataIO/dataIO.i	(revision 22331)
@@ -0,0 +1,4 @@
+/* dataIO headers */
+%include "psFileUtilsErrors.h"
+%include "psFits.h"
+%include "psLookupTable.h"
Index: /tags/ipp-1-X/bug123/psLib/src/dataIO/psDB.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/dataIO/psDB.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/dataIO/psDB.c	(revision 22331)
@@ -0,0 +1,1705 @@
+/** @file  psDB.c
+ *
+ * -*- mode: C; c-basic-indent: 4; tab-width: 8; indent-tabs-mode: nil -*-
+ * vim: set cindent ts=8 sw=4 expandtab:
+ *
+ *  @brief database functions
+ *
+ *  This file contains functions that perform basic database operations.  MySQL
+ *  4.1.2 or newer is required.
+ *
+ *  @author Aaron Culliney
+ *  @author Joshua Hoblitt
+ *
+ *  @version $Revision: 1.14 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-04-06 01:12:58 $
+ *
+ *  Copyright 2005 Joshua Hoblitt, University of Hawaii
+ */
+
+#ifdef BUILD_PSDB
+
+#include <stdio.h>
+#include <stdarg.h>
+#include <string.h>
+#include <stdlib.h>
+#include <math.h>
+#include <mysql.h>
+#include <mysql_com.h> // enum_field_types
+
+#include "psDB.h"
+#include "psMemory.h"
+#include "psAbort.h"
+#include "psError.h"
+#include "psString.h"
+
+
+typedef struct
+{
+    enum enum_field_types type;
+    bool            isUnsigned;
+}
+mysqlType;
+
+// database utility functions
+static bool     psDBRunQuery(psDB *dbh, const char *query);
+static inline bool psDBPackRow(MYSQL_BIND *bind, psMetadata *values, psU32 paramCount);
+
+// SQL generation functions
+static char    *psDBGenerateCreateTableSQL(const char *tableName, psMetadata *where);
+static char    *psDBGenerateSelectRowSQL(const char *tableName, const char *col, psMetadata *where, psU64 limit);
+static char    *psDBGenerateInsertRowSQL(const char *tableName, psMetadata *row);
+static char    *psDBGenerateUpdateRowSQL(const char *tableName, psMetadata *where, psMetadata *values);
+static char    *psDBGenerateDeleteRowSQL(const char *tableName, psMetadata *where);
+static char    *psDBGenerateWhereSQL(psMetadata *where);
+static char    *psDBGenerateSetSQL(psMetadata *set
+                                  );
+
+// lookup table functions
+static psElemType psDBMySQLToPType(enum enum_field_types type, unsigned int flags);
+static char    *psDBPTypeToSQL(psElemType pType);
+static mysqlType *psDBPTypeToMySQL(psElemType pType);
+
+static psHash  *psDBGetPTypeToSQLTable(void);
+static void     psDBPTypeToSQLTableCleanup(void);
+
+static psHash  *psDBGetSQLToPTypeTable(void);
+static void     psDBSQLToPTypeTableCleanup(void);
+
+static psHash  *psDBGetMySQLToSQLTable(void);
+static void     psDBMySQLToSQLTableCleanup(void);
+
+static psHash  *psDBGetPTypeToMySQLTable(void);
+static void     psDBPTypeToMySQLTableCleanup(void);
+
+static psPtr    psDBMySQLTypeAlloc(enum enum_field_types type, bool isUnsigned);
+static void     psDBAddToLookupTable(psHash *lookupTable, psU32 type, const char *string);
+static void     psDBAddVoidToLookupTable(psHash *lookupTable, psU32 type, psPtr value);
+
+// pType utility functions
+static psPtr    psDBGetPTypeNaN(psElemType pType);
+static bool     psDBIsPTypeNaN(psElemType pType, psPtr data);
+
+// string utility functions
+static char    *psDBIntToString(psU64 n);
+static ssize_t  psStringAppend(char **dest, const char *format, ...);
+static ssize_t  psStringPrepend(char **dest, const char *format, ...);
+
+
+// public functions
+/*****************************************************************************/
+
+psDB *psDBInit(const char *host, const char *user, const char *passwd, const char *dbname)
+{
+    MYSQL           *mysql;
+    psDB            *dbh;
+
+    mysql = mysql_init(NULL);
+    if (!mysql) {
+        psAbort(__func__, "mysql_init(), out of memory.");
+    }
+
+    if (!mysql_real_connect(mysql, host, user, passwd, dbname, 0, NULL, 0)) {
+        psError(PS_ERR_UNKNOWN, true, "Failed to connect to database.  Error: %s", mysql_error(mysql));
+
+        mysql_close(mysql);
+
+        return NULL;
+    }
+
+    dbh = psAlloc(sizeof(psDB));
+
+    dbh->mysql = mysql;
+
+    return dbh;
+}
+
+void psDBCleanup(psDB *dbh)
+{
+    mysql_close(dbh->mysql);
+    dbh->mysql = NULL;
+    psFree(dbh);
+
+    // ASC WARNING NOTE: the psDBSQLToPTypeTableCleanup cleanup routine
+    // needs to be called first because it refers to
+    // psDBGetPTypeToSQLTable ...
+    psDBSQLToPTypeTableCleanup();
+    psDBMySQLToSQLTableCleanup();
+    psDBPTypeToSQLTableCleanup();
+    psDBPTypeToMySQLTableCleanup();
+}
+
+bool psDBCreate(psDB *dbh, const char *dbname)
+{
+    char            *query = NULL;
+    bool            status;
+
+    psStringAppend(&query, "CREATE DATABASE %s", dbname);
+
+    // the MySQL C API notes that mysql_create_db() is deprecated
+    status = psDBRunQuery(dbh, query);
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, false, "Failed to create new database.");
+    }
+
+    psFree(query);
+
+    return status;
+}
+
+bool psDBChange(psDB *dbh, const char *dbname)
+{
+    if (mysql_select_db(dbh->mysql, dbname) != 0) {
+        psError(PS_ERR_UNKNOWN, true, "Failed to change database.  Error: %s", mysql_error(dbh->mysql));
+
+        return false;
+    }
+
+    return true;
+}
+
+bool psDBDrop(psDB *dbh, const char *dbname)
+{
+    char            *query = NULL;
+    bool            status;
+
+    psStringAppend(&query, "DROP DATABASE %s", dbname);
+
+    // the MySQL C API notes that mysql_drop_db() is deprecated
+    status = psDBRunQuery(dbh, query);
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, false, "Failed to drop database.");
+    }
+
+    psFree(query);
+
+    return status;
+}
+
+bool psDBCreateTable(psDB *dbh, const char *tableName, psMetadata *md)
+{
+    char            *query;
+    bool            status;
+
+    query = psDBGenerateCreateTableSQL(tableName, md);
+    if (!query) {
+        psError(PS_ERR_UNEXPECTED_NULL, false, "Query generation failed.");
+
+        return NULL;
+    }
+
+    status = psDBRunQuery(dbh, query);
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, false, "Failed to create table.");
+    }
+
+    psFree(query);
+
+    return status;
+}
+
+bool psDBDropTable(psDB *dbh, const char *tableName)
+{
+    char            *query = NULL;
+    bool            status;
+
+    psStringAppend(&query, "DROP TABLE %s", tableName);
+
+    status = psDBRunQuery(dbh, query);
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, false, "Failed to drop table.");
+    }
+
+    psFree(query);
+
+    return status;
+}
+
+psArray *psDBSelectColumn(psDB *dbh, const char *tableName, const char *col, psU64 limit)
+{
+    MYSQL_RES       *result;            // complete db result set
+    MYSQL_ROW       row;                // single row of db result set
+    char            *query;             // SQL query
+    my_ulonglong    rowCount;           // number of rows in db result set
+    unsigned long   dataSize;           // size of field
+    unsigned int    fieldCount;         // number of fields in db result set
+    psArray         *column = NULL;     // return array
+    psPtr           data;               // copy of result field
+
+    query = psDBGenerateSelectRowSQL(tableName, col, NULL, limit);
+    if (!query) {
+        psError(PS_ERR_UNEXPECTED_NULL, false, "Query generation failed.");
+        return NULL;
+    }
+
+    if (!psDBRunQuery(dbh, query)) {
+        psError(PS_ERR_UNKNOWN, false, "Query execution failed.");
+        psFree(query);
+        return NULL;
+    }
+
+    psFree(query);
+
+    result = mysql_store_result(dbh->mysql);
+    if (!result) {
+        // no result set
+        fieldCount = mysql_field_count(dbh->mysql);
+
+        // if field count is zero the query returned no data.  If it's non-zero
+        // then something bad has happened.
+        if (fieldCount != 0) {
+            psError(PS_ERR_UNEXPECTED_NULL, true, "Query returned no data.  Error: %s", mysql_error(dbh->mysql));
+            return NULL;
+        }
+    }
+
+    rowCount = mysql_num_rows(result);
+
+    // pre-allocate enough elements to hold the complete result set
+    // then reset n to 0 so elements are added from the beginning of
+    // the array
+    column = psArrayAlloc(rowCount);
+    column->n = 0;
+
+    while ((row = mysql_fetch_row(result))) {
+        // get the first element of lengths array that is part of the
+        // result set
+        dataSize = *(mysql_fetch_lengths(result));
+
+        // represent NULL as an empty string
+        if (row[0] == NULL) {
+            data = psStringCopy("");
+        } else {
+            data = psAlloc(dataSize+1);
+            memcpy(data, row[0], dataSize);
+            ((char*)data)[dataSize] = '\0';
+        }
+
+        // add field to return array
+        psArrayAdd(column, 0, data);
+        psFree(data);
+    }
+
+    mysql_free_result(result);
+
+    return column;
+}
+
+// dest = assign to, source = source string psArray, conv = conversion function,
+// type = type to cast to, pType = psElemType
+#define PS_STR_ARRAY_TO_PTYPE(dest, source, conv, type, pType) \
+{ \
+    psPtr           myNaN; \
+    int             i; \
+    \
+    for (i = 0; i < source->n; i++) { \
+        if (strlen(source->data[i])) { \
+            dest[i] = (type)conv(source->data[i]); \
+        } else { \
+            myNaN = psDBGetPTypeNaN(pType); \
+            dest[i] = *(type *)myNaN; \
+            psFree(myNaN); \
+        } \
+    } \
+}
+
+psVector *psDBSelectColumnNum(psDB *dbh, const char *tableName, const char *col, psElemType pType, const psU64 limit)
+{
+    psArray         *stringColumn;      // source psArray
+    psVector        *column;            // dest psVector
+
+    stringColumn = psDBSelectColumn(dbh, tableName, col, limit);
+    if (!stringColumn) {
+        // could be an error or the result set was just empty
+        return NULL;
+    }
+
+    column = psVectorAlloc(stringColumn->n, pType);
+
+    // conversion functions are a portability issue
+    switch (pType) {
+    case PS_TYPE_S8:
+        PS_STR_ARRAY_TO_PTYPE(column->data.S8, stringColumn, atoi, psS8, PS_TYPE_S8);
+        break;
+    case PS_TYPE_S16:
+        PS_STR_ARRAY_TO_PTYPE(column->data.S16, stringColumn, atoi, psS16, PS_TYPE_S16);
+        break;
+    case PS_TYPE_S32:
+        PS_STR_ARRAY_TO_PTYPE(column->data.S32, stringColumn, atoi, psS32, PS_TYPE_S32);
+        break;
+    case PS_TYPE_S64:
+        PS_STR_ARRAY_TO_PTYPE(column->data.S64, stringColumn, atoll, psS64, PS_TYPE_S64);
+        break;
+    case PS_TYPE_U8:
+        PS_STR_ARRAY_TO_PTYPE(column->data.U8, stringColumn, atoi, psU8, PS_TYPE_U8);
+        break;
+    case PS_TYPE_U16:
+        PS_STR_ARRAY_TO_PTYPE(column->data.U16, stringColumn, atoi, psU16, PS_TYPE_U16);
+        break;
+    case PS_TYPE_U32:
+        PS_STR_ARRAY_TO_PTYPE(column->data.U32, stringColumn, atoi, psU32, PS_TYPE_U32);
+        break;
+    case PS_TYPE_U64:
+        PS_STR_ARRAY_TO_PTYPE(column->data.U64, stringColumn, atoll, psU64, PS_TYPE_U64);
+        break;
+    case PS_TYPE_F32:
+        PS_STR_ARRAY_TO_PTYPE(column->data.F32, stringColumn, atof, psF32, PS_TYPE_F32);
+        break;
+    case PS_TYPE_F64:
+        PS_STR_ARRAY_TO_PTYPE(column->data.F64, stringColumn, atof, psF64, PS_TYPE_F64);
+        break;
+    case PS_TYPE_C32:
+        // this is a bogus SQL type
+        PS_STR_ARRAY_TO_PTYPE(column->data.C32, stringColumn, atof, psC32, PS_TYPE_C32);
+        break;
+    case PS_TYPE_C64:
+        // this is a bogus SQL type
+        PS_STR_ARRAY_TO_PTYPE(column->data.C64, stringColumn, atof, psC64, PS_TYPE_C64);
+        break;
+    case PS_TYPE_BOOL:
+        // valid for psVector?
+        break;
+    }
+
+    psFree(stringColumn);
+
+    return column;
+}
+
+psArray *psDBSelectRows(psDB *dbh, const char *tableName, psMetadata *where, const psU64 limit)
+{
+    MYSQL_RES       *result;            // complete db result set
+    MYSQL_ROW       row;                // single row of db result set
+    MYSQL_FIELD     *field;             // field type info
+    char            *query;             // SQL query
+    my_ulonglong    rowCount;           // number of rows in db result set
+    unsigned int    fieldCount;         // number of fields in db result set
+    unsigned long   *fieldLength;       // field sizes
+    long            len;                // field length
+    psArray         *resultSet;         // return array
+    int             i;                  // field index
+    psMetadata      *md;                // a row
+    psU32           pType;              // psElemType of a field
+    psPtr           data;               // copy of result field
+
+    query = psDBGenerateSelectRowSQL(tableName, NULL, where, limit);
+    if (!query) {
+        psError(PS_ERR_UNEXPECTED_NULL, false, "Query generation failed.");
+
+        return NULL;
+    }
+
+    if (!psDBRunQuery(dbh, query)) {
+        psError(PS_ERR_UNKNOWN, false, "Query execution failed.");
+
+        psFree(query);
+
+        return NULL;
+    }
+
+    psFree(query);
+
+    result = mysql_store_result(dbh->mysql);
+    if (!result) {
+        // no result set
+        fieldCount = mysql_field_count(dbh->mysql);
+
+        // if field count is zero the query should have returned no data.  If
+        // it's non-zero then something bad has happened.
+        if (fieldCount != 0) {
+            psError(PS_ERR_UNEXPECTED_NULL, true, "Query returned no data.  Error: %s", mysql_error(dbh->mysql));
+
+            return NULL;
+        }
+    }
+
+    rowCount = mysql_num_rows(result);
+
+    // pre-allocate enough elements to hold the complete result set
+    // then reset n to 0 so elements are added from the beginning of
+    // the array
+    resultSet = psArrayAlloc(rowCount);
+    resultSet->n = 0;
+
+    field = mysql_fetch_fields(result);
+    fieldCount = mysql_num_fields(result);
+
+    while ((row = mysql_fetch_row(result))) {
+        // allocate new psMetadata to represent a row
+        md = psMetadataAlloc();
+
+        fieldLength = mysql_fetch_lengths(result);
+
+        for (i = 0; i < fieldCount; i++) {
+            // lookup MySQL column type
+            pType = psDBMySQLToPType(field[i].type, field[i].flags);
+
+            len = fieldLength[i];
+            if (len) {
+                data = psAlloc(len+1);
+                memcpy(data, row[i], len);
+                ((char*)data)[len] = '\0';
+            } else {
+                data = psDBGetPTypeNaN(pType);
+            }
+
+            // copy field data and convert NULLs to the appropriate NaN value
+            if (pType == PS_META_STR) {
+                psMetadataAddStr(md, 0, field[i].name, "", data);
+            } else if (pType == PS_META_S32) {
+                psMetadataAddS32(md, 0, field[i].name, "", atoll(data));
+            } else if (pType == PS_META_F32) {
+                psMetadataAddF32(md, 0, field[i].name, "", atof(data));
+            } else if (pType == PS_META_F64) {
+                psMetadataAddF64(md, 0, field[i].name, "", atof(data));
+            } else {
+                // XXX: assume binary string ...
+                psMetadataAddStr(md, 0, field[i].name, "", data);
+            }
+
+            psFree(data);
+        }
+
+        // add row to result set
+        psArrayAdd(resultSet, 0, md);
+        psFree(md);
+    }
+
+    mysql_free_result(result);
+
+    return resultSet;
+}
+
+bool psDBInsertOneRow(psDB *dbh, const char *tableName, psMetadata *row)
+{
+    psArray         *rowSet;            // psArray of row to insert
+
+    rowSet = psArrayAlloc(1);
+    rowSet->n = 0;
+    psArrayAdd(rowSet, 0, row);
+
+    if (!psDBInsertRows(dbh, tableName, rowSet)) {
+        psError(PS_ERR_UNKNOWN, false, "Insert failed.");
+
+        psFree(rowSet);
+
+        return false;
+    }
+
+    psFree(rowSet);
+
+    return true;
+}
+
+bool psDBInsertRows(psDB *dbh, const char *tableName, psArray *rowSet)
+{
+    psMetadata      *row;               // row of data
+    char            *query;             // SQL query
+    MYSQL_STMT      *stmt;              // prepared db statement
+    MYSQL_BIND      *bind;              // field values to insert
+    unsigned long   paramCount;         // number of placeholders in query
+    psU64           j;                  // row index
+
+    // we are assuming that all rows in the set have an identical with reguard
+    // to field count and type
+    row = rowSet->data[0];
+
+    query = psDBGenerateInsertRowSQL(tableName, row);
+    if (!query) {
+        psError(PS_ERR_UNEXPECTED_NULL, false, "Query generation failed.");
+
+        return NULL;
+    }
+
+    stmt = mysql_stmt_init(dbh->mysql);
+    if (!stmt) {
+        psAbort(__func__, "mysql_stmt_init(), out of memory.");
+    }
+
+    if (mysql_stmt_prepare(stmt, query, (unsigned long)strlen(query))) {
+        psError(PS_ERR_UNKNOWN, true, "Failed to prepare query.  Error: %s", mysql_stmt_error(stmt));
+
+        mysql_stmt_close(stmt);
+        psFree(query);
+
+        return false;
+    }
+
+    psFree(query);
+
+    // how many place holders are in our query
+    paramCount = mysql_stmt_param_count(stmt);
+
+    // structure larger enough to hold one field of data per place holder
+    bind = psAlloc(sizeof(MYSQL_BIND) * paramCount);
+
+    // loop over rows
+    for (j = 0; j < rowSet->n; j++) {
+        row = rowSet->data[j];
+
+        // reset bind for each row
+        memset(bind, 0, sizeof(MYSQL_BIND) * paramCount);
+
+        if (!psDBPackRow(bind, row, paramCount)) {
+            psError(PS_ERR_UNKNOWN, false, "Failed to pack params into bind structure.");
+
+            mysql_rollback(dbh->mysql);
+
+            psFree(bind);
+            mysql_stmt_close(stmt);
+        }
+
+        if (mysql_stmt_bind_param(stmt, bind)) {
+            psError(PS_ERR_UNKNOWN, true, "Failed to bind params.  Error: %s", mysql_stmt_error(stmt));
+
+            mysql_rollback(dbh->mysql);
+
+            psFree(bind);
+            mysql_stmt_close(stmt);
+
+            return false;
+        }
+
+        if (mysql_stmt_execute(stmt)) {
+            psError(PS_ERR_UNKNOWN, true, "Failed to execute prepared statement.  Error: %s",
+                    mysql_stmt_error(stmt));
+
+            mysql_rollback(dbh->mysql);
+
+            psFree(bind);
+            mysql_stmt_close(stmt);
+
+            return false;
+        }
+    } // end loop over rows
+
+    // point of no return
+    mysql_commit(dbh->mysql);
+
+    psFree(bind);
+    mysql_stmt_close(stmt);
+
+    return true;
+}
+
+psArray *psDBDumpRows(psDB *dbh, const char *tableName)
+{
+    return psDBSelectRows(dbh, tableName, NULL, 0);
+}
+
+psMetadata *psDBDumpCols(psDB *dbh, const char *tableName)
+{
+    MYSQL_RES       *result;
+    MYSQL_FIELD     *field;
+    unsigned int    fieldCount;
+    psMetadata      *table;
+    psU32           pType;
+    unsigned int    i;
+    psPtr           column;
+
+    // find column types
+    result = mysql_list_fields(dbh->mysql, tableName, NULL);
+    if (!result) {
+        psError(PS_ERR_UNEXPECTED_NULL, true, "Failed to retrieve column types.");
+    }
+
+    field = mysql_fetch_fields(result);
+    fieldCount = mysql_num_fields(result);
+
+    table = psMetadataAlloc();
+
+    // fetch each column and load into psMetadata
+    for (i =0; i < fieldCount; i++) {
+        // find ptype of column
+        pType = psDBMySQLToPType(field[i].type, field[i].flags);
+        //psLogMsg( __func__, PS_LOG_INFO, "pType=[%ld]\n", pType );
+
+        // if the ptype is PS_TYPE_PTR assume that it's a string and fetch the
+        // column as an psArray of strings; otherwise fetch the column as a
+        // psVector.
+        if (pType == PS_META_STR) {
+            // PS_META_UNKNOWN -> PS_META_ARRAY ?
+            column = psDBSelectColumn(dbh, tableName, field[i].name, 0);
+            psMetadataAddStr(table, 0, field[i].name, "", column);
+            psFree(column);
+        } else {
+            column = psDBSelectColumnNum(dbh, tableName, field[i].name, pType, 0);
+            if (pType == PS_META_S32) {
+                psMetadataAddS32(table, 0, field[i].name, "", (psS32)atoll(column));
+            } else if (pType == PS_META_F32) {
+                psMetadataAddF32(table, 0, field[i].name, "", (psF32)atof(column));
+            } else if (pType == PS_META_F64) {
+                psMetadataAddF64(table, 0, field[i].name, "", (psF64)atof(column));
+            }
+            psFree(column);
+        }
+    }
+
+    return table;
+}
+
+psS64 psDBUpdateRows(psDB *dbh, const char *tableName, psMetadata *where, psMetadata *values)
+{
+    char            *query;
+    MYSQL_STMT      *stmt;              // prepared db statement
+    unsigned long   paramCount;         // number of placeholders in query
+    MYSQL_BIND      *bind;              // field values to insert
+    my_ulonglong    rowsAffected;       // number of rows affected by query
+
+    query = psDBGenerateUpdateRowSQL(tableName, where, values);
+    if (!query) {
+        psError(PS_ERR_UNEXPECTED_NULL, false, "Query generation failed.");
+
+        return -1;
+    }
+
+    stmt = mysql_stmt_init(dbh->mysql);
+    if (!stmt) {
+        psAbort(__func__, "mysql_stmt_init(), out of memory.");
+    }
+
+    if (mysql_stmt_prepare(stmt, query, (unsigned long)strlen(query))) {
+        psError(PS_ERR_UNKNOWN, true, "Failed to prepare query.  Error: %s", mysql_stmt_error(stmt));
+
+        mysql_stmt_close(stmt);
+        psFree(query);
+
+        return -1;
+    }
+
+    psFree(query);
+
+    // how many place holders are in our query
+    paramCount = mysql_stmt_param_count(stmt);
+
+    // structure large enough to hold one field of data per place holder
+    bind = psAlloc(sizeof(MYSQL_BIND) * paramCount);
+
+    // init bind
+    memset(bind, 0, sizeof(MYSQL_BIND) * paramCount);
+
+    if (!psDBPackRow(bind, values, paramCount)) {
+        psFree(bind);
+        mysql_stmt_close(stmt);
+
+        return -1;
+    }
+
+    if (mysql_stmt_bind_param(stmt, bind)) {
+        psError(PS_ERR_UNKNOWN, true, "Failed to bind params.  Error: %s", mysql_stmt_error(stmt));
+
+        mysql_rollback(dbh->mysql);
+
+        psFree(bind);
+        mysql_stmt_close(stmt);
+
+        return -1;
+    }
+
+    if (mysql_stmt_execute(stmt)) {
+        psError(PS_ERR_UNKNOWN, true, "Failed to execute prepared statement.  Error: %s",
+                mysql_stmt_error(stmt));
+
+        mysql_rollback(dbh->mysql);
+
+        psFree(bind);
+        mysql_stmt_close(stmt);
+
+        return -1;
+    }
+
+    psFree(bind);
+
+    // point of no return
+    mysql_commit(dbh->mysql);
+
+    rowsAffected = mysql_stmt_affected_rows(stmt);
+
+    mysql_stmt_close(stmt);
+
+    return rowsAffected;
+}
+
+psS64 psDBDeleteRows(psDB *dbh, const char *tableName, psMetadata *where)
+{
+    char            *query;
+
+    query = psDBGenerateDeleteRowSQL(tableName, where);
+    if (!query) {
+        psError(PS_ERR_UNEXPECTED_NULL, false, "Query generation failed.");
+
+        return -1;
+    }
+
+    if (!psDBRunQuery(dbh, query)) {
+        psError(PS_ERR_UNKNOWN, false, "Delete failed.");
+
+        mysql_rollback(dbh->mysql);
+
+        psFree(query);
+
+        return -1;
+    }
+
+    psFree(query);
+
+    if (!where) {
+        // we truncated the table so mysql_affected_rows() won't work
+        return 1;
+    }
+
+    // point of no return
+    mysql_commit(dbh->mysql);
+
+    return (psS64)mysql_affected_rows(dbh->mysql);
+}
+
+// database utility functions
+/*****************************************************************************/
+
+static bool psDBRunQuery(psDB *dbh, const char *query)
+{
+    if (mysql_real_query(dbh->mysql, query, (unsigned long)strlen(query)) !=0) {
+        psError(PS_ERR_UNKNOWN, true, "Failed to execute query.  Error: %s\n", mysql_error(dbh->mysql));
+
+        return false;
+    }
+
+    return true;
+}
+
+static inline bool psDBPackRow(MYSQL_BIND *bind, psMetadata *values, psU32 paramCount)
+{
+    psListIterator  *cursor;            // row iterator
+    psMetadataItem  *item;              // field in row
+    mysqlType       *mType;             // type tmp variable
+    static bool     isNull = true;      // used in a MYSQL_BIND to indicate NULL,
+    // this will be used outside of this func
+    psU32           i;                  // field index
+
+    // check size of values == paramCount ?
+
+    cursor = psListIteratorAlloc(values->list, 0, false);
+
+    // loop over fields
+    i = 0;
+    while ((item = psListGetAndIncrement(cursor))) {
+        // lookup pType -> mysql type
+        mType = psDBPTypeToMySQL(item->type);
+
+        bind[i].buffer_type = mType->type;
+        bind[i].is_unsigned = mType->isUnsigned;
+
+        psFree(mType);
+
+        // input data length is determined by the MYSQL_TYPE_* unless it's a string
+        if (item->type == PS_TYPE_S32) {
+            bind[i].length  = 0;
+            bind[i].buffer  = &item->data.S32;
+            bind[i].is_null = psDBIsPTypeNaN(item->type, &item->data.S32)
+                              ? (my_bool *)&isNull
+                              : NULL;
+        } else if (item->type == PS_TYPE_F32) {
+            bind[i].length  = 0;
+            bind[i].buffer  = &item->data.F32;
+            bind[i].is_null = psDBIsPTypeNaN(item->type, &item->data.F32)
+                              ? (my_bool *)&isNull
+                              : NULL;
+        } else if (item->type == PS_TYPE_F64) {
+            bind[i].length  = 0;
+            bind[i].buffer  = &item->data.F64;
+            bind[i].is_null = psDBIsPTypeNaN(item->type, &item->data.F64)
+                              ? (my_bool *)&isNull
+                              : NULL;
+            // convert NaNs to NULL and set the buffer_length for strings
+            //} else if ((item->type == PS_META_STR) && (item->pType == PS_TYPE_PTR)) {
+        } else if ((item->type == PS_META_STR)         || (item->type == PS_META_VEC)    ||
+                   (item->type == PS_META_IMG)         || (item->type == PS_META_HASH)   ||
+                   (item->type == PS_META_LOOKUPTABLE) || (item->type == PS_META_JPEG)   ||
+                   (item->type == PS_META_PNG)         || (item->type == PS_META_ASTROM) ||
+                   (item->type == PS_META_UNKNOWN)) {
+
+            bind[i].buffer_length = (unsigned long)strlen((char *)item->data.V);
+            bind[i].length  = &bind[i].buffer_length;
+            bind[i].buffer  = item->data.V;
+            bind[i].is_null = *(char *)item->data.V == '\0'
+                              ? (my_bool *)&isNull
+                              : NULL;
+        } else {
+            psError(PS_ERR_BAD_PARAMETER_TYPE , true,
+                    "FIXME: Only type of PS_TYPE_S32, PS_TYPE_F32, PS_TYPE_F64, "
+                    "and PS_TYPE_PTR are supported.");
+
+            psFree(cursor);
+
+            return false;
+        }
+
+        // increment field index
+        i++;
+    }
+
+    psFree(cursor);
+
+    return true;
+}
+
+
+// SQL generation functions
+/*****************************************************************************/
+
+static char *psDBGenerateCreateTableSQL(const char *tableName, psMetadata *table)
+{
+    char            *query = NULL;      // complete query
+    psMetadataItem  *item;              // column description
+    psListIterator  *cursor;            // column iterator
+    char            *colType;           // type lookup table
+
+    if (!table) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true, "table param may not be null.");
+
+        return NULL;
+    }
+
+    psStringAppend(&query, "CREATE TABLE %s (", tableName);
+
+    cursor = psListIteratorAlloc(table->list, 0, false);
+
+    // find column name and type
+    while ((item = psListGetAndIncrement(cursor))) {
+        if ((item->type == PS_META_S32) || (item->type == PS_META_F32) || (item->type == PS_META_F64) ||
+                (item->type == PS_TYPE_S32) || (item->type == PS_TYPE_F32) || (item->type == PS_TYPE_F64)) {
+            // + column name + _ + column type
+            colType = psDBPTypeToSQL(item->type);
+            psStringAppend(&query, "%s %s", item->name, colType);
+            psFree(colType);
+        } else if ((item->type == PS_META_STR)         || (item->type == PS_META_VEC)    ||
+                   (item->type == PS_META_IMG)         || (item->type == PS_META_HASH)   ||
+                   (item->type == PS_META_LOOKUPTABLE) || (item->type == PS_META_JPEG)   ||
+                   (item->type == PS_META_PNG)         || (item->type == PS_META_ASTROM) ||
+                   (item->type == PS_META_UNKNOWN)) {
+            // + column name + _ + varchar( + length + )
+            psStringAppend(&query, "%s VARCHAR(%s)", item->name, item->data.V);
+        } else {
+            psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                    "FIXME: Only type of PS_META_S32, PS_META_F32, PS_META_F64, "
+                    "and PS_META_* pointer types are supported, (not %d).", item->type);
+
+            psFree(query);
+            psFree(cursor);
+
+            return NULL;
+        }
+
+        // add a , after every column declaration except the last one
+        if (!cursor->offEnd) {
+            psStringAppend(&query, ", ");
+        }
+    }
+
+    psListIteratorSet(cursor, 0);
+
+    // find database indexes
+    while ((item = psListGetAndIncrement(cursor))) {
+        if ((strncmp(item->comment, "Primary Key", strlen("Primary Key"))) == 0) {
+            psStringAppend(&query, ", PRIMARY KEY(%s)", item->name);
+        } else if ((strncmp(item->comment, "Key", strlen("Key"))) == 0) {
+            psStringAppend(&query, ", KEY(%s)", item->name);
+        }
+    }
+
+    psFree(cursor);
+
+    // end column types + table type
+    psStringAppend(&query, ") ENGINE=innodb");
+
+    return query;
+}
+
+static char *psDBGenerateSelectRowSQL(const char *tableName, const char *col, psMetadata *where, const psU64 limit)
+{
+    char            *query = NULL;
+    char            *whereSQL;
+    char            *limitString;
+
+    // select all columns if col is NULL
+    if (col) {
+        psStringAppend(&query, "SELECT %s FROM %s", col, tableName);
+    } else {
+        psStringAppend(&query, "SELECT * FROM %s", tableName);
+    }
+
+    // select all rows if where is NULL
+    if (where) {
+        whereSQL = psDBGenerateWhereSQL(where);
+        if (!whereSQL) {
+            psError(PS_ERR_UNEXPECTED_NULL, false, "SQL substring generation failed.");
+
+            psFree(query);
+
+            return NULL;
+        }
+        psStringAppend(&query, " %s", whereSQL);
+        psFree(whereSQL);
+    }
+
+    // treat limit == 0 as "no limit"
+    if (limit) {
+        limitString = psDBIntToString(limit);
+        psStringAppend(&query, " LIMIT %s", limitString);
+        psFree(limitString);
+    }
+
+    return query;
+}
+
+static char *psDBGenerateInsertRowSQL(const char *tableName, psMetadata *row)
+{
+    char            *query = NULL;
+    psListIterator  *cursor;
+    psMetadataItem  *item;
+
+    psStringAppend(&query, "INSERT INTO %s (", tableName);
+
+    cursor = psListIteratorAlloc(row->list, 0, false);
+
+    // get field names
+    while ((item = psListGetAndIncrement(cursor))) {
+        psStringAppend(&query, item->name);
+
+        // + , + _ between every field name
+        if (!cursor->offEnd) {
+            psStringAppend(&query, ", ");
+        }
+    }
+
+    // end of field names
+    psStringAppend(&query, ") VALUES (");
+
+    psListIteratorSet(cursor, 0);
+
+    // create value place holders
+    while ((item = psListGetAndIncrement(cursor))) {
+        psStringAppend(&query, "?");
+
+        // + ", " between every place holder
+        if (!cursor->offEnd) {
+            psStringAppend(&query, ", ");
+        }
+    }
+
+    psFree(cursor);
+
+    // end of values
+    psStringAppend(&query, ")");
+
+    return query;
+}
+
+static char *psDBGenerateUpdateRowSQL(const char *tableName, psMetadata *where, psMetadata *values)
+{
+    char            *query = NULL;
+    char            *setSQL;
+    char            *whereSQL;
+
+    if ((!values) || (!where)) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true, "values and where params may not be NULL.");
+
+        return NULL;
+    }
+
+    setSQL = psDBGenerateSetSQL(values);
+    if (!setSQL) {
+        psError(PS_ERR_UNEXPECTED_NULL, false, "SQL substring generation failed.");
+
+        return NULL;
+    }
+
+    whereSQL = psDBGenerateWhereSQL(where);
+    if (!whereSQL) {
+        psError(PS_ERR_UNEXPECTED_NULL, false, "SQL substring generation failed.");
+
+        return NULL;
+    }
+
+    psStringAppend(&query, "UPDATE %s %s %s", tableName, setSQL, whereSQL);
+    psFree(setSQL);
+    psFree(whereSQL);
+
+    return query;
+}
+
+static char *psDBGenerateDeleteRowSQL(const char *tableName, psMetadata *where)
+{
+    char            *query = NULL;
+    char            *whereSQL;
+
+    // delete all rows if where is NULL
+    if (!where) {
+        psStringAppend(&query, "TRUNCATE TABLE %s", tableName);
+
+        return query;
+    }
+
+    whereSQL = psDBGenerateWhereSQL(where);
+    if (!whereSQL) {
+        psError(PS_ERR_UNEXPECTED_NULL, false, "SQL substring generation failed.");
+
+        return NULL;
+    }
+
+    psStringAppend(&query, "DELETE FROM %s %s", tableName, whereSQL);
+    psFree(whereSQL);
+
+    return query;
+}
+
+static char *psDBGenerateWhereSQL(psMetadata *where)
+{
+    char            *query = NULL;
+    psListIterator  *cursor;
+    psMetadataItem  *item;
+
+    if (!where) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true, "where param may not be NULL.");
+
+        return NULL;
+    }
+
+    query = psStringCopy("WHERE ");
+
+    cursor = psListIteratorAlloc(where->list, 0, false);
+
+    // find column name and match pattern
+    while ((item = psListGetAndIncrement(cursor))) {
+        // item->data must be a string
+        if ((item->type == PS_META_S32) || (item->type == PS_TYPE_S32)) {
+            psStringAppend(&query, "%s=%d", item->name, (int)(item->data.S32));
+        } else if ((item->type == PS_META_F32) || (item->type == PS_TYPE_F32)) {
+            psStringAppend(&query, "%s=%g", item->name, (double)(item->data.F32));
+        } else if ((item->type == PS_META_F64) || (item->type == PS_TYPE_F64)) {
+            psStringAppend(&query, "%s=%g", item->name, (double)(item->data.F64));
+        } else if (item->type == PS_META_STR) {
+            // + column name + _ + like + _ + ' + value + '
+            if (*(char *)item->data.V == '\0') {
+                psStringAppend(&query, "%s IS NULL", item->name);
+            } else {
+                // XXX ASC NOTE: we should have a better match for
+                // char & varchar columns than this.  LIKE is OK for
+                // very large TEXT columns that really shouldn't be
+                // used in a where clause...
+                psStringAppend(&query, "%s LIKE '%s'", item->name, item->data.V);
+            }
+        } else {
+            psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                    "Only types PS_META_S32, PS_META_F32, PS_META_F64, PS_META_STR is supported");
+
+            psFree(cursor);
+            psFree(query);
+
+            return NULL;
+        }
+
+        // + " and " after every column declaration except the last one
+        if (!cursor->offEnd) {
+            psStringAppend(&query, " AND ");
+        }
+    }
+
+    psFree(cursor);
+
+    return query;
+}
+
+static char *psDBGenerateSetSQL(psMetadata *set
+                               )
+{
+    char            *query = NULL;
+    psListIterator  *cursor;
+    psMetadataItem  *item;
+
+    if (!set
+       ) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true, "set param may not be NULL.");
+
+        return NULL;
+    }
+
+    query = psStringCopy("SET ");
+
+    cursor = psListIteratorAlloc(set
+                                 ->list, 0, false);
+
+    // find column name
+    while ((item = psListGetAndIncrement(cursor))) {
+        // + column name + _ + = + _ + ?
+        psStringAppend(&query, "%s = ?", item->name);
+
+        // + ", " after every column declaration except the last one
+        if (!cursor->offEnd) {
+            psStringAppend(&query, ",  ");
+        }
+    }
+
+    psFree(cursor);
+
+    return query;
+}
+
+
+// lookup table functions
+/*****************************************************************************/
+
+static psElemType psDBMySQLToPType(enum enum_field_types type, unsigned int flags)
+{
+    psHash          *mysqlToSQLTable;   // type lookup table
+    psHash          *sqlToPSTable;      // type lookup table
+    char            *key;               // hash tmp value
+    char            *value;             // hash tmp value
+    char            *sqlType;           // copy of lookup table result
+    psU32           pType;              // psElemType of a field
+
+    mysqlToSQLTable = psDBGetMySQLToSQLTable();
+
+    // lookup MySQL column type
+    key     = psDBIntToString((psU64)type);
+    sqlType = psHashLookup(mysqlToSQLTable, key);
+    psFree(key);
+    psFree(mysqlToSQLTable);
+
+    if (!sqlType) {
+        psError(PS_ERR_UNEXPECTED_NULL, true, "type lookup failed.");
+        return -1;
+    }
+
+    // MySQL column types can not be directly translated to PS
+    // types as the the mysql types do not tell you if the value is
+    // signed or unsigned.  The result is this ugly conversion from
+    // mysql -> ascii -> ptype
+    if (flags & UNSIGNED_FLAG) {
+        psStringPrepend(&sqlType, "UNSIGNED ");
+    }
+
+    //psLogMsg( __func__, PS_LOG_INFO, "sqlType=[%s]\n", sqlType );
+
+    // convert MySQL type to PS type
+    sqlToPSTable = psDBGetSQLToPTypeTable();
+    value = psHashLookup(sqlToPSTable, sqlType);
+    psFree(sqlToPSTable);
+
+    if (!value) {
+        psError(PS_ERR_UNEXPECTED_NULL, true, "type lookup failed.");
+
+        return -1;
+    }
+
+    pType = (psU32)atol(value);
+
+    return pType;
+}
+
+static char *psDBPTypeToSQL(psElemType pType)
+{
+    psHash          *pTypeToSQLTable;   // type lookup table
+    char            *key;               // hash tmp value
+    char            *sqlType;             // hash tmp value
+
+    pTypeToSQLTable = psDBGetPTypeToSQLTable();
+
+    key = psDBIntToString((psU64)pType);
+    sqlType = psHashLookup(pTypeToSQLTable, key);
+    psFree(key);
+    psFree(pTypeToSQLTable);
+
+    if (!sqlType) {
+        psError(PS_ERR_UNEXPECTED_NULL, true, "type lookup failed.");
+
+        return NULL;
+    }
+
+    psMemIncrRefCounter(sqlType);
+
+    return sqlType;
+}
+
+static mysqlType *psDBPTypeToMySQL(psElemType pType)
+{
+    psHash          *pTypeToMySQLTable; // type lookup table
+    char            *key;               // hash tmp value
+    mysqlType       *mType;             // mysqlType struct to return
+
+    pTypeToMySQLTable = psDBGetPTypeToMySQLTable();
+
+    key = psDBIntToString((psU64)pType);
+    mType = psHashLookup(pTypeToMySQLTable, key);
+    psFree(key);
+    psFree(pTypeToMySQLTable);
+
+    if (!mType) {
+        psError(PS_ERR_UNEXPECTED_NULL, true, "type lookup failed.");
+
+        return NULL;
+    }
+
+    psMemIncrRefCounter(mType);
+
+    return mType;
+}
+
+static psHash *psDBGetPTypeToSQLTable(void)
+{
+    static psHash   *lookupTable = NULL;
+
+    if (!lookupTable) {
+        lookupTable = psHashAlloc(14);
+
+        // no support for CHAR, TEXT or GLOB
+        psDBAddToLookupTable(lookupTable, PS_TYPE_S8,  "TINYINT");
+        psDBAddToLookupTable(lookupTable, PS_TYPE_S16, "SMALLINT");
+        psDBAddToLookupTable(lookupTable, PS_TYPE_S32, "INT");
+        psDBAddToLookupTable(lookupTable, PS_TYPE_S64, "BIGINT");
+        psDBAddToLookupTable(lookupTable, PS_TYPE_U8,  "UNSIGNED TINYINT");
+        psDBAddToLookupTable(lookupTable, PS_TYPE_U16, "UNSIGNED SMALLINT");
+        psDBAddToLookupTable(lookupTable, PS_TYPE_U32, "UNSIGNED INT");
+        psDBAddToLookupTable(lookupTable, PS_TYPE_U64, "UNSIGNED BIGINT");
+        psDBAddToLookupTable(lookupTable, PS_TYPE_F32, "FLOAT");
+        psDBAddToLookupTable(lookupTable, PS_TYPE_F64, "DOUBLE");
+        psDBAddToLookupTable(lookupTable, PS_TYPE_C32, "PS_TYPE_C32 is not supported");
+        psDBAddToLookupTable(lookupTable, PS_TYPE_C64, "PS_TYPE_C64 is not supported");
+        psDBAddToLookupTable(lookupTable, PS_TYPE_BOOL,"BOOLEAN");
+        psDBAddToLookupTable(lookupTable, PS_META_STR, "BLOB");
+    }
+
+    // simulate true ref counting
+    psMemIncrRefCounter(lookupTable);
+
+    return lookupTable;
+}
+
+static void psDBPTypeToSQLTableCleanup(void)
+{
+    psHash          *lookupTable;
+
+    lookupTable = psDBGetPTypeToSQLTable();
+
+    psMemDecrRefCounter(lookupTable);
+    psFree(lookupTable);
+}
+
+static psHash *psDBGetSQLToPTypeTable(void)
+{
+    static psHash   *lookupTable = NULL;
+    psHash          *psToSQLTable;
+    psList          *list;
+    psListIterator  *cursor;
+    char            *key;
+    char            *value;
+
+    if (!lookupTable) {
+        // invert the PSToSQL table
+        psToSQLTable = psDBGetPTypeToSQLTable();
+        lookupTable = psHashAlloc(psToSQLTable->nbucket);
+
+        list = psHashKeyList(psToSQLTable);
+        cursor = psListIteratorAlloc(list, 0, false);
+
+        while ((key = psListGetAndIncrement(cursor))) {
+            value = psHashLookup(psToSQLTable, key);
+            if (!strcmp(value, "BLOB")) {
+                continue; // ignore reverse BLOB mapping, fill in below
+            }
+            // switch key and value
+            psHashAdd(lookupTable, value, key);
+        }
+
+        value = psDBIntToString((psU64)PS_META_STR);
+        psHashAdd(lookupTable, "VARCHAR", value);
+        psHashAdd(lookupTable, "BLOB",    value);
+        psHashAdd(lookupTable, "TEXT",    value);
+        psFree(value);
+
+        // DECIMAL does not exist in the pType to SQL table
+        value = psDBIntToString(0);
+        psHashAdd(lookupTable, "DECIMAL", value);
+        psFree(value);
+
+        psFree(cursor);
+        psFree(list);
+        psFree(psToSQLTable);
+    }
+
+    // simulate true ref counting
+    psMemIncrRefCounter(lookupTable);
+
+    return lookupTable;
+}
+
+static void psDBSQLToPTypeTableCleanup(void)
+{
+    psHash          *lookupTable;
+
+    lookupTable = psDBGetSQLToPTypeTable();
+
+    psMemDecrRefCounter(lookupTable);
+    psFree(lookupTable);
+}
+
+static psHash *psDBGetMySQLToSQLTable(void)
+{
+    static psHash   *lookupTable = NULL;
+
+    if (!lookupTable) {
+        lookupTable = psHashAlloc(20);
+
+        psDBAddToLookupTable(lookupTable, FIELD_TYPE_TINY,      "TINYINT");
+        psDBAddToLookupTable(lookupTable, FIELD_TYPE_SHORT,     "SMALLINT");
+        psDBAddToLookupTable(lookupTable, FIELD_TYPE_LONG,      "INT");
+        psDBAddToLookupTable(lookupTable, FIELD_TYPE_INT24,     "MEDIUMINT");
+        psDBAddToLookupTable(lookupTable, FIELD_TYPE_LONGLONG,  "BIGINT");
+        psDBAddToLookupTable(lookupTable, FIELD_TYPE_DECIMAL,   "DECIMAL");
+        psDBAddToLookupTable(lookupTable, FIELD_TYPE_FLOAT,     "FLOAT");
+        psDBAddToLookupTable(lookupTable, FIELD_TYPE_DOUBLE,    "DOUBLE");
+        psDBAddToLookupTable(lookupTable, FIELD_TYPE_TIMESTAMP, "TIMESTAMP");
+        psDBAddToLookupTable(lookupTable, FIELD_TYPE_DATE,      "DATE");
+        psDBAddToLookupTable(lookupTable, FIELD_TYPE_TIME,      "TIME");
+        psDBAddToLookupTable(lookupTable, FIELD_TYPE_DATETIME,  "DATETIME");
+        psDBAddToLookupTable(lookupTable, FIELD_TYPE_YEAR,      "YEAR");
+        psDBAddToLookupTable(lookupTable, FIELD_TYPE_STRING,    "CHAR");
+        psDBAddToLookupTable(lookupTable, FIELD_TYPE_VAR_STRING,"VARCHAR");
+        psDBAddToLookupTable(lookupTable, FIELD_TYPE_BLOB,      "BLOB");
+        psDBAddToLookupTable(lookupTable, FIELD_TYPE_SET,       "SET");
+        psDBAddToLookupTable(lookupTable, FIELD_TYPE_ENUM,      "ENUM");
+        psDBAddToLookupTable(lookupTable, FIELD_TYPE_NULL,      "NULL-type");
+        psDBAddToLookupTable(lookupTable, FIELD_TYPE_CHAR,      "TINYINT");
+    }
+
+    // simulate true ref counting
+    psMemIncrRefCounter(lookupTable);
+
+    return lookupTable;
+}
+
+static void psDBMySQLToSQLTableCleanup(void)
+{
+    psHash          *lookupTable;
+
+    lookupTable = psDBGetMySQLToSQLTable();
+
+    psMemDecrRefCounter(lookupTable);
+    psFree(lookupTable);
+}
+
+static psHash *psDBGetPTypeToMySQLTable(void)
+{
+    static psHash   *lookupTable = NULL;
+
+    if (!lookupTable) {
+        lookupTable = psHashAlloc(14);
+
+        psDBAddVoidToLookupTable(lookupTable, PS_TYPE_S8,     psDBMySQLTypeAlloc(MYSQL_TYPE_TINY,       false));
+        psDBAddVoidToLookupTable(lookupTable, PS_TYPE_S16,    psDBMySQLTypeAlloc(MYSQL_TYPE_SHORT,      false));
+        psDBAddVoidToLookupTable(lookupTable, PS_TYPE_S32,    psDBMySQLTypeAlloc(MYSQL_TYPE_LONG,       false));
+        psDBAddVoidToLookupTable(lookupTable, PS_TYPE_S64,    psDBMySQLTypeAlloc(MYSQL_TYPE_LONGLONG,   false));
+        psDBAddVoidToLookupTable(lookupTable, PS_TYPE_U8,     psDBMySQLTypeAlloc(MYSQL_TYPE_TINY,       true));
+        psDBAddVoidToLookupTable(lookupTable, PS_TYPE_U16,    psDBMySQLTypeAlloc(MYSQL_TYPE_SHORT,      true));
+        psDBAddVoidToLookupTable(lookupTable, PS_TYPE_U32,    psDBMySQLTypeAlloc(MYSQL_TYPE_LONG,       true));
+        psDBAddVoidToLookupTable(lookupTable, PS_TYPE_U64,    psDBMySQLTypeAlloc(MYSQL_TYPE_LONGLONG,   true));
+        psDBAddVoidToLookupTable(lookupTable, PS_TYPE_F32,    psDBMySQLTypeAlloc(MYSQL_TYPE_FLOAT,      false));
+        psDBAddVoidToLookupTable(lookupTable, PS_TYPE_F64,    psDBMySQLTypeAlloc(MYSQL_TYPE_DOUBLE,     false));
+        // bogus type
+        psDBAddVoidToLookupTable(lookupTable, PS_TYPE_C32,    psDBMySQLTypeAlloc(MYSQL_TYPE_VAR_STRING, false));
+        // bogus type
+        psDBAddVoidToLookupTable(lookupTable, PS_TYPE_C64,    psDBMySQLTypeAlloc(MYSQL_TYPE_VAR_STRING, false));
+        psDBAddVoidToLookupTable(lookupTable, PS_TYPE_BOOL,   psDBMySQLTypeAlloc(MYSQL_TYPE_TINY,       true));
+        // XXX: removed PS_TYPE_PTR, can this be removed too?
+        // psDBAddVoidToLookupTable(lookupTable, PS_TYPE_PTR,    psDBMySQLTypeAlloc(MYSQL_TYPE_VAR_STRING, false));
+
+        psDBAddVoidToLookupTable(lookupTable, PS_META_STR,    psDBMySQLTypeAlloc(MYSQL_TYPE_VAR_STRING, false));
+        psDBAddVoidToLookupTable(lookupTable, PS_META_VEC,    psDBMySQLTypeAlloc(MYSQL_TYPE_VAR_STRING, false));
+        psDBAddVoidToLookupTable(lookupTable, PS_META_IMG,    psDBMySQLTypeAlloc(MYSQL_TYPE_VAR_STRING, false));
+        psDBAddVoidToLookupTable(lookupTable, PS_META_HASH,   psDBMySQLTypeAlloc(MYSQL_TYPE_VAR_STRING, false));
+        psDBAddVoidToLookupTable(lookupTable, PS_META_LOOKUPTABLE,
+                                 psDBMySQLTypeAlloc(MYSQL_TYPE_VAR_STRING, false));
+        psDBAddVoidToLookupTable(lookupTable, PS_META_JPEG,   psDBMySQLTypeAlloc(MYSQL_TYPE_VAR_STRING, false));
+        psDBAddVoidToLookupTable(lookupTable, PS_META_PNG,    psDBMySQLTypeAlloc(MYSQL_TYPE_VAR_STRING, false));
+        psDBAddVoidToLookupTable(lookupTable, PS_META_ASTROM, psDBMySQLTypeAlloc(MYSQL_TYPE_VAR_STRING, false));
+        psDBAddVoidToLookupTable(lookupTable, PS_META_UNKNOWN,psDBMySQLTypeAlloc(MYSQL_TYPE_VAR_STRING, false));
+    }
+
+    // simulate true ref counting
+    psMemIncrRefCounter(lookupTable);
+
+    return lookupTable;
+}
+
+static void psDBPTypeToMySQLTableCleanup(void)
+{
+    psHash          *lookupTable;
+
+    lookupTable = psDBGetPTypeToMySQLTable();
+
+    psMemDecrRefCounter(lookupTable);
+    psFree(lookupTable);
+}
+
+static psPtr psDBMySQLTypeAlloc(enum enum_field_types type, bool isUnsigned)
+{
+    mysqlType       *mType;
+
+    mType = psAlloc(sizeof(mysqlType));
+    mType->type       = type;
+    mType->isUnsigned = isUnsigned;
+
+    return mType;
+}
+
+static void psDBAddToLookupTable(psHash *lookupTable, psU32 type, const char *string)
+{
+    char            *key;
+    char            *value;
+
+    key = psDBIntToString((psU64)type);
+    value = psStringCopy(string);
+
+    psHashAdd(lookupTable, key, value);
+
+    psFree(key);
+    psFree(value);
+}
+
+static void psDBAddVoidToLookupTable(psHash *lookupTable, psU32 type, psPtr value)
+{
+    char            *key;
+
+    key = psDBIntToString((psU64)type);
+
+    psHashAdd(lookupTable, key, value);
+
+    // destructive of value parameter
+    psFree(value);
+    psFree(key);
+}
+
+
+// pType utility functions
+/*****************************************************************************/
+
+#define PS_NAN_ALLOC(dest, type, nan) \
+dest = psAlloc(sizeof(type)); \
+*(type *)dest = nan;
+
+static psPtr psDBGetPTypeNaN(psElemType pType)
+{
+    psPtr           myNaN;
+
+    switch (pType) {
+    case PS_TYPE_S8:
+        PS_NAN_ALLOC(myNaN, psS8, PS_MAX_S8);
+        break;
+    case PS_TYPE_S16:
+        PS_NAN_ALLOC(myNaN, psS16, PS_MAX_S16);
+        break;
+    case PS_TYPE_S32:
+        PS_NAN_ALLOC(myNaN, psS32, PS_MAX_S32);
+        break;
+    case PS_TYPE_S64:
+        PS_NAN_ALLOC(myNaN, psS64, PS_MAX_S64);
+        break;
+    case PS_TYPE_U8:
+        PS_NAN_ALLOC(myNaN, psU8, PS_MAX_U8);
+        break;
+    case PS_TYPE_U16:
+        PS_NAN_ALLOC(myNaN, psU16, PS_MAX_U16);
+        break;
+    case PS_TYPE_U32:
+        PS_NAN_ALLOC(myNaN, psU32, PS_MAX_U32);
+        break;
+    case PS_TYPE_U64:
+        PS_NAN_ALLOC(myNaN, psU64, PS_MAX_U64);
+        break;
+    case PS_TYPE_F32:
+        PS_NAN_ALLOC(myNaN, psF32, NAN);
+        break;
+    case PS_TYPE_F64:
+        PS_NAN_ALLOC(myNaN, psF64, NAN);
+        break;
+    case PS_TYPE_C32:
+        // this is a bogus SQL type
+        PS_NAN_ALLOC(myNaN, psC32, NAN);
+        break;
+    case PS_TYPE_C64:
+        // this is a bogus SQL type
+        PS_NAN_ALLOC(myNaN, psC64, NAN);
+        break;
+    case PS_TYPE_BOOL:
+        // what is NaN for a bool?
+        break;
+    }
+
+    return myNaN;
+}
+
+#define PS_IS_NAN(type, data, nan) *(type *)data == nan
+
+static bool psDBIsPTypeNaN(psElemType pType, psPtr data)
+{
+    bool    isNaN;
+
+    switch (pType) {
+    case PS_TYPE_S8:
+        isNaN = PS_IS_NAN(psS8, data, PS_MAX_S8);
+        break;
+    case PS_TYPE_S16:
+        isNaN = PS_IS_NAN(psS16, data, PS_MAX_S16);
+        break;
+    case PS_TYPE_S32:
+        isNaN = PS_IS_NAN(psS32, data, PS_MAX_S32);
+        break;
+    case PS_TYPE_S64:
+        isNaN = PS_IS_NAN(psS64, data, PS_MAX_S64);
+        break;
+    case PS_TYPE_U8:
+        isNaN = PS_IS_NAN(psU8, data, PS_MAX_U8);
+        break;
+    case PS_TYPE_U16:
+        isNaN = PS_IS_NAN(psU16, data, PS_MAX_U16);
+        break;
+    case PS_TYPE_U32:
+        isNaN = PS_IS_NAN(psU32, data, PS_MAX_U32);
+        break;
+    case PS_TYPE_U64:
+        isNaN = PS_IS_NAN(psU64, data, PS_MAX_U64);
+        break;
+    case PS_TYPE_F32:
+        isNaN = PS_IS_NAN(psF32, data, NAN);
+        break;
+    case PS_TYPE_F64:
+        isNaN = PS_IS_NAN(psF64, data, NAN);
+        break;
+    case PS_TYPE_C32:
+        // this is a bogus SQL type
+        isNaN = PS_IS_NAN(psC32, data, NAN);
+        break;
+    case PS_TYPE_C64:
+        // this is a bogus SQL type
+        isNaN = PS_IS_NAN(psC64, data, NAN);
+        break;
+    case PS_TYPE_BOOL:
+        // what is NaN for a bool?
+        break;
+    }
+
+    return isNaN;
+}
+
+
+// string utility functions
+/*****************************************************************************/
+
+static char *psDBIntToString(psU64 n)
+{
+    char            *string;
+    size_t          length;
+
+    // length of string + \0
+    // if n is 0, length is 1 char + \0
+    length = n ? (size_t)log10((double)n) + 1
+             : 2;
+    string = psAlloc(length);
+    sprintf(string, "%li", (long int)n);
+
+    return string;
+}
+
+static ssize_t psStringAppend(char **dest, const char *format, ...)
+{
+    va_list         args;
+    size_t          length;             // complete string length (sans \0)
+    size_t          oldLength;          // original string length (sans \0)
+    ssize_t         tailLength;         // length of string to append
+
+    if (!*dest) {
+        *dest = psStringCopy("");
+        oldLength = 0;
+    } else {
+        // size of existing string
+        oldLength = strlen(*dest);
+    }
+
+    // find the size of the string to append
+    va_start(args, format);
+    // C99 guarentees vsnprintf() to work as expected with size = 0
+    tailLength = vsnprintf(*dest, 0, format, args);
+    va_end(args);
+
+    // if the new tail is zero length, return the length of the old string.  if
+    // it's a format error, return the error code.
+    if (tailLength < 1) {
+        return tailLength == 0 ? oldLength : tailLength;
+    }
+
+    // new string length (sans \0)
+    length = oldLength + tailLength;
+
+    // realloc string to string + tail + \0
+    *dest = psRealloc(*dest, length + 1);
+
+    // append tail + \0
+    va_start(args, format);
+    vsnprintf(*dest + oldLength, tailLength + 1, format, args);
+    va_end(args);
+
+    return length;
+}
+
+static ssize_t psStringPrepend(char **dest, const char *format, ...)
+{
+    va_list         args;
+    size_t          length;             // complete string length (sans \0)
+    ssize_t         headLength;         // length of string to prepend
+    char            *oldDest;           // copy of original string
+
+    if (!*dest) {
+        // makes the string backup and concatination pointless
+        *dest = psStringCopy("");
+        length = 0;
+    } else {
+        // size of existing string
+        length = strlen(*dest);
+    }
+
+    // find the size of the string to prepend
+    va_start(args, format);
+    // C99 guarentees vsnprintf() to work as expected with size = 0
+    headLength = vsnprintf(*dest, 0, format, args);
+    va_end(args);
+
+    // if the new head is zero length, return the length of the old string.  if
+    // it's a format error, return the error code.
+    if (headLength < 1) {
+        return headLength == 0 ? length : headLength;
+    }
+
+    // backup original string
+    oldDest = psStringCopy(*dest);
+
+    // new string length (sans \0)
+    length += headLength;
+
+    // realloc string to head + string + \0
+    *dest = psRealloc(*dest, length + 1);
+
+    // copy the new head to the beginning of string
+    va_start(args, format);
+    vsnprintf(*dest, length + 1, format, args);
+    va_end(args);
+
+    // append the original string
+    strncat(*dest, oldDest, length + 1);
+
+    psFree(oldDest);
+
+    return length;
+}
+
+#endif // BUILD_PSDB
Index: /tags/ipp-1-X/bug123/psLib/src/dataIO/psDB.h
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/dataIO/psDB.h	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/dataIO/psDB.h	(revision 22331)
@@ -0,0 +1,267 @@
+/** @file  psDB.h
+ *
+ *  @brief database types and functions
+ *
+ *  This file defines the abstract database type and functions that
+ *  perform basic database operations.
+ *
+ *  @ingroup DataBase
+ *
+ *  @author Joshua Hoblitt
+ *
+ *  @version $Revision: 1.5 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-03-31 23:01:46 $
+ *
+ *  Copyright 2005 Joshua Hoblitt, University of Hawaii
+ */
+
+#ifndef PS_DB_H
+#define PS_DB_H 1
+
+#ifdef BUILD_PSDB
+
+#include "psType.h"
+#include "psMetadata.h"
+
+/// @addtogroup DataBase
+/// @{
+
+/** Database handle
+ *
+ *  An opaque object representing a database connection.
+ *
+ */
+typedef struct
+{
+    void* mysql;   ///< MySQL database handle
+}
+psDB;
+
+/** Opens a new database connection
+ *
+ *  @return A new psDB object if the database connection is successful or NULL on
+ *  failure.
+ */
+psDB *psDBInit(
+    const char *host,                   ///< Database server hostname
+    const char *user,                   ///< Database username
+    const char *passwd,                 ///< Database password
+    const char *dbname                  ///< Database namespace
+);
+
+/** Closes a database connection
+ */
+void psDBCleanup(
+    psDB *dbh                           ///< Database handle
+);
+
+/** Creates a new database namespace
+ *
+ * @return true on success
+ */
+bool psDBCreate(
+    psDB *dbh,                          ///< Database handle
+    const char *dbname                  ///< New database namespace
+);
+
+/** Changes the current database namespace
+ *
+ * @return true on success
+ */
+bool psDBChange(
+    psDB *dbh,                          ///< Database handle
+    const char *dbname                  ///< Database namespace
+);
+
+/** Drops a database namespace
+ *
+ * @return true on success
+ */
+bool psDBDrop(
+    psDB *dbh,                          ///< Database handle
+    const char *dbname                  ///< Database namespace
+);
+
+/** Creates a new database table
+ *
+ * This function generates and executes the SQL needed to create a table named
+ * "tableName", with the column names and data types as described in "md".  Each
+ * data item in the psMetadata collection represents a single table field.  The
+ * name of the field is given by the name of the psMetadataItem and the data
+ * type is give by the psMetadataItem.type and psMetadataItem.ptype entries.  A
+ * lookup table should be used to convert from PSLib types into MySQL
+ * compatible SQL data types.  For example, a PS_META_STR would map to an SQL99
+ * varchar.  If the value of type is PS_META_STR then the psMetadataItem.data
+ * element is set to a string with the length for the field written as a text
+ * string.  The value of the psMetadataItem.data element is unused for the
+ * PS_META_PRIMITIVE types.  Other psMetadata types beyond PS_META_STR and
+ * PS_META_PRIMITIVE are not allowed in a table definition.  
+ *
+ * Database indexes can be specified setting the "comment" field to "Primary
+ * Key" or "Key".  Comments are otherwise ignored.
+ *
+ * @return true on success
+ */
+bool psDBCreateTable(
+    psDB *dbh,                          ///< Database handle
+    const char *tableName,              ///< Table name
+    psMetadata *md                      ///< Column names, types, and indexes
+);
+
+/** Deletes a database table
+ *
+ * @return true on success
+*/
+bool psDBDropTable(
+    psDB *dbh,                          ///< Database handle
+    const char *tableName               ///< Table name
+);
+
+/** Selects a column from a table
+ *
+ * This function generates and executes the SQL needed to select an entire
+ * column from a table or up to "limit" rows from it.  If "limit" is 0, the
+ * entire range is returned.
+ *
+ * @return A psArray of strings or NULL on failure
+ */
+psArray *psDBSelectColumn(
+    psDB *dbh,                          ///< Database handle
+    const char *tableName,              ///< Table name
+    const char *col,                    ///< Column name
+    const psU64 limit                   ///< Maximum number of elements to return
+);
+
+/** Selects a column from a table and casts it to a given type
+ *
+ * This function generates and executes the SQL needed to select an entire
+ * column from a table or up to "limit" rows from it.  If "limit" is 0, the
+ * entire range is returned.  The data in the column is cast to to "pType".
+ *
+ * @return A psVector or NULL on failure
+ */
+psVector *psDBSelectColumnNum(
+    psDB *dbh,                          ///< Database handle
+    const char *tableName,              ///< Table name
+    const char *col,                    ///< Column name
+    psElemType pType,                   ///< Resulting psVector type
+    const psU64 limit                   ///< Maximum number of elements to return
+);
+
+/** Selects a set of rows from a table
+ *
+ * This function returns rows from the specified table which match the
+ * restrictions given by "where".  The restrictions are specified as field /
+ * value pairs.  The psMetadata collection "where" must consist of valid
+ * database fields.  The selected rows are returned as a psArray of psMetadata
+ * values, one per row.
+ *
+ * Currently, the "where" specification only supports the PS_META_STR type.
+ * The string value can be a SQL match pattern, e.g. "%foo%", or an empty
+ * string, e.g. "", to match NULL field values.
+ *
+ * @return A psArray of psMetadata or NULL on failure
+ */
+psArray *psDBSelectRows(
+    psDB *dbh,                          ///< Database handle
+    const char *tableName,              ///< Table name
+    psMetadata *where,                  ///< Row match criteria
+    const psU64 limit                   ///< Maximum number of elements to return
+);
+
+/** Insert a single row into a table
+ *
+ * This function inserts the data from "row" into "tableName".
+ *
+ * The "row" specification uses the psMetadataItem name as the column name.
+ * The field values may be specified in any order.  psMetadata types beyond
+ * PS_META_STR and PS_META_PRIMITIVE are not supported.  If fields are
+ * specified in "row" that do not exist in "tableName", the insert will fail.
+ *
+ * @return true on success
+ */
+bool psDBInsertOneRow(
+    psDB *dbh,                          ///< Database handle
+    const char *tableName,              ///< Table name
+    psMetadata *row                     ///< Row description
+);
+
+/** Insert a set of rows into a table
+ *
+ * This function inserts the data from "rowSet" into "tableName".
+ *
+ * "rowSet" is a psArray of psMetadata containing row specifications identical to
+ * those used in psDBInsertOneRow().
+ *
+ * @return true on success
+ */
+bool psDBInsertRows(
+    psDB *dbh,                          ///< Database handle
+    const char *tableName,              ///< Table name
+    psArray *rowSet                     ///< Set of rows to insert
+);
+
+/** Retrieves all rows from a table
+ *
+ * This function fetches all rows as an psArray of psMetadata.  The rows are in
+ * the same psMetadata format as used in psDBInsertOneRow() & psDBInsertRows().
+ *
+ * @return A psArray of psMetadata or NULL on failure
+ */
+psArray *psDBDumpRows(
+    psDB *dbh,                          ///< Database handle
+    const char *tableName               ///< Table name
+);
+
+/** Retrieves all columns from a table
+ *
+ * This function fetches all columns, as either a psVector or a psArray
+ * depending on whether or not the column is numeric, and return them in a
+ * psMetadata structure where psMetadataItem.name contains the column's name.
+ *
+ * @return A psMetadata containing either a psArrays or psVector per column
+ */
+psMetadata *psDBDumpCols(
+    psDB *dbh,                          ///< Database handle
+    const char *tableName               ///< Table name
+);
+
+/** Updates the field values, as specified, in a table
+ *
+ * This function updates the fields contained in "values" in the row(s) that
+ * have a field with the value indicated by "where".  Where "where" is in the
+ * same format as used in psDBSelectRows().
+ *
+ * The "values" specification uses the same format as the row specification
+ * used in psDBInsertOneRow(), etc.
+ *
+ * @return The number of rows modified or a negative value on error
+ */
+psS64 psDBUpdateRows(
+    psDB *dbh,                          ///< Database handle
+    const char *tableName,              ///< Table name
+    psMetadata *where,                  ///< Row match criteria
+    psMetadata *values                  ///< new field values
+);
+
+/** Deletes rows, as specified, in a table
+ *
+ * Delete the rows that are matched by "where" using the same semantics for
+ * "where" as in psDBUpdateRow().
+ *
+ * If "where" is NULL, all rows in the table will be removed and regardless of
+ * the number of rows that were dropped, only 1 will be returned on success.
+ *
+ * @return The number of rows removed or a negative value on error
+ */
+psS64 psDBDeleteRows(
+    psDB *dbh,                          ///< Database handle
+    const char *tableName,             ///< Table name
+    psMetadata *where                  ///< Row match criteria
+);
+
+/// @}
+
+#endif // BUILD_PSDB
+
+#endif // PS_DB_H
Index: /tags/ipp-1-X/bug123/psLib/src/dataIO/psFileUtilsErrors.dat
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/dataIO/psFileUtilsErrors.dat	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/dataIO/psFileUtilsErrors.dat	(revision 22331)
@@ -0,0 +1,58 @@
+#
+#  This file is used to generate psFileUtilsErrors.h content
+#
+#  Format is:
+#  ERRORNAME(one word)    ERROR_TEXT
+#
+#  N.B. in code, the ERRORNAME appears as PS_ERRORTEXT_ERRORNAME
+####################################################################
+psLookupTable_FILE_NOT_FOUND           Failed to open file %s.
+psLookupTable_PARSE_VALUE              Unable to parse string, %s on line %lld.
+psLookupTable_PARSE_TYPE               Unable to parse type, %s on line %lld.
+psLookupTable_PARSE_GENERAL            Unable to read lookup table item, %s on line %lld
+psLookupTable_INTERPOLATE_HIGH         High index too big, %d.
+psLookupTable_INTERPOLATE_LOW          Low index too small, %d.
+psLookupTable_DIVIDE_BY_ZERO           Divide by zero error during interpolation.
+psLookupTable_INVALID_TYPE             Invalid psLookupType, %d;
+psLookupTable_TABLE_INVALID            Lookup table is invalid.
+#
+psFits_NULL                            The input psFits object can not NULL.
+psFits_FILENAME_INVALID                Could not open file,'%s'.\nCFITSIO Error: %s
+psFits_FILENAME_NULL                   Specified filename can not be NULL.
+psFits_EXTNAME_NULL                    Specified extension name can not be NULL.
+psFits_EXTNAME_INVALID                 Could not find HDU '%s' in file %s.\nCFITSIO Error: %s
+psFits_EXTNUM_ABS_MOVE_FAILED          Could not move to specified HDU #%d in file %s.\nCFITSIO Error: %s
+psFits_EXTNUM_REL_MOVE_FAILED          Could not move %d HDUs from current position in file %s.\nCFITSIO Error: %s
+psFits_GET_EXTNUM_FAILED               Failed to determine the current HDU number in file %s.\nCFITSIO Error: %s
+psFits_GETNUMHDUS_FAILED               Failed to determine the number of HDUs in file %s.\nCFITSIO Error: %s
+psFits_GETHDUTYPE_FAILED               Failed to determine an HDU type in file %s.\nCFITSIO Error: %s
+psFits_GETNUMKEYS_FAILED               Failed to determine the number of header keys in file %s.\nCFITSIO Error: %s
+psFits_GET_TABLE_SIZE_FAILED           Failed to determine the size of the current HDU table.\nCFITSIO Error: %s
+psFits_FILENAME_CREATE_FAILED          Could not create file,'%s'.\nCFITSIO Error: %s
+psFits_TYPE_UNSUPPORTED                Specified type, %s, is not supported.
+psFits_CREATE_HDU_FAILED               Could not create new image HDU in file,'%s'.\nCFITSIO Error: %s
+psFits_GET_HDU_TYPE_FAILED             Could not determine the HDU type.\nCFITSIO Error: %s
+psFits_NOT_IMAGE_TYPE                  Current FITS HDU type must be an image.
+psFits_NOT_TABLE_TYPE                  Current FITS HDU type must be a table.
+psFits_TABLE_EMPTY                     Can't create a table without any rows.
+psFits_CFITSIO_ERROR                   CFITSIO error: %s
+psFits_METATYPE_INVALID                Specified FITS metadata type, %c, is not supported.
+psFits_METADATA_ADD_FAILED             Failed to add metadata item, %s.
+psFits_WRITE_FAILED                    Could not write data to file,'%s'.\nCFITSIO Error: %s
+psFits_IMAGE_NULL                      The input psImage was NULL.  Need a non-NULL psImage for operation to be performed.
+psFits_METADATA_NULL                   The input psMetadata was NULL.  Need a non-NULL psMetadata for operation to be performed.
+psFits_METADATA_PTYPE_UNSUPPORTED      A metadata item's primative type, %d, is not supported.
+psFits_ROW_INVALID                     Specified row, %d, is not valid for current table of %d rows.
+psFits_GET_TABLE_ELEMENT               Failed to retrieve table element (%d,%d).\nCFITSIO Error: %s
+psFits_FIND_COLUMN                     Specified column, %s, was not found.\nCFITSIO Error: %s
+psFits_GET_COLTYPE                     Could not determine the datatype of the table column.\nCFITSIO Error: %s
+psFits_TABLE_READ_COL                  Failed to read table column.\nCFITSIO Error: %s
+psFits_DATATYPE_UNKNOWN                Could not determine image data type.\nCFITSIO Error: %s
+psFits_IMAGE_DIM_UNKNOWN               Could not determine image dimensions.\nCFITSIO Error: %s
+psFits_IMAGE_DIMENSION_UNSUPPORTED     Image number of dimensions, %d, is not valid.  Only two or three dimensions supported for FITS I/O.
+psFits_IMAGE_SIZE_UNKNOWN              Could not determine image size.\nCFITSIO Error: %s
+psFits_FITS_TYPE_UNSUPPORTED           FITS image type, BITPIX=%d, is not supported.
+psFits_READ_FAILED                     Reading FITS file failed.\nCFITSIO Error: %s
+psFits_IMAGE_UPDATE_TYPE_MISMATCH      Can not update a %s image given a %s image.
+psFits_FITS_Z_SMALL                    Current FITS HDU has %d z-planes, but z-plane %d was specified.
+#
Index: /tags/ipp-1-X/bug123/psLib/src/dataIO/psFileUtilsErrors.h
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/dataIO/psFileUtilsErrors.h	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/dataIO/psFileUtilsErrors.h	(revision 22331)
@@ -0,0 +1,80 @@
+/** @file  psFileUtilsErrors.h
+ *
+ *  @brief Contains the error text for the dataIO functions
+ *
+ *  @ingroup ErrorHandling
+ *
+ *  @author Robert DeSonia, MHPCC
+ *
+ *  @version $Revision: 1.13 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-04-08 17:58:57 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+
+#ifndef PS_FILEUTIL_ERRORS_H
+#define PS_FILEUTIL_ERRORS_H
+
+/* N.B., lines between '//~Start' and '//~End' are automatic generated from
+ * the template following the '//~Start'.  The template is used to generate
+ * the other lines by, for each error text in psAstronomyErrors.dat, the following
+ * substitutions are made:
+ *     $1  The error text macro name (first word in the psAstronomyErrors.dat lines)
+ *     $2  The error text (rest of the line in psAstronomyErrors.dat)
+ *     $n  The order of the source line in psAstronomyErrors.dat (comments excluded)
+ * 
+ * DO NOT EDIT THE LINES BETWEEN //~Start and //~End!  ANY CHANGES WILL BE OVERWRITTEN.
+ */
+
+//~Start #define PS_ERRORTEXT_$1 "$2"
+#define PS_ERRORTEXT_psLookupTable_FILE_NOT_FOUND "Failed to open file %s."
+#define PS_ERRORTEXT_psLookupTable_PARSE_VALUE "Unable to parse string, %s on line %lld."
+#define PS_ERRORTEXT_psLookupTable_PARSE_TYPE "Unable to parse type, %s on line %lld."
+#define PS_ERRORTEXT_psLookupTable_PARSE_GENERAL "Unable to read lookup table item, %s on line %lld"
+#define PS_ERRORTEXT_psLookupTable_INTERPOLATE_HIGH "High index too big, %d."
+#define PS_ERRORTEXT_psLookupTable_INTERPOLATE_LOW "Low index too small, %d."
+#define PS_ERRORTEXT_psLookupTable_DIVIDE_BY_ZERO "Divide by zero error during interpolation."
+#define PS_ERRORTEXT_psLookupTable_INVALID_TYPE "Invalid psLookupType, %d;"
+#define PS_ERRORTEXT_psLookupTable_TABLE_INVALID "Lookup table is invalid."
+#define PS_ERRORTEXT_psFits_NULL "The input psFits object can not NULL."
+#define PS_ERRORTEXT_psFits_FILENAME_INVALID "Could not open file,'%s'.\nCFITSIO Error: %s"
+#define PS_ERRORTEXT_psFits_FILENAME_NULL "Specified filename can not be NULL."
+#define PS_ERRORTEXT_psFits_EXTNAME_NULL "Specified extension name can not be NULL."
+#define PS_ERRORTEXT_psFits_EXTNAME_INVALID "Could not find HDU '%s' in file %s.\nCFITSIO Error: %s"
+#define PS_ERRORTEXT_psFits_EXTNUM_ABS_MOVE_FAILED "Could not move to specified HDU #%d in file %s.\nCFITSIO Error: %s"
+#define PS_ERRORTEXT_psFits_EXTNUM_REL_MOVE_FAILED "Could not move %d HDUs from current position in file %s.\nCFITSIO Error: %s"
+#define PS_ERRORTEXT_psFits_GET_EXTNUM_FAILED "Failed to determine the current HDU number in file %s.\nCFITSIO Error: %s"
+#define PS_ERRORTEXT_psFits_GETNUMHDUS_FAILED "Failed to determine the number of HDUs in file %s.\nCFITSIO Error: %s"
+#define PS_ERRORTEXT_psFits_GETHDUTYPE_FAILED "Failed to determine an HDU type in file %s.\nCFITSIO Error: %s"
+#define PS_ERRORTEXT_psFits_GETNUMKEYS_FAILED "Failed to determine the number of header keys in file %s.\nCFITSIO Error: %s"
+#define PS_ERRORTEXT_psFits_GET_TABLE_SIZE_FAILED "Failed to determine the size of the current HDU table.\nCFITSIO Error: %s"
+#define PS_ERRORTEXT_psFits_FILENAME_CREATE_FAILED "Could not create file,'%s'.\nCFITSIO Error: %s"
+#define PS_ERRORTEXT_psFits_TYPE_UNSUPPORTED "Specified type, %s, is not supported."
+#define PS_ERRORTEXT_psFits_CREATE_HDU_FAILED "Could not create new image HDU in file,'%s'.\nCFITSIO Error: %s"
+#define PS_ERRORTEXT_psFits_GET_HDU_TYPE_FAILED "Could not determine the HDU type.\nCFITSIO Error: %s"
+#define PS_ERRORTEXT_psFits_NOT_IMAGE_TYPE "Current FITS HDU type must be an image."
+#define PS_ERRORTEXT_psFits_NOT_TABLE_TYPE "Current FITS HDU type must be a table."
+#define PS_ERRORTEXT_psFits_TABLE_EMPTY "Can't create a table without any rows."
+#define PS_ERRORTEXT_psFits_CFITSIO_ERROR "CFITSIO error: %s"
+#define PS_ERRORTEXT_psFits_METATYPE_INVALID "Specified FITS metadata type, %c, is not supported."
+#define PS_ERRORTEXT_psFits_METADATA_ADD_FAILED "Failed to add metadata item, %s."
+#define PS_ERRORTEXT_psFits_WRITE_FAILED "Could not write data to file,'%s'.\nCFITSIO Error: %s"
+#define PS_ERRORTEXT_psFits_IMAGE_NULL "The input psImage was NULL.  Need a non-NULL psImage for operation to be performed."
+#define PS_ERRORTEXT_psFits_METADATA_NULL "The input psMetadata was NULL.  Need a non-NULL psMetadata for operation to be performed."
+#define PS_ERRORTEXT_psFits_METADATA_PTYPE_UNSUPPORTED "A metadata item's primative type, %d, is not supported."
+#define PS_ERRORTEXT_psFits_ROW_INVALID "Specified row, %d, is not valid for current table of %d rows."
+#define PS_ERRORTEXT_psFits_GET_TABLE_ELEMENT "Failed to retrieve table element (%d,%d).\nCFITSIO Error: %s"
+#define PS_ERRORTEXT_psFits_FIND_COLUMN "Specified column, %s, was not found.\nCFITSIO Error: %s"
+#define PS_ERRORTEXT_psFits_GET_COLTYPE "Could not determine the datatype of the table column.\nCFITSIO Error: %s"
+#define PS_ERRORTEXT_psFits_TABLE_READ_COL "Failed to read table column.\nCFITSIO Error: %s"
+#define PS_ERRORTEXT_psFits_DATATYPE_UNKNOWN "Could not determine image data type.\nCFITSIO Error: %s"
+#define PS_ERRORTEXT_psFits_IMAGE_DIM_UNKNOWN "Could not determine image dimensions.\nCFITSIO Error: %s"
+#define PS_ERRORTEXT_psFits_IMAGE_DIMENSION_UNSUPPORTED "Image number of dimensions, %d, is not valid.  Only two or three dimensions supported for FITS I/O."
+#define PS_ERRORTEXT_psFits_IMAGE_SIZE_UNKNOWN "Could not determine image size.\nCFITSIO Error: %s"
+#define PS_ERRORTEXT_psFits_FITS_TYPE_UNSUPPORTED "FITS image type, BITPIX=%d, is not supported."
+#define PS_ERRORTEXT_psFits_READ_FAILED "Reading FITS file failed.\nCFITSIO Error: %s"
+#define PS_ERRORTEXT_psFits_IMAGE_UPDATE_TYPE_MISMATCH "Can not update a %s image given a %s image."
+#define PS_ERRORTEXT_psFits_FITS_Z_SMALL "Current FITS HDU has %d z-planes, but z-plane %d was specified."
+//~End
+
+#endif
Index: /tags/ipp-1-X/bug123/psLib/src/dataIO/psFits.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/dataIO/psFits.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/dataIO/psFits.c	(revision 22331)
@@ -0,0 +1,1695 @@
+/** @file  psFits.c
+ *
+ *  @brief Contains Fits I/O routines
+ *
+ *  @ingroup FileIO
+ *
+ *  @author Robert DeSonia, MHPCC
+ *
+ *  @version $Revision: 1.27 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-04-07 20:27:41 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+
+#include <unistd.h>
+
+#include "psFits.h"
+#include "string.h"
+#include "psError.h"
+#include "psFileUtilsErrors.h"
+#include "psImageExtraction.h"
+#include "psMemory.h"
+#include "psString.h"
+#include "psLogMsg.h"
+#include "psTrace.h"
+
+#define MAX_STRING_LENGTH 256  // maximum length string for FITS routines
+
+// list of FITS header keys to ignore.
+static char* standardFitsKeys[] = {
+                                      NULL
+                                  };
+
+static psElemType convertFitsToPsType(int datatype)
+{
+    switch (datatype) {
+    case TBYTE:
+        return PS_TYPE_U8;
+    case TSBYTE:
+        return PS_TYPE_S8;
+    case TSHORT:
+        return PS_TYPE_S16;
+    case TUSHORT:
+        return PS_TYPE_U16;
+    case TLONG:
+        if (sizeof(long) == 8) {
+            return PS_TYPE_S64;
+        }
+        // no break
+    case TINT:
+        return PS_TYPE_S32;
+    case TULONG:
+        if (sizeof(unsigned long) == 8) {
+            return PS_TYPE_U64;
+        }
+        // no break
+    case TUINT:
+        return PS_TYPE_U32;
+    case TLONGLONG:
+        return PS_TYPE_S64;
+    case TFLOAT:
+        return PS_TYPE_F32;
+    case TDOUBLE:
+        return PS_TYPE_F64;
+    case TCOMPLEX:
+        return PS_TYPE_C32;
+    case TDBLCOMPLEX:
+        return PS_TYPE_C64;
+    case TLOGICAL:
+        return PS_TYPE_BOOL;
+    default:
+        psError(PS_ERR_IO, true,
+                "Unknown FITS datatype, %d.",
+                datatype);
+        return 0;
+    }
+}
+
+static bool convertPsTypeToFits(psElemType type, int* bitPix, double* bZero, int* dataType)
+{
+
+    int bitpix;
+    int datatype;
+    double bzero = 0.0;
+
+    switch (type) {
+
+    case PS_TYPE_U8:
+        bitpix = BYTE_IMG;
+        datatype = TBYTE;
+        break;
+
+    case PS_TYPE_BOOL:
+    case PS_TYPE_S8:
+        bitpix = BYTE_IMG;
+        bzero = INT8_MIN;
+        datatype = TSBYTE;
+        break;
+
+    case PS_TYPE_U16:
+        bitpix = SHORT_IMG;
+        bzero = -1.0 * INT16_MIN;
+        datatype = TUSHORT;
+        break;
+
+    case PS_TYPE_S16:
+        bitpix = SHORT_IMG;
+        datatype = TSHORT;
+        break;
+
+    case PS_TYPE_U32:
+        bitpix = LONG_IMG;
+        bzero = -1.0 * INT32_MIN;
+        datatype = TUINT;
+        break;
+
+    case PS_TYPE_S32:
+        bitpix = LONG_IMG;
+        datatype = TINT;
+        break;
+
+    case PS_TYPE_F32:
+        bitpix = FLOAT_IMG;
+        datatype = TFLOAT;
+        break;
+
+    case PS_TYPE_F64:
+        bitpix = DOUBLE_IMG;
+        datatype = TDOUBLE;
+        break;
+
+    default: {
+            char* typeStr;
+            PS_TYPE_NAME(typeStr,type);
+            psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                    PS_ERRORTEXT_psFits_TYPE_UNSUPPORTED,
+                    typeStr);
+            return false;
+        }
+    }
+
+    // pass the requested parameters  (NULL parameters are not set, of course).
+    if (bitPix != NULL) {
+        *bitPix = bitpix;
+    }
+
+    if (dataType != NULL) {
+        *dataType = datatype;
+    }
+
+    if (bZero != NULL) {
+        *bZero = bzero;
+    }
+
+    return true;
+}
+
+static bool convertMetadataTypeToBinaryTForm(psMetadataType type, char** fitsType)
+{
+    switch (type) {
+    case PS_META_BOOL:
+        *fitsType = psStringCopy("1L");
+        break;
+    case PS_META_S32:
+        *fitsType = psStringCopy("1J");
+        break;
+    case PS_META_F32:
+        *fitsType = psStringCopy("1E");
+        break;
+    case PS_META_F64:
+        *fitsType = psStringCopy("1D");
+        break;
+        // XXX: Handle other types, e.g., Vectors, etc.
+    default:
+        return false;
+    }
+
+    return true;
+}
+
+static bool isHDUEmpty(const psFits* fits)
+{
+    /* check for keys - no keys means this is really an empty HDU */
+    int keysexist = -1;
+    int morekeys;
+    int status = 0;
+
+    fits_get_hdrspace(fits->p_fd, &keysexist, &morekeys, &status);
+
+    // if no keys exist and not primary HDU, this really is an empty HDU
+    if (keysexist == 0) {
+        return true;
+    }
+
+    return false;
+
+}
+
+static void fitsFree(psFits* fits)
+{
+    int status = 0;
+
+    if (fits != NULL) {
+        (void)fits_close_file(fits->p_fd, &status);
+        psFree((void*)fits->filename);
+    }
+}
+
+psFits* psFitsAlloc(const char* name)
+{
+    int status = 0;
+    fitsfile *fptr = NULL;      /* Pointer to the FITS file */
+
+    if (name == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psFits_FILENAME_NULL);
+        return NULL;
+    }
+
+    /* Open/Create the FITS file */
+    if (access(name, F_OK) == 0) {     // file exists
+        (void)fits_open_file(&fptr, name, READWRITE, &status);
+        if (fptr == NULL) { // if failed, try openning as just read-only
+            status = 0;
+            (void)fits_open_file(&fptr, name, READONLY, &status);
+        }
+        if (fptr == NULL || status != 0) {
+            char fitsErr[MAX_STRING_LENGTH];
+            fits_get_errstatus(status, fitsErr);
+            psError(PS_ERR_BAD_PARAMETER_VALUE, true,
+                    PS_ERRORTEXT_psFits_FILENAME_INVALID,
+                    name, fitsErr);
+            return NULL;
+        }
+    } else {  // file does not exist, so create.
+        (void)fits_create_file(&fptr, name, &status);
+        if (fptr == NULL || status != 0) {
+            char fitsErr[MAX_STRING_LENGTH];
+            fits_get_errstatus(status, fitsErr);
+            psError(PS_ERR_IO, true,
+                    PS_ERRORTEXT_psFits_FILENAME_CREATE_FAILED,
+                    name, fitsErr);
+            return NULL;
+        }
+    }
+
+    psFits* fits = psAlloc(sizeof(psFits));
+    fits->filename = psAlloc(strlen(name)+1);
+    fits->p_fd = fptr;
+    strcpy((char*)fits->filename,name);
+    psMemSetDeallocator(fits,(psFreeFcn)fitsFree);
+
+    return fits;
+}
+
+bool psFitsMoveExtName(const psFits* fits,
+                       const char* extname)
+{
+    int status = 0;
+
+    if (fits == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psFits_NULL);
+        return false;
+    }
+
+    if (extname == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psFits_EXTNAME_NULL);
+        return false;
+    }
+
+
+    if (fits_movnam_hdu(fits->p_fd, ANY_HDU, (char*)extname, 0, &status) != 0) {
+        char fitsErr[MAX_STRING_LENGTH];
+        fits_get_errstatus(status, fitsErr);
+        psError(PS_ERR_LOCATION_INVALID, true,
+                PS_ERRORTEXT_psFits_EXTNAME_INVALID,
+                extname, fits->filename, fitsErr);
+        return false;
+    }
+
+    return true;
+}
+
+bool psFitsMoveExtNum(const psFits* fits,
+                      int extnum,
+                      bool relative)
+{
+    if (fits == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psFits_NULL);
+        return false;
+    }
+
+    int status = 0;
+    int hdutype = 0;
+
+    if (relative) {
+        fits_movrel_hdu(fits->p_fd, extnum, &hdutype, &status);
+        if (status != 0) {
+            char fitsErr[MAX_STRING_LENGTH];
+            fits_get_errstatus(status, fitsErr);
+            psError(PS_ERR_LOCATION_INVALID, true,
+                    PS_ERRORTEXT_psFits_EXTNUM_REL_MOVE_FAILED,
+                    extnum, fits->filename, fitsErr);
+            return false;
+        }
+    } else {
+        fits_movabs_hdu(fits->p_fd, extnum+1, &hdutype, &status);
+        if (status != 0) {
+            char fitsErr[MAX_STRING_LENGTH];
+            fits_get_errstatus(status, fitsErr);
+            psError(PS_ERR_LOCATION_INVALID, true,
+                    PS_ERRORTEXT_psFits_EXTNUM_ABS_MOVE_FAILED,
+                    extnum, fits->filename, fitsErr);
+            return false;
+        }
+    }
+
+    return true;
+}
+
+int psFitsGetExtNum(const psFits* fits)
+{
+    int hdunum;
+
+    if (fits == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psFits_NULL);
+        return PS_FITS_TYPE_NONE;
+    }
+
+
+    return fits_get_hdu_num(fits->p_fd,&hdunum) - 1;
+}
+
+char* psFitsGetExtName(const psFits* fits)
+{
+    if (fits == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psFits_NULL);
+        return NULL;
+    }
+
+    int status = 0;
+    char name[MAX_STRING_LENGTH];
+
+    if (fits_read_key_str(fits->p_fd, "EXTNAME", name, NULL, &status) != 0) {
+        status = 0;
+        if (fits_read_key_str(fits->p_fd, "HDUNAME", name, NULL, &status) != 0) {
+            int num = psFitsGetExtNum(fits);
+            snprintf(name, MAX_STRING_LENGTH, "EXT-%3d",num);
+        }
+    }
+    return psStringCopy(name);
+}
+
+bool psFitsSetExtName(const psFits* fits, const char* name)
+{
+    if (fits == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psFits_NULL);
+        return false;
+    }
+
+    if (name == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psFits_EXTNAME_NULL);
+        return false;
+    }
+
+    int status = 0;
+
+    if (fits_update_key_str(fits->p_fd, "EXTNAME", (char*)name, NULL, &status) != 0) {
+        char fitsErr[MAX_STRING_LENGTH];
+        (void)fits_get_errstatus(status, fitsErr);
+        psError(PS_ERR_IO, true,
+                PS_ERRORTEXT_psFits_WRITE_FAILED,
+                fits->filename, fitsErr);
+        return false;
+    }
+
+    return true;
+}
+
+int psFitsGetSize(const psFits* fits)
+{
+    if (fits == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psFits_NULL);
+        return 0;
+    }
+
+    int num = 0;
+    int status = 0;
+
+    if (fits_get_num_hdus(fits->p_fd, &num, &status) != 0) {
+        char fitsErr[MAX_STRING_LENGTH];
+        fits_get_errstatus(status, fitsErr);
+        psError(PS_ERR_LOCATION_INVALID, true,
+                PS_ERRORTEXT_psFits_GETNUMHDUS_FAILED,
+                fits->filename, fitsErr);
+        return 0;
+    }
+
+    return num;
+}
+
+psFitsType psFitsGetExtType(const psFits* fits)
+{
+    if (fits == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psFits_NULL);
+        return PS_FITS_TYPE_NONE;
+    }
+
+    int status = 0;
+    int hdutype = PS_FITS_TYPE_NONE;
+
+    if (fits_get_hdu_type(fits->p_fd, &hdutype, &status) != 0) {
+        char fitsErr[MAX_STRING_LENGTH];
+        fits_get_errstatus(status, fitsErr);
+        psError(PS_ERR_LOCATION_INVALID, true,
+                PS_ERRORTEXT_psFits_GETHDUTYPE_FAILED,
+                fits->filename, fitsErr);
+        return PS_FITS_TYPE_NONE;
+    }
+
+    if (hdutype == PS_FITS_TYPE_IMAGE &&
+            psFitsGetExtNum(fits) > 0 &&
+            isHDUEmpty(fits)) {
+        return PS_FITS_TYPE_ANY;
+    }
+
+    return hdutype;
+}
+
+psMetadata* psFitsReadHeader(psMetadata* out,
+                             const psFits* fits)
+{
+    if (fits == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psFits_NULL);
+        return NULL;
+    }
+
+    if (out == NULL) {
+        out = psMetadataAlloc();
+        if (out == NULL) {
+            psError(PS_ERR_UNKNOWN, false,
+                    "Failed to allocate a new psMetadata container.");
+            return NULL;
+        }
+    }
+
+    // Get number of key names
+    int numKeys = 0;
+    int keyNum = 0;
+    int status = 0;
+    fits_get_hdrpos(fits->p_fd, &numKeys, &keyNum, &status);
+
+    // Get each key name. Keywords start at one.
+    char keyType;
+    char keyName[MAX_STRING_LENGTH];
+    char keyValue[MAX_STRING_LENGTH];
+    char keyComment[MAX_STRING_LENGTH];
+    psBool tempBool;
+    psBool success;
+    psBool stdKey;
+    for (int i = 1; i <= numKeys; i++) {
+
+        fits_read_keyn(fits->p_fd, i, keyName, keyValue, keyComment, &status);
+
+        stdKey = false;
+
+        int stdKeyIdx = 0;
+        while (standardFitsKeys[stdKeyIdx] != NULL && ! stdKey) {
+            if (strcmp(keyName,standardFitsKeys[stdKeyIdx++]) == 0) {
+                stdKey = true;
+            }
+        }
+
+        if (keyValue[0] != 0) { // blank values are not handled by fits_get_keytype
+            fits_get_keytype(keyValue, &keyType, &status);
+        } else {
+            keyType = 'C';
+        }
+        if (status != 0) {
+            break;
+        }
+
+        if (! stdKey) {
+            switch (keyType) {
+            case 'X': // bit
+            case 'I': // short int.
+            case 'J': // int.
+            case 'B': // byte
+                success = psMetadataAdd(out,
+                                        PS_LIST_TAIL,
+                                        keyName,
+                                        PS_META_S32 | PS_META_DUPLICATE_OK,
+                                        keyComment,
+                                        atoi(keyValue));
+                break;
+            case 'U': // unsigned int. may not fit in a psS32
+            case 'K': // long int. can't all fit in a psS32
+            case 'F':
+                success = psMetadataAdd(out,
+                                        PS_LIST_TAIL,
+                                        keyName,
+                                        PS_META_F64 | PS_META_DUPLICATE_OK,
+                                        keyComment,
+                                        atof(keyValue));
+                break;
+            case 'C':
+                // remove the single-quotes at front/end
+                if (keyValue[0] == '\'' && keyValue[strlen(keyValue)-1] == '\'') {
+                    keyValue[strlen(keyValue)-1] = '\0';
+                    success = psMetadataAdd(out,
+                                            PS_LIST_TAIL,
+                                            keyName,
+                                            PS_META_STR | PS_META_DUPLICATE_OK,
+                                            keyComment,
+                                            keyValue+1);
+                } else {
+                    success = psMetadataAdd(out,
+                                            PS_LIST_TAIL,
+                                            keyName,
+                                            PS_META_STR | PS_META_DUPLICATE_OK,
+                                            keyComment,
+                                            keyValue);
+                }
+                break;
+            case 'L':
+                tempBool = (keyValue[0] == 'T') ? 1 : 0;
+                success = psMetadataAdd(out,
+                                        PS_LIST_TAIL,
+                                        keyName,
+                                        PS_META_BOOL | PS_META_DUPLICATE_OK,
+                                        keyComment,
+                                        tempBool);
+                break;
+            default:
+                psError(PS_ERR_IO, true,
+                        PS_ERRORTEXT_psFits_METATYPE_INVALID,
+                        keyType);
+                return out;
+            }
+
+            if (!success) {
+                psError(PS_ERR_UNKNOWN, false,
+                        PS_ERRORTEXT_psFits_METADATA_ADD_FAILED,
+                        keyName);
+                return out;
+            }
+        }
+
+    }
+
+    if ( status != 0) {
+        char fitsErr[MAX_STRING_LENGTH];
+        (void)fits_get_errstatus(status, fitsErr);
+        psError(PS_ERR_IO, true,
+                PS_ERRORTEXT_psFits_METADATA_ADD_FAILED,
+                fitsErr);
+        return false;
+    }
+
+    return out;
+}
+
+psHash* psFitsReadHeaderSet(psHash* out,
+                            const psFits* fits)
+{
+    if (fits == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psFits_NULL);
+        psFree(out);
+        return NULL;
+    }
+
+    if (out == NULL) {
+        out = psHashAlloc(10);
+        // XXX: what is the appropriate number of buckets? Got 10 from psMetadataAlloc.
+        if (out == NULL) {
+            psError(PS_ERR_UNKNOWN, false,
+                    "Failed to allocate a new psHash container.");
+            return NULL;
+        }
+    }
+
+    int size = psFitsGetSize(fits);
+
+    int origPosition = psFitsGetExtNum(fits);
+
+    for (int lcv=0; lcv < size; lcv++) {
+        psFitsMoveExtNum(fits, lcv, false);
+
+        char* name = NULL;
+        if (lcv == 0) {
+            name = psStringCopy("PHU");
+        } else {
+            name = psFitsGetExtName(fits);
+        }
+
+        psMetadata* header = psFitsReadHeader(NULL, fits);
+        if (name != NULL && header != NULL) {
+            psHashAdd(out, name, header);
+        } else { // XXX: is this a warning or error?
+            psLogMsg(__func__, PS_LOG_WARN,
+                     "Failed to read HDU#%d header data.",
+                     lcv);
+        }
+
+        psFree(name);
+        psFree(header);
+    }
+
+    // reposition to the original position
+    psFitsMoveExtNum(fits, origPosition, false);
+
+    return out;
+}
+
+psImage* psFitsReadImage(psImage* output, // a psImage to recycle.
+                         const psFits* fits,    // the psFits object
+                         psRegion region, // the region in the FITS image to read
+                         int z)           // the z-plane in the FITS image cube to read
+{
+    psS32 status = 0;           /* CFITSIO file vars */
+    psS32 nAxis = 0;
+    psS32 anynull = 0;
+    psS32 bitPix = 0;           /* Pixel type */
+    long nAxes[3];
+    long firstPixel[3];         /* lower-left corner of image subset */
+    long lastPixel[3];          /* upper-right corner of image subset */
+    long increment[3];          /* increment for image subset */
+    char fitsErr[80] = "";      /* CFITSIO error message string */
+    psS32 fitsDatatype = 0;
+    psS32 datatype = 0;
+
+    if (fits == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psFits_NULL);
+        psFree(output);
+        return NULL;
+    }
+
+    // check to see if we even are positioned on an image HDU
+    int hdutype;
+    if ( fits_get_hdu_type(fits->p_fd,&hdutype, &status) != 0) {
+        char fitsErr[MAX_STRING_LENGTH];
+        (void)fits_get_errstatus(status, fitsErr);
+        psError(PS_ERR_IO, true,
+                PS_ERRORTEXT_psFits_GET_HDU_TYPE_FAILED,
+                fitsErr);
+        return NULL;
+    }
+    if (hdutype != IMAGE_HDU) {
+        psError(PS_ERR_IO, true,
+                PS_ERRORTEXT_psFits_NOT_IMAGE_TYPE);
+        return NULL;
+    }
+
+    /* Get the data type 'bitPix' from the FITS image */
+    if (fits_get_img_equivtype(fits->p_fd, &bitPix, &status) != 0) {
+        fits_get_errstatus(status, fitsErr);
+        psError(PS_ERR_IO, true,
+                PS_ERRORTEXT_psFits_DATATYPE_UNKNOWN,
+                fitsErr);
+        psFree(output);
+        return NULL;
+    }
+
+    /* Get the dimensions 'nAxis' from the FITS image */
+    if (fits_get_img_dim(fits->p_fd, &nAxis, &status) != 0) {
+        (void)fits_get_errstatus(status, fitsErr);
+        psError(PS_ERR_IO, true,
+                PS_ERRORTEXT_psFits_IMAGE_DIM_UNKNOWN,
+                fitsErr);
+        psFree(output);
+        return NULL;
+    }
+
+    /* Validate the number of axis */
+    if ((nAxis < 2) || (nAxis > 3)) {
+        psError(PS_ERR_IO, true,
+                PS_ERRORTEXT_psFits_IMAGE_DIMENSION_UNSUPPORTED,
+                nAxis);
+        psFree(output);
+        return NULL;
+    }
+
+    /* Get the Image size from the FITS file */
+    if (fits_get_img_size(fits->p_fd, nAxis, nAxes, &status) != 0) {
+        (void)fits_get_errstatus(status, fitsErr);
+        psError(PS_ERR_IO, true,
+                PS_ERRORTEXT_psFits_IMAGE_SIZE_UNKNOWN,
+                fitsErr);
+        psFree(output);
+        return NULL;
+    }
+
+    firstPixel[0] = region.x0 + 1;
+    firstPixel[1] = region.y0 + 1;
+    firstPixel[2] = z + 1;
+
+    if (region.x1 > 0) {
+        lastPixel[0] = region.x1;
+    } else {
+        lastPixel[0] = nAxes[0] + region.x1; // n.b., region.x1 < 0
+    }
+    if (region.y1 > 0) {
+        lastPixel[1] = region.y1;
+    } else {
+        lastPixel[1] = nAxes[1] + region.y1; // n.b., region.y1 < 0
+    }
+    lastPixel[2] = z + 1;
+
+    increment[0] = 1;
+    increment[1] = 1;
+    increment[2] = 1;
+
+    switch (bitPix) {
+    case BYTE_IMG:
+        datatype = PS_TYPE_U8;
+        fitsDatatype = TBYTE;
+        break;
+    case SBYTE_IMG:
+        datatype = PS_TYPE_S8;
+        fitsDatatype = TSBYTE;
+        break;
+    case USHORT_IMG:
+        datatype = PS_TYPE_U16;
+        fitsDatatype = TUSHORT;
+        break;
+    case SHORT_IMG:
+        datatype = PS_TYPE_S16;
+        fitsDatatype = TSHORT;
+        break;
+    case ULONG_IMG:
+        datatype = PS_TYPE_U32;
+        fitsDatatype = TUINT;
+        break;
+    case LONG_IMG:
+        datatype = PS_TYPE_S32;
+        fitsDatatype = TINT;
+        break;
+    case LONGLONG_IMG:
+        datatype = PS_TYPE_S64;
+        fitsDatatype = TLONGLONG;
+        break;
+    case FLOAT_IMG:
+        datatype = PS_TYPE_F32;
+        fitsDatatype = TFLOAT;
+        break;
+    case DOUBLE_IMG:
+        datatype = PS_TYPE_F64;
+        fitsDatatype = TDOUBLE;
+        break;
+    default:
+        psError(PS_ERR_IO, true,
+                PS_ERRORTEXT_psFits_FITS_TYPE_UNSUPPORTED,
+                bitPix);
+        psFree(output);
+        return NULL;
+    }
+
+    output = psImageRecycle(output,
+                            lastPixel[0]-firstPixel[0]+1,
+                            lastPixel[1]-firstPixel[1]+1,
+                            datatype);
+
+    if (output == NULL) {
+        psError(PS_ERR_UNKNOWN, false,
+                "Failed to allocate a properly sized image.");
+        return false;
+    }
+
+    // n.b., this assumes contiguous image buffer
+    if (fits_read_subset(fits->p_fd, fitsDatatype, firstPixel, lastPixel, increment,
+                         NULL, output->data.V[0], &anynull, &status) != 0) {
+        psFree(output);
+        (void)fits_get_errstatus(status, fitsErr);
+        psError(PS_ERR_IO, true,
+                PS_ERRORTEXT_psFits_READ_FAILED,
+                fitsErr);
+        return NULL;
+    }
+
+    return output;
+
+}
+
+bool psFitsWriteImage(const psFits* fits,
+                      const psMetadata* header,
+                      const psImage* input,
+                      int numZPlanes,
+                      char* extname)
+{
+
+    if (fits == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psFits_NULL);
+        return false;
+    }
+
+    if (input == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psFits_IMAGE_NULL);
+        return false;
+    }
+    int numCols = input->numCols;
+    int numRows = input->numRows;
+
+    int status = 0;
+
+    // determine the FITS-equivalent parameters
+    int bitPix;
+    double bZero;
+    int dataType;
+    if (! convertPsTypeToFits(input->type.type, &bitPix, &bZero, &dataType) ) {
+        return false;
+    }
+
+    int naxis = 3;
+    long naxes[3];
+
+    naxes[0] = numCols;
+    naxes[1] = numRows;
+    naxes[2] = numZPlanes;
+
+    if (numZPlanes < 2) {
+        naxis = 2;
+    }
+
+    fits_create_img(fits->p_fd, bitPix, naxis, naxes, &status);
+
+    if (extname != NULL) {
+        fits_update_key_str(fits->p_fd, "EXTNAME", (char*)extname, NULL, &status);
+    }
+
+    if (bZero != 0) {        // set the bscale/bzero
+        fits_write_key_dbl(fits->p_fd, "BZERO", bZero, 12, "Pixel Value Offset", &status);
+        fits_write_key_dbl(fits->p_fd, "BSCALE", 1.0, 12, "Pixel Value Scale", &status);
+        fits_set_bscale(fits->p_fd, 1.0, bZero, &status);
+    }
+
+    // write the header, if any.
+    if (header != NULL) {
+        psFitsWriteHeader(header, fits);
+    }
+
+    if (input->parent == NULL) { // if no parent, assume that the image data is contiguous
+        fits_write_img(fits->p_fd,
+                       dataType,              // datatype
+                       1,                     // writing to the first z-plane
+                       numCols*numRows,       // number of elements to write, i.e., the whole image
+                       input->data.V[0],      // the data
+                       &status);
+    } else { // image data may not be contiguous; write one row at a time
+        int firstPixel = 1;
+        for (int row = 0; row < numRows; row++) {
+            fits_write_img(fits->p_fd,
+                           dataType,          // datatype
+                           firstPixel,
+                           numCols,           // number of elements to write, i.e., one row's worth
+                           input->data.V[row],// the raw row data
+                           &status);
+            firstPixel += numCols;  // move to next row
+        }
+    }
+
+    if ( status != 0) {
+        char fitsErr[MAX_STRING_LENGTH];
+        (void)fits_get_errstatus(status, fitsErr);
+        psError(PS_ERR_IO, true,
+                PS_ERRORTEXT_psFits_WRITE_FAILED,
+                fits->filename, fitsErr);
+        return false;
+    }
+
+    return true;
+
+}
+
+bool psFitsUpdateImage(const psFits* fits,
+                       const psImage* input,
+                       psRegion region,
+                       int z)
+{
+    int status = 0;
+
+    if (fits == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psFits_NULL);
+        return false;
+    }
+
+    if (input == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psFits_IMAGE_NULL);
+        return false;
+    }
+
+    // check to see if we are positioned on an image HDU
+    int hdutype;
+    if ( fits_get_hdu_type(fits->p_fd,&hdutype, &status) != 0) {
+        char fitsErr[MAX_STRING_LENGTH];
+        (void)fits_get_errstatus(status, fitsErr);
+        psError(PS_ERR_IO, true,
+                PS_ERRORTEXT_psFits_GET_HDU_TYPE_FAILED,
+                fitsErr);
+        return NULL;
+    }
+    if (hdutype != IMAGE_HDU) {
+        psError(PS_ERR_IO, true,
+                PS_ERRORTEXT_psFits_NOT_IMAGE_TYPE);
+        return NULL;
+    }
+
+    int numCols = input->numCols;
+    int numRows = input->numRows;
+
+    // determine the FITS-equivalent parameters
+    int bitPix;
+    double bZero;
+    int dataType;
+    if (! convertPsTypeToFits(input->type.type, &bitPix, &bZero, &dataType) ) {
+        return false;
+    }
+
+    //check to see if the HDU has the same datatype
+    int fileBitpix;
+    int naxis;
+    long nAxes[3];
+    nAxes[2] = 1;
+    fits_get_img_param(fits->p_fd, 3, &fileBitpix, &naxis, nAxes, &status);
+
+    //check to see if the HDU has the same datatype
+    if (bitPix != fileBitpix) {
+        char* fitsTypeStr;
+        char* imageTypeStr;
+        PS_TYPE_NAME(fitsTypeStr,fileBitpix);
+        PS_TYPE_NAME(imageTypeStr,input->type.type);
+        psError(PS_ERR_IO, true,
+                PS_ERRORTEXT_psFits_IMAGE_UPDATE_TYPE_MISMATCH,
+                fitsTypeStr, imageTypeStr);
+        return false;
+    }
+
+    //check if the HDU has the z-plane requested
+    if (z >= nAxes[2]) {
+        psError(PS_ERR_BAD_PARAMETER_SIZE, true,
+                PS_ERRORTEXT_psFits_FITS_Z_SMALL,
+                nAxes[2],z);
+        return false;
+    }
+
+    // determine the region in the FITS file domain
+    long firstPixel[3];
+    long lastPixel[3];
+
+    firstPixel[0] = region.x0 + 1;
+    firstPixel[1] = region.y0 + 1;
+    firstPixel[2] = z + 1;
+
+    if (region.x1 > 0) {
+        lastPixel[0] = region.x1;
+    } else {
+        lastPixel[0] = nAxes[0] + region.x1; // n.b., region.x1 < 0
+    }
+    if (region.y1 > 0) {
+        lastPixel[1] = region.y1;
+    } else {
+        lastPixel[1] = nAxes[1] + region.y1; // n.b., region.y1 < 0
+    }
+    lastPixel[2] = z + 1;
+
+    if (firstPixel[0] < 1 || firstPixel[0] > nAxes[0] ||
+            firstPixel[1] < 1 || firstPixel[1] > nAxes[1] ||
+            lastPixel[0] < 1 || lastPixel[0] > nAxes[0] ||
+            lastPixel[1] < 1 || lastPixel[1] > nAxes[1]) {
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true,
+                "Specified region [%d:%d,%d:%d], is not valid given the %dx%d FITS image.",
+                region.y0,region.y1-1,region.x0,region.x1-1);
+        return false;
+
+    }
+
+    int dx = lastPixel[0] - firstPixel[0];
+    int dy = lastPixel[1] - firstPixel[1];
+    if (dx > numCols ||
+            dy > numRows) {
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true,
+                "The region [%d:%d,%d:%d], is not valid given the input %dx%d image.",
+                firstPixel[1]-1,lastPixel[1]-1,
+                firstPixel[0]-1,lastPixel[0]-1,
+                numCols, numRows);
+        return false;
+    }
+
+    psImage* subset;
+    if (dx != numCols || dy != numRows) {
+        // the input image needs to be subsetted
+        subset = psImageSubset((psImage*)input,0,0,dx+1,dy+1);
+    } else {
+        subset = psMemIncrRefCounter((psImage*)input);
+    }
+
+    fits_write_subset(fits->p_fd, dataType, firstPixel, lastPixel, subset->data.V[0], &status);
+
+    if ( status != 0) {
+        char fitsErr[MAX_STRING_LENGTH];
+        (void)fits_get_errstatus(status, fitsErr);
+        psError(PS_ERR_IO, true,
+                PS_ERRORTEXT_psFits_WRITE_FAILED,
+                fits->filename, fitsErr);
+        return false;
+    }
+
+    return true;
+}
+
+bool psFitsWriteHeader(const psMetadata* header,
+                       const psFits* fits)
+{
+
+    if (fits == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psFits_NULL);
+        return false;
+    }
+
+    if (header == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psFits_METADATA_NULL);
+        return false;
+    }
+
+    int status = 0;
+
+    //transverse the metadata list and add each key.
+
+    psListIterator* iter = psListIteratorAlloc(header->list,PS_LIST_HEAD,true);
+    psMetadataItem* item;
+    while ( (item=psListGetAndIncrement(iter)) != NULL ) {
+        switch (item->type) {
+        case PS_META_BOOL: {
+                int value = item->data.B;
+                fits_update_key(fits->p_fd,
+                                TLOGICAL,
+                                item->name,
+                                &value,
+                                item->comment,
+                                &status);
+                break;
+            }
+        case PS_META_S32:
+            fits_update_key(fits->p_fd,
+                            TINT,
+                            item->name,
+                            &item->data.S32,
+                            item->comment,
+                            &status);
+            break;
+        case PS_META_F32:
+            fits_update_key(fits->p_fd,
+                            TFLOAT,
+                            item->name,
+                            &item->data.F32,
+                            item->comment,
+                            &status);
+            break;
+        case PS_META_F64:
+            fits_update_key(fits->p_fd,
+                            TDOUBLE,
+                            item->name,
+                            &item->data.F64,
+                            item->comment,
+                            &status);
+            break;
+        case PS_META_STR:
+            fits_update_key(fits->p_fd,
+                            TSTRING,
+                            item->name,
+                            item->data.V,
+                            item->comment,
+                            &status);
+            break;
+        default:  // all other META types are ignored
+            break;
+        }
+
+        if ( status != 0) {
+            char fitsErr[MAX_STRING_LENGTH];
+            (void)fits_get_errstatus(status, fitsErr);
+            psError(PS_ERR_IO, true,
+                    PS_ERRORTEXT_psFits_WRITE_FAILED,
+                    fits->filename, fitsErr);
+            return false;
+        }
+    }
+
+    return true;
+}
+
+psMetadata* psFitsReadTableRow(const psFits* fits,
+                               int row)
+{
+    long numRows;
+    int numCols;
+    int status = 0;
+
+    if (fits == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psFits_NULL);
+        return NULL;
+    }
+
+    // check to see if we even are positioned on a table HDU
+    int hdutype;
+    fits_get_hdu_type(fits->p_fd,&hdutype, &status);
+    if ( status != 0) {
+        char fitsErr[MAX_STRING_LENGTH];
+        (void)fits_get_errstatus(status, fitsErr);
+        psError(PS_ERR_IO, true,
+                PS_ERRORTEXT_psFits_GET_HDU_TYPE_FAILED,
+                fitsErr);
+        return NULL;
+    }
+    if (hdutype != ASCII_TBL && hdutype != BINARY_TBL) {
+        psError(PS_ERR_IO, true,
+                PS_ERRORTEXT_psFits_NOT_TABLE_TYPE);
+        return NULL;
+    }
+
+    // get the size of the FITS table
+    fits_get_num_rows(fits->p_fd, &numRows, &status);
+    fits_get_num_cols(fits->p_fd, &numCols, &status);
+    if ( status != 0) {
+        char fitsErr[MAX_STRING_LENGTH];
+        (void)fits_get_errstatus(status, fitsErr);
+        psError(PS_ERR_IO, true,
+                PS_ERRORTEXT_psFits_GET_TABLE_SIZE_FAILED,
+                fitsErr);
+        return NULL;
+    }
+
+    // the row parameter in the proper range?
+    if (row < 0 || row >= numRows) {
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true,
+                PS_ERRORTEXT_psFits_ROW_INVALID,
+                row,numRows);
+        return NULL;
+    }
+
+    psMetadata* data = psMetadataAlloc();
+
+    int typecode;
+    long repeat;
+    long width;
+    char name[60];
+    for (int col = 1; col <= numCols; col++) {
+        // get the column name
+        if (hdutype == BINARY_TBL) {
+            fits_get_bcolparms(fits->p_fd, col, name,
+                               NULL, NULL, NULL, NULL, NULL, NULL, NULL, &status);
+        } else {
+            fits_get_acolparms(fits->p_fd, col, name,
+                               NULL, NULL, NULL, NULL, NULL, NULL, NULL, &status);
+        }
+
+        // get the column type
+        fits_get_coltype(fits->p_fd, col, &typecode, &repeat, &width, &status);
+
+        if (status == 0) {
+
+            #define READ_TABLE_ROW_CASE(FITSTYPE, NATIVETYPE, TYPE) \
+        case FITSTYPE: { \
+                NATIVETYPE value = 0; \
+                int anynul = 0; \
+                fits_read_col(fits->p_fd, FITSTYPE, col,row+1, \
+                              1, 1, NULL, &value, &anynul, &status); \
+                psMetadataAdd(data,PS_LIST_TAIL, name, \
+                              PS_META_##TYPE, \
+                              "", (ps##TYPE)value); \
+                break; \
+            }
+
+            switch (typecode) {
+            case TBYTE:
+            case TSHORT:
+            case TLONGLONG:
+                READ_TABLE_ROW_CASE(TLONG, long, S32)
+                READ_TABLE_ROW_CASE(TFLOAT, float, F32)
+                READ_TABLE_ROW_CASE(TDOUBLE, double, F64)
+                READ_TABLE_ROW_CASE(TLOGICAL, bool, BOOL);
+            case TSTRING: {
+                    char* value;
+                    int anynul = 0;
+                    fits_read_col(fits->p_fd, TSTRING, col,row+1,
+                                  1, 1, NULL, &value, &anynul, &status);
+                    if (anynul == 0) {
+                        psMetadataAdd(data,PS_LIST_TAIL, name,
+                                      PS_META_STR,
+                                      "", value);
+                    }
+                    break;
+                }
+            default:
+                psTrace("psFits.psFitsReadTableRow", 2,
+                        "Column %d or row %d was of a non primitive type, %d",
+                        col, row, typecode);
+            }
+        }
+
+        if ( status != 0) {
+            char fitsErr[MAX_STRING_LENGTH];
+            (void)fits_get_errstatus(status, fitsErr);
+            psError(PS_ERR_IO, true,
+                    PS_ERRORTEXT_psFits_GET_TABLE_ELEMENT,
+                    col,row,fitsErr);
+            psFree(data);
+            return NULL;
+        }
+
+    }
+
+    return data;
+}
+
+psArray* psFitsReadTableColumn(const psFits* fits,
+                               const char* colname)
+{
+    int colnum = 0;
+    int status = 0;
+
+    if (fits == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psFits_NULL);
+        return NULL;
+    }
+
+    // check to see if we even are positioned on a table HDU
+    int hdutype;
+    if ( fits_get_hdu_type(fits->p_fd,&hdutype, &status) != 0) {
+        char fitsErr[MAX_STRING_LENGTH];
+        (void)fits_get_errstatus(status, fitsErr);
+        psError(PS_ERR_IO, true,
+                PS_ERRORTEXT_psFits_GET_HDU_TYPE_FAILED,
+                fitsErr);
+        return NULL;
+    }
+    if (hdutype != ASCII_TBL && hdutype != BINARY_TBL) {
+        psError(PS_ERR_IO, true,
+                PS_ERRORTEXT_psFits_NOT_TABLE_TYPE);
+        return NULL;
+    }
+
+    // find the column by name
+    if ( fits_get_colnum(fits->p_fd, CASESEN, (char*)colname, &colnum, &status) != 0) {
+        char fitsErr[MAX_STRING_LENGTH];
+        (void)fits_get_errstatus(status, fitsErr);
+        psError(PS_ERR_IO, true,
+                PS_ERRORTEXT_psFits_FIND_COLUMN,
+                colname, fitsErr);
+        return NULL;
+    }
+
+    // get the number of rows
+    long numRows = 0;
+    fits_get_num_rows(fits->p_fd, &numRows, &status);
+
+    // get the column length.
+    int width;
+    if ( fits_get_col_display_width(fits->p_fd, colnum, &width, &status) != 0) {
+        char fitsErr[MAX_STRING_LENGTH];
+        (void)fits_get_errstatus(status, fitsErr);
+        psError(PS_ERR_IO, true,
+                PS_ERRORTEXT_psFits_GET_COLTYPE,
+                fitsErr);
+        return NULL;
+    }
+
+    // allocate the buffers
+    psArray* result = psArrayAlloc(numRows);
+    for (int row = 0; row < numRows; row++) {
+        result->data[row] = psAlloc((width+1)*sizeof(char));
+    }
+    result->n = numRows;
+
+    fits_read_col_str(fits->p_fd,
+                      colnum,
+                      1, // firstrow
+                      1, // firestelem
+                      numRows,
+                      "", // nulstr
+                      (char**)result->data,
+                      NULL,
+                      &status);
+
+    if ( status != 0) {
+        char fitsErr[MAX_STRING_LENGTH];
+        (void)fits_get_errstatus(status, fitsErr);
+        psError(PS_ERR_IO, true,
+                PS_ERRORTEXT_psFits_TABLE_READ_COL,
+                fitsErr);
+        return NULL;
+    }
+
+    return result;
+}
+
+psVector* psFitsReadTableColumnNum(const psFits* fits,
+                                   const char* colname)
+{
+    int status = 0;
+    int colnum = 0;
+
+    if (fits == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psFits_NULL);
+        return NULL;
+    }
+
+    // check to see if we even are positioned on a table HDU
+    int hdutype;
+    if ( fits_get_hdu_type(fits->p_fd,&hdutype, &status) != 0) {
+        char fitsErr[MAX_STRING_LENGTH];
+        (void)fits_get_errstatus(status, fitsErr);
+        psError(PS_ERR_IO, true,
+                PS_ERRORTEXT_psFits_GET_HDU_TYPE_FAILED,
+                fitsErr);
+        return NULL;
+    }
+    if (hdutype != ASCII_TBL && hdutype != BINARY_TBL) {
+        psError(PS_ERR_IO, true,
+                PS_ERRORTEXT_psFits_NOT_TABLE_TYPE);
+        return NULL;
+    }
+
+    // find the column by name
+    if ( fits_get_colnum(fits->p_fd, CASESEN, (char*)colname, &colnum, &status) != 0) {
+        char fitsErr[MAX_STRING_LENGTH];
+        (void)fits_get_errstatus(status, fitsErr);
+        psError(PS_ERR_IO, true,
+                PS_ERRORTEXT_psFits_FIND_COLUMN,
+                colname, fitsErr);
+        return NULL;
+    }
+
+    // get the number of rows
+    long numRows = 0;
+    fits_get_num_rows(fits->p_fd,
+                      &numRows,
+                      &status);
+
+    // get the column datatype.
+    int typecode;
+    long repeat;
+    long width;
+    if ( fits_get_eqcoltype(fits->p_fd, colnum, &typecode, &repeat, &width, &status) != 0) {
+        char fitsErr[MAX_STRING_LENGTH];
+        (void)fits_get_errstatus(status, fitsErr);
+        psError(PS_ERR_IO, true,
+                PS_ERRORTEXT_psFits_GET_COLTYPE,
+                fitsErr);
+        return NULL;
+    }
+
+    psVector* result = psVectorAlloc(numRows, convertFitsToPsType(typecode));
+
+    fits_read_col(fits->p_fd,
+                  typecode,
+                  colnum,
+                  1 /* firstrow */,
+                  1 /* firstelem */,
+                  numRows,
+                  NULL,
+                  (psPtr)(result->data.U8),
+                  NULL,
+                  &status);
+
+    if ( status != 0) {
+        char fitsErr[MAX_STRING_LENGTH];
+        (void)fits_get_errstatus(status, fitsErr);
+        psError(PS_ERR_IO, true,
+                PS_ERRORTEXT_psFits_TABLE_READ_COL,
+                fitsErr);
+        return NULL;
+    }
+
+    return result;
+}
+
+
+psArray* psFitsReadTable(const psFits* fits)
+{
+    int status = 0;
+
+    if (fits == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psFits_NULL);
+        return NULL;
+    }
+
+    // check to see if we even are positioned on a table HDU
+    int hdutype;
+    if ( fits_get_hdu_type(fits->p_fd,&hdutype, &status) != 0) {
+        char fitsErr[MAX_STRING_LENGTH];
+        (void)fits_get_errstatus(status, fitsErr);
+        psError(PS_ERR_IO, true,
+                PS_ERRORTEXT_psFits_GET_HDU_TYPE_FAILED,
+                fitsErr);
+        return NULL;
+    }
+    if (hdutype != ASCII_TBL && hdutype != BINARY_TBL) {
+        psError(PS_ERR_IO, true,
+                PS_ERRORTEXT_psFits_NOT_TABLE_TYPE);
+        return NULL;
+    }
+
+    // get the size of the FITS table
+    long numRows = 0;
+    fits_get_num_rows(fits->p_fd, &numRows, &status);
+    if ( status != 0) {
+        char fitsErr[MAX_STRING_LENGTH];
+        (void)fits_get_errstatus(status, fitsErr);
+        psError(PS_ERR_IO, true,
+                PS_ERRORTEXT_psFits_GET_TABLE_SIZE_FAILED,
+                fitsErr);
+        return NULL;
+    }
+
+    psArray* table = psArrayAlloc(numRows);
+
+    for (int row = 0; row < numRows; row++) {
+        table->data[row] = psFitsReadTableRow(fits,row);
+    }
+
+    return table;
+}
+
+bool psFitsWriteTable(const psFits* fits,
+                      psMetadata* header,
+                      psArray* table,
+                      char* extname)
+{
+    int status = 0;
+    psMetadataItem* item;
+
+    if (fits == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psFits_NULL);
+        return false;
+    }
+
+    if (table == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psFits_IMAGE_NULL);
+        return false;
+    }
+
+    int rows = table->n;
+    if (rows < 1) {
+        // no table data, what can I do?
+        psError(PS_ERR_BAD_PARAMETER_SIZE, true,
+                PS_ERRORTEXT_psFits_TABLE_EMPTY);
+        return false;
+    }
+
+    // find all the columns needed
+    psArray* columns = psArrayAlloc(((psMetadata*)table->data[0])->list->size);
+    columns->n=0;
+
+    // find the unique items in the array of metadata 'rows'
+    for (int row=0; row < rows; row++) {
+        psMetadata* rowMeta = table->data[row];
+        if (rowMeta != NULL) {
+            psListIterator* iter = psListIteratorAlloc(rowMeta->list,
+                                   PS_LIST_HEAD,true);
+            while ( (item=psListGetAndIncrement(iter)) != NULL) {
+                if (PS_META_IS_PRIMITIVE(item->type)) {
+                    bool found = false;
+                    for (int n=0; n < columns->n && ! found; n++) {
+                        if (strcmp(item->name,
+                                   ((psMetadataItem*)(columns->data[n]))->name) == 0) {
+                            found = true;
+                        }
+                    }
+                    if (! found) {
+                        psArrayAdd(columns, columns->nalloc, item);
+                    }
+                }
+            }
+            psFree(iter);
+        }
+    }
+
+    if (columns->n == 0) { // no table columns found
+        // XXX: Error?
+        return false;
+    }
+
+    //create list of column names and types.
+    psArray* columnNames = psArrayAlloc(columns->n);
+    psArray* columnTypes = psArrayAlloc(columns->n);
+    for (int n=0; n < columns->n; n++) {
+        char* fitsType;
+        columnNames->data[n] = psMemIncrRefCounter(((psMetadataItem*)columns->data[n])->name);
+        if ( ! convertMetadataTypeToBinaryTForm(((psMetadataItem*)columns->data[n])->type,
+                                                &fitsType)) {
+            // XXX: error message
+            return false;
+        }
+        columnTypes->data[n] = fitsType;
+    }
+
+    fits_create_tbl(fits->p_fd,
+                    BINARY_TBL,
+                    table->n, // number of rows in table
+                    columns->n, // number of columns in table
+                    (char**)columnNames->data, // names of the columns
+                    (char**)columnTypes->data, // format of the columns
+                    NULL, // physical unit of columns
+                    extname, // extension name
+                    &status);
+
+    psFree(columnNames);
+    psFree(columnTypes);
+
+    // fill in the table elements with data
+    for (int n = 0; n < columns->n; n++) {
+        int row;
+        item = columns->data[n];
+        if (PS_META_IS_PRIMITIVE(item->type)) {
+            psVector* col = NULL;
+            switch (item->type) {
+            case PS_META_S32:
+                col = psVectorAlloc(table->n, PS_TYPE_S32);
+                for (row = 0; row < table->n; row++) {
+                    col->data.S32[row] = psMetadataLookupS32(NULL,
+                                         table->data[row],
+                                         item->name);
+                }
+                fits_write_col_int(fits->p_fd,
+                                   n+1, // column number
+                                   1, // firstrow
+                                   1, // firstelem
+                                   table->n, // nelements
+                                   col->data.S32,
+                                   &status);
+                break;
+            case PS_META_F32:
+                col = psVectorAlloc(table->n, PS_TYPE_F32);
+                for (row = 0; row < table->n; row++) {
+                    col->data.F32[row] = psMetadataLookupF32(NULL,
+                                         table->data[row],
+                                         item->name);
+                }
+                fits_write_col_flt(fits->p_fd,
+                                   n+1, // column number
+                                   1, // firstrow
+                                   1, // firstelem
+                                   table->n, // nelements
+                                   col->data.F32,
+                                   &status);
+                break;
+            case PS_META_F64:
+                col = psVectorAlloc(table->n, PS_TYPE_F64);
+                for (row = 0; row < table->n; row++) {
+                    col->data.F64[row] = psMetadataLookupF64(NULL,
+                                         table->data[row],
+                                         item->name);
+                }
+                fits_write_col_dbl(fits->p_fd,
+                                   n+1, // column number
+                                   1, // firstrow
+                                   1, // firstelem
+                                   table->n, // nelements
+                                   col->data.F64,
+                                   &status);
+                break;
+            case PS_META_BOOL:
+                col = psVectorAlloc(table->n, PS_TYPE_BOOL);
+                for (row = 0; row < table->n; row++) {
+                    col->data.S8[row] = psMetadataLookupBool(NULL,
+                                        table->data[row],
+                                        item->name);
+                }
+                fits_write_col_log(fits->p_fd,
+                                   n+1, // column number
+                                   1, // firstrow
+                                   1, // firstelem
+                                   table->n, // nelements
+                                   col->data.S8,
+                                   &status);
+                break;
+            default:
+                // XXX: error message?
+                break;
+            }
+            psFree(col);
+        } else if (item->type == PS_META_STR) {
+            psArray* col = psArrayAlloc(table->n);
+            for (row = 0; row < table->n; row++) {
+                col->data[row] = item->data.V;
+            }
+            fits_write_col_str(fits->p_fd,
+                               n, // column number
+                               1, // firstrow
+                               1, // firstelem
+                               table->n, // nelements
+                               (char**)col->data,
+                               &status);
+            psFree(col);
+        }
+    }
+
+    psFree(columns);
+
+    return true;
+}
+
+bool psFitsUpdateTable(const psFits* fits,
+                       psMetadata* data,
+                       int row)
+{
+    int status = 0;
+
+    if (fits == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psFits_NULL);
+        return false;
+    }
+
+    if (data == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psFits_IMAGE_NULL);
+        return false;
+    }
+
+    // check to see if we even are positioned on a table HDU
+    int hdutype;
+    if ( fits_get_hdu_type(fits->p_fd,&hdutype, &status) != 0) {
+        char fitsErr[MAX_STRING_LENGTH];
+        (void)fits_get_errstatus(status, fitsErr);
+        psError(PS_ERR_IO, true,
+                PS_ERRORTEXT_psFits_GET_HDU_TYPE_FAILED,
+                fitsErr);
+        return false;
+    }
+    if (hdutype != ASCII_TBL && hdutype != BINARY_TBL) {
+        psError(PS_ERR_IO, true,
+                PS_ERRORTEXT_psFits_NOT_TABLE_TYPE);
+        return false;
+    }
+
+    psMetadataIterator* iter = psMetadataIteratorAlloc(data,PS_LIST_HEAD,NULL);
+
+    psMetadataItem* item;
+
+    while ( (item=psMetadataGetAndIncrement(iter)) != NULL) {
+        if (PS_META_IS_PRIMITIVE(item->type)) {
+            // operating on primitive data type, i.e., not a complex object
+            int colnum = 0;
+
+            if ( fits_get_colnum(fits->p_fd, CASESEN, item->name, &colnum, &status) == 0) {
+                // cooresponding column found in table
+                int dataType = 0;
+                convertPsTypeToFits(item->type, NULL, NULL, &dataType);
+
+                if (fits_write_col(fits->p_fd, dataType, colnum, row+1, 1, 1, &item->data,&status) != 0) {
+                    char fitsErr[MAX_STRING_LENGTH];
+                    (void)fits_get_errstatus(status, fitsErr);
+                    psError(PS_ERR_IO, true,
+                            PS_ERRORTEXT_psFits_WRITE_FAILED,
+                            fits->filename, fitsErr);
+                    psFree(iter);
+                    return false;
+                }
+            } else {
+                // the column was not found.
+                psWarning("No column with the name '%s' exists in the table.",
+                          item->name);
+            }
+        }
+    }
+
+    psFree(iter);
+
+    return true;
+}
Index: /tags/ipp-1-X/bug123/psLib/src/dataIO/psFits.h
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/dataIO/psFits.h	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/dataIO/psFits.h	(revision 22331)
@@ -0,0 +1,268 @@
+/** @file  psFits.h
+ *
+ *  @brief Contains Fits I/O routines
+ *
+ *  @ingroup FileIO
+ *
+ *  @author Robert DeSonia, MHPCC
+ *
+ *  @version $Revision: 1.10 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-03-24 23:52:25 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+
+#ifndef PS_FITS_H
+#define PS_FITS_H
+
+#include<fitsio.h>
+
+#include "psType.h"
+#include "psArray.h"
+#include "psVector.h"
+#include "psMetadata.h"
+#include "psHash.h"
+#include "psImage.h"
+
+/// @addtogroup FileIO
+/// @{
+
+typedef enum {
+    PS_FITS_TYPE_NONE = -1,
+    PS_FITS_TYPE_IMAGE = IMAGE_HDU,
+    PS_FITS_TYPE_BINARY_TABLE = BINARY_TBL,
+    PS_FITS_TYPE_ASCII_TABLE = ASCII_TBL,
+    PS_FITS_TYPE_ANY = ANY_HDU
+} psFitsType;
+
+/** FITS file object.
+ *
+ *  This object should be considered opaque to the user; no item in this
+ *  struct should be accessed directly.
+ *
+ */
+typedef struct
+{
+    fitsfile* p_fd;                    ///< the CFITSIO fits files handle.
+    const char* filename;              ///< the filename of the fits file
+}
+psFits;
+
+/** Opens a FITS file and allocates the associated psFits object.
+ *
+ *  @return psFits*    new psFits object for the FITS files specified or
+ *                     NULL if the open of the FITS file failed
+ */
+psFits* psFitsAlloc(
+    const char* name                   ///< the FITS file name
+);
+
+/** Moves the FITS HDU to the specified extension name.
+ *
+ *  @return psFitsType    The HDU type, or PS_FITS_TYPE_NONE if move failed.
+ */
+bool psFitsMoveExtName(
+    const psFits* fits,                ///< the psFits object to move
+    const char* extname                ///< the extension name
+);
+
+/** Moves the FITS HDU to the specified extension number
+ *
+ *  @return psFitsType    The HDU type, or PS_FITS_TYPE_NONE if move failed.
+ */
+bool psFitsMoveExtNum(
+    const psFits* fits,                ///< the psFits object to move
+    int extnum,                        ///< the extension number to move to (zero is primary HDU)
+    bool relative                      ///< if true, extnum is a relative number to the current position
+);
+
+/** Get the current extension number, where 0 is the primary HDU.
+ *
+ *  @return int        Current HDU number of the psFits file or < 0 if an error
+ *                     occurred.
+ */
+int psFitsGetExtNum(
+    const psFits* fits                 ///< the psFits object
+);
+
+/** Get the current extension name.
+ *
+ *  @return int        Current HDU name of the psFits file or NULL if an
+ *                     error occurred.
+ */
+char* psFitsGetExtName(
+    const psFits* fits                 ///< the psFits object
+);
+
+/** Set the current extension's name
+ *
+ *  @return bool       TRUE if the extension was successfully set, otherwise FALSE.
+ */
+bool psFitsSetExtName(
+    const psFits* fits,                ///< the psFits object
+    const char* name                   ///< the extension name
+);
+
+/** Get the total number of HDUs in the FITS file.
+ *
+ *  @return int        The total number of HDUs in the FITS file or < 0 if an
+ *                     error occurred.
+ */
+int psFitsGetSize(
+    const psFits* fits                 ///< the psFits object
+);
+
+/** Get the extension type of the current HDU.
+ *
+ *  @return psFitsType The type of the current HDU.  If PS_FITS_TYPE_UNKNOWN,
+ *                     the type could not be determined.
+ */
+psFitsType psFitsGetExtType(
+    const psFits* fits                 ///< the psFits object
+);
+
+/** Reads the header of the current HDU.
+ *
+ *  @return psMetadata*   the header data
+ */
+psMetadata* psFitsReadHeader(
+    psMetadata* out,
+    ///< The psMetadata to add the header data.  If null, a new psMetadata is created.
+
+    const psFits* fits                 ///< the psFits object
+);
+
+/** Reads the header of all HDUs.  The current HDU is not changed.
+ *
+ *  @return psHash*      the header data
+ */
+psHash* psFitsReadHeaderSet(
+    psHash* out,
+    ///< The psHash to add the header data via psMetadata items.  If null, a
+    ///< new psHash is created.  The keys of the psHash are the extension names
+    ///< of the cooresponding HDUs.
+
+    const psFits* fits                       ///< the psFits object
+);
+
+/** Writes the values of the metadata to the current HDU header.
+ *
+ *  @return bool        if TRUE, the write was successful, otherwise FALSE.
+ */
+bool psFitsWriteHeader(
+    const psMetadata* header,          ///< the psMetadata data in which to write
+    const psFits* fits                 ///< the psFits object
+);
+
+/** Reads an image, given the desired region and z-plane.
+ *
+ *  @return psImage*     the read image or NULL if there was an error.
+ */
+psImage* psFitsReadImage(
+    psImage* out,                      ///< a psImage to recycle.
+    const psFits* fits,                ///< the psFits object
+    psRegion region,                   ///< the region in the FITS image to read
+    int z                              ///< the z-plane in the FITS image cube to read
+);
+
+/** Writes an image, given the desired region and z-plane.
+ *
+ *  @return bool        TRUE is the write was successful, otherwise FALSE.
+ */
+bool psFitsWriteImage(
+    const psFits* fits,                ///< the psFits object
+    const psMetadata* header,          ///< header items for the new HDU.  Can be NULL.
+    const psImage* input,              ///< the image to output
+    int depth,                         ///< the number of z-planes of the FITS image data cube
+    char* extname                      ///< extension name
+);
+
+/** Updates the FITS file image, given the desired region and z-plane.
+ *
+ *  @return bool        TRUE is the write was successful, otherwise FALSE.
+ */
+bool psFitsUpdateImage(
+    const psFits* fits,                ///< the psFits object
+    const psImage* input,              ///< the image to output
+    psRegion region,                   ///< the region in the FITS image to write
+    int z                              ///< the z-planes of the FITS image data cube to write
+);
+
+/** Reads a table row.  The current HDU type must be either
+ *  PS_FITS_TYPE_BINARY_TABLE or PS_FITS_TYPE_ASCII_TABLE.
+ *
+ *  @return psMetadata*    The table row's data.  The keys are the column names.
+ */
+psMetadata* psFitsReadTableRow(
+    const psFits* fits,                ///< the psFits object
+    int row                            ///< row number to read
+);
+
+/** Reads a table column.  The current HDU type must be either
+ *  PS_FITS_TYPE_BINARY_TABLE or PS_FITS_TYPE_ASCII_TABLE.
+ *
+ *  @return psArray*    Array of data items for the specified column or NULL
+ *                      if an error occurred.
+ */
+psArray* psFitsReadTableColumn(
+    const psFits* fits,                ///< the psFits object
+    const char* colname                ///< the column name
+);
+
+/** Reads a table column of numbers.  The current HDU type must be either
+ *  PS_FITS_TYPE_BINARY_TABLE or PS_FITS_TYPE_ASCII_TABLE.
+ *
+ *  @return psVector*    Vector of data for the specified column or NULL
+ *                       if an error occurred.
+ */
+psVector* psFitsReadTableColumnNum(
+    const psFits* fits,                ///< the psFits object
+    const char* colname                ///< the column name
+);
+
+
+/** Reads a whole FITS table.  The current HDU type must be either
+ *  PS_FITS_TYPE_BINARY_TABLE or PS_FITS_TYPE_ASCII_TABLE.
+ *
+ *  @return psArray*     Array of psMetadata items, which contains the output
+ *                       data items of each row.
+ *
+ *  @see psFitsReadTableRow
+ */
+psArray* psFitsReadTable(
+    const psFits* fits                 ///< the psFits object
+);
+
+/** Writes a whole FITS table.  The current HDU type must be either
+ *  PS_FITS_TYPE_BINARY_TABLE or PS_FITS_TYPE_ASCII_TABLE.
+ *
+ *  @return bool        TRUE if the write was successful, otherwise FALSE
+ *
+ *  @see psFitsReadTableRow
+ */
+bool psFitsWriteTable(
+    const psFits* fits,                ///< the psFits object
+    psMetadata* header,                ///< header items for the new HDU.  Can be NULL.
+    psArray* table,
+    ///< Array of psMetadata items, which contains the output data items of each row.
+    char* extname                      ///< extension name
+);
+
+
+/** Updates a FITS table.  The current HDU type must be either
+ *  PS_FITS_TYPE_BINARY_TABLE or PS_FITS_TYPE_ASCII_TABLE.
+ *
+ *  @return bool        TRUE if the write was successful, otherwise FALSE
+ *
+ *  @see psFitsWriteTable
+ */
+bool psFitsUpdateTable(
+    const psFits* fits,                ///< the psFits object
+    psMetadata* data,
+    ///< Array of psMetadata items, which contains the output data items of each row.
+    int row                            ///< the row number to update.
+);
+
+/// @}
+
+#endif
Index: /tags/ipp-1-X/bug123/psLib/src/dataIO/psLookupTable.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/dataIO/psLookupTable.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/dataIO/psLookupTable.c	(revision 22331)
@@ -0,0 +1,959 @@
+/** @file  psLookupTable.c
+*
+*  @brief This file defines the structure and functions for table lookups.
+*
+*  @ingroup dataIO
+*
+*  @author Ross Harman, MHPCC
+*
+*  @version $Revision: 1.13 $ $Name: not supported by cvs2svn $
+*  @date $Date: 2005-04-08 17:58:57 $
+*
+*  Copyright 2004-5 Maui High Performance Computing Center, University of Hawaii
+*/
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+//#ifdef DARWIN
+#undef __STRICT_ANSI__
+//#endif
+#include <stdlib.h>
+//#ifdef DARWIN
+#define __STRICT_ANSI__
+//#endif
+#include <math.h>
+#include <stdlib.h>
+
+#include "psMemory.h"
+#include "psString.h"
+#include "psError.h"
+#include "psLookupTable.h"
+#include "psFileUtilsErrors.h"
+#include "psConstants.h"
+
+/******************************************************************************/
+/*  DEFINE STATEMENTS                                                         */
+/******************************************************************************/
+
+/** Maximum size of a string */
+#define MAX_STRING_LENGTH 256
+
+/******************************************************************************/
+/*  TYPE DEFINITIONS                                                          */
+/******************************************************************************/
+
+// None
+
+/*****************************************************************************/
+/*  GLOBAL VARIABLES                                                         */
+/*****************************************************************************/
+
+// None
+
+/*****************************************************************************/
+/*  FILE STATIC VARIABLES                                                    */
+/*****************************************************************************/
+
+// None
+
+/*****************************************************************************/
+/*  FUNCTION IMPLEMENTATION - LOCAL                                          */
+/*****************************************************************************/
+
+static bool ignoreLine(char *inString);
+static char *cleanString(char *inString, int sLen);
+static char* getToken(char **inString, char *delimiter, psParseErrorType *status);
+static psU8 parseU8(char *inString, psParseErrorType *status);
+static psS8 parseS8(char *inString, psParseErrorType *status);
+static psU16 parseU16(char *inString, psParseErrorType *status);
+static psS16 parseS16(char *inString, psParseErrorType *status);
+static psU32 parseU32(char *inString, psParseErrorType *status);
+static psS32 parseS32(char *inString, psParseErrorType *status);
+static psU64 parseU64(char *inString, psParseErrorType *status);
+static psS64 parseS64(char *inString, psParseErrorType *status);
+static psF32 parseF32(char *inString, psParseErrorType *status);
+static psF64 parseF64(char *inString, psParseErrorType *status);
+static void parseValue(psVector *vec, psU64 index, char* strValue, psParseErrorType *status);
+static void lookupTableFree(psLookupTable* table);
+
+/** Determines if a line is blank (whitespace only) or a commentline. It returns true if so. The input string
+ *  must be null terminated. */
+static bool ignoreLine(char *inString)
+{
+    while(*inString!='\0' && *inString!='#') {
+        if(!isspace(*inString)) {
+            return false;
+        }
+        inString++;
+    }
+
+    return true;
+}
+
+
+/** Removes leading and trailing whitespace and # characters from a string. The cleaned string is a new null
+ *  terminated copy of the original input string. */
+static char *cleanString(char *inString, int sLen)
+{
+    char *ptrB = NULL;
+    char *ptrE = NULL;
+    char *cleaned = NULL;
+
+
+    ptrB = inString;
+
+    /* Skip over leading # or whitespace */
+    while (isspace(*ptrB) || *ptrB=='#') {
+        ptrB++;
+    }
+
+    /* Skip over trailing whitespace, null terminators, and # characters */
+    ptrE = inString + sLen;
+    while(isspace(*ptrE) || *ptrE=='\0' || *ptrE=='#') {
+        ptrE--;
+    }
+
+    // Length, sLen, does not include '\0'
+    sLen = ptrE - ptrB + 1;
+
+    // Adds '\0' to end of string and +1 to sLen
+    cleaned = psStringNCopy(ptrB, sLen);
+
+    return cleaned;
+}
+
+
+/** Returns cleaned token based on delimiter, but not including delimiter. Also changes the pointer location
+ * the beginning of the string. Tokens are newly allocated null terminated strings. */
+static char* getToken(char **inString, char *delimiter, psParseErrorType *status)
+{
+    char *cleanToken = NULL;
+    int sLen = 0;
+
+
+    // Skip over leading whitespace
+    while(isspace(**inString)) {
+        (*inString)++;
+    }
+
+    // Length of token, not including delimiter
+    sLen = strcspn(*inString, delimiter);
+    if(sLen) {
+
+        // Create new, cleaned, and null terminated token
+        cleanToken = cleanString(*inString, sLen);
+
+        // Move to end of token
+        (*inString) += sLen;
+    } else if(**inString!='\0' && sLen==0) {
+        *status = PS_PARSE_ERROR_GENERAL;
+    }
+
+    return cleanToken;
+}
+
+/** Returns single parsed value as a psU8. The input string must be cleaned and null terminated. */
+static psU8 parseU8(char *inString, psParseErrorType *status)
+{
+    char *end = NULL;
+    psU8 value = 0.0;
+
+
+    value = (psU8)strtoul(inString, &end, 0);
+    if(*end != '\0') {
+        *status = PS_PARSE_ERROR_VALUE;
+    } else if(inString==end) {
+        *status = PS_PARSE_ERROR_VALUE;
+    }
+
+    return value;
+}
+
+/** Returns single parsed value as a psS8. The input string must be cleaned and null terminated. */
+static psS8 parseS8(char *inString, psParseErrorType *status)
+{
+    char *end = NULL;
+    psS8 value = 0.0;
+
+
+    value = (psS8)strtol(inString, &end, 0);
+    if(*end != '\0') {
+        *status = PS_PARSE_ERROR_VALUE;
+    } else if(inString==end) {
+        *status = PS_PARSE_ERROR_VALUE;
+    }
+
+    return value;
+}
+
+/** Returns single parsed value as a psU16. The input string must be cleaned and null terminated. */
+static psU16 parseU16(char *inString, psParseErrorType *status)
+{
+    char *end = NULL;
+    psU16 value = 0.0;
+
+
+    value = (psU16)strtoul(inString, &end, 0);
+    if(*end != '\0') {
+        *status = PS_PARSE_ERROR_VALUE;
+    } else if(inString==end) {
+        *status = PS_PARSE_ERROR_VALUE;
+    }
+
+    return value;
+}
+
+/** Returns single parsed value as a psS16. The input string must be cleaned and null terminated. */
+static psS16 parseS16(char *inString, psParseErrorType *status)
+{
+    char *end = NULL;
+    psS16 value = 0.0;
+
+
+    value = (psS16)strtol(inString, &end, 0);
+    if(*end != '\0') {
+        *status = PS_PARSE_ERROR_VALUE;
+    } else if(inString==end) {
+        *status = PS_PARSE_ERROR_VALUE;
+    }
+
+    return value;
+}
+
+/** Returns single parsed value as a psU32. The input string must be cleaned and null terminated. */
+static psU32 parseU32(char *inString, psParseErrorType *status)
+{
+    char *end = NULL;
+    psU32 value = 0.0;
+
+
+    value = (psU32)strtoul(inString, &end, 0);
+    if(*end != '\0') {
+        *status = PS_PARSE_ERROR_VALUE;
+    } else if(inString==end) {
+        *status = PS_PARSE_ERROR_VALUE;
+    }
+
+    return value;
+}
+
+/** Returns single parsed value as a psS32. The input string must be cleaned and null terminated. */
+static psS32 parseS32(char *inString, psParseErrorType *status)
+{
+    char *end = NULL;
+    psS32 value = 0.0;
+
+
+    value = (psS32)strtol(inString, &end, 0);
+    if(*end != '\0') {
+        *status = PS_PARSE_ERROR_VALUE;
+    } else if(inString==end) {
+        *status = PS_PARSE_ERROR_VALUE;
+    }
+
+    return value;
+}
+
+/** Returns single parsed value as a psU64. The input string must be cleaned and null terminated. */
+static psU64 parseU64(char *inString, psParseErrorType *status)
+{
+    char *end = NULL;
+    psU64 value = 0.0;
+
+
+    value = (psU64)strtoull(inString, &end, 0);
+    if(*end != '\0') {
+        *status = PS_PARSE_ERROR_VALUE;
+    } else if(inString==end) {
+        *status = PS_PARSE_ERROR_VALUE;
+    }
+
+    return value;
+}
+
+/** Returns single parsed value as a psS64. The input string must be cleaned and null terminated. */
+static psS64 parseS64(char *inString, psParseErrorType *status)
+{
+    char *end = NULL;
+    psS64 value = 0.0;
+
+
+    value = (psS64)strtoll(inString, &end, 0);
+    if(*end != '\0') {
+        *status = PS_PARSE_ERROR_VALUE;
+    } else if(inString==end) {
+        *status = PS_PARSE_ERROR_VALUE;
+    }
+
+    return value;
+}
+
+/** Returns single parsed value as a psF32. The input string must be cleaned and null terminated. */
+static psF32 parseF32(char *inString, psParseErrorType *status)
+{
+    char *end = NULL;
+    psF32 value = 0.0;
+
+
+    value = (psF32)strtof(inString, &end);
+    if(*end != '\0') {
+        *status = PS_PARSE_ERROR_VALUE;
+    } else if(inString==end) {
+        *status = PS_PARSE_ERROR_VALUE;
+    }
+
+    return value;
+}
+
+/** Returns single parsed value as a psF64. The input string must be cleaned and null terminated. */
+static psF64 parseF64(char *inString, psParseErrorType *status)
+{
+    char *end = NULL;
+    psF64 value = 0.0;
+
+
+    value = (psF64)strtod(inString, &end);
+    if(*end != '\0') {
+        *status = PS_PARSE_ERROR_VALUE;
+    } else if(inString==end) {
+        *status = PS_PARSE_ERROR_VALUE;
+    }
+
+    return value;
+}
+
+/** Returns single parsed value as a double precision number. The input string must be cleaned and null
+ * terminated. */
+static void parseValue(psVector *vec, psU64 index, char* strValue, psParseErrorType *status)
+{
+    psElemType type;
+
+
+    if(vec == NULL) {
+        *status = 1;
+        return;
+    }
+
+    type = vec->type.type;
+
+    switch(type) {
+    case PS_TYPE_U8:
+        vec->data.U8[index] = parseU8(strValue, status);
+        break;
+    case PS_TYPE_S8:
+        vec->data.S8[index] = parseS8(strValue, status);
+        break;
+    case PS_TYPE_U16:
+        vec->data.U16[index] = parseU16(strValue, status);
+        break;
+    case PS_TYPE_S16:
+        vec->data.S16[index] = parseS16(strValue, status);
+        break;
+    case PS_TYPE_U32:
+        vec->data.U32[index] = parseU32(strValue, status);
+        break;
+    case PS_TYPE_S32:
+        vec->data.S32[index] = parseS32(strValue, status);
+        break;
+    case PS_TYPE_U64:
+        vec->data.U64[index] = parseU64(strValue, status);
+        break;
+    case PS_TYPE_S64:
+        vec->data.S64[index] = parseS64(strValue, status);
+        break;
+    case PS_TYPE_F32:
+        vec->data.F32[index] = parseF32(strValue, status);
+        break;
+    case PS_TYPE_F64:
+        vec->data.F64[index] = parseF64(strValue, status);
+        break;
+    default:
+        *status = PS_PARSE_ERROR_TYPE;
+    }
+
+    return;
+}
+
+static psParseErrorType printError(psU64 lineCount, char* badText, psParseErrorType status)
+{
+    switch(status) {
+    case PS_PARSE_ERROR_VALUE:
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true, PS_ERRORTEXT_psLookupTable_PARSE_VALUE, badText, lineCount);
+        break;
+    case PS_PARSE_ERROR_TYPE:
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true, PS_ERRORTEXT_psLookupTable_PARSE_TYPE, badText, lineCount);
+        break;
+    case PS_PARSE_ERROR_GENERAL:
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true, PS_ERRORTEXT_psLookupTable_PARSE_GENERAL, badText, lineCount);
+        break;
+    default:
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true, PS_ERRORTEXT_psLookupTable_INVALID_TYPE, badText, lineCount);
+    }
+
+    return PS_LOOKUP_SUCCESS;
+}
+
+static void lookupTableFree(psLookupTable* table)
+{
+    if (table == NULL) {
+        return;
+    }
+
+    psFree(table->values);
+    psFree(table->index);
+    psFree((char*)table->fileName);
+}
+
+/*****************************************************************************/
+/* FUNCTION IMPLEMENTATION - PUBLIC                                          */
+/*****************************************************************************/
+
+psLookupTable* psLookupTableAlloc(const char *fileName, psF64 validFrom, psF64 validTo)
+{
+    psLookupTable *outTable = NULL;
+
+
+    // Can't read table if you don't know its name
+    PS_PTR_CHECK_NULL(fileName,NULL);
+
+    // Allocate lookup table
+    outTable = (psLookupTable*)psAlloc(sizeof(psLookupTable));
+
+    // Set deallocator
+    psMemSetDeallocator(outTable, (psFreeFcn)lookupTableFree);
+
+    // Allocate and set metadata item comment
+    outTable->fileName = psStringCopy(fileName);
+
+    // Number of table rows and columns. Automatically resized by table read.
+    outTable->numRows = 0;
+    outTable->numCols = 0;
+
+    // Valid ranges. Automatically set by table read if both zero.
+    outTable->validFrom = validFrom;
+    outTable->validTo = validTo;
+
+    // Vector of independent index values. Filled by table read.
+    outTable->index = NULL;
+
+    // Array of dependent table values corresponding to index values. Filled by table read.
+    outTable->values = NULL;
+
+    return outTable;
+}
+
+#define UPDATE_VALID_TO_FROM(TABLE)                                             \
+switch (TABLE->index->type.type) {                                              \
+case PS_TYPE_U8:                                                                \
+    TABLE->validFrom = (psF64)TABLE->index->data.U8[0];                         \
+    TABLE->validTo   = (psF64)TABLE->index->data.U8[TABLE->index->nalloc-1];    \
+    break;                                                                      \
+case PS_TYPE_S8:                                                                \
+    TABLE->validFrom = (psF64)TABLE->index->data.S8[0];                         \
+    TABLE->validTo   = (psF64)TABLE->index->data.S8[TABLE->index->nalloc-1];    \
+    break;                                                                      \
+case PS_TYPE_U16:                                                               \
+    TABLE->validFrom = (psF64)TABLE->index->data.U16[0];                        \
+    TABLE->validTo   = (psF64)TABLE->index->data.U16[TABLE->index->nalloc-1];   \
+    break;                                                                      \
+case PS_TYPE_S16:                                                               \
+    TABLE->validFrom = (psF64)TABLE->index->data.S16[0];                        \
+    TABLE->validTo   = (psF64)TABLE->index->data.S16[TABLE->index->nalloc-1];   \
+    break;                                                                      \
+case PS_TYPE_U32:                                                               \
+    TABLE->validFrom = (psF64)TABLE->index->data.U32[0];                        \
+    TABLE->validTo   = (psF64)TABLE->index->data.U32[TABLE->index->nalloc-1];   \
+    break;                                                                      \
+case PS_TYPE_S32:                                                               \
+    TABLE->validFrom = (psF64)TABLE->index->data.S32[0];                        \
+    TABLE->validTo   = (psF64)TABLE->index->data.S32[TABLE->index->nalloc-1];   \
+    break;                                                                      \
+case PS_TYPE_U64:                                                               \
+    TABLE->validFrom = (psF64)TABLE->index->data.U64[0];                        \
+    TABLE->validTo   = (psF64)TABLE->index->data.U64[TABLE->index->nalloc-1];   \
+    break;                                                                      \
+case PS_TYPE_S64:                                                               \
+    TABLE->validFrom = (psF64)TABLE->index->data.S64[0];                        \
+    TABLE->validTo   = (psF64)TABLE->index->data.S64[TABLE->index->nalloc-1];   \
+    break;                                                                      \
+case PS_TYPE_F32:                                                               \
+    TABLE->validFrom = (psF64)TABLE->index->data.F32[0];                        \
+    TABLE->validTo   = (psF64)TABLE->index->data.F32[TABLE->index->nalloc-1];   \
+    break;                                                                      \
+case PS_TYPE_F64:                                                               \
+    TABLE->validFrom = (psF64)TABLE->index->data.F64[0];                        \
+    TABLE->validTo   = (psF64)TABLE->index->data.F64[TABLE->index->nalloc-1];   \
+    break;                                                                      \
+default:                                                                        \
+    TABLE->validFrom = (psF64)0;                                                \
+    TABLE->validTo   = (psF64)0;                                                \
+    break;                                                                      \
+}
+
+#define COPY_VECTOR_VALUES(VEC_OUT,INDEX_OUT,VEC_IN,INDEX_IN)                              \
+switch(((psVector*)(VEC_IN))->type.type) {                                                 \
+case PS_TYPE_U8:                                                                           \
+    ((psVector*)VEC_OUT)->data.U8[INDEX_OUT] = ((psVector*)VEC_IN)->data.U8[INDEX_IN];     \
+    break;                                                                                 \
+case PS_TYPE_U16:                                                                          \
+    ((psVector*)VEC_OUT)->data.U16[INDEX_OUT] = ((psVector*)VEC_IN)->data.U16[INDEX_IN];   \
+    break;                                                                                 \
+case PS_TYPE_U32:                                                                          \
+    ((psVector*)VEC_OUT)->data.U32[INDEX_OUT] = ((psVector*)VEC_IN)->data.U32[INDEX_IN];   \
+    break;                                                                                 \
+case PS_TYPE_U64:                                                                          \
+    ((psVector*)VEC_OUT)->data.U64[INDEX_OUT] = ((psVector*)VEC_IN)->data.U64[INDEX_IN];   \
+    break;                                                                                 \
+case PS_TYPE_S8:                                                                           \
+    ((psVector*)VEC_OUT)->data.S8[INDEX_OUT] = ((psVector*)VEC_IN)->data.S8[INDEX_IN];     \
+    break;                                                                                 \
+case PS_TYPE_S16:                                                                          \
+    ((psVector*)VEC_OUT)->data.S16[INDEX_OUT] = ((psVector*)VEC_IN)->data.S16[INDEX_IN];   \
+    break;                                                                                 \
+case PS_TYPE_S32:                                                                          \
+    ((psVector*)VEC_OUT)->data.S32[INDEX_OUT] = ((psVector*)VEC_IN)->data.S32[INDEX_IN];   \
+    break;                                                                                 \
+case PS_TYPE_S64:                                                                          \
+    ((psVector*)VEC_OUT)->data.S64[INDEX_OUT] = ((psVector*)VEC_IN)->data.S64[INDEX_IN];   \
+    break;                                                                                 \
+case PS_TYPE_F32:                                                                          \
+    ((psVector*)VEC_OUT)->data.F32[INDEX_OUT] = ((psVector*)VEC_IN)->data.F32[INDEX_IN];   \
+    break;                                                                                 \
+case PS_TYPE_F64:                                                                          \
+    ((psVector*)VEC_OUT)->data.F64[INDEX_OUT] = ((psVector*)VEC_IN)->data.F64[INDEX_IN];   \
+    break;                                                                                 \
+default:                                                                                   \
+    break;                                                                                 \
+}
+
+
+psLookupTable* psLookupTableRead(psLookupTable *table)
+{
+    bool typeLine = true;
+    char *line = NULL;
+    char *strType = NULL;
+    char *strValue = NULL;
+    char *linePtr = NULL;
+    psParseErrorType status = PS_PARSE_SUCCESS;
+    psParseErrorType lineStatus = PS_PARSE_SUCCESS;
+    psU64 lineCount = 0;
+    psU64 numRows = 0;
+    psU64 numCols = 0;
+    psU64 failedLines = 0;
+    FILE *fp = NULL;
+    psElemType elemType;
+    psVector *indexVec = NULL;
+    psVector *valuesVec = NULL;
+    psArray *values = NULL;
+    psBool sortIndex = false;
+
+    // Check for NULL input table
+    PS_PTR_CHECK_NULL(table,NULL);
+
+    // Check for input table with NULL file name
+    PS_PTR_CHECK_NULL(table->fileName,NULL);
+
+    // Open table file specified by table->fileName
+    if((fp=fopen(table->fileName, "r")) == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true, PS_ERRORTEXT_psLookupTable_FILE_NOT_FOUND,
+                table->fileName);
+        return table;
+    }
+
+    // Initialize vector pointers
+    indexVec = table->index;
+    values = table->values = psArrayAlloc(10);
+    values->n = 0;
+
+    // Create reusable line for continuous read
+    line = (char*)psAlloc(MAX_STRING_LENGTH*sizeof(char));
+
+    // Loop through file to get numRows, numCols, and column data types
+    while((fgets(line, MAX_STRING_LENGTH, fp) != NULL) && (lineStatus == PS_PARSE_SUCCESS)) {
+
+        // Initialize variables for new line
+        linePtr = line;
+        lineCount++;
+
+        // If line is not a comment or blank, then extract data
+        if(!ignoreLine(linePtr)) {
+
+            if(typeLine == true) {
+
+                // Determine column types from first line in data file after comments
+                while((strType=getToken(&linePtr," ",&status))) {
+                    numCols++;
+                    typeLine = false;
+                    if(!strncmp(strType, "psU8", 4)) {
+                        elemType = PS_TYPE_U8;
+                    } else if(!strncmp(strType, "psS8", 4)) {
+                        elemType = PS_TYPE_S8;
+                    } else if(!strncmp(strType, "psU16", 5)) {
+                        elemType = PS_TYPE_U16;
+                    } else if(!strncmp(strType, "psS16", 5)) {
+                        elemType = PS_TYPE_S16;
+                    } else if(!strncmp(strType, "psU32", 5)) {
+                        elemType = PS_TYPE_U32;
+                    } else if(!strncmp(strType, "psS32", 5)) {
+                        elemType = PS_TYPE_S32;
+                    } else if(!strncmp(strType, "psU64", 5)) {
+                        elemType = PS_TYPE_U64;
+                    } else if(!strncmp(strType, "psS64", 5)) {
+                        elemType = PS_TYPE_S64;
+                    } else if(!strncmp(strType, "psF32", 5)) {
+                        elemType = PS_TYPE_F32;
+                    } else if(!strncmp(strType, "psF64", 5)) {
+                        elemType = PS_TYPE_F64;
+                    } else {
+                        status = PS_PARSE_ERROR_TYPE;
+                    }
+
+                    // Realloc number of columns as you go
+                    psVector* vec = psVectorAlloc(0, elemType);
+                    if(numCols == 1) {
+                        indexVec = vec;
+                    } else {
+                        psArrayAdd(values,0,vec);
+                        psFree(vec);
+                    }
+
+                    if(status) {
+                        printError(lineCount, strValue, status);
+                        failedLines++;
+                        lineStatus = status;
+                        status = PS_PARSE_SUCCESS;
+                    }
+                    psFree(strType);
+                }
+            } else {
+                // Parse and add values to all columns
+                numRows++;
+                numCols = 0;
+                while((strValue=getToken(&linePtr," ",&status))) {
+                    numCols++;
+
+                    // Realloc number of rows as you go
+                    if(numCols == 1) {
+                        sortIndex = false;
+                        indexVec = psVectorRecycle(indexVec, numRows, indexVec->type.type);
+                        parseValue(indexVec, numRows-1, strValue, &status);
+                    } else {
+                        valuesVec = values->data[numCols-2];
+                        valuesVec = psVectorRecycle(valuesVec, numRows, valuesVec->type.type);
+                        parseValue(valuesVec, numRows-1, strValue, &status);
+                    }
+
+                    if(status) {
+                        printError(lineCount, strValue, status);
+                        failedLines++;
+                        lineStatus = status;
+                        status = PS_PARSE_SUCCESS;
+                    }
+                    psFree(strValue);
+                } // end while
+            } // end else
+        } // if ignoreLine
+    } // end while
+
+    psFree(line);
+
+    // Set table for return
+    table->numRows = numRows;
+    table->numCols = numCols-1;
+    table->index = indexVec;
+    table->values = values;
+
+    // Set table values to indicate error detected during the read
+    if(lineStatus) {
+        table->numRows = 0;
+        table->numCols = 0;
+        table->validFrom = 0;
+        table->validTo = 0;
+        psError(PS_ERR_UNKNOWN,false,PS_ERRORTEXT_psLookupTable_TABLE_INVALID);
+    } else {
+        // Check if index vector needs to be sorted
+        psVector* sortedIndex = psVectorAlloc(table->numRows,PS_TYPE_U32);
+        sortedIndex = psVectorSortIndex(sortedIndex,table->index);
+        for(psS32 i = 0; i < numRows; i++ ) {
+            if(sortedIndex->data.U32[i] != i) {
+                sortIndex = true;
+                break;
+            }
+        }
+        // Check if it is necessary to sort value vectors
+        if(sortIndex) {
+            // Allocate new index vector
+            psVector* newIndexVector = psVectorAlloc(numRows,indexVec->type.type);
+            // Allocate new value vectors
+            psArray* newValueArray = psArrayAlloc(numCols-1);
+            for(psS32 j = 0; j < numCols-1; j++) {
+                psS32 type = ((psVector*)(table->values->data[j]))->type.type;
+                newValueArray->data[j] = psVectorAlloc(numRows,type);
+            }
+            for(psS32 i = 0; i < numRows; i++) {
+                // Populate new index vector
+                psU32 sortIndex = sortedIndex->data.U32[i];
+                COPY_VECTOR_VALUES(newIndexVector,i, indexVec,sortIndex)
+                // For every column populate new value vectors
+                for(psS32 j=0; j < numCols-1; j++) {
+                    COPY_VECTOR_VALUES(newValueArray->data[j],i,table->values->data[j], sortIndex)
+                }
+            }
+            // Free old index vector
+            psFree(table->index);
+            // Free old value vectors
+            psFree(table->values);
+            // Assign new vector value to table
+            table->index = newIndexVector;
+            // Assign new value vectors to table array
+            table->values = newValueArray;
+        }
+        psFree(sortedIndex);
+        // Update the validTo and validFrom
+        UPDATE_VALID_TO_FROM(table)
+    }
+
+    fclose(fp);
+
+    return table;
+}
+
+#define CONVERT_VALUE_TO_F64(VECTOR,INDEX,RESULT)     \
+switch(VECTOR->type.type) {                           \
+case PS_TYPE_U8:                                      \
+    RESULT = (psF64)VECTOR->data.U8[INDEX];           \
+    break;                                            \
+case PS_TYPE_U16:                                     \
+    RESULT = (psF64)VECTOR->data.U16[INDEX];          \
+    break;                                            \
+case PS_TYPE_U32:                                     \
+    RESULT = (psF64)VECTOR->data.U32[INDEX];          \
+    break;                                            \
+case PS_TYPE_U64:                                     \
+    RESULT = (psF64)VECTOR->data.U64[INDEX];          \
+    break;                                            \
+case PS_TYPE_S8:                                      \
+    RESULT = (psF64)VECTOR->data.S8[INDEX];           \
+    break;                                            \
+case PS_TYPE_S16:                                     \
+    RESULT = (psF64)VECTOR->data.S16[INDEX];          \
+    break;                                            \
+case PS_TYPE_S32:                                     \
+    RESULT = (psF64)VECTOR->data.S32[INDEX];          \
+    break;                                            \
+case PS_TYPE_S64:                                     \
+    RESULT = (psF64)VECTOR->data.S64[INDEX];          \
+    break;                                            \
+case PS_TYPE_F32:                                     \
+    RESULT = (psF64)VECTOR->data.F32[INDEX];          \
+    break;                                            \
+case PS_TYPE_F64:                                     \
+    RESULT = VECTOR->data.F64[INDEX];                 \
+    break;                                            \
+default:                                              \
+    RESULT = NAN;                                     \
+    break;                                            \
+}
+
+
+#define CHECK_LOWER_UPPER_BOUND(TABLE,INDEX,COLUMN)                                \
+switch (TABLE->index->type.type) {                                                 \
+case PS_TYPE_U8:                                                                   \
+    if( (psU8)index < TABLE->index->data.U8[0] ) {                                 \
+        *status = PS_LOOKUP_PAST_TOP;                                              \
+    }                                                                              \
+    if( (psU8)index > TABLE->index->data.U8[numRows-1]) {                          \
+        *status = PS_LOOKUP_PAST_BOTTOM;                                           \
+    }                                                                              \
+    break;                                                                         \
+case PS_TYPE_U16:                                                                  \
+    if( (psU16)index < TABLE->index->data.U16[0] ) {                               \
+        *status = PS_LOOKUP_PAST_TOP;                                              \
+    }                                                                              \
+    if( (psU16)index > TABLE->index->data.U16[numRows-1] ) {                       \
+        *status = PS_LOOKUP_PAST_BOTTOM;                                           \
+    }                                                                              \
+    break;                                                                         \
+case PS_TYPE_U32:                                                                  \
+    if( (psU32)index < TABLE->index->data.U32[0]) {                                \
+        *status = PS_LOOKUP_PAST_TOP;                                              \
+    }                                                                              \
+    if ( (psU32)index > TABLE->index->data.U32[numRows-1] ) {                      \
+        *status = PS_LOOKUP_PAST_BOTTOM;                                           \
+    }                                                                              \
+    break;                                                                         \
+case PS_TYPE_U64:                                                                  \
+    if( (psU64)index < TABLE->index->data.U64[0] ) {                               \
+        *status = PS_LOOKUP_PAST_TOP;                                              \
+    }                                                                              \
+    if( (psU64)index > TABLE->index->data.U64[numRows-1] ) {                       \
+        *status = PS_LOOKUP_PAST_BOTTOM;                                           \
+    }                                                                              \
+    break;                                                                         \
+case PS_TYPE_S8:                                                                   \
+    if( (psS8)index < TABLE->index->data.S8[0] ) {                                 \
+        *status = PS_LOOKUP_PAST_TOP;                                              \
+    }                                                                              \
+    if( (psS8)index > TABLE->index->data.S8[numRows-1] ) {                         \
+        *status = PS_LOOKUP_PAST_BOTTOM;                                           \
+    }                                                                              \
+    break;                                                                         \
+case PS_TYPE_S16:                                                                  \
+    if( (psS16)index < TABLE->index->data.S16[0] ) {                               \
+        *status = PS_LOOKUP_PAST_TOP;                                              \
+    }                                                                              \
+    if( (psS16)index > TABLE->index->data.S16[numRows-1] ) {                       \
+        *status = PS_LOOKUP_PAST_BOTTOM;                                           \
+    }                                                                              \
+    break;                                                                         \
+case PS_TYPE_S32:                                                                  \
+    if( (psS32)index < TABLE->index->data.S32[0] ) {                               \
+        *status = PS_LOOKUP_PAST_TOP;                                              \
+    }                                                                              \
+    if( (psS32)index > TABLE->index->data.S32[numRows-1] ) {                       \
+        *status = PS_LOOKUP_PAST_BOTTOM;                                           \
+    }                                                                              \
+    break;                                                                         \
+case PS_TYPE_S64:                                                                  \
+    if( (psS64)index < TABLE->index->data.S64[0] ) {                               \
+        *status = PS_LOOKUP_PAST_TOP;                                              \
+    }                                                                              \
+    if( (psS64)index > TABLE->index->data.S64[numRows-1] ) {                       \
+        *status = PS_LOOKUP_PAST_BOTTOM;                                           \
+    }                                                                              \
+    break;                                                                         \
+case PS_TYPE_F32:                                                                  \
+    if( (psF32)index < TABLE->index->data.F32[0] ) {                               \
+        *status = PS_LOOKUP_PAST_TOP;                                              \
+    }                                                                              \
+    if( (psF32)index > TABLE->index->data.F32[numRows-1] ) {                       \
+        *status = PS_LOOKUP_PAST_BOTTOM;                                           \
+    }                                                                              \
+    break;                                                                         \
+case PS_TYPE_F64:                                                                  \
+    if( index < TABLE->index->data.F64[0] ) {                                      \
+        *status = PS_LOOKUP_PAST_TOP;                                              \
+    }                                                                              \
+    if( index > TABLE->index->data.F64[numRows-1] ) {                              \
+        *status = PS_LOOKUP_PAST_BOTTOM;                                           \
+    }                                                                              \
+    break;                                                                         \
+default:                                                                           \
+    *status = PS_LOOKUP_ERROR;                                                     \
+    return NAN;                                                                    \
+    break;                                                                         \
+}                                                                                  \
+if(*status == PS_LOOKUP_PAST_TOP) {                                                \
+    CONVERT_VALUE_TO_F64(((psVector*)(TABLE->values->data[COLUMN])),0,out)         \
+    return out;                                                                    \
+} else if (*status == PS_LOOKUP_PAST_BOTTOM) {                                     \
+    CONVERT_VALUE_TO_F64(((psVector*)(TABLE->values->data[COLUMN])),numRows-1,out) \
+    return out;                                                                    \
+}
+
+
+psF64 psLookupTableInterpolate(psLookupTable *table, psF64 index, psU64 column, psLookupStatusType *status)
+{
+    psU64 hiIdx = 0;
+    psU64 loIdx = 0;
+    psU64 numRows = 0;
+    psU64 numCols = 0;
+    psF64 out = 0.0;
+    psF64 denom = 0.0;
+    psF64 convertVal = 0.0;
+    psF64 tempVal = 0.0;
+    psVector *indexVec = NULL;
+    psVector *valuesVec = NULL;
+    psArray *values = NULL;
+
+    // Error checks
+    // Set status to error prior to check since if checks fails it will immediately return
+    PS_PTR_CHECK_NULL(status,NAN);
+    *status = PS_LOOKUP_ERROR;
+    PS_PTR_CHECK_NULL(table,NAN);
+    indexVec = table->index;
+    values = table->values;
+    numRows = table->numRows;
+    numCols = table->numCols;
+    PS_PTR_CHECK_NULL(indexVec,NAN);
+    PS_PTR_CHECK_NULL(values,NAN);
+    PS_INT_CHECK_EQUALS(numRows, 0,NAN);
+    PS_INT_CHECK_EQUALS(numCols, 0,NAN);
+    PS_INT_CHECK_RANGE(column, 0, (int)(numCols-1), NAN);
+
+    valuesVec = (psVector*)values->data[column];
+    PS_PTR_CHECK_NULL(indexVec,NAN);
+
+    // Set status to success since it passed all parameter checks
+    *status = PS_LOOKUP_SUCCESS;
+
+    // Verify the index is within the bounds of the table
+    CHECK_LOWER_UPPER_BOUND(table,index,column)
+
+    // Find location in table where specified index is between to entries
+    CONVERT_VALUE_TO_F64(indexVec, 0, convertVal)
+    while(index > convertVal ) {
+        hiIdx++;
+        if(hiIdx >= numRows) {
+            psError(PS_ERR_BAD_PARAMETER_VALUE, true,
+                    PS_ERRORTEXT_psLookupTable_INTERPOLATE_HIGH, hiIdx);
+            *status = PS_LOOKUP_ERROR;
+            return NAN;
+        }
+        CONVERT_VALUE_TO_F64(indexVec, hiIdx, convertVal)
+    }
+
+    // Check for negative low index and generate error
+    loIdx = hiIdx--;
+    if(loIdx < 0) {
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true,
+                PS_ERRORTEXT_psLookupTable_INTERPOLATE_LOW, loIdx);
+        *status = PS_LOOKUP_ERROR;
+        return NAN;
+    }
+
+    // Perform linear interpolation to calculate return value
+    CONVERT_VALUE_TO_F64(indexVec, hiIdx, denom)
+    CONVERT_VALUE_TO_F64(indexVec, loIdx, convertVal);
+    denom -= convertVal;
+    if(fabs(denom) < FLT_EPSILON) {
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true, PS_ERRORTEXT_psLookupTable_DIVIDE_BY_ZERO);
+        *status = PS_LOOKUP_ERROR;
+        return NAN;
+    } else {
+        CONVERT_VALUE_TO_F64(valuesVec,hiIdx,tempVal)
+        CONVERT_VALUE_TO_F64(valuesVec,loIdx,convertVal)
+        tempVal -= convertVal;
+        CONVERT_VALUE_TO_F64(indexVec,loIdx,convertVal)
+        out = tempVal*(index-convertVal)/denom;
+        CONVERT_VALUE_TO_F64(valuesVec,loIdx,convertVal)
+        out += convertVal;
+    }
+
+    return out;
+}
+
+psVector* psLookupTableInterpolateAll(psLookupTable *table, psF64 index, psVector *stats)
+{
+    psU64 i = 0;
+    psU64 numCols = 0;
+    psVector *outVector = NULL;
+    psLookupStatusType status = PS_LOOKUP_SUCCESS;
+
+    // Error checks
+    PS_PTR_CHECK_NULL(table,NULL);
+    PS_PTR_CHECK_NULL(stats,NULL);
+    numCols = table->numCols;
+    PS_INT_CHECK_EQUALS(numCols, 0,NULL);
+
+    outVector = psVectorAlloc(numCols+1, PS_TYPE_F64);
+
+    // Fill vectors with results and status of results
+    for(i=0; i<numCols; i++) {
+        outVector->data.F64[i] = psLookupTableInterpolate(table, index, i, &status);
+        stats->data.U32[i] = status;
+    }
+
+    return outVector;
+}
+
Index: /tags/ipp-1-X/bug123/psLib/src/dataIO/psLookupTable.h
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/dataIO/psLookupTable.h	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/dataIO/psLookupTable.h	(revision 22331)
@@ -0,0 +1,112 @@
+/** @file  psLookupTable.h
+*
+*  @brief This file defines the structure and functions for table lookups.
+*
+*  @ingroup dataIO
+*
+*  @author Ross Harman, MHPCC
+*
+*  @version $Revision: 1.5 $ $Name: not supported by cvs2svn $
+*  @date $Date: 2005-04-08 17:58:57 $
+*
+*  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
+*/
+
+#ifndef PS_LOOKUPTABLE_H
+#define PS_LOOKUPTABLE_H
+
+#include "psType.h"
+#include "psVector.h"
+#include "psArray.h"
+
+
+/** Lookup table structure
+ *
+ *  Holds table data read from external data files.
+ *
+ */
+typedef struct
+{
+    const char *fileName;              ///< Name of file with table
+    psU64 numRows;                     ///< Number of table rows
+    psU64 numCols;                     ///< Number of table columns
+    psF64 validFrom;                   ///< Lower bound for rable read
+    psF64 validTo;                     ///< Upper bound for table read
+    psVector *index;                   ///< Vector of independent index values
+    psArray *values;                   ///< Array of dependent table values corresponding to index values
+}
+psLookupTable;
+
+
+/** Lookup table lookup status and error conditions
+ *
+ *  Success, failure, and status conditions for table lookups.
+ */
+typedef enum {
+    PS_LOOKUP_SUCCESS             = 0x0000,        ///< Table lookup succeeded
+    PS_LOOKUP_PAST_TOP            = 0x0101,        ///< Lookup off top of table
+    PS_LOOKUP_PAST_BOTTOM         = 0x0102,        ///< Lookup off bottom of table
+    PS_LOOKUP_ERROR               = 0x0104         ///< Any other type of lookup error
+} psLookupStatusType;
+
+/** Lookup table parse status and error conditions
+ *
+ *  Success, failure, and status conditions for table parsing.
+ */
+typedef enum {
+    PS_PARSE_SUCCESS              = 0x0000,        ///< Table lookup succeeded
+    PS_PARSE_ERROR_TYPE           = 0x0101,        ///< Error parsing type
+    PS_PARSE_ERROR_VALUE          = 0x0102,        ///< Error parsing numerical value
+    PS_PARSE_ERROR_GENERAL        = 0x0104         ///< Any other type of lookup error
+}psParseErrorType;
+
+/** Allocator for psLookupTable struct
+ *
+ *  Allocates a new psLookupTable struct.
+ *
+ *  @return psLookupTable*     New psLookupTable struct.
+ */
+psLookupTable* psLookupTableAlloc(
+    const char *fileName,           ///< Name of file to read
+    psF64 validFrom,                ///< Lower bound for rable read
+    psF64 validTo                   ///< Upper bound for table read
+);
+
+/** Read lookup table
+ *
+ *  Reads a lookup table and fills corresponding psLookupTable struct.
+ *
+ *  @return psLookupTable*     New psLookupTable struct.
+ */
+psLookupTable* psLookupTableRead(
+    psLookupTable *table            ///< Table to read
+);
+
+/** Lookup and interpolate value from table.
+ *
+ *  Interpolates value from table. Sets status bit for success or one of several possible failure
+ *  conditions.
+ *
+ *  @return psLookupTable*     New psLookupTable struct
+ */
+psF64 psLookupTableInterpolate(
+    psLookupTable *table,           ///< Table with data
+    psF64 index,                    ///< Value to be interpolated
+    psU64 column,                   ///< Column in table to be interpolated
+    psLookupStatusType *status      ///< Status of lookup
+);
+
+/** Lookup and interpolate all values from table.
+ *
+ *  Interpolates all values from table. Sets status bit for success or one of several possible failure
+ *  conditions.
+ *
+ *  @return psLookupTable*     New psLookupTable struct
+ */
+psVector* psLookupTableInterpolateAll(
+    psLookupTable *table,           ///< Table with data
+    psF64 index,                    ///< Value to be interpolated
+    psVector *stats                 ///< Vector of status for each lookup
+);
+
+#endif
Index: /tags/ipp-1-X/bug123/psLib/src/dataManip/.cvsignore
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/dataManip/.cvsignore	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/dataManip/.cvsignore	(revision 22331)
@@ -0,0 +1,7 @@
+Makefile.in
+.deps
+.libs
+Makefile
+*.lo
+*.la
+
Index: /tags/ipp-1-X/bug123/psLib/src/dataManip/Makefile.am
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/dataManip/Makefile.am	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/dataManip/Makefile.am	(revision 22331)
@@ -0,0 +1,33 @@
+#Makefile for dataManip functions of psLib
+#
+INCLUDES = \
+	-I$(top_srcdir)/src/astronomy \
+	-I$(top_srcdir)/src/collections \
+	-I$(top_srcdir)/src/dataIO \
+	-I$(top_srcdir)/src/image \
+	-I$(top_srcdir)/src/sysUtils \
+	$(all_includes)
+
+noinst_LTLIBRARIES = libpslibdataManip.la
+
+libpslibdataManip_la_SOURCES = psUnaryOp.c psBinaryOp.c psStats.c \
+		psFunctions.c psMatrix.c psVectorFFT.c psMinimize.c psRandom.c
+	   
+BUILT_SOURCES = psDataManipErrors.h
+EXTRA_DIST = psDataManipErrors.dat psDataManipErrors.h dataManip.i
+
+psDataManipErrors.h: psDataManipErrors.dat
+	perl $(top_srcdir)/src/parseErrorCodes.pl --data=$? $@
+
+pslibincludedir = $(includedir)
+pslibinclude_HEADERS = \
+	psConstants.h \
+	psStats.h  \
+	psFunctions.h \
+	psMatrix.h \
+    psBinaryOp.h \
+    psUnaryOp.h \
+	psVectorFFT.h \
+	psMinimize.h \
+	psRandom.h
+ 
Index: /tags/ipp-1-X/bug123/psLib/src/dataManip/dataManip.i
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/dataManip/dataManip.i	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/dataManip/dataManip.i	(revision 22331)
@@ -0,0 +1,11 @@
+/* dataManip headers */
+%include "psConstants.h"
+%include "psDataManipErrors.h"
+%include "psFunctions.h"
+%include "psMatrix.h"
+%include "psBinaryOp.h"
+%include "psUnaryOp.h"
+%include "psMinimize.h"
+%include "psRandom.h"
+%include "psStats.h"
+%include "psVectorFFT.h"
Index: /tags/ipp-1-X/bug123/psLib/src/dataManip/psBinaryOp.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/dataManip/psBinaryOp.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/dataManip/psBinaryOp.c	(revision 22331)
@@ -0,0 +1,582 @@
+/** @file  psBinaryOp.c
+ *
+ *  @brief Provides binary functions for simple matrix and vector element operations. Functions
+ *  include:
+ *
+ *      Addition (+)
+ *      Subtraction (-)
+ *      Multiplication (*)
+ *      Division (/)
+ *      Power (^)
+ *      Minimum (min)
+ *      Maximum (max)
+ *      Absolute value (abs)
+ *      Exponent (exp)
+ *      Natural Log (ln)
+ *      Power of 10 (ten)
+ *      Log (log)
+ *      Sine (sin or dsin)
+ *      Cosine (cos or dcos)
+ *      Tangent (tan or dtan)
+ *      Arcsine (asin or dasin)
+ *      Arccosine (acos or dacos)
+ *      Arctan (atan or datan)
+ *
+ *  Currently only vector-vector and image-image binary operations are supported.
+ *
+ *  @ingroup MatrixArithmetic
+ *
+ *  @author Ross Harman, MHPCC
+ *  @author Robert DeSonia, MHPCC
+ *
+ *  @version $Revision: 1.1 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-02-10 02:36:41 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+
+/******************************************************************************
+ *  INCLUDE FILES                                                             *
+ ******************************************************************************/
+#include <string.h>
+#include <math.h>
+#include <stdint.h>
+
+#include "psMemory.h"
+#include "psError.h"
+#include "psImage.h"
+#include "psVector.h"
+#include "psScalar.h"
+#include "psLogMsg.h"
+#include "psConstants.h"
+#include "psDataManipErrors.h"
+
+/*****************************************************************************
+ *  FUNCTION IMPLEMENTATION - LOCAL                                          *
+ *****************************************************************************/
+
+// Conversion for degrees to radians
+#define D2R 0.01745329252111111  /* PI/180 */
+
+// Conversion for radians to degrees
+#define R2D 57.29577950924861   /* 180.0/PI */
+
+// Binary SCALAR_XXXX operations
+#define SCALAR_SCALAR(OUT,IN1,OP,IN2,TYPE)                                                                   \
+{                                                                                                            \
+    ps##TYPE *o = NULL;                                                                                      \
+    ps##TYPE *i1 = NULL;                                                                                     \
+    ps##TYPE *i2 = NULL;                                                                                     \
+    o  = &((psScalar* )OUT)->data.TYPE;                                                                      \
+    i1 = &((psScalar* )IN1)->data.TYPE;                                                                      \
+    i2 = &((psScalar* )IN2)->data.TYPE;                                                                      \
+    *o = OP;                                                                                                 \
+}
+
+#define SCALAR_VECTOR(OUT,IN1,OP,IN2,TYPE)                                                                   \
+{                                                                                                            \
+    psS32 i = 0;                                                                                               \
+    psS32 npt = 0;                                                                                             \
+    ps##TYPE *o = NULL;                                                                                      \
+    ps##TYPE *i1 = NULL;                                                                                     \
+    ps##TYPE *i2 = NULL;                                                                                     \
+    npt  = ((psVector* )IN2)->n;                                                                             \
+    o  = ((psVector* )OUT)->data.TYPE;                                                                       \
+    i1 = &((psScalar* )IN1)->data.TYPE;                                                                      \
+    i2 = ((psVector* )IN2)->data.TYPE;                                                                       \
+    for (i=0; i < npt; i++, o++, i2++) {                                                                     \
+        *o = OP;                                                                                             \
+    }                                                                                                        \
+}
+
+#define SCALAR_IMAGE(OUT,IN1,OP,IN2,TYPE)                                                                    \
+{                                                                                                            \
+    psS32 i = 0;                                                                                               \
+    psS32 j = 0;                                                                                               \
+    psS32 numRows = 0;                                                                                         \
+    psS32 numCols = 0;                                                                                         \
+    ps##TYPE *o = NULL;                                                                                      \
+    ps##TYPE *i1 = NULL;                                                                                     \
+    ps##TYPE *i2 = NULL;                                                                                     \
+    numRows = ((psImage* )IN2)->numRows;                                                                     \
+    numCols = ((psImage* )IN2)->numCols;                                                                     \
+    for(j = 0; j < numCols; j++) {                                                                           \
+        o  = ((psImage* )OUT)->data.TYPE[j];                                                                 \
+        i1 = &((psScalar* )IN1)->data.TYPE;                                                                  \
+        i2 = ((psImage* )IN2)->data.TYPE[j];                                                                 \
+        for(i = 0; i < numRows; i++, o++, i2++) {                                                            \
+            *o = OP;                                                                                         \
+        }                                                                                                    \
+    }                                                                                                        \
+}
+
+// Binary VECTOR_XXXX operations
+#define VECTOR_SCALAR(OUT,IN1,OP,IN2,TYPE)                                                                   \
+{                                                                                                            \
+    psS32 i = 0;                                                                                               \
+    psS32 n1 = 0;                                                                                              \
+    ps##TYPE *o = NULL;                                                                                      \
+    ps##TYPE *i1 = NULL;                                                                                     \
+    ps##TYPE *i2 = NULL;                                                                                     \
+    n1  = ((psVector* )IN1)->n;                                                                              \
+    o  = ((psVector* )OUT)->data.TYPE;                                                                       \
+    i1 = ((psVector* )IN1)->data.TYPE;                                                                       \
+    i2 = &((psScalar* )IN2)->data.TYPE;                                                                      \
+    for (i=0; i < n1; i++, o++, i1++) {                                                                      \
+        *o = OP;                                                                                             \
+    }                                                                                                        \
+}
+
+#define VECTOR_VECTOR(OUT,IN1,OP,IN2,TYPE)                                                                   \
+{                                                                                                            \
+    psS32 i = 0;                                                                                             \
+    psS32 n1 = 0;                                                                                            \
+    psS32 n2 = 0;                                                                                            \
+    ps##TYPE *o = NULL;                                                                                      \
+    ps##TYPE *i1 = NULL;                                                                                     \
+    ps##TYPE *i2 = NULL;                                                                                     \
+    n1  = ((psVector* )IN1)->n;                                                                              \
+    n2  = ((psVector* )IN2)->n;                                                                              \
+    if(n1 != n2) {                                                                                           \
+        psError(PS_ERR_BAD_PARAMETER_SIZE, true,                                                             \
+                PS_ERRORTEXT_psMatrix_COUNT_DIFFERS,                                                         \
+                n1, n2);                                                                                     \
+        if (OUT != IN1 && OUT != IN2) {                                                                      \
+            psFree(OUT);                                                                                     \
+        }                                                                                                    \
+        return NULL;                                                                                         \
+    }                                                                                                        \
+    o  = ((psVector* )OUT)->data.TYPE;                                                                       \
+    i1 = ((psVector* )IN1)->data.TYPE;                                                                       \
+    i2 = ((psVector* )IN2)->data.TYPE;                                                                       \
+    for (i=0; i < n1; i++, o++, i1++, i2++) {                                                                \
+        *o = OP;                                                                                             \
+    }                                                                                                        \
+}
+
+#define VECTOR_IMAGE(OUT,IN1,OP,IN2,TYPE)                                                                    \
+{                                                                                                            \
+    psS32 i = 0;                                                                                             \
+    psS32 j = 0;                                                                                             \
+    psS32 n1 = 0;                                                                                            \
+    psS32 numRows2 = 0;                                                                                      \
+    psS32 numCols2 = 0;                                                                                      \
+    psDimen dim1 = 0;                                                                                        \
+    ps##TYPE *o = NULL;                                                                                      \
+    ps##TYPE *i1 = NULL;                                                                                     \
+    ps##TYPE *i2 = NULL;                                                                                     \
+    n1  = ((psVector* )IN1)->n;                                                                              \
+    dim1 = ((psVector* )IN1)->type.dimen;                                                                    \
+    numRows2 = ((psImage* )IN2)->numRows;                                                                    \
+    numCols2 = ((psImage* )IN2)->numCols;                                                                    \
+    \
+    if(dim1 == PS_DIMEN_VECTOR) { /* Regular vectors */                                             \
+        if(n1!=numRows2) {                                                                                   \
+            psError(PS_ERR_BAD_PARAMETER_SIZE, true,                                                         \
+                    PS_ERRORTEXT_psMatrix_COUNT_DIFFERS,                                                           \
+                    n1, numRows2);                                                                           \
+            if (OUT != IN1 && OUT != IN2) {                                                                  \
+                psFree(OUT);                                                                                 \
+            }                                                                                                \
+            return NULL;                                                                                     \
+        }                                                                                                    \
+        \
+        i1 = ((psVector* )IN1)->data.TYPE;                                                                   \
+        for(j = 0; j < numRows2; j++, i1++) {                                                                \
+            o  = ((psImage* )OUT)->data.TYPE[j];                                                             \
+            i2 = ((psImage* )IN2)->data.TYPE[j];                                                             \
+            for(i = 0; i < numCols2; i++, o++, i2++) {                                                       \
+                *o = OP;                                                                                     \
+            }                                                                                                \
+        }                                                                                                    \
+    } else {  /* Transposed vectors */                                                                       \
+        if(n1!=numCols2) {                                                                                   \
+            psError(PS_ERR_BAD_PARAMETER_SIZE, true,                                                 \
+                    PS_ERRORTEXT_psMatrix_COUNT_DIFFERS,                                                     \
+                    n1, numCols2);                       \
+            if (OUT != IN1 && OUT != IN2) {                                                                  \
+                psFree(OUT);                                                                                 \
+            }                                                                                                \
+            return NULL;                                                                                     \
+        }                                                                                                    \
+        \
+        for(j = 0; j < numRows2; j++) {                                                                      \
+            o  = ((psImage* )OUT)->data.TYPE[j];                                                             \
+            i1 = ((psVector* )IN1)->data.TYPE;                                                               \
+            i2 = ((psImage* )IN2)->data.TYPE[j];                                                             \
+            for(i = 0; i < numCols2; i++, o++, i1++, i2++) {                                                 \
+                *o = OP;                                                                                     \
+            }                                                                                                \
+        }                                                                                                    \
+    }                                                                                                        \
+}
+
+// Binary IMAGE_XXXX operations
+#define IMAGE_SCALAR(OUT,IN1,OP,IN2,TYPE)                                                                    \
+{                                                                                                            \
+    psS32 i = 0;                                                                                               \
+    psS32 j = 0;                                                                                               \
+    psS32 numRows = 0;                                                                                         \
+    psS32 numCols = 0;                                                                                         \
+    ps##TYPE *o = NULL;                                                                                      \
+    ps##TYPE *i1 = NULL;                                                                                     \
+    ps##TYPE *i2 = NULL;                                                                                     \
+    numRows = ((psImage* )IN1)->numRows;                                                                     \
+    numCols = ((psImage* )IN1)->numCols;                                                                     \
+    for(j = 0; j < numRows; j++) {                                                                           \
+        o  = ((psImage* )OUT)->data.TYPE[j];                                                                 \
+        i1 = ((psImage* )IN1)->data.TYPE[j];                                                                 \
+        i2 = &((psScalar* )IN2)->data.TYPE;                                                                  \
+        for(i = 0; i < numCols; i++, o++, i1++) {                                                            \
+            *o = OP;                                                                                         \
+        }                                                                                                    \
+    }                                                                                                        \
+}
+
+#define IMAGE_VECTOR(OUT,IN1,OP,IN2,TYPE)                                                                    \
+{                                                                                                            \
+    psS32 i = 0;                                                                                               \
+    psS32 j = 0;                                                                                               \
+    psS32 n2 = 0;                                                                                              \
+    psS32 numRows1 = 0;                                                                                        \
+    psS32 numCols1 = 0;                                                                                        \
+    psDimen dim2 = 0;                                                                                        \
+    ps##TYPE *o = NULL;                                                                                      \
+    ps##TYPE *i1 = NULL;                                                                                     \
+    ps##TYPE *i2 = NULL;                                                                                     \
+    n2  = ((psVector* )IN2)->n;                                                                              \
+    dim2 = ((psVector* )IN2)->type.dimen;                                                                    \
+    numRows1 = ((psImage* )IN1)->numRows;                                                                    \
+    numCols1 = ((psImage* )IN1)->numCols;                                                                    \
+    \
+    if(dim2 == PS_DIMEN_VECTOR) { /* Regular vectors */                                             \
+        if(n2!=numRows1) {                                                                                   \
+            psError(PS_ERR_BAD_PARAMETER_SIZE, true,                                                         \
+                    PS_ERRORTEXT_psMatrix_COUNT_DIFFERS,                                                     \
+                    n2, numRows1);                                                                           \
+            if (OUT != IN1 && OUT != IN2) {                                                                  \
+                psFree(OUT);                                                                                 \
+            }                                                                                                \
+            return NULL;                                                                                     \
+        }                                                                                                    \
+        \
+        i2 = ((psVector* )IN2)->data.TYPE;                                                                   \
+        for(j = 0; j < numRows1; j++, i1++) {                                                                \
+            o  = ((psImage* )OUT)->data.TYPE[j];                                                             \
+            i1 = ((psImage* )IN1)->data.TYPE[j];                                                             \
+            for(i = 0; i < numCols1; i++, o++, i1++) {                                                       \
+                *o = OP;                                                                                     \
+            }                                                                                                \
+        }                                                                                                    \
+    } else {  /* Transposed vectors */                                                                       \
+        if(n2!=numCols1) {                                                                                   \
+            psError(PS_ERR_BAD_PARAMETER_SIZE, true,                                                         \
+                    PS_ERRORTEXT_psMatrix_COUNT_DIFFERS,                                                     \
+                    n2, numCols1);                                                                           \
+            if (OUT != IN1) {                                                                                \
+                psFree(OUT);                                                                                 \
+            }                                                                                                \
+            return NULL;                                                                                     \
+        }                                                                                                    \
+        \
+        for(j = 0; j < numRows1; j++) {                                                                      \
+            o  = ((psImage* )OUT)->data.TYPE[j];                                                             \
+            i1 = ((psVector* )IN2)->data.TYPE;                                                               \
+            i2 = ((psImage* )IN1)->data.TYPE[j];                                                             \
+            for(i = 0; i < numCols1; i++, o++, i2++, i1++) {                                                 \
+                *o = OP;                                                                                     \
+            }                                                                                                \
+        }                                                                                                    \
+    }                                                                                                        \
+}
+
+#define IMAGE_IMAGE(OUT,IN1,OP,IN2,TYPE)                                                                     \
+{                                                                                                            \
+    psS32 i = 0;                                                                                               \
+    psS32 j = 0;                                                                                               \
+    psS32 numRows1 = 0;                                                                                        \
+    psS32 numCols1 = 0;                                                                                        \
+    psS32 numRows2 = 0;                                                                                        \
+    psS32 numCols2 = 0;                                                                                        \
+    ps##TYPE *o = NULL;                                                                                      \
+    ps##TYPE *i1 = NULL;                                                                                     \
+    ps##TYPE *i2 = NULL;                                                                                     \
+    numRows1 = ((psImage* )IN1)->numRows;                                                                    \
+    numCols1 = ((psImage* )IN1)->numCols;                                                                    \
+    numRows2 = ((psImage* )IN2)->numRows;                                                                    \
+    numCols2 = ((psImage* )IN2)->numCols;                                                                    \
+    if(numRows1!=numRows2 || numCols1!=numCols2) {                                                           \
+        psError(PS_ERR_BAD_PARAMETER_SIZE, true,                                                             \
+                PS_ERRORTEXT_psMatrix_IMAGE_SIZE_DIFFERS,                                                     \
+                numCols1, numRows1, numCols2, numRows2);                                                     \
+        if (OUT != IN1 && OUT != IN2) {                                                                      \
+            psFree(OUT);                                                                                     \
+        }                                                                                                    \
+        return NULL;                                                                                         \
+    }                                                                                                        \
+    for(j = 0; j < numRows1; j++) {                                                                          \
+        o  = ((psImage* )OUT)->data.TYPE[j];                                                                 \
+        i1 = ((psImage* )IN1)->data.TYPE[j];                                                                 \
+        i2 = ((psImage* )IN2)->data.TYPE[j];                                                                 \
+        for(i = 0; i < numCols1; i++, o++, i1++, i2++) {                                                     \
+            *o = OP;                                                                                         \
+        }                                                                                                    \
+    }                                                                                                        \
+}
+
+// Preprocessor macro function to create arithmetic function based on input type
+#define BINARY_TYPE(DIM1,DIM2,OUT,IN1,OP,IN2)                                                                \
+switch (IN1->type) {                                                                                         \
+case PS_TYPE_U8:                                                                                             \
+    DIM1##_##DIM2(OUT,IN1,OP,IN2,U8);                                                                        \
+    break;                                                                                                   \
+case PS_TYPE_U16:                                                                                            \
+    DIM1##_##DIM2(OUT,IN1,OP,IN2,U16);                                                                       \
+    break;                                                                                                   \
+case PS_TYPE_U32:                                                                                            \
+    DIM1##_##DIM2(OUT,IN1,OP,IN2,U32);                                                                       \
+    break;                                                                                                   \
+case PS_TYPE_U64:                                                                                            \
+    DIM1##_##DIM2(OUT,IN1,OP,IN2,U64);                                                                       \
+    break;                                                                                                   \
+case PS_TYPE_S8:                                                                                             \
+    DIM1##_##DIM2(OUT,IN1,OP,IN2,S8);                                                                        \
+    break;                                                                                                   \
+case PS_TYPE_S16:                                                                                            \
+    DIM1##_##DIM2(OUT,IN1,OP,IN2,S16);                                                                       \
+    break;                                                                                                   \
+case PS_TYPE_S32:                                                                                            \
+    DIM1##_##DIM2(OUT,IN1,OP,IN2,S32);                                                                       \
+    break;                                                                                                   \
+case PS_TYPE_S64:                                                                                            \
+    DIM1##_##DIM2(OUT,IN1,OP,IN2,S64);                                                                       \
+    break;                                                                                                   \
+case PS_TYPE_F32:                                                                                            \
+    DIM1##_##DIM2(OUT,IN1,OP,IN2,F32);                                                                       \
+    break;                                                                                                   \
+case PS_TYPE_F64:                                                                                            \
+    DIM1##_##DIM2(OUT,IN1,OP,IN2,F64);                                                                       \
+    break;                                                                                                   \
+case PS_TYPE_C32:                                                                                            \
+    DIM1##_##DIM2(OUT,IN1,OP,IN2,C32);                                                                       \
+    break;                                                                                                   \
+case PS_TYPE_C64:                                                                                            \
+    DIM1##_##DIM2(OUT,IN1,OP,IN2,C64);                                                                       \
+    break;                                                                                                   \
+default:                                                                                                     \
+    /* char* strType; \
+    PS_TYPE_NAME(strType,IN1->type);                                                                         \
+    psError(PS_ERR_BAD_PARAMETER_TYPE, true,                                                                 \
+            PS_ERRORTEXT_psMatrix_TYPE_MISMATCH,                                                             \
+            strType);  */                                                                                      \
+    if (OUT != IN1 && OUT != IN2) {                                                                          \
+        psFree(OUT);                                                                                         \
+    }                                                                                                        \
+    return NULL;                                                                                             \
+}
+
+// Preprocessor macro function to create arithmetic function operation name
+#define BINARY_OP(DIM1,DIM2,OUT,IN1,OP,IN2)                                                                  \
+if(!strncmp(OP, "=", 1)) {                                                                                   \
+    BINARY_TYPE(DIM1,DIM2,OUT,IN1,*i2,IN2);                                                                  \
+} else if(!strncmp(OP, "+", 1)) {                                                                            \
+    BINARY_TYPE(DIM1,DIM2,OUT,IN1,*i1 + *i2,IN2);                                                            \
+} else if(!strncmp(OP, "-", 1)) {                                                                            \
+    BINARY_TYPE(DIM1,DIM2,OUT,IN1,*i1 - *i2,IN2);                                                            \
+} else if(!strncmp(OP, "*", 1)) {                                                                            \
+    BINARY_TYPE(DIM1,DIM2,OUT,IN1,*i1 * *i2,IN2);                                                            \
+} else if(!strncmp(OP, "/", 1)) {                                                                            \
+    BINARY_TYPE(DIM1,DIM2,OUT,IN1,*i1 / *i2,IN2);                                                            \
+} else if(!strncmp(OP, "^", 1)) {                                                                            \
+    if(PS_IS_PSELEMTYPE_COMPLEX(IN1->type)) {                                                                \
+        BINARY_TYPE(DIM1,DIM2,OUT,IN1,cpow(*i1,*i2),IN2);                                                    \
+    } else {                                                                                                 \
+        BINARY_TYPE(DIM1,DIM2,OUT,IN1,pow(*i1,*i2),IN2);                                                     \
+    }                                                                                                        \
+} else if(!strncmp(OP, "min", 3)) {                                                                          \
+    if(PS_IS_PSELEMTYPE_COMPLEX(IN1->type)) {                                                                \
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true,                                                            \
+                PS_ERRORTEXT_psMatrix_MIN_COMPLEX_SUPPORT);                                                  \
+        if (OUT != IN1 && OUT != IN2) {                                                                      \
+            psFree(OUT);                                                                                     \
+        }                                                                                                    \
+        return NULL;                                                                                         \
+    } else {                                                                                                 \
+        BINARY_TYPE(DIM1,DIM2,OUT,IN1,fmin(*i1,*i2),IN2);                                                    \
+    }                                                                                                        \
+} else if(!strncmp(OP, "max", 3)) {                                                                          \
+    if(PS_IS_PSELEMTYPE_COMPLEX(IN1->type)) {                                                                \
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true,                                                            \
+                PS_ERRORTEXT_psMatrix_MAX_COMPLEX_SUPPORT);                                                  \
+        if (OUT != IN1 && OUT != IN2) {                                                                      \
+            psFree(OUT);                                                                                     \
+        }                                                                                                    \
+        return NULL;                                                                                         \
+    } else {                                                                                                 \
+        BINARY_TYPE(DIM1,DIM2,OUT,IN1,fmax(*i1,*i2),IN2);                                                    \
+    }                                                                                                        \
+} else {                                                                                                     \
+    psError(PS_ERR_BAD_PARAMETER_VALUE, true,                                                                \
+            PS_ERRORTEXT_psMatrix_OPERATION_UNSUPPORTED,                                                     \
+            OP);                                                                                             \
+    if (OUT != IN1 && OUT != IN2) {                                                                          \
+        psFree(OUT);                                                                                         \
+    }                                                                                                        \
+    return NULL;                                                                                             \
+}
+
+psPtr psBinaryOp(psPtr out, psPtr in1, char *op, psPtr in2)
+{
+
+    psVector* input1 = (psVector* ) in1;
+    psVector* input2 = (psVector* ) in2;
+
+    #define psBinaryOp_EXIT { \
+                              if (out != in1 && out != in2) { \
+                              psFree(out); \
+                              } \
+                              return NULL; \
+                            }
+
+    PS_PTR_CHECK_NULL_GENERAL(input1, psBinaryOp_EXIT);
+    PS_PTR_CHECK_NULL_GENERAL(input2, psBinaryOp_EXIT);
+    PS_PTR_CHECK_NULL_GENERAL(op, psBinaryOp_EXIT);
+
+    PS_PTR_CHECK_TYPE_EQUAL_GENERAL(input1,input2, psBinaryOp_EXIT);
+
+    PS_PTR_CHECK_DIMEN_GENERAL_NOT(input1, PS_DIMEN_OTHER, psBinaryOp_EXIT);
+    PS_PTR_CHECK_DIMEN_GENERAL_NOT(input2, PS_DIMEN_OTHER, psBinaryOp_EXIT);
+
+    psType* psType1 = (psType*)in1;
+    psType* psType2 = (psType*)in2;
+    psDimen dim1 = psType1->dimen;
+    psDimen dim2 = psType2->dimen;
+    psElemType elType1 = psType1->type;
+    psElemType elType2 = psType2->type;
+
+    if (dim1 == PS_DIMEN_VECTOR || dim1 == PS_DIMEN_TRANSV) {
+        if (((psVector* ) in1)->n == 0) {
+            psLogMsg(__func__, PS_LOG_WARN, "Vector contains zero elements");
+        }
+    } else if (dim1 == PS_DIMEN_IMAGE) {
+        if (((psImage* ) in1)->numCols == 0 || ((psImage* ) in1)->numRows == 0) {
+            psLogMsg(__func__, PS_LOG_WARN, "Image contains zero length row or cols");
+        }
+    }
+
+    if (dim2 == PS_DIMEN_VECTOR || dim2 == PS_DIMEN_TRANSV) {
+        if (((psVector* ) in2)->n == 0) {
+            psLogMsg(__func__, PS_LOG_WARN, "Vector contains zero elements");
+        }
+    } else if (dim2 == PS_DIMEN_IMAGE) {
+        if (((psImage* ) in2)->numCols == 0 || ((psImage* ) in2)->numRows == 0) {
+            psLogMsg(__func__, PS_LOG_WARN, "Image contains zero length row or cols");
+        }
+    }
+
+    if (dim1 == PS_DIMEN_SCALAR) {
+        if ( out != NULL && ((psType*)out)->dimen != dim2) {
+            if (out != in1 && out != in2) {
+                psFree(out);
+            }
+            out = NULL;
+        }
+        if (dim2 == PS_DIMEN_SCALAR) {
+            if (out == NULL || ((psScalar*)out)->type.type != elType1) {
+                if (out != in1 && out != in2) {
+                    psFree(out);
+                }
+                out = psScalarAlloc(0.0,elType1);
+            }
+            BINARY_OP(SCALAR, SCALAR, out, psType1, op, psType2);       // scalar op scalar
+        } else if (dim2 == PS_DIMEN_VECTOR || dim2 == PS_DIMEN_TRANSV) {
+            out = psVectorRecycle(out,((psVector*)in2)->n,elType1);
+            if (out == NULL) {
+                psError(PS_ERR_UNKNOWN, false,
+                        PS_ERRORTEXT_psMatrix_OUTPUT_VECTOR_NOT_CREATED);
+                return NULL;
+            }
+            BINARY_OP(SCALAR, VECTOR, out, psType1, op, psType2);       // scalar op vector
+        } else if (dim2 == PS_DIMEN_IMAGE) {
+            out = psImageRecycle(out, ((psImage* ) in2)->numCols, ((psImage* ) in2)->numRows,elType1);
+            if (out == NULL) {
+                psError(PS_ERR_UNKNOWN, false,
+                        PS_ERRORTEXT_psMatrix_OUTPUT_IMAGE_NOT_CREATED);
+                return NULL;
+            }
+            BINARY_OP(SCALAR, IMAGE, out, psType1, op, psType2);        // scalar op image
+        } else {
+            psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                    PS_ERRORTEXT_psMatrix_DIMEN_INVALID,
+                    "in2",dim2);
+            psBinaryOp_EXIT;
+        }
+    } else if (dim1 == PS_DIMEN_VECTOR || dim1 == PS_DIMEN_TRANSV) {
+        if (dim2 == PS_DIMEN_SCALAR) {
+            out = psVectorRecycle(out,((psVector*)in1)->n,elType1);
+            if (out == NULL) {
+                psError(PS_ERR_UNKNOWN, false,
+                        PS_ERRORTEXT_psMatrix_OUTPUT_VECTOR_NOT_CREATED);
+                return NULL;
+            }
+            BINARY_OP(VECTOR, SCALAR, out, psType1, op, psType2);       // vector op scalar
+        } else if (dim2 == PS_DIMEN_VECTOR || dim2 == PS_DIMEN_TRANSV) {
+            out = psVectorRecycle(out,((psVector*)in2)->n,elType2);
+            if (out == NULL) {
+                psError(PS_ERR_UNKNOWN, false,
+                        PS_ERRORTEXT_psMatrix_OUTPUT_VECTOR_NOT_CREATED);
+                return NULL;
+            }
+            BINARY_OP(VECTOR, VECTOR, out, psType1, op, psType2);       // vector op vector
+        } else if (dim2 == PS_DIMEN_IMAGE) {
+            out = psImageRecycle(out, ((psImage* ) in2)->numCols, ((psImage* ) in2)->numRows, elType2);
+            if (out == NULL) {
+                psError(PS_ERR_UNKNOWN, false,
+                        PS_ERRORTEXT_psMatrix_OUTPUT_IMAGE_NOT_CREATED);
+                return NULL;
+            }
+            BINARY_OP(VECTOR, IMAGE, out, psType1, op, psType2);        // vector op image
+        } else {
+            psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                    PS_ERRORTEXT_psMatrix_DIMEN_INVALID,
+                    "in2",dim2);
+            psBinaryOp_EXIT;
+        }
+    } else if (dim1 == PS_DIMEN_IMAGE) {
+        out = psImageRecycle(out, ((psImage*)in1)->numCols, ((psImage*)in1)->numRows, elType1);
+        if (out == NULL) {
+            psError(PS_ERR_UNKNOWN, false,
+                    PS_ERRORTEXT_psMatrix_OUTPUT_IMAGE_NOT_CREATED);
+            return NULL;
+        }
+        if (dim2 == PS_DIMEN_SCALAR) {
+            BINARY_OP(IMAGE, SCALAR, out, psType1, op, psType2);        // image op scalar
+        } else if (dim2 == PS_DIMEN_VECTOR || dim2 == PS_DIMEN_TRANSV) {
+            BINARY_OP(IMAGE, VECTOR, out, psType1, op, psType2);        // image op vector
+        } else if (dim2 == PS_DIMEN_IMAGE) {
+            BINARY_OP(IMAGE, IMAGE, out, psType1, op, psType2); // image op image
+        } else {
+            psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                    PS_ERRORTEXT_psMatrix_DIMEN_INVALID,
+                    "in2",dim2);
+            psBinaryOp_EXIT;
+        }
+    } else {
+        psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                PS_ERRORTEXT_psMatrix_DIMEN_INVALID,
+                "in1",dim1);
+        psBinaryOp_EXIT;
+    }
+
+    // Automtically free psScalar types, since they are usually allocated in the argument list when this
+    // function is called, provided that the input is not the output.
+    if(psType1->dimen==PS_DIMEN_SCALAR && in1!=out) {
+        psFree(in1);
+    }
+
+    if(psType2->dimen==PS_DIMEN_SCALAR && in2!=out) {
+        psFree(in2);
+    }
+
+    return out;
+}
Index: /tags/ipp-1-X/bug123/psLib/src/dataManip/psBinaryOp.h
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/dataManip/psBinaryOp.h	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/dataManip/psBinaryOp.h	(revision 22331)
@@ -0,0 +1,67 @@
+
+/** @file  psBinaryOp.h
+ *
+ *  @brief Provides binary functions for simple matrix and vector element operations. Functions
+ *  include:
+ *
+ *      Addition (+)
+ *      Subtraction (-)
+ *      Multiplication (*)
+ *      Division (/)
+ *      Power (^)
+ *      Minimum (min)
+ *      Maximum (max)
+ *      Absolute value (abs)
+ *      Exponent (exp)
+ *      Natural Log (ln)
+ *      Power of 10 (ten)
+ *      Log (log)
+ *      Sine (sin or dsin)
+ *      Cosine (cos or dcos)
+ *      Tangent (tan or dtan)
+ *      Arcsine (asin or dasin)
+ *      Arccosine (acos or dacos)
+ *      Arctan (atan or datan)
+ *
+ *  Currently only vector-vector and image-image binary operations are supported.
+ *
+ *  @ingroup MatrixArithmetic
+ *
+ *  @author Ross Harman, MHPCC
+ *  @author Robert DeSonia, MHPCC
+ *
+ *  @version $Revision: 1.1 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-02-10 02:36:41 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+
+#ifndef PSBINARY_OP_H
+#define PSBINARY_OP_H
+
+/// @addtogroup MatrixArithmetic
+/// @{
+
+/** Perform simple binary arithmetic with images or vectors
+ *
+ *  Performs addition, subtraction, multiplication, division, power, minumum, and maximum arithmetic
+ *  operations with images and vectors. Uses the form:
+ *
+ *      out = in1 op in2,
+ *
+ *      Where op is: "=", "+", "-", "*", "/", "^", "min", or "max"
+ *
+ *  This function only supports vector-vector or image-image operations.
+ *
+ *  @return  psType* : Pointer to either psImage or psVector.
+ */
+psType* psBinaryOp(
+    psPtr out,                         ///< Output type, either psImage or psVector.
+    psPtr in1,                         ///< First input, either psImage or psVector.
+    char *op,                          ///< Operator.
+    psPtr in2                          ///< Second input, either psImage or psVector.
+);
+
+/// @}
+
+#endif
Index: /tags/ipp-1-X/bug123/psLib/src/dataManip/psConstants.h
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/dataManip/psConstants.h	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/dataManip/psConstants.h	(revision 22331)
@@ -0,0 +1,639 @@
+/** @file  psConstants.h
+ *
+ *  This file will hold definitions of various constants as well as common
+ *  macros used throughout psLib.
+ *
+ *  @author GLG, MHPCC
+ *
+ *  @version $Revision: 1.64 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-04-14 03:23:55 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ *
+ *  XXX: Add parenthesis around all arguments so that these macros can be
+ *       called with complex expressions.
+ *
+ *  XXX: All functions which use the PS_CHECK macros must be scrutinized so
+ *  that we ensure that an argument which is expected to be output is
+ *  psFree'ed before reurning NULL.
+ *
+ */
+
+/*****************************************************************************
+These constants are used by various functions in the psLib.
+ *****************************************************************************/
+#define PS_DETERMINE_BRACKET_STEP_SIZE 0.10
+#define PS_MAX_LMM_ITERATIONS 100
+#define PS_MAX_MINIMIZE_ITERATIONS 100
+#define PS_LEFT_SPLINE_DERIV 0.0
+#define PS_RIGHT_SPLINE_DERIV 0.0
+/*****************************************************************************
+These are common mathimatical constants used by various functions in the psLib.
+ *****************************************************************************/
+#define PS_ONE 1.0
+#define PS_PI   3.1415926535897932384626433832795029  /* pi */
+#define PS_PI_2 1.5707963267948966192313216916397514  /* pi/2 */
+#define PS_PI_4 0.7853981633974483096156608458198757  /* pi/4 */
+#define PS_1_PI 0.3183098861837906715377675267450287  /* 1/pi */
+#define PS_2_PI 0.6366197723675813430755350534900574  /* 2/pi */
+
+#define PS_COT(X) (1.0 / atan(X))
+#define DEG_TO_RAD(DEGREES) ((DEGREES) * PS_PI / 180.0)
+#define MIN_TO_RAD(MINUTES) ((MINUTES) * PS_PI / (180.0 * 60.0))
+#define SEC_TO_RAD(SECONDS) ((SECONDS) * PS_PI / (180.0 * 60.0 * 60.0))
+#define RAD_TO_DEG(RADIANS) ((RADIANS) * 180.0 / PS_PI)
+#define RAD_TO_MIN(RADIANS) ((RADIANS) * 180.0 * 60.0 / PS_PI)
+#define RAD_TO_SEC(RADIANS) ((RADIANS) * 180.0 * 60.0 * 60.0 / PS_PI)
+
+/*****************************************************************************
+ 
+*****************************************************************************/
+
+#define PS_INT_CHECK_EQUALS(NAME1, NAME2, RVAL) \
+if (NAME1 == NAME2) { \
+    psError(PS_ERR_BAD_PARAMETER_VALUE, true, \
+            "Error: %s and %s are equal.", \
+            #NAME1, #NAME2); \
+    return(RVAL); \
+}
+
+#define PS_INT_CHECK_NON_EQUALS(NAME1, NAME2, RVAL) \
+if (NAME1 != NAME2) { \
+    psError(PS_ERR_BAD_PARAMETER_VALUE, true, \
+            "Error: %s and %s are not equal.", \
+            #NAME1, #NAME2); \
+    return(RVAL); \
+}
+
+#define PS_INT_CHECK_NON_NEGATIVE(NAME, RVAL) \
+if (NAME < 0) { \
+    psError(PS_ERR_BAD_PARAMETER_VALUE, true, \
+            "Error: %s is less than 0.", #NAME); \
+    return(RVAL); \
+}
+
+#define PS_INT_CHECK_POSITIVE(NAME, RVAL) \
+if (NAME < 1) { \
+    psError(PS_ERR_BAD_PARAMETER_VALUE, true, \
+            "Error: %s is 0 or less.", #NAME); \
+    return(RVAL); \
+}
+
+#define PS_INT_CHECK_ZERO(NAME, RVAL) \
+if (NAME < 1) { \
+    psError(PS_ERR_BAD_PARAMETER_VALUE, true, \
+            "Error: %s is 0.", #NAME); \
+    return(RVAL); \
+}
+
+#define PS_INT_CHECK_RANGE(NAME, LOWER, UPPER, RVAL) \
+if ((int)NAME < LOWER || (int)NAME > UPPER) { \
+    psError(PS_ERR_BAD_PARAMETER_VALUE, true, \
+            "Error: %s, %d, is out of range.  Must be between %d and %d.", \
+            #NAME,(int)NAME,LOWER,UPPER); \
+    return RVAL; \
+}
+
+// Produce an error if (NAME1 > NAME2)
+#define PS_INT_COMPARE(NAME1, NAME2, RVAL) \
+if (NAME1 > NAME2) { \
+    psError(PS_ERR_BAD_PARAMETER_VALUE, true, \
+            "Error: (%s > %s) (%d %d).", \
+            #NAME1, #NAME2, NAME1, NAME2); \
+    return(RVAL); \
+}
+
+
+// Produce an error if ((NAME1 > NAME2)
+#define PS_FLOAT_COMPARE(NAME1, NAME2, RVAL) \
+if (NAME1 > NAME2) { \
+    psError(PS_ERR_BAD_PARAMETER_VALUE, true, \
+            "Error: (%s > %s) (%f %f)", \
+            #NAME1, #NAME2, NAME1, NAME2); \
+    return(RVAL); \
+}
+
+#define PS_FLOAT_CHECK_NON_EQUAL(NAME1, NAME2, RVAL) \
+if (fabs(NAME2 - NAME1) < FLT_EPSILON) { \
+    psError(PS_ERR_BAD_PARAMETER_VALUE, true, \
+            "Error: %s and %s are equal.", \
+            #NAME1, #NAME2); \
+    return(RVAL); \
+}
+
+#define PS_FLOAT_CHECK_RANGE(NAME, LOWER, UPPER, RVAL) \
+if ((NAME) < (LOWER) || (NAME) > (UPPER)) { \
+    psError(PS_ERR_BAD_PARAMETER_VALUE, true, \
+            "Error: %s, %f, is out of range.  Must be between %f and %f.", \
+            #NAME, NAME, LOWER, UPPER); \
+    return RVAL; \
+}
+
+/*****************************************************************************
+Macros which take a generic psLib type and determine if it is NULL, or has
+the wrong type.
+*****************************************************************************/
+#define PS_PTR_CHECK_NULL(NAME, RVAL) PS_PTR_CHECK_NULL_GENERAL(NAME, return RVAL)
+#define PS_PTR_CHECK_NULL_GENERAL(NAME, CLEANUP) \
+if (NAME == NULL) { \
+    psError(PS_ERR_BAD_PARAMETER_NULL, true, \
+            "Unallowable operation: %s is NULL.", \
+            #NAME); \
+    CLEANUP; \
+}
+
+#define PS_PTR_CHECK_TYPE(NAME, TYPE, RVAL) \
+if (NAME->type.type != TYPE) { \
+    psError(PS_ERR_BAD_PARAMETER_TYPE, true, \
+            "Unallowable operation: %s has incorrect type.", \
+            #NAME); \
+    return(RVAL); \
+}
+
+#define PS_PTR_CHECK_DIMEN(NAME, DIMEN, RVAL) PS_PTR_CHECK_DIMEN_GENERAL(NAME, DIMEN, return RVAL)
+#define PS_PTR_CHECK_DIMEN_GENERAL(NAME, DIMEN, CLEANUP) \
+if (NAME->type.dimen != DIMEN) { \
+    psError(PS_ERR_BAD_PARAMETER_TYPE, true, \
+            "Unallowable operation: %s has incorrect dimensionality.", \
+            #NAME); \
+    CLEANUP; \
+}
+
+#define PS_PTR_CHECK_DIMEN_GENERAL_NOT(NAME, DIMEN, CLEANUP) \
+if (NAME->type.dimen == DIMEN) { \
+    psError(PS_ERR_BAD_PARAMETER_TYPE, true, \
+            "Unallowable operation: %s has incorrect dimensionality.", \
+            #NAME); \
+    CLEANUP; \
+}
+
+
+#define PS_PTR_CHECK_SIZE_EQUAL(PTR1, PTR2, RVAL) \
+if (PTR1->n != PTR2->n) { \
+    psError(PS_ERR_BAD_PARAMETER_SIZE, true, \
+            "ptr %s has size %d, ptr %s has size %d.", \
+            #PTR1, PTR1->n, #PTR2, PTR2->n); \
+    return(RVAL); \
+}
+
+#define PS_PTR_CHECK_TYPE_EQUAL(PTR1, PTR2, RVAL) PS_PTR_CHECK_TYPE_EQUAL_GENERAL(PTR1, PTR2, return RVAL)
+
+#define PS_PTR_CHECK_TYPE_EQUAL_GENERAL(PTR1, PTR2, CLEANUP) \
+if (PTR1->type.type != PTR2->type.type) { \
+    psError(PS_ERR_BAD_PARAMETER_TYPE, true, \
+            "ptr %s has type %d, ptr %s has type %d.", \
+            #PTR1, PTR1->type.type, #PTR2, PTR2->type.type); \
+    CLEANUP; \
+}
+
+
+/*****************************************************************************
+    PS_VECTOR macros:
+ *****************************************************************************/
+#define PS_VECTOR_CHECK_NULL(NAME, RVAL) PS_VECTOR_CHECK_NULL_GENERAL(NAME, return RVAL)
+#define PS_VECTOR_CHECK_NULL_GENERAL(NAME, CLEANUP) \
+if (NAME == NULL || NAME->data.U8 == NULL) { \
+    psError(PS_ERR_BAD_PARAMETER_NULL, true, \
+            "Unallowable operation: psVector %s or its data is NULL.", \
+            #NAME); \
+    CLEANUP; \
+} \
+
+#define PS_VECTOR_CHECK_EMPTY(NAME, RVAL) PS_VECTOR_CHECK_EMPTY_GENERAL(NAME, return RVAL)
+#define PS_VECTOR_CHECK_EMPTY_GENERAL(NAME, CLEANUP) \
+if (NAME->n < 1) { \
+    psError(PS_ERR_BAD_PARAMETER_SIZE, true, \
+            "Unallowable operation: psVector %s has no elements.", \
+            #NAME); \
+    CLEANUP; \
+} \
+
+#define PS_VECTOR_CHECK_TYPE_F32_OR_F64(NAME, RVAL) \
+if ((NAME->type.type != PS_TYPE_F32) && (NAME->type.type != PS_TYPE_F64)) { \
+    psError(PS_ERR_BAD_PARAMETER_TYPE, true, \
+            "psVector %s: bad type(%d)", \
+            #NAME, NAME->type.type); \
+    return(RVAL); \
+} \
+
+#define PS_VECTOR_CHECK_TYPE_S16_S32_F32(NAME, RVAL) \
+if ((NAME->type.type != PS_TYPE_S16) && (NAME->type.type != PS_TYPE_S32) && (NAME->type.type != PS_TYPE_F32)) { \
+    psError(PS_ERR_BAD_PARAMETER_TYPE, true, \
+            "psVector %s: bad type(%d)", \
+            #NAME, NAME->type.type); \
+    return(RVAL); \
+} \
+
+#define PS_VECTOR_CHECK_TYPE(NAME, TYPE, RVAL) \
+if (NAME->type.type != TYPE) { \
+    psError(PS_ERR_BAD_PARAMETER_TYPE, true, \
+            "Unallowable operation: psVector %s has incorrect type.", \
+            #NAME); \
+    return(RVAL); \
+}
+
+#define PS_VECTOR_CHECK_SIZE_EQUAL(VEC1, VEC2, RVAL) \
+if (VEC1->n != VEC2->n) { \
+    psError(PS_ERR_BAD_PARAMETER_SIZE, true, \
+            "psVector %s has size %d, psVector %s has size %d.", \
+            #VEC1, VEC1->n, #VEC2, VEC2->n); \
+    return(RVAL); \
+}
+
+#define PS_VECTOR_CHECK_TYPE_EQUAL(VEC1, VEC2, RVAL) \
+if (VEC1->type.type != VEC2->type.type) { \
+    psError(PS_ERR_BAD_PARAMETER_SIZE, true, \
+            "psVector %s has size %d, psVector %s has size %d.", \
+            #VEC1, VEC1->type.type, #VEC2, VEC2->type.type); \
+    return(RVAL); \
+}
+
+#define PS_VECTOR_F64_TO_F32(X64, X32) \
+psVector *X32 = psVectorAlloc(X64->n, PS_TYPE_F32); \
+for (int i=0;i<X64->n;i++) { \
+    X32->data.F32[i] = (float) X64->data.F64[i]; \
+} \
+
+#define PS_VECTOR_F32_TO_F64(X32, X64) \
+psVector *X64 = psVectorAlloc(X32->n, PS_TYPE_F64); \
+for (int i=0;i<X32->n;i++) { \
+    X64->data.F64[i] = (float) X32->data.F32[i]; \
+} \
+
+#define PS_VECTOR_PRINT_F32(NAME) \
+for (int my_i=0;my_i<NAME->n;my_i++) { \
+    printf("%s->data.F32[%d] is %f\n", #NAME, my_i, NAME->data.F32[my_i]); \
+} \
+printf("\n"); \
+
+
+#define PS_VECTOR_CONVERT_F64_TO_F32_STATIC(OLD, NEW_PTR32, NEW_STATIC32) \
+if (OLD->type.type == PS_TYPE_F32) { \
+    NEW_PTR32 = (psVector *) OLD; \
+} else if (OLD->type.type == PS_TYPE_F64) { \
+    NEW_STATIC32 = psVectorRecycle(NEW_STATIC32, OLD->n, PS_TYPE_F32); \
+    p_psMemSetPersistent(NEW_STATIC32, true); \
+    p_psMemSetPersistent(NEW_STATIC32->data.U8, true); \
+    for (i=0; i < OLD->n ; i++) { \
+        NEW_STATIC32->data.F32[i] = (float) OLD->data.F64[i]; \
+    } \
+    NEW_PTR32 = NEW_STATIC32; \
+} \
+
+#define PS_VECTOR_CONVERT_F32_TO_F64_STATIC(OLD, NEW_PTR64, NEW_STATIC64) \
+if (OLD->type.type == PS_TYPE_F64) { \
+    NEW_PTR64 = (psVector *) OLD; \
+} else if (OLD->type.type == PS_TYPE_F32) { \
+    NEW_STATIC64 = psVectorRecycle(NEW_STATIC64, OLD->n, PS_TYPE_F64); \
+    p_psMemSetPersistent(NEW_STATIC64, true); \
+    p_psMemSetPersistent(NEW_STATIC64->data.U8, true); \
+    for (i=0; i < OLD->n ; i++) { \
+        NEW_STATIC64->data.F64[i] = (double) OLD->data.F32[i]; \
+    } \
+    NEW_PTR64 = NEW_STATIC64; \
+} \
+
+#define PS_VECTOR_GEN_YERR_STATIC_F32(VEC, N) \
+VEC = psVectorRecycle(VEC, N, PS_TYPE_F32); \
+p_psMemSetPersistent(VEC, true); \
+p_psMemSetPersistent(VEC->data.U8, true); \
+for (int i=0;i<N;i++) { \
+    VEC->data.F32[i] = 1.0; \
+} \
+
+#define PS_VECTOR_GEN_YERR_STATIC_F64(VEC, N) \
+VEC = psVectorRecycle(VEC, N, PS_TYPE_F64); \
+p_psMemSetPersistent(VEC, true); \
+p_psMemSetPersistent(VEC->data.U8, true); \
+for (int i=0;i<N;i++) { \
+    VEC->data.F64[i] = 1.0; \
+} \
+
+#define PS_VECTOR_GEN_X_INDEX_STATIC_F32(VEC, N) \
+VEC = psVectorRecycle(VEC, N, PS_TYPE_F32); \
+p_psMemSetPersistent(VEC, true); \
+p_psMemSetPersistent(VEC->data.U8, true); \
+for (int i=0;i<N;i++) { \
+    VEC->data.F32[i] = (float) i; \
+} \
+
+#define PS_VECTOR_GEN_X_INDEX_STATIC_F64(VEC, N) \
+VEC = psVectorRecycle(VEC, N, PS_TYPE_F64); \
+p_psMemSetPersistent(VEC, true); \
+p_psMemSetPersistent(VEC->data.U8, true); \
+for (int i=0;i<N;i++) { \
+    VEC->data.F64[i] = (float) i; \
+} \
+
+#define PS_VECTOR_GEN_STATIC_RECYCLED(NAME, SIZE, TYPE) \
+static psVector *NAME = NULL; \
+NAME = psVectorRecycle(NAME, SIZE, TYPE); \
+p_psMemSetPersistent(NAME, true); \
+p_psMemSetPersistent(NAME->data.U8, true); \
+
+#define PS_VECTOR_DECLARE_ALLOC_STATIC(NAME, SIZE, TYPE) \
+static psVector *NAME = NULL; \
+if (NAME == NULL) { \
+    NAME = psVectorAlloc(SIZE, TYPE); \
+    p_psMemSetPersistent(NAME, true); \
+} \
+
+#define PS_VECTOR_SET_U8(NAME, VALUE) \
+for (int i = 0 ; i < (NAME)->n ; i++) { \
+    (NAME)->data.U8[i] = VALUE; \
+}\
+
+#define PS_VECTOR_SET_U16(NAME, VALUE) \
+for (int i = 0 ; i < (NAME)->n ; i++) { \
+    (NAME)->data.U16[i] = VALUE; \
+}\
+
+#define PS_VECTOR_SET_U32(NAME, VALUE) \
+for (int i = 0 ; i < (NAME)->n ; i++) { \
+    (NAME)->data.U32[i] = VALUE; \
+}\
+
+#define PS_VECTOR_SET_U64(NAME, VALUE) \
+for (int i = 0 ; i < (NAME)->n ; i++) { \
+    (NAME)->data.U64[i] = VALUE; \
+}\
+
+#define PS_VECTOR_SET_S8(NAME, VALUE) \
+for (int i = 0 ; i < (NAME)->n ; i++) { \
+    (NAME)->data.S8[i] = VALUE; \
+}\
+
+#define PS_VECTOR_SET_S16(NAME, VALUE) \
+for (int i = 0 ; i < (NAME)->n ; i++) { \
+    (NAME)->data.S16[i] = VALUE; \
+}\
+
+#define PS_VECTOR_SET_S32(NAME, VALUE) \
+for (int i = 0 ; i < (NAME)->n ; i++) { \
+    (NAME)->data.S32[i] = VALUE; \
+}\
+
+#define PS_VECTOR_SET_S64(NAME, VALUE) \
+for (int i = 0 ; i < (NAME)->n ; i++) { \
+    (NAME)->data.S64[i] = VALUE; \
+}\
+
+#define PS_VECTOR_SET_F64(NAME, VALUE) \
+for (int i = 0 ; i < (NAME)->n ; i++) { \
+    (NAME)->data.F64[i] = VALUE; \
+}\
+
+#define PS_VECTOR_SET_F32(NAME, VALUE) \
+for (int i = 0 ; i < (NAME)->n ; i++) { \
+    (NAME)->data.F32[i] = VALUE; \
+}\
+
+
+/*****************************************************************************
+    PS_POLY macros:
+*****************************************************************************/
+#define PS_POLY_CHECK_NULL(NAME, RVAL) \
+if (NAME == NULL || NAME->coeff == NULL) { \
+    psError(PS_ERR_BAD_PARAMETER_NULL, true, \
+            "Unallowable operation: polynomial %s or its coeffs is NULL.", \
+            #NAME); \
+    return(RVAL); \
+} \
+
+#define PS_POLY_CHECK_TYPE(NAME, TYPE, RVAL) \
+if (NAME->type != TYPE) { \
+    psError(PS_ERR_BAD_PARAMETER_TYPE, true, \
+            "Unallowable operation: polynomial %s has wrong type.", #NAME); \
+    return(RVAL); \
+} \
+
+// The following macros declare and allocate a static polynomial of the
+// specified order and type.
+
+#define PS_POLY_1D_DECLARE_ALLOC_STATIC(NAME, ORDER, TYPE) \
+static psPolynomial1D *NAME = NULL; \
+if (NAME == NULL) { \
+    NAME = psPolynomial1DAlloc(ORDER, TYPE); \
+    p_psMemSetPersistent(NAME, true); \
+    p_psMemSetPersistent(NAME->coeff, true); \
+    p_psMemSetPersistent(NAME->coeffErr, true); \
+    p_psMemSetPersistent(NAME->mask, true); \
+} \
+
+#define PS_POLY_2D_DECLARE_ALLOC_STATIC(NAME, ORDER, TYPE) \
+static psPolynomial2D *NAME = NULL; \
+if (NAME == NULL) { \
+    NAME = psPolynomial2DAlloc(ORDER, TYPE); \
+    p_psMemSetPersistent(NAME, true); \
+} \
+
+#define PS_POLY_3D_DECLARE_ALLOC_STATIC(NAME, ORDER, TYPE) \
+static psPolynomial3D *NAME = NULL; \
+if (NAME == NULL) { \
+    NAME = psPolynomial3DAlloc(ORDER, TYPE); \
+    p_psMemSetPersistent(NAME, true); \
+} \
+
+#define PS_POLY_4D_DECLARE_ALLOC_STATIC(NAME, ORDER, TYPE) \
+static psPolynomial4D *NAME = NULL; \
+if (NAME == NULL) { \
+    NAME = psPolynomial4DAlloc(ORDER, TYPE); \
+    p_psMemSetPersistent(NAME, true); \
+} \
+
+#define PS_POLY_1D_D_DECLARE_ALLOC_STATIC(NAME, ORDER, TYPE) \
+static psPolynomial1D *NAME = NULL; \
+if (NAME == NULL) { \
+    NAME = psPolynomial1DAlloc(ORDER, TYPE); \
+    p_psMemSetPersistent(NAME, true); \
+} \
+
+#define PS_POLY_2D_D_DECLARE_ALLOC_STATIC(NAME, ORDER, TYPE) \
+static psPolynomial2D *NAME = NULL; \
+if (NAME == NULL) { \
+    NAME = psPolynomial2DAlloc(ORDER, TYPE); \
+    p_psMemSetPersistent(NAME, true); \
+} \
+
+#define PS_POLY_3D_D_DECLARE_ALLOC_STATIC(NAME, ORDER, TYPE) \
+static psPolynomial3D *NAME = NULL; \
+if (NAME == NULL) { \
+    NAME = psPolynomial3DAlloc(ORDER, TYPE); \
+    p_psMemSetPersistent(NAME, true); \
+} \
+
+#define PS_POLY_4D_D_DECLARE_ALLOC_STATIC(NAME, ORDER, TYPE) \
+static psPolynomial4D *NAME = NULL; \
+if (NAME == NULL) { \
+    NAME = psPolynomial4DAlloc(ORDER, TYPE); \
+    p_psMemSetPersistent(NAME, true); \
+} \
+
+/*****************************************************************************
+    PS_IMAGE macros:
+*****************************************************************************/
+#define PS_IMAGE_CHECK_NULL(NAME, RVAL) PS_IMAGE_CHECK_NULL_GENERAL(NAME, return RVAL)
+#define PS_IMAGE_CHECK_NULL_GENERAL(NAME, CLEANUP) \
+if (NAME == NULL || NAME->data.V == NULL) { \
+    psError(PS_ERR_BAD_PARAMETER_NULL, true, \
+            "Unallowable operation: psImage %s or its data is NULL.", \
+            #NAME); \
+    CLEANUP; \
+}
+
+#define PS_IMAGE_CHECK_EMPTY(NAME, RVAL) PS_IMAGE_CHECK_EMPTY_GENERAL(NAME, return RVAL)
+#define PS_IMAGE_CHECK_EMPTY_GENERAL(NAME, CLEANUP) \
+if (NAME->numCols < 1 || NAME->numRows < 1) { \
+    psError(PS_ERR_BAD_PARAMETER_SIZE, true, \
+            "Unallowable operation: psImage %s has zero rows or columns (%dx%d).", \
+            #NAME, NAME->numCols, NAME->numRows); \
+    CLEANUP; \
+}
+
+#define PS_IMAGE_CHECK_TYPE(NAME, TYPE, RVAL) \
+if (NAME->type.type != TYPE) { \
+    psError(PS_ERR_BAD_PARAMETER_TYPE, true, \
+            "Unallowable operation: psImage %s has incorrect type.", \
+            #NAME); \
+    return(RVAL); \
+}
+
+#define PS_IMAGE_CHECK_SIZE_EQUAL(NAME1, NAME2, RVAL) \
+if ((NAME1->numCols != NAME2->numCols) || \
+        (NAME1->numRows != NAME2->numRows)) { \
+    psError(PS_ERR_BAD_PARAMETER_SIZE, true, \
+            "Unallowable operation: psImages %s and %s are not the same size.", \
+            #NAME1, #NAME2); \
+    return(RVAL); \
+}
+
+#define PS_IMAGE_CHECK_SIZE(NAME1, NUM_COLS, NUM_ROWS, RVAL) \
+if ((NAME1->numCols != NUM_COLS) || \
+        (NAME1->numRows != NUM_ROWS)) { \
+    psError(PS_ERR_BAD_PARAMETER_SIZE, true, \
+            "Unallowable operation: psImages %s is not the correct size.", \
+            #NAME1); \
+    return(RVAL); \
+}
+
+#define PS_IMAGE_PRINT_F32(NAME) \
+printf("======== printing %s ========\n", #NAME); \
+for (int i = 0 ; i < NAME->numRows ; i++) { \
+    for (int j = 0 ; j < NAME->numCols ; j++) { \
+        printf("%.2f ", NAME->data.F32[i][j]); \
+    } \
+    printf("\n"); \
+}\
+
+#define PS_IMAGE_SET_U8(NAME, VALUE) \
+for (int i = 0 ; i < (NAME)->numRows ; i++) { \
+    for (int j = 0 ; j < (NAME)->numCols ; j++) { \
+        (NAME)->data.U8[i][j] = (VALUE); \
+    } \
+}\
+
+#define PS_IMAGE_SET_U16(NAME, VALUE) \
+for (int i = 0 ; i < (NAME)->numRows ; i++) { \
+    for (int j = 0 ; j < (NAME)->numCols ; j++) { \
+        (NAME)->data.U16[i][j] = (VALUE); \
+    } \
+}\
+
+#define PS_IMAGE_SET_U32(NAME, VALUE) \
+for (int i = 0 ; i < (NAME)->numRows ; i++) { \
+    for (int j = 0 ; j < (NAME)->numCols ; j++) { \
+        (NAME)->data.U32[i][j] = (VALUE); \
+    } \
+}\
+
+#define PS_IMAGE_SET_U64(NAME, VALUE) \
+for (int i = 0 ; i < (NAME)->numRows ; i++) { \
+    for (int j = 0 ; j < (NAME)->numCols ; j++) { \
+        (NAME)->data.U64[i][j] = (VALUE); \
+    } \
+}\
+
+#define PS_IMAGE_SET_S8(NAME, VALUE) \
+for (int i = 0 ; i < (NAME)->numRows ; i++) { \
+    for (int j = 0 ; j < (NAME)->numCols ; j++) { \
+        (NAME)->data.S8[i][j] = (VALUE); \
+    } \
+}\
+
+#define PS_IMAGE_SET_S16(NAME, VALUE) \
+for (int i = 0 ; i < (NAME)->numRows ; i++) { \
+    for (int j = 0 ; j < (NAME)->numCols ; j++) { \
+        (NAME)->data.S16[i][j] = (VALUE); \
+    } \
+}\
+
+#define PS_IMAGE_SET_S32(NAME, VALUE) \
+for (int i = 0 ; i < (NAME)->numRows ; i++) { \
+    for (int j = 0 ; j < (NAME)->numCols ; j++) { \
+        (NAME)->data.S32[i][j] = (VALUE); \
+    } \
+}\
+
+#define PS_IMAGE_SET_S64(NAME, VALUE) \
+for (int i = 0 ; i < (NAME)->numRows ; i++) { \
+    for (int j = 0 ; j < (NAME)->numCols ; j++) { \
+        (NAME)->data.S64[i][j] = (VALUE); \
+    } \
+}\
+
+#define PS_IMAGE_SET_F32(NAME, VALUE) \
+for (int i = 0 ; i < (NAME)->numRows ; i++) { \
+    for (int j = 0 ; j < (NAME)->numCols ; j++) { \
+        (NAME)->data.F32[i][j] = (VALUE); \
+    } \
+}\
+
+#define PS_IMAGE_SET_F64(NAME, VALUE) \
+for (int i = 0 ; i < (NAME)->numRows ; i++) { \
+    for (int j = 0 ; j < (NAME)->numCols ; j++) { \
+        (NAME)->data.F64[i][j] = (VALUE); \
+    } \
+}\
+
+/*****************************************************************************
+    PS_READOUT macros:
+*****************************************************************************/
+#define PS_READOUT_CHECK_NULL(NAME, RVAL) \
+if (NAME == NULL || NAME->image == NULL) { \
+    psError(PS_ERR_BAD_PARAMETER_NULL, true, \
+            "Unallowable operation: psReadout %s or its data is NULL.", \
+            #NAME); \
+    return(RVAL); \
+}
+
+#define PS_READOUT_CHECK_EMPTY(NAME, RVAL) \
+if (NAME->image->numCols < 1 || NAME->image->numRows < 1) { \
+    psError(PS_ERR_BAD_PARAMETER_SIZE, true, \
+            "Unallowable operation: psReadout %s or its data is NULL.", #NAME); \
+    return(RVAL); \
+}
+
+#define PS_READOUT_CHECK_TYPE(NAME, TYPE, RVAL) \
+if (NAME->image->type.type != TYPE) { \
+    psError(PS_ERR_BAD_PARAMETER_TYPE, true, \
+            "Unallowable operation: psImage %s has incorrect type.", #NAME); \
+    return(RVAL); \
+}
+
+/*****************************************************************************
+    Misc. macros:
+ *****************************************************************************/
+#define PS_MAX(A, B) \
+(((A) > (B)) ? (A) : (B)) \
+
+#define PS_MIN(A, B) \
+(((A) < (B)) ? (A) : (B)) \
+
+#define PS_SQR(A) \
+((A) * (A)) \
+
+#ifdef DARWIN
+#define PS_SQRT_F32(A) ((float) sqrt(A))
+#else
+#define PS_SQRT_F32(A) (sqrtf(A))
+#endif
Index: /tags/ipp-1-X/bug123/psLib/src/dataManip/psDataManipErrors.dat
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/dataManip/psDataManipErrors.dat	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/dataManip/psDataManipErrors.dat	(revision 22331)
@@ -0,0 +1,55 @@
+#
+#  This file is used to generate psDataManipErrors.h content
+#
+#
+#  Format is:
+#  ERRORNAME(one word)    ERROR_TEXT
+#
+#  N.B. in code, the ERRORNAME appears as PS_ERRORTEXT_ERRORNAME
+####################################################################
+#
+psVectorFFT_TYPE_NOT_F32_C32           Input psVector type, %s, is not supported. Valid data types are psF32 and psC32.
+psVectorFFT_REVERSE_NOT_COMPLEX        Input psVector (%s) is not complex.  Reverse FFT operation requires a complex input.
+psVectorFFT_FORWARD_NOT_REAL           Input psVector (%s) is not real.  Forward FFT operation requires a real input.
+psVectorFFT_FFTW_PLAN_NULL             Could not create a valid FFT plan to perform the transform.
+psVectorFFT_TYPE_UNSUPPORTED           Specified psVector type, %s, is not supported.
+psVectorFFT_REAL_IMAG_TYPE_MISMATCH    Real psVector type, %s, and imaginary psVector type, %s, must be the same.
+psVectorFFT_REAL_IMAG_SIZE_MISMATCH    Real psVector size, %d, and imaginary psVector size, %d, must be the same.
+psVectorFFT_NONREAL_NOTSUPPORTED       Input psVector type, %s, is required to be either psF32 or psF64.
+psVectorFFT_NONCOMPLEX_NOTSUPPORTED    Input psVector type, %s, is required to be either psC32 or psC64.
+psVectorFFT_DIRECTION_NOTSET           Must specify the direction as either PS_FFT_FORWARD or PS_FFT_REVERSE.
+#
+psStats_NOT_F32_F64                    Invalid data type, %s.  Only psF32 and psF64 data types are supported.
+psStats_VECTOR_TYPE_UNSUPPORTED        Input psVector type, %s, is not supported.
+psStats_YVAL_OUT_OF_RANGE              Specified yVal, %g, is not within y-range, %g to %g.
+psStats_ROBUST_QUARTILE_BINS_FAILED    Could not determine the robust lower/upper quartile bin numbers.
+psStats_STATS_FAILED                   Failed to calculate the specified statistic.
+psStats_STATS_SAMPLE_MEDIAN_SORT_PROBLEM            Failed to sort input data.
+psStats_STATS_VECTOR_BIN_DISECT_PROBLEM		Failed to determine the bin number of a data element.
+psStats_STATS_FIT_QUADRATIC_POLYNOMIAL_1D_FIT Failed to fit a 1-dimensional polynomial to the three specified data points.  Returning NAN.
+psStats_STATS_FIT_QUADRATIC_POLY_MEDIAN Failed to determine the median of the fitted polynomial.  Returning NAN.
+psStats_ROBUST_STATS_CLIPPED_STATS	Failed to determine clipped statistics.
+
+
+psStats_STATS_POLY_MEDIAN_OUT_OF_RANGE The requested y-value does not fall with the specified range of x-values.  Returning NAN.
+#
+psFunctions_INVALID_POLYNOMIAL_TYPE    Unknown polynomial type 0x%x found.  Evaluation failed.
+psFunctions_TYPE_NOT_SUPPORTED         Input psVector type, %s, is not supported.
+psFunctions_NOT_ENOUGH_DATAPOINTS      Given vector does not have enough data points for %d-order interpolation.
+#
+psRandom_UNKNOWN_RANDFOM_NUMBER_GENERATOR_TYPE Unknown Random Number Generator Type
+psRandom_NULL_RANDOM_VAR               Random variable is NULL.
+#
+psMatrix_COUNT_DIFFERS                 Number of elements inconsistent, %d vs %d.  Number of elements must match.
+psMatrix_IMAGE_SIZE_DIFFERS            Specified psImage dimensions differed, %dx%d vs %dx%d.
+psMatrix_TYPE_MISMATCH                 Specified data type, %s, is not supported.
+psMatrix_MIN_COMPLEX_SUPPORT           The minimum operation is not supported with complex data.
+psMatrix_MAX_COMPLEX_SUPPORT           The maximum operation is not supported with complex data.
+psMatrix_OPERATION_UNSUPPORTED         Specified operation, %s, is not supported.
+psMatrix_DIMEN_OTHER_FOUND             %s's dimensionality is PS_DIMEN_OTHER, which is  not allowed.
+psMatrix_OUTPUT_VECTOR_NOT_CREATED     Couldn't create a proper output psVector.
+psMatrix_OUTPUT_IMAGE_NOT_CREATED      Couldn't create a proper output psImage.
+psMatrix_DIMEN_INVALID                 Specified parameter, %s, has invalid dimensionality, %d.
+psMatrix_VECTOR_EMPTY                  Input psVector contains no elements.  No data to perform operation with.
+psMatrix_IMAGE_EMPTY                   Input psImage contains no pixels.  No data to perform operation with.
+psMatrix_TRANSPOSE_MISMATCH            Number of rows do not match number of columns.
Index: /tags/ipp-1-X/bug123/psLib/src/dataManip/psDataManipErrors.h
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/dataManip/psDataManipErrors.h	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/dataManip/psDataManipErrors.h	(revision 22331)
@@ -0,0 +1,71 @@
+/** @file  psDataManipErrors.h
+ *
+ *  @brief Contains the error text for the data manipulation functions
+ *
+ *  @ingroup ErrorHandling
+ *
+ *  @author Robert DeSonia, MHPCC
+ *
+ *  @version $Revision: 1.13 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-02-17 19:26:23 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+
+#ifndef PS_DATAMANIP_ERRORS_H
+#define PS_DATAMANIP_ERRORS_H
+
+/* N.B., lines between '//~Start' and '//~End' are automatic generated from
+ * the template following the '//~Start'.  The template is used to generate
+ * the other lines by, for each error text in psDataManipErrors.dat, the following
+ * substitutions are made:
+ *     $1  The error text macro name (first word in the psDataManipErrors.dat lines)
+ *     $2  The error text (rest of the line in psDataManipErrors.dat)
+ *     $n  The order of the source line in psDataManipErrors.dat (comments excluded)
+ *
+ * DO NOT EDIT THE LINES BETWEEN //~Start and //~End!  ANY CHANGES WILL BE OVERWRITTEN.
+ */
+
+//~Start #define PS_ERRORTEXT_$1 "$2"
+#define PS_ERRORTEXT_psVectorFFT_TYPE_NOT_F32_C32 "Input psVector type, %s, is not supported. Valid data types are psF32 and psC32."
+#define PS_ERRORTEXT_psVectorFFT_REVERSE_NOT_COMPLEX "Input psVector (%s) is not complex.  Reverse FFT operation requires a complex input."
+#define PS_ERRORTEXT_psVectorFFT_FORWARD_NOT_REAL "Input psVector (%s) is not real.  Forward FFT operation requires a real input."
+#define PS_ERRORTEXT_psVectorFFT_FFTW_PLAN_NULL "Could not create a valid FFT plan to perform the transform."
+#define PS_ERRORTEXT_psVectorFFT_TYPE_UNSUPPORTED "Specified psVector type, %s, is not supported."
+#define PS_ERRORTEXT_psVectorFFT_REAL_IMAG_TYPE_MISMATCH "Real psVector type, %s, and imaginary psVector type, %s, must be the same."
+#define PS_ERRORTEXT_psVectorFFT_REAL_IMAG_SIZE_MISMATCH "Real psVector size, %d, and imaginary psVector size, %d, must be the same."
+#define PS_ERRORTEXT_psVectorFFT_NONREAL_NOTSUPPORTED "Input psVector type, %s, is required to be either psF32 or psF64."
+#define PS_ERRORTEXT_psVectorFFT_NONCOMPLEX_NOTSUPPORTED "Input psVector type, %s, is required to be either psC32 or psC64."
+#define PS_ERRORTEXT_psVectorFFT_DIRECTION_NOTSET "Must specify the direction as either PS_FFT_FORWARD or PS_FFT_REVERSE."
+#define PS_ERRORTEXT_psStats_NOT_F32_F64 "Invalid data type, %s.  Only psF32 and psF64 data types are supported."
+#define PS_ERRORTEXT_psStats_VECTOR_TYPE_UNSUPPORTED "Input psVector type, %s, is not supported."
+#define PS_ERRORTEXT_psStats_YVAL_OUT_OF_RANGE "Specified yVal, %g, is not within y-range, %g to %g."
+#define PS_ERRORTEXT_psStats_ROBUST_QUARTILE_BINS_FAILED "Could not determine the robust lower/upper quartile bin numbers."
+#define PS_ERRORTEXT_psStats_STATS_FAILED "Failed to calculate the specified statistic."
+#define PS_ERRORTEXT_psStats_STATS_SAMPLE_MEDIAN_SORT_PROBLEM "Failed to sort input data."
+#define PS_ERRORTEXT_psStats_STATS_VECTOR_BIN_DISECT_PROBLEM "Failed to determine the bin number of a data element."
+#define PS_ERRORTEXT_psStats_STATS_FIT_QUADRATIC_POLYNOMIAL_1D_FIT "Failed to fit a 1-dimensional polynomial to the three specified data points.  Returning NAN."
+#define PS_ERRORTEXT_psStats_STATS_FIT_QUADRATIC_POLY_MEDIAN "Failed to determine the median of the fitted polynomial.  Returning NAN."
+#define PS_ERRORTEXT_psStats_ROBUST_STATS_CLIPPED_STATS "Failed to determine clipped statistics."
+#define PS_ERRORTEXT_psStats_STATS_POLY_MEDIAN_OUT_OF_RANGE "The requested y-value does not fall with the specified range of x-values.  Returning NAN."
+#define PS_ERRORTEXT_psFunctions_INVALID_POLYNOMIAL_TYPE "Unknown polynomial type 0x%x found.  Evaluation failed."
+#define PS_ERRORTEXT_psFunctions_TYPE_NOT_SUPPORTED "Input psVector type, %s, is not supported."
+#define PS_ERRORTEXT_psFunctions_NOT_ENOUGH_DATAPOINTS "Given vector does not have enough data points for %d-order interpolation."
+#define PS_ERRORTEXT_psRandom_UNKNOWN_RANDFOM_NUMBER_GENERATOR_TYPE "Unknown Random Number Generator Type"
+#define PS_ERRORTEXT_psRandom_NULL_RANDOM_VAR "Random variable is NULL."
+#define PS_ERRORTEXT_psMatrix_COUNT_DIFFERS "Number of elements inconsistent, %d vs %d.  Number of elements must match."
+#define PS_ERRORTEXT_psMatrix_IMAGE_SIZE_DIFFERS "Specified psImage dimensions differed, %dx%d vs %dx%d."
+#define PS_ERRORTEXT_psMatrix_TYPE_MISMATCH "Specified data type, %s, is not supported."
+#define PS_ERRORTEXT_psMatrix_MIN_COMPLEX_SUPPORT "The minimum operation is not supported with complex data."
+#define PS_ERRORTEXT_psMatrix_MAX_COMPLEX_SUPPORT "The maximum operation is not supported with complex data."
+#define PS_ERRORTEXT_psMatrix_OPERATION_UNSUPPORTED "Specified operation, %s, is not supported."
+#define PS_ERRORTEXT_psMatrix_DIMEN_OTHER_FOUND "%s's dimensionality is PS_DIMEN_OTHER, which is  not allowed."
+#define PS_ERRORTEXT_psMatrix_OUTPUT_VECTOR_NOT_CREATED "Couldn't create a proper output psVector."
+#define PS_ERRORTEXT_psMatrix_OUTPUT_IMAGE_NOT_CREATED "Couldn't create a proper output psImage."
+#define PS_ERRORTEXT_psMatrix_DIMEN_INVALID "Specified parameter, %s, has invalid dimensionality, %d."
+#define PS_ERRORTEXT_psMatrix_VECTOR_EMPTY "Input psVector contains no elements.  No data to perform operation with."
+#define PS_ERRORTEXT_psMatrix_IMAGE_EMPTY "Input psImage contains no pixels.  No data to perform operation with."
+#define PS_ERRORTEXT_psMatrix_TRANSPOSE_MISMATCH "Number of rows do not match number of columns."
+//~End
+
+#endif
Index: /tags/ipp-1-X/bug123/psLib/src/dataManip/psFunctions.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/dataManip/psFunctions.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/dataManip/psFunctions.c	(revision 22331)
@@ -0,0 +1,2174 @@
+/** @file  psFunctions.c
+ *
+ *  @brief Contains basic function allocation, deallocation, and evaluation
+ *         routines.
+ *
+ *  This file will hold the functions for allocated, freeing, and evaluating
+ *  polynomials.  It also contains a Gaussian functions.
+ *
+ *  @version $Revision: 1.98 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-04-19 04:16:02 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ *
+ *  XXX: What happens if the polyEval functions are called with data of the wrong
+ *       type?
+ *  XXX: Should the "coeffErr[]" be used as well?  Bug ???.  Ignore coeffErr
+ *
+ *  XXX: In the various polyAlloc(n) functions, n is really the order of the
+ *  polynomial plus 1.  To create a 2nd-order polynomial, n == 3.
+ */
+/*****************************************************************************/
+/*  INCLUDE FILES                                                            */
+/*****************************************************************************/
+#include <gsl/gsl_rng.h>
+#include <gsl/gsl_randist.h>
+
+#include <stdio.h>
+#include <stdbool.h>
+#include <float.h>
+#include <math.h>
+
+#include "psMemory.h"
+#include "psVector.h"
+#include "psScalar.h"
+#include "psTrace.h"
+#include "psError.h"
+#include "psLogMsg.h"
+#include "psFunctions.h"
+#include "psConstants.h"
+
+#include "psDataManipErrors.h"
+
+/*****************************************************************************/
+/* DEFINE STATEMENTS                                                         */
+/*****************************************************************************/
+
+/*****************************************************************************/
+/* TYPE DEFINITIONS                                                          */
+/*****************************************************************************/
+static void polynomial1DFree(psPolynomial1D* myPoly);
+static void polynomial2DFree(psPolynomial2D* myPoly);
+static void polynomial3DFree(psPolynomial3D* myPoly);
+static void polynomial4DFree(psPolynomial4D* myPoly);
+static void dPolynomial1DFree(psDPolynomial1D* myPoly);
+static void dPolynomial2DFree(psDPolynomial2D* myPoly);
+static void dPolynomial3DFree(psDPolynomial3D* myPoly);
+static void dPolynomial4DFree(psDPolynomial4D* myPoly);
+static void spline1DFree(psSpline1D *tmpSpline);
+static psS32 vectorBinDisectF32(psF32 *bins,psS32 numBins,psF32 x);
+static psS32 vectorBinDisectS32(psS32 *bins,psS32 numBins,psS32 x);
+
+/*****************************************************************************/
+/* GLOBAL VARIABLES                                                          */
+/*****************************************************************************/
+
+// None
+
+/*****************************************************************************/
+/* FILE STATIC VARIABLES                                                     */
+/*****************************************************************************/
+
+// None
+
+/*****************************************************************************/
+/* FUNCTION IMPLEMENTATION - LOCAL                                           */
+/*****************************************************************************/
+
+static void spline1DFree(psSpline1D *tmpSpline)
+{
+    psS32 i;
+
+    if (tmpSpline == NULL) {
+        return;
+    }
+
+    if (tmpSpline->spline != NULL) {
+        for (i=0;i<tmpSpline->n;i++) {
+            psFree((tmpSpline->spline)[i]);
+        }
+        psFree(tmpSpline->spline);
+    }
+
+    if (tmpSpline->p_psDeriv2 != NULL) {
+        psFree(tmpSpline->p_psDeriv2);
+    }
+    psFree(tmpSpline->knots);
+
+    return;
+}
+
+static void polynomial1DFree(psPolynomial1D* myPoly)
+{
+    psFree(myPoly->coeff);
+    psFree(myPoly->coeffErr);
+    psFree(myPoly->mask);
+}
+
+static void polynomial2DFree(psPolynomial2D* myPoly)
+{
+    psS32 x = 0;
+
+    for (x = 0; x < myPoly->nX; x++) {
+        psFree(myPoly->coeff[x]);
+        psFree(myPoly->coeffErr[x]);
+        psFree(myPoly->mask[x]);
+    }
+    psFree(myPoly->coeff);
+    psFree(myPoly->coeffErr);
+    psFree(myPoly->mask);
+}
+
+static void polynomial3DFree(psPolynomial3D* myPoly)
+{
+    psS32 x = 0;
+    psS32 y = 0;
+
+    for (x = 0; x < myPoly->nX; x++) {
+        for (y = 0; y < myPoly->nY; y++) {
+            psFree(myPoly->coeff[x][y]);
+            psFree(myPoly->coeffErr[x][y]);
+            psFree(myPoly->mask[x][y]);
+        }
+        psFree(myPoly->coeff[x]);
+        psFree(myPoly->coeffErr[x]);
+        psFree(myPoly->mask[x]);
+    }
+
+    psFree(myPoly->coeff);
+    psFree(myPoly->coeffErr);
+    psFree(myPoly->mask);
+}
+
+static void polynomial4DFree(psPolynomial4D* myPoly)
+{
+    psS32 w = 0;
+    psS32 x = 0;
+    psS32 y = 0;
+
+    for (w = 0; w < myPoly->nW; w++) {
+        for (x = 0; x < myPoly->nX; x++) {
+            for (y = 0; y < myPoly->nY; y++) {
+                psFree(myPoly->coeff[w][x][y]);
+                psFree(myPoly->coeffErr[w][x][y]);
+                psFree(myPoly->mask[w][x][y]);
+            }
+            psFree(myPoly->coeff[w][x]);
+            psFree(myPoly->coeffErr[w][x]);
+            psFree(myPoly->mask[w][x]);
+        }
+        psFree(myPoly->coeff[w]);
+        psFree(myPoly->coeffErr[w]);
+        psFree(myPoly->mask[w]);
+    }
+
+    psFree(myPoly->coeff);
+    psFree(myPoly->coeffErr);
+    psFree(myPoly->mask);
+}
+
+static void dPolynomial1DFree(psDPolynomial1D* myPoly)
+{
+    psFree(myPoly->coeff);
+    psFree(myPoly->coeffErr);
+    psFree(myPoly->mask);
+}
+
+static void dPolynomial2DFree(psDPolynomial2D* myPoly)
+{
+    //printf("dPolynomial2DFree(): HMMM: myPoly->nX is %d\n", myPoly->nX);
+    //printf("dPolynomial2DFree(): HMMM: myPoly->nY is %d\n", myPoly->nY);
+    for (psS32 x = 0; x < myPoly->nX; x++) {
+        psFree(myPoly->coeff[x]);
+        psFree(myPoly->coeffErr[x]);
+        psFree(myPoly->mask[x]);
+    }
+    psFree(myPoly->coeff);
+    psFree(myPoly->coeffErr);
+    psFree(myPoly->mask);
+}
+
+static void dPolynomial3DFree(psDPolynomial3D* myPoly)
+{
+    psS32 x = 0;
+    psS32 y = 0;
+
+    for (x = 0; x < myPoly->nX; x++) {
+        for (y = 0; y < myPoly->nY; y++) {
+            psFree(myPoly->coeff[x][y]);
+            psFree(myPoly->coeffErr[x][y]);
+            psFree(myPoly->mask[x][y]);
+        }
+        psFree(myPoly->coeff[x]);
+        psFree(myPoly->coeffErr[x]);
+        psFree(myPoly->mask[x]);
+    }
+
+    psFree(myPoly->coeff);
+    psFree(myPoly->coeffErr);
+    psFree(myPoly->mask);
+}
+
+static void dPolynomial4DFree(psDPolynomial4D* myPoly)
+{
+    psS32 w = 0;
+    psS32 x = 0;
+    psS32 y = 0;
+
+    for (w = 0; w < myPoly->nW; w++) {
+        for (x = 0; x < myPoly->nX; x++) {
+            for (y = 0; y < myPoly->nY; y++) {
+                psFree(myPoly->coeff[w][x][y]);
+                psFree(myPoly->coeffErr[w][x][y]);
+                psFree(myPoly->mask[w][x][y]);
+            }
+            psFree(myPoly->coeff[w][x]);
+            psFree(myPoly->coeffErr[w][x]);
+            psFree(myPoly->mask[w][x]);
+        }
+        psFree(myPoly->coeff[w]);
+        psFree(myPoly->coeffErr[w]);
+        psFree(myPoly->mask[w]);
+    }
+
+    psFree(myPoly->coeff);
+    psFree(myPoly->coeffErr);
+    psFree(myPoly->mask);
+}
+
+/*****************************************************************************
+createChebyshevPolys(n): this routine takes as input the required order n,
+and returns as output as a pointer to an array of n psPolynomial1D
+structures, corresponding to the first n Chebyshev polynomials.
+ 
+XXX: The output should be static since the Chebyshev polynomials might be
+used frequently and the data structure created here does not contain the
+outer coefficients of the Chebyshev polynomials.
+ *****************************************************************************/
+static psPolynomial1D **createChebyshevPolys(psS32 maxChebyPoly)
+{
+    PS_INT_CHECK_NON_NEGATIVE(maxChebyPoly, NULL);
+
+    psPolynomial1D **chebPolys = NULL;
+
+    chebPolys = (psPolynomial1D **) psAlloc(maxChebyPoly * sizeof(psPolynomial1D *));
+    for (psS32 i = 0; i < maxChebyPoly; i++) {
+        chebPolys[i] = psPolynomial1DAlloc(i + 1, PS_POLYNOMIAL_ORD);
+    }
+
+    // Create the Chebyshev polynomials.
+    // Polynomial i has i-th order.
+    chebPolys[0]->coeff[0] = 1;
+
+    // XXX: Bug 296
+    if (maxChebyPoly > 1) {
+        chebPolys[1]->coeff[1] = 1;
+    }
+    for (psS32 i = 2; i < maxChebyPoly; i++) {
+        for (psS32 j = 0; j < chebPolys[i - 1]->n; j++) {
+            chebPolys[i]->coeff[j + 1] = 2 * chebPolys[i - 1]->coeff[j];
+        }
+        for (psS32 j = 0; j < chebPolys[i - 2]->n; j++) {
+            chebPolys[i]->coeff[j] -= chebPolys[i - 2]->coeff[j];
+        }
+    }
+
+    return (chebPolys);
+}
+
+/*****************************************************************************
+    Polynomial coefficients will be accessed in [w][x][y][z] fashion.
+ *****************************************************************************/
+static psF32 ordPolynomial1DEval(psF32 x, const psPolynomial1D* myPoly)
+{
+    psS32 loop_x = 0;
+    psF32 polySum = 0.0;
+    psF32 xSum = 1.0;
+
+    psTrace(".psLib.dataManip.psFunctions.ordPolynomial1DEval", 4,
+            "---- Calling ordPolynomial1DEval(%f)\n", x);
+    psTrace(".psLib.dataManip.psFunctions.ordPolynomial1DEval", 4,
+            "Polynomial order is %d\n", myPoly->n);
+    for (loop_x = 0; loop_x < myPoly->n; loop_x++) {
+        psTrace(".psLib.dataManip.psFunctions.ordPolynomial1DEval", 4,
+                "Polynomial coeff[%d] is %f\n", loop_x, myPoly->coeff[loop_x]);
+    }
+
+    for (loop_x = 0; loop_x < myPoly->n; loop_x++) {
+        if (myPoly->mask[loop_x] == 0) {
+            psTrace(".psLib.dataManip.psFunctions.ordPolynomial1DEval", 10,
+                    "polysum+= sum*coeff [%f+= (%f * %f)\n", polySum, xSum, myPoly->coeff[loop_x]);
+            polySum += xSum * myPoly->coeff[loop_x];
+        }
+        xSum *= x;
+    }
+
+    return(polySum);
+}
+
+// XXX: You can do this without having to psAlloc() vector d.
+// XXX: How does the mask vector effect Crenshaw's formula?
+// XXX: We assume that x is scaled between -1.0 and 1.0;
+static psF32 chebPolynomial1DEval(psF32 x, const psPolynomial1D* myPoly)
+{
+    PS_FLOAT_CHECK_RANGE(x, -1.0, 1.0, 0.0);
+    psVector *d;
+    psS32 n;
+    psS32 i;
+    psF32 tmp;
+
+    n = myPoly->n;
+    d = psVectorAlloc(n, PS_TYPE_F32);
+    if(myPoly->mask[n-1] == 0) {
+        d->data.F32[n-1] = myPoly->coeff[n-1];
+    } else {
+        d->data.F32[n-1] = 0.0;
+    }
+    d->data.F32[n-2] = (2.0 * x * d->data.F32[n-1]);
+    if(myPoly->mask[n-2] == 0) {
+        d->data.F32[n-2] += myPoly->coeff[n-2];
+    }
+    for (i=n-3;i>=1;i--) {
+        d->data.F32[i] = (2.0 * x * d->data.F32[i+1]) -
+                         (d->data.F32[i+2]);
+        if(myPoly->mask[i] == 0) {
+            d->data.F32[i] += myPoly->coeff[i];
+        }
+    }
+
+    tmp = (x * d->data.F32[1]) -
+          (d->data.F32[2]);
+    if(myPoly->mask[0] == 0) {
+        tmp += (0.5 * myPoly->coeff[0]);
+    }
+    psFree(d);
+    return(tmp);
+
+    /*
+
+    psS32 n;
+    psS32 i;
+    psF32 tmp;
+    psPolynomial1D **chebPolys = NULL;
+
+    n = myPoly->n;
+    chebPolys = createChebyshevPolys(n);
+
+    tmp = 0.0;
+    for (i=0;i<myPoly->n;i++) {
+        tmp+= (myPoly->coeff[i] * psPolynomial1DEval(x, chebPolys[i]));
+    }
+    tmp-= (myPoly->coeff[0]/2.0);
+
+
+    return(tmp);
+    */
+}
+
+static psF32 ordPolynomial2DEval(psF32 x,
+                                 psF32 y,
+                                 const psPolynomial2D* myPoly)
+{
+    PS_POLY_CHECK_NULL(myPoly, NAN);
+
+    psS32 loop_x = 0;
+    psS32 loop_y = 0;
+    psF32 polySum = 0.0;
+    psF32 xSum = 1.0;
+    psF32 ySum = 1.0;
+
+    for (loop_x = 0; loop_x < myPoly->nX; loop_x++) {
+        ySum = xSum;
+        for (loop_y = 0; loop_y < myPoly->nY; loop_y++) {
+            if (myPoly->mask[loop_x][loop_y] == 0) {
+                polySum += ySum * myPoly->coeff[loop_x][loop_y];
+            }
+            ySum *= y;
+        }
+        xSum *= x;
+    }
+
+    return(polySum);
+}
+
+static psF32 chebPolynomial2DEval(psF32 x, psF32 y, const psPolynomial2D* myPoly)
+{
+    PS_FLOAT_CHECK_RANGE(x, -1.0, 1.0, 0.0);
+    PS_FLOAT_CHECK_RANGE(y, -1.0, 1.0, 0.0);
+    PS_POLY_CHECK_NULL(myPoly, NAN);
+
+    psS32 loop_x = 0;
+    psS32 loop_y = 0;
+    psS32 i = 0;
+    psF32 polySum = 0.0;
+    psPolynomial1D* *chebPolys = NULL;
+    psS32 maxChebyPoly = 0;
+
+    // Determine how many Chebyshev polynomials
+    // are needed, then create them.
+    maxChebyPoly = myPoly->nX;
+    if (myPoly->nY > maxChebyPoly) {
+        maxChebyPoly = myPoly->nY;
+    }
+    chebPolys = createChebyshevPolys(maxChebyPoly);
+
+    for (loop_x = 0; loop_x < myPoly->nX; loop_x++) {
+        for (loop_y = 0; loop_y < myPoly->nY; loop_y++) {
+            if (myPoly->mask[loop_x][loop_y] == 0) {
+                polySum += myPoly->coeff[loop_x][loop_y] *
+                           psPolynomial1DEval(chebPolys[loop_x], x) *
+                           psPolynomial1DEval(chebPolys[loop_y], y);
+            }
+        }
+    }
+    for (i=0;i<maxChebyPoly;i++) {
+        psFree(chebPolys[i]);
+    }
+    psFree(chebPolys);
+    return(polySum);
+}
+
+static psF32 ordPolynomial3DEval(psF32 x, psF32 y, psF32 z, const psPolynomial3D* myPoly)
+{
+    psS32 loop_x = 0;
+    psS32 loop_y = 0;
+    psS32 loop_z = 0;
+    psF32 polySum = 0.0;
+    psF32 xSum = 1.0;
+    psF32 ySum = 1.0;
+    psF32 zSum = 1.0;
+
+    for (loop_x = 0; loop_x < myPoly->nX; loop_x++) {
+        ySum = xSum;
+        for (loop_y = 0; loop_y < myPoly->nY; loop_y++) {
+            zSum = ySum;
+            for (loop_z = 0; loop_z < myPoly->nZ; loop_z++) {
+                if (myPoly->mask[loop_x][loop_y][loop_z] == 0) {
+                    polySum += zSum * myPoly->coeff[loop_x][loop_y][loop_z];
+                }
+                zSum *= z;
+            }
+            ySum *= y;
+        }
+        xSum *= x;
+    }
+
+    return(polySum);
+}
+
+static psF32 chebPolynomial3DEval(psF32 x, psF32 y, psF32 z, const psPolynomial3D* myPoly)
+{
+    PS_FLOAT_CHECK_RANGE(x, -1.0, 1.0, 0.0);
+    PS_FLOAT_CHECK_RANGE(y, -1.0, 1.0, 0.0);
+    PS_FLOAT_CHECK_RANGE(z, -1.0, 1.0, 0.0);
+    psS32 loop_x = 0;
+    psS32 loop_y = 0;
+    psS32 loop_z = 0;
+    psS32 i = 0;
+    psF32 polySum = 0.0;
+    psPolynomial1D* *chebPolys = NULL;
+    psS32 maxChebyPoly = 0;
+
+    // Determine how many Chebyshev polynomials
+    // are needed, then create them.
+    maxChebyPoly = myPoly->nX;
+    if (myPoly->nY > maxChebyPoly) {
+        maxChebyPoly = myPoly->nY;
+    }
+    if (myPoly->nZ > maxChebyPoly) {
+        maxChebyPoly = myPoly->nZ;
+    }
+    chebPolys = createChebyshevPolys(maxChebyPoly);
+
+    for (loop_x = 0; loop_x < myPoly->nX; loop_x++) {
+        for (loop_y = 0; loop_y < myPoly->nY; loop_y++) {
+            for (loop_z = 0; loop_z < myPoly->nZ; loop_z++) {
+                if (myPoly->mask[loop_x][loop_y][loop_z] == 0) {
+                    polySum += myPoly->coeff[loop_x][loop_y][loop_z] *
+                               psPolynomial1DEval(chebPolys[loop_x], x) *
+                               psPolynomial1DEval(chebPolys[loop_y], y) *
+                               psPolynomial1DEval(chebPolys[loop_z], z);
+                }
+            }
+        }
+    }
+
+    for (i=0;i<maxChebyPoly;i++) {
+        psFree(chebPolys[i]);
+    }
+    psFree(chebPolys);
+    return(polySum);
+}
+
+static psF32 ordPolynomial4DEval(psF32 w, psF32 x, psF32 y, psF32 z, const psPolynomial4D* myPoly)
+{
+    psS32 loop_w = 0;
+    psS32 loop_x = 0;
+    psS32 loop_y = 0;
+    psS32 loop_z = 0;
+    psF32 polySum = 0.0;
+    psF32 wSum = 1.0;
+    psF32 xSum = 1.0;
+    psF32 ySum = 1.0;
+    psF32 zSum = 1.0;
+
+    for (loop_w = 0; loop_w < myPoly->nW; loop_w++) {
+        xSum = wSum;
+        for (loop_x = 0; loop_x < myPoly->nX; loop_x++) {
+            ySum = xSum;
+            for (loop_y = 0; loop_y < myPoly->nY; loop_y++) {
+                zSum = ySum;
+                for (loop_z = 0; loop_z < myPoly->nZ; loop_z++) {
+                    if (myPoly->mask[loop_w][loop_x][loop_y][loop_z] == 0) {
+                        polySum += zSum * myPoly->coeff[loop_w][loop_x][loop_y][loop_z];
+                    }
+                    zSum *= z;
+                }
+                ySum *= y;
+            }
+            xSum *= x;
+        }
+        wSum *= w;
+    }
+
+    return(polySum);
+}
+
+static psF32 chebPolynomial4DEval(psF32 w, psF32 x, psF32 y, psF32 z, const psPolynomial4D* myPoly)
+{
+    PS_FLOAT_CHECK_RANGE(w, -1.0, 1.0, 0.0);
+    PS_FLOAT_CHECK_RANGE(x, -1.0, 1.0, 0.0);
+    PS_FLOAT_CHECK_RANGE(y, -1.0, 1.0, 0.0);
+    PS_FLOAT_CHECK_RANGE(z, -1.0, 1.0, 0.0);
+    psS32 loop_w = 0;
+    psS32 loop_x = 0;
+    psS32 loop_y = 0;
+    psS32 loop_z = 0;
+    psS32 i = 0;
+    psF32 polySum = 0.0;
+    psPolynomial1D* *chebPolys = NULL;
+    psS32 maxChebyPoly = 0;
+
+    // Determine how many Chebyshev polynomials
+    // are needed, then create them.
+    maxChebyPoly = myPoly->nW;
+    if (myPoly->nX > maxChebyPoly) {
+        maxChebyPoly = myPoly->nX;
+    }
+    if (myPoly->nY > maxChebyPoly) {
+        maxChebyPoly = myPoly->nY;
+    }
+    if (myPoly->nZ > maxChebyPoly) {
+        maxChebyPoly = myPoly->nZ;
+    }
+    chebPolys = createChebyshevPolys(maxChebyPoly);
+
+    for (loop_w = 0; loop_w < myPoly->nW; loop_w++) {
+        for (loop_x = 0; loop_x < myPoly->nX; loop_x++) {
+            for (loop_y = 0; loop_y < myPoly->nY; loop_y++) {
+                for (loop_z = 0; loop_z < myPoly->nZ; loop_z++) {
+                    if (myPoly->mask[loop_w][loop_x][loop_y][loop_z] == 0) {
+                        polySum += myPoly->coeff[loop_w][loop_x][loop_y][loop_z] *
+                                   psPolynomial1DEval(chebPolys[loop_w], w) *
+                                   psPolynomial1DEval(chebPolys[loop_x], x) *
+                                   psPolynomial1DEval(chebPolys[loop_y], y) *
+                                   psPolynomial1DEval(chebPolys[loop_z], z);
+                    }
+                }
+            }
+        }
+    }
+
+    for (i=0;i<maxChebyPoly;i++) {
+        psFree(chebPolys[i]);
+    }
+    psFree(chebPolys);
+    return(polySum);
+}
+
+/*****************************************************************************
+    Polynomial coefficients will be accessed in [w][x][y][z] fashion.
+ *****************************************************************************/
+static psF64 dOrdPolynomial1DEval(psF64 x, const psDPolynomial1D* myPoly)
+{
+    psS32 loop_x = 0;
+    psF64 polySum = 0.0;
+    psF64 xSum = 1.0;
+
+    for (loop_x = 0; loop_x < myPoly->n; loop_x++) {
+        if (myPoly->mask[loop_x] == 0) {
+            polySum += xSum * myPoly->coeff[loop_x];
+        }
+        xSum *= x;
+    }
+
+    return(polySum);
+}
+
+// XXX: You can do this without having to psAlloc() vector d.
+// XXX: How does the mask vector effect Crenshaw's formula?
+static psF64 dChebPolynomial1DEval(psF64 x, const psDPolynomial1D* myPoly)
+{
+    PS_FLOAT_CHECK_RANGE(x, -1.0, 1.0, 0.0);
+    psVector *d;
+    psS32 n;
+    psS32 i;
+    psF64 tmp;
+
+    n = myPoly->n;
+    d = psVectorAlloc(n, PS_TYPE_F64);
+    if(myPoly->mask[n-1] == 0) {
+        d->data.F64[n-1] = myPoly->coeff[n-1];
+    } else {
+        d->data.F64[n-1] = 0.0;
+    }
+    d->data.F64[n-2] = (2.0 * x * d->data.F64[n-1]);
+    if(myPoly->mask[n-2] == 0) {
+        d->data.F64[n-2] += myPoly->coeff[n-2];
+    }
+    for (i=n-3;i>=1;i--) {
+        d->data.F64[i] = (2.0 * x * d->data.F64[i+1]) -
+                         (d->data.F64[i+2]);
+        if(myPoly->mask[i] == 0) {
+            d->data.F64[i] += myPoly->coeff[i];
+        }
+    }
+
+    tmp = (x * d->data.F64[1]) -
+          (d->data.F64[2]);
+    if(myPoly->mask[0] == 0) {
+        tmp += (0.5 * myPoly->coeff[0]);
+    }
+
+    psFree(d);
+    return(tmp);
+}
+
+static psF64 dOrdPolynomial2DEval(psF64 x, psF64 y, const psDPolynomial2D* myPoly)
+{
+    psS32 loop_x = 0;
+    psS32 loop_y = 0;
+    psF64 polySum = 0.0;
+    psF64 xSum = 1.0;
+    psF64 ySum = 1.0;
+
+    for (loop_x = 0; loop_x < myPoly->nX; loop_x++) {
+        ySum = xSum;
+        for (loop_y = 0; loop_y < myPoly->nY; loop_y++) {
+            if (myPoly->mask[loop_x][loop_y] == 0) {
+                polySum += ySum * myPoly->coeff[loop_x][loop_y];
+            }
+            ySum *= y;
+        }
+        xSum *= x;
+    }
+
+    return(polySum);
+}
+
+static psF64 dChebPolynomial2DEval(psF64 x, psF64 y, const psDPolynomial2D* myPoly)
+{
+    PS_FLOAT_CHECK_RANGE(x, -1.0, 1.0, 0.0);
+    PS_FLOAT_CHECK_RANGE(y, -1.0, 1.0, 0.0);
+    psS32 loop_x = 0;
+    psS32 loop_y = 0;
+    psS32 i = 0;
+    psF64 polySum = 0.0;
+    psPolynomial1D* *chebPolys = NULL;
+    psS32 maxChebyPoly = 0;
+
+    // Determine how many Chebyshev polynomials
+    // are needed, then create them.
+    maxChebyPoly = myPoly->nX;
+    if (myPoly->nY > maxChebyPoly) {
+        maxChebyPoly = myPoly->nY;
+    }
+    chebPolys = createChebyshevPolys(maxChebyPoly);
+
+    for (loop_x = 0; loop_x < myPoly->nX; loop_x++) {
+        for (loop_y = 0; loop_y < myPoly->nY; loop_y++) {
+            if (myPoly->mask[loop_x][loop_y] == 0) {
+                polySum += myPoly->coeff[loop_x][loop_y] *
+                           psPolynomial1DEval(chebPolys[loop_x], x) *
+                           psPolynomial1DEval(chebPolys[loop_y], y);
+            }
+        }
+    }
+
+    for (i=0;i<maxChebyPoly;i++) {
+        psFree(chebPolys[i]);
+    }
+    psFree(chebPolys);
+    return(polySum);
+}
+
+static psF64 dOrdPolynomial3DEval(psF64 x, psF64 y, psF64 z, const psDPolynomial3D* myPoly)
+{
+    psS32 loop_x = 0;
+    psS32 loop_y = 0;
+    psS32 loop_z = 0;
+    psF64 polySum = 0.0;
+    psF64 xSum = 1.0;
+    psF64 ySum = 1.0;
+    psF64 zSum = 1.0;
+
+    for (loop_x = 0; loop_x < myPoly->nX; loop_x++) {
+        ySum = xSum;
+        for (loop_y = 0; loop_y < myPoly->nY; loop_y++) {
+            zSum = ySum;
+            for (loop_z = 0; loop_z < myPoly->nZ; loop_z++) {
+                if (myPoly->mask[loop_x][loop_y][loop_z] == 0) {
+                    polySum += zSum * myPoly->coeff[loop_x][loop_y][loop_z];
+                }
+                zSum *= z;
+            }
+            ySum *= y;
+        }
+        xSum *= x;
+    }
+
+    return(polySum);
+}
+
+static psF64 dChebPolynomial3DEval(psF64 x, psF64 y, psF64 z, const psDPolynomial3D* myPoly)
+{
+    PS_FLOAT_CHECK_RANGE(x, -1.0, 1.0, 0.0);
+    PS_FLOAT_CHECK_RANGE(y, -1.0, 1.0, 0.0);
+    PS_FLOAT_CHECK_RANGE(z, -1.0, 1.0, 0.0);
+    psS32 loop_x = 0;
+    psS32 loop_y = 0;
+    psS32 loop_z = 0;
+    psS32 i = 0;
+    psF64 polySum = 0.0;
+    psPolynomial1D* *chebPolys = NULL;
+    psS32 maxChebyPoly = 0;
+
+    // Determine how many Chebyshev polynomials
+    // are needed, then create them.
+    maxChebyPoly = myPoly->nX;
+    if (myPoly->nY > maxChebyPoly) {
+        maxChebyPoly = myPoly->nY;
+    }
+    if (myPoly->nZ > maxChebyPoly) {
+        maxChebyPoly = myPoly->nZ;
+    }
+    chebPolys = createChebyshevPolys(maxChebyPoly);
+
+    for (loop_x = 0; loop_x < myPoly->nX; loop_x++) {
+        for (loop_y = 0; loop_y < myPoly->nY; loop_y++) {
+            for (loop_z = 0; loop_z < myPoly->nZ; loop_z++) {
+                if (myPoly->mask[loop_x][loop_y][loop_z] == 0) {
+                    polySum += myPoly->coeff[loop_x][loop_y][loop_z] *
+                               psPolynomial1DEval(chebPolys[loop_x], x) *
+                               psPolynomial1DEval(chebPolys[loop_y], y) *
+                               psPolynomial1DEval(chebPolys[loop_z], z);
+                }
+            }
+        }
+    }
+
+    for (i=0;i<maxChebyPoly;i++) {
+        psFree(chebPolys[i]);
+    }
+    psFree(chebPolys);
+    return(polySum);
+}
+
+static psF64 dOrdPolynomial4DEval(psF64 w, psF64 x, psF64 y, psF64 z, const psDPolynomial4D* myPoly)
+{
+    psS32 loop_w = 0;
+    psS32 loop_x = 0;
+    psS32 loop_y = 0;
+    psS32 loop_z = 0;
+    psF64 polySum = 0.0;
+    psF64 wSum = 1.0;
+    psF64 xSum = 1.0;
+    psF64 ySum = 1.0;
+    psF64 zSum = 1.0;
+
+    for (loop_w = 0; loop_w < myPoly->nW; loop_w++) {
+        xSum = wSum;
+        for (loop_x = 0; loop_x < myPoly->nX; loop_x++) {
+            ySum = xSum;
+            for (loop_y = 0; loop_y < myPoly->nY; loop_y++) {
+                zSum = ySum;
+                for (loop_z = 0; loop_z < myPoly->nZ; loop_z++) {
+                    if (myPoly->mask[loop_w][loop_x][loop_y][loop_z] == 0) {
+                        polySum += zSum * myPoly->coeff[loop_w][loop_x][loop_y][loop_z];
+                    }
+                    zSum *= z;
+                }
+                ySum *= y;
+            }
+            xSum *= x;
+        }
+        wSum *= w;
+    }
+
+    return(polySum);
+}
+
+static psF64 dChebPolynomial4DEval(psF64 w, psF64 x, psF64 y, psF64 z, const psDPolynomial4D* myPoly)
+{
+    PS_FLOAT_CHECK_RANGE(w, -1.0, 1.0, 0.0);
+    PS_FLOAT_CHECK_RANGE(x, -1.0, 1.0, 0.0);
+    PS_FLOAT_CHECK_RANGE(y, -1.0, 1.0, 0.0);
+    PS_FLOAT_CHECK_RANGE(z, -1.0, 1.0, 0.0);
+    psS32 loop_w = 0;
+    psS32 loop_x = 0;
+    psS32 loop_y = 0;
+    psS32 loop_z = 0;
+    psS32 i = 0;
+    psF64 polySum = 0.0;
+    psPolynomial1D* *chebPolys = NULL;
+    psS32 maxChebyPoly = 0;
+
+    // Determine how many Chebyshev polynomials
+    // are needed, then create them.
+    maxChebyPoly = myPoly->nW;
+    if (myPoly->nX > maxChebyPoly) {
+        maxChebyPoly = myPoly->nX;
+    }
+    if (myPoly->nY > maxChebyPoly) {
+        maxChebyPoly = myPoly->nY;
+    }
+    if (myPoly->nZ > maxChebyPoly) {
+        maxChebyPoly = myPoly->nZ;
+    }
+    chebPolys = createChebyshevPolys(maxChebyPoly);
+
+    for (loop_w = 0; loop_w < myPoly->nW; loop_w++) {
+        for (loop_x = 0; loop_x < myPoly->nX; loop_x++) {
+            for (loop_y = 0; loop_y < myPoly->nY; loop_y++) {
+                for (loop_z = 0; loop_z < myPoly->nZ; loop_z++) {
+                    if (myPoly->mask[loop_w][loop_x][loop_y][loop_z] == 0) {
+                        polySum += myPoly->coeff[loop_w][loop_x][loop_y][loop_z] *
+                                   psPolynomial1DEval(chebPolys[loop_w], w) *
+                                   psPolynomial1DEval(chebPolys[loop_x], x) *
+                                   psPolynomial1DEval(chebPolys[loop_y], y) *
+                                   psPolynomial1DEval(chebPolys[loop_z], z);
+                    }
+                }
+            }
+        }
+    }
+
+    for (i=0;i<maxChebyPoly;i++) {
+        psFree(chebPolys[i]);
+    }
+    psFree(chebPolys);
+    return(polySum);
+}
+
+
+/*****************************************************************************
+fullInterpolate1DF32(): This routine will take as input n-element floating
+point arrays domain and range, and the x value, assumed to lie with the
+domain vector.  It produces as output the (n-1)-order LaGrange interpolated
+value of x.
+ 
+XXX: do we error check for non-distinct domain values?
+ *****************************************************************************/
+#define FUNC_MACRO_FULL_INTERPOLATE_1D(TYPE) \
+static psF32 fullInterpolate1D##TYPE(ps##TYPE *domain, \
+                                     ps##TYPE *range, \
+                                     psS32 n, \
+                                     ps##TYPE x) \
+{ \
+    \
+    psS32 i; \
+    psS32 m; \
+    static psVector *p = NULL; \
+    p = psVectorRecycle(p, n, PS_TYPE_##TYPE); \
+    p_psMemSetPersistent(p, true); \
+    p_psMemSetPersistent(p->data.TYPE, true); \
+    \
+    psTrace(".psLib.dataManip.psFunctions.fullInterpolate1D##TYPE", 4, \
+            "---- fullInterpolate1D##TYPE() begin (%d-order at x=%f) (%d data points)----\n", n-1, x, n); \
+    \
+    for (i=0;i<n;i++) { \
+        psTrace(".psLib.dataManip.psFunctions.fullInterpolate1D##TYPE", 6, \
+                "domain/range is (%f %f)\n", domain[i], range[i]); \
+    } \
+    \
+    for (i=0;i<n;i++) { \
+        p->data.TYPE[i] = range[i]; \
+        psTrace(".psLib.dataManip.psFunctions.fullInterpolate1D##TYPE", 6, \
+                "p->data.TYPE[%d] is %f\n", i, p->data.TYPE[i]); \
+        \
+    } \
+    \
+    /* From NR, during each iteration of the m loop, we are computing the \
+       p_{i ... i+m} terms. \
+    */ \
+    for (m=1;m<n;m++) { \
+        for (i=0;i<n-m;i++) { \
+            /* From NR: we are computing P_{i ... i+m} \
+             */ \
+            p->data.TYPE[i] = (((x-domain[i+m]) * p->data.TYPE[i]) + \
+                               ((domain[i]-x) * p->data.TYPE[i+1])) / \
+                              (domain[i] - domain[i+m]); \
+            /*printf("((%f-%f * %f) + (%f-%f * %f)) / (%f - %f)\n", x, domain[i+m], p->data.TYPE[i], domain[i], x, p->data.TYPE[i+1], domain[i], domain[i+m]); \
+             */ \
+            psTrace(".psLib.dataManip.psFunctions.fullInterpolate1D##TYPE", 6, \
+                    "p->data.TYPE[%d] is %f\n", i, p->data.TYPE[i]); \
+        } \
+    } \
+    psTrace(".psLib.dataManip.psFunctions.fullInterpolate1D##TYPE", 4, \
+            "---- fullInterpolate1D##TYPE() end ----\n"); \
+    \
+    return(p->data.TYPE[0]); \
+} \
+
+/*
+FUNC_MACRO_FULL_INTERPOLATE_1D(U8)
+FUNC_MACRO_FULL_INTERPOLATE_1D(U16)
+FUNC_MACRO_FULL_INTERPOLATE_1D(U32)
+FUNC_MACRO_FULL_INTERPOLATE_1D(U64)
+FUNC_MACRO_FULL_INTERPOLATE_1D(S8)
+FUNC_MACRO_FULL_INTERPOLATE_1D(S16)
+FUNC_MACRO_FULL_INTERPOLATE_1D(S32)
+FUNC_MACRO_FULL_INTERPOLATE_1D(S64)
+FUNC_MACRO_FULL_INTERPOLATE_1D(F64)
+*/
+FUNC_MACRO_FULL_INTERPOLATE_1D(F32)
+
+
+/*****************************************************************************
+interpolate1DF32(): this is the base 1-D flat memory routine to perform
+LaGrange interpolation.
+ *****************************************************************************/
+static psF32 interpolate1DF32(psF32 *domain,
+                              psF32 *range,
+                              psS32 n,
+                              psS32 order,
+                              psF32 x)
+{
+    PS_PTR_CHECK_NULL(domain, NAN)
+    PS_PTR_CHECK_NULL(range, NAN)
+    // XXX: Check valid values for n, order, and x?
+
+    psS32 binNum;
+    psS32 numIntPoints = order+1;
+    psS32 origin;
+
+    psTrace(".psLib.dataManip.psFunctions.interpolate1DF32", 4,
+            "---- interpolate1DF32() begin ----\n");
+
+    binNum = vectorBinDisectF32(domain, n, x);
+
+    if (0 == numIntPoints%2) {
+        origin = binNum - ((numIntPoints/2) - 1);
+    } else {
+        origin = binNum - (numIntPoints/2);
+        if ((x-domain[binNum]) > (domain[binNum+1]-x)) {
+            // x is closer to binNum+1.
+            origin = 1 + (binNum - (numIntPoints/2));
+        }
+    }
+    if (origin < 0) {
+        origin = 0;
+    }
+    if ((origin + numIntPoints) > n) {
+        origin = n - numIntPoints;
+    }
+
+    psTrace(".psLib.dataManip.psFunctions.interpolate1DF32", 4,
+            "---- interpolate1DF32() end ----\n");
+    return(fullInterpolate1DF32(&domain[origin], &range[origin], order+1, x));
+}
+
+/*****************************************************************************/
+/*  FUNCTION IMPLEMENTATION - PUBLIC                                         */
+/*****************************************************************************/
+
+/*****************************************************************************
+    Evaluate a non-normalized Gaussian with the given mean and sigma at the
+    given coordianate.  Note that this is not a Gaussian deviate.  The
+    evaluated Gaussian is: \f[ exp(-\frac{(x-mean)^2}{2\sigma^2}) \f]
+ *****************************************************************************/
+psF32 psGaussian(psF32 x, psF32 mean, psF32 sigma, psBool normal)
+{
+    psF32 tmp = 1.0;
+
+    psTrace(".psLib.dataManip.psFunctions.psGaussian", 4,
+            "---- psGaussian() begin ----\n");
+
+    if (normal == true) {
+        tmp = 1.0 / PS_SQRT_F32(2.0 * PS_PI * (sigma * sigma));
+    }
+
+    psTrace(".psLib.dataManip.psFunctions.psGaussian", 4,
+            "---- psGaussian() end ----\n");
+    return(tmp * exp(-((x - mean) * (x - mean)) / (2.0 * sigma * sigma)));
+}
+
+/*****************************************************************************
+    p_psGaussianDev()
+ This private routine (formerly a psLib API routine) creates a psVector of the
+ specified size and type F32 and fills it with a random Gaussian distribution
+ of numbers with the specified mean and sigma.  This routine makes use of the
+ GSL routines for generating both uniformly distributed numbers and the
+ Gaussian distribution as well.
+ 
+XXX: There is no way to seed the random generator.
+ *****************************************************************************/
+psVector* p_psGaussianDev(psF32 mean, psF32 sigma, psS32 Npts)
+{
+    PS_INT_CHECK_NON_NEGATIVE(Npts, NULL);
+
+    psVector* gauss = NULL;
+    const gsl_rng_type *T = NULL;
+    gsl_rng *r = NULL;
+    psS32 i = 0;
+
+
+    gauss = psVectorAlloc(Npts, PS_TYPE_F32);
+    gauss->n = Npts;
+    gsl_rng_env_setup();
+    T = gsl_rng_default;
+    r = gsl_rng_alloc(T);
+
+    for (i = 0; i < Npts; i++) {
+        gauss->data.F32[i] = mean + gsl_ran_gaussian(r, sigma);
+    }
+
+    // XXX: Should I free r, T as well?  This is a memory leak.
+    return(gauss);
+}
+
+/*****************************************************************************
+    This routine must allocate memory for the polynomial structures.
+ *****************************************************************************/
+psPolynomial1D* psPolynomial1DAlloc(psS32 n,
+                                    psPolynomialType type)
+{
+    PS_INT_CHECK_POSITIVE(n, NULL);
+
+    psS32 i = 0;
+    psPolynomial1D* newPoly = NULL;
+
+    newPoly = (psPolynomial1D* ) psAlloc(sizeof(psPolynomial1D));
+    psMemSetDeallocator(newPoly, (psFreeFcn) polynomial1DFree);
+
+    newPoly->type = type;
+    newPoly->n = n;
+    newPoly->coeff = (psF32 *)psAlloc(n * sizeof(psF32));
+    newPoly->coeffErr = (psF32 *)psAlloc(n * sizeof(psF32));
+    newPoly->mask = (psU8 *)psAlloc(n * sizeof(psU8));
+    for (i = 0; i < n; i++) {
+        newPoly->coeff[i] = 0.0;
+        newPoly->coeffErr[i] = 0.0;
+        newPoly->mask[i] = 0;
+    }
+
+    return(newPoly);
+}
+
+psPolynomial2D* psPolynomial2DAlloc(psS32 nX, psS32 nY,
+                                    psPolynomialType type)
+{
+    PS_INT_CHECK_POSITIVE(nX, NULL);
+    PS_INT_CHECK_POSITIVE(nY, NULL);
+
+    psS32 x = 0;
+    psS32 y = 0;
+    psPolynomial2D* newPoly = NULL;
+
+    newPoly = (psPolynomial2D* ) psAlloc(sizeof(psPolynomial2D));
+    psMemSetDeallocator(newPoly, (psFreeFcn) polynomial2DFree);
+
+    newPoly->type = type;
+    newPoly->nX = nX;
+    newPoly->nY = nY;
+
+    newPoly->coeff = (psF32 **)psAlloc(nX * sizeof(psF32 *));
+    newPoly->coeffErr = (psF32 **)psAlloc(nX * sizeof(psF32 *));
+    newPoly->mask = (psU8 **)psAlloc(nX * sizeof(psU8 *));
+    for (x = 0; x < nX; x++) {
+        newPoly->coeff[x] = (psF32 *)psAlloc(nY * sizeof(psF32));
+        newPoly->coeffErr[x] = (psF32 *)psAlloc(nY * sizeof(psF32));
+        newPoly->mask[x] = (psU8 *)psAlloc(nY * sizeof(psU8));
+    }
+    for (x = 0; x < nX; x++) {
+        for (y = 0; y < nY; y++) {
+            newPoly->coeff[x][y] = 0.0;
+            newPoly->coeffErr[x][y] = 0.0;
+            newPoly->mask[x][y] = 0;
+        }
+    }
+
+    return(newPoly);
+}
+
+psPolynomial3D* psPolynomial3DAlloc(psS32 nX, psS32 nY, psS32 nZ,
+                                    psPolynomialType type)
+{
+    PS_INT_CHECK_POSITIVE(nX, NULL);
+    PS_INT_CHECK_POSITIVE(nY, NULL);
+    PS_INT_CHECK_POSITIVE(nZ, NULL);
+
+    psS32 x = 0;
+    psS32 y = 0;
+    psS32 z = 0;
+    psPolynomial3D* newPoly = NULL;
+
+    newPoly = (psPolynomial3D* ) psAlloc(sizeof(psPolynomial3D));
+    psMemSetDeallocator(newPoly, (psFreeFcn) polynomial3DFree);
+
+    newPoly->type = type;
+    newPoly->nX = nX;
+    newPoly->nY = nY;
+    newPoly->nZ = nZ;
+
+    newPoly->coeff = (psF32 ***)psAlloc(nX * sizeof(psF32 **));
+    newPoly->coeffErr = (psF32 ***)psAlloc(nX * sizeof(psF32 **));
+    newPoly->mask = (psU8 ***)psAlloc(nX * sizeof(psU8 **));
+    for (x = 0; x < nX; x++) {
+        newPoly->coeff[x] = (psF32 **)psAlloc(nY * sizeof(psF32 *));
+        newPoly->coeffErr[x] = (psF32 **)psAlloc(nY * sizeof(psF32 *));
+        newPoly->mask[x] = (psU8 **)psAlloc(nY * sizeof(psU8 *));
+        for (y = 0; y < nY; y++) {
+            newPoly->coeff[x][y] = (psF32 *)psAlloc(nZ * sizeof(psF32));
+            newPoly->coeffErr[x][y] = (psF32 *)psAlloc(nZ * sizeof(psF32));
+            newPoly->mask[x][y] = (psU8 *)psAlloc(nZ * sizeof(psU8));
+        }
+    }
+    for (x = 0; x < nX; x++) {
+        for (y = 0; y < nY; y++) {
+            for (z = 0; z < nZ; z++) {
+                newPoly->coeff[x][y][z] = 0.0;
+                newPoly->coeffErr[x][y][z] = 0.0;
+                newPoly->mask[x][y][z] = 0;
+            }
+        }
+    }
+
+    return(newPoly);
+}
+
+psPolynomial4D* psPolynomial4DAlloc(psS32 nW, psS32 nX, psS32 nY, psS32 nZ,
+                                    psPolynomialType type)
+{
+    PS_INT_CHECK_POSITIVE(nW, NULL);
+    PS_INT_CHECK_POSITIVE(nX, NULL);
+    PS_INT_CHECK_POSITIVE(nY, NULL);
+    PS_INT_CHECK_POSITIVE(nZ, NULL);
+
+    psS32 w = 0;
+    psS32 x = 0;
+    psS32 y = 0;
+    psS32 z = 0;
+    psPolynomial4D* newPoly = NULL;
+
+    newPoly = (psPolynomial4D* ) psAlloc(sizeof(psPolynomial4D));
+    psMemSetDeallocator(newPoly, (psFreeFcn) polynomial4DFree);
+
+    newPoly->type = type;
+    newPoly->nW = nW;
+    newPoly->nX = nX;
+    newPoly->nY = nY;
+    newPoly->nZ = nZ;
+
+    newPoly->coeff = (psF32 ****)psAlloc(nW * sizeof(psF32 ***));
+    newPoly->coeffErr = (psF32 ****)psAlloc(nW * sizeof(psF32 ***));
+    newPoly->mask = (psU8 ****)psAlloc(nW * sizeof(psU8 ***));
+    for (w = 0; w < nW; w++) {
+        newPoly->coeff[w] = (psF32 ***)psAlloc(nX * sizeof(psF32 **));
+        newPoly->coeffErr[w] = (psF32 ***)psAlloc(nX * sizeof(psF32 **));
+        newPoly->mask[w] = (psU8 ***)psAlloc(nX * sizeof(psU8 **));
+        for (x = 0; x < nX; x++) {
+            newPoly->coeff[w][x] = (psF32 **)psAlloc(nY * sizeof(psF32 *));
+            newPoly->coeffErr[w][x] = (psF32 **)psAlloc(nY * sizeof(psF32 *));
+            newPoly->mask[w][x] = (psU8 **)psAlloc(nY * sizeof(psU8 *));
+            for (y = 0; y < nY; y++) {
+                newPoly->coeff[w][x][y] = (psF32 *)psAlloc(nZ * sizeof(psF32));
+                newPoly->coeffErr[w][x][y] = (psF32 *)psAlloc(nZ * sizeof(psF32));
+                newPoly->mask[w][x][y] = (psU8 *)psAlloc(nZ * sizeof(psU8));
+            }
+        }
+    }
+    for (w = 0; w < nW; w++) {
+        for (x = 0; x < nX; x++) {
+            for (y = 0; y < nY; y++) {
+                for (z = 0; z < nZ; z++) {
+                    newPoly->coeff[w][x][y][z] = 0.0;
+                    newPoly->coeffErr[w][x][y][z] = 0.0;
+                    newPoly->mask[w][x][y][z] = 0;
+                }
+            }
+        }
+    }
+
+    return(newPoly);
+}
+
+psF32 psPolynomial1DEval(const psPolynomial1D* myPoly, psF32 x)
+{
+    PS_POLY_CHECK_NULL(myPoly, NAN);
+
+    if (myPoly->type == PS_POLYNOMIAL_ORD) {
+        return(ordPolynomial1DEval(x, myPoly));
+    } else if (myPoly->type == PS_POLYNOMIAL_CHEB) {
+        return(chebPolynomial1DEval(x, myPoly));
+    } else {
+        psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                PS_ERRORTEXT_psFunctions_INVALID_POLYNOMIAL_TYPE,
+                myPoly->type);
+    }
+    return(NAN);
+}
+
+psVector *psPolynomial1DEvalVector(const psPolynomial1D *myPoly,
+                                   const psVector *x)
+{
+    PS_POLY_CHECK_NULL(myPoly, NULL);
+    PS_VECTOR_CHECK_NULL(x, NULL);
+    PS_VECTOR_CHECK_TYPE(x, PS_TYPE_F32, NULL);
+
+    psVector *tmp;
+
+    tmp = psVectorAlloc(x->n, PS_TYPE_F32);
+    for (psS32 i=0;i<x->n;i++) {
+        tmp->data.F32[i] = psPolynomial1DEval(myPoly, x->data.F32[i]);
+    }
+
+    return(tmp);
+}
+
+psF32 psPolynomial2DEval(const psPolynomial2D* myPoly, psF32 x, psF32 y)
+{
+    PS_POLY_CHECK_NULL(myPoly, NAN);
+
+    if (myPoly->type == PS_POLYNOMIAL_ORD) {
+        return(ordPolynomial2DEval(x, y, myPoly));
+    } else if (myPoly->type == PS_POLYNOMIAL_CHEB) {
+        return(chebPolynomial2DEval(x, y, myPoly));
+    } else {
+        psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                PS_ERRORTEXT_psFunctions_INVALID_POLYNOMIAL_TYPE,
+                myPoly->type);
+    }
+    return(NAN);
+}
+
+psVector *psPolynomial2DEvalVector(const psPolynomial2D *myPoly,
+                                   const psVector *x,
+                                   const psVector *y)
+
+{
+    PS_POLY_CHECK_NULL(myPoly, NULL);
+    PS_VECTOR_CHECK_NULL(x, NULL);
+    PS_VECTOR_CHECK_TYPE(x, PS_TYPE_F32, NULL);
+    PS_VECTOR_CHECK_NULL(y, NULL);
+    PS_VECTOR_CHECK_TYPE(y, PS_TYPE_F32, NULL);
+
+    psVector *tmp;
+    psS32 vecLen=x->n;
+
+    // Determine the length of the output vector to by the minimum of the x,y vectors
+    if (y->n < vecLen) {
+        vecLen = y->n;
+    }
+
+    // Create output vector to return
+    tmp = psVectorAlloc(vecLen, PS_TYPE_F32);
+
+    // Evaluate the polynomial at the specified points
+    for (psS32 i=0; i<vecLen; i++) {
+        tmp->data.F32[i] = psPolynomial2DEval(myPoly,x->data.F32[i],y->data.F32[i]);
+    }
+
+    // Return output vector
+    return(tmp);
+}
+
+psF32 psPolynomial3DEval(const psPolynomial3D* myPoly, psF32 x, psF32 y, psF32 z)
+{
+    PS_POLY_CHECK_NULL(myPoly, NAN);
+
+    if (myPoly->type == PS_POLYNOMIAL_ORD) {
+        return(ordPolynomial3DEval(x, y, z, myPoly));
+    } else if (myPoly->type == PS_POLYNOMIAL_CHEB) {
+        return(chebPolynomial3DEval(x, y, z, myPoly));
+    } else {
+        psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                PS_ERRORTEXT_psFunctions_INVALID_POLYNOMIAL_TYPE,
+                myPoly->type);
+    }
+    return(NAN);
+}
+
+psVector *psPolynomial3DEvalVector(const psPolynomial3D *myPoly,
+                                   const psVector *x,
+                                   const psVector *y,
+                                   const psVector *z)
+
+{
+    PS_POLY_CHECK_NULL(myPoly, NULL);
+    PS_VECTOR_CHECK_NULL(x, NULL);
+    PS_VECTOR_CHECK_TYPE(x, PS_TYPE_F32, NULL);
+    PS_VECTOR_CHECK_NULL(y, NULL);
+    PS_VECTOR_CHECK_TYPE(y, PS_TYPE_F32, NULL);
+    PS_VECTOR_CHECK_NULL(z, NULL);
+    PS_VECTOR_CHECK_TYPE(z, PS_TYPE_F32, NULL);
+
+    psVector *tmp;
+    psS32 vecLen=x->n;
+
+    // Determine the length of output vector from min of the input vectors
+    if (y->n < vecLen) {
+        vecLen = y->n;
+    }
+    if (z->n < vecLen) {
+        vecLen = z->n;
+    }
+
+    // Allocate output vector
+    tmp = psVectorAlloc(vecLen, PS_TYPE_F32);
+
+    // Evaluate polynomial
+    for (psS32 i = 0; i < vecLen; i++) {
+        tmp->data.F32[i] = psPolynomial3DEval(myPoly,
+                                              x->data.F32[i],
+                                              y->data.F32[i],
+                                              z->data.F32[i]);
+    }
+
+    // Return output vector
+    return(tmp);
+}
+
+psF32 psPolynomial4DEval(const psPolynomial4D* myPoly, psF32 w, psF32 x, psF32 y, psF32 z)
+{
+    PS_POLY_CHECK_NULL(myPoly, NAN);
+
+    if (myPoly->type == PS_POLYNOMIAL_ORD) {
+        return(ordPolynomial4DEval(w,x,y,z, myPoly));
+    } else if (myPoly->type == PS_POLYNOMIAL_CHEB) {
+        return(chebPolynomial4DEval(w,x,y,z, myPoly));
+    } else {
+        psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                PS_ERRORTEXT_psFunctions_INVALID_POLYNOMIAL_TYPE,
+                myPoly->type);
+    }
+    return(NAN);
+}
+
+psVector *psPolynomial4DEvalVector(const psPolynomial4D *myPoly,
+                                   const psVector *w,
+                                   const psVector *x,
+                                   const psVector *y,
+                                   const psVector *z)
+{
+    PS_POLY_CHECK_NULL(myPoly, NULL);
+    PS_VECTOR_CHECK_NULL(w, NULL);
+    PS_VECTOR_CHECK_TYPE(w, PS_TYPE_F32, NULL);
+    PS_VECTOR_CHECK_NULL(x, NULL);
+    PS_VECTOR_CHECK_TYPE(x, PS_TYPE_F32, NULL);
+    PS_VECTOR_CHECK_NULL(y, NULL);
+    PS_VECTOR_CHECK_TYPE(y, PS_TYPE_F32, NULL);
+    PS_VECTOR_CHECK_NULL(z, NULL);
+    PS_VECTOR_CHECK_TYPE(z, PS_TYPE_F32, NULL);
+
+    psVector *tmp;
+    psS32 vecLen=w->n;
+
+    // Determine output vector size from min of input vectors
+    if (y->n < vecLen) {
+        vecLen = y->n;
+    }
+    if (x->n < vecLen) {
+        vecLen = x->n;
+    }
+    if (z->n < vecLen) {
+        vecLen = z->n;
+    }
+
+    // Allocate output vector
+    tmp = psVectorAlloc(vecLen, PS_TYPE_F32);
+
+    // Evaluate polynomial
+    for (psS32 i = 0; i < vecLen; i++) {
+        tmp->data.F32[i] = psPolynomial4DEval(myPoly,
+                                              w->data.F32[i],
+                                              x->data.F32[i],
+                                              y->data.F32[i],
+                                              z->data.F32[i]);
+    }
+
+    // Return output vector
+    return(tmp);
+}
+
+
+psDPolynomial1D* psDPolynomial1DAlloc(psS32 n,
+                                      psPolynomialType type)
+{
+    PS_INT_CHECK_POSITIVE(n, NULL);
+
+    psS32 i = 0;
+    psDPolynomial1D* newPoly = NULL;
+
+    newPoly = (psDPolynomial1D* ) psAlloc(sizeof(psDPolynomial1D));
+    psMemSetDeallocator(newPoly, (psFreeFcn) dPolynomial1DFree);
+
+    newPoly->type = type;
+    newPoly->n = n;
+    newPoly->coeff = (psF64 *)psAlloc(n * sizeof(psF64));
+    newPoly->coeffErr = (psF64 *)psAlloc(n * sizeof(psF64));
+    newPoly->mask = (psU8 *)psAlloc(n * sizeof(psU8));
+    for (i = 0; i < n; i++) {
+        newPoly->coeff[i] = 0.0;
+        newPoly->coeffErr[i] = 0.0;
+        newPoly->mask[i] = 0;
+    }
+
+    return(newPoly);
+}
+
+psDPolynomial2D* psDPolynomial2DAlloc(psS32 nX, psS32 nY,
+                                      psPolynomialType type)
+{
+    PS_INT_CHECK_POSITIVE(nX, NULL);
+    PS_INT_CHECK_POSITIVE(nY, NULL);
+
+    psS32 x = 0;
+    psS32 y = 0;
+    psDPolynomial2D* newPoly = NULL;
+
+    newPoly = (psDPolynomial2D* ) psAlloc(sizeof(psDPolynomial2D));
+    psMemSetDeallocator(newPoly, (psFreeFcn) dPolynomial2DFree);
+
+    newPoly->type = type;
+    newPoly->nX = nX;
+    newPoly->nY = nY;
+
+    newPoly->coeff = (psF64 **)psAlloc(nX * sizeof(psF64 *));
+    newPoly->coeffErr = (psF64 **)psAlloc(nX * sizeof(psF64 *));
+    newPoly->mask = (psU8 **)psAlloc(nX * sizeof(psU8 *));
+    for (x = 0; x < nX; x++) {
+        newPoly->coeff[x] = (psF64 *)psAlloc(nY * sizeof(psF64));
+        newPoly->coeffErr[x] = (psF64 *)psAlloc(nY * sizeof(psF64));
+        newPoly->mask[x] = (psU8 *)psAlloc(nY * sizeof(psU8));
+    }
+    for (x = 0; x < nX; x++) {
+        for (y = 0; y < nY; y++) {
+            newPoly->coeff[x][y] = 0.0;
+            newPoly->coeffErr[x][y] = 0.0;
+            newPoly->mask[x][y] = 0;
+        }
+    }
+
+    return(newPoly);
+}
+
+psDPolynomial3D* psDPolynomial3DAlloc(psS32 nX, psS32 nY, psS32 nZ,
+                                      psPolynomialType type)
+{
+    PS_INT_CHECK_POSITIVE(nX, NULL);
+    PS_INT_CHECK_POSITIVE(nY, NULL);
+    PS_INT_CHECK_POSITIVE(nZ, NULL);
+
+    psS32 x = 0;
+    psS32 y = 0;
+    psS32 z = 0;
+    psDPolynomial3D* newPoly = NULL;
+
+    newPoly = (psDPolynomial3D* ) psAlloc(sizeof(psDPolynomial3D));
+    psMemSetDeallocator(newPoly, (psFreeFcn) dPolynomial3DFree);
+
+    newPoly->type = type;
+    newPoly->nX = nX;
+    newPoly->nY = nY;
+    newPoly->nZ = nZ;
+
+    newPoly->coeff = (psF64 ***)psAlloc(nX * sizeof(psF64 **));
+    newPoly->coeffErr = (psF64 ***)psAlloc(nX * sizeof(psF64 **));
+    newPoly->mask = (psU8 ***)psAlloc(nX * sizeof(psU8 **));
+    for (x = 0; x < nX; x++) {
+        newPoly->coeff[x] = (psF64 **)psAlloc(nY * sizeof(psF64 *));
+        newPoly->coeffErr[x] = (psF64 **)psAlloc(nY * sizeof(psF64 *));
+        newPoly->mask[x] = (psU8 **)psAlloc(nY * sizeof(psU8 *));
+        for (y = 0; y < nY; y++) {
+            newPoly->coeff[x][y] = (psF64 *)psAlloc(nZ * sizeof(psF64));
+            newPoly->coeffErr[x][y] = (psF64 *)psAlloc(nZ * sizeof(psF64));
+            newPoly->mask[x][y] = (psU8 *)psAlloc(nZ * sizeof(psU8));
+        }
+    }
+    for (x = 0; x < nX; x++) {
+        for (y = 0; y < nY; y++) {
+            for (z = 0; z < nZ; z++) {
+                newPoly->coeff[x][y][z] = 0.0;
+                newPoly->coeffErr[x][y][z] = 0.0;
+                newPoly->mask[x][y][z] = 0;
+            }
+        }
+    }
+
+    return(newPoly);
+}
+
+psDPolynomial4D* psDPolynomial4DAlloc(psS32 nW, psS32 nX, psS32 nY, psS32 nZ,
+                                      psPolynomialType type)
+{
+    PS_INT_CHECK_POSITIVE(nW, NULL);
+    PS_INT_CHECK_POSITIVE(nX, NULL);
+    PS_INT_CHECK_POSITIVE(nY, NULL);
+    PS_INT_CHECK_POSITIVE(nZ, NULL);
+
+    psS32 w = 0;
+    psS32 x = 0;
+    psS32 y = 0;
+    psS32 z = 0;
+    psDPolynomial4D* newPoly = NULL;
+
+    newPoly = (psDPolynomial4D* ) psAlloc(sizeof(psDPolynomial4D));
+    psMemSetDeallocator(newPoly, (psFreeFcn) dPolynomial4DFree);
+
+    newPoly->type = type;
+    newPoly->nW = nW;
+    newPoly->nX = nX;
+    newPoly->nY = nY;
+    newPoly->nZ = nZ;
+
+    newPoly->coeff = (psF64 ****)psAlloc(nW * sizeof(psF64 ***));
+    newPoly->coeffErr = (psF64 ****)psAlloc(nW * sizeof(psF64 ***));
+    newPoly->mask = (psU8 ****)psAlloc(nW * sizeof(psU8 ***));
+    for (w = 0; w < nW; w++) {
+        newPoly->coeff[w] = (psF64 ***)psAlloc(nX * sizeof(psF64 **));
+        newPoly->coeffErr[w] = (psF64 ***)psAlloc(nX * sizeof(psF64 **));
+        newPoly->mask[w] = (psU8 ***)psAlloc(nX * sizeof(psU8 **));
+        for (x = 0; x < nX; x++) {
+            newPoly->coeff[w][x] = (psF64 **)psAlloc(nY * sizeof(psF64 *));
+            newPoly->coeffErr[w][x] = (psF64 **)psAlloc(nY * sizeof(psF64 *));
+            newPoly->mask[w][x] = (psU8 **)psAlloc(nY * sizeof(psU8 *));
+            for (y = 0; y < nY; y++) {
+                newPoly->coeff[w][x][y] = (psF64 *)psAlloc(nZ * sizeof(psF64));
+                newPoly->coeffErr[w][x][y] = (psF64 *)psAlloc(nZ * sizeof(psF64));
+                newPoly->mask[w][x][y] = (psU8 *)psAlloc(nZ * sizeof(psU8));
+            }
+        }
+    }
+    for (w = 0; w < nW; w++) {
+        for (x = 0; x < nX; x++) {
+            for (y = 0; y < nY; y++) {
+                for (z = 0; z < nZ; z++) {
+                    newPoly->coeff[w][x][y][z] = 0.0;
+                    newPoly->coeffErr[w][x][y][z] = 0.0;
+                    newPoly->mask[w][x][y][z] = 0;
+                }
+            }
+        }
+    }
+
+    return(newPoly);
+}
+
+
+psF64 psDPolynomial1DEval(const psDPolynomial1D* myPoly, psF64 x)
+{
+    PS_POLY_CHECK_NULL(myPoly, NAN);
+
+    if (myPoly->type == PS_POLYNOMIAL_ORD) {
+        return(dOrdPolynomial1DEval(x, myPoly));
+    } else if (myPoly->type == PS_POLYNOMIAL_CHEB) {
+        return(dChebPolynomial1DEval(x, myPoly));
+    } else {
+        psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                PS_ERRORTEXT_psFunctions_INVALID_POLYNOMIAL_TYPE,
+                myPoly->type);
+    }
+    return(NAN);
+}
+
+psVector *psDPolynomial1DEvalVector(const psDPolynomial1D *myPoly,
+                                    const psVector *x)
+
+{
+    PS_POLY_CHECK_NULL(myPoly, NULL);
+    PS_VECTOR_CHECK_NULL(x, NULL);
+    PS_VECTOR_CHECK_TYPE(x, PS_TYPE_F64, NULL);
+
+    psVector *tmp;
+
+    tmp = psVectorAlloc(x->n, PS_TYPE_F64);
+    for (psS32 i=0;i<x->n;i++) {
+        tmp->data.F64[i] = psDPolynomial1DEval(myPoly,
+                                               x->data.F64[i]);
+    }
+
+    return(tmp);
+}
+
+
+psF64 psDPolynomial2DEval(const psDPolynomial2D* myPoly,
+                          psF64 x,
+                          psF64 y)
+{
+    PS_POLY_CHECK_NULL(myPoly, NAN);
+
+    if (myPoly->type == PS_POLYNOMIAL_ORD) {
+        return(dOrdPolynomial2DEval(x, y, myPoly));
+    } else if (myPoly->type == PS_POLYNOMIAL_CHEB) {
+        return(dChebPolynomial2DEval(x, y, myPoly));
+    } else {
+        psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                PS_ERRORTEXT_psFunctions_INVALID_POLYNOMIAL_TYPE,
+                myPoly->type);
+    }
+    return(NAN);
+}
+
+psVector *psDPolynomial2DEvalVector(const psDPolynomial2D *myPoly,
+                                    const psVector *x,
+                                    const psVector *y)
+{
+    PS_POLY_CHECK_NULL(myPoly, NULL);
+    PS_VECTOR_CHECK_NULL(x, NULL);
+    PS_VECTOR_CHECK_TYPE(x, PS_TYPE_F64, NULL);
+    PS_VECTOR_CHECK_NULL(y, NULL);
+    PS_VECTOR_CHECK_TYPE(y, PS_TYPE_F64, NULL);
+
+    psVector *tmp;
+    psS32 vecLen=x->n;
+
+    // Determine the output vector length from minimum length of input vectors
+    if (y->n < vecLen) {
+        vecLen = y->n;
+    }
+
+    // Allocate output vector
+    tmp = psVectorAlloc(vecLen, PS_TYPE_F64);
+
+    // Evaluate the polynomial
+    for (psS32 i = 0; i < vecLen; i++) {
+        tmp->data.F64[i] = psDPolynomial2DEval(myPoly,x->data.F64[i],y->data.F64[i]);
+    }
+
+    // Return output vector
+    return(tmp);
+}
+
+
+psF64 psDPolynomial3DEval(const psDPolynomial3D* myPoly,
+                          psF64 x,
+                          psF64 y,
+                          psF64 z)
+{
+    PS_POLY_CHECK_NULL(myPoly, NAN);
+
+    if (myPoly->type == PS_POLYNOMIAL_ORD) {
+        return(dOrdPolynomial3DEval(x, y, z, myPoly));
+    } else if (myPoly->type == PS_POLYNOMIAL_CHEB) {
+        return(dChebPolynomial3DEval(x, y, z, myPoly));
+    } else {
+        psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                PS_ERRORTEXT_psFunctions_INVALID_POLYNOMIAL_TYPE,
+                myPoly->type);
+    }
+    return(NAN);
+}
+
+psVector *psDPolynomial3DEvalVector(const psDPolynomial3D *myPoly,
+                                    const psVector *x,
+                                    const psVector *y,
+                                    const psVector *z)
+
+{
+    PS_POLY_CHECK_NULL(myPoly, NULL);
+    PS_VECTOR_CHECK_NULL(x, NULL);
+    PS_VECTOR_CHECK_TYPE(x, PS_TYPE_F64, NULL);
+    PS_VECTOR_CHECK_NULL(y, NULL);
+    PS_VECTOR_CHECK_TYPE(y, PS_TYPE_F64, NULL);
+    PS_VECTOR_CHECK_NULL(z, NULL);
+    PS_VECTOR_CHECK_TYPE(z, PS_TYPE_F64, NULL);
+
+    psVector *tmp;
+    psS32 vecLen=x->n;
+
+    // Determine the size of output vector from min of input vectors
+    if (y->n < vecLen) {
+        vecLen = y->n;
+    }
+    if (z->n < vecLen) {
+        vecLen = z->n;
+    }
+
+    // Allocate output vector
+    tmp = psVectorAlloc(vecLen, PS_TYPE_F64);
+
+    // Evaluate polynomial
+    for (psS32 i = 0; i < vecLen; i++) {
+        tmp->data.F64[i] = psDPolynomial3DEval(myPoly,
+                                               x->data.F64[i],
+                                               y->data.F64[i],
+                                               z->data.F64[i]);
+    }
+
+    // Return output vector
+    return(tmp);
+}
+
+psF64 psDPolynomial4DEval(const psDPolynomial4D* myPoly,
+                          psF64 w,
+                          psF64 x,
+                          psF64 y,
+                          psF64 z)
+{
+    PS_POLY_CHECK_NULL(myPoly, NAN);
+
+    if (myPoly->type == PS_POLYNOMIAL_ORD) {
+        return(dOrdPolynomial4DEval(w,x,y,z, myPoly));
+    } else if (myPoly->type == PS_POLYNOMIAL_CHEB) {
+        return(dChebPolynomial4DEval(w,x,y,z, myPoly));
+    } else {
+        psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                PS_ERRORTEXT_psFunctions_INVALID_POLYNOMIAL_TYPE,
+                myPoly->type);
+    }
+    return(NAN);
+}
+
+psVector *psDPolynomial4DEvalVector(const psDPolynomial4D *myPoly,
+                                    const psVector *w,
+                                    const psVector *x,
+                                    const psVector *y,
+                                    const psVector *z)
+{
+    PS_POLY_CHECK_NULL(myPoly, NULL);
+    PS_VECTOR_CHECK_NULL(w, NULL);
+    PS_VECTOR_CHECK_TYPE(w, PS_TYPE_F64, NULL);
+    PS_VECTOR_CHECK_NULL(x, NULL);
+    PS_VECTOR_CHECK_TYPE(x, PS_TYPE_F64, NULL);
+    PS_VECTOR_CHECK_NULL(y, NULL);
+    PS_VECTOR_CHECK_TYPE(y, PS_TYPE_F64, NULL);
+    PS_VECTOR_CHECK_NULL(z, NULL);
+    PS_VECTOR_CHECK_TYPE(z, PS_TYPE_F64, NULL);
+
+    psVector *tmp;
+    psS32 vecLen=w->n;
+
+    // Determine the output vector size from min of input vectors
+    if (y->n < vecLen) {
+        vecLen = y->n;
+    }
+    if (x->n < vecLen) {
+        vecLen = x->n;
+    }
+    if (z->n < vecLen) {
+        vecLen = z->n;
+    }
+
+    // Allocate output vector
+    tmp = psVectorAlloc(vecLen, PS_TYPE_F64);
+
+    // Evaluate the polynomial
+    for (psS32 i = 0; i < vecLen; i++) {
+        tmp->data.F64[i] = psDPolynomial4DEval(myPoly,
+                                               w->data.F64[i],
+                                               x->data.F64[i],
+                                               y->data.F64[i],
+                                               z->data.F64[i]);
+    }
+
+    // Return output vector
+    return(tmp);
+}
+
+
+
+
+//typedef struct {
+//    psS32 n;
+//    psPolynomial1D **spline;
+//    psF32 *p_psDeriv2;
+//    psVector *knots;
+//} psSpline1D;
+
+/*****************************************************************************
+    NOTE: "n" specifies the number of spline polynomials.  Therefore, there
+    must exist n+1 points in "knots".
+ 
+XXX: Ensure that domain[i+1] != domain[i]
+ 
+XXX: What should be the defualty type for knots be?  psF32 is assumed.
+ *****************************************************************************/
+psSpline1D *psSpline1DAlloc(psS32 numSplines,
+                            psS32 order,
+                            psF32 min,
+                            psF32 max)
+{
+    PS_INT_CHECK_NON_NEGATIVE(numSplines, NULL);
+    PS_INT_CHECK_NON_NEGATIVE(order, NULL);
+    PS_FLOAT_CHECK_NON_EQUAL(max, min, NULL);
+
+    psSpline1D *tmp = NULL;
+    psS32 i;
+    psF32 tmpDomain;
+    psF32 width;
+
+    tmp = (psSpline1D *) psAlloc(sizeof(psSpline1D));
+    tmp->n = numSplines;
+
+    tmp->spline = (psPolynomial1D **) psAlloc(numSplines * sizeof(psPolynomial1D *));
+    for (i=0;i<numSplines;i++) {
+        (tmp->spline)[i] = psPolynomial1DAlloc(order+1, PS_POLYNOMIAL_ORD);
+    }
+
+    // This should be set by the psVectorFitSpline1D()
+    tmp->p_psDeriv2 = NULL;
+
+    tmp->knots = psVectorAlloc(numSplines+1, PS_TYPE_F32);
+    width = (max - min) / ((psF32) numSplines);
+
+    tmp->knots->data.F32[0] = min;
+    tmpDomain = min+width;
+    for (i=1;i<numSplines+1;i++) {
+        tmp->knots->data.F32[i] = tmpDomain;
+        tmpDomain+= width;
+    }
+    tmp->knots->data.F32[numSplines] = max;
+
+    psMemSetDeallocator(tmp,(psFreeFcn)spline1DFree);
+    return(tmp);
+}
+
+
+/*****************************************************************************
+XXX: What should be the defualty type for knots be?  psF32 is assumed.
+ *****************************************************************************/
+psSpline1D *psSpline1DAllocGeneric(const psVector *bounds,
+                                   psS32 order)
+{
+    PS_VECTOR_CHECK_NULL(bounds, NULL);
+    PS_VECTOR_CHECK_EMPTY(bounds, NULL);
+    PS_INT_CHECK_NON_NEGATIVE(order, NULL);
+
+    psSpline1D *tmp = NULL;
+    psS32 i;
+    psS32 numSplines;
+
+    tmp = (psSpline1D *) psAlloc(sizeof(psSpline1D));
+
+    numSplines = bounds->n - 1;
+    tmp->n = numSplines;
+
+    tmp->spline = (psPolynomial1D **) psAlloc(numSplines * sizeof(psPolynomial1D *));
+    for (i=0;i<numSplines;i++) {
+        (tmp->spline)[i] = psPolynomial1DAlloc(order+1, PS_POLYNOMIAL_ORD);
+    }
+
+    // This should be set by the psVectorFitSpline1D()
+    tmp->p_psDeriv2 = NULL;
+
+    tmp->knots = psVectorAlloc(bounds->n, PS_TYPE_F32);
+
+    for (i=0;i<bounds->n;i++) {
+        tmp->knots->data.F32[i] = bounds->data.F32[i];
+        if (i<(bounds->n-1)) {
+            if (FLT_EPSILON >= fabs(bounds->data.F32[i+1]-bounds->data.F32[i])) {
+                psError(PS_ERR_UNKNOWN, true, "data points must be distinct\n");
+            }
+        }
+    }
+
+    psMemSetDeallocator(tmp,(psFreeFcn)spline1DFree);
+    return(tmp);
+}
+
+/*****************************************************************************
+vectorBinDisectF32(): This is a macro for a private function which takes as
+input a vector an array of data as well as a single value for that data.  The
+input vector values are assumed to be non-decreasing (v[i-1] <= v[i] for all
+i).  This routine does a binary disection of the vector and returns "i" such
+that (v[i] <= x <= v[i+1).  If x lies outside the range of v[], then this
+routine prints a warning message and returns (-2 or -1).
+ *****************************************************************************/
+#define FUNC_MACRO_VECTOR_BIN_DISECT(TYPE) \
+static psS32 vectorBinDisect##TYPE(ps##TYPE *bins, \
+                                   psS32 numBins, \
+                                   ps##TYPE x) \
+{ \
+    psS32 min; \
+    psS32 max; \
+    psS32 mid; \
+    \
+    psTrace(".psLib.dataManip.psFunctions.vectorBinDisect##TYPE", 4, \
+            "---- Calling vectorBinDisect##TYPE(%f)\n", x); \
+    \
+    if (x < bins[0]) { \
+        psLogMsg(__func__, PS_LOG_WARN, \
+                 "vectorBinDisect%s(): ordinate %f is outside vector range (%f - %f).", \
+                 #TYPE, x, bins[0], bins[numBins-1]); \
+        return(-2); \
+    } \
+    \
+    if (x > bins[numBins-1]) { \
+        psLogMsg(__func__, PS_LOG_WARN, \
+                 "vectorBinDisect%s(): ordinate %f is outside vector range (%f - %f).", \
+                 #TYPE, x, bins[0], bins[numBins-1]); \
+        return(-1); \
+    } \
+    \
+    min = 0; \
+    max = numBins-2; \
+    mid = ((max+1)-min)/2; \
+    \
+    while (min != max) { \
+        psTrace(".psLib.dataManip.psFunctions.vectorBinDisect##TYPE", 4, \
+                "(min, mid, max) is (%d, %d, %d): (x, bins) is (%f, %f)\n", \
+                min, mid, max, x, bins[mid]); \
+        \
+        if (x == bins[mid]) { \
+            psTrace(".psLib.dataManip.psFunctions.vectorBinDisect##TYPE", 4, \
+                    "---- Exiting vectorBinDisect##TYPE(): bin %d\n", mid); \
+            return(mid); \
+        } else if (x < bins[mid]) { \
+            max = mid-1; \
+        } else { \
+            min = mid; \
+        } \
+        mid = ((max+1)+min)/2; \
+    } \
+    \
+    psTrace(".psLib.dataManip.psFunctions.vectorBinDisect##TYPE", 4, \
+            "---- Exiting vectorBinDisect##TYPE(): bin %d\n", min); \
+    return(min); \
+} \
+
+FUNC_MACRO_VECTOR_BIN_DISECT(S8)
+FUNC_MACRO_VECTOR_BIN_DISECT(S16)
+FUNC_MACRO_VECTOR_BIN_DISECT(S32)
+FUNC_MACRO_VECTOR_BIN_DISECT(S64)
+FUNC_MACRO_VECTOR_BIN_DISECT(U8)
+FUNC_MACRO_VECTOR_BIN_DISECT(U16)
+FUNC_MACRO_VECTOR_BIN_DISECT(U32)
+FUNC_MACRO_VECTOR_BIN_DISECT(U64)
+FUNC_MACRO_VECTOR_BIN_DISECT(F32)
+FUNC_MACRO_VECTOR_BIN_DISECT(F64)
+
+/*****************************************************************************
+p_psVectorBinDisect(): A wrapper to the above p_psVectorBinDisect().
+ *****************************************************************************/
+psS32 p_psVectorBinDisect(psVector *bins,
+                          psScalar *x)
+{
+    PS_VECTOR_CHECK_NULL(bins, -4);
+    PS_VECTOR_CHECK_EMPTY(bins, -4);
+    PS_PTR_CHECK_NULL(x, -6);
+    PS_PTR_CHECK_TYPE_EQUAL(x, bins, -3);
+    psS8* strType;
+
+    switch (x->type.type) {
+    case PS_TYPE_U8:
+        return(vectorBinDisectU8(bins->data.U8, bins->n, x->data.U8));
+    case PS_TYPE_U16:
+        return(vectorBinDisectU16(bins->data.U16, bins->n, x->data.U16));
+    case PS_TYPE_U32:
+        return(vectorBinDisectU32(bins->data.U32, bins->n, x->data.U32));
+    case PS_TYPE_U64:
+        return(vectorBinDisectU64(bins->data.U64, bins->n, x->data.U64));
+    case PS_TYPE_S8:
+        return(vectorBinDisectS8(bins->data.S8, bins->n, x->data.S8));
+    case PS_TYPE_S16:
+        return(vectorBinDisectS16(bins->data.S16, bins->n, x->data.S16));
+    case PS_TYPE_S32:
+        return(vectorBinDisectS32(bins->data.S32, bins->n, x->data.S32));
+    case PS_TYPE_S64:
+        return(vectorBinDisectS64(bins->data.S64, bins->n, x->data.S64));
+    case PS_TYPE_F32:
+        return(vectorBinDisectF32(bins->data.F32, bins->n, x->data.F32));
+    case PS_TYPE_F64:
+        return(vectorBinDisectF64(bins->data.F64, bins->n, x->data.F64));
+    case PS_TYPE_C32:
+        PS_TYPE_NAME(strType,x->type.type);
+        psError(PS_ERR_BAD_PARAMETER_TYPE,
+                PS_ERRORTEXT_psFunctions_TYPE_NOT_SUPPORTED,
+                strType);
+        return 0;
+    case PS_TYPE_C64:
+        PS_TYPE_NAME(strType,x->type.type);
+        psError(PS_ERR_BAD_PARAMETER_TYPE,
+                PS_ERRORTEXT_psFunctions_TYPE_NOT_SUPPORTED,
+                strType);
+        return 0;
+    case PS_TYPE_BOOL:
+        PS_TYPE_NAME(strType,x->type.type);
+        psError(PS_ERR_BAD_PARAMETER_TYPE,
+                PS_ERRORTEXT_psFunctions_TYPE_NOT_SUPPORTED,
+                strType);
+        return 0;
+    }
+    return(-3);
+}
+
+/*****************************************************************************
+p_psVectorInterpolate(): This routine will take as input psVectors domain and
+range, and the x value, assumed to lie with the domain vector.  It produces
+as output the LaGrange interpolated value of a polynomial of the specified
+order around the point x.
+ 
+XXX: This stuff does not currently work with a mask.
+ 
+XXX: add another psScalar argument for the result.
+ 
+XXX: The VectorCopy routines seg fault when I declare range32 as static.
+ *****************************************************************************/
+psScalar *p_psVectorInterpolate(psVector *domain,
+                                psVector *range,
+                                psS32 order,
+                                psScalar *x)
+{
+    PS_VECTOR_CHECK_NULL(domain, NULL);
+    PS_VECTOR_CHECK_NULL(range, NULL);
+    PS_PTR_CHECK_NULL(x, NULL);
+    PS_INT_CHECK_NON_NEGATIVE(order, NULL);
+    PS_VECTOR_CHECK_SIZE_EQUAL(domain, range, NULL);
+    PS_PTR_CHECK_TYPE_EQUAL(domain, range, NULL);
+    PS_PTR_CHECK_TYPE_EQUAL(domain, x, NULL);
+
+    psVector *range32 = NULL;
+    psVector *domain32 = NULL;
+    psTrace(".psLib.dataManip.psFunctions.p_psVectorInterpolate", 4,
+            "---- p_psVectorInterpolate() begin ----\n");
+
+    if (order > (domain->n - 1)) {
+        psError(PS_ERR_BAD_PARAMETER_SIZE, true,
+                PS_ERRORTEXT_psFunctions_NOT_ENOUGH_DATAPOINTS,
+                order);
+        return(NULL);
+    }
+
+    if (x->type.type == PS_TYPE_F32) {
+        psTrace(".psLib.dataManip.psFunctions.p_psVectorInterpolate", 4,
+                "---- p_psVectorInterpolate() end ----\n");
+        return(psScalarAlloc(interpolate1DF32(domain->data.F32,
+                                              range->data.F32,
+                                              domain->n,
+                                              order,
+                                              x->data.F32), PS_TYPE_F32));
+    } else if (x->type.type == PS_TYPE_F64) {
+        // XXX: use recycled vectors here.
+        range32 = psVectorCopy(range32, range, PS_TYPE_F32);
+        domain32 = psVectorCopy(domain32, domain, PS_TYPE_F32);
+
+        psScalar *tmpScalar = psScalarAlloc((psF64)
+                                            interpolate1DF32(domain32->data.F32,
+                                                             range32->data.F32,
+                                                             domain32->n,
+                                                             order,
+                                                             (psF32) x->data.F64), PS_TYPE_F64);
+        psFree(range32);
+        psFree(domain32);
+
+        psTrace(".psLib.dataManip.psFunctions.p_psVectorInterpolate", 4,
+                "---- p_psVectorInterpolate() end ----\n");
+        // XXX: Convert data type to F64?
+        return(tmpScalar);
+
+    } else {
+        psS8* strType;
+        PS_TYPE_NAME(strType,x->type.type);
+        psError(PS_ERR_BAD_PARAMETER_TYPE,
+                PS_ERRORTEXT_psFunctions_TYPE_NOT_SUPPORTED,
+                strType);
+    }
+
+    psTrace(".psLib.dataManip.psFunctions.p_psVectorInterpolate", 4,
+            "return(NULL)\n");
+    psTrace(".psLib.dataManip.psFunctions.p_psVectorInterpolate", 4,
+            "---- p_psVectorInterpolate() end ----\n");
+
+    return(NULL);
+}
+
+
+/*****************************************************************************
+psSpline1DEval(): this routine takes an existing spline of arbitrary order
+and an independent x value.  Each determines which spline that x corresponds
+to by doing a bracket disection on the knots of the spline data structure
+(vectorBinDisectF32()).  Then it evaluates the spline at that x location
+by a call to the 1D polynomial functions.
+ 
+XXX: The spline eval functions require input and output to be F32.  however
+     the spline fit functions require F32 and F64.
+ 
+XXX: This only works if spline0>knots if psF32.  Must add support for psU32 and
+psF64.
+ *****************************************************************************/
+psF32 psSpline1DEval(
+    const psSpline1D *spline,
+    psF32 x
+)
+{
+    PS_PTR_CHECK_NULL(spline, NAN);
+    PS_INT_CHECK_NON_NEGATIVE(spline->n, NAN);
+    PS_VECTOR_CHECK_TYPE(spline->knots, PS_TYPE_F32, NAN);
+
+    psS32 binNum;
+    psS32 n;
+
+    n = spline->n;
+    //XXX    binNum = vectorBinDisectF32(spline->domains, (spline->n)+1, x);
+    binNum = vectorBinDisectF32(spline->knots->data.F32, (spline->n)+1, x);
+    if (binNum < 0) {
+        psLogMsg(__func__, PS_LOG_WARN,
+                 "psSpline1DEval(): x ordinate (%f) is outside the spline range (%f - %f).",
+                 x, spline->knots->data.F32[0],
+                 spline->knots->data.F32[n-1]);
+
+        if (x < spline->knots->data.F32[0]) {
+            return(psPolynomial1DEval(spline->spline[0],
+                                      x));
+        } else if (x > spline->knots->data.F32[n-1]) {
+            return(psPolynomial1DEval(spline->spline[n-1],
+                                      x));
+        }
+    }
+
+    return(psPolynomial1DEval(spline->spline[binNum],
+                              x));
+}
+
+// XXX: The spline eval functions require input and output to be F32.
+// however the spline fit functions require F32 and F64.
+psVector *psSpline1DEvalVector(
+    const psSpline1D *spline,
+    const psVector *x
+)
+{
+    PS_PTR_CHECK_NULL(spline, NULL);
+    PS_VECTOR_CHECK_NULL(x, NULL);
+    PS_VECTOR_CHECK_TYPE_F32_OR_F64(x, NULL);
+    PS_VECTOR_CHECK_TYPE(spline->knots, PS_TYPE_F32, NULL);
+
+    psS32 i;
+    psVector *tmpVector;
+
+    tmpVector = psVectorAlloc(x->n, PS_TYPE_F32);
+    if (x->type.type == PS_TYPE_F32) {
+        for (i=0;i<x->n;i++) {
+            tmpVector->data.F32[i] = psSpline1DEval(
+                                         spline,
+                                         x->data.F32[i]
+                                     );
+        }
+    } else if (x->type.type == PS_TYPE_F64) {
+        for (i=0;i<x->n;i++) {
+            tmpVector->data.F32[i] = psSpline1DEval(
+                                         spline,
+                                         (psF32) x->data.F64[i]
+                                     );
+        }
+    } else {
+        psS8* strType;
+        PS_TYPE_NAME(strType,x->type.type);
+        psError(PS_ERR_BAD_PARAMETER_TYPE,
+                PS_ERRORTEXT_psFunctions_TYPE_NOT_SUPPORTED,
+                strType);
+        return(NULL);
+    }
+
+    return(tmpVector);
+}
Index: /tags/ipp-1-X/bug123/psLib/src/dataManip/psFunctions.h
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/dataManip/psFunctions.h	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/dataManip/psFunctions.h	(revision 22331)
@@ -0,0 +1,440 @@
+/** @file psFunctions.h
+ *  @brief Standard Mathematical Functions.
+ *  @ingroup Stats
+ *
+ *  This file will hold the prototypes for procedures which allocate, free,
+ *  and evaluate various polynomials.  Those polynomial structures are also
+ *  defined here.
+ *
+ *  @ingroup Stats
+ *
+ *  @author Someone at IfA
+ *  @author GLG, MHPCC
+ *
+ *  @version $Revision: 1.44 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-03-31 23:01:46 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+
+#if !defined(PS_FUNCTIONS_H)
+#define PS_FUNCTIONS_H
+
+#include <stdio.h>
+#include <stdbool.h>
+#include <float.h>
+#include <math.h>
+
+#include "psVector.h"
+#include "psScalar.h"
+
+/** \addtogroup Stats
+ *  \{
+ */
+
+/** Evaluate a non-normalized Gaussian with the given mean and sigma at the
+ *  given coordianate.  
+ *
+ *  Note that this is not a Gaussian deviate.  The evaluated Gaussian is: 
+ *        \f[ exp(-\frac{(x-mean)^2}{2\sigma^2}) \f] 
+ *
+ *  @return psF32      value on the gaussian curve given the input parameters
+ */
+psF32 psGaussian(
+    psF32 x,                           ///< Value at which to evaluate
+    psF32 mean,                        ///< Mean for the Gaussian
+    psF32 stddev,                      ///< Standard deviation for the Gaussian
+    psBool normal                        ///< Indicates whether result should be normalized
+);
+
+/** Produce a vector of random numbers from a Gaussian distribution with
+ *  the specified mean and sigma 
+ *  
+ *  @return psVector*    vector of random numbers
+ *  
+ */
+psVector* p_psGaussianDev(
+    psF32 mean,                        ///< The mean of the Gaussian
+    psF32 sigma,                       ///< The sigma of the Gaussian
+    psS32 Npts                           ///< The size of the vector
+);
+
+typedef enum {
+    PS_POLYNOMIAL_ORD,                 ///< Ordinary Polynomial
+    PS_POLYNOMIAL_CHEB                 ///< Chebyshev Polynomial
+} psPolynomialType;
+
+/** One-dimensional polynomial */
+typedef struct
+{
+    psPolynomialType type;             ///< Polynomial type
+    psS32 n;                             ///< Number of terms
+    psF32 *coeff;                      ///< Coefficients
+    psF32 *coeffErr;                   ///< Error in coefficients
+    psU8 *mask;                        ///< Coefficient mask
+}
+psPolynomial1D;
+
+/** Two-dimensional polynomial */
+typedef struct
+{
+    psPolynomialType type;             ///< Polynomial type
+    psS32 nX;                            ///< Number of terms in x
+    psS32 nY;                            ///< Number of terms in y
+    psF32 **coeff;                     ///< Coefficients
+    psF32 **coeffErr;                  ///< Error in coefficients
+    psU8 **mask;                       ///< Coefficients mask
+}
+psPolynomial2D;
+
+/** Three-dimensional polynomial */
+typedef struct
+{
+    psPolynomialType type;             ///< Polynomial type
+    psS32 nX;                            ///< Number of terms in x
+    psS32 nY;                            ///< Number of terms in y
+    psS32 nZ;                            ///< Number of terms in z
+    psF32 ***coeff;                    ///< Coefficients
+    psF32 ***coeffErr;                 ///< Error in coefficients
+    psU8 ***mask;                      ///< Coefficients mask
+}
+psPolynomial3D;
+
+/** Four-dimensional polynomial */
+typedef struct
+{
+    psPolynomialType type;             ///< Polynomial type
+    psS32 nW;                            ///< Number of terms in w
+    psS32 nX;                            ///< Number of terms in x
+    psS32 nY;                            ///< Number of terms in y
+    psS32 nZ;                            ///< Number of terms in z
+    psF32 ****coeff;                   ///< Coefficients
+    psF32 ****coeffErr;                ///< Error in coefficients
+    psU8 ****mask;                     ///< Coefficients mask
+}
+psPolynomial4D;
+
+
+/** Allocates a psPolynomial1D structure with n terms
+ *
+ *  @return  psPolynomial1D*    new 1-D polynomial struct
+ */
+psPolynomial1D* psPolynomial1DAlloc(
+    psS32 n,                              ///< Number of terms
+    psPolynomialType type               ///< Polynomial Type
+);
+
+/** Allocates a 2-D polynomial structure
+ *
+ *  @return  psPolynomial2D*    new 2-D polynomial struct
+ */
+psPolynomial2D* psPolynomial2DAlloc(
+    psS32 nX,                            ///< Number of terms in x
+    psS32 nY,                            ///< Number of terms in y
+    psPolynomialType type              ///< Polynomial Type
+);
+
+/** Allocates a 3-D polynomial structure
+ *
+ *  @return  psPolynomial3D*    new 3-D polynomial struct
+ */
+psPolynomial3D* psPolynomial3DAlloc(
+    psS32 nX,                            ///< Number of terms in x
+    psS32 nY,                            ///< Number of terms in y
+    psS32 nZ,                            ///< Number of terms in z
+    psPolynomialType type              ///< Polynomial Type
+);
+
+/** Allocates a 4-D polynomial structure
+ *
+ *  @return  psPolynomial4D*    new 4-D polynomial struct
+ */
+psPolynomial4D* psPolynomial4DAlloc(
+    psS32 nW,                            ///< Number of terms in w
+    psS32 nX,                            ///< Number of terms in x
+    psS32 nY,                            ///< Number of terms in y
+    psS32 nZ,                            ///< Number of terms in z
+    psPolynomialType type              ///< Polynomial Type
+);
+
+/** Evaluates a 1-D polynomial at specific coordinates.
+ *
+ *  @return psF32    result of polynomial at given location
+ */
+psF32 psPolynomial1DEval(
+    const psPolynomial1D* myPoly,       ///< Coefficients for the polynomial
+    psF32 x                           ///< location at which to evaluate
+);
+
+/** Evaluates a 2-D polynomial at specific coordinates.
+ *
+ *  @return psF32    result of polynomial at given location
+ */
+psF32 psPolynomial2DEval(
+    const psPolynomial2D* myPoly,       ///< Coefficients for the polynomial
+    psF32 x,                           ///< x location at which to evaluate
+    psF32 y                           ///< y location at which to evaluate
+);
+
+/** Evaluates a 3-D polynomial at specific coordinates.
+ *
+ *  @return psF32    result of polynomial at given location
+ */
+psF32 psPolynomial3DEval(
+    const psPolynomial3D* myPoly,       ///< Coefficients for the polynomial
+    psF32 x,                           ///< x location at which to evaluate
+    psF32 y,                           ///< y location at which to evaluate
+    psF32 z                           ///< z location at which to evaluate
+);
+
+/** Evaluates a 4-D polynomial at specific coordinates.
+ *
+ *  @return psF32    result of polynomial at given location
+ */
+psF32 psPolynomial4DEval(
+    const psPolynomial4D* myPoly,       ///< Coefficients for the polynomial
+    psF32 w,                           ///< w location at which to evaluate
+    psF32 x,                           ///< x location at which to evaluate
+    psF32 y,                           ///< y location at which to evaluate
+    psF32 z                           ///< z location at which to evaluate
+);
+
+psVector *psPolynomial1DEvalVector(
+    const psPolynomial1D *myPoly,   ///< Coefficients for the polynomial
+    const psVector *x             ///< x locations at which to evaluate
+);
+
+psVector *psPolynomial2DEvalVector(
+    const psPolynomial2D *myPoly,   ///< Coefficients for the polynomial
+    const psVector *x,             ///< x locations at which to evaluate
+    const psVector *y             ///< y locations at which to evaluate
+);
+
+psVector *psPolynomial3DEvalVector(
+    const psPolynomial3D *myPoly,   ///< Coefficients for the polynomial
+    const psVector *x,             ///< x locations at which to evaluate
+    const psVector *y,             ///< y locations at which to evaluate
+    const psVector *z             ///< z locations at which to evaluate
+);
+
+psVector *psPolynomial4DEvalVector(
+    const psPolynomial4D *myPoly,   ///< Coefficients for the polynomial
+    const psVector *w,             ///< w locations at which to evaluate
+    const psVector *x,             ///< x locations at which to evaluate
+    const psVector *y,             ///< y locations at which to evaluate
+    const psVector *z             ///< z locations at which to evaluate
+);
+
+/*****************************************************************************/
+
+/* Double-precision polynomials, mainly for use in astrometry */
+
+/** Double-precision one-dimensional polynomial */
+typedef struct
+{
+    psPolynomialType type;             ///< Polynomial type
+    psS32 n;                             ///< Number of terms
+    psF64 *coeff;                     ///< Coefficients
+    psF64 *coeffErr;                  ///< Error in coefficients
+    psU8 *mask;                        ///< Coefficient mask
+}
+psDPolynomial1D;
+
+/** Double-precision two-dimensional polynomial */
+typedef struct
+{
+    psPolynomialType type;             ///< Polynomial type
+    psS32 nX;                            ///< Number of terms in x
+    psS32 nY;                            ///< Number of terms in y
+    psF64 **coeff;                    ///< Coefficients
+    psF64 **coeffErr;                 ///< Error in coefficients
+    psU8 **mask;                       ///< Coefficients mask
+}
+psDPolynomial2D;
+
+/** Double-precision three-dimensional polynomial */
+typedef struct
+{
+    psPolynomialType type;             ///< Polynomial type
+    psS32 nX;                            ///< Number of terms in x
+    psS32 nY;                            ///< Number of terms in y
+    psS32 nZ;                            ///< Number of terms in z
+    psF64 ***coeff;                   ///< Coefficients
+    psF64 ***coeffErr;                ///< Error in coefficients
+    psU8 ***mask;                      ///< Coefficient mask
+}
+psDPolynomial3D;
+
+/** Double-precision four-dimensional polynomial */
+typedef struct
+{
+    psPolynomialType type;             ///< Polynomial type
+    psS32 nW;                            ///< Number of terms in w
+    psS32 nX;                            ///< Number of terms in x
+    psS32 nY;                            ///< Number of terms in y
+    psS32 nZ;                            ///< Number of terms in z
+    psF64 ****coeff;                  ///< Coefficients
+    psF64 ****coeffErr;               ///< Error in coefficients
+    psU8 ****mask;                     ///< Coefficients mask
+}
+psDPolynomial4D;
+
+/** Allocates a double-precision 1-D polynomial structure with n terms
+ *
+ *  @return  psPolynomial1D*    new double-precision 1-D polynomial struct
+ */
+psDPolynomial1D* psDPolynomial1DAlloc(
+    psS32 n,                             ///< Number of terms
+    psPolynomialType type              ///< Polynomial Type
+);
+
+/** Allocates a double-precision 2-D polynomial structure
+ *
+ *  @return  psPolynomial2D*    new double-precision 2-D polynomial struct
+ */
+psDPolynomial2D* psDPolynomial2DAlloc(
+    psS32 nX,                            ///< Number of terms in x
+    psS32 nY,                            ///< Number of terms in y
+    psPolynomialType type              ///< Polynomial Type
+);
+
+/** Allocates a double-precision 3-D polynomial structure
+ *
+ *  @return  psPolynomial3D*    new double-precision 3-D polynomial struct
+ */
+psDPolynomial3D* psDPolynomial3DAlloc(
+    psS32 nX,                            ///< Number of terms in x
+    psS32 nY,                            ///< Number of terms in y
+    psS32 nZ,                            ///< Number of terms in z
+    psPolynomialType type              ///< Polynomial Type
+);
+
+/** Allocates a double-precision 4-D polynomial structure
+ *
+ *  @return  psPolynomial4D*    new double-precision 4-D polynomial struct
+ */
+psDPolynomial4D* psDPolynomial4DAlloc(
+    psS32 nW,                            ///< Number of terms in w
+    psS32 nX,                            ///< Number of terms in x
+    psS32 nY,                            ///< Number of terms in y
+    psS32 nZ,                            ///< Number of terms in z
+    psPolynomialType type              ///< Polynomial Type
+);
+
+/** Evaluates a double-precision 1-D polynomial at specific coordinates.
+ *
+ *  @return psF32    result of polynomial at given location
+ */
+psF64 psDPolynomial1DEval(
+    const psDPolynomial1D* myPoly,      ///< Coefficients for the polynomial
+    psF64 x                          ///< Value at which to evaluate
+);
+
+/** Evaluates a double-precision 2-D polynomial at specific coordinates.
+ *
+ *  @return psF32    result of polynomial at given location
+ */
+psF64 psDPolynomial2DEval(
+    const psDPolynomial2D* myPoly,       ///< Coefficients for the polynomial
+    psF64 x,                           ///< Value x at which to evaluate
+    psF64 y            ///< Value y at which to evaluate
+);
+
+/** Evaluates a double-precision 3-D polynomial at specific coordinates.
+ *
+ *  @return psF32    result of polynomial at given location
+ */
+psF64 psDPolynomial3DEval(
+    const psDPolynomial3D* myPoly,      ///< Coefficients for the polynomial
+    psF64 x,                          ///< Value x at which to evaluate
+    psF64 y,                          ///< Value y at which to evaluate
+    psF64 z     ///< Value z at which to evaluate
+);
+
+/** Evaluates a double-precision 4-D polynomial at specific coordinates.
+ *
+ *  @return psF32    result of polynomial at given location
+ */
+psF64 psDPolynomial4DEval(
+    const psDPolynomial4D* myPoly,      ///< Coefficients for the polynomial
+    psF64 w,                          ///< Value w at which to evaluate
+    psF64 x,                          ///< Value x at which to evaluate
+    psF64 y,                          ///< Value y at which to evaluate
+    psF64 z     ///< Value z at which to evaluate
+);
+
+psVector *psDPolynomial1DEvalVector(
+    const psDPolynomial1D *myPoly, ///< Coefficients for the polynomial
+    const psVector *x             ///< x locations at which to evaluate
+);
+
+psVector *psDPolynomial2DEvalVector(
+    const psDPolynomial2D *myPoly,  ///< Coefficients for the polynomial
+    const psVector *x,             ///< x locations at which to evaluate
+    const psVector *y             ///< y locations at which to evaluate
+);
+
+psVector *psDPolynomial3DEvalVector(
+    const psDPolynomial3D *myPoly,  ///< Coefficients for the polynomial
+    const psVector *x,             ///< x locations at which to evaluate
+    const psVector *y,             ///< y locations at which to evaluate
+    const psVector *z             ///< z locations at which to evaluate
+);
+
+psVector *psDPolynomial4DEvalVector(
+    const psDPolynomial4D *myPoly,  ///< Coefficients for the polynomial
+    const psVector *w,             ///< w locations at which to evaluate
+    const psVector *x,             ///< x locations at which to evaluate
+    const psVector *y,             ///< y locations at which to evaluate
+    const psVector *z             ///< z locations at which to evaluate
+);
+
+
+
+typedef struct
+{
+    psS32 n;                       ///< The number of spline polynomials
+    psPolynomial1D **spline;       ///< An array of n pointers to the spline polynomials
+    psF32 *p_psDeriv2;             ///< For cubic splines, the second derivative at each domain point.  Size is n+1.
+    psF32 *domains;                ///< The boundaries between each spline piece.  Size is n+1.
+    psVector *knots;               ///< The boundaries between each spline piece.  Size is n+1.
+}
+psSpline1D;
+
+psSpline1D *psSpline1DAlloc(psS32 n,
+                            psS32 order,
+                            psF32 min,
+                            psF32 max);
+
+psSpline1D *psSpline1DAllocGeneric(const psVector *bounds,
+                                   psS32 order);
+
+psF32 psSpline1DEval(
+    const psSpline1D *spline,
+    psF32 x
+);
+
+psVector *psSpline1DEvalVector(
+    const psSpline1D *spline,
+    const psVector *x
+);
+
+psS32 p_psVectorBinDisect(psVector *bins,
+                          psScalar *x);
+
+psScalar *p_psVectorInterpolate(psVector *domain,
+                                psVector *range,
+                                psS32 order,
+                                psScalar *x);
+
+#if 0
+psF32 p_psNRSpline1DEval(psSpline1D *spline,
+                         const psVector* x,
+                         const psVector* y,
+                         psF32 X);
+#endif
+
+/* \} */// End of MathGroup Functions
+
+#endif
+
Index: /tags/ipp-1-X/bug123/psLib/src/dataManip/psMatrix.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/dataManip/psMatrix.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/dataManip/psMatrix.c	(revision 22331)
@@ -0,0 +1,642 @@
+/** @file  psMatrix.c
+ *
+ *  @brief Provides functions for linear algebra operations on psImages and psVectors.
+ *
+ *  Functions are provided to:
+ *      Transpose a psImage
+ *      Compute LUD
+ *      Solve LUD
+ *      Matrix inversion
+ *      Calculate determinant
+ *      Matrix addition
+ *      Matrix subtraction
+ *      Matrix multiplication
+ *      Calculate Eigenvectors
+ *      Convert matrix to vector
+ *      Convert vector to matrix
+ *
+ *  These functions treat psImages as if they were matrices, therefore there is no psMatrix.
+ *
+ *  @author Ross Harman, MHPCC
+ *  @author Robert DeSonia, MHPCC
+ *
+ *  @version $Revision: 1.27 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-03-22 21:52:49 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+
+/******************************************************************************/
+/*  INCLUDE FILES                                                             */
+/******************************************************************************/
+#include <string.h>
+#include <gsl/gsl_matrix.h>
+#include <gsl/gsl_linalg.h>
+#include <gsl/gsl_permutation.h>
+#include <gsl/gsl_eigen.h>
+
+#include "psMemory.h"
+#include "psError.h"
+#include "psImage.h"
+#include "psVector.h"
+#include "psMatrix.h"
+#include "psConstants.h"
+#include "psDataManipErrors.h"
+
+
+/*****************************************************************************/
+/* DEFINE STATEMENTS                                                         */
+/*****************************************************************************/
+
+/** Preprocessor macro to generate error for image dimensionality not set to PS_DIMEN_IMAGE */
+#define PS_CHECK_DIMEN_AND_TYPE(NAME, PS_DIMEN, CLEANUP)                                             \
+if (NAME->type.dimen != PS_DIMEN) {                                                                 \
+    psError(PS_ERR_BAD_PARAMETER_TYPE, true,                                                        \
+            "Invalid operation. %s has incorrect dimensionality %d.", #NAME, PS_DIMEN);             \
+    CLEANUP;                                                                                  \
+} else if(NAME->type.type!=PS_TYPE_F64 && NAME->type.type!=PS_TYPE_F32) {                           \
+    psError(PS_ERR_BAD_PARAMETER_TYPE, true,                                                        \
+            "Invalid operation. %s not PS_TYPE_F64.", #NAME);                                       \
+    CLEANUP;                                                                                  \
+}
+
+/** Preprocessor macro to check that input is not equal to output */
+#define PS_CHECK_POINTERS(NAME1, NAME2, CLEANUP)                                                     \
+if (NAME1 == NAME2) {                                                                               \
+    psError(PS_ERR_BAD_PARAMETER_VALUE, true,                                                       \
+            "Invalid operation: Pointer to %s is same as %s.", #NAME1, #NAME2);                     \
+    CLEANUP;                                                                                  \
+}
+
+/** Preprocessor macro to check that an image is square */
+#define PS_CHECK_SQUARE(NAME, CLEANUP)                                                               \
+if (NAME->numCols != NAME->numRows) {                                                               \
+    psError(PS_ERR_BAD_PARAMETER_SIZE, true, "Invalid operation: %s not square array.", #NAME);     \
+    CLEANUP;                                                                                  \
+}
+
+/** Preprocessor macro to initalize a GSL matrix. */
+#define PS_GSL_MATRIX_INITIALIZE(LHS_NAME, RHS_NAME)                                                \
+LHS_NAME.size1 = numRows;                                                                           \
+LHS_NAME.size2 = numCols;                                                                           \
+LHS_NAME.tda   = numCols;                                                                           \
+LHS_NAME.data  = RHS_NAME;
+
+
+/*****************************************************************************/
+/* FILE STATIC FUNCTIONS                                                     */
+/*****************************************************************************/
+
+static void  psVectorToGslVector(gsl_vector *outGslVector, const psVector *inVector);
+static void gslVectorToPsVector(psVector *outVector, gsl_vector *inGslVector);
+static void  psImageToGslMatrix(gsl_matrix *outGslMatrix, const psImage *inImage);
+static void gslMatrixToPsImage(psImage *outImage, gsl_matrix *inGslMatrix);
+
+/** Static function to copy psF32 or psF64 vector data to a GSL vector */
+static void  psVectorToGslVector(gsl_vector *outGslVector, const psVector *inVector)
+{
+    psU32 i = 0;
+    psU32 n = 0;
+
+
+    n = inVector->n;
+    for(i=0; i<n; i++) {
+        if(inVector->type.type == PS_TYPE_F32) {
+            outGslVector->data[i] = (psF64)inVector->data.F32[i];
+        } else {
+            outGslVector->data[i] = inVector->data.F64[i];
+        }
+    }
+}
+
+/** Static function to copy GSL vector data to a psF32 or psF64 vector */
+static void gslVectorToPsVector(psVector *outVector, gsl_vector *inGslVector)
+{
+    psU32 i = 0;
+    psU32 n = 0;
+
+
+    n = outVector->n;
+    for(i=0; i<n; i++) {
+        if(outVector->type.type == PS_TYPE_F32) {
+            outVector->data.F32[i] = (psF32)inGslVector->data[i];
+        } else {
+            outVector->data.F64[i] = inGslVector->data[i];
+        }
+    }
+}
+
+/** Static function to copy psF32 or psF64 image data to a GSL matrix */
+static void  psImageToGslMatrix(gsl_matrix *outGslMatrix, const psImage *inImage)
+{
+    psU32 i = 0;
+    psU32 j = 0;
+    psU32 numRows = 0;
+    psU32 numCols = 0;
+
+
+    numRows = inImage->numRows;
+    numCols = inImage->numCols;
+    for(i=0; i<numRows; i++) {
+        for(j=0; j<numCols; j++) {
+            if(inImage->type.type == PS_TYPE_F32) {
+                outGslMatrix->data[i*numCols+j] = (psF64)inImage->data.F32[i][j];
+            } else {
+                outGslMatrix->data[i*numCols+j] = inImage->data.F64[i][j];
+            }
+        }
+    }
+}
+
+/** Static function to copy GSL matrix data to a psF32 or psF64 image */
+static void gslMatrixToPsImage(psImage *outImage, gsl_matrix *inGslMatrix)
+{
+    psU32 i = 0;
+    psU32 j = 0;
+    psU32 numRows = 0;
+    psU32 numCols = 0;
+
+
+    numRows = outImage->numRows;
+    numCols = outImage->numCols;
+    for(i=0; i<numRows; i++) {
+        for(j=0; j<numCols; j++) {
+            if(outImage->type.type == PS_TYPE_F32) {
+                outImage->data.F32[i][j] = (psF32)inGslMatrix->data[i*numCols+j];
+            } else {
+                outImage->data.F64[i][j] = inGslMatrix->data[i*numCols+j];
+            }
+        }
+    }
+}
+
+
+/*****************************************************************************/
+/* FUNCTION IMPLEMENTATION - PUBLIC                                          */
+/*****************************************************************************/
+
+psImage* psMatrixLUD(psImage* outImage, psVector** outPerm, psImage* inImage)
+{
+    psS32 signum = 0;
+    psS32 numRows = 0;
+    psS32 numCols = 0;
+    gsl_matrix *lu = NULL;
+    gsl_permutation perm;
+
+
+    #define psMatrixLUD_EXIT {psFree(outImage); return NULL;}
+
+    // Error checks
+    PS_IMAGE_CHECK_NULL_GENERAL(inImage, psMatrixLUD_EXIT);
+    PS_CHECK_POINTERS(inImage, outImage, psMatrixLUD_EXIT);
+    PS_CHECK_DIMEN_AND_TYPE(inImage, PS_DIMEN_IMAGE, psMatrixLUD_EXIT);
+    PS_PTR_CHECK_NULL_GENERAL(outPerm, psMatrixLUD_EXIT);
+
+    outImage = psImageRecycle(outImage, inImage->numCols, inImage->numRows, inImage->type.type);
+
+    PS_CHECK_SQUARE(inImage, psMatrixLUD_EXIT);
+    PS_CHECK_SQUARE(outImage, psMatrixLUD_EXIT);
+
+    // Initialize data
+    numRows = inImage->numRows;
+    numCols = inImage->numCols;
+
+    // Initialize GSL data
+    perm.size = numCols;
+    if (sizeof(size_t) == 4) {
+        *outPerm = psVectorRecycle(*outPerm, numCols, PS_TYPE_S32);
+    } else if (sizeof(size_t) == 8) {
+        *outPerm = psVectorRecycle(*outPerm, numCols, PS_TYPE_S64);
+    } else {
+        psError(PS_ERR_UNKNOWN, true,
+                "Failed to allocate the permutation vector; "
+                "could not determine the cooresponding data type.");
+        psMatrixLUD_EXIT;
+    }
+
+    (*outPerm)->n = numCols;
+    perm.data = (psPtr)((*outPerm)->data.U8);
+    lu = gsl_matrix_alloc(numRows, numCols);
+
+    // Copy psImage data into GSL matrix data
+    psImageToGslMatrix(lu, inImage);
+
+    // Calculate LU decomposition
+    gsl_linalg_LU_decomp(lu, &perm, &signum);
+
+    // Copy GSL matrix data to psImage data
+    gslMatrixToPsImage(outImage, lu);
+
+    // Free GSL data
+    gsl_matrix_free(lu);
+
+    return outImage;
+}
+
+psVector* psMatrixLUSolve(psVector* outVector, const psImage* inImage, const psVector* inVector,
+                          const psVector* inPerm)
+{
+    psS32 numRows = 0;
+    psS32 numCols = 0;
+    gsl_matrix *lu;
+    gsl_permutation perm;
+    gsl_vector *b = NULL;
+    gsl_vector *x = NULL;
+
+    #define LUSOLVE_CLEANUP {psFree(outVector); return NULL;}
+
+    // Error checks
+    PS_IMAGE_CHECK_NULL_GENERAL(inImage, LUSOLVE_CLEANUP);
+    PS_CHECK_DIMEN_AND_TYPE(inImage, PS_DIMEN_IMAGE, LUSOLVE_CLEANUP);
+    PS_IMAGE_CHECK_EMPTY_GENERAL(inImage, LUSOLVE_CLEANUP);
+    PS_VECTOR_CHECK_NULL_GENERAL(inVector, LUSOLVE_CLEANUP);
+    PS_CHECK_DIMEN_AND_TYPE(inVector, PS_DIMEN_VECTOR, LUSOLVE_CLEANUP);
+    PS_VECTOR_CHECK_NULL_GENERAL(inPerm, LUSOLVE_CLEANUP);
+
+    outVector = psVectorRecycle(outVector, inImage->numRows, inImage->type.type);
+
+    PS_CHECK_POINTERS(outVector, inVector, LUSOLVE_CLEANUP);
+    PS_CHECK_POINTERS(inVector, inPerm, LUSOLVE_CLEANUP);
+    PS_CHECK_POINTERS(outVector, inPerm, LUSOLVE_CLEANUP);
+
+    // Initialize data
+    numRows = inImage->numRows;
+    numCols = inImage->numCols;
+
+    // Initialize GSL data
+    lu = gsl_matrix_alloc(numRows, numCols);
+    psImageToGslMatrix(lu, inImage);
+    b = gsl_vector_alloc(inVector->n);
+    psVectorToGslVector(b, inVector);
+    x = gsl_vector_alloc(inVector->n);
+
+    outVector->n = numCols;
+    perm.size = inPerm->n;
+    perm.data = (psPtr)(inPerm->data.U8);
+
+    // Solve for {x} in equation: {b} = [A]{x}
+    gsl_linalg_LU_solve(lu, &perm, b, x);
+
+    // Copy GSL vector data to psVector data
+    gslVectorToPsVector(outVector, x);
+
+    // Free GSL data
+    gsl_vector_free(b);
+    gsl_vector_free(x);
+    gsl_matrix_free(lu);
+
+    return outVector;
+}
+
+psImage* psMatrixInvert(psImage* outImage, const psImage* inImage, psF32 *det)
+{
+    psS32 signum = 0;
+    psS32 numRows = 0;
+    psS32 numCols = 0;
+    gsl_matrix *inv = NULL;
+    gsl_matrix *lu = NULL;
+    gsl_permutation *perm = NULL;
+
+    #define INVERT_CLEANUP { psFree(outImage); return NULL; }
+    // Error checks
+    PS_PTR_CHECK_NULL_GENERAL(det, INVERT_CLEANUP);
+    PS_IMAGE_CHECK_NULL_GENERAL(inImage, INVERT_CLEANUP);
+    PS_CHECK_POINTERS(inImage, outImage, INVERT_CLEANUP);
+    PS_CHECK_DIMEN_AND_TYPE(inImage, PS_DIMEN_IMAGE, INVERT_CLEANUP);
+    PS_IMAGE_CHECK_EMPTY_GENERAL(inImage, INVERT_CLEANUP);
+
+    outImage = psImageRecycle(outImage, inImage->numCols, inImage->numRows, inImage->type.type);
+
+    PS_CHECK_SQUARE(inImage, INVERT_CLEANUP);
+    PS_CHECK_SQUARE(outImage, INVERT_CLEANUP);
+
+    // Initialize data
+    numRows = inImage->numRows;
+    numCols = inImage->numCols;
+
+    // Initialize GSL data
+    perm = gsl_permutation_alloc(numRows);
+    lu = gsl_matrix_alloc(numRows, numCols);
+    inv = gsl_matrix_alloc(numRows, numCols);
+    psImageToGslMatrix(lu, inImage);
+
+    // Invert data and calculate determinant
+    gsl_linalg_LU_decomp(lu, perm, &signum);
+    gsl_linalg_LU_invert(lu, perm, inv);
+    *det = (float)gsl_linalg_LU_det(lu, signum);
+
+    // Copy GSL matrix data to psImage data
+    gslMatrixToPsImage(outImage, inv);
+
+    // Free GSL structs
+    gsl_permutation_free(perm);
+    gsl_matrix_free(lu);
+    gsl_matrix_free(inv);
+
+    return outImage;
+}
+
+psF32 *psMatrixDeterminant(const psImage* inImage)
+{
+    psS32 signum = 0;
+    psS32 numRows = 0;
+    psS32 numCols = 0;
+    psF32 *det = NULL;
+    gsl_matrix *lu = NULL;
+    gsl_permutation *perm = NULL;
+
+    #define DETERMINANT_EXIT { return NULL; }
+    // Error checks
+    PS_IMAGE_CHECK_NULL_GENERAL(inImage, DETERMINANT_EXIT);
+    PS_CHECK_DIMEN_AND_TYPE(inImage, PS_DIMEN_IMAGE, DETERMINANT_EXIT);
+    PS_IMAGE_CHECK_EMPTY_GENERAL(inImage, DETERMINANT_EXIT);
+    PS_CHECK_SQUARE(inImage, DETERMINANT_EXIT);
+
+    // Initialize data
+    numRows = inImage->numRows;
+    numCols = inImage->numCols;
+
+    // Allocate GSL structs
+    perm = gsl_permutation_alloc(numRows);
+    lu = gsl_matrix_alloc(numRows, numCols);
+    psImageToGslMatrix(lu, inImage);
+
+    // Calculate determinant
+    det = (psF32*)psAlloc(sizeof(psF32));
+    gsl_linalg_LU_decomp(lu, perm, &signum);
+    *det = (psF32)gsl_linalg_LU_det(lu, signum);
+
+    // Free GSL structs
+    gsl_permutation_free(perm);
+    gsl_matrix_free(lu);
+
+    return det;
+}
+
+psImage* psMatrixMultiply(psImage* outImage, psImage* inImage1, psImage* inImage2)
+{
+    psS32 numRows = 0;
+    psS32 numCols = 0;
+    gsl_matrix *m1 = NULL;
+    gsl_matrix *m2 = NULL;
+    gsl_matrix *m3 = NULL;
+
+    #define MULTIPLY_CLEANUP { psFree(outImage); return NULL; }
+
+    // Error checks
+    PS_IMAGE_CHECK_NULL_GENERAL(inImage1, MULTIPLY_CLEANUP);
+    PS_IMAGE_CHECK_NULL_GENERAL(inImage2, MULTIPLY_CLEANUP);
+    PS_IMAGE_CHECK_EMPTY_GENERAL(inImage1, MULTIPLY_CLEANUP);
+    PS_IMAGE_CHECK_EMPTY_GENERAL(inImage2, MULTIPLY_CLEANUP);
+    PS_CHECK_DIMEN_AND_TYPE(inImage1, PS_DIMEN_IMAGE, MULTIPLY_CLEANUP);
+    PS_CHECK_DIMEN_AND_TYPE(inImage2, PS_DIMEN_IMAGE, MULTIPLY_CLEANUP);
+    PS_CHECK_POINTERS(inImage1, outImage, MULTIPLY_CLEANUP);
+    PS_CHECK_POINTERS(inImage1, inImage2, MULTIPLY_CLEANUP);
+
+    outImage = psImageRecycle(outImage, inImage2->numCols, inImage2->numRows, inImage2->type.type);
+
+    PS_CHECK_SQUARE(inImage1, MULTIPLY_CLEANUP);
+    PS_CHECK_SQUARE(inImage2, MULTIPLY_CLEANUP);
+    PS_CHECK_SQUARE(outImage, MULTIPLY_CLEANUP);
+
+    // Initialize data
+    numRows = inImage1->numRows;
+    numCols = inImage1->numCols;
+
+    // Initialize GSL data
+    m1 = gsl_matrix_alloc(numRows, numCols);
+    psImageToGslMatrix(m1, inImage1);
+    m2 = gsl_matrix_alloc(numRows, numCols);
+    psImageToGslMatrix(m2, inImage2);
+    m3 = gsl_matrix_alloc(numRows, numCols);
+    psImageToGslMatrix(m3, outImage);
+
+    // Perform multiplication
+    gsl_linalg_matmult(m1, m2, m3);
+
+    // Copy GSL matrix data to psImage data
+    gslMatrixToPsImage(outImage, m3);
+
+    // Free GSL structs
+    gsl_matrix_free(m1);
+    gsl_matrix_free(m2);
+    gsl_matrix_free(m3);
+
+    return outImage;
+}
+
+psImage* psMatrixTranspose(psImage* outImage, const psImage* inImage)
+{
+    psU32 i = 0;
+    psU32 j = 0;
+    psS32 numRowsIn = 0;
+    psS32 numColsIn = 0;
+    psS32 numRowsOut = 0;
+    psS32 numColsOut = 0;
+
+    #define TRANSPOSE_CLEANUP { psFree(outImage); return NULL; }
+    // Error checks
+    PS_IMAGE_CHECK_NULL_GENERAL(inImage, TRANSPOSE_CLEANUP);
+    PS_CHECK_DIMEN_AND_TYPE(inImage, PS_DIMEN_IMAGE, TRANSPOSE_CLEANUP);
+    PS_IMAGE_CHECK_EMPTY_GENERAL(inImage, TRANSPOSE_CLEANUP);
+    PS_CHECK_POINTERS(inImage, outImage, TRANSPOSE_CLEANUP);
+
+    outImage = psImageRecycle(outImage, inImage->numCols, inImage->numRows, inImage->type.type);
+
+    // Initialize data
+    numRowsIn = inImage->numRows;
+    numColsIn = inImage->numCols;
+    numRowsOut = outImage->numRows;
+    numColsOut = outImage->numCols;
+
+    if(numRowsIn!=numColsOut && numRowsOut!=numColsIn) {
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true, PS_ERRORTEXT_psMatrix_TRANSPOSE_MISMATCH);
+        TRANSPOSE_CLEANUP;
+    }
+
+    if(outImage->type.type == PS_TYPE_F32) {
+        for(i=0; i<numRowsOut; i++) {
+            for(j=0; j<numColsOut; j++) {
+                outImage->data.F32[i][j] = inImage->data.F32[j][i];
+            }
+        }
+    } else {
+        for(i=0; i<numRowsOut; i++) {
+            for(j=0; j<numColsOut; j++) {
+                outImage->data.F64[i][j] = inImage->data.F64[j][i];
+            }
+        }
+    }
+
+    return outImage;
+}
+
+psImage* psMatrixEigenvectors(psImage* outImage, psImage* inImage)
+{
+    psS32 numRows = 0;
+    psS32 numCols = 0;
+    gsl_vector *eVals = NULL;
+    gsl_eigen_symmv_workspace *w = NULL;
+    gsl_matrix *out = NULL;
+    gsl_matrix *in = NULL;
+
+    #define EIGENVECTORS_CLEANUP { psFree(outImage); return NULL; }
+    // Error checks
+    PS_IMAGE_CHECK_NULL_GENERAL(inImage, EIGENVECTORS_CLEANUP);
+    PS_CHECK_DIMEN_AND_TYPE(inImage, PS_DIMEN_IMAGE, EIGENVECTORS_CLEANUP);
+    PS_IMAGE_CHECK_EMPTY_GENERAL(inImage, EIGENVECTORS_CLEANUP);
+    PS_CHECK_POINTERS(inImage, outImage, EIGENVECTORS_CLEANUP);
+
+    outImage = psImageRecycle(outImage, inImage->numCols, inImage->numRows, inImage->type.type);
+
+    // Initialize data
+    numRows = inImage->numRows;
+    numCols = inImage->numCols;
+
+    in = gsl_matrix_alloc(numRows, numCols);
+    psImageToGslMatrix(in, inImage);
+    out = gsl_matrix_alloc(numRows, numCols);
+
+    // Allocate GSL structs
+    eVals = gsl_vector_alloc(numRows);
+    w = gsl_eigen_symmv_alloc(numRows);
+
+    // Non-square matrices not allowed
+    PS_CHECK_SQUARE(inImage, EIGENVECTORS_CLEANUP);
+    PS_CHECK_SQUARE(outImage, EIGENVECTORS_CLEANUP);
+
+    // Calculate Eigenvalues and Eigenvectors...Eigenvalues not currently used
+    gsl_eigen_symmv(in, eVals, out, w);
+
+    // Copy GSL matrix data to psImage data
+    gslMatrixToPsImage(outImage, out);
+
+    // Free GSL structs
+    gsl_matrix_free(in);
+    gsl_matrix_free(out);
+    gsl_eigen_symmv_free(w);
+    gsl_vector_free(eVals);
+
+    return outImage;
+}
+
+psVector* psMatrixToVector(psVector* outVector, const psImage* inImage)
+{
+    psS32 size = 0;
+
+    #define psMatrixToVector_EXIT {psFree(outVector); return NULL;}
+
+    // Error checks
+    PS_IMAGE_CHECK_NULL_GENERAL(inImage, psMatrixToVector_EXIT);
+    PS_CHECK_DIMEN_AND_TYPE(inImage, PS_DIMEN_IMAGE, psMatrixToVector_EXIT);
+    PS_IMAGE_CHECK_EMPTY_GENERAL(inImage, psMatrixToVector_EXIT);
+
+    if (inImage->numRows == 1) {
+        // Create transposed row vector
+        outVector = psVectorRecycle(outVector, inImage->numCols, inImage->type.type);
+        outVector->type.dimen = PS_DIMEN_TRANSV;
+    } else if (inImage->numCols == 1) {
+        // Create non-transposed column vector
+        outVector = psVectorRecycle(outVector, inImage->numRows, inImage->type.type);
+    } else {
+        psError(PS_ERR_BAD_PARAMETER_SIZE, true,
+                "Image does not have dim with 1 col or 1 row: (%d x %d).",
+                inImage->numRows, inImage->numCols);
+        psMatrixToVector_EXIT;
+    }
+
+    // More checks
+    if (outVector->type.dimen == PS_DIMEN_VECTOR) {
+        PS_CHECK_DIMEN_AND_TYPE(outVector, PS_DIMEN_VECTOR, psMatrixToVector_EXIT);
+
+        if (outVector->n == 0) {
+            outVector->n = inImage->numRows;
+        }
+
+        if (outVector->n != inImage->numRows) {
+            psError(PS_ERR_BAD_PARAMETER_SIZE, true,
+                    "Image and vector sizes differ: (%d vs %d).",
+                    inImage->numRows, outVector->n);
+            psMatrixToVector_EXIT;
+        }
+
+        size = PSELEMTYPE_SIZEOF(inImage->type.type) * inImage->numRows;
+
+    } else if (outVector->type.dimen == PS_DIMEN_TRANSV) {
+        PS_CHECK_DIMEN_AND_TYPE(outVector, PS_DIMEN_TRANSV, psMatrixToVector_EXIT);
+
+        if (outVector->n == 0) {
+            outVector->n = inImage->numCols;
+        }
+
+        if (outVector->n != inImage->numCols) {
+            psError(PS_ERR_BAD_PARAMETER_SIZE, true,
+                    "Image and vector sizes differ: (%d vs %d).",
+                    inImage->numCols, outVector->n);
+            psMatrixToVector_EXIT;
+        }
+
+        size = PSELEMTYPE_SIZEOF(inImage->type.type) * inImage->numCols;
+    }
+
+    memcpy(outVector->data.U8, inImage->data.U8[0], size);
+
+    return outVector;
+}
+
+psImage* psVectorToMatrix(psImage* outImage, const psVector* inVector)
+{
+    psS32 size = 0;
+
+    #define VECTORTOMATRIX_CLEANUP {psFree(outImage); return NULL; }
+    // Error checks
+    PS_VECTOR_CHECK_NULL_GENERAL(inVector, VECTORTOMATRIX_CLEANUP);
+
+    if (inVector->type.dimen == PS_DIMEN_VECTOR) {
+        PS_CHECK_DIMEN_AND_TYPE(inVector, PS_DIMEN_VECTOR, VECTORTOMATRIX_CLEANUP);
+        PS_VECTOR_CHECK_EMPTY_GENERAL(inVector, VECTORTOMATRIX_CLEANUP);
+
+        outImage = psImageRecycle(outImage, 1, inVector->n, inVector->type.type);
+
+        // More checks for PS_DIMEN_VECTOR
+        if (outImage->numCols > 1) {
+            psError(PS_ERR_BAD_PARAMETER_SIZE, true,
+                    "Image has more than 1 column: numCols = %d.",
+                    outImage->numCols);
+            VECTORTOMATRIX_CLEANUP;
+        } else if (outImage->numRows != inVector->n) {
+            psError(PS_ERR_BAD_PARAMETER_SIZE, true,
+                    "Image and vector sizes differ: (%d vs %d).",
+                    outImage->numRows, inVector->n);
+            VECTORTOMATRIX_CLEANUP;
+        }
+
+        size = PSELEMTYPE_SIZEOF(outImage->type.type) * outImage->numRows;
+
+    } else if (inVector->type.dimen == PS_DIMEN_TRANSV) {
+        PS_CHECK_DIMEN_AND_TYPE(inVector, PS_DIMEN_TRANSV, VECTORTOMATRIX_CLEANUP);
+        PS_VECTOR_CHECK_EMPTY_GENERAL(inVector, VECTORTOMATRIX_CLEANUP);
+        outImage = psImageRecycle(outImage, inVector->n, 1, inVector->type.type);
+        // More checks for PS_DIMEN_TRANSV
+        if (outImage->numRows > 1) {
+            psError(PS_ERR_BAD_PARAMETER_SIZE, true,
+                    "Image has more than 1 row: numRows = %d.",
+                    outImage->numRows);
+            VECTORTOMATRIX_CLEANUP;
+        } else if (outImage->numCols != inVector->n) {
+            psError(PS_ERR_BAD_PARAMETER_SIZE, true,
+                    "Image and vector sizes differ: (%d vs %d).",
+                    outImage->numCols, inVector->n);
+            VECTORTOMATRIX_CLEANUP;
+        }
+
+        size = PSELEMTYPE_SIZEOF(outImage->type.type) * outImage->numCols;
+    }
+
+    PS_IMAGE_CHECK_NULL_GENERAL(outImage, VECTORTOMATRIX_CLEANUP);
+    PS_CHECK_DIMEN_AND_TYPE(outImage, PS_DIMEN_IMAGE, VECTORTOMATRIX_CLEANUP);
+
+    memcpy(outImage->data.U8[0], inVector->data.U8, size);
+
+    return outImage;
+}
Index: /tags/ipp-1-X/bug123/psLib/src/dataManip/psMatrix.h
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/dataManip/psMatrix.h	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/dataManip/psMatrix.h	(revision 22331)
@@ -0,0 +1,166 @@
+
+/** @file  psMatrix.h
+ *
+ *  @brief Provides functions for linear algebra operations on psImages and psVectors.
+ *
+ *  Functions are provided to:
+ *      Transpose a psImage
+ *      Compute LUD
+ *      Solve LUD
+ *      Matrix inversion
+ *      Calculate determinant
+ *      Matrix multiplication
+ *      Calculate Eigenvectors
+ *      Convert matrix to vector
+ *      Convert vector to matrix
+ *
+ *  These functions treat psImages as if they were matrices, therefore there is no psMatrix. These functions
+ *  operate only with the psF64 data type.
+ *
+ *  @ingroup Matrix
+ *
+ *  @author Ross Harman, MHPCC
+ *
+ *  @version $Revision: 1.15 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-02-17 19:26:23 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+
+#ifndef PSMATRIX_H
+#define PSMATRIX_H
+
+/// @addtogroup Matrix
+/// @{
+
+/** LU Decomposition of psImage matrix.
+ *
+ *  Performs a LU decomposition on a psImage matrix and returns the LU matrix. If the user specifies NULL for
+ *  the outImage or outPerm arguments, then they will be automatically created. The input image must
+ *  be square. This function operates only with the psF64 data type. Input and output arguments should not be
+ *  the same. GSL indexes the top row as the zero row, not the bottom.
+ *
+ *  @return  psImage* : Pointer to LU decomposed psImage.
+ */
+psImage* psMatrixLUD(
+    psImage* outImage,                 ///< Image to return, or NULL.
+    psVector** outPerm,                ///< Output permutation vector used by psMatrixLUSolve.
+    psImage* inImage                   ///< Image to decompose.
+);
+
+/** LU Solution of psImage matrix.
+ *
+ *  Solves for and returns the psVector, {x} in the equation [A]{x} = {b}. If the user specifies NULL as the
+ *  outVector argument, then it will automatically be created. The input image must be square. This function
+ *  operates only with the psF64 data type. Input and output arguments should not be the same. GSL indexes
+ *  the top row as the zero row, not the bottom.
+ *
+ *  @return  psVector* : Pointer to psVector solution of matrix equation.
+ */
+psVector* psMatrixLUSolve(
+    psVector* outVector,               ///< Vector to return, or NULL.
+    const psImage* luImage,            ///< LU-decomposed matrix.
+    const psVector* inVector,          ///< Vector right-hand-side of equation.
+    const psVector* inPerm             ///< Permutation vector resulting from psMatrixLUD function.
+);
+
+/** Invert psImage matrix.
+ *
+ *  Inverts a psImage matrix and returns the determinant as an option through the argument list. If the user
+ *  specifies NULL as the outImage argument, then it will automatically be created. The input image must be
+ *  square. This function operates only with the psF64 data type. Input and output arguments should not be
+ *  the same. GSL indexes the top row as the zero row, not the bottom.
+ *
+ *  @return  psImage* : Pointer to inverted psImage.
+ */
+psImage* psMatrixInvert(
+    psImage* outImage,                 ///< Image to return, or NULL for in-place substitution.
+    const psImage* inImage,            ///< Image to be inverted
+    psF32 *det                         ///< Determinant to return, or NULL
+);
+
+/** Calculate psImage matrix determinant.
+ *
+ *  Calculates the determinant of a psImage matrix and returns the single precision floating point result. The
+ *  input image must be square. This function operates only with the psF64 data type. GSL indexes the top row
+ *  as the zero row, not the bottom.
+ *
+ *  @return  float: Determinant from psImage.
+ */
+psF32 *psMatrixDeterminant(
+    const psImage* inMatrix        ///< Image used to calculate determinant.
+);
+
+/** Performs psImage matrix multiplication.
+ *
+ *  Performs a classical matrix multiplication involving row and column operations. Input images must be square
+ *  and the same size. If the user specifies NULL as the outImage argument, then it will automatically be
+ *  created. This function operates only with the psF64 data type. GSL indexes the top row as the
+ *  zero row, not the bottom.
+ *
+ *  @return  psImage* : Pointer to resulting psImage.
+ */
+psImage* psMatrixMultiply(
+    psImage* outImage,                 ///< Matrix to return, or NULL.
+    psImage* inImage1,                 ///< First input image.
+    psImage* inImage2                  ///< Second input image.
+);
+
+/** Transpose matrix.
+ *
+ *  Performs psImage matrix transpose by substituting existing rows for columns. The input image must be
+ *  square. If the user specifies NULL as the outImage argument, then it will automaticallty be created.
+ *  This function operates only with the psF64 data type. GSL indexes the top row as the zero
+ *  row, not the bottom.
+ *
+ *  @return  psImage* : Pointer to transposed psImage.
+ */
+psImage* psMatrixTranspose(
+    psImage* outImage,                 ///< Image to return, or NULL
+    const psImage* inImage             ///< Image to transpose
+);
+
+/** Calculate matrix eigenvectors.
+ *
+ *  Calculates the eigenvectors for a matrix. The input image must be symmetric and square. If the user
+ *  specifies NULL as the outImage argument, then it will automatically be created. This function operates
+ *  only with the psF64 data type. GSL indexes the top row as the zero row, not the bottom.
+ *
+ *  @return  psImage* : Pointer to matrix of Eigenvectors.
+ */
+psImage* psMatrixEigenvectors(
+    psImage* outImage,                 ///< Eigenvectors to return, or NULL.
+    psImage* inImage                   ///< Input image.
+);
+
+/** Convert matrix to vector.
+ *
+ *  Converts a 1-d psImage matrix into a vector. If the user specifies NULL as the outVector argument, then it
+ *  will automatically be created based on the input image (PS_DIMEN_VECTOR for an input image with 1 col or
+ *  PS_DIMENT_TRANSV for an input image with 1 row). Either the number of rows or the number of colums of the
+ *  input matrix must be 1. This function operates only  with the psF64 data type.
+ *
+ *  @return  psVector* : Pointer to psVector.
+ */
+psVector* psMatrixToVector(
+    psVector* outVector,               ///< Vector to return, or NULL.
+    const psImage* inImage             ///< Image to convert.
+);
+
+/** Convert vector to matrix.
+ *
+ *  Converts a vector into a psImage matrix. If the dimensionality of the vector is PS_DIMEN_VECTOR, then the
+ *  resulting psImage is a 1d column. If the dimensionality of the vector is PS_DIMEN_TRANSV, then the
+ *  resulting psImage is a 1d row. If the user specifies NULL as the outImage argument,  then it will
+ *  automatically be created. This function operates only with the psF64 data type.
+ *
+ *  @return  psVector* : Pointer to psIamge.
+ */
+psImage* psVectorToMatrix(
+    psImage* outImage,                 ///< Matrix to return, or NULL.
+    const psVector* inVector           ///< Vector to convert.
+);
+
+/// @}
+
+#endif
Index: /tags/ipp-1-X/bug123/psLib/src/dataManip/psMinimize.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/dataManip/psMinimize.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/dataManip/psMinimize.c	(revision 22331)
@@ -0,0 +1,1866 @@
+/** @file  psMinimize.c
+ *  \brief basic minimization functions
+ *  @ingroup Math
+ *
+ *  This file will contain functions to minimize an arbitrary function at
+ *  a data point, fit an arbitrary function to a set of data points, and
+ *  fit a 1-D polynomial to a set of data points.
+ *
+ *  @author GLG, MHPCC
+ *
+ *  @version $Revision: 1.110 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-03-31 01:02:15 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ *
+ *  XXX: must follow coding name standards on local functions.
+ *
+ */
+/*****************************************************************************/
+/* INCLUDE FILES                                                             */
+/*****************************************************************************/
+#include <stdio.h>
+#include <float.h>
+#include <math.h>
+
+#include "psMinimize.h"
+#include "psStats.h"
+/*****************************************************************************/
+/* DEFINE STATEMENTS                                                         */
+/*****************************************************************************/
+#define PS_SEG psLib
+#define PS_PWD dataManip
+#define PS_FILE psMinimize
+/*****************************************************************************/
+/* TYPE DEFINITIONS                                                          */
+/*****************************************************************************/
+
+/*****************************************************************************/
+/* GLOBAL VARIABLES                                                          */
+/*****************************************************************************/
+static psMinimizeChi2PowellFunc Chi2PowellFunc = NULL;
+static psVector *myValue;
+static psVector *myError;
+
+/*****************************************************************************/
+/* FILE STATIC VARIABLES                                                     */
+/*****************************************************************************/
+
+// None
+
+/*****************************************************************************/
+/* FUNCTION IMPLEMENTATION - LOCAL                                           */
+/*****************************************************************************/
+
+/******************************************************************************
+p_psBuildSums1D(x, polyOrder, sums): this routine calculates the powers of
+input parameter "x" between 0 and input parameter polyOrder.  The result is
+returned as a psVector sums.
+ 
+XXX: Use a static vector.
+ *****************************************************************************/
+void psBuildSums1D(psF64 x,
+                   psS32 polyOrder,
+                   psVector* sums)
+{
+    psS32 i = 0;
+    psF64 xSum = 0.0;
+
+    if (sums == NULL) {
+        sums = psVectorAlloc(polyOrder, PS_TYPE_F64);
+    }
+    if (polyOrder > sums->n) {
+        sums = psVectorRealloc(sums, polyOrder);
+    }
+
+    xSum = 1.0;
+    for (i = 0; i <= polyOrder; i++) {
+        sums->data.F64[i] = xSum;
+        xSum *= x;
+    }
+}
+
+/*****************************************************************************
+CalculateSecondDerivs(): Given a set of x/y vectors corresponding to a
+tabulated function at n points, this routine calculates the second
+derivatives of the interpolating cubic splines at those n points.
+ 
+The first and second derivatives at the endpoints, undefined in the SDR, are
+here defined to be 0.0.  They can be modified via ypo and yp1.
+ 
+This routine assumes that vectors x and y are of the appropriate types/sizes
+(F32).
+ 
+XXX: This algorithm is derived from the Numerical Recipes.
+XXX: use recycled vectors for internal data.
+XXX: do an F64 version?
+ *****************************************************************************/
+psF32 *CalculateSecondDerivs(const psVector* x,        ///< Ordinates (or NULL to just use the indices)
+                             const psVector* y)        ///< Coordinates
+{
+    psTrace(".psLib.dataManip.CalculateSecondDerivs", 4,
+            "---- CalculateSecondDerivs() begin ----\n");
+
+    psS32 i;
+    psS32 k;
+    psF32 sig;
+    psF32 p;
+    psS32 n = y->n;
+    psF32 *u = (psF32 *) psAlloc(n * sizeof(psF32));
+    psF32 *derivs2 = (psF32 *) psAlloc(n * sizeof(psF32));
+    psF32 *X = (psF32 *) & (x->data.F32[0]);
+    psF32 *Y = (psF32 *) & (y->data.F32[0]);
+    psF32 qn;
+
+    // XXX: The second derivatives at the endpoints, undefined in the SDR,
+    // are set in psConstants.h: PS_LEFT_SPLINE_DERIV, PS_RIGHT_SPLINE_DERIV.
+    derivs2[0] = -0.5;
+    u[0]= (3.0/(X[1]-X[0])) * ((Y[1]-Y[0])/(X[1]-X[0]) - PS_LEFT_SPLINE_DERIV);
+
+    for (i=1;i<=(n-2);i++) {
+        sig = (X[i] - X[i-1]) / (X[i+1] - X[i-1]);
+        p = sig * derivs2[i-1] + 2.0;
+        derivs2[i] = (sig - 1.0) / p;
+        u[i] = ((Y[i+1] - Y[i])/(X[i+1]-X[i])) - ((Y[i]-Y[i-1])/(X[i]-X[i-1]));
+        u[i] = ((6.0 * u[i] / (X[i+1] - X[i-1])) - (sig * u[i-1])) / p;
+
+        psTrace(".psLib.dataManip.CalculateSecondDerivs", 6,
+                "X[%d] is %f\n", i, X[i]);
+        psTrace(".psLib.dataManip.CalculateSecondDerivs", 6,
+                "Y[%d] is %f\n", i, Y[i]);
+        psTrace(".psLib.dataManip.CalculateSecondDerivs", 6,
+                "u[%d] is %f\n", i, u[i]);
+    }
+
+    qn = 0.5;
+    u[n-1] = (3.0/(X[n-1]-X[n-2])) * (PS_RIGHT_SPLINE_DERIV - (Y[n-1]-Y[n-2])/(X[n-1]-X[n-2]));
+    derivs2[n-1] = (u[n-1] - (qn * u[n-2])) / ((qn * derivs2[n-2]) + 1.0);
+
+    for (k=(n-2);k>=0;k--) {
+        derivs2[k] = derivs2[k] * derivs2[k+1] + u[k];
+
+        psTrace(".psLib.dataManip.CalculateSecondDerivs", 6,
+                "derivs2[%d] is %f\n", k, derivs2[k]);
+    }
+
+    psFree(u);
+    psTrace(".psLib.dataManip.CalculateSecondDerivs", 4,
+            "---- CalculateSecondDerivs() end ----\n");
+    return(derivs2);
+}
+
+/******************************************************************************
+p_psNRSpline1DEval(): This routine does NR-style evaluation of cubic splines.
+It takes advantage of the 2nd derivatives of the cubic splines, which are
+stored in the psSPline1D data structure, and computes the interpolated value
+directly, without computing (or using) the interpolating cubic spline
+polynomial.
+ 
+This routine is here mostly for a sanity check on the psLib function
+evalSpline() which computes the interpolated value based on the cubic spline
+polynomials which are stored in psSpline1D.
+ 
+XXX: This is F32 only
+ 
+XXX: spline->knots must be psF32
+ *****************************************************************************/
+/*
+psF32 p_psNRSpline1DEval(psSpline1D *spline,
+                         const psVector* x,
+                         const psVector* y,
+                         psF32 X)
+{
+    PS_PTR_CHECK_NULL(spline, NAN);
+    PS_INT_CHECK_NON_NEGATIVE(spline->n, NAN);
+    PS_VECTOR_CHECK_NULL(spline->domains, NAN);
+    PS_PTR_CHECK_NULL(spline->p_psDeriv2, NAN);
+    PS_VECTOR_CHECK_NULL(x, NAN);
+    PS_VECTOR_CHECK_TYPE(x, PS_TYPE_F32, NAN);
+    PS_VECTOR_CHECK_NULL(y, NAN);
+    PS_VECTOR_CHECK_TYPE(y, PS_TYPE_F32, NAN);
+    PS_VECTOR_CHECK_TYPE(spline->knots, PS_TYPE_F32, NULL);
+ 
+    psS32 n;
+    psS32 klo;
+    psS32 khi;
+    psF32 H;
+    psF32 A;
+    psF32 B;
+    psF32 C;
+    psF32 D;
+    psF32 Y;
+ 
+    n = spline->n;
+    klo = p_psVectorBinDisect32(spline->knots->data.F32, (spline->n)+1, X);
+    if (klo < 0) {
+        psLogMsg(__func__, PS_LOG_WARN,
+                 "WARNING: psMinimize.c: p_psNRSpline1DEval(): p_psVectorBinDisect32 returned an error (%d).\n", klo);
+        return(NAN);
+    }
+    khi = klo + 1;
+    H = spline->knots->data.F32[khi] - spline->knots->data.F32[klo];
+    A = (spline->knots->data.F32[khi] - X) / H;
+    B = (X - spline->knots->data.F32[klo]) / H;
+    C = ((A*A*A)-A) * (H*H/6.0);
+    D = ((B*B*B)-B) * (H*H/6.0);
+ 
+    Y = (A * y->data.F32[klo]) +
+        (B * y->data.F32[khi]) +
+        (C * (spline->p_psDeriv2)[klo]) +
+        (D * (spline->p_psDeriv2)[khi]);
+ 
+    return(Y);
+}
+*/
+/*****************************************************************************/
+/* FUNCTION IMPLEMENTATION - PUBLIC                                          */
+/*****************************************************************************/
+
+/*****************************************************************************
+psVectorFitSpline1D(): given a psSpline1D data structure and a set of x/y
+vectors, this routine generates the linear or cublic splines which satisfy
+those data points.
+ 
+The formula for calculating the spline polynomials is derived from Numerical
+Recipes in C.  The basic idea is that the polynomial is
+ (1)     y = (A * y[0]) +
+ (2)         (B * y[1]) +
+ (3)         ((((A*A*A)-A) * mySpline->p_psDeriv2[0]) * H^2)/6.0 +
+ (4)         ((((B*B*B)-B) * mySpline->p_psDeriv2[1]) * H^2)/6.0
+Where:
+ H = x[1]-x[0]
+ A = (x[1]-x)/H
+ B = (x-x[0])/H
+The bulk of the code in this routine is the expansion of the above equation
+into a polynomial in terms of x, and then saving the coefficients of the
+powers of x in the spline polynomials.  This gets pretty complicated.
+ 
+XXX: usage of yErr is not specified in IfA documentation.
+ 
+XXX: Is the x argument redundant?  What do we do if the x argument is
+supplied, but does not equal the knots specified in mySpline?
+ 
+XXX: can psSpline be NULL?
+ 
+XXX: reimplement this assuming that mySpline is NULL?
+ 
+XXX: What happens if X is NULL, then an index vector is generated for X, but
+that index vector lies outside the range vectors in mySpline?
+ 
+XXX: Assumes mySpline->knots is psF32.  Must add psU32 and psF64.
+ *****************************************************************************/
+psSpline1D *psVectorFitSpline1D(psSpline1D *mySpline,     ///< The spline which will be generated.
+                                const psVector* x,        ///< Ordinates (or NULL to just use the indices)
+                                const psVector* y,        ///< Coordinates
+                                const psVector* yErr)     ///< Errors in coordinates, or NULL
+{
+    PS_VECTOR_CHECK_NULL(y, NULL);
+    PS_VECTOR_CHECK_TYPE_F32_OR_F64(y, NULL);
+    if (mySpline != NULL) {
+        PS_VECTOR_CHECK_TYPE(mySpline->knots, PS_TYPE_F32, NULL);
+    }
+
+    psTrace(".psLib.dataManip.psVectorFitSpline1D", 4,
+            "---- psVectorFitSpline1D() begin ----\n");
+    psS32 numSplines = (y->n)-1;
+    psF32 tmp;
+    psF32 H;
+    psS32 i;
+    psF32 slope;
+    psVector *x32 = NULL;
+    psVector *y32 = NULL;
+    psVector *yErr32 = NULL;
+    static psVector *x32Static = NULL;
+    static psVector *y32Static = NULL;
+    static psVector *yErr32Static = NULL;
+
+    PS_VECTOR_CONVERT_F64_TO_F32_STATIC(y, y32, y32Static);
+
+    // If yErr==NULL, set all errors equal.
+    if (yErr == NULL) {
+        PS_VECTOR_GEN_YERR_STATIC_F32(yErr32Static, y->n);
+        yErr32 = yErr32Static;
+    } else {
+        PS_VECTOR_CHECK_TYPE_F32_OR_F64(yErr, NULL);
+        PS_VECTOR_CONVERT_F64_TO_F32_STATIC(yErr, yErr32, yErr32Static);
+    }
+
+    // If x==NULL, create an x32 vector with x values set to (0:n).
+    if (x == NULL) {
+        PS_VECTOR_GEN_X_INDEX_STATIC_F32(x32Static, y->n);
+        x32 = x32Static;
+    } else {
+        PS_VECTOR_CHECK_TYPE_F32_OR_F64(x, NULL);
+        PS_VECTOR_CONVERT_F64_TO_F32_STATIC(x, x32, x32Static);
+    }
+    PS_VECTOR_CHECK_SIZE_EQUAL(x32, y32, NULL);
+    PS_VECTOR_CHECK_SIZE_EQUAL(yErr32, y32, NULL);
+
+    /*
+        XXX:
+        This can not be implemented until SDR states what order spline should be
+        created.
+        Should we error if mySpline is not NULL?
+        Should we error if mySPline is not NULL?
+    */
+    if (mySpline == NULL) {
+        mySpline = psSpline1DAllocGeneric(x32, 3);
+    }
+    PS_PTR_CHECK_NULL(mySpline, NULL);
+    PS_INT_CHECK_NON_NEGATIVE(mySpline->n, NULL);
+
+    if (y32->n != (1 + mySpline->n)) {
+        psError(PS_ERR_BAD_PARAMETER_SIZE, true,
+                "data size / spline size mismatch (%d %d)\n",
+                y32->n, mySpline->n);
+        return(NULL);
+    }
+
+    // If these are linear splines, which means their polynomials will have
+    // two coefficients, then we do the simple calculation.
+    if (2 == (mySpline->spline[0])->n) {
+        for (i=0;i<mySpline->n;i++) {
+            slope = (y32->data.F32[i+1] - y32->data.F32[i]) /
+                    (mySpline->knots->data.F32[i+1] - mySpline->knots->data.F32[i]);
+            (mySpline->spline[i])->coeff[0] = y32->data.F32[i] -
+                                              (slope * mySpline->knots->data.F32[i]);
+
+            (mySpline->spline[i])->coeff[1] = slope;
+            psTrace(".psLib.dataManip.psMinimize.psVectorFitSpline1D", 4,
+                    "---- mySpline %d coeffs are (%f, %f)\n", i,
+                    (mySpline->spline[i])->coeff[0],
+                    (mySpline->spline[i])->coeff[1]);
+        }
+        psTrace(".psLib.dataManip.psMinimize.psVectorFitSpline1D", 4,
+                "---- Exiting psVectorFitSpline1D()()\n");
+        return((psSpline1D *) mySpline);
+    }
+
+    // Check if these are cubic splines (n==4).  If not, psError.
+    if (4 != (mySpline->spline[0])->n) {
+        psError(PS_ERR_BAD_PARAMETER_SIZE, true,
+                "Don't know how to generate %d-order splines.",
+                (mySpline->spline[0])->n-1);
+        return(NULL);
+    }
+
+    // If we get here, then we know these are cubic splines.  We first
+    // generate the second derivatives at each data point.
+    mySpline->p_psDeriv2 = CalculateSecondDerivs(x32, y32);
+    for (i=0;i<y32->n;i++)
+        psTrace(".psLib.dataManip.psVectorFitSpline1D", 6,
+                "Second deriv[%d] is %f\n", i, mySpline->p_psDeriv2[i]);
+
+    // We generate the coefficients of the spline polynomials.  I can't
+    // concisely explain how this code works.  See above function comments
+    // and Numerical Recipes in C.
+    for (i=0;i<numSplines;i++) {
+        H = x32->data.F32[i+1] - x32->data.F32[i];
+        psTrace(".psLib.dataManip.psVectorFitSpline1D", 4,
+                "x data (%f - %f) (%f)\n",
+                x32->data.F32[i],
+                x32->data.F32[i+1], H);
+        //
+        // ******** Calculate 0-order term ********
+        //
+        // From (1)
+        (mySpline->spline[i])->coeff[0] = (y32->data.F32[i] * x32->data.F32[i+1]/H);
+        // From (2)
+        ((mySpline->spline[i])->coeff[0])-= ((y32->data.F32[i+1] * x32->data.F32[i])/H);
+        // From (3)
+        tmp = (x32->data.F32[i+1] * x32->data.F32[i+1] * x32->data.F32[i+1]) / (H * H * H);
+        tmp-= (x32->data.F32[i+1] / H);
+        tmp*= (mySpline->p_psDeriv2)[i] * H * H / 6.0;
+        ((mySpline->spline[i])->coeff[0])+= tmp;
+        // From (4)
+        tmp = -(x32->data.F32[i] * x32->data.F32[i] * x32->data.F32[i]) / (H * H * H);
+        tmp+= (x32->data.F32[i] / H);
+        tmp*= (mySpline->p_psDeriv2)[i+1] * H * H / 6.0;
+        ((mySpline->spline[i])->coeff[0])+= tmp;
+
+        //
+        // ******** Calculate 1-order term ********
+        //
+        // From (1)
+        (mySpline->spline[i])->coeff[1] = -(y32->data.F32[i]) / H;
+        // From (2)
+        ((mySpline->spline[i])->coeff[1])+= (y32->data.F32[i+1] / H);
+        // From (3)
+        tmp = -3.0 * (x32->data.F32[i+1] * x32->data.F32[i+1]) / (H * H * H);
+        tmp+= (1.0 / H);
+        tmp*= ((mySpline->p_psDeriv2)[i]) * H * H / 6.0;
+        ((mySpline->spline[i])->coeff[1])+= tmp;
+        // From (4)
+        tmp = 3.0 * (x32->data.F32[i] * x32->data.F32[i]) / (H * H * H);
+        tmp-= (1.0 / H);
+        tmp*= ((mySpline->p_psDeriv2)[i+1]) * H * H / 6.0;
+        ((mySpline->spline[i])->coeff[1])+= tmp;
+
+        //
+        // ******** Calculate 2-order term ********
+        //
+        // From (3)
+        (mySpline->spline[i])->coeff[2] = ((mySpline->p_psDeriv2)[i]) * 3.0 * x32->data.F32[i+1] / (6.0 * H);
+        // From (4)
+        ((mySpline->spline[i])->coeff[2])-= (((mySpline->p_psDeriv2)[i+1]) * 3.0 * x32->data.F32[i] / (6.0 * H));
+
+        //
+        // ******** Calculate 3-order term ********
+        //
+        // From (3)
+        (mySpline->spline[i])->coeff[3] = -((mySpline->p_psDeriv2)[i]) / (6.0 * H);
+        // From (4)
+        ((mySpline->spline[i])->coeff[3])+=  ((mySpline->p_psDeriv2)[i+1]) / (6.0 * H);
+
+        psTrace(".psLib.dataManip.psVectorFitSpline1D", 6,
+                "(mySpline->spline[%d])->coeff[0] is %f\n", i, (mySpline->spline[i])->coeff[0]);
+        psTrace(".psLib.dataManip.psVectorFitSpline1D", 6,
+                "(mySpline->spline[%d])->coeff[1] is %f\n", i, (mySpline->spline[i])->coeff[1]);
+        psTrace(".psLib.dataManip.psVectorFitSpline1D", 6,
+                "(mySpline->spline[%d])->coeff[2] is %f\n", i, (mySpline->spline[i])->coeff[2]);
+        psTrace(".psLib.dataManip.psVectorFitSpline1D", 6,
+                "(mySpline->spline[%d])->coeff[3] is %f\n", i, (mySpline->spline[i])->coeff[3]);
+
+    }
+
+    psTrace(".psLib.dataManip.psVectorFitSpline1D", 4,
+            "---- psVectorFitSpline1D() end ----\n");
+    return(mySpline);
+}
+
+
+/******************************************************************************
+XXX: We assume unnormalized gaussians.
+ *****************************************************************************/
+psVector *psMinimizeLMChi2Gauss1D(psImage *deriv,
+                                  const psVector *params,
+                                  const psArray *coords)
+{
+    PS_PTR_CHECK_NULL(coords, NULL);
+    PS_PTR_CHECK_NULL(params, NULL);
+
+    psTrace(".psLib.dataManip.psMinimize", 4,
+            "---- psMinimizeLMChi2Gauss1D() begin ----\n");
+    psF32 x;
+    psS32 i;
+    psF32 mean = params->data.F32[0];
+    psF32 stdev = params->data.F32[1];
+    psVector *out = psVectorAlloc(coords->n, PS_TYPE_F32);
+
+    psTrace(".psLib.dataManip.psMinimize", 6,
+            "(mean, stdev) is (%f, %f)\n", mean, stdev);
+
+    if (deriv == NULL) {
+        deriv = psImageAlloc(params->n, coords->n, PS_TYPE_F32);
+    } else {
+        PS_IMAGE_CHECK_SIZE(deriv, params->n, coords->n, NULL);
+        PS_IMAGE_CHECK_TYPE(deriv, PS_TYPE_F32, NULL);
+    }
+
+    for (i=0;i<coords->n;i++) {
+        x = ((psVector *) (coords->data[i]))->data.F32[0];
+        out->data.F32[i] = psGaussian(x, mean, stdev, false);
+    }
+
+    for (i=0;i<coords->n;i++) {
+        x = ((psVector *) (coords->data[i]))->data.F32[0];
+        psF32 tmp = (x - mean) * psGaussian(x, mean, stdev, false);
+        deriv->data.F32[i][0] = tmp / (stdev * stdev);
+        tmp = (x - mean) * (x - mean) *
+              psGaussian(x, mean, stdev, 0);
+        deriv->data.F32[i][1] = tmp / (stdev * stdev * stdev);
+    }
+
+    psTrace(".psLib.dataManip.psMinimize", 4,
+            "---- psMinimizeLMChi2Gauss1D() end ----\n");
+    return(out);
+}
+
+/*
+XXX: from bug 230:
+ 
+We first perform a rotation:
+u = - (x-x0)*cos(theta) + (y-y0)*sin(theta)
+v = (x-x0)*cos(theta) + (y-y0)*sin(theta)
+ 
+Here u is the major axis, and v is the minor axis, x0,y0 is the centre, and
+theta is the position angle.
+ 
+Then the flux is
+ 
+flux = norm * exp(-( u*u/2.0/sigmau/sigmau + v*v/2.0/sigmav/sigmav)
+)/2.0/pi/sigmau/sigmav
+ 
+Here sigmau and sigmav are the widths of the major and minor axes.
+ 
+The "norm" parameter in the equation above corresponds to the normalisation.
+ 
+Suggest order:
+ 
+norm
+x0
+y0
+sigma_u
+sigma_v
+theta
+*/
+
+psVector *psMinimizeLMChi2Gauss2D(psImage *deriv,
+                                  const psVector *params,
+                                  const psArray *coords)
+{
+    PS_PTR_CHECK_NULL(coords, NULL);
+    PS_PTR_CHECK_NULL(params, NULL);
+
+    psF64 normalization = params->data.F32[0];
+    psF64 x0 = params->data.F32[1];
+    psF64 y0 = params->data.F32[2];
+    psF64 sigmaX = params->data.F32[3];
+    psF64 sigmaY = params->data.F32[4];
+    psF64 theta = params->data.F32[5];
+    psVector *out = psVectorAlloc(coords->n, PS_TYPE_F32);
+
+    if (deriv == NULL) {
+        deriv = psImageAlloc(params->n, coords->n, PS_TYPE_F32);
+    } else {
+        PS_IMAGE_CHECK_SIZE(deriv, 6, coords->n, NULL);
+        PS_IMAGE_CHECK_TYPE(deriv, PS_TYPE_F32, NULL);
+    }
+
+    psTrace(".psLib.dataManip.psMinimize", 4,
+            "---- psMinimizeLMChi2Gauss2D() begin ----\n");
+
+    for (psS32 i=0;i<coords->n;i++) {
+        psF64 x = ((psVector *) coords->data[i])->data.F32[0];
+        psF64 y = ((psVector *) coords->data[i])->data.F32[0];
+
+        psF64 u = - (x-x0)*cos(theta) + (y-y0)*sin(theta);
+        psF64 v = (x-x0)*cos(theta) + (y-y0)*sin(theta);
+
+        psF64 flux = normalization * exp(-( u*u/(2.0 * sigmaX * sigmaX) +
+                                            v*v/(2.0 * sigmaY * sigmaY)))/
+                     (2.0 * PS_PI * sigmaX * sigmaY);
+        out->data.F32[i] = flux;
+
+        // XXX: Calculate these correctly.
+        deriv->data.F32[i][0] = 0.0;
+        deriv->data.F32[i][1] = 0.0;
+        deriv->data.F32[i][2] = 0.0;
+        deriv->data.F32[i][3] = 0.0;
+        deriv->data.F32[i][4] = 0.0;
+        deriv->data.F32[i][5] = 0.0;
+    }
+
+    psTrace(".psLib.dataManip.psMinimize", 4,
+            "---- psMinimizeLMChi2Gauss2D() end ----\n");
+    return(out);
+}
+
+/******************************************************************************
+psMinimizeLMChi2():  This routine will take an procedure which calculates
+an arbitrary function and it's derivative and minimize the chi-squared match
+between that function at the specified coords and the specified value at
+those coords.
+ 
+XXX: Do this:
+ After checking that all entries in the paramMask are 1 or 0, when
+ forming the A matrix from alpha, try this:
+ 
+     A[i][i] = (1 + lambda*paramask[i]) * alpha[i][i];
+ 
+XXX: This is very different from what is specified in the SDR.  Must
+coordinate with IfA on new SDR.
+ 
+XXX: Do vector/image recycles.
+ 
+XXX: probably yErr will be part of the SDR.
+ 
+XXX: This must work for both F32 and F64.  F32 is currently implemented.
+     Note: since the LUD routines are only implemented in F64, then we
+     will have to convert all F32 input vectors to F64 regardless.  So,
+     the F64 port might be.
+ 
+XXX: Must update the covar matrix.
+ *****************************************************************************/
+psBool psMinimizeLMChi2(psMinimization *min,
+                        psImage *covar,
+                        psVector *params,
+                        const psVector *paramMask,
+                        const psArray *x,
+                        const psVector *y,
+                        const psVector *yErr,
+                        psMinimizeLMChi2Func func)
+{
+    PS_PTR_CHECK_NULL(min, NULL);
+    PS_VECTOR_CHECK_NULL(params, NULL);
+    PS_VECTOR_CHECK_EMPTY(params, NULL);
+    PS_PTR_CHECK_NULL(x, NULL);
+    PS_VECTOR_CHECK_NULL(y, NULL);
+    PS_VECTOR_CHECK_EMPTY(y, NULL);
+    PS_VECTOR_CHECK_SIZE_EQUAL(x, y, NULL);
+    PS_PTR_CHECK_NULL(func, NULL);
+
+    if (paramMask != NULL) {
+        PS_VECTOR_CHECK_SIZE_EQUAL(params, paramMask, NULL);
+    }
+    if (yErr != NULL) {
+        PS_VECTOR_CHECK_SIZE_EQUAL(y, yErr, NULL);
+    }
+    if (covar != NULL) {
+        PS_IMAGE_CHECK_SIZE(covar, params->n, params->n, NULL);
+    }
+
+    psTrace(".psLib.dataManip.psMinimize", 4,
+            "---- psMinimizeLMChi2() begin ----\n");
+    psS32 numData = y->n;
+    psS32 numParams = params->n;
+    psS32 i;
+    psS32 j;
+    psS32 k;
+    psS32 l;
+    psS32 n;
+    psS32 p;
+    psVector *beta = psVectorAlloc(numParams, PS_TYPE_F64);
+    psVector *perm = NULL;
+
+    psVector *paramDeltasF64 = psVectorAlloc(numParams, PS_TYPE_F64);
+    psVector *origParams = psVectorAlloc(numParams, PS_TYPE_F32);
+    psVector *newParams = psVectorAlloc(numParams, PS_TYPE_F32);
+
+    psImage *alpha = psImageAlloc(numParams, numParams, PS_TYPE_F32);
+    psImage *A = psImageAlloc(numParams, numParams, PS_TYPE_F64);
+    psImage *aOut = psImageAlloc(numParams, numParams, PS_TYPE_F64);
+    psImage *deriv = psImageAlloc(numParams, numData, PS_TYPE_F32);
+    psVector *currValueVec = NULL;
+    psVector *newValueVec = NULL;
+    psF32 currChi2 = 0.0;
+    psF32 newChi2 = 0.0;
+    psF32 lamda = 0.00005;
+    lamda = 0.05;
+
+    psTrace(".psLib.dataManip.psMinimize", 6,
+            "min->maxIter is %d\n", min->maxIter);
+    psTrace(".psLib.dataManip.psMinimize", 6,
+            "min->tol is %f\n", min->tol);
+
+    for (p=0;p<numParams;p++) {
+        origParams->data.F32[p] = params->data.F32[p];
+    }
+
+    min->lastDelta = PS_MAX_F32;
+    min->iter = 0;
+
+    while ((min->lastDelta > min->tol) && (min->iter < min->maxIter)) {
+        psTrace(".psLib.dataManip.psMinimize", 4,
+                "------------------------------------------------------\n");
+        psTrace(".psLib.dataManip.psMinimize", 4,
+                "Iteration %d.  Delta is %f\n", min->iter, min->lastDelta);
+
+        //
+        // Calculate the current values and chi-squared of the function.
+        //
+        currChi2 = 0.0;
+        currValueVec = func(deriv, params, x);
+        for (n=0;n<numData;n++) {
+            currChi2+= (currValueVec->data.F32[n] - y->data.F32[n]) *
+                       (currValueVec->data.F32[n] - y->data.F32[n]);
+            psTrace(".psLib.dataManip.psMinimize", 6,
+                    "data[%d], chi2 calculation+= (%f - %f)^2\n", n,
+                    currValueVec->data.F32[n], y->data.F32[n]);
+        }
+
+        for (p=0;p<numParams;p++) {
+            psTrace(".psLib.dataManip.psMinimize", 6,
+                    "params->data.F32[%d] is %f.\n", p, params->data.F32[p]);
+        }
+        psTrace(".psLib.dataManip.psMinimize", 6,
+                "Current chi-squared is (%f)\n", currChi2);
+
+        //
+        // Mask elements of the derivative for each data point.
+        //
+        for (p=0;p<numParams;p++) {
+            if ((paramMask != NULL) && (paramMask->data.U8[p] != 0)) {
+                for (n=0;n<numData;n++) {
+                    deriv->data.F32[n][p] = 0.0;
+                }
+            }
+        }
+
+        //
+        // Calculate the BETA vector.
+        //
+        for (p=0;p<numParams;p++) {
+            beta->data.F64[p] = 0.0;
+            for (n=0;n<numData;n++) {
+                (beta->data.F64[p])+=
+                    (y->data.F32[n] - currValueVec->data.F32[n]) *
+                    deriv->data.F32[n][p];
+            }
+            // XXX: multiply by -1 here?
+            (beta->data.F64[p])*= -1.0;
+            psTrace(".psLib.dataManip.psMinimize", 6,
+                    "beta->data.F64[%d] is %f.\n", p, beta->data.F64[p]);
+        }
+        psFree(currValueVec);
+
+        //
+        // Calculate the ALPHA matrix.
+        //
+        for (k=0;k<numParams;k++) {
+            for (l=0;l<numParams;l++) {
+                alpha->data.F32[k][l] = 0.0;
+                for (n=0;n<numData;n++) {
+                    alpha->data.F32[k][l]+= deriv->data.F32[n][k] *
+                                            deriv->data.F32[n][l];
+                }
+            }
+        }
+
+        //
+        // Calculate the matrix A.
+        //
+        for (j=0;j<numParams;j++) {
+            for (k=0;k<numParams;k++) {
+                if (j == k) {
+                    A->data.F64[j][k] =
+                        (psF64) ((1.0 + lamda) * alpha->data.F32[j][k]);
+                } else {
+                    A->data.F64[j][k] = (psF64) alpha->data.F32[j][k];
+                }
+            }
+        }
+        for (j=0;j<numParams;j++) {
+            psTrace(".psLib.dataManip.psMinimize", 6, "Matrix A[][]:\n");
+            for (k=0;k<numParams;k++) {
+                psTrace(".psLib.dataManip.psMinimize", 6, "%f ", A->data.F64[j][k]);
+            }
+            psTrace(".psLib.dataManip.psMinimize", 6, "Matrix A[][]:\n");
+        }
+
+        //
+        // Solve A * alpha = Beta
+        //
+        // XXX: How do we know if these functions were successful?
+        //
+        aOut = psMatrixLUD(aOut, &perm, A);
+        paramDeltasF64 = psMatrixLUSolve(paramDeltasF64, aOut, beta, perm);
+
+        //
+        // Mask any masked parameters.
+        //
+        for (i=0;i<numParams;i++) {
+            psTrace(".psLib.dataManip.psMinimize", 6,
+                    "paramDeltasF64->data.F64[%d] is %f.\n", i, paramDeltasF64->data.F64[i]);
+            if ((paramMask != NULL) && (paramMask->data.U8[i] != 0)) {
+                newParams->data.F32[i] = origParams->data.F32[i];
+            } else {
+                newParams->data.F32[i] = params->data.F32[i] -
+                                         (psF32) paramDeltasF64->data.F64[i];
+            }
+        }
+
+        psTrace(".psLib.dataManip.psMinimize", 6,
+                "Calling func() with new parameters:\n");
+        for (i=0;i<numParams;i++) {
+            psTrace(".psLib.dataManip.psMinimize", 6,
+                    "newParams->data.F32[%d] is %f.\n", i, newParams->data.F32[i]);
+        }
+
+
+        //
+        // Calculate new function values.
+        //
+        newChi2 = 0.0;
+        newValueVec = func(deriv, newParams, x);
+        for (n=0;n<numData;n++) {
+            newChi2+= (newValueVec->data.F32[n] - y->data.F32[n]) *
+                      (newValueVec->data.F32[n] - y->data.F32[n]);
+
+        }
+        psFree(newValueVec);
+
+        psTrace(".psLib.dataManip.psMinimize", 4,
+                "old/new chi-squareds are (%f, %f)\n", currChi2, newChi2);
+
+        //
+        // If the new chi-squared is lower, then keep it.
+        //
+        if (currChi2 > newChi2) {
+            min->lastDelta = (currChi2 - newChi2)/currChi2;
+            min->value = newChi2;
+
+            // We already masked params.
+            for (i=0;i<numParams;i++) {
+                params->data.F32[i] = (psF32) newParams->data.F32[i];
+            }
+            lamda*= 0.1;
+            psTrace(".psLib.dataManip.psMinimize", 4, "*** Reducing lamda by factor of 10\n");
+        } else {
+            lamda*= 10.0;
+            psTrace(".psLib.dataManip.psMinimize", 4, "*** Increasing lamda by factor of 10\n");
+        }
+        psTrace(".psLib.dataManip.psMinimize", 4,
+                "lamda is %f\n", lamda);
+        min->iter++;
+    }
+    psFree(beta);
+    psFree(perm);
+    psFree(paramDeltasF64);
+    psFree(origParams);
+    psFree(newParams);
+    psFree(alpha);
+    psFree(A);
+    psFree(aOut);
+    psFree(deriv);
+
+    if ((min->iter < min->maxIter) ||
+            (min->lastDelta <= min->tol)) {
+        return(true);
+    }
+
+    psTrace(".psLib.dataManip.psMinimize", 4,
+            "---- psMinimizeLMChi2() end (false) ----\n");
+    return(false);
+}
+
+/******************************************************************************
+VectorFitPolynomial1DCheb():  This routine will fit a Chebyshev polynomial of
+degree myPoly to the data points (x, y) and return the coefficients of that
+polynomial.
+ 
+XXX: yErr is currently ignored.
+ 
+XXX: Use private name?
+*****************************************************************************/
+psPolynomial1D *VectorFitPolynomial1DCheby(psPolynomial1D* myPoly,
+        const psVector* x,
+        const psVector* y,
+        const psVector* yErr)
+{
+    psS32 j;
+    psS32 k;
+    psS32 n = x->n;
+    psF64 fac;
+    psF64 sum;
+    PS_VECTOR_GEN_STATIC_RECYCLED(f, n, PS_TYPE_F64);
+    psScalar *fScalar;
+    psScalar tmpScalar;
+    tmpScalar.type.type = PS_TYPE_F64;
+
+    // XXX: These assignments appear too simple to warrant code and
+    // variable declarations.  I retain them here to maintain coherence
+    // with the NR code.
+    psF64 min = -1.0;
+    psF64 max = 1.0;
+    psF64 bma = 0.5 * (max-min);  // 1
+    psF64 bpa = 0.5 * (max+min);  // 0
+
+    // In this loop, we first calculate the values of X for which the
+    // Chebyshev polynomials are zero (see NR, section 5.4).  Then we
+    // calculate the value of the function we are fitting the Chebyshev
+    // polynomials to at those values of X.  This is a bit tricky since
+    // we don't know that function.  So, we instead do 3-order LaGrange
+    // interpolation at the point X for the psVectors x,y for which we
+    // are fitting this ChebyShev polynomial to.
+
+    for (psS32 i=0;i<n;i++) {
+        // NR 5.8.4
+        psF64 Y = cos(PS_PI * (0.5 + ((psF32) i)) / ((psF32) n));
+        psF64 X = (Y + bma + bpa) - 1.0;
+        tmpScalar.data.F64 = X;
+
+        // We interpolate against are tabluated x,y vectors to determine the
+        // function value at X.
+        fScalar = p_psVectorInterpolate((psVector *) x,
+                                        (psVector *) y,
+                                        3,
+                                        &tmpScalar);
+
+        f->data.F64[i] = fScalar->data.F64;
+        psFree(fScalar);
+
+        psTrace(".psLib.dataManip.VectorFitPolynomial1DCheby", 6,
+                "(x, X, y, f(X)) is (%f, %f, %f, %f)\n",
+                x->data.F64[i], X, y->data.F64[i], f->data.F64[i]);
+    }
+
+    // We have the values for f() at the zero points, we now calculate the
+    // coefficients of the Chebyshev polynomial: NR 5.8.7.
+
+    fac = 2.0/((psF32) n);
+    // XXX: is this loop bound correct?
+    for (j=0;j<myPoly->n;j++) {
+        sum = 0.0;
+        for (k=0;k<n;k++) {
+            sum+= f->data.F64[k] *
+                  cos(PS_PI * ((psF32) j) * (0.5 + ((psF32) k)) / ((psF32) n));
+        }
+
+        myPoly->coeff[j] = fac * sum;
+    }
+
+    return(myPoly);
+}
+
+/******************************************************************************
+VectorFitPolynomial1DOrd():  This routine will fit an ordinary polynomial of
+degree myPoly to the data points (x, y) and return the coefficients of that
+polynomial.
+ 
+XXX: Use private name?
+XXX: Use recycled vectors.
+ *****************************************************************************/
+psPolynomial1D* VectorFitPolynomial1DOrd(psPolynomial1D* myPoly,
+        const psVector* x,
+        const psVector* y,
+        const psVector* yErr)
+{
+    psS32 polyOrder = myPoly->n;
+    psImage* A = NULL;
+    psImage* ALUD = NULL;
+    psVector* B = NULL;
+    psVector* outPerm = NULL;
+    psVector* X = NULL;         // NOTE: do we need this?
+    psVector* coeffs = NULL;
+    psS32 i = 0;
+    psS32 j = 0;
+    psS32 k = 0;
+    psVector* xSums = NULL;
+
+    psTrace(".psLib.dataManip.VectorFitPolynomial1DOrd", 4,
+            "---- VectorFitPolynomial1DOrd() begin ----\n");
+    // printf("VectorFitPolynomial1D()\n");
+    // for (i=0;i<x->n;i++) {
+    // printf("(x, y, yErr) is (%f, %f, %f)\n", x->data.F64[i], y->data.F64[i], yErr->data.F64[i]);
+    // }
+
+    A = psImageAlloc(polyOrder, polyOrder, PS_TYPE_F64);
+    ALUD = psImageAlloc(polyOrder, polyOrder, PS_TYPE_F64);
+
+    B = psVectorAlloc(polyOrder, PS_TYPE_F64);
+    coeffs = psVectorAlloc(polyOrder, PS_TYPE_F64);
+    X = psVectorAlloc(x->n, PS_TYPE_F64);
+    xSums = psVectorAlloc(1 + 2 * polyOrder, PS_TYPE_F64);
+
+    // Initialize data structures.
+    for (i = 0; i < polyOrder; i++) {
+        B->data.F64[i] = 0.0;
+        coeffs->data.F64[i] = 0.0;
+        for (j = 0; j < polyOrder; j++) {
+            A->data.F64[i][j] = 0.0;
+            ALUD->data.F64[i][j] = 0.0;
+        }
+    }
+    for (i = 0; i < X->n; i++) {
+        X->data.F64[i] = x->data.F64[i];
+    }
+
+    // Build the B and A data structs.
+    if (yErr == NULL) {
+        for (i = 0; i < X->n; i++) {
+            psBuildSums1D(X->data.F64[i], 2 * polyOrder, xSums);
+
+            for (k = 0; k < polyOrder; k++) {
+                B->data.F64[k] += y->data.F64[i] * xSums->data.F64[k];
+            }
+
+            for (k = 0; k < polyOrder; k++) {
+                for (j = 0; j < polyOrder; j++) {
+                    A->data.F64[k][j] += xSums->data.F64[k + j];
+                }
+            }
+        }
+    } else {
+        for (i = 0; i < X->n; i++) {
+            psBuildSums1D(X->data.F64[i], 2 * polyOrder, xSums);
+
+            for (k = 0; k < polyOrder; k++) {
+                B->data.F64[k] += y->data.F64[i] * xSums->data.F64[k] /
+                                  yErr->data.F64[i];
+            }
+
+            for (k = 0; k < polyOrder; k++) {
+                for (j = 0; j < polyOrder; j++) {
+                    A->data.F64[k][j] += xSums->data.F64[k + j] /
+                                         yErr->data.F64[i];
+                }
+            }
+        }
+    }
+
+    // XXX: How do we know if these routines were successful?
+    ALUD = psMatrixLUD(ALUD, &outPerm, A);
+    coeffs = psMatrixLUSolve(coeffs, ALUD, B, outPerm);
+
+    for (k = 0; k < polyOrder; k++) {
+        myPoly->coeff[k] = coeffs->data.F64[k];
+        // printf("myPoly->coeff[%d] is %f\n", k, myPoly->coeff[k]);
+    }
+
+    psFree(A);
+    psFree(ALUD);
+    psFree(B);
+    psFree(coeffs);
+    psFree(X);
+    psFree(outPerm);
+    psFree(xSums);
+
+    psTrace(".psLib.dataManip.VectorFitPolynomial1DOrd", 4,
+            "---- VectorFitPolynomial1DOrd() begin ----\n");
+    return (myPoly);
+}
+
+/******************************************************************************
+psVectorFitPolynomial1D():  This routine must fit a polynomial of degree
+myPoly to the data points (x, y) and return the coefficients of that
+polynomial.
+ 
+XXX: type F32 is done via vector conversion only.
+ *****************************************************************************/
+psPolynomial1D* psVectorFitPolynomial1D(psPolynomial1D* myPoly,
+                                        const psVector* x,
+                                        const psVector* y,
+                                        const psVector* yErr)
+{
+    PS_POLY_CHECK_NULL(myPoly, NULL);
+    PS_INT_CHECK_NON_NEGATIVE(myPoly->n, NULL);
+    PS_VECTOR_CHECK_NULL(y, NULL);
+    PS_VECTOR_CHECK_EMPTY(y, NULL);
+    PS_VECTOR_CHECK_TYPE_F32_OR_F64(y, NULL);
+
+    psS32 i;
+    psVector *x64 = NULL;
+    psVector *y64 = NULL;
+    psVector *yErr64 = NULL;
+    static psVector *x64Static = NULL;
+    static psVector *y64Static = NULL;
+    static psVector *yErr64Static = NULL;
+
+    PS_VECTOR_CONVERT_F32_TO_F64_STATIC(y, y64, y64Static);
+    // If yErr==NULL, set all errors equal.
+    if (yErr == NULL) {
+        PS_VECTOR_GEN_YERR_STATIC_F64(yErr64Static, y->n);
+        yErr64 = yErr64Static;
+    } else {
+        PS_VECTOR_CHECK_TYPE_F32_OR_F64(yErr, NULL);
+        PS_VECTOR_CONVERT_F32_TO_F64_STATIC(yErr, yErr64, yErr64Static);
+    }
+
+    // If x==NULL, create an x64 vector with x values set to (0:n).
+    if (x == NULL) {
+        PS_VECTOR_GEN_X_INDEX_STATIC_F64(x64Static, y->n);
+        if (myPoly->type == PS_POLYNOMIAL_CHEB) {
+            p_psNormalizeVectorRangeF64(x64Static, -1.0, 1.0);
+        }
+        x64 = x64Static;
+    } else {
+        PS_VECTOR_CHECK_TYPE_F32_OR_F64(x, NULL);
+        PS_VECTOR_CONVERT_F32_TO_F64_STATIC(x, x64, x64Static);
+        if (myPoly->type == PS_POLYNOMIAL_CHEB) {
+            p_psNormalizeVectorRangeF64(x64, -1.0, 1.0);
+        }
+    }
+    PS_VECTOR_CHECK_SIZE_EQUAL(x64, y64, NULL);
+    PS_VECTOR_CHECK_SIZE_EQUAL(yErr64, y64, NULL);
+
+    // Call the appropriate vector fitting routine.
+    psPolynomial1D *rc = NULL;
+    if (myPoly->type == PS_POLYNOMIAL_CHEB) {
+        rc = VectorFitPolynomial1DCheby(myPoly, x64, y64, yErr64);
+    } else if (myPoly->type == PS_POLYNOMIAL_ORD) {
+        rc = VectorFitPolynomial1DOrd(myPoly, x64, y64, yErr64);
+    } else {
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true,
+                "unknown polynomial type.\n");
+        return(NULL);
+    }
+    if (rc == NULL) {
+        psError(PS_ERR_UNKNOWN, true, "Could not fit a polynomial to the data.  Returning NULL.\n");
+        return(NULL);
+    }
+
+    return(myPoly);
+}
+
+
+
+/******************************************************************************
+ *****************************************************************************/
+psMinimization *psMinimizationAlloc(psS32 maxIter,
+                                    psF32 tol)
+{
+    PS_INT_CHECK_NON_NEGATIVE(maxIter, NULL);
+
+    psMinimization *min = psAlloc(sizeof(psMinimization));
+    min->maxIter = maxIter;
+    min->tol = tol;
+    min->value = 0.0;
+    min->iter = 0;
+    min->lastDelta = 0.0;
+
+    return(min);
+}
+
+// This macro takes as input the vector BASE and adds a multiple of the vector
+// LINE to it.  We assume BASEMASK is non-null.
+#define PS_VECTOR_ADD_MULTIPLE(BASE, BASEMASK, LINE, OUT, MUL) \
+for (psS32 i=0;i<BASE->n;i++) { \
+    if (BASEMASK->data.U8[i] == 0) { \
+        OUT->data.F32[i] = BASE->data.F32[i] + (MUL * LINE->data.F32[i]); \
+    } else { \
+        OUT->data.F32[i] = BASE->data.F32[i]; \
+    } \
+} \
+
+#define PS_VECTOR_F32_CHECK_ZERO_VECTOR(IN, BOOL_VAR) \
+BOOL_VAR = true; \
+for (psS32 i=0;i<IN->n;i++) { \
+    if (fabs(IN->data.F32[i]) >= FLT_EPSILON) { \
+        BOOL_VAR = false; \
+        break; \
+    } \
+} \
+
+#define PS_VECTOR_WITH_MASK_F32_CHECK_ZERO_VECTOR(IN, INMASK, BOOL_VAR) \
+BOOL_VAR = true; \
+for (psS32 i=0;i<IN->n;i++) { \
+    if ((INMASK->data.U8[i] == 0) && (fabs(IN->data.F32[i]) >= FLT_EPSILON)) { \
+        BOOL_VAR = false; \
+        break; \
+    } \
+} \
+
+
+/******************************************************************************
+p_psDetermineBracket():  This routine takes as input an arbitrary function,
+and the parameter to vary, and the line along which it must vary.  This
+function produces as output a bracket [a, b, c] such that
+f(param + b * line) < f(param + a * line)
+f(param + b * line) < f(param + c * line)
+a < b < c
+ 
+Algorithm:
+ 
+XXX completely ad hoc:
+start with the user-supplied starting parameter and
+call that b.  Calculate a/c as a fractional amount smaller/larger than b.
+Repeat this process until a local minimum is found.
+ 
+XXX:
+new algorithm:
+start at x=0, expand in one direction until the function
+decreases.  Then you have two points in the bracket.  Keep going until it
+increases, or x is too large.  If thst does not work, expand in the other
+direction.
+ 
+XXX:
+This is F32 only.
+ 
+XXX:
+output bracket vector should be an input as well.
+*****************************************************************************/
+psVector *p_psDetermineBracket(psVector *params,
+                               psVector *line,
+                               const psVector *paramMask,
+                               const psArray *coords,
+                               psMinimizePowellFunc func)
+{
+    psF32 a = 0.0;
+    psF32 b = 0.0;
+    psF32 c = 0.0;
+    psF32 fa = 0.0;
+    psF32 fb = 0.0;
+    psF32 fc = 0.0;
+    psS32 iter = 100;
+    psF32 aDir = 0.0;
+    psF32 cDir = 0.0;
+    psF32 new_aDir = 0.0;
+    psF32 new_cDir = 0.0;
+    psVector *bracket = psVectorAlloc(3, PS_TYPE_F32);
+    psF32 stepSize = PS_DETERMINE_BRACKET_STEP_SIZE;
+    psVector *tmp = NULL;
+    psBool boolLineIsNull = true;
+
+    psTrace(".psLib.dataManip.p_psDetermineBracket", 4,
+            "---- p_psDetermineBracket() begin ----\n");
+
+    // If the line vector is zero, then return NULL.
+    PS_VECTOR_WITH_MASK_F32_CHECK_ZERO_VECTOR(params, paramMask, boolLineIsNull);
+    if (boolLineIsNull == true) {
+        psTrace(".psLib.dataManip.p_psDetermineBracket", 2,
+                "p_psDetermineBracket() called with zero line vector.\n");
+        psTrace(".psLib.dataManip.p_psDetermineBracket", 4,
+                "---- p_psDetermineBracket() end (NULL) ----\n");
+        psFree(bracket);
+        return(NULL);
+    }
+
+    tmp = psVectorAlloc(params->n, PS_TYPE_F32);
+
+    b = 0;
+    a = -stepSize;
+    c = stepSize;
+
+    PS_VECTOR_ADD_MULTIPLE(params, paramMask, line, tmp, a);
+    fa = func(tmp, coords);
+
+    PS_VECTOR_ADD_MULTIPLE(params, paramMask, line, tmp, b);
+    fb = func(tmp, coords);
+
+    PS_VECTOR_ADD_MULTIPLE(params, paramMask, line, tmp, c);
+    fc = func(tmp, coords);
+
+    if (fa < fb) {
+        aDir = -1;
+    } else {
+        aDir = 1;
+    }
+
+    if (fc < fb) {
+        cDir = -1;
+    } else {
+        cDir = 1;
+    }
+
+    psTrace(".psLib.dataManip.p_psDetermineBracket", 6,
+            "(a, b, c) is (%f %f %f) (fa, fb, fc) is (%f %f %f)\n", a, b, c, fa, fb, fc);
+
+    while (iter > 0) {
+        psTrace(".psLib.dataManip.p_psDetermineBracket", 6,
+                "psDetermineBracket(): iteration %d\n", iter);
+        if ((fb < fa) && (fb < fc)) {
+            bracket->data.F32[0] = a;
+            bracket->data.F32[1] = b;
+            bracket->data.F32[2] = c;
+            psFree(tmp);
+            psTrace(".psLib.dataManip.p_psDetermineBracket", 6,
+                    "---- p_psDetermineBracket() end ----\n");
+            return(bracket);
+        }
+        stepSize*= (1.0 + stepSize);
+        a =- stepSize;
+        c =+ stepSize;
+
+        PS_VECTOR_ADD_MULTIPLE(params, paramMask, line, tmp, a);
+        fa = func(tmp, coords);
+
+        PS_VECTOR_ADD_MULTIPLE(params, paramMask, line, tmp, c);
+        fc = func(tmp, coords);
+
+        psTrace(".psLib.dataManip.p_psDetermineBracket", 6,
+                "Iter(%d): (a, b, c) is (%f %f %f) (fa, fb, fc) is (%f %f %f)\n", iter, a, b, c, fa, fb, fc);
+
+        if (fa < fb) {
+            new_aDir = -1;
+        } else {
+            new_aDir = 1;
+        }
+
+        if (fc < fb) {
+            new_cDir = -1;
+        } else {
+            new_cDir = 1;
+        }
+        if ((new_aDir == 1) && (aDir == -1)) {
+            bracket->data.F32[0] = a;
+            bracket->data.F32[1] = b;
+            bracket->data.F32[2] = c;
+            psFree(tmp);
+            psTrace(".psLib.dataManip.p_psDetermineBracket", 4,
+                    "---- p_psDetermineBracket() end ----\n");
+            return(bracket);
+        }
+
+        if ((new_cDir == 1) && (cDir == -1)) {
+            bracket->data.F32[0] = a;
+            bracket->data.F32[1] = b;
+            bracket->data.F32[2] = c;
+            psFree(tmp);
+            psTrace(".psLib.dataManip.p_psDetermineBracket", 4,
+                    "---- p_psDetermineBracket() end ----\n");
+            return(bracket);
+        }
+        aDir = new_aDir;
+        cDir = new_cDir;
+        iter--;
+    }
+    psFree(tmp);
+    psFree(bracket);
+    psTrace(".psLib.dataManip.p_psDetermineBracket", 4,
+            "---- p_psDetermineBracket() end (NULL) ----\n");
+    return(NULL);
+}
+
+
+#define RETURN_FINAL_BRACKET(d) \
+if (a < c) { \
+    bracket->data.F32[0] = a; \
+    bracket->data.F32[1] = b; \
+    bracket->data.F32[2] = c; \
+} else { \
+    bracket->data.F32[0] = c; \
+    bracket->data.F32[1] = b; \
+    bracket->data.F32[2] = a; \
+} \
+psTrace(".psLib.dataManip.p_psDetermineBracket", 4, \
+        "---- p_psDetermineBracket() end ----\n"); \
+psTrace(".psLib.dataManip.p_psDetermineBracket", 4, "Final bracket (a, b, c) is (%f %f %f) (fa, fb, fc) is (%f %f %f)\n", a, b, c, fa, fb, fc); \
+return(bracket); \
+
+#define PS_DETERMINE_BRACKET_MAX_ITERATIONS 100
+psVector *p_psDetermineBracket2(psVector *params,
+                                psVector *line,
+                                const psVector *paramMask,
+                                const psArray *coords,
+                                psMinimizePowellFunc func)
+{
+    psF32 a = 0.0;
+    psF32 b = 0.0;
+    psF32 c = 0.0;
+    psF32 fa = 0.0;
+    psF32 fb = 0.0;
+    psF32 fc = 0.0;
+    psS32 iter = 0;
+    PS_VECTOR_GEN_STATIC_RECYCLED(tmp, params->n, PS_TYPE_F32);
+    psBool boolLineIsNull = true;
+    psF32 prevMin = 0.0;
+    psS32 countMin = 0;
+
+    psTrace(".psLib.dataManip.p_psDetermineBracket", 4,
+            "---- p_psDetermineBracket() begin ----\n");
+
+    // If the line vector is zero, then return NULL.
+    PS_VECTOR_WITH_MASK_F32_CHECK_ZERO_VECTOR(params, paramMask, boolLineIsNull);
+    if (boolLineIsNull == true) {
+        psTrace(".psLib.dataManip.p_psDetermineBracket", 2,
+                "p_psDetermineBracket() called with zero line vector.\n");
+        psTrace(".psLib.dataManip.p_psDetermineBracket", 4,
+                "---- p_psDetermineBracket() end (NULL) ----\n");
+        return(NULL);
+    }
+
+    // We determine in what x-direction does the function decrease.
+    a = 0.0;
+    fa = func(params, coords);
+    b = 0.5;
+    iter = 0;
+    do {
+        b*= (1.0 + PS_DETERMINE_BRACKET_STEP_SIZE);
+        PS_VECTOR_ADD_MULTIPLE(params, paramMask, line, tmp, b);
+        fb = func(tmp, coords);
+    } while ((fabs(fb - fa) < FLT_EPSILON) && (iter++ < 100));
+
+    if (fb > fa) {
+        a = b;
+        fa = fb;
+        b = 0.0;
+        fb = func(params, coords);
+    }
+    c = b;
+
+    // At this point we have (a, b) and we know that (fa >= fb).  Initially, c=b;
+    // We keep stretching b out further from "a" until (fc > previous fc).  If
+    // that happens, then we have our bracket.
+    psVector *bracket = psVectorAlloc(3, PS_TYPE_F32);
+    iter = 0;
+    while (iter < PS_DETERMINE_BRACKET_MAX_ITERATIONS) {
+        psTrace(".psLib.dataManip.p_psDetermineBracket", 6,
+                "psDetermineBracket(): iterationA %d\n", iter);
+        c+= (1.0 + PS_DETERMINE_BRACKET_STEP_SIZE) * (c - a);
+
+        PS_VECTOR_ADD_MULTIPLE(params, paramMask, line, tmp, c);
+        fc = func(tmp, coords);
+
+        psTrace(".psLib.dataManip.p_psDetermineBracket", 6,
+                "Iteration(%d) (bracket): (a, b, c) is (%f %f %f) (fa, fb, fc) is (%f %f %f)\n", iter, a, b, c, fa, fb, fc);
+
+        if ((fb < fa) && (fb < fc)) {
+            RETURN_FINAL_BRACKET();
+        } else {
+            b = c;
+            fb = fc;
+        }
+
+        // This code maintains a count of how many times the minimum fc has
+        // stayed the same.  If it gets too high, we exit this loop.
+        if (fc == prevMin) {
+            countMin++;
+        } else {
+            countMin = 0;
+        }
+        prevMin = fc;
+        if (countMin == 10) {
+            RETURN_FINAL_BRACKET();
+        }
+
+        iter++;
+    }
+
+    psFree(bracket);
+    psTrace(".psLib.dataManip.p_psDetermineBracket", 4,
+            "---- p_psDetermineBracket() end (NULL) (BAD) ----\n");
+    return(NULL);
+}
+
+/******************************************************************************
+This routine takes as input a possibly multi-dimensional function, along
+with an initial guess at the parameters of that function and vector "line"
+of the same size as the parameter vector.  It will minimize the function
+along that vector and returns the offset along that vector at which the
+minimum is determined.
+ 
+XXX: This routine is not very efficient in terms of total evaluations of the
+function.
+XXX: This is F32 only
+XXX: Since this is an internal function, many of the parameter checks are
+     redundant.
+XXX: Don't modify the psMinimization argument.
+ *****************************************************************************/
+#define PS_LINEMIN_MAX_ITERATIONS 30
+psF32 p_psLineMin(psMinimization *min,
+                  psVector *params,
+                  psVector *line,
+                  const psVector *paramMask,
+                  const psArray *coords,
+                  psMinimizePowellFunc func)
+{
+    PS_PTR_CHECK_NULL(min, NAN);
+    PS_VECTOR_CHECK_NULL(params, NAN);
+    PS_VECTOR_CHECK_EMPTY(params, NAN);
+    PS_VECTOR_CHECK_TYPE(params, PS_TYPE_F32, NAN);
+    PS_VECTOR_CHECK_NULL(line, NAN);
+    PS_VECTOR_CHECK_EMPTY(line, NAN);
+    PS_VECTOR_CHECK_TYPE(line, PS_TYPE_F32, NAN);
+    PS_VECTOR_CHECK_NULL(paramMask, NAN);
+    PS_VECTOR_CHECK_EMPTY(paramMask, NAN);
+    PS_VECTOR_CHECK_TYPE(paramMask, PS_TYPE_U8, NAN);
+    PS_PTR_CHECK_NULL(coords, NAN);
+    PS_PTR_CHECK_NULL(func, NAN);
+    psVector *bracket;
+    psF32 a = 0.0;
+    psF32 b = 0.0;
+    psF32 c = 0.0;
+    psF32 n = 0.0;
+    psF32 fa = 0.0;
+    psF32 fb = 0.0;
+    psF32 fc = 0.0;
+    psF32 fn = 0.0;
+    psF32 mul = 0.0;
+    PS_VECTOR_GEN_STATIC_RECYCLED(tmpa, params->n, PS_TYPE_F32);
+    PS_VECTOR_GEN_STATIC_RECYCLED(tmpb, params->n, PS_TYPE_F32);
+    PS_VECTOR_GEN_STATIC_RECYCLED(tmpc, params->n, PS_TYPE_F32);
+    PS_VECTOR_GEN_STATIC_RECYCLED(tmpn, params->n, PS_TYPE_F32);
+    psS32 i = 0;
+    psS32 boolLineIsNull = true;
+    psS32 numIterations = 0;
+
+    psTrace(".psLib.dataManip.p_psLineMin", 4, "---- p_psLineMin() begin ----\n");
+    PS_VECTOR_F32_CHECK_ZERO_VECTOR(line, boolLineIsNull);
+
+    if (boolLineIsNull == true) {
+        min->value = func(params, coords);
+        psTrace(".psLib.dataManip.p_psLineMin", 2,
+                "p_psLineMin() called with zero line vector.  Return 0.0.  Function value is %f\n", min->value);
+        return(0.0);
+    }
+
+    for (i=0;i<params->n;i++) {
+        psTrace(".psLib.dataManip.p_psLineMin", 6,
+                "(params, paramMask, line)[%d] is (%f %d %f)\n", i,
+                params->data.F32[i],
+                paramMask->data.U8[i],
+                line->data.F32[i]);
+    }
+
+    bracket = p_psDetermineBracket2(params, line, paramMask, coords, func);
+    if (bracket == NULL) {
+        psError(PS_ERR_UNKNOWN, false,
+                "Could not bracket minimum.  Returning NAN.\n");
+        return(NAN);
+    }
+    numIterations = 0;
+    while (numIterations < PS_LINEMIN_MAX_ITERATIONS) {
+        numIterations++;
+        psTrace(".psLib.dataManip.p_psLineMin", 6,
+                "p_psLineMin(): iteration %d\n", numIterations);
+
+        a = bracket->data.F32[0];
+        b = bracket->data.F32[1];
+        c = bracket->data.F32[2];
+        PS_VECTOR_ADD_MULTIPLE(params, paramMask, line, tmpa, a);
+        PS_VECTOR_ADD_MULTIPLE(params, paramMask, line, tmpb, b);
+        PS_VECTOR_ADD_MULTIPLE(params, paramMask, line, tmpc, c);
+        fa = func(tmpa, coords);
+        fb = func(tmpb, coords);
+        fc = func(tmpc, coords);
+        psTrace(".psLib.dataManip.p_psLineMin", 6,
+                "LineMin: f(%f %f %f) is (%f %f %f)\n", a, b, c, fa, fb, fc);
+
+        // We determine which is the biggest segment in [a,b,c] then split
+        // that with the point n.
+        if ((b-a) > (c-b)) {
+            // This is the golden section formula
+            n = a + (0.69 * (b-a));
+            for (i=0;i<params->n;i++) {
+                tmpn->data.F32[i] = params->data.F32[i] + (n * line->data.F32[i]);
+            }
+            fn = func(tmpn, coords);
+
+            if (fn > fb) {
+                // a = n, b = b, c = c
+                bracket->data.F32[0] = n;
+            } else {
+                // a = a, b = n, c = b
+                bracket->data.F32[1] = n;
+                bracket->data.F32[2] = b;
+            }
+        } else {
+            n = b + (0.69 * (c-b));
+            for (i=0;i<params->n;i++) {
+                tmpn->data.F32[i] = params->data.F32[i] + (n * line->data.F32[i]);
+            }
+            fn = func(tmpn, coords);
+
+            if (fn > fb) {
+                // a = a, b = b, c = n
+                bracket->data.F32[2] = n;
+            } else {
+                // a = b, b = n, c = c
+                bracket->data.F32[0] = b;
+                bracket->data.F32[1] = n;
+            }
+        }
+        psTrace(".psLib.dataManip.p_psLineMin", 6,
+                "LineMin: new bracket is (%f %f %f)\n", bracket->data.F32[0], bracket->data.F32[1], bracket->data.F32[2]);
+
+        mul = bracket->data.F32[1];
+        if ((fabs(a-b) < min->tol) && (fabs(b-c) < min->tol)) {
+            PS_VECTOR_ADD_MULTIPLE(params, paramMask, line, params, mul);
+            min->value = func(params, coords);
+            psFree(bracket);
+            psTrace(".psLib.dataManip.p_psLineMin", 4,
+                    "---- p_psLineMin() end.a (%f) (%f) ----\n", mul, min->value);
+            return(mul);
+        }
+    }
+
+    mul = bracket->data.F32[1];
+    PS_VECTOR_ADD_MULTIPLE(params, paramMask, line, params, mul);
+    min->value = func(params, coords);
+    psTrace(".psLib.dataManip.p_psLineMin", 4,
+            "---- p_psLineMin() end.b (%f) %f ----\n", mul, min->value);
+
+    psFree(bracket);
+    return(mul);
+}
+
+
+/******************************************************************************
+This routine must minimize a possibly multi-dimensional function.  The
+function to be minimized "func" is:
+    psF32 func(psVector *params, psArray *coords)
+The "params" are the parameters of the function which are varied.  The data
+points at which the function is varied are in the argument "coords" which is
+a psArray of psVectors: each vector represents a different coordinate.
+ 
+XXX: We do not use Brent's method.
+ 
+XXX: The SDR is silent about data types.  F32 is implemented here.
+ 
+XXX: Check for F32 types?
+ *****************************************************************************/
+#define PS_MINIMIZE_POWELL_LINEMIN_MAX_ITERATIONS 20
+#define PS_MINIMIZE_POWELL_LINEMIN_ERROR_TOLERANCE 0.01
+
+psBool psMinimizePowell(psMinimization *min,
+                        psVector *params,
+                        const psVector *paramMask,
+                        const psArray *coords,
+                        psMinimizePowellFunc func)
+{
+    PS_PTR_CHECK_NULL(min, NULL);
+    PS_VECTOR_CHECK_NULL(params, NULL);
+    PS_VECTOR_CHECK_EMPTY(params, NULL);
+    PS_VECTOR_CHECK_TYPE(params, PS_TYPE_F32, NULL);
+    PS_PTR_CHECK_NULL(coords, NULL);
+    PS_PTR_CHECK_NULL(func, NULL);
+    psS32 numDims = params->n;
+    PS_VECTOR_GEN_STATIC_RECYCLED(pQP, numDims, PS_TYPE_F32);
+    PS_VECTOR_GEN_STATIC_RECYCLED(u, numDims, PS_TYPE_F32);
+    PS_VECTOR_GEN_STATIC_RECYCLED(Q, numDims, PS_TYPE_F32);
+    psS32 i = 0;
+    psS32 j = 0;
+    psVector *myParamMask = NULL;
+    psMinimization dummyMin;
+    psF32 mul = 0.0;
+    psF32 baseFuncVal = 0.0;
+    psF32 currFuncVal = 0.0;
+    psS32 biggestIter = 0;
+    psF32 biggestDiff = 0.0;
+    psS32 iterationNumber = 0;
+
+    psTrace(".psLib.dataManip.psMinimizePowell", 4,
+            "---- psMinimizePowell() begin ----\n");
+    psTrace(".psLib.dataManip.psMinimizePowell", 6,
+            "min->maxIter is %d\n", min->maxIter);
+    psTrace(".psLib.dataManip.psMinimizePowell", 6,
+            "min->tol is %f\n", min->tol);
+
+    if (paramMask == NULL) {
+        myParamMask = psVectorRecycle(myParamMask, params->n, PS_TYPE_U8);
+        p_psMemSetPersistent(myParamMask, true);
+        p_psMemSetPersistent(myParamMask->data.U8, true);
+        for (i=0;i<myParamMask->n;i++) {
+            myParamMask->data.U8[i] = 0;
+        }
+    } else {
+        myParamMask = (psVector *) paramMask;
+    }
+    PS_VECTOR_CHECK_SIZE_EQUAL(params, myParamMask, NULL);
+
+    // 1: Set v[i] to be the unit vectors for each dimension in params
+    psArray *v = psArrayAlloc(numDims);
+    for (i=0;i<numDims;i++) {
+        (v->data[i]) = (psVector *) psVectorAlloc(numDims, PS_TYPE_F32);
+        for (j=0;j<numDims;j++) {
+            if (i == j) {
+                ((psVector *) (v->data[i]))->data.F32[j] = 1.0;
+            } else {
+                ((psVector *) (v->data[i]))->data.F32[j] = 0.0;
+            }
+        }
+    }
+
+    // 2: Set Q to be the initial params (P in the ADD)
+    for (i=0;i<numDims;i++) {
+        Q->data.F32[i] = params->data.F32[i];
+    }
+
+    while (iterationNumber < min->maxIter) {
+        iterationNumber++;
+        psTrace(".psLib.dataManip.psMinimizePowell", 6,
+                "psMinimizePowell() iteration %d\n", iterationNumber);
+
+        // 3: For each dimension in params, move Q only in the vector v[i] to
+        //    minimize the function.
+
+        baseFuncVal = func(Q, coords);
+        currFuncVal = baseFuncVal;
+        psTrace(".psLib.dataManip.psMinimizePowell", 6,
+                "Current function value is %f\n", currFuncVal);
+
+        biggestDiff = 0;
+        biggestIter = 0;
+        for (i=0;i<numDims;i++) {
+            if (myParamMask->data.U8[i] == 0) {
+                dummyMin.maxIter = PS_MINIMIZE_POWELL_LINEMIN_MAX_ITERATIONS;
+                dummyMin.tol = PS_MINIMIZE_POWELL_LINEMIN_ERROR_TOLERANCE;
+                mul = p_psLineMin(&dummyMin,
+                                  Q,
+                                  ((psVector *) v->data[i]),
+                                  myParamMask,
+                                  coords,
+                                  func);
+                if (isnan(mul)) {
+                    psError(PS_ERR_UNKNOWN, false,
+                            "Could not perform line minimization.  Returning FALSE.\n");
+                    psFree(v);
+                    return(false);
+                }
+                psTrace(".psLib.dataManip.psMinimizePowell", 6,
+                        "LineMin along dimension %d has multiple %f\n", i, mul);
+
+                if (fabs(dummyMin.value - currFuncVal) > biggestDiff) {
+                    biggestDiff = fabs(dummyMin.value - currFuncVal);
+                    biggestIter = i;
+                }
+                currFuncVal = dummyMin.value;
+            }
+        }
+        psTrace(".psLib.dataManip.psMinimizePowell", 6,
+                "New function value is %f\n", currFuncVal);
+
+        // 4: Set the vector u = Q - P
+        for (i=0;i<numDims;i++) {
+            if (myParamMask->data.U8[i] == 0) {
+                u->data.F32[i] = Q->data.F32[i] - params->data.F32[i];
+
+                psTrace(".psLib.dataManip.psMinimizePowell", 6,
+                        "u[i]=Q[i]-P[i] (%f = %f - %f)\n", u->data.F32[i],
+                        Q->data.F32[i],
+                        params->data.F32[i]);
+
+            } else {
+                u->data.F32[i] = 0.0;
+            }
+        }
+
+        // 5: Move Q only in the direction u, and minimize the function.
+        for (i=0;i<numDims;i++) {
+            psTrace(".psLib.dataManip.psMinimizePowell", 6,
+                    "u[i] is %f\n", u->data.F32[i]);
+        }
+
+        mul = p_psLineMin(&dummyMin, params, u, myParamMask, coords, func);
+        if (isnan(mul)) {
+            psError(PS_ERR_UNKNOWN, false,
+                    "Could not perform line minimization.  Returning FALSE.\n");
+            psFree(v);
+            return(false);
+        }
+
+        // 6:
+        if (dummyMin.value > currFuncVal) {
+            psFree(v);
+            min->iter = iterationNumber;
+            // XXX: Ensure that currFuncVal is the correct value to use here.
+            min->value = currFuncVal;
+            psTrace(".psLib.dataManip.psMinimizePowell", 4,
+                    "---- psMinimizePowell() end (1)(true) ----\n");
+            return(true);
+        }
+
+        for (i=0;i<numDims;i++) {
+            if (myParamMask->data.U8[i] == 0) {
+                pQP->data.F32[i] = (2 * Q->data.F32[i]) - params->data.F32[i];
+            } else {
+                pQP->data.F32[i] = params->data.F32[i];
+            }
+        }
+        psF32 fqp = func(pQP, coords);
+        psF32 term1 = (baseFuncVal - currFuncVal) - biggestDiff;
+        term1*= term1;
+        term1*= 2.0 * (baseFuncVal - (2.0 * currFuncVal) + fqp);
+        psF32 term2 = baseFuncVal - fqp;
+        term2*= term2 * biggestDiff;
+        if (term1 < term2) {
+            for (i=0;i<numDims;i++) {
+                if (myParamMask->data.U8[i] == 0) {
+                    ((psVector *) v->data[biggestIter])->data.F32[i] = u->data.F32[i];
+                }
+            }
+        }
+
+        // 7: Set P to Q
+        for (i=0;i<numDims;i++) {
+            if (myParamMask->data.U8[i] == 0) {
+                params->data.F32[i] = Q->data.F32[i];
+            }
+        }
+
+        // 8: Go to step 3 until the change is less than some tolerance.
+        if (fabs(baseFuncVal - currFuncVal) <= min->tol) {
+            psFree(v);
+            // XXX: Ensure that currFuncVal is the correct value to use here.
+            min->value = currFuncVal;
+            min->iter = iterationNumber;
+            psTrace(".psLib.dataManip.psMinimizePowell", 4,
+                    "---- psMinimizePowell() end (2) (true) ----\n");
+            return(true);
+        }
+    }
+
+    psFree(v);
+    min->iter = iterationNumber;
+    psTrace(".psLib.dataManip.psMinimizePowell", 4,
+            "---- psMinimizePowell() end (0) (false) ----\n");
+    return(false);
+}
+
+
+/******************************************************************************
+XXX: We assume unnormalized gaussians.
+XXX: Currently, yErr is ignored.
+ *****************************************************************************/
+psVector *psMinimizePowellChi2Gauss1D(const psVector *params,
+                                      const psArray *coords)
+{
+    PS_PTR_CHECK_NULL(coords, NULL);
+    PS_PTR_CHECK_NULL(params, NULL);
+
+    psF32 x;
+    psS32 i;
+    psF32 mean = params->data.F32[0];
+    psF32 stdev = params->data.F32[1];
+    psVector *out = psVectorAlloc(coords->n, PS_TYPE_F32);
+
+    for (i=0;i<coords->n;i++) {
+        x = ((psVector *) (coords->data[i]))->data.F32[0];
+        out->data.F32[i] = psGaussian(x, mean, stdev, false);
+    }
+
+    return(out);
+}
+
+/******************************************************************************
+This routine is to be used with the psMinimizeChi2Powell() function below.
+and the psMinimizePowell() function above.
+ 
+The basic idea is calculate chi-squared for a set of params/coords/errors.
+This functions uses global variables to receive the function pointer, the
+data values, and the data errors.
+XXX: This is F32 only
+ *****************************************************************************/
+psF32 myPowellChi2Func(const psVector *params,
+                       const psArray *coords)
+{
+    psTrace(".psLib.dataManip.myPowellChi2Func", 4,
+            "---- myPowellChi2Func() begin ----\n");
+    PS_VECTOR_CHECK_NULL(params, NAN);
+    PS_VECTOR_CHECK_EMPTY(params, NAN);
+    PS_VECTOR_CHECK_NULL(myValue, NAN);
+    PS_VECTOR_CHECK_EMPTY(myValue, NAN);
+    PS_PTR_CHECK_NULL(coords, NAN);
+
+    psF32 chi2 = 0.0;
+    psF32 d;
+    psS32 i;
+    psVector *tmp;
+
+    tmp = Chi2PowellFunc(params, coords);
+    if (myError == NULL) {
+        for (i=0;i<coords->n;i++) {
+            d = (tmp->data.F32[i] - myValue->data.F32[i]);
+            chi2+= d * d;
+        }
+    } else {
+        for (i=0;i<coords->n;i++) {
+            d = (tmp->data.F32[i] - myValue->data.F32[i]) / myError->data.F32[i];
+            chi2+= d * d;
+        }
+    }
+    psFree(tmp);
+    psTrace(".psLib.dataManip.myPowellChi2Func", 4,
+            "---- myPowellChi2Func() end (chi2 is %f) ----\n", chi2);
+    return(chi2);
+}
+
+
+/******************************************************************************
+This routine must minimize the chi-squared match of a set of data points and
+values for a possibly multi-dimensional function.
+ 
+The basic idea is to use the psMinimizePowell() function defined above.  In
+order to do so, we defined above a function myPowellChi2Func() which takes
+the "func" function and returns chi-squared over the params/coords/values.
+We then use that function myPowellChi2Func() in the call to
+psMinimizePowell().
+ *****************************************************************************/
+psBool psMinimizeChi2Powell(psMinimization *min,
+                            psVector *params,
+                            const psVector *paramMask,
+                            const psArray *coords,
+                            const psVector *value,
+                            const psVector *error,
+                            psMinimizeChi2PowellFunc func)
+{
+    myValue = (psVector *) value;
+    myError = (psVector *) error;
+
+    Chi2PowellFunc = func;
+
+    return(psMinimizePowell(min, params, paramMask, coords, myPowellChi2Func));
+}
+
+
Index: /tags/ipp-1-X/bug123/psLib/src/dataManip/psMinimize.h
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/dataManip/psMinimize.h	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/dataManip/psMinimize.h	(revision 22331)
@@ -0,0 +1,126 @@
+/** @file  psMinimize.c
+ *  \brief basic minimization functions
+ *  @ingroup Math
+ *
+ *  This file will contain function prototypes for various minimization,
+ *  chi-squared minimization, and 1-D polynomial fitting routines.
+ *
+ *  @author GLG, MHPCC
+ *
+ *  @version $Revision: 1.39 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-02-17 19:26:23 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ *
+ */
+
+#if !defined(PS_MINIMIZE_H)
+#define PS_MINIMIZE_H
+
+/** \file psMinimize.h
+ *  \brief minimization operations
+ *  \ingroup Stats
+ */
+/** \addtogroup Stats
+ *  \{
+ */
+
+#include "psVector.h"
+#include "psMemory.h"
+#include "psArray.h"
+#include "psImage.h"
+#include "psMatrix.h"
+#include "psFunctions.h"
+#include "psStats.h"
+#include "psTrace.h"
+#include "psError.h"
+#include "psConstants.h"
+
+typedef struct
+{
+    psS32 maxIter;                       ///< Convergence limit
+    psF32 tol;                         ///< Error Tolerance
+    psF32 value;                       ///< Value of function at minimum
+    psS32 iter;                          ///< Number of iterations required
+    psF32 lastDelta;                   ///< The last difference for the fit
+}
+psMinimization;
+
+psMinimization *psMinimizationAlloc(psS32 maxIter,
+                                    psF32 tol);
+
+/** Derive a polynomial fit.
+ *
+ *  psVectorFitPolynomial1d returns the polynomial that best fits the 
+ *  observations. The input parameters are a polynomial that specifies the 
+ *  fit order, myPoly, which will be altered and returned with the best-fit 
+ *  coefficients; and the observations, x, y and yErr. The independent 
+ *  variable list, x may be NULL, in which case the vector index is used. 
+ *  The dependent variable error, yErr may be null, in which case the solution 
+ *  is determined in the assumption that all data errors are equal. This 
+ *  function must be valid only for types psF32, psF64.
+ *
+ *  @return psPolynomial1D*    polynomial fit
+ */
+psPolynomial1D* psVectorFitPolynomial1D(
+    psPolynomial1D* myPoly,            ///< Polynomial to fit
+    const psVector* x,                 ///< Ordinates (or NULL to just use the indices)
+    const psVector* y,                 ///< Coordinates
+    const psVector* yErr               ///< Errors in coordinates, or NULL
+);
+
+psSpline1D *psVectorFitSpline1D(psSpline1D *mySpline,     ///< The spline which will be generated.
+                                const psVector* x,        ///< Ordinates (or NULL to just use the indices)
+                                const psVector* y,        ///< Coordinates
+                                const psVector* yErr      ///< Errors in coordinates, or NULL
+                               );
+
+typedef
+psVector* (*psMinimizeLMChi2Func)(psImage *deriv,
+                                  const psVector *params,
+                                  const psArray *x);
+
+psBool psMinimizeLMChi2(psMinimization *min,
+                        psImage *covar,
+                        psVector *params,
+                        const psVector *paramMask,
+                        const psArray *x,
+                        const psVector *y,
+                        const psVector *yErr,
+                        psMinimizeLMChi2Func func);
+
+typedef
+psF32 (*psMinimizePowellFunc)(const psVector *params,
+                              const psArray *coords);
+
+psBool psMinimizePowell(psMinimization *min,
+                        psVector *params,
+                        const psVector *paramMask,
+                        const psArray *coords,
+                        psMinimizePowellFunc func);
+
+psVector *psMinimizeLMChi2Gauss1D(psImage *deriv,
+                                  const psVector *params,
+                                  const psArray *coords);
+
+psVector *psMinimizePowellChi2Gauss1D(const psVector *params,
+                                      const psArray *coords);
+
+typedef
+psVector *(*psMinimizeChi2PowellFunc)(const psVector *params,
+                                      const psArray *coords);
+
+psBool psMinimizeChi2Powell(psMinimization *min,
+                            psVector *params,
+                            const psVector *paramMask,
+                            const psArray *coords,
+                            const psVector *value,
+                            const psVector *error,
+                            psMinimizeChi2PowellFunc func);
+
+
+
+/* \} */// End of MathGroup Functions
+
+#endif
+
Index: /tags/ipp-1-X/bug123/psLib/src/dataManip/psRandom.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/dataManip/psRandom.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/dataManip/psRandom.c	(revision 22331)
@@ -0,0 +1,140 @@
+/** @file psRandom.c
+*  \brief Random Number Generators
+*  \ingroup Math
+*
+*  This file will hold the functions which allocate, free,
+*  and evaluate random number Generators.
+*
+*  @ingroup Math
+*
+*  @author GLG, MHPCC
+*
+*  @version $Revision: 1.7 $ $Name: not supported by cvs2svn $
+*  @date $Date: 2005-02-17 19:26:23 $
+*
+*  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+*/
+
+#include <stdio.h>
+#include <stdbool.h>
+#include <float.h>
+#include <math.h>
+#include <time.h>
+#include <gsl/gsl_rng.h>
+#include <gsl/gsl_randist.h>
+
+#include "psMemory.h"
+#include "psRandom.h"
+#include "psScalar.h"
+#include "psError.h"
+#include "psTrace.h"
+#include "psLogMsg.h"
+#include "psConstants.h"
+#include "psDataManipErrors.h"
+
+psU64 p_psRandomGetSystemSeed()
+{
+    FILE*  fd;
+    psU64  seedVal = 0;
+    time_t timeVal;
+
+    fd = fopen("/dev/urandom","r");
+    if(fd == NULL) {
+        // Read system clock to get seed
+        seedVal = (psU64)time(&timeVal);
+    } else {
+        // Read urandom to get seed
+        fread(&seedVal, sizeof(psU64),1,fd);
+        // Close file
+        fclose(fd);
+    }
+
+    // Send log message of the system seed value used
+    psLogMsg(__func__,PS_LOG_INFO,"System random seed value used  seed = %llX hex",seedVal);
+
+    return seedVal;
+}
+
+psRandom *psRandomAlloc(psRandomType type,
+                        psU64 seed)
+{
+    gsl_rng   *r      = NULL;
+    psRandom  *myRNG  = NULL;
+
+    switch (type) {
+    case PS_RANDOM_TAUS:
+        myRNG = (psRandom*)psAlloc(sizeof(psRandom));
+        r = gsl_rng_alloc(gsl_rng_taus);
+        myRNG->gsl = r;
+        if(seed == 0) {
+            gsl_rng_set(myRNG->gsl,p_psRandomGetSystemSeed());
+        }
+        break;
+
+    default:
+        psError(PS_ERR_UNEXPECTED_NULL,
+                true,
+                PS_ERRORTEXT_psRandom_UNKNOWN_RANDFOM_NUMBER_GENERATOR_TYPE);
+        break;
+    }
+    return(myRNG);
+}
+
+void psRandomReset(psRandom *rand,
+                   psU64 seed)
+{
+    // Check null psRandom
+    if(rand==NULL) {
+        psError(PS_ERR_UNEXPECTED_NULL,
+                true,
+                PS_ERRORTEXT_psRandom_NULL_RANDOM_VAR);
+    } else {
+        // Check seed value to see if system seed should be used
+        if(seed == 0) {
+            gsl_rng_set(rand->gsl,p_psRandomGetSystemSeed());
+        } else {
+            gsl_rng_set(rand->gsl, seed);
+        }
+    }
+}
+
+psF64 psRandomUniform(const psRandom *r)
+{
+    // Check null psRandom variable
+    if(r == NULL) {
+        psError(PS_ERR_UNEXPECTED_NULL,
+                true,
+                PS_ERRORTEXT_psRandom_NULL_RANDOM_VAR);
+        return(0);
+    } else {
+        return(gsl_rng_uniform(r->gsl));
+    }
+}
+
+psF64 psRandomGaussian(const psRandom *r)
+{
+    // Check null psRandom variable
+    if(r == NULL) {
+        psError(PS_ERR_UNEXPECTED_NULL,
+                true,
+                PS_ERRORTEXT_psRandom_NULL_RANDOM_VAR);
+        return(0);
+    } else {
+        // XXX: What should sigma be?
+        return(gsl_ran_gaussian(r->gsl, 1.0));
+    }
+}
+
+psF64 psRandomPoisson(const psRandom *r, psF64 mean)
+{
+    // Check null psRandom variable
+    if(r == NULL) {
+        psError(PS_ERR_UNEXPECTED_NULL,
+                true,
+                PS_ERRORTEXT_psRandom_NULL_RANDOM_VAR);
+        return(0);
+    } else {
+        return((psF64) gsl_ran_poisson(r->gsl, mean));
+    }
+}
+
Index: /tags/ipp-1-X/bug123/psLib/src/dataManip/psRandom.h
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/dataManip/psRandom.h	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/dataManip/psRandom.h	(revision 22331)
@@ -0,0 +1,59 @@
+/** @file psRandom.h
+*  \brief Random Number Generators
+*  \ingroup Math
+*
+*  This file will hold the prototypes for procedures which allocate, free,
+*  and evaluate random number Generators.
+*
+*  @ingroup Math
+*
+*  @author GLG, MHPCC
+*
+*  @version $Revision: 1.3 $ $Name: not supported by cvs2svn $
+*  @date $Date: 2005-02-17 19:26:23 $
+*
+*  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+*/
+
+#if !defined(PS_RANDOM_H)
+#define PS_RANDOM_H
+
+#include <stdio.h>
+#include <stdbool.h>
+#include <float.h>
+#include <math.h>
+
+#include "psVector.h"
+#include "psScalar.h"
+#include <gsl/gsl_rng.h>
+#include <gsl/gsl_randist.h>
+
+/** \addtogroup Math
+ *  \{
+ */
+
+typedef enum {
+    PS_RANDOM_TAUS    ///< A maximally equidistributed combined Tausworthe generator.
+} psRandomType;
+
+typedef struct
+{
+    psRandomType type; ///< The type of RNG
+    gsl_rng *gsl; ///< The RNG itself
+}
+psRandom;
+
+psRandom *psRandomAlloc(psRandomType type,
+                        psU64 seed);
+
+void psRandomReset(psRandom *rand,
+                   psU64 seed);
+
+psF64 psRandomUniform(const psRandom *r);
+psF64 psRandomGaussian(const psRandom *r);
+psF64 psRandomPoisson(const psRandom *r, psF64 mean);
+
+/* \} */// End of MathGroup Functions
+
+#endif
+
Index: /tags/ipp-1-X/bug123/psLib/src/dataManip/psStats.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/dataManip/psStats.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/dataManip/psStats.c	(revision 22331)
@@ -0,0 +1,2328 @@
+/** @file  psStats.c
+ *  \brief basic statistical operations
+ *  @ingroup Stats
+ *
+ *  This file will hold the definition of the histogram and stats data
+ *  structures.  It also contains prototypes for procedures which operate
+ *  on those data structures.
+ *
+ *  @author GLG, MHPCC
+ *
+ *  @version $Revision: 1.125 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-04-07 20:27:41 $
+ *
+ *  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdarg.h>
+#include <float.h>
+#include <math.h>
+
+/*****************************************************************************/
+/* INCLUDE FILES                                                             */
+/*****************************************************************************/
+#include "psMemory.h"
+#include "psImage.h"
+#include "psVector.h"
+#include "psTrace.h"
+#include "psLogMsg.h"
+#include "psError.h"
+#include "psStats.h"
+#include "psMinimize.h"
+#include "psFunctions.h"
+#include "psConstants.h"
+
+#include "psDataManipErrors.h"
+
+/*****************************************************************************/
+/* DEFINE STATEMENTS                                                         */
+/*****************************************************************************/
+#define PS_GAUSS_WIDTH 5       // The width of the Gaussian or boxcar smoothing.
+#define PS_CLIPPED_NUM_ITER_LB 1
+#define PS_CLIPPED_NUM_ITER_UB 10
+#define PS_CLIPPED_SIGMA_LB 1.0
+#define PS_CLIPPED_SIGMA_UB 10.0
+#define PS_POLY_MEDIAN_MAX_ITERATIONS 10
+
+#define PS_BIN_MIDPOINT(HISTOGRAM, BIN_NUM) \
+(0.5 * (HISTOGRAM->bounds->data.F32[(BIN_NUM)] + HISTOGRAM->bounds->data.F32[(BIN_NUM)+1]))
+/*****************************************************************************/
+/* TYPE DEFINITIONS                                                          */
+/*****************************************************************************/
+psVector* p_psConvertToF32(psVector* in);
+/*****************************************************************************/
+/* GLOBAL VARIABLES                                                          */
+/*****************************************************************************/
+
+// None
+
+/*****************************************************************************/
+/* FILE STATIC VARIABLES                                                     */
+/*****************************************************************************/
+
+// None
+
+/*****************************************************************************/
+/* FUNCTION IMPLEMENTATION - LOCAL                                           */
+/*****************************************************************************/
+
+psBool p_psGetStatValue(const psStats* stats, psF64 *value)
+{
+
+    switch (stats->options & ~(PS_STAT_USE_RANGE | PS_STAT_USE_BINSIZE | PS_STAT_ROBUST_FOR_SAMPLE)) {
+    case PS_STAT_SAMPLE_MEAN:
+        *value = stats->sampleMean;
+        return true;
+
+    case PS_STAT_SAMPLE_MEDIAN:
+        *value = stats->sampleMedian;
+        return true;
+
+    case PS_STAT_SAMPLE_STDEV:
+        *value = stats->sampleStdev;
+        return true;
+
+    case PS_STAT_ROBUST_MEAN:
+        *value = stats->robustMean;
+        return true;
+
+    case PS_STAT_ROBUST_MEDIAN:
+        *value = stats->robustMedian;
+        return true;
+
+    case PS_STAT_ROBUST_MODE:
+        *value = stats->robustMode;
+        return true;
+
+    case PS_STAT_ROBUST_STDEV:
+        *value = stats->robustStdev;
+        return true;
+
+    case PS_STAT_CLIPPED_MEAN:
+        *value = stats->clippedMean;
+        return true;
+
+    case PS_STAT_CLIPPED_STDEV:
+        *value = stats->clippedStdev;
+        return true;
+
+    case PS_STAT_MAX:
+        *value = stats->max;
+        return true;
+
+    case PS_STAT_MIN:
+        *value = stats->min;
+        return true;
+
+    default:
+        return false;
+    }
+}
+
+/******************************************************************************
+MISC PRIVATE STATISTICAL FUNCTIONS
+ 
+NOTE: it is assumed that any call to these statistical functions will have
+been preceded by a call to the psVectorStats() function.  Various sanity tests
+will only be performed in psVectorStats().  Should we perform the sanity
+checks in each routine anyway?
+ 
+XXX: For many of these private stats routines, what should be done if there
+are no acceptable elements in the input vector (if no elements lie within
+range, or there are no unmasked elements, or the input vector is NULL)?
+Currently we set the value to NAN.
+ 
+XXX: Optimization: many routines have an "empty" boolean variable which keeps
+track of whether or not the vector has any valid elements.  This code can
+possibly be optimized away.
+ *****************************************************************************/
+/******************************************************************************
+p_psVectorSampleMean(myVector, maskVector, maskVal, stats): calculates the
+mean of the input vector.  If there was a problem with the mean calculation,
+this routine sets stats->sampleMean to NAN.
+ *****************************************************************************/
+psS32 p_psVectorSampleMean(const psVector* myVector,
+                           const psVector* errors,
+                           const psVector* maskVector,
+                           psU32 maskVal,
+                           psStats* stats)
+{
+
+    psS32 i = 0;                // Loop index variable
+    psF32 mean = 0.0;           // The mean
+    psS32 count = 0;            // # of points in this mean
+
+    // If PS_STAT_USE_RANGE is requested, then we enter a slightly different
+    // loop.
+    if (errors == NULL) {
+        if (stats->options & PS_STAT_USE_RANGE) {
+            if (maskVector != NULL) {
+                for (i = 0; i < myVector->n; i++) {
+                    // Check if the data is with the specified range
+                    if (!(maskVal & maskVector->data.U8[i]) &&
+                            (stats->min <= myVector->data.F32[i]) &&
+                            (myVector->data.F32[i] <= stats->max)) {
+                        mean += myVector->data.F32[i];
+                        count++;
+                    }
+                }
+                if (count != 0) {
+                    mean /= (psF32)count;
+                } else {
+                    mean = NAN;
+                }
+
+            } else {
+                for (i = 0; i < myVector->n; i++) {
+                    if ((stats->min <= myVector->data.F32[i]) &&
+                            (myVector->data.F32[i] <= stats->max)) {
+                        mean += myVector->data.F32[i];
+                        count++;
+                    }
+                }
+                if (count != 0) {
+                    mean /= (psF32)count;
+                } else {
+                    mean = NAN;
+                }
+            }
+        } else {
+            if (maskVector != NULL) {
+                for (i = 0; i < myVector->n; i++) {
+                    if (!(maskVal & maskVector->data.U8[i])) {
+                        mean += myVector->data.F32[i];
+                        count++;
+                    }
+                }
+                if (count != 0) {
+                    mean /= (psF32)count;
+                } else {
+                    mean = NAN;
+                }
+            } else {
+                for (i = 0; i < myVector->n; i++) {
+                    mean += myVector->data.F32[i];
+                }
+                mean /= (psF32)myVector->n;
+            }
+        }
+    } else {
+        psF32 errorDivisor = 0.0;
+        psF32 errorSqr = 0.0;
+        if (stats->options & PS_STAT_USE_RANGE) {
+            if (maskVector != NULL) {
+                for (i = 0; i < myVector->n; i++) {
+                    // Check if the data is with the specified range
+                    if (!(maskVal & maskVector->data.U8[i]) &&
+                            (stats->min <= myVector->data.F32[i]) &&
+                            (myVector->data.F32[i] <= stats->max)) {
+                        errorSqr = errors->data.F32[i]*errors->data.F32[i];
+                        mean += myVector->data.F32[i]/errorSqr;
+                        errorDivisor+= (1.0 / errorSqr);
+                        count++;
+                    }
+                }
+                if (count != 0) {
+                    mean /= errorDivisor;
+                } else {
+                    mean = NAN;
+                }
+
+            } else {
+                for (i = 0; i < myVector->n; i++) {
+                    if ((stats->min <= myVector->data.F32[i]) &&
+                            (myVector->data.F32[i] <= stats->max)) {
+                        errorSqr = errors->data.F32[i]*errors->data.F32[i];
+                        mean += myVector->data.F32[i]/errorSqr;
+                        errorDivisor+= (1.0 / errorSqr);
+                        count++;
+                    }
+                }
+                if (count != 0) {
+                    mean /= errorDivisor;
+                } else {
+                    mean = NAN;
+                }
+            }
+        } else {
+            if (maskVector != NULL) {
+                for (i = 0; i < myVector->n; i++) {
+                    if (!(maskVal & maskVector->data.U8[i])) {
+                        errorSqr = errors->data.F32[i]*errors->data.F32[i];
+                        mean += myVector->data.F32[i]/errorSqr;
+                        errorDivisor+= (1.0 / errorSqr);
+                        count++;
+                    }
+                }
+                if (count != 0) {
+                    mean /= errorDivisor;
+                } else {
+                    mean = NAN;
+                }
+            } else {
+                for (i = 0; i < myVector->n; i++) {
+                    errorSqr = errors->data.F32[i]*errors->data.F32[i];
+                    mean += myVector->data.F32[i]/errorSqr;
+                    errorDivisor+= (1.0 / errorSqr);
+                }
+                mean /= errorDivisor;
+            }
+        }
+    }
+
+    stats->sampleMean = mean;
+    if (isnan(mean)) {
+        return(-1);
+    } else {
+        return(0);
+    }
+
+}
+
+/******************************************************************************
+p_psVectorSampleMax(myVector, maskVector, maskVal, stats): calculates the
+max of the input vector.  If there was a problem with the max calculation,
+this routine sets stats->max to NAN.
+ *****************************************************************************/
+psS32 p_psVectorMax(const psVector* myVector,
+                    const psVector* maskVector,
+                    psU32 maskVal,
+                    psStats* stats)
+{
+    psS32 i = 0;                // Loop index variable
+    psF32 max = -PS_MAX_F32;    // The calculated maximum
+    psS32 empty = true;         // Does this vector have valid elements?
+
+    // If PS_STAT_USE_RANGE is requested, then we enter a different loop.
+    if (stats->options & PS_STAT_USE_RANGE) {
+        if (maskVector != NULL) {
+            for (i = 0; i < myVector->n; i++) {
+                if (!(maskVal & maskVector->data.U8[i])) {
+                    if ((myVector->data.F32[i] > max) &&
+                            (stats->min <= myVector->data.F32[i]) &&
+                            (myVector->data.F32[i] <= stats->max)) {
+                        max = myVector->data.F32[i];
+                        empty = false;
+                    }
+                }
+            }
+        } else {
+            for (i = 0; i < myVector->n; i++) {
+                if ((myVector->data.F32[i] > max) &&
+                        (stats->min <= myVector->data.F32[i]) &&
+                        (myVector->data.F32[i] <= stats->max)) {
+                    max = myVector->data.F32[i];
+                    empty = false;
+                }
+            }
+        }
+    } else {
+        if (maskVector != NULL) {
+            for (i = 0; i < myVector->n; i++) {
+                if (!(maskVal & maskVector->data.U8[i])) {
+                    if (myVector->data.F32[i] > max) {
+                        max = myVector->data.F32[i];
+                        empty = false;
+                    }
+                }
+            }
+        } else {
+            for (i = 0; i < myVector->n; i++) {
+                if (myVector->data.F32[i] > max) {
+                    max = myVector->data.F32[i];
+                    empty = false;
+                }
+            }
+        }
+    }
+    if (empty == false) {
+        stats->max = max;
+    } else {
+        stats->max = NAN;
+        return(1);
+    }
+    return(0);
+}
+
+/******************************************************************************
+p_psVectorSampleMin(myVector, maskVector, maskVal, stats): calculates the
+minimum of the input vector.  If there was a problem with the min calculation,
+this routine sets stats->min to NAN.
+ *****************************************************************************/
+psS32 p_psVectorMin(const psVector* myVector,
+                    const psVector* maskVector,
+                    psU32 maskVal,
+                    psStats* stats)
+{
+    psS32 i = 0;                // Loop index variable
+    psF32 min = PS_MAX_F32;   // The calculated maximum
+    psS32 empty = true;         // Does this vector have valid elements?
+
+    if (stats->options & PS_STAT_USE_RANGE) {
+        if (maskVector != NULL) {
+            for (i = 0; i < myVector->n; i++) {
+                if (!(maskVal & maskVector->data.U8[i])) {
+                    if ((myVector->data.F32[i] < min) &&
+                            (stats->min <= myVector->data.F32[i]) &&
+                            (myVector->data.F32[i] <= stats->max)) {
+                        min = myVector->data.F32[i];
+                        empty = false;
+                    }
+                }
+            }
+        } else {
+            for (i = 0; i < myVector->n; i++) {
+                if ((myVector->data.F32[i] < min) &&
+                        (stats->min <= myVector->data.F32[i]) &&
+                        (myVector->data.F32[i] <= stats->max)) {
+                    min = myVector->data.F32[i];
+                    empty = false;
+                }
+            }
+        }
+    } else {
+        if (maskVector != NULL) {
+            for (i = 0; i < myVector->n; i++) {
+                if (!(maskVal & maskVector->data.U8[i])) {
+                    if (myVector->data.F32[i] < min) {
+                        min = myVector->data.F32[i];
+                        empty = false;
+                    }
+                }
+            }
+        } else {
+            for (i = 0; i < myVector->n; i++) {
+                if (myVector->data.F32[i] < min) {
+                    min = myVector->data.F32[i];
+                    empty = false;
+                }
+            }
+        }
+    }
+
+    if (empty == false) {
+        stats->min = min;
+    } else {
+        stats->min = NAN;
+        return(1);
+    }
+    return(0);
+}
+
+/******************************************************************************
+p_psVectorNValues(myVector, maskVector, maskVal, stats): This routine returns
+"true" if the inputPsVector has 1 or more valid elements (a valid element is an
+unmasked element within the specified min/max range).  Otherwise, return
+"false".
+ *****************************************************************************/
+bool p_psVectorCheckNonEmpty(const psVector* myVector,
+                             const psVector* maskVector,
+                             psU32 maskVal,
+                             psStats* stats)
+{
+    PS_VECTOR_CHECK_NULL(myVector, -1);
+    PS_PTR_CHECK_NULL(stats, -1);
+    psS32 i = 0;                // Loop index variable
+
+    if (stats->options & PS_STAT_USE_RANGE) {
+        if (maskVector != NULL) {
+            for (i = 0; i < myVector->n; i++) {
+                if (!(maskVal & maskVector->data.U8[i]) &&
+                        (stats->min <= myVector->data.F32[i]) &&
+                        (myVector->data.F32[i] <= stats->max)) {
+                    return(true);
+                }
+            }
+        } else {
+            for (i = 0; i < myVector->n; i++) {
+                if ((stats->min <= myVector->data.F32[i]) &&
+                        (myVector->data.F32[i] <= stats->max)) {
+                    return(true);
+                }
+            }
+        }
+    } else {
+        if (maskVector != NULL) {
+            for (i = 0; i < myVector->n; i++) {
+                if (!(maskVal & maskVector->data.U8[i])) {
+                    return(true);
+                }
+            }
+        } else {
+            if (myVector->n > 0) {
+                return(true);
+            }
+        }
+    }
+    return(false);
+}
+
+
+/******************************************************************************
+p_psVectorNValues(myVector, maskVector, maskVal, stats): calculates the
+number of non-masked pixels in the vector that fall within the min/max
+range, if specified.
+ *****************************************************************************/
+psS32 p_psVectorNValues(const psVector* myVector,
+                        const psVector* maskVector,
+                        psU32 maskVal,
+                        psStats* stats)
+{
+    PS_VECTOR_CHECK_NULL(myVector, -1);
+    PS_PTR_CHECK_NULL(stats, -1);
+    psS32 i = 0;                // Loop index variable
+    psS32 numData = 0;          // The number of data points
+
+    if (stats->options & PS_STAT_USE_RANGE) {
+        if (maskVector != NULL) {
+            for (i = 0; i < myVector->n; i++) {
+                if (!(maskVal & maskVector->data.U8[i]) &&
+                        (stats->min <= myVector->data.F32[i]) &&
+                        (myVector->data.F32[i] <= stats->max)) {
+                    numData++;
+                }
+            }
+        } else {
+            for (i = 0; i < myVector->n; i++) {
+                if ((stats->min <= myVector->data.F32[i]) &&
+                        (myVector->data.F32[i] <= stats->max)) {
+                    numData++;
+                }
+            }
+        }
+    } else {
+        if (maskVector != NULL) {
+            for (i = 0; i < myVector->n; i++) {
+                if (!(maskVal & maskVector->data.U8[i])) {
+                    numData++;
+                }
+            }
+        } else {
+            numData = myVector->n;
+        }
+    }
+
+    return (numData);
+}
+
+/******************************************************************************
+p_psVectorSampleMedian(myVector, maskVector, maskVal, stats): calculates the
+median of the input vector.  Returns true on success (including if there were
+no valid input vector elements).
+ 
+XXX: Use static vectors for sort arrays.
+ *****************************************************************************/
+bool p_psVectorSampleMedian(const psVector* myVector,
+                            const psVector* maskVector,
+                            psU32 maskVal,
+                            psStats* stats)
+{
+    psVector* unsortedVector = NULL;    // Temporary vector
+    psVector* sortedVector = NULL;      // Temporary vector
+    psS32 i = 0;                        // Loop index variable
+    psS32 count = 0;
+    psS32 nValues = 0;
+
+    // Determine how many data points fit inside this min/max range
+    // and are not masked, if the maskVector is not NULL.
+    nValues = p_psVectorNValues(myVector, maskVector, maskVal, stats);
+
+    // XXX: Is a warning message appropriate?  What value should we set the
+    // sampleMedian to?  Should we generate an error?
+    if (nValues <= 0) {
+        psLogMsg(__func__, PS_LOG_WARN, "WARNING: p_psVectorSampleMedian(): no valid elements in input vector.\n");
+        return(true);
+        stats->sampleMedian = NAN;
+    }
+
+    // Allocate temporary vectors for the data.
+    unsortedVector = psVectorAlloc(nValues, PS_TYPE_F32);
+
+    // Determine if we must only use data points within a min/max range.
+    if (stats->options & PS_STAT_USE_RANGE) {
+        // Store all non-masked data points within the min/max range
+        // into the temporary vectors.
+        count = 0;
+        if (maskVector != NULL) {
+            for (i = 0; i < myVector->n; i++) {
+                if (!(maskVal & maskVector->data.U8[i]) &&
+                        (stats->min <= myVector->data.F32[i]) &&
+                        (myVector->data.F32[i] <= stats->max)) {
+                    unsortedVector->data.F32[count] = myVector->data.F32[i];
+                    count++;
+                }
+            }
+        } else {
+            for (i = 0; i < myVector->n; i++) {
+                if ((stats->min <= myVector->data.F32[i]) &&
+                        (myVector->data.F32[i] <= stats->max)) {
+                    unsortedVector->data.F32[count] = myVector->data.F32[i];
+                    count++;
+                }
+            }
+        }
+    } else {
+        // Store all non-masked data points into the temporary vectors.
+        count = 0;
+        if (maskVector != NULL) {
+            for (i = 0; i < myVector->n; i++) {
+                if (!(maskVal & maskVector->data.U8[i])) {
+                    unsortedVector->data.F32[count] = myVector->data.F32[i];
+                    count++;
+                }
+            }
+        } else {
+            for (i = 0; i < myVector->n; i++) {
+                unsortedVector->data.F32[i] = myVector->data.F32[i];
+            }
+        }
+    }
+    // Sort the temporary vectors.
+    sortedVector = psVectorSort(sortedVector, unsortedVector);
+    if (sortedVector == NULL) {
+        psError(PS_ERR_UNEXPECTED_NULL,
+                false,
+                PS_ERRORTEXT_psStats_STATS_SAMPLE_MEDIAN_SORT_PROBLEM);
+        return(false);
+    }
+
+    // Calculate the median exactly.  Use the average if the number of samples
+    // is even.
+    if (0 == (nValues % 2)) {
+        stats->sampleMedian = 0.5 * (sortedVector->data.F32[(nValues / 2) - 1] +
+                                     sortedVector->data.F32[nValues / 2]);
+    } else {
+        stats->sampleMedian = sortedVector->data.F32[nValues / 2];
+    }
+
+    // Free the temporary data structures.
+    psFree(unsortedVector);
+    psFree(sortedVector);
+
+    // Return "true" on success.
+    return(true);
+}
+
+/******************************************************************************
+p_psVectorSmoothHistGaussian(): This routine smoothes the data in the input
+robustHistogram with a Gaussian of width sigma.
+ 
+XXX: Only PS_TYPE_F32 is supported.
+ 
+XXX: Write a general routine which smoothes a psVector.  This routine should
+call that.  Is that possible?
+ *****************************************************************************/
+psVector* p_psVectorSmoothHistGaussian(psHistogram* robustHistogram,
+                                       psF32 sigma)
+{
+    PS_PTR_CHECK_NULL(robustHistogram, NULL);
+    PS_PTR_CHECK_NULL(robustHistogram->bounds, NULL);
+
+    psS32 i = 0;                  // Loop index variable
+    psS32 j = 0;                  // Loop index variable
+    psF32 iMid;
+    psF32 jMid;
+    psS32 numBins = robustHistogram->nums->n;
+    psS32 numBounds = robustHistogram->bounds->n;
+    psVector* smooth = psVectorAlloc(numBins, PS_TYPE_F32);
+    psS32 jMin = 0;
+    psS32 jMax = 0;
+    psF32 firstBound = robustHistogram->bounds->data.F32[0];
+    psF32 lastBound = robustHistogram->bounds->data.F32[numBounds-1];
+    psScalar x;
+
+    x.type.type = PS_TYPE_F32;
+    for (i = 0; i < numBins; i++) {
+        // Determine the midpoint of bin i.
+        iMid = (robustHistogram->bounds->data.F32[i] +
+                robustHistogram->bounds->data.F32[i+1]) / 2.0;
+
+
+        // We determine the bin numbers corresponding to a range of data
+        // values surrounding iMid.  The ranges is of size
+        // s*PS_GAUSS_WIDTH*sigma
+
+        // YYY: The p_psVectorBinDisect() routine does much of the work of
+        // the following conditionals, however, it also reports a warning
+        // message.  I don't want the warning message so I reproduce the
+        // conditionals here.  Maybe p_psVectorBinDisect() should not produce
+        // warnings?
+
+        x.data.F32 = iMid - (PS_GAUSS_WIDTH * sigma);
+        if ((x.data.F32 >= firstBound) && (x.data.F32 <= lastBound)) {
+            jMin = p_psVectorBinDisect(robustHistogram->bounds, &x);
+            if (jMin < 0) {
+                psError(PS_ERR_UNEXPECTED_NULL,
+                        false,
+                        PS_ERRORTEXT_psStats_STATS_VECTOR_BIN_DISECT_PROBLEM);
+                return(NULL);
+            }
+        } else if (x.data.F32 <= firstBound) {
+            jMin = 0;
+        } else if (x.data.F32 >= lastBound) {
+            jMin = robustHistogram->bounds->n - 1;
+        }
+
+        x.data.F32 = iMid + (PS_GAUSS_WIDTH * sigma);
+        if ((x.data.F32 >= firstBound) && (x.data.F32 <= lastBound)) {
+            jMax = p_psVectorBinDisect(robustHistogram->bounds, &x);
+            if (jMax < 0) {
+                psError(PS_ERR_UNEXPECTED_NULL,
+                        false,
+                        PS_ERRORTEXT_psStats_STATS_VECTOR_BIN_DISECT_PROBLEM);
+                return(NULL);
+            }
+        } else if (x.data.F32 <= firstBound) {
+            jMax = 0;
+        } else if (x.data.F32 >= lastBound) {
+            jMax = robustHistogram->bounds->n - 1;
+        }
+
+        smooth->data.F32[i] = 0.0;
+        for (j = jMin ; j <= jMax ; j++) {
+            jMid = (robustHistogram->bounds->data.F32[j] +
+                    robustHistogram->bounds->data.F32[j+1]) / 2.0;
+            smooth->data.F32[i] +=
+                robustHistogram->nums->data.F32[j] *
+                psGaussian(jMid, iMid, sigma, true);
+        }
+    }
+
+    return(smooth);
+}
+
+/******************************************************************************
+p_psVectorSampleQuartiles(myVector, maskVector, maskVal, stats): calculates
+the upper and/or lower quartiles of the input vector.
+Inputs
+    myVector
+    maskVector
+    maskVal
+    stats
+Returns
+    NULL
+ *****************************************************************************/
+bool p_psVectorSampleQuartiles(const psVector* myVector,
+                               const psVector* maskVector,
+                               psU32 maskVal,
+                               psStats* stats)
+{
+    psVector* unsortedVector = NULL;    // Temporary vector
+    psVector* sortedVector = NULL;      // Temporary vector
+    psS32 i = 0;                  // Loop index variable
+    psS32 count = 0;              // # of points in this mean.
+    psS32 nValues = 0;            // # data points
+
+    // Determine how many data points fit inside this min/max range
+    // and are not maxed, IF the maskVector is not NULL.
+    nValues = p_psVectorNValues(myVector, maskVector, maskVal, stats);
+
+    // Allocate temporary vectors for the data.
+    unsortedVector = psVectorAlloc(nValues, PS_TYPE_F32);
+
+    // Determine if we must only use data points within a min/max range.
+    if (stats->options & PS_STAT_USE_RANGE) {
+        // Store all non-masked data points within the min/max range
+        // into the temporary vectors.
+        count = 0;
+        if (maskVector != NULL) {
+            for (i = 0; i < myVector->n; i++) {
+                if (!(maskVal & maskVector->data.U8[i]) &&
+                        (stats->min <= myVector->data.F32[i]) && (myVector->data.F32[i] <= stats->max)) {
+                    unsortedVector->data.F32[count++] = myVector->data.F32[i];
+                }
+            }
+        } else {
+            for (i = 0; i < myVector->n; i++) {
+                if ((stats->min <= myVector->data.F32[i]) && (myVector->data.F32[i] <= stats->max)) {
+                    unsortedVector->data.F32[count++] = myVector->data.F32[i];
+                }
+            }
+        }
+    } else {
+        // Store all non-masked data points into the temporary vectors.
+        count = 0;
+        if (maskVector != NULL) {
+            for (i = 0; i < myVector->n; i++) {
+                if (!(maskVal & maskVector->data.U8[i])) {
+                    unsortedVector->data.F32[count++] = myVector->data.F32[i];
+                }
+            }
+        } else {
+            for (i = 0; i < myVector->n; i++) {
+                unsortedVector->data.F32[i] = myVector->data.F32[i];
+            }
+        }
+    }
+
+    // Sort the temporary vectors.
+    sortedVector = psVectorSort(sortedVector, unsortedVector);
+    if (sortedVector == NULL) {
+        psError(PS_ERR_UNEXPECTED_NULL,
+                false,
+                PS_ERRORTEXT_psStats_STATS_SAMPLE_MEDIAN_SORT_PROBLEM);
+        return(false);
+    }
+
+    // Calculate the quartile points exactly.
+    // XXX: We should probably do a bin-midpoint if the quartile is not an
+    // integer.
+    stats->sampleUQ = sortedVector->data.F32[3 * (nValues / 4)];
+    stats->sampleLQ = sortedVector->data.F32[nValues / 4];
+
+    // Free the temporary data structures.
+    psFree(unsortedVector);
+    psFree(sortedVector);
+    return(true);
+}
+
+/******************************************************************************
+p_psVectorSampleStdev(myVector, maskVector, maskVal, stats): calculates the
+stdev of the input vector.
+Inputs
+    myVector
+    maskVector
+    maskVal
+    stats
+Returns
+    NULL
+ 
+ *****************************************************************************/
+void p_psVectorSampleStdevOLD(const psVector* myVector,
+                              const psVector* errors,
+                              const psVector* maskVector,
+                              psU32 maskVal,
+                              psStats* stats)
+{
+    psS32 i = 0;                  // Loop index variable
+    psS32 countInt = 0;           // # of data points being used
+    psF32 countFloat = 0.0;     // # of data points being used
+    psF32 mean = 0.0;           // The mean
+    psF32 diff = 0.0;           // Used in calculating stdev
+    psF32 sumSquares = 0.0;     // temporary variable
+    psF32 sumDiffs = 0.0;       // temporary variable
+
+    // This procedure requires the mean.  If it has not been already
+    // calculated, then call p_psVectorSampleMean()
+    if (0 != isnan(stats->sampleMean)) {
+        p_psVectorSampleMean(myVector, errors, maskVector, maskVal, stats);
+    }
+    // If the mean is NAN, then generate a warning and set the stdev to NAN.
+    if (0 != isnan(stats->sampleMean)) {
+        stats->sampleStdev = NAN;
+        psLogMsg(__func__, PS_LOG_WARN, "WARNING: p_psVectorSampleStdev(): p_psVectorSampleMean() reported a NAN mean.\n");
+        return;
+    }
+
+    mean = stats->sampleMean;
+    if (stats->options & PS_STAT_USE_RANGE) {
+        if (maskVector != NULL) {
+            for (i = 0; i < myVector->n; i++) {
+                if (!(maskVal & maskVector->data.U8[i]) &&
+                        (stats->min <= myVector->data.F32[i]) &&
+                        (myVector->data.F32[i] <= stats->max)) {
+                    diff = myVector->data.F32[i] - mean;
+                    sumSquares += (diff * diff);
+                    sumDiffs += diff;
+                    countInt++;
+                }
+            }
+        } else {
+            for (i = 0; i < myVector->n; i++) {
+                if ((stats->min <= myVector->data.F32[i]) &&
+                        (myVector->data.F32[i] <= stats->max)) {
+                    diff = myVector->data.F32[i] - mean;
+                    sumSquares += (diff * diff);
+                    sumDiffs += diff;
+                    countInt++;
+                }
+            }
+            countInt = myVector->n;
+        }
+    } else {
+        if (maskVector != NULL) {
+            for (i = 0; i < myVector->n; i++) {
+                if (!(maskVal & maskVector->data.U8[i])) {
+                    diff = myVector->data.F32[i] - mean;
+                    sumSquares += (diff * diff);
+                    sumDiffs += diff;
+                    countInt++;
+                }
+            }
+        } else {
+            for (i = 0; i < myVector->n; i++) {
+                diff = myVector->data.F32[i] - mean;
+                sumSquares += (diff * diff);
+                sumDiffs += diff;
+                countInt++;
+            }
+            countInt = myVector->n;
+        }
+    }
+    if (countInt == 0) {
+        stats->sampleStdev = NAN;
+        psLogMsg(__func__, PS_LOG_WARN, "WARNING: p_psVectorSampleStdev(): no valid psVector elements (%d).  Setting stats->sampleStdev = NAN.\n", countInt);
+    } else if (countInt == 1) {
+        stats->sampleStdev = 0.0;
+        psLogMsg(__func__, PS_LOG_WARN, "WARNING: p_psVectorSampleStdev(): only one valid psVector elements (%d).  Setting stats->sampleStdev = 0.0.\n", countInt);
+    } else {
+        countFloat = (psF32)countInt;
+        stats->sampleStdev = PS_SQRT_F32((sumSquares - (sumDiffs * sumDiffs / countFloat)) / (countFloat - 1));
+    }
+}
+/******************************************************************************
+p_psVectorSampleStdev(myVector, maskVector, maskVal, stats): calculates the
+stdev of the input vector.
+Inputs
+    myVector
+    maskVector
+    maskVal
+    stats
+Returns
+    NULL
+ 
+ *****************************************************************************/
+void p_psVectorSampleStdev(const psVector* myVector,
+                           const psVector* errors,
+                           const psVector* maskVector,
+                           psU32 maskVal,
+                           psStats* stats)
+{
+    psS32 i = 0;                  // Loop index variable
+    psS32 countInt = 0;           // # of data points being used
+    psF32 countFloat = 0.0;     // # of data points being used
+    psF32 mean = 0.0;           // The mean
+    psF32 diff = 0.0;           // Used in calculating stdev
+    psF32 sumSquares = 0.0;     // temporary variable
+    psF32 sumDiffs = 0.0;       // temporary variable
+    //    psF32 sum1;
+    //    psF32 sum2;
+    psF32 errorDivisor = 0.0f;
+
+    // This procedure requires the mean.  If it has not been already
+    // calculated, then call p_psVectorSampleMean()
+    if (0 != isnan(stats->sampleMean)) {
+        p_psVectorSampleMean(myVector, errors, maskVector, maskVal, stats);
+    }
+    // If the mean is NAN, then generate a warning and set the stdev to NAN.
+    if (0 != isnan(stats->sampleMean)) {
+        stats->sampleStdev = NAN;
+        psLogMsg(__func__, PS_LOG_WARN, "WARNING: p_psVectorSampleStdev(): p_psVectorSampleMean() reported a NAN mean.\n");
+        return;
+    }
+
+    mean = stats->sampleMean;
+    if (stats->options & PS_STAT_USE_RANGE) {
+        if (maskVector != NULL) {
+            for (i = 0; i < myVector->n; i++) {
+                if (!(maskVal & maskVector->data.U8[i]) &&
+                        (stats->min <= myVector->data.F32[i]) &&
+                        (myVector->data.F32[i] <= stats->max)) {
+                    diff = myVector->data.F32[i] - mean;
+                    sumSquares += (diff * diff);
+                    sumDiffs += diff;
+                    countInt++;
+                    if (errors != NULL) {
+                        errorDivisor+= (1.0 / PS_SQR(errors->data.F32[i]));
+                    }
+                }
+            }
+        } else {
+            for (i = 0; i < myVector->n; i++) {
+                if ((stats->min <= myVector->data.F32[i]) &&
+                        (myVector->data.F32[i] <= stats->max)) {
+                    diff = myVector->data.F32[i] - mean;
+                    sumSquares += (diff * diff);
+                    sumDiffs += diff;
+                    countInt++;
+                    if (errors != NULL) {
+                        errorDivisor+= (1.0 / PS_SQR(errors->data.F32[i]));
+                    }
+                }
+            }
+            countInt = myVector->n;
+        }
+    } else {
+        if (maskVector != NULL) {
+            for (i = 0; i < myVector->n; i++) {
+                if (!(maskVal & maskVector->data.U8[i])) {
+                    diff = myVector->data.F32[i] - mean;
+                    sumSquares += (diff * diff);
+                    sumDiffs += diff;
+                    countInt++;
+                    if (errors != NULL) {
+                        errorDivisor+= (1.0 / PS_SQR(errors->data.F32[i]));
+                    }
+                }
+            }
+        } else {
+            for (i = 0; i < myVector->n; i++) {
+                diff = myVector->data.F32[i] - mean;
+                sumSquares += (diff * diff);
+                sumDiffs += diff;
+                countInt++;
+            }
+            countInt = myVector->n;
+            if (errors != NULL) {
+                errorDivisor+= (1.0 / PS_SQR(errors->data.F32[i]));
+            }
+        }
+    }
+
+    if (countInt == 0) {
+        stats->sampleStdev = NAN;
+        psLogMsg(__func__, PS_LOG_WARN, "WARNING: p_psVectorSampleStdev(): no valid psVector elements (%d).  Setting stats->sampleStdev = NAN.\n", countInt);
+    } else if (countInt == 1) {
+        stats->sampleStdev = 0.0;
+        psLogMsg(__func__, PS_LOG_WARN, "WARNING: p_psVectorSampleStdev(): only one valid psVector elements (%d).  Setting stats->sampleStdev = 0.0.\n", countInt);
+    } else {
+        // XXX: The ADD specifies this as the definition of the standard
+        // deviation if the errors are known.  Verify this with IfA: none of
+        // the data points in the vector are used.  Verify that the masks and
+        // data ranges are used correctly.
+        if (errors != NULL) {
+            stats->sampleStdev = (1.0 / PS_SQRT_F32(errorDivisor));
+        } else {
+            countFloat = (psF32)countInt;
+            stats->sampleStdev = PS_SQRT_F32((sumSquares - (sumDiffs * sumDiffs / countFloat)) / (countFloat - 1));
+
+        }
+    }
+}
+
+/******************************************************************************
+p_psVectorClippedStats(myVector, errors, maskVector, maskVal, stats): calculates the
+clipped stats (mean or stdev) of the input vector.
+ 
+Inputs
+    myVector
+    maskVector
+    maskVal
+    stats
+Returns
+    0 for success.
+    -1: error
+    -2: warning
+ 
+XXX: Do we really need to calculate median and mean?
+ 
+XXX: Use static vectors for tmpMask.
+ 
+XXX: This has not been tested.
+ *****************************************************************************/
+psS32 p_psVectorClippedStats(const psVector* myVector,
+                             const psVector* errors,
+                             const psVector* maskVector,
+                             psU32 maskVal,
+                             psStats* stats)
+{
+    psF32 clippedMean = 0.0;    // self-explanatory
+    psF32 clippedStdev = 0.0;   // self-explanatory
+    psVector* tmpMask = NULL;   // Temporary vector for masks during iterations.
+    static psStats *statsTmp = NULL;   // Temporary psStats struct.
+    psS32 rc = 0;               // Return code.
+
+    // Ensure that stats->clipIter is within the proper range.
+    PS_INT_CHECK_RANGE(stats->clipIter,
+                       PS_CLIPPED_NUM_ITER_LB,
+                       PS_CLIPPED_NUM_ITER_UB, -1);
+
+    // Ensure that stats->clipSigma is within the proper range.
+    PS_INT_CHECK_RANGE(stats->clipSigma,
+                       PS_CLIPPED_SIGMA_LB,
+                       PS_CLIPPED_SIGMA_UB, -1);
+
+    // Allocate a psStats structure for calculating the mean, median, and
+    // stdev.
+    if (statsTmp == NULL) {
+        statsTmp = psStatsAlloc(PS_STAT_SAMPLE_MEAN);
+        p_psMemSetPersistent(statsTmp, true);
+    }
+
+    // We allocate a temporary mask vector since during the iterative
+    // steps that follow, we will be masking off additional data points.
+    // However, we do no want to modify the original mask vector.
+    tmpMask = psVectorAlloc(myVector->n, PS_TYPE_U8);
+
+    // If we were called with a mask vector, then initialize the temporary
+    // mask vector with those values.  Otherwise, initialize to zero.
+    if (maskVector != NULL) {
+        for (psS32 i = 0; i < tmpMask->n; i++) {
+            tmpMask->data.U8[i] = maskVector->data.U8[i];
+        }
+    } else {
+        for (psS32 i = 0; i < tmpMask->n; i++) {
+            tmpMask->data.U8[i] = 0;
+        }
+    }
+
+    // 1. Compute the sample median.
+    p_psVectorSampleMedian(myVector, maskVector, maskVal, statsTmp);
+    if (isnan(statsTmp->sampleMedian)) {
+        psLogMsg(__func__, PS_LOG_WARN, "Call to p_psVectorSampleMedian returned NAN\n");
+        stats->clippedMean = NAN;
+        stats->clippedStdev = NAN;
+        return(-2);
+    }
+
+    // 2. Compute the sample standard deviation.
+    p_psVectorSampleStdev(myVector, errors, maskVector, maskVal, statsTmp);
+    if (isnan(statsTmp->sampleStdev)) {
+        psLogMsg(__func__, PS_LOG_WARN, "Call to p_psVectorSampleStdev returned NAN\n");
+        stats->clippedMean = NAN;
+        stats->clippedStdev = NAN;
+        return(-2);
+    }
+
+    // 3. Use the sample median as the first estimator of the mean X.
+    clippedMean = statsTmp->sampleMedian;
+
+    // 4. Use the sample stdev as the first estimator of the mean stdev.
+    clippedStdev = statsTmp->sampleStdev;
+
+    // 5. Repeat N (stats->clipIter) times:
+    for (psS32 iter = 0; iter < stats->clipIter; iter++) {
+        // a) Exclude all values x_i for which |x_i - x| > K * stdev
+        if (errors != NULL) {
+            for (psS32 j = 0; j < myVector->n; j++) {
+                if (fabs(myVector->data.F32[j] - clippedMean) >
+                        (stats->clipSigma * errors->data.F32[j])) {
+                    tmpMask->data.U8[j] = 0xff;
+                }
+            }
+        } else {
+            for (psS32 j = 0; j < myVector->n; j++) {
+                if (fabs(myVector->data.F32[j] - clippedMean) >
+                        (stats->clipSigma * clippedStdev)) {
+                    tmpMask->data.U8[j] = 0xff;
+                }
+            }
+        }
+
+        // b) compute new mean and stdev
+        p_psVectorSampleMean(myVector, errors, tmpMask, 0xff, statsTmp);
+        p_psVectorSampleStdev(myVector, errors, tmpMask, 0xff, statsTmp);
+
+        // If the new mean and stdev are NAN, we must exit the loop.
+        // Otherwise, use the new results and continue.
+        if (isnan(statsTmp->sampleMean) || isnan(statsTmp->sampleStdev)) {
+            // Exit loop.  XXX: Should we throw an error/warning here?
+            iter = stats->clipIter;
+            rc = -1;
+        } else {
+            clippedMean = statsTmp->sampleMean;
+            clippedStdev = statsTmp->sampleStdev;
+        }
+    }
+
+    // 7. The last calcuated value of x is the cliped mean.
+    if (stats->options & PS_STAT_CLIPPED_MEAN) {
+        stats->clippedMean = clippedMean;
+    }
+    // 8. The last calcuated value of stdev is the cliped stdev.
+    if (stats->options & PS_STAT_CLIPPED_STDEV) {
+        stats->clippedStdev = clippedStdev;
+    }
+
+    psFree(tmpMask);
+    return(rc);
+}
+
+/*****************************************************************************
+These macros and functions define the following functions:
+ 
+<    p_psNormalizeVectorRange(myData, low, high)
+ 
+That assumes that the low/high arguments are PS_TYPE_F64; the vector myData
+can be of any type.  Arguments low/high will be converted to the appropriate
+type and one of the type-specific functions below will be called:
+ 
+    p_psNormalizeVectorRangeU8(myData, low, high)
+    p_psNormalizeVectorRangeU16(myData, low, high)
+    p_psNormalizeVectorRangeU32(myData, low, high)
+    p_psNormalizeVectorRangeU64(myData, low, high)
+    p_psNormalizeVectorRangeS8(myData, low, high)
+    p_psNormalizeVectorRangeS16(myData, low, high)
+    p_psNormalizeVectorRangeS32(myData, low, high)
+    p_psNormalizeVectorRangeS64(myData, low, high)
+    p_psNormalizeVectorRangeF32(myData, low, high)
+    p_psNormalizeVectorRangeF64(myData, low, high)
+ *****************************************************************************/
+#define PS_FUNC_MACRO_NORMALIZE_VECTOR_RANGE(TYPE) \
+void p_psNormalizeVectorRange##TYPE(psVector* myData, \
+                                    ps##TYPE outLow, \
+                                    ps##TYPE outHigh) \
+{ \
+    ps##TYPE min = (ps##TYPE) PS_MAX_##TYPE; \
+    ps##TYPE max = (ps##TYPE) -PS_MAX_##TYPE; \
+    psS32 i = 0; \
+    \
+    for (i = 0; i < myData->n; i++) { \
+        if (myData->data.TYPE[i] < min) { \
+            min = myData->data.TYPE[i]; \
+        } \
+        if (myData->data.TYPE[i] > max) { \
+            max = myData->data.TYPE[i]; \
+        } \
+    } \
+    \
+    /* Ensure that max!=min before we divide by (max-min) */ \
+    if (max != min) { \
+        for (i = 0; i < myData->n; i++) { \
+            myData->data.TYPE[i] = (outLow + (myData->data.TYPE[i] - min) * \
+                                    (outHigh - outLow) / (max - min)); \
+        } \
+    } else { \
+        psLogMsg(__func__, PS_LOG_WARN, "WARNING: (max==min).  Setting all elements to min.\n"); \
+        for (i = 0; i < myData->n; i++) \
+        { \
+            \
+            myData->data.TYPE[i] = outLow; \
+            \
+        } \
+    } \
+} \
+
+PS_FUNC_MACRO_NORMALIZE_VECTOR_RANGE(U8)
+PS_FUNC_MACRO_NORMALIZE_VECTOR_RANGE(U16)
+PS_FUNC_MACRO_NORMALIZE_VECTOR_RANGE(U32)
+PS_FUNC_MACRO_NORMALIZE_VECTOR_RANGE(U64)
+PS_FUNC_MACRO_NORMALIZE_VECTOR_RANGE(S8)
+PS_FUNC_MACRO_NORMALIZE_VECTOR_RANGE(S16)
+PS_FUNC_MACRO_NORMALIZE_VECTOR_RANGE(S32)
+PS_FUNC_MACRO_NORMALIZE_VECTOR_RANGE(S64)
+PS_FUNC_MACRO_NORMALIZE_VECTOR_RANGE(F32)
+PS_FUNC_MACRO_NORMALIZE_VECTOR_RANGE(F64)
+
+void p_psNormalizeVectorRange(psVector* myData,
+                              psF64 outLow,
+                              psF64 outHigh)
+{
+    switch (myData->type.type) {
+    case PS_TYPE_U8:
+        p_psNormalizeVectorRangeU8(myData, (psU8) outLow, (psU8) outHigh);
+        break;
+    case PS_TYPE_U16:
+        p_psNormalizeVectorRangeU16(myData, (psU16) outLow, (psU16) outHigh);
+        break;
+    case PS_TYPE_U32:
+        p_psNormalizeVectorRangeU32(myData, (psU32) outLow, (psU32) outHigh);
+        break;
+    case PS_TYPE_U64:
+        p_psNormalizeVectorRangeU64(myData, (psU64) outLow, (psU64) outHigh);
+        break;
+    case PS_TYPE_S8:
+        p_psNormalizeVectorRangeS8(myData, (psS8) outLow, (psS8) outHigh);
+        break;
+    case PS_TYPE_S16:
+        p_psNormalizeVectorRangeS16(myData, (psS16) outLow, (psS16) outHigh);
+        break;
+    case PS_TYPE_S32:
+        p_psNormalizeVectorRangeS32(myData, (psS32) outLow, (psS32) outHigh);
+        break;
+    case PS_TYPE_S64:
+        p_psNormalizeVectorRangeS64(myData, (psS64) outLow, (psS64) outHigh);
+        break;
+    case PS_TYPE_F32:
+        p_psNormalizeVectorRangeF32(myData, (psF32) outLow, (psF32) outHigh);
+        break;
+    case PS_TYPE_F64:
+        p_psNormalizeVectorRangeF64(myData, (psF64) outLow, (psF64) outHigh);
+        break;
+    case PS_TYPE_C32:
+    case PS_TYPE_C64:
+    default:
+        psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                "Unallowable operation: %s has incorrect type.",
+                myData);
+        break;
+    }
+}
+
+/******************************************************************************
+p_ps1DPolyMedian(myPoly, rangeLow, rangeHigh, midpoint): This routine takes
+as input a 1-D polynomial of arbitrary order (though we are using 2nd-order
+polynomials here) and a range of x-values for which it is defined:
+[rangeLow, rangeHigh].  It determines the x-value of that polynomial such
+that f(x) == midpoint.  This functions uses a binary-search algorithm on the
+range and assumes that the polynomial is monotonically increasing or
+decreasing within that range.
+ 
+XXX: Terminate when f(x)-getThisValue is within some error tolerance.
+ 
+XXX: Create a 2nd-order polynomial version and solve for X analytically.
+ *****************************************************************************/
+psF32 p_ps1DPolyMedian(psPolynomial1D* myPoly,
+                       psF32 rangeLow,
+                       psF32 rangeHigh,
+                       psF32 getThisValue)
+{
+    PS_POLY_CHECK_NULL(myPoly, NAN);
+    PS_FLOAT_COMPARE(rangeLow, rangeHigh, NAN);
+    // We ensure that the requested f(y) value, which is getThisValue, is
+    // falls within the range of y-values of the polynomial "myPoly" in the
+    // specified x-range (rangeLow:rangeHigh).
+    psF32 fLo = psPolynomial1DEval(
+                    myPoly,
+                    rangeLow
+                );
+    psF32 fHi = psPolynomial1DEval(
+                    myPoly,
+                    rangeHigh
+                );
+    if (!((fLo <= getThisValue) && (fHi >= getThisValue))) {
+        psError(PS_ERR_UNKNOWN,
+                true,
+                PS_ERRORTEXT_psStats_STATS_POLY_MEDIAN_OUT_OF_RANGE);
+        return(NAN);
+    }
+
+    psS32 numIterations = 0;
+    psF32 midpoint = 0.0;
+    psF32 oldMidpoint = 1.0;
+    psF32 f = 0.0;
+
+    while (numIterations < PS_POLY_MEDIAN_MAX_ITERATIONS) {
+        midpoint = (rangeHigh + rangeLow) / 2.0;
+        if (fabs(midpoint - oldMidpoint) <= FLT_EPSILON) {
+            return (midpoint);
+        }
+        oldMidpoint = midpoint;
+
+        f = psPolynomial1DEval(
+                myPoly,
+                midpoint
+            );
+        if (fabs(f - getThisValue) <= FLT_EPSILON) {
+            return (midpoint);
+        }
+
+        if (f > getThisValue) {
+            rangeHigh = midpoint;
+        } else {
+            rangeLow = midpoint;
+        }
+        numIterations++;
+    }
+    return (midpoint);
+}
+
+/******************************************************************************
+fitQuadraticSearchForYThenReturnX(*xVec, *yVec, binNum, yVal): A general
+routine which fits a quadratic to three points and returns the x-value
+corresponding to the input y-value.  This routine takes psVectors of x/y pairs
+as input, and fits a quadratic to the 3 points surrounding element binNum in
+the vectors (the midpoint between element i and i+1 is used for x[i]).  It
+then determines for what value x does that quadratic f(x) = yVal (the input
+parameter).
+ 
+XXX: After you fit the polynomial, solve for X analytically.
+ 
+XXX: the vectors do not have to be the same length.  Must insert the proper
+tests to ensure that binNum is within acceptable ranges for both vectors.
+*****************************************************************************/
+psF32 fitQuadraticSearchForYThenReturnX(psVector *xVec,
+                                        psVector *yVec,
+                                        psS32 binNum,
+                                        psF32 yVal)
+{
+    PS_VECTOR_CHECK_NULL(xVec, NAN);
+    PS_VECTOR_CHECK_NULL(yVec, NAN);
+    PS_VECTOR_CHECK_TYPE(xVec, PS_TYPE_F32, NAN);
+    PS_VECTOR_CHECK_TYPE(yVec, PS_TYPE_F32, NAN);
+    //    PS_VECTOR_CHECK_SIZE_EQUAL(xVec, yVec, NAN);
+    PS_INT_CHECK_RANGE(binNum, 0, (xVec->n - 1), NAN);
+    PS_INT_CHECK_RANGE(binNum, 0, (yVec->n - 1), NAN);
+
+    //    PS_VECTOR_DECLARE_ALLOC_STATIC(x, 3, PS_TYPE_F64);
+    //    PS_VECTOR_DECLARE_ALLOC_STATIC(y, 3, PS_TYPE_F64);
+    //    PS_VECTOR_DECLARE_ALLOC_STATIC(yErr, 3, PS_TYPE_F64);
+    //    PS_POLY_1D_DECLARE_ALLOC_STATIC(myPoly, 2, PS_POLYNOMIAL_ORD);
+    psVector *x = psVectorAlloc(3, PS_TYPE_F64);
+    psVector *y = psVectorAlloc(3, PS_TYPE_F64);
+    psVector *yErr = psVectorAlloc(3, PS_TYPE_F64);
+    psPolynomial1D *myPoly = psPolynomial1DAlloc(2, PS_POLYNOMIAL_ORD);
+
+    psF32 tmpFloat = 0.0f;
+
+    if ((binNum > 0) && (binNum < (yVec->n - 2))) {
+        // The general case.  We have all three points.
+        x->data.F64[0] = (psF64) (0.5 * (xVec->data.F32[binNum - 1] + xVec->data.F32[binNum]));
+        x->data.F64[1] = (psF64) (0.5 * (xVec->data.F32[binNum] + xVec->data.F32[binNum+1]));
+        x->data.F64[2] = (psF64) (0.5 * (xVec->data.F32[binNum+1] + xVec->data.F32[binNum+2]));
+        y->data.F64[0] = yVec->data.F32[binNum - 1];
+        y->data.F64[1] = yVec->data.F32[binNum];
+        y->data.F64[2] = yVec->data.F32[binNum + 1];
+
+        // Ensure that yVal is within the range of the bins we are using.
+        if (!((y->data.F64[0] <= yVal) && (yVal <= y->data.F64[2]))) {
+            psError(PS_ERR_BAD_PARAMETER_VALUE, true,
+                    PS_ERRORTEXT_psStats_YVAL_OUT_OF_RANGE,
+                    (psF64)yVal,y->data.F64[2],y->data.F64[0]);
+        }
+        yErr->data.F64[0] = 1.0;
+        yErr->data.F64[1] = 1.0;
+        yErr->data.F64[2] = 1.0;
+
+        // Determine the coefficients of the polynomial.
+        myPoly = psVectorFitPolynomial1D(myPoly, x, y, yErr);
+        if (myPoly == NULL) {
+            psError(PS_ERR_UNEXPECTED_NULL,
+                    false,
+                    PS_ERRORTEXT_psStats_STATS_FIT_QUADRATIC_POLYNOMIAL_1D_FIT);
+            psFree(myPoly);
+            psFree(x);
+            psFree(y);
+            psFree(yErr);
+            return(NAN);
+        }
+        // Call p_ps1DPolyMedian(), which does a binary search on the
+        // polynomial, looking for the value x such that f(x) = yVal
+        tmpFloat = p_ps1DPolyMedian(myPoly, x->data.F64[0], x->data.F64[2], yVal);
+        if (isnan(tmpFloat)) {
+            psError(PS_ERR_UNEXPECTED_NULL,
+                    false,
+                    PS_ERRORTEXT_psStats_STATS_FIT_QUADRATIC_POLY_MEDIAN);
+            psFree(myPoly);
+            psFree(x);
+            psFree(y);
+            psFree(yErr);
+            return(NAN);
+        }
+
+    } else {
+        // The special case where we have two points only at the beginning of
+        // the vectors x and y.
+        if (binNum == 0) {
+            tmpFloat = 0.5 * (xVec->data.F32[binNum] +
+                              xVec->data.F32[binNum + 1]);
+        } else if (binNum == (xVec->n - 1)) {
+            // The special case where we have two points only at the end of
+            // the vectors x and y.
+            // XXX: Is this right?
+            tmpFloat = xVec->data.F32[binNum];
+        } else if (binNum == (xVec->n - 2)) {
+            // XXX: Is this right?
+            tmpFloat = 0.5 * (xVec->data.F32[binNum] +
+                              xVec->data.F32[binNum + 1]);
+        }
+    }
+
+    psFree(myPoly);
+    psFree(x);
+    psFree(y);
+    psFree(yErr);
+    return(tmpFloat);
+}
+
+/******************************************************************************
+p_psVectorRobustStats(myVector, maskVector, maskVal, stats): this procedure
+calculates a variety of robust stat measures:
+    PS_STAT_ROBUST_MEAN
+    PS_STAT_ROBUST_MEDIAN
+    PS_STAT_ROBUST_MODE
+    PS_STAT_ROBUST_STDEV
+    PS_STAT_ROBUST_QUARTILE
+I have included all that computation in a single function, as opposed to
+breaking it across several functions for one primary reason:  they all require
+the same basic initial processing steps (calculate the histogram, etc.).
+ 
+Inputs
+    myVector
+    maskVector
+    maskVal
+    stats
+Returns
+    0 on success.
+ 
+XXX: Check for errors in psLib routines that we call.
+*****************************************************************************/
+psS32 p_psVectorRobustStats(const psVector* myVector,
+                            const psVector* errors,
+                            const psVector* maskVector,
+                            psU32 maskVal,
+                            psStats* stats)
+{
+    psHistogram* robustHistogram = NULL;
+    psVector* robustHistogramVector = NULL;
+    psF32 binSize = 0.0;        // Size of the histogram bins
+    psS32 LQBinNum = -1;          // Bin num for lower quartile
+    psS32 UQBinNum = -1;          // Bin num for upper quartile
+    psS32 medianBinNum = -1;
+    psS32 i = 0;                  // Loop index variable
+    psS32 modeBinNum = 0;
+    psF32 modeBinCount = 0.0;
+    psF32 dL = 0.0;
+    psS32 numBins = 0;
+    psF32 myMean = 0.0;
+    psF32 myStdev = 0.0;
+    psF32 countFloat = 0.0;
+    psF32 diff = 0.0;
+    psF32 sumSquares = 0.0;
+    psF32 sumDiffs = 0.0;
+    psVector* cumulativeRobustSums = NULL;
+    psF32 sumRobust = 0.0;
+    psF32 sumN50 = 0.0;
+    psF32 sumNfit = 0.0;
+    psScalar tmpScalar;
+    tmpScalar.type.type = PS_TYPE_F32;
+    psStats* tmpStats = psStatsAlloc(PS_STAT_CLIPPED_STDEV | PS_STAT_CLIPPED_MEAN);
+
+    // Compute the initial bin size of the robust histogram.  This is done
+    // by computing the clipped standard deviation of the vector, and dividing
+    // that by 10.0;
+    //XXX: add errors
+    psS32 rc = p_psVectorClippedStats(myVector, NULL, maskVector, maskVal, tmpStats);
+    if (rc != 0) {
+        psError(PS_ERR_UNEXPECTED_NULL,
+                false,
+                PS_ERRORTEXT_psStats_ROBUST_STATS_CLIPPED_STATS);
+        return(1);
+    }
+    binSize = tmpStats->clippedStdev / 10.0f;
+
+    // If stats->clippedStdev == 0.0, then all data elements have the same
+    // value.  Therefore, we can set the appropiate results and return.
+    if (fabs(binSize) <= FLT_EPSILON) {
+        if (stats->options & PS_STAT_ROBUST_MEAN) {
+            stats->robustMean = tmpStats->clippedMean;
+        }
+        if (stats->options & PS_STAT_ROBUST_MEDIAN) {
+            stats->robustMedian = tmpStats->clippedMean;
+        }
+        if (stats->options & PS_STAT_ROBUST_MODE) {
+            stats->robustMode = tmpStats->clippedMean;
+        }
+        if (stats->options & PS_STAT_ROBUST_STDEV) {
+            stats->robustStdev = 0.0;
+        }
+        if (stats->options & PS_STAT_ROBUST_QUARTILE) {
+            stats->robustUQ = tmpStats->clippedMean;
+            stats->robustLQ = tmpStats->clippedMean;
+        }
+        // XXX: Set these to the number of unmasked data points?
+        stats->robustNfit = 0.0;
+        stats->robustN50 = 0.0;
+        psFree(tmpStats);
+        return(0);
+    }
+
+    // Determine minimum and maximum values in the data vector.
+    if (isnan(tmpStats->min)) {
+        if (0 != p_psVectorMin(myVector, maskVector, maskVal, tmpStats)) {
+            psLogMsg(__func__, PS_LOG_WARN,
+                     "WARNING: p_psVectorMin(): p_psVectorMin() reported a NAN mean.\n");
+            return(1);
+        }
+    }
+    if (isnan(tmpStats->max)) {
+        if (0 != p_psVectorMax(myVector, maskVector, maskVal, tmpStats)) {
+            psLogMsg(__func__, PS_LOG_WARN,
+                     "WARNING: p_psVectorMin(): p_psVectorMax() reported a NAN mean.\n");
+            return(1);
+        }
+    }
+
+    // Create the histogram structure.  NOTE: we can not specify the bin size
+    // precisely since the argument to psHistogramAlloc() is the number of
+    // bins, not the binSize.  Also, if we get here, we know that
+    // binSize != 0.0.
+    numBins = (psS32)((tmpStats->max - tmpStats->min) / binSize);
+    robustHistogram = psHistogramAlloc(tmpStats->min, tmpStats->max, numBins);
+
+    // Populate the histogram array.
+    psVectorHistogram(robustHistogram, myVector, errors, maskVector, maskVal);
+
+    // Smooth the histogram, Gaussian-style.
+    robustHistogramVector = p_psVectorSmoothHistGaussian(robustHistogram,
+                            tmpStats->clippedStdev / 4.0f);
+
+    /**************************************************************************
+    Determine the median/lower/upper quartile bin numbers.
+
+    We define a vector called "cumulativeRobustSums" where the value at
+    index position i is equal to the sum of bins 0:i.  This will be used in
+    determining the median and lower/upper quartiles.
+    **************************************************************************/
+    cumulativeRobustSums = psVectorAlloc(robustHistogramVector->n, PS_TYPE_F32);
+    cumulativeRobustSums->data.F32[0] = robustHistogramVector->data.F32[0];
+    for (i = 1; i < robustHistogramVector->n; i++) {
+        cumulativeRobustSums->data.F32[i] = cumulativeRobustSums->data.F32[i - 1] +
+                                            robustHistogramVector->data.F32[i];
+    }
+    sumRobust = cumulativeRobustSums->data.F32[robustHistogramVector->n - 1];
+
+    tmpScalar.data.F32 = sumRobust / 4.0;
+    LQBinNum = p_psVectorBinDisect(cumulativeRobustSums, &tmpScalar);
+    tmpScalar.data.F32 = 3.0 * sumRobust / 4.0;
+    UQBinNum = p_psVectorBinDisect(cumulativeRobustSums, &tmpScalar);
+    tmpScalar.data.F32 = sumRobust / 2.0;
+    medianBinNum = p_psVectorBinDisect(cumulativeRobustSums, &tmpScalar);
+
+    if ((LQBinNum < 0) || (UQBinNum < 0)) {
+        psError(PS_ERR_UNKNOWN, true,
+                PS_ERRORTEXT_psStats_ROBUST_QUARTILE_BINS_FAILED);
+        return(1);
+    }
+    if (medianBinNum < 0) {
+        psError(PS_ERR_UNKNOWN, true,
+                PS_ERRORTEXT_psStats_ROBUST_QUARTILE_BINS_FAILED);
+        return(1);
+    }
+    /**************************************************************************
+    Determine the mode in the range LQ:UQ.
+    **************************************************************************/
+    // Determine the bin with the peak value in the range LQ to UQ.
+    modeBinNum = LQBinNum;
+    modeBinCount = robustHistogramVector->data.F32[LQBinNum];
+    sumN50 = robustHistogram->nums->data.F32[LQBinNum];
+    for (i = LQBinNum + 1; i <= UQBinNum; i++) {
+        if (robustHistogramVector->data.F32[i] > modeBinCount) {
+            modeBinNum = i;
+            modeBinCount = robustHistogramVector->data.F32[i];
+        }
+        sumN50 += robustHistogram->nums->data.F32[i];
+    }
+
+    dL = (UQBinNum - LQBinNum) / 4;
+    /**************************************************************************
+    Determine the mean/stdev for the bins in the range mode-dL to mode+dL
+    **************************************************************************/
+    // Calculate the mean of the smoothed robust histogram in the range
+    // mode-dL to mode+dL.  We use the midpoint of each bin as the mean for
+    // that bin (this is a non-exact approximation).
+    sumNfit = 0.0;
+    myMean = 0.0;
+    for (i = modeBinNum - dL; i <= modeBinNum + dL; i++) {
+        if ((0 <= i) && (i < robustHistogramVector->n)) {
+            myMean += (robustHistogramVector->data.F32[i]) * PS_BIN_MIDPOINT(robustHistogram, i);
+            countFloat += robustHistogramVector->data.F32[i];
+        }
+
+        sumNfit += robustHistogram->nums->data.F32[i];
+    }
+    // XXX: divide by zero?
+    myMean /= countFloat;
+
+    // Calculate the stdev of the smoothed robust histogram in the range
+    // mode-dL to mode+dL.  We use the midpoint of each bin as the mean for
+    // that bin.
+    for (i = modeBinNum - dL; i <= modeBinNum + dL; i++) {
+        if ((0 <= i) && (i < robustHistogramVector->n)) {
+            diff = PS_BIN_MIDPOINT(robustHistogram, i) - myMean;
+            sumSquares += diff * diff * robustHistogramVector->data.F32[i];
+            sumDiffs += diff * robustHistogramVector->data.F32[i];
+        }
+    }
+    myStdev = PS_SQRT_F32((sumSquares - (sumDiffs * sumDiffs / countFloat)) / (countFloat - 1));
+
+    p_psNormalizeVectorRangeF32(robustHistogramVector, 0.0, 1.0);
+
+    if ((stats->options & PS_STAT_ROBUST_MEAN) ||
+            (stats->options & PS_STAT_ROBUST_STDEV)) {
+
+        // Using the above (myMean, myStdev) as initial estimates, we fit a
+        // Gaussian to the robustHistogramVector.
+        psImage *covar = NULL;
+        /* XXX: Old, remove.
+                psMinimization *min = psMinimizationAlloc(100, 0.1);
+                psVector *myParams = psVectorAlloc(2, PS_TYPE_F32);
+                psArray *myCoords = psArrayAlloc(robustHistogramVector->n);
+                psVector *y = psVectorAlloc(robustHistogramVector->n, PS_TYPE_F32);
+                myParams->data.F32[0] = myMean;
+                myParams->data.F32[1] = myStdev;
+                for (i=0;i<robustHistogramVector->n;i++) {
+                    myCoords->data[i] = (psPtr *) psVectorAlloc(2, PS_TYPE_F32);
+                    ((psVector *) (myCoords->data[i]))->data.F32[0] = (psF32) i;
+                    y->data.F32[i] = robustHistogramVector->data.F32[i];
+                }
+        */
+
+        psMinimization *min = psMinimizationAlloc(100, 0.01);
+        psVector *myParams = psVectorAlloc(2, PS_TYPE_F32);
+        psArray *myCoords = psArrayAlloc(2 * dL + 1);
+        psVector *y = psVectorAlloc(2 * dL + 1, PS_TYPE_F32);
+        myParams->data.F32[0] = myMean;
+        myParams->data.F32[1] = myStdev;
+
+        for (i = modeBinNum - dL; i <= modeBinNum + dL; i++) {
+            int index = i - modeBinNum + dL;
+            myCoords->data[index] = (psPtr *) psVectorAlloc(2, PS_TYPE_F32);
+            ((psVector *) (myCoords->data[index]))->data.F32[0] = PS_BIN_MIDPOINT(robustHistogram, i);
+            y->data.F32[index] = robustHistogramVector->data.F32[i];
+        }
+
+
+        psBool rc = psMinimizeLMChi2(min,
+                                     NULL,
+                                     myParams,
+                                     NULL,
+                                     myCoords,
+                                     y,
+                                     NULL,
+                                     (psMinimizeLMChi2Func) psMinimizeLMChi2Gauss1D);
+        if (rc == false) {
+            psLogMsg(__func__, PS_LOG_WARN,
+                     "WARNING: failed to minimize with psMinimizeLMChi2().\n");
+        }
+
+        // XXX: Verify this with IfA
+        // XXX: The check on the minimization is better than the difference from myMean.
+        //      Do they still want this code?
+
+        if (stats->options & PS_STAT_ROBUST_MEAN) {
+            if (fabs((myParams->data.F32[0] - myMean)/myMean) > 0.1) {
+                psLogMsg(__func__, PS_LOG_WARN,
+                         "WARNING: the fitted Gaussian has more than 10%% error for the mean.\n");
+                psLogMsg(__func__, PS_LOG_WARN,
+                         "WARNING: Using the calculated mean instead of Gaussian-fitted mean.");
+                //                     "WARNING: Using the calculated mean instead of Gaussian-fitted mean.(calc, fit) is (%f, %f)\n",
+                //                     myMean, myParams->data.F32[0]);
+                stats->robustMean = myMean;
+            } else {
+                stats->robustMean = myParams->data.F32[0];
+            }
+        }
+
+        if (stats->options & PS_STAT_ROBUST_STDEV) {
+            if (fabs((myParams->data.F32[1] - myStdev)/myStdev) > 0.1) {
+                psLogMsg(__func__, PS_LOG_WARN,
+                         "WARNING: the fitted Gaussian has more than 10%% error for the stdev.\n");
+                psLogMsg(__func__, PS_LOG_WARN,
+                         "WARNING: Using the calculated stdev instead of Gaussian-fitted stdev.");
+                //                     "WARNING: Using the calculated stdev instead of Gaussian-fitted stdev.(calc, fit) is (%f, %f)\n",
+                //                     myStdev, myParams->data.F32[1]);
+                stats->robustStdev = myStdev;
+            } else {
+                stats->robustStdev = myParams->data.F32[1];
+            }
+        }
+        psFree(covar);
+        psFree(min);
+        psFree(myCoords);
+        psFree(y);
+        psFree(myParams);
+    }
+
+
+    /**************************************************************************
+    Set the appropriate members in the output stats struct.
+    **************************************************************************/
+
+    if (stats->options & PS_STAT_ROBUST_MODE) {
+        stats->robustMode = PS_BIN_MIDPOINT(robustHistogram, modeBinNum);
+    }
+
+
+    // To determine the median, we fit a quadratic y=f(x) to the three bins
+    // surrounding the bin containing the median (x is the midpoint of each
+    // bin and y is the value of each bin).  Then we figure out what value
+    // of x corresponds to f(x) being the median (half of all points).
+    if (stats->options & PS_STAT_ROBUST_MEDIAN) {
+        // Take a psVector.  Fit a polynomial y = f(x) to the 3 data elements
+        // surrounding medianBinNum, then find the x-value corresponding y = sumRobust/2.0.
+
+        //XXX: robustHistogram->bounds and cumulativeRobustSums are of different lengths.
+        //Determine id that is okay.
+        stats->robustMedian = fitQuadraticSearchForYThenReturnX(
+                                  robustHistogram->bounds,
+                                  cumulativeRobustSums,
+                                  medianBinNum,
+                                  sumRobust/2.0);
+    }
+
+    // To determine the quartiles, we fit a quadratic y=f(x) to the three bins
+    // surrounding the bin containing LQ/UQ (x is the midpoint of each
+    // bin and y is the value of each bin).  Then we figure out what value
+    // of x corresponds to f(x) being the LQ/UQ.
+    if (stats->options & PS_STAT_ROBUST_QUARTILE) {
+        countFloat = cumulativeRobustSums->data.F32[robustHistogramVector->n - 1];
+
+        //XXX: robustHistogram->bounds and cumulativeRobustSums are of different lengths.
+        //Determine id that is okay.
+        stats->robustLQ = fitQuadraticSearchForYThenReturnX(
+                              robustHistogram->bounds,
+                              cumulativeRobustSums,
+                              LQBinNum,
+                              countFloat/4.0);
+        //XXX: robustHistogram->bounds and cumulativeRobustSums are of different lengths.
+        //Determine id that is okay.
+        stats->robustUQ = fitQuadraticSearchForYThenReturnX(
+                              robustHistogram->bounds,
+                              cumulativeRobustSums,
+                              UQBinNum,
+                              3.0 * countFloat/4.0);
+    }
+    // XXX: I think sumNfit == sumN50 here.
+    stats->robustNfit = sumNfit;
+    stats->robustN50 = sumN50;
+
+    psFree(tmpStats);
+    psFree(robustHistogram);
+    psFree(robustHistogramVector);
+    psFree(cumulativeRobustSums);
+    return(0);
+}
+
+/*****************************************************************************/
+
+/* FUNCTION IMPLEMENTATION - PUBLIC                                          */
+
+/*****************************************************************************/
+
+static void histogramFree(psHistogram* myHist);
+
+/******************************************************************************
+    psStatsAlloc(): This routine must create a new psStats data structure.
+ *****************************************************************************/
+psStats* psStatsAlloc(psStatsOptions options)
+{
+    psStats* newStruct = NULL;
+
+    newStruct = (psStats* ) psAlloc(sizeof(psStats));
+    newStruct->sampleMean = NAN;
+    newStruct->sampleMedian = NAN;
+    newStruct->sampleStdev = NAN;
+    newStruct->sampleUQ = NAN;
+    newStruct->sampleLQ = NAN;
+    newStruct->robustMean = NAN;
+    newStruct->robustMedian = NAN;
+    newStruct->robustMode = NAN;
+    newStruct->robustStdev = NAN;
+    newStruct->robustUQ = NAN;
+    newStruct->robustLQ = NAN;
+    newStruct->robustN50 = 0;
+    newStruct->robustNfit = 0;
+    newStruct->clippedMean = NAN;
+    newStruct->clippedStdev = NAN;
+    newStruct->clipSigma = 3.0;
+    newStruct->clipIter = 3.0;
+    newStruct->min = NAN;
+    newStruct->max = NAN;
+    newStruct->binsize = NAN;
+    newStruct->options = options;
+
+    return (newStruct);
+}
+
+/******************************************************************************
+psHistogramAlloc(lower, upper, n): allocate a uniform histogram structure
+with the specifed upper and lower limits, and the specifed number of bins.
+This routine will also set the bounds for each of the bins.
+ 
+Input:
+    lower
+    upper
+    n
+Returns:
+    The histogram structure
+ *****************************************************************************/
+psHistogram* psHistogramAlloc(psF32 lower, psF32 upper, psS32 n)
+{
+    PS_INT_CHECK_POSITIVE(n, NULL);
+    PS_FLOAT_COMPARE(lower, upper, NULL);
+
+    psS32 i = 0;                  // Loop index variable
+    psHistogram* newHist = NULL;        // The new histogram structure
+    psF32 binSize = 0.0;        // The histogram bin size
+
+    // Allocate memory for the new histogram structure.  If there are N
+    // bins, then there are N+1 bounds to those bins.
+    newHist = (psHistogram* ) psAlloc(sizeof(psHistogram));
+    psMemSetDeallocator(newHist, (psFreeFcn) histogramFree);
+    newHist->bounds = psVectorAlloc(n + 1, PS_TYPE_F32);
+    newHist->bounds->n = newHist->bounds->nalloc;
+
+    // Calculate the bounds for each bin.
+    binSize = (upper - lower) / (psF32)n;
+    // XXX: Is the following necessary? It prevents the max data point
+    // from being in a non-existant bin.
+    binSize += FLT_EPSILON;
+    for (i = 0; i < n + 1; i++) {
+        newHist->bounds->data.F32[i] = lower + (binSize * (psF32)i);
+    }
+
+    // Allocate the bins, and initialize them to zero.
+    newHist->nums = psVectorAlloc(n, PS_TYPE_F32);
+    for (i = 0; i < newHist->nums->n; i++) {
+        newHist->nums->data.F32[i] = 0.0;
+    }
+
+    // Initialize the other members.
+    newHist->minNum = 0;
+    newHist->maxNum = 0;
+    newHist->uniform = true;
+
+    return (newHist);
+}
+
+/******************************************************************************
+psHistogramAllocGeneric(bounds): allocate a non-uniform histogram structure
+with the specifed bounds.
+ 
+Input:
+    bounds
+Returns:
+    The histogram structure
+ *****************************************************************************/
+psHistogram* psHistogramAllocGeneric(const psVector* bounds)
+{
+    PS_VECTOR_CHECK_NULL(bounds, NULL);
+    PS_VECTOR_CHECK_TYPE(bounds, PS_TYPE_F32, NULL);
+    PS_INT_COMPARE(2, bounds->n, NULL);
+
+    psHistogram* newHist = NULL;        // The new histogram structure
+    psS32 i;                      // Loop index variable
+
+    // Allocate memory for the new histogram structure.
+    newHist = (psHistogram* ) psAlloc(sizeof(psHistogram));
+    psMemSetDeallocator(newHist, (psFreeFcn) histogramFree);
+    newHist->bounds = psVectorAlloc(bounds->n, PS_TYPE_F32);
+    newHist->bounds->n = newHist->bounds->nalloc;
+    for (i = 0; i < bounds->n; i++) {
+        newHist->bounds->data.F32[i] = bounds->data.F32[i];
+    }
+
+    // Allocate the bins, and initialize them to zero.  If there are N bounds,
+    // then there are N-1 bins.
+    newHist->nums = psVectorAlloc((bounds->n) - 1, PS_TYPE_F32);
+    for (i = 0; i < newHist->nums->n; i++) {
+        newHist->nums->data.F32[i] = 0.0;
+    }
+
+    // Initialize the other members.
+    newHist->minNum = 0;
+    newHist->maxNum = 0;
+    newHist->uniform = false;
+
+    return (newHist);
+}
+
+static void histogramFree(psHistogram* myHist)
+{
+    psFree(myHist->bounds);
+    psFree(myHist->nums);
+}
+
+/*****************************************************************************
+UpdateHistogramBins(binNum, out, data, error): This routine is to be used when
+updating the histogram in the presence of errors in the input data.  We treat
+the data point as a boxcar PDF and update a range of points surrounding the
+histogram bin which contains the point.  The width of that boxcar is defined
+as 2.35 * error.  Inputs:
+    binNum: the bin number of the data point in the histogram
+    out: the histogram structure
+    data: the data point value
+    error: the error in that data point
+ 
+XXX: Must test this.
+ *****************************************************************************/
+psS32 UpdateHistogramBins(psS32 binNum,
+                          psHistogram* out,
+                          psF32 data,
+                          psF32 error)
+{
+    PS_PTR_CHECK_NULL(out, -1);
+    PS_PTR_CHECK_NULL(out->bounds, -1);
+    PS_PTR_CHECK_NULL(out->nums, -1);
+    PS_INT_CHECK_RANGE(binNum, 0, ((out->nums->n)-1), -2);
+    PS_FLOAT_COMPARE(0.0, error, -3);
+    PS_FLOAT_CHECK_RANGE(data, out->bounds->data.F32[0], out->bounds->data.F32[(out->bounds->n)-1], -4);
+
+    psF32 boxcarWidth = 2.35 * error;
+    psF32 boxcarCenter = (out->bounds->data.F32[binNum] +
+                          out->bounds->data.F32[binNum+1]) / 2.0;
+    psF32 boxcarLeft = boxcarCenter - (boxcarWidth / 2.0);
+    psF32 boxcarRight = boxcarCenter + (boxcarWidth / 2.0);
+    psS32 bin;
+    psS32 boxcarLeftBinNum = 0;
+    psS32 boxcarRightBinNum = 0;
+
+    // Determine the left endpoint of the boxcar for the PDF.
+    for (bin=binNum ; bin >= 0 ; bin--) {
+        if (out->nums->data.F32[bin] <= boxcarLeft) {
+            boxcarLeftBinNum = bin;
+            break;
+        }
+    }
+
+    // Determine the right endpoint of the boxcar for the PDF.
+    for (bin=binNum ; bin < out->nums->n ; bin++) {
+        if (out->nums->data.F32[bin] >= boxcarRight) {
+            boxcarRightBinNum = bin;
+            break;
+        }
+    }
+
+    //
+    // If the boxcar fits entirely inside this bin, then simply add 1.0 to the
+    // bin and return.
+    //
+    if (boxcarLeftBinNum == boxcarRightBinNum) {
+        out->nums->data.F32[binNum]+= 1.0;
+        return(0);
+    }
+
+    //
+    // If we get here, multiple bins must be updated.  We handle the left
+    // endpoint, and right endpoint differently.
+    //
+    out->nums->data.F32[boxcarLeftBinNum]+=
+        (out->bounds->data.F32[boxcarLeftBinNum+1] - boxcarLeft) / boxcarWidth;
+
+    //
+    // Loop through the center bins, if any.
+    //
+    for (bin = boxcarLeftBinNum + 1 ; bin < (boxcarRightBinNum - 1) ; bin++) {
+        out->nums->data.F32[bin]+=
+            (out->bounds->data.F32[bin+1] - out->bounds->data.F32[bin]) / boxcarWidth;
+    }
+
+    //
+    // Handle the right endpoint differently.
+    //
+    out->nums->data.F32[boxcarRightBinNum]+=
+        (boxcarRight - out->bounds->data.F32[boxcarRightBinNum]) / boxcarWidth;
+
+    //
+    // Return 0 on success.
+    //
+    return(0);
+}
+
+
+/*****************************************************************************
+psVectorHistogram(out, in, errors, mask, maskVal): this procedure takes as
+input a preallocated and initialized histogram structure.  It fills the bins
+in that histogram structure in accordance with the input data "in" and the,
+possibly NULL, mask vector.
+ 
+Inputs:
+    out
+    in
+    mask
+    maskVal
+Returns:
+    The histogram structure "out".
+ *****************************************************************************/
+psHistogram* psVectorHistogram(psHistogram* out,
+                               const psVector* in,
+                               const psVector* errors,
+                               const psVector* mask,
+                               psU32 maskVal)
+{
+    PS_PTR_CHECK_NULL(out, NULL);
+    PS_VECTOR_CHECK_NULL(out->bounds, NULL);
+    PS_VECTOR_CHECK_TYPE(out->bounds, PS_TYPE_F32, NULL);
+    PS_INT_CHECK_NON_NEGATIVE(out->bounds->n, NULL);
+    PS_VECTOR_CHECK_NULL(out->nums, NULL);
+    PS_VECTOR_CHECK_TYPE(out->nums, PS_TYPE_F32, NULL);
+    PS_INT_CHECK_NON_NEGATIVE(out->nums->n, NULL);
+    PS_VECTOR_CHECK_NULL(in, out);
+    if (mask != NULL) {
+        PS_VECTOR_CHECK_SIZE_EQUAL(in, mask, NULL);
+        PS_VECTOR_CHECK_TYPE(mask, PS_TYPE_U8, NULL);
+    }
+    if (errors != NULL) {
+        PS_VECTOR_CHECK_SIZE_EQUAL(in, errors, NULL);
+        PS_VECTOR_CHECK_TYPE(errors, in->type.type, NULL);
+    }
+
+    psS32 i = 0;                  // Loop index variable
+    psF32 binSize = 0.0;          // Histogram bin size
+    psS32 binNum = 0;             // A temporary bin number
+    psS32 numBins = 0;            // The total number of bins
+    psScalar tmpScalar;
+    tmpScalar.type.type = PS_TYPE_F32;
+    psVector* inF32 = NULL;
+    psVector* errorsF32 = NULL;
+    psS32 mustFreeVectorIn = 1;
+    psS32 mustFreeVectorErrors = 1;
+
+    // Convert input and errors vectors to F32 if necessary.
+    inF32 = p_psConvertToF32((psVector *) in);
+    if (inF32 == NULL) {
+        inF32 = (psVector *) in;
+        mustFreeVectorIn = 0;
+    }
+    errorsF32 = p_psConvertToF32((psVector *) errors);
+    if (errorsF32 == NULL) {
+        errorsF32 = (psVector *) errors;
+        mustFreeVectorErrors = 0;
+    }
+
+    numBins = out->nums->n;
+    for (i = 0; i < inF32->n; i++) {
+        // Check if this pixel is masked, and if so, skip it.
+        if ((mask == NULL) || ((mask != NULL) && (!(mask->data.U8[i] & maskVal)))) {
+            if (inF32->data.F32[i] < out->bounds->data.F32[0]) {
+                // If this pixel is below minimum value, count it, then skip.
+                out->minNum++;
+            } else if (inF32->data.F32[i] > out->bounds->data.F32[numBins]) {
+                // If this pixel is above maximum value, count it, then skip.
+                out->maxNum++;
+            } else {
+                // If this is a uniform histogram, determining the correct
+                // number is trivial.
+                if (out->uniform == true) {
+                    binSize = out->bounds->data.F32[1] - out->bounds->data.F32[0];
+                    binNum = (psS32)((inF32->data.F32[i] - out->bounds->data.F32[0]) / binSize);
+                    if (errorsF32 != NULL) {
+                        // XXX: Check return codes.
+                        UpdateHistogramBins(binNum, out,
+                                            inF32->data.F32[i],
+                                            errorsF32->data.F32[i]);
+                    } else {
+                        // XXX: This if-statement really shouldn't be necessary.
+                        // However, due to numerical lack of precision, we
+                        // occasionally produce a binNum outside the range.
+                        if (binNum >= out->nums->n) {
+                            binNum = out->nums->n - 1;
+                        }
+                        (out->nums->data.F32[binNum])+= 1.0;
+                    }
+
+                } else {
+                    // If this is a non-uniform histogram, determining the
+                    // correct bin number requires a bit more work.
+                    tmpScalar.data.F32 = inF32->data.F32[i];
+                    binNum = p_psVectorBinDisect(out->bounds, &tmpScalar);
+                    if (binNum < 0) {
+                        psLogMsg(__func__, PS_LOG_WARN,
+                                 "WARNING: psVectorHistogram(): element outside histogram bounds.\n");
+                    } else {
+                        if (errorsF32 != NULL) {
+                            // XXX: Check return codes.
+                            UpdateHistogramBins(binNum, out,
+                                                inF32->data.F32[i],
+                                                errors->data.F32[i]);
+                        } else {
+                            (out->nums->data.F32[binNum])+= 1.0;
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    if (mustFreeVectorIn == 1) {
+        psFree(inF32);
+    }
+    if (mustFreeVectorErrors == 1) {
+        psFree(errorsF32);
+    }
+    return (out);
+}
+
+/******************************************************************************
+p_psConvertToF32(in): this is the cheap way to support a variety of vector
+data types: we simply convert the input vector to F32 at the beginning, and
+write all of our functions in F32.  If the vast majority of all vector stat
+operations are F32 (or any other single type), then this is probably the
+best way to go.  Otherwise, when the algorithms stablize, we will then macro
+everything and put type support in the various stat functions.
+ 
+XXX: Should the default data type be F64?  Since we are buying Opterons...
+ *****************************************************************************/
+psVector* p_psConvertToF32(psVector* in)
+{
+    if (in == NULL) {
+        return(NULL);
+    }
+    psS32 i = 0;
+    psVector* tmp = NULL;
+
+    if (in->type.type == PS_TYPE_S8) {
+        tmp = psVectorAlloc(in->n, PS_TYPE_F32);
+        for (i = 0; i < in->n; i++) {
+            tmp->data.F32[i] = (psF32)in->data.S8[i];
+        }
+    } else if (in->type.type == PS_TYPE_S16) {
+        tmp = psVectorAlloc(in->n, PS_TYPE_F32);
+        for (i = 0; i < in->n; i++) {
+            tmp->data.F32[i] = (psF32) in->data.S16[i];
+        }
+    } else if (in->type.type == PS_TYPE_S32) {
+        tmp = psVectorAlloc(in->n, PS_TYPE_F32);
+        for (i = 0; i < in->n; i++) {
+            tmp->data.F32[i] = (psF32)in->data.S32[i];
+        }
+    } else if (in->type.type == PS_TYPE_S64) {
+        tmp = psVectorAlloc(in->n, PS_TYPE_F32);
+        for (i = 0; i < in->n; i++) {
+            tmp->data.F32[i] = (psF32)in->data.S64[i];
+        }
+    } else if (in->type.type == PS_TYPE_U8) {
+        tmp = psVectorAlloc(in->n, PS_TYPE_F32);
+        for (i = 0; i < in->n; i++) {
+            tmp->data.F32[i] = (psF32)in->data.U8[i];
+        }
+    } else if (in->type.type == PS_TYPE_U16) {
+        tmp = psVectorAlloc(in->n, PS_TYPE_F32);
+        for (i = 0; i < in->n; i++) {
+            tmp->data.F32[i] = (psF32)in->data.U16[i];
+        }
+    } else if (in->type.type == PS_TYPE_U32) {
+        tmp = psVectorAlloc(in->n, PS_TYPE_F32);
+        for (i = 0; i < in->n; i++) {
+            tmp->data.F32[i] = (psF32)in->data.U32[i];
+        }
+    } else if (in->type.type == PS_TYPE_U64) {
+        tmp = psVectorAlloc(in->n, PS_TYPE_F32);
+        for (i = 0; i < in->n; i++) {
+            tmp->data.F32[i] = (psF32)in->data.U64[i];
+        }
+    } else if (in->type.type == PS_TYPE_F64) {
+        tmp = psVectorAlloc(in->n, PS_TYPE_F32);
+        for (i = 0; i < in->n; i++) {
+            tmp->data.F32[i] = (psF32)in->data.F64[i];
+        }
+    } else if (in->type.type == PS_TYPE_F32) {
+        // do nothing
+    } else {
+        psS8* strType;
+        PS_TYPE_NAME(strType, in->type.type);
+        psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                PS_ERRORTEXT_psStats_VECTOR_TYPE_UNSUPPORTED,
+                strType);
+    }
+    return (tmp);
+}
+
+/******************************************************************************
+psVectorStats(myVector, maskVector, maskVal, stats): this is the public API
+function which calls the above private stats functions based on what bits
+were set in stats->options.
+ 
+Inputs
+    myVector
+    maskVector
+    maskVal
+    stats
+Returns
+    The stats structure.
+ *****************************************************************************/
+psStats* psVectorStats(psStats* stats,
+                       const psVector* in,
+                       const psVector* errors,
+                       const psVector* mask,
+                       psU32 maskVal)
+{
+    PS_PTR_CHECK_NULL(stats, NULL);
+    PS_VECTOR_CHECK_NULL(in, stats);
+    if (mask != NULL) {
+        PS_VECTOR_CHECK_SIZE_EQUAL(mask, in, stats);
+        PS_VECTOR_CHECK_TYPE(mask, PS_TYPE_U8, stats);
+    }
+    if (errors != NULL) {
+        PS_VECTOR_CHECK_SIZE_EQUAL(errors, in, stats);
+        PS_VECTOR_CHECK_TYPE(errors, in->type.type, stats);
+    }
+
+    psVector* inF32 = NULL;
+    psVector* errorsF32 = NULL;
+    psS32 mustFreeVectorIn = 1;
+    psS32 mustFreeVectorErrors = 1;
+
+    inF32 = p_psConvertToF32((psVector *) in);
+    if (inF32 == NULL) {
+        inF32 = (psVector *) in;
+        mustFreeVectorIn = 0;
+    }
+    errorsF32 = p_psConvertToF32((psVector *) errors);
+    if (errorsF32 == NULL) {
+        errorsF32 = (psVector *) errors;
+        mustFreeVectorErrors = 0;
+    }
+
+    if ((stats->options & PS_STAT_USE_RANGE) && (stats->min >= stats->max)) {
+        PS_FLOAT_COMPARE(stats->min, stats->max, stats);
+    }
+
+    // ************************************************************************
+    if (stats->options & PS_STAT_SAMPLE_MEAN) {
+        if (0 != p_psVectorSampleMean(inF32, errorsF32, mask, maskVal, stats)) {
+            psLogMsg(__func__, PS_LOG_WARN,
+                     "WARNING: psVectorStats(): p_psVectorSampleMean() returned an error.\n");
+        }
+    }
+    // ************************************************************************
+    if (stats->options & PS_STAT_SAMPLE_MEDIAN) {
+        if (false == p_psVectorSampleMedian(inF32, mask, maskVal, stats)) {
+            psLogMsg(__func__, PS_LOG_WARN,
+                     "WARNING: psVectorStats(): p_psVectorSampleMedian() returned an error.\n");
+        }
+    }
+    // ************************************************************************
+    if (stats->options & PS_STAT_SAMPLE_STDEV) {
+        if (0 != p_psVectorSampleMean(inF32, errorsF32, mask, maskVal, stats)) {
+            psLogMsg(__func__, PS_LOG_WARN,
+                     "WARNING: psVectorStats(): p_psVectorSampleMean() returned an error.\n");
+        }
+        p_psVectorSampleStdev(inF32, errorsF32, mask, maskVal, stats);
+    }
+    // ************************************************************************
+    if (stats->options & PS_STAT_SAMPLE_QUARTILE) {
+        if (false == p_psVectorSampleQuartiles(inF32, mask, maskVal, stats)) {
+            psLogMsg(__func__, PS_LOG_WARN,
+                     "WARNING: psVectorStats(): p_psVectorSampleQuartiles() returned an error.\n");
+        }
+    }
+    // Since the various robust stats quantities share much computation, they
+    // are grouped together in a single private function:
+    // p_psVectorRobustStats()
+    if ((stats->options & PS_STAT_ROBUST_MEAN) ||
+            (stats->options & PS_STAT_ROBUST_MEDIAN) ||
+            (stats->options & PS_STAT_ROBUST_MODE) ||
+            (stats->options & PS_STAT_ROBUST_STDEV) ||
+            (stats->options & PS_STAT_ROBUST_QUARTILE)) {
+        if (0 != p_psVectorRobustStats(inF32, errorsF32, mask, maskVal, stats)) {
+            psError(PS_ERR_UNKNOWN, false,
+                    PS_ERRORTEXT_psStats_STATS_FAILED);
+            // XXX: Set to NAN
+        }
+    }
+
+    // XXX: Different conditions for return -1 and -2?
+    if ((stats->options & PS_STAT_CLIPPED_MEAN) || (stats->options & PS_STAT_CLIPPED_STDEV)) {
+        psS32 rc = p_psVectorClippedStats(inF32, errorsF32, mask, maskVal, stats);
+        if (-1 == rc) {
+            psError(PS_ERR_UNKNOWN, false,
+                    "Failed to calculate clipped statistics for input psVector.\n");
+            stats->clippedMean = NAN;
+            stats->clippedStdev = NAN;
+        } else if (-2 == rc) {
+            psLogMsg(__func__, PS_LOG_WARN, "Failed to calculate clipped statistics for input psVector.");
+            stats->clippedMean = NAN;
+            stats->clippedStdev = NAN;
+        }
+    }
+    // ************************************************************************
+    if (stats->options & PS_STAT_MAX) {
+        if (0 != p_psVectorMax(inF32, mask, maskVal, stats)) {
+            psError(PS_ERR_UNKNOWN, false,
+                    "Failed to calculate vector maximum");
+            stats->max = NAN;
+        }
+    }
+    // ************************************************************************
+    if (stats->options & PS_STAT_MIN) {
+        if (0 != p_psVectorMin(inF32, mask, maskVal, stats)) {
+            psError(PS_ERR_UNKNOWN, false,
+                    "Failed to calculate vector minimum");
+            stats->min = NAN;
+        }
+    }
+
+    if (mustFreeVectorIn == 1) {
+        psFree(inF32);
+    }
+    if (mustFreeVectorErrors == 1) {
+        psFree(errorsF32);
+    }
+    return (stats);
+}
+
Index: /tags/ipp-1-X/bug123/psLib/src/dataManip/psStats.h
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/dataManip/psStats.h	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/dataManip/psStats.h	(revision 22331)
@@ -0,0 +1,191 @@
+
+/** @file  psStats.h
+ *  \brief basic statistical operations
+ *  @ingroup Stats
+ *
+xd *  This file will hold the definition of the histogram and stats data
+ *  structures.  It also contains prototypes for procedures which operate
+ *  on those data structures.
+ *
+ *  @author George Gusciora, MHPCC
+ *
+ *  @version $Revision: 1.40 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-03-29 22:34:59 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+#if !defined(PS_STATS_H)
+#define PS_STATS_H
+
+#include "psVector.h"
+
+/// @addtogroup Stats
+/// @{
+
+/******************************************************************************
+    Statistical functions and data structures.
+ *****************************************************************************/
+
+/** enumeration of statistical calculation options
+ *
+ *  @see psStats, psVectorStats, psImageStats
+ */
+// XXX: Is PS_STAT_ROBUST_FOR_SAMPLE obsolete?
+typedef enum {
+    PS_STAT_SAMPLE_MEAN = 0x000001,
+    PS_STAT_SAMPLE_MEDIAN = 0x000002,
+    PS_STAT_SAMPLE_STDEV = 0x000004,
+    PS_STAT_SAMPLE_QUARTILE = 0x000008,
+    PS_STAT_ROBUST_MEAN = 0x000010,
+    PS_STAT_ROBUST_MEDIAN = 0x000020,
+    PS_STAT_ROBUST_MODE = 0x000040,
+    PS_STAT_ROBUST_STDEV = 0x000080,
+    PS_STAT_ROBUST_QUARTILE = 0x000100,
+    PS_STAT_CLIPPED_MEAN = 0x000200,
+    PS_STAT_CLIPPED_STDEV = 0x000400,
+    PS_STAT_MAX =  0x000800,
+    PS_STAT_MIN =  0x001000,
+    PS_STAT_USE_RANGE =  0x002000,
+    PS_STAT_USE_BINSIZE = 0x004000,
+    PS_STAT_ROBUST_FOR_SAMPLE = 0x008000
+} psStatsOptions;
+
+/** This is the generic statistics structure.  It contails the data members
+    for the various statistic values.  It also contains the options member to
+    specifiy which statistics should be calculated. */
+typedef struct
+{
+    psF64 sampleMean;          ///< formal mean of sample
+    psF64 sampleMedian;        ///< formal median of sample
+    psF64 sampleStdev;         ///< standard deviation of sample
+    psF64 sampleUQ;            ///< upper quartile of sample
+    psF64 sampleLQ;            ///< lower quartile of sample
+    psF64 robustMean;          ///< robust mean of array
+    psF64 robustMedian;        ///< robust median of array
+    psF64 robustMode;          ///< Robust mode of array
+    psF64 robustStdev;         ///< robust standard deviation of array
+    psF64 robustUQ;            ///< robust upper quartile
+    psF64 robustLQ;            ///< robust lower quartile
+    psS32 robustN50;              ///<
+    psS32 robustNfit;             ///<
+    psF64 clippedMean;         ///< Nsigma clipped mean
+    psF64 clippedStdev;        ///< standard deviation after clipping
+    psS32 clippedNvalues;         ///< ???
+    psF64 clipSigma;           ///< Nsigma used for clipping; user input
+    psS32 clipIter;               ///< Number of clipping iterations; user input
+    psF64 min;                 ///< minimum data value in array
+    psF64 max;                 ///< maximum data value in array
+    psF64 binsize;             ///<
+    psStatsOptions options;     ///< bitmask of calculated values
+}
+psStats;
+
+/** Performs statistical calculations on a vector.
+ *
+ *  @return psStats*    the statistical results as specified by stats->options
+ */
+psStats* psVectorStats(
+    psStats* stats,    ///< stats structure defines stats to be calculated and how
+    const psVector* in,      ///< Vector to be analysed.
+    const psVector* errors,  ///< Errors.
+    const psVector* mask,    ///< Ignore elements where (maskVector & maskVal) != 0: must be INT or NULL
+    psU32 maskVal      ///< Only mask elements with one of these bits set in maskVector
+);
+
+/** Allocator of the psStats structure.
+ *
+ *  @return psStats*    A new psStats struct with the options member set to the
+ *                      value given.
+ */
+psStats* psStatsAlloc(
+    psStatsOptions options             ///< Statistics to calculate
+);
+
+/******************************************************************************
+    Histogram functions and data structures.
+ *****************************************************************************/
+
+/** The basic histogram structure which contains bounds and bins.
+ *
+ *  In this structure, the vector bounds specifies the boundaries of the 
+ *  histogram bins, and must of type psF32, while nums specifies the number 
+ *  of entries in the bin, and must of type psU32. The value of bounds.n must 
+ *  therefore be 1 greater than than nums.n. The two values minNum and maxNum 
+ *  are the number of data values which fell below the lower limit bound or 
+ *  above the upper limit bound, respectively.
+ */
+typedef struct
+{
+    psVector* bounds;                  ///< Bounds for the bins (type F32)
+    psVector* nums;                    ///< Number in each of the bins (INT)
+    psS32 minNum;                        ///< Number below the minimum
+    psS32 maxNum;                        ///< Number above the maximum
+    psBool uniform;                      ///< Is it a uniform distribution?
+}
+psHistogram;
+
+/** Allocator for psHistogram where the bounds of the bins are implicitly
+ *  specified through simply specifying an upper and lower limit along with 
+ *  the size of the bins. 
+ *
+ *  @return psHistogram*    Newly allocated psHistogram
+ */
+psHistogram* psHistogramAlloc(
+    psF32 lower,                       ///< Lower limit for the bins
+    psF32 upper,                       ///< Upper limit for the bins
+    psS32 n                              ///< Number of bins
+);
+
+/** Allocator for psHistogram where the bounds of the bins are explicitly
+ *  specified. 
+ *
+ *  @return psHistogram*    Newly allocated psHistogram
+ */
+psHistogram* psHistogramAllocGeneric(
+    const psVector* bounds             ///< Bounds for the bins
+);
+
+/** Calculate a histogram
+ *
+ *  The following function populates the histogram bins from the specified 
+ *  vector (in). It alters and returns the histogram out structure. The input
+ *  vector may be of types psU8, psU16, psF32, psF64.
+ *
+ *  @return psHistogram*   histogram result
+ */
+psHistogram* psVectorHistogram(
+    psHistogram* out,                  ///< Histogram data
+    const psVector* in,                ///< Vector to analyse
+    const psVector* errors,            ///< Errors
+    const psVector* mask,              ///< Mask dat for input vector
+    psU32 maskVal                      ///< Mask value
+);
+
+/** Extracts the statistic value specified by stats->options.
+ *
+ *  @return psBool    If more than one statistic result is set in stats->options,
+ *                  false is returned and the value parameter is not set, 
+ *                  otherwise true is returned.
+ */
+psBool p_psGetStatValue(
+    const psStats* stats,
+    ///< the statistic struct to operate on
+
+    psF64 *value
+    ///< if return is true, this is set to the specified statistic value by stats->options
+);
+
+void p_psNormalizeVectorRangeU8(psVector* myData, psU8 low, psU8 high);
+void p_psNormalizeVectorRangeU16(psVector* myData, psU16 low, psU16 high);
+void p_psNormalizeVectorRangeU32(psVector* myData, psU32 low, psU32 high);
+void p_psNormalizeVectorRangeU64(psVector* myData, psU64 low, psU64 high);
+void p_psNormalizeVectorRangeS8(psVector* myData, psS8 low, psS8 high);
+void p_psNormalizeVectorRangeS16(psVector* myData, psS16 low, psS16 high);
+void p_psNormalizeVectorRangeS32(psVector* myData, psS32 low, psS32 high);
+void p_psNormalizeVectorRangeS64(psVector* myData, psS64 low, psS64 high);
+void p_psNormalizeVectorRangeF32(psVector* myData, psF32 low, psF32 high);
+void p_psNormalizeVectorRangeF64(psVector* myData, psF64 low, psF64 high);
+
+/// @}
+
+#endif
Index: /tags/ipp-1-X/bug123/psLib/src/dataManip/psUnaryOp.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/dataManip/psUnaryOp.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/dataManip/psUnaryOp.c	(revision 22331)
@@ -0,0 +1,387 @@
+/** @file  psUnary.c
+ *
+ *  @brief Provides unary functions for simple matrix and vector element operations. Functions
+ *  include:
+ *
+ *      Addition (+)
+ *      Subtraction (-)
+ *      Multiplication (*)
+ *      Division (/)
+ *      Power (^)
+ *      Minimum (min)
+ *      Maximum (max)
+ *      Absolute value (abs)
+ *      Exponent (exp)
+ *      Natural Log (ln)
+ *      Power of 10 (ten)
+ *      Log (log)
+ *      Sine (sin or dsin)
+ *      Cosine (cos or dcos)
+ *      Tangent (tan or dtan)
+ *      Arcsine (asin or dasin)
+ *      Arccosine (acos or dacos)
+ *      Arctan (atan or datan)
+ *
+ *  Currently only vector-vector and image-image binary operations are supported.
+ *
+ *  @ingroup MatrixArithmetic
+ *
+ *  @author Ross Harman, MHPCC
+ *  @author Robert DeSonia, MHPCC
+ *
+ *  @version $Revision: 1.1 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-02-10 02:36:41 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+
+/******************************************************************************
+ *  INCLUDE FILES                                                             *
+ ******************************************************************************/
+#include <string.h>
+#include <math.h>
+#include <stdint.h>
+
+#include "psMemory.h"
+#include "psError.h"
+#include "psImage.h"
+#include "psVector.h"
+#include "psScalar.h"
+#include "psLogMsg.h"
+#include "psConstants.h"
+#include "psDataManipErrors.h"
+
+/*****************************************************************************
+ *  FUNCTION IMPLEMENTATION - LOCAL                                          *
+ *****************************************************************************/
+
+// Conversion for degrees to radians
+#define D2R 0.01745329252111111  /* PI/180 */
+
+// Conversion for radians to degrees
+#define R2D 57.29577950924861   /* 180.0/PI */
+
+
+// Unary SCALAR operations
+#define SCALAR(OUT,IN,OP,TYPE)                                                                               \
+{                                                                                                            \
+    ps##TYPE *o = NULL;                                                                                      \
+    ps##TYPE *i1 = NULL;                                                                                     \
+    o  = &((psScalar* )OUT)->data.TYPE;                                                                      \
+    i1 = &((psScalar* )IN)->data.TYPE;                                                                       \
+    *o = OP;                                                                                                 \
+}
+
+// Unary IMAGE operations
+#define VECTOR(OUT,IN,OP,TYPE)                                                                               \
+{                                                                                                            \
+    psS32 i = 0;                                                                                             \
+    psS32 nIn = 0;                                                                                           \
+    psS32 nOut = 0;                                                                                          \
+    ps##TYPE *o = NULL;                                                                                      \
+    ps##TYPE *i1 = NULL;                                                                                     \
+    nIn = ((psVector* )IN)->n;                                                                               \
+    nOut = ((psVector* )OUT)->n;                                                                             \
+    if(nIn != nOut) {                                                                                        \
+        psError(PS_ERR_BAD_PARAMETER_SIZE, true,                                                             \
+                PS_ERRORTEXT_psMatrix_COUNT_DIFFERS,                                                         \
+                nIn, nOut);                                                                                  \
+        if (OUT != IN) {                                                                                     \
+            psFree(OUT);                                                                                     \
+        }                                                                                                    \
+        return NULL;                                                                                         \
+    }                                                                                                        \
+    o  = ((psVector* )OUT)->data.TYPE;                                                                       \
+    i1 = ((psVector* )IN)->data.TYPE;                                                                        \
+    for(i = 0; i < nIn; i++, o++, i1++) {                                                                    \
+        *o = OP;                                                                                             \
+    }                                                                                                        \
+}
+
+// Unary IMAGE operations
+#define IMAGE(OUT,IN,OP,TYPE)                                                                                \
+{                                                                                                            \
+    psS32 i = 0;                                                                                             \
+    psS32 j = 0;                                                                                             \
+    psS32 numRowsIn = 0;                                                                                     \
+    psS32 numColsIn = 0;                                                                                     \
+    psS32 numRowsOut = 0;                                                                                    \
+    psS32 numColsOut = 0;                                                                                    \
+    ps##TYPE *o = NULL;                                                                                      \
+    ps##TYPE *i1 = NULL;                                                                                     \
+    numRowsIn = ((psImage* )IN)->numRows;                                                                    \
+    numColsIn = ((psImage* )IN)->numCols;                                                                    \
+    numRowsOut = ((psImage* )OUT)->numRows;                                                                  \
+    numColsOut = ((psImage* )OUT)->numCols;                                                                  \
+    if(numRowsIn!=numRowsOut || numColsIn!=numColsOut) {                                                     \
+        psError(PS_ERR_BAD_PARAMETER_SIZE, true,                                                             \
+                PS_ERRORTEXT_psMatrix_IMAGE_SIZE_DIFFERS,                                                    \
+                numColsIn, numRowsIn, numColsOut, numRowsOut);                                               \
+        if (OUT != IN) {                                                                                     \
+            psFree(OUT);                                                                                     \
+        }                                                                                                    \
+        return NULL;                                                                                         \
+    }                                                                                                        \
+    for(j = 0; j < numRowsIn; j++) {                                                                         \
+        o  = ((psImage* )OUT)->data.TYPE[j];                                                                 \
+        i1 = ((psImage* )IN)->data.TYPE[j];                                                                  \
+        for(i = 0; i < numColsIn; i++, o++, i1++) {                                                          \
+            *o = OP;                                                                                         \
+        }                                                                                                    \
+    }                                                                                                        \
+}
+
+// Preprocessor macro function to create arithmetic function based on input type
+#define UNARY_TYPE(DIM,OUT,IN,OP)                                                                            \
+switch (IN->type) {                                                                                          \
+case PS_TYPE_S32:                                                                                            \
+    DIM(OUT,IN,OP,S32);                                                                                      \
+    break;                                                                                                   \
+case PS_TYPE_F32:                                                                                            \
+    DIM(OUT,IN,OP,F32);                                                                                      \
+    break;                                                                                                   \
+case PS_TYPE_F64:                                                                                            \
+    DIM(OUT,IN,OP,F64);                                                                                      \
+    break;                                                                                                   \
+case PS_TYPE_C32:                                                                                            \
+    DIM(OUT,IN,OP,C32);                                                                                      \
+    break;                                                                                                   \
+case PS_TYPE_S8:                                                                                             \
+    DIM(OUT,IN,OP,C32);                                                                                      \
+    break;                                                                                                   \
+case PS_TYPE_U8:                                                                                             \
+    DIM(OUT,IN,OP,C32);                                                                                      \
+    break;                                                                                                   \
+case PS_TYPE_S16:                                                                                            \
+    DIM(OUT,IN,OP,C32);                                                                                      \
+    break;                                                                                                   \
+case PS_TYPE_U16:                                                                                            \
+    DIM(OUT,IN,OP,C32);                                                                                      \
+    break;                                                                                                   \
+case PS_TYPE_U32:                                                                                            \
+    DIM(OUT,IN,OP,C32);                                                                                      \
+    break;                                                                                                   \
+case PS_TYPE_S64:                                                                                            \
+    DIM(OUT,IN,OP,C32);                                                                                      \
+    break;                                                                                                   \
+case PS_TYPE_U64:                                                                                            \
+    DIM(OUT,IN,OP,C32);                                                                                      \
+    break;                                                                                                   \
+case PS_TYPE_C64:                                                                                            \
+    DIM(OUT,IN,OP,C32);                                                                                      \
+    break;                                                                                                   \
+default: {                                                                                                     \
+        char* strType;                                                                                           \
+        PS_TYPE_NAME(strType, IN->type);                                                                         \
+        psError(PS_ERR_BAD_PARAMETER_TYPE, true,                                                                 \
+                PS_ERRORTEXT_psMatrix_TYPE_MISMATCH,                                                             \
+                strType);                                                                                        \
+        if (OUT != IN) {                                                                                         \
+            psFree(OUT);                                                                                         \
+        }                                                                                                        \
+        return NULL;                                                                                             \
+    } \
+}
+
+// Preprocessor macro function to create arithmetic function operation name. Functions below that add
+// FLT_EPSILON are done so to align results with a 64 bit computing architecture
+#define UNARY_OP(DIM,OUT,IN,OP)                                                                              \
+if(!strncmp(OP, "abs", 3)) {                                                                                 \
+    if(PS_IS_PSELEMTYPE_COMPLEX(IN->type)) {                                                                 \
+        UNARY_TYPE(DIM,OUT,IN,cabs(*i1));                                                                    \
+    } else {                                                                                                 \
+        UNARY_TYPE(DIM,OUT,IN,fabs(*i1));                                                                    \
+    }                                                                                                        \
+} else if(!strncmp(OP, "exp", 3)) {                                                                          \
+    if(PS_IS_PSELEMTYPE_COMPLEX(IN->type)) {                                                                 \
+        UNARY_TYPE(DIM,OUT,IN,cexp(*i1));                                                                    \
+    } else {                                                                                                 \
+        UNARY_TYPE(DIM,OUT,IN,exp(*i1));                                                                     \
+    }                                                                                                        \
+} else if(!strncmp(OP, "ln", 2)) {                                                                           \
+    if(PS_IS_PSELEMTYPE_COMPLEX(IN->type)) {                                                                 \
+        UNARY_TYPE(DIM,OUT,IN,clog(*i1));                                                                    \
+    } else {                                                                                                 \
+        UNARY_TYPE(DIM,OUT,IN,log(*i1));                                                                     \
+    }                                                                                                        \
+} else if(!strncmp(OP, "ten", 3)) {                                                                          \
+    if(PS_IS_PSELEMTYPE_COMPLEX(IN->type)) {                                                                 \
+        UNARY_TYPE(DIM,OUT,IN,cpow(10.0,*i1));                                                               \
+    } else {                                                                                                 \
+        UNARY_TYPE(DIM,OUT,IN,pow(10.0,*i1));                                                                \
+    }                                                                                                        \
+} else if(!strncmp(OP, "log", 3)) {                                                                          \
+    if(PS_IS_PSELEMTYPE_COMPLEX(IN->type)) {                                                                 \
+        UNARY_TYPE(DIM,OUT,IN,clog(*i1)/log(10.0));                                                          \
+    } else {                                                                                                 \
+        UNARY_TYPE(DIM,OUT,IN,log10(*i1));                                                                   \
+    }                                                                                                        \
+} else if(!strncmp(OP, "sin", 3)) {                                                                          \
+    if(PS_IS_PSELEMTYPE_COMPLEX(IN->type)) {                                                                 \
+        UNARY_TYPE(DIM,OUT,IN,csin(*i1));                                                                    \
+    } else {                                                                                                 \
+        UNARY_TYPE(DIM,OUT,IN,sin(*i1));                                                                     \
+    }                                                                                                        \
+} else if(!strncmp(OP, "dsin", 4)) {                                                                         \
+    if(PS_IS_PSELEMTYPE_COMPLEX(IN->type)) {                                                                 \
+        UNARY_TYPE(DIM,OUT,IN,csin(*i1*D2R));                                                                \
+    } else {                                                                                                 \
+        UNARY_TYPE(DIM,OUT,IN,sin(*i1*D2R));                                                                 \
+    }                                                                                                        \
+} else if(!strncmp(OP, "cos", 3)) {                                                                          \
+    if(PS_IS_PSELEMTYPE_COMPLEX(IN->type)) {                                                                 \
+        UNARY_TYPE(DIM,OUT,IN,ccos(*i1));                                                                    \
+    } else {                                                                                                 \
+        UNARY_TYPE(DIM,OUT,IN,cos(*i1));                                                                     \
+    }                                                                                                        \
+} else if(!strncmp(OP, "dcos", 4)) {                                                                         \
+    if(PS_IS_PSELEMTYPE_COMPLEX(IN->type)) {                                                                 \
+        UNARY_TYPE(DIM,OUT,IN,ccos(*i1*D2R));                                                                \
+    } else {                                                                                                 \
+        UNARY_TYPE(DIM,OUT,IN,cos(*i1*D2R));                                                                 \
+    }                                                                                                        \
+} else if(!strncmp(OP, "tan", 3)) {                                                                          \
+    if(PS_IS_PSELEMTYPE_COMPLEX(IN->type)) {                                                                 \
+        UNARY_TYPE(DIM,OUT,IN,ctan(*i1));                                                                    \
+    } else {                                                                                                 \
+        UNARY_TYPE(DIM,OUT,IN,tan(*i1));                                                                     \
+    }                                                                                                        \
+} else if(!strncmp(OP, "dtan", 4)) {                                                                         \
+    if(PS_IS_PSELEMTYPE_COMPLEX(IN->type)) {                                                                 \
+        UNARY_TYPE(DIM,OUT,IN,ctan(*i1*D2R));                                                                \
+    } else {                                                                                                 \
+        UNARY_TYPE(DIM,OUT,IN,tan(*i1*D2R));                                                                 \
+    }                                                                                                        \
+} else if(!strncmp(OP, "asin", 4)) {                                                                         \
+    if(PS_IS_PSELEMTYPE_COMPLEX(IN->type)) {                                                                 \
+        UNARY_TYPE(DIM,OUT,IN,casin(*i1));                                                                   \
+    } else {                                                                                                 \
+        UNARY_TYPE(DIM,OUT,IN,asin(*i1));                                                                    \
+    }                                                                                                        \
+} else if(!strncmp(OP, "dasin", 5)) {                                                                        \
+    if(PS_IS_PSELEMTYPE_COMPLEX(IN->type)) {                                                                 \
+        UNARY_TYPE(DIM,OUT,IN,R2D*casin(*i1));                                                               \
+    } else if(PS_IS_PSELEMTYPE_INT(IN->type)) {                                                              \
+        UNARY_TYPE(DIM,OUT,IN,(R2D*asin(*i1)));                                                              \
+    } else {                                                                                                 \
+        UNARY_TYPE(DIM,OUT,IN,(R2D*asin(*i1)));                                                              \
+    }                                                                                                        \
+} else if(!strncmp(OP, "acos", 4)) {                                                                         \
+    if(PS_IS_PSELEMTYPE_COMPLEX(IN->type)) {                                                                 \
+        UNARY_TYPE(DIM,OUT,IN,cacos(*i1));                                                                   \
+    } else {                                                                                                 \
+        UNARY_TYPE(DIM,OUT,IN,acos(*i1));                                                                    \
+    }                                                                                                        \
+} else if(!strncmp(OP, "dacos", 5)) {                                                                        \
+    if(PS_IS_PSELEMTYPE_COMPLEX(IN->type)) {                                                                 \
+        UNARY_TYPE(DIM,OUT,IN,R2D*cacos(*i1));                                                               \
+    } else if(PS_IS_PSELEMTYPE_INT(IN->type)) {                                                              \
+        UNARY_TYPE(DIM,OUT,IN,(R2D*acos(*i1)));                                                              \
+    } else {                                                                                                 \
+        UNARY_TYPE(DIM,OUT,IN,R2D*acos(*i1));                                                                \
+    }                                                                                                        \
+} else if(!strncmp(OP, "atan", 4)) {                                                                         \
+    if(PS_IS_PSELEMTYPE_COMPLEX(IN->type)) {                                                                 \
+        UNARY_TYPE(DIM,OUT,IN,catan(*i1));                                                                   \
+    } else {                                                                                                 \
+        UNARY_TYPE(DIM,OUT,IN,atan(*i1));                                                                    \
+    }                                                                                                        \
+} else if(!strncmp(OP, "datan", 5)) {                                                                        \
+    if(PS_IS_PSELEMTYPE_COMPLEX(IN->type)) {                                                                 \
+        UNARY_TYPE(DIM,OUT,IN,R2D*catan(*i1));                                                               \
+    } else {                                                                                                 \
+        UNARY_TYPE(DIM,OUT,IN,R2D*atan(*i1));                                                                \
+    }                                                                                                        \
+} else {                                                                                                     \
+    psError(PS_ERR_BAD_PARAMETER_VALUE, true,                                                                \
+            PS_ERRORTEXT_psMatrix_OPERATION_UNSUPPORTED,                                                     \
+            OP);                                                                                             \
+    if (OUT != IN) {                                                                                         \
+        psFree(OUT);                                                                                         \
+    }                                                                                                        \
+    return NULL;                                                                                             \
+}
+
+psPtr psUnaryOp(psPtr out, psPtr in, char *op)
+{
+    #define psUnaryOp_EXIT { \
+                             if (out != in) { \
+                             psFree(out); \
+                             } \
+                             return NULL; \
+                           }
+
+    psType* psTypeIn = (psType* ) in;
+
+    PS_PTR_CHECK_NULL_GENERAL(in, psUnaryOp_EXIT);
+    PS_PTR_CHECK_NULL_GENERAL(op, psUnaryOp_EXIT);
+
+    psDimen dimIn = psTypeIn->dimen;
+    psElemType elTypeIn = psTypeIn->type;
+
+    switch (dimIn) {
+    case PS_DIMEN_SCALAR:
+        if (out == NULL ||
+                ((psType*)out)->dimen != PS_DIMEN_SCALAR ||
+                ((psScalar*)out)->type.type != elTypeIn) {
+            psFree(out);
+            out = psScalarAlloc(0.0,elTypeIn);
+        }
+        UNARY_OP(SCALAR, out, psTypeIn, op);    // scalar
+        break;
+    case PS_DIMEN_VECTOR:
+    case PS_DIMEN_TRANSV:
+        if (((psVector*)in)->n == 0) {
+            psError(PS_ERR_BAD_PARAMETER_SIZE, true,
+                    PS_ERRORTEXT_psMatrix_VECTOR_EMPTY);
+            psUnaryOp_EXIT;
+        }
+
+        out = psVectorRecycle(out,
+                              ((psVector*)in)->n,
+                              elTypeIn);
+        if (out == NULL) {
+            psError(PS_ERR_UNKNOWN, false,
+                    PS_ERRORTEXT_psMatrix_OUTPUT_VECTOR_NOT_CREATED);
+            psUnaryOp_EXIT;
+        }
+
+        UNARY_OP(VECTOR, out, psTypeIn, op);    // vector
+        break;
+    case PS_DIMEN_IMAGE:
+        if (((psImage* ) in)->numCols == 0 || ((psImage* ) in)->numRows == 0) {
+            psError(PS_ERR_BAD_PARAMETER_SIZE, true,
+                    PS_ERRORTEXT_psMatrix_IMAGE_EMPTY);
+            psUnaryOp_EXIT;
+        }
+
+        out = psImageRecycle(out,
+                             ((psImage*)in)->numCols,
+                             ((psImage*)in)->numRows,
+                             elTypeIn);
+        if (out == NULL) {
+            psError(PS_ERR_UNKNOWN, false,
+                    PS_ERRORTEXT_psMatrix_OUTPUT_IMAGE_NOT_CREATED);
+            psUnaryOp_EXIT;
+        }
+
+        UNARY_OP(IMAGE, out, psTypeIn, op);     // image
+        break;
+    default:
+        if (out != in) {
+            psFree(out);
+        }
+        psError(PS_ERR_BAD_PARAMETER_SIZE, true,
+                PS_ERRORTEXT_psMatrix_DIMEN_INVALID,
+                "in", dimIn);
+        psUnaryOp_EXIT;
+    }
+
+    // Automtically free psScalar types, since they are usually allocated in the argument list when this
+    // function is called, provided that the input is not the output.
+    if(psTypeIn->dimen==PS_DIMEN_SCALAR && in!=out) {
+        psFree(in);
+    }
+
+    return out;
+}
Index: /tags/ipp-1-X/bug123/psLib/src/dataManip/psUnaryOp.h
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/dataManip/psUnaryOp.h	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/dataManip/psUnaryOp.h	(revision 22331)
@@ -0,0 +1,69 @@
+/** @file  psUnaryOp.h
+ *
+ *  @brief Provides unary functions for simple matrix and vector element operations. Functions
+ *  include:
+ *
+ *      Addition (+)
+ *      Subtraction (-)
+ *      Multiplication (*)
+ *      Division (/)
+ *      Power (^)
+ *      Minimum (min)
+ *      Maximum (max)
+ *      Absolute value (abs)
+ *      Exponent (exp)
+ *      Natural Log (ln)
+ *      Power of 10 (ten)
+ *      Log (log)
+ *      Sine (sin or dsin)
+ *      Cosine (cos or dcos)
+ *      Tangent (tan or dtan)
+ *      Arcsine (asin or dasin)
+ *      Arccosine (acos or dacos)
+ *      Arctan (atan or datan)
+ *
+ *  Currently only vector-vector and image-image binary operations are supported.
+ *
+ *  @ingroup MatrixArithmetic
+ *
+ *  @author Ross Harman, MHPCC
+ *  @author Robert DeSonia, MHPCC
+ *
+ *  @version $Revision: 1.1 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-02-10 02:36:41 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+
+#ifndef PSUNARY_OP_H
+#define PSUNARY_OP_H
+
+/// @addtogroup MatrixArithmetic
+/// @{
+
+
+/** Perform simple unary arithmetic with images or vectors
+ *
+ *  Performs absolute value, exponent, natural log, power of 10, log, sine, cosine, tangent, arcsine,
+ *  arccosine, or arctan. operations with images and vectors. Uses the form:
+ *
+ *     out = op(in),
+ *
+ *     Where op is: "abs", "exp", "ln", "ten", "log", "sin", "cos", "tan" "asin", "acos", "atan", "dsin",
+ *                  "dcos", dtan", "dasin", "dacos", or "datan".
+ *
+ *  Trigometric Operations with "d" prefix use units of degrees. Those without are in radians.
+ *
+ *  This function only supports vector-vector or image-image opertions.
+ *
+ *  @return  psType* : Pointer to either psImage or psVector.
+ */
+psType* psUnaryOp(
+    psPtr out,                         ///< Output type, either psImage or psVector.
+    psPtr in,                          ///< Input, either psImage or psVector.
+    char *op                           ///< Operator.
+);
+
+/// @}
+
+#endif
Index: /tags/ipp-1-X/bug123/psLib/src/dataManip/psVectorFFT.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/dataManip/psVectorFFT.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/dataManip/psVectorFFT.c	(revision 22331)
@@ -0,0 +1,418 @@
+/** @file  psVectorFFT.c
+ *
+ *  @brief Contains FFT transform related functions for psVector
+ *
+ *  @author Robert DeSonia, MHPCC
+ *
+ *  @version $Revision: 1.31 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-03-22 21:52:49 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+
+#include <unistd.h>
+#include <stdbool.h>
+#include <string.h>
+#include <complex.h>
+#include <fftw3.h>
+
+#include "psVectorFFT.h"
+#include "psError.h"
+#include "psMemory.h"
+#include "psLogMsg.h"
+#include "psImageExtraction.h"
+
+#include "psDataManipErrors.h"
+
+#define P_FFTW_PLAN_RIGOR FFTW_ESTIMATE
+
+static psBool p_fftwWisdomImported = false;
+
+psVector* psVectorFFT(psVector* out, const psVector* in, psFFTFlags direction)
+{
+    psU32 numElements;
+    psElemType type;
+    fftwf_plan plan;
+
+    /* got good image data? */
+    if (in == NULL) {
+        psFree(out);
+        return NULL;
+    }
+
+    type = in->type.type;
+
+    /* make sure the system-level wisdom information is imported. */
+    if (!p_fftwWisdomImported) {
+        fftwf_import_system_wisdom();
+        p_fftwWisdomImported = true;
+    }
+
+    numElements = in->n;
+
+    out = psVectorCopy(out, in, PS_TYPE_C32);
+    out->n = numElements;
+
+    if ((direction & PS_FFT_FORWARD) != 0) {
+        plan = fftwf_plan_dft_1d(numElements,
+                                 (fftwf_complex *) out->data.C32,
+                                 (fftwf_complex *) out->data.C32, FFTW_FORWARD, P_FFTW_PLAN_RIGOR);
+    } else if ((direction & PS_FFT_REVERSE) != 0) {
+        plan = fftwf_plan_dft_1d(numElements,
+                                 (fftwf_complex *) out->data.C32,
+                                 (fftwf_complex *) out->data.C32, FFTW_BACKWARD, P_FFTW_PLAN_RIGOR);
+    } else {
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true,
+                PS_ERRORTEXT_psVectorFFT_DIRECTION_NOTSET);
+        psFree(out);
+        return NULL;
+    }
+
+    /* check if a plan exists now */
+    if (plan == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                PS_ERRORTEXT_psVectorFFT_FFTW_PLAN_NULL);
+        psFree(out);
+        return NULL;
+    }
+
+    /* finally, call FFTW with the plan made above */
+    fftwf_execute(plan);
+
+    fftwf_destroy_plan(plan);
+
+    if ((direction & PS_FFT_REAL_RESULT) != 0) {
+        for (psS32 i = 0; i < numElements; i++) {
+            out->data.F32[i] = out->data.C32[i];
+        }
+        out->type.type = PS_TYPE_F32;
+        out->data.U8 = psRealloc(out->data.U8,PSELEMTYPE_SIZEOF(PS_TYPE_F32)*out->nalloc);
+    }
+
+    return out;
+}
+
+psVector* psVectorReal(psVector* out, const psVector* in)
+{
+    psElemType type;
+    psU32 numElements;
+
+    if (in == NULL) {
+        psFree(out);
+        return NULL;
+    }
+
+    type = in->type.type;
+    numElements = in->n;
+
+    /* if not a complex number, this is logically just a copy */
+    if (!PS_IS_PSELEMTYPE_COMPLEX(type)) {
+        // Warn user, as this is probably not expected
+        psLogMsg(__func__, PS_LOG_WARN, "Real portion of a non-Complex type called called for. "
+                 "Just a vector copy was performed.");
+        out = psVectorRecycle(out, numElements, type);
+        out->n = numElements;
+        memcpy(out->data.U8, in->data.U8, numElements * PSELEMTYPE_SIZEOF(type));
+        return out;
+    }
+
+    if (type == PS_TYPE_C32) {
+        psF32* outVec;
+        psC32* inVec = in->data.C32;
+
+        out = psVectorRecycle(out, numElements, PS_TYPE_F32);
+        out->n = numElements;
+        outVec = out->data.F32;
+
+        for (psU32 i = 0; i < numElements; i++) {
+            outVec[i] = crealf(inVec[i]);
+        }
+    } else if (type == PS_TYPE_C64) {
+        psF64* outVec;
+        psC64* inVec = in->data.C64;
+
+        out = psVectorRecycle(out, numElements, PS_TYPE_F64);
+        out->n = numElements;
+        outVec = out->data.F64;
+
+        for (psU32 i = 0; i < numElements; i++) {
+            outVec[i] = creal(inVec[i]);
+        }
+    } else {
+        char* typeStr;
+        PS_TYPE_NAME(typeStr,type);
+        psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                PS_ERRORTEXT_psVectorFFT_TYPE_UNSUPPORTED,
+                typeStr);
+        psFree(out);
+        return NULL;
+    }
+
+    return out;
+}
+
+psVector* psVectorImaginary(psVector* out, const psVector* in)
+{
+    psElemType type;
+    psU32 numElements;
+
+    if (in == NULL) {
+        psFree(out);
+        return NULL;
+    }
+
+    type = in->type.type;
+    numElements = in->n;
+
+    /* if not a complex number, this is logically just zeroed image of same size */
+    if (!PS_IS_PSELEMTYPE_COMPLEX(type)) {
+        // Warn user, as this is probably not expected
+        psLogMsg(__func__, PS_LOG_WARN, "Imaginary portion of a non-Complex type called for. "
+                 "A zeroed vector was returned.");
+        out = psVectorRecycle(out, numElements, type);
+        out->n = numElements;
+        memset(out->data.U8, 0, PSELEMTYPE_SIZEOF(type) * numElements);
+        return out;
+    }
+
+    if (type == PS_TYPE_C32) {
+        psF32* outVec;
+        psC32* inVec = in->data.C32;
+
+        out = psVectorRecycle(out, numElements, PS_TYPE_F32);
+        out->n = numElements;
+        outVec = out->data.F32;
+
+        for (psU32 i = 0; i < numElements; i++) {
+            outVec[i] = cimagf(inVec[i]);
+        }
+    } else if (type == PS_TYPE_C64) {
+        psF64* outVec;
+        psC64* inVec = in->data.C64;
+
+        out = psVectorRecycle(out, numElements, PS_TYPE_F64);
+        out->n = numElements;
+        outVec = out->data.F64;
+
+        for (psU32 i = 0; i < numElements; i++) {
+            outVec[i] = cimag(inVec[i]);
+        }
+    } else {
+        char* typeStr;
+        PS_TYPE_NAME(typeStr,type);
+        psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                PS_ERRORTEXT_psVectorFFT_TYPE_UNSUPPORTED,
+                typeStr);
+        psFree(out);
+        return NULL;
+    }
+
+    return out;
+}
+
+psVector* psVectorComplex(psVector* out, const psVector* real, const psVector* imag)
+{
+    psElemType type;
+    psU32 numElements;
+
+    if (real == NULL || imag == NULL) {
+        psFree(out);
+        return NULL;
+    }
+
+    type = real->type.type;
+    if (real->n < imag->n) {
+        numElements = real->n;
+    } else {
+        numElements = imag->n;
+    }
+
+    if (imag->type.type != type) {
+        char* typeStrReal;
+        char* typeStrImag;
+        PS_TYPE_NAME(typeStrReal,type);
+        PS_TYPE_NAME(typeStrImag,imag->type.type);
+        psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                PS_ERRORTEXT_psVectorFFT_REAL_IMAG_TYPE_MISMATCH,
+                typeStrReal,typeStrImag);
+        psFree(out);
+        return NULL;
+    }
+
+    if (type == PS_TYPE_F32) {
+        psC32* outVec;
+        psF32* realVec = real->data.F32;
+        psF32* imagVec = imag->data.F32;
+
+        out = psVectorRecycle(out, numElements, PS_TYPE_C32);
+        out->n = numElements;
+        outVec = out->data.C32;
+
+        for (psU32 i = 0; i < numElements; i++) {
+            outVec[i] = realVec[i] + I * imagVec[i];
+        }
+    } else if (type == PS_TYPE_F64) {
+        psC64* outVec;
+        psF64* realVec = real->data.F64;
+        psF64* imagVec = imag->data.F64;
+
+        out = psVectorRecycle(out, numElements, PS_TYPE_C64);
+        out->n = numElements;
+        outVec = out->data.C64;
+
+        for (psU32 i = 0; i < numElements; i++) {
+            outVec[i] = realVec[i] + I * imagVec[i];
+        }
+    } else {
+        char* typeStr;
+        PS_TYPE_NAME(typeStr,type);
+        psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                PS_ERRORTEXT_psVectorFFT_NONREAL_NOTSUPPORTED,
+                typeStr);
+        psFree(out);
+        return NULL;
+    }
+
+    return out;
+}
+
+psVector* psVectorConjugate(psVector* out, const psVector* in)
+{
+    psElemType type;
+    psU32 numElements;
+
+    if (in == NULL) {
+        psFree(out);
+        return NULL;
+    }
+
+    type = in->type.type;
+    numElements = in->n;
+
+    /* if not a complex number, this is logically just a image copy */
+    if (!PS_IS_PSELEMTYPE_COMPLEX(type)) {
+        // Warn user, as this is probably not expected
+        psLogMsg(__func__, PS_LOG_WARN, "Complex Conjugate of a non-Complex type called for. "
+                 "Vector copy was performed instead.");
+
+        out = psVectorRecycle(out, numElements, type);
+        out->n = numElements;
+        memcpy(out->data.U8, in->data.U8, PSELEMTYPE_SIZEOF(type) * numElements);
+        return out;
+    }
+
+    if (type == PS_TYPE_C32) {
+        psC32* outVec;
+        psC32* inVec = in->data.C32;
+
+        out = psVectorRecycle(out, numElements, PS_TYPE_C32);
+        out->n = numElements;
+        outVec = out->data.C32;
+
+        for (psU32 i = 0; i < numElements; i++) {
+            outVec[i] = crealf(inVec[i]) - I * cimagf(inVec[i]);
+        }
+    } else if (type == PS_TYPE_C64) {
+        psC64* outVec;
+        psC64* inVec = in->data.C64;
+
+        out = psVectorRecycle(out, numElements, PS_TYPE_C64);
+        out->n = numElements;
+        outVec = out->data.C64;
+
+        for (psU32 i = 0; i < numElements; i++) {
+            outVec[i] = creal(inVec[i]) - I * cimag(inVec[i]);
+        }
+    } else {
+        char* typeStr;
+        PS_TYPE_NAME(typeStr,type);
+        psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                PS_ERRORTEXT_psVectorFFT_NONCOMPLEX_NOTSUPPORTED,
+                typeStr);
+        psFree(out);
+        return NULL;
+    }
+
+    return out;
+}
+
+psVector* psVectorPowerSpectrum(psVector* out, const psVector* in)
+{
+    psElemType type;
+    psU32 outNumElements;
+    psU32 inNumElements;
+    psU32 inHalfNumElements;
+    psU32 inNumElementsSquared;
+
+    if (in == NULL) {
+        psFree(out);
+        return NULL;
+    }
+
+    type = in->type.type;
+    inNumElements = in->n;
+    inNumElementsSquared = inNumElements * inNumElements;
+    inHalfNumElements = inNumElements / 2;
+    outNumElements = inHalfNumElements + 1;
+
+    if (type == PS_TYPE_C32) {
+        psF32* outVec;
+        psC32* inVec = in->data.C32;
+        psF32 inAbs1;
+        psF32 inAbs2;
+
+        out = psVectorRecycle(out, outNumElements, PS_TYPE_F32);
+        out->n = outNumElements;
+        outVec = out->data.F32;
+
+        // from ADD: P_0 = |C_0|^2/N^2
+        inAbs1 = cabsf(inVec[0]);
+        outVec[0] = inAbs1 * inAbs1 / inNumElementsSquared;
+
+        // from ADD: P_j = (|C_j|^2+|C_N-j|^2)/N^2, where j = 1,2,...,(N/2-1)
+        for (psU32 i = 1; i < inHalfNumElements; i++) {
+            inAbs1 = cabsf(inVec[i]);
+            inAbs2 = cabsf(inVec[inNumElements - i]);
+            outVec[i] = (inAbs1 * inAbs1 + inAbs2 * inAbs2) / inNumElementsSquared;
+        }
+
+        // from ADD: P_N/2 = |C_N/2|^2/N^2
+        inAbs1 = cabsf(inVec[inHalfNumElements]);
+        outVec[inHalfNumElements] = inAbs1 * inAbs1 / inNumElementsSquared;
+    } else if (type == PS_TYPE_C64) {
+        psF64* outVec;
+        psC64* inVec = in->data.C64;
+        psF64 inAbs1;
+        psF64 inAbs2;
+
+        out = psVectorRecycle(out, outNumElements, PS_TYPE_F64);
+        out->n = outNumElements;
+        outVec = out->data.F64;
+
+        // from ADD: P_0 = |C_0|^2/N^2
+        inAbs1 = cabs(inVec[0]);
+        outVec[0] = inAbs1 * inAbs1 / inNumElementsSquared;
+
+        // from ADD: P_j = (|C_j|^2+|C_N-j|^2)/N^2, where j = 1,2,...,(N/2-1)
+        for (psU32 i = 1; i < inHalfNumElements; i++) {
+            inAbs1 = cabs(inVec[i]);
+            inAbs2 = cabs(inVec[inNumElements - i]);
+            outVec[i] = (inAbs1 * inAbs1 + inAbs2 * inAbs2) / inNumElementsSquared;
+        }
+
+        // from ADD: P_N/2 = |C_N/2|^2/N^2
+        inAbs1 = cabs(inVec[inHalfNumElements]);
+        outVec[inHalfNumElements] = inAbs1 * inAbs1 / inNumElementsSquared;
+    } else {
+        char* typeStr;
+        PS_TYPE_NAME(typeStr,type);
+        psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                PS_ERRORTEXT_psVectorFFT_NONCOMPLEX_NOTSUPPORTED,
+                typeStr);
+        psFree(out);
+        return NULL;
+    }
+
+    return out;
+
+}
Index: /tags/ipp-1-X/bug123/psLib/src/dataManip/psVectorFFT.h
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/dataManip/psVectorFFT.h	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/dataManip/psVectorFFT.h	(revision 22331)
@@ -0,0 +1,99 @@
+/** @file  psVectorFFT.h
+ *
+ *  @brief Contains FFT transform related functions for psVector
+ *
+ *  @ingroup Transform
+ *
+ *  @author Robert DeSonia, MHPCC
+ *
+ *  @version $Revision: 1.17 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-02-17 19:26:23 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+
+#ifndef PS_VECTOR_FFT_H
+#define PS_VECTOR_FFT_H
+
+#include "psVector.h"
+
+/// @addtogroup Transform
+/// @{
+
+/** Specify direction of FFT */
+typedef enum {
+    /// psImageFFT/psVectorFFT should perform a forward FFT.
+    PS_FFT_FORWARD = 1,
+
+    /// psImageFFT/psVectorFFT should perform a reverse FFT.
+    PS_FFT_REVERSE = 2,
+
+    /// psImageFFT/psVectorFFT should perform a reverse FFT with a real result.
+    PS_FFT_REAL_RESULT = 4
+} psFFTFlags;
+
+
+/** Forward and reverse FFT calculations.
+ *
+ *  This takes as input the vector of interest (in) and the direction 
+ *  (direction), which is specified by an enumerated type psFftDirection.
+ *  The input vector may be of type psF32 or psC32, the result is always 
+ *  psC32. If the input vector is psF32, the direction must be forward. 
+ *  
+ *  @return psVector* the FFT transformation result
+ */
+psVector* psVectorFFT(
+    psVector* out,                     ///< a psVector to recycle.  If NULL, a new psVector is made.
+    const psVector* in,                ///< the vector to apply transform to
+    psFFTFlags direction               ///< the direction of the transform
+);
+
+/** extract the real portion of a complex vector
+ * 
+ *  @return psVector*   real portion of the input vector.
+ */
+psVector* psVectorReal(
+    psVector* out,                     ///< a psVector to recycle.  If NULL, a new psVector is made.
+    const psVector* in                ///< the psVector to extract real portion from
+);
+
+/** extract the imaginary portion of a complex vector
+ * 
+ *  @return psVector*   imaginary portion of the input vector.
+ */
+psVector* psVectorImaginary(
+    psVector* out,                     ///< a psVector to recycle.  If NULL, a new psVector is made.
+    const psVector* in                 ///< the psVector to extract imaginary portion from
+);
+
+/** creates a complex vector from separate real and imaginary vectors
+ * 
+ *  @return psVector*   resulting complex vector
+ */
+psVector* psVectorComplex(
+    psVector* out,                     ///< a psVector to recycle.  If NULL, a new psVector is made.
+    const psVector* real,              ///< the real vector
+    const psVector* imag               ///< the imaginary vector
+);
+
+/** computes the complex conjugate of a vector
+ * 
+ *  @return psVector*   the complex conjugate of the 'in' vector
+ */
+psVector* psVectorConjugate(
+    psVector* out,                     ///< a psVector to recycle.  If NULL, a new psVector is made.
+    const psVector* in                 ///< the psVector to compute conjugate of
+);
+
+/** computes the power spectrum of a vector
+ * 
+ *  @return psVector*   the power spectrum of the 'in' vector
+ */
+psVector* psVectorPowerSpectrum(
+    psVector* out,                     ///< a psVector to recycle.  If NULL, a new psVector is made.
+    const psVector* in                 ///< the psVector to power spectrum of
+);
+
+/// @}
+
+#endif
Index: /tags/ipp-1-X/bug123/psLib/src/db/psDB.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/db/psDB.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/db/psDB.c	(revision 22331)
@@ -0,0 +1,1705 @@
+/** @file  psDB.c
+ *
+ * -*- mode: C; c-basic-indent: 4; tab-width: 8; indent-tabs-mode: nil -*-
+ * vim: set cindent ts=8 sw=4 expandtab:
+ *
+ *  @brief database functions
+ *
+ *  This file contains functions that perform basic database operations.  MySQL
+ *  4.1.2 or newer is required.
+ *
+ *  @author Aaron Culliney
+ *  @author Joshua Hoblitt
+ *
+ *  @version $Revision: 1.14 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-04-06 01:12:58 $
+ *
+ *  Copyright 2005 Joshua Hoblitt, University of Hawaii
+ */
+
+#ifdef BUILD_PSDB
+
+#include <stdio.h>
+#include <stdarg.h>
+#include <string.h>
+#include <stdlib.h>
+#include <math.h>
+#include <mysql.h>
+#include <mysql_com.h> // enum_field_types
+
+#include "psDB.h"
+#include "psMemory.h"
+#include "psAbort.h"
+#include "psError.h"
+#include "psString.h"
+
+
+typedef struct
+{
+    enum enum_field_types type;
+    bool            isUnsigned;
+}
+mysqlType;
+
+// database utility functions
+static bool     psDBRunQuery(psDB *dbh, const char *query);
+static inline bool psDBPackRow(MYSQL_BIND *bind, psMetadata *values, psU32 paramCount);
+
+// SQL generation functions
+static char    *psDBGenerateCreateTableSQL(const char *tableName, psMetadata *where);
+static char    *psDBGenerateSelectRowSQL(const char *tableName, const char *col, psMetadata *where, psU64 limit);
+static char    *psDBGenerateInsertRowSQL(const char *tableName, psMetadata *row);
+static char    *psDBGenerateUpdateRowSQL(const char *tableName, psMetadata *where, psMetadata *values);
+static char    *psDBGenerateDeleteRowSQL(const char *tableName, psMetadata *where);
+static char    *psDBGenerateWhereSQL(psMetadata *where);
+static char    *psDBGenerateSetSQL(psMetadata *set
+                                  );
+
+// lookup table functions
+static psElemType psDBMySQLToPType(enum enum_field_types type, unsigned int flags);
+static char    *psDBPTypeToSQL(psElemType pType);
+static mysqlType *psDBPTypeToMySQL(psElemType pType);
+
+static psHash  *psDBGetPTypeToSQLTable(void);
+static void     psDBPTypeToSQLTableCleanup(void);
+
+static psHash  *psDBGetSQLToPTypeTable(void);
+static void     psDBSQLToPTypeTableCleanup(void);
+
+static psHash  *psDBGetMySQLToSQLTable(void);
+static void     psDBMySQLToSQLTableCleanup(void);
+
+static psHash  *psDBGetPTypeToMySQLTable(void);
+static void     psDBPTypeToMySQLTableCleanup(void);
+
+static psPtr    psDBMySQLTypeAlloc(enum enum_field_types type, bool isUnsigned);
+static void     psDBAddToLookupTable(psHash *lookupTable, psU32 type, const char *string);
+static void     psDBAddVoidToLookupTable(psHash *lookupTable, psU32 type, psPtr value);
+
+// pType utility functions
+static psPtr    psDBGetPTypeNaN(psElemType pType);
+static bool     psDBIsPTypeNaN(psElemType pType, psPtr data);
+
+// string utility functions
+static char    *psDBIntToString(psU64 n);
+static ssize_t  psStringAppend(char **dest, const char *format, ...);
+static ssize_t  psStringPrepend(char **dest, const char *format, ...);
+
+
+// public functions
+/*****************************************************************************/
+
+psDB *psDBInit(const char *host, const char *user, const char *passwd, const char *dbname)
+{
+    MYSQL           *mysql;
+    psDB            *dbh;
+
+    mysql = mysql_init(NULL);
+    if (!mysql) {
+        psAbort(__func__, "mysql_init(), out of memory.");
+    }
+
+    if (!mysql_real_connect(mysql, host, user, passwd, dbname, 0, NULL, 0)) {
+        psError(PS_ERR_UNKNOWN, true, "Failed to connect to database.  Error: %s", mysql_error(mysql));
+
+        mysql_close(mysql);
+
+        return NULL;
+    }
+
+    dbh = psAlloc(sizeof(psDB));
+
+    dbh->mysql = mysql;
+
+    return dbh;
+}
+
+void psDBCleanup(psDB *dbh)
+{
+    mysql_close(dbh->mysql);
+    dbh->mysql = NULL;
+    psFree(dbh);
+
+    // ASC WARNING NOTE: the psDBSQLToPTypeTableCleanup cleanup routine
+    // needs to be called first because it refers to
+    // psDBGetPTypeToSQLTable ...
+    psDBSQLToPTypeTableCleanup();
+    psDBMySQLToSQLTableCleanup();
+    psDBPTypeToSQLTableCleanup();
+    psDBPTypeToMySQLTableCleanup();
+}
+
+bool psDBCreate(psDB *dbh, const char *dbname)
+{
+    char            *query = NULL;
+    bool            status;
+
+    psStringAppend(&query, "CREATE DATABASE %s", dbname);
+
+    // the MySQL C API notes that mysql_create_db() is deprecated
+    status = psDBRunQuery(dbh, query);
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, false, "Failed to create new database.");
+    }
+
+    psFree(query);
+
+    return status;
+}
+
+bool psDBChange(psDB *dbh, const char *dbname)
+{
+    if (mysql_select_db(dbh->mysql, dbname) != 0) {
+        psError(PS_ERR_UNKNOWN, true, "Failed to change database.  Error: %s", mysql_error(dbh->mysql));
+
+        return false;
+    }
+
+    return true;
+}
+
+bool psDBDrop(psDB *dbh, const char *dbname)
+{
+    char            *query = NULL;
+    bool            status;
+
+    psStringAppend(&query, "DROP DATABASE %s", dbname);
+
+    // the MySQL C API notes that mysql_drop_db() is deprecated
+    status = psDBRunQuery(dbh, query);
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, false, "Failed to drop database.");
+    }
+
+    psFree(query);
+
+    return status;
+}
+
+bool psDBCreateTable(psDB *dbh, const char *tableName, psMetadata *md)
+{
+    char            *query;
+    bool            status;
+
+    query = psDBGenerateCreateTableSQL(tableName, md);
+    if (!query) {
+        psError(PS_ERR_UNEXPECTED_NULL, false, "Query generation failed.");
+
+        return NULL;
+    }
+
+    status = psDBRunQuery(dbh, query);
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, false, "Failed to create table.");
+    }
+
+    psFree(query);
+
+    return status;
+}
+
+bool psDBDropTable(psDB *dbh, const char *tableName)
+{
+    char            *query = NULL;
+    bool            status;
+
+    psStringAppend(&query, "DROP TABLE %s", tableName);
+
+    status = psDBRunQuery(dbh, query);
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, false, "Failed to drop table.");
+    }
+
+    psFree(query);
+
+    return status;
+}
+
+psArray *psDBSelectColumn(psDB *dbh, const char *tableName, const char *col, psU64 limit)
+{
+    MYSQL_RES       *result;            // complete db result set
+    MYSQL_ROW       row;                // single row of db result set
+    char            *query;             // SQL query
+    my_ulonglong    rowCount;           // number of rows in db result set
+    unsigned long   dataSize;           // size of field
+    unsigned int    fieldCount;         // number of fields in db result set
+    psArray         *column = NULL;     // return array
+    psPtr           data;               // copy of result field
+
+    query = psDBGenerateSelectRowSQL(tableName, col, NULL, limit);
+    if (!query) {
+        psError(PS_ERR_UNEXPECTED_NULL, false, "Query generation failed.");
+        return NULL;
+    }
+
+    if (!psDBRunQuery(dbh, query)) {
+        psError(PS_ERR_UNKNOWN, false, "Query execution failed.");
+        psFree(query);
+        return NULL;
+    }
+
+    psFree(query);
+
+    result = mysql_store_result(dbh->mysql);
+    if (!result) {
+        // no result set
+        fieldCount = mysql_field_count(dbh->mysql);
+
+        // if field count is zero the query returned no data.  If it's non-zero
+        // then something bad has happened.
+        if (fieldCount != 0) {
+            psError(PS_ERR_UNEXPECTED_NULL, true, "Query returned no data.  Error: %s", mysql_error(dbh->mysql));
+            return NULL;
+        }
+    }
+
+    rowCount = mysql_num_rows(result);
+
+    // pre-allocate enough elements to hold the complete result set
+    // then reset n to 0 so elements are added from the beginning of
+    // the array
+    column = psArrayAlloc(rowCount);
+    column->n = 0;
+
+    while ((row = mysql_fetch_row(result))) {
+        // get the first element of lengths array that is part of the
+        // result set
+        dataSize = *(mysql_fetch_lengths(result));
+
+        // represent NULL as an empty string
+        if (row[0] == NULL) {
+            data = psStringCopy("");
+        } else {
+            data = psAlloc(dataSize+1);
+            memcpy(data, row[0], dataSize);
+            ((char*)data)[dataSize] = '\0';
+        }
+
+        // add field to return array
+        psArrayAdd(column, 0, data);
+        psFree(data);
+    }
+
+    mysql_free_result(result);
+
+    return column;
+}
+
+// dest = assign to, source = source string psArray, conv = conversion function,
+// type = type to cast to, pType = psElemType
+#define PS_STR_ARRAY_TO_PTYPE(dest, source, conv, type, pType) \
+{ \
+    psPtr           myNaN; \
+    int             i; \
+    \
+    for (i = 0; i < source->n; i++) { \
+        if (strlen(source->data[i])) { \
+            dest[i] = (type)conv(source->data[i]); \
+        } else { \
+            myNaN = psDBGetPTypeNaN(pType); \
+            dest[i] = *(type *)myNaN; \
+            psFree(myNaN); \
+        } \
+    } \
+}
+
+psVector *psDBSelectColumnNum(psDB *dbh, const char *tableName, const char *col, psElemType pType, const psU64 limit)
+{
+    psArray         *stringColumn;      // source psArray
+    psVector        *column;            // dest psVector
+
+    stringColumn = psDBSelectColumn(dbh, tableName, col, limit);
+    if (!stringColumn) {
+        // could be an error or the result set was just empty
+        return NULL;
+    }
+
+    column = psVectorAlloc(stringColumn->n, pType);
+
+    // conversion functions are a portability issue
+    switch (pType) {
+    case PS_TYPE_S8:
+        PS_STR_ARRAY_TO_PTYPE(column->data.S8, stringColumn, atoi, psS8, PS_TYPE_S8);
+        break;
+    case PS_TYPE_S16:
+        PS_STR_ARRAY_TO_PTYPE(column->data.S16, stringColumn, atoi, psS16, PS_TYPE_S16);
+        break;
+    case PS_TYPE_S32:
+        PS_STR_ARRAY_TO_PTYPE(column->data.S32, stringColumn, atoi, psS32, PS_TYPE_S32);
+        break;
+    case PS_TYPE_S64:
+        PS_STR_ARRAY_TO_PTYPE(column->data.S64, stringColumn, atoll, psS64, PS_TYPE_S64);
+        break;
+    case PS_TYPE_U8:
+        PS_STR_ARRAY_TO_PTYPE(column->data.U8, stringColumn, atoi, psU8, PS_TYPE_U8);
+        break;
+    case PS_TYPE_U16:
+        PS_STR_ARRAY_TO_PTYPE(column->data.U16, stringColumn, atoi, psU16, PS_TYPE_U16);
+        break;
+    case PS_TYPE_U32:
+        PS_STR_ARRAY_TO_PTYPE(column->data.U32, stringColumn, atoi, psU32, PS_TYPE_U32);
+        break;
+    case PS_TYPE_U64:
+        PS_STR_ARRAY_TO_PTYPE(column->data.U64, stringColumn, atoll, psU64, PS_TYPE_U64);
+        break;
+    case PS_TYPE_F32:
+        PS_STR_ARRAY_TO_PTYPE(column->data.F32, stringColumn, atof, psF32, PS_TYPE_F32);
+        break;
+    case PS_TYPE_F64:
+        PS_STR_ARRAY_TO_PTYPE(column->data.F64, stringColumn, atof, psF64, PS_TYPE_F64);
+        break;
+    case PS_TYPE_C32:
+        // this is a bogus SQL type
+        PS_STR_ARRAY_TO_PTYPE(column->data.C32, stringColumn, atof, psC32, PS_TYPE_C32);
+        break;
+    case PS_TYPE_C64:
+        // this is a bogus SQL type
+        PS_STR_ARRAY_TO_PTYPE(column->data.C64, stringColumn, atof, psC64, PS_TYPE_C64);
+        break;
+    case PS_TYPE_BOOL:
+        // valid for psVector?
+        break;
+    }
+
+    psFree(stringColumn);
+
+    return column;
+}
+
+psArray *psDBSelectRows(psDB *dbh, const char *tableName, psMetadata *where, const psU64 limit)
+{
+    MYSQL_RES       *result;            // complete db result set
+    MYSQL_ROW       row;                // single row of db result set
+    MYSQL_FIELD     *field;             // field type info
+    char            *query;             // SQL query
+    my_ulonglong    rowCount;           // number of rows in db result set
+    unsigned int    fieldCount;         // number of fields in db result set
+    unsigned long   *fieldLength;       // field sizes
+    long            len;                // field length
+    psArray         *resultSet;         // return array
+    int             i;                  // field index
+    psMetadata      *md;                // a row
+    psU32           pType;              // psElemType of a field
+    psPtr           data;               // copy of result field
+
+    query = psDBGenerateSelectRowSQL(tableName, NULL, where, limit);
+    if (!query) {
+        psError(PS_ERR_UNEXPECTED_NULL, false, "Query generation failed.");
+
+        return NULL;
+    }
+
+    if (!psDBRunQuery(dbh, query)) {
+        psError(PS_ERR_UNKNOWN, false, "Query execution failed.");
+
+        psFree(query);
+
+        return NULL;
+    }
+
+    psFree(query);
+
+    result = mysql_store_result(dbh->mysql);
+    if (!result) {
+        // no result set
+        fieldCount = mysql_field_count(dbh->mysql);
+
+        // if field count is zero the query should have returned no data.  If
+        // it's non-zero then something bad has happened.
+        if (fieldCount != 0) {
+            psError(PS_ERR_UNEXPECTED_NULL, true, "Query returned no data.  Error: %s", mysql_error(dbh->mysql));
+
+            return NULL;
+        }
+    }
+
+    rowCount = mysql_num_rows(result);
+
+    // pre-allocate enough elements to hold the complete result set
+    // then reset n to 0 so elements are added from the beginning of
+    // the array
+    resultSet = psArrayAlloc(rowCount);
+    resultSet->n = 0;
+
+    field = mysql_fetch_fields(result);
+    fieldCount = mysql_num_fields(result);
+
+    while ((row = mysql_fetch_row(result))) {
+        // allocate new psMetadata to represent a row
+        md = psMetadataAlloc();
+
+        fieldLength = mysql_fetch_lengths(result);
+
+        for (i = 0; i < fieldCount; i++) {
+            // lookup MySQL column type
+            pType = psDBMySQLToPType(field[i].type, field[i].flags);
+
+            len = fieldLength[i];
+            if (len) {
+                data = psAlloc(len+1);
+                memcpy(data, row[i], len);
+                ((char*)data)[len] = '\0';
+            } else {
+                data = psDBGetPTypeNaN(pType);
+            }
+
+            // copy field data and convert NULLs to the appropriate NaN value
+            if (pType == PS_META_STR) {
+                psMetadataAddStr(md, 0, field[i].name, "", data);
+            } else if (pType == PS_META_S32) {
+                psMetadataAddS32(md, 0, field[i].name, "", atoll(data));
+            } else if (pType == PS_META_F32) {
+                psMetadataAddF32(md, 0, field[i].name, "", atof(data));
+            } else if (pType == PS_META_F64) {
+                psMetadataAddF64(md, 0, field[i].name, "", atof(data));
+            } else {
+                // XXX: assume binary string ...
+                psMetadataAddStr(md, 0, field[i].name, "", data);
+            }
+
+            psFree(data);
+        }
+
+        // add row to result set
+        psArrayAdd(resultSet, 0, md);
+        psFree(md);
+    }
+
+    mysql_free_result(result);
+
+    return resultSet;
+}
+
+bool psDBInsertOneRow(psDB *dbh, const char *tableName, psMetadata *row)
+{
+    psArray         *rowSet;            // psArray of row to insert
+
+    rowSet = psArrayAlloc(1);
+    rowSet->n = 0;
+    psArrayAdd(rowSet, 0, row);
+
+    if (!psDBInsertRows(dbh, tableName, rowSet)) {
+        psError(PS_ERR_UNKNOWN, false, "Insert failed.");
+
+        psFree(rowSet);
+
+        return false;
+    }
+
+    psFree(rowSet);
+
+    return true;
+}
+
+bool psDBInsertRows(psDB *dbh, const char *tableName, psArray *rowSet)
+{
+    psMetadata      *row;               // row of data
+    char            *query;             // SQL query
+    MYSQL_STMT      *stmt;              // prepared db statement
+    MYSQL_BIND      *bind;              // field values to insert
+    unsigned long   paramCount;         // number of placeholders in query
+    psU64           j;                  // row index
+
+    // we are assuming that all rows in the set have an identical with reguard
+    // to field count and type
+    row = rowSet->data[0];
+
+    query = psDBGenerateInsertRowSQL(tableName, row);
+    if (!query) {
+        psError(PS_ERR_UNEXPECTED_NULL, false, "Query generation failed.");
+
+        return NULL;
+    }
+
+    stmt = mysql_stmt_init(dbh->mysql);
+    if (!stmt) {
+        psAbort(__func__, "mysql_stmt_init(), out of memory.");
+    }
+
+    if (mysql_stmt_prepare(stmt, query, (unsigned long)strlen(query))) {
+        psError(PS_ERR_UNKNOWN, true, "Failed to prepare query.  Error: %s", mysql_stmt_error(stmt));
+
+        mysql_stmt_close(stmt);
+        psFree(query);
+
+        return false;
+    }
+
+    psFree(query);
+
+    // how many place holders are in our query
+    paramCount = mysql_stmt_param_count(stmt);
+
+    // structure larger enough to hold one field of data per place holder
+    bind = psAlloc(sizeof(MYSQL_BIND) * paramCount);
+
+    // loop over rows
+    for (j = 0; j < rowSet->n; j++) {
+        row = rowSet->data[j];
+
+        // reset bind for each row
+        memset(bind, 0, sizeof(MYSQL_BIND) * paramCount);
+
+        if (!psDBPackRow(bind, row, paramCount)) {
+            psError(PS_ERR_UNKNOWN, false, "Failed to pack params into bind structure.");
+
+            mysql_rollback(dbh->mysql);
+
+            psFree(bind);
+            mysql_stmt_close(stmt);
+        }
+
+        if (mysql_stmt_bind_param(stmt, bind)) {
+            psError(PS_ERR_UNKNOWN, true, "Failed to bind params.  Error: %s", mysql_stmt_error(stmt));
+
+            mysql_rollback(dbh->mysql);
+
+            psFree(bind);
+            mysql_stmt_close(stmt);
+
+            return false;
+        }
+
+        if (mysql_stmt_execute(stmt)) {
+            psError(PS_ERR_UNKNOWN, true, "Failed to execute prepared statement.  Error: %s",
+                    mysql_stmt_error(stmt));
+
+            mysql_rollback(dbh->mysql);
+
+            psFree(bind);
+            mysql_stmt_close(stmt);
+
+            return false;
+        }
+    } // end loop over rows
+
+    // point of no return
+    mysql_commit(dbh->mysql);
+
+    psFree(bind);
+    mysql_stmt_close(stmt);
+
+    return true;
+}
+
+psArray *psDBDumpRows(psDB *dbh, const char *tableName)
+{
+    return psDBSelectRows(dbh, tableName, NULL, 0);
+}
+
+psMetadata *psDBDumpCols(psDB *dbh, const char *tableName)
+{
+    MYSQL_RES       *result;
+    MYSQL_FIELD     *field;
+    unsigned int    fieldCount;
+    psMetadata      *table;
+    psU32           pType;
+    unsigned int    i;
+    psPtr           column;
+
+    // find column types
+    result = mysql_list_fields(dbh->mysql, tableName, NULL);
+    if (!result) {
+        psError(PS_ERR_UNEXPECTED_NULL, true, "Failed to retrieve column types.");
+    }
+
+    field = mysql_fetch_fields(result);
+    fieldCount = mysql_num_fields(result);
+
+    table = psMetadataAlloc();
+
+    // fetch each column and load into psMetadata
+    for (i =0; i < fieldCount; i++) {
+        // find ptype of column
+        pType = psDBMySQLToPType(field[i].type, field[i].flags);
+        //psLogMsg( __func__, PS_LOG_INFO, "pType=[%ld]\n", pType );
+
+        // if the ptype is PS_TYPE_PTR assume that it's a string and fetch the
+        // column as an psArray of strings; otherwise fetch the column as a
+        // psVector.
+        if (pType == PS_META_STR) {
+            // PS_META_UNKNOWN -> PS_META_ARRAY ?
+            column = psDBSelectColumn(dbh, tableName, field[i].name, 0);
+            psMetadataAddStr(table, 0, field[i].name, "", column);
+            psFree(column);
+        } else {
+            column = psDBSelectColumnNum(dbh, tableName, field[i].name, pType, 0);
+            if (pType == PS_META_S32) {
+                psMetadataAddS32(table, 0, field[i].name, "", (psS32)atoll(column));
+            } else if (pType == PS_META_F32) {
+                psMetadataAddF32(table, 0, field[i].name, "", (psF32)atof(column));
+            } else if (pType == PS_META_F64) {
+                psMetadataAddF64(table, 0, field[i].name, "", (psF64)atof(column));
+            }
+            psFree(column);
+        }
+    }
+
+    return table;
+}
+
+psS64 psDBUpdateRows(psDB *dbh, const char *tableName, psMetadata *where, psMetadata *values)
+{
+    char            *query;
+    MYSQL_STMT      *stmt;              // prepared db statement
+    unsigned long   paramCount;         // number of placeholders in query
+    MYSQL_BIND      *bind;              // field values to insert
+    my_ulonglong    rowsAffected;       // number of rows affected by query
+
+    query = psDBGenerateUpdateRowSQL(tableName, where, values);
+    if (!query) {
+        psError(PS_ERR_UNEXPECTED_NULL, false, "Query generation failed.");
+
+        return -1;
+    }
+
+    stmt = mysql_stmt_init(dbh->mysql);
+    if (!stmt) {
+        psAbort(__func__, "mysql_stmt_init(), out of memory.");
+    }
+
+    if (mysql_stmt_prepare(stmt, query, (unsigned long)strlen(query))) {
+        psError(PS_ERR_UNKNOWN, true, "Failed to prepare query.  Error: %s", mysql_stmt_error(stmt));
+
+        mysql_stmt_close(stmt);
+        psFree(query);
+
+        return -1;
+    }
+
+    psFree(query);
+
+    // how many place holders are in our query
+    paramCount = mysql_stmt_param_count(stmt);
+
+    // structure large enough to hold one field of data per place holder
+    bind = psAlloc(sizeof(MYSQL_BIND) * paramCount);
+
+    // init bind
+    memset(bind, 0, sizeof(MYSQL_BIND) * paramCount);
+
+    if (!psDBPackRow(bind, values, paramCount)) {
+        psFree(bind);
+        mysql_stmt_close(stmt);
+
+        return -1;
+    }
+
+    if (mysql_stmt_bind_param(stmt, bind)) {
+        psError(PS_ERR_UNKNOWN, true, "Failed to bind params.  Error: %s", mysql_stmt_error(stmt));
+
+        mysql_rollback(dbh->mysql);
+
+        psFree(bind);
+        mysql_stmt_close(stmt);
+
+        return -1;
+    }
+
+    if (mysql_stmt_execute(stmt)) {
+        psError(PS_ERR_UNKNOWN, true, "Failed to execute prepared statement.  Error: %s",
+                mysql_stmt_error(stmt));
+
+        mysql_rollback(dbh->mysql);
+
+        psFree(bind);
+        mysql_stmt_close(stmt);
+
+        return -1;
+    }
+
+    psFree(bind);
+
+    // point of no return
+    mysql_commit(dbh->mysql);
+
+    rowsAffected = mysql_stmt_affected_rows(stmt);
+
+    mysql_stmt_close(stmt);
+
+    return rowsAffected;
+}
+
+psS64 psDBDeleteRows(psDB *dbh, const char *tableName, psMetadata *where)
+{
+    char            *query;
+
+    query = psDBGenerateDeleteRowSQL(tableName, where);
+    if (!query) {
+        psError(PS_ERR_UNEXPECTED_NULL, false, "Query generation failed.");
+
+        return -1;
+    }
+
+    if (!psDBRunQuery(dbh, query)) {
+        psError(PS_ERR_UNKNOWN, false, "Delete failed.");
+
+        mysql_rollback(dbh->mysql);
+
+        psFree(query);
+
+        return -1;
+    }
+
+    psFree(query);
+
+    if (!where) {
+        // we truncated the table so mysql_affected_rows() won't work
+        return 1;
+    }
+
+    // point of no return
+    mysql_commit(dbh->mysql);
+
+    return (psS64)mysql_affected_rows(dbh->mysql);
+}
+
+// database utility functions
+/*****************************************************************************/
+
+static bool psDBRunQuery(psDB *dbh, const char *query)
+{
+    if (mysql_real_query(dbh->mysql, query, (unsigned long)strlen(query)) !=0) {
+        psError(PS_ERR_UNKNOWN, true, "Failed to execute query.  Error: %s\n", mysql_error(dbh->mysql));
+
+        return false;
+    }
+
+    return true;
+}
+
+static inline bool psDBPackRow(MYSQL_BIND *bind, psMetadata *values, psU32 paramCount)
+{
+    psListIterator  *cursor;            // row iterator
+    psMetadataItem  *item;              // field in row
+    mysqlType       *mType;             // type tmp variable
+    static bool     isNull = true;      // used in a MYSQL_BIND to indicate NULL,
+    // this will be used outside of this func
+    psU32           i;                  // field index
+
+    // check size of values == paramCount ?
+
+    cursor = psListIteratorAlloc(values->list, 0, false);
+
+    // loop over fields
+    i = 0;
+    while ((item = psListGetAndIncrement(cursor))) {
+        // lookup pType -> mysql type
+        mType = psDBPTypeToMySQL(item->type);
+
+        bind[i].buffer_type = mType->type;
+        bind[i].is_unsigned = mType->isUnsigned;
+
+        psFree(mType);
+
+        // input data length is determined by the MYSQL_TYPE_* unless it's a string
+        if (item->type == PS_TYPE_S32) {
+            bind[i].length  = 0;
+            bind[i].buffer  = &item->data.S32;
+            bind[i].is_null = psDBIsPTypeNaN(item->type, &item->data.S32)
+                              ? (my_bool *)&isNull
+                              : NULL;
+        } else if (item->type == PS_TYPE_F32) {
+            bind[i].length  = 0;
+            bind[i].buffer  = &item->data.F32;
+            bind[i].is_null = psDBIsPTypeNaN(item->type, &item->data.F32)
+                              ? (my_bool *)&isNull
+                              : NULL;
+        } else if (item->type == PS_TYPE_F64) {
+            bind[i].length  = 0;
+            bind[i].buffer  = &item->data.F64;
+            bind[i].is_null = psDBIsPTypeNaN(item->type, &item->data.F64)
+                              ? (my_bool *)&isNull
+                              : NULL;
+            // convert NaNs to NULL and set the buffer_length for strings
+            //} else if ((item->type == PS_META_STR) && (item->pType == PS_TYPE_PTR)) {
+        } else if ((item->type == PS_META_STR)         || (item->type == PS_META_VEC)    ||
+                   (item->type == PS_META_IMG)         || (item->type == PS_META_HASH)   ||
+                   (item->type == PS_META_LOOKUPTABLE) || (item->type == PS_META_JPEG)   ||
+                   (item->type == PS_META_PNG)         || (item->type == PS_META_ASTROM) ||
+                   (item->type == PS_META_UNKNOWN)) {
+
+            bind[i].buffer_length = (unsigned long)strlen((char *)item->data.V);
+            bind[i].length  = &bind[i].buffer_length;
+            bind[i].buffer  = item->data.V;
+            bind[i].is_null = *(char *)item->data.V == '\0'
+                              ? (my_bool *)&isNull
+                              : NULL;
+        } else {
+            psError(PS_ERR_BAD_PARAMETER_TYPE , true,
+                    "FIXME: Only type of PS_TYPE_S32, PS_TYPE_F32, PS_TYPE_F64, "
+                    "and PS_TYPE_PTR are supported.");
+
+            psFree(cursor);
+
+            return false;
+        }
+
+        // increment field index
+        i++;
+    }
+
+    psFree(cursor);
+
+    return true;
+}
+
+
+// SQL generation functions
+/*****************************************************************************/
+
+static char *psDBGenerateCreateTableSQL(const char *tableName, psMetadata *table)
+{
+    char            *query = NULL;      // complete query
+    psMetadataItem  *item;              // column description
+    psListIterator  *cursor;            // column iterator
+    char            *colType;           // type lookup table
+
+    if (!table) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true, "table param may not be null.");
+
+        return NULL;
+    }
+
+    psStringAppend(&query, "CREATE TABLE %s (", tableName);
+
+    cursor = psListIteratorAlloc(table->list, 0, false);
+
+    // find column name and type
+    while ((item = psListGetAndIncrement(cursor))) {
+        if ((item->type == PS_META_S32) || (item->type == PS_META_F32) || (item->type == PS_META_F64) ||
+                (item->type == PS_TYPE_S32) || (item->type == PS_TYPE_F32) || (item->type == PS_TYPE_F64)) {
+            // + column name + _ + column type
+            colType = psDBPTypeToSQL(item->type);
+            psStringAppend(&query, "%s %s", item->name, colType);
+            psFree(colType);
+        } else if ((item->type == PS_META_STR)         || (item->type == PS_META_VEC)    ||
+                   (item->type == PS_META_IMG)         || (item->type == PS_META_HASH)   ||
+                   (item->type == PS_META_LOOKUPTABLE) || (item->type == PS_META_JPEG)   ||
+                   (item->type == PS_META_PNG)         || (item->type == PS_META_ASTROM) ||
+                   (item->type == PS_META_UNKNOWN)) {
+            // + column name + _ + varchar( + length + )
+            psStringAppend(&query, "%s VARCHAR(%s)", item->name, item->data.V);
+        } else {
+            psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                    "FIXME: Only type of PS_META_S32, PS_META_F32, PS_META_F64, "
+                    "and PS_META_* pointer types are supported, (not %d).", item->type);
+
+            psFree(query);
+            psFree(cursor);
+
+            return NULL;
+        }
+
+        // add a , after every column declaration except the last one
+        if (!cursor->offEnd) {
+            psStringAppend(&query, ", ");
+        }
+    }
+
+    psListIteratorSet(cursor, 0);
+
+    // find database indexes
+    while ((item = psListGetAndIncrement(cursor))) {
+        if ((strncmp(item->comment, "Primary Key", strlen("Primary Key"))) == 0) {
+            psStringAppend(&query, ", PRIMARY KEY(%s)", item->name);
+        } else if ((strncmp(item->comment, "Key", strlen("Key"))) == 0) {
+            psStringAppend(&query, ", KEY(%s)", item->name);
+        }
+    }
+
+    psFree(cursor);
+
+    // end column types + table type
+    psStringAppend(&query, ") ENGINE=innodb");
+
+    return query;
+}
+
+static char *psDBGenerateSelectRowSQL(const char *tableName, const char *col, psMetadata *where, const psU64 limit)
+{
+    char            *query = NULL;
+    char            *whereSQL;
+    char            *limitString;
+
+    // select all columns if col is NULL
+    if (col) {
+        psStringAppend(&query, "SELECT %s FROM %s", col, tableName);
+    } else {
+        psStringAppend(&query, "SELECT * FROM %s", tableName);
+    }
+
+    // select all rows if where is NULL
+    if (where) {
+        whereSQL = psDBGenerateWhereSQL(where);
+        if (!whereSQL) {
+            psError(PS_ERR_UNEXPECTED_NULL, false, "SQL substring generation failed.");
+
+            psFree(query);
+
+            return NULL;
+        }
+        psStringAppend(&query, " %s", whereSQL);
+        psFree(whereSQL);
+    }
+
+    // treat limit == 0 as "no limit"
+    if (limit) {
+        limitString = psDBIntToString(limit);
+        psStringAppend(&query, " LIMIT %s", limitString);
+        psFree(limitString);
+    }
+
+    return query;
+}
+
+static char *psDBGenerateInsertRowSQL(const char *tableName, psMetadata *row)
+{
+    char            *query = NULL;
+    psListIterator  *cursor;
+    psMetadataItem  *item;
+
+    psStringAppend(&query, "INSERT INTO %s (", tableName);
+
+    cursor = psListIteratorAlloc(row->list, 0, false);
+
+    // get field names
+    while ((item = psListGetAndIncrement(cursor))) {
+        psStringAppend(&query, item->name);
+
+        // + , + _ between every field name
+        if (!cursor->offEnd) {
+            psStringAppend(&query, ", ");
+        }
+    }
+
+    // end of field names
+    psStringAppend(&query, ") VALUES (");
+
+    psListIteratorSet(cursor, 0);
+
+    // create value place holders
+    while ((item = psListGetAndIncrement(cursor))) {
+        psStringAppend(&query, "?");
+
+        // + ", " between every place holder
+        if (!cursor->offEnd) {
+            psStringAppend(&query, ", ");
+        }
+    }
+
+    psFree(cursor);
+
+    // end of values
+    psStringAppend(&query, ")");
+
+    return query;
+}
+
+static char *psDBGenerateUpdateRowSQL(const char *tableName, psMetadata *where, psMetadata *values)
+{
+    char            *query = NULL;
+    char            *setSQL;
+    char            *whereSQL;
+
+    if ((!values) || (!where)) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true, "values and where params may not be NULL.");
+
+        return NULL;
+    }
+
+    setSQL = psDBGenerateSetSQL(values);
+    if (!setSQL) {
+        psError(PS_ERR_UNEXPECTED_NULL, false, "SQL substring generation failed.");
+
+        return NULL;
+    }
+
+    whereSQL = psDBGenerateWhereSQL(where);
+    if (!whereSQL) {
+        psError(PS_ERR_UNEXPECTED_NULL, false, "SQL substring generation failed.");
+
+        return NULL;
+    }
+
+    psStringAppend(&query, "UPDATE %s %s %s", tableName, setSQL, whereSQL);
+    psFree(setSQL);
+    psFree(whereSQL);
+
+    return query;
+}
+
+static char *psDBGenerateDeleteRowSQL(const char *tableName, psMetadata *where)
+{
+    char            *query = NULL;
+    char            *whereSQL;
+
+    // delete all rows if where is NULL
+    if (!where) {
+        psStringAppend(&query, "TRUNCATE TABLE %s", tableName);
+
+        return query;
+    }
+
+    whereSQL = psDBGenerateWhereSQL(where);
+    if (!whereSQL) {
+        psError(PS_ERR_UNEXPECTED_NULL, false, "SQL substring generation failed.");
+
+        return NULL;
+    }
+
+    psStringAppend(&query, "DELETE FROM %s %s", tableName, whereSQL);
+    psFree(whereSQL);
+
+    return query;
+}
+
+static char *psDBGenerateWhereSQL(psMetadata *where)
+{
+    char            *query = NULL;
+    psListIterator  *cursor;
+    psMetadataItem  *item;
+
+    if (!where) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true, "where param may not be NULL.");
+
+        return NULL;
+    }
+
+    query = psStringCopy("WHERE ");
+
+    cursor = psListIteratorAlloc(where->list, 0, false);
+
+    // find column name and match pattern
+    while ((item = psListGetAndIncrement(cursor))) {
+        // item->data must be a string
+        if ((item->type == PS_META_S32) || (item->type == PS_TYPE_S32)) {
+            psStringAppend(&query, "%s=%d", item->name, (int)(item->data.S32));
+        } else if ((item->type == PS_META_F32) || (item->type == PS_TYPE_F32)) {
+            psStringAppend(&query, "%s=%g", item->name, (double)(item->data.F32));
+        } else if ((item->type == PS_META_F64) || (item->type == PS_TYPE_F64)) {
+            psStringAppend(&query, "%s=%g", item->name, (double)(item->data.F64));
+        } else if (item->type == PS_META_STR) {
+            // + column name + _ + like + _ + ' + value + '
+            if (*(char *)item->data.V == '\0') {
+                psStringAppend(&query, "%s IS NULL", item->name);
+            } else {
+                // XXX ASC NOTE: we should have a better match for
+                // char & varchar columns than this.  LIKE is OK for
+                // very large TEXT columns that really shouldn't be
+                // used in a where clause...
+                psStringAppend(&query, "%s LIKE '%s'", item->name, item->data.V);
+            }
+        } else {
+            psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                    "Only types PS_META_S32, PS_META_F32, PS_META_F64, PS_META_STR is supported");
+
+            psFree(cursor);
+            psFree(query);
+
+            return NULL;
+        }
+
+        // + " and " after every column declaration except the last one
+        if (!cursor->offEnd) {
+            psStringAppend(&query, " AND ");
+        }
+    }
+
+    psFree(cursor);
+
+    return query;
+}
+
+static char *psDBGenerateSetSQL(psMetadata *set
+                               )
+{
+    char            *query = NULL;
+    psListIterator  *cursor;
+    psMetadataItem  *item;
+
+    if (!set
+       ) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true, "set param may not be NULL.");
+
+        return NULL;
+    }
+
+    query = psStringCopy("SET ");
+
+    cursor = psListIteratorAlloc(set
+                                 ->list, 0, false);
+
+    // find column name
+    while ((item = psListGetAndIncrement(cursor))) {
+        // + column name + _ + = + _ + ?
+        psStringAppend(&query, "%s = ?", item->name);
+
+        // + ", " after every column declaration except the last one
+        if (!cursor->offEnd) {
+            psStringAppend(&query, ",  ");
+        }
+    }
+
+    psFree(cursor);
+
+    return query;
+}
+
+
+// lookup table functions
+/*****************************************************************************/
+
+static psElemType psDBMySQLToPType(enum enum_field_types type, unsigned int flags)
+{
+    psHash          *mysqlToSQLTable;   // type lookup table
+    psHash          *sqlToPSTable;      // type lookup table
+    char            *key;               // hash tmp value
+    char            *value;             // hash tmp value
+    char            *sqlType;           // copy of lookup table result
+    psU32           pType;              // psElemType of a field
+
+    mysqlToSQLTable = psDBGetMySQLToSQLTable();
+
+    // lookup MySQL column type
+    key     = psDBIntToString((psU64)type);
+    sqlType = psHashLookup(mysqlToSQLTable, key);
+    psFree(key);
+    psFree(mysqlToSQLTable);
+
+    if (!sqlType) {
+        psError(PS_ERR_UNEXPECTED_NULL, true, "type lookup failed.");
+        return -1;
+    }
+
+    // MySQL column types can not be directly translated to PS
+    // types as the the mysql types do not tell you if the value is
+    // signed or unsigned.  The result is this ugly conversion from
+    // mysql -> ascii -> ptype
+    if (flags & UNSIGNED_FLAG) {
+        psStringPrepend(&sqlType, "UNSIGNED ");
+    }
+
+    //psLogMsg( __func__, PS_LOG_INFO, "sqlType=[%s]\n", sqlType );
+
+    // convert MySQL type to PS type
+    sqlToPSTable = psDBGetSQLToPTypeTable();
+    value = psHashLookup(sqlToPSTable, sqlType);
+    psFree(sqlToPSTable);
+
+    if (!value) {
+        psError(PS_ERR_UNEXPECTED_NULL, true, "type lookup failed.");
+
+        return -1;
+    }
+
+    pType = (psU32)atol(value);
+
+    return pType;
+}
+
+static char *psDBPTypeToSQL(psElemType pType)
+{
+    psHash          *pTypeToSQLTable;   // type lookup table
+    char            *key;               // hash tmp value
+    char            *sqlType;             // hash tmp value
+
+    pTypeToSQLTable = psDBGetPTypeToSQLTable();
+
+    key = psDBIntToString((psU64)pType);
+    sqlType = psHashLookup(pTypeToSQLTable, key);
+    psFree(key);
+    psFree(pTypeToSQLTable);
+
+    if (!sqlType) {
+        psError(PS_ERR_UNEXPECTED_NULL, true, "type lookup failed.");
+
+        return NULL;
+    }
+
+    psMemIncrRefCounter(sqlType);
+
+    return sqlType;
+}
+
+static mysqlType *psDBPTypeToMySQL(psElemType pType)
+{
+    psHash          *pTypeToMySQLTable; // type lookup table
+    char            *key;               // hash tmp value
+    mysqlType       *mType;             // mysqlType struct to return
+
+    pTypeToMySQLTable = psDBGetPTypeToMySQLTable();
+
+    key = psDBIntToString((psU64)pType);
+    mType = psHashLookup(pTypeToMySQLTable, key);
+    psFree(key);
+    psFree(pTypeToMySQLTable);
+
+    if (!mType) {
+        psError(PS_ERR_UNEXPECTED_NULL, true, "type lookup failed.");
+
+        return NULL;
+    }
+
+    psMemIncrRefCounter(mType);
+
+    return mType;
+}
+
+static psHash *psDBGetPTypeToSQLTable(void)
+{
+    static psHash   *lookupTable = NULL;
+
+    if (!lookupTable) {
+        lookupTable = psHashAlloc(14);
+
+        // no support for CHAR, TEXT or GLOB
+        psDBAddToLookupTable(lookupTable, PS_TYPE_S8,  "TINYINT");
+        psDBAddToLookupTable(lookupTable, PS_TYPE_S16, "SMALLINT");
+        psDBAddToLookupTable(lookupTable, PS_TYPE_S32, "INT");
+        psDBAddToLookupTable(lookupTable, PS_TYPE_S64, "BIGINT");
+        psDBAddToLookupTable(lookupTable, PS_TYPE_U8,  "UNSIGNED TINYINT");
+        psDBAddToLookupTable(lookupTable, PS_TYPE_U16, "UNSIGNED SMALLINT");
+        psDBAddToLookupTable(lookupTable, PS_TYPE_U32, "UNSIGNED INT");
+        psDBAddToLookupTable(lookupTable, PS_TYPE_U64, "UNSIGNED BIGINT");
+        psDBAddToLookupTable(lookupTable, PS_TYPE_F32, "FLOAT");
+        psDBAddToLookupTable(lookupTable, PS_TYPE_F64, "DOUBLE");
+        psDBAddToLookupTable(lookupTable, PS_TYPE_C32, "PS_TYPE_C32 is not supported");
+        psDBAddToLookupTable(lookupTable, PS_TYPE_C64, "PS_TYPE_C64 is not supported");
+        psDBAddToLookupTable(lookupTable, PS_TYPE_BOOL,"BOOLEAN");
+        psDBAddToLookupTable(lookupTable, PS_META_STR, "BLOB");
+    }
+
+    // simulate true ref counting
+    psMemIncrRefCounter(lookupTable);
+
+    return lookupTable;
+}
+
+static void psDBPTypeToSQLTableCleanup(void)
+{
+    psHash          *lookupTable;
+
+    lookupTable = psDBGetPTypeToSQLTable();
+
+    psMemDecrRefCounter(lookupTable);
+    psFree(lookupTable);
+}
+
+static psHash *psDBGetSQLToPTypeTable(void)
+{
+    static psHash   *lookupTable = NULL;
+    psHash          *psToSQLTable;
+    psList          *list;
+    psListIterator  *cursor;
+    char            *key;
+    char            *value;
+
+    if (!lookupTable) {
+        // invert the PSToSQL table
+        psToSQLTable = psDBGetPTypeToSQLTable();
+        lookupTable = psHashAlloc(psToSQLTable->nbucket);
+
+        list = psHashKeyList(psToSQLTable);
+        cursor = psListIteratorAlloc(list, 0, false);
+
+        while ((key = psListGetAndIncrement(cursor))) {
+            value = psHashLookup(psToSQLTable, key);
+            if (!strcmp(value, "BLOB")) {
+                continue; // ignore reverse BLOB mapping, fill in below
+            }
+            // switch key and value
+            psHashAdd(lookupTable, value, key);
+        }
+
+        value = psDBIntToString((psU64)PS_META_STR);
+        psHashAdd(lookupTable, "VARCHAR", value);
+        psHashAdd(lookupTable, "BLOB",    value);
+        psHashAdd(lookupTable, "TEXT",    value);
+        psFree(value);
+
+        // DECIMAL does not exist in the pType to SQL table
+        value = psDBIntToString(0);
+        psHashAdd(lookupTable, "DECIMAL", value);
+        psFree(value);
+
+        psFree(cursor);
+        psFree(list);
+        psFree(psToSQLTable);
+    }
+
+    // simulate true ref counting
+    psMemIncrRefCounter(lookupTable);
+
+    return lookupTable;
+}
+
+static void psDBSQLToPTypeTableCleanup(void)
+{
+    psHash          *lookupTable;
+
+    lookupTable = psDBGetSQLToPTypeTable();
+
+    psMemDecrRefCounter(lookupTable);
+    psFree(lookupTable);
+}
+
+static psHash *psDBGetMySQLToSQLTable(void)
+{
+    static psHash   *lookupTable = NULL;
+
+    if (!lookupTable) {
+        lookupTable = psHashAlloc(20);
+
+        psDBAddToLookupTable(lookupTable, FIELD_TYPE_TINY,      "TINYINT");
+        psDBAddToLookupTable(lookupTable, FIELD_TYPE_SHORT,     "SMALLINT");
+        psDBAddToLookupTable(lookupTable, FIELD_TYPE_LONG,      "INT");
+        psDBAddToLookupTable(lookupTable, FIELD_TYPE_INT24,     "MEDIUMINT");
+        psDBAddToLookupTable(lookupTable, FIELD_TYPE_LONGLONG,  "BIGINT");
+        psDBAddToLookupTable(lookupTable, FIELD_TYPE_DECIMAL,   "DECIMAL");
+        psDBAddToLookupTable(lookupTable, FIELD_TYPE_FLOAT,     "FLOAT");
+        psDBAddToLookupTable(lookupTable, FIELD_TYPE_DOUBLE,    "DOUBLE");
+        psDBAddToLookupTable(lookupTable, FIELD_TYPE_TIMESTAMP, "TIMESTAMP");
+        psDBAddToLookupTable(lookupTable, FIELD_TYPE_DATE,      "DATE");
+        psDBAddToLookupTable(lookupTable, FIELD_TYPE_TIME,      "TIME");
+        psDBAddToLookupTable(lookupTable, FIELD_TYPE_DATETIME,  "DATETIME");
+        psDBAddToLookupTable(lookupTable, FIELD_TYPE_YEAR,      "YEAR");
+        psDBAddToLookupTable(lookupTable, FIELD_TYPE_STRING,    "CHAR");
+        psDBAddToLookupTable(lookupTable, FIELD_TYPE_VAR_STRING,"VARCHAR");
+        psDBAddToLookupTable(lookupTable, FIELD_TYPE_BLOB,      "BLOB");
+        psDBAddToLookupTable(lookupTable, FIELD_TYPE_SET,       "SET");
+        psDBAddToLookupTable(lookupTable, FIELD_TYPE_ENUM,      "ENUM");
+        psDBAddToLookupTable(lookupTable, FIELD_TYPE_NULL,      "NULL-type");
+        psDBAddToLookupTable(lookupTable, FIELD_TYPE_CHAR,      "TINYINT");
+    }
+
+    // simulate true ref counting
+    psMemIncrRefCounter(lookupTable);
+
+    return lookupTable;
+}
+
+static void psDBMySQLToSQLTableCleanup(void)
+{
+    psHash          *lookupTable;
+
+    lookupTable = psDBGetMySQLToSQLTable();
+
+    psMemDecrRefCounter(lookupTable);
+    psFree(lookupTable);
+}
+
+static psHash *psDBGetPTypeToMySQLTable(void)
+{
+    static psHash   *lookupTable = NULL;
+
+    if (!lookupTable) {
+        lookupTable = psHashAlloc(14);
+
+        psDBAddVoidToLookupTable(lookupTable, PS_TYPE_S8,     psDBMySQLTypeAlloc(MYSQL_TYPE_TINY,       false));
+        psDBAddVoidToLookupTable(lookupTable, PS_TYPE_S16,    psDBMySQLTypeAlloc(MYSQL_TYPE_SHORT,      false));
+        psDBAddVoidToLookupTable(lookupTable, PS_TYPE_S32,    psDBMySQLTypeAlloc(MYSQL_TYPE_LONG,       false));
+        psDBAddVoidToLookupTable(lookupTable, PS_TYPE_S64,    psDBMySQLTypeAlloc(MYSQL_TYPE_LONGLONG,   false));
+        psDBAddVoidToLookupTable(lookupTable, PS_TYPE_U8,     psDBMySQLTypeAlloc(MYSQL_TYPE_TINY,       true));
+        psDBAddVoidToLookupTable(lookupTable, PS_TYPE_U16,    psDBMySQLTypeAlloc(MYSQL_TYPE_SHORT,      true));
+        psDBAddVoidToLookupTable(lookupTable, PS_TYPE_U32,    psDBMySQLTypeAlloc(MYSQL_TYPE_LONG,       true));
+        psDBAddVoidToLookupTable(lookupTable, PS_TYPE_U64,    psDBMySQLTypeAlloc(MYSQL_TYPE_LONGLONG,   true));
+        psDBAddVoidToLookupTable(lookupTable, PS_TYPE_F32,    psDBMySQLTypeAlloc(MYSQL_TYPE_FLOAT,      false));
+        psDBAddVoidToLookupTable(lookupTable, PS_TYPE_F64,    psDBMySQLTypeAlloc(MYSQL_TYPE_DOUBLE,     false));
+        // bogus type
+        psDBAddVoidToLookupTable(lookupTable, PS_TYPE_C32,    psDBMySQLTypeAlloc(MYSQL_TYPE_VAR_STRING, false));
+        // bogus type
+        psDBAddVoidToLookupTable(lookupTable, PS_TYPE_C64,    psDBMySQLTypeAlloc(MYSQL_TYPE_VAR_STRING, false));
+        psDBAddVoidToLookupTable(lookupTable, PS_TYPE_BOOL,   psDBMySQLTypeAlloc(MYSQL_TYPE_TINY,       true));
+        // XXX: removed PS_TYPE_PTR, can this be removed too?
+        // psDBAddVoidToLookupTable(lookupTable, PS_TYPE_PTR,    psDBMySQLTypeAlloc(MYSQL_TYPE_VAR_STRING, false));
+
+        psDBAddVoidToLookupTable(lookupTable, PS_META_STR,    psDBMySQLTypeAlloc(MYSQL_TYPE_VAR_STRING, false));
+        psDBAddVoidToLookupTable(lookupTable, PS_META_VEC,    psDBMySQLTypeAlloc(MYSQL_TYPE_VAR_STRING, false));
+        psDBAddVoidToLookupTable(lookupTable, PS_META_IMG,    psDBMySQLTypeAlloc(MYSQL_TYPE_VAR_STRING, false));
+        psDBAddVoidToLookupTable(lookupTable, PS_META_HASH,   psDBMySQLTypeAlloc(MYSQL_TYPE_VAR_STRING, false));
+        psDBAddVoidToLookupTable(lookupTable, PS_META_LOOKUPTABLE,
+                                 psDBMySQLTypeAlloc(MYSQL_TYPE_VAR_STRING, false));
+        psDBAddVoidToLookupTable(lookupTable, PS_META_JPEG,   psDBMySQLTypeAlloc(MYSQL_TYPE_VAR_STRING, false));
+        psDBAddVoidToLookupTable(lookupTable, PS_META_PNG,    psDBMySQLTypeAlloc(MYSQL_TYPE_VAR_STRING, false));
+        psDBAddVoidToLookupTable(lookupTable, PS_META_ASTROM, psDBMySQLTypeAlloc(MYSQL_TYPE_VAR_STRING, false));
+        psDBAddVoidToLookupTable(lookupTable, PS_META_UNKNOWN,psDBMySQLTypeAlloc(MYSQL_TYPE_VAR_STRING, false));
+    }
+
+    // simulate true ref counting
+    psMemIncrRefCounter(lookupTable);
+
+    return lookupTable;
+}
+
+static void psDBPTypeToMySQLTableCleanup(void)
+{
+    psHash          *lookupTable;
+
+    lookupTable = psDBGetPTypeToMySQLTable();
+
+    psMemDecrRefCounter(lookupTable);
+    psFree(lookupTable);
+}
+
+static psPtr psDBMySQLTypeAlloc(enum enum_field_types type, bool isUnsigned)
+{
+    mysqlType       *mType;
+
+    mType = psAlloc(sizeof(mysqlType));
+    mType->type       = type;
+    mType->isUnsigned = isUnsigned;
+
+    return mType;
+}
+
+static void psDBAddToLookupTable(psHash *lookupTable, psU32 type, const char *string)
+{
+    char            *key;
+    char            *value;
+
+    key = psDBIntToString((psU64)type);
+    value = psStringCopy(string);
+
+    psHashAdd(lookupTable, key, value);
+
+    psFree(key);
+    psFree(value);
+}
+
+static void psDBAddVoidToLookupTable(psHash *lookupTable, psU32 type, psPtr value)
+{
+    char            *key;
+
+    key = psDBIntToString((psU64)type);
+
+    psHashAdd(lookupTable, key, value);
+
+    // destructive of value parameter
+    psFree(value);
+    psFree(key);
+}
+
+
+// pType utility functions
+/*****************************************************************************/
+
+#define PS_NAN_ALLOC(dest, type, nan) \
+dest = psAlloc(sizeof(type)); \
+*(type *)dest = nan;
+
+static psPtr psDBGetPTypeNaN(psElemType pType)
+{
+    psPtr           myNaN;
+
+    switch (pType) {
+    case PS_TYPE_S8:
+        PS_NAN_ALLOC(myNaN, psS8, PS_MAX_S8);
+        break;
+    case PS_TYPE_S16:
+        PS_NAN_ALLOC(myNaN, psS16, PS_MAX_S16);
+        break;
+    case PS_TYPE_S32:
+        PS_NAN_ALLOC(myNaN, psS32, PS_MAX_S32);
+        break;
+    case PS_TYPE_S64:
+        PS_NAN_ALLOC(myNaN, psS64, PS_MAX_S64);
+        break;
+    case PS_TYPE_U8:
+        PS_NAN_ALLOC(myNaN, psU8, PS_MAX_U8);
+        break;
+    case PS_TYPE_U16:
+        PS_NAN_ALLOC(myNaN, psU16, PS_MAX_U16);
+        break;
+    case PS_TYPE_U32:
+        PS_NAN_ALLOC(myNaN, psU32, PS_MAX_U32);
+        break;
+    case PS_TYPE_U64:
+        PS_NAN_ALLOC(myNaN, psU64, PS_MAX_U64);
+        break;
+    case PS_TYPE_F32:
+        PS_NAN_ALLOC(myNaN, psF32, NAN);
+        break;
+    case PS_TYPE_F64:
+        PS_NAN_ALLOC(myNaN, psF64, NAN);
+        break;
+    case PS_TYPE_C32:
+        // this is a bogus SQL type
+        PS_NAN_ALLOC(myNaN, psC32, NAN);
+        break;
+    case PS_TYPE_C64:
+        // this is a bogus SQL type
+        PS_NAN_ALLOC(myNaN, psC64, NAN);
+        break;
+    case PS_TYPE_BOOL:
+        // what is NaN for a bool?
+        break;
+    }
+
+    return myNaN;
+}
+
+#define PS_IS_NAN(type, data, nan) *(type *)data == nan
+
+static bool psDBIsPTypeNaN(psElemType pType, psPtr data)
+{
+    bool    isNaN;
+
+    switch (pType) {
+    case PS_TYPE_S8:
+        isNaN = PS_IS_NAN(psS8, data, PS_MAX_S8);
+        break;
+    case PS_TYPE_S16:
+        isNaN = PS_IS_NAN(psS16, data, PS_MAX_S16);
+        break;
+    case PS_TYPE_S32:
+        isNaN = PS_IS_NAN(psS32, data, PS_MAX_S32);
+        break;
+    case PS_TYPE_S64:
+        isNaN = PS_IS_NAN(psS64, data, PS_MAX_S64);
+        break;
+    case PS_TYPE_U8:
+        isNaN = PS_IS_NAN(psU8, data, PS_MAX_U8);
+        break;
+    case PS_TYPE_U16:
+        isNaN = PS_IS_NAN(psU16, data, PS_MAX_U16);
+        break;
+    case PS_TYPE_U32:
+        isNaN = PS_IS_NAN(psU32, data, PS_MAX_U32);
+        break;
+    case PS_TYPE_U64:
+        isNaN = PS_IS_NAN(psU64, data, PS_MAX_U64);
+        break;
+    case PS_TYPE_F32:
+        isNaN = PS_IS_NAN(psF32, data, NAN);
+        break;
+    case PS_TYPE_F64:
+        isNaN = PS_IS_NAN(psF64, data, NAN);
+        break;
+    case PS_TYPE_C32:
+        // this is a bogus SQL type
+        isNaN = PS_IS_NAN(psC32, data, NAN);
+        break;
+    case PS_TYPE_C64:
+        // this is a bogus SQL type
+        isNaN = PS_IS_NAN(psC64, data, NAN);
+        break;
+    case PS_TYPE_BOOL:
+        // what is NaN for a bool?
+        break;
+    }
+
+    return isNaN;
+}
+
+
+// string utility functions
+/*****************************************************************************/
+
+static char *psDBIntToString(psU64 n)
+{
+    char            *string;
+    size_t          length;
+
+    // length of string + \0
+    // if n is 0, length is 1 char + \0
+    length = n ? (size_t)log10((double)n) + 1
+             : 2;
+    string = psAlloc(length);
+    sprintf(string, "%li", (long int)n);
+
+    return string;
+}
+
+static ssize_t psStringAppend(char **dest, const char *format, ...)
+{
+    va_list         args;
+    size_t          length;             // complete string length (sans \0)
+    size_t          oldLength;          // original string length (sans \0)
+    ssize_t         tailLength;         // length of string to append
+
+    if (!*dest) {
+        *dest = psStringCopy("");
+        oldLength = 0;
+    } else {
+        // size of existing string
+        oldLength = strlen(*dest);
+    }
+
+    // find the size of the string to append
+    va_start(args, format);
+    // C99 guarentees vsnprintf() to work as expected with size = 0
+    tailLength = vsnprintf(*dest, 0, format, args);
+    va_end(args);
+
+    // if the new tail is zero length, return the length of the old string.  if
+    // it's a format error, return the error code.
+    if (tailLength < 1) {
+        return tailLength == 0 ? oldLength : tailLength;
+    }
+
+    // new string length (sans \0)
+    length = oldLength + tailLength;
+
+    // realloc string to string + tail + \0
+    *dest = psRealloc(*dest, length + 1);
+
+    // append tail + \0
+    va_start(args, format);
+    vsnprintf(*dest + oldLength, tailLength + 1, format, args);
+    va_end(args);
+
+    return length;
+}
+
+static ssize_t psStringPrepend(char **dest, const char *format, ...)
+{
+    va_list         args;
+    size_t          length;             // complete string length (sans \0)
+    ssize_t         headLength;         // length of string to prepend
+    char            *oldDest;           // copy of original string
+
+    if (!*dest) {
+        // makes the string backup and concatination pointless
+        *dest = psStringCopy("");
+        length = 0;
+    } else {
+        // size of existing string
+        length = strlen(*dest);
+    }
+
+    // find the size of the string to prepend
+    va_start(args, format);
+    // C99 guarentees vsnprintf() to work as expected with size = 0
+    headLength = vsnprintf(*dest, 0, format, args);
+    va_end(args);
+
+    // if the new head is zero length, return the length of the old string.  if
+    // it's a format error, return the error code.
+    if (headLength < 1) {
+        return headLength == 0 ? length : headLength;
+    }
+
+    // backup original string
+    oldDest = psStringCopy(*dest);
+
+    // new string length (sans \0)
+    length += headLength;
+
+    // realloc string to head + string + \0
+    *dest = psRealloc(*dest, length + 1);
+
+    // copy the new head to the beginning of string
+    va_start(args, format);
+    vsnprintf(*dest, length + 1, format, args);
+    va_end(args);
+
+    // append the original string
+    strncat(*dest, oldDest, length + 1);
+
+    psFree(oldDest);
+
+    return length;
+}
+
+#endif // BUILD_PSDB
Index: /tags/ipp-1-X/bug123/psLib/src/db/psDB.h
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/db/psDB.h	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/db/psDB.h	(revision 22331)
@@ -0,0 +1,267 @@
+/** @file  psDB.h
+ *
+ *  @brief database types and functions
+ *
+ *  This file defines the abstract database type and functions that
+ *  perform basic database operations.
+ *
+ *  @ingroup DataBase
+ *
+ *  @author Joshua Hoblitt
+ *
+ *  @version $Revision: 1.5 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-03-31 23:01:46 $
+ *
+ *  Copyright 2005 Joshua Hoblitt, University of Hawaii
+ */
+
+#ifndef PS_DB_H
+#define PS_DB_H 1
+
+#ifdef BUILD_PSDB
+
+#include "psType.h"
+#include "psMetadata.h"
+
+/// @addtogroup DataBase
+/// @{
+
+/** Database handle
+ *
+ *  An opaque object representing a database connection.
+ *
+ */
+typedef struct
+{
+    void* mysql;   ///< MySQL database handle
+}
+psDB;
+
+/** Opens a new database connection
+ *
+ *  @return A new psDB object if the database connection is successful or NULL on
+ *  failure.
+ */
+psDB *psDBInit(
+    const char *host,                   ///< Database server hostname
+    const char *user,                   ///< Database username
+    const char *passwd,                 ///< Database password
+    const char *dbname                  ///< Database namespace
+);
+
+/** Closes a database connection
+ */
+void psDBCleanup(
+    psDB *dbh                           ///< Database handle
+);
+
+/** Creates a new database namespace
+ *
+ * @return true on success
+ */
+bool psDBCreate(
+    psDB *dbh,                          ///< Database handle
+    const char *dbname                  ///< New database namespace
+);
+
+/** Changes the current database namespace
+ *
+ * @return true on success
+ */
+bool psDBChange(
+    psDB *dbh,                          ///< Database handle
+    const char *dbname                  ///< Database namespace
+);
+
+/** Drops a database namespace
+ *
+ * @return true on success
+ */
+bool psDBDrop(
+    psDB *dbh,                          ///< Database handle
+    const char *dbname                  ///< Database namespace
+);
+
+/** Creates a new database table
+ *
+ * This function generates and executes the SQL needed to create a table named
+ * "tableName", with the column names and data types as described in "md".  Each
+ * data item in the psMetadata collection represents a single table field.  The
+ * name of the field is given by the name of the psMetadataItem and the data
+ * type is give by the psMetadataItem.type and psMetadataItem.ptype entries.  A
+ * lookup table should be used to convert from PSLib types into MySQL
+ * compatible SQL data types.  For example, a PS_META_STR would map to an SQL99
+ * varchar.  If the value of type is PS_META_STR then the psMetadataItem.data
+ * element is set to a string with the length for the field written as a text
+ * string.  The value of the psMetadataItem.data element is unused for the
+ * PS_META_PRIMITIVE types.  Other psMetadata types beyond PS_META_STR and
+ * PS_META_PRIMITIVE are not allowed in a table definition.  
+ *
+ * Database indexes can be specified setting the "comment" field to "Primary
+ * Key" or "Key".  Comments are otherwise ignored.
+ *
+ * @return true on success
+ */
+bool psDBCreateTable(
+    psDB *dbh,                          ///< Database handle
+    const char *tableName,              ///< Table name
+    psMetadata *md                      ///< Column names, types, and indexes
+);
+
+/** Deletes a database table
+ *
+ * @return true on success
+*/
+bool psDBDropTable(
+    psDB *dbh,                          ///< Database handle
+    const char *tableName               ///< Table name
+);
+
+/** Selects a column from a table
+ *
+ * This function generates and executes the SQL needed to select an entire
+ * column from a table or up to "limit" rows from it.  If "limit" is 0, the
+ * entire range is returned.
+ *
+ * @return A psArray of strings or NULL on failure
+ */
+psArray *psDBSelectColumn(
+    psDB *dbh,                          ///< Database handle
+    const char *tableName,              ///< Table name
+    const char *col,                    ///< Column name
+    const psU64 limit                   ///< Maximum number of elements to return
+);
+
+/** Selects a column from a table and casts it to a given type
+ *
+ * This function generates and executes the SQL needed to select an entire
+ * column from a table or up to "limit" rows from it.  If "limit" is 0, the
+ * entire range is returned.  The data in the column is cast to to "pType".
+ *
+ * @return A psVector or NULL on failure
+ */
+psVector *psDBSelectColumnNum(
+    psDB *dbh,                          ///< Database handle
+    const char *tableName,              ///< Table name
+    const char *col,                    ///< Column name
+    psElemType pType,                   ///< Resulting psVector type
+    const psU64 limit                   ///< Maximum number of elements to return
+);
+
+/** Selects a set of rows from a table
+ *
+ * This function returns rows from the specified table which match the
+ * restrictions given by "where".  The restrictions are specified as field /
+ * value pairs.  The psMetadata collection "where" must consist of valid
+ * database fields.  The selected rows are returned as a psArray of psMetadata
+ * values, one per row.
+ *
+ * Currently, the "where" specification only supports the PS_META_STR type.
+ * The string value can be a SQL match pattern, e.g. "%foo%", or an empty
+ * string, e.g. "", to match NULL field values.
+ *
+ * @return A psArray of psMetadata or NULL on failure
+ */
+psArray *psDBSelectRows(
+    psDB *dbh,                          ///< Database handle
+    const char *tableName,              ///< Table name
+    psMetadata *where,                  ///< Row match criteria
+    const psU64 limit                   ///< Maximum number of elements to return
+);
+
+/** Insert a single row into a table
+ *
+ * This function inserts the data from "row" into "tableName".
+ *
+ * The "row" specification uses the psMetadataItem name as the column name.
+ * The field values may be specified in any order.  psMetadata types beyond
+ * PS_META_STR and PS_META_PRIMITIVE are not supported.  If fields are
+ * specified in "row" that do not exist in "tableName", the insert will fail.
+ *
+ * @return true on success
+ */
+bool psDBInsertOneRow(
+    psDB *dbh,                          ///< Database handle
+    const char *tableName,              ///< Table name
+    psMetadata *row                     ///< Row description
+);
+
+/** Insert a set of rows into a table
+ *
+ * This function inserts the data from "rowSet" into "tableName".
+ *
+ * "rowSet" is a psArray of psMetadata containing row specifications identical to
+ * those used in psDBInsertOneRow().
+ *
+ * @return true on success
+ */
+bool psDBInsertRows(
+    psDB *dbh,                          ///< Database handle
+    const char *tableName,              ///< Table name
+    psArray *rowSet                     ///< Set of rows to insert
+);
+
+/** Retrieves all rows from a table
+ *
+ * This function fetches all rows as an psArray of psMetadata.  The rows are in
+ * the same psMetadata format as used in psDBInsertOneRow() & psDBInsertRows().
+ *
+ * @return A psArray of psMetadata or NULL on failure
+ */
+psArray *psDBDumpRows(
+    psDB *dbh,                          ///< Database handle
+    const char *tableName               ///< Table name
+);
+
+/** Retrieves all columns from a table
+ *
+ * This function fetches all columns, as either a psVector or a psArray
+ * depending on whether or not the column is numeric, and return them in a
+ * psMetadata structure where psMetadataItem.name contains the column's name.
+ *
+ * @return A psMetadata containing either a psArrays or psVector per column
+ */
+psMetadata *psDBDumpCols(
+    psDB *dbh,                          ///< Database handle
+    const char *tableName               ///< Table name
+);
+
+/** Updates the field values, as specified, in a table
+ *
+ * This function updates the fields contained in "values" in the row(s) that
+ * have a field with the value indicated by "where".  Where "where" is in the
+ * same format as used in psDBSelectRows().
+ *
+ * The "values" specification uses the same format as the row specification
+ * used in psDBInsertOneRow(), etc.
+ *
+ * @return The number of rows modified or a negative value on error
+ */
+psS64 psDBUpdateRows(
+    psDB *dbh,                          ///< Database handle
+    const char *tableName,              ///< Table name
+    psMetadata *where,                  ///< Row match criteria
+    psMetadata *values                  ///< new field values
+);
+
+/** Deletes rows, as specified, in a table
+ *
+ * Delete the rows that are matched by "where" using the same semantics for
+ * "where" as in psDBUpdateRow().
+ *
+ * If "where" is NULL, all rows in the table will be removed and regardless of
+ * the number of rows that were dropped, only 1 will be returned on success.
+ *
+ * @return The number of rows removed or a negative value on error
+ */
+psS64 psDBDeleteRows(
+    psDB *dbh,                          ///< Database handle
+    const char *tableName,             ///< Table name
+    psMetadata *where                  ///< Row match criteria
+);
+
+/// @}
+
+#endif // BUILD_PSDB
+
+#endif // PS_DB_H
Index: /tags/ipp-1-X/bug123/psLib/src/fft/psImageFFT.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/fft/psImageFFT.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/fft/psImageFFT.c	(revision 22331)
@@ -0,0 +1,455 @@
+/** @file  psImageFFT.c
+ *
+ *  @brief Contains FFT transform related functions for psImage.
+ *
+ *  @author Robert DeSonia, MHPCC
+ *
+ *  @version $Revision: 1.11 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-04-15 00:12:08 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+#include <unistd.h>
+#include <string.h>
+#include <complex.h>
+#include <fftw3.h>
+
+#include "psImageFFT.h"
+#include "psError.h"
+#include "psMemory.h"
+#include "psLogMsg.h"
+#include "psImageExtraction.h"
+#include "psImageIO.h"
+
+#include "psImageErrors.h"
+
+#define PS_FFTW_PLAN_RIGOR FFTW_ESTIMATE
+
+static psBool p_fftwWisdomImported = false;
+
+psImage* psImageFFT(psImage* out, const psImage* in, psFFTFlags direction)
+{
+    psU32 numCols;
+    psU32 numRows;
+    psElemType type;
+    fftwf_plan plan;
+
+    /* got good image data? */
+    if (in == NULL) {
+        psFree(out);
+        return NULL;
+    }
+
+    if ( ((direction & PS_FFT_FORWARD) != 0) ) {
+        if ((direction & PS_FFT_REVERSE) != 0) {
+            psError(PS_ERR_BAD_PARAMETER_VALUE, true,
+                    PS_ERRORTEXT_psImageFFT_FORWARD_REVERSE);
+            psFree(out);
+            return NULL;
+        }
+        if ((direction & PS_FFT_REAL_RESULT) != 0) {
+            psError(PS_ERR_BAD_PARAMETER_VALUE, true,
+                    PS_ERRORTEXT_psImageFFT_REAL_FORWARD_NOTSUPPORTED);
+            psFree(out);
+            return NULL;
+        }
+    } else if ((direction & PS_FFT_REVERSE) == 0) {
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true,
+                PS_ERRORTEXT_psImageFFT_NO_DIRECTION_OPTION);
+        psFree(out);
+        return NULL;
+    }
+
+    type = in->type.type;
+
+    /* make sure the system-level wisdom information is imported. */
+    if (!p_fftwWisdomImported) {
+        fftwf_import_system_wisdom();
+        p_fftwWisdomImported = true;
+    }
+
+    numRows = in->numRows;
+    numCols = in->numCols;
+
+    // n.b. FFTW can perform a in-place transform at the same rate or faster than out-of-place.
+    psS32 sign = ((direction & PS_FFT_FORWARD) != 0) ? FFTW_FORWARD : FFTW_BACKWARD;
+
+    fftwf_complex* outBuffer = fftwf_malloc(numRows*numCols*sizeof(fftwf_complex));
+    p_psImageCopyToRawBuffer(outBuffer, in, PS_TYPE_C32);
+
+    plan = fftwf_plan_dft_2d(numRows, numCols,
+                             outBuffer,
+                             outBuffer,
+                             sign,
+                             PS_FFTW_PLAN_RIGOR);
+
+    /* check if a plan exists now -- if not, it is a real problem at this point */
+    if (plan == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                PS_ERRORTEXT_psImageFFT_FFTW_PLAN_NULL);
+        psFree(out);
+        return NULL;
+    }
+
+    /* finally, call FFTW with the plan made above */
+    fftwf_execute(plan);
+
+    fftwf_destroy_plan(plan);
+
+    if (direction & PS_FFT_REAL_RESULT) {
+        // n.b., we do this instead of using fftwf_plan_dft_c2r because that
+        // plan requires a half-image, which would require a image reordering
+        // that is not as simple as performing a normal complex transform and
+        // then taking the real part of the result.  If performance here
+        // becomes an issue, the use of fftwf_plan_dft_r2c should be considered
+        // as well as fftwf_plan_dft_c2r.
+        out = psImageRecycle(out,numCols,numRows,PS_TYPE_F32);
+        int index = 0;
+        for (int row=0; row < numRows; row++) {
+            psF32* outRow = out->data.F32[row];
+            for (int col=0; col < numCols; col++) {
+                outRow[col] = crealf(outBuffer[index++]); // take just the real part
+            }
+        }
+    } else {
+        out = psImageRecycle(out,numCols,numRows,PS_TYPE_C32);
+        int index = 0;
+        for (int row=0; row < numRows; row++) {
+            psC32* outRow = out->data.C32[row];
+            for (int col=0; col < numCols; col++) {
+                outRow[col] = outBuffer[index++]; // take just the real part
+            }
+        }
+        //        memcpy(out->rawDataBuffer, outBuffer, numRows*numCols*sizeof(fftwf_complex));
+    }
+
+    fftwf_free(outBuffer);
+
+    return out;
+
+}
+
+psImage* psImageReal(psImage* out, const psImage* in)
+{
+    psElemType type;
+    psU32 numCols;
+    psU32 numRows;
+
+    if (in == NULL) {
+        psFree(out);
+        return NULL;
+    }
+
+    type = in->type.type;
+    numCols = in->numCols;
+    numRows = in->numRows;
+
+    /* if not a complex number, this is logically just a copy then */
+    if (!PS_IS_PSELEMTYPE_COMPLEX(type)) {
+        return psImageCopy(out, in, type);
+    }
+
+    if (type == PS_TYPE_C32) {
+        psF32* outRow;
+        psC32* inRow;
+
+        out = psImageRecycle(out, numCols, numRows, PS_TYPE_F32);
+        for (psU32 row = 0; row < numRows; row++) {
+            outRow = out->data.F32[row];
+            inRow = in->data.C32[row];
+
+            for (psU32 col = 0; col < numCols; col++) {
+                outRow[col] = crealf(inRow[col]);
+            }
+        }
+    } else if (type == PS_TYPE_C64) {
+        psF64* outRow;
+        psC64* inRow;
+
+        out = psImageRecycle(out, numCols, numRows, PS_TYPE_F64);
+        for (psU32 row = 0; row < numRows; row++) {
+            outRow = out->data.F64[row];
+            inRow = in->data.C64[row];
+
+            for (psU32 col = 0; col < numCols; col++) {
+                outRow[col] = creal(inRow[col]);
+            }
+        }
+    } else {
+        char* typeStr;
+        PS_TYPE_NAME(typeStr,type);
+        psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                PS_ERRORTEXT_psImage_IMAGE_TYPE_UNSUPPORTED,
+                typeStr);
+
+        psFree(out);
+        return NULL;
+    }
+
+    return out;
+}
+
+psImage* psImageImaginary(psImage* out, const psImage* in)
+{
+    psElemType type;
+    psU32 numCols;
+    psU32 numRows;
+
+    if (in == NULL) {
+        psFree(out);
+        return NULL;
+    }
+
+    type = in->type.type;
+    numCols = in->numCols;
+    numRows = in->numRows;
+
+    /* if not a complex image type, this is logically just zeroed image of same size */
+    if (!PS_IS_PSELEMTYPE_COMPLEX(type)) {
+        out = psImageRecycle(out, numCols, numRows, type);
+        memset(out->data.V[0], 0, PSELEMTYPE_SIZEOF(type) * numCols * numRows);
+        return out;
+    }
+
+    if (type == PS_TYPE_C32) {
+        psF32* outRow;
+        psC32* inRow;
+
+        out = psImageRecycle(out, numCols, numRows, PS_TYPE_F32);
+        for (psU32 row = 0; row < numRows; row++) {
+            outRow = out->data.F32[row];
+            inRow = in->data.C32[row];
+
+            for (psU32 col = 0; col < numCols; col++) {
+                outRow[col] = cimagf(inRow[col]);
+            }
+        }
+    } else if (type == PS_TYPE_C64) {
+        psF64* outRow;
+        psC64* inRow;
+
+        out = psImageRecycle(out, numCols, numRows, PS_TYPE_F64);
+        for (psU32 row = 0; row < numRows; row++) {
+            outRow = out->data.F64[row];
+            inRow = in->data.C64[row];
+
+            for (psU32 col = 0; col < numCols; col++) {
+                outRow[col] = cimag(inRow[col]);
+            }
+        }
+    } else {
+        char* typeStr;
+        PS_TYPE_NAME(typeStr,type);
+        psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                PS_ERRORTEXT_psImage_IMAGE_TYPE_UNSUPPORTED,
+                typeStr);
+        psFree(out);
+        return NULL;
+    }
+
+    return out;
+}
+
+psImage* psImageComplex(psImage* out, const psImage* real, const psImage* imag)
+{
+    psElemType type;
+    psU32 numCols;
+    psU32 numRows;
+
+    if (real == NULL || imag == NULL) {
+        psFree(out);
+        return NULL;
+    }
+
+    type = real->type.type;
+    numCols = real->numCols;
+    numRows = real->numRows;
+
+    if (imag->type.type != type) {
+        char* typeStrReal;
+        char* typeStrImag;
+        PS_TYPE_NAME(typeStrReal,type);
+        PS_TYPE_NAME(typeStrImag,imag->type.type);
+        psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                PS_ERRORTEXT_psImageFFT_REAL_IMAG_TYPE_MISMATCH,
+                typeStrReal,typeStrImag);
+        psFree(out);
+        return NULL;
+    }
+
+    if (imag->numCols != numCols || imag->numRows != numRows) {
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true,
+                PS_ERRORTEXT_psImageFFT_REAL_IMAG_SIZE_MISMATCH,
+                numCols, numRows, imag->numCols, imag->numRows);
+        psFree(out);
+        return NULL;
+    }
+
+    if (type == PS_TYPE_F32) {
+        psC32* outRow;
+        psF32* realRow;
+        psF32* imagRow;
+
+        out = psImageRecycle(out, numCols, numRows, PS_TYPE_C32);
+
+        for (psU32 row = 0; row < numRows; row++) {
+            outRow = out->data.C32[row];
+            realRow = real->data.F32[row];
+            imagRow = imag->data.F32[row];
+
+            for (psU32 col = 0; col < numCols; col++) {
+                outRow[col] = realRow[col] + I * imagRow[col];
+            }
+        }
+    } else if (type == PS_TYPE_F64) {
+        psC64* outRow;
+        psF64* realRow;
+        psF64* imagRow;
+
+        out = psImageRecycle(out, numCols, numRows, PS_TYPE_C64);
+        for (psU32 row = 0; row < numRows; row++) {
+            outRow = out->data.C64[row];
+            realRow = real->data.F64[row];
+            imagRow = imag->data.F64[row];
+
+            for (psU32 col = 0; col < numCols; col++) {
+                outRow[col] = realRow[col] + I * imagRow[col];
+            }
+        }
+    } else {
+        char* typeStr;
+        PS_TYPE_NAME(typeStr,type);
+        psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                PS_ERRORTEXT_psImageFFT_NONREAL_NOTSUPPORTED,
+                typeStr);
+        psFree(out);
+        return NULL;
+    }
+
+
+    return out;
+}
+
+psImage* psImageConjugate(psImage* out, const psImage* in)
+{
+    psElemType type;
+    psU32 numCols;
+    psU32 numRows;
+
+    if (in == NULL) {
+        psFree(out);
+        return NULL;
+    }
+
+    type = in->type.type;
+    numCols = in->numCols;
+    numRows = in->numRows;
+
+    /* if not a complex image, this is logically just a image copy */
+    if (!PS_IS_PSELEMTYPE_COMPLEX(type)) {
+        return psImageCopy(out, in, type);
+    }
+
+    if (type == PS_TYPE_C32) {
+        psC32* outRow;
+        psC32* inRow;
+
+        out = psImageRecycle(out, numCols, numRows, PS_TYPE_C32);
+        for (psU32 row = 0; row < numRows; row++) {
+            outRow = out->data.C32[row];
+            inRow = in->data.C32[row];
+
+            for (psU32 col = 0; col < numCols; col++) {
+                outRow[col] = crealf(inRow[col]) - I * cimagf(inRow[col]);
+            }
+        }
+    } else if (type == PS_TYPE_C64) {
+        psC64* outRow;
+        psC64* inRow;
+
+        out = psImageRecycle(out, numCols, numRows, PS_TYPE_C64);
+        for (psU32 row = 0; row < numRows; row++) {
+            outRow = out->data.C64[row];
+            inRow = in->data.C64[row];
+
+            for (psU32 col = 0; col < numCols; col++) {
+                outRow[col] = creal(inRow[col]) - I * cimag(inRow[col]);
+            }
+        }
+    } else {
+        char* typeStr;
+        PS_TYPE_NAME(typeStr,type);
+        psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                PS_ERRORTEXT_psImageFFT_NONCOMPLEX_NOTSUPPORTED,
+                typeStr);
+        psFree(out);
+        return NULL;
+    }
+
+    return out;
+}
+
+psImage* psImagePowerSpectrum(psImage* out, const psImage* in)
+{
+    psElemType type;
+    psU32 numCols;
+    psU32 numRows;
+
+    if (in == NULL) {
+        psFree(out);
+        return NULL;
+    }
+
+    type = in->type.type;
+    numCols = in->numCols;
+    numRows = in->numRows;
+
+    if (type == PS_TYPE_C32) {
+        psF32* outRow;
+        psC32* inRow;
+        psF32 real;
+        psF32 imag;
+        psF32 numElementsSquared = numCols * numCols * numRows * numRows;
+
+        out = psImageRecycle(out, numCols, numRows, PS_TYPE_F32);
+        for (psU32 row = 0; row < numRows; row++) {
+            outRow = out->data.F32[row];
+            inRow = in->data.C32[row];
+
+            for (psU32 col = 0; col < numCols; col++) {
+                real = crealf(inRow[col]);
+                imag = cimagf(inRow[col]);
+                outRow[col] = (real * real + imag * imag) / numElementsSquared;
+            }
+        }
+    } else if (type == PS_TYPE_C64) {
+        psF64* outRow;
+        psC64* inRow;
+        psF64 real;
+        psF64 imag;
+        psF64 numElementsSquared = numCols * numCols * numRows * numRows;
+
+        out = psImageRecycle(out, numCols, numRows, PS_TYPE_F64);
+        for (psU32 row = 0; row < numRows; row++) {
+            outRow = out->data.F64[row];
+            inRow = in->data.C64[row];
+
+            for (psU32 col = 0; col < numCols; col++) {
+                real = creal(inRow[col]);
+                imag = cimag(inRow[col]);
+                outRow[col] = (real * real + imag * imag) / numElementsSquared;
+            }
+        }
+    } else {
+        char* typeStr;
+        PS_TYPE_NAME(typeStr,type);
+        psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                PS_ERRORTEXT_psImageFFT_NONCOMPLEX_NOTSUPPORTED,
+                typeStr);
+        psFree(out);
+        return NULL;
+    }
+
+    return out;
+
+}
Index: /tags/ipp-1-X/bug123/psLib/src/fft/psImageFFT.h
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/fft/psImageFFT.h	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/fft/psImageFFT.h	(revision 22331)
@@ -0,0 +1,87 @@
+/** @file  psImageFFT.h
+ *
+ *  @brief Contains FFT transform related functions for psImage
+ *
+ *  @ingroup Transform
+ *
+ *  @author Robert DeSonia, MHPCC
+ *
+ *  @version $Revision: 1.3 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-02-17 19:26:24 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+
+#ifndef PS_IMAGE_FFT_H
+#define PS_IMAGE_FFT_H
+
+#include "psImage.h"
+#include "psVectorFFT.h"               // for psFFTFlags
+
+/// @addtogroup Transform
+/// @{
+
+/** Forward and reverse FFT calculations.
+ *
+ *  This takes as input the image of interest (in) and the direction 
+ *  (direction), which is specified by an enumerated type psFftDirection.
+ *  The input image may be of type psF32 or psC32, the result is always 
+ *  psC32. If the input vector is psF32, the direction must be forward. 
+ *  
+ *  @return psImage* the FFT transformation result
+ */
+psImage* psImageFFT(
+    psImage* out,                      ///< a psImage to recycle.  If NULL, a new psImage is made.
+    const psImage* in,                 ///< the psImage to apply transform to
+    psFFTFlags direction               ///< the direction of the transform
+);
+
+/** extract the real portion of a complex image
+ * 
+ *  @return psImage*   real portion of the input image.
+ */
+psImage* psImageReal(
+    psImage* out,                      ///< a psImage to recycle.  If NULL, a new psImage is made.
+    const psImage* in                  ///< the psImage to extract real portion from
+);
+
+/** extract the imaginary portion of a complex image
+ * 
+ *  @return psImage*   imaginary portion of the input image.
+ */
+psImage* psImageImaginary(
+    psImage* out,                      ///< a psImage to recycle.  If NULL, a new psImage is made.
+    const psImage* in                  ///< the psImage to extract imaginary portion from
+);
+
+/** creates a complex image from separate real and imaginary plane images
+ * 
+ *  @return psImage*   resulting complex image
+ */
+psImage* psImageComplex(
+    psImage* out,                      ///< a psImage to recycle.  If NULL, a new psImage is made.
+    const psImage* real,               ///< the real plane image
+    const psImage* imag                ///< the imaginary plane image
+);
+
+/** computes the complex conjugate of an image
+ * 
+ *  @return psImage*   the complex conjugate of the 'in' image
+ */
+psImage* psImageConjugate(
+    psImage* out,                      ///< a psImage to recycle.  If NULL, a new psImage is made.
+    const psImage* in                  ///< the psImage to compute conjugate of
+);
+
+/** computes the power spectrum of an image
+ * 
+ *  @return psImage*   the power spectrum of the 'in' image
+ */
+psImage* psImagePowerSpectrum(
+    psImage* out,                       ///< a psImage to recycle.  If NULL, a new psImage is made.
+    const psImage* in                   ///< the psImage to power spectrum of
+);
+
+/// @}
+
+#endif
Index: /tags/ipp-1-X/bug123/psLib/src/fft/psVectorFFT.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/fft/psVectorFFT.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/fft/psVectorFFT.c	(revision 22331)
@@ -0,0 +1,418 @@
+/** @file  psVectorFFT.c
+ *
+ *  @brief Contains FFT transform related functions for psVector
+ *
+ *  @author Robert DeSonia, MHPCC
+ *
+ *  @version $Revision: 1.31 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-03-22 21:52:49 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+
+#include <unistd.h>
+#include <stdbool.h>
+#include <string.h>
+#include <complex.h>
+#include <fftw3.h>
+
+#include "psVectorFFT.h"
+#include "psError.h"
+#include "psMemory.h"
+#include "psLogMsg.h"
+#include "psImageExtraction.h"
+
+#include "psDataManipErrors.h"
+
+#define P_FFTW_PLAN_RIGOR FFTW_ESTIMATE
+
+static psBool p_fftwWisdomImported = false;
+
+psVector* psVectorFFT(psVector* out, const psVector* in, psFFTFlags direction)
+{
+    psU32 numElements;
+    psElemType type;
+    fftwf_plan plan;
+
+    /* got good image data? */
+    if (in == NULL) {
+        psFree(out);
+        return NULL;
+    }
+
+    type = in->type.type;
+
+    /* make sure the system-level wisdom information is imported. */
+    if (!p_fftwWisdomImported) {
+        fftwf_import_system_wisdom();
+        p_fftwWisdomImported = true;
+    }
+
+    numElements = in->n;
+
+    out = psVectorCopy(out, in, PS_TYPE_C32);
+    out->n = numElements;
+
+    if ((direction & PS_FFT_FORWARD) != 0) {
+        plan = fftwf_plan_dft_1d(numElements,
+                                 (fftwf_complex *) out->data.C32,
+                                 (fftwf_complex *) out->data.C32, FFTW_FORWARD, P_FFTW_PLAN_RIGOR);
+    } else if ((direction & PS_FFT_REVERSE) != 0) {
+        plan = fftwf_plan_dft_1d(numElements,
+                                 (fftwf_complex *) out->data.C32,
+                                 (fftwf_complex *) out->data.C32, FFTW_BACKWARD, P_FFTW_PLAN_RIGOR);
+    } else {
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true,
+                PS_ERRORTEXT_psVectorFFT_DIRECTION_NOTSET);
+        psFree(out);
+        return NULL;
+    }
+
+    /* check if a plan exists now */
+    if (plan == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                PS_ERRORTEXT_psVectorFFT_FFTW_PLAN_NULL);
+        psFree(out);
+        return NULL;
+    }
+
+    /* finally, call FFTW with the plan made above */
+    fftwf_execute(plan);
+
+    fftwf_destroy_plan(plan);
+
+    if ((direction & PS_FFT_REAL_RESULT) != 0) {
+        for (psS32 i = 0; i < numElements; i++) {
+            out->data.F32[i] = out->data.C32[i];
+        }
+        out->type.type = PS_TYPE_F32;
+        out->data.U8 = psRealloc(out->data.U8,PSELEMTYPE_SIZEOF(PS_TYPE_F32)*out->nalloc);
+    }
+
+    return out;
+}
+
+psVector* psVectorReal(psVector* out, const psVector* in)
+{
+    psElemType type;
+    psU32 numElements;
+
+    if (in == NULL) {
+        psFree(out);
+        return NULL;
+    }
+
+    type = in->type.type;
+    numElements = in->n;
+
+    /* if not a complex number, this is logically just a copy */
+    if (!PS_IS_PSELEMTYPE_COMPLEX(type)) {
+        // Warn user, as this is probably not expected
+        psLogMsg(__func__, PS_LOG_WARN, "Real portion of a non-Complex type called called for. "
+                 "Just a vector copy was performed.");
+        out = psVectorRecycle(out, numElements, type);
+        out->n = numElements;
+        memcpy(out->data.U8, in->data.U8, numElements * PSELEMTYPE_SIZEOF(type));
+        return out;
+    }
+
+    if (type == PS_TYPE_C32) {
+        psF32* outVec;
+        psC32* inVec = in->data.C32;
+
+        out = psVectorRecycle(out, numElements, PS_TYPE_F32);
+        out->n = numElements;
+        outVec = out->data.F32;
+
+        for (psU32 i = 0; i < numElements; i++) {
+            outVec[i] = crealf(inVec[i]);
+        }
+    } else if (type == PS_TYPE_C64) {
+        psF64* outVec;
+        psC64* inVec = in->data.C64;
+
+        out = psVectorRecycle(out, numElements, PS_TYPE_F64);
+        out->n = numElements;
+        outVec = out->data.F64;
+
+        for (psU32 i = 0; i < numElements; i++) {
+            outVec[i] = creal(inVec[i]);
+        }
+    } else {
+        char* typeStr;
+        PS_TYPE_NAME(typeStr,type);
+        psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                PS_ERRORTEXT_psVectorFFT_TYPE_UNSUPPORTED,
+                typeStr);
+        psFree(out);
+        return NULL;
+    }
+
+    return out;
+}
+
+psVector* psVectorImaginary(psVector* out, const psVector* in)
+{
+    psElemType type;
+    psU32 numElements;
+
+    if (in == NULL) {
+        psFree(out);
+        return NULL;
+    }
+
+    type = in->type.type;
+    numElements = in->n;
+
+    /* if not a complex number, this is logically just zeroed image of same size */
+    if (!PS_IS_PSELEMTYPE_COMPLEX(type)) {
+        // Warn user, as this is probably not expected
+        psLogMsg(__func__, PS_LOG_WARN, "Imaginary portion of a non-Complex type called for. "
+                 "A zeroed vector was returned.");
+        out = psVectorRecycle(out, numElements, type);
+        out->n = numElements;
+        memset(out->data.U8, 0, PSELEMTYPE_SIZEOF(type) * numElements);
+        return out;
+    }
+
+    if (type == PS_TYPE_C32) {
+        psF32* outVec;
+        psC32* inVec = in->data.C32;
+
+        out = psVectorRecycle(out, numElements, PS_TYPE_F32);
+        out->n = numElements;
+        outVec = out->data.F32;
+
+        for (psU32 i = 0; i < numElements; i++) {
+            outVec[i] = cimagf(inVec[i]);
+        }
+    } else if (type == PS_TYPE_C64) {
+        psF64* outVec;
+        psC64* inVec = in->data.C64;
+
+        out = psVectorRecycle(out, numElements, PS_TYPE_F64);
+        out->n = numElements;
+        outVec = out->data.F64;
+
+        for (psU32 i = 0; i < numElements; i++) {
+            outVec[i] = cimag(inVec[i]);
+        }
+    } else {
+        char* typeStr;
+        PS_TYPE_NAME(typeStr,type);
+        psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                PS_ERRORTEXT_psVectorFFT_TYPE_UNSUPPORTED,
+                typeStr);
+        psFree(out);
+        return NULL;
+    }
+
+    return out;
+}
+
+psVector* psVectorComplex(psVector* out, const psVector* real, const psVector* imag)
+{
+    psElemType type;
+    psU32 numElements;
+
+    if (real == NULL || imag == NULL) {
+        psFree(out);
+        return NULL;
+    }
+
+    type = real->type.type;
+    if (real->n < imag->n) {
+        numElements = real->n;
+    } else {
+        numElements = imag->n;
+    }
+
+    if (imag->type.type != type) {
+        char* typeStrReal;
+        char* typeStrImag;
+        PS_TYPE_NAME(typeStrReal,type);
+        PS_TYPE_NAME(typeStrImag,imag->type.type);
+        psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                PS_ERRORTEXT_psVectorFFT_REAL_IMAG_TYPE_MISMATCH,
+                typeStrReal,typeStrImag);
+        psFree(out);
+        return NULL;
+    }
+
+    if (type == PS_TYPE_F32) {
+        psC32* outVec;
+        psF32* realVec = real->data.F32;
+        psF32* imagVec = imag->data.F32;
+
+        out = psVectorRecycle(out, numElements, PS_TYPE_C32);
+        out->n = numElements;
+        outVec = out->data.C32;
+
+        for (psU32 i = 0; i < numElements; i++) {
+            outVec[i] = realVec[i] + I * imagVec[i];
+        }
+    } else if (type == PS_TYPE_F64) {
+        psC64* outVec;
+        psF64* realVec = real->data.F64;
+        psF64* imagVec = imag->data.F64;
+
+        out = psVectorRecycle(out, numElements, PS_TYPE_C64);
+        out->n = numElements;
+        outVec = out->data.C64;
+
+        for (psU32 i = 0; i < numElements; i++) {
+            outVec[i] = realVec[i] + I * imagVec[i];
+        }
+    } else {
+        char* typeStr;
+        PS_TYPE_NAME(typeStr,type);
+        psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                PS_ERRORTEXT_psVectorFFT_NONREAL_NOTSUPPORTED,
+                typeStr);
+        psFree(out);
+        return NULL;
+    }
+
+    return out;
+}
+
+psVector* psVectorConjugate(psVector* out, const psVector* in)
+{
+    psElemType type;
+    psU32 numElements;
+
+    if (in == NULL) {
+        psFree(out);
+        return NULL;
+    }
+
+    type = in->type.type;
+    numElements = in->n;
+
+    /* if not a complex number, this is logically just a image copy */
+    if (!PS_IS_PSELEMTYPE_COMPLEX(type)) {
+        // Warn user, as this is probably not expected
+        psLogMsg(__func__, PS_LOG_WARN, "Complex Conjugate of a non-Complex type called for. "
+                 "Vector copy was performed instead.");
+
+        out = psVectorRecycle(out, numElements, type);
+        out->n = numElements;
+        memcpy(out->data.U8, in->data.U8, PSELEMTYPE_SIZEOF(type) * numElements);
+        return out;
+    }
+
+    if (type == PS_TYPE_C32) {
+        psC32* outVec;
+        psC32* inVec = in->data.C32;
+
+        out = psVectorRecycle(out, numElements, PS_TYPE_C32);
+        out->n = numElements;
+        outVec = out->data.C32;
+
+        for (psU32 i = 0; i < numElements; i++) {
+            outVec[i] = crealf(inVec[i]) - I * cimagf(inVec[i]);
+        }
+    } else if (type == PS_TYPE_C64) {
+        psC64* outVec;
+        psC64* inVec = in->data.C64;
+
+        out = psVectorRecycle(out, numElements, PS_TYPE_C64);
+        out->n = numElements;
+        outVec = out->data.C64;
+
+        for (psU32 i = 0; i < numElements; i++) {
+            outVec[i] = creal(inVec[i]) - I * cimag(inVec[i]);
+        }
+    } else {
+        char* typeStr;
+        PS_TYPE_NAME(typeStr,type);
+        psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                PS_ERRORTEXT_psVectorFFT_NONCOMPLEX_NOTSUPPORTED,
+                typeStr);
+        psFree(out);
+        return NULL;
+    }
+
+    return out;
+}
+
+psVector* psVectorPowerSpectrum(psVector* out, const psVector* in)
+{
+    psElemType type;
+    psU32 outNumElements;
+    psU32 inNumElements;
+    psU32 inHalfNumElements;
+    psU32 inNumElementsSquared;
+
+    if (in == NULL) {
+        psFree(out);
+        return NULL;
+    }
+
+    type = in->type.type;
+    inNumElements = in->n;
+    inNumElementsSquared = inNumElements * inNumElements;
+    inHalfNumElements = inNumElements / 2;
+    outNumElements = inHalfNumElements + 1;
+
+    if (type == PS_TYPE_C32) {
+        psF32* outVec;
+        psC32* inVec = in->data.C32;
+        psF32 inAbs1;
+        psF32 inAbs2;
+
+        out = psVectorRecycle(out, outNumElements, PS_TYPE_F32);
+        out->n = outNumElements;
+        outVec = out->data.F32;
+
+        // from ADD: P_0 = |C_0|^2/N^2
+        inAbs1 = cabsf(inVec[0]);
+        outVec[0] = inAbs1 * inAbs1 / inNumElementsSquared;
+
+        // from ADD: P_j = (|C_j|^2+|C_N-j|^2)/N^2, where j = 1,2,...,(N/2-1)
+        for (psU32 i = 1; i < inHalfNumElements; i++) {
+            inAbs1 = cabsf(inVec[i]);
+            inAbs2 = cabsf(inVec[inNumElements - i]);
+            outVec[i] = (inAbs1 * inAbs1 + inAbs2 * inAbs2) / inNumElementsSquared;
+        }
+
+        // from ADD: P_N/2 = |C_N/2|^2/N^2
+        inAbs1 = cabsf(inVec[inHalfNumElements]);
+        outVec[inHalfNumElements] = inAbs1 * inAbs1 / inNumElementsSquared;
+    } else if (type == PS_TYPE_C64) {
+        psF64* outVec;
+        psC64* inVec = in->data.C64;
+        psF64 inAbs1;
+        psF64 inAbs2;
+
+        out = psVectorRecycle(out, outNumElements, PS_TYPE_F64);
+        out->n = outNumElements;
+        outVec = out->data.F64;
+
+        // from ADD: P_0 = |C_0|^2/N^2
+        inAbs1 = cabs(inVec[0]);
+        outVec[0] = inAbs1 * inAbs1 / inNumElementsSquared;
+
+        // from ADD: P_j = (|C_j|^2+|C_N-j|^2)/N^2, where j = 1,2,...,(N/2-1)
+        for (psU32 i = 1; i < inHalfNumElements; i++) {
+            inAbs1 = cabs(inVec[i]);
+            inAbs2 = cabs(inVec[inNumElements - i]);
+            outVec[i] = (inAbs1 * inAbs1 + inAbs2 * inAbs2) / inNumElementsSquared;
+        }
+
+        // from ADD: P_N/2 = |C_N/2|^2/N^2
+        inAbs1 = cabs(inVec[inHalfNumElements]);
+        outVec[inHalfNumElements] = inAbs1 * inAbs1 / inNumElementsSquared;
+    } else {
+        char* typeStr;
+        PS_TYPE_NAME(typeStr,type);
+        psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                PS_ERRORTEXT_psVectorFFT_NONCOMPLEX_NOTSUPPORTED,
+                typeStr);
+        psFree(out);
+        return NULL;
+    }
+
+    return out;
+
+}
Index: /tags/ipp-1-X/bug123/psLib/src/fft/psVectorFFT.h
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/fft/psVectorFFT.h	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/fft/psVectorFFT.h	(revision 22331)
@@ -0,0 +1,99 @@
+/** @file  psVectorFFT.h
+ *
+ *  @brief Contains FFT transform related functions for psVector
+ *
+ *  @ingroup Transform
+ *
+ *  @author Robert DeSonia, MHPCC
+ *
+ *  @version $Revision: 1.17 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-02-17 19:26:23 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+
+#ifndef PS_VECTOR_FFT_H
+#define PS_VECTOR_FFT_H
+
+#include "psVector.h"
+
+/// @addtogroup Transform
+/// @{
+
+/** Specify direction of FFT */
+typedef enum {
+    /// psImageFFT/psVectorFFT should perform a forward FFT.
+    PS_FFT_FORWARD = 1,
+
+    /// psImageFFT/psVectorFFT should perform a reverse FFT.
+    PS_FFT_REVERSE = 2,
+
+    /// psImageFFT/psVectorFFT should perform a reverse FFT with a real result.
+    PS_FFT_REAL_RESULT = 4
+} psFFTFlags;
+
+
+/** Forward and reverse FFT calculations.
+ *
+ *  This takes as input the vector of interest (in) and the direction 
+ *  (direction), which is specified by an enumerated type psFftDirection.
+ *  The input vector may be of type psF32 or psC32, the result is always 
+ *  psC32. If the input vector is psF32, the direction must be forward. 
+ *  
+ *  @return psVector* the FFT transformation result
+ */
+psVector* psVectorFFT(
+    psVector* out,                     ///< a psVector to recycle.  If NULL, a new psVector is made.
+    const psVector* in,                ///< the vector to apply transform to
+    psFFTFlags direction               ///< the direction of the transform
+);
+
+/** extract the real portion of a complex vector
+ * 
+ *  @return psVector*   real portion of the input vector.
+ */
+psVector* psVectorReal(
+    psVector* out,                     ///< a psVector to recycle.  If NULL, a new psVector is made.
+    const psVector* in                ///< the psVector to extract real portion from
+);
+
+/** extract the imaginary portion of a complex vector
+ * 
+ *  @return psVector*   imaginary portion of the input vector.
+ */
+psVector* psVectorImaginary(
+    psVector* out,                     ///< a psVector to recycle.  If NULL, a new psVector is made.
+    const psVector* in                 ///< the psVector to extract imaginary portion from
+);
+
+/** creates a complex vector from separate real and imaginary vectors
+ * 
+ *  @return psVector*   resulting complex vector
+ */
+psVector* psVectorComplex(
+    psVector* out,                     ///< a psVector to recycle.  If NULL, a new psVector is made.
+    const psVector* real,              ///< the real vector
+    const psVector* imag               ///< the imaginary vector
+);
+
+/** computes the complex conjugate of a vector
+ * 
+ *  @return psVector*   the complex conjugate of the 'in' vector
+ */
+psVector* psVectorConjugate(
+    psVector* out,                     ///< a psVector to recycle.  If NULL, a new psVector is made.
+    const psVector* in                 ///< the psVector to compute conjugate of
+);
+
+/** computes the power spectrum of a vector
+ * 
+ *  @return psVector*   the power spectrum of the 'in' vector
+ */
+psVector* psVectorPowerSpectrum(
+    psVector* out,                     ///< a psVector to recycle.  If NULL, a new psVector is made.
+    const psVector* in                 ///< the psVector to power spectrum of
+);
+
+/// @}
+
+#endif
Index: /tags/ipp-1-X/bug123/psLib/src/fits/psFits.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/fits/psFits.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/fits/psFits.c	(revision 22331)
@@ -0,0 +1,1695 @@
+/** @file  psFits.c
+ *
+ *  @brief Contains Fits I/O routines
+ *
+ *  @ingroup FileIO
+ *
+ *  @author Robert DeSonia, MHPCC
+ *
+ *  @version $Revision: 1.27 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-04-07 20:27:41 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+
+#include <unistd.h>
+
+#include "psFits.h"
+#include "string.h"
+#include "psError.h"
+#include "psFileUtilsErrors.h"
+#include "psImageExtraction.h"
+#include "psMemory.h"
+#include "psString.h"
+#include "psLogMsg.h"
+#include "psTrace.h"
+
+#define MAX_STRING_LENGTH 256  // maximum length string for FITS routines
+
+// list of FITS header keys to ignore.
+static char* standardFitsKeys[] = {
+                                      NULL
+                                  };
+
+static psElemType convertFitsToPsType(int datatype)
+{
+    switch (datatype) {
+    case TBYTE:
+        return PS_TYPE_U8;
+    case TSBYTE:
+        return PS_TYPE_S8;
+    case TSHORT:
+        return PS_TYPE_S16;
+    case TUSHORT:
+        return PS_TYPE_U16;
+    case TLONG:
+        if (sizeof(long) == 8) {
+            return PS_TYPE_S64;
+        }
+        // no break
+    case TINT:
+        return PS_TYPE_S32;
+    case TULONG:
+        if (sizeof(unsigned long) == 8) {
+            return PS_TYPE_U64;
+        }
+        // no break
+    case TUINT:
+        return PS_TYPE_U32;
+    case TLONGLONG:
+        return PS_TYPE_S64;
+    case TFLOAT:
+        return PS_TYPE_F32;
+    case TDOUBLE:
+        return PS_TYPE_F64;
+    case TCOMPLEX:
+        return PS_TYPE_C32;
+    case TDBLCOMPLEX:
+        return PS_TYPE_C64;
+    case TLOGICAL:
+        return PS_TYPE_BOOL;
+    default:
+        psError(PS_ERR_IO, true,
+                "Unknown FITS datatype, %d.",
+                datatype);
+        return 0;
+    }
+}
+
+static bool convertPsTypeToFits(psElemType type, int* bitPix, double* bZero, int* dataType)
+{
+
+    int bitpix;
+    int datatype;
+    double bzero = 0.0;
+
+    switch (type) {
+
+    case PS_TYPE_U8:
+        bitpix = BYTE_IMG;
+        datatype = TBYTE;
+        break;
+
+    case PS_TYPE_BOOL:
+    case PS_TYPE_S8:
+        bitpix = BYTE_IMG;
+        bzero = INT8_MIN;
+        datatype = TSBYTE;
+        break;
+
+    case PS_TYPE_U16:
+        bitpix = SHORT_IMG;
+        bzero = -1.0 * INT16_MIN;
+        datatype = TUSHORT;
+        break;
+
+    case PS_TYPE_S16:
+        bitpix = SHORT_IMG;
+        datatype = TSHORT;
+        break;
+
+    case PS_TYPE_U32:
+        bitpix = LONG_IMG;
+        bzero = -1.0 * INT32_MIN;
+        datatype = TUINT;
+        break;
+
+    case PS_TYPE_S32:
+        bitpix = LONG_IMG;
+        datatype = TINT;
+        break;
+
+    case PS_TYPE_F32:
+        bitpix = FLOAT_IMG;
+        datatype = TFLOAT;
+        break;
+
+    case PS_TYPE_F64:
+        bitpix = DOUBLE_IMG;
+        datatype = TDOUBLE;
+        break;
+
+    default: {
+            char* typeStr;
+            PS_TYPE_NAME(typeStr,type);
+            psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                    PS_ERRORTEXT_psFits_TYPE_UNSUPPORTED,
+                    typeStr);
+            return false;
+        }
+    }
+
+    // pass the requested parameters  (NULL parameters are not set, of course).
+    if (bitPix != NULL) {
+        *bitPix = bitpix;
+    }
+
+    if (dataType != NULL) {
+        *dataType = datatype;
+    }
+
+    if (bZero != NULL) {
+        *bZero = bzero;
+    }
+
+    return true;
+}
+
+static bool convertMetadataTypeToBinaryTForm(psMetadataType type, char** fitsType)
+{
+    switch (type) {
+    case PS_META_BOOL:
+        *fitsType = psStringCopy("1L");
+        break;
+    case PS_META_S32:
+        *fitsType = psStringCopy("1J");
+        break;
+    case PS_META_F32:
+        *fitsType = psStringCopy("1E");
+        break;
+    case PS_META_F64:
+        *fitsType = psStringCopy("1D");
+        break;
+        // XXX: Handle other types, e.g., Vectors, etc.
+    default:
+        return false;
+    }
+
+    return true;
+}
+
+static bool isHDUEmpty(const psFits* fits)
+{
+    /* check for keys - no keys means this is really an empty HDU */
+    int keysexist = -1;
+    int morekeys;
+    int status = 0;
+
+    fits_get_hdrspace(fits->p_fd, &keysexist, &morekeys, &status);
+
+    // if no keys exist and not primary HDU, this really is an empty HDU
+    if (keysexist == 0) {
+        return true;
+    }
+
+    return false;
+
+}
+
+static void fitsFree(psFits* fits)
+{
+    int status = 0;
+
+    if (fits != NULL) {
+        (void)fits_close_file(fits->p_fd, &status);
+        psFree((void*)fits->filename);
+    }
+}
+
+psFits* psFitsAlloc(const char* name)
+{
+    int status = 0;
+    fitsfile *fptr = NULL;      /* Pointer to the FITS file */
+
+    if (name == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psFits_FILENAME_NULL);
+        return NULL;
+    }
+
+    /* Open/Create the FITS file */
+    if (access(name, F_OK) == 0) {     // file exists
+        (void)fits_open_file(&fptr, name, READWRITE, &status);
+        if (fptr == NULL) { // if failed, try openning as just read-only
+            status = 0;
+            (void)fits_open_file(&fptr, name, READONLY, &status);
+        }
+        if (fptr == NULL || status != 0) {
+            char fitsErr[MAX_STRING_LENGTH];
+            fits_get_errstatus(status, fitsErr);
+            psError(PS_ERR_BAD_PARAMETER_VALUE, true,
+                    PS_ERRORTEXT_psFits_FILENAME_INVALID,
+                    name, fitsErr);
+            return NULL;
+        }
+    } else {  // file does not exist, so create.
+        (void)fits_create_file(&fptr, name, &status);
+        if (fptr == NULL || status != 0) {
+            char fitsErr[MAX_STRING_LENGTH];
+            fits_get_errstatus(status, fitsErr);
+            psError(PS_ERR_IO, true,
+                    PS_ERRORTEXT_psFits_FILENAME_CREATE_FAILED,
+                    name, fitsErr);
+            return NULL;
+        }
+    }
+
+    psFits* fits = psAlloc(sizeof(psFits));
+    fits->filename = psAlloc(strlen(name)+1);
+    fits->p_fd = fptr;
+    strcpy((char*)fits->filename,name);
+    psMemSetDeallocator(fits,(psFreeFcn)fitsFree);
+
+    return fits;
+}
+
+bool psFitsMoveExtName(const psFits* fits,
+                       const char* extname)
+{
+    int status = 0;
+
+    if (fits == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psFits_NULL);
+        return false;
+    }
+
+    if (extname == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psFits_EXTNAME_NULL);
+        return false;
+    }
+
+
+    if (fits_movnam_hdu(fits->p_fd, ANY_HDU, (char*)extname, 0, &status) != 0) {
+        char fitsErr[MAX_STRING_LENGTH];
+        fits_get_errstatus(status, fitsErr);
+        psError(PS_ERR_LOCATION_INVALID, true,
+                PS_ERRORTEXT_psFits_EXTNAME_INVALID,
+                extname, fits->filename, fitsErr);
+        return false;
+    }
+
+    return true;
+}
+
+bool psFitsMoveExtNum(const psFits* fits,
+                      int extnum,
+                      bool relative)
+{
+    if (fits == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psFits_NULL);
+        return false;
+    }
+
+    int status = 0;
+    int hdutype = 0;
+
+    if (relative) {
+        fits_movrel_hdu(fits->p_fd, extnum, &hdutype, &status);
+        if (status != 0) {
+            char fitsErr[MAX_STRING_LENGTH];
+            fits_get_errstatus(status, fitsErr);
+            psError(PS_ERR_LOCATION_INVALID, true,
+                    PS_ERRORTEXT_psFits_EXTNUM_REL_MOVE_FAILED,
+                    extnum, fits->filename, fitsErr);
+            return false;
+        }
+    } else {
+        fits_movabs_hdu(fits->p_fd, extnum+1, &hdutype, &status);
+        if (status != 0) {
+            char fitsErr[MAX_STRING_LENGTH];
+            fits_get_errstatus(status, fitsErr);
+            psError(PS_ERR_LOCATION_INVALID, true,
+                    PS_ERRORTEXT_psFits_EXTNUM_ABS_MOVE_FAILED,
+                    extnum, fits->filename, fitsErr);
+            return false;
+        }
+    }
+
+    return true;
+}
+
+int psFitsGetExtNum(const psFits* fits)
+{
+    int hdunum;
+
+    if (fits == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psFits_NULL);
+        return PS_FITS_TYPE_NONE;
+    }
+
+
+    return fits_get_hdu_num(fits->p_fd,&hdunum) - 1;
+}
+
+char* psFitsGetExtName(const psFits* fits)
+{
+    if (fits == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psFits_NULL);
+        return NULL;
+    }
+
+    int status = 0;
+    char name[MAX_STRING_LENGTH];
+
+    if (fits_read_key_str(fits->p_fd, "EXTNAME", name, NULL, &status) != 0) {
+        status = 0;
+        if (fits_read_key_str(fits->p_fd, "HDUNAME", name, NULL, &status) != 0) {
+            int num = psFitsGetExtNum(fits);
+            snprintf(name, MAX_STRING_LENGTH, "EXT-%3d",num);
+        }
+    }
+    return psStringCopy(name);
+}
+
+bool psFitsSetExtName(const psFits* fits, const char* name)
+{
+    if (fits == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psFits_NULL);
+        return false;
+    }
+
+    if (name == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psFits_EXTNAME_NULL);
+        return false;
+    }
+
+    int status = 0;
+
+    if (fits_update_key_str(fits->p_fd, "EXTNAME", (char*)name, NULL, &status) != 0) {
+        char fitsErr[MAX_STRING_LENGTH];
+        (void)fits_get_errstatus(status, fitsErr);
+        psError(PS_ERR_IO, true,
+                PS_ERRORTEXT_psFits_WRITE_FAILED,
+                fits->filename, fitsErr);
+        return false;
+    }
+
+    return true;
+}
+
+int psFitsGetSize(const psFits* fits)
+{
+    if (fits == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psFits_NULL);
+        return 0;
+    }
+
+    int num = 0;
+    int status = 0;
+
+    if (fits_get_num_hdus(fits->p_fd, &num, &status) != 0) {
+        char fitsErr[MAX_STRING_LENGTH];
+        fits_get_errstatus(status, fitsErr);
+        psError(PS_ERR_LOCATION_INVALID, true,
+                PS_ERRORTEXT_psFits_GETNUMHDUS_FAILED,
+                fits->filename, fitsErr);
+        return 0;
+    }
+
+    return num;
+}
+
+psFitsType psFitsGetExtType(const psFits* fits)
+{
+    if (fits == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psFits_NULL);
+        return PS_FITS_TYPE_NONE;
+    }
+
+    int status = 0;
+    int hdutype = PS_FITS_TYPE_NONE;
+
+    if (fits_get_hdu_type(fits->p_fd, &hdutype, &status) != 0) {
+        char fitsErr[MAX_STRING_LENGTH];
+        fits_get_errstatus(status, fitsErr);
+        psError(PS_ERR_LOCATION_INVALID, true,
+                PS_ERRORTEXT_psFits_GETHDUTYPE_FAILED,
+                fits->filename, fitsErr);
+        return PS_FITS_TYPE_NONE;
+    }
+
+    if (hdutype == PS_FITS_TYPE_IMAGE &&
+            psFitsGetExtNum(fits) > 0 &&
+            isHDUEmpty(fits)) {
+        return PS_FITS_TYPE_ANY;
+    }
+
+    return hdutype;
+}
+
+psMetadata* psFitsReadHeader(psMetadata* out,
+                             const psFits* fits)
+{
+    if (fits == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psFits_NULL);
+        return NULL;
+    }
+
+    if (out == NULL) {
+        out = psMetadataAlloc();
+        if (out == NULL) {
+            psError(PS_ERR_UNKNOWN, false,
+                    "Failed to allocate a new psMetadata container.");
+            return NULL;
+        }
+    }
+
+    // Get number of key names
+    int numKeys = 0;
+    int keyNum = 0;
+    int status = 0;
+    fits_get_hdrpos(fits->p_fd, &numKeys, &keyNum, &status);
+
+    // Get each key name. Keywords start at one.
+    char keyType;
+    char keyName[MAX_STRING_LENGTH];
+    char keyValue[MAX_STRING_LENGTH];
+    char keyComment[MAX_STRING_LENGTH];
+    psBool tempBool;
+    psBool success;
+    psBool stdKey;
+    for (int i = 1; i <= numKeys; i++) {
+
+        fits_read_keyn(fits->p_fd, i, keyName, keyValue, keyComment, &status);
+
+        stdKey = false;
+
+        int stdKeyIdx = 0;
+        while (standardFitsKeys[stdKeyIdx] != NULL && ! stdKey) {
+            if (strcmp(keyName,standardFitsKeys[stdKeyIdx++]) == 0) {
+                stdKey = true;
+            }
+        }
+
+        if (keyValue[0] != 0) { // blank values are not handled by fits_get_keytype
+            fits_get_keytype(keyValue, &keyType, &status);
+        } else {
+            keyType = 'C';
+        }
+        if (status != 0) {
+            break;
+        }
+
+        if (! stdKey) {
+            switch (keyType) {
+            case 'X': // bit
+            case 'I': // short int.
+            case 'J': // int.
+            case 'B': // byte
+                success = psMetadataAdd(out,
+                                        PS_LIST_TAIL,
+                                        keyName,
+                                        PS_META_S32 | PS_META_DUPLICATE_OK,
+                                        keyComment,
+                                        atoi(keyValue));
+                break;
+            case 'U': // unsigned int. may not fit in a psS32
+            case 'K': // long int. can't all fit in a psS32
+            case 'F':
+                success = psMetadataAdd(out,
+                                        PS_LIST_TAIL,
+                                        keyName,
+                                        PS_META_F64 | PS_META_DUPLICATE_OK,
+                                        keyComment,
+                                        atof(keyValue));
+                break;
+            case 'C':
+                // remove the single-quotes at front/end
+                if (keyValue[0] == '\'' && keyValue[strlen(keyValue)-1] == '\'') {
+                    keyValue[strlen(keyValue)-1] = '\0';
+                    success = psMetadataAdd(out,
+                                            PS_LIST_TAIL,
+                                            keyName,
+                                            PS_META_STR | PS_META_DUPLICATE_OK,
+                                            keyComment,
+                                            keyValue+1);
+                } else {
+                    success = psMetadataAdd(out,
+                                            PS_LIST_TAIL,
+                                            keyName,
+                                            PS_META_STR | PS_META_DUPLICATE_OK,
+                                            keyComment,
+                                            keyValue);
+                }
+                break;
+            case 'L':
+                tempBool = (keyValue[0] == 'T') ? 1 : 0;
+                success = psMetadataAdd(out,
+                                        PS_LIST_TAIL,
+                                        keyName,
+                                        PS_META_BOOL | PS_META_DUPLICATE_OK,
+                                        keyComment,
+                                        tempBool);
+                break;
+            default:
+                psError(PS_ERR_IO, true,
+                        PS_ERRORTEXT_psFits_METATYPE_INVALID,
+                        keyType);
+                return out;
+            }
+
+            if (!success) {
+                psError(PS_ERR_UNKNOWN, false,
+                        PS_ERRORTEXT_psFits_METADATA_ADD_FAILED,
+                        keyName);
+                return out;
+            }
+        }
+
+    }
+
+    if ( status != 0) {
+        char fitsErr[MAX_STRING_LENGTH];
+        (void)fits_get_errstatus(status, fitsErr);
+        psError(PS_ERR_IO, true,
+                PS_ERRORTEXT_psFits_METADATA_ADD_FAILED,
+                fitsErr);
+        return false;
+    }
+
+    return out;
+}
+
+psHash* psFitsReadHeaderSet(psHash* out,
+                            const psFits* fits)
+{
+    if (fits == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psFits_NULL);
+        psFree(out);
+        return NULL;
+    }
+
+    if (out == NULL) {
+        out = psHashAlloc(10);
+        // XXX: what is the appropriate number of buckets? Got 10 from psMetadataAlloc.
+        if (out == NULL) {
+            psError(PS_ERR_UNKNOWN, false,
+                    "Failed to allocate a new psHash container.");
+            return NULL;
+        }
+    }
+
+    int size = psFitsGetSize(fits);
+
+    int origPosition = psFitsGetExtNum(fits);
+
+    for (int lcv=0; lcv < size; lcv++) {
+        psFitsMoveExtNum(fits, lcv, false);
+
+        char* name = NULL;
+        if (lcv == 0) {
+            name = psStringCopy("PHU");
+        } else {
+            name = psFitsGetExtName(fits);
+        }
+
+        psMetadata* header = psFitsReadHeader(NULL, fits);
+        if (name != NULL && header != NULL) {
+            psHashAdd(out, name, header);
+        } else { // XXX: is this a warning or error?
+            psLogMsg(__func__, PS_LOG_WARN,
+                     "Failed to read HDU#%d header data.",
+                     lcv);
+        }
+
+        psFree(name);
+        psFree(header);
+    }
+
+    // reposition to the original position
+    psFitsMoveExtNum(fits, origPosition, false);
+
+    return out;
+}
+
+psImage* psFitsReadImage(psImage* output, // a psImage to recycle.
+                         const psFits* fits,    // the psFits object
+                         psRegion region, // the region in the FITS image to read
+                         int z)           // the z-plane in the FITS image cube to read
+{
+    psS32 status = 0;           /* CFITSIO file vars */
+    psS32 nAxis = 0;
+    psS32 anynull = 0;
+    psS32 bitPix = 0;           /* Pixel type */
+    long nAxes[3];
+    long firstPixel[3];         /* lower-left corner of image subset */
+    long lastPixel[3];          /* upper-right corner of image subset */
+    long increment[3];          /* increment for image subset */
+    char fitsErr[80] = "";      /* CFITSIO error message string */
+    psS32 fitsDatatype = 0;
+    psS32 datatype = 0;
+
+    if (fits == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psFits_NULL);
+        psFree(output);
+        return NULL;
+    }
+
+    // check to see if we even are positioned on an image HDU
+    int hdutype;
+    if ( fits_get_hdu_type(fits->p_fd,&hdutype, &status) != 0) {
+        char fitsErr[MAX_STRING_LENGTH];
+        (void)fits_get_errstatus(status, fitsErr);
+        psError(PS_ERR_IO, true,
+                PS_ERRORTEXT_psFits_GET_HDU_TYPE_FAILED,
+                fitsErr);
+        return NULL;
+    }
+    if (hdutype != IMAGE_HDU) {
+        psError(PS_ERR_IO, true,
+                PS_ERRORTEXT_psFits_NOT_IMAGE_TYPE);
+        return NULL;
+    }
+
+    /* Get the data type 'bitPix' from the FITS image */
+    if (fits_get_img_equivtype(fits->p_fd, &bitPix, &status) != 0) {
+        fits_get_errstatus(status, fitsErr);
+        psError(PS_ERR_IO, true,
+                PS_ERRORTEXT_psFits_DATATYPE_UNKNOWN,
+                fitsErr);
+        psFree(output);
+        return NULL;
+    }
+
+    /* Get the dimensions 'nAxis' from the FITS image */
+    if (fits_get_img_dim(fits->p_fd, &nAxis, &status) != 0) {
+        (void)fits_get_errstatus(status, fitsErr);
+        psError(PS_ERR_IO, true,
+                PS_ERRORTEXT_psFits_IMAGE_DIM_UNKNOWN,
+                fitsErr);
+        psFree(output);
+        return NULL;
+    }
+
+    /* Validate the number of axis */
+    if ((nAxis < 2) || (nAxis > 3)) {
+        psError(PS_ERR_IO, true,
+                PS_ERRORTEXT_psFits_IMAGE_DIMENSION_UNSUPPORTED,
+                nAxis);
+        psFree(output);
+        return NULL;
+    }
+
+    /* Get the Image size from the FITS file */
+    if (fits_get_img_size(fits->p_fd, nAxis, nAxes, &status) != 0) {
+        (void)fits_get_errstatus(status, fitsErr);
+        psError(PS_ERR_IO, true,
+                PS_ERRORTEXT_psFits_IMAGE_SIZE_UNKNOWN,
+                fitsErr);
+        psFree(output);
+        return NULL;
+    }
+
+    firstPixel[0] = region.x0 + 1;
+    firstPixel[1] = region.y0 + 1;
+    firstPixel[2] = z + 1;
+
+    if (region.x1 > 0) {
+        lastPixel[0] = region.x1;
+    } else {
+        lastPixel[0] = nAxes[0] + region.x1; // n.b., region.x1 < 0
+    }
+    if (region.y1 > 0) {
+        lastPixel[1] = region.y1;
+    } else {
+        lastPixel[1] = nAxes[1] + region.y1; // n.b., region.y1 < 0
+    }
+    lastPixel[2] = z + 1;
+
+    increment[0] = 1;
+    increment[1] = 1;
+    increment[2] = 1;
+
+    switch (bitPix) {
+    case BYTE_IMG:
+        datatype = PS_TYPE_U8;
+        fitsDatatype = TBYTE;
+        break;
+    case SBYTE_IMG:
+        datatype = PS_TYPE_S8;
+        fitsDatatype = TSBYTE;
+        break;
+    case USHORT_IMG:
+        datatype = PS_TYPE_U16;
+        fitsDatatype = TUSHORT;
+        break;
+    case SHORT_IMG:
+        datatype = PS_TYPE_S16;
+        fitsDatatype = TSHORT;
+        break;
+    case ULONG_IMG:
+        datatype = PS_TYPE_U32;
+        fitsDatatype = TUINT;
+        break;
+    case LONG_IMG:
+        datatype = PS_TYPE_S32;
+        fitsDatatype = TINT;
+        break;
+    case LONGLONG_IMG:
+        datatype = PS_TYPE_S64;
+        fitsDatatype = TLONGLONG;
+        break;
+    case FLOAT_IMG:
+        datatype = PS_TYPE_F32;
+        fitsDatatype = TFLOAT;
+        break;
+    case DOUBLE_IMG:
+        datatype = PS_TYPE_F64;
+        fitsDatatype = TDOUBLE;
+        break;
+    default:
+        psError(PS_ERR_IO, true,
+                PS_ERRORTEXT_psFits_FITS_TYPE_UNSUPPORTED,
+                bitPix);
+        psFree(output);
+        return NULL;
+    }
+
+    output = psImageRecycle(output,
+                            lastPixel[0]-firstPixel[0]+1,
+                            lastPixel[1]-firstPixel[1]+1,
+                            datatype);
+
+    if (output == NULL) {
+        psError(PS_ERR_UNKNOWN, false,
+                "Failed to allocate a properly sized image.");
+        return false;
+    }
+
+    // n.b., this assumes contiguous image buffer
+    if (fits_read_subset(fits->p_fd, fitsDatatype, firstPixel, lastPixel, increment,
+                         NULL, output->data.V[0], &anynull, &status) != 0) {
+        psFree(output);
+        (void)fits_get_errstatus(status, fitsErr);
+        psError(PS_ERR_IO, true,
+                PS_ERRORTEXT_psFits_READ_FAILED,
+                fitsErr);
+        return NULL;
+    }
+
+    return output;
+
+}
+
+bool psFitsWriteImage(const psFits* fits,
+                      const psMetadata* header,
+                      const psImage* input,
+                      int numZPlanes,
+                      char* extname)
+{
+
+    if (fits == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psFits_NULL);
+        return false;
+    }
+
+    if (input == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psFits_IMAGE_NULL);
+        return false;
+    }
+    int numCols = input->numCols;
+    int numRows = input->numRows;
+
+    int status = 0;
+
+    // determine the FITS-equivalent parameters
+    int bitPix;
+    double bZero;
+    int dataType;
+    if (! convertPsTypeToFits(input->type.type, &bitPix, &bZero, &dataType) ) {
+        return false;
+    }
+
+    int naxis = 3;
+    long naxes[3];
+
+    naxes[0] = numCols;
+    naxes[1] = numRows;
+    naxes[2] = numZPlanes;
+
+    if (numZPlanes < 2) {
+        naxis = 2;
+    }
+
+    fits_create_img(fits->p_fd, bitPix, naxis, naxes, &status);
+
+    if (extname != NULL) {
+        fits_update_key_str(fits->p_fd, "EXTNAME", (char*)extname, NULL, &status);
+    }
+
+    if (bZero != 0) {        // set the bscale/bzero
+        fits_write_key_dbl(fits->p_fd, "BZERO", bZero, 12, "Pixel Value Offset", &status);
+        fits_write_key_dbl(fits->p_fd, "BSCALE", 1.0, 12, "Pixel Value Scale", &status);
+        fits_set_bscale(fits->p_fd, 1.0, bZero, &status);
+    }
+
+    // write the header, if any.
+    if (header != NULL) {
+        psFitsWriteHeader(header, fits);
+    }
+
+    if (input->parent == NULL) { // if no parent, assume that the image data is contiguous
+        fits_write_img(fits->p_fd,
+                       dataType,              // datatype
+                       1,                     // writing to the first z-plane
+                       numCols*numRows,       // number of elements to write, i.e., the whole image
+                       input->data.V[0],      // the data
+                       &status);
+    } else { // image data may not be contiguous; write one row at a time
+        int firstPixel = 1;
+        for (int row = 0; row < numRows; row++) {
+            fits_write_img(fits->p_fd,
+                           dataType,          // datatype
+                           firstPixel,
+                           numCols,           // number of elements to write, i.e., one row's worth
+                           input->data.V[row],// the raw row data
+                           &status);
+            firstPixel += numCols;  // move to next row
+        }
+    }
+
+    if ( status != 0) {
+        char fitsErr[MAX_STRING_LENGTH];
+        (void)fits_get_errstatus(status, fitsErr);
+        psError(PS_ERR_IO, true,
+                PS_ERRORTEXT_psFits_WRITE_FAILED,
+                fits->filename, fitsErr);
+        return false;
+    }
+
+    return true;
+
+}
+
+bool psFitsUpdateImage(const psFits* fits,
+                       const psImage* input,
+                       psRegion region,
+                       int z)
+{
+    int status = 0;
+
+    if (fits == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psFits_NULL);
+        return false;
+    }
+
+    if (input == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psFits_IMAGE_NULL);
+        return false;
+    }
+
+    // check to see if we are positioned on an image HDU
+    int hdutype;
+    if ( fits_get_hdu_type(fits->p_fd,&hdutype, &status) != 0) {
+        char fitsErr[MAX_STRING_LENGTH];
+        (void)fits_get_errstatus(status, fitsErr);
+        psError(PS_ERR_IO, true,
+                PS_ERRORTEXT_psFits_GET_HDU_TYPE_FAILED,
+                fitsErr);
+        return NULL;
+    }
+    if (hdutype != IMAGE_HDU) {
+        psError(PS_ERR_IO, true,
+                PS_ERRORTEXT_psFits_NOT_IMAGE_TYPE);
+        return NULL;
+    }
+
+    int numCols = input->numCols;
+    int numRows = input->numRows;
+
+    // determine the FITS-equivalent parameters
+    int bitPix;
+    double bZero;
+    int dataType;
+    if (! convertPsTypeToFits(input->type.type, &bitPix, &bZero, &dataType) ) {
+        return false;
+    }
+
+    //check to see if the HDU has the same datatype
+    int fileBitpix;
+    int naxis;
+    long nAxes[3];
+    nAxes[2] = 1;
+    fits_get_img_param(fits->p_fd, 3, &fileBitpix, &naxis, nAxes, &status);
+
+    //check to see if the HDU has the same datatype
+    if (bitPix != fileBitpix) {
+        char* fitsTypeStr;
+        char* imageTypeStr;
+        PS_TYPE_NAME(fitsTypeStr,fileBitpix);
+        PS_TYPE_NAME(imageTypeStr,input->type.type);
+        psError(PS_ERR_IO, true,
+                PS_ERRORTEXT_psFits_IMAGE_UPDATE_TYPE_MISMATCH,
+                fitsTypeStr, imageTypeStr);
+        return false;
+    }
+
+    //check if the HDU has the z-plane requested
+    if (z >= nAxes[2]) {
+        psError(PS_ERR_BAD_PARAMETER_SIZE, true,
+                PS_ERRORTEXT_psFits_FITS_Z_SMALL,
+                nAxes[2],z);
+        return false;
+    }
+
+    // determine the region in the FITS file domain
+    long firstPixel[3];
+    long lastPixel[3];
+
+    firstPixel[0] = region.x0 + 1;
+    firstPixel[1] = region.y0 + 1;
+    firstPixel[2] = z + 1;
+
+    if (region.x1 > 0) {
+        lastPixel[0] = region.x1;
+    } else {
+        lastPixel[0] = nAxes[0] + region.x1; // n.b., region.x1 < 0
+    }
+    if (region.y1 > 0) {
+        lastPixel[1] = region.y1;
+    } else {
+        lastPixel[1] = nAxes[1] + region.y1; // n.b., region.y1 < 0
+    }
+    lastPixel[2] = z + 1;
+
+    if (firstPixel[0] < 1 || firstPixel[0] > nAxes[0] ||
+            firstPixel[1] < 1 || firstPixel[1] > nAxes[1] ||
+            lastPixel[0] < 1 || lastPixel[0] > nAxes[0] ||
+            lastPixel[1] < 1 || lastPixel[1] > nAxes[1]) {
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true,
+                "Specified region [%d:%d,%d:%d], is not valid given the %dx%d FITS image.",
+                region.y0,region.y1-1,region.x0,region.x1-1);
+        return false;
+
+    }
+
+    int dx = lastPixel[0] - firstPixel[0];
+    int dy = lastPixel[1] - firstPixel[1];
+    if (dx > numCols ||
+            dy > numRows) {
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true,
+                "The region [%d:%d,%d:%d], is not valid given the input %dx%d image.",
+                firstPixel[1]-1,lastPixel[1]-1,
+                firstPixel[0]-1,lastPixel[0]-1,
+                numCols, numRows);
+        return false;
+    }
+
+    psImage* subset;
+    if (dx != numCols || dy != numRows) {
+        // the input image needs to be subsetted
+        subset = psImageSubset((psImage*)input,0,0,dx+1,dy+1);
+    } else {
+        subset = psMemIncrRefCounter((psImage*)input);
+    }
+
+    fits_write_subset(fits->p_fd, dataType, firstPixel, lastPixel, subset->data.V[0], &status);
+
+    if ( status != 0) {
+        char fitsErr[MAX_STRING_LENGTH];
+        (void)fits_get_errstatus(status, fitsErr);
+        psError(PS_ERR_IO, true,
+                PS_ERRORTEXT_psFits_WRITE_FAILED,
+                fits->filename, fitsErr);
+        return false;
+    }
+
+    return true;
+}
+
+bool psFitsWriteHeader(const psMetadata* header,
+                       const psFits* fits)
+{
+
+    if (fits == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psFits_NULL);
+        return false;
+    }
+
+    if (header == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psFits_METADATA_NULL);
+        return false;
+    }
+
+    int status = 0;
+
+    //transverse the metadata list and add each key.
+
+    psListIterator* iter = psListIteratorAlloc(header->list,PS_LIST_HEAD,true);
+    psMetadataItem* item;
+    while ( (item=psListGetAndIncrement(iter)) != NULL ) {
+        switch (item->type) {
+        case PS_META_BOOL: {
+                int value = item->data.B;
+                fits_update_key(fits->p_fd,
+                                TLOGICAL,
+                                item->name,
+                                &value,
+                                item->comment,
+                                &status);
+                break;
+            }
+        case PS_META_S32:
+            fits_update_key(fits->p_fd,
+                            TINT,
+                            item->name,
+                            &item->data.S32,
+                            item->comment,
+                            &status);
+            break;
+        case PS_META_F32:
+            fits_update_key(fits->p_fd,
+                            TFLOAT,
+                            item->name,
+                            &item->data.F32,
+                            item->comment,
+                            &status);
+            break;
+        case PS_META_F64:
+            fits_update_key(fits->p_fd,
+                            TDOUBLE,
+                            item->name,
+                            &item->data.F64,
+                            item->comment,
+                            &status);
+            break;
+        case PS_META_STR:
+            fits_update_key(fits->p_fd,
+                            TSTRING,
+                            item->name,
+                            item->data.V,
+                            item->comment,
+                            &status);
+            break;
+        default:  // all other META types are ignored
+            break;
+        }
+
+        if ( status != 0) {
+            char fitsErr[MAX_STRING_LENGTH];
+            (void)fits_get_errstatus(status, fitsErr);
+            psError(PS_ERR_IO, true,
+                    PS_ERRORTEXT_psFits_WRITE_FAILED,
+                    fits->filename, fitsErr);
+            return false;
+        }
+    }
+
+    return true;
+}
+
+psMetadata* psFitsReadTableRow(const psFits* fits,
+                               int row)
+{
+    long numRows;
+    int numCols;
+    int status = 0;
+
+    if (fits == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psFits_NULL);
+        return NULL;
+    }
+
+    // check to see if we even are positioned on a table HDU
+    int hdutype;
+    fits_get_hdu_type(fits->p_fd,&hdutype, &status);
+    if ( status != 0) {
+        char fitsErr[MAX_STRING_LENGTH];
+        (void)fits_get_errstatus(status, fitsErr);
+        psError(PS_ERR_IO, true,
+                PS_ERRORTEXT_psFits_GET_HDU_TYPE_FAILED,
+                fitsErr);
+        return NULL;
+    }
+    if (hdutype != ASCII_TBL && hdutype != BINARY_TBL) {
+        psError(PS_ERR_IO, true,
+                PS_ERRORTEXT_psFits_NOT_TABLE_TYPE);
+        return NULL;
+    }
+
+    // get the size of the FITS table
+    fits_get_num_rows(fits->p_fd, &numRows, &status);
+    fits_get_num_cols(fits->p_fd, &numCols, &status);
+    if ( status != 0) {
+        char fitsErr[MAX_STRING_LENGTH];
+        (void)fits_get_errstatus(status, fitsErr);
+        psError(PS_ERR_IO, true,
+                PS_ERRORTEXT_psFits_GET_TABLE_SIZE_FAILED,
+                fitsErr);
+        return NULL;
+    }
+
+    // the row parameter in the proper range?
+    if (row < 0 || row >= numRows) {
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true,
+                PS_ERRORTEXT_psFits_ROW_INVALID,
+                row,numRows);
+        return NULL;
+    }
+
+    psMetadata* data = psMetadataAlloc();
+
+    int typecode;
+    long repeat;
+    long width;
+    char name[60];
+    for (int col = 1; col <= numCols; col++) {
+        // get the column name
+        if (hdutype == BINARY_TBL) {
+            fits_get_bcolparms(fits->p_fd, col, name,
+                               NULL, NULL, NULL, NULL, NULL, NULL, NULL, &status);
+        } else {
+            fits_get_acolparms(fits->p_fd, col, name,
+                               NULL, NULL, NULL, NULL, NULL, NULL, NULL, &status);
+        }
+
+        // get the column type
+        fits_get_coltype(fits->p_fd, col, &typecode, &repeat, &width, &status);
+
+        if (status == 0) {
+
+            #define READ_TABLE_ROW_CASE(FITSTYPE, NATIVETYPE, TYPE) \
+        case FITSTYPE: { \
+                NATIVETYPE value = 0; \
+                int anynul = 0; \
+                fits_read_col(fits->p_fd, FITSTYPE, col,row+1, \
+                              1, 1, NULL, &value, &anynul, &status); \
+                psMetadataAdd(data,PS_LIST_TAIL, name, \
+                              PS_META_##TYPE, \
+                              "", (ps##TYPE)value); \
+                break; \
+            }
+
+            switch (typecode) {
+            case TBYTE:
+            case TSHORT:
+            case TLONGLONG:
+                READ_TABLE_ROW_CASE(TLONG, long, S32)
+                READ_TABLE_ROW_CASE(TFLOAT, float, F32)
+                READ_TABLE_ROW_CASE(TDOUBLE, double, F64)
+                READ_TABLE_ROW_CASE(TLOGICAL, bool, BOOL);
+            case TSTRING: {
+                    char* value;
+                    int anynul = 0;
+                    fits_read_col(fits->p_fd, TSTRING, col,row+1,
+                                  1, 1, NULL, &value, &anynul, &status);
+                    if (anynul == 0) {
+                        psMetadataAdd(data,PS_LIST_TAIL, name,
+                                      PS_META_STR,
+                                      "", value);
+                    }
+                    break;
+                }
+            default:
+                psTrace("psFits.psFitsReadTableRow", 2,
+                        "Column %d or row %d was of a non primitive type, %d",
+                        col, row, typecode);
+            }
+        }
+
+        if ( status != 0) {
+            char fitsErr[MAX_STRING_LENGTH];
+            (void)fits_get_errstatus(status, fitsErr);
+            psError(PS_ERR_IO, true,
+                    PS_ERRORTEXT_psFits_GET_TABLE_ELEMENT,
+                    col,row,fitsErr);
+            psFree(data);
+            return NULL;
+        }
+
+    }
+
+    return data;
+}
+
+psArray* psFitsReadTableColumn(const psFits* fits,
+                               const char* colname)
+{
+    int colnum = 0;
+    int status = 0;
+
+    if (fits == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psFits_NULL);
+        return NULL;
+    }
+
+    // check to see if we even are positioned on a table HDU
+    int hdutype;
+    if ( fits_get_hdu_type(fits->p_fd,&hdutype, &status) != 0) {
+        char fitsErr[MAX_STRING_LENGTH];
+        (void)fits_get_errstatus(status, fitsErr);
+        psError(PS_ERR_IO, true,
+                PS_ERRORTEXT_psFits_GET_HDU_TYPE_FAILED,
+                fitsErr);
+        return NULL;
+    }
+    if (hdutype != ASCII_TBL && hdutype != BINARY_TBL) {
+        psError(PS_ERR_IO, true,
+                PS_ERRORTEXT_psFits_NOT_TABLE_TYPE);
+        return NULL;
+    }
+
+    // find the column by name
+    if ( fits_get_colnum(fits->p_fd, CASESEN, (char*)colname, &colnum, &status) != 0) {
+        char fitsErr[MAX_STRING_LENGTH];
+        (void)fits_get_errstatus(status, fitsErr);
+        psError(PS_ERR_IO, true,
+                PS_ERRORTEXT_psFits_FIND_COLUMN,
+                colname, fitsErr);
+        return NULL;
+    }
+
+    // get the number of rows
+    long numRows = 0;
+    fits_get_num_rows(fits->p_fd, &numRows, &status);
+
+    // get the column length.
+    int width;
+    if ( fits_get_col_display_width(fits->p_fd, colnum, &width, &status) != 0) {
+        char fitsErr[MAX_STRING_LENGTH];
+        (void)fits_get_errstatus(status, fitsErr);
+        psError(PS_ERR_IO, true,
+                PS_ERRORTEXT_psFits_GET_COLTYPE,
+                fitsErr);
+        return NULL;
+    }
+
+    // allocate the buffers
+    psArray* result = psArrayAlloc(numRows);
+    for (int row = 0; row < numRows; row++) {
+        result->data[row] = psAlloc((width+1)*sizeof(char));
+    }
+    result->n = numRows;
+
+    fits_read_col_str(fits->p_fd,
+                      colnum,
+                      1, // firstrow
+                      1, // firestelem
+                      numRows,
+                      "", // nulstr
+                      (char**)result->data,
+                      NULL,
+                      &status);
+
+    if ( status != 0) {
+        char fitsErr[MAX_STRING_LENGTH];
+        (void)fits_get_errstatus(status, fitsErr);
+        psError(PS_ERR_IO, true,
+                PS_ERRORTEXT_psFits_TABLE_READ_COL,
+                fitsErr);
+        return NULL;
+    }
+
+    return result;
+}
+
+psVector* psFitsReadTableColumnNum(const psFits* fits,
+                                   const char* colname)
+{
+    int status = 0;
+    int colnum = 0;
+
+    if (fits == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psFits_NULL);
+        return NULL;
+    }
+
+    // check to see if we even are positioned on a table HDU
+    int hdutype;
+    if ( fits_get_hdu_type(fits->p_fd,&hdutype, &status) != 0) {
+        char fitsErr[MAX_STRING_LENGTH];
+        (void)fits_get_errstatus(status, fitsErr);
+        psError(PS_ERR_IO, true,
+                PS_ERRORTEXT_psFits_GET_HDU_TYPE_FAILED,
+                fitsErr);
+        return NULL;
+    }
+    if (hdutype != ASCII_TBL && hdutype != BINARY_TBL) {
+        psError(PS_ERR_IO, true,
+                PS_ERRORTEXT_psFits_NOT_TABLE_TYPE);
+        return NULL;
+    }
+
+    // find the column by name
+    if ( fits_get_colnum(fits->p_fd, CASESEN, (char*)colname, &colnum, &status) != 0) {
+        char fitsErr[MAX_STRING_LENGTH];
+        (void)fits_get_errstatus(status, fitsErr);
+        psError(PS_ERR_IO, true,
+                PS_ERRORTEXT_psFits_FIND_COLUMN,
+                colname, fitsErr);
+        return NULL;
+    }
+
+    // get the number of rows
+    long numRows = 0;
+    fits_get_num_rows(fits->p_fd,
+                      &numRows,
+                      &status);
+
+    // get the column datatype.
+    int typecode;
+    long repeat;
+    long width;
+    if ( fits_get_eqcoltype(fits->p_fd, colnum, &typecode, &repeat, &width, &status) != 0) {
+        char fitsErr[MAX_STRING_LENGTH];
+        (void)fits_get_errstatus(status, fitsErr);
+        psError(PS_ERR_IO, true,
+                PS_ERRORTEXT_psFits_GET_COLTYPE,
+                fitsErr);
+        return NULL;
+    }
+
+    psVector* result = psVectorAlloc(numRows, convertFitsToPsType(typecode));
+
+    fits_read_col(fits->p_fd,
+                  typecode,
+                  colnum,
+                  1 /* firstrow */,
+                  1 /* firstelem */,
+                  numRows,
+                  NULL,
+                  (psPtr)(result->data.U8),
+                  NULL,
+                  &status);
+
+    if ( status != 0) {
+        char fitsErr[MAX_STRING_LENGTH];
+        (void)fits_get_errstatus(status, fitsErr);
+        psError(PS_ERR_IO, true,
+                PS_ERRORTEXT_psFits_TABLE_READ_COL,
+                fitsErr);
+        return NULL;
+    }
+
+    return result;
+}
+
+
+psArray* psFitsReadTable(const psFits* fits)
+{
+    int status = 0;
+
+    if (fits == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psFits_NULL);
+        return NULL;
+    }
+
+    // check to see if we even are positioned on a table HDU
+    int hdutype;
+    if ( fits_get_hdu_type(fits->p_fd,&hdutype, &status) != 0) {
+        char fitsErr[MAX_STRING_LENGTH];
+        (void)fits_get_errstatus(status, fitsErr);
+        psError(PS_ERR_IO, true,
+                PS_ERRORTEXT_psFits_GET_HDU_TYPE_FAILED,
+                fitsErr);
+        return NULL;
+    }
+    if (hdutype != ASCII_TBL && hdutype != BINARY_TBL) {
+        psError(PS_ERR_IO, true,
+                PS_ERRORTEXT_psFits_NOT_TABLE_TYPE);
+        return NULL;
+    }
+
+    // get the size of the FITS table
+    long numRows = 0;
+    fits_get_num_rows(fits->p_fd, &numRows, &status);
+    if ( status != 0) {
+        char fitsErr[MAX_STRING_LENGTH];
+        (void)fits_get_errstatus(status, fitsErr);
+        psError(PS_ERR_IO, true,
+                PS_ERRORTEXT_psFits_GET_TABLE_SIZE_FAILED,
+                fitsErr);
+        return NULL;
+    }
+
+    psArray* table = psArrayAlloc(numRows);
+
+    for (int row = 0; row < numRows; row++) {
+        table->data[row] = psFitsReadTableRow(fits,row);
+    }
+
+    return table;
+}
+
+bool psFitsWriteTable(const psFits* fits,
+                      psMetadata* header,
+                      psArray* table,
+                      char* extname)
+{
+    int status = 0;
+    psMetadataItem* item;
+
+    if (fits == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psFits_NULL);
+        return false;
+    }
+
+    if (table == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psFits_IMAGE_NULL);
+        return false;
+    }
+
+    int rows = table->n;
+    if (rows < 1) {
+        // no table data, what can I do?
+        psError(PS_ERR_BAD_PARAMETER_SIZE, true,
+                PS_ERRORTEXT_psFits_TABLE_EMPTY);
+        return false;
+    }
+
+    // find all the columns needed
+    psArray* columns = psArrayAlloc(((psMetadata*)table->data[0])->list->size);
+    columns->n=0;
+
+    // find the unique items in the array of metadata 'rows'
+    for (int row=0; row < rows; row++) {
+        psMetadata* rowMeta = table->data[row];
+        if (rowMeta != NULL) {
+            psListIterator* iter = psListIteratorAlloc(rowMeta->list,
+                                   PS_LIST_HEAD,true);
+            while ( (item=psListGetAndIncrement(iter)) != NULL) {
+                if (PS_META_IS_PRIMITIVE(item->type)) {
+                    bool found = false;
+                    for (int n=0; n < columns->n && ! found; n++) {
+                        if (strcmp(item->name,
+                                   ((psMetadataItem*)(columns->data[n]))->name) == 0) {
+                            found = true;
+                        }
+                    }
+                    if (! found) {
+                        psArrayAdd(columns, columns->nalloc, item);
+                    }
+                }
+            }
+            psFree(iter);
+        }
+    }
+
+    if (columns->n == 0) { // no table columns found
+        // XXX: Error?
+        return false;
+    }
+
+    //create list of column names and types.
+    psArray* columnNames = psArrayAlloc(columns->n);
+    psArray* columnTypes = psArrayAlloc(columns->n);
+    for (int n=0; n < columns->n; n++) {
+        char* fitsType;
+        columnNames->data[n] = psMemIncrRefCounter(((psMetadataItem*)columns->data[n])->name);
+        if ( ! convertMetadataTypeToBinaryTForm(((psMetadataItem*)columns->data[n])->type,
+                                                &fitsType)) {
+            // XXX: error message
+            return false;
+        }
+        columnTypes->data[n] = fitsType;
+    }
+
+    fits_create_tbl(fits->p_fd,
+                    BINARY_TBL,
+                    table->n, // number of rows in table
+                    columns->n, // number of columns in table
+                    (char**)columnNames->data, // names of the columns
+                    (char**)columnTypes->data, // format of the columns
+                    NULL, // physical unit of columns
+                    extname, // extension name
+                    &status);
+
+    psFree(columnNames);
+    psFree(columnTypes);
+
+    // fill in the table elements with data
+    for (int n = 0; n < columns->n; n++) {
+        int row;
+        item = columns->data[n];
+        if (PS_META_IS_PRIMITIVE(item->type)) {
+            psVector* col = NULL;
+            switch (item->type) {
+            case PS_META_S32:
+                col = psVectorAlloc(table->n, PS_TYPE_S32);
+                for (row = 0; row < table->n; row++) {
+                    col->data.S32[row] = psMetadataLookupS32(NULL,
+                                         table->data[row],
+                                         item->name);
+                }
+                fits_write_col_int(fits->p_fd,
+                                   n+1, // column number
+                                   1, // firstrow
+                                   1, // firstelem
+                                   table->n, // nelements
+                                   col->data.S32,
+                                   &status);
+                break;
+            case PS_META_F32:
+                col = psVectorAlloc(table->n, PS_TYPE_F32);
+                for (row = 0; row < table->n; row++) {
+                    col->data.F32[row] = psMetadataLookupF32(NULL,
+                                         table->data[row],
+                                         item->name);
+                }
+                fits_write_col_flt(fits->p_fd,
+                                   n+1, // column number
+                                   1, // firstrow
+                                   1, // firstelem
+                                   table->n, // nelements
+                                   col->data.F32,
+                                   &status);
+                break;
+            case PS_META_F64:
+                col = psVectorAlloc(table->n, PS_TYPE_F64);
+                for (row = 0; row < table->n; row++) {
+                    col->data.F64[row] = psMetadataLookupF64(NULL,
+                                         table->data[row],
+                                         item->name);
+                }
+                fits_write_col_dbl(fits->p_fd,
+                                   n+1, // column number
+                                   1, // firstrow
+                                   1, // firstelem
+                                   table->n, // nelements
+                                   col->data.F64,
+                                   &status);
+                break;
+            case PS_META_BOOL:
+                col = psVectorAlloc(table->n, PS_TYPE_BOOL);
+                for (row = 0; row < table->n; row++) {
+                    col->data.S8[row] = psMetadataLookupBool(NULL,
+                                        table->data[row],
+                                        item->name);
+                }
+                fits_write_col_log(fits->p_fd,
+                                   n+1, // column number
+                                   1, // firstrow
+                                   1, // firstelem
+                                   table->n, // nelements
+                                   col->data.S8,
+                                   &status);
+                break;
+            default:
+                // XXX: error message?
+                break;
+            }
+            psFree(col);
+        } else if (item->type == PS_META_STR) {
+            psArray* col = psArrayAlloc(table->n);
+            for (row = 0; row < table->n; row++) {
+                col->data[row] = item->data.V;
+            }
+            fits_write_col_str(fits->p_fd,
+                               n, // column number
+                               1, // firstrow
+                               1, // firstelem
+                               table->n, // nelements
+                               (char**)col->data,
+                               &status);
+            psFree(col);
+        }
+    }
+
+    psFree(columns);
+
+    return true;
+}
+
+bool psFitsUpdateTable(const psFits* fits,
+                       psMetadata* data,
+                       int row)
+{
+    int status = 0;
+
+    if (fits == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psFits_NULL);
+        return false;
+    }
+
+    if (data == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psFits_IMAGE_NULL);
+        return false;
+    }
+
+    // check to see if we even are positioned on a table HDU
+    int hdutype;
+    if ( fits_get_hdu_type(fits->p_fd,&hdutype, &status) != 0) {
+        char fitsErr[MAX_STRING_LENGTH];
+        (void)fits_get_errstatus(status, fitsErr);
+        psError(PS_ERR_IO, true,
+                PS_ERRORTEXT_psFits_GET_HDU_TYPE_FAILED,
+                fitsErr);
+        return false;
+    }
+    if (hdutype != ASCII_TBL && hdutype != BINARY_TBL) {
+        psError(PS_ERR_IO, true,
+                PS_ERRORTEXT_psFits_NOT_TABLE_TYPE);
+        return false;
+    }
+
+    psMetadataIterator* iter = psMetadataIteratorAlloc(data,PS_LIST_HEAD,NULL);
+
+    psMetadataItem* item;
+
+    while ( (item=psMetadataGetAndIncrement(iter)) != NULL) {
+        if (PS_META_IS_PRIMITIVE(item->type)) {
+            // operating on primitive data type, i.e., not a complex object
+            int colnum = 0;
+
+            if ( fits_get_colnum(fits->p_fd, CASESEN, item->name, &colnum, &status) == 0) {
+                // cooresponding column found in table
+                int dataType = 0;
+                convertPsTypeToFits(item->type, NULL, NULL, &dataType);
+
+                if (fits_write_col(fits->p_fd, dataType, colnum, row+1, 1, 1, &item->data,&status) != 0) {
+                    char fitsErr[MAX_STRING_LENGTH];
+                    (void)fits_get_errstatus(status, fitsErr);
+                    psError(PS_ERR_IO, true,
+                            PS_ERRORTEXT_psFits_WRITE_FAILED,
+                            fits->filename, fitsErr);
+                    psFree(iter);
+                    return false;
+                }
+            } else {
+                // the column was not found.
+                psWarning("No column with the name '%s' exists in the table.",
+                          item->name);
+            }
+        }
+    }
+
+    psFree(iter);
+
+    return true;
+}
Index: /tags/ipp-1-X/bug123/psLib/src/fits/psFits.h
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/fits/psFits.h	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/fits/psFits.h	(revision 22331)
@@ -0,0 +1,268 @@
+/** @file  psFits.h
+ *
+ *  @brief Contains Fits I/O routines
+ *
+ *  @ingroup FileIO
+ *
+ *  @author Robert DeSonia, MHPCC
+ *
+ *  @version $Revision: 1.10 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-03-24 23:52:25 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+
+#ifndef PS_FITS_H
+#define PS_FITS_H
+
+#include<fitsio.h>
+
+#include "psType.h"
+#include "psArray.h"
+#include "psVector.h"
+#include "psMetadata.h"
+#include "psHash.h"
+#include "psImage.h"
+
+/// @addtogroup FileIO
+/// @{
+
+typedef enum {
+    PS_FITS_TYPE_NONE = -1,
+    PS_FITS_TYPE_IMAGE = IMAGE_HDU,
+    PS_FITS_TYPE_BINARY_TABLE = BINARY_TBL,
+    PS_FITS_TYPE_ASCII_TABLE = ASCII_TBL,
+    PS_FITS_TYPE_ANY = ANY_HDU
+} psFitsType;
+
+/** FITS file object.
+ *
+ *  This object should be considered opaque to the user; no item in this
+ *  struct should be accessed directly.
+ *
+ */
+typedef struct
+{
+    fitsfile* p_fd;                    ///< the CFITSIO fits files handle.
+    const char* filename;              ///< the filename of the fits file
+}
+psFits;
+
+/** Opens a FITS file and allocates the associated psFits object.
+ *
+ *  @return psFits*    new psFits object for the FITS files specified or
+ *                     NULL if the open of the FITS file failed
+ */
+psFits* psFitsAlloc(
+    const char* name                   ///< the FITS file name
+);
+
+/** Moves the FITS HDU to the specified extension name.
+ *
+ *  @return psFitsType    The HDU type, or PS_FITS_TYPE_NONE if move failed.
+ */
+bool psFitsMoveExtName(
+    const psFits* fits,                ///< the psFits object to move
+    const char* extname                ///< the extension name
+);
+
+/** Moves the FITS HDU to the specified extension number
+ *
+ *  @return psFitsType    The HDU type, or PS_FITS_TYPE_NONE if move failed.
+ */
+bool psFitsMoveExtNum(
+    const psFits* fits,                ///< the psFits object to move
+    int extnum,                        ///< the extension number to move to (zero is primary HDU)
+    bool relative                      ///< if true, extnum is a relative number to the current position
+);
+
+/** Get the current extension number, where 0 is the primary HDU.
+ *
+ *  @return int        Current HDU number of the psFits file or < 0 if an error
+ *                     occurred.
+ */
+int psFitsGetExtNum(
+    const psFits* fits                 ///< the psFits object
+);
+
+/** Get the current extension name.
+ *
+ *  @return int        Current HDU name of the psFits file or NULL if an
+ *                     error occurred.
+ */
+char* psFitsGetExtName(
+    const psFits* fits                 ///< the psFits object
+);
+
+/** Set the current extension's name
+ *
+ *  @return bool       TRUE if the extension was successfully set, otherwise FALSE.
+ */
+bool psFitsSetExtName(
+    const psFits* fits,                ///< the psFits object
+    const char* name                   ///< the extension name
+);
+
+/** Get the total number of HDUs in the FITS file.
+ *
+ *  @return int        The total number of HDUs in the FITS file or < 0 if an
+ *                     error occurred.
+ */
+int psFitsGetSize(
+    const psFits* fits                 ///< the psFits object
+);
+
+/** Get the extension type of the current HDU.
+ *
+ *  @return psFitsType The type of the current HDU.  If PS_FITS_TYPE_UNKNOWN,
+ *                     the type could not be determined.
+ */
+psFitsType psFitsGetExtType(
+    const psFits* fits                 ///< the psFits object
+);
+
+/** Reads the header of the current HDU.
+ *
+ *  @return psMetadata*   the header data
+ */
+psMetadata* psFitsReadHeader(
+    psMetadata* out,
+    ///< The psMetadata to add the header data.  If null, a new psMetadata is created.
+
+    const psFits* fits                 ///< the psFits object
+);
+
+/** Reads the header of all HDUs.  The current HDU is not changed.
+ *
+ *  @return psHash*      the header data
+ */
+psHash* psFitsReadHeaderSet(
+    psHash* out,
+    ///< The psHash to add the header data via psMetadata items.  If null, a
+    ///< new psHash is created.  The keys of the psHash are the extension names
+    ///< of the cooresponding HDUs.
+
+    const psFits* fits                       ///< the psFits object
+);
+
+/** Writes the values of the metadata to the current HDU header.
+ *
+ *  @return bool        if TRUE, the write was successful, otherwise FALSE.
+ */
+bool psFitsWriteHeader(
+    const psMetadata* header,          ///< the psMetadata data in which to write
+    const psFits* fits                 ///< the psFits object
+);
+
+/** Reads an image, given the desired region and z-plane.
+ *
+ *  @return psImage*     the read image or NULL if there was an error.
+ */
+psImage* psFitsReadImage(
+    psImage* out,                      ///< a psImage to recycle.
+    const psFits* fits,                ///< the psFits object
+    psRegion region,                   ///< the region in the FITS image to read
+    int z                              ///< the z-plane in the FITS image cube to read
+);
+
+/** Writes an image, given the desired region and z-plane.
+ *
+ *  @return bool        TRUE is the write was successful, otherwise FALSE.
+ */
+bool psFitsWriteImage(
+    const psFits* fits,                ///< the psFits object
+    const psMetadata* header,          ///< header items for the new HDU.  Can be NULL.
+    const psImage* input,              ///< the image to output
+    int depth,                         ///< the number of z-planes of the FITS image data cube
+    char* extname                      ///< extension name
+);
+
+/** Updates the FITS file image, given the desired region and z-plane.
+ *
+ *  @return bool        TRUE is the write was successful, otherwise FALSE.
+ */
+bool psFitsUpdateImage(
+    const psFits* fits,                ///< the psFits object
+    const psImage* input,              ///< the image to output
+    psRegion region,                   ///< the region in the FITS image to write
+    int z                              ///< the z-planes of the FITS image data cube to write
+);
+
+/** Reads a table row.  The current HDU type must be either
+ *  PS_FITS_TYPE_BINARY_TABLE or PS_FITS_TYPE_ASCII_TABLE.
+ *
+ *  @return psMetadata*    The table row's data.  The keys are the column names.
+ */
+psMetadata* psFitsReadTableRow(
+    const psFits* fits,                ///< the psFits object
+    int row                            ///< row number to read
+);
+
+/** Reads a table column.  The current HDU type must be either
+ *  PS_FITS_TYPE_BINARY_TABLE or PS_FITS_TYPE_ASCII_TABLE.
+ *
+ *  @return psArray*    Array of data items for the specified column or NULL
+ *                      if an error occurred.
+ */
+psArray* psFitsReadTableColumn(
+    const psFits* fits,                ///< the psFits object
+    const char* colname                ///< the column name
+);
+
+/** Reads a table column of numbers.  The current HDU type must be either
+ *  PS_FITS_TYPE_BINARY_TABLE or PS_FITS_TYPE_ASCII_TABLE.
+ *
+ *  @return psVector*    Vector of data for the specified column or NULL
+ *                       if an error occurred.
+ */
+psVector* psFitsReadTableColumnNum(
+    const psFits* fits,                ///< the psFits object
+    const char* colname                ///< the column name
+);
+
+
+/** Reads a whole FITS table.  The current HDU type must be either
+ *  PS_FITS_TYPE_BINARY_TABLE or PS_FITS_TYPE_ASCII_TABLE.
+ *
+ *  @return psArray*     Array of psMetadata items, which contains the output
+ *                       data items of each row.
+ *
+ *  @see psFitsReadTableRow
+ */
+psArray* psFitsReadTable(
+    const psFits* fits                 ///< the psFits object
+);
+
+/** Writes a whole FITS table.  The current HDU type must be either
+ *  PS_FITS_TYPE_BINARY_TABLE or PS_FITS_TYPE_ASCII_TABLE.
+ *
+ *  @return bool        TRUE if the write was successful, otherwise FALSE
+ *
+ *  @see psFitsReadTableRow
+ */
+bool psFitsWriteTable(
+    const psFits* fits,                ///< the psFits object
+    psMetadata* header,                ///< header items for the new HDU.  Can be NULL.
+    psArray* table,
+    ///< Array of psMetadata items, which contains the output data items of each row.
+    char* extname                      ///< extension name
+);
+
+
+/** Updates a FITS table.  The current HDU type must be either
+ *  PS_FITS_TYPE_BINARY_TABLE or PS_FITS_TYPE_ASCII_TABLE.
+ *
+ *  @return bool        TRUE if the write was successful, otherwise FALSE
+ *
+ *  @see psFitsWriteTable
+ */
+bool psFitsUpdateTable(
+    const psFits* fits,                ///< the psFits object
+    psMetadata* data,
+    ///< Array of psMetadata items, which contains the output data items of each row.
+    int row                            ///< the row number to update.
+);
+
+/// @}
+
+#endif
Index: /tags/ipp-1-X/bug123/psLib/src/image/.cvsignore
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/image/.cvsignore	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/image/.cvsignore	(revision 22331)
@@ -0,0 +1,7 @@
+Makefile.in
+.deps
+.libs
+Makefile
+*.lo
+*.la
+
Index: /tags/ipp-1-X/bug123/psLib/src/image/Makefile.am
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/image/Makefile.am	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/image/Makefile.am	(revision 22331)
@@ -0,0 +1,37 @@
+#Makefile for image functions of psLib
+#
+INCLUDES = \
+	-I$(top_srcdir)/src/astronomy \
+	-I$(top_srcdir)/src/collections \
+	-I$(top_srcdir)/src/dataManip \
+	-I$(top_srcdir)/src/dataIO \
+	-I$(top_srcdir)/src/sysUtils \
+	$(all_includes)
+
+noinst_LTLIBRARIES = libpslibimage.la
+
+libpslibimage_la_SOURCES = \
+	psImage.c \
+	psImageExtraction.c \
+	psImageIO.c \
+	psImageManip.c \
+	psImageStats.c \
+	psImageFFT.c \
+	psImageConvolve.c \
+	psPixels.c
+
+BUILT_SOURCES = psImageErrors.h
+EXTRA_DIST = psImageErrors.dat psImageErrors.h image.i
+
+psImageErrors.h: psImageErrors.dat
+	perl $(top_srcdir)/src/parseErrorCodes.pl --data=$? $@
+
+pslibincludedir = $(includedir)
+pslibinclude_HEADERS = \
+	psImage.h \
+	psImageExtraction.h \
+	psImageIO.h \
+	psImageManip.h \
+	psImageStats.h \
+	psImageFFT.h \
+	psImageConvolve.h
Index: /tags/ipp-1-X/bug123/psLib/src/image/image.i
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/image/image.i	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/image/image.i	(revision 22331)
@@ -0,0 +1,10 @@
+/* image headers */
+%include "psImageConvolve.h"
+%include "psImageErrors.h"
+%include "psImageExtraction.h"
+%include "psImageFFT.h"
+%include "psImage.h"
+%include "psImageIO.h"
+%include "psImageManip.h"
+%include "psImageStats.h"
+
Index: /tags/ipp-1-X/bug123/psLib/src/image/psImage.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/image/psImage.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/image/psImage.c	(revision 22331)
@@ -0,0 +1,752 @@
+/** @file  psImage.c
+ *
+ *  @brief Contains basic image definitions and operations.
+ *
+ *  This file defines the basic type for an image struct and functions useful
+ *  in manupulating images.
+ *
+ *  @author Robert DeSonia, MHPCC
+ *  @author Ross Harman, MHPCC
+ *
+ *  @version $Revision: 1.64 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-04-15 00:12:08 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ *
+ *  That is the routine used to generate matrices.
+ */
+
+#include <string.h>
+#include <math.h>
+
+#include "psMemory.h"
+#include "psError.h"
+#include "psImage.h"
+#include "psString.h"
+
+#include "psImageErrors.h"
+
+#define SQUARE(x) ((x)*(x))
+#define MIN(x,y) (((x) > (y)) ? (y) : (x))
+#define MAX(x,y) (((x) > (y)) ? (x) : (y))
+
+static void imageFree(psImage* image)
+{
+    if (image == NULL) {
+        return;
+    }
+
+    if (image->parent != NULL) {
+        psArrayRemove(image->parent->children,image);
+        image->parent = NULL;
+    }
+
+    psImageFreeChildren(image);
+
+    psFree(image->rawDataBuffer);
+    psFree(image->data.V);
+}
+
+psImage* psImageAlloc(psU32 numCols,
+                      psU32 numRows,
+                      const psElemType type)
+{
+    psS32 area = 0;
+    psS32 elementSize = PSELEMTYPE_SIZEOF(type);  // element size in bytes
+    psS32 rowSize = numCols * elementSize;        // row size in bytes.
+
+    area = numCols * numRows;
+
+    if (area < 1) {
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true,
+                PS_ERRORTEXT_psImage_AREA_NEGATIVE,
+                numRows, numCols);
+        return NULL;
+    }
+
+    psImage* image = (psImage* ) psAlloc(sizeof(psImage));
+
+    psMemSetDeallocator(image, (psFreeFcn) imageFree);
+
+    image->data.V = psAlloc(sizeof(psPtr ) * numRows);
+
+    image->rawDataBuffer = psAlloc(area * elementSize);
+
+    // set the row pointers.
+    image->data.V[0] = image->rawDataBuffer;
+    for (psS32 i = 1; i < numRows; i++) {
+        image->data.V[i] = (psPtr )((int8_t *) image->data.V[i - 1] + rowSize);
+    }
+
+    *(psS32 *)&image->col0 = 0;
+    *(psS32 *)&image->row0 = 0;
+    *(psU32 *)&image->numCols = numCols;
+    *(psU32 *)&image->numRows = numRows;
+    *(psDimen* ) & image->type.dimen = PS_DIMEN_IMAGE;
+    *(psElemType* ) & image->type.type = type;
+    image->parent = NULL;
+    image->children = NULL;
+
+    return image;
+}
+
+psRegion* psRegionAlloc(psF32 x0,
+                        psF32 x1,
+                        psF32 y0,
+                        psF32 y1)
+{
+    psRegion* out = psAlloc(sizeof(psRegion));
+
+    out->x0 = x0;
+    out->y0 = y0;
+    out->x1 = x1;
+    out->y1 = y1;
+
+    return out;
+}
+
+psRegion* psRegionFromString(char* region)
+{
+    psS32 col0;
+    psS32 col1;
+    psS32 row0;
+    psS32 row1;
+
+    // section should be of the form '[col0:col1,row0:row1]'
+    if (region == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psImage_SUBSECTION_NULL);
+        return NULL;
+    }
+
+    if (sscanf(region,"[%d:%d,%d:%d]",&col0,&col1,&row0,&row1) < 4) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psImage_SUBSECTION_INVALID,
+                region);
+        return NULL;
+    }
+
+    if (col0 > col1 || row0 > row1) {
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true,
+                PS_ERRORTEXT_psImage_SUBSET_RANGE_MALFORMED,
+                col0,col1,row0,row1);
+        return NULL;
+    }
+
+    return psRegionAlloc(col0,col1,row0,row1);
+}
+
+char* psRegionToString(psRegion* region)
+{
+    char tmpText[256]; // big enough to store any region as text
+
+    if (region == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psImage_REGION_NULL);
+        return NULL;
+    }
+
+    snprintf(tmpText,256,"[%g:%g,%g:%g]",
+             region->x0, region->x1,
+             region->y0, region->y1);
+
+    return psStringCopy(tmpText);
+}
+
+psImage* psImageRecycle(psImage* old,
+                        psU32 numCols,
+                        psU32 numRows,
+                        const psElemType type)
+{
+    psS32 elementSize = PSELEMTYPE_SIZEOF(type);  // element size in bytes
+    psS32 rowSize = numCols * elementSize;        // row size in bytes.
+
+    if (old == NULL) {
+        old = psImageAlloc(numCols, numRows, type);
+        return old;
+    }
+
+    if (old->type.dimen != PS_DIMEN_IMAGE) {
+        psFree(old);
+        psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                PS_ERRORTEXT_psImage_NOT_AN_IMAGE);
+        return NULL;
+    }
+
+    /* image already the right size/type? */
+    if (numCols == old->numCols && numRows == old->numRows &&
+            type == old->type.type) {
+        return old;
+    }
+    // Resize the image buffer
+    old->rawDataBuffer = psRealloc(old->data.V[0],
+                                   numCols * numRows * elementSize);
+    old->data.V = (psPtr *)psRealloc(old->data.V, numRows * sizeof(psPtr ));
+
+    // recreate the row pointers
+    old->data.V[0] = old->rawDataBuffer;
+    for (psS32 i = 1; i < numRows; i++) {
+        old->data.V[i] = (psPtr )((int8_t *) old->data.V[i - 1] + rowSize);
+    }
+
+    *(psU32 *)&old->numCols = numCols;
+    *(psU32 *)&old->numRows = numRows;
+    *(psElemType* ) & old->type.type = type;
+
+    return old;
+}
+
+psImage* psImageCopy(psImage* output,
+                     const psImage* input,
+                     psElemType type)
+{
+    psElemType inDatatype;
+    psS32 elementSize;
+    psS32 elements;
+    psS32 numRows;
+    psS32 numCols;
+
+    if (input == NULL || input->data.V == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psImage_IMAGE_NULL);
+        psFree(output);
+        return NULL;
+    }
+
+    if (input == output) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psImage_INPLACE_NOTSUPPORTED);
+        psFree(output);
+        return NULL;
+    }
+
+    if (input->type.dimen != PS_DIMEN_IMAGE) {
+        psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                PS_ERRORTEXT_psImage_NOT_AN_IMAGE);
+        psFree(output);
+        return NULL;
+    }
+
+    inDatatype = input->type.type;
+    numRows = input->numRows;
+    numCols = input->numCols;
+    elements = numRows * numCols;
+    elementSize = PSELEMTYPE_SIZEOF(inDatatype);
+
+    output = psImageRecycle(output, numCols, numRows, type);
+
+    // cover the trival case of copy of the same
+    // datatype.
+    if (type == inDatatype) {
+        for (psS32 row=0;row<numRows;row++) {
+            memcpy(output->data.V[row], input->data.V[row], elementSize * numCols);
+        }
+        return output;
+    }
+
+    #define PSIMAGE_ELEMENT_COPY(IN,INTYPE,OUT,OUTTYPE,ELEMENTS) { \
+        ps##INTYPE *in; \
+        ps##OUTTYPE *out; \
+        for(psS32 row=0;row<numRows;row++) { \
+            in = IN->data.INTYPE[row]; \
+            out = OUT->data.OUTTYPE[row]; \
+            for (psS32 col=0;col<numCols;col++) { \
+                *(out++) = *(in++); \
+            } \
+        } \
+    }
+
+    #define PSIMAGE_COPY_CASE(OUT,OUTTYPE) { \
+        switch (inDatatype) { \
+        case PS_TYPE_S8: \
+            PSIMAGE_ELEMENT_COPY(input,S8,OUT,OUTTYPE,elements); \
+            break; \
+        case PS_TYPE_S16: \
+            PSIMAGE_ELEMENT_COPY(input,S16,OUT,OUTTYPE,elements); \
+            break; \
+        case PS_TYPE_S32: \
+            PSIMAGE_ELEMENT_COPY(input,S32,OUT,OUTTYPE,elements); \
+            break; \
+        case PS_TYPE_S64: \
+            PSIMAGE_ELEMENT_COPY(input,S64,OUT,OUTTYPE,elements); \
+            break; \
+        case PS_TYPE_U8: \
+            PSIMAGE_ELEMENT_COPY(input,U8,OUT,OUTTYPE,elements); \
+            break; \
+        case PS_TYPE_U16: \
+            PSIMAGE_ELEMENT_COPY(input,U16,OUT,OUTTYPE,elements); \
+            break; \
+        case PS_TYPE_U32: \
+            PSIMAGE_ELEMENT_COPY(input,U32,OUT,OUTTYPE,elements); \
+            break; \
+        case PS_TYPE_U64: \
+            PSIMAGE_ELEMENT_COPY(input,U64,OUT,OUTTYPE,elements); \
+            break; \
+        case PS_TYPE_F32: \
+            PSIMAGE_ELEMENT_COPY(input,F32,OUT,OUTTYPE,elements); \
+            break; \
+        case PS_TYPE_F64: \
+            PSIMAGE_ELEMENT_COPY(input,F64,OUT,OUTTYPE,elements); \
+            break; \
+        case PS_TYPE_C32: \
+            PSIMAGE_ELEMENT_COPY(input,C32,OUT,OUTTYPE,elements); \
+            break; \
+        case PS_TYPE_C64: \
+            PSIMAGE_ELEMENT_COPY(input,C64,OUT,OUTTYPE,elements); \
+            break; \
+        default: \
+            break; \
+        } \
+    }
+
+    switch (type) {
+    case PS_TYPE_S8:
+        PSIMAGE_COPY_CASE(output, S8);
+        break;
+    case PS_TYPE_S16:
+        PSIMAGE_COPY_CASE(output, S16);
+        break;
+    case PS_TYPE_S32:
+        PSIMAGE_COPY_CASE(output, S32);
+        break;
+    case PS_TYPE_S64:
+        PSIMAGE_COPY_CASE(output, S64);
+        break;
+    case PS_TYPE_U8:
+        PSIMAGE_COPY_CASE(output, U8);
+        break;
+    case PS_TYPE_U16:
+        PSIMAGE_COPY_CASE(output, U16);
+        break;
+    case PS_TYPE_U32:
+        PSIMAGE_COPY_CASE(output, U32);
+        break;
+    case PS_TYPE_U64:
+        PSIMAGE_COPY_CASE(output, U64);
+        break;
+    case PS_TYPE_F32:
+        PSIMAGE_COPY_CASE(output, F32);
+        break;
+    case PS_TYPE_F64:
+        PSIMAGE_COPY_CASE(output, F64);
+        break;
+    case PS_TYPE_C32:
+        PSIMAGE_COPY_CASE(output, C32);
+        break;
+    case PS_TYPE_C64:
+        PSIMAGE_COPY_CASE(output, C64);
+        break;
+    default: {
+            char* typeStr;
+            PS_TYPE_NAME(typeStr,type);
+            psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                    PS_ERRORTEXT_psImage_IMAGE_TYPE_UNSUPPORTED,
+                    typeStr);
+            psFree(output);
+
+            break;
+        }
+    }
+    return output;
+}
+
+bool p_psImageCopyToRawBuffer(void* buffer,
+                              const psImage* input,
+                              psElemType type)
+{
+    psElemType inDatatype;
+    psS32 numRows;
+    psS32 numCols;
+
+    if (input == NULL || input->data.V == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psImage_IMAGE_NULL);
+        return false;
+    }
+
+    if (input->type.dimen != PS_DIMEN_IMAGE) {
+        psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                PS_ERRORTEXT_psImage_NOT_AN_IMAGE);
+        return false;
+    }
+
+    inDatatype = input->type.type;
+    numRows = input->numRows;
+    numCols = input->numCols;
+
+    // cover the trival case of copy of the same
+    // datatype.
+    if (type == inDatatype) {
+        int rowSize = PSELEMTYPE_SIZEOF(inDatatype)*numCols;
+        for (psS32 row=0;row<numRows;row++) {
+            memcpy(&((psS8*)buffer)[row*rowSize], input->data.V[row], rowSize);
+        }
+        return true;
+    }
+
+    #define PSIMAGE_BUFFER_COPY(INTYPE,OUTTYPE) { \
+        ps##INTYPE *in; \
+        ps##OUTTYPE *out = buffer; \
+        for(psS32 row=0;row<numRows;row++) { \
+            in = input->data.INTYPE[row]; \
+            for (psS32 col=0;col<numCols;col++) { \
+                *(out++) = *(in++); \
+            } \
+        } \
+    }
+
+    #define PSIMAGE_BUFFER_COPY_CASE(OUT,OUTTYPE) { \
+        switch (inDatatype) { \
+        case PS_TYPE_S8: \
+            PSIMAGE_BUFFER_COPY(S8,OUTTYPE); \
+            break; \
+        case PS_TYPE_S16: \
+            PSIMAGE_BUFFER_COPY(S16,OUTTYPE); \
+            break; \
+        case PS_TYPE_S32: \
+            PSIMAGE_BUFFER_COPY(S32,OUTTYPE); \
+            break; \
+        case PS_TYPE_S64: \
+            PSIMAGE_BUFFER_COPY(S64,OUTTYPE); \
+            break; \
+        case PS_TYPE_U8: \
+            PSIMAGE_BUFFER_COPY(U8,OUTTYPE); \
+            break; \
+        case PS_TYPE_U16: \
+            PSIMAGE_BUFFER_COPY(U16,OUTTYPE); \
+            break; \
+        case PS_TYPE_U32: \
+            PSIMAGE_BUFFER_COPY(U32,OUTTYPE); \
+            break; \
+        case PS_TYPE_U64: \
+            PSIMAGE_BUFFER_COPY(U64,OUTTYPE); \
+            break; \
+        case PS_TYPE_F32: \
+            PSIMAGE_BUFFER_COPY(F32,OUTTYPE); \
+            break; \
+        case PS_TYPE_F64: \
+            PSIMAGE_BUFFER_COPY(F64,OUTTYPE); \
+            break; \
+        case PS_TYPE_C32: \
+            PSIMAGE_BUFFER_COPY(C32,OUTTYPE); \
+            break; \
+        case PS_TYPE_C64: \
+            PSIMAGE_BUFFER_COPY(C64,OUTTYPE); \
+            break; \
+        default: \
+            break; \
+        } \
+    }
+
+    switch (type) {
+    case PS_TYPE_S8:
+        PSIMAGE_BUFFER_COPY_CASE(output, S8);
+        break;
+    case PS_TYPE_S16:
+        PSIMAGE_BUFFER_COPY_CASE(output, S16);
+        break;
+    case PS_TYPE_S32:
+        PSIMAGE_BUFFER_COPY_CASE(output, S32);
+        break;
+    case PS_TYPE_S64:
+        PSIMAGE_BUFFER_COPY_CASE(output, S64);
+        break;
+    case PS_TYPE_U8:
+        PSIMAGE_BUFFER_COPY_CASE(output, U8);
+        break;
+    case PS_TYPE_U16:
+        PSIMAGE_BUFFER_COPY_CASE(output, U16);
+        break;
+    case PS_TYPE_U32:
+        PSIMAGE_BUFFER_COPY_CASE(output, U32);
+        break;
+    case PS_TYPE_U64:
+        PSIMAGE_BUFFER_COPY_CASE(output, U64);
+        break;
+    case PS_TYPE_F32:
+        PSIMAGE_BUFFER_COPY_CASE(output, F32);
+        break;
+    case PS_TYPE_F64:
+        PSIMAGE_BUFFER_COPY_CASE(output, F64);
+        break;
+    case PS_TYPE_C32:
+        PSIMAGE_BUFFER_COPY_CASE(output, C32);
+        break;
+    case PS_TYPE_C64:
+        PSIMAGE_BUFFER_COPY_CASE(output, C64);
+        break;
+    default: {
+            char* typeStr;
+            PS_TYPE_NAME(typeStr,type);
+            psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                    PS_ERRORTEXT_psImage_IMAGE_TYPE_UNSUPPORTED,
+                    typeStr);
+            break;
+        }
+    }
+    return true;
+}
+
+
+psS32 psImageFreeChildren(psImage* image)
+{
+    psS32 numFreed = 0;
+
+    if (image == NULL) {
+        return numFreed;
+    }
+
+    if (image->children != NULL) {
+        psImage** children = (psImage**)image->children->data;
+        numFreed = image->children->n;
+
+        // orphan the children first
+        // (so psFree doesn't try to modify the parent's children array while I'm using it)
+        for (psS32 i=0;i<numFreed;i++) {
+            children[i]->parent = NULL;
+        }
+
+        psFree(image->children);
+        image->children = NULL;
+    }
+
+    return numFreed;
+}
+
+psC64 psImagePixelInterpolate(const psImage* input,
+                              float x,
+                              float y,
+                              const psImage* mask,
+                              psU32 maskVal,
+                              psC64 unexposedValue,
+                              psImageInterpolateMode mode)
+{
+
+    if (input == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL,true,
+                PS_ERRORTEXT_psImage_IMAGE_NULL);
+        return unexposedValue;
+    }
+
+    #define PSIMAGE_PIXEL_INTERPOLATE_CASE(TYPE)                             \
+case PS_TYPE_##TYPE:                                                 \
+    switch (mode) {                                                  \
+    case PS_INTERPOLATE_FLAT:                                        \
+        return p_psImagePixelInterpolateFLAT_##TYPE(                 \
+                input,                                               \
+                x,                                                   \
+                y,                                                   \
+                mask,                                                \
+                maskVal,                                             \
+                unexposedValue);                                     \
+        break;                                                       \
+    case PS_INTERPOLATE_BILINEAR:                                    \
+        return p_psImagePixelInterpolateBILINEAR_##TYPE(             \
+                input,                                               \
+                x,                                                   \
+                y,                                                   \
+                mask,                                                \
+                maskVal,                                             \
+                unexposedValue);                                     \
+        break;                                                       \
+    case PS_INTERPOLATE_BILINEAR_VARIANCE:                           \
+        return p_psImagePixelInterpolateBILINEAR_VARIANCE_##TYPE(    \
+                input,                                               \
+                x,                                                   \
+                y,                                                   \
+                mask,                                                \
+                maskVal,                                             \
+                unexposedValue);                                     \
+        break;                                                       \
+    default:                                                         \
+        psError(PS_ERR_BAD_PARAMETER_VALUE,true,                     \
+                PS_ERRORTEXT_psImage_INTERPOLATE_METHOD_INVALID,     \
+                mode);                                               \
+    }                                                                \
+    break;
+
+    switch (input->type.type) {
+        PSIMAGE_PIXEL_INTERPOLATE_CASE(U8);
+        PSIMAGE_PIXEL_INTERPOLATE_CASE(U16);
+        PSIMAGE_PIXEL_INTERPOLATE_CASE(U32);
+        PSIMAGE_PIXEL_INTERPOLATE_CASE(U64);
+        PSIMAGE_PIXEL_INTERPOLATE_CASE(S8);
+        PSIMAGE_PIXEL_INTERPOLATE_CASE(S16);
+        PSIMAGE_PIXEL_INTERPOLATE_CASE(S32);
+        PSIMAGE_PIXEL_INTERPOLATE_CASE(S64);
+        PSIMAGE_PIXEL_INTERPOLATE_CASE(F32);
+        PSIMAGE_PIXEL_INTERPOLATE_CASE(F64);
+        PSIMAGE_PIXEL_INTERPOLATE_CASE(C32);
+        PSIMAGE_PIXEL_INTERPOLATE_CASE(C64);
+    default: {
+            char* typeStr;
+            PS_TYPE_NAME(typeStr,input->type.type);
+            psError(PS_ERR_BAD_PARAMETER_TYPE,true,
+                    PS_ERRORTEXT_psImage_IMAGE_TYPE_UNSUPPORTED,
+                    typeStr);
+        }
+    }
+
+    return unexposedValue;
+}
+
+#define PSIMAGE_PIXEL_INTERPOLATE_FLAT(TYPE,RETURNTYPE) \
+inline RETURNTYPE p_psImagePixelInterpolateFLAT_##TYPE( \
+        const psImage* input, \
+        float x, \
+        float y, \
+        const psImage* mask, \
+        psU32 maskVal, \
+        RETURNTYPE unexposedValue) \
+{ \
+    psS32 intX = (psS32) round((psF64)(x) - 0.5 + FLT_EPSILON); \
+    psS32 intY = (psS32) round((psF64)(y) - 0.5 + FLT_EPSILON); \
+    psS32 lastX = input->numCols - 1; \
+    psS32 lastY = input->numRows - 1; \
+    \
+    if ((intX < 0) || \
+            (intX > lastX) || \
+            (intY < 0) || \
+            (intY > lastY) || \
+            ( (mask!=NULL) && \
+              ((mask->data.PS_TYPE_MASK_DATA[intY][intX] & maskVal) != 0) ) ) { \
+        return unexposedValue; \
+    } \
+    \
+    return input->data.TYPE[intY][intX]; \
+}
+
+PSIMAGE_PIXEL_INTERPOLATE_FLAT(U8,psF64)
+PSIMAGE_PIXEL_INTERPOLATE_FLAT(U16,psF64)
+PSIMAGE_PIXEL_INTERPOLATE_FLAT(U32,psF64)
+PSIMAGE_PIXEL_INTERPOLATE_FLAT(U64,psF64)
+PSIMAGE_PIXEL_INTERPOLATE_FLAT(S8,psF64)
+PSIMAGE_PIXEL_INTERPOLATE_FLAT(S16,psF64)
+PSIMAGE_PIXEL_INTERPOLATE_FLAT(S32,psF64)
+PSIMAGE_PIXEL_INTERPOLATE_FLAT(S64,psF64)
+PSIMAGE_PIXEL_INTERPOLATE_FLAT(F32,psF64)
+PSIMAGE_PIXEL_INTERPOLATE_FLAT(F64,psF64)
+PSIMAGE_PIXEL_INTERPOLATE_FLAT(C32,psC64)
+PSIMAGE_PIXEL_INTERPOLATE_FLAT(C64,psC64)
+
+#define PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(TYPE, RETURNTYPE, SUFFIX, FRACFUNC) \
+inline RETURNTYPE p_psImagePixelInterpolateBILINEAR_##SUFFIX( \
+        const psImage* input, \
+        float x, \
+        float y, \
+        const psImage* mask, \
+        psU32 maskVal, \
+        RETURNTYPE unexposedValue) \
+{ \
+    double floorX = floor((psF64)(x) - 0.5); \
+    double floorY = floor((psF64)(y) - 0.5); \
+    psF64 fracX = x - 0.5 - floorX; \
+    psF64 fracY = y - 0.5 - floorY; \
+    psS32 intFloorX = (psS32) floorX; \
+    psS32 intFloorY = (psS32) floorY; \
+    psS32 lastX = input->numCols - 1; \
+    psS32 lastY = input->numRows - 1; \
+    ps##TYPE V00 = 0; \
+    ps##TYPE V01 = 0; \
+    ps##TYPE V10 = 0; \
+    ps##TYPE V11 = 0; \
+    psBool valid00 = false; \
+    psBool valid01 = false; \
+    psBool valid10 = false; \
+    psBool valid11 = false; \
+    \
+    if (intFloorY >= 0 && intFloorY <= lastY) { \
+        if (intFloorX >= 0 && intFloorX <= lastX) { \
+            V00 = input->data.TYPE[intFloorY][intFloorX]; \
+            valid00 = (mask == NULL) || \
+                      ((mask->data.PS_TYPE_MASK_DATA[intFloorY][intFloorX] & maskVal) == 0); \
+        } \
+        if (intFloorX >= -1 && intFloorX < lastX) { \
+            V10 = input->data.TYPE[intFloorY][intFloorX+1]; \
+            valid10 = (mask == NULL) || \
+                      ((mask->data.PS_TYPE_MASK_DATA[intFloorY][intFloorX+1] & maskVal) == 0); \
+        } \
+    } \
+    if (intFloorY >= -1 && intFloorY < lastY) { \
+        if (intFloorX >= 0 && intFloorX <= lastX) { \
+            V01 = input->data.TYPE[intFloorY+1][intFloorX]; \
+            valid01 = (mask == NULL) || \
+                      ((mask->data.PS_TYPE_MASK_DATA[intFloorY+1][intFloorX] & maskVal) == 0); \
+        } \
+        if (intFloorX >= -1 && intFloorX < lastX) { \
+            V11 = input->data.TYPE[intFloorY+1][intFloorX+1]; \
+            valid11 = (mask == NULL) || \
+                      ((mask->data.PS_TYPE_MASK_DATA[intFloorY+1][intFloorX+1] & maskVal) == 0); \
+        } \
+    } \
+    \
+    /* cover likely case of all pixels being valid more efficiently */  \
+    if (valid00 && valid10 && valid01 && valid11) { \
+        /* formula from the ADD */ \
+        return V00*FRACFUNC((1.0-fracX)*(1.0-fracY)) + V10*FRACFUNC(fracX*(1.0-fracY)) + \
+               V01*FRACFUNC(fracY*(1.0-fracX)) + V11*FRACFUNC(fracX*fracY); \
+    } \
+    \
+    /* OK, at least one pixel is not valid - need to do it piecemeal */ \
+    \
+    RETURNTYPE V0 = 0.0; \
+    psBool valid0 = true; \
+    if (valid00 && valid10) { \
+        V0 = V00*FRACFUNC(1-fracX)+V10*FRACFUNC(fracX); \
+    } else if (valid00) { \
+        V0 = V00; \
+    } else if (valid10) { \
+        V0 = V10; \
+    } else { \
+        valid0 = false; \
+    } \
+    \
+    RETURNTYPE V1 = 0.0; \
+    psBool valid1 = true; \
+    if (valid01 && valid11) { \
+        V1 = V01*FRACFUNC(1-fracX)+V11*FRACFUNC(fracX); \
+    } else if (valid01) { \
+        V1 = V01; \
+    } else if (valid11) { \
+        V1 = V11; \
+    } else { \
+        valid1 = false; \
+    } \
+    \
+    if (valid0 && valid1) { \
+        return V0*FRACFUNC(1-fracY) + V1*FRACFUNC(fracY); \
+    } else if (valid0) { \
+        return V0; \
+    } else if (valid1) { \
+        return V1; \
+    } \
+    \
+    return unexposedValue; \
+}
+
+PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(U8,psF64,U8,)
+PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(U16,psF64,U16,)
+PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(U32,psF64,U32,)
+PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(U64,psF64,U64,)
+PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(S8,psF64,S8,)
+PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(S16,psF64,S16,)
+PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(S32,psF64,S32,)
+PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(S64,psF64,S64,)
+PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(F32,psF64,F32,)
+PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(F64,psF64,F64,)
+PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(C32,psC64,C32,)
+PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(C64,psC64,C64,)
+
+// Variance Version
+PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(U8,psF64,VARIANCE_U8,SQUARE)
+PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(U16,psF64,VARIANCE_U16,SQUARE)
+PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(U32,psF64,VARIANCE_U32,SQUARE)
+PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(U64,psF64,VARIANCE_U64,SQUARE)
+PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(S8,psF64,VARIANCE_S8,SQUARE)
+PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(S16,psF64,VARIANCE_S16,SQUARE)
+PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(S32,psF64,VARIANCE_S32,SQUARE)
+PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(S64,psF64,VARIANCE_S64,SQUARE)
+PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(F32,psF64,VARIANCE_F32,SQUARE)
+PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(F64,psF64,VARIANCE_F64,SQUARE)
+PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(C32,psC64,VARIANCE_C32,SQUARE)
+PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(C64,psC64,VARIANCE_C64,SQUARE)
Index: /tags/ipp-1-X/bug123/psLib/src/image/psImage.h
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/image/psImage.h	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/image/psImage.h	(revision 22331)
@@ -0,0 +1,234 @@
+/** @file  psImage.h
+ *
+ *  @brief Contains basic image definitions and operations
+ *
+ *  This file defines the basic type for an image struct and functions useful
+ *  in manupulating images.
+ *
+ *  @ingroup Image
+ *
+ *  @author Robert DeSonia, MHPCC
+ *  @author Ross Harman, MHPCC
+ *
+ *  @version $Revision: 1.50 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-04-15 00:12:08 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+#ifndef PS_IMAGE_H
+#define PS_IMAGE_H
+
+#include <complex.h>
+
+#include "psType.h"
+#include "psArray.h"
+
+/// @addtogroup Image
+/// @{
+
+/** enumeration of options in interpolation
+ *
+ */
+typedef enum {
+    PS_INTERPOLATE_FLAT,               ///< 'flat' interpolation (nearest pixel)
+    PS_INTERPOLATE_BILINEAR,           ///< bi-linear interpolation
+    PS_INTERPOLATE_LANCZOS2,           ///< Sinc interpolation with 4x4 pixel kernel
+    PS_INTERPOLATE_LANCZOS3,           ///< Sinc interpolation with 6x6 pixel kernel
+    PS_INTERPOLATE_LANCZOS4,           ///< Sinc interpolation with 8x8 pixel kernel
+    PS_INTERPOLATE_BILINEAR_VARIANCE,  ///< Variance version of PS_INTERPOLATE_BILINEAR
+    PS_INTERPOLATE_LANCZOS2_VARIANCE,  ///< Variance version of PS_INTERPOLATE_LANCZOS2
+    PS_INTERPOLATE_LANCZOS3_VARIANCE,  ///< Variance version of PS_INTERPOLATE_LANCZOS3
+    PS_INTERPOLATE_LANCZOS4_VARIANCE,  ///< Variance version of PS_INTERPOLATE_LANCZOS4
+    PS_INTERPOLATE_NUM_MODES           ///< enum end-marker; does not coorespond to a interpolation mode
+} psImageInterpolateMode;
+
+/** Basic image data structure.
+ *
+ * Struct for maintaining image data of varying types. It also contains
+ * information about image size, parent images and children images.
+ *
+ */
+typedef struct psImage
+{
+    const psType type;                 ///< Image data type and dimension.
+    const psU32 numCols;               ///< Number of columns in image
+    const psU32 numRows;               ///< Number of rows in image.
+    const psS32 col0;                  ///< Column position relative to parent.
+    const psS32 row0;                  ///< Row position relative to parent.
+
+    union {
+        psU8**  U8;                    ///< Unsigned 8-bit integer data.
+        psU16** U16;                   ///< Unsigned 16-bit integer data.
+        psU32** U32;                   ///< Unsigned 32-bit integer data.
+        psU64** U64;                   ///< Unsigned 64-bit integer data.
+        psS8**  S8;                    ///< Signed 8-bit integer data.
+        psS16** S16;                   ///< Signed 16-bit integer data.
+        psS32** S32;                   ///< Signed 32-bit integer data.
+        psS64** S64;                   ///< Signed 64-bit integer data.
+        psF32** F32;                   ///< Single-precision float data.
+        psF64** F64;                   ///< Double-precision float data.
+        psC32** C32;                   ///< Single-precision complex data.
+        psC64** C64;                   ///< Double-precision complex data.
+        psPtr** PTR;                   ///< Void pointers.
+        psPtr*  V;                     ///< Pointer to data.
+    } data;                            ///< Union for data types.
+    const struct psImage* parent;      ///< Parent, if a subimage.
+    psArray* children;                 ///< Children of this region.
+
+    psPtr rawDataBuffer;
+}
+psImage;
+
+/** Basic image region structure.
+ *
+ * Struct for specifying a rectangular area in an image.
+ *
+ */
+typedef struct
+{
+    psF32 x0;                         ///< the first column of the region.
+    psF32 x1;                         ///< the last column of the region.
+    psF32 y0;                         ///< the first row of the region.
+    psF32 y1;                         ///< the last row of the region.
+}
+psRegion;
+
+/** Create an image of the specified size and type.
+ *
+ * Uses psLib memory allocation functions to create an image struct of the
+ * specified size and type.
+ *
+ * @return psImage* : Pointer to psImage.
+ *
+ */
+psImage* psImageAlloc(
+    psU32 numCols,                     ///< Number of rows in image.
+    psU32 numRows,                     ///< Number of columns in image.
+    const psElemType type              ///< Type of data for image.
+);
+
+/** Create a psRegion with the specified attributes.
+ *
+ * Uses psLib memory allocation functions to create a psRegion the
+ * specified x0, x1, y0, and y1.
+ *
+ * @return psRegion* : Pointer to psRegion.
+ *
+ */
+psRegion* psRegionAlloc(
+    psF32 x0,                         ///< the first column of the region.
+    psF32 x1,                         ///< the last column of the region.
+    psF32 y0,                         ///< the first row of the region.
+    psF32 y1                          ///< the last row of the region.
+);
+
+/** Create a psRegion with the attribute values given as a string.
+ *
+ *  Create a psRegion with the attribute values given as a string.  The format
+ *  shall be of the standard IRAF form '[x0:x1,y0:y1]'
+ *
+ *  @return psRegion*:  A new psRegion struct, or NULL is not successful.
+ */
+psRegion* psRegionFromString(
+    char* region                       ///< image rectangular region in the form '[x0:x1,y0:y1]'
+);
+
+/** Create a string of the standard IRAF form '[x0:x1,y0:y1]' from a psRegion.
+ *
+ *  @return char*:  A new string representing the psRegion as text, or NULL
+ *                  is not successful.
+ */
+char* psRegionToString(
+    psRegion* region                   ///< the psRegion to convert to a string
+);
+
+/** Resize a given image to the given size/type.
+ *
+ *  @return psImage* Resized psImage.
+ *
+ */
+psImage* psImageRecycle(
+    psImage* old,                      ///< the psImage to recycle by resizing image buffer
+    psU32 numCols,                     ///< the desired number of columns in image
+    psU32 numRows,                     ///< the desired number of rows in image
+    const psElemType type              ///< the desired datatype of the image
+);
+
+/** Makes a copy of a psImage
+ *
+ * @return psImage* Copy of the input psImage.  This may not be equal to the
+ * output parameter
+ *
+ */
+psImage* psImageCopy(
+    psImage* output,                   ///< if not NULL, a psImage that could be recycled.
+    const psImage* input,              ///< the psImage to copy
+    psElemType type                    ///< the desired datatype of the returned copy
+);
+
+bool p_psImageCopyToRawBuffer(
+    void* buffer,
+    const psImage* input,
+    psElemType type
+);
+
+/** Frees all children of a psImage.
+ *
+ *  @return psS32      Number of children freed.
+ *
+ */
+psS32 psImageFreeChildren(
+    psImage* image                     ///< psImage in which all children shall be deallocated
+);
+
+/** Interpolate image pixel value given floating point coordinates.
+ *
+ *  @return psF32    Pixel value interpolated from image or unexposedValue if
+ *                   given x,y doesn't coorespond to a valid image location
+ */
+psC64 psImagePixelInterpolate(
+    const psImage* input,              ///< input image for interpolation
+    float x,                           ///< column location to derive value of
+    float y,                           ///< row location ot derive value of
+    const psImage* mask,               ///< if not NULL, the mask of the input image
+    psU32 maskVal,              ///< the mask value
+    psC64 unexposedValue,              ///< return value if x,y location is not in image.
+    psImageInterpolateMode mode        ///< interpolation mode
+);
+
+#define PIXEL_INTERPOLATE_FCN_PROTOTYPE(SUFFIX, RETURNTYPE) \
+inline RETURNTYPE p_psImagePixelInterpolate##SUFFIX( \
+        const psImage* input,          /**< input image for interpolation */ \
+        float x,                       /**< column location to derive value of */ \
+        float y,                       /**< row location ot derive value of */ \
+        const psImage* mask,           /**< if not NULL, the mask of the input image */ \
+        psU32 maskVal,                 /**< the mask value */ \
+        RETURNTYPE unexposedValue      /**< return value if x,y location is not in image. */ \
+                                                   );
+
+#define PIXEL_INTERPOLATE_FCNS(MODE) \
+PIXEL_INTERPOLATE_FCN_PROTOTYPE(MODE##_U8,psF64)  \
+PIXEL_INTERPOLATE_FCN_PROTOTYPE(MODE##_U16,psF64) \
+PIXEL_INTERPOLATE_FCN_PROTOTYPE(MODE##_U32,psF64) \
+PIXEL_INTERPOLATE_FCN_PROTOTYPE(MODE##_U64,psF64) \
+PIXEL_INTERPOLATE_FCN_PROTOTYPE(MODE##_S8,psF64)  \
+PIXEL_INTERPOLATE_FCN_PROTOTYPE(MODE##_S16,psF64) \
+PIXEL_INTERPOLATE_FCN_PROTOTYPE(MODE##_S32,psF64) \
+PIXEL_INTERPOLATE_FCN_PROTOTYPE(MODE##_S64,psF64) \
+PIXEL_INTERPOLATE_FCN_PROTOTYPE(MODE##_F32,psF64) \
+PIXEL_INTERPOLATE_FCN_PROTOTYPE(MODE##_F64,psF64) \
+PIXEL_INTERPOLATE_FCN_PROTOTYPE(MODE##_C32,psC64) \
+PIXEL_INTERPOLATE_FCN_PROTOTYPE(MODE##_C64,psC64)
+
+#ifndef SWIG
+PIXEL_INTERPOLATE_FCNS(FLAT)
+PIXEL_INTERPOLATE_FCNS(BILINEAR)
+PIXEL_INTERPOLATE_FCNS(BILINEAR_VARIANCE)
+#endif
+
+#undef PIXEL_INTERPOLATE_FCN_PROTOTYPE
+#undef PIXEL_INTERPOLATE_FCNS
+
+/// @}
+
+#endif
Index: /tags/ipp-1-X/bug123/psLib/src/image/psImageConvolve.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/image/psImageConvolve.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/image/psImageConvolve.c	(revision 22331)
@@ -0,0 +1,479 @@
+/*  @file  psImageConvolve.c
+ *
+ *  @brief Contains FFT transform related functions for psImage.
+ *
+ *  @author Robert DeSonia, MHPCC
+ *
+ *  @version $Revision: 1.14 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-04-15 00:12:08 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+
+#include <string.h>
+
+#include "psImageConvolve.h"
+#include "psImageFFT.h"
+#include "psImageExtraction.h"
+#include "psBinaryOp.h"
+#include "psMemory.h"
+#include "psLogMsg.h"
+#include "psError.h"
+#include "psImageIO.h"
+
+#include "psImageErrors.h"
+
+#define FOURIER_PADDING 32 /* padding amount in every side of the image for fourier convolution */
+
+static void freeKernel(psKernel* ptr);
+
+psKernel* psKernelAlloc(psS32 xMin, psS32 xMax, psS32 yMin, psS32 yMax)
+{
+    psKernel* result;
+    psS32 numRows;
+    psS32 numCols;
+
+    // following is explicitly spelled out in the SDRS as a requirement
+    if (yMin > yMax) {
+        psLogMsg(__func__, PS_LOG_WARN,
+                 "Specified yMin, %d, was greater than yMax, %d.  Values swapped.",
+                 yMin, yMax);
+
+        psS32 temp = yMin;
+        yMin = yMax;
+        yMax = temp;
+    }
+
+    // following is explicitly spelled out in the SDRS as a requirement
+    if (xMin > xMax) {
+        psLogMsg(__func__, PS_LOG_WARN,
+                 "Specified xMin, %d, was greater than xMax, %d.  Values swapped.",
+                 xMin, xMax);
+
+        psS32 temp = xMin;
+        xMin = xMax;
+        xMax = temp;
+    }
+
+    numRows = yMax - yMin + 1;
+    numCols = xMax - xMin + 1;
+
+    result = psAlloc(sizeof(psKernel));
+    result->xMin = xMin;
+    result->xMax = xMax;
+    result->yMin = yMin;
+    result->yMax = yMax;
+    result->image = psImageAlloc(numCols,numRows,PS_TYPE_KERNEL);
+    memset(result->image->rawDataBuffer,0,numCols*numRows*PSELEMTYPE_SIZEOF(PS_TYPE_KERNEL));
+    result->p_kernelRows = psAlloc(sizeof(psKernelType*)*numRows);
+
+    psKernelType** kernelRows = result->p_kernelRows;
+    psKernelType** imageRows = result->image->data.PS_TYPE_KERNEL_DATA;
+    for (psS32 i = 0; i < numRows; i++) {
+        kernelRows[i] = imageRows[i] - xMin;
+    }
+    result->kernel = kernelRows - yMin;
+
+    psMemSetDeallocator(result,(psFreeFcn)freeKernel);
+
+    return result;
+}
+
+void freeKernel(psKernel* ptr)
+{
+    if (ptr != NULL) {
+        psFree(ptr->image);
+        psFree(ptr->p_kernelRows);
+    }
+}
+
+psKernel* psKernelGenerate(const psVector* tShifts,
+                           const psVector* xShifts,
+                           const psVector* yShifts,
+                           psBool relative)
+{
+    psS32 lastX;
+    psS32 lastY;
+    psS32 lastT;
+    psS32 x;
+    psS32 y;
+    psS32 t;
+    psS32 xMin = 0;
+    psS32 xMax = 0;
+    psS32 yMin = 0;
+    psS32 yMax = 0;
+    psS32 length = 0;
+    psKernelType normalizeTime = 1.0;  // fraction of total time for each shift clock
+    psKernel* result = NULL;
+    psKernelType** kernel = NULL;
+
+    // got non-NULL vectors?
+    if (tShifts == NULL || xShifts == NULL || yShifts == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psImageConvolve_SHIFT_NULL);
+        return NULL;
+    }
+
+    // types match?
+    if (xShifts->type.type != yShifts->type.type ||
+            tShifts->type.type != xShifts->type.type) {
+        char* typeXStr;
+        char* typeYStr;
+        char* typeTStr;
+        PS_TYPE_NAME(typeXStr,xShifts->type.type);
+        PS_TYPE_NAME(typeYStr,yShifts->type.type);
+        PS_TYPE_NAME(typeTStr,tShifts->type.type);
+        psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                PS_ERRORTEXT_psImageConvolve_SHIFT_TYPE_MISMATCH,
+                typeTStr, typeXStr, typeYStr);
+        return NULL;
+    }
+
+    // sizes match?
+    length = xShifts->n;
+    if (length != yShifts->n ||
+            length != tShifts->n) {
+        psError(PS_ERR_BAD_PARAMETER_SIZE, true,
+                "Shift vectors can not be of different sizes.");
+        return NULL;
+    }
+
+    // if no shifts, the kernel is just a 1 at 0,0
+    if (length < 1) {
+        result = psKernelAlloc(0,0,0,0);
+        result->kernel[0][0] = 1;
+        return result;
+    }
+
+    #define KERNEL_GENERATE_CASE(TYPE) \
+case PS_TYPE_##TYPE: { \
+        ps##TYPE *tShiftData = tShifts->data.TYPE; \
+        ps##TYPE *xShiftData = xShifts->data.TYPE; \
+        ps##TYPE *yShiftData = yShifts->data.TYPE; \
+        lastX = xShiftData[length-1]; \
+        lastY = yShiftData[length-1]; \
+        lastT = tShiftData[length-1]; \
+        \
+        for (int lcv = 0; lcv < length; lcv++) { \
+            x = lastX - xShiftData[lcv]; \
+            y = lastY - yShiftData[lcv]; \
+            \
+            if (x < xMin) { \
+                xMin = x; \
+            } else if (x > xMax) { \
+                xMax = x; \
+            } \
+            if (y < yMin) { \
+                yMin = y; \
+            } else if (y > yMax) { \
+                yMax = y; \
+            } \
+        } \
+        \
+        normalizeTime = 1.0 / (psKernelType)(tShiftData[length-1]); \
+        result = psKernelAlloc(xMin,xMax,yMin,yMax); \
+        kernel = result->kernel; \
+        \
+        psS32 prevT = 0; \
+        for (int i = 0; i < length; i++) { \
+            t = tShiftData[i] - prevT; \
+            x = lastX - xShiftData[i]; \
+            y = lastY - yShiftData[i]; \
+            \
+            kernel[y][x] += (psKernelType)t / (psKernelType)lastT; \
+            prevT = tShiftData[i]; \
+        } \
+        break; \
+    }
+
+    #define RELATIVE_KERNEL_GENERATE_CASE(TYPE) \
+case PS_TYPE_##TYPE: { \
+        ps##TYPE *tShiftData = tShifts->data.TYPE; \
+        ps##TYPE *xShiftData = xShifts->data.TYPE; \
+        ps##TYPE *yShiftData = yShifts->data.TYPE; \
+        \
+        x = 0; \
+        y = 0; \
+        t = 0; \
+        \
+        for (int lcv = length-1; lcv >= 0; lcv--) { \
+            t += tShiftData[lcv]; \
+            \
+            if (x < xMin) { \
+                xMin = x; \
+            } else if (x > xMax) { \
+                xMax = x; \
+            } \
+            if (y < yMin) { \
+                yMin = y; \
+            } else if (y > yMax) { \
+                yMax = y; \
+            } \
+            x -= xShiftData[lcv]; \
+            y -= yShiftData[lcv]; \
+            \
+        } \
+        result = psKernelAlloc(xMin,xMax,yMin,yMax); \
+        kernel = result->kernel; \
+        \
+        normalizeTime = 1.0 / (psKernelType)t; \
+        x = 0; \
+        y = 0; \
+        for (psS32 i = length-1; i >= 0; i--) { \
+            kernel[y][x] += (psKernelType)(tShiftData[i]) * normalizeTime; \
+            x -= xShiftData[i]; \
+            y -= yShiftData[i]; \
+            \
+        } \
+        break; \
+    }
+
+    if (relative) {
+        switch (xShifts->type.type) {
+            RELATIVE_KERNEL_GENERATE_CASE(U8);
+            RELATIVE_KERNEL_GENERATE_CASE(U16);
+            RELATIVE_KERNEL_GENERATE_CASE(U32);
+            RELATIVE_KERNEL_GENERATE_CASE(U64);
+            RELATIVE_KERNEL_GENERATE_CASE(S8);
+            RELATIVE_KERNEL_GENERATE_CASE(S16);
+            RELATIVE_KERNEL_GENERATE_CASE(S32);
+            RELATIVE_KERNEL_GENERATE_CASE(S64);
+            RELATIVE_KERNEL_GENERATE_CASE(F32);
+            RELATIVE_KERNEL_GENERATE_CASE(F64);
+            RELATIVE_KERNEL_GENERATE_CASE(C32);
+            RELATIVE_KERNEL_GENERATE_CASE(C64);
+
+        default: {
+                char* typeStr;
+                PS_TYPE_NAME(typeStr,xShifts->type.type);
+                psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                        PS_ERRORTEXT_psImage_IMAGE_TYPE_UNSUPPORTED,
+                        typeStr);
+            }
+        }
+    } else {
+        switch (xShifts->type.type) {
+            KERNEL_GENERATE_CASE(U8);
+            KERNEL_GENERATE_CASE(U16);
+            KERNEL_GENERATE_CASE(U32);
+            KERNEL_GENERATE_CASE(U64);
+            KERNEL_GENERATE_CASE(S8);
+            KERNEL_GENERATE_CASE(S16);
+            KERNEL_GENERATE_CASE(S32);
+            KERNEL_GENERATE_CASE(S64);
+            KERNEL_GENERATE_CASE(F32);
+            KERNEL_GENERATE_CASE(F64);
+            KERNEL_GENERATE_CASE(C32);
+            KERNEL_GENERATE_CASE(C64);
+
+        default: {
+                char* typeStr;
+                PS_TYPE_NAME(typeStr,xShifts->type.type);
+                psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                        PS_ERRORTEXT_psImage_IMAGE_TYPE_UNSUPPORTED,
+                        typeStr);
+            }
+        }
+    }
+
+    return result;
+}
+
+psImage* psImageConvolve(psImage* out, const psImage* in, const psKernel* kernel, psBool direct)
+{
+    if (in == NULL) {
+        psFree(out);
+        return NULL;
+    }
+
+    if (kernel == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psImageConvolve_KERNEL_NULL);
+        psFree(out);
+        return NULL;
+    }
+    psS32 xMin = kernel->xMin;
+    psS32 xMax = kernel->xMax;
+    psS32 yMin = kernel->yMin;
+    psS32 yMax = kernel->yMax;
+    psKernelType** kData = kernel->kernel;
+
+    // make the output image to the proper size and type
+    psS32 numRows = in->numRows;
+    psS32 numCols = in->numCols;
+
+
+
+    if (direct) {
+        // spatial convolution
+
+        #define SPATIAL_CONVOLVE_CASE(TYPE) \
+    case PS_TYPE_##TYPE: { \
+            ps##TYPE** inData = in->data.TYPE; \
+            out = psImageRecycle(out, numCols, numRows, PS_TYPE_##TYPE); \
+            for (psS32 row=0;row<numRows;row++) { \
+                ps##TYPE* outRow = out->data.TYPE[row]; \
+                for (psS32 col=0;col<numCols;col++) { \
+                    ps##TYPE pixel = 0.0; \
+                    for (psS32 kRow = yMin; kRow < yMax; kRow++) { \
+                        if (row-kRow >= 0 && row-kRow < numRows) { \
+                            for (psS32 kCol = xMin; kCol < xMax; kCol++) { \
+                                if (col-kCol >= 0 && col-kCol < numCols) { \
+                                    pixel += kData[kRow][kCol] * inData[row-kRow][col-kCol]; \
+                                } \
+                            } \
+                        } \
+                    } \
+                    outRow[col] = pixel; \
+                } \
+            } \
+        } \
+        break;
+
+        switch (in->type.type) {
+            SPATIAL_CONVOLVE_CASE(U8)
+            SPATIAL_CONVOLVE_CASE(U16)
+            SPATIAL_CONVOLVE_CASE(U32)
+            SPATIAL_CONVOLVE_CASE(U64)
+            SPATIAL_CONVOLVE_CASE(S8)
+            SPATIAL_CONVOLVE_CASE(S16)
+            SPATIAL_CONVOLVE_CASE(S32)
+            SPATIAL_CONVOLVE_CASE(S64)
+            SPATIAL_CONVOLVE_CASE(F32)
+            SPATIAL_CONVOLVE_CASE(F64)
+            SPATIAL_CONVOLVE_CASE(C32)
+            SPATIAL_CONVOLVE_CASE(C64)
+
+        default: {
+                char* typeStr;
+                PS_TYPE_NAME(typeStr,in->type.type);
+                psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                        PS_ERRORTEXT_psImage_IMAGE_TYPE_UNSUPPORTED,
+                        typeStr);
+                psFree(out);
+                return NULL;
+
+            }
+        }
+
+
+    } else {
+        // fourier convolution
+        psS32 paddedCols = numCols+2*FOURIER_PADDING;
+        psS32 paddedRows = numRows+2*FOURIER_PADDING;
+
+        // check to see if kernel is smaller, otherwise padding it up will fail.
+        psS32 kRows = kernel->image->numRows;
+        psS32 kCols = kernel->image->numCols;
+        if (kRows >= numRows || kCols >= numCols) {
+            psError(PS_ERR_BAD_PARAMETER_SIZE, true,
+                    PS_ERRORTEXT_psImageConvolve_KERNEL_TOO_LARGE,
+                    kCols,kRows,
+                    numCols, numRows);
+            psFree(out);
+            return NULL;
+        }
+
+        // pad the image
+        psImage* paddedImage = psImageAlloc(paddedCols,paddedRows,in->type.type);
+        psS32 elementSize = PSELEMTYPE_SIZEOF(in->type.type);
+
+        // zero out padded area on top and bottom
+        memset(paddedImage->data.U8[0],0,FOURIER_PADDING*paddedCols*elementSize);
+        memset(paddedImage->data.U8[FOURIER_PADDING+numRows-1],0,FOURIER_PADDING*paddedCols*elementSize);
+
+        // fill in the image-containing rows.
+        psS32 sidePaddingSize = FOURIER_PADDING*elementSize;
+        psS32 imageRowSize = numCols*elementSize;
+        psU8* paddedData = paddedImage->data.U8[FOURIER_PADDING];
+        for (psS32 row=0;row<numRows;row++) {
+            // zero out padded area on left edge.
+            memset(paddedData,0,sidePaddingSize);
+            paddedData += sidePaddingSize;
+            memcpy(paddedData,in->data.U8[row],imageRowSize);
+            paddedData += imageRowSize;
+            // zero out padded area on right edge.
+            memset(paddedData,0,sidePaddingSize);
+            paddedData += sidePaddingSize;
+        }
+
+        // pad the kernel to the same size of paddedImage
+        psImage* paddedKernel = psImageAlloc(paddedCols,paddedRows,PS_TYPE_KERNEL);
+        memset(paddedKernel->data.U8[0],0,sizeof(psKernelType)*numCols*numRows); // zero-out image
+        psS32 yMax = kernel->yMax;
+        psS32 xMax = kernel->xMax;
+        for (psS32 row = kernel->yMin; row <= yMax;row++) {
+            psS32 padRow = row;
+            if (padRow < 0) {
+                padRow += paddedRows;
+            }
+            psKernelType* padData = paddedKernel->data.PS_TYPE_KERNEL_DATA[padRow];
+            psKernelType* kernelRow = kernel->kernel[row];
+            for (psS32 col = kernel->xMin; col <= xMax; col++) {
+                if (col < 0) {
+                    padData[col+paddedCols] = kernelRow[col];
+                } else {
+                    padData[col] = kernelRow[col];
+                }
+            }
+        }
+
+        psImage* kernelFourier = psImageFFT(NULL, paddedKernel, PS_FFT_FORWARD);
+        if (kernelFourier == NULL) {
+            psError(PS_ERR_UNKNOWN, false,
+                    PS_ERRORTEXT_psImageConvolve_KERNEL_FFT_FAILED);
+            psFree(out);
+            return NULL;
+        }
+
+        psImage* inFourier = psImageFFT(NULL, paddedImage, PS_FFT_FORWARD);
+        if (inFourier == NULL) {
+            psError(PS_ERR_UNKNOWN, false,
+                    PS_ERRORTEXT_psImageConvolve_FFT_FAILED);
+            psFree(out);
+            return NULL;
+        }
+
+        // convolution in fourier domain is just a pixel-wise multiplication
+        for (int row = 0; row < paddedRows; row++) {
+            psC32* inRow = inFourier->data.C32[row];
+            psC32* kRow = kernelFourier->data.C32[row];
+            for (int col = 0; col < paddedCols; col++) {
+                inRow[col] *= kRow[col];
+            }
+        }
+
+        psImage* complexOut = psImageFFT(NULL, inFourier,
+                                         PS_FFT_REVERSE);
+        if (complexOut == NULL) {
+            psError(PS_ERR_UNKNOWN, false,
+                    PS_ERRORTEXT_psImageConvolve_FFT_FAILED);
+            psFree(out);
+            return NULL;
+        }
+
+        // subset out the padded area now.
+        psImage* complexOutSansPad = psImageSubset(complexOut,
+                                     FOURIER_PADDING,FOURIER_PADDING,
+                                     FOURIER_PADDING+numCols,FOURIER_PADDING+numRows);
+
+        out = psImageRecycle(out,numCols,numRows,PS_TYPE_F32);
+        float factor = 1.0f/(float)paddedCols/(float)paddedRows;
+        for (psS32 row = 0; row < numRows; row++) {
+            psF32* outRow = out->data.F32[row];
+            psC32* resultRow = complexOutSansPad->data.C32[row];
+            for (psS32 col = 0; col < numCols; col++) {
+                outRow[col] = crealf(resultRow[col])*factor;
+            }
+        }
+
+        psFree(complexOut); // frees complexOutSansPad, as it is a child.
+        psFree(kernelFourier);
+        psFree(inFourier);
+        psFree(paddedImage);
+        psFree(paddedKernel);
+
+    }
+
+    return out;
+}
Index: /tags/ipp-1-X/bug123/psLib/src/image/psImageConvolve.h
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/image/psImageConvolve.h	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/image/psImageConvolve.h	(revision 22331)
@@ -0,0 +1,121 @@
+/** @file  psImageConvolve.h
+ *
+ *  @brief image convolution functionality
+ *
+ *  @ingroup Transform
+ *
+ *  @author Robert DeSonia, MHPCC
+ *
+ *  @version $Revision: 1.4 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-02-17 19:26:24 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+
+#ifndef PS_IMAGE_CONVOLVE_H
+#define PS_IMAGE_CONVOLVE_H
+
+#include "psImage.h"
+#include "psVector.h"
+#include "psType.h"
+
+#define PS_TYPE_KERNEL PS_TYPE_F32     /**< the data member to use for kernel image */
+#define PS_TYPE_KERNEL_DATA F32        /**< the data member to use for kernel image */
+#define PS_TYPE_KERNEL_NAME "psF32"    /**< the data type for kernel as a string */
+
+typedef psF32 psKernelType;
+
+/** A convolution kernel */
+typedef struct
+{
+    psImage* image;                    ///< Kernel data, in the form of an image
+    psS32 xMin;                          ///< Most negative x index
+    psS32 yMin;                          ///< Most negative y index
+    psS32 xMax;                          ///< Most positive x index
+    psS32 yMax;                          ///< Most positive y index
+    psKernelType** kernel;             ///< Pointer to the kernel data
+    psKernelType** p_kernelRows;       ///< Pointer to the rows of the kernel data; not intended for user use.
+}
+psKernel;
+
+/** Allocates a convolution kernel of the given range
+ *
+ *  In order to perform a convolution, we need to define the convolution 
+ *  kernel. We need a more general object than a psImage so that we can 
+ *  incorporate the offset from the (0, 0) pixel to the (0, 0) value of the 
+ *  kernel. It might be convenient to allow both positive and negative 
+ *  indices to convey the positive and negative shifts. One might consider 
+ *  setting the x0 and y0 members of a psImage to the appropriate offsets, 
+ *  but this is not the purpose of these members, and doing so may affect the 
+ *  behavior of other psImage operations.
+ *
+ *  This construction allows the kernel member to use negative indices, while 
+ *  preserving the location of psMemBlocks relative to allocated memory.
+ *
+ *  The maximum extent of the kernel shifts shall be defined by the xMin, 
+ *  xMax, yMin and yMax members. Note that xMin and yMin, under normal 
+ *  circumstances, should be negative numbers. That is, 
+ *  myKernel->kernel[-3][-2] may be defined if yMin and xMin are equal to or 
+ *  more negative than -3 and -2, respectively.
+ *
+ *  In the event that one of the minimum values is greater than the 
+ *  corresponding maximum value, the function shall generate a warning, and 
+ *  the offending values shall be exchanged.
+ *
+ *  @return psKernel*          A new kernel object
+ */
+psKernel* psKernelAlloc(
+    psS32 xMin,                          ///< Most negative x index
+    psS32 xMax,                          ///< Most positive x index
+    psS32 yMin,                          ///< Most negative y index
+    psS32 yMax                           ///< Most positive y index
+);
+
+/** Generates a kernel given a list of shift values
+ *
+ *  Given a list of values (e.g., shifts made in the course of OT guiding), 
+ *  psKernelGenerate shall return the appropriate kernel.  The vectors xShifts 
+ *  and yShifts, which are a list of shifts relative to some starting point, 
+ *  will be supplied by the user. The elements of the vectors should be of an 
+ *  integer type; otherwise the values shall be truncated to integers. The 
+ *  output kernel shall be normalized such that the sum over the kernel is 
+ *  unity. 
+ *
+ *  If the vectors are not of the same number of elements, then the function 
+ *  shall generate a warning shall be generated, following which, the longer 
+ *  vector trimmed to the length of the shorter, and the function shall continue.
+ *
+ *  @return psKernel*    new Kernel object
+ */
+psKernel* psKernelGenerate(
+    const psVector* tShifts,           ///< list of time shifts
+    const psVector* xShifts,           ///< list of x-axis shifts
+    const psVector* yShifts,           ///< list of y-axis shifts
+    psBool relative
+);
+
+/** convolve an image with a kernel
+ *
+ *  Given an input image and the convolution kernel, psImageConvolve shall 
+ *  convolve the input image, in, with the kernel, kernel and return the 
+ *  convolved image, out.
+ * 
+ *  Two methods shall be available for the convolution: if direct is true, 
+ *  then the convolution shall be performed in real space (appropriate for 
+ *  small kernels); otherwise, the convolution shall be performed using Fast 
+ *  Fourier Transforms (FFTs; appropriate for larger kernels). The latter 
+ *  option involves padding the input image, copying the kernel into an image 
+ *  of the same size as the padded input image, performing an FFT on each, 
+ *  multiplying the FFTs, and performing an inverse FFT before trimming the 
+ *  image back to the original size.
+ *
+ *  @return psImage*  resulting image 
+ */
+psImage* psImageConvolve(
+    psImage* out,                      ///< a psImage to recycle.  If NULL, a new psImage is made.
+    const psImage* in,                 ///< the psImage to convolve
+    const psKernel* kernel,            ///< kernel to colvolve with
+    psBool direct                        ///< specifies method, true=direct convolution, false=fourier
+);
+
+#endif
Index: /tags/ipp-1-X/bug123/psLib/src/image/psImageErrors.dat
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/image/psImageErrors.dat	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/image/psImageErrors.dat	(revision 22331)
@@ -0,0 +1,81 @@
+#
+#  This file is used to generate psImageErrors.h content
+#
+#  Format is:
+#  ERRORNAME(one word)    ERRORTEXT
+#
+#  N.B. in code, the ERRORNAME appears as PS_ERRORTEXT_ERRORNAME
+####################################################################
+# psImage
+psImage_AREA_NEGATIVE                  Specified number of rows (%d) or columns (%d) is invalid.
+psImage_NOT_AN_IMAGE                   The input psImage must have a PS_DIMEN_IMAGE dimension type.
+psImage_IMAGE_NULL                     Can not operate on a NULL psImage.
+psImage_IMAGE_TYPE_UNSUPPORTED         Specified psImage type, %s, is not supported.
+psImage_INTERPOLATE_METHOD_INVALID     Specified interpolation method (%d) is not supported.
+psImage_REGION_NULL                    Specified psRegion is NULL.  Operation could not be performed.
+psImage_SUBSET_RANGE_INVALID           Specified subset range, [%d:%d,%d:%d], is invalid or outside input psImage's boundaries, [0:%d,0:%d].
+psImage_SUBSET_RANGE_MALFORMED         Specified subset range, [%d:%d,%d:%d], is invalid.  Ranges must be incremental.
+psImage_SUBSECTION_NULL                Specified subsection string can not be NULL.
+psImage_SUBSECTION_INVALID             Specified subsection string, '%s', can not be parsed.  Must be in the form '[x1:x2,y1:y2]'.
+psImage_NOT_PARENT                     Specified psImage can not be a child of another psImage.
+psImage_INPLACE_NOTSUPPORTED           Specified input and output psImage can not reference the same psImage.
+psImage_SUBSET_ZERO_SIZE               Specified subset, [%d:%d,%d:%d], contains no pixel data.
+psImage_IMAGE_MASK_SIZE                Input psImage mask size, %dx%d, does not match psImage input size, %dx%d.
+psImage_IMAGE_MASK_TYPE                Input psImage mask type, %s, is not the supported mask datatype of %s.
+psImage_BAD_STAT                       Specified statistic option, %d, is not valid.  Must specify one and only one statistic type.
+psImage_NO_STAT_OPTIONS                Specified statistic option did not indicate any operation to perform.
+psImage_STAT_NULL                      Specified statistic can not be NULL.
+psImage_SLICE_DIRECTION_INVALID        Specified slice direction, %d, is invalid.
+psImage_PARAMETER_OUTOF_TYPERANGE      Specified %s value, %g, is outside of psImage type's range (%s: %g to %g).
+psImage_nSamples_TOOSMALL              Specified number of samples, %d, must be greater than 1 to make a line.
+psImage_LINE_NOT_IN_IMAGE              Specified line, (%f,%f)->(%f,%f), does not entirely lie in psImage's boundaries, [0:%d,0:%d].
+psImage_RADII_VECTOR_NULL              Specified radii vector can not be NULL.
+psImage_CENTER_NOT_IN_IMAGE            Specified center, (%g,%g), is outside of the psImage boundaries, [0:%d,0:%d].
+psImage_RADII_VECTOR_TOOSMALL          Input radii vector size, %d, can not be less than 2.
+#
+psImageFFT_IMAGE_TYPE_UNSUPPORTED      Input psImage type (%s) is not supported. Valid image types are psF32 and psC32.
+psImageFFT_REVERSE_NOT_COMPLEX         Input psImage (%s) is not complex.  Reverse FFT operation requires a complex psImage input.
+psImageFFT_FORWARD_NOT_REAL            Input psImage (%s) is not real.  Forward FFT operation requires a real psImage input.
+psImageFFT_FFTW_PLAN_NULL              Could not create a valid FFT plan to perform the transform.
+psImageFFT_REAL_IMAG_TYPE_MISMATCH     Real psImage type (%s) and imaginary psImage type (%s) must be the same.
+psImageFFT_REAL_IMAG_SIZE_MISMATCH     Real psImage size (%dx%d) and imaginary psImage size (%dx%d) must be the same.
+psImageFFT_NONREAL_NOTSUPPORTED        Input psImage type, %s, is required to be either psF32 or psF64.
+psImageFFT_NONCOMPLEX_NOTSUPPORTED     Input psImage type, %s, is required to be either psC32 or psC64.
+psImageFFT_REAL_FORWARD_NOTSUPPORTED   The PS_FFT_FORWARD and PS_FFT_REAL_RESULT combinition is not supported.
+psImageFFT_FORWARD_REVERSE             Can not specify both PS_FFT_FORWARD and PS_FFT_REVERSE options.
+psImageFFT_NO_DIRECTION_OPTION         Must specify either PS_FFT_FORWARD or PS_FFT_REVERSE option.
+#
+psImageIO_FILENAME_NULL                Specified filename can not be NULL.
+psImageIO_FILENAME_INVALID             Could not open file,'%s'.\nCFITSIO Error: %s
+psImageIO_EXTNAME_INVALID              Could not find HDU with extension name '%s' in file %s.\nCFITSIO Error: %s
+psImageIO_EXTNUM_INVALID               Could not find HDU #%d in file %s.\nCFITSIO Error: %s
+psImageIO_DATATYPE_UNKNOWN             Could not determine image data type for file %s.\nCFITSIO Error: %s
+psImageIO_IMAGE_DIM_UNKNOWN            Could not determine image dimensions for file %s.\nCFITSIO Error: %s
+psImageIO_IMAGE_SIZE_UNKNOWN           Could not determine image size for file %s.\nCFITSIO Error: %s
+psImageIO_IMAGE_DIMENSION_UNSUPPORTED  Image number of dimensions, %d, is not valid.  Only two or three dimensions supported for FITS I/O.
+psImageIO_FITS_TYPE_UNSUPPORTED        FITS image type, BITPIX=%d, in file %s is not supported.
+psImageIO_READ_FAILED                  Reading from FITS file %s failed.\nCFITSIO Error: %s
+psImageIO_TYPE_UNSUPPORTED             Input psImage type, %s, is not supported.
+psImageIO_WRITE_EXTNUM_INVALID         Specified extension number, %d, must not exceed number of HDUs, %d, by more than one.
+psImageIO_FILENAME_CREATE_FAILED       Could not create file,'%s'.\nCFITSIO Error: %s
+psImageIO_CREATE_EXTENSION_FAILED      Could not create EXTNAME keyword for file,'%s'.\nCFITSIO Error: %s
+psImageIO_CREATE_HDU_FAILED            Could not create HDU for writing psImage in file,'%s'.\nCFITSIO Error: %s
+psImageIO_WRITE_FAILED                 Could not write psImage data to file,'%s'.\nCFITSIO Error: %s
+#
+psImageManip_MAXMIN                    Specified min value, %g, can not be greater than the specified max value, %g.
+psImageManip_MAXMIN_REAL               Specified real-portion of min value, %g, can not be greater than the real-portion of max value, %g.
+psImageManip_MAXMIN_IMAG               Specified imaginary-portion of min value, %g, can not be greater than the imaginary-portion of max value, %g.
+psImageManip_OPERATION_NULL            Operation can not be NULL.
+psImageManip_OVERLAY_TYPE_MISMATCH     Input overlay psImage type, %s, must match input psImage type, %s.
+psImageManip_CLIP_VALUE_INVALID        Specified %s value, %g%+gi, is not the the range of input psImage's valid pixel values (%s), i.e. [%g:%g].
+psImageManip_OVERLAY_OPERATOR_INVALID  Specified operation, '%s', is not supported.
+psImageManip_SCALE_NOT_POSITIVE        Specified scale value, %d, must be a positive value.
+psImageManip_INTERPOLATION_MODE_UNSUPPORTED Specified interpolation mode, %d, is unsupported.
+psImageConvolve_SHIFT_NULL             Specified shift vectors can not be NULL.
+psImageConvolve_KERNEL_NULL            Specified psKernel can not be NULL.
+psImageConvolve_SHIFT_TYPE_MISMATCH    Input t-, x-, and y-shift vector types (%s/%s/%s) must match.
+psImageConvolve_FFT_FAILED             Failed to perform a fourier transform of input image.
+psImageConvolve_KERNEL_FFT_FAILED      Failed to perform a fourier transform of kernel.
+psImageConvolve_KERNEL_TOO_LARGE       Specified psKernel size, %dx%d, can not be larger than input psImage size, %dx%d.
+psImage_COEFF_NULL                     Polynomial coefficients cannot be NULL.
+psImageManip_TRANSFORM_NULL            Specified input transform can not be NULL.
Index: /tags/ipp-1-X/bug123/psLib/src/image/psImageErrors.h
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/image/psImageErrors.h	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/image/psImageErrors.h	(revision 22331)
@@ -0,0 +1,101 @@
+/** @file  psImageErrors.h
+ *
+ *  @brief Contains the error text for the image functions
+ *
+ *  @ingroup ErrorHandling
+ *
+ *  @author Robert DeSonia, MHPCC
+ *
+ *  @version $Revision: 1.15 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-03-22 21:52:49 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+
+#ifndef PS_IMAGE_ERRORS_H
+#define PS_IMAGE_ERRORS_H
+
+/* N.B., lines between '//~Start' and '//~End' are automatic generated from
+ * the template following the '//~Start'.  The template is used to generate
+ * the other lines by, for each error text in psImageErrors.dat, the following
+ * substitutions are made:
+ *     $1  The error text macro name (first word in the psImageErrors.dat lines)
+ *     $2  The error text (rest of the line in psImageErrors.dat)
+ *     $n  The order of the source line in psImageErrors.dat (comments excluded)
+ * 
+ * DO NOT EDIT THE LINES BETWEEN //~Start and //~End!  ANY CHANGES WILL BE OVERWRITTEN.
+ */
+
+//~Start #define PS_ERRORTEXT_$1 "$2"
+#define PS_ERRORTEXT_psImage_AREA_NEGATIVE "Specified number of rows (%d) or columns (%d) is invalid."
+#define PS_ERRORTEXT_psImage_NOT_AN_IMAGE "The input psImage must have a PS_DIMEN_IMAGE dimension type."
+#define PS_ERRORTEXT_psImage_IMAGE_NULL "Can not operate on a NULL psImage."
+#define PS_ERRORTEXT_psImage_IMAGE_TYPE_UNSUPPORTED "Specified psImage type, %s, is not supported."
+#define PS_ERRORTEXT_psImage_INTERPOLATE_METHOD_INVALID "Specified interpolation method (%d) is not supported."
+#define PS_ERRORTEXT_psImage_REGION_NULL "Specified psRegion is NULL.  Operation could not be performed."
+#define PS_ERRORTEXT_psImage_SUBSET_RANGE_INVALID "Specified subset range, [%d:%d,%d:%d], is invalid or outside input psImage's boundaries, [0:%d,0:%d]."
+#define PS_ERRORTEXT_psImage_SUBSET_RANGE_MALFORMED "Specified subset range, [%d:%d,%d:%d], is invalid.  Ranges must be incremental."
+#define PS_ERRORTEXT_psImage_SUBSECTION_NULL "Specified subsection string can not be NULL."
+#define PS_ERRORTEXT_psImage_SUBSECTION_INVALID "Specified subsection string, '%s', can not be parsed.  Must be in the form '[x1:x2,y1:y2]'."
+#define PS_ERRORTEXT_psImage_NOT_PARENT "Specified psImage can not be a child of another psImage."
+#define PS_ERRORTEXT_psImage_INPLACE_NOTSUPPORTED "Specified input and output psImage can not reference the same psImage."
+#define PS_ERRORTEXT_psImage_SUBSET_ZERO_SIZE "Specified subset, [%d:%d,%d:%d], contains no pixel data."
+#define PS_ERRORTEXT_psImage_IMAGE_MASK_SIZE "Input psImage mask size, %dx%d, does not match psImage input size, %dx%d."
+#define PS_ERRORTEXT_psImage_IMAGE_MASK_TYPE "Input psImage mask type, %s, is not the supported mask datatype of %s."
+#define PS_ERRORTEXT_psImage_BAD_STAT "Specified statistic option, %d, is not valid.  Must specify one and only one statistic type."
+#define PS_ERRORTEXT_psImage_NO_STAT_OPTIONS "Specified statistic option did not indicate any operation to perform."
+#define PS_ERRORTEXT_psImage_STAT_NULL "Specified statistic can not be NULL."
+#define PS_ERRORTEXT_psImage_SLICE_DIRECTION_INVALID "Specified slice direction, %d, is invalid."
+#define PS_ERRORTEXT_psImage_PARAMETER_OUTOF_TYPERANGE "Specified %s value, %g, is outside of psImage type's range (%s: %g to %g)."
+#define PS_ERRORTEXT_psImage_nSamples_TOOSMALL "Specified number of samples, %d, must be greater than 1 to make a line."
+#define PS_ERRORTEXT_psImage_LINE_NOT_IN_IMAGE "Specified line, (%f,%f)->(%f,%f), does not entirely lie in psImage's boundaries, [0:%d,0:%d]."
+#define PS_ERRORTEXT_psImage_RADII_VECTOR_NULL "Specified radii vector can not be NULL."
+#define PS_ERRORTEXT_psImage_CENTER_NOT_IN_IMAGE "Specified center, (%g,%g), is outside of the psImage boundaries, [0:%d,0:%d]."
+#define PS_ERRORTEXT_psImage_RADII_VECTOR_TOOSMALL "Input radii vector size, %d, can not be less than 2."
+#define PS_ERRORTEXT_psImageFFT_IMAGE_TYPE_UNSUPPORTED "Input psImage type (%s) is not supported. Valid image types are psF32 and psC32."
+#define PS_ERRORTEXT_psImageFFT_REVERSE_NOT_COMPLEX "Input psImage (%s) is not complex.  Reverse FFT operation requires a complex psImage input."
+#define PS_ERRORTEXT_psImageFFT_FORWARD_NOT_REAL "Input psImage (%s) is not real.  Forward FFT operation requires a real psImage input."
+#define PS_ERRORTEXT_psImageFFT_FFTW_PLAN_NULL "Could not create a valid FFT plan to perform the transform."
+#define PS_ERRORTEXT_psImageFFT_REAL_IMAG_TYPE_MISMATCH "Real psImage type (%s) and imaginary psImage type (%s) must be the same."
+#define PS_ERRORTEXT_psImageFFT_REAL_IMAG_SIZE_MISMATCH "Real psImage size (%dx%d) and imaginary psImage size (%dx%d) must be the same."
+#define PS_ERRORTEXT_psImageFFT_NONREAL_NOTSUPPORTED "Input psImage type, %s, is required to be either psF32 or psF64."
+#define PS_ERRORTEXT_psImageFFT_NONCOMPLEX_NOTSUPPORTED "Input psImage type, %s, is required to be either psC32 or psC64."
+#define PS_ERRORTEXT_psImageFFT_REAL_FORWARD_NOTSUPPORTED "The PS_FFT_FORWARD and PS_FFT_REAL_RESULT combinition is not supported."
+#define PS_ERRORTEXT_psImageFFT_FORWARD_REVERSE "Can not specify both PS_FFT_FORWARD and PS_FFT_REVERSE options."
+#define PS_ERRORTEXT_psImageFFT_NO_DIRECTION_OPTION "Must specify either PS_FFT_FORWARD or PS_FFT_REVERSE option."
+#define PS_ERRORTEXT_psImageIO_FILENAME_NULL "Specified filename can not be NULL."
+#define PS_ERRORTEXT_psImageIO_FILENAME_INVALID "Could not open file,'%s'.\nCFITSIO Error: %s"
+#define PS_ERRORTEXT_psImageIO_EXTNAME_INVALID "Could not find HDU with extension name '%s' in file %s.\nCFITSIO Error: %s"
+#define PS_ERRORTEXT_psImageIO_EXTNUM_INVALID "Could not find HDU #%d in file %s.\nCFITSIO Error: %s"
+#define PS_ERRORTEXT_psImageIO_DATATYPE_UNKNOWN "Could not determine image data type for file %s.\nCFITSIO Error: %s"
+#define PS_ERRORTEXT_psImageIO_IMAGE_DIM_UNKNOWN "Could not determine image dimensions for file %s.\nCFITSIO Error: %s"
+#define PS_ERRORTEXT_psImageIO_IMAGE_SIZE_UNKNOWN "Could not determine image size for file %s.\nCFITSIO Error: %s"
+#define PS_ERRORTEXT_psImageIO_IMAGE_DIMENSION_UNSUPPORTED "Image number of dimensions, %d, is not valid.  Only two or three dimensions supported for FITS I/O."
+#define PS_ERRORTEXT_psImageIO_FITS_TYPE_UNSUPPORTED "FITS image type, BITPIX=%d, in file %s is not supported."
+#define PS_ERRORTEXT_psImageIO_READ_FAILED "Reading from FITS file %s failed.\nCFITSIO Error: %s"
+#define PS_ERRORTEXT_psImageIO_TYPE_UNSUPPORTED "Input psImage type, %s, is not supported."
+#define PS_ERRORTEXT_psImageIO_WRITE_EXTNUM_INVALID "Specified extension number, %d, must not exceed number of HDUs, %d, by more than one."
+#define PS_ERRORTEXT_psImageIO_FILENAME_CREATE_FAILED "Could not create file,'%s'.\nCFITSIO Error: %s"
+#define PS_ERRORTEXT_psImageIO_CREATE_EXTENSION_FAILED "Could not create EXTNAME keyword for file,'%s'.\nCFITSIO Error: %s"
+#define PS_ERRORTEXT_psImageIO_CREATE_HDU_FAILED "Could not create HDU for writing psImage in file,'%s'.\nCFITSIO Error: %s"
+#define PS_ERRORTEXT_psImageIO_WRITE_FAILED "Could not write psImage data to file,'%s'.\nCFITSIO Error: %s"
+#define PS_ERRORTEXT_psImageManip_MAXMIN "Specified min value, %g, can not be greater than the specified max value, %g."
+#define PS_ERRORTEXT_psImageManip_MAXMIN_REAL "Specified real-portion of min value, %g, can not be greater than the real-portion of max value, %g."
+#define PS_ERRORTEXT_psImageManip_MAXMIN_IMAG "Specified imaginary-portion of min value, %g, can not be greater than the imaginary-portion of max value, %g."
+#define PS_ERRORTEXT_psImageManip_OPERATION_NULL "Operation can not be NULL."
+#define PS_ERRORTEXT_psImageManip_OVERLAY_TYPE_MISMATCH "Input overlay psImage type, %s, must match input psImage type, %s."
+#define PS_ERRORTEXT_psImageManip_CLIP_VALUE_INVALID "Specified %s value, %g%+gi, is not the the range of input psImage's valid pixel values (%s), i.e. [%g:%g]."
+#define PS_ERRORTEXT_psImageManip_OVERLAY_OPERATOR_INVALID "Specified operation, '%s', is not supported."
+#define PS_ERRORTEXT_psImageManip_SCALE_NOT_POSITIVE "Specified scale value, %d, must be a positive value."
+#define PS_ERRORTEXT_psImageManip_INTERPOLATION_MODE_UNSUPPORTED "Specified interpolation mode, %d, is unsupported."
+#define PS_ERRORTEXT_psImageConvolve_SHIFT_NULL "Specified shift vectors can not be NULL."
+#define PS_ERRORTEXT_psImageConvolve_KERNEL_NULL "Specified psKernel can not be NULL."
+#define PS_ERRORTEXT_psImageConvolve_SHIFT_TYPE_MISMATCH "Input t-, x-, and y-shift vector types (%s/%s/%s) must match."
+#define PS_ERRORTEXT_psImageConvolve_FFT_FAILED "Failed to perform a fourier transform of input image."
+#define PS_ERRORTEXT_psImageConvolve_KERNEL_FFT_FAILED "Failed to perform a fourier transform of kernel."
+#define PS_ERRORTEXT_psImageConvolve_KERNEL_TOO_LARGE "Specified psKernel size, %dx%d, can not be larger than input psImage size, %dx%d."
+#define PS_ERRORTEXT_psImage_COEFF_NULL "Polynomial coefficients cannot be NULL."
+#define PS_ERRORTEXT_psImageManip_TRANSFORM_NULL "Specified input transform can not be NULL"
+//~End
+
+#endif
Index: /tags/ipp-1-X/bug123/psLib/src/image/psImageExtraction.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/image/psImageExtraction.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/image/psImageExtraction.c	(revision 22331)
@@ -0,0 +1,812 @@
+/** @file  psImageExtraction.c
+ *
+ *  @brief Contains basic image extraction operations, as specified in the 
+ *         PSLIB SDRS sections "Image Pixel Extractions" and "Image Structure
+ *         Manipulation".
+ *
+ *  @ingroup Image
+ *
+ *  @author Robert DeSonia, MHPCC
+ *
+ *  @version $Revision: 1.35 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-04-08 17:58:57 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ *
+ */
+
+#include <string.h>
+
+#include "psMemory.h"
+#include "psImageExtraction.h"
+#include "psError.h"
+
+#include "psImageErrors.h"
+
+psImage* imageSubset(psImage* out,
+                     psImage* image,
+                     psS32 col0,
+                     psS32 row0,
+                     psS32 col1,
+                     psS32 row1)
+{
+    psU32 elementSize;          // size of image element in bytes
+    psU32 inputColOffset;       // offset in bytes to first subset pixel in input row
+
+    if (image == NULL || image->data.V == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psImage_IMAGE_NULL);
+        return NULL;
+    }
+
+    if (image->type.dimen != PS_DIMEN_IMAGE) {
+        psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                PS_ERRORTEXT_psImage_NOT_AN_IMAGE);
+        return NULL;
+    }
+
+    if (col1 < 1) {
+        col1 = image->numCols + col1;
+    }
+    if (row1 < 1) {
+        row1 = image->numRows + row1;
+    }
+
+    if (    col1 <= col0 ||
+            row1 <= row0 ||
+            col0 >= image->numCols ||
+            row0 >= image->numRows ||
+            col1 > image->numCols ||
+            row1 > image->numRows ) {
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true,
+                PS_ERRORTEXT_psImage_SUBSET_RANGE_INVALID,
+                col0, col1-1, row0, row1-1,
+                image->numCols-1, image->numRows-1);
+        return NULL;
+    }
+    psS32 numRows = row1-row0;
+    psS32 numCols = col1-col0;
+
+    elementSize = PSELEMTYPE_SIZEOF(image->type.type);
+
+    if (image->parent != NULL) { // if this is a child, we need to start working with parent.
+        col0 += image->col0;
+        col1 += image->col0;
+        row0 += image->row0;
+        row1 += image->row0;
+        image = (psImage*)image->parent;
+    }
+
+    // increment the raw data buffer before freeing anything in the 'out'
+    psPtr rawData = psMemIncrRefCounter(image->rawDataBuffer);
+
+    if (out != NULL) {
+        // if a child, need to orphan (disassociate from parent) first
+        if (out->parent != NULL) {
+            psArrayRemove(out->parent->children,out); // remove from parent's knowledge
+            out->parent = NULL; // break link to parent
+        }
+
+        psFree(out->rawDataBuffer); // free the previous data reference
+    } else {
+        out = psAlloc(sizeof(psImage));
+        out->data.V = NULL;
+    }
+
+    out->data.V = psRealloc(out->data.V,sizeof(psPtr)*numRows); // resize row pointer array
+    *(psType*)&out->type = image->type;
+    *(psU32*)&out->numCols = numCols;
+    *(psU32*)&out->numRows = numRows;
+    *(psS32*)&out->row0 = row0;
+    *(psS32*)&out->col0 = col0;
+    out->parent = image;
+    out->children = NULL;
+    out->rawDataBuffer = rawData;
+
+    // set the new psImage's deallocator to the same as the input image
+    psMemSetDeallocator(out,psMemGetDeallocator(image));
+
+    inputColOffset = elementSize * col0;
+    for (psS32 row = 0; row < numRows; row++) {
+        out->data.V[row] = image->data.U8[row0 + row] + inputColOffset;
+    }
+
+    // add output image as a child of the input image.
+    psS32 n = 0;
+    psArray* children = image->children;
+    if (children == NULL) {
+        children = psArrayAlloc(16); // start with a reasonable size for growth
+    } else if (children->nalloc == children->n) { // full?
+        n = children->n;
+        children = psArrayRealloc(children,n*2); // double the array size
+    } else {
+        n = children->n;
+    }
+    children->data[n] = out;
+    children->n = n+1;
+    image->children = children; // push back any change (esp. if children==NULL before)
+
+    return (out);
+}
+
+psImage* psImageSubset(psImage* image,
+                       psS32 col0,
+                       psS32 row0,
+                       psS32 col1,
+                       psS32 row1)
+{
+    return imageSubset(NULL,image,col0,row0,col1,row1);
+}
+
+psImage* psImageSubsection(psImage* image,
+                           const char* section)
+{
+    psS32 col0;
+    psS32 col1;
+    psS32 row0;
+    psS32 row1;
+
+    // section should be of the form '[col0:col1,row0:row1]'
+    if (section == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psImage_SUBSECTION_NULL);
+        return NULL;
+    }
+
+    if (sscanf(section,"[%d:%d,%d:%d]",&col0,&col1,&row0,&row1) < 4) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psImage_SUBSECTION_INVALID,
+                section);
+        return NULL;
+    }
+
+    if (col0 > col1 || row0 > row1) {
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true,
+                PS_ERRORTEXT_psImage_SUBSET_RANGE_MALFORMED,
+                col0,col1,row0,row1);
+        return NULL;
+    }
+
+    return imageSubset(NULL,image,col0,row0,col1+1,row1+1);
+}
+
+psImage* psImageTrim(psImage* image, psS32 col0, psS32 row0, psS32 col1, psS32 row1)
+{
+    if (image == NULL || image->data.V == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psImage_IMAGE_NULL);
+        return NULL;
+    }
+
+    if (image->parent != NULL) {
+        return imageSubset(image,
+                           (psImage*)image->parent,
+                           col0+image->col0,
+                           row0+image->row0,
+                           col1+image->col0,
+                           row1+image->row0);
+    }
+
+    if (col1 < 1) {
+        col1 += image->numCols;
+    }
+
+    if (row1 < 1) {
+        row1 += image->numRows;
+    }
+
+    if (    col0 < 0 ||
+            row0 < 0 ||
+            col1 > image->numCols ||
+            row1 > image->numRows ||
+            col0 >= col1 ||
+            row0 >= row1 ) {
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true,
+                PS_ERRORTEXT_psImage_SUBSET_RANGE_INVALID,
+                col0, col1-1, row0, row1-1,
+                image->numCols-1, image->numRows-1);
+        psFree(image);
+        return NULL;
+    }
+
+    psImageFreeChildren(image);
+
+    psU32 elementSize = PSELEMTYPE_SIZEOF(image->type.type);
+    psU32 numCols = col1-col0;
+    psU32 numRows = row1-row0;
+    psU32 rowSize = elementSize*numCols;
+    psU32 colOffset = elementSize * col0;
+    psU8* imageData = image->rawDataBuffer;
+    for (psS32 row = row0; row < row1; row++) {
+        memmove(imageData,image->data.U8[row] + colOffset,rowSize);
+        imageData += rowSize;
+    }
+
+    *(psU32*)&image->numRows = numRows;
+    *(psU32*)&image->numCols = numCols;
+
+    // XXX: should I really resize the buffers?
+    image->data.V = psRealloc(image->data.V,sizeof(psPtr)*numRows);
+    image->rawDataBuffer = psRealloc(image->rawDataBuffer,rowSize*numRows);
+
+    image->data.V[0] = image->rawDataBuffer;
+    for (psS32 r = 1; r < numRows; r++) {
+        image->data.U8[r] = image->data.U8[r-1] + rowSize;
+    }
+
+    return (image);
+}
+
+psVector* psImageSlice(psVector* out,
+                       psVector* slicePositions,
+                       const psImage* restrict in,
+                       const psImage* restrict mask,
+                       psU32 maskVal,
+                       psS32 col0,
+                       psS32 row0,
+                       psS32 col1,
+                       psS32 row1,
+                       psImageCutDirection direction,
+                       const psStats* stats)
+{
+    double statVal;
+    psStats* myStats;
+    psElemType type;
+    psS32 inRows;
+    psS32 inCols;
+    psS32 delta = 1;
+    psF64* outData;
+
+    if (in == NULL || in->data.V == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psImage_IMAGE_NULL);
+        psFree(out);
+        return NULL;
+    }
+
+    if (col1 < 1) {
+        col1 += in->numCols;
+    }
+
+    if (row1 < 1) {
+        row1 += in->numRows;
+    }
+
+    if (    col0 < 0 ||
+            row0 < 0 ||
+            col1 > in->numCols ||
+            row1 > in->numRows ||
+            col0 >= col1 ||
+            row0 >= row1) {
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true,
+                PS_ERRORTEXT_psImage_SUBSET_RANGE_INVALID,
+                col0, col1, row0, row1,
+                in->numCols, in->numRows);
+        psFree(out);
+        return NULL;
+    }
+
+    type = in->type.type;
+    inRows = in->numRows;
+    inCols = in->numCols;
+
+    if (direction == PS_CUT_X_NEG || direction == PS_CUT_Y_NEG) {
+        delta = -1;
+    }
+
+    if (mask != NULL) {
+        if (inRows != mask->numRows || inCols != mask->numCols) {
+            psError(PS_ERR_BAD_PARAMETER_VALUE, true,
+                    PS_ERRORTEXT_psImage_IMAGE_MASK_SIZE,
+                    mask->numCols,mask->numRows,
+                    inCols, inRows);
+            psFree(out);
+            return NULL;
+        }
+        if (mask->type.type != PS_TYPE_MASK) {
+            char* typeStr;
+            PS_TYPE_NAME(typeStr,mask->type.type);
+            psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                    PS_ERRORTEXT_psImage_IMAGE_MASK_TYPE,
+                    typeStr, PS_TYPE_MASK_NAME);
+            psFree(out);
+            return NULL;
+        }
+    }
+
+    if (stats == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psImage_STAT_NULL);
+        psFree(out);
+        return NULL;
+    }
+
+    // verify that the stats struct specifies a
+    // single stats operation
+    if (p_psGetStatValue(stats, &statVal) == false) {
+        psError(PS_ERR_BAD_PARAMETER_VALUE, false,
+                PS_ERRORTEXT_psImage_BAD_STAT,stats->options);
+        psFree(out);
+        return NULL;
+    }
+    // since stats input is const, I need to
+    // create a 'scratch' stats struct
+    myStats = psAlloc(sizeof(psStats));
+    *myStats = *stats;
+
+    psS32 numCols = col1-col0;
+    psS32 numRows = row1-row0;
+
+    if (direction == PS_CUT_X_POS || direction == PS_CUT_X_NEG) {
+        psVector* imgVec = psVectorAlloc(numRows, type);
+        psVector* maskVec = NULL;
+        psMaskType* maskData = NULL;
+        psU32* outPosition = NULL;
+
+        // recycle output to make a proper sized/type output structure
+        // n.b. type is double as that is the type given for all stats is
+        // psStats.
+        out = psVectorRecycle(out, numCols, PS_TYPE_F64);
+        if (slicePositions != NULL) {
+            slicePositions = psVectorRecycle(slicePositions, numCols, PS_TYPE_U32);
+            outPosition = slicePositions->data.U32;
+        }
+        outData = out->data.F64;
+        if (delta < 0) {
+            outData += numCols - 1;
+            if (outPosition != NULL) {
+                outPosition += numCols - 1;
+            }
+        }
+
+        if (mask != NULL) {
+            maskVec = psVectorAlloc(numRows, mask->type.type);
+        }
+        #define PSIMAGE_CUT_VERTICAL(TYPE) \
+    case PS_TYPE_##TYPE: { \
+            psMaskType* maskVecData = NULL; \
+            for (psS32 c=col0;c<col1;c++) { \
+                ps##TYPE *imgData = in->data.TYPE[row0] + c; \
+                ps##TYPE *imgVecData = imgVec->data.TYPE; \
+                if (maskVec != NULL) { \
+                    maskVecData = maskVec->data.U8; \
+                    maskData = (psMaskType* )(mask->data.U8[row0]) + c; \
+                } \
+                for (psS32 r=row0;r<row1;r++) { \
+                    *(imgVecData++) = *imgData; \
+                    imgData += inCols; \
+                    if (maskVecData != NULL) { \
+                        *(maskVecData++) = *maskData; \
+                        maskData += inCols; \
+                    } \
+                } \
+                myStats = psVectorStats(myStats,imgVec,NULL,maskVec,maskVal); \
+                (void)p_psGetStatValue(myStats,&statVal); \
+                *outData = statVal; \
+                if (outPosition != NULL) { \
+                    *outPosition = c; \
+                    outPosition += delta; \
+                } \
+                outData += delta; \
+            } \
+            break; \
+        }
+
+        switch (type) {
+            PSIMAGE_CUT_VERTICAL(U8);  // Not a requirement
+            PSIMAGE_CUT_VERTICAL(U16);
+            PSIMAGE_CUT_VERTICAL(U32); // Not a requirement
+            PSIMAGE_CUT_VERTICAL(U64); // Not a requirement
+            PSIMAGE_CUT_VERTICAL(S8);
+            PSIMAGE_CUT_VERTICAL(S16); // Not a requirement
+            PSIMAGE_CUT_VERTICAL(S32); // Not a requirement
+            PSIMAGE_CUT_VERTICAL(S64); // Not a requirement
+            PSIMAGE_CUT_VERTICAL(F32);
+            PSIMAGE_CUT_VERTICAL(F64);
+            PSIMAGE_CUT_VERTICAL(C32); // Not a requirement
+            PSIMAGE_CUT_VERTICAL(C64); // Not a requirement
+        default: {
+                char* typeStr;
+                PS_TYPE_NAME(typeStr,type);
+                psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                        PS_ERRORTEXT_psImage_IMAGE_TYPE_UNSUPPORTED,
+                        typeStr);
+                psFree(out);
+                out = NULL;
+            }
+        }
+        psFree(imgVec);
+        psFree(maskVec);
+    } else if (direction == PS_CUT_Y_POS || direction == PS_CUT_Y_NEG) {
+        // Cut in Y direction
+        psVector* imgVec = NULL;
+        psVector* maskVec = NULL;
+        psS32 elementSize = PSELEMTYPE_SIZEOF(type);
+        psU32* outPosition = NULL;
+
+        // fill in psVector to fake out the statistics functions.
+        imgVec = psAlloc(sizeof(psVector));
+        imgVec->type = in->type;
+        imgVec->n = *(int*)&imgVec->nalloc = numCols;
+        if (mask != NULL) {
+            maskVec = psAlloc(sizeof(psVector));
+            maskVec->type = mask->type;
+            maskVec->n = *(int*)&maskVec->nalloc = numCols;
+        }
+        // recycle output to make a proper sized/type output structure
+        // n.b. type is double as that is the type given for all stats in
+        // psStats.
+        out = psVectorRecycle(out, numRows, PS_TYPE_F64);
+        if (slicePositions != NULL) {
+            slicePositions = psVectorRecycle(slicePositions, numRows, PS_TYPE_U32);
+            outPosition = slicePositions->data.U32;
+        }
+        outData = out->data.F64;
+        if (delta < 0) {
+            outData += numRows-1;
+            if (outPosition != NULL) {
+                outPosition += numRows-1;
+            }
+        }
+
+        for (psS32 r = row0; r < row1; r++) {
+            // point the vector struct to the
+            // data to calculate the stats
+            imgVec->data.U8 = (psPtr )(in->data.U8[r] + col0 * elementSize);
+            if (maskVec != NULL) {
+                maskVec->data.U8 = (psPtr )(mask->data.U8[r] + col0 * sizeof(psMaskType));
+            }
+            myStats = psVectorStats(myStats, imgVec, NULL, maskVec, maskVal);
+            (void)p_psGetStatValue(myStats, &statVal);  // we know it works cause we tested it above
+            *outData = statVal;
+            if (outPosition != NULL) {
+                *outPosition = r;
+                outPosition += delta;
+
+            }
+            outData += delta;
+        }
+        psFree(imgVec);
+        psFree(maskVec);
+    } else { // don't know what the direction flag is
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true,
+                PS_ERRORTEXT_psImage_SLICE_DIRECTION_INVALID,
+                direction);
+        psFree(out);
+        out = NULL;
+    }
+
+    psFree(myStats);
+
+    return out;
+}
+
+psVector* psImageCut(psVector* out,
+                     psVector* cutCols,
+                     psVector* cutRows,
+                     const psImage* in,
+                     const psImage* restrict mask,
+                     psU32 maskVal,
+                     float startCol,
+                     float startRow,
+                     float endCol,
+                     float endRow,
+                     psU32 nSamples,
+                     psImageInterpolateMode mode)
+{
+    if (in == NULL || in->data.V == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psImage_IMAGE_NULL);
+        psFree(out);
+        return NULL;
+    }
+    psS32 numCols = in->numCols;
+    psS32 numRows = in->numRows;
+
+    if (nSamples < 2) {
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true,
+                PS_ERRORTEXT_psImage_nSamples_TOOSMALL,
+                nSamples);
+        psFree(out);
+        return NULL;
+    }
+
+    if (startCol < 0 || startCol >= numCols ||
+            startRow < 0 || startRow >= numRows ||
+            endCol < 0 || endCol >= numCols ||
+            endRow < 0 || endRow >= numRows) {
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true,
+                PS_ERRORTEXT_psImage_LINE_NOT_IN_IMAGE,
+                startCol,startRow,endCol,endRow,
+                numCols-1,numRows-1);
+        psFree(out);
+        return NULL;
+    }
+
+    if (mode < PS_INTERPOLATE_FLAT || mode >= PS_INTERPOLATE_NUM_MODES) {
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true,
+                PS_ERRORTEXT_psImageManip_INTERPOLATION_MODE_UNSUPPORTED,
+                mode);
+        psFree(out);
+        return NULL;
+    }
+
+    if (mask != NULL) {
+        if (numRows != mask->numRows || numCols != mask->numCols) {
+            psError(PS_ERR_BAD_PARAMETER_VALUE, true,
+                    PS_ERRORTEXT_psImage_IMAGE_MASK_SIZE,
+                    mask->numCols,mask->numRows,
+                    numCols-1, numRows);
+            psFree(out);
+            return NULL;
+        }
+        if (mask->type.type != PS_TYPE_MASK) {
+            char* typeStr;
+            PS_TYPE_NAME(typeStr,mask->type.type);
+            psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                    PS_ERRORTEXT_psImage_IMAGE_MASK_TYPE,
+                    typeStr, PS_TYPE_MASK_NAME);
+            psFree(out);
+            return NULL;
+        }
+    }
+
+    //resize the vectors for the coordinate output
+    psF32* cutColsData = NULL;
+    psF32* cutRowsData = NULL;
+    if (cutCols != NULL) {
+        cutCols = psVectorRecycle(cutCols, nSamples, PS_TYPE_F32);
+        cutColsData = cutCols->data.F32;
+    }
+    if (cutRows != NULL) {
+        cutRows = psVectorRecycle(cutRows, nSamples, PS_TYPE_F32);
+        cutRowsData = cutRows->data.F32;
+    }
+
+    out = psVectorRecycle(out, nSamples, in->type.type);
+
+    float dX = (endCol - startCol) / (float)(nSamples-1);
+    float dY = (endRow - startRow) / (float)(nSamples-1);
+
+    #define LINEAR_CUT_CASE(TYPE) \
+case PS_TYPE_##TYPE: { \
+        ps##TYPE* outData = out->data.TYPE; \
+        for (psS32 i = 0; i < nSamples; i++) { \
+            float x = startCol + (float)i*dX; \
+            float y = startRow + (float)i*dY; \
+            /* store off the location of the sample. */ \
+            if (cutColsData != NULL) { \
+                cutColsData[i] = x; \
+            } \
+            if (cutRowsData != NULL) { \
+                cutRowsData[i] = y; \
+            } \
+            outData[i] = psImagePixelInterpolate(in,x,y,mask,maskVal,0,mode); \
+        } \
+    } \
+    break;
+
+
+    switch (in->type.type) {
+        LINEAR_CUT_CASE(U8);
+        LINEAR_CUT_CASE(U16);
+        LINEAR_CUT_CASE(U32);
+        LINEAR_CUT_CASE(U64);
+        LINEAR_CUT_CASE(S8);
+        LINEAR_CUT_CASE(S16);
+        LINEAR_CUT_CASE(S32);
+        LINEAR_CUT_CASE(S64);
+        LINEAR_CUT_CASE(F32);
+        LINEAR_CUT_CASE(F64);
+        LINEAR_CUT_CASE(C32);
+        LINEAR_CUT_CASE(C64);
+
+    default: {
+            char* typeStr;
+            PS_TYPE_NAME(typeStr,in->type.type);
+            psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                    PS_ERRORTEXT_psImage_IMAGE_TYPE_UNSUPPORTED,
+                    typeStr);
+            psFree(out);
+            out = NULL;
+        }
+    }
+
+    return out;
+}
+
+psVector* psImageRadialCut(psVector* out,
+                           const psImage* in,
+                           const psImage* restrict mask,
+                           psU32 maskVal,
+                           float centerCol,
+                           float centerRow,
+                           const psVector* radii,
+                           const psStats* stats)
+{
+    double statVal;
+
+    /* check the parameters */
+
+    if (in == NULL || in->data.V == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psImage_IMAGE_NULL);
+        psFree(out);
+        return NULL;
+    }
+    psS32 numCols = in->numCols;
+    psS32 numRows = in->numRows;
+
+    if (mask != NULL) {
+        if (numRows != mask->numRows || numCols != mask->numCols) {
+            psError(PS_ERR_BAD_PARAMETER_SIZE, true,
+                    PS_ERRORTEXT_psImage_IMAGE_MASK_SIZE,
+                    mask->numCols,mask->numRows,
+                    numCols, numRows);
+            psFree(out);
+            return NULL;
+        }
+        if (mask->type.type != PS_TYPE_MASK) {
+            char* typeStr;
+            PS_TYPE_NAME(typeStr,mask->type.type);
+            psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                    PS_ERRORTEXT_psImage_IMAGE_MASK_TYPE,
+                    typeStr, PS_TYPE_MASK_NAME);
+            psFree(out);
+            return NULL;
+        }
+    }
+
+    if (centerCol < 0 || centerCol >= numCols ||
+            centerRow < 0 || centerRow >= numRows) {
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true,
+                PS_ERRORTEXT_psImage_CENTER_NOT_IN_IMAGE,
+                centerCol, centerRow,
+                numCols-1, numRows-1);
+        psFree(out);
+        return NULL;
+    }
+
+    if (radii == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psImage_RADII_VECTOR_NULL);
+        psFree(out);
+        return NULL;
+    }
+
+    if (radii->n < 2) {
+        psError(PS_ERR_BAD_PARAMETER_SIZE, true,
+                PS_ERRORTEXT_psImage_RADII_VECTOR_TOOSMALL,
+                radii->n);
+        psFree(out);
+        return NULL;
+    }
+
+    if (stats == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psImage_STAT_NULL);
+        psFree(out);
+        return NULL;
+    }
+
+    // verify that the stats struct specifies a
+    // single stats operation
+    if (p_psGetStatValue(stats, &statVal) == false) {
+        psError(PS_ERR_BAD_PARAMETER_VALUE, false,
+                PS_ERRORTEXT_psImage_BAD_STAT,
+                stats->options);
+        psFree(out);
+        return NULL;
+    }
+
+    /* completed checking the parameters */
+
+    // size the output vector to proper size.
+    psS32 numOut = radii->n - 1;
+    out = psVectorRecycle(out, numOut, PS_TYPE_F64);
+    psF64* outData = out->data.F64;
+
+    psVector* rSqVec = psVectorCopy(NULL, radii, PS_TYPE_F32);
+    psF32* rSq = rSqVec->data.F32;
+
+    psS32 startRow = centerRow - rSq[numOut];
+    psS32 endRow = centerRow + rSq[numOut];
+    psS32 startCol = centerCol - rSq[numOut];
+    psS32 endCol = centerCol + rSq[numOut];
+
+    if (startRow < 0) {
+        startRow = 0;
+    }
+
+    if (startCol < 0) {
+        startCol = 0;
+    }
+
+    if (endRow >= numRows) {
+        endRow = numRows - 1;
+    }
+
+    if (endCol >= numCols) {
+        endCol = numCols - 1;
+    }
+
+    // Square the radii data
+    for (psS32 d = 0; d <= numOut; d++) {
+        rSq[d] *= rSq[d];
+    }
+
+    // create temporary vectors for the data binning step
+    psVector** buffer = psAlloc(sizeof(psVector*)*numOut);
+    psVector** bufferMask = psAlloc(sizeof(psVector*)*numOut);
+    for (psS32 lcv = 0; lcv < numOut; lcv++) {
+        // n.b. alloc enough for the data by making the vectors slightly larger
+        // than the area of the region of interest.
+        buffer[lcv] = psVectorAlloc(1+4*(rSq[lcv+1]-rSq[lcv]),
+                                    in->type.type);
+        buffer[lcv]->n = 0;
+
+        bufferMask[lcv] = NULL;
+        if (mask != NULL) {
+            bufferMask[lcv] = psVectorAlloc(1+4*(rSq[lcv+1]-rSq[lcv]),
+                                            PS_TYPE_MASK);
+            bufferMask[lcv]->n = 0;
+        }
+    }
+
+    float dX;
+    float dY;
+    float dist;
+    for (psS32 row=startRow; row <= endRow; row++) {
+        psF32* inRow = in->data.F32[row];
+        psMaskType* maskRow = NULL;
+        if (mask != NULL) {
+            maskRow = mask->data.PS_TYPE_MASK_DATA[row];
+        }
+        for (psS32 col=startCol; col <= endCol; col++) {
+            dX = centerCol - (float)col - 0.5f;
+            dY = centerRow - (float)row - 0.5f;
+            dist = dX*dX+dY*dY;
+            for (psS32 r = 0; r < numOut; r++) {
+                if (rSq[r] < dist && dist < rSq[r+1]) {
+                    psS32 n = buffer[r]->n;
+                    if (n == buffer[r]->nalloc) { // in case buffers already full, expand
+                        buffer[r] = psVectorRealloc(buffer[r], n*2);
+                        if (bufferMask[r] != NULL) {
+                            bufferMask[r] = psVectorRealloc(bufferMask[r], n*2);
+                        }
+                    }
+
+                    buffer[r]->data.F32[n] = inRow[col];
+                    buffer[r]->n = n+1;
+
+                    if (maskRow != NULL) {
+                        bufferMask[r]->data.PS_TYPE_MASK_DATA[n] = maskRow[col];
+                        bufferMask[r]->n = n+1;
+                    }
+
+                    break;
+                }
+            }
+        }
+    }
+
+    psStats* myStats = psAlloc(sizeof(psStats));
+    *myStats = *stats;
+
+    for (psS32 r = 0; r < numOut; r++) {
+        myStats = psVectorStats(myStats,buffer[r], NULL, bufferMask[r],maskVal);
+        (void)p_psGetStatValue(myStats,&statVal);
+        outData[r] = statVal;
+    }
+
+    psFree(myStats);
+
+    for (psS32 lcv = 0; lcv < numOut; lcv++) {
+        psFree(buffer[lcv]);
+        psFree(bufferMask[lcv]);
+    }
+    psFree(buffer);
+    psFree(bufferMask);
+    psFree(rSqVec);
+    return out;
+}
Index: /tags/ipp-1-X/bug123/psLib/src/image/psImageExtraction.h
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/image/psImageExtraction.h	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/image/psImageExtraction.h	(revision 22331)
@@ -0,0 +1,198 @@
+
+/** @file  psImageExtraction.h
+*
+*  @brief Contains basic image extraction operations, as specified in the 
+*         PSLIB SDRS sections "Image Pixel Extractions" and "Image Structure
+*         Manipulation".
+*
+*  @ingroup Image
+*
+*  @author Robert DeSonia, MHPCC
+*
+*  @version $Revision: 1.21 $ $Name: not supported by cvs2svn $
+*  @date $Date: 2005-02-17 19:26:24 $
+*
+*  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+*/
+
+#ifndef PSIMAGEEXTRACTION_H
+#define PSIMAGEEXTRACTION_H
+
+#include "psImage.h"
+#include "psVector.h"
+#include "psStats.h"
+
+/// @addtogroup Image
+/// @{
+
+/* Cut direction flag.  Used with psImageCut function.
+ */
+typedef enum {
+    PS_CUT_X_POS,                      ///< Cut in the x dimension from left to right
+    PS_CUT_X_NEG,                      ///< Cut in the x dimension from rigth to left
+    PS_CUT_Y_POS,                      ///< Cut in the y dimension from bottom up
+    PS_CUT_Y_NEG,                      ///< Cut in the y dimension from top down.
+} psImageCutDirection;
+
+/** Create a subimage of the specified area.
+ *
+ *  Extracts a subimage starting at (col0,row0) to (col1-1,row1-1).  Note: 
+ *  the column col1 and row row1 are NOT included in the resulting subimage.
+ *  In the event that x1 or y1 are non-positive, they shall be interpreted as
+ *  being relative to the size of the parent image in that dimension.
+ *
+ *  If the entire specified subimage is not contained within the parent 
+ *  image, an error results and the return value will be NULL.
+ *
+ *  The resulting psImage does not create a copy of the underlying image 
+ *  data.  Future changes in the parent may be reflecting in the child
+ *  subimage and vis versa.
+ *
+ *  @return psImage* : Pointer to psImage.
+ *
+ */
+psImage* psImageSubset(
+    psImage* image,                    ///< Parent image.
+    psS32 col0,                          ///< starting column of subimage
+    psS32 row0,                          ///< starting row of subimage
+    psS32 col1,                          ///< exclusive end column of subimage.
+    psS32 row1                           ///< exclusive end row of subimage
+);
+
+/** Create a subimage of the specified area.
+ *
+ * Uses psLib memory allocation functions to create an image based on a larger
+ * one.
+ *
+ * @return psImage* : Pointer to psImage.
+ *
+ */
+psImage* psImageSubsection(
+    psImage* image,                    ///< Parent image.
+    const char* section                ///< Subsection in the form '[x1:x2,y1:y2]'
+);
+
+/** Trim an image
+ *
+ *  Trim the specified image in-place, which involves shuffling the pixels 
+ *  around in memory.  The pixels in the region [col0:col1,row0:row1] shall consist
+ *  the output image.  The column col1 and row row1 are NOT included in the range.
+ *  In the event that x1 or y1 are non-positive, they shall be interpreted as
+ *  being relative to the size of the parent image in that dimension.
+ *
+ *  If the entire specified subimage is not contained within the parent 
+ *  image, an error results and the return value will be NULL.
+ *
+ *  N.B. If the input psImage is a child of another psImage, no pixel data 
+ *  will be trimmed, rather it equivalent to calling psImageSubset.  If the input 
+ *  psImage is, however, a parent psImage, any children will be obliterated,
+ *  i.e., freed from memory.
+ *
+ *  @return psImage*  trimmed image result
+ */
+psImage* psImageTrim(
+    psImage* image,                    ///< image to trim
+    psS32 col0,                          ///< column of trim region's left boundary
+    psS32 row0,                          ///< row of trim region's lower boundary
+    psS32 col1,                          ///< column of trim region's right boundary
+    psS32 row1                           ///< row of trim region's upper boundary
+);
+
+/** Extract pixels from rectlinear region to a vector (array of floats).
+ *
+ *  The output vector contains either col1-col0 or row1-row0 elements, based 
+ *  on the value of the direction: e.g., if direction is PS_CUT_X_POS, there 
+ *  are col1-col0 elements. The region to be  sliced  is defined by the 
+ *  lower-left corner, (col0,row0), and the upper-right corner, (col1,row1). 
+ *  Note that the row and column of the  upper right-hand corner  are NOT 
+ *  included in the region. In the event that col1 or row1 are negative, they
+ *  shall be interpreted as being relative to the size of the parent image in 
+ *  that dimension. The input region is collapsed in the direction perpendicular 
+ *  to that specified by direction, and each element of the output vectors is 
+ *  derived from the statistics of the pixels at that direction coordinate. The
+ *  statistic used to derive the output vector value is specified by stats. 
+ *  If mask is non-NULL, pixels for which the corresponding mask pixel 
+ *  matches maskVal are excluded from operations. If coords is not NULL, the 
+ *  calculated coordinates along the slice are returned in this vector. Only 
+ *  one of the statistics choices may be specified, otherwise the function 
+ *  must return an error.
+ *
+ *  This function is defined for the following types: psS8, psU16, psF32, psF64.
+ *
+ * @return psVector    the resulting vector
+ */
+psVector* psImageSlice(
+    psVector* out,                     ///< psVector to recycle, or NULL.
+    psVector* slicePositions,
+    ///< If not NULL, it is populated with the coordinate in the slice dimension
+    ///< coorsponding to the output vector's value of the same position in the
+    ///< vector.  This vector maybe resized and retyped as appropriate.
+    const psImage* input,              ///< the input image in which to perform the slice
+    const psImage* mask,               ///< the mask for the input image.
+    psU32 maskVal,                     ///< the mask value to apply to the mask
+    psS32 col0,                        ///< the leftmost column of the slice region
+    psS32 row0,                        ///< the bottommost row of the slice region
+    psS32 col1,                        ///< exclusive end column of the slice region
+    psS32 row1,                        ///< exclusive end row of the slice region
+    psImageCutDirection direction,     ///< the slice dimension and direction
+    const psStats* stats               ///< the statistic to perform in slice operation
+);
+
+/** Extract pixels from an image along a line to a vector (array of floats).
+ *
+ *  The vector (xs,ys) - (xe,ye) forms the basis of the output vector. Pixels 
+ *  are considered in a rectangular region of width dw about this vector. The 
+ *  input region is collapsed in the perpendicular direction, and each element 
+ *  of the output vector represents pixel-sized boxes, where the value is 
+ *  derived from the statistics of the pixels interpolated along the 
+ *  perpendicular direction. The specific algorithm which must be used is 
+ *  described in the PSLib ADD (PSDC-430-006). The statistic used to derive 
+ *  the output vector value is specified by stats. Only one of the statistics 
+ *  choices may be specified, otherwise the function must return an error. 
+ *  This function must be defined for the following types: psS8, psU16, psF32, 
+ *  psF64.
+ *
+ *  @return psVector    resulting vector
+ */
+psVector* psImageCut(
+    psVector* out,                     ///< psVector to recycle, or NULL.
+    psVector* cutCols,                 ///< if not NULL, the calculated column values along the slice (output)
+    psVector* cutRows,                 ///< if not NULL, the calculated row values along the slice (output)
+    const psImage* input,              ///< the input image in which to perform the cut
+    const psImage* mask,               ///< the mask for the input image.
+    psU32 maskVal,                     ///< the mask value to apply to the mask
+    float startCol,                    ///< the column of the start of the cut line
+    float startRow,                    ///< the row of the start of the cut line
+    float endCol,                      ///< the column of the end of the cut line
+    float endRow,                      ///< the row of the end of the cut line
+    psU32 nSamples,                    ///< the number of samples along the cut
+    psImageInterpolateMode mode        ///< the interpolation method to use
+);
+
+/** Extract radial region data to a vector. A vector is constructed where each
+ *  vector elements is derived from the statistics of the pixels which land 
+ *  within one of a sequence of radii. The radii are centered on the image 
+ *  pixel coordinate x,y, and are defined by the sequence of values in the
+ *  vector radii. The specific algorithm which must be used is described in 
+ *  the PSLib ADD (PSDC-430-006). The statistic used to derive the output 
+ *  vector value is specified by stats. Only one of the statistics choices 
+ *  may be specified, otherwise the function must return an error. This 
+ *  function must be defined for the following types: psS8, psU16, psF32, 
+ *  psF64.
+ *
+ *  @return psVector    resulting vector
+ */
+psVector* psImageRadialCut(
+    psVector* out,                     ///< psVector to recycle, or NULL.
+    const psImage* input,              ///< the input image in which to perform the cut
+    const psImage* mask,               ///< the mask for the input image.
+    psU32 maskVal,                     ///< the mask value to apply to the mask
+    float centerCol,                   ///< the column of the center of the cut circle
+    float centerRow,                   ///< the row of the center of the cut circle
+    const psVector* radii,             ///< the radii of the cut circle
+    const psStats* stats               ///< the statistic to perform in operation
+);
+
+/// @}
+
+#endif
Index: /tags/ipp-1-X/bug123/psLib/src/image/psImageFFT.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/image/psImageFFT.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/image/psImageFFT.c	(revision 22331)
@@ -0,0 +1,455 @@
+/** @file  psImageFFT.c
+ *
+ *  @brief Contains FFT transform related functions for psImage.
+ *
+ *  @author Robert DeSonia, MHPCC
+ *
+ *  @version $Revision: 1.11 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-04-15 00:12:08 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+#include <unistd.h>
+#include <string.h>
+#include <complex.h>
+#include <fftw3.h>
+
+#include "psImageFFT.h"
+#include "psError.h"
+#include "psMemory.h"
+#include "psLogMsg.h"
+#include "psImageExtraction.h"
+#include "psImageIO.h"
+
+#include "psImageErrors.h"
+
+#define PS_FFTW_PLAN_RIGOR FFTW_ESTIMATE
+
+static psBool p_fftwWisdomImported = false;
+
+psImage* psImageFFT(psImage* out, const psImage* in, psFFTFlags direction)
+{
+    psU32 numCols;
+    psU32 numRows;
+    psElemType type;
+    fftwf_plan plan;
+
+    /* got good image data? */
+    if (in == NULL) {
+        psFree(out);
+        return NULL;
+    }
+
+    if ( ((direction & PS_FFT_FORWARD) != 0) ) {
+        if ((direction & PS_FFT_REVERSE) != 0) {
+            psError(PS_ERR_BAD_PARAMETER_VALUE, true,
+                    PS_ERRORTEXT_psImageFFT_FORWARD_REVERSE);
+            psFree(out);
+            return NULL;
+        }
+        if ((direction & PS_FFT_REAL_RESULT) != 0) {
+            psError(PS_ERR_BAD_PARAMETER_VALUE, true,
+                    PS_ERRORTEXT_psImageFFT_REAL_FORWARD_NOTSUPPORTED);
+            psFree(out);
+            return NULL;
+        }
+    } else if ((direction & PS_FFT_REVERSE) == 0) {
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true,
+                PS_ERRORTEXT_psImageFFT_NO_DIRECTION_OPTION);
+        psFree(out);
+        return NULL;
+    }
+
+    type = in->type.type;
+
+    /* make sure the system-level wisdom information is imported. */
+    if (!p_fftwWisdomImported) {
+        fftwf_import_system_wisdom();
+        p_fftwWisdomImported = true;
+    }
+
+    numRows = in->numRows;
+    numCols = in->numCols;
+
+    // n.b. FFTW can perform a in-place transform at the same rate or faster than out-of-place.
+    psS32 sign = ((direction & PS_FFT_FORWARD) != 0) ? FFTW_FORWARD : FFTW_BACKWARD;
+
+    fftwf_complex* outBuffer = fftwf_malloc(numRows*numCols*sizeof(fftwf_complex));
+    p_psImageCopyToRawBuffer(outBuffer, in, PS_TYPE_C32);
+
+    plan = fftwf_plan_dft_2d(numRows, numCols,
+                             outBuffer,
+                             outBuffer,
+                             sign,
+                             PS_FFTW_PLAN_RIGOR);
+
+    /* check if a plan exists now -- if not, it is a real problem at this point */
+    if (plan == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                PS_ERRORTEXT_psImageFFT_FFTW_PLAN_NULL);
+        psFree(out);
+        return NULL;
+    }
+
+    /* finally, call FFTW with the plan made above */
+    fftwf_execute(plan);
+
+    fftwf_destroy_plan(plan);
+
+    if (direction & PS_FFT_REAL_RESULT) {
+        // n.b., we do this instead of using fftwf_plan_dft_c2r because that
+        // plan requires a half-image, which would require a image reordering
+        // that is not as simple as performing a normal complex transform and
+        // then taking the real part of the result.  If performance here
+        // becomes an issue, the use of fftwf_plan_dft_r2c should be considered
+        // as well as fftwf_plan_dft_c2r.
+        out = psImageRecycle(out,numCols,numRows,PS_TYPE_F32);
+        int index = 0;
+        for (int row=0; row < numRows; row++) {
+            psF32* outRow = out->data.F32[row];
+            for (int col=0; col < numCols; col++) {
+                outRow[col] = crealf(outBuffer[index++]); // take just the real part
+            }
+        }
+    } else {
+        out = psImageRecycle(out,numCols,numRows,PS_TYPE_C32);
+        int index = 0;
+        for (int row=0; row < numRows; row++) {
+            psC32* outRow = out->data.C32[row];
+            for (int col=0; col < numCols; col++) {
+                outRow[col] = outBuffer[index++]; // take just the real part
+            }
+        }
+        //        memcpy(out->rawDataBuffer, outBuffer, numRows*numCols*sizeof(fftwf_complex));
+    }
+
+    fftwf_free(outBuffer);
+
+    return out;
+
+}
+
+psImage* psImageReal(psImage* out, const psImage* in)
+{
+    psElemType type;
+    psU32 numCols;
+    psU32 numRows;
+
+    if (in == NULL) {
+        psFree(out);
+        return NULL;
+    }
+
+    type = in->type.type;
+    numCols = in->numCols;
+    numRows = in->numRows;
+
+    /* if not a complex number, this is logically just a copy then */
+    if (!PS_IS_PSELEMTYPE_COMPLEX(type)) {
+        return psImageCopy(out, in, type);
+    }
+
+    if (type == PS_TYPE_C32) {
+        psF32* outRow;
+        psC32* inRow;
+
+        out = psImageRecycle(out, numCols, numRows, PS_TYPE_F32);
+        for (psU32 row = 0; row < numRows; row++) {
+            outRow = out->data.F32[row];
+            inRow = in->data.C32[row];
+
+            for (psU32 col = 0; col < numCols; col++) {
+                outRow[col] = crealf(inRow[col]);
+            }
+        }
+    } else if (type == PS_TYPE_C64) {
+        psF64* outRow;
+        psC64* inRow;
+
+        out = psImageRecycle(out, numCols, numRows, PS_TYPE_F64);
+        for (psU32 row = 0; row < numRows; row++) {
+            outRow = out->data.F64[row];
+            inRow = in->data.C64[row];
+
+            for (psU32 col = 0; col < numCols; col++) {
+                outRow[col] = creal(inRow[col]);
+            }
+        }
+    } else {
+        char* typeStr;
+        PS_TYPE_NAME(typeStr,type);
+        psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                PS_ERRORTEXT_psImage_IMAGE_TYPE_UNSUPPORTED,
+                typeStr);
+
+        psFree(out);
+        return NULL;
+    }
+
+    return out;
+}
+
+psImage* psImageImaginary(psImage* out, const psImage* in)
+{
+    psElemType type;
+    psU32 numCols;
+    psU32 numRows;
+
+    if (in == NULL) {
+        psFree(out);
+        return NULL;
+    }
+
+    type = in->type.type;
+    numCols = in->numCols;
+    numRows = in->numRows;
+
+    /* if not a complex image type, this is logically just zeroed image of same size */
+    if (!PS_IS_PSELEMTYPE_COMPLEX(type)) {
+        out = psImageRecycle(out, numCols, numRows, type);
+        memset(out->data.V[0], 0, PSELEMTYPE_SIZEOF(type) * numCols * numRows);
+        return out;
+    }
+
+    if (type == PS_TYPE_C32) {
+        psF32* outRow;
+        psC32* inRow;
+
+        out = psImageRecycle(out, numCols, numRows, PS_TYPE_F32);
+        for (psU32 row = 0; row < numRows; row++) {
+            outRow = out->data.F32[row];
+            inRow = in->data.C32[row];
+
+            for (psU32 col = 0; col < numCols; col++) {
+                outRow[col] = cimagf(inRow[col]);
+            }
+        }
+    } else if (type == PS_TYPE_C64) {
+        psF64* outRow;
+        psC64* inRow;
+
+        out = psImageRecycle(out, numCols, numRows, PS_TYPE_F64);
+        for (psU32 row = 0; row < numRows; row++) {
+            outRow = out->data.F64[row];
+            inRow = in->data.C64[row];
+
+            for (psU32 col = 0; col < numCols; col++) {
+                outRow[col] = cimag(inRow[col]);
+            }
+        }
+    } else {
+        char* typeStr;
+        PS_TYPE_NAME(typeStr,type);
+        psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                PS_ERRORTEXT_psImage_IMAGE_TYPE_UNSUPPORTED,
+                typeStr);
+        psFree(out);
+        return NULL;
+    }
+
+    return out;
+}
+
+psImage* psImageComplex(psImage* out, const psImage* real, const psImage* imag)
+{
+    psElemType type;
+    psU32 numCols;
+    psU32 numRows;
+
+    if (real == NULL || imag == NULL) {
+        psFree(out);
+        return NULL;
+    }
+
+    type = real->type.type;
+    numCols = real->numCols;
+    numRows = real->numRows;
+
+    if (imag->type.type != type) {
+        char* typeStrReal;
+        char* typeStrImag;
+        PS_TYPE_NAME(typeStrReal,type);
+        PS_TYPE_NAME(typeStrImag,imag->type.type);
+        psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                PS_ERRORTEXT_psImageFFT_REAL_IMAG_TYPE_MISMATCH,
+                typeStrReal,typeStrImag);
+        psFree(out);
+        return NULL;
+    }
+
+    if (imag->numCols != numCols || imag->numRows != numRows) {
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true,
+                PS_ERRORTEXT_psImageFFT_REAL_IMAG_SIZE_MISMATCH,
+                numCols, numRows, imag->numCols, imag->numRows);
+        psFree(out);
+        return NULL;
+    }
+
+    if (type == PS_TYPE_F32) {
+        psC32* outRow;
+        psF32* realRow;
+        psF32* imagRow;
+
+        out = psImageRecycle(out, numCols, numRows, PS_TYPE_C32);
+
+        for (psU32 row = 0; row < numRows; row++) {
+            outRow = out->data.C32[row];
+            realRow = real->data.F32[row];
+            imagRow = imag->data.F32[row];
+
+            for (psU32 col = 0; col < numCols; col++) {
+                outRow[col] = realRow[col] + I * imagRow[col];
+            }
+        }
+    } else if (type == PS_TYPE_F64) {
+        psC64* outRow;
+        psF64* realRow;
+        psF64* imagRow;
+
+        out = psImageRecycle(out, numCols, numRows, PS_TYPE_C64);
+        for (psU32 row = 0; row < numRows; row++) {
+            outRow = out->data.C64[row];
+            realRow = real->data.F64[row];
+            imagRow = imag->data.F64[row];
+
+            for (psU32 col = 0; col < numCols; col++) {
+                outRow[col] = realRow[col] + I * imagRow[col];
+            }
+        }
+    } else {
+        char* typeStr;
+        PS_TYPE_NAME(typeStr,type);
+        psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                PS_ERRORTEXT_psImageFFT_NONREAL_NOTSUPPORTED,
+                typeStr);
+        psFree(out);
+        return NULL;
+    }
+
+
+    return out;
+}
+
+psImage* psImageConjugate(psImage* out, const psImage* in)
+{
+    psElemType type;
+    psU32 numCols;
+    psU32 numRows;
+
+    if (in == NULL) {
+        psFree(out);
+        return NULL;
+    }
+
+    type = in->type.type;
+    numCols = in->numCols;
+    numRows = in->numRows;
+
+    /* if not a complex image, this is logically just a image copy */
+    if (!PS_IS_PSELEMTYPE_COMPLEX(type)) {
+        return psImageCopy(out, in, type);
+    }
+
+    if (type == PS_TYPE_C32) {
+        psC32* outRow;
+        psC32* inRow;
+
+        out = psImageRecycle(out, numCols, numRows, PS_TYPE_C32);
+        for (psU32 row = 0; row < numRows; row++) {
+            outRow = out->data.C32[row];
+            inRow = in->data.C32[row];
+
+            for (psU32 col = 0; col < numCols; col++) {
+                outRow[col] = crealf(inRow[col]) - I * cimagf(inRow[col]);
+            }
+        }
+    } else if (type == PS_TYPE_C64) {
+        psC64* outRow;
+        psC64* inRow;
+
+        out = psImageRecycle(out, numCols, numRows, PS_TYPE_C64);
+        for (psU32 row = 0; row < numRows; row++) {
+            outRow = out->data.C64[row];
+            inRow = in->data.C64[row];
+
+            for (psU32 col = 0; col < numCols; col++) {
+                outRow[col] = creal(inRow[col]) - I * cimag(inRow[col]);
+            }
+        }
+    } else {
+        char* typeStr;
+        PS_TYPE_NAME(typeStr,type);
+        psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                PS_ERRORTEXT_psImageFFT_NONCOMPLEX_NOTSUPPORTED,
+                typeStr);
+        psFree(out);
+        return NULL;
+    }
+
+    return out;
+}
+
+psImage* psImagePowerSpectrum(psImage* out, const psImage* in)
+{
+    psElemType type;
+    psU32 numCols;
+    psU32 numRows;
+
+    if (in == NULL) {
+        psFree(out);
+        return NULL;
+    }
+
+    type = in->type.type;
+    numCols = in->numCols;
+    numRows = in->numRows;
+
+    if (type == PS_TYPE_C32) {
+        psF32* outRow;
+        psC32* inRow;
+        psF32 real;
+        psF32 imag;
+        psF32 numElementsSquared = numCols * numCols * numRows * numRows;
+
+        out = psImageRecycle(out, numCols, numRows, PS_TYPE_F32);
+        for (psU32 row = 0; row < numRows; row++) {
+            outRow = out->data.F32[row];
+            inRow = in->data.C32[row];
+
+            for (psU32 col = 0; col < numCols; col++) {
+                real = crealf(inRow[col]);
+                imag = cimagf(inRow[col]);
+                outRow[col] = (real * real + imag * imag) / numElementsSquared;
+            }
+        }
+    } else if (type == PS_TYPE_C64) {
+        psF64* outRow;
+        psC64* inRow;
+        psF64 real;
+        psF64 imag;
+        psF64 numElementsSquared = numCols * numCols * numRows * numRows;
+
+        out = psImageRecycle(out, numCols, numRows, PS_TYPE_F64);
+        for (psU32 row = 0; row < numRows; row++) {
+            outRow = out->data.F64[row];
+            inRow = in->data.C64[row];
+
+            for (psU32 col = 0; col < numCols; col++) {
+                real = creal(inRow[col]);
+                imag = cimag(inRow[col]);
+                outRow[col] = (real * real + imag * imag) / numElementsSquared;
+            }
+        }
+    } else {
+        char* typeStr;
+        PS_TYPE_NAME(typeStr,type);
+        psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                PS_ERRORTEXT_psImageFFT_NONCOMPLEX_NOTSUPPORTED,
+                typeStr);
+        psFree(out);
+        return NULL;
+    }
+
+    return out;
+
+}
Index: /tags/ipp-1-X/bug123/psLib/src/image/psImageFFT.h
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/image/psImageFFT.h	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/image/psImageFFT.h	(revision 22331)
@@ -0,0 +1,87 @@
+/** @file  psImageFFT.h
+ *
+ *  @brief Contains FFT transform related functions for psImage
+ *
+ *  @ingroup Transform
+ *
+ *  @author Robert DeSonia, MHPCC
+ *
+ *  @version $Revision: 1.3 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-02-17 19:26:24 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+
+#ifndef PS_IMAGE_FFT_H
+#define PS_IMAGE_FFT_H
+
+#include "psImage.h"
+#include "psVectorFFT.h"               // for psFFTFlags
+
+/// @addtogroup Transform
+/// @{
+
+/** Forward and reverse FFT calculations.
+ *
+ *  This takes as input the image of interest (in) and the direction 
+ *  (direction), which is specified by an enumerated type psFftDirection.
+ *  The input image may be of type psF32 or psC32, the result is always 
+ *  psC32. If the input vector is psF32, the direction must be forward. 
+ *  
+ *  @return psImage* the FFT transformation result
+ */
+psImage* psImageFFT(
+    psImage* out,                      ///< a psImage to recycle.  If NULL, a new psImage is made.
+    const psImage* in,                 ///< the psImage to apply transform to
+    psFFTFlags direction               ///< the direction of the transform
+);
+
+/** extract the real portion of a complex image
+ * 
+ *  @return psImage*   real portion of the input image.
+ */
+psImage* psImageReal(
+    psImage* out,                      ///< a psImage to recycle.  If NULL, a new psImage is made.
+    const psImage* in                  ///< the psImage to extract real portion from
+);
+
+/** extract the imaginary portion of a complex image
+ * 
+ *  @return psImage*   imaginary portion of the input image.
+ */
+psImage* psImageImaginary(
+    psImage* out,                      ///< a psImage to recycle.  If NULL, a new psImage is made.
+    const psImage* in                  ///< the psImage to extract imaginary portion from
+);
+
+/** creates a complex image from separate real and imaginary plane images
+ * 
+ *  @return psImage*   resulting complex image
+ */
+psImage* psImageComplex(
+    psImage* out,                      ///< a psImage to recycle.  If NULL, a new psImage is made.
+    const psImage* real,               ///< the real plane image
+    const psImage* imag                ///< the imaginary plane image
+);
+
+/** computes the complex conjugate of an image
+ * 
+ *  @return psImage*   the complex conjugate of the 'in' image
+ */
+psImage* psImageConjugate(
+    psImage* out,                      ///< a psImage to recycle.  If NULL, a new psImage is made.
+    const psImage* in                  ///< the psImage to compute conjugate of
+);
+
+/** computes the power spectrum of an image
+ * 
+ *  @return psImage*   the power spectrum of the 'in' image
+ */
+psImage* psImagePowerSpectrum(
+    psImage* out,                       ///< a psImage to recycle.  If NULL, a new psImage is made.
+    const psImage* in                   ///< the psImage to power spectrum of
+);
+
+/// @}
+
+#endif
Index: /tags/ipp-1-X/bug123/psLib/src/image/psImageIO.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/image/psImageIO.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/image/psImageIO.c	(revision 22331)
@@ -0,0 +1,420 @@
+/** @file  psImageIO.c
+ *
+ *  @brief Contains image I/O routines.
+ *
+ *  This file defines the file input/output functions for the psImage structure.
+ *
+ *  @author Robert DeSonia, MHPCC
+ *
+ *  @version $Revision: 1.18 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-02-17 19:26:24 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+
+#include <fitsio.h>
+#include <unistd.h>
+
+#include "psImageIO.h"
+#include "psError.h"
+#include "psMemory.h"
+#include "psLogMsg.h"
+
+#include "psImageErrors.h"
+
+psImage* psImageReadSection(psImage* output,
+                            psS32 col,
+                            psS32 row,
+                            psS32 numCols,
+                            psS32 numRows,
+                            psS32 z,
+                            char *extname,
+                            psS32 extnum,
+                            char *filename)
+{
+    fitsfile *fptr = NULL;      /* Pointer to the FITS file */
+    psS32 status = 0;           /* CFITSIO file vars */
+    psS32 nAxis = 0;
+    psS32 anynull = 0;
+    psS32 bitPix = 0;           /* Pixel type */
+    long nAxes[3];
+    long firstPixel[3];         /* lower-left corner of image subset */
+    long lastPixel[3];          /* upper-right corner of image subset */
+    long increment[3];          /* increment for image subset */
+    char fitsErr[80] = "";      /* CFITSIO error message string */
+    psS32 hduType = IMAGE_HDU;
+    psS32 fitsDatatype = 0;
+    psS32 datatype = 0;
+
+    psLogMsg(__func__,PS_LOG_WARN, "psImageReadSection is deprecated.  Consider using psFitsReadImage instead.");
+
+    if (filename == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psImageIO_FILENAME_NULL);
+        psFree(output);
+        return NULL;
+    }
+
+    /* Open the FITS file */
+    (void)fits_open_file(&fptr, filename, READONLY, &status);
+    if (fptr == NULL || status != 0) {
+        fits_get_errstatus(status, fitsErr);
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true,
+                PS_ERRORTEXT_psImageIO_FILENAME_INVALID,
+                filename, fitsErr);
+        psFree(output);
+        return NULL;
+    }
+
+    /* find the specified extension */
+    if (extname != NULL) {
+        if (fits_movnam_hdu(fptr, hduType, extname, 0, &status) != 0) {
+            fits_get_errstatus(status, fitsErr);
+            status = 0;
+            (void)fits_close_file(fptr, &status);
+            psError(PS_ERR_LOCATION_INVALID, true,
+                    PS_ERRORTEXT_psImageIO_EXTNAME_INVALID,
+                    extname, filename, fitsErr);
+            psFree(output);
+            return NULL;
+        }
+    } else {
+        if (fits_movabs_hdu(fptr, extnum + 1, &hduType, &status) != 0) {
+            fits_get_errstatus(status, fitsErr);
+            status = 0;
+            (void)fits_close_file(fptr, &status);
+            psError(PS_ERR_LOCATION_INVALID, true,
+                    PS_ERRORTEXT_psImageIO_EXTNUM_INVALID,
+                    extnum, filename, fitsErr);
+            psFree(output);
+            return NULL;
+        }
+    }
+
+    /* Get the data type 'bitPix' from the FITS image */
+    if (fits_get_img_equivtype(fptr, &bitPix, &status) != 0) {
+        fits_get_errstatus(status, fitsErr);
+        status = 0;
+        (void)fits_close_file(fptr, &status);
+        psError(PS_ERR_IO, true,
+                PS_ERRORTEXT_psImageIO_DATATYPE_UNKNOWN,
+                filename, fitsErr);
+        psFree(output);
+        return NULL;
+    }
+
+    /* Get the dimensions 'nAxis' from the FITS image */
+    if (fits_get_img_dim(fptr, &nAxis, &status) != 0) {
+        (void)fits_get_errstatus(status, fitsErr);
+        status = 0;
+        (void)fits_close_file(fptr, &status);
+        psError(PS_ERR_IO, true,
+                PS_ERRORTEXT_psImageIO_IMAGE_DIM_UNKNOWN,
+                filename, fitsErr);
+        psFree(output);
+        return NULL;
+    }
+
+    /* Validate the number of axis */
+    if ((nAxis < 2) || (nAxis > 3)) {
+        status = 0;
+        (void)fits_close_file(fptr, &status);
+        psError(PS_ERR_IO, true,
+                PS_ERRORTEXT_psImageIO_IMAGE_DIMENSION_UNSUPPORTED,
+                nAxis);
+        psFree(output);
+        return NULL;
+    }
+
+    /* Get the Image size from the FITS file */
+    if (fits_get_img_size(fptr, nAxis, nAxes, &status) != 0) {
+        (void)fits_get_errstatus(status, fitsErr);
+        status = 0;
+        (void)fits_close_file(fptr, &status);
+        psError(PS_ERR_IO, true,
+                PS_ERRORTEXT_psImageIO_IMAGE_SIZE_UNKNOWN,
+                filename, fitsErr);
+        psFree(output);
+        return NULL;
+    }
+
+    if (numCols < 1) {
+        numCols += nAxes[0] - col;
+    }
+    if (numRows < 1) {
+        numRows += nAxes[1] - row;
+    }
+
+    firstPixel[0] = col + 1;
+    firstPixel[1] = row + 1;
+    firstPixel[2] = z + 1;
+
+    lastPixel[0] = firstPixel[0] + numCols - 1;
+    lastPixel[1] = firstPixel[1] + numRows - 1;
+    lastPixel[2] = z + 1;
+
+    increment[0] = 1;
+    increment[1] = 1;
+    increment[2] = 1;
+
+    switch (bitPix) {
+    case BYTE_IMG:
+        datatype = PS_TYPE_U8;
+        fitsDatatype = TBYTE;
+        break;
+    case SBYTE_IMG:
+        datatype = PS_TYPE_S8;
+        fitsDatatype = TSBYTE;
+        break;
+    case USHORT_IMG:
+        datatype = PS_TYPE_U16;
+        fitsDatatype = TUSHORT;
+        break;
+    case SHORT_IMG:
+        datatype = PS_TYPE_S16;
+        fitsDatatype = TSHORT;
+        break;
+    case ULONG_IMG:
+        datatype = PS_TYPE_U32;
+        fitsDatatype = TUINT;
+        break;
+    case LONG_IMG:
+        datatype = PS_TYPE_S32;
+        fitsDatatype = TINT;
+        break;
+    case LONGLONG_IMG:
+        datatype = PS_TYPE_S64;
+        fitsDatatype = TLONGLONG;
+        break;
+    case FLOAT_IMG:
+        datatype = PS_TYPE_F32;
+        fitsDatatype = TFLOAT;
+        break;
+    case DOUBLE_IMG:
+        datatype = PS_TYPE_F64;
+        fitsDatatype = TDOUBLE;
+        break;
+    default:
+        psError(PS_ERR_IO, true,
+                PS_ERRORTEXT_psImageIO_FITS_TYPE_UNSUPPORTED,
+                bitPix, filename);
+        psFree(output);
+        return NULL;
+    }
+    output = psImageRecycle(output, numCols, numRows, datatype);
+    if (fits_read_subset(fptr, fitsDatatype, firstPixel, lastPixel, increment,
+                         NULL, output->data.V[0], &anynull, &status) != 0) {
+        psFree(output);
+        (void)fits_get_errstatus(status, fitsErr);
+        status = 0;
+        (void)fits_close_file(fptr, &status);
+        psError(PS_ERR_IO, true,
+                PS_ERRORTEXT_psImageIO_READ_FAILED,
+                filename, fitsErr);
+        return NULL;
+    }
+
+    (void)fits_close_file(fptr, &status);
+
+    return output;
+}
+
+psBool psImageWriteSection(psImage* input,
+                           psS32 col0,
+                           psS32 row0,
+                           psS32 z,
+                           char *extname,
+                           psS32 extnum,
+                           char *filename)
+{
+    psS32 numCols = 0;
+    psS32 numRows = 0;
+
+    psS32 status = 0;             /* CFITSIO status */
+    fitsfile *fptr = NULL;      /* pointer to the FITS file */
+    long nAxes[3];              /* Image axis vars */
+    long firstPixel[3];         /* First Pixel to read */
+    long lastPixel[3];          /* Last Pixel to read */
+    char fitsErr[80];           /* FITSIO message string */
+    psS32 datatype = 0;           /* the datatype of the image */
+    psS32 bitPix = 0;             /* FITS bitPix value */
+    psS32 hduType = IMAGE_HDU;    /* the HDU type (image,table, etc.) */
+    double bscale = 1.0;
+    double bzero = 0.0;
+    psBool createNewHDU = false;
+
+    psLogMsg(__func__,PS_LOG_WARN, "psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.");
+
+    /* need a valid image to write */
+    if (input == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psImage_IMAGE_NULL);
+        return false;
+    }
+
+    numRows = input->numRows;
+    numCols = input->numCols;
+
+    switch (input->type.type) {
+    case PS_TYPE_U8:
+        bitPix = BYTE_IMG;
+        datatype = TBYTE;
+        break;
+    case PS_TYPE_S8:
+        bitPix = BYTE_IMG;
+        bzero = INT8_MIN;
+        datatype = TSBYTE;
+        break;
+    case PS_TYPE_U16:
+        bitPix = SHORT_IMG;
+        bzero = -1.0f * INT16_MIN;
+        datatype = TUSHORT;
+        break;
+    case PS_TYPE_S16:
+        bitPix = SHORT_IMG;
+        datatype = TSHORT;
+        break;
+    case PS_TYPE_U32:
+        bitPix = LONG_IMG;
+        bzero = -1.0f * INT32_MIN;
+        datatype = TUINT;
+        break;
+    case PS_TYPE_S32:
+        bitPix = LONG_IMG;
+        datatype = TINT;
+        break;
+    case PS_TYPE_F32:
+        bitPix = FLOAT_IMG;
+        datatype = TFLOAT;
+        break;
+    case PS_TYPE_F64:
+        bitPix = DOUBLE_IMG;
+        datatype = TDOUBLE;
+        break;
+    default: {
+            char* typeStr;
+            PS_TYPE_NAME(typeStr,input->type.type);
+            psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                    PS_ERRORTEXT_psImageIO_TYPE_UNSUPPORTED,
+                    typeStr);
+            return false;
+        }
+    }
+
+    /* Open the FITS file */
+    if (access(filename, F_OK) == 0) {     // file
+        // exists
+        (void)fits_open_file(&fptr, filename, READWRITE, &status);
+        if (fptr == NULL || status != 0) {
+            fits_get_errstatus(status, fitsErr);
+            psError(PS_ERR_BAD_PARAMETER_VALUE, true,
+                    PS_ERRORTEXT_psImageIO_FILENAME_INVALID,
+                    filename, fitsErr);
+            return false;
+        }
+
+        /* find the specified extension */
+        if (extname != NULL) {
+            if (fits_movnam_hdu(fptr, hduType, extname, 0, &status) != 0) {
+                fits_get_errstatus(status, fitsErr);
+                status = 0;
+                (void)fits_close_file(fptr, &status);
+                psError(PS_ERR_LOCATION_INVALID, true,
+                        PS_ERRORTEXT_psImageIO_EXTNAME_INVALID,
+                        extname, filename, fitsErr);
+                return false;
+            }
+        } else {
+            psS32 numHDUs = 0;
+
+            fits_get_num_hdus(fptr, &numHDUs, &status);
+            if (numHDUs < extnum) {
+                status = 0;
+                (void)fits_close_file(fptr, &status);
+                psError(PS_ERR_LOCATION_INVALID, true,
+                        PS_ERRORTEXT_psImageIO_WRITE_EXTNUM_INVALID,
+                        extnum, numHDUs);
+                return false;
+            } else if (numHDUs == extnum) {
+                createNewHDU = true;
+            } else if (fits_movabs_hdu(fptr, extnum + 1, &hduType, &status) != 0) {
+                fits_get_errstatus(status, fitsErr);
+                status = 0;
+                (void)fits_close_file(fptr, &status);
+                psError(PS_ERR_LOCATION_INVALID, true,
+                        PS_ERRORTEXT_psImageIO_EXTNUM_INVALID,
+                        extnum, filename, fitsErr);
+                return false;
+            }
+        }
+
+    } else {
+        // file does not exist
+
+        (void)fits_create_file(&fptr, filename, &status);
+        if (fptr == NULL || status != 0) {
+            fits_get_errstatus(status, fitsErr);
+            psError(PS_ERR_IO, true,
+                    PS_ERRORTEXT_psImageIO_FILENAME_CREATE_FAILED,
+                    filename, fitsErr);
+            return false;
+        }
+        createNewHDU = true;
+    }
+
+    if (createNewHDU) {
+        /* create the mandatory image keywords */
+        nAxes[0] = col0 + numCols;
+        nAxes[1] = row0 + numRows;
+        nAxes[2] = z + 1;
+        if (fits_create_img(fptr, bitPix, 3, nAxes, &status) != 0) {
+            (void)fits_get_errstatus(status, fitsErr);
+            status = 0;
+            (void)fits_close_file(fptr, &status);
+            psError(PS_ERR_IO, true,
+                    PS_ERRORTEXT_psImageIO_CREATE_HDU_FAILED,
+                    filename, fitsErr);
+            return false;
+        }
+        // set the bscale/bzero
+        fits_write_key_dbl(fptr, "BZERO", bzero, 12, "Pixel Value Offset", &status);
+        fits_write_key_dbl(fptr, "BSCALE", bscale, 12, "Pixel Value Scale", &status);
+        fits_set_bscale(fptr, bscale, bzero, &status);
+
+        if (extname != NULL) {
+            /* create the extension for the Primary HDU */
+            if (fits_write_key_str(fptr, "EXTNAME", extname, "Extension Name", &status) != 0) {
+                (void)fits_get_errstatus(status, fitsErr);
+                status = 0;
+                (void)fits_close_file(fptr, &status);
+                psError(PS_ERR_IO, true,
+                        PS_ERRORTEXT_psImageIO_CREATE_EXTENSION_FAILED,
+                        filename, fitsErr);
+                return false;
+            }
+        }
+    }
+
+    firstPixel[0] = col0 + 1;
+    firstPixel[1] = row0 + 1;
+    firstPixel[2] = z + 1;
+
+    lastPixel[0] = firstPixel[0] + numCols - 1;
+    lastPixel[1] = firstPixel[1] + numRows - 1;
+    lastPixel[2] = z + 1;
+
+    if (fits_write_subset(fptr, datatype, firstPixel, lastPixel, input->data.V[0], &status) != 0) {
+        (void)fits_get_errstatus(status, fitsErr);
+        status = 0;
+        (void)fits_close_file(fptr, &status);
+        psError(PS_ERR_IO, true,
+                PS_ERRORTEXT_psImageIO_WRITE_FAILED,
+                filename, fitsErr);
+        return false;
+    }
+
+    status = 0;
+    (void)fits_close_file(fptr, &status);
+
+    return true;
+}
Index: /tags/ipp-1-X/bug123/psLib/src/image/psImageIO.h
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/image/psImageIO.h	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/image/psImageIO.h	(revision 22331)
@@ -0,0 +1,96 @@
+
+/** @file  psImageIO.h
+ *
+ *  @brief Contains image input/output routines
+ *
+ *  This file defines the file input/output functions for the psImage structure.
+ *
+ *  @ingroup ImageIO
+ *
+ *  @author Robert DeSonia, MHPCC
+ *
+ *  @version $Revision: 1.9 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-02-17 19:26:24 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+#ifndef PS_IMAGEIO_H
+#define PS_IMAGEIO_H
+
+#include "psImage.h"
+
+/// @addtogroup ImageIO
+/// @{
+
+/** Read an image or subimage from a FITS file specified by a filename.
+ *
+ *  return psImage* The image read from the specified file.  NULL
+ *                          signifies that a problem had occured.
+ */
+psImage* psImageReadSection(
+    psImage* output,
+    /**< the output psImage to recycle, or NULL if new psImage desired */
+
+    psS32 col0,
+    /**< the column index of the origin to start reading */
+
+    psS32 row0,
+    /**< the row index of the origin to start reading */
+
+    psS32 numCols,
+    /**< the number of desired columns to read */
+
+    psS32 numRows,
+    /**< the number of desired rows to read */
+
+    psS32 z,
+    /**< the z index to read if file is organized as a 3D image cube. */
+
+    char *extname,
+    /**< the image extension to read (this should match the EXTNAME keyword in
+        *   the extension If NULL, the extnum parameter is to be used instead
+        */
+
+    psS32 extnum,
+    /**< the image extension to read (0=PHU, 1=first extension, etc.)  This is
+        *   only used if extname is NULL
+        */
+
+    char *filename
+    /**< the filename of the FITS image file to read */
+);
+
+/** Read an image or subimage from a FITS file specified by a filename.
+ *
+ *  return psBool         TRUE is successful, otherwise FALSE.
+ */
+psBool psImageWriteSection(
+    psImage* input,
+    /**< the psImage to write */
+
+    psS32 col0,
+    /**< the column index of the origin to start writing */
+
+    psS32 row0,
+    /**< the row index of the origin to start writing */
+
+    psS32 z,
+    /**< the z index to start writing */
+
+    char *extname,
+    /**< the image extension to write (this should match the EXTNAME keyword in
+    *   the extension If NULL, the extnum parameter is to be used instead
+    */
+
+    psS32 extnum,
+    /**< the image extension to write (0=PHU, 1=first extension, etc.)  This is
+    *   only used if extname is NULL.
+    */
+
+    char *filename
+    /**< the filename of the FITS image file to write */
+);
+
+/// @}
+
+#endif
Index: /tags/ipp-1-X/bug123/psLib/src/image/psImageManip.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/image/psImageManip.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/image/psImageManip.c	(revision 22331)
@@ -0,0 +1,1086 @@
+/** @file  psImageManip.c
+ *
+ *  @brief Contains basic image pixel and geometry manipulation operations, as
+ *         specified in the PSLIB SDRS sections "Image Pixel Manipulations" and
+ *         "Image Geometry Manipulations".
+ *
+ *  @ingroup Image
+ *
+ *  @author Robert DeSonia, MHPCC
+ *  @author Ross Harman, MHPCC
+ *
+ *  @version $Revision: 1.39 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-04-21 21:18:23 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+
+#include <math.h>                          // for isfinite(), etc.
+#include <stdlib.h>
+#include <string.h>                        // for memcpy, etc.
+
+#include "psImageManip.h"
+
+#include "psError.h"
+#include "psImage.h"
+#include "psStats.h"
+#include "psMemory.h"
+#include "psImageExtraction.h"
+#include "psConstants.h"
+#include "psImageErrors.h"
+#include "psCoord.h"
+
+psS32 psImageClip(psImage* input,
+                  psF64 min,
+                  psF64 vmin,
+                  psF64 max,
+                  psF64 vmax)
+{
+    psS32 numClipped = 0;
+    psU32 numRows;
+    psU32 numCols;
+
+    if (input == NULL) {
+        return 0;
+    }
+
+    if (max < min) {
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true,
+                PS_ERRORTEXT_psImageManip_MAXMIN,
+                (double)min,(double)max);
+        return 0;
+    }
+
+    numRows = input->numRows;
+    numCols = input->numCols;
+
+    switch (input->type.type) {
+
+        #define psImageClipCase(type) \
+    case PS_TYPE_##type: { \
+            if (vmin < PS_MIN_##type || vmin > PS_MAX_##type) { \
+                psError(PS_ERR_BAD_PARAMETER_VALUE, true, \
+                        PS_ERRORTEXT_psImage_PARAMETER_OUTOF_TYPERANGE, \
+                        "vmin",vmin, PS_TYPE_##type##_NAME, \
+                        (psF64)PS_MIN_##type,(psF64)PS_MAX_##type); \
+            } \
+            if (vmax > PS_MAX_##type || vmax < PS_MIN_##type) { \
+                psError(PS_ERR_BAD_PARAMETER_VALUE, true, \
+                        PS_ERRORTEXT_psImage_PARAMETER_OUTOF_TYPERANGE, \
+                        "vmax",vmax, PS_TYPE_##type##_NAME, \
+                        (psF64)PS_MIN_##type,(psF64)PS_MAX_##type); \
+            } \
+            for (psU32 row = 0;row<numRows;row++) { \
+                ps##type* inputRow = input->data.type[row]; \
+                for (psU32 col = 0; col < numCols; col++) { \
+                    if ((psF64)inputRow[col] < min) { \
+                        inputRow[col] = (ps##type)vmin; \
+                        numClipped++; \
+                    } else if ((psF64)inputRow[col] > max) { \
+                        inputRow[col] = (ps##type)vmax; \
+                        numClipped++; \
+                    } \
+                } \
+            } \
+        } \
+        break;
+
+        #define psImageClipCaseComplex(type,absfcn)\
+    case PS_TYPE_##type: { \
+            if (vmin < PS_MIN_##type || vmin > PS_MAX_##type) { \
+                psError(PS_ERR_BAD_PARAMETER_VALUE, true, \
+                        PS_ERRORTEXT_psImage_PARAMETER_OUTOF_TYPERANGE, \
+                        "vmin",vmin, PS_TYPE_##type##_NAME, \
+                        (psF64)PS_MIN_##type,(psF64)PS_MAX_##type); \
+            } \
+            if (vmax > PS_MAX_##type || vmax < PS_MIN_##type) { \
+                psError(PS_ERR_BAD_PARAMETER_VALUE, true, \
+                        PS_ERRORTEXT_psImage_PARAMETER_OUTOF_TYPERANGE, \
+                        "vmax",vmax, PS_TYPE_##type##_NAME, \
+                        (psF64)PS_MIN_##type,(psF64)PS_MAX_##type); \
+            } \
+            for (psU32 row = 0;row<numRows;row++) { \
+                ps##type* inputRow = input->data.type[row]; \
+                for (psU32 col = 0; col < numCols; col++) { \
+                    if (absfcn(inputRow[col]) < min) { \
+                        inputRow[col] = (ps##type)vmin; \
+                        numClipped++; \
+                    } else if (absfcn(inputRow[col]) > max) { \
+                        inputRow[col] = (ps##type)vmax; \
+                        numClipped++; \
+                    } \
+                } \
+            } \
+        } \
+        break;
+
+        psImageClipCase(S8)
+        psImageClipCase(S16)
+        psImageClipCase(S32)            // Not a requirement
+        psImageClipCase(S64)            // Not a requirement
+        psImageClipCase(U8)
+        psImageClipCase(U16)
+        psImageClipCase(U32)            // Not a requirement
+        psImageClipCase(U64)            // Not a requirement
+        psImageClipCase(F32)
+        psImageClipCase(F64)
+        psImageClipCaseComplex(C32, cabsf)
+        psImageClipCaseComplex(C64, cabs)
+
+    default: {
+            char* typeStr;
+            PS_TYPE_NAME(typeStr,input->type.type);
+            psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                    PS_ERRORTEXT_psImage_IMAGE_TYPE_UNSUPPORTED,
+                    typeStr);
+        }
+    }
+
+    return numClipped;
+}
+
+psS32 psImageClipNaN(psImage* input,
+                     psF64 value)
+{
+    psS32 numClipped = 0;
+    psU32 numRows;
+    psU32 numCols;
+
+    if (input == NULL) {
+        return 0;
+    }
+    numRows = input->numRows;
+    numCols = input->numCols;
+
+    switch (input->type.type) {
+
+        #define psImageClipNaNCase(type) \
+    case PS_TYPE_##type: \
+        for (psU32 row = 0;row<numRows;row++) { \
+            ps##type* inputRow = input->data.type[row]; \
+            for (psU32 col = 0; col < numCols; col++) { \
+                if (! isfinite(inputRow[col])) { \
+                    inputRow[col] = (ps##type)value; \
+                    numClipped++; \
+                } \
+            } \
+        } \
+        break;
+
+        psImageClipNaNCase(F32)
+        psImageClipNaNCase(F64)
+        psImageClipNaNCase(C32)
+        psImageClipNaNCase(C64)
+
+    default: {
+            char* typeStr;
+            PS_TYPE_NAME(typeStr,input->type.type);
+            psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                    PS_ERRORTEXT_psImage_IMAGE_TYPE_UNSUPPORTED,
+                    typeStr);
+        }
+    }
+
+    return numClipped;
+}
+
+psS32 psImageOverlaySection(psImage* image,
+                            const psImage* overlay,
+                            psS32 col0,
+                            psS32 row0,
+                            const char *op)
+{
+    psU32 imageNumRows;
+    psU32 imageNumCols;
+    psU32 overlayNumRows;
+    psU32 overlayNumCols;
+    psU32 imageRowLimit;
+    psU32 imageColLimit;
+    psElemType type;
+    psU32 pixelsOverlaid = 0;
+
+    if (image == NULL || overlay == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psImage_IMAGE_NULL);
+        return pixelsOverlaid;
+    }
+
+    if (op == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psImageManip_OPERATION_NULL);
+        return pixelsOverlaid;
+    }
+
+    type = image->type.type;
+
+    if (type != overlay->type.type) {
+        char* typeStr;
+        char* typeStrOverlay;
+        PS_TYPE_NAME(typeStr,type);
+        PS_TYPE_NAME(typeStrOverlay,overlay->type.type);
+        psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                PS_ERRORTEXT_psImageManip_OVERLAY_TYPE_MISMATCH,
+                typeStrOverlay, typeStr);
+        return pixelsOverlaid;
+    }
+
+    imageNumRows = image->numRows;
+    imageNumCols = image->numCols;
+    overlayNumRows = overlay->numRows;
+    overlayNumCols = overlay->numCols;
+    imageRowLimit = row0 + overlayNumRows;
+    imageColLimit = col0 + overlayNumCols;
+
+    /* check to see if overlay is within the input image */
+    if ( row0 < 0 ||
+            col0 < 0 ||
+            imageRowLimit > imageNumRows ||
+            imageColLimit > imageNumCols) {
+
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true,
+                PS_ERRORTEXT_psImage_SUBSET_RANGE_INVALID,
+                col0, imageColLimit, row0, imageRowLimit,
+                imageNumCols, imageNumRows);
+        return pixelsOverlaid;
+    }
+
+
+    #define psImageOverlayLoop(DATATYPE,OP) { \
+        for (int row=row0;row<imageRowLimit;row++) { \
+            ps##DATATYPE* imageRow = image->data.DATATYPE[row]; \
+            ps##DATATYPE* overlayRow = overlay->data.DATATYPE[row-row0]; \
+            for (int col=col0;col<imageColLimit;col++) { \
+                imageRow[col] OP overlayRow[col-col0]; \
+            } \
+        } \
+        pixelsOverlaid += (imageRowLimit - row0) * (imageColLimit - col0); \
+    }
+
+    #define psImageOverlayCase(DATATYPE) \
+case PS_TYPE_##DATATYPE: \
+    switch (*op) { \
+    case '+': \
+        psImageOverlayLoop(DATATYPE,+=); \
+        break; \
+    case '-': \
+        psImageOverlayLoop(DATATYPE,-=); \
+        break; \
+    case '*': \
+        psImageOverlayLoop(DATATYPE,*=); \
+        break; \
+    case '/': \
+        psImageOverlayLoop(DATATYPE,/=); \
+        break; \
+    case '=': \
+        psImageOverlayLoop(DATATYPE,=); \
+        break; \
+    default: \
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true, \
+                PS_ERRORTEXT_psImageManip_OVERLAY_OPERATOR_INVALID, \
+                op); \
+        return pixelsOverlaid; \
+    } \
+    break;
+
+    switch (type) {
+        psImageOverlayCase(U8);
+        psImageOverlayCase(U16);
+        psImageOverlayCase(U32);       // Not a requirement
+        psImageOverlayCase(U64);       // Not a requirement
+        psImageOverlayCase(S8);
+        psImageOverlayCase(S16);
+        psImageOverlayCase(S32);       // Not a requirement
+        psImageOverlayCase(S64);       // Not a requirement
+        psImageOverlayCase(F32);
+        psImageOverlayCase(F64);
+        psImageOverlayCase(C32);
+        psImageOverlayCase(C64);
+
+    default: {
+            char* typeStr;
+            PS_TYPE_NAME(typeStr,type);
+            psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                    PS_ERRORTEXT_psImage_IMAGE_TYPE_UNSUPPORTED,
+                    typeStr);
+            return pixelsOverlaid;
+        }
+    }
+
+    return pixelsOverlaid;
+}
+
+psS32 psImageClipComplexRegion(psImage* input,
+                               psC64 min,
+                               psC64 vmin,
+                               psC64 max,
+                               psC64 vmax)
+{
+    psS32 numClipped = 0;
+    psU32 numRows;
+    psU32 numCols;
+    psF64 realMin = creal(min);
+    psF64 imagMin = cimag(min);
+    psF64 realMax = creal(max);
+    psF64 imagMax = cimag(max);
+
+    if (input == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psImage_IMAGE_NULL);
+        return 0;
+    }
+
+    if (realMax < realMin) {
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true,
+                PS_ERRORTEXT_psImageManip_MAXMIN_REAL,
+                (double)realMin, (double)realMax);
+        return 0;
+    }
+    if (imagMax < imagMin) {
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true,
+                PS_ERRORTEXT_psImageManip_MAXMIN_IMAG,
+                (double)imagMin, (double)imagMax);
+        return 0;
+    }
+
+    numRows = input->numRows;
+    numCols = input->numCols;
+
+    #define psImageClipComplexRegionCase(type,realfcn,imagfcn) \
+case PS_TYPE_##type: { \
+        if (realfcn(vmin) < PS_MIN_##type || imagfcn(vmin) < PS_MIN_##type || \
+                realfcn(vmin) > PS_MAX_##type || imagfcn(vmin) > PS_MAX_##type ) { \
+            psError(PS_ERR_BAD_PARAMETER_VALUE, true, \
+                    PS_ERRORTEXT_psImageManip_CLIP_VALUE_INVALID, \
+                    "vmin", creal(vmin), cimag(vmin), \
+                    PS_TYPE_##type##_NAME, PS_MIN_##type, PS_MAX_##type); \
+            break; \
+        } \
+        if (realfcn(vmax) > PS_MAX_##type || imagfcn(vmax) > PS_MAX_##type || \
+                realfcn(vmax) < PS_MIN_##type || imagfcn(vmax) < PS_MIN_##type ) { \
+            psError(PS_ERR_BAD_PARAMETER_VALUE, true, \
+                    PS_ERRORTEXT_psImageManip_CLIP_VALUE_INVALID, \
+                    "vmax", creal(vmax), cimag(vmax), \
+                    PS_TYPE_##type##_NAME, PS_MIN_##type, PS_MAX_##type); \
+            break; \
+        } \
+        for (psU32 row = 0;row<numRows;row++) { \
+            ps##type* inputRow = input->data.type[row]; \
+            for (psU32 col = 0; col < numCols; col++) { \
+                if ( (realfcn(inputRow[col]) > realMax) || (imagfcn(inputRow[col]) > imagMax) ) { \
+                    inputRow[col] = (ps##type)vmax; \
+                    numClipped++; \
+                } else if ( (realfcn(inputRow[col]) < realMin) || (imagfcn(inputRow[col]) < imagMin) ){ \
+                    inputRow[col] = (ps##type)vmin; \
+                    numClipped++; \
+                } \
+            } \
+        } \
+    } \
+    break;
+
+    switch (input->type.type) {
+
+        psImageClipComplexRegionCase(C32, crealf, cimagf)
+        psImageClipComplexRegionCase(C64, creal, cimag)
+
+    default: {
+            char* typeStr;
+            PS_TYPE_NAME(typeStr,input->type.type);
+            psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                    PS_ERRORTEXT_psImage_IMAGE_TYPE_UNSUPPORTED,
+                    typeStr);
+        }
+    }
+
+    return numClipped;
+}
+
+psImage* psImageRebin(psImage* out,
+                      const psImage* in,
+                      const psImage* restrict mask,
+                      psMaskType maskVal,
+                      psU32 scale,
+                      const psStats* stats)
+{
+    psS32 inRows;
+    psS32 inCols;
+    psS32 outRows;
+    psS32 outCols;
+    psVector* vec;                     // vector to hold the values of a single bin.
+    psVector* maskVec = NULL;          // vector to hold the mask of a single bin.
+    psMaskType* maskData = NULL;
+    psStats* myStats;
+    double statVal;
+
+    if (in == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psImage_IMAGE_NULL);
+        psFree(out);
+        return NULL;
+    }
+
+    if (scale < 1) {
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true,
+                PS_ERRORTEXT_psImageManip_SCALE_NOT_POSITIVE,
+                scale);
+        psFree(out);
+        return NULL;
+    }
+
+    if (stats == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psImage_STAT_NULL);
+        psFree(out);
+        return NULL;
+    }
+
+    if (p_psGetStatValue(stats, &statVal) == false) {
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true,
+                PS_ERRORTEXT_psImage_BAD_STAT,
+                stats->options);
+        psFree(out);
+        return NULL;
+    }
+
+    vec = psVectorAlloc(scale * scale, in->type.type);
+
+    if (mask != NULL) {
+        if (mask->type.type != PS_TYPE_MASK) {
+            char* typeStr;
+            PS_TYPE_NAME(typeStr,mask->type.type);
+            psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                    PS_ERRORTEXT_psImage_IMAGE_MASK_TYPE,
+                    typeStr, PS_TYPE_MASK_NAME);
+            psFree(out);
+            psFree(vec);
+            return NULL;
+        }
+        maskVec = psVectorAlloc(scale * scale, PS_TYPE_MASK);
+        maskData = maskVec->data.PS_TYPE_MASK_DATA;
+    }
+
+    myStats = psAlloc(sizeof(psStats));
+    *myStats = *stats;
+
+    // create output image.
+    inRows = in->numRows;
+    inCols = in->numCols;
+    outRows = (inRows + scale - 1) / scale;     // round-up for remainders
+    outCols = (inCols + scale - 1) / scale;     // round-up for remainders
+    out = psImageRecycle(out, outCols, outRows, in->type.type);
+
+    #define PS_IMAGE_REBIN_CASE(type) \
+case PS_TYPE_##type: { \
+        ps##type* outRowData; \
+        ps##type* vecData = vec->data.type; \
+        psMaskType* inRowMask = NULL; \
+        for (psS32 row = 0; row < outRows; row++) { \
+            outRowData = out->data.type[row]; \
+            psS32 inCurrentRow = row*scale; \
+            psS32 inNextRow = (row+1)*scale; \
+            for (psS32 col = 0; col < outCols; col++) { \
+                psS32 inCurrentCol = col*scale; \
+                psS32 inNextCol = (col+1)*scale; \
+                psS32 n = 0; \
+                for (psS32 inRow = inCurrentRow; inRow < inNextRow && inRow < inRows; inRow++) { \
+                    ps##type* inRowData = in->data.type[inRow]; \
+                    if (mask != NULL) { \
+                        inRowMask = mask->data.PS_TYPE_MASK_DATA[inRow]; \
+                    } \
+                    for (psS32 inCol = inCurrentCol; inCol < inNextCol && inCol < inCols; inCol++) { \
+                        if (maskData != NULL) { \
+                            maskData[n] = inRowMask[inCol]; \
+                        } \
+                        vecData[n++] = inRowData[inCol]; \
+                    } \
+                } \
+                vec->n = n; \
+                myStats = psVectorStats(myStats,vec,NULL,maskVec,maskVal); \
+                p_psGetStatValue(myStats,&statVal); \
+                outRowData[col] = (ps##type)statVal; \
+            } \
+        } \
+    } \
+    break;
+
+    switch (in->type.type) {
+        //        PS_IMAGE_REBIN_CASE(U8);       Not valid since psVectorStats doesn't allow
+        PS_IMAGE_REBIN_CASE(U16);
+        PS_IMAGE_REBIN_CASE(U32);      // Not a requirement
+        PS_IMAGE_REBIN_CASE(U64);      // Not a requirement
+        PS_IMAGE_REBIN_CASE(S8);
+        //        PS_IMAGE_REBIN_CASE(S16);      Not valid since psVectorStats doesn't allow
+        PS_IMAGE_REBIN_CASE(S32);      // Not a requirement
+        PS_IMAGE_REBIN_CASE(S64);      // Not a requirement
+        PS_IMAGE_REBIN_CASE(F32);
+        PS_IMAGE_REBIN_CASE(F64);
+        //        PS_IMAGE_REBIN_CASE(C32);      Not valid since psVectorStats doesn't allow
+        //        PS_IMAGE_REBIN_CASE(C64);      Not valid since psVectorStats doesn't allow
+
+    default: {
+            char* typeStr;
+            PS_TYPE_NAME(typeStr,in->type.type);
+            psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                    PS_ERRORTEXT_psImage_IMAGE_TYPE_UNSUPPORTED,
+                    typeStr);
+            psFree(out);
+            out = NULL;
+        }
+    }
+
+    psFree(vec);
+    psFree(maskVec);
+    psFree(myStats);
+
+    return out;
+}
+
+psImage* psImageResample(psImage* out,
+                         const psImage* in,
+                         psS32 scale,
+                         psImageInterpolateMode mode)
+{
+    psS32 outRows;
+    psS32 outCols;
+    float invScale;
+
+    if (in == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psImage_IMAGE_NULL);
+        psFree(out);
+        return NULL;
+    }
+
+    if (scale < 1) {
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true,
+                PS_ERRORTEXT_psImageManip_SCALE_NOT_POSITIVE,
+                scale);
+        psFree(out);
+        return NULL;
+    }
+
+    if (mode < PS_INTERPOLATE_FLAT || mode >= PS_INTERPOLATE_NUM_MODES) {
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true,
+                PS_ERRORTEXT_psImageManip_INTERPOLATION_MODE_UNSUPPORTED,
+                mode);
+        psFree(out);
+        return NULL;
+    }
+
+    // create an output image of the same size
+    // and type
+    outRows = in->numRows * scale;
+    outCols = in->numCols * scale;
+    invScale = 1.0f / (float)scale;
+
+    #define PSIMAGE_RESAMPLE_CASE(TYPE) \
+case PS_TYPE_##TYPE: { \
+        out = psImageRecycle(out,outCols, outRows, PS_TYPE_##TYPE); \
+        for (psS32 row=0;row<outRows;row++) { \
+            ps##TYPE* rowData = out->data.TYPE[row]; \
+            float inRow = (float)row * invScale; \
+            for (psS32 col=0;col<outCols;col++) { \
+                rowData[col] = psImagePixelInterpolate(in,(float)col*invScale,inRow,NULL,0,0,mode); \
+            } \
+        }  \
+        break; \
+    }
+
+    switch (in->type.type) {
+        PSIMAGE_RESAMPLE_CASE(U8)
+        PSIMAGE_RESAMPLE_CASE(U16)
+        PSIMAGE_RESAMPLE_CASE(U32)
+        PSIMAGE_RESAMPLE_CASE(U64)
+        PSIMAGE_RESAMPLE_CASE(S8)
+        PSIMAGE_RESAMPLE_CASE(S16)
+        PSIMAGE_RESAMPLE_CASE(S32)
+        PSIMAGE_RESAMPLE_CASE(S64)
+        PSIMAGE_RESAMPLE_CASE(F32)
+        PSIMAGE_RESAMPLE_CASE(F64)
+        PSIMAGE_RESAMPLE_CASE(C32)
+        PSIMAGE_RESAMPLE_CASE(C64)
+    default: {
+            char* typeStr;
+            PS_TYPE_NAME(typeStr,in->type.type);
+            psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                    PS_ERRORTEXT_psImage_IMAGE_TYPE_UNSUPPORTED,
+                    typeStr);
+            psFree(out);
+            out = NULL;
+        }
+    }
+
+    return out;
+}
+
+psImage* psImageRoll(psImage* out,
+                     const psImage* in,
+                     psS32 dx,
+                     psS32 dy)
+{
+    psS32 outRows;
+    psS32 outCols;
+    psS32 elementSize;
+
+    if (in == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psImage_IMAGE_NULL);
+        psFree(out);
+        return NULL;
+    }
+    // create an output image of the same size
+    // and type
+    outRows = in->numRows;
+    outCols = in->numCols;
+    elementSize = PSELEMTYPE_SIZEOF(in->type.type);
+    out = psImageRecycle(out, outCols, outRows, in->type.type);
+
+    // make dx and dy between 0 and outCols or
+    // outRows, respectively
+    dx = dx % outCols;
+    dy = dy % outRows;
+    if (dx < 0) {
+        dx += outCols;
+    }
+    if (dy < 0) {
+        dy += outRows;
+    }
+
+    psS32 segment1Size = elementSize * (outCols - dx);
+    psS32 segment2Size = elementSize * dx;
+
+    for (psS32 row = 0; row < outRows; row++) {
+        psS32 inRowNumber = row + dy;
+
+        if (inRowNumber >= outRows) {
+            inRowNumber -= outRows;
+        }
+        psU8* inRow = in->data.U8[inRowNumber]; // use byte arithmetic for all types
+        psU8* outRow = out->data.U8[row];
+
+        memcpy(outRow, inRow + segment2Size, segment1Size);
+        memcpy(outRow + segment1Size, inRow, segment2Size);
+    }
+
+    return out;
+}
+
+psImage* psImageRotate(psImage* out,
+                       const psImage* in,
+                       float angle,
+                       psC64 unexposedValue,
+                       psImageInterpolateMode mode)
+{
+    if (in == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psImage_IMAGE_NULL);
+        psFree(out);
+        return NULL;
+    }
+    // put the angle in the range of 0...2PI.
+    angle = (float)((double)angle - (2.0*PS_PI) * floor(angle / (2.0*PS_PI)));
+
+    if (fabsf(angle - PS_PI_2) < FLT_EPSILON) {
+        // perform 1/4 rotate counter-clockwise
+        psS32 numRows = in->numCols;
+        psS32 numCols = in->numRows;
+        psS32 lastCol = numCols - 1;
+        psElemType type = in->type.type;
+
+        out = psImageRecycle(out, numCols, numRows, type);
+
+        #define PSIMAGE_ROTATE_LEFT_90(TYPE) \
+    case PS_TYPE_##TYPE: { \
+            ps##TYPE** inData = in->data.TYPE; \
+            for (psS32 row=0;row<numRows;row++) { \
+                ps##TYPE* outRow = out->data.TYPE[row]; \
+                for (psS32 col=0;col<numCols;col++) { \
+                    outRow[col] = inData[lastCol-col][row]; \
+                } \
+            } \
+        } \
+        break;
+
+        switch (type) {
+            PSIMAGE_ROTATE_LEFT_90(U8);
+            PSIMAGE_ROTATE_LEFT_90(U16);
+            PSIMAGE_ROTATE_LEFT_90(U32);    //  Not a requirement
+            PSIMAGE_ROTATE_LEFT_90(U64);    //  Not a requirement
+            PSIMAGE_ROTATE_LEFT_90(S8);
+            PSIMAGE_ROTATE_LEFT_90(S16);
+            PSIMAGE_ROTATE_LEFT_90(S32);    //  Not a requirement
+            PSIMAGE_ROTATE_LEFT_90(S64);    //  Not a requirement
+            PSIMAGE_ROTATE_LEFT_90(F32);
+            PSIMAGE_ROTATE_LEFT_90(F64);
+            PSIMAGE_ROTATE_LEFT_90(C32);
+            PSIMAGE_ROTATE_LEFT_90(C64);
+
+        default: {
+                char* typeStr;
+                PS_TYPE_NAME(typeStr,type);
+                psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                        PS_ERRORTEXT_psImage_IMAGE_TYPE_UNSUPPORTED,
+                        typeStr);
+                psFree(out);
+                return NULL;
+            }
+        }
+    } else if (fabsf(angle - PS_PI) < FLT_EPSILON) {
+        // perform 1/2 rotate
+        psS32 numRows = in->numRows;
+        psS32 lastRow = numRows - 1;
+        psS32 numCols = in->numCols;
+        psS32 lastCol = numCols - 1;
+        psElemType type = in->type.type;
+
+        out = psImageRecycle(out, numCols, numRows, type);
+
+        #define PSIMAGE_ROTATE_180_CASE(TYPE) \
+    case PS_TYPE_##TYPE: { \
+            for (psS32 row=0;row<numRows;row++) { \
+                ps##TYPE* outRow = out->data.TYPE[row]; \
+                ps##TYPE* inRow = in->data.TYPE[lastRow-row]; \
+                for (psS32 col=0;col<numCols;col++) { \
+                    outRow[col] = inRow[lastCol - col]; \
+                } \
+            } \
+        } \
+        break;
+
+        switch (type) {
+            PSIMAGE_ROTATE_180_CASE(U8);
+            PSIMAGE_ROTATE_180_CASE(U16);
+            PSIMAGE_ROTATE_180_CASE(U32);    // Not a requirement
+            PSIMAGE_ROTATE_180_CASE(U64);    // Not a requirement
+            PSIMAGE_ROTATE_180_CASE(S8);
+            PSIMAGE_ROTATE_180_CASE(S16);
+            PSIMAGE_ROTATE_180_CASE(S32);    // Not a requirement
+            PSIMAGE_ROTATE_180_CASE(S64);    // Not a requirement
+            PSIMAGE_ROTATE_180_CASE(F32);
+            PSIMAGE_ROTATE_180_CASE(F64);
+            PSIMAGE_ROTATE_180_CASE(C32);
+            PSIMAGE_ROTATE_180_CASE(C64);
+
+        default: {
+                char* typeStr;
+                PS_TYPE_NAME(typeStr,type);
+                psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                        PS_ERRORTEXT_psImage_IMAGE_TYPE_UNSUPPORTED,
+                        typeStr);
+                psFree(out);
+                return NULL;
+            }
+        }
+    } else if (fabsf(angle - (PS_PI+PS_PI_2)) < FLT_EPSILON) {
+        // perform 1/4 rotate clockwise
+        psS32 numRows = in->numCols;
+        psS32 lastRow = numRows - 1;
+        psS32 numCols = in->numRows;
+        psElemType type = in->type.type;
+
+        out = psImageRecycle(out, numCols, numRows, type);
+
+        #define PSIMAGE_ROTATE_RIGHT_90(TYPE) \
+    case PS_TYPE_##TYPE: { \
+            ps##TYPE** inData = in->data.TYPE; \
+            for (psS32 row=0;row<numRows;row++) { \
+                ps##TYPE* outRow = out->data.TYPE[row]; \
+                for (psS32 col=0;col<numCols;col++) { \
+                    outRow[col] = inData[col][lastRow-row]; \
+                } \
+            } \
+        } \
+        break;
+
+        switch (type) {
+            PSIMAGE_ROTATE_RIGHT_90(U8);
+            PSIMAGE_ROTATE_RIGHT_90(U16);
+            PSIMAGE_ROTATE_RIGHT_90(U32);     // Not a requirement
+            PSIMAGE_ROTATE_RIGHT_90(U64);     // Not a requirement
+            PSIMAGE_ROTATE_RIGHT_90(S8);
+            PSIMAGE_ROTATE_RIGHT_90(S16);
+            PSIMAGE_ROTATE_RIGHT_90(S32);     // Not a requirement
+            PSIMAGE_ROTATE_RIGHT_90(S64);     // Not a requirement
+            PSIMAGE_ROTATE_RIGHT_90(F32);
+            PSIMAGE_ROTATE_RIGHT_90(F64);
+            PSIMAGE_ROTATE_RIGHT_90(C32);
+            PSIMAGE_ROTATE_RIGHT_90(C64);
+
+        default: {
+                char* typeStr;
+                PS_TYPE_NAME(typeStr,type);
+                psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                        PS_ERRORTEXT_psImage_IMAGE_TYPE_UNSUPPORTED,
+                        typeStr);
+                psFree(out);
+                return NULL;
+            }
+        }
+    } else if (fabsf(angle) < FLT_EPSILON) {
+        out = psImageCopy(out, in, in->type.type);
+    } else {
+        psElemType type = in->type.type;
+        psS32 numRows = in->numRows;
+        psS32 numCols = in->numCols;
+        float centerX = (float)(numCols) / 2.0f;
+        float centerY = (float)(numRows) / 2.0f;
+        double cosT = cosf(angle);
+        double sinT = sinf(angle);
+
+        // calculate the corners of the rotated image so we know the proper output image size.
+        // x' = x cos(t) + y sin(t); i.e, x' = (x-centerX)*cosT + (y-centerY)*sinT;
+        // y' = y cos(t) - x sin(t); i.e. y' = (y-centerY)*cosT - (x-centerX)*sinT;
+
+        psS32 outCols = ceil(abs(numCols * cosT) + abs(numRows * sinT)) + 1;
+        psS32 outRows = ceil(abs(numCols * sinT) + abs(numRows * cosT)) + 1;
+        float minX = (float)outCols / -2.0f;
+        psS32 intMinY = outRows / -2;
+
+        out = psImageRecycle(out, outCols, outRows, type);
+
+        /* optimized public domain rotation routine by Karl Lager
+         *
+         * float cosT,sinT;
+         * cosT = cos(t);
+         * sinT = sin(t);
+         * for (y = min_y; y <= max_y; y++) {
+         *     x' = min_x * cosT + y * sinT + x1';
+         *     y' = y * cosT - min_x * sinT + y1';
+         *     for (x = min_x; x <= max_x; x++) {
+         *         if (x', y') is in the bounds of the bitmap, get pixel
+         *            (x', y') and plot the pixel to (x, y) on screen.
+         *         x' += cosT;
+         *         y' -= sinT;
+         *     }
+         * }
+         */
+
+        // precalculate some figures that are used within loop
+        float minXTimesCosTPlusCenterX = minX * cosT + centerX;
+        float CenterYMinusminXTimesSinT = centerY - minX * sinT;
+
+        #define PSIMAGE_ROTATE_ARBITRARY_LOOP(TYPE,MODE) { \
+            if (creal(unexposedValue) < PS_MIN_##TYPE || \
+                    creal(unexposedValue) > PS_MAX_##TYPE || \
+                    cimag(unexposedValue) < PS_MIN_##TYPE || \
+                    cimag(unexposedValue) > PS_MAX_##TYPE) { \
+                psError(PS_ERR_BAD_PARAMETER_VALUE, true, \
+                        PS_ERRORTEXT_psImageManip_CLIP_VALUE_INVALID, \
+                        "unexposedValue", \
+                        creal(unexposedValue),cimag(unexposedValue), \
+                        PS_TYPE_##TYPE##_NAME,  \
+                        (double)PS_MIN_##TYPE,(double)PS_MAX_##TYPE); \
+                psFree(out); \
+                out = NULL; \
+                break; \
+            } \
+            float inX; \
+            float inY; \
+            ps##TYPE* outRow; \
+            for (psS32 y = 0; y < outRows; y++) { \
+                inX = minXTimesCosTPlusCenterX + (y+intMinY) * sinT; \
+                inY = CenterYMinusminXTimesSinT + (y+intMinY) * cosT; \
+                outRow = out->data.TYPE[y]; \
+                for (psS32 x = 0; x < outCols; x++) { \
+                    outRow[x] = p_psImagePixelInterpolate##MODE##_##TYPE(in,inX,inY,NULL,0,unexposedValue); \
+                    inX += cosT; \
+                    inY -= sinT; \
+                } \
+            } \
+        }
+
+        #define PSIMAGE_ROTATE_ARBITRARY_CASE(MODE) \
+    case PS_INTERPOLATE_##MODE: \
+        switch (type) { \
+        case PS_TYPE_U8: \
+            PSIMAGE_ROTATE_ARBITRARY_LOOP(U8,MODE); \
+            break; \
+        case PS_TYPE_U16: \
+            PSIMAGE_ROTATE_ARBITRARY_LOOP(U16,MODE); \
+            break; \
+        case PS_TYPE_U32:   /* Not a requirement */ \
+            PSIMAGE_ROTATE_ARBITRARY_LOOP(U32,MODE); \
+            break; \
+        case PS_TYPE_U64:   /* Not a requirement */ \
+            PSIMAGE_ROTATE_ARBITRARY_LOOP(U64,MODE); \
+            break;  \
+        case PS_TYPE_S8: \
+            PSIMAGE_ROTATE_ARBITRARY_LOOP(S8,MODE); \
+            break; \
+        case PS_TYPE_S16: \
+            PSIMAGE_ROTATE_ARBITRARY_LOOP(S16,MODE); \
+            break; \
+        case PS_TYPE_S32:   /* Not a requirement */ \
+            PSIMAGE_ROTATE_ARBITRARY_LOOP(S32,MODE); \
+            break; \
+        case PS_TYPE_S64:   /* Not a requirement */ \
+            PSIMAGE_ROTATE_ARBITRARY_LOOP(S64,MODE); \
+            break; \
+        case PS_TYPE_F32: \
+            PSIMAGE_ROTATE_ARBITRARY_LOOP(F32,MODE); \
+            break; \
+        case PS_TYPE_F64: \
+            PSIMAGE_ROTATE_ARBITRARY_LOOP(F64,MODE); \
+            break; \
+        case PS_TYPE_C32: \
+            PSIMAGE_ROTATE_ARBITRARY_LOOP(C32,MODE); \
+            break; \
+        case PS_TYPE_C64: \
+            PSIMAGE_ROTATE_ARBITRARY_LOOP(C64,MODE); \
+            break; \
+        default: { \
+                char* typeStr; \
+                PS_TYPE_NAME(typeStr,type); \
+                psError(PS_ERR_BAD_PARAMETER_TYPE, true, \
+                        PS_ERRORTEXT_psImage_IMAGE_TYPE_UNSUPPORTED, \
+                        typeStr); \
+                psFree(out); \
+                out = NULL; \
+            } \
+        } \
+        break;
+
+        switch (mode) {
+            PSIMAGE_ROTATE_ARBITRARY_CASE(FLAT);
+            PSIMAGE_ROTATE_ARBITRARY_CASE(BILINEAR);
+            PSIMAGE_ROTATE_ARBITRARY_CASE(BILINEAR_VARIANCE);
+        default:
+            psError(PS_ERR_BAD_PARAMETER_VALUE, true,
+                    PS_ERRORTEXT_psImageManip_INTERPOLATION_MODE_UNSUPPORTED,
+                    mode);
+            psFree(out);
+            out = NULL;
+        }
+    }
+
+    return out;
+}
+
+psImage* psImageShift(psImage* out,
+                      const psImage* in,
+                      float dx,
+                      float dy,
+                      psC64 unexposedValue,
+                      psImageInterpolateMode mode)
+{
+    psS32 outRows;
+    psS32 outCols;
+    psS32 elementSize;
+    psElemType type;
+
+    if (in == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psImage_IMAGE_NULL);
+        psFree(out);
+        return NULL;
+    }
+    // create an output image of the same size
+    // and type
+    outRows = in->numRows;
+    outCols = in->numCols;
+    type = in->type.type;
+    elementSize = PSELEMTYPE_SIZEOF(type);
+    out = psImageRecycle(out, outCols, outRows, type);
+
+    #define PSIMAGE_SHIFT_CASE(MODE,TYPE) \
+case PS_TYPE_##TYPE: \
+    if (creal(unexposedValue) < PS_MIN_##TYPE || \
+            creal(unexposedValue) > PS_MAX_##TYPE || \
+            cimag(unexposedValue) < PS_MIN_##TYPE || \
+            cimag(unexposedValue) > PS_MAX_##TYPE) { \
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true, \
+                PS_ERRORTEXT_psImageManip_CLIP_VALUE_INVALID, \
+                "unexposedValue", \
+                creal(unexposedValue),cimag(unexposedValue), \
+                PS_TYPE_##TYPE##_NAME,  \
+                (double)PS_MIN_##TYPE,(double)PS_MAX_##TYPE); \
+        psFree(out); \
+        out = NULL; \
+        break; \
+    } \
+    for (psS32 row=0;row<outRows;row++) { \
+        ps##TYPE* outRow = out->data.TYPE[row]; \
+        float y = dy+(float)row; \
+        for (psS32 col=0;col<outCols;col++) { \
+            outRow[col] = p_psImagePixelInterpolate##MODE##_##TYPE( \
+                          in,dx+(float)col,y,NULL,0,unexposedValue); \
+        } \
+    } \
+    break;
+
+    #define PSIMAGE_SHIFT_ARBITRARY_CASE(MODE) \
+case PS_INTERPOLATE_##MODE: \
+    switch (in->type.type) { \
+        PSIMAGE_SHIFT_CASE(MODE,U8);  \
+        PSIMAGE_SHIFT_CASE(MODE,U16); \
+        PSIMAGE_SHIFT_CASE(MODE,U32);     /* Not a requirement */ \
+        PSIMAGE_SHIFT_CASE(MODE,U64);     /* Not a requirement */ \
+        PSIMAGE_SHIFT_CASE(MODE,S8);  \
+        PSIMAGE_SHIFT_CASE(MODE,S16); \
+        PSIMAGE_SHIFT_CASE(MODE,S32);    /* Not a requirement */ \
+        PSIMAGE_SHIFT_CASE(MODE,S64);    /* Not a requirement */ \
+        PSIMAGE_SHIFT_CASE(MODE,F32); \
+        PSIMAGE_SHIFT_CASE(MODE,F64); \
+        PSIMAGE_SHIFT_CASE(MODE,C32); \
+        PSIMAGE_SHIFT_CASE(MODE,C64); \
+        \
+    default: { \
+            char* typeStr; \
+            PS_TYPE_NAME(typeStr,type); \
+            psError(PS_ERR_BAD_PARAMETER_TYPE, true, \
+                    PS_ERRORTEXT_psImage_IMAGE_TYPE_UNSUPPORTED, \
+                    typeStr); \
+            psFree(out); \
+            out = NULL; \
+        } \
+    } \
+    break;
+
+    switch (mode) {
+        PSIMAGE_SHIFT_ARBITRARY_CASE(FLAT);
+        PSIMAGE_SHIFT_ARBITRARY_CASE(BILINEAR);
+        PSIMAGE_SHIFT_ARBITRARY_CASE(BILINEAR_VARIANCE);
+    default:
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true,
+                PS_ERRORTEXT_psImageManip_INTERPOLATION_MODE_UNSUPPORTED,
+                mode);
+        psFree(out);
+        out = NULL;
+    }
+
+    return out;
+}
+
+
+// XXX: implementation is awaiting working psPlaneTransform functions like
+// invert.  Also, the next SDRS should have a different signature.
+psImage* psImageTransform(psImage *output,
+                          const psImage *input,
+                          const psImage *inputMask,
+                          int inputMaskVal,
+                          const psPlaneTransform *outToIn,
+                          const psImage *combineMask,
+                          int combineMaskVal)
+{
+    if (input == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psImage_IMAGE_NULL);
+        return NULL;
+    }
+
+    if (outToIn == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psImageManip_TRANSFORM_NULL);
+        return NULL;
+    }
+
+    // find the input image domain in the output image
+
+    // loop through the output image using the domain above and transform
+    // each output pixel to input coordinates and use psImagePixelInterpolate
+    // to determine the pixel value.
+
+
+    return NULL;
+}
+
Index: /tags/ipp-1-X/bug123/psLib/src/image/psImageManip.h
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/image/psImageManip.h	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/image/psImageManip.h	(revision 22331)
@@ -0,0 +1,214 @@
+/** @file  psImageManip.h
+ *
+ *  @brief Contains basic image pixel and geometry manipulation operations, as
+ *         specified in the PSLIB SDRS sections "Image Pixel Manipulations" and
+ *         "Image Geometry Manipulations".
+ *
+ *  @ingroup Image
+ *
+ *  @author Robert DeSonia, MHPCC
+ *  @author Ross Harman, MHPCC
+ *
+ *  @version $Revision: 1.20 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-04-21 21:18:23 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+#ifndef PS_IMAGE_MANIP_H
+#define PS_IMAGE_MANIP_H
+
+#include "psImage.h"
+#include "psCoord.h"
+#include "psStats.h"
+
+/// @addtogroup Image
+/// @{
+
+/** Clip image values outside of range to given values
+ *
+ *  All pixels with values less than min are set to the value vmin.  all pixels
+ *  with values greater than max are set to the value vmax. This function is
+ *  defined for psU8, psU16, psS8, psS16, psF32, psF64, psC32, and psC64.
+ *
+ *  @return psS32     The number of clipped pixels
+ */
+psS32 psImageClip(
+    psImage* input,                    ///< the image to clip
+    psF64 min,                         ///< the minimum image value allowed
+    psF64 vmin,                        ///< the value pixels < min are set to
+    psF64 max,                         ///< the maximum image value allowed
+    psF64 vmax                         ///< the value pixels > max are set to
+);
+
+/** Clip image values outside of a specified complex region
+ *
+ *  All pixels outside of the rectangular region in complex space formed by
+ *  the min and max input parameters are set to the value vmax (if either
+ *  the real or imaginary portion exceeds the respective max values), or vmin.
+ *  This function is defined for psC32, and psC64 imagery only.
+ *
+ *  @return psS32     The number of clipped pixels
+ */
+psS32 psImageClipComplexRegion(
+    psImage* input,                    ///< the image to clip
+    psC64 min,                         ///< the minimum image value allowed
+    psC64 vmin,                        ///< the value pixels < min are set to
+    psC64 max,                         ///< the maximum image value allowed
+    psC64 vmax                         ///< the value pixels > max are set to
+);
+
+/** Clip NaN image pixels to given value.
+ *
+ *  Pixels with NaN, +Inf, or -Inf values are set to the specified value. This
+ *  function is defined for psF32, psF64, psC32, and psC64.
+ *
+ *  @return psS32     The number of clipped pixels
+ */
+psS32 psImageClipNaN(
+    psImage* input,                    ///< the image to clip
+    psF64 value                        ///< the value to set all NaN/Inf values to
+);
+
+/** Overlay subregion of image with another image
+ *
+ *  Replace the pixels in the image which correspond to the pixels in OVERLAY
+ *  with values derived from the IMAGE and OVERLAY based on the given operator
+ *  OP.  Valid operators are "=" (set image value to OVERLAY value), "+" (add
+ *  OVERLAY value to image value), "-" (subtract OVERLAY from image), "*"
+ *  (multiply OVERLAY times image), "/" (divide image by OVERLAY).  This
+ *  function is defined for psU8, psS8, psS16, psF32, psF64, psC32, and psC64.
+ *
+ *  @return psS32         0 if success, non-zero if failed.
+ */
+psS32 psImageOverlaySection(
+    psImage* image,                    ///< target image
+    const psImage* overlay,            ///< the overlay image
+    psS32 col0,                        ///< the column to start overlay
+    psS32 row0,                        ///< the row to start overlay
+    const char *op                     ///< the operation to perform for overlay
+);
+
+/** Rebin image to new scale.
+ *
+ *  A new image is constructed in which the dimensions are reduced by a factor of
+ *  1/scale.  The scale, always a positive number, is equal in each dimension and
+ *  specified the number of pixels used to define a new pixel in the output image.
+ *  The output image is generated from all input image pixels. This function is
+ *  defined for psU8, psS8, psS16, psF32, psF64, psC32, and psC64.
+ *
+ *  @return psImage    new image formed by rebinning input image.
+ */
+psImage* psImageRebin(
+    psImage* out,                      ///< an psImage to recycle.  If NULL, a new image is created
+    const psImage* in,                 ///< input image
+    const psImage* mask,               ///< mask for input image.  If NULL, no masking is done.
+    psMaskType maskVal,                ///< the bits to check in mask.
+    psU32 scale,                       ///< the scale to rebin for each dimension
+    const psStats* stats
+    ///< the statistic to perform when rebinning.  Only one method should be set.
+);
+
+/** Resample image to new scale.
+ *
+ *  A new image is constructed in which the dimensions are increased by a
+ *  factor of scale. The scale, always a positive number, is equal in each
+ *  dimension. The output image is generated from all input image pixels.
+ *  Each pixel in the output image is derived by interpolating between
+ *  neighboring pixels using the specified interpolation method (mode).
+ *
+ *  @return psImage*    resampled image result
+ */
+psImage* psImageResample(
+    psImage* out,                      ///< an psImage to recycle.  If NULL, a new image is created
+    const psImage* in,                 ///< input image
+    psS32 scale,                       ///< resample scaling factor
+    psImageInterpolateMode mode        ///< the interpolation mode used in resampling
+);
+
+/** Rotate the input image by given angle, specified in degrees.
+ *
+ *  The output image must contain all of the pixels from the input image in
+ *  their new frame. Pixels in the output image which do not map to input
+ *  pixels should be set to exposed. The center of rotation is always the
+ *  center pixel of the image. The rotation is specified in the sense that a
+ *  positive angle is an anti-clockwise rotation. This function must be
+ *  defined for the following types: psU8, psU16, psS8, psS16, psF32, psF64,
+ *  psC32, psC64.
+ *
+ *  @return psImage*     the rotated image result.
+ */
+psImage* psImageRotate(
+    psImage* out,                      ///< an psImage to recycle.  If NULL, a new image is created
+    const psImage* in,                 ///< input image
+    float angle,                       ///< the rotation angle in radians.
+    psC64 unexposedValue,              ///< the output image pixel values for non-imagery areas
+    psImageInterpolateMode mode        ///< the interpolation mode used
+);
+
+/** Shift image by an arbitrary number of pixels (dx,dy) in either direction.
+ *
+ *  If the shift values are fractional, the output pixel values should
+ *  interpolate between the input pixel values. The output image has the same
+ *  dimensions as the input image. Pixels which fall off the edge of the
+ *  output image are lost. Newly exposed pixels are set to the value given by
+ *  exposed. This function must be defined for the following types: psU8,
+ *  psU16, psS8, psS16, psF32, psF64, psC32, psC64.
+ *
+ *  @return psImage*     the shifted image result.
+ */
+psImage* psImageShift(
+    psImage* out,                      ///< an psImage to recycle.  If NULL, a new image is created
+    const psImage* in,                 ///< input image
+    float dx,                          ///< the shift in x direction.
+    float dy,                          ///< the shift in y direction.
+    psC64 unexposedValue,              ///< the output image pixel values for non-imagery areas
+    psImageInterpolateMode mode        ///< the interpolation mode to use
+);
+
+/** Roll image by an integer number of pixels in either direction.
+ *
+ *  The output image is the same dimensions as the input image.  Edge pixels
+ *  wrap to the other side (no values are lost).  This function is
+ *  defined for psU8, psS8, psS16, psF32, psF64, psC32, and psC64.
+ *
+ *  @return psImage* the rolled version of the input image.
+ */
+psImage* psImageRoll(
+    psImage* out,                      ///< an psImage to recycle.  If NULL, a new image is created
+    const psImage* in,                 ///< input image
+    psS32 dx,                          ///< number of pixels to roll in the x-dimension
+    psS32 dy                           ///< number of pixels to roll in the y-dimension
+);
+
+/** Transform the input image according the supplied transformation.
+ *
+ *  Transform the input image according the supplied transformation. In the
+ *  event that the output is NULL, the smallest possible image capable of
+ *  containing the entire transformed input image is to be returned; otherwise
+ *  only the image size specified in the output image is to be used. If the
+ *  inputMask is not NULL, those pixels in the inputMask matching inputMaskVal
+ *  are to be ignored in the transformation. The inputMask must be of type
+ *  psU8, and of the same size as the input, otherwise the function shall
+ *  generate an error and return NULL. The transformation outToIn specifies
+ *  the coordinates in the input image of a pixel in the output image - note
+ *  that this is the reverse of what might be naively expected, but it is what
+ *  is required in order to use psImagePixelInterpolate. If combineMask is not
+ *  NULL, then those pixels that match combineMaskVal are not transformed.
+ *  combineMask must be of type psU8 and of the same size as the output,
+ *  otherwise the function shall generate an error and return NULL. This
+ *  function must be capable of handling the following types for the input
+ *  (with corresponding types for the output): psF32, psF64.
+ *
+ *  @return psImage*    The transformed image.
+ */
+psImage* psImageTransform(
+    psImage *output,                   ///< psImage to recycle, or NULL
+    const psImage *input,              ///< psImage to apply transform to
+    const psImage *inputMask,          ///< if not NULL, mask of input psImage
+    int inputMaskVal,                  ///< masking value for inputMask
+    const psPlaneTransform *outToIn,   ///< the transform to apply
+    const psImage *combineMask,        ///< if not NULL, mask of pixels not to be transformed
+    int combineMaskVal                 ///< masking value for combineMask
+);
+
+#endif
Index: /tags/ipp-1-X/bug123/psLib/src/image/psImageStats.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/image/psImageStats.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/image/psImageStats.c	(revision 22331)
@@ -0,0 +1,635 @@
+/** @file psImageStats.c
+ *  \brief Routines for calculating statistics on images.
+ *  @ingroup ImageStats
+ *
+ *  This file will hold the prototypes for procedures which calculate
+ *  statistic on images, histograms on images, and fit/evaluate Chebyshev
+ *  polynomials to images.
+ *
+ *  @author GLG, MHPCC
+ *
+ *  @version $Revision: 1.72 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-04-19 04:16:02 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdarg.h>
+#include <float.h>
+#include <math.h>
+#include "psMemory.h"
+#include "psVector.h"
+#include "psTrace.h"
+#include "psError.h"
+#include "psStats.h"
+#include "psImage.h"
+#include "psFunctions.h"
+#include "psImageStats.h"
+#include "psConstants.h"
+#include "psImageErrors.h"
+
+/// This routine must determine the various statistics for the image.
+/*****************************************************************************
+psImageStats(stats, in, mask, maskVal): this routine simply calls the
+psVectorStats() routine, which does the actual statistical calculation.  In
+order to do so, we create dummy psVectors and set their "data" pointer to that
+of the input psImages.
+ 
+XXX: use static psVectors
+ 
+XXX: optimize this.  2k vs 4k, sample mean, takes8 seconds on Gene's machine.
+Should take .2.
+ *****************************************************************************/
+psStats* psImageStats(psStats* stats,
+                      const psImage* in,
+                      const psImage* mask,
+                      psS32 maskVal)
+{
+    psVector *junkData = NULL;
+    psVector *junkMask = NULL;
+
+    PS_PTR_CHECK_NULL(stats, NULL);
+    PS_INT_CHECK_ZERO(stats->options, NULL);
+    PS_IMAGE_CHECK_NULL(in, NULL)
+    if (mask != NULL) {
+        PS_IMAGE_CHECK_TYPE(mask, PS_TYPE_U8, NULL);
+        PS_IMAGE_CHECK_SIZE_EQUAL(in, mask, NULL);
+    }
+
+    if (in->parent == NULL) {
+        // stuff the image data into a psVector struct.
+        junkData = (psVector *) psAlloc(sizeof(psVector));
+        junkData->type = in->type;
+        *(int*)&junkData->nalloc = in->numRows * in->numCols;
+        junkData->n = junkData->nalloc;
+        junkData->data.U8 = in->data.V[0];      // since psImage data is contiguous...
+    } else {
+        // image not necessarily contiguous
+        int numRows = in->numRows;
+        int numCols = in->numCols;
+        int rowSize = numCols * (PSELEMTYPE_SIZEOF(in->type.type));
+
+        junkData = psVectorAlloc(numRows*numCols, in->type.type);
+        junkData->n = junkData->nalloc;
+
+        psU8* data = junkData->data.U8;
+        for (int row = 0; row < numRows; row++) {
+            memcpy(data, in->data.V[row], rowSize);
+            data += rowSize;
+        }
+    }
+
+    if (mask != NULL) {
+        if (mask->parent == NULL) {
+            // stuff the mask data into a psVector struct.
+            junkMask = psAlloc(sizeof(psVector));
+            junkMask->type = mask->type;
+            *(int*)&junkMask->nalloc = mask->numRows * mask->numCols;
+            junkMask->n = junkMask->nalloc;
+            junkMask->data.U8 = mask->data.V[0];
+        } else {
+            // image not necessarily contiguous
+            int numRows = mask->numRows;
+            int numCols = mask->numCols;
+            int rowSize = numCols * (PSELEMTYPE_SIZEOF(mask->type.type));
+
+            junkMask = psVectorAlloc(numRows*numCols, mask->type.type);
+            junkMask->n = junkMask->nalloc;
+
+            psU8* data = junkMask->data.U8;
+            for (int row = 0; row < numRows; row++) {
+                memcpy(data, mask->data.V[row], rowSize);
+                data += rowSize;
+            }
+        }
+    }
+
+    stats = psVectorStats(stats, junkData, NULL, junkMask, maskVal);
+
+    psFree(junkMask);
+    psFree(junkData);
+    return (stats);
+}
+
+/*****************************************************************************
+NOTE: We assume that the psHistogram structure out has already been allocated
+and initialized.
+ *****************************************************************************/
+psHistogram* psImageHistogram(psHistogram* out,
+                              const psImage* in,
+                              const psImage* mask,
+                              psU32 maskVal)
+{
+    PS_PTR_CHECK_NULL(out, NULL);
+    PS_PTR_CHECK_NULL(in, NULL);
+    if (mask != NULL) {
+        PS_IMAGE_CHECK_TYPE(mask, PS_TYPE_U8, NULL);
+        PS_IMAGE_CHECK_SIZE_EQUAL(in, mask, NULL);
+    }
+    psVector* junkData = NULL;
+    psVector* junkMask = NULL;
+
+    if (in->parent == NULL) {
+        // stuff the image data into a psVector struct.
+        junkData = (psVector *) psAlloc(sizeof(psVector));
+        junkData->type = in->type;
+        *(int*)&junkData->nalloc = in->numRows * in->numCols;
+        junkData->n = junkData->nalloc;
+        junkData->data.U8 = in->data.V[0];      // since psImage data is contiguous...
+    } else {
+        // image not necessarily contiguous
+        int numRows = in->numRows;
+        int numCols = in->numCols;
+        int rowSize = numCols * (PSELEMTYPE_SIZEOF(in->type.type));
+
+        junkData = psVectorAlloc(numRows*numCols, in->type.type);
+        junkData->n = junkData->nalloc;
+
+        psU8* data = junkData->data.U8;
+        for (int row = 0; row < numRows; row++) {
+            memcpy(data, in->data.V[row], rowSize);
+            data += rowSize;
+        }
+    }
+
+    if (mask != NULL) {
+        if (mask->parent == NULL) {
+            // stuff the mask data into a psVector struct.
+            junkMask = psAlloc(sizeof(psVector));
+            junkMask->type = mask->type;
+            *(int*)&junkMask->nalloc = mask->numRows * mask->numCols;
+            junkMask->n = junkMask->nalloc;
+            junkMask->data.U8 = mask->data.V[0];
+        } else {
+            // image not necessarily contiguous
+            int numRows = mask->numRows;
+            int numCols = mask->numCols;
+            int rowSize = numCols * (PSELEMTYPE_SIZEOF(mask->type.type));
+
+            junkMask = psVectorAlloc(numRows*numCols, mask->type.type);
+            junkMask->n = junkMask->nalloc;
+
+            psU8* data = junkMask->data.U8;
+            for (int row = 0; row < numRows; row++) {
+                memcpy(data, mask->data.V[row], rowSize);
+                data += rowSize;
+            }
+        }
+    }
+
+    out = psVectorHistogram(out, junkData, NULL, junkMask, maskVal);
+
+    psFree(junkMask);
+    psFree(junkData);
+
+    return (out);
+}
+
+/*****************************************************************************
+calcScaleFactorsEval(n): The Chebyshev polynomials are defined over the
+interval [-1.0 : 1.0].  Images typically have sizes of 512x512 or more.  In
+order to use Chebyshev polynomials, we must scale the coordinates from
+0:512 to -1:1.  This routine takes as input an integer N and produces as
+output a vector of evenly spaced floating point values between -1.0:1.0.
+ 
+XXX: Use the p_psNormalizeVector here?
+ *****************************************************************************/
+double* calcScaleFactors(psS32 n)
+{
+    PS_INT_CHECK_NON_NEGATIVE(n, NULL);
+    psS32 i = 0;
+    double tmp = 0.0;
+    double *scalingFactors = (double *)psAlloc(n * sizeof(double));
+
+    for (i = 0; i < n; i++) {
+        tmp = (double)(n - i);
+        tmp = (PS_PI * (tmp - 0.5)) / ((double)n);
+        scalingFactors[i] = cos(tmp);
+    }
+
+    return (scalingFactors);
+}
+
+// XXX: Use a static array of Chebyshev polynomials.
+psPolynomial1D **p_psCreateChebyshevPolys(psS32 maxChebyPoly)
+{
+    PS_INT_CHECK_POSITIVE(maxChebyPoly, NULL);
+    psPolynomial1D **chebPolys = NULL;
+    psS32 i = 0;
+    psS32 j = 0;
+
+    chebPolys = (psPolynomial1D **) psAlloc(maxChebyPoly * sizeof(psPolynomial1D *));
+    for (i = 0; i < maxChebyPoly; i++) {
+        chebPolys[i] = psPolynomial1DAlloc(i + 1, PS_POLYNOMIAL_ORD);
+    }
+
+    // Create the Chebyshev polynomials.
+    // Polynomial i has i-th order.
+    chebPolys[0]->coeff[0] = 1;
+    chebPolys[1]->coeff[1] = 1;
+    for (i = 2; i < maxChebyPoly; i++) {
+        for (j = 0; j < chebPolys[i - 1]->n; j++) {
+            chebPolys[i]->coeff[j + 1] = 2 * chebPolys[i - 1]->coeff[j];
+        }
+        for (j = 0; j < chebPolys[i - 2]->n; j++) {
+            chebPolys[i]->coeff[j] -= chebPolys[i - 2]->coeff[j];
+        }
+    }
+
+    return (chebPolys);
+}
+
+/*****************************************************************************
+psImageFitPolynomial(): This routine takes as input a 2-D image and produces
+as output the coefficients of the Chebyshev polynomials which match that
+input image.
+  Input:
+  Output:
+  Internal Data Structures:
+    chebPolys[i][j] 
+    sums[i][j]: This will contain the sum of 
+                input->data.F32[x][y] *
+                psPolynomial1DEval(
+chebPolys[i],
+(float) x) *
+                psPolynomial1DEval(
+chebPolys[j],
+(float) y, 
+);
+        over all pixels (x,y) in the image.
+  *****************************************************************************/
+psPolynomial2D* psImageFitPolynomial(psPolynomial2D* coeffs,
+                                     const psImage* input)
+{
+    PS_IMAGE_CHECK_NULL(input, NULL);
+    PS_IMAGE_CHECK_EMPTY(input, NULL);
+    if ((input->type.type != PS_TYPE_S8) &&
+            (input->type.type != PS_TYPE_U16) &&
+            (input->type.type != PS_TYPE_F32) &&
+            (input->type.type != PS_TYPE_F64)) {
+        psError(PS_ERR_BAD_PARAMETER_TYPE, true, "Unallowable image type.\n");
+    }
+    PS_POLY_CHECK_NULL(coeffs, NULL);
+    PS_POLY_CHECK_TYPE(coeffs, PS_POLYNOMIAL_CHEB, NULL);
+    psS32 x = 0;
+    psS32 y = 0;
+    psS32 i = 0;
+    psS32 j = 0;
+    double **sums = NULL;
+    psPolynomial1D* *chebPolys = NULL;
+    psS32 maxChebyPoly = 0;
+    double *cScalingFactors = NULL;
+    double *rScalingFactors = NULL;
+
+    // Create the sums[][] data structure.  This
+    // will hold the LHS of
+    // equation
+    // 29 in the ADD: sums[k][l] = SUM {
+    // image(x,y) * Tk(x) * Tl(y) }
+    sums = (double **)psAlloc(coeffs->nX * sizeof(double *));
+    for (i = 0; i < coeffs->nX; i++) {
+        sums[i] = (double *)psAlloc(coeffs->nY * sizeof(double));
+    }
+    // We scale the pixel positions to values
+    // between -1.0 and 1.0
+    rScalingFactors = calcScaleFactors(input->numRows);
+    cScalingFactors = calcScaleFactors(input->numCols);
+
+    // Determine how many Chebyshev polynomials
+    // are needed, then create them.
+    maxChebyPoly = coeffs->nX;
+    if (coeffs->nY > coeffs->nX) {
+        maxChebyPoly = coeffs->nY;
+    }
+    chebPolys = p_psCreateChebyshevPolys(maxChebyPoly);
+
+    // Compute the sums[][] data structure.
+    for (i = 0; i < coeffs->nX; i++) {
+        for (j = 0; j < coeffs->nY; j++) {
+            sums[i][j] = 0.0;
+            for (x = 0; x < input->numRows; x++) {
+                for (y = 0; y < input->numCols; y++) {
+                    double pixel = 0.0;
+                    if (input->type.type == PS_TYPE_S8) {
+                        pixel = (double) input->data.S8[x][y];
+                    } else if (input->type.type == PS_TYPE_U16) {
+                        pixel = (double) input->data.U16[x][y];
+                    } else if (input->type.type == PS_TYPE_F32) {
+                        pixel = (double) input->data.F32[x][y];
+                    } else if (input->type.type == PS_TYPE_F64) {
+                        pixel = input->data.F64[x][y];
+                    }
+                    sums[i][j] += pixel * psPolynomial1DEval(chebPolys[i],rScalingFactors[x]) *
+                                  psPolynomial1DEval(chebPolys[j], cScalingFactors[y]);
+                }
+            }
+        }
+    }
+
+    for (i = 0; i < coeffs->nX; i++) {
+        for (j = 0; j < coeffs->nY; j++) {
+            coeffs->coeff[i][j] = sums[i][j];
+            coeffs->coeff[i][j] /= (double)(input->numRows * input->numCols);
+
+            if ((i != 0) && (j != 0)) {
+                coeffs->coeff[i][j] *= 4.0;
+            } else if ((i == 0) && (j == 0)) {
+                coeffs->coeff[i][j] *= 1.0;
+            } else {
+                coeffs->coeff[i][j] *= 2.0;
+            }
+        }
+    }
+
+    // Free the Chebyshev polynomials that were
+    // created in this routine.
+    for (i = 0; i < maxChebyPoly; i++) {
+        psFree(chebPolys[i]);
+    }
+    psFree(chebPolys);
+
+    // Free some data
+    for (i = 0; i < coeffs->nX; i++) {
+        psFree(sums[i]);
+    }
+    psFree(sums);
+    psFree(cScalingFactors);
+    psFree(rScalingFactors);
+
+    return (coeffs);
+}
+
+
+
+
+/*****************************************************************************
+psImageFitPolynomial(): This routine takes as input a 2-D image and produces
+as output the coefficients of the Chebyshev polynomials which match that input
+image.  This is a TEST version of the code.  It is not used by anything.
+  Input:
+  Output:
+  Internal Data Structures:
+    chebPolys[i][j] 
+    sums[i][j]: This will contain the sum of 
+                input->data.F32[x][y] *
+                psPolynomial1DEval(
+chebPolys[i],
+(float) x) *
+                psPolynomial1DEval(
+chebPolys[j],
+(float) y, 
+);
+        over all pixels (x,y) in the image.
+  *****************************************************************************/
+psPolynomial2D* psImageFitPolynomialTest(psPolynomial2D* coeffs,
+        const psImage* input)
+{
+    PS_IMAGE_CHECK_NULL(input, NULL);
+    PS_IMAGE_CHECK_EMPTY(input, NULL);
+    if ((input->type.type != PS_TYPE_S8) &&
+            (input->type.type != PS_TYPE_U16) &&
+            (input->type.type != PS_TYPE_F32) &&
+            (input->type.type != PS_TYPE_F64)) {
+        psError(PS_ERR_BAD_PARAMETER_TYPE, true, "Unallowable image type.\n");
+    }
+    PS_POLY_CHECK_NULL(coeffs, NULL);
+    PS_POLY_CHECK_TYPE(coeffs, PS_POLYNOMIAL_CHEB, NULL);
+    psS32 x = 0;
+    psS32 y = 0;
+    psS32 i = 0;
+    psS32 j = 0;
+    double **sums = NULL;
+    psPolynomial1D* *chebPolys = NULL;
+    psS32 maxChebyPoly = 0;
+    double *cScalingFactors = NULL;
+    double *rScalingFactors = NULL;
+    psImage *nodes = psImageAlloc(input->numCols, input->numRows, PS_TYPE_F64);
+
+    double min = -1.0;
+    double max = 1.0;
+    double bma = 0.5 * (max-min);  // 1
+    double bpa = 0.5 * (max+min);  // 0
+    // We must calculate the value of the image at the nodes where the
+    // Chebyshev polynomials are 0.
+    for (x = 0; x < input->numRows; x++) {
+        double xTmp = cos(PS_PI * (0.5 + ((float) x)) / ((float) input->numRows));
+        double xNode = - ((xTmp + bma + bpa) - 1.0);
+        double xOrig = ((float) input->numRows) * (xNode - min) / (max - min);
+
+        for (y = 0; y < input->numCols; y++) {
+            double yTmp = cos(PS_PI * (0.5 + ((float) y)) / ((float) input->numCols));
+            double yNode = - ((yTmp + bma + bpa) - 1.0);
+            double yOrig = ((float) input->numCols) * (yNode - min) / (max - min);
+
+            //            nodes->data.F64[x][y] = psImagePixelInterpolate(input, yNode, xNode, NULL, 0, 0.0, PS_INTERPOLATE_BILINEAR);
+            //            nodes->data.F64[x][y] = psImagePixelInterpolate(input, yTmp, xTmp, NULL, 0, 0.0, PS_INTERPOLATE_BILINEAR);
+            nodes->data.F64[x][y] = psImagePixelInterpolate(input, yOrig, xOrig, NULL, 0, 0.0, PS_INTERPOLATE_BILINEAR);
+        }
+    }
+
+    // Create the sums[][] data structure.  This
+    // will hold the LHS of
+    // equation
+    // 29 in the ADD: sums[k][l] = SUM {
+    // image(x,y) * Tk(x) * Tl(y) }
+    sums = (double **)psAlloc(coeffs->nX * sizeof(double *));
+    for (i = 0; i < coeffs->nX; i++) {
+        sums[i] = (double *)psAlloc(coeffs->nY * sizeof(double));
+    }
+    // We scale the pixel positions to values
+    // between -1.0 and 1.0
+    rScalingFactors = calcScaleFactors(input->numRows);
+    cScalingFactors = calcScaleFactors(input->numCols);
+
+    // Determine how many Chebyshev polynomials
+    // are needed, then create them.
+    maxChebyPoly = coeffs->nX;
+    if (coeffs->nY > coeffs->nX) {
+        maxChebyPoly = coeffs->nY;
+    }
+    chebPolys = p_psCreateChebyshevPolys(maxChebyPoly);
+
+    // Compute the sums[][] data structure.
+    for (i = 0; i < coeffs->nX; i++) {
+        for (j = 0; j < coeffs->nY; j++) {
+            sums[i][j] = 0.0;
+            for (x = 0; x < input->numRows; x++) {
+                for (y = 0; y < input->numCols; y++) {
+                    double pixel;
+                    /*
+                                        if (input->type.type == PS_TYPE_S8) {
+                                            pixel = (double) input->data.S8[x][y];
+                                        } else if (input->type.type == PS_TYPE_U16) {
+                                            pixel = (double) input->data.U16[x][y];
+                                        } else if (input->type.type == PS_TYPE_F32) {
+                                            pixel = (double) input->data.F32[x][y];
+                                        } else if (input->type.type == PS_TYPE_F64) {
+                                            pixel = input->data.F64[x][y];
+                                        }
+                    */
+                    pixel = nodes->data.F64[x][y];
+                    sums[i][j] += pixel * psPolynomial1DEval(chebPolys[i], rScalingFactors[x]) *
+                                  psPolynomial1DEval(chebPolys[j], cScalingFactors[y]);
+                }
+            }
+        }
+    }
+
+    for (i = 0; i < coeffs->nX; i++) {
+        for (j = 0; j < coeffs->nY; j++) {
+            coeffs->coeff[i][j] = sums[i][j];
+            coeffs->coeff[i][j] /= (double)(input->numRows * input->numCols);
+
+            if ((i != 0) && (j != 0)) {
+                coeffs->coeff[i][j] *= 4.0;
+            } else if ((i == 0) && (j == 0)) {
+                coeffs->coeff[i][j] *= 1.0;
+            } else {
+                coeffs->coeff[i][j] *= 2.0;
+            }
+        }
+    }
+
+    // Free the Chebyshev polynomials that were
+    // created in this routine.
+    for (i = 0; i < maxChebyPoly; i++) {
+        psFree(chebPolys[i]);
+    }
+    psFree(chebPolys);
+
+    // Free some data
+    for (i = 0; i < coeffs->nX; i++) {
+        psFree(sums[i]);
+    }
+    psFree(sums);
+    psFree(cScalingFactors);
+    psFree(rScalingFactors);
+    psFree(nodes);
+
+    return (coeffs);
+}
+
+/*****************************************************************************
+XXX: Use static variables for Chebyshev polynomials and scaling factors. 
+ *****************************************************************************/
+psImage* p_psImageEvalPolynomialCheb(psImage* input,
+                                     const psPolynomial2D* coeffs)
+{
+    PS_POLY_CHECK_TYPE(coeffs, PS_POLYNOMIAL_CHEB, NULL);
+
+    psS32 x = 0;
+    psS32 y = 0;
+    psS32 i = 0;
+    psS32 j = 0;
+    psPolynomial1D* *chebPolys = NULL;
+    psS32 maxChebyPoly = 0;
+    double *cScalingFactors = NULL;
+    double *rScalingFactors = NULL;
+    float polySum = 0.0;
+
+    // We scale the pixel positions to values between -1.0 and 1.0
+    // Use static data structures here.
+    rScalingFactors = calcScaleFactors(input->numRows);
+    cScalingFactors = calcScaleFactors(input->numCols);
+
+    // Determine how many Chebyshev polynomials
+    // are needed, then create them.
+    maxChebyPoly = coeffs->nX;
+    if (coeffs->nY > coeffs->nX) {
+        maxChebyPoly = coeffs->nY;
+    }
+
+    chebPolys = p_psCreateChebyshevPolys(maxChebyPoly);
+
+    for (x = 0; x < input->numRows; x++) {
+        for (y = 0; y < input->numCols; y++) {
+            polySum = 0.0;
+            for (i = 0; i < coeffs->nX; i++) {
+                for (j = 0; j < coeffs->nY; j++) {
+                    polySum +=
+                        psPolynomial1DEval(chebPolys[i], rScalingFactors[x]) *
+                        psPolynomial1DEval(chebPolys[j], cScalingFactors[y]) *
+                        coeffs->coeff[i][j];
+                }
+            }
+
+            if (input->type.type == PS_TYPE_S8) {
+                input->data.S8[x][y] = (char) polySum;
+            } else if (input->type.type == PS_TYPE_U16) {
+                input->data.U16[x][y] = (short int) polySum;
+            } else if (input->type.type == PS_TYPE_F32) {
+                input->data.F32[x][y] = (float) polySum;
+            } else if (input->type.type == PS_TYPE_F64) {
+                input->data.F64[x][y] = polySum;
+            }
+        }
+    }
+
+    // Free the Chebyshev polynomials that were
+    // created in this routine.
+    // XXX: Use static data structures here.
+    for (i = 0; i < maxChebyPoly; i++) {
+        psFree(chebPolys[i]);
+    }
+    psFree(chebPolys);
+
+    psFree(cScalingFactors);
+    psFree(rScalingFactors);
+
+    return input;
+}
+
+psImage* p_psImageEvalPolynomialOrd(psImage* input,
+                                    const psPolynomial2D* coeffs)
+{
+    PS_POLY_CHECK_TYPE(coeffs, PS_POLYNOMIAL_ORD, NULL);
+
+    for (int row = 0; row < input->numRows ; row++) {
+        for (int col = 0; col < input->numCols ; col++) {
+            if (input->type.type == PS_TYPE_S8) {
+                input->data.S8[row][col] = (psS8) psPolynomial2DEval(coeffs, (psF32) row, (psF32) col);
+            } else if (input->type.type == PS_TYPE_U16) {
+                input->data.U16[row][col] = (psS16) psPolynomial2DEval(coeffs, (psF32) row, (psF32) col);
+            } else if (input->type.type == PS_TYPE_F32) {
+                input->data.F32[row][col] = psPolynomial2DEval(coeffs, (psF32) row, (psF32) col);
+            } else if (input->type.type == PS_TYPE_F64) {
+                input->data.F64[row][col] = (psF64) psPolynomial2DEval(coeffs, (psF32) row, (psF32) col);
+            }
+        }
+    }
+
+    return(input);
+}
+
+
+/*****************************************************************************
+XXX: I added normal polynomials to this routine.  Let IfA know, put it in the
+psLib SDR.
+ *****************************************************************************/
+psImage* psImageEvalPolynomial(psImage* input,
+                               const psPolynomial2D* coeffs)
+{
+    PS_IMAGE_CHECK_NULL(input, NULL);
+    PS_IMAGE_CHECK_EMPTY(input, NULL);
+    if ((input->type.type != PS_TYPE_S8) &&
+            (input->type.type != PS_TYPE_U16) &&
+            (input->type.type != PS_TYPE_F32) &&
+            (input->type.type != PS_TYPE_F64)) {
+        psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                "Unallowable image type.\n");
+    }
+    PS_POLY_CHECK_NULL(coeffs, NULL);
+
+    if (coeffs->type == PS_POLYNOMIAL_ORD) {
+        return(p_psImageEvalPolynomialOrd(input, coeffs));
+    } else if (coeffs->type == PS_POLYNOMIAL_CHEB) {
+        return(p_psImageEvalPolynomialCheb(input, coeffs));
+    }
+    printf("XXX: Error: wrong polynomial type\n");
+    // XXX: psError()
+    return(NULL);
+}
+
Index: /tags/ipp-1-X/bug123/psLib/src/image/psImageStats.h
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/image/psImageStats.h	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/image/psImageStats.h	(revision 22331)
@@ -0,0 +1,89 @@
+/** @file psImageStats.h
+*  \brief Routines for calculating statistics on images.
+*  @ingroup ImageStats
+*
+*  This file will hold the prototypes for procedures which calculate
+*  statistic on images, histograms on images, and fit/evaluate Chebyshev
+*  polynomials to images.
+*
+*  @author GLG, MHPCC
+*
+*  @version $Revision: 1.21 $ $Name: not supported by cvs2svn $
+*  @date $Date: 2005-03-24 19:39:53 $
+*
+*  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+*/
+#if !defined(PS_IMAGE_STATS_H)
+#define PS_IMAGE_STATS_H
+
+#include "psType.h"
+#include "psVector.h"
+#include "psImage.h"
+#include "psStats.h"
+#include "psFunctions.h"
+
+/// @addtogroup ImageStats
+/// @{
+
+/** This routine must determine the various statistics for the image.
+ *
+ *  Determine statistics for image (or subimage). The statistics to be 
+ *  determined are specified by stats. The mask allows pixels to be excluded 
+ *  if their corresponding mask pixel value matches the value of maskVal. 
+ *  This function must be defined for the following types: psS8, psU16, psF32, 
+ *  psF64.
+ *
+ *  @return psStats*    the resulting statistics result(s)
+ */
+psStats* psImageStats(
+    psStats* stats,                    ///< defines statistics to be calculated
+    const psImage* in,                 ///< image (or subimage) to calculate stats
+    const psImage* mask,               ///< mask data for image (NULL ok)
+    psS32 maskVal                      ///< mask Mask for mask
+);
+
+/** Construct a histogram from an image (or subimage).
+ *
+ *  The histogram to generate is specified by psHistogram hist (see section 
+ *  4.3.2 in SDRS). This function must be defined for the following types: 
+ *  psS8, psU16, psF32, psF64.
+ *
+ *  @return psHistogram*     the resulting histogram
+ */
+psHistogram* psImageHistogram(
+    psHistogram* out,                  ///< input histogram description & target
+    const psImage* in,                 ///< Image data to be histogramed.
+    const psImage* mask,               ///< mask data for image (NULL ok)
+    psU32 maskVal                      ///< mask Mask for mask
+);
+
+/** Fit a 2-D polynomial surface to an image.
+ *
+ *  The input structure coeffs contains the desired order and terms of 
+ *  interest. This function must be defined for the following types: psS8, 
+ *  psU16, psF32, psF64.
+ *
+ *  @return psPolynomial2D*     fitted polynomial result
+ *
+ */
+psPolynomial2D* psImageFitPolynomial(
+    psPolynomial2D* coeffs,            ///< coefficient structure carries in desired terms & target
+    const psImage* input
+);
+
+/** Evaluate a 2-D polynomial surface for the image pixels.
+ *
+ *  Given the input polynomial coefficients, set the image pixel values on the 
+ *  basis of the polynomial function. This function must be defined for the 
+ *  following types: psS8, psU16, psF32, psF64.
+ *
+ *  @return psImage*    the resulting image
+ */
+psImage* psImageEvalPolynomial(
+    psImage* input,                    ///< input image
+    const psPolynomial2D* coeffs       ///< coefficient structure carries in desired terms
+);
+
+/// @}
+
+#endif
Index: /tags/ipp-1-X/bug123/psLib/src/image/psPixels.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/image/psPixels.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/image/psPixels.c	(revision 22331)
@@ -0,0 +1,343 @@
+/** @file  psPixels.c
+ *
+ *  @brief Contains psPixel related functions
+ *
+ *  @ingroup Image
+ *
+ *  @author Robert DeSonia, MHPCC
+ *
+ *  @version $Revision: 1.3 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-04-22 00:06:41 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+
+#include <string.h>
+#include <stdlib.h>
+
+#include "psPixels.h"
+#include "psMemory.h"
+
+typedef struct
+{
+    psS32 x;
+    psS32 y;
+}
+p_psPixelCoord;
+
+typedef int(*qsortCompareFcn)(const void *, const void *);
+
+static void pixelsFree(psPixels* pixels)
+{
+    if (pixels != NULL) {
+        psFree(pixels->x);
+        psFree(pixels->y);
+    }
+}
+
+// for use by qsort, etc.
+static int comparePixelCoord(p_psPixelCoord* coord1, p_psPixelCoord* coord2)
+{
+    // check row first
+    if (coord1->y < coord2->y) {
+        return -1;
+    }
+
+    if (coord1->y > coord2->y) {
+        return 1;
+    }
+
+    // rows are the same, so check column
+    if (coord1->x < coord2->x) {
+        return -1;
+    }
+
+    if (coord1->x > coord2->x) {
+        return 1;
+    }
+
+    return 0;
+}
+
+psPixels* psPixelsAlloc(int size)
+{
+    psPixels* out = psAlloc(sizeof(psPixels));
+
+    if (size > 0) {
+        out->x = psVectorAlloc(size, PS_TYPE_S32);
+        out->y = psVectorAlloc(size, PS_TYPE_S32);
+    } else {
+        out->x = NULL;
+        out->y = NULL;
+    }
+
+    psMemSetDeallocator(out, (psFreeFcn)pixelsFree);
+
+    return NULL;
+}
+
+psPixels* psPixelsRealloc(psPixels* pixels, int size)
+{
+    if (pixels == NULL) {
+        return psPixelsAlloc(size);
+    }
+
+    pixels->x = psVectorRealloc(pixels->x, size);
+    pixels->y = psVectorRealloc(pixels->y, size);
+
+    return pixels;
+}
+
+psImage *psPixelsToMask(psImage *out, const psPixels *pixels, const psRegion *region, unsigned int maskVal)
+{
+    // check that the input pixel vector is valid
+    if (pixels == NULL) {
+        // XXX: Error message
+        psFree(out);
+        return NULL;
+    }
+    psVector* xVec = pixels->x;
+    psVector* yVec = pixels->y;
+    if (xVec == NULL || yVec == NULL) {
+        // XXX: Error message
+        psFree(out);
+        return NULL;
+    }
+    if (xVec->type.type != PS_TYPE_S32) {
+        // XXX: Error message
+        psFree(out);
+        return NULL;
+    }
+    if (yVec->type.type != PS_TYPE_S32) {
+        // XXX: Error message
+        psFree(out);
+        return NULL;
+    }
+
+    // check if the input region is valid
+    if (region == NULL) {
+        // XXX: Error message
+        psFree(out);
+        return NULL;
+    }
+    int x0 = region->x0;
+    int x1 = region->x1;
+    int y0 = region->y0;
+    int y1 = region->y1;
+
+    // determine the output image size
+    int numRows = x1-x0;
+    int numCols = y1-y0;
+    if (numRows < 1 || numCols < 1) {
+        // XXX: Error message
+        psFree(out);
+        return NULL;
+    }
+
+    //  allocate the output image
+    out = psImageRecycle(out, numCols, numRows, PS_TYPE_MASK);
+    if (out == NULL) {
+        // XXX: Error message
+        return NULL;
+    }
+    *(psS32*)&out->row0 = x0;
+    *(psS32*)&out->col0 = y0;
+
+    // initialize image to all zeros
+    int columnByteSize = sizeof(PS_TYPE_MASK)*numCols;
+    for (int row = 0; row < numRows; row++) {
+        memset(out->data.U8[row],0,columnByteSize);
+    }
+
+    // determine the length of the pixel vector
+    int length = pixels->x->n;
+    if (pixels->y->n != length) {
+        // XXX: warning message
+        if (pixels->y->n < length) {
+            length = pixels->y->n;
+        }
+    }
+
+    // cycle through the vector of pixels and insert pixels into image
+    psMaskType** outData = out->data.PS_TYPE_MASK_DATA;
+    for (int p = 0; p < length; p++) {
+        psS32 x = xVec->data.S32[p];
+        psS32 y = yVec->data.S32[p];
+        // pixel in region?
+        if (x >= x0 && x < x1 && y >= y0 && y < y1) {
+            outData[x-x0][y-y0] |= maskVal;
+        }
+    }
+
+    return out;
+}
+
+psPixels *psMaskToPixels(psPixels *out, const psImage *mask, unsigned int maskVal)
+{
+    if (mask == NULL) {
+        // XXX: Error message
+        psFree(out);
+        return NULL;
+    }
+    if (mask->type.type != PS_TYPE_MASK) {
+        // XXX: Error message
+        psFree(out);
+        return NULL;
+    }
+    int numRows = mask->numRows;
+    int numCols = mask->numCols;
+
+    // assumption: number of masked pixels is relatively small compared to
+    // total pixels, so it is best to just start with a guess and resize if
+    // necessary
+    int minPixels = numRows*numCols/100; // initial guess, 1% of pixels masked
+    if (minPixels < 32) { // enforce a minimum size
+        minPixels = 32;
+    }
+    if (out == NULL) {
+        out = psPixelsAlloc(minPixels);
+    }
+    psVector* xVec = out->x;
+    psVector* yVec = out->y;
+
+    // check the x and y vector validity (type/minimum size)
+    if (xVec == NULL || xVec->type.type != PS_TYPE_S32 || xVec->nalloc < minPixels) {
+        xVec = psVectorRecycle(xVec,minPixels,PS_TYPE_S32);
+    }
+    if (yVec == NULL || yVec->type.type != PS_TYPE_S32 || yVec->nalloc < minPixels) {
+        yVec = psVectorRecycle(yVec, minPixels,PS_TYPE_S32);
+    }
+
+    // start with a blank list of pixels
+    xVec->n = 0;
+    yVec->n = 0;
+
+    // find the mask pixels in the image
+    int numPixels = 0;
+    for (int row=0; row<numRows; row++) {
+        psMaskType* maskRow = mask->data.PS_TYPE_MASK_DATA[row];
+        for (int col=0; col<numCols; col++) {
+            if ( (maskRow[col] | maskVal) != 0 ) {
+                // check the vector sizes, and expand if necessary
+                if (xVec->nalloc >= numPixels) {
+                    xVec = psVectorRealloc(xVec, 2*xVec->nalloc);
+                }
+                if (yVec->nalloc >= numPixels) {
+                    yVec = psVectorRealloc(yVec, 2*yVec->nalloc);
+                }
+
+                xVec->data.S32[numPixels] = col;
+                yVec->data.S32[numPixels] = row;
+                numPixels++;
+            }
+        }
+    }
+
+    // return the vectors to the psPixels struct
+    // (n.b., not assuming psVectorRealloc/psVectorRecycle, etc., didn't
+    //  relocate the vectors)
+    out->x = xVec;
+    out->y = yVec;
+
+    return out;
+}
+
+psPixels* psPixelsConcatenate(psPixels *out,const psPixels *pixels)
+{
+    if (pixels == NULL) {
+        // XXX: Error message
+        return NULL;
+    }
+    psVector* xPixels = pixels->x;
+    psVector* yPixels = pixels->y;
+
+    // verify that pixels has well formed vectors (type)
+    if (xPixels->type.type != PS_TYPE_S32 ||
+            yPixels->type.type != PS_TYPE_S32) {
+        // XXX: Error message
+        return NULL;
+    }
+
+    // determine the length of the pixel vector
+    int pixelsLen = xPixels->n;
+    if (yPixels->n != pixelsLen) {
+        // XXX: warning message
+        if (yPixels->n < pixelsLen) {
+            pixelsLen = yPixels->n;
+        }
+    }
+
+    if (out == NULL) {
+        // simple copy of pixels
+        out = psPixelsAlloc(0); // let psVectorCopy allocate the vector
+        out->x = psVectorCopy(out->x,pixels->x,PS_TYPE_S32);
+        out->y = psVectorCopy(out->y,pixels->y,PS_TYPE_S32);
+
+        return out;
+    }
+
+    // make sure the out vectors are allocated
+    psVector* xVec = out->x;
+    psVector* yVec = out->y;
+    if (xVec == NULL) {
+        out->x = xVec = psVectorAlloc(pixelsLen,PS_TYPE_S32);
+        xVec->n = 0;
+    }
+    if (yVec == NULL) {
+        out->y = yVec = psVectorAlloc(pixelsLen,PS_TYPE_S32);
+        yVec->n = 0;
+    }
+
+    // verify that out has well formed vectors (type/size)
+    if (xVec->type.type != PS_TYPE_S32 ||
+            yVec->type.type != PS_TYPE_S32) {
+        // XXX: Error message
+        return NULL;
+    }
+    if (xVec->n != yVec->n) {
+        // XXX: Error message
+        return NULL;
+    }
+    int outLen = xVec->n;
+
+
+    // populate an array of psPixelCoord structs with the out values
+    p_psPixelCoord* coordinates = psAlloc(sizeof(p_psPixelCoord)*(pixelsLen+outLen));
+    psS32* outXData = xVec->data.S32;
+    psS32* outYData = yVec->data.S32;
+    for (int n = 0; n < outLen; n++) {
+        coordinates[n].x = outXData[n];
+        coordinates[n].y = outYData[n];
+    }
+
+    // sort the coordinates array
+    qsort(coordinates, sizeof(p_psPixelCoord), outLen,
+          (qsortCompareFcn)comparePixelCoord);
+
+    // search out for coordinates in pixels
+    int end = outLen;
+    psS32* pixelsXData = xPixels->data.S32;
+    psS32* pixelsYData = yPixels->data.S32;
+    p_psPixelCoord pCoord;
+    for (int n = 0; n < pixelsLen; n++) {
+        pCoord.x = pixelsXData[n];
+        pCoord.y = pixelsYData[n];
+        if (bsearch(&pCoord, coordinates, sizeof(p_psPixelCoord), outLen,
+                    (qsortCompareFcn)comparePixelCoord) == NULL) {
+            coordinates[end++] = pCoord;
+        }
+    }
+
+    // transfer the coordinates data back to psPixels
+    out = psPixelsRealloc(out, end);
+    outXData = xVec->data.S32;
+    outYData = yVec->data.S32;
+    for (int n = 0; n < end; n++) {
+        outXData[n] = coordinates[n].x;
+        outYData[n] = coordinates[n].y;
+    }
+
+    psFree(coordinates);
+
+    return out;
+}
Index: /tags/ipp-1-X/bug123/psLib/src/image/psPixels.h
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/image/psPixels.h	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/image/psPixels.h	(revision 22331)
@@ -0,0 +1,107 @@
+/** @file  psPixels.h
+ *
+ *  @brief Contains psPixel related functions
+ *
+ *  @ingroup Image
+ *
+ *  @author Robert DeSonia, MHPCC
+ *
+ *  @version $Revision: 1.3 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-04-22 00:06:41 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+#ifndef PS_PIXELS_H
+#define PS_PIXELS_H
+
+#include "psImage.h"
+#include "psVector.h"
+
+/// @addtogroup Image
+/// @{
+
+/** list of pixel coordinates
+ *
+ *  Usually an image mask is the best way to carry information about what
+ *  pixels mean what. However, in the case where the number of pixels in which
+ *  we are interested is limited, it is more efï¬cient to simply carry a list
+ *  of pixels. An example of this is in the image combination code, where we
+ *  want to perform an operation on a relatively small fraction of pixels, and
+ *  it is inefï¬cient to go through an entire mask image checking each pixel.
+ *
+ */
+typedef struct
+{
+    psVector *x;                       ///< x coordinate
+    psVector *y;                       ///< y coordinate
+}
+psPixels;
+
+
+/** Allocates a new psPixels structure
+ *
+ *  @return psPixels*   new psPixels
+ */
+psPixels* psPixelsAlloc(
+    int size                           ///< the size of the coordinate vectors
+);
+
+/** resizes a psPixels structure
+ *
+ *  @return psPixels*   resized psPixels
+ */
+psPixels* psPixelsRealloc(
+    psPixels* pixels,                  ///< psPixels to resize, or NULL to create new psPixels
+    int size                           ///< the size of the coordinate vectors
+);
+
+/** Generate a psImage from a psPixels
+ *
+ *  psPixelsToMask shall return an image of type U8 with the pixels lying
+ *  within the speciï¬ed region set to the maskVal. The out image shall be
+ *  modiï¬ed if supplied, or allocated and returned if NULL. The size of the
+ *  output image shall be region->x1 - region->x0 by region->y1 - region->y0,
+ *  with out->x0 = region->x0 and out->y0 = region->y0. In the event that
+ *  either of pixels or region are NULL, the function shall generate an
+ *  error and return NULL.
+ *
+ *  @return psImage*    generated mask image
+ */
+psImage* psPixelsToMask(
+    psImage* out,                      ///< psImage to recycle, or NULL
+    const psPixels* pixels,            ///< list of pixels to use
+    const psRegion* region,            ///< region to define the output mask image
+    unsigned int maskVal               ///< the mask bit-values to act upon
+);
+
+/** Generate a psPixels from a mask psImage
+ *
+ *  psMaskToPixels shall return a psPixels consisting of the coordinates in
+ *  the mask that match the maskVal. The out pixel list shall be modiï¬ed if
+ *  supplied, or allocated and returned if NULL. In hte event that mask is
+ *  NULL, the function shall generate an error and return NULL.
+ *
+ *  @return psPixels*   generated psPixels pixel list
+ */
+psPixels* psMaskToPixels(
+    psPixels *out,                     ///< psPixels to recycle, or NULL
+    const psImage *mask,               ///< the input mask psImage
+    unsigned int maskVal               ///< the mask bit-values to act upon
+);
+
+/** Concatenates two psPixels
+ *
+ *  psPixelsConcatenate shall concatenate pixels onto out. In the event that
+ *  out is NULL, a new psPixels shall be allocated, and the contents of
+ *  pixels simply copied in. If pixels is NULL, the function shall generate
+ *  an error and return NULL. The function shall take care to ensure that
+ *  there are no duplicate pixels in out.
+ *
+ *  @return psPixels         Concatenated psPixel list
+ */
+psPixels* psPixelsConcatenate(
+    psPixels *out,                     ///< psPixels to recycle, or NULL
+    const psPixels *pixels             ///< psPixels to append to OUT
+);
+
+#endif
Index: /tags/ipp-1-X/bug123/psLib/src/imageops/psImageConvolve.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/imageops/psImageConvolve.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/imageops/psImageConvolve.c	(revision 22331)
@@ -0,0 +1,479 @@
+/*  @file  psImageConvolve.c
+ *
+ *  @brief Contains FFT transform related functions for psImage.
+ *
+ *  @author Robert DeSonia, MHPCC
+ *
+ *  @version $Revision: 1.14 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-04-15 00:12:08 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+
+#include <string.h>
+
+#include "psImageConvolve.h"
+#include "psImageFFT.h"
+#include "psImageExtraction.h"
+#include "psBinaryOp.h"
+#include "psMemory.h"
+#include "psLogMsg.h"
+#include "psError.h"
+#include "psImageIO.h"
+
+#include "psImageErrors.h"
+
+#define FOURIER_PADDING 32 /* padding amount in every side of the image for fourier convolution */
+
+static void freeKernel(psKernel* ptr);
+
+psKernel* psKernelAlloc(psS32 xMin, psS32 xMax, psS32 yMin, psS32 yMax)
+{
+    psKernel* result;
+    psS32 numRows;
+    psS32 numCols;
+
+    // following is explicitly spelled out in the SDRS as a requirement
+    if (yMin > yMax) {
+        psLogMsg(__func__, PS_LOG_WARN,
+                 "Specified yMin, %d, was greater than yMax, %d.  Values swapped.",
+                 yMin, yMax);
+
+        psS32 temp = yMin;
+        yMin = yMax;
+        yMax = temp;
+    }
+
+    // following is explicitly spelled out in the SDRS as a requirement
+    if (xMin > xMax) {
+        psLogMsg(__func__, PS_LOG_WARN,
+                 "Specified xMin, %d, was greater than xMax, %d.  Values swapped.",
+                 xMin, xMax);
+
+        psS32 temp = xMin;
+        xMin = xMax;
+        xMax = temp;
+    }
+
+    numRows = yMax - yMin + 1;
+    numCols = xMax - xMin + 1;
+
+    result = psAlloc(sizeof(psKernel));
+    result->xMin = xMin;
+    result->xMax = xMax;
+    result->yMin = yMin;
+    result->yMax = yMax;
+    result->image = psImageAlloc(numCols,numRows,PS_TYPE_KERNEL);
+    memset(result->image->rawDataBuffer,0,numCols*numRows*PSELEMTYPE_SIZEOF(PS_TYPE_KERNEL));
+    result->p_kernelRows = psAlloc(sizeof(psKernelType*)*numRows);
+
+    psKernelType** kernelRows = result->p_kernelRows;
+    psKernelType** imageRows = result->image->data.PS_TYPE_KERNEL_DATA;
+    for (psS32 i = 0; i < numRows; i++) {
+        kernelRows[i] = imageRows[i] - xMin;
+    }
+    result->kernel = kernelRows - yMin;
+
+    psMemSetDeallocator(result,(psFreeFcn)freeKernel);
+
+    return result;
+}
+
+void freeKernel(psKernel* ptr)
+{
+    if (ptr != NULL) {
+        psFree(ptr->image);
+        psFree(ptr->p_kernelRows);
+    }
+}
+
+psKernel* psKernelGenerate(const psVector* tShifts,
+                           const psVector* xShifts,
+                           const psVector* yShifts,
+                           psBool relative)
+{
+    psS32 lastX;
+    psS32 lastY;
+    psS32 lastT;
+    psS32 x;
+    psS32 y;
+    psS32 t;
+    psS32 xMin = 0;
+    psS32 xMax = 0;
+    psS32 yMin = 0;
+    psS32 yMax = 0;
+    psS32 length = 0;
+    psKernelType normalizeTime = 1.0;  // fraction of total time for each shift clock
+    psKernel* result = NULL;
+    psKernelType** kernel = NULL;
+
+    // got non-NULL vectors?
+    if (tShifts == NULL || xShifts == NULL || yShifts == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psImageConvolve_SHIFT_NULL);
+        return NULL;
+    }
+
+    // types match?
+    if (xShifts->type.type != yShifts->type.type ||
+            tShifts->type.type != xShifts->type.type) {
+        char* typeXStr;
+        char* typeYStr;
+        char* typeTStr;
+        PS_TYPE_NAME(typeXStr,xShifts->type.type);
+        PS_TYPE_NAME(typeYStr,yShifts->type.type);
+        PS_TYPE_NAME(typeTStr,tShifts->type.type);
+        psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                PS_ERRORTEXT_psImageConvolve_SHIFT_TYPE_MISMATCH,
+                typeTStr, typeXStr, typeYStr);
+        return NULL;
+    }
+
+    // sizes match?
+    length = xShifts->n;
+    if (length != yShifts->n ||
+            length != tShifts->n) {
+        psError(PS_ERR_BAD_PARAMETER_SIZE, true,
+                "Shift vectors can not be of different sizes.");
+        return NULL;
+    }
+
+    // if no shifts, the kernel is just a 1 at 0,0
+    if (length < 1) {
+        result = psKernelAlloc(0,0,0,0);
+        result->kernel[0][0] = 1;
+        return result;
+    }
+
+    #define KERNEL_GENERATE_CASE(TYPE) \
+case PS_TYPE_##TYPE: { \
+        ps##TYPE *tShiftData = tShifts->data.TYPE; \
+        ps##TYPE *xShiftData = xShifts->data.TYPE; \
+        ps##TYPE *yShiftData = yShifts->data.TYPE; \
+        lastX = xShiftData[length-1]; \
+        lastY = yShiftData[length-1]; \
+        lastT = tShiftData[length-1]; \
+        \
+        for (int lcv = 0; lcv < length; lcv++) { \
+            x = lastX - xShiftData[lcv]; \
+            y = lastY - yShiftData[lcv]; \
+            \
+            if (x < xMin) { \
+                xMin = x; \
+            } else if (x > xMax) { \
+                xMax = x; \
+            } \
+            if (y < yMin) { \
+                yMin = y; \
+            } else if (y > yMax) { \
+                yMax = y; \
+            } \
+        } \
+        \
+        normalizeTime = 1.0 / (psKernelType)(tShiftData[length-1]); \
+        result = psKernelAlloc(xMin,xMax,yMin,yMax); \
+        kernel = result->kernel; \
+        \
+        psS32 prevT = 0; \
+        for (int i = 0; i < length; i++) { \
+            t = tShiftData[i] - prevT; \
+            x = lastX - xShiftData[i]; \
+            y = lastY - yShiftData[i]; \
+            \
+            kernel[y][x] += (psKernelType)t / (psKernelType)lastT; \
+            prevT = tShiftData[i]; \
+        } \
+        break; \
+    }
+
+    #define RELATIVE_KERNEL_GENERATE_CASE(TYPE) \
+case PS_TYPE_##TYPE: { \
+        ps##TYPE *tShiftData = tShifts->data.TYPE; \
+        ps##TYPE *xShiftData = xShifts->data.TYPE; \
+        ps##TYPE *yShiftData = yShifts->data.TYPE; \
+        \
+        x = 0; \
+        y = 0; \
+        t = 0; \
+        \
+        for (int lcv = length-1; lcv >= 0; lcv--) { \
+            t += tShiftData[lcv]; \
+            \
+            if (x < xMin) { \
+                xMin = x; \
+            } else if (x > xMax) { \
+                xMax = x; \
+            } \
+            if (y < yMin) { \
+                yMin = y; \
+            } else if (y > yMax) { \
+                yMax = y; \
+            } \
+            x -= xShiftData[lcv]; \
+            y -= yShiftData[lcv]; \
+            \
+        } \
+        result = psKernelAlloc(xMin,xMax,yMin,yMax); \
+        kernel = result->kernel; \
+        \
+        normalizeTime = 1.0 / (psKernelType)t; \
+        x = 0; \
+        y = 0; \
+        for (psS32 i = length-1; i >= 0; i--) { \
+            kernel[y][x] += (psKernelType)(tShiftData[i]) * normalizeTime; \
+            x -= xShiftData[i]; \
+            y -= yShiftData[i]; \
+            \
+        } \
+        break; \
+    }
+
+    if (relative) {
+        switch (xShifts->type.type) {
+            RELATIVE_KERNEL_GENERATE_CASE(U8);
+            RELATIVE_KERNEL_GENERATE_CASE(U16);
+            RELATIVE_KERNEL_GENERATE_CASE(U32);
+            RELATIVE_KERNEL_GENERATE_CASE(U64);
+            RELATIVE_KERNEL_GENERATE_CASE(S8);
+            RELATIVE_KERNEL_GENERATE_CASE(S16);
+            RELATIVE_KERNEL_GENERATE_CASE(S32);
+            RELATIVE_KERNEL_GENERATE_CASE(S64);
+            RELATIVE_KERNEL_GENERATE_CASE(F32);
+            RELATIVE_KERNEL_GENERATE_CASE(F64);
+            RELATIVE_KERNEL_GENERATE_CASE(C32);
+            RELATIVE_KERNEL_GENERATE_CASE(C64);
+
+        default: {
+                char* typeStr;
+                PS_TYPE_NAME(typeStr,xShifts->type.type);
+                psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                        PS_ERRORTEXT_psImage_IMAGE_TYPE_UNSUPPORTED,
+                        typeStr);
+            }
+        }
+    } else {
+        switch (xShifts->type.type) {
+            KERNEL_GENERATE_CASE(U8);
+            KERNEL_GENERATE_CASE(U16);
+            KERNEL_GENERATE_CASE(U32);
+            KERNEL_GENERATE_CASE(U64);
+            KERNEL_GENERATE_CASE(S8);
+            KERNEL_GENERATE_CASE(S16);
+            KERNEL_GENERATE_CASE(S32);
+            KERNEL_GENERATE_CASE(S64);
+            KERNEL_GENERATE_CASE(F32);
+            KERNEL_GENERATE_CASE(F64);
+            KERNEL_GENERATE_CASE(C32);
+            KERNEL_GENERATE_CASE(C64);
+
+        default: {
+                char* typeStr;
+                PS_TYPE_NAME(typeStr,xShifts->type.type);
+                psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                        PS_ERRORTEXT_psImage_IMAGE_TYPE_UNSUPPORTED,
+                        typeStr);
+            }
+        }
+    }
+
+    return result;
+}
+
+psImage* psImageConvolve(psImage* out, const psImage* in, const psKernel* kernel, psBool direct)
+{
+    if (in == NULL) {
+        psFree(out);
+        return NULL;
+    }
+
+    if (kernel == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psImageConvolve_KERNEL_NULL);
+        psFree(out);
+        return NULL;
+    }
+    psS32 xMin = kernel->xMin;
+    psS32 xMax = kernel->xMax;
+    psS32 yMin = kernel->yMin;
+    psS32 yMax = kernel->yMax;
+    psKernelType** kData = kernel->kernel;
+
+    // make the output image to the proper size and type
+    psS32 numRows = in->numRows;
+    psS32 numCols = in->numCols;
+
+
+
+    if (direct) {
+        // spatial convolution
+
+        #define SPATIAL_CONVOLVE_CASE(TYPE) \
+    case PS_TYPE_##TYPE: { \
+            ps##TYPE** inData = in->data.TYPE; \
+            out = psImageRecycle(out, numCols, numRows, PS_TYPE_##TYPE); \
+            for (psS32 row=0;row<numRows;row++) { \
+                ps##TYPE* outRow = out->data.TYPE[row]; \
+                for (psS32 col=0;col<numCols;col++) { \
+                    ps##TYPE pixel = 0.0; \
+                    for (psS32 kRow = yMin; kRow < yMax; kRow++) { \
+                        if (row-kRow >= 0 && row-kRow < numRows) { \
+                            for (psS32 kCol = xMin; kCol < xMax; kCol++) { \
+                                if (col-kCol >= 0 && col-kCol < numCols) { \
+                                    pixel += kData[kRow][kCol] * inData[row-kRow][col-kCol]; \
+                                } \
+                            } \
+                        } \
+                    } \
+                    outRow[col] = pixel; \
+                } \
+            } \
+        } \
+        break;
+
+        switch (in->type.type) {
+            SPATIAL_CONVOLVE_CASE(U8)
+            SPATIAL_CONVOLVE_CASE(U16)
+            SPATIAL_CONVOLVE_CASE(U32)
+            SPATIAL_CONVOLVE_CASE(U64)
+            SPATIAL_CONVOLVE_CASE(S8)
+            SPATIAL_CONVOLVE_CASE(S16)
+            SPATIAL_CONVOLVE_CASE(S32)
+            SPATIAL_CONVOLVE_CASE(S64)
+            SPATIAL_CONVOLVE_CASE(F32)
+            SPATIAL_CONVOLVE_CASE(F64)
+            SPATIAL_CONVOLVE_CASE(C32)
+            SPATIAL_CONVOLVE_CASE(C64)
+
+        default: {
+                char* typeStr;
+                PS_TYPE_NAME(typeStr,in->type.type);
+                psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                        PS_ERRORTEXT_psImage_IMAGE_TYPE_UNSUPPORTED,
+                        typeStr);
+                psFree(out);
+                return NULL;
+
+            }
+        }
+
+
+    } else {
+        // fourier convolution
+        psS32 paddedCols = numCols+2*FOURIER_PADDING;
+        psS32 paddedRows = numRows+2*FOURIER_PADDING;
+
+        // check to see if kernel is smaller, otherwise padding it up will fail.
+        psS32 kRows = kernel->image->numRows;
+        psS32 kCols = kernel->image->numCols;
+        if (kRows >= numRows || kCols >= numCols) {
+            psError(PS_ERR_BAD_PARAMETER_SIZE, true,
+                    PS_ERRORTEXT_psImageConvolve_KERNEL_TOO_LARGE,
+                    kCols,kRows,
+                    numCols, numRows);
+            psFree(out);
+            return NULL;
+        }
+
+        // pad the image
+        psImage* paddedImage = psImageAlloc(paddedCols,paddedRows,in->type.type);
+        psS32 elementSize = PSELEMTYPE_SIZEOF(in->type.type);
+
+        // zero out padded area on top and bottom
+        memset(paddedImage->data.U8[0],0,FOURIER_PADDING*paddedCols*elementSize);
+        memset(paddedImage->data.U8[FOURIER_PADDING+numRows-1],0,FOURIER_PADDING*paddedCols*elementSize);
+
+        // fill in the image-containing rows.
+        psS32 sidePaddingSize = FOURIER_PADDING*elementSize;
+        psS32 imageRowSize = numCols*elementSize;
+        psU8* paddedData = paddedImage->data.U8[FOURIER_PADDING];
+        for (psS32 row=0;row<numRows;row++) {
+            // zero out padded area on left edge.
+            memset(paddedData,0,sidePaddingSize);
+            paddedData += sidePaddingSize;
+            memcpy(paddedData,in->data.U8[row],imageRowSize);
+            paddedData += imageRowSize;
+            // zero out padded area on right edge.
+            memset(paddedData,0,sidePaddingSize);
+            paddedData += sidePaddingSize;
+        }
+
+        // pad the kernel to the same size of paddedImage
+        psImage* paddedKernel = psImageAlloc(paddedCols,paddedRows,PS_TYPE_KERNEL);
+        memset(paddedKernel->data.U8[0],0,sizeof(psKernelType)*numCols*numRows); // zero-out image
+        psS32 yMax = kernel->yMax;
+        psS32 xMax = kernel->xMax;
+        for (psS32 row = kernel->yMin; row <= yMax;row++) {
+            psS32 padRow = row;
+            if (padRow < 0) {
+                padRow += paddedRows;
+            }
+            psKernelType* padData = paddedKernel->data.PS_TYPE_KERNEL_DATA[padRow];
+            psKernelType* kernelRow = kernel->kernel[row];
+            for (psS32 col = kernel->xMin; col <= xMax; col++) {
+                if (col < 0) {
+                    padData[col+paddedCols] = kernelRow[col];
+                } else {
+                    padData[col] = kernelRow[col];
+                }
+            }
+        }
+
+        psImage* kernelFourier = psImageFFT(NULL, paddedKernel, PS_FFT_FORWARD);
+        if (kernelFourier == NULL) {
+            psError(PS_ERR_UNKNOWN, false,
+                    PS_ERRORTEXT_psImageConvolve_KERNEL_FFT_FAILED);
+            psFree(out);
+            return NULL;
+        }
+
+        psImage* inFourier = psImageFFT(NULL, paddedImage, PS_FFT_FORWARD);
+        if (inFourier == NULL) {
+            psError(PS_ERR_UNKNOWN, false,
+                    PS_ERRORTEXT_psImageConvolve_FFT_FAILED);
+            psFree(out);
+            return NULL;
+        }
+
+        // convolution in fourier domain is just a pixel-wise multiplication
+        for (int row = 0; row < paddedRows; row++) {
+            psC32* inRow = inFourier->data.C32[row];
+            psC32* kRow = kernelFourier->data.C32[row];
+            for (int col = 0; col < paddedCols; col++) {
+                inRow[col] *= kRow[col];
+            }
+        }
+
+        psImage* complexOut = psImageFFT(NULL, inFourier,
+                                         PS_FFT_REVERSE);
+        if (complexOut == NULL) {
+            psError(PS_ERR_UNKNOWN, false,
+                    PS_ERRORTEXT_psImageConvolve_FFT_FAILED);
+            psFree(out);
+            return NULL;
+        }
+
+        // subset out the padded area now.
+        psImage* complexOutSansPad = psImageSubset(complexOut,
+                                     FOURIER_PADDING,FOURIER_PADDING,
+                                     FOURIER_PADDING+numCols,FOURIER_PADDING+numRows);
+
+        out = psImageRecycle(out,numCols,numRows,PS_TYPE_F32);
+        float factor = 1.0f/(float)paddedCols/(float)paddedRows;
+        for (psS32 row = 0; row < numRows; row++) {
+            psF32* outRow = out->data.F32[row];
+            psC32* resultRow = complexOutSansPad->data.C32[row];
+            for (psS32 col = 0; col < numCols; col++) {
+                outRow[col] = crealf(resultRow[col])*factor;
+            }
+        }
+
+        psFree(complexOut); // frees complexOutSansPad, as it is a child.
+        psFree(kernelFourier);
+        psFree(inFourier);
+        psFree(paddedImage);
+        psFree(paddedKernel);
+
+    }
+
+    return out;
+}
Index: /tags/ipp-1-X/bug123/psLib/src/imageops/psImageConvolve.h
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/imageops/psImageConvolve.h	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/imageops/psImageConvolve.h	(revision 22331)
@@ -0,0 +1,121 @@
+/** @file  psImageConvolve.h
+ *
+ *  @brief image convolution functionality
+ *
+ *  @ingroup Transform
+ *
+ *  @author Robert DeSonia, MHPCC
+ *
+ *  @version $Revision: 1.4 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-02-17 19:26:24 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+
+#ifndef PS_IMAGE_CONVOLVE_H
+#define PS_IMAGE_CONVOLVE_H
+
+#include "psImage.h"
+#include "psVector.h"
+#include "psType.h"
+
+#define PS_TYPE_KERNEL PS_TYPE_F32     /**< the data member to use for kernel image */
+#define PS_TYPE_KERNEL_DATA F32        /**< the data member to use for kernel image */
+#define PS_TYPE_KERNEL_NAME "psF32"    /**< the data type for kernel as a string */
+
+typedef psF32 psKernelType;
+
+/** A convolution kernel */
+typedef struct
+{
+    psImage* image;                    ///< Kernel data, in the form of an image
+    psS32 xMin;                          ///< Most negative x index
+    psS32 yMin;                          ///< Most negative y index
+    psS32 xMax;                          ///< Most positive x index
+    psS32 yMax;                          ///< Most positive y index
+    psKernelType** kernel;             ///< Pointer to the kernel data
+    psKernelType** p_kernelRows;       ///< Pointer to the rows of the kernel data; not intended for user use.
+}
+psKernel;
+
+/** Allocates a convolution kernel of the given range
+ *
+ *  In order to perform a convolution, we need to define the convolution 
+ *  kernel. We need a more general object than a psImage so that we can 
+ *  incorporate the offset from the (0, 0) pixel to the (0, 0) value of the 
+ *  kernel. It might be convenient to allow both positive and negative 
+ *  indices to convey the positive and negative shifts. One might consider 
+ *  setting the x0 and y0 members of a psImage to the appropriate offsets, 
+ *  but this is not the purpose of these members, and doing so may affect the 
+ *  behavior of other psImage operations.
+ *
+ *  This construction allows the kernel member to use negative indices, while 
+ *  preserving the location of psMemBlocks relative to allocated memory.
+ *
+ *  The maximum extent of the kernel shifts shall be defined by the xMin, 
+ *  xMax, yMin and yMax members. Note that xMin and yMin, under normal 
+ *  circumstances, should be negative numbers. That is, 
+ *  myKernel->kernel[-3][-2] may be defined if yMin and xMin are equal to or 
+ *  more negative than -3 and -2, respectively.
+ *
+ *  In the event that one of the minimum values is greater than the 
+ *  corresponding maximum value, the function shall generate a warning, and 
+ *  the offending values shall be exchanged.
+ *
+ *  @return psKernel*          A new kernel object
+ */
+psKernel* psKernelAlloc(
+    psS32 xMin,                          ///< Most negative x index
+    psS32 xMax,                          ///< Most positive x index
+    psS32 yMin,                          ///< Most negative y index
+    psS32 yMax                           ///< Most positive y index
+);
+
+/** Generates a kernel given a list of shift values
+ *
+ *  Given a list of values (e.g., shifts made in the course of OT guiding), 
+ *  psKernelGenerate shall return the appropriate kernel.  The vectors xShifts 
+ *  and yShifts, which are a list of shifts relative to some starting point, 
+ *  will be supplied by the user. The elements of the vectors should be of an 
+ *  integer type; otherwise the values shall be truncated to integers. The 
+ *  output kernel shall be normalized such that the sum over the kernel is 
+ *  unity. 
+ *
+ *  If the vectors are not of the same number of elements, then the function 
+ *  shall generate a warning shall be generated, following which, the longer 
+ *  vector trimmed to the length of the shorter, and the function shall continue.
+ *
+ *  @return psKernel*    new Kernel object
+ */
+psKernel* psKernelGenerate(
+    const psVector* tShifts,           ///< list of time shifts
+    const psVector* xShifts,           ///< list of x-axis shifts
+    const psVector* yShifts,           ///< list of y-axis shifts
+    psBool relative
+);
+
+/** convolve an image with a kernel
+ *
+ *  Given an input image and the convolution kernel, psImageConvolve shall 
+ *  convolve the input image, in, with the kernel, kernel and return the 
+ *  convolved image, out.
+ * 
+ *  Two methods shall be available for the convolution: if direct is true, 
+ *  then the convolution shall be performed in real space (appropriate for 
+ *  small kernels); otherwise, the convolution shall be performed using Fast 
+ *  Fourier Transforms (FFTs; appropriate for larger kernels). The latter 
+ *  option involves padding the input image, copying the kernel into an image 
+ *  of the same size as the padded input image, performing an FFT on each, 
+ *  multiplying the FFTs, and performing an inverse FFT before trimming the 
+ *  image back to the original size.
+ *
+ *  @return psImage*  resulting image 
+ */
+psImage* psImageConvolve(
+    psImage* out,                      ///< a psImage to recycle.  If NULL, a new psImage is made.
+    const psImage* in,                 ///< the psImage to convolve
+    const psKernel* kernel,            ///< kernel to colvolve with
+    psBool direct                        ///< specifies method, true=direct convolution, false=fourier
+);
+
+#endif
Index: /tags/ipp-1-X/bug123/psLib/src/imageops/psImageStats.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/imageops/psImageStats.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/imageops/psImageStats.c	(revision 22331)
@@ -0,0 +1,635 @@
+/** @file psImageStats.c
+ *  \brief Routines for calculating statistics on images.
+ *  @ingroup ImageStats
+ *
+ *  This file will hold the prototypes for procedures which calculate
+ *  statistic on images, histograms on images, and fit/evaluate Chebyshev
+ *  polynomials to images.
+ *
+ *  @author GLG, MHPCC
+ *
+ *  @version $Revision: 1.72 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-04-19 04:16:02 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdarg.h>
+#include <float.h>
+#include <math.h>
+#include "psMemory.h"
+#include "psVector.h"
+#include "psTrace.h"
+#include "psError.h"
+#include "psStats.h"
+#include "psImage.h"
+#include "psFunctions.h"
+#include "psImageStats.h"
+#include "psConstants.h"
+#include "psImageErrors.h"
+
+/// This routine must determine the various statistics for the image.
+/*****************************************************************************
+psImageStats(stats, in, mask, maskVal): this routine simply calls the
+psVectorStats() routine, which does the actual statistical calculation.  In
+order to do so, we create dummy psVectors and set their "data" pointer to that
+of the input psImages.
+ 
+XXX: use static psVectors
+ 
+XXX: optimize this.  2k vs 4k, sample mean, takes8 seconds on Gene's machine.
+Should take .2.
+ *****************************************************************************/
+psStats* psImageStats(psStats* stats,
+                      const psImage* in,
+                      const psImage* mask,
+                      psS32 maskVal)
+{
+    psVector *junkData = NULL;
+    psVector *junkMask = NULL;
+
+    PS_PTR_CHECK_NULL(stats, NULL);
+    PS_INT_CHECK_ZERO(stats->options, NULL);
+    PS_IMAGE_CHECK_NULL(in, NULL)
+    if (mask != NULL) {
+        PS_IMAGE_CHECK_TYPE(mask, PS_TYPE_U8, NULL);
+        PS_IMAGE_CHECK_SIZE_EQUAL(in, mask, NULL);
+    }
+
+    if (in->parent == NULL) {
+        // stuff the image data into a psVector struct.
+        junkData = (psVector *) psAlloc(sizeof(psVector));
+        junkData->type = in->type;
+        *(int*)&junkData->nalloc = in->numRows * in->numCols;
+        junkData->n = junkData->nalloc;
+        junkData->data.U8 = in->data.V[0];      // since psImage data is contiguous...
+    } else {
+        // image not necessarily contiguous
+        int numRows = in->numRows;
+        int numCols = in->numCols;
+        int rowSize = numCols * (PSELEMTYPE_SIZEOF(in->type.type));
+
+        junkData = psVectorAlloc(numRows*numCols, in->type.type);
+        junkData->n = junkData->nalloc;
+
+        psU8* data = junkData->data.U8;
+        for (int row = 0; row < numRows; row++) {
+            memcpy(data, in->data.V[row], rowSize);
+            data += rowSize;
+        }
+    }
+
+    if (mask != NULL) {
+        if (mask->parent == NULL) {
+            // stuff the mask data into a psVector struct.
+            junkMask = psAlloc(sizeof(psVector));
+            junkMask->type = mask->type;
+            *(int*)&junkMask->nalloc = mask->numRows * mask->numCols;
+            junkMask->n = junkMask->nalloc;
+            junkMask->data.U8 = mask->data.V[0];
+        } else {
+            // image not necessarily contiguous
+            int numRows = mask->numRows;
+            int numCols = mask->numCols;
+            int rowSize = numCols * (PSELEMTYPE_SIZEOF(mask->type.type));
+
+            junkMask = psVectorAlloc(numRows*numCols, mask->type.type);
+            junkMask->n = junkMask->nalloc;
+
+            psU8* data = junkMask->data.U8;
+            for (int row = 0; row < numRows; row++) {
+                memcpy(data, mask->data.V[row], rowSize);
+                data += rowSize;
+            }
+        }
+    }
+
+    stats = psVectorStats(stats, junkData, NULL, junkMask, maskVal);
+
+    psFree(junkMask);
+    psFree(junkData);
+    return (stats);
+}
+
+/*****************************************************************************
+NOTE: We assume that the psHistogram structure out has already been allocated
+and initialized.
+ *****************************************************************************/
+psHistogram* psImageHistogram(psHistogram* out,
+                              const psImage* in,
+                              const psImage* mask,
+                              psU32 maskVal)
+{
+    PS_PTR_CHECK_NULL(out, NULL);
+    PS_PTR_CHECK_NULL(in, NULL);
+    if (mask != NULL) {
+        PS_IMAGE_CHECK_TYPE(mask, PS_TYPE_U8, NULL);
+        PS_IMAGE_CHECK_SIZE_EQUAL(in, mask, NULL);
+    }
+    psVector* junkData = NULL;
+    psVector* junkMask = NULL;
+
+    if (in->parent == NULL) {
+        // stuff the image data into a psVector struct.
+        junkData = (psVector *) psAlloc(sizeof(psVector));
+        junkData->type = in->type;
+        *(int*)&junkData->nalloc = in->numRows * in->numCols;
+        junkData->n = junkData->nalloc;
+        junkData->data.U8 = in->data.V[0];      // since psImage data is contiguous...
+    } else {
+        // image not necessarily contiguous
+        int numRows = in->numRows;
+        int numCols = in->numCols;
+        int rowSize = numCols * (PSELEMTYPE_SIZEOF(in->type.type));
+
+        junkData = psVectorAlloc(numRows*numCols, in->type.type);
+        junkData->n = junkData->nalloc;
+
+        psU8* data = junkData->data.U8;
+        for (int row = 0; row < numRows; row++) {
+            memcpy(data, in->data.V[row], rowSize);
+            data += rowSize;
+        }
+    }
+
+    if (mask != NULL) {
+        if (mask->parent == NULL) {
+            // stuff the mask data into a psVector struct.
+            junkMask = psAlloc(sizeof(psVector));
+            junkMask->type = mask->type;
+            *(int*)&junkMask->nalloc = mask->numRows * mask->numCols;
+            junkMask->n = junkMask->nalloc;
+            junkMask->data.U8 = mask->data.V[0];
+        } else {
+            // image not necessarily contiguous
+            int numRows = mask->numRows;
+            int numCols = mask->numCols;
+            int rowSize = numCols * (PSELEMTYPE_SIZEOF(mask->type.type));
+
+            junkMask = psVectorAlloc(numRows*numCols, mask->type.type);
+            junkMask->n = junkMask->nalloc;
+
+            psU8* data = junkMask->data.U8;
+            for (int row = 0; row < numRows; row++) {
+                memcpy(data, mask->data.V[row], rowSize);
+                data += rowSize;
+            }
+        }
+    }
+
+    out = psVectorHistogram(out, junkData, NULL, junkMask, maskVal);
+
+    psFree(junkMask);
+    psFree(junkData);
+
+    return (out);
+}
+
+/*****************************************************************************
+calcScaleFactorsEval(n): The Chebyshev polynomials are defined over the
+interval [-1.0 : 1.0].  Images typically have sizes of 512x512 or more.  In
+order to use Chebyshev polynomials, we must scale the coordinates from
+0:512 to -1:1.  This routine takes as input an integer N and produces as
+output a vector of evenly spaced floating point values between -1.0:1.0.
+ 
+XXX: Use the p_psNormalizeVector here?
+ *****************************************************************************/
+double* calcScaleFactors(psS32 n)
+{
+    PS_INT_CHECK_NON_NEGATIVE(n, NULL);
+    psS32 i = 0;
+    double tmp = 0.0;
+    double *scalingFactors = (double *)psAlloc(n * sizeof(double));
+
+    for (i = 0; i < n; i++) {
+        tmp = (double)(n - i);
+        tmp = (PS_PI * (tmp - 0.5)) / ((double)n);
+        scalingFactors[i] = cos(tmp);
+    }
+
+    return (scalingFactors);
+}
+
+// XXX: Use a static array of Chebyshev polynomials.
+psPolynomial1D **p_psCreateChebyshevPolys(psS32 maxChebyPoly)
+{
+    PS_INT_CHECK_POSITIVE(maxChebyPoly, NULL);
+    psPolynomial1D **chebPolys = NULL;
+    psS32 i = 0;
+    psS32 j = 0;
+
+    chebPolys = (psPolynomial1D **) psAlloc(maxChebyPoly * sizeof(psPolynomial1D *));
+    for (i = 0; i < maxChebyPoly; i++) {
+        chebPolys[i] = psPolynomial1DAlloc(i + 1, PS_POLYNOMIAL_ORD);
+    }
+
+    // Create the Chebyshev polynomials.
+    // Polynomial i has i-th order.
+    chebPolys[0]->coeff[0] = 1;
+    chebPolys[1]->coeff[1] = 1;
+    for (i = 2; i < maxChebyPoly; i++) {
+        for (j = 0; j < chebPolys[i - 1]->n; j++) {
+            chebPolys[i]->coeff[j + 1] = 2 * chebPolys[i - 1]->coeff[j];
+        }
+        for (j = 0; j < chebPolys[i - 2]->n; j++) {
+            chebPolys[i]->coeff[j] -= chebPolys[i - 2]->coeff[j];
+        }
+    }
+
+    return (chebPolys);
+}
+
+/*****************************************************************************
+psImageFitPolynomial(): This routine takes as input a 2-D image and produces
+as output the coefficients of the Chebyshev polynomials which match that
+input image.
+  Input:
+  Output:
+  Internal Data Structures:
+    chebPolys[i][j] 
+    sums[i][j]: This will contain the sum of 
+                input->data.F32[x][y] *
+                psPolynomial1DEval(
+chebPolys[i],
+(float) x) *
+                psPolynomial1DEval(
+chebPolys[j],
+(float) y, 
+);
+        over all pixels (x,y) in the image.
+  *****************************************************************************/
+psPolynomial2D* psImageFitPolynomial(psPolynomial2D* coeffs,
+                                     const psImage* input)
+{
+    PS_IMAGE_CHECK_NULL(input, NULL);
+    PS_IMAGE_CHECK_EMPTY(input, NULL);
+    if ((input->type.type != PS_TYPE_S8) &&
+            (input->type.type != PS_TYPE_U16) &&
+            (input->type.type != PS_TYPE_F32) &&
+            (input->type.type != PS_TYPE_F64)) {
+        psError(PS_ERR_BAD_PARAMETER_TYPE, true, "Unallowable image type.\n");
+    }
+    PS_POLY_CHECK_NULL(coeffs, NULL);
+    PS_POLY_CHECK_TYPE(coeffs, PS_POLYNOMIAL_CHEB, NULL);
+    psS32 x = 0;
+    psS32 y = 0;
+    psS32 i = 0;
+    psS32 j = 0;
+    double **sums = NULL;
+    psPolynomial1D* *chebPolys = NULL;
+    psS32 maxChebyPoly = 0;
+    double *cScalingFactors = NULL;
+    double *rScalingFactors = NULL;
+
+    // Create the sums[][] data structure.  This
+    // will hold the LHS of
+    // equation
+    // 29 in the ADD: sums[k][l] = SUM {
+    // image(x,y) * Tk(x) * Tl(y) }
+    sums = (double **)psAlloc(coeffs->nX * sizeof(double *));
+    for (i = 0; i < coeffs->nX; i++) {
+        sums[i] = (double *)psAlloc(coeffs->nY * sizeof(double));
+    }
+    // We scale the pixel positions to values
+    // between -1.0 and 1.0
+    rScalingFactors = calcScaleFactors(input->numRows);
+    cScalingFactors = calcScaleFactors(input->numCols);
+
+    // Determine how many Chebyshev polynomials
+    // are needed, then create them.
+    maxChebyPoly = coeffs->nX;
+    if (coeffs->nY > coeffs->nX) {
+        maxChebyPoly = coeffs->nY;
+    }
+    chebPolys = p_psCreateChebyshevPolys(maxChebyPoly);
+
+    // Compute the sums[][] data structure.
+    for (i = 0; i < coeffs->nX; i++) {
+        for (j = 0; j < coeffs->nY; j++) {
+            sums[i][j] = 0.0;
+            for (x = 0; x < input->numRows; x++) {
+                for (y = 0; y < input->numCols; y++) {
+                    double pixel = 0.0;
+                    if (input->type.type == PS_TYPE_S8) {
+                        pixel = (double) input->data.S8[x][y];
+                    } else if (input->type.type == PS_TYPE_U16) {
+                        pixel = (double) input->data.U16[x][y];
+                    } else if (input->type.type == PS_TYPE_F32) {
+                        pixel = (double) input->data.F32[x][y];
+                    } else if (input->type.type == PS_TYPE_F64) {
+                        pixel = input->data.F64[x][y];
+                    }
+                    sums[i][j] += pixel * psPolynomial1DEval(chebPolys[i],rScalingFactors[x]) *
+                                  psPolynomial1DEval(chebPolys[j], cScalingFactors[y]);
+                }
+            }
+        }
+    }
+
+    for (i = 0; i < coeffs->nX; i++) {
+        for (j = 0; j < coeffs->nY; j++) {
+            coeffs->coeff[i][j] = sums[i][j];
+            coeffs->coeff[i][j] /= (double)(input->numRows * input->numCols);
+
+            if ((i != 0) && (j != 0)) {
+                coeffs->coeff[i][j] *= 4.0;
+            } else if ((i == 0) && (j == 0)) {
+                coeffs->coeff[i][j] *= 1.0;
+            } else {
+                coeffs->coeff[i][j] *= 2.0;
+            }
+        }
+    }
+
+    // Free the Chebyshev polynomials that were
+    // created in this routine.
+    for (i = 0; i < maxChebyPoly; i++) {
+        psFree(chebPolys[i]);
+    }
+    psFree(chebPolys);
+
+    // Free some data
+    for (i = 0; i < coeffs->nX; i++) {
+        psFree(sums[i]);
+    }
+    psFree(sums);
+    psFree(cScalingFactors);
+    psFree(rScalingFactors);
+
+    return (coeffs);
+}
+
+
+
+
+/*****************************************************************************
+psImageFitPolynomial(): This routine takes as input a 2-D image and produces
+as output the coefficients of the Chebyshev polynomials which match that input
+image.  This is a TEST version of the code.  It is not used by anything.
+  Input:
+  Output:
+  Internal Data Structures:
+    chebPolys[i][j] 
+    sums[i][j]: This will contain the sum of 
+                input->data.F32[x][y] *
+                psPolynomial1DEval(
+chebPolys[i],
+(float) x) *
+                psPolynomial1DEval(
+chebPolys[j],
+(float) y, 
+);
+        over all pixels (x,y) in the image.
+  *****************************************************************************/
+psPolynomial2D* psImageFitPolynomialTest(psPolynomial2D* coeffs,
+        const psImage* input)
+{
+    PS_IMAGE_CHECK_NULL(input, NULL);
+    PS_IMAGE_CHECK_EMPTY(input, NULL);
+    if ((input->type.type != PS_TYPE_S8) &&
+            (input->type.type != PS_TYPE_U16) &&
+            (input->type.type != PS_TYPE_F32) &&
+            (input->type.type != PS_TYPE_F64)) {
+        psError(PS_ERR_BAD_PARAMETER_TYPE, true, "Unallowable image type.\n");
+    }
+    PS_POLY_CHECK_NULL(coeffs, NULL);
+    PS_POLY_CHECK_TYPE(coeffs, PS_POLYNOMIAL_CHEB, NULL);
+    psS32 x = 0;
+    psS32 y = 0;
+    psS32 i = 0;
+    psS32 j = 0;
+    double **sums = NULL;
+    psPolynomial1D* *chebPolys = NULL;
+    psS32 maxChebyPoly = 0;
+    double *cScalingFactors = NULL;
+    double *rScalingFactors = NULL;
+    psImage *nodes = psImageAlloc(input->numCols, input->numRows, PS_TYPE_F64);
+
+    double min = -1.0;
+    double max = 1.0;
+    double bma = 0.5 * (max-min);  // 1
+    double bpa = 0.5 * (max+min);  // 0
+    // We must calculate the value of the image at the nodes where the
+    // Chebyshev polynomials are 0.
+    for (x = 0; x < input->numRows; x++) {
+        double xTmp = cos(PS_PI * (0.5 + ((float) x)) / ((float) input->numRows));
+        double xNode = - ((xTmp + bma + bpa) - 1.0);
+        double xOrig = ((float) input->numRows) * (xNode - min) / (max - min);
+
+        for (y = 0; y < input->numCols; y++) {
+            double yTmp = cos(PS_PI * (0.5 + ((float) y)) / ((float) input->numCols));
+            double yNode = - ((yTmp + bma + bpa) - 1.0);
+            double yOrig = ((float) input->numCols) * (yNode - min) / (max - min);
+
+            //            nodes->data.F64[x][y] = psImagePixelInterpolate(input, yNode, xNode, NULL, 0, 0.0, PS_INTERPOLATE_BILINEAR);
+            //            nodes->data.F64[x][y] = psImagePixelInterpolate(input, yTmp, xTmp, NULL, 0, 0.0, PS_INTERPOLATE_BILINEAR);
+            nodes->data.F64[x][y] = psImagePixelInterpolate(input, yOrig, xOrig, NULL, 0, 0.0, PS_INTERPOLATE_BILINEAR);
+        }
+    }
+
+    // Create the sums[][] data structure.  This
+    // will hold the LHS of
+    // equation
+    // 29 in the ADD: sums[k][l] = SUM {
+    // image(x,y) * Tk(x) * Tl(y) }
+    sums = (double **)psAlloc(coeffs->nX * sizeof(double *));
+    for (i = 0; i < coeffs->nX; i++) {
+        sums[i] = (double *)psAlloc(coeffs->nY * sizeof(double));
+    }
+    // We scale the pixel positions to values
+    // between -1.0 and 1.0
+    rScalingFactors = calcScaleFactors(input->numRows);
+    cScalingFactors = calcScaleFactors(input->numCols);
+
+    // Determine how many Chebyshev polynomials
+    // are needed, then create them.
+    maxChebyPoly = coeffs->nX;
+    if (coeffs->nY > coeffs->nX) {
+        maxChebyPoly = coeffs->nY;
+    }
+    chebPolys = p_psCreateChebyshevPolys(maxChebyPoly);
+
+    // Compute the sums[][] data structure.
+    for (i = 0; i < coeffs->nX; i++) {
+        for (j = 0; j < coeffs->nY; j++) {
+            sums[i][j] = 0.0;
+            for (x = 0; x < input->numRows; x++) {
+                for (y = 0; y < input->numCols; y++) {
+                    double pixel;
+                    /*
+                                        if (input->type.type == PS_TYPE_S8) {
+                                            pixel = (double) input->data.S8[x][y];
+                                        } else if (input->type.type == PS_TYPE_U16) {
+                                            pixel = (double) input->data.U16[x][y];
+                                        } else if (input->type.type == PS_TYPE_F32) {
+                                            pixel = (double) input->data.F32[x][y];
+                                        } else if (input->type.type == PS_TYPE_F64) {
+                                            pixel = input->data.F64[x][y];
+                                        }
+                    */
+                    pixel = nodes->data.F64[x][y];
+                    sums[i][j] += pixel * psPolynomial1DEval(chebPolys[i], rScalingFactors[x]) *
+                                  psPolynomial1DEval(chebPolys[j], cScalingFactors[y]);
+                }
+            }
+        }
+    }
+
+    for (i = 0; i < coeffs->nX; i++) {
+        for (j = 0; j < coeffs->nY; j++) {
+            coeffs->coeff[i][j] = sums[i][j];
+            coeffs->coeff[i][j] /= (double)(input->numRows * input->numCols);
+
+            if ((i != 0) && (j != 0)) {
+                coeffs->coeff[i][j] *= 4.0;
+            } else if ((i == 0) && (j == 0)) {
+                coeffs->coeff[i][j] *= 1.0;
+            } else {
+                coeffs->coeff[i][j] *= 2.0;
+            }
+        }
+    }
+
+    // Free the Chebyshev polynomials that were
+    // created in this routine.
+    for (i = 0; i < maxChebyPoly; i++) {
+        psFree(chebPolys[i]);
+    }
+    psFree(chebPolys);
+
+    // Free some data
+    for (i = 0; i < coeffs->nX; i++) {
+        psFree(sums[i]);
+    }
+    psFree(sums);
+    psFree(cScalingFactors);
+    psFree(rScalingFactors);
+    psFree(nodes);
+
+    return (coeffs);
+}
+
+/*****************************************************************************
+XXX: Use static variables for Chebyshev polynomials and scaling factors. 
+ *****************************************************************************/
+psImage* p_psImageEvalPolynomialCheb(psImage* input,
+                                     const psPolynomial2D* coeffs)
+{
+    PS_POLY_CHECK_TYPE(coeffs, PS_POLYNOMIAL_CHEB, NULL);
+
+    psS32 x = 0;
+    psS32 y = 0;
+    psS32 i = 0;
+    psS32 j = 0;
+    psPolynomial1D* *chebPolys = NULL;
+    psS32 maxChebyPoly = 0;
+    double *cScalingFactors = NULL;
+    double *rScalingFactors = NULL;
+    float polySum = 0.0;
+
+    // We scale the pixel positions to values between -1.0 and 1.0
+    // Use static data structures here.
+    rScalingFactors = calcScaleFactors(input->numRows);
+    cScalingFactors = calcScaleFactors(input->numCols);
+
+    // Determine how many Chebyshev polynomials
+    // are needed, then create them.
+    maxChebyPoly = coeffs->nX;
+    if (coeffs->nY > coeffs->nX) {
+        maxChebyPoly = coeffs->nY;
+    }
+
+    chebPolys = p_psCreateChebyshevPolys(maxChebyPoly);
+
+    for (x = 0; x < input->numRows; x++) {
+        for (y = 0; y < input->numCols; y++) {
+            polySum = 0.0;
+            for (i = 0; i < coeffs->nX; i++) {
+                for (j = 0; j < coeffs->nY; j++) {
+                    polySum +=
+                        psPolynomial1DEval(chebPolys[i], rScalingFactors[x]) *
+                        psPolynomial1DEval(chebPolys[j], cScalingFactors[y]) *
+                        coeffs->coeff[i][j];
+                }
+            }
+
+            if (input->type.type == PS_TYPE_S8) {
+                input->data.S8[x][y] = (char) polySum;
+            } else if (input->type.type == PS_TYPE_U16) {
+                input->data.U16[x][y] = (short int) polySum;
+            } else if (input->type.type == PS_TYPE_F32) {
+                input->data.F32[x][y] = (float) polySum;
+            } else if (input->type.type == PS_TYPE_F64) {
+                input->data.F64[x][y] = polySum;
+            }
+        }
+    }
+
+    // Free the Chebyshev polynomials that were
+    // created in this routine.
+    // XXX: Use static data structures here.
+    for (i = 0; i < maxChebyPoly; i++) {
+        psFree(chebPolys[i]);
+    }
+    psFree(chebPolys);
+
+    psFree(cScalingFactors);
+    psFree(rScalingFactors);
+
+    return input;
+}
+
+psImage* p_psImageEvalPolynomialOrd(psImage* input,
+                                    const psPolynomial2D* coeffs)
+{
+    PS_POLY_CHECK_TYPE(coeffs, PS_POLYNOMIAL_ORD, NULL);
+
+    for (int row = 0; row < input->numRows ; row++) {
+        for (int col = 0; col < input->numCols ; col++) {
+            if (input->type.type == PS_TYPE_S8) {
+                input->data.S8[row][col] = (psS8) psPolynomial2DEval(coeffs, (psF32) row, (psF32) col);
+            } else if (input->type.type == PS_TYPE_U16) {
+                input->data.U16[row][col] = (psS16) psPolynomial2DEval(coeffs, (psF32) row, (psF32) col);
+            } else if (input->type.type == PS_TYPE_F32) {
+                input->data.F32[row][col] = psPolynomial2DEval(coeffs, (psF32) row, (psF32) col);
+            } else if (input->type.type == PS_TYPE_F64) {
+                input->data.F64[row][col] = (psF64) psPolynomial2DEval(coeffs, (psF32) row, (psF32) col);
+            }
+        }
+    }
+
+    return(input);
+}
+
+
+/*****************************************************************************
+XXX: I added normal polynomials to this routine.  Let IfA know, put it in the
+psLib SDR.
+ *****************************************************************************/
+psImage* psImageEvalPolynomial(psImage* input,
+                               const psPolynomial2D* coeffs)
+{
+    PS_IMAGE_CHECK_NULL(input, NULL);
+    PS_IMAGE_CHECK_EMPTY(input, NULL);
+    if ((input->type.type != PS_TYPE_S8) &&
+            (input->type.type != PS_TYPE_U16) &&
+            (input->type.type != PS_TYPE_F32) &&
+            (input->type.type != PS_TYPE_F64)) {
+        psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                "Unallowable image type.\n");
+    }
+    PS_POLY_CHECK_NULL(coeffs, NULL);
+
+    if (coeffs->type == PS_POLYNOMIAL_ORD) {
+        return(p_psImageEvalPolynomialOrd(input, coeffs));
+    } else if (coeffs->type == PS_POLYNOMIAL_CHEB) {
+        return(p_psImageEvalPolynomialCheb(input, coeffs));
+    }
+    printf("XXX: Error: wrong polynomial type\n");
+    // XXX: psError()
+    return(NULL);
+}
+
Index: /tags/ipp-1-X/bug123/psLib/src/imageops/psImageStats.h
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/imageops/psImageStats.h	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/imageops/psImageStats.h	(revision 22331)
@@ -0,0 +1,89 @@
+/** @file psImageStats.h
+*  \brief Routines for calculating statistics on images.
+*  @ingroup ImageStats
+*
+*  This file will hold the prototypes for procedures which calculate
+*  statistic on images, histograms on images, and fit/evaluate Chebyshev
+*  polynomials to images.
+*
+*  @author GLG, MHPCC
+*
+*  @version $Revision: 1.21 $ $Name: not supported by cvs2svn $
+*  @date $Date: 2005-03-24 19:39:53 $
+*
+*  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+*/
+#if !defined(PS_IMAGE_STATS_H)
+#define PS_IMAGE_STATS_H
+
+#include "psType.h"
+#include "psVector.h"
+#include "psImage.h"
+#include "psStats.h"
+#include "psFunctions.h"
+
+/// @addtogroup ImageStats
+/// @{
+
+/** This routine must determine the various statistics for the image.
+ *
+ *  Determine statistics for image (or subimage). The statistics to be 
+ *  determined are specified by stats. The mask allows pixels to be excluded 
+ *  if their corresponding mask pixel value matches the value of maskVal. 
+ *  This function must be defined for the following types: psS8, psU16, psF32, 
+ *  psF64.
+ *
+ *  @return psStats*    the resulting statistics result(s)
+ */
+psStats* psImageStats(
+    psStats* stats,                    ///< defines statistics to be calculated
+    const psImage* in,                 ///< image (or subimage) to calculate stats
+    const psImage* mask,               ///< mask data for image (NULL ok)
+    psS32 maskVal                      ///< mask Mask for mask
+);
+
+/** Construct a histogram from an image (or subimage).
+ *
+ *  The histogram to generate is specified by psHistogram hist (see section 
+ *  4.3.2 in SDRS). This function must be defined for the following types: 
+ *  psS8, psU16, psF32, psF64.
+ *
+ *  @return psHistogram*     the resulting histogram
+ */
+psHistogram* psImageHistogram(
+    psHistogram* out,                  ///< input histogram description & target
+    const psImage* in,                 ///< Image data to be histogramed.
+    const psImage* mask,               ///< mask data for image (NULL ok)
+    psU32 maskVal                      ///< mask Mask for mask
+);
+
+/** Fit a 2-D polynomial surface to an image.
+ *
+ *  The input structure coeffs contains the desired order and terms of 
+ *  interest. This function must be defined for the following types: psS8, 
+ *  psU16, psF32, psF64.
+ *
+ *  @return psPolynomial2D*     fitted polynomial result
+ *
+ */
+psPolynomial2D* psImageFitPolynomial(
+    psPolynomial2D* coeffs,            ///< coefficient structure carries in desired terms & target
+    const psImage* input
+);
+
+/** Evaluate a 2-D polynomial surface for the image pixels.
+ *
+ *  Given the input polynomial coefficients, set the image pixel values on the 
+ *  basis of the polynomial function. This function must be defined for the 
+ *  following types: psS8, psU16, psF32, psF64.
+ *
+ *  @return psImage*    the resulting image
+ */
+psImage* psImageEvalPolynomial(
+    psImage* input,                    ///< input image
+    const psPolynomial2D* coeffs       ///< coefficient structure carries in desired terms
+);
+
+/// @}
+
+#endif
Index: /tags/ipp-1-X/bug123/psLib/src/mainpage.dox
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/mainpage.dox	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/mainpage.dox	(revision 22331)
@@ -0,0 +1,172 @@
+/** @file mainpage.dox
+ *  @brief Main page for the Doxygen documentation
+ *
+ *  @author Robert Daniel DeSonia, MHPCC
+ *
+ *  @version $Revision: 1.14 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-03-31 23:01:46 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+
+/** @mainpage psLib Image Processing Library
+
+@section intro Introduction
+
+This library contains the Pan-STARRS Image Processing Pipeline (IPP) common library,
+psLib. The intended use is to provide a set of basic software functions in which
+can be used throughout the Pan-STARRS project to simplify programming tasks. Among
+the benefits are:
+ - Reuse of code
+ - Simplification of testing
+ - Streamlining of code
+ - Isolation of functionality that may be subject to change
+
+The capabilities provided by psLib are grouped into the following areas which are
+also reflected in the file system directory structure:
+ - System Utilities
+ - Data Collections
+ - Image Operations
+ - Data Manipulation
+ - Astronomy
+
+This list is sorted in hierarchical order: The later entries depend on the functions and
+data types of the earlier entries.
+
+The installed code for psLib consists of header files and binary libraries in
+the form of static and/or shared library, depending on the configuration options.
+To assist in using the library, a script "pslib-config" is supplied that
+provides the compiler and linker options.
+
+
+@section extinstall 3rd Party Libraries
+
+Before building psLib from source, several 3rd party software libraries must
+be installed.  These include:
+ - GNU Scientific Library (GSL)
+     - Available at http://www.gnu.org/software/gsl
+     - Compatibility tested with version 1.4
+ - Fastest Fourier Transform in the West (FFTW), version 3, with single-precison float support
+     - Available at http://www.fftw.org
+     - Compatibility tested with version is 3.0.1
+     - The '--enable-float' option is required in the configure step to enable single-precision float support.  Use 'configure --help' for more information of the configuration options for this library.
+ - C Flexible Image Transport System Input output (CFITSIO), version 2.480 or later
+     - Available at http://heasarc.gsfc.nasa.gov/docs/software/fitsio
+     - Compatibility tested with version 2.490, requires at least 2.480
+ - Gnome XML C parser and toolkit (libxml2)
+     - Available at http://www.xmlsoft.org
+     - Compatibility tested with version 2.6.12 and 2.6.16
+
+Though not required to build the base library, several 3rd party software
+libraries are needed for particular functionality.
+ - Doxygen Documentation System
+     - Required for creation of documentation
+     - Available at http://www.doxygen.org
+     - Compatibility tested with version 1.3.2 and 1.3.8
+     - The optional companion package, GraphViz (a.k.a., the 'dot' command), is recommended to enable header-file dependency diagrams
+ - MySQL
+     - Required for database functionality
+     - Available at http://dev.mysql.com
+     - Compatibility tested with version 4.1.10a, requires at least 4.1.2
+     - A server running locally is required for testing.
+ - Autoconf/Automake
+     - Required only if making from CVS
+     - Available at http://www.gnu.org/software/autoconf and http://www.gnu.org/software/automake
+     - Compatibility tested with version 2.59 (autoconf) and 1.9.2 (automake)
+
+We recommend using the particular versions listed as compatibility tested, as
+that is the only versions of the external libraries tested to work well with psLib.
+Though it is quite possible that later versions of the libraries listed will also
+work as well, care must be taken when upgrading these libraries to verify that its
+functionality is compatible with the tested version.
+
+
+@section obtain How to Obtain the Source
+
+Tested versions of psLib are put into a tar file and can be downloaded from:
+
+https://mhpcc.pan-starrs.org/code/releases
+
+Though MHPCC recommends using the released packaged tar files descibed above,
+both recent daily development snapshots and direct CVS access is available.
+The recent daily snapshots are available at:
+
+https://mhpcc.pan-starrs.org/code/snapshots
+
+These snapshots represents development code as found in CVS on the day
+specified in the filename.  This code set may not be functional, vary in
+testing, etc.  Reasonable efforts are made to ensure that the code does
+actually compile, but given the nature of code development, even that is not
+always the case.  Use snapshots with great caution.
+
+If one has a login account on mhpcc.pan-starrs.org, direct CVS access is
+possible.  Example of the commands required for direct CVS retrieval are
+as follows:
+<pre>
+$ cvs -d:ext:USERNAME@mhpcc.pan-starrs.org:/data/panstarrs/cvsroot co -r RELEASEBRANCH psLib
+</pre>
+where:
+  - USERNAME is your login name on the server
+  - RELEASEBRANCH is the desired release branch, e.g. rel5.
+
+
+@section build How to Build and Test the psLib library
+
+The source uses autoconf/automake to build control the build process.  If, and
+only if, the source came from CVS or a CVS snapshot, the configuration script
+will have to be made via:
+<pre>
+$ cd psLib
+$ make -f Makefile.cvs
+</pre>
+<i>This creates the configure script and Makefile templates.</i>
+
+The recommended steps to build the library are:
+<pre>
+$ cd psLib
+$ ./configure
+$ make
+$ make check
+$ make install
+</pre>
+<i>This builds, tests, and installs the library.</i>
+
+The configure step allows users to specify specific locations for the third
+party libraries (see "3rd Party Libraries" for a list), disabling of select
+functionality (e.g., database and perl module), installation location, etc.
+An enumeration of the options for configure, and the default values, can be
+obtained via "./configure --help".
+
+Though 'make check' compiles and runs the test suite, one can also use custom
+scripts to run all the tests and just a particular test.  To run the unit test
+suite, do the following:
+<pre>
+$ cd psLib/test
+$ ./FullUnitTest
+</pre>
+
+This has the advantage over 'make check' in that it does not stop when a test
+fails and it collects some very basic statistics on the results.  To run a
+particular test, do the following:
+<pre>
+$ runTest testfilename
+</pre>
+
+
+@section doc How to Create Code Documentation
+
+Both HTML and man page documentation may be generated from the inline
+documentation embedded in the code using the following commands:
+<pre>
+$ cd psLib
+$ make docs
+</pre>
+<i>This places documentation in PREFIX/docs/psLib, where PREFIX is set using
+the configure script.</i>
+
+Also, a prebuilt set of code documentation for both the releases and last
+CVS snapshot can be found at:
+
+https://mhpcc.pan-starrs.org/docs/
+
+*/
Index: /tags/ipp-1-X/bug123/psLib/src/math/psBinaryOp.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/math/psBinaryOp.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/math/psBinaryOp.c	(revision 22331)
@@ -0,0 +1,582 @@
+/** @file  psBinaryOp.c
+ *
+ *  @brief Provides binary functions for simple matrix and vector element operations. Functions
+ *  include:
+ *
+ *      Addition (+)
+ *      Subtraction (-)
+ *      Multiplication (*)
+ *      Division (/)
+ *      Power (^)
+ *      Minimum (min)
+ *      Maximum (max)
+ *      Absolute value (abs)
+ *      Exponent (exp)
+ *      Natural Log (ln)
+ *      Power of 10 (ten)
+ *      Log (log)
+ *      Sine (sin or dsin)
+ *      Cosine (cos or dcos)
+ *      Tangent (tan or dtan)
+ *      Arcsine (asin or dasin)
+ *      Arccosine (acos or dacos)
+ *      Arctan (atan or datan)
+ *
+ *  Currently only vector-vector and image-image binary operations are supported.
+ *
+ *  @ingroup MatrixArithmetic
+ *
+ *  @author Ross Harman, MHPCC
+ *  @author Robert DeSonia, MHPCC
+ *
+ *  @version $Revision: 1.1 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-02-10 02:36:41 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+
+/******************************************************************************
+ *  INCLUDE FILES                                                             *
+ ******************************************************************************/
+#include <string.h>
+#include <math.h>
+#include <stdint.h>
+
+#include "psMemory.h"
+#include "psError.h"
+#include "psImage.h"
+#include "psVector.h"
+#include "psScalar.h"
+#include "psLogMsg.h"
+#include "psConstants.h"
+#include "psDataManipErrors.h"
+
+/*****************************************************************************
+ *  FUNCTION IMPLEMENTATION - LOCAL                                          *
+ *****************************************************************************/
+
+// Conversion for degrees to radians
+#define D2R 0.01745329252111111  /* PI/180 */
+
+// Conversion for radians to degrees
+#define R2D 57.29577950924861   /* 180.0/PI */
+
+// Binary SCALAR_XXXX operations
+#define SCALAR_SCALAR(OUT,IN1,OP,IN2,TYPE)                                                                   \
+{                                                                                                            \
+    ps##TYPE *o = NULL;                                                                                      \
+    ps##TYPE *i1 = NULL;                                                                                     \
+    ps##TYPE *i2 = NULL;                                                                                     \
+    o  = &((psScalar* )OUT)->data.TYPE;                                                                      \
+    i1 = &((psScalar* )IN1)->data.TYPE;                                                                      \
+    i2 = &((psScalar* )IN2)->data.TYPE;                                                                      \
+    *o = OP;                                                                                                 \
+}
+
+#define SCALAR_VECTOR(OUT,IN1,OP,IN2,TYPE)                                                                   \
+{                                                                                                            \
+    psS32 i = 0;                                                                                               \
+    psS32 npt = 0;                                                                                             \
+    ps##TYPE *o = NULL;                                                                                      \
+    ps##TYPE *i1 = NULL;                                                                                     \
+    ps##TYPE *i2 = NULL;                                                                                     \
+    npt  = ((psVector* )IN2)->n;                                                                             \
+    o  = ((psVector* )OUT)->data.TYPE;                                                                       \
+    i1 = &((psScalar* )IN1)->data.TYPE;                                                                      \
+    i2 = ((psVector* )IN2)->data.TYPE;                                                                       \
+    for (i=0; i < npt; i++, o++, i2++) {                                                                     \
+        *o = OP;                                                                                             \
+    }                                                                                                        \
+}
+
+#define SCALAR_IMAGE(OUT,IN1,OP,IN2,TYPE)                                                                    \
+{                                                                                                            \
+    psS32 i = 0;                                                                                               \
+    psS32 j = 0;                                                                                               \
+    psS32 numRows = 0;                                                                                         \
+    psS32 numCols = 0;                                                                                         \
+    ps##TYPE *o = NULL;                                                                                      \
+    ps##TYPE *i1 = NULL;                                                                                     \
+    ps##TYPE *i2 = NULL;                                                                                     \
+    numRows = ((psImage* )IN2)->numRows;                                                                     \
+    numCols = ((psImage* )IN2)->numCols;                                                                     \
+    for(j = 0; j < numCols; j++) {                                                                           \
+        o  = ((psImage* )OUT)->data.TYPE[j];                                                                 \
+        i1 = &((psScalar* )IN1)->data.TYPE;                                                                  \
+        i2 = ((psImage* )IN2)->data.TYPE[j];                                                                 \
+        for(i = 0; i < numRows; i++, o++, i2++) {                                                            \
+            *o = OP;                                                                                         \
+        }                                                                                                    \
+    }                                                                                                        \
+}
+
+// Binary VECTOR_XXXX operations
+#define VECTOR_SCALAR(OUT,IN1,OP,IN2,TYPE)                                                                   \
+{                                                                                                            \
+    psS32 i = 0;                                                                                               \
+    psS32 n1 = 0;                                                                                              \
+    ps##TYPE *o = NULL;                                                                                      \
+    ps##TYPE *i1 = NULL;                                                                                     \
+    ps##TYPE *i2 = NULL;                                                                                     \
+    n1  = ((psVector* )IN1)->n;                                                                              \
+    o  = ((psVector* )OUT)->data.TYPE;                                                                       \
+    i1 = ((psVector* )IN1)->data.TYPE;                                                                       \
+    i2 = &((psScalar* )IN2)->data.TYPE;                                                                      \
+    for (i=0; i < n1; i++, o++, i1++) {                                                                      \
+        *o = OP;                                                                                             \
+    }                                                                                                        \
+}
+
+#define VECTOR_VECTOR(OUT,IN1,OP,IN2,TYPE)                                                                   \
+{                                                                                                            \
+    psS32 i = 0;                                                                                             \
+    psS32 n1 = 0;                                                                                            \
+    psS32 n2 = 0;                                                                                            \
+    ps##TYPE *o = NULL;                                                                                      \
+    ps##TYPE *i1 = NULL;                                                                                     \
+    ps##TYPE *i2 = NULL;                                                                                     \
+    n1  = ((psVector* )IN1)->n;                                                                              \
+    n2  = ((psVector* )IN2)->n;                                                                              \
+    if(n1 != n2) {                                                                                           \
+        psError(PS_ERR_BAD_PARAMETER_SIZE, true,                                                             \
+                PS_ERRORTEXT_psMatrix_COUNT_DIFFERS,                                                         \
+                n1, n2);                                                                                     \
+        if (OUT != IN1 && OUT != IN2) {                                                                      \
+            psFree(OUT);                                                                                     \
+        }                                                                                                    \
+        return NULL;                                                                                         \
+    }                                                                                                        \
+    o  = ((psVector* )OUT)->data.TYPE;                                                                       \
+    i1 = ((psVector* )IN1)->data.TYPE;                                                                       \
+    i2 = ((psVector* )IN2)->data.TYPE;                                                                       \
+    for (i=0; i < n1; i++, o++, i1++, i2++) {                                                                \
+        *o = OP;                                                                                             \
+    }                                                                                                        \
+}
+
+#define VECTOR_IMAGE(OUT,IN1,OP,IN2,TYPE)                                                                    \
+{                                                                                                            \
+    psS32 i = 0;                                                                                             \
+    psS32 j = 0;                                                                                             \
+    psS32 n1 = 0;                                                                                            \
+    psS32 numRows2 = 0;                                                                                      \
+    psS32 numCols2 = 0;                                                                                      \
+    psDimen dim1 = 0;                                                                                        \
+    ps##TYPE *o = NULL;                                                                                      \
+    ps##TYPE *i1 = NULL;                                                                                     \
+    ps##TYPE *i2 = NULL;                                                                                     \
+    n1  = ((psVector* )IN1)->n;                                                                              \
+    dim1 = ((psVector* )IN1)->type.dimen;                                                                    \
+    numRows2 = ((psImage* )IN2)->numRows;                                                                    \
+    numCols2 = ((psImage* )IN2)->numCols;                                                                    \
+    \
+    if(dim1 == PS_DIMEN_VECTOR) { /* Regular vectors */                                             \
+        if(n1!=numRows2) {                                                                                   \
+            psError(PS_ERR_BAD_PARAMETER_SIZE, true,                                                         \
+                    PS_ERRORTEXT_psMatrix_COUNT_DIFFERS,                                                           \
+                    n1, numRows2);                                                                           \
+            if (OUT != IN1 && OUT != IN2) {                                                                  \
+                psFree(OUT);                                                                                 \
+            }                                                                                                \
+            return NULL;                                                                                     \
+        }                                                                                                    \
+        \
+        i1 = ((psVector* )IN1)->data.TYPE;                                                                   \
+        for(j = 0; j < numRows2; j++, i1++) {                                                                \
+            o  = ((psImage* )OUT)->data.TYPE[j];                                                             \
+            i2 = ((psImage* )IN2)->data.TYPE[j];                                                             \
+            for(i = 0; i < numCols2; i++, o++, i2++) {                                                       \
+                *o = OP;                                                                                     \
+            }                                                                                                \
+        }                                                                                                    \
+    } else {  /* Transposed vectors */                                                                       \
+        if(n1!=numCols2) {                                                                                   \
+            psError(PS_ERR_BAD_PARAMETER_SIZE, true,                                                 \
+                    PS_ERRORTEXT_psMatrix_COUNT_DIFFERS,                                                     \
+                    n1, numCols2);                       \
+            if (OUT != IN1 && OUT != IN2) {                                                                  \
+                psFree(OUT);                                                                                 \
+            }                                                                                                \
+            return NULL;                                                                                     \
+        }                                                                                                    \
+        \
+        for(j = 0; j < numRows2; j++) {                                                                      \
+            o  = ((psImage* )OUT)->data.TYPE[j];                                                             \
+            i1 = ((psVector* )IN1)->data.TYPE;                                                               \
+            i2 = ((psImage* )IN2)->data.TYPE[j];                                                             \
+            for(i = 0; i < numCols2; i++, o++, i1++, i2++) {                                                 \
+                *o = OP;                                                                                     \
+            }                                                                                                \
+        }                                                                                                    \
+    }                                                                                                        \
+}
+
+// Binary IMAGE_XXXX operations
+#define IMAGE_SCALAR(OUT,IN1,OP,IN2,TYPE)                                                                    \
+{                                                                                                            \
+    psS32 i = 0;                                                                                               \
+    psS32 j = 0;                                                                                               \
+    psS32 numRows = 0;                                                                                         \
+    psS32 numCols = 0;                                                                                         \
+    ps##TYPE *o = NULL;                                                                                      \
+    ps##TYPE *i1 = NULL;                                                                                     \
+    ps##TYPE *i2 = NULL;                                                                                     \
+    numRows = ((psImage* )IN1)->numRows;                                                                     \
+    numCols = ((psImage* )IN1)->numCols;                                                                     \
+    for(j = 0; j < numRows; j++) {                                                                           \
+        o  = ((psImage* )OUT)->data.TYPE[j];                                                                 \
+        i1 = ((psImage* )IN1)->data.TYPE[j];                                                                 \
+        i2 = &((psScalar* )IN2)->data.TYPE;                                                                  \
+        for(i = 0; i < numCols; i++, o++, i1++) {                                                            \
+            *o = OP;                                                                                         \
+        }                                                                                                    \
+    }                                                                                                        \
+}
+
+#define IMAGE_VECTOR(OUT,IN1,OP,IN2,TYPE)                                                                    \
+{                                                                                                            \
+    psS32 i = 0;                                                                                               \
+    psS32 j = 0;                                                                                               \
+    psS32 n2 = 0;                                                                                              \
+    psS32 numRows1 = 0;                                                                                        \
+    psS32 numCols1 = 0;                                                                                        \
+    psDimen dim2 = 0;                                                                                        \
+    ps##TYPE *o = NULL;                                                                                      \
+    ps##TYPE *i1 = NULL;                                                                                     \
+    ps##TYPE *i2 = NULL;                                                                                     \
+    n2  = ((psVector* )IN2)->n;                                                                              \
+    dim2 = ((psVector* )IN2)->type.dimen;                                                                    \
+    numRows1 = ((psImage* )IN1)->numRows;                                                                    \
+    numCols1 = ((psImage* )IN1)->numCols;                                                                    \
+    \
+    if(dim2 == PS_DIMEN_VECTOR) { /* Regular vectors */                                             \
+        if(n2!=numRows1) {                                                                                   \
+            psError(PS_ERR_BAD_PARAMETER_SIZE, true,                                                         \
+                    PS_ERRORTEXT_psMatrix_COUNT_DIFFERS,                                                     \
+                    n2, numRows1);                                                                           \
+            if (OUT != IN1 && OUT != IN2) {                                                                  \
+                psFree(OUT);                                                                                 \
+            }                                                                                                \
+            return NULL;                                                                                     \
+        }                                                                                                    \
+        \
+        i2 = ((psVector* )IN2)->data.TYPE;                                                                   \
+        for(j = 0; j < numRows1; j++, i1++) {                                                                \
+            o  = ((psImage* )OUT)->data.TYPE[j];                                                             \
+            i1 = ((psImage* )IN1)->data.TYPE[j];                                                             \
+            for(i = 0; i < numCols1; i++, o++, i1++) {                                                       \
+                *o = OP;                                                                                     \
+            }                                                                                                \
+        }                                                                                                    \
+    } else {  /* Transposed vectors */                                                                       \
+        if(n2!=numCols1) {                                                                                   \
+            psError(PS_ERR_BAD_PARAMETER_SIZE, true,                                                         \
+                    PS_ERRORTEXT_psMatrix_COUNT_DIFFERS,                                                     \
+                    n2, numCols1);                                                                           \
+            if (OUT != IN1) {                                                                                \
+                psFree(OUT);                                                                                 \
+            }                                                                                                \
+            return NULL;                                                                                     \
+        }                                                                                                    \
+        \
+        for(j = 0; j < numRows1; j++) {                                                                      \
+            o  = ((psImage* )OUT)->data.TYPE[j];                                                             \
+            i1 = ((psVector* )IN2)->data.TYPE;                                                               \
+            i2 = ((psImage* )IN1)->data.TYPE[j];                                                             \
+            for(i = 0; i < numCols1; i++, o++, i2++, i1++) {                                                 \
+                *o = OP;                                                                                     \
+            }                                                                                                \
+        }                                                                                                    \
+    }                                                                                                        \
+}
+
+#define IMAGE_IMAGE(OUT,IN1,OP,IN2,TYPE)                                                                     \
+{                                                                                                            \
+    psS32 i = 0;                                                                                               \
+    psS32 j = 0;                                                                                               \
+    psS32 numRows1 = 0;                                                                                        \
+    psS32 numCols1 = 0;                                                                                        \
+    psS32 numRows2 = 0;                                                                                        \
+    psS32 numCols2 = 0;                                                                                        \
+    ps##TYPE *o = NULL;                                                                                      \
+    ps##TYPE *i1 = NULL;                                                                                     \
+    ps##TYPE *i2 = NULL;                                                                                     \
+    numRows1 = ((psImage* )IN1)->numRows;                                                                    \
+    numCols1 = ((psImage* )IN1)->numCols;                                                                    \
+    numRows2 = ((psImage* )IN2)->numRows;                                                                    \
+    numCols2 = ((psImage* )IN2)->numCols;                                                                    \
+    if(numRows1!=numRows2 || numCols1!=numCols2) {                                                           \
+        psError(PS_ERR_BAD_PARAMETER_SIZE, true,                                                             \
+                PS_ERRORTEXT_psMatrix_IMAGE_SIZE_DIFFERS,                                                     \
+                numCols1, numRows1, numCols2, numRows2);                                                     \
+        if (OUT != IN1 && OUT != IN2) {                                                                      \
+            psFree(OUT);                                                                                     \
+        }                                                                                                    \
+        return NULL;                                                                                         \
+    }                                                                                                        \
+    for(j = 0; j < numRows1; j++) {                                                                          \
+        o  = ((psImage* )OUT)->data.TYPE[j];                                                                 \
+        i1 = ((psImage* )IN1)->data.TYPE[j];                                                                 \
+        i2 = ((psImage* )IN2)->data.TYPE[j];                                                                 \
+        for(i = 0; i < numCols1; i++, o++, i1++, i2++) {                                                     \
+            *o = OP;                                                                                         \
+        }                                                                                                    \
+    }                                                                                                        \
+}
+
+// Preprocessor macro function to create arithmetic function based on input type
+#define BINARY_TYPE(DIM1,DIM2,OUT,IN1,OP,IN2)                                                                \
+switch (IN1->type) {                                                                                         \
+case PS_TYPE_U8:                                                                                             \
+    DIM1##_##DIM2(OUT,IN1,OP,IN2,U8);                                                                        \
+    break;                                                                                                   \
+case PS_TYPE_U16:                                                                                            \
+    DIM1##_##DIM2(OUT,IN1,OP,IN2,U16);                                                                       \
+    break;                                                                                                   \
+case PS_TYPE_U32:                                                                                            \
+    DIM1##_##DIM2(OUT,IN1,OP,IN2,U32);                                                                       \
+    break;                                                                                                   \
+case PS_TYPE_U64:                                                                                            \
+    DIM1##_##DIM2(OUT,IN1,OP,IN2,U64);                                                                       \
+    break;                                                                                                   \
+case PS_TYPE_S8:                                                                                             \
+    DIM1##_##DIM2(OUT,IN1,OP,IN2,S8);                                                                        \
+    break;                                                                                                   \
+case PS_TYPE_S16:                                                                                            \
+    DIM1##_##DIM2(OUT,IN1,OP,IN2,S16);                                                                       \
+    break;                                                                                                   \
+case PS_TYPE_S32:                                                                                            \
+    DIM1##_##DIM2(OUT,IN1,OP,IN2,S32);                                                                       \
+    break;                                                                                                   \
+case PS_TYPE_S64:                                                                                            \
+    DIM1##_##DIM2(OUT,IN1,OP,IN2,S64);                                                                       \
+    break;                                                                                                   \
+case PS_TYPE_F32:                                                                                            \
+    DIM1##_##DIM2(OUT,IN1,OP,IN2,F32);                                                                       \
+    break;                                                                                                   \
+case PS_TYPE_F64:                                                                                            \
+    DIM1##_##DIM2(OUT,IN1,OP,IN2,F64);                                                                       \
+    break;                                                                                                   \
+case PS_TYPE_C32:                                                                                            \
+    DIM1##_##DIM2(OUT,IN1,OP,IN2,C32);                                                                       \
+    break;                                                                                                   \
+case PS_TYPE_C64:                                                                                            \
+    DIM1##_##DIM2(OUT,IN1,OP,IN2,C64);                                                                       \
+    break;                                                                                                   \
+default:                                                                                                     \
+    /* char* strType; \
+    PS_TYPE_NAME(strType,IN1->type);                                                                         \
+    psError(PS_ERR_BAD_PARAMETER_TYPE, true,                                                                 \
+            PS_ERRORTEXT_psMatrix_TYPE_MISMATCH,                                                             \
+            strType);  */                                                                                      \
+    if (OUT != IN1 && OUT != IN2) {                                                                          \
+        psFree(OUT);                                                                                         \
+    }                                                                                                        \
+    return NULL;                                                                                             \
+}
+
+// Preprocessor macro function to create arithmetic function operation name
+#define BINARY_OP(DIM1,DIM2,OUT,IN1,OP,IN2)                                                                  \
+if(!strncmp(OP, "=", 1)) {                                                                                   \
+    BINARY_TYPE(DIM1,DIM2,OUT,IN1,*i2,IN2);                                                                  \
+} else if(!strncmp(OP, "+", 1)) {                                                                            \
+    BINARY_TYPE(DIM1,DIM2,OUT,IN1,*i1 + *i2,IN2);                                                            \
+} else if(!strncmp(OP, "-", 1)) {                                                                            \
+    BINARY_TYPE(DIM1,DIM2,OUT,IN1,*i1 - *i2,IN2);                                                            \
+} else if(!strncmp(OP, "*", 1)) {                                                                            \
+    BINARY_TYPE(DIM1,DIM2,OUT,IN1,*i1 * *i2,IN2);                                                            \
+} else if(!strncmp(OP, "/", 1)) {                                                                            \
+    BINARY_TYPE(DIM1,DIM2,OUT,IN1,*i1 / *i2,IN2);                                                            \
+} else if(!strncmp(OP, "^", 1)) {                                                                            \
+    if(PS_IS_PSELEMTYPE_COMPLEX(IN1->type)) {                                                                \
+        BINARY_TYPE(DIM1,DIM2,OUT,IN1,cpow(*i1,*i2),IN2);                                                    \
+    } else {                                                                                                 \
+        BINARY_TYPE(DIM1,DIM2,OUT,IN1,pow(*i1,*i2),IN2);                                                     \
+    }                                                                                                        \
+} else if(!strncmp(OP, "min", 3)) {                                                                          \
+    if(PS_IS_PSELEMTYPE_COMPLEX(IN1->type)) {                                                                \
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true,                                                            \
+                PS_ERRORTEXT_psMatrix_MIN_COMPLEX_SUPPORT);                                                  \
+        if (OUT != IN1 && OUT != IN2) {                                                                      \
+            psFree(OUT);                                                                                     \
+        }                                                                                                    \
+        return NULL;                                                                                         \
+    } else {                                                                                                 \
+        BINARY_TYPE(DIM1,DIM2,OUT,IN1,fmin(*i1,*i2),IN2);                                                    \
+    }                                                                                                        \
+} else if(!strncmp(OP, "max", 3)) {                                                                          \
+    if(PS_IS_PSELEMTYPE_COMPLEX(IN1->type)) {                                                                \
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true,                                                            \
+                PS_ERRORTEXT_psMatrix_MAX_COMPLEX_SUPPORT);                                                  \
+        if (OUT != IN1 && OUT != IN2) {                                                                      \
+            psFree(OUT);                                                                                     \
+        }                                                                                                    \
+        return NULL;                                                                                         \
+    } else {                                                                                                 \
+        BINARY_TYPE(DIM1,DIM2,OUT,IN1,fmax(*i1,*i2),IN2);                                                    \
+    }                                                                                                        \
+} else {                                                                                                     \
+    psError(PS_ERR_BAD_PARAMETER_VALUE, true,                                                                \
+            PS_ERRORTEXT_psMatrix_OPERATION_UNSUPPORTED,                                                     \
+            OP);                                                                                             \
+    if (OUT != IN1 && OUT != IN2) {                                                                          \
+        psFree(OUT);                                                                                         \
+    }                                                                                                        \
+    return NULL;                                                                                             \
+}
+
+psPtr psBinaryOp(psPtr out, psPtr in1, char *op, psPtr in2)
+{
+
+    psVector* input1 = (psVector* ) in1;
+    psVector* input2 = (psVector* ) in2;
+
+    #define psBinaryOp_EXIT { \
+                              if (out != in1 && out != in2) { \
+                              psFree(out); \
+                              } \
+                              return NULL; \
+                            }
+
+    PS_PTR_CHECK_NULL_GENERAL(input1, psBinaryOp_EXIT);
+    PS_PTR_CHECK_NULL_GENERAL(input2, psBinaryOp_EXIT);
+    PS_PTR_CHECK_NULL_GENERAL(op, psBinaryOp_EXIT);
+
+    PS_PTR_CHECK_TYPE_EQUAL_GENERAL(input1,input2, psBinaryOp_EXIT);
+
+    PS_PTR_CHECK_DIMEN_GENERAL_NOT(input1, PS_DIMEN_OTHER, psBinaryOp_EXIT);
+    PS_PTR_CHECK_DIMEN_GENERAL_NOT(input2, PS_DIMEN_OTHER, psBinaryOp_EXIT);
+
+    psType* psType1 = (psType*)in1;
+    psType* psType2 = (psType*)in2;
+    psDimen dim1 = psType1->dimen;
+    psDimen dim2 = psType2->dimen;
+    psElemType elType1 = psType1->type;
+    psElemType elType2 = psType2->type;
+
+    if (dim1 == PS_DIMEN_VECTOR || dim1 == PS_DIMEN_TRANSV) {
+        if (((psVector* ) in1)->n == 0) {
+            psLogMsg(__func__, PS_LOG_WARN, "Vector contains zero elements");
+        }
+    } else if (dim1 == PS_DIMEN_IMAGE) {
+        if (((psImage* ) in1)->numCols == 0 || ((psImage* ) in1)->numRows == 0) {
+            psLogMsg(__func__, PS_LOG_WARN, "Image contains zero length row or cols");
+        }
+    }
+
+    if (dim2 == PS_DIMEN_VECTOR || dim2 == PS_DIMEN_TRANSV) {
+        if (((psVector* ) in2)->n == 0) {
+            psLogMsg(__func__, PS_LOG_WARN, "Vector contains zero elements");
+        }
+    } else if (dim2 == PS_DIMEN_IMAGE) {
+        if (((psImage* ) in2)->numCols == 0 || ((psImage* ) in2)->numRows == 0) {
+            psLogMsg(__func__, PS_LOG_WARN, "Image contains zero length row or cols");
+        }
+    }
+
+    if (dim1 == PS_DIMEN_SCALAR) {
+        if ( out != NULL && ((psType*)out)->dimen != dim2) {
+            if (out != in1 && out != in2) {
+                psFree(out);
+            }
+            out = NULL;
+        }
+        if (dim2 == PS_DIMEN_SCALAR) {
+            if (out == NULL || ((psScalar*)out)->type.type != elType1) {
+                if (out != in1 && out != in2) {
+                    psFree(out);
+                }
+                out = psScalarAlloc(0.0,elType1);
+            }
+            BINARY_OP(SCALAR, SCALAR, out, psType1, op, psType2);       // scalar op scalar
+        } else if (dim2 == PS_DIMEN_VECTOR || dim2 == PS_DIMEN_TRANSV) {
+            out = psVectorRecycle(out,((psVector*)in2)->n,elType1);
+            if (out == NULL) {
+                psError(PS_ERR_UNKNOWN, false,
+                        PS_ERRORTEXT_psMatrix_OUTPUT_VECTOR_NOT_CREATED);
+                return NULL;
+            }
+            BINARY_OP(SCALAR, VECTOR, out, psType1, op, psType2);       // scalar op vector
+        } else if (dim2 == PS_DIMEN_IMAGE) {
+            out = psImageRecycle(out, ((psImage* ) in2)->numCols, ((psImage* ) in2)->numRows,elType1);
+            if (out == NULL) {
+                psError(PS_ERR_UNKNOWN, false,
+                        PS_ERRORTEXT_psMatrix_OUTPUT_IMAGE_NOT_CREATED);
+                return NULL;
+            }
+            BINARY_OP(SCALAR, IMAGE, out, psType1, op, psType2);        // scalar op image
+        } else {
+            psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                    PS_ERRORTEXT_psMatrix_DIMEN_INVALID,
+                    "in2",dim2);
+            psBinaryOp_EXIT;
+        }
+    } else if (dim1 == PS_DIMEN_VECTOR || dim1 == PS_DIMEN_TRANSV) {
+        if (dim2 == PS_DIMEN_SCALAR) {
+            out = psVectorRecycle(out,((psVector*)in1)->n,elType1);
+            if (out == NULL) {
+                psError(PS_ERR_UNKNOWN, false,
+                        PS_ERRORTEXT_psMatrix_OUTPUT_VECTOR_NOT_CREATED);
+                return NULL;
+            }
+            BINARY_OP(VECTOR, SCALAR, out, psType1, op, psType2);       // vector op scalar
+        } else if (dim2 == PS_DIMEN_VECTOR || dim2 == PS_DIMEN_TRANSV) {
+            out = psVectorRecycle(out,((psVector*)in2)->n,elType2);
+            if (out == NULL) {
+                psError(PS_ERR_UNKNOWN, false,
+                        PS_ERRORTEXT_psMatrix_OUTPUT_VECTOR_NOT_CREATED);
+                return NULL;
+            }
+            BINARY_OP(VECTOR, VECTOR, out, psType1, op, psType2);       // vector op vector
+        } else if (dim2 == PS_DIMEN_IMAGE) {
+            out = psImageRecycle(out, ((psImage* ) in2)->numCols, ((psImage* ) in2)->numRows, elType2);
+            if (out == NULL) {
+                psError(PS_ERR_UNKNOWN, false,
+                        PS_ERRORTEXT_psMatrix_OUTPUT_IMAGE_NOT_CREATED);
+                return NULL;
+            }
+            BINARY_OP(VECTOR, IMAGE, out, psType1, op, psType2);        // vector op image
+        } else {
+            psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                    PS_ERRORTEXT_psMatrix_DIMEN_INVALID,
+                    "in2",dim2);
+            psBinaryOp_EXIT;
+        }
+    } else if (dim1 == PS_DIMEN_IMAGE) {
+        out = psImageRecycle(out, ((psImage*)in1)->numCols, ((psImage*)in1)->numRows, elType1);
+        if (out == NULL) {
+            psError(PS_ERR_UNKNOWN, false,
+                    PS_ERRORTEXT_psMatrix_OUTPUT_IMAGE_NOT_CREATED);
+            return NULL;
+        }
+        if (dim2 == PS_DIMEN_SCALAR) {
+            BINARY_OP(IMAGE, SCALAR, out, psType1, op, psType2);        // image op scalar
+        } else if (dim2 == PS_DIMEN_VECTOR || dim2 == PS_DIMEN_TRANSV) {
+            BINARY_OP(IMAGE, VECTOR, out, psType1, op, psType2);        // image op vector
+        } else if (dim2 == PS_DIMEN_IMAGE) {
+            BINARY_OP(IMAGE, IMAGE, out, psType1, op, psType2); // image op image
+        } else {
+            psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                    PS_ERRORTEXT_psMatrix_DIMEN_INVALID,
+                    "in2",dim2);
+            psBinaryOp_EXIT;
+        }
+    } else {
+        psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                PS_ERRORTEXT_psMatrix_DIMEN_INVALID,
+                "in1",dim1);
+        psBinaryOp_EXIT;
+    }
+
+    // Automtically free psScalar types, since they are usually allocated in the argument list when this
+    // function is called, provided that the input is not the output.
+    if(psType1->dimen==PS_DIMEN_SCALAR && in1!=out) {
+        psFree(in1);
+    }
+
+    if(psType2->dimen==PS_DIMEN_SCALAR && in2!=out) {
+        psFree(in2);
+    }
+
+    return out;
+}
Index: /tags/ipp-1-X/bug123/psLib/src/math/psBinaryOp.h
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/math/psBinaryOp.h	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/math/psBinaryOp.h	(revision 22331)
@@ -0,0 +1,67 @@
+
+/** @file  psBinaryOp.h
+ *
+ *  @brief Provides binary functions for simple matrix and vector element operations. Functions
+ *  include:
+ *
+ *      Addition (+)
+ *      Subtraction (-)
+ *      Multiplication (*)
+ *      Division (/)
+ *      Power (^)
+ *      Minimum (min)
+ *      Maximum (max)
+ *      Absolute value (abs)
+ *      Exponent (exp)
+ *      Natural Log (ln)
+ *      Power of 10 (ten)
+ *      Log (log)
+ *      Sine (sin or dsin)
+ *      Cosine (cos or dcos)
+ *      Tangent (tan or dtan)
+ *      Arcsine (asin or dasin)
+ *      Arccosine (acos or dacos)
+ *      Arctan (atan or datan)
+ *
+ *  Currently only vector-vector and image-image binary operations are supported.
+ *
+ *  @ingroup MatrixArithmetic
+ *
+ *  @author Ross Harman, MHPCC
+ *  @author Robert DeSonia, MHPCC
+ *
+ *  @version $Revision: 1.1 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-02-10 02:36:41 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+
+#ifndef PSBINARY_OP_H
+#define PSBINARY_OP_H
+
+/// @addtogroup MatrixArithmetic
+/// @{
+
+/** Perform simple binary arithmetic with images or vectors
+ *
+ *  Performs addition, subtraction, multiplication, division, power, minumum, and maximum arithmetic
+ *  operations with images and vectors. Uses the form:
+ *
+ *      out = in1 op in2,
+ *
+ *      Where op is: "=", "+", "-", "*", "/", "^", "min", or "max"
+ *
+ *  This function only supports vector-vector or image-image operations.
+ *
+ *  @return  psType* : Pointer to either psImage or psVector.
+ */
+psType* psBinaryOp(
+    psPtr out,                         ///< Output type, either psImage or psVector.
+    psPtr in1,                         ///< First input, either psImage or psVector.
+    char *op,                          ///< Operator.
+    psPtr in2                          ///< Second input, either psImage or psVector.
+);
+
+/// @}
+
+#endif
Index: /tags/ipp-1-X/bug123/psLib/src/math/psCompare.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/math/psCompare.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/math/psCompare.c	(revision 22331)
@@ -0,0 +1,119 @@
+
+/** @file psCompare.c
+ *  @brief Comparison functions for sorting routines
+ *  @ingroup Compare
+ *
+ *  @author Robert Lupton, Princeton University
+ *  @author Robert Daniel DeSonia, MHPCC
+ *
+ *  @version $Revision: 1.8 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-03-17 19:26:19 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+
+#include "psCompare.h"
+
+#define COMPARE_NUMERIC_PTR(TYPE) \
+int psCompare##TYPE##Ptr(const void** a, const void** b) { \
+    return **((ps##TYPE**)a) - **((ps##TYPE**)b); \
+}
+
+#define COMPARE_NUMERIC_PTR_DESCENDING(TYPE) \
+int psCompareDescending##TYPE##Ptr(const void** a, const void** b) { \
+    return **((ps##TYPE**)b) - **((ps##TYPE**)a); \
+}
+
+#define COMPARE_NUMERIC(TYPE) \
+int psCompare##TYPE(const void* a, const void* b) { \
+    return *((ps##TYPE*)a) - *((ps##TYPE*)b); \
+}
+
+#define COMPARE_NUMERIC_DESCENDING(TYPE) \
+int psCompareDescending##TYPE(const void* a, const void* b) { \
+    return *((ps##TYPE*)b) - *((ps##TYPE*)a); \
+}
+
+COMPARE_NUMERIC_PTR(S8)
+COMPARE_NUMERIC_PTR(S16)
+COMPARE_NUMERIC_PTR(S32)
+COMPARE_NUMERIC_PTR(S64)
+COMPARE_NUMERIC_PTR(U8)
+COMPARE_NUMERIC_PTR(U16)
+COMPARE_NUMERIC_PTR(U32)
+COMPARE_NUMERIC_PTR(U64)
+
+int psCompareF32Ptr(const void** a, const void** b)
+{
+    psF32 diff = **((psF32**)a) - **((psF32**)b);
+    return (diff>FLT_EPSILON) ? 1 : ((diff<FLT_EPSILON) ? -1 :0);
+}
+
+int psCompareF64Ptr(const void** a, const void** b)
+{
+    psF64 diff = **((psF64**)a) - **((psF64**)b);
+    return (diff>DBL_EPSILON) ? 1 : ((diff<DBL_EPSILON) ? -1 :0);
+}
+
+COMPARE_NUMERIC_PTR_DESCENDING(S8)
+COMPARE_NUMERIC_PTR_DESCENDING(S16)
+COMPARE_NUMERIC_PTR_DESCENDING(S32)
+COMPARE_NUMERIC_PTR_DESCENDING(S64)
+COMPARE_NUMERIC_PTR_DESCENDING(U8)
+COMPARE_NUMERIC_PTR_DESCENDING(U16)
+COMPARE_NUMERIC_PTR_DESCENDING(U32)
+COMPARE_NUMERIC_PTR_DESCENDING(U64)
+
+int psCompareDescendingF32Ptr(const void** a, const void** b)
+{
+    psF32 diff = **((psF32**)b) - **((psF32**)a);
+    return (diff>FLT_EPSILON) ? 1 : ((diff<FLT_EPSILON) ? -1 :0);
+}
+
+int psCompareDescendingF64Ptr(const void** a, const void** b)
+{
+    psF64 diff = **((psF64**)b) - **((psF64**)a);
+    return (diff>DBL_EPSILON) ? 1 : ((diff<DBL_EPSILON) ? -1 :0);
+}
+
+COMPARE_NUMERIC(S8)
+COMPARE_NUMERIC(S16)
+COMPARE_NUMERIC(S32)
+COMPARE_NUMERIC(S64)
+COMPARE_NUMERIC(U8)
+COMPARE_NUMERIC(U16)
+COMPARE_NUMERIC(U32)
+COMPARE_NUMERIC(U64)
+
+int psCompareF32(const void* a, const void* b)
+{
+    psF32 diff = *((psF32*)a) - *((psF32*)b);
+    return (diff>FLT_EPSILON) ? 1 : ((diff<FLT_EPSILON) ? -1 :0);
+}
+
+int psCompareF64(const void* a, const void* b)
+{
+    psF64 diff = *((psF64*)a) - *((psF64*)b);
+    return (diff>DBL_EPSILON) ? 1 : ((diff<DBL_EPSILON) ? -1 :0);
+}
+
+COMPARE_NUMERIC_DESCENDING(S8)
+COMPARE_NUMERIC_DESCENDING(S16)
+COMPARE_NUMERIC_DESCENDING(S32)
+COMPARE_NUMERIC_DESCENDING(S64)
+COMPARE_NUMERIC_DESCENDING(U8)
+COMPARE_NUMERIC_DESCENDING(U16)
+COMPARE_NUMERIC_DESCENDING(U32)
+COMPARE_NUMERIC_DESCENDING(U64)
+
+int psCompareDescendingF32(const void* a, const void* b)
+{
+    psF32 diff = *((psF32*)b) - *((psF32*)a);
+    return (diff>FLT_EPSILON) ? 1 : ((diff<FLT_EPSILON) ? -1 :0);
+}
+
+int psCompareDescendingF64(const void* a, const void* b)
+{
+    psF64 diff = *((psF64*)b) - *((psF64*)a);
+    return (diff>DBL_EPSILON) ? 1 : ((diff<DBL_EPSILON) ? -1 :0);
+}
Index: /tags/ipp-1-X/bug123/psLib/src/math/psCompare.h
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/math/psCompare.h	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/math/psCompare.h	(revision 22331)
@@ -0,0 +1,508 @@
+/** @file psCompare.h
+ *  @brief Comparison functions for sorting routines
+ *
+ *  @author Robert Daniel DeSonia, MHPCC
+ *
+ *  @ingroup Compare
+ *
+ *  @version $Revision: 1.6 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-02-17 19:26:23 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+
+#if !defined(PS_COMPARE_H)
+#define PS_COMPARE_H
+
+#include "psType.h"
+
+/** @addtogroup Compare
+*  @{
+*/
+
+/** A comparison function for sorting elements that are pointers to data,
+ *  e.g., for psList of pointers to numeric values.
+ *
+ *  @return int      an integer less than, equal to, or greater than zero if 
+ *                   the first argument is considered to be respectively less 
+ *                   than, equal to, or greater than the second. 
+ */
+typedef int (*psComparePtrFcn) (
+    const void **a,                    ///< first comparison target
+    const void **b                     ///< second comparison target
+);
+
+/** A comparison function for sorting.
+ *
+ *  @return int      an integer less than, equal to, or greater than zero if 
+ *                   the first argument is considered to be respectively less 
+ *                   than, equal to, or greater than the second. 
+ */
+typedef int (*psCompareFcn) (
+    const void *a,                     ///< first comparison target
+    const void *b                      ///< second comparison target
+);
+
+/** Compare function of psS8 data.  For use with psListSort.
+ *
+ *  @return int      an integer less than, equal to, or greater than zero if 
+ *                   the first argument is considered to be respectively less 
+ *                   than, equal to, or greater than the second. 
+ */
+int psCompareS8Ptr(
+    const void **a,                    ///< first comparison target
+    const void **b                     ///< second comparison target
+);
+
+/** Compare function of psS16 data.  For use with psListSort.
+ *
+ *  @return int      an integer less than, equal to, or greater than zero if 
+ *                   the first argument is considered to be respectively less 
+ *                   than, equal to, or greater than the second. 
+ */
+int psCompareS16Ptr(
+    const void **a,                    ///< first comparison target
+    const void **b                     ///< second comparison target
+);
+
+/** Compare function of psS32 data.  For use with psListSort.
+ *
+ *  @return int      an integer less than, equal to, or greater than zero if 
+ *                   the first argument is considered to be respectively less 
+ *                   than, equal to, or greater than the second. 
+ */
+int psCompareS32Ptr(
+    const void **a,                    ///< first comparison target
+    const void **b                     ///< second comparison target
+);
+
+/** Compare function of psS64 data.  For use with psListSort.
+ *
+ *  @return int      an integer less than, equal to, or greater than zero if 
+ *                   the first argument is considered to be respectively less 
+ *                   than, equal to, or greater than the second. 
+ */
+int psCompareS64Ptr(
+    const void **a,                    ///< first comparison target
+    const void **b                     ///< second comparison target
+);
+
+/** Compare function of psU8 data.  For use with psListSort.
+ *
+ *  @return int      an integer less than, equal to, or greater than zero if 
+ *                   the first argument is considered to be respectively less 
+ *                   than, equal to, or greater than the second. 
+ */
+int psCompareU8Ptr(
+    const void **a,                    ///< first comparison target
+    const void **b                     ///< second comparison target
+);
+
+/** Compare function of psU16 data.  For use with psListSort.
+ *
+ *  @return int      an integer less than, equal to, or greater than zero if 
+ *                   the first argument is considered to be respectively less 
+ *                   than, equal to, or greater than the second. 
+ */
+int psCompareU16Ptr(
+    const void **a,                    ///< first comparison target
+    const void **b                     ///< second comparison target
+);
+
+/** Compare function of psU32 data.  For use with psListSort.
+ *
+ *  @return int      an integer less than, equal to, or greater than zero if 
+ *                   the first argument is considered to be respectively less 
+ *                   than, equal to, or greater than the second. 
+ */
+int psCompareU32Ptr(
+    const void **a,                    ///< first comparison target
+    const void **b                     ///< second comparison target
+);
+
+/** Compare function of psU64 data.  For use with psListSort.
+ *
+ *  @return int      an integer less than, equal to, or greater than zero if 
+ *                   the first argument is considered to be respectively less 
+ *                   than, equal to, or greater than the second. 
+ */
+int psCompareU64Ptr(
+    const void **a,                    ///< first comparison target
+    const void **b                     ///< second comparison target
+);
+
+/** Compare function of psF32 data.  For use with psListSort.
+ *
+ *  @return int      an integer less than, equal to, or greater than zero if 
+ *                   the first argument is considered to be respectively less 
+ *                   than, equal to, or greater than the second. 
+ */
+int psCompareF32Ptr(
+    const void **a,                    ///< first comparison target
+    const void **b                     ///< second comparison target
+);
+
+/** Compare function of psF64 data.  For use with psListSort.
+ *
+ *  @return int      an integer less than, equal to, or greater than zero if 
+ *                   the first argument is considered to be respectively less 
+ *                   than, equal to, or greater than the second. 
+ */
+int psCompareF64Ptr(
+    const void **a,                    ///< first comparison target
+    const void **b                     ///< second comparison target
+);
+
+/** Compare function of psS8 data.  For use with psListSort for descending ordering.
+ *
+ *  @return int      an integer less than, equal to, or greater than zero if 
+ *                   the first argument is considered to be respectively greater 
+ *                   than, equal to, or less than the second. 
+ */
+int psCompareDescendingS8Ptr(
+    const void **a,                    ///< first comparison target
+    const void **b                     ///< second comparison target
+);
+
+/** Compare function of psS16 data.  For use with psListSort for descending ordering.
+ *
+ *  @return int      an integer less than, equal to, or greater than zero if 
+ *                   the first argument is considered to be respectively greater 
+ *                   than, equal to, or less than the second. 
+ */
+int psCompareDescendingS16Ptr(
+    const void **a,                    ///< first comparison target
+    const void **b                     ///< second comparison target
+);
+
+/** Compare function of psS32 data.  For use with psListSort for descending ordering.
+ *
+ *  @return int      an integer less than, equal to, or greater than zero if 
+ *                   the first argument is considered to be respectively greater 
+ *                   than, equal to, or less than the second. 
+ */
+int psCompareDescendingS32Ptr(
+    const void **a,                    ///< first comparison target
+    const void **b                     ///< second comparison target
+);
+
+/** Compare function of psS64 data.  For use with psListSort for descending ordering.
+ *
+ *  @return int      an integer less than, equal to, or greater than zero if 
+ *                   the first argument is considered to be respectively greater 
+ *                   than, equal to, or less than the second. 
+ */
+int psCompareDescendingS64Ptr(
+    const void **a,                    ///< first comparison target
+    const void **b                     ///< second comparison target
+);
+
+/** Compare function of psU8 data.  For use with psListSort for descending ordering.
+ *
+ *  @return int      an integer less than, equal to, or greater than zero if 
+ *                   the first argument is considered to be respectively greater 
+ *                   than, equal to, or less than the second. 
+ */
+int psCompareDescendingU8Ptr(
+    const void **a,                    ///< first comparison target
+    const void **b                     ///< second comparison target
+);
+
+/** Compare function of psU16 data.  For use with psListSort for descending ordering.
+ *
+ *  @return int      an integer less than, equal to, or greater than zero if 
+ *                   the first argument is considered to be respectively greater 
+ *                   than, equal to, or less than the second. 
+ */
+int psCompareDescendingU16Ptr(
+    const void **a,                    ///< first comparison target
+    const void **b                     ///< second comparison target
+);
+
+/** Compare function of psU32 data.  For use with psListSort for descending ordering.
+ *
+ *  @return int      an integer less than, equal to, or greater than zero if 
+ *                   the first argument is considered to be respectively greater 
+ *                   than, equal to, or lessg than the second. 
+ */
+int psCompareDescendingU32Ptr(
+    const void **a,                    ///< first comparison target
+    const void **b                     ///< second comparison target
+);
+
+/** Compare function of psU64 data.  For use with psListSort for descending ordering.
+ *
+ *  @return int      an integer less than, equal to, or greater than zero if 
+ *                   the first argument is considered to be respectively greater 
+ *                   than, equal to, or lessg than the second. 
+ */
+int psCompareDescendingU64Ptr(
+    const void **a,                    ///< first comparison target
+    const void **b                     ///< second comparison target
+);
+
+/** Compare function of psF32 data.  For use with psListSort for descending ordering.
+ *
+ *  @return int      an integer less than, equal to, or greater than zero if 
+ *                   the first argument is considered to be respectively greater 
+ *                   than, equal to, or lessg than the second. 
+ */
+int psCompareDescendingF32Ptr(
+    const void **a,                    ///< first comparison target
+    const void **b                     ///< second comparison target
+);
+
+/** Compare function of psF64 data.  For use with psListSort for descending ordering.
+ *
+ *  @return int      an integer less than, equal to, or greater than zero if 
+ *                   the first argument is considered to be respectively greater 
+ *                   than, equal to, or lessg than the second. 
+ */
+int psCompareDescendingF64Ptr(
+    const void **a,                    ///< first comparison target
+    const void **b                     ///< second comparison target
+);
+
+/** Compare function of psS8 data.
+ *
+ *  @return int      an integer less than, equal to, or greater than zero if 
+ *                   the first argument is considered to be respectively less 
+ *                   than, equal to, or greater than the second. 
+ */
+int psCompareS8(
+    const void *a,                     ///< first comparison target
+    const void *b                      ///< second comparison target
+);
+
+
+/** Compare function of psS16 data.
+ *
+ *  @return int      an integer less than, equal to, or greater than zero if 
+ *                   the first argument is considered to be respectively less 
+ *                   than, equal to, or greater than the second. 
+ */
+int psCompareS16(
+    const void *a,                     ///< first comparison target
+    const void *b                      ///< second comparison target
+);
+
+
+/** Compare function of psS32 data.
+ *
+ *  @return int      an integer less than, equal to, or greater than zero if 
+ *                   the first argument is considered to be respectively less 
+ *                   than, equal to, or greater than the second. 
+ */
+int psCompareS32(
+    const void *a,                     ///< first comparison target
+    const void *b                      ///< second comparison target
+);
+
+
+/** Compare function of psS64 data.
+ *
+ *  @return int      an integer less than, equal to, or greater than zero if 
+ *                   the first argument is considered to be respectively less 
+ *                   than, equal to, or greater than the second. 
+ */
+int psCompareS64(
+    const void *a,                     ///< first comparison target
+    const void *b                      ///< second comparison target
+);
+
+
+/** Compare function of psU8 data.
+ *
+ *  @return int      an integer less than, equal to, or greater than zero if 
+ *                   the first argument is considered to be respectively less 
+ *                   than, equal to, or greater than the second. 
+ */
+int psCompareU8(
+    const void *a,                     ///< first comparison target
+    const void *b                      ///< second comparison target
+);
+
+
+/** Compare function of psU16 data.
+ *
+ *  @return int      an integer less than, equal to, or greater than zero if 
+ *                   the first argument is considered to be respectively less 
+ *                   than, equal to, or greater than the second. 
+ */
+int psCompareU16(
+    const void *a,                     ///< first comparison target
+    const void *b                      ///< second comparison target
+);
+
+
+/** Compare function of psU32 data.
+ *
+ *  @return int      an integer less than, equal to, or greater than zero if 
+ *                   the first argument is considered to be respectively less 
+ *                   than, equal to, or greater than the second. 
+ */
+int psCompareU32(
+    const void *a,                     ///< first comparison target
+    const void *b                      ///< second comparison target
+);
+
+
+/** Compare function of psU64 data.
+ *
+ *  @return int      an integer less than, equal to, or greater than zero if 
+ *                   the first argument is considered to be respectively less 
+ *                   than, equal to, or greater than the second. 
+ */
+int psCompareU64(
+    const void *a,                     ///< first comparison target
+    const void *b                      ///< second comparison target
+);
+
+
+/** Compare function of psF32 data.
+ *
+ *  @return int      an integer less than, equal to, or greater than zero if 
+ *                   the first argument is considered to be respectively less 
+ *                   than, equal to, or greater than the second. 
+ */
+int psCompareF32(
+    const void *a,                     ///< first comparison target
+    const void *b                      ///< second comparison target
+);
+
+
+/** Compare function of psF64 data.
+ *
+ *  @return int      an integer less than, equal to, or greater than zero if 
+ *                   the first argument is considered to be respectively less 
+ *                   than, equal to, or greater than the second. 
+ */
+int psCompareF64(
+    const void *a,                     ///< first comparison target
+    const void *b                      ///< second comparison target
+);
+
+
+/** Compare function of psS8 data.
+ *
+ *  @return int      an integer less than, equal to, or greater than zero if 
+ *                   the first argument is considered to be respectively greater 
+ *                   than, equal to, or less than the second. 
+ */
+int psCompareDescendingS8(
+    const void *a,                     ///< first comparison target
+    const void *b                      ///< second comparison target
+);
+
+
+/** Compare function of psS16 data.
+ *
+ *  @return int      an integer less than, equal to, or greater than zero if 
+ *                   the first argument is considered to be respectively greater 
+ *                   than, equal to, or less than the second. 
+ */
+int psCompareDescendingS16(
+    const void *a,                     ///< first comparison target
+    const void *b                      ///< second comparison target
+);
+
+
+/** Compare function of psS32 data.
+ *
+ *  @return int      an integer less than, equal to, or greater than zero if 
+ *                   the first argument is considered to be respectively greater 
+ *                   than, equal to, or less than the second. 
+ */
+int psCompareDescendingS32(
+    const void *a,                     ///< first comparison target
+    const void *b                      ///< second comparison target
+);
+
+
+/** Compare function of psS64 data.
+ *
+ *  @return int      an integer less than, equal to, or greater than zero if 
+ *                   the first argument is considered to be respectively greater 
+ *                   than, equal to, or less than the second. 
+ */
+int psCompareDescendingS64(
+    const void *a,                     ///< first comparison target
+    const void *b                      ///< second comparison target
+);
+
+
+/** Compare function of psU8 data.
+ *
+ *  @return int      an integer less than, equal to, or greater than zero if 
+ *                   the first argument is considered to be respectively greater 
+ *                   than, equal to, or less than the second. 
+ */
+int psCompareDescendingU8(
+    const void *a,                     ///< first comparison target
+    const void *b                      ///< second comparison target
+);
+
+
+/** Compare function of psU16 data.
+ *
+ *  @return int      an integer less than, equal to, or greater than zero if 
+ *                   the first argument is considered to be respectively greater 
+ *                   than, equal to, or less than the second. 
+ */
+int psCompareDescendingU16(
+    const void *a,                     ///< first comparison target
+    const void *b                      ///< second comparison target
+);
+
+
+/** Compare function of psU32 data.
+ *
+ *  @return int      an integer less than, equal to, or greater than zero if 
+ *                   the first argument is considered to be respectively greater 
+ *                   than, equal to, or less than the second. 
+ */
+int psCompareDescendingU32(
+    const void *a,                     ///< first comparison target
+    const void *b                      ///< second comparison target
+);
+
+
+/** Compare function of psU64 data.
+ *
+ *  @return int      an integer less than, equal to, or greater than zero if 
+ *                   the first argument is considered to be respectively greater 
+ *                   than, equal to, or less than the second. 
+ */
+int psCompareDescendingU64(
+    const void *a,                     ///< first comparison target
+    const void *b                      ///< second comparison target
+);
+
+
+/** Compare function of psF32 data.
+ *
+ *  @return int      an integer less than, equal to, or greater than zero if 
+ *                   the first argument is considered to be respectively greater 
+ *                   than, equal to, or less than the second. 
+ */
+int psCompareDescendingF32(
+    const void *a,                     ///< first comparison target
+    const void *b                      ///< second comparison target
+);
+
+
+/** Compare function of psF64 data.
+ *
+ *  @return int      an integer less than, equal to, or greater than zero if 
+ *                   the first argument is considered to be respectively greater 
+ *                   than, equal to, or less than the second. 
+ */
+int psCompareDescendingF64(
+    const void *a,                     ///< first comparison target
+    const void *b                      ///< second comparison target
+);
+
+
+/// @}
+
+#endif
Index: /tags/ipp-1-X/bug123/psLib/src/math/psConstants.h
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/math/psConstants.h	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/math/psConstants.h	(revision 22331)
@@ -0,0 +1,639 @@
+/** @file  psConstants.h
+ *
+ *  This file will hold definitions of various constants as well as common
+ *  macros used throughout psLib.
+ *
+ *  @author GLG, MHPCC
+ *
+ *  @version $Revision: 1.64 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-04-14 03:23:55 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ *
+ *  XXX: Add parenthesis around all arguments so that these macros can be
+ *       called with complex expressions.
+ *
+ *  XXX: All functions which use the PS_CHECK macros must be scrutinized so
+ *  that we ensure that an argument which is expected to be output is
+ *  psFree'ed before reurning NULL.
+ *
+ */
+
+/*****************************************************************************
+These constants are used by various functions in the psLib.
+ *****************************************************************************/
+#define PS_DETERMINE_BRACKET_STEP_SIZE 0.10
+#define PS_MAX_LMM_ITERATIONS 100
+#define PS_MAX_MINIMIZE_ITERATIONS 100
+#define PS_LEFT_SPLINE_DERIV 0.0
+#define PS_RIGHT_SPLINE_DERIV 0.0
+/*****************************************************************************
+These are common mathimatical constants used by various functions in the psLib.
+ *****************************************************************************/
+#define PS_ONE 1.0
+#define PS_PI   3.1415926535897932384626433832795029  /* pi */
+#define PS_PI_2 1.5707963267948966192313216916397514  /* pi/2 */
+#define PS_PI_4 0.7853981633974483096156608458198757  /* pi/4 */
+#define PS_1_PI 0.3183098861837906715377675267450287  /* 1/pi */
+#define PS_2_PI 0.6366197723675813430755350534900574  /* 2/pi */
+
+#define PS_COT(X) (1.0 / atan(X))
+#define DEG_TO_RAD(DEGREES) ((DEGREES) * PS_PI / 180.0)
+#define MIN_TO_RAD(MINUTES) ((MINUTES) * PS_PI / (180.0 * 60.0))
+#define SEC_TO_RAD(SECONDS) ((SECONDS) * PS_PI / (180.0 * 60.0 * 60.0))
+#define RAD_TO_DEG(RADIANS) ((RADIANS) * 180.0 / PS_PI)
+#define RAD_TO_MIN(RADIANS) ((RADIANS) * 180.0 * 60.0 / PS_PI)
+#define RAD_TO_SEC(RADIANS) ((RADIANS) * 180.0 * 60.0 * 60.0 / PS_PI)
+
+/*****************************************************************************
+ 
+*****************************************************************************/
+
+#define PS_INT_CHECK_EQUALS(NAME1, NAME2, RVAL) \
+if (NAME1 == NAME2) { \
+    psError(PS_ERR_BAD_PARAMETER_VALUE, true, \
+            "Error: %s and %s are equal.", \
+            #NAME1, #NAME2); \
+    return(RVAL); \
+}
+
+#define PS_INT_CHECK_NON_EQUALS(NAME1, NAME2, RVAL) \
+if (NAME1 != NAME2) { \
+    psError(PS_ERR_BAD_PARAMETER_VALUE, true, \
+            "Error: %s and %s are not equal.", \
+            #NAME1, #NAME2); \
+    return(RVAL); \
+}
+
+#define PS_INT_CHECK_NON_NEGATIVE(NAME, RVAL) \
+if (NAME < 0) { \
+    psError(PS_ERR_BAD_PARAMETER_VALUE, true, \
+            "Error: %s is less than 0.", #NAME); \
+    return(RVAL); \
+}
+
+#define PS_INT_CHECK_POSITIVE(NAME, RVAL) \
+if (NAME < 1) { \
+    psError(PS_ERR_BAD_PARAMETER_VALUE, true, \
+            "Error: %s is 0 or less.", #NAME); \
+    return(RVAL); \
+}
+
+#define PS_INT_CHECK_ZERO(NAME, RVAL) \
+if (NAME < 1) { \
+    psError(PS_ERR_BAD_PARAMETER_VALUE, true, \
+            "Error: %s is 0.", #NAME); \
+    return(RVAL); \
+}
+
+#define PS_INT_CHECK_RANGE(NAME, LOWER, UPPER, RVAL) \
+if ((int)NAME < LOWER || (int)NAME > UPPER) { \
+    psError(PS_ERR_BAD_PARAMETER_VALUE, true, \
+            "Error: %s, %d, is out of range.  Must be between %d and %d.", \
+            #NAME,(int)NAME,LOWER,UPPER); \
+    return RVAL; \
+}
+
+// Produce an error if (NAME1 > NAME2)
+#define PS_INT_COMPARE(NAME1, NAME2, RVAL) \
+if (NAME1 > NAME2) { \
+    psError(PS_ERR_BAD_PARAMETER_VALUE, true, \
+            "Error: (%s > %s) (%d %d).", \
+            #NAME1, #NAME2, NAME1, NAME2); \
+    return(RVAL); \
+}
+
+
+// Produce an error if ((NAME1 > NAME2)
+#define PS_FLOAT_COMPARE(NAME1, NAME2, RVAL) \
+if (NAME1 > NAME2) { \
+    psError(PS_ERR_BAD_PARAMETER_VALUE, true, \
+            "Error: (%s > %s) (%f %f)", \
+            #NAME1, #NAME2, NAME1, NAME2); \
+    return(RVAL); \
+}
+
+#define PS_FLOAT_CHECK_NON_EQUAL(NAME1, NAME2, RVAL) \
+if (fabs(NAME2 - NAME1) < FLT_EPSILON) { \
+    psError(PS_ERR_BAD_PARAMETER_VALUE, true, \
+            "Error: %s and %s are equal.", \
+            #NAME1, #NAME2); \
+    return(RVAL); \
+}
+
+#define PS_FLOAT_CHECK_RANGE(NAME, LOWER, UPPER, RVAL) \
+if ((NAME) < (LOWER) || (NAME) > (UPPER)) { \
+    psError(PS_ERR_BAD_PARAMETER_VALUE, true, \
+            "Error: %s, %f, is out of range.  Must be between %f and %f.", \
+            #NAME, NAME, LOWER, UPPER); \
+    return RVAL; \
+}
+
+/*****************************************************************************
+Macros which take a generic psLib type and determine if it is NULL, or has
+the wrong type.
+*****************************************************************************/
+#define PS_PTR_CHECK_NULL(NAME, RVAL) PS_PTR_CHECK_NULL_GENERAL(NAME, return RVAL)
+#define PS_PTR_CHECK_NULL_GENERAL(NAME, CLEANUP) \
+if (NAME == NULL) { \
+    psError(PS_ERR_BAD_PARAMETER_NULL, true, \
+            "Unallowable operation: %s is NULL.", \
+            #NAME); \
+    CLEANUP; \
+}
+
+#define PS_PTR_CHECK_TYPE(NAME, TYPE, RVAL) \
+if (NAME->type.type != TYPE) { \
+    psError(PS_ERR_BAD_PARAMETER_TYPE, true, \
+            "Unallowable operation: %s has incorrect type.", \
+            #NAME); \
+    return(RVAL); \
+}
+
+#define PS_PTR_CHECK_DIMEN(NAME, DIMEN, RVAL) PS_PTR_CHECK_DIMEN_GENERAL(NAME, DIMEN, return RVAL)
+#define PS_PTR_CHECK_DIMEN_GENERAL(NAME, DIMEN, CLEANUP) \
+if (NAME->type.dimen != DIMEN) { \
+    psError(PS_ERR_BAD_PARAMETER_TYPE, true, \
+            "Unallowable operation: %s has incorrect dimensionality.", \
+            #NAME); \
+    CLEANUP; \
+}
+
+#define PS_PTR_CHECK_DIMEN_GENERAL_NOT(NAME, DIMEN, CLEANUP) \
+if (NAME->type.dimen == DIMEN) { \
+    psError(PS_ERR_BAD_PARAMETER_TYPE, true, \
+            "Unallowable operation: %s has incorrect dimensionality.", \
+            #NAME); \
+    CLEANUP; \
+}
+
+
+#define PS_PTR_CHECK_SIZE_EQUAL(PTR1, PTR2, RVAL) \
+if (PTR1->n != PTR2->n) { \
+    psError(PS_ERR_BAD_PARAMETER_SIZE, true, \
+            "ptr %s has size %d, ptr %s has size %d.", \
+            #PTR1, PTR1->n, #PTR2, PTR2->n); \
+    return(RVAL); \
+}
+
+#define PS_PTR_CHECK_TYPE_EQUAL(PTR1, PTR2, RVAL) PS_PTR_CHECK_TYPE_EQUAL_GENERAL(PTR1, PTR2, return RVAL)
+
+#define PS_PTR_CHECK_TYPE_EQUAL_GENERAL(PTR1, PTR2, CLEANUP) \
+if (PTR1->type.type != PTR2->type.type) { \
+    psError(PS_ERR_BAD_PARAMETER_TYPE, true, \
+            "ptr %s has type %d, ptr %s has type %d.", \
+            #PTR1, PTR1->type.type, #PTR2, PTR2->type.type); \
+    CLEANUP; \
+}
+
+
+/*****************************************************************************
+    PS_VECTOR macros:
+ *****************************************************************************/
+#define PS_VECTOR_CHECK_NULL(NAME, RVAL) PS_VECTOR_CHECK_NULL_GENERAL(NAME, return RVAL)
+#define PS_VECTOR_CHECK_NULL_GENERAL(NAME, CLEANUP) \
+if (NAME == NULL || NAME->data.U8 == NULL) { \
+    psError(PS_ERR_BAD_PARAMETER_NULL, true, \
+            "Unallowable operation: psVector %s or its data is NULL.", \
+            #NAME); \
+    CLEANUP; \
+} \
+
+#define PS_VECTOR_CHECK_EMPTY(NAME, RVAL) PS_VECTOR_CHECK_EMPTY_GENERAL(NAME, return RVAL)
+#define PS_VECTOR_CHECK_EMPTY_GENERAL(NAME, CLEANUP) \
+if (NAME->n < 1) { \
+    psError(PS_ERR_BAD_PARAMETER_SIZE, true, \
+            "Unallowable operation: psVector %s has no elements.", \
+            #NAME); \
+    CLEANUP; \
+} \
+
+#define PS_VECTOR_CHECK_TYPE_F32_OR_F64(NAME, RVAL) \
+if ((NAME->type.type != PS_TYPE_F32) && (NAME->type.type != PS_TYPE_F64)) { \
+    psError(PS_ERR_BAD_PARAMETER_TYPE, true, \
+            "psVector %s: bad type(%d)", \
+            #NAME, NAME->type.type); \
+    return(RVAL); \
+} \
+
+#define PS_VECTOR_CHECK_TYPE_S16_S32_F32(NAME, RVAL) \
+if ((NAME->type.type != PS_TYPE_S16) && (NAME->type.type != PS_TYPE_S32) && (NAME->type.type != PS_TYPE_F32)) { \
+    psError(PS_ERR_BAD_PARAMETER_TYPE, true, \
+            "psVector %s: bad type(%d)", \
+            #NAME, NAME->type.type); \
+    return(RVAL); \
+} \
+
+#define PS_VECTOR_CHECK_TYPE(NAME, TYPE, RVAL) \
+if (NAME->type.type != TYPE) { \
+    psError(PS_ERR_BAD_PARAMETER_TYPE, true, \
+            "Unallowable operation: psVector %s has incorrect type.", \
+            #NAME); \
+    return(RVAL); \
+}
+
+#define PS_VECTOR_CHECK_SIZE_EQUAL(VEC1, VEC2, RVAL) \
+if (VEC1->n != VEC2->n) { \
+    psError(PS_ERR_BAD_PARAMETER_SIZE, true, \
+            "psVector %s has size %d, psVector %s has size %d.", \
+            #VEC1, VEC1->n, #VEC2, VEC2->n); \
+    return(RVAL); \
+}
+
+#define PS_VECTOR_CHECK_TYPE_EQUAL(VEC1, VEC2, RVAL) \
+if (VEC1->type.type != VEC2->type.type) { \
+    psError(PS_ERR_BAD_PARAMETER_SIZE, true, \
+            "psVector %s has size %d, psVector %s has size %d.", \
+            #VEC1, VEC1->type.type, #VEC2, VEC2->type.type); \
+    return(RVAL); \
+}
+
+#define PS_VECTOR_F64_TO_F32(X64, X32) \
+psVector *X32 = psVectorAlloc(X64->n, PS_TYPE_F32); \
+for (int i=0;i<X64->n;i++) { \
+    X32->data.F32[i] = (float) X64->data.F64[i]; \
+} \
+
+#define PS_VECTOR_F32_TO_F64(X32, X64) \
+psVector *X64 = psVectorAlloc(X32->n, PS_TYPE_F64); \
+for (int i=0;i<X32->n;i++) { \
+    X64->data.F64[i] = (float) X32->data.F32[i]; \
+} \
+
+#define PS_VECTOR_PRINT_F32(NAME) \
+for (int my_i=0;my_i<NAME->n;my_i++) { \
+    printf("%s->data.F32[%d] is %f\n", #NAME, my_i, NAME->data.F32[my_i]); \
+} \
+printf("\n"); \
+
+
+#define PS_VECTOR_CONVERT_F64_TO_F32_STATIC(OLD, NEW_PTR32, NEW_STATIC32) \
+if (OLD->type.type == PS_TYPE_F32) { \
+    NEW_PTR32 = (psVector *) OLD; \
+} else if (OLD->type.type == PS_TYPE_F64) { \
+    NEW_STATIC32 = psVectorRecycle(NEW_STATIC32, OLD->n, PS_TYPE_F32); \
+    p_psMemSetPersistent(NEW_STATIC32, true); \
+    p_psMemSetPersistent(NEW_STATIC32->data.U8, true); \
+    for (i=0; i < OLD->n ; i++) { \
+        NEW_STATIC32->data.F32[i] = (float) OLD->data.F64[i]; \
+    } \
+    NEW_PTR32 = NEW_STATIC32; \
+} \
+
+#define PS_VECTOR_CONVERT_F32_TO_F64_STATIC(OLD, NEW_PTR64, NEW_STATIC64) \
+if (OLD->type.type == PS_TYPE_F64) { \
+    NEW_PTR64 = (psVector *) OLD; \
+} else if (OLD->type.type == PS_TYPE_F32) { \
+    NEW_STATIC64 = psVectorRecycle(NEW_STATIC64, OLD->n, PS_TYPE_F64); \
+    p_psMemSetPersistent(NEW_STATIC64, true); \
+    p_psMemSetPersistent(NEW_STATIC64->data.U8, true); \
+    for (i=0; i < OLD->n ; i++) { \
+        NEW_STATIC64->data.F64[i] = (double) OLD->data.F32[i]; \
+    } \
+    NEW_PTR64 = NEW_STATIC64; \
+} \
+
+#define PS_VECTOR_GEN_YERR_STATIC_F32(VEC, N) \
+VEC = psVectorRecycle(VEC, N, PS_TYPE_F32); \
+p_psMemSetPersistent(VEC, true); \
+p_psMemSetPersistent(VEC->data.U8, true); \
+for (int i=0;i<N;i++) { \
+    VEC->data.F32[i] = 1.0; \
+} \
+
+#define PS_VECTOR_GEN_YERR_STATIC_F64(VEC, N) \
+VEC = psVectorRecycle(VEC, N, PS_TYPE_F64); \
+p_psMemSetPersistent(VEC, true); \
+p_psMemSetPersistent(VEC->data.U8, true); \
+for (int i=0;i<N;i++) { \
+    VEC->data.F64[i] = 1.0; \
+} \
+
+#define PS_VECTOR_GEN_X_INDEX_STATIC_F32(VEC, N) \
+VEC = psVectorRecycle(VEC, N, PS_TYPE_F32); \
+p_psMemSetPersistent(VEC, true); \
+p_psMemSetPersistent(VEC->data.U8, true); \
+for (int i=0;i<N;i++) { \
+    VEC->data.F32[i] = (float) i; \
+} \
+
+#define PS_VECTOR_GEN_X_INDEX_STATIC_F64(VEC, N) \
+VEC = psVectorRecycle(VEC, N, PS_TYPE_F64); \
+p_psMemSetPersistent(VEC, true); \
+p_psMemSetPersistent(VEC->data.U8, true); \
+for (int i=0;i<N;i++) { \
+    VEC->data.F64[i] = (float) i; \
+} \
+
+#define PS_VECTOR_GEN_STATIC_RECYCLED(NAME, SIZE, TYPE) \
+static psVector *NAME = NULL; \
+NAME = psVectorRecycle(NAME, SIZE, TYPE); \
+p_psMemSetPersistent(NAME, true); \
+p_psMemSetPersistent(NAME->data.U8, true); \
+
+#define PS_VECTOR_DECLARE_ALLOC_STATIC(NAME, SIZE, TYPE) \
+static psVector *NAME = NULL; \
+if (NAME == NULL) { \
+    NAME = psVectorAlloc(SIZE, TYPE); \
+    p_psMemSetPersistent(NAME, true); \
+} \
+
+#define PS_VECTOR_SET_U8(NAME, VALUE) \
+for (int i = 0 ; i < (NAME)->n ; i++) { \
+    (NAME)->data.U8[i] = VALUE; \
+}\
+
+#define PS_VECTOR_SET_U16(NAME, VALUE) \
+for (int i = 0 ; i < (NAME)->n ; i++) { \
+    (NAME)->data.U16[i] = VALUE; \
+}\
+
+#define PS_VECTOR_SET_U32(NAME, VALUE) \
+for (int i = 0 ; i < (NAME)->n ; i++) { \
+    (NAME)->data.U32[i] = VALUE; \
+}\
+
+#define PS_VECTOR_SET_U64(NAME, VALUE) \
+for (int i = 0 ; i < (NAME)->n ; i++) { \
+    (NAME)->data.U64[i] = VALUE; \
+}\
+
+#define PS_VECTOR_SET_S8(NAME, VALUE) \
+for (int i = 0 ; i < (NAME)->n ; i++) { \
+    (NAME)->data.S8[i] = VALUE; \
+}\
+
+#define PS_VECTOR_SET_S16(NAME, VALUE) \
+for (int i = 0 ; i < (NAME)->n ; i++) { \
+    (NAME)->data.S16[i] = VALUE; \
+}\
+
+#define PS_VECTOR_SET_S32(NAME, VALUE) \
+for (int i = 0 ; i < (NAME)->n ; i++) { \
+    (NAME)->data.S32[i] = VALUE; \
+}\
+
+#define PS_VECTOR_SET_S64(NAME, VALUE) \
+for (int i = 0 ; i < (NAME)->n ; i++) { \
+    (NAME)->data.S64[i] = VALUE; \
+}\
+
+#define PS_VECTOR_SET_F64(NAME, VALUE) \
+for (int i = 0 ; i < (NAME)->n ; i++) { \
+    (NAME)->data.F64[i] = VALUE; \
+}\
+
+#define PS_VECTOR_SET_F32(NAME, VALUE) \
+for (int i = 0 ; i < (NAME)->n ; i++) { \
+    (NAME)->data.F32[i] = VALUE; \
+}\
+
+
+/*****************************************************************************
+    PS_POLY macros:
+*****************************************************************************/
+#define PS_POLY_CHECK_NULL(NAME, RVAL) \
+if (NAME == NULL || NAME->coeff == NULL) { \
+    psError(PS_ERR_BAD_PARAMETER_NULL, true, \
+            "Unallowable operation: polynomial %s or its coeffs is NULL.", \
+            #NAME); \
+    return(RVAL); \
+} \
+
+#define PS_POLY_CHECK_TYPE(NAME, TYPE, RVAL) \
+if (NAME->type != TYPE) { \
+    psError(PS_ERR_BAD_PARAMETER_TYPE, true, \
+            "Unallowable operation: polynomial %s has wrong type.", #NAME); \
+    return(RVAL); \
+} \
+
+// The following macros declare and allocate a static polynomial of the
+// specified order and type.
+
+#define PS_POLY_1D_DECLARE_ALLOC_STATIC(NAME, ORDER, TYPE) \
+static psPolynomial1D *NAME = NULL; \
+if (NAME == NULL) { \
+    NAME = psPolynomial1DAlloc(ORDER, TYPE); \
+    p_psMemSetPersistent(NAME, true); \
+    p_psMemSetPersistent(NAME->coeff, true); \
+    p_psMemSetPersistent(NAME->coeffErr, true); \
+    p_psMemSetPersistent(NAME->mask, true); \
+} \
+
+#define PS_POLY_2D_DECLARE_ALLOC_STATIC(NAME, ORDER, TYPE) \
+static psPolynomial2D *NAME = NULL; \
+if (NAME == NULL) { \
+    NAME = psPolynomial2DAlloc(ORDER, TYPE); \
+    p_psMemSetPersistent(NAME, true); \
+} \
+
+#define PS_POLY_3D_DECLARE_ALLOC_STATIC(NAME, ORDER, TYPE) \
+static psPolynomial3D *NAME = NULL; \
+if (NAME == NULL) { \
+    NAME = psPolynomial3DAlloc(ORDER, TYPE); \
+    p_psMemSetPersistent(NAME, true); \
+} \
+
+#define PS_POLY_4D_DECLARE_ALLOC_STATIC(NAME, ORDER, TYPE) \
+static psPolynomial4D *NAME = NULL; \
+if (NAME == NULL) { \
+    NAME = psPolynomial4DAlloc(ORDER, TYPE); \
+    p_psMemSetPersistent(NAME, true); \
+} \
+
+#define PS_POLY_1D_D_DECLARE_ALLOC_STATIC(NAME, ORDER, TYPE) \
+static psPolynomial1D *NAME = NULL; \
+if (NAME == NULL) { \
+    NAME = psPolynomial1DAlloc(ORDER, TYPE); \
+    p_psMemSetPersistent(NAME, true); \
+} \
+
+#define PS_POLY_2D_D_DECLARE_ALLOC_STATIC(NAME, ORDER, TYPE) \
+static psPolynomial2D *NAME = NULL; \
+if (NAME == NULL) { \
+    NAME = psPolynomial2DAlloc(ORDER, TYPE); \
+    p_psMemSetPersistent(NAME, true); \
+} \
+
+#define PS_POLY_3D_D_DECLARE_ALLOC_STATIC(NAME, ORDER, TYPE) \
+static psPolynomial3D *NAME = NULL; \
+if (NAME == NULL) { \
+    NAME = psPolynomial3DAlloc(ORDER, TYPE); \
+    p_psMemSetPersistent(NAME, true); \
+} \
+
+#define PS_POLY_4D_D_DECLARE_ALLOC_STATIC(NAME, ORDER, TYPE) \
+static psPolynomial4D *NAME = NULL; \
+if (NAME == NULL) { \
+    NAME = psPolynomial4DAlloc(ORDER, TYPE); \
+    p_psMemSetPersistent(NAME, true); \
+} \
+
+/*****************************************************************************
+    PS_IMAGE macros:
+*****************************************************************************/
+#define PS_IMAGE_CHECK_NULL(NAME, RVAL) PS_IMAGE_CHECK_NULL_GENERAL(NAME, return RVAL)
+#define PS_IMAGE_CHECK_NULL_GENERAL(NAME, CLEANUP) \
+if (NAME == NULL || NAME->data.V == NULL) { \
+    psError(PS_ERR_BAD_PARAMETER_NULL, true, \
+            "Unallowable operation: psImage %s or its data is NULL.", \
+            #NAME); \
+    CLEANUP; \
+}
+
+#define PS_IMAGE_CHECK_EMPTY(NAME, RVAL) PS_IMAGE_CHECK_EMPTY_GENERAL(NAME, return RVAL)
+#define PS_IMAGE_CHECK_EMPTY_GENERAL(NAME, CLEANUP) \
+if (NAME->numCols < 1 || NAME->numRows < 1) { \
+    psError(PS_ERR_BAD_PARAMETER_SIZE, true, \
+            "Unallowable operation: psImage %s has zero rows or columns (%dx%d).", \
+            #NAME, NAME->numCols, NAME->numRows); \
+    CLEANUP; \
+}
+
+#define PS_IMAGE_CHECK_TYPE(NAME, TYPE, RVAL) \
+if (NAME->type.type != TYPE) { \
+    psError(PS_ERR_BAD_PARAMETER_TYPE, true, \
+            "Unallowable operation: psImage %s has incorrect type.", \
+            #NAME); \
+    return(RVAL); \
+}
+
+#define PS_IMAGE_CHECK_SIZE_EQUAL(NAME1, NAME2, RVAL) \
+if ((NAME1->numCols != NAME2->numCols) || \
+        (NAME1->numRows != NAME2->numRows)) { \
+    psError(PS_ERR_BAD_PARAMETER_SIZE, true, \
+            "Unallowable operation: psImages %s and %s are not the same size.", \
+            #NAME1, #NAME2); \
+    return(RVAL); \
+}
+
+#define PS_IMAGE_CHECK_SIZE(NAME1, NUM_COLS, NUM_ROWS, RVAL) \
+if ((NAME1->numCols != NUM_COLS) || \
+        (NAME1->numRows != NUM_ROWS)) { \
+    psError(PS_ERR_BAD_PARAMETER_SIZE, true, \
+            "Unallowable operation: psImages %s is not the correct size.", \
+            #NAME1); \
+    return(RVAL); \
+}
+
+#define PS_IMAGE_PRINT_F32(NAME) \
+printf("======== printing %s ========\n", #NAME); \
+for (int i = 0 ; i < NAME->numRows ; i++) { \
+    for (int j = 0 ; j < NAME->numCols ; j++) { \
+        printf("%.2f ", NAME->data.F32[i][j]); \
+    } \
+    printf("\n"); \
+}\
+
+#define PS_IMAGE_SET_U8(NAME, VALUE) \
+for (int i = 0 ; i < (NAME)->numRows ; i++) { \
+    for (int j = 0 ; j < (NAME)->numCols ; j++) { \
+        (NAME)->data.U8[i][j] = (VALUE); \
+    } \
+}\
+
+#define PS_IMAGE_SET_U16(NAME, VALUE) \
+for (int i = 0 ; i < (NAME)->numRows ; i++) { \
+    for (int j = 0 ; j < (NAME)->numCols ; j++) { \
+        (NAME)->data.U16[i][j] = (VALUE); \
+    } \
+}\
+
+#define PS_IMAGE_SET_U32(NAME, VALUE) \
+for (int i = 0 ; i < (NAME)->numRows ; i++) { \
+    for (int j = 0 ; j < (NAME)->numCols ; j++) { \
+        (NAME)->data.U32[i][j] = (VALUE); \
+    } \
+}\
+
+#define PS_IMAGE_SET_U64(NAME, VALUE) \
+for (int i = 0 ; i < (NAME)->numRows ; i++) { \
+    for (int j = 0 ; j < (NAME)->numCols ; j++) { \
+        (NAME)->data.U64[i][j] = (VALUE); \
+    } \
+}\
+
+#define PS_IMAGE_SET_S8(NAME, VALUE) \
+for (int i = 0 ; i < (NAME)->numRows ; i++) { \
+    for (int j = 0 ; j < (NAME)->numCols ; j++) { \
+        (NAME)->data.S8[i][j] = (VALUE); \
+    } \
+}\
+
+#define PS_IMAGE_SET_S16(NAME, VALUE) \
+for (int i = 0 ; i < (NAME)->numRows ; i++) { \
+    for (int j = 0 ; j < (NAME)->numCols ; j++) { \
+        (NAME)->data.S16[i][j] = (VALUE); \
+    } \
+}\
+
+#define PS_IMAGE_SET_S32(NAME, VALUE) \
+for (int i = 0 ; i < (NAME)->numRows ; i++) { \
+    for (int j = 0 ; j < (NAME)->numCols ; j++) { \
+        (NAME)->data.S32[i][j] = (VALUE); \
+    } \
+}\
+
+#define PS_IMAGE_SET_S64(NAME, VALUE) \
+for (int i = 0 ; i < (NAME)->numRows ; i++) { \
+    for (int j = 0 ; j < (NAME)->numCols ; j++) { \
+        (NAME)->data.S64[i][j] = (VALUE); \
+    } \
+}\
+
+#define PS_IMAGE_SET_F32(NAME, VALUE) \
+for (int i = 0 ; i < (NAME)->numRows ; i++) { \
+    for (int j = 0 ; j < (NAME)->numCols ; j++) { \
+        (NAME)->data.F32[i][j] = (VALUE); \
+    } \
+}\
+
+#define PS_IMAGE_SET_F64(NAME, VALUE) \
+for (int i = 0 ; i < (NAME)->numRows ; i++) { \
+    for (int j = 0 ; j < (NAME)->numCols ; j++) { \
+        (NAME)->data.F64[i][j] = (VALUE); \
+    } \
+}\
+
+/*****************************************************************************
+    PS_READOUT macros:
+*****************************************************************************/
+#define PS_READOUT_CHECK_NULL(NAME, RVAL) \
+if (NAME == NULL || NAME->image == NULL) { \
+    psError(PS_ERR_BAD_PARAMETER_NULL, true, \
+            "Unallowable operation: psReadout %s or its data is NULL.", \
+            #NAME); \
+    return(RVAL); \
+}
+
+#define PS_READOUT_CHECK_EMPTY(NAME, RVAL) \
+if (NAME->image->numCols < 1 || NAME->image->numRows < 1) { \
+    psError(PS_ERR_BAD_PARAMETER_SIZE, true, \
+            "Unallowable operation: psReadout %s or its data is NULL.", #NAME); \
+    return(RVAL); \
+}
+
+#define PS_READOUT_CHECK_TYPE(NAME, TYPE, RVAL) \
+if (NAME->image->type.type != TYPE) { \
+    psError(PS_ERR_BAD_PARAMETER_TYPE, true, \
+            "Unallowable operation: psImage %s has incorrect type.", #NAME); \
+    return(RVAL); \
+}
+
+/*****************************************************************************
+    Misc. macros:
+ *****************************************************************************/
+#define PS_MAX(A, B) \
+(((A) > (B)) ? (A) : (B)) \
+
+#define PS_MIN(A, B) \
+(((A) < (B)) ? (A) : (B)) \
+
+#define PS_SQR(A) \
+((A) * (A)) \
+
+#ifdef DARWIN
+#define PS_SQRT_F32(A) ((float) sqrt(A))
+#else
+#define PS_SQRT_F32(A) (sqrtf(A))
+#endif
Index: /tags/ipp-1-X/bug123/psLib/src/math/psMatrix.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/math/psMatrix.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/math/psMatrix.c	(revision 22331)
@@ -0,0 +1,642 @@
+/** @file  psMatrix.c
+ *
+ *  @brief Provides functions for linear algebra operations on psImages and psVectors.
+ *
+ *  Functions are provided to:
+ *      Transpose a psImage
+ *      Compute LUD
+ *      Solve LUD
+ *      Matrix inversion
+ *      Calculate determinant
+ *      Matrix addition
+ *      Matrix subtraction
+ *      Matrix multiplication
+ *      Calculate Eigenvectors
+ *      Convert matrix to vector
+ *      Convert vector to matrix
+ *
+ *  These functions treat psImages as if they were matrices, therefore there is no psMatrix.
+ *
+ *  @author Ross Harman, MHPCC
+ *  @author Robert DeSonia, MHPCC
+ *
+ *  @version $Revision: 1.27 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-03-22 21:52:49 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+
+/******************************************************************************/
+/*  INCLUDE FILES                                                             */
+/******************************************************************************/
+#include <string.h>
+#include <gsl/gsl_matrix.h>
+#include <gsl/gsl_linalg.h>
+#include <gsl/gsl_permutation.h>
+#include <gsl/gsl_eigen.h>
+
+#include "psMemory.h"
+#include "psError.h"
+#include "psImage.h"
+#include "psVector.h"
+#include "psMatrix.h"
+#include "psConstants.h"
+#include "psDataManipErrors.h"
+
+
+/*****************************************************************************/
+/* DEFINE STATEMENTS                                                         */
+/*****************************************************************************/
+
+/** Preprocessor macro to generate error for image dimensionality not set to PS_DIMEN_IMAGE */
+#define PS_CHECK_DIMEN_AND_TYPE(NAME, PS_DIMEN, CLEANUP)                                             \
+if (NAME->type.dimen != PS_DIMEN) {                                                                 \
+    psError(PS_ERR_BAD_PARAMETER_TYPE, true,                                                        \
+            "Invalid operation. %s has incorrect dimensionality %d.", #NAME, PS_DIMEN);             \
+    CLEANUP;                                                                                  \
+} else if(NAME->type.type!=PS_TYPE_F64 && NAME->type.type!=PS_TYPE_F32) {                           \
+    psError(PS_ERR_BAD_PARAMETER_TYPE, true,                                                        \
+            "Invalid operation. %s not PS_TYPE_F64.", #NAME);                                       \
+    CLEANUP;                                                                                  \
+}
+
+/** Preprocessor macro to check that input is not equal to output */
+#define PS_CHECK_POINTERS(NAME1, NAME2, CLEANUP)                                                     \
+if (NAME1 == NAME2) {                                                                               \
+    psError(PS_ERR_BAD_PARAMETER_VALUE, true,                                                       \
+            "Invalid operation: Pointer to %s is same as %s.", #NAME1, #NAME2);                     \
+    CLEANUP;                                                                                  \
+}
+
+/** Preprocessor macro to check that an image is square */
+#define PS_CHECK_SQUARE(NAME, CLEANUP)                                                               \
+if (NAME->numCols != NAME->numRows) {                                                               \
+    psError(PS_ERR_BAD_PARAMETER_SIZE, true, "Invalid operation: %s not square array.", #NAME);     \
+    CLEANUP;                                                                                  \
+}
+
+/** Preprocessor macro to initalize a GSL matrix. */
+#define PS_GSL_MATRIX_INITIALIZE(LHS_NAME, RHS_NAME)                                                \
+LHS_NAME.size1 = numRows;                                                                           \
+LHS_NAME.size2 = numCols;                                                                           \
+LHS_NAME.tda   = numCols;                                                                           \
+LHS_NAME.data  = RHS_NAME;
+
+
+/*****************************************************************************/
+/* FILE STATIC FUNCTIONS                                                     */
+/*****************************************************************************/
+
+static void  psVectorToGslVector(gsl_vector *outGslVector, const psVector *inVector);
+static void gslVectorToPsVector(psVector *outVector, gsl_vector *inGslVector);
+static void  psImageToGslMatrix(gsl_matrix *outGslMatrix, const psImage *inImage);
+static void gslMatrixToPsImage(psImage *outImage, gsl_matrix *inGslMatrix);
+
+/** Static function to copy psF32 or psF64 vector data to a GSL vector */
+static void  psVectorToGslVector(gsl_vector *outGslVector, const psVector *inVector)
+{
+    psU32 i = 0;
+    psU32 n = 0;
+
+
+    n = inVector->n;
+    for(i=0; i<n; i++) {
+        if(inVector->type.type == PS_TYPE_F32) {
+            outGslVector->data[i] = (psF64)inVector->data.F32[i];
+        } else {
+            outGslVector->data[i] = inVector->data.F64[i];
+        }
+    }
+}
+
+/** Static function to copy GSL vector data to a psF32 or psF64 vector */
+static void gslVectorToPsVector(psVector *outVector, gsl_vector *inGslVector)
+{
+    psU32 i = 0;
+    psU32 n = 0;
+
+
+    n = outVector->n;
+    for(i=0; i<n; i++) {
+        if(outVector->type.type == PS_TYPE_F32) {
+            outVector->data.F32[i] = (psF32)inGslVector->data[i];
+        } else {
+            outVector->data.F64[i] = inGslVector->data[i];
+        }
+    }
+}
+
+/** Static function to copy psF32 or psF64 image data to a GSL matrix */
+static void  psImageToGslMatrix(gsl_matrix *outGslMatrix, const psImage *inImage)
+{
+    psU32 i = 0;
+    psU32 j = 0;
+    psU32 numRows = 0;
+    psU32 numCols = 0;
+
+
+    numRows = inImage->numRows;
+    numCols = inImage->numCols;
+    for(i=0; i<numRows; i++) {
+        for(j=0; j<numCols; j++) {
+            if(inImage->type.type == PS_TYPE_F32) {
+                outGslMatrix->data[i*numCols+j] = (psF64)inImage->data.F32[i][j];
+            } else {
+                outGslMatrix->data[i*numCols+j] = inImage->data.F64[i][j];
+            }
+        }
+    }
+}
+
+/** Static function to copy GSL matrix data to a psF32 or psF64 image */
+static void gslMatrixToPsImage(psImage *outImage, gsl_matrix *inGslMatrix)
+{
+    psU32 i = 0;
+    psU32 j = 0;
+    psU32 numRows = 0;
+    psU32 numCols = 0;
+
+
+    numRows = outImage->numRows;
+    numCols = outImage->numCols;
+    for(i=0; i<numRows; i++) {
+        for(j=0; j<numCols; j++) {
+            if(outImage->type.type == PS_TYPE_F32) {
+                outImage->data.F32[i][j] = (psF32)inGslMatrix->data[i*numCols+j];
+            } else {
+                outImage->data.F64[i][j] = inGslMatrix->data[i*numCols+j];
+            }
+        }
+    }
+}
+
+
+/*****************************************************************************/
+/* FUNCTION IMPLEMENTATION - PUBLIC                                          */
+/*****************************************************************************/
+
+psImage* psMatrixLUD(psImage* outImage, psVector** outPerm, psImage* inImage)
+{
+    psS32 signum = 0;
+    psS32 numRows = 0;
+    psS32 numCols = 0;
+    gsl_matrix *lu = NULL;
+    gsl_permutation perm;
+
+
+    #define psMatrixLUD_EXIT {psFree(outImage); return NULL;}
+
+    // Error checks
+    PS_IMAGE_CHECK_NULL_GENERAL(inImage, psMatrixLUD_EXIT);
+    PS_CHECK_POINTERS(inImage, outImage, psMatrixLUD_EXIT);
+    PS_CHECK_DIMEN_AND_TYPE(inImage, PS_DIMEN_IMAGE, psMatrixLUD_EXIT);
+    PS_PTR_CHECK_NULL_GENERAL(outPerm, psMatrixLUD_EXIT);
+
+    outImage = psImageRecycle(outImage, inImage->numCols, inImage->numRows, inImage->type.type);
+
+    PS_CHECK_SQUARE(inImage, psMatrixLUD_EXIT);
+    PS_CHECK_SQUARE(outImage, psMatrixLUD_EXIT);
+
+    // Initialize data
+    numRows = inImage->numRows;
+    numCols = inImage->numCols;
+
+    // Initialize GSL data
+    perm.size = numCols;
+    if (sizeof(size_t) == 4) {
+        *outPerm = psVectorRecycle(*outPerm, numCols, PS_TYPE_S32);
+    } else if (sizeof(size_t) == 8) {
+        *outPerm = psVectorRecycle(*outPerm, numCols, PS_TYPE_S64);
+    } else {
+        psError(PS_ERR_UNKNOWN, true,
+                "Failed to allocate the permutation vector; "
+                "could not determine the cooresponding data type.");
+        psMatrixLUD_EXIT;
+    }
+
+    (*outPerm)->n = numCols;
+    perm.data = (psPtr)((*outPerm)->data.U8);
+    lu = gsl_matrix_alloc(numRows, numCols);
+
+    // Copy psImage data into GSL matrix data
+    psImageToGslMatrix(lu, inImage);
+
+    // Calculate LU decomposition
+    gsl_linalg_LU_decomp(lu, &perm, &signum);
+
+    // Copy GSL matrix data to psImage data
+    gslMatrixToPsImage(outImage, lu);
+
+    // Free GSL data
+    gsl_matrix_free(lu);
+
+    return outImage;
+}
+
+psVector* psMatrixLUSolve(psVector* outVector, const psImage* inImage, const psVector* inVector,
+                          const psVector* inPerm)
+{
+    psS32 numRows = 0;
+    psS32 numCols = 0;
+    gsl_matrix *lu;
+    gsl_permutation perm;
+    gsl_vector *b = NULL;
+    gsl_vector *x = NULL;
+
+    #define LUSOLVE_CLEANUP {psFree(outVector); return NULL;}
+
+    // Error checks
+    PS_IMAGE_CHECK_NULL_GENERAL(inImage, LUSOLVE_CLEANUP);
+    PS_CHECK_DIMEN_AND_TYPE(inImage, PS_DIMEN_IMAGE, LUSOLVE_CLEANUP);
+    PS_IMAGE_CHECK_EMPTY_GENERAL(inImage, LUSOLVE_CLEANUP);
+    PS_VECTOR_CHECK_NULL_GENERAL(inVector, LUSOLVE_CLEANUP);
+    PS_CHECK_DIMEN_AND_TYPE(inVector, PS_DIMEN_VECTOR, LUSOLVE_CLEANUP);
+    PS_VECTOR_CHECK_NULL_GENERAL(inPerm, LUSOLVE_CLEANUP);
+
+    outVector = psVectorRecycle(outVector, inImage->numRows, inImage->type.type);
+
+    PS_CHECK_POINTERS(outVector, inVector, LUSOLVE_CLEANUP);
+    PS_CHECK_POINTERS(inVector, inPerm, LUSOLVE_CLEANUP);
+    PS_CHECK_POINTERS(outVector, inPerm, LUSOLVE_CLEANUP);
+
+    // Initialize data
+    numRows = inImage->numRows;
+    numCols = inImage->numCols;
+
+    // Initialize GSL data
+    lu = gsl_matrix_alloc(numRows, numCols);
+    psImageToGslMatrix(lu, inImage);
+    b = gsl_vector_alloc(inVector->n);
+    psVectorToGslVector(b, inVector);
+    x = gsl_vector_alloc(inVector->n);
+
+    outVector->n = numCols;
+    perm.size = inPerm->n;
+    perm.data = (psPtr)(inPerm->data.U8);
+
+    // Solve for {x} in equation: {b} = [A]{x}
+    gsl_linalg_LU_solve(lu, &perm, b, x);
+
+    // Copy GSL vector data to psVector data
+    gslVectorToPsVector(outVector, x);
+
+    // Free GSL data
+    gsl_vector_free(b);
+    gsl_vector_free(x);
+    gsl_matrix_free(lu);
+
+    return outVector;
+}
+
+psImage* psMatrixInvert(psImage* outImage, const psImage* inImage, psF32 *det)
+{
+    psS32 signum = 0;
+    psS32 numRows = 0;
+    psS32 numCols = 0;
+    gsl_matrix *inv = NULL;
+    gsl_matrix *lu = NULL;
+    gsl_permutation *perm = NULL;
+
+    #define INVERT_CLEANUP { psFree(outImage); return NULL; }
+    // Error checks
+    PS_PTR_CHECK_NULL_GENERAL(det, INVERT_CLEANUP);
+    PS_IMAGE_CHECK_NULL_GENERAL(inImage, INVERT_CLEANUP);
+    PS_CHECK_POINTERS(inImage, outImage, INVERT_CLEANUP);
+    PS_CHECK_DIMEN_AND_TYPE(inImage, PS_DIMEN_IMAGE, INVERT_CLEANUP);
+    PS_IMAGE_CHECK_EMPTY_GENERAL(inImage, INVERT_CLEANUP);
+
+    outImage = psImageRecycle(outImage, inImage->numCols, inImage->numRows, inImage->type.type);
+
+    PS_CHECK_SQUARE(inImage, INVERT_CLEANUP);
+    PS_CHECK_SQUARE(outImage, INVERT_CLEANUP);
+
+    // Initialize data
+    numRows = inImage->numRows;
+    numCols = inImage->numCols;
+
+    // Initialize GSL data
+    perm = gsl_permutation_alloc(numRows);
+    lu = gsl_matrix_alloc(numRows, numCols);
+    inv = gsl_matrix_alloc(numRows, numCols);
+    psImageToGslMatrix(lu, inImage);
+
+    // Invert data and calculate determinant
+    gsl_linalg_LU_decomp(lu, perm, &signum);
+    gsl_linalg_LU_invert(lu, perm, inv);
+    *det = (float)gsl_linalg_LU_det(lu, signum);
+
+    // Copy GSL matrix data to psImage data
+    gslMatrixToPsImage(outImage, inv);
+
+    // Free GSL structs
+    gsl_permutation_free(perm);
+    gsl_matrix_free(lu);
+    gsl_matrix_free(inv);
+
+    return outImage;
+}
+
+psF32 *psMatrixDeterminant(const psImage* inImage)
+{
+    psS32 signum = 0;
+    psS32 numRows = 0;
+    psS32 numCols = 0;
+    psF32 *det = NULL;
+    gsl_matrix *lu = NULL;
+    gsl_permutation *perm = NULL;
+
+    #define DETERMINANT_EXIT { return NULL; }
+    // Error checks
+    PS_IMAGE_CHECK_NULL_GENERAL(inImage, DETERMINANT_EXIT);
+    PS_CHECK_DIMEN_AND_TYPE(inImage, PS_DIMEN_IMAGE, DETERMINANT_EXIT);
+    PS_IMAGE_CHECK_EMPTY_GENERAL(inImage, DETERMINANT_EXIT);
+    PS_CHECK_SQUARE(inImage, DETERMINANT_EXIT);
+
+    // Initialize data
+    numRows = inImage->numRows;
+    numCols = inImage->numCols;
+
+    // Allocate GSL structs
+    perm = gsl_permutation_alloc(numRows);
+    lu = gsl_matrix_alloc(numRows, numCols);
+    psImageToGslMatrix(lu, inImage);
+
+    // Calculate determinant
+    det = (psF32*)psAlloc(sizeof(psF32));
+    gsl_linalg_LU_decomp(lu, perm, &signum);
+    *det = (psF32)gsl_linalg_LU_det(lu, signum);
+
+    // Free GSL structs
+    gsl_permutation_free(perm);
+    gsl_matrix_free(lu);
+
+    return det;
+}
+
+psImage* psMatrixMultiply(psImage* outImage, psImage* inImage1, psImage* inImage2)
+{
+    psS32 numRows = 0;
+    psS32 numCols = 0;
+    gsl_matrix *m1 = NULL;
+    gsl_matrix *m2 = NULL;
+    gsl_matrix *m3 = NULL;
+
+    #define MULTIPLY_CLEANUP { psFree(outImage); return NULL; }
+
+    // Error checks
+    PS_IMAGE_CHECK_NULL_GENERAL(inImage1, MULTIPLY_CLEANUP);
+    PS_IMAGE_CHECK_NULL_GENERAL(inImage2, MULTIPLY_CLEANUP);
+    PS_IMAGE_CHECK_EMPTY_GENERAL(inImage1, MULTIPLY_CLEANUP);
+    PS_IMAGE_CHECK_EMPTY_GENERAL(inImage2, MULTIPLY_CLEANUP);
+    PS_CHECK_DIMEN_AND_TYPE(inImage1, PS_DIMEN_IMAGE, MULTIPLY_CLEANUP);
+    PS_CHECK_DIMEN_AND_TYPE(inImage2, PS_DIMEN_IMAGE, MULTIPLY_CLEANUP);
+    PS_CHECK_POINTERS(inImage1, outImage, MULTIPLY_CLEANUP);
+    PS_CHECK_POINTERS(inImage1, inImage2, MULTIPLY_CLEANUP);
+
+    outImage = psImageRecycle(outImage, inImage2->numCols, inImage2->numRows, inImage2->type.type);
+
+    PS_CHECK_SQUARE(inImage1, MULTIPLY_CLEANUP);
+    PS_CHECK_SQUARE(inImage2, MULTIPLY_CLEANUP);
+    PS_CHECK_SQUARE(outImage, MULTIPLY_CLEANUP);
+
+    // Initialize data
+    numRows = inImage1->numRows;
+    numCols = inImage1->numCols;
+
+    // Initialize GSL data
+    m1 = gsl_matrix_alloc(numRows, numCols);
+    psImageToGslMatrix(m1, inImage1);
+    m2 = gsl_matrix_alloc(numRows, numCols);
+    psImageToGslMatrix(m2, inImage2);
+    m3 = gsl_matrix_alloc(numRows, numCols);
+    psImageToGslMatrix(m3, outImage);
+
+    // Perform multiplication
+    gsl_linalg_matmult(m1, m2, m3);
+
+    // Copy GSL matrix data to psImage data
+    gslMatrixToPsImage(outImage, m3);
+
+    // Free GSL structs
+    gsl_matrix_free(m1);
+    gsl_matrix_free(m2);
+    gsl_matrix_free(m3);
+
+    return outImage;
+}
+
+psImage* psMatrixTranspose(psImage* outImage, const psImage* inImage)
+{
+    psU32 i = 0;
+    psU32 j = 0;
+    psS32 numRowsIn = 0;
+    psS32 numColsIn = 0;
+    psS32 numRowsOut = 0;
+    psS32 numColsOut = 0;
+
+    #define TRANSPOSE_CLEANUP { psFree(outImage); return NULL; }
+    // Error checks
+    PS_IMAGE_CHECK_NULL_GENERAL(inImage, TRANSPOSE_CLEANUP);
+    PS_CHECK_DIMEN_AND_TYPE(inImage, PS_DIMEN_IMAGE, TRANSPOSE_CLEANUP);
+    PS_IMAGE_CHECK_EMPTY_GENERAL(inImage, TRANSPOSE_CLEANUP);
+    PS_CHECK_POINTERS(inImage, outImage, TRANSPOSE_CLEANUP);
+
+    outImage = psImageRecycle(outImage, inImage->numCols, inImage->numRows, inImage->type.type);
+
+    // Initialize data
+    numRowsIn = inImage->numRows;
+    numColsIn = inImage->numCols;
+    numRowsOut = outImage->numRows;
+    numColsOut = outImage->numCols;
+
+    if(numRowsIn!=numColsOut && numRowsOut!=numColsIn) {
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true, PS_ERRORTEXT_psMatrix_TRANSPOSE_MISMATCH);
+        TRANSPOSE_CLEANUP;
+    }
+
+    if(outImage->type.type == PS_TYPE_F32) {
+        for(i=0; i<numRowsOut; i++) {
+            for(j=0; j<numColsOut; j++) {
+                outImage->data.F32[i][j] = inImage->data.F32[j][i];
+            }
+        }
+    } else {
+        for(i=0; i<numRowsOut; i++) {
+            for(j=0; j<numColsOut; j++) {
+                outImage->data.F64[i][j] = inImage->data.F64[j][i];
+            }
+        }
+    }
+
+    return outImage;
+}
+
+psImage* psMatrixEigenvectors(psImage* outImage, psImage* inImage)
+{
+    psS32 numRows = 0;
+    psS32 numCols = 0;
+    gsl_vector *eVals = NULL;
+    gsl_eigen_symmv_workspace *w = NULL;
+    gsl_matrix *out = NULL;
+    gsl_matrix *in = NULL;
+
+    #define EIGENVECTORS_CLEANUP { psFree(outImage); return NULL; }
+    // Error checks
+    PS_IMAGE_CHECK_NULL_GENERAL(inImage, EIGENVECTORS_CLEANUP);
+    PS_CHECK_DIMEN_AND_TYPE(inImage, PS_DIMEN_IMAGE, EIGENVECTORS_CLEANUP);
+    PS_IMAGE_CHECK_EMPTY_GENERAL(inImage, EIGENVECTORS_CLEANUP);
+    PS_CHECK_POINTERS(inImage, outImage, EIGENVECTORS_CLEANUP);
+
+    outImage = psImageRecycle(outImage, inImage->numCols, inImage->numRows, inImage->type.type);
+
+    // Initialize data
+    numRows = inImage->numRows;
+    numCols = inImage->numCols;
+
+    in = gsl_matrix_alloc(numRows, numCols);
+    psImageToGslMatrix(in, inImage);
+    out = gsl_matrix_alloc(numRows, numCols);
+
+    // Allocate GSL structs
+    eVals = gsl_vector_alloc(numRows);
+    w = gsl_eigen_symmv_alloc(numRows);
+
+    // Non-square matrices not allowed
+    PS_CHECK_SQUARE(inImage, EIGENVECTORS_CLEANUP);
+    PS_CHECK_SQUARE(outImage, EIGENVECTORS_CLEANUP);
+
+    // Calculate Eigenvalues and Eigenvectors...Eigenvalues not currently used
+    gsl_eigen_symmv(in, eVals, out, w);
+
+    // Copy GSL matrix data to psImage data
+    gslMatrixToPsImage(outImage, out);
+
+    // Free GSL structs
+    gsl_matrix_free(in);
+    gsl_matrix_free(out);
+    gsl_eigen_symmv_free(w);
+    gsl_vector_free(eVals);
+
+    return outImage;
+}
+
+psVector* psMatrixToVector(psVector* outVector, const psImage* inImage)
+{
+    psS32 size = 0;
+
+    #define psMatrixToVector_EXIT {psFree(outVector); return NULL;}
+
+    // Error checks
+    PS_IMAGE_CHECK_NULL_GENERAL(inImage, psMatrixToVector_EXIT);
+    PS_CHECK_DIMEN_AND_TYPE(inImage, PS_DIMEN_IMAGE, psMatrixToVector_EXIT);
+    PS_IMAGE_CHECK_EMPTY_GENERAL(inImage, psMatrixToVector_EXIT);
+
+    if (inImage->numRows == 1) {
+        // Create transposed row vector
+        outVector = psVectorRecycle(outVector, inImage->numCols, inImage->type.type);
+        outVector->type.dimen = PS_DIMEN_TRANSV;
+    } else if (inImage->numCols == 1) {
+        // Create non-transposed column vector
+        outVector = psVectorRecycle(outVector, inImage->numRows, inImage->type.type);
+    } else {
+        psError(PS_ERR_BAD_PARAMETER_SIZE, true,
+                "Image does not have dim with 1 col or 1 row: (%d x %d).",
+                inImage->numRows, inImage->numCols);
+        psMatrixToVector_EXIT;
+    }
+
+    // More checks
+    if (outVector->type.dimen == PS_DIMEN_VECTOR) {
+        PS_CHECK_DIMEN_AND_TYPE(outVector, PS_DIMEN_VECTOR, psMatrixToVector_EXIT);
+
+        if (outVector->n == 0) {
+            outVector->n = inImage->numRows;
+        }
+
+        if (outVector->n != inImage->numRows) {
+            psError(PS_ERR_BAD_PARAMETER_SIZE, true,
+                    "Image and vector sizes differ: (%d vs %d).",
+                    inImage->numRows, outVector->n);
+            psMatrixToVector_EXIT;
+        }
+
+        size = PSELEMTYPE_SIZEOF(inImage->type.type) * inImage->numRows;
+
+    } else if (outVector->type.dimen == PS_DIMEN_TRANSV) {
+        PS_CHECK_DIMEN_AND_TYPE(outVector, PS_DIMEN_TRANSV, psMatrixToVector_EXIT);
+
+        if (outVector->n == 0) {
+            outVector->n = inImage->numCols;
+        }
+
+        if (outVector->n != inImage->numCols) {
+            psError(PS_ERR_BAD_PARAMETER_SIZE, true,
+                    "Image and vector sizes differ: (%d vs %d).",
+                    inImage->numCols, outVector->n);
+            psMatrixToVector_EXIT;
+        }
+
+        size = PSELEMTYPE_SIZEOF(inImage->type.type) * inImage->numCols;
+    }
+
+    memcpy(outVector->data.U8, inImage->data.U8[0], size);
+
+    return outVector;
+}
+
+psImage* psVectorToMatrix(psImage* outImage, const psVector* inVector)
+{
+    psS32 size = 0;
+
+    #define VECTORTOMATRIX_CLEANUP {psFree(outImage); return NULL; }
+    // Error checks
+    PS_VECTOR_CHECK_NULL_GENERAL(inVector, VECTORTOMATRIX_CLEANUP);
+
+    if (inVector->type.dimen == PS_DIMEN_VECTOR) {
+        PS_CHECK_DIMEN_AND_TYPE(inVector, PS_DIMEN_VECTOR, VECTORTOMATRIX_CLEANUP);
+        PS_VECTOR_CHECK_EMPTY_GENERAL(inVector, VECTORTOMATRIX_CLEANUP);
+
+        outImage = psImageRecycle(outImage, 1, inVector->n, inVector->type.type);
+
+        // More checks for PS_DIMEN_VECTOR
+        if (outImage->numCols > 1) {
+            psError(PS_ERR_BAD_PARAMETER_SIZE, true,
+                    "Image has more than 1 column: numCols = %d.",
+                    outImage->numCols);
+            VECTORTOMATRIX_CLEANUP;
+        } else if (outImage->numRows != inVector->n) {
+            psError(PS_ERR_BAD_PARAMETER_SIZE, true,
+                    "Image and vector sizes differ: (%d vs %d).",
+                    outImage->numRows, inVector->n);
+            VECTORTOMATRIX_CLEANUP;
+        }
+
+        size = PSELEMTYPE_SIZEOF(outImage->type.type) * outImage->numRows;
+
+    } else if (inVector->type.dimen == PS_DIMEN_TRANSV) {
+        PS_CHECK_DIMEN_AND_TYPE(inVector, PS_DIMEN_TRANSV, VECTORTOMATRIX_CLEANUP);
+        PS_VECTOR_CHECK_EMPTY_GENERAL(inVector, VECTORTOMATRIX_CLEANUP);
+        outImage = psImageRecycle(outImage, inVector->n, 1, inVector->type.type);
+        // More checks for PS_DIMEN_TRANSV
+        if (outImage->numRows > 1) {
+            psError(PS_ERR_BAD_PARAMETER_SIZE, true,
+                    "Image has more than 1 row: numRows = %d.",
+                    outImage->numRows);
+            VECTORTOMATRIX_CLEANUP;
+        } else if (outImage->numCols != inVector->n) {
+            psError(PS_ERR_BAD_PARAMETER_SIZE, true,
+                    "Image and vector sizes differ: (%d vs %d).",
+                    outImage->numCols, inVector->n);
+            VECTORTOMATRIX_CLEANUP;
+        }
+
+        size = PSELEMTYPE_SIZEOF(outImage->type.type) * outImage->numCols;
+    }
+
+    PS_IMAGE_CHECK_NULL_GENERAL(outImage, VECTORTOMATRIX_CLEANUP);
+    PS_CHECK_DIMEN_AND_TYPE(outImage, PS_DIMEN_IMAGE, VECTORTOMATRIX_CLEANUP);
+
+    memcpy(outImage->data.U8[0], inVector->data.U8, size);
+
+    return outImage;
+}
Index: /tags/ipp-1-X/bug123/psLib/src/math/psMatrix.h
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/math/psMatrix.h	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/math/psMatrix.h	(revision 22331)
@@ -0,0 +1,166 @@
+
+/** @file  psMatrix.h
+ *
+ *  @brief Provides functions for linear algebra operations on psImages and psVectors.
+ *
+ *  Functions are provided to:
+ *      Transpose a psImage
+ *      Compute LUD
+ *      Solve LUD
+ *      Matrix inversion
+ *      Calculate determinant
+ *      Matrix multiplication
+ *      Calculate Eigenvectors
+ *      Convert matrix to vector
+ *      Convert vector to matrix
+ *
+ *  These functions treat psImages as if they were matrices, therefore there is no psMatrix. These functions
+ *  operate only with the psF64 data type.
+ *
+ *  @ingroup Matrix
+ *
+ *  @author Ross Harman, MHPCC
+ *
+ *  @version $Revision: 1.15 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-02-17 19:26:23 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+
+#ifndef PSMATRIX_H
+#define PSMATRIX_H
+
+/// @addtogroup Matrix
+/// @{
+
+/** LU Decomposition of psImage matrix.
+ *
+ *  Performs a LU decomposition on a psImage matrix and returns the LU matrix. If the user specifies NULL for
+ *  the outImage or outPerm arguments, then they will be automatically created. The input image must
+ *  be square. This function operates only with the psF64 data type. Input and output arguments should not be
+ *  the same. GSL indexes the top row as the zero row, not the bottom.
+ *
+ *  @return  psImage* : Pointer to LU decomposed psImage.
+ */
+psImage* psMatrixLUD(
+    psImage* outImage,                 ///< Image to return, or NULL.
+    psVector** outPerm,                ///< Output permutation vector used by psMatrixLUSolve.
+    psImage* inImage                   ///< Image to decompose.
+);
+
+/** LU Solution of psImage matrix.
+ *
+ *  Solves for and returns the psVector, {x} in the equation [A]{x} = {b}. If the user specifies NULL as the
+ *  outVector argument, then it will automatically be created. The input image must be square. This function
+ *  operates only with the psF64 data type. Input and output arguments should not be the same. GSL indexes
+ *  the top row as the zero row, not the bottom.
+ *
+ *  @return  psVector* : Pointer to psVector solution of matrix equation.
+ */
+psVector* psMatrixLUSolve(
+    psVector* outVector,               ///< Vector to return, or NULL.
+    const psImage* luImage,            ///< LU-decomposed matrix.
+    const psVector* inVector,          ///< Vector right-hand-side of equation.
+    const psVector* inPerm             ///< Permutation vector resulting from psMatrixLUD function.
+);
+
+/** Invert psImage matrix.
+ *
+ *  Inverts a psImage matrix and returns the determinant as an option through the argument list. If the user
+ *  specifies NULL as the outImage argument, then it will automatically be created. The input image must be
+ *  square. This function operates only with the psF64 data type. Input and output arguments should not be
+ *  the same. GSL indexes the top row as the zero row, not the bottom.
+ *
+ *  @return  psImage* : Pointer to inverted psImage.
+ */
+psImage* psMatrixInvert(
+    psImage* outImage,                 ///< Image to return, or NULL for in-place substitution.
+    const psImage* inImage,            ///< Image to be inverted
+    psF32 *det                         ///< Determinant to return, or NULL
+);
+
+/** Calculate psImage matrix determinant.
+ *
+ *  Calculates the determinant of a psImage matrix and returns the single precision floating point result. The
+ *  input image must be square. This function operates only with the psF64 data type. GSL indexes the top row
+ *  as the zero row, not the bottom.
+ *
+ *  @return  float: Determinant from psImage.
+ */
+psF32 *psMatrixDeterminant(
+    const psImage* inMatrix        ///< Image used to calculate determinant.
+);
+
+/** Performs psImage matrix multiplication.
+ *
+ *  Performs a classical matrix multiplication involving row and column operations. Input images must be square
+ *  and the same size. If the user specifies NULL as the outImage argument, then it will automatically be
+ *  created. This function operates only with the psF64 data type. GSL indexes the top row as the
+ *  zero row, not the bottom.
+ *
+ *  @return  psImage* : Pointer to resulting psImage.
+ */
+psImage* psMatrixMultiply(
+    psImage* outImage,                 ///< Matrix to return, or NULL.
+    psImage* inImage1,                 ///< First input image.
+    psImage* inImage2                  ///< Second input image.
+);
+
+/** Transpose matrix.
+ *
+ *  Performs psImage matrix transpose by substituting existing rows for columns. The input image must be
+ *  square. If the user specifies NULL as the outImage argument, then it will automaticallty be created.
+ *  This function operates only with the psF64 data type. GSL indexes the top row as the zero
+ *  row, not the bottom.
+ *
+ *  @return  psImage* : Pointer to transposed psImage.
+ */
+psImage* psMatrixTranspose(
+    psImage* outImage,                 ///< Image to return, or NULL
+    const psImage* inImage             ///< Image to transpose
+);
+
+/** Calculate matrix eigenvectors.
+ *
+ *  Calculates the eigenvectors for a matrix. The input image must be symmetric and square. If the user
+ *  specifies NULL as the outImage argument, then it will automatically be created. This function operates
+ *  only with the psF64 data type. GSL indexes the top row as the zero row, not the bottom.
+ *
+ *  @return  psImage* : Pointer to matrix of Eigenvectors.
+ */
+psImage* psMatrixEigenvectors(
+    psImage* outImage,                 ///< Eigenvectors to return, or NULL.
+    psImage* inImage                   ///< Input image.
+);
+
+/** Convert matrix to vector.
+ *
+ *  Converts a 1-d psImage matrix into a vector. If the user specifies NULL as the outVector argument, then it
+ *  will automatically be created based on the input image (PS_DIMEN_VECTOR for an input image with 1 col or
+ *  PS_DIMENT_TRANSV for an input image with 1 row). Either the number of rows or the number of colums of the
+ *  input matrix must be 1. This function operates only  with the psF64 data type.
+ *
+ *  @return  psVector* : Pointer to psVector.
+ */
+psVector* psMatrixToVector(
+    psVector* outVector,               ///< Vector to return, or NULL.
+    const psImage* inImage             ///< Image to convert.
+);
+
+/** Convert vector to matrix.
+ *
+ *  Converts a vector into a psImage matrix. If the dimensionality of the vector is PS_DIMEN_VECTOR, then the
+ *  resulting psImage is a 1d column. If the dimensionality of the vector is PS_DIMEN_TRANSV, then the
+ *  resulting psImage is a 1d row. If the user specifies NULL as the outImage argument,  then it will
+ *  automatically be created. This function operates only with the psF64 data type.
+ *
+ *  @return  psVector* : Pointer to psIamge.
+ */
+psImage* psVectorToMatrix(
+    psImage* outImage,                 ///< Matrix to return, or NULL.
+    const psVector* inVector           ///< Vector to convert.
+);
+
+/// @}
+
+#endif
Index: /tags/ipp-1-X/bug123/psLib/src/math/psMinimize.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/math/psMinimize.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/math/psMinimize.c	(revision 22331)
@@ -0,0 +1,1866 @@
+/** @file  psMinimize.c
+ *  \brief basic minimization functions
+ *  @ingroup Math
+ *
+ *  This file will contain functions to minimize an arbitrary function at
+ *  a data point, fit an arbitrary function to a set of data points, and
+ *  fit a 1-D polynomial to a set of data points.
+ *
+ *  @author GLG, MHPCC
+ *
+ *  @version $Revision: 1.110 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-03-31 01:02:15 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ *
+ *  XXX: must follow coding name standards on local functions.
+ *
+ */
+/*****************************************************************************/
+/* INCLUDE FILES                                                             */
+/*****************************************************************************/
+#include <stdio.h>
+#include <float.h>
+#include <math.h>
+
+#include "psMinimize.h"
+#include "psStats.h"
+/*****************************************************************************/
+/* DEFINE STATEMENTS                                                         */
+/*****************************************************************************/
+#define PS_SEG psLib
+#define PS_PWD dataManip
+#define PS_FILE psMinimize
+/*****************************************************************************/
+/* TYPE DEFINITIONS                                                          */
+/*****************************************************************************/
+
+/*****************************************************************************/
+/* GLOBAL VARIABLES                                                          */
+/*****************************************************************************/
+static psMinimizeChi2PowellFunc Chi2PowellFunc = NULL;
+static psVector *myValue;
+static psVector *myError;
+
+/*****************************************************************************/
+/* FILE STATIC VARIABLES                                                     */
+/*****************************************************************************/
+
+// None
+
+/*****************************************************************************/
+/* FUNCTION IMPLEMENTATION - LOCAL                                           */
+/*****************************************************************************/
+
+/******************************************************************************
+p_psBuildSums1D(x, polyOrder, sums): this routine calculates the powers of
+input parameter "x" between 0 and input parameter polyOrder.  The result is
+returned as a psVector sums.
+ 
+XXX: Use a static vector.
+ *****************************************************************************/
+void psBuildSums1D(psF64 x,
+                   psS32 polyOrder,
+                   psVector* sums)
+{
+    psS32 i = 0;
+    psF64 xSum = 0.0;
+
+    if (sums == NULL) {
+        sums = psVectorAlloc(polyOrder, PS_TYPE_F64);
+    }
+    if (polyOrder > sums->n) {
+        sums = psVectorRealloc(sums, polyOrder);
+    }
+
+    xSum = 1.0;
+    for (i = 0; i <= polyOrder; i++) {
+        sums->data.F64[i] = xSum;
+        xSum *= x;
+    }
+}
+
+/*****************************************************************************
+CalculateSecondDerivs(): Given a set of x/y vectors corresponding to a
+tabulated function at n points, this routine calculates the second
+derivatives of the interpolating cubic splines at those n points.
+ 
+The first and second derivatives at the endpoints, undefined in the SDR, are
+here defined to be 0.0.  They can be modified via ypo and yp1.
+ 
+This routine assumes that vectors x and y are of the appropriate types/sizes
+(F32).
+ 
+XXX: This algorithm is derived from the Numerical Recipes.
+XXX: use recycled vectors for internal data.
+XXX: do an F64 version?
+ *****************************************************************************/
+psF32 *CalculateSecondDerivs(const psVector* x,        ///< Ordinates (or NULL to just use the indices)
+                             const psVector* y)        ///< Coordinates
+{
+    psTrace(".psLib.dataManip.CalculateSecondDerivs", 4,
+            "---- CalculateSecondDerivs() begin ----\n");
+
+    psS32 i;
+    psS32 k;
+    psF32 sig;
+    psF32 p;
+    psS32 n = y->n;
+    psF32 *u = (psF32 *) psAlloc(n * sizeof(psF32));
+    psF32 *derivs2 = (psF32 *) psAlloc(n * sizeof(psF32));
+    psF32 *X = (psF32 *) & (x->data.F32[0]);
+    psF32 *Y = (psF32 *) & (y->data.F32[0]);
+    psF32 qn;
+
+    // XXX: The second derivatives at the endpoints, undefined in the SDR,
+    // are set in psConstants.h: PS_LEFT_SPLINE_DERIV, PS_RIGHT_SPLINE_DERIV.
+    derivs2[0] = -0.5;
+    u[0]= (3.0/(X[1]-X[0])) * ((Y[1]-Y[0])/(X[1]-X[0]) - PS_LEFT_SPLINE_DERIV);
+
+    for (i=1;i<=(n-2);i++) {
+        sig = (X[i] - X[i-1]) / (X[i+1] - X[i-1]);
+        p = sig * derivs2[i-1] + 2.0;
+        derivs2[i] = (sig - 1.0) / p;
+        u[i] = ((Y[i+1] - Y[i])/(X[i+1]-X[i])) - ((Y[i]-Y[i-1])/(X[i]-X[i-1]));
+        u[i] = ((6.0 * u[i] / (X[i+1] - X[i-1])) - (sig * u[i-1])) / p;
+
+        psTrace(".psLib.dataManip.CalculateSecondDerivs", 6,
+                "X[%d] is %f\n", i, X[i]);
+        psTrace(".psLib.dataManip.CalculateSecondDerivs", 6,
+                "Y[%d] is %f\n", i, Y[i]);
+        psTrace(".psLib.dataManip.CalculateSecondDerivs", 6,
+                "u[%d] is %f\n", i, u[i]);
+    }
+
+    qn = 0.5;
+    u[n-1] = (3.0/(X[n-1]-X[n-2])) * (PS_RIGHT_SPLINE_DERIV - (Y[n-1]-Y[n-2])/(X[n-1]-X[n-2]));
+    derivs2[n-1] = (u[n-1] - (qn * u[n-2])) / ((qn * derivs2[n-2]) + 1.0);
+
+    for (k=(n-2);k>=0;k--) {
+        derivs2[k] = derivs2[k] * derivs2[k+1] + u[k];
+
+        psTrace(".psLib.dataManip.CalculateSecondDerivs", 6,
+                "derivs2[%d] is %f\n", k, derivs2[k]);
+    }
+
+    psFree(u);
+    psTrace(".psLib.dataManip.CalculateSecondDerivs", 4,
+            "---- CalculateSecondDerivs() end ----\n");
+    return(derivs2);
+}
+
+/******************************************************************************
+p_psNRSpline1DEval(): This routine does NR-style evaluation of cubic splines.
+It takes advantage of the 2nd derivatives of the cubic splines, which are
+stored in the psSPline1D data structure, and computes the interpolated value
+directly, without computing (or using) the interpolating cubic spline
+polynomial.
+ 
+This routine is here mostly for a sanity check on the psLib function
+evalSpline() which computes the interpolated value based on the cubic spline
+polynomials which are stored in psSpline1D.
+ 
+XXX: This is F32 only
+ 
+XXX: spline->knots must be psF32
+ *****************************************************************************/
+/*
+psF32 p_psNRSpline1DEval(psSpline1D *spline,
+                         const psVector* x,
+                         const psVector* y,
+                         psF32 X)
+{
+    PS_PTR_CHECK_NULL(spline, NAN);
+    PS_INT_CHECK_NON_NEGATIVE(spline->n, NAN);
+    PS_VECTOR_CHECK_NULL(spline->domains, NAN);
+    PS_PTR_CHECK_NULL(spline->p_psDeriv2, NAN);
+    PS_VECTOR_CHECK_NULL(x, NAN);
+    PS_VECTOR_CHECK_TYPE(x, PS_TYPE_F32, NAN);
+    PS_VECTOR_CHECK_NULL(y, NAN);
+    PS_VECTOR_CHECK_TYPE(y, PS_TYPE_F32, NAN);
+    PS_VECTOR_CHECK_TYPE(spline->knots, PS_TYPE_F32, NULL);
+ 
+    psS32 n;
+    psS32 klo;
+    psS32 khi;
+    psF32 H;
+    psF32 A;
+    psF32 B;
+    psF32 C;
+    psF32 D;
+    psF32 Y;
+ 
+    n = spline->n;
+    klo = p_psVectorBinDisect32(spline->knots->data.F32, (spline->n)+1, X);
+    if (klo < 0) {
+        psLogMsg(__func__, PS_LOG_WARN,
+                 "WARNING: psMinimize.c: p_psNRSpline1DEval(): p_psVectorBinDisect32 returned an error (%d).\n", klo);
+        return(NAN);
+    }
+    khi = klo + 1;
+    H = spline->knots->data.F32[khi] - spline->knots->data.F32[klo];
+    A = (spline->knots->data.F32[khi] - X) / H;
+    B = (X - spline->knots->data.F32[klo]) / H;
+    C = ((A*A*A)-A) * (H*H/6.0);
+    D = ((B*B*B)-B) * (H*H/6.0);
+ 
+    Y = (A * y->data.F32[klo]) +
+        (B * y->data.F32[khi]) +
+        (C * (spline->p_psDeriv2)[klo]) +
+        (D * (spline->p_psDeriv2)[khi]);
+ 
+    return(Y);
+}
+*/
+/*****************************************************************************/
+/* FUNCTION IMPLEMENTATION - PUBLIC                                          */
+/*****************************************************************************/
+
+/*****************************************************************************
+psVectorFitSpline1D(): given a psSpline1D data structure and a set of x/y
+vectors, this routine generates the linear or cublic splines which satisfy
+those data points.
+ 
+The formula for calculating the spline polynomials is derived from Numerical
+Recipes in C.  The basic idea is that the polynomial is
+ (1)     y = (A * y[0]) +
+ (2)         (B * y[1]) +
+ (3)         ((((A*A*A)-A) * mySpline->p_psDeriv2[0]) * H^2)/6.0 +
+ (4)         ((((B*B*B)-B) * mySpline->p_psDeriv2[1]) * H^2)/6.0
+Where:
+ H = x[1]-x[0]
+ A = (x[1]-x)/H
+ B = (x-x[0])/H
+The bulk of the code in this routine is the expansion of the above equation
+into a polynomial in terms of x, and then saving the coefficients of the
+powers of x in the spline polynomials.  This gets pretty complicated.
+ 
+XXX: usage of yErr is not specified in IfA documentation.
+ 
+XXX: Is the x argument redundant?  What do we do if the x argument is
+supplied, but does not equal the knots specified in mySpline?
+ 
+XXX: can psSpline be NULL?
+ 
+XXX: reimplement this assuming that mySpline is NULL?
+ 
+XXX: What happens if X is NULL, then an index vector is generated for X, but
+that index vector lies outside the range vectors in mySpline?
+ 
+XXX: Assumes mySpline->knots is psF32.  Must add psU32 and psF64.
+ *****************************************************************************/
+psSpline1D *psVectorFitSpline1D(psSpline1D *mySpline,     ///< The spline which will be generated.
+                                const psVector* x,        ///< Ordinates (or NULL to just use the indices)
+                                const psVector* y,        ///< Coordinates
+                                const psVector* yErr)     ///< Errors in coordinates, or NULL
+{
+    PS_VECTOR_CHECK_NULL(y, NULL);
+    PS_VECTOR_CHECK_TYPE_F32_OR_F64(y, NULL);
+    if (mySpline != NULL) {
+        PS_VECTOR_CHECK_TYPE(mySpline->knots, PS_TYPE_F32, NULL);
+    }
+
+    psTrace(".psLib.dataManip.psVectorFitSpline1D", 4,
+            "---- psVectorFitSpline1D() begin ----\n");
+    psS32 numSplines = (y->n)-1;
+    psF32 tmp;
+    psF32 H;
+    psS32 i;
+    psF32 slope;
+    psVector *x32 = NULL;
+    psVector *y32 = NULL;
+    psVector *yErr32 = NULL;
+    static psVector *x32Static = NULL;
+    static psVector *y32Static = NULL;
+    static psVector *yErr32Static = NULL;
+
+    PS_VECTOR_CONVERT_F64_TO_F32_STATIC(y, y32, y32Static);
+
+    // If yErr==NULL, set all errors equal.
+    if (yErr == NULL) {
+        PS_VECTOR_GEN_YERR_STATIC_F32(yErr32Static, y->n);
+        yErr32 = yErr32Static;
+    } else {
+        PS_VECTOR_CHECK_TYPE_F32_OR_F64(yErr, NULL);
+        PS_VECTOR_CONVERT_F64_TO_F32_STATIC(yErr, yErr32, yErr32Static);
+    }
+
+    // If x==NULL, create an x32 vector with x values set to (0:n).
+    if (x == NULL) {
+        PS_VECTOR_GEN_X_INDEX_STATIC_F32(x32Static, y->n);
+        x32 = x32Static;
+    } else {
+        PS_VECTOR_CHECK_TYPE_F32_OR_F64(x, NULL);
+        PS_VECTOR_CONVERT_F64_TO_F32_STATIC(x, x32, x32Static);
+    }
+    PS_VECTOR_CHECK_SIZE_EQUAL(x32, y32, NULL);
+    PS_VECTOR_CHECK_SIZE_EQUAL(yErr32, y32, NULL);
+
+    /*
+        XXX:
+        This can not be implemented until SDR states what order spline should be
+        created.
+        Should we error if mySpline is not NULL?
+        Should we error if mySPline is not NULL?
+    */
+    if (mySpline == NULL) {
+        mySpline = psSpline1DAllocGeneric(x32, 3);
+    }
+    PS_PTR_CHECK_NULL(mySpline, NULL);
+    PS_INT_CHECK_NON_NEGATIVE(mySpline->n, NULL);
+
+    if (y32->n != (1 + mySpline->n)) {
+        psError(PS_ERR_BAD_PARAMETER_SIZE, true,
+                "data size / spline size mismatch (%d %d)\n",
+                y32->n, mySpline->n);
+        return(NULL);
+    }
+
+    // If these are linear splines, which means their polynomials will have
+    // two coefficients, then we do the simple calculation.
+    if (2 == (mySpline->spline[0])->n) {
+        for (i=0;i<mySpline->n;i++) {
+            slope = (y32->data.F32[i+1] - y32->data.F32[i]) /
+                    (mySpline->knots->data.F32[i+1] - mySpline->knots->data.F32[i]);
+            (mySpline->spline[i])->coeff[0] = y32->data.F32[i] -
+                                              (slope * mySpline->knots->data.F32[i]);
+
+            (mySpline->spline[i])->coeff[1] = slope;
+            psTrace(".psLib.dataManip.psMinimize.psVectorFitSpline1D", 4,
+                    "---- mySpline %d coeffs are (%f, %f)\n", i,
+                    (mySpline->spline[i])->coeff[0],
+                    (mySpline->spline[i])->coeff[1]);
+        }
+        psTrace(".psLib.dataManip.psMinimize.psVectorFitSpline1D", 4,
+                "---- Exiting psVectorFitSpline1D()()\n");
+        return((psSpline1D *) mySpline);
+    }
+
+    // Check if these are cubic splines (n==4).  If not, psError.
+    if (4 != (mySpline->spline[0])->n) {
+        psError(PS_ERR_BAD_PARAMETER_SIZE, true,
+                "Don't know how to generate %d-order splines.",
+                (mySpline->spline[0])->n-1);
+        return(NULL);
+    }
+
+    // If we get here, then we know these are cubic splines.  We first
+    // generate the second derivatives at each data point.
+    mySpline->p_psDeriv2 = CalculateSecondDerivs(x32, y32);
+    for (i=0;i<y32->n;i++)
+        psTrace(".psLib.dataManip.psVectorFitSpline1D", 6,
+                "Second deriv[%d] is %f\n", i, mySpline->p_psDeriv2[i]);
+
+    // We generate the coefficients of the spline polynomials.  I can't
+    // concisely explain how this code works.  See above function comments
+    // and Numerical Recipes in C.
+    for (i=0;i<numSplines;i++) {
+        H = x32->data.F32[i+1] - x32->data.F32[i];
+        psTrace(".psLib.dataManip.psVectorFitSpline1D", 4,
+                "x data (%f - %f) (%f)\n",
+                x32->data.F32[i],
+                x32->data.F32[i+1], H);
+        //
+        // ******** Calculate 0-order term ********
+        //
+        // From (1)
+        (mySpline->spline[i])->coeff[0] = (y32->data.F32[i] * x32->data.F32[i+1]/H);
+        // From (2)
+        ((mySpline->spline[i])->coeff[0])-= ((y32->data.F32[i+1] * x32->data.F32[i])/H);
+        // From (3)
+        tmp = (x32->data.F32[i+1] * x32->data.F32[i+1] * x32->data.F32[i+1]) / (H * H * H);
+        tmp-= (x32->data.F32[i+1] / H);
+        tmp*= (mySpline->p_psDeriv2)[i] * H * H / 6.0;
+        ((mySpline->spline[i])->coeff[0])+= tmp;
+        // From (4)
+        tmp = -(x32->data.F32[i] * x32->data.F32[i] * x32->data.F32[i]) / (H * H * H);
+        tmp+= (x32->data.F32[i] / H);
+        tmp*= (mySpline->p_psDeriv2)[i+1] * H * H / 6.0;
+        ((mySpline->spline[i])->coeff[0])+= tmp;
+
+        //
+        // ******** Calculate 1-order term ********
+        //
+        // From (1)
+        (mySpline->spline[i])->coeff[1] = -(y32->data.F32[i]) / H;
+        // From (2)
+        ((mySpline->spline[i])->coeff[1])+= (y32->data.F32[i+1] / H);
+        // From (3)
+        tmp = -3.0 * (x32->data.F32[i+1] * x32->data.F32[i+1]) / (H * H * H);
+        tmp+= (1.0 / H);
+        tmp*= ((mySpline->p_psDeriv2)[i]) * H * H / 6.0;
+        ((mySpline->spline[i])->coeff[1])+= tmp;
+        // From (4)
+        tmp = 3.0 * (x32->data.F32[i] * x32->data.F32[i]) / (H * H * H);
+        tmp-= (1.0 / H);
+        tmp*= ((mySpline->p_psDeriv2)[i+1]) * H * H / 6.0;
+        ((mySpline->spline[i])->coeff[1])+= tmp;
+
+        //
+        // ******** Calculate 2-order term ********
+        //
+        // From (3)
+        (mySpline->spline[i])->coeff[2] = ((mySpline->p_psDeriv2)[i]) * 3.0 * x32->data.F32[i+1] / (6.0 * H);
+        // From (4)
+        ((mySpline->spline[i])->coeff[2])-= (((mySpline->p_psDeriv2)[i+1]) * 3.0 * x32->data.F32[i] / (6.0 * H));
+
+        //
+        // ******** Calculate 3-order term ********
+        //
+        // From (3)
+        (mySpline->spline[i])->coeff[3] = -((mySpline->p_psDeriv2)[i]) / (6.0 * H);
+        // From (4)
+        ((mySpline->spline[i])->coeff[3])+=  ((mySpline->p_psDeriv2)[i+1]) / (6.0 * H);
+
+        psTrace(".psLib.dataManip.psVectorFitSpline1D", 6,
+                "(mySpline->spline[%d])->coeff[0] is %f\n", i, (mySpline->spline[i])->coeff[0]);
+        psTrace(".psLib.dataManip.psVectorFitSpline1D", 6,
+                "(mySpline->spline[%d])->coeff[1] is %f\n", i, (mySpline->spline[i])->coeff[1]);
+        psTrace(".psLib.dataManip.psVectorFitSpline1D", 6,
+                "(mySpline->spline[%d])->coeff[2] is %f\n", i, (mySpline->spline[i])->coeff[2]);
+        psTrace(".psLib.dataManip.psVectorFitSpline1D", 6,
+                "(mySpline->spline[%d])->coeff[3] is %f\n", i, (mySpline->spline[i])->coeff[3]);
+
+    }
+
+    psTrace(".psLib.dataManip.psVectorFitSpline1D", 4,
+            "---- psVectorFitSpline1D() end ----\n");
+    return(mySpline);
+}
+
+
+/******************************************************************************
+XXX: We assume unnormalized gaussians.
+ *****************************************************************************/
+psVector *psMinimizeLMChi2Gauss1D(psImage *deriv,
+                                  const psVector *params,
+                                  const psArray *coords)
+{
+    PS_PTR_CHECK_NULL(coords, NULL);
+    PS_PTR_CHECK_NULL(params, NULL);
+
+    psTrace(".psLib.dataManip.psMinimize", 4,
+            "---- psMinimizeLMChi2Gauss1D() begin ----\n");
+    psF32 x;
+    psS32 i;
+    psF32 mean = params->data.F32[0];
+    psF32 stdev = params->data.F32[1];
+    psVector *out = psVectorAlloc(coords->n, PS_TYPE_F32);
+
+    psTrace(".psLib.dataManip.psMinimize", 6,
+            "(mean, stdev) is (%f, %f)\n", mean, stdev);
+
+    if (deriv == NULL) {
+        deriv = psImageAlloc(params->n, coords->n, PS_TYPE_F32);
+    } else {
+        PS_IMAGE_CHECK_SIZE(deriv, params->n, coords->n, NULL);
+        PS_IMAGE_CHECK_TYPE(deriv, PS_TYPE_F32, NULL);
+    }
+
+    for (i=0;i<coords->n;i++) {
+        x = ((psVector *) (coords->data[i]))->data.F32[0];
+        out->data.F32[i] = psGaussian(x, mean, stdev, false);
+    }
+
+    for (i=0;i<coords->n;i++) {
+        x = ((psVector *) (coords->data[i]))->data.F32[0];
+        psF32 tmp = (x - mean) * psGaussian(x, mean, stdev, false);
+        deriv->data.F32[i][0] = tmp / (stdev * stdev);
+        tmp = (x - mean) * (x - mean) *
+              psGaussian(x, mean, stdev, 0);
+        deriv->data.F32[i][1] = tmp / (stdev * stdev * stdev);
+    }
+
+    psTrace(".psLib.dataManip.psMinimize", 4,
+            "---- psMinimizeLMChi2Gauss1D() end ----\n");
+    return(out);
+}
+
+/*
+XXX: from bug 230:
+ 
+We first perform a rotation:
+u = - (x-x0)*cos(theta) + (y-y0)*sin(theta)
+v = (x-x0)*cos(theta) + (y-y0)*sin(theta)
+ 
+Here u is the major axis, and v is the minor axis, x0,y0 is the centre, and
+theta is the position angle.
+ 
+Then the flux is
+ 
+flux = norm * exp(-( u*u/2.0/sigmau/sigmau + v*v/2.0/sigmav/sigmav)
+)/2.0/pi/sigmau/sigmav
+ 
+Here sigmau and sigmav are the widths of the major and minor axes.
+ 
+The "norm" parameter in the equation above corresponds to the normalisation.
+ 
+Suggest order:
+ 
+norm
+x0
+y0
+sigma_u
+sigma_v
+theta
+*/
+
+psVector *psMinimizeLMChi2Gauss2D(psImage *deriv,
+                                  const psVector *params,
+                                  const psArray *coords)
+{
+    PS_PTR_CHECK_NULL(coords, NULL);
+    PS_PTR_CHECK_NULL(params, NULL);
+
+    psF64 normalization = params->data.F32[0];
+    psF64 x0 = params->data.F32[1];
+    psF64 y0 = params->data.F32[2];
+    psF64 sigmaX = params->data.F32[3];
+    psF64 sigmaY = params->data.F32[4];
+    psF64 theta = params->data.F32[5];
+    psVector *out = psVectorAlloc(coords->n, PS_TYPE_F32);
+
+    if (deriv == NULL) {
+        deriv = psImageAlloc(params->n, coords->n, PS_TYPE_F32);
+    } else {
+        PS_IMAGE_CHECK_SIZE(deriv, 6, coords->n, NULL);
+        PS_IMAGE_CHECK_TYPE(deriv, PS_TYPE_F32, NULL);
+    }
+
+    psTrace(".psLib.dataManip.psMinimize", 4,
+            "---- psMinimizeLMChi2Gauss2D() begin ----\n");
+
+    for (psS32 i=0;i<coords->n;i++) {
+        psF64 x = ((psVector *) coords->data[i])->data.F32[0];
+        psF64 y = ((psVector *) coords->data[i])->data.F32[0];
+
+        psF64 u = - (x-x0)*cos(theta) + (y-y0)*sin(theta);
+        psF64 v = (x-x0)*cos(theta) + (y-y0)*sin(theta);
+
+        psF64 flux = normalization * exp(-( u*u/(2.0 * sigmaX * sigmaX) +
+                                            v*v/(2.0 * sigmaY * sigmaY)))/
+                     (2.0 * PS_PI * sigmaX * sigmaY);
+        out->data.F32[i] = flux;
+
+        // XXX: Calculate these correctly.
+        deriv->data.F32[i][0] = 0.0;
+        deriv->data.F32[i][1] = 0.0;
+        deriv->data.F32[i][2] = 0.0;
+        deriv->data.F32[i][3] = 0.0;
+        deriv->data.F32[i][4] = 0.0;
+        deriv->data.F32[i][5] = 0.0;
+    }
+
+    psTrace(".psLib.dataManip.psMinimize", 4,
+            "---- psMinimizeLMChi2Gauss2D() end ----\n");
+    return(out);
+}
+
+/******************************************************************************
+psMinimizeLMChi2():  This routine will take an procedure which calculates
+an arbitrary function and it's derivative and minimize the chi-squared match
+between that function at the specified coords and the specified value at
+those coords.
+ 
+XXX: Do this:
+ After checking that all entries in the paramMask are 1 or 0, when
+ forming the A matrix from alpha, try this:
+ 
+     A[i][i] = (1 + lambda*paramask[i]) * alpha[i][i];
+ 
+XXX: This is very different from what is specified in the SDR.  Must
+coordinate with IfA on new SDR.
+ 
+XXX: Do vector/image recycles.
+ 
+XXX: probably yErr will be part of the SDR.
+ 
+XXX: This must work for both F32 and F64.  F32 is currently implemented.
+     Note: since the LUD routines are only implemented in F64, then we
+     will have to convert all F32 input vectors to F64 regardless.  So,
+     the F64 port might be.
+ 
+XXX: Must update the covar matrix.
+ *****************************************************************************/
+psBool psMinimizeLMChi2(psMinimization *min,
+                        psImage *covar,
+                        psVector *params,
+                        const psVector *paramMask,
+                        const psArray *x,
+                        const psVector *y,
+                        const psVector *yErr,
+                        psMinimizeLMChi2Func func)
+{
+    PS_PTR_CHECK_NULL(min, NULL);
+    PS_VECTOR_CHECK_NULL(params, NULL);
+    PS_VECTOR_CHECK_EMPTY(params, NULL);
+    PS_PTR_CHECK_NULL(x, NULL);
+    PS_VECTOR_CHECK_NULL(y, NULL);
+    PS_VECTOR_CHECK_EMPTY(y, NULL);
+    PS_VECTOR_CHECK_SIZE_EQUAL(x, y, NULL);
+    PS_PTR_CHECK_NULL(func, NULL);
+
+    if (paramMask != NULL) {
+        PS_VECTOR_CHECK_SIZE_EQUAL(params, paramMask, NULL);
+    }
+    if (yErr != NULL) {
+        PS_VECTOR_CHECK_SIZE_EQUAL(y, yErr, NULL);
+    }
+    if (covar != NULL) {
+        PS_IMAGE_CHECK_SIZE(covar, params->n, params->n, NULL);
+    }
+
+    psTrace(".psLib.dataManip.psMinimize", 4,
+            "---- psMinimizeLMChi2() begin ----\n");
+    psS32 numData = y->n;
+    psS32 numParams = params->n;
+    psS32 i;
+    psS32 j;
+    psS32 k;
+    psS32 l;
+    psS32 n;
+    psS32 p;
+    psVector *beta = psVectorAlloc(numParams, PS_TYPE_F64);
+    psVector *perm = NULL;
+
+    psVector *paramDeltasF64 = psVectorAlloc(numParams, PS_TYPE_F64);
+    psVector *origParams = psVectorAlloc(numParams, PS_TYPE_F32);
+    psVector *newParams = psVectorAlloc(numParams, PS_TYPE_F32);
+
+    psImage *alpha = psImageAlloc(numParams, numParams, PS_TYPE_F32);
+    psImage *A = psImageAlloc(numParams, numParams, PS_TYPE_F64);
+    psImage *aOut = psImageAlloc(numParams, numParams, PS_TYPE_F64);
+    psImage *deriv = psImageAlloc(numParams, numData, PS_TYPE_F32);
+    psVector *currValueVec = NULL;
+    psVector *newValueVec = NULL;
+    psF32 currChi2 = 0.0;
+    psF32 newChi2 = 0.0;
+    psF32 lamda = 0.00005;
+    lamda = 0.05;
+
+    psTrace(".psLib.dataManip.psMinimize", 6,
+            "min->maxIter is %d\n", min->maxIter);
+    psTrace(".psLib.dataManip.psMinimize", 6,
+            "min->tol is %f\n", min->tol);
+
+    for (p=0;p<numParams;p++) {
+        origParams->data.F32[p] = params->data.F32[p];
+    }
+
+    min->lastDelta = PS_MAX_F32;
+    min->iter = 0;
+
+    while ((min->lastDelta > min->tol) && (min->iter < min->maxIter)) {
+        psTrace(".psLib.dataManip.psMinimize", 4,
+                "------------------------------------------------------\n");
+        psTrace(".psLib.dataManip.psMinimize", 4,
+                "Iteration %d.  Delta is %f\n", min->iter, min->lastDelta);
+
+        //
+        // Calculate the current values and chi-squared of the function.
+        //
+        currChi2 = 0.0;
+        currValueVec = func(deriv, params, x);
+        for (n=0;n<numData;n++) {
+            currChi2+= (currValueVec->data.F32[n] - y->data.F32[n]) *
+                       (currValueVec->data.F32[n] - y->data.F32[n]);
+            psTrace(".psLib.dataManip.psMinimize", 6,
+                    "data[%d], chi2 calculation+= (%f - %f)^2\n", n,
+                    currValueVec->data.F32[n], y->data.F32[n]);
+        }
+
+        for (p=0;p<numParams;p++) {
+            psTrace(".psLib.dataManip.psMinimize", 6,
+                    "params->data.F32[%d] is %f.\n", p, params->data.F32[p]);
+        }
+        psTrace(".psLib.dataManip.psMinimize", 6,
+                "Current chi-squared is (%f)\n", currChi2);
+
+        //
+        // Mask elements of the derivative for each data point.
+        //
+        for (p=0;p<numParams;p++) {
+            if ((paramMask != NULL) && (paramMask->data.U8[p] != 0)) {
+                for (n=0;n<numData;n++) {
+                    deriv->data.F32[n][p] = 0.0;
+                }
+            }
+        }
+
+        //
+        // Calculate the BETA vector.
+        //
+        for (p=0;p<numParams;p++) {
+            beta->data.F64[p] = 0.0;
+            for (n=0;n<numData;n++) {
+                (beta->data.F64[p])+=
+                    (y->data.F32[n] - currValueVec->data.F32[n]) *
+                    deriv->data.F32[n][p];
+            }
+            // XXX: multiply by -1 here?
+            (beta->data.F64[p])*= -1.0;
+            psTrace(".psLib.dataManip.psMinimize", 6,
+                    "beta->data.F64[%d] is %f.\n", p, beta->data.F64[p]);
+        }
+        psFree(currValueVec);
+
+        //
+        // Calculate the ALPHA matrix.
+        //
+        for (k=0;k<numParams;k++) {
+            for (l=0;l<numParams;l++) {
+                alpha->data.F32[k][l] = 0.0;
+                for (n=0;n<numData;n++) {
+                    alpha->data.F32[k][l]+= deriv->data.F32[n][k] *
+                                            deriv->data.F32[n][l];
+                }
+            }
+        }
+
+        //
+        // Calculate the matrix A.
+        //
+        for (j=0;j<numParams;j++) {
+            for (k=0;k<numParams;k++) {
+                if (j == k) {
+                    A->data.F64[j][k] =
+                        (psF64) ((1.0 + lamda) * alpha->data.F32[j][k]);
+                } else {
+                    A->data.F64[j][k] = (psF64) alpha->data.F32[j][k];
+                }
+            }
+        }
+        for (j=0;j<numParams;j++) {
+            psTrace(".psLib.dataManip.psMinimize", 6, "Matrix A[][]:\n");
+            for (k=0;k<numParams;k++) {
+                psTrace(".psLib.dataManip.psMinimize", 6, "%f ", A->data.F64[j][k]);
+            }
+            psTrace(".psLib.dataManip.psMinimize", 6, "Matrix A[][]:\n");
+        }
+
+        //
+        // Solve A * alpha = Beta
+        //
+        // XXX: How do we know if these functions were successful?
+        //
+        aOut = psMatrixLUD(aOut, &perm, A);
+        paramDeltasF64 = psMatrixLUSolve(paramDeltasF64, aOut, beta, perm);
+
+        //
+        // Mask any masked parameters.
+        //
+        for (i=0;i<numParams;i++) {
+            psTrace(".psLib.dataManip.psMinimize", 6,
+                    "paramDeltasF64->data.F64[%d] is %f.\n", i, paramDeltasF64->data.F64[i]);
+            if ((paramMask != NULL) && (paramMask->data.U8[i] != 0)) {
+                newParams->data.F32[i] = origParams->data.F32[i];
+            } else {
+                newParams->data.F32[i] = params->data.F32[i] -
+                                         (psF32) paramDeltasF64->data.F64[i];
+            }
+        }
+
+        psTrace(".psLib.dataManip.psMinimize", 6,
+                "Calling func() with new parameters:\n");
+        for (i=0;i<numParams;i++) {
+            psTrace(".psLib.dataManip.psMinimize", 6,
+                    "newParams->data.F32[%d] is %f.\n", i, newParams->data.F32[i]);
+        }
+
+
+        //
+        // Calculate new function values.
+        //
+        newChi2 = 0.0;
+        newValueVec = func(deriv, newParams, x);
+        for (n=0;n<numData;n++) {
+            newChi2+= (newValueVec->data.F32[n] - y->data.F32[n]) *
+                      (newValueVec->data.F32[n] - y->data.F32[n]);
+
+        }
+        psFree(newValueVec);
+
+        psTrace(".psLib.dataManip.psMinimize", 4,
+                "old/new chi-squareds are (%f, %f)\n", currChi2, newChi2);
+
+        //
+        // If the new chi-squared is lower, then keep it.
+        //
+        if (currChi2 > newChi2) {
+            min->lastDelta = (currChi2 - newChi2)/currChi2;
+            min->value = newChi2;
+
+            // We already masked params.
+            for (i=0;i<numParams;i++) {
+                params->data.F32[i] = (psF32) newParams->data.F32[i];
+            }
+            lamda*= 0.1;
+            psTrace(".psLib.dataManip.psMinimize", 4, "*** Reducing lamda by factor of 10\n");
+        } else {
+            lamda*= 10.0;
+            psTrace(".psLib.dataManip.psMinimize", 4, "*** Increasing lamda by factor of 10\n");
+        }
+        psTrace(".psLib.dataManip.psMinimize", 4,
+                "lamda is %f\n", lamda);
+        min->iter++;
+    }
+    psFree(beta);
+    psFree(perm);
+    psFree(paramDeltasF64);
+    psFree(origParams);
+    psFree(newParams);
+    psFree(alpha);
+    psFree(A);
+    psFree(aOut);
+    psFree(deriv);
+
+    if ((min->iter < min->maxIter) ||
+            (min->lastDelta <= min->tol)) {
+        return(true);
+    }
+
+    psTrace(".psLib.dataManip.psMinimize", 4,
+            "---- psMinimizeLMChi2() end (false) ----\n");
+    return(false);
+}
+
+/******************************************************************************
+VectorFitPolynomial1DCheb():  This routine will fit a Chebyshev polynomial of
+degree myPoly to the data points (x, y) and return the coefficients of that
+polynomial.
+ 
+XXX: yErr is currently ignored.
+ 
+XXX: Use private name?
+*****************************************************************************/
+psPolynomial1D *VectorFitPolynomial1DCheby(psPolynomial1D* myPoly,
+        const psVector* x,
+        const psVector* y,
+        const psVector* yErr)
+{
+    psS32 j;
+    psS32 k;
+    psS32 n = x->n;
+    psF64 fac;
+    psF64 sum;
+    PS_VECTOR_GEN_STATIC_RECYCLED(f, n, PS_TYPE_F64);
+    psScalar *fScalar;
+    psScalar tmpScalar;
+    tmpScalar.type.type = PS_TYPE_F64;
+
+    // XXX: These assignments appear too simple to warrant code and
+    // variable declarations.  I retain them here to maintain coherence
+    // with the NR code.
+    psF64 min = -1.0;
+    psF64 max = 1.0;
+    psF64 bma = 0.5 * (max-min);  // 1
+    psF64 bpa = 0.5 * (max+min);  // 0
+
+    // In this loop, we first calculate the values of X for which the
+    // Chebyshev polynomials are zero (see NR, section 5.4).  Then we
+    // calculate the value of the function we are fitting the Chebyshev
+    // polynomials to at those values of X.  This is a bit tricky since
+    // we don't know that function.  So, we instead do 3-order LaGrange
+    // interpolation at the point X for the psVectors x,y for which we
+    // are fitting this ChebyShev polynomial to.
+
+    for (psS32 i=0;i<n;i++) {
+        // NR 5.8.4
+        psF64 Y = cos(PS_PI * (0.5 + ((psF32) i)) / ((psF32) n));
+        psF64 X = (Y + bma + bpa) - 1.0;
+        tmpScalar.data.F64 = X;
+
+        // We interpolate against are tabluated x,y vectors to determine the
+        // function value at X.
+        fScalar = p_psVectorInterpolate((psVector *) x,
+                                        (psVector *) y,
+                                        3,
+                                        &tmpScalar);
+
+        f->data.F64[i] = fScalar->data.F64;
+        psFree(fScalar);
+
+        psTrace(".psLib.dataManip.VectorFitPolynomial1DCheby", 6,
+                "(x, X, y, f(X)) is (%f, %f, %f, %f)\n",
+                x->data.F64[i], X, y->data.F64[i], f->data.F64[i]);
+    }
+
+    // We have the values for f() at the zero points, we now calculate the
+    // coefficients of the Chebyshev polynomial: NR 5.8.7.
+
+    fac = 2.0/((psF32) n);
+    // XXX: is this loop bound correct?
+    for (j=0;j<myPoly->n;j++) {
+        sum = 0.0;
+        for (k=0;k<n;k++) {
+            sum+= f->data.F64[k] *
+                  cos(PS_PI * ((psF32) j) * (0.5 + ((psF32) k)) / ((psF32) n));
+        }
+
+        myPoly->coeff[j] = fac * sum;
+    }
+
+    return(myPoly);
+}
+
+/******************************************************************************
+VectorFitPolynomial1DOrd():  This routine will fit an ordinary polynomial of
+degree myPoly to the data points (x, y) and return the coefficients of that
+polynomial.
+ 
+XXX: Use private name?
+XXX: Use recycled vectors.
+ *****************************************************************************/
+psPolynomial1D* VectorFitPolynomial1DOrd(psPolynomial1D* myPoly,
+        const psVector* x,
+        const psVector* y,
+        const psVector* yErr)
+{
+    psS32 polyOrder = myPoly->n;
+    psImage* A = NULL;
+    psImage* ALUD = NULL;
+    psVector* B = NULL;
+    psVector* outPerm = NULL;
+    psVector* X = NULL;         // NOTE: do we need this?
+    psVector* coeffs = NULL;
+    psS32 i = 0;
+    psS32 j = 0;
+    psS32 k = 0;
+    psVector* xSums = NULL;
+
+    psTrace(".psLib.dataManip.VectorFitPolynomial1DOrd", 4,
+            "---- VectorFitPolynomial1DOrd() begin ----\n");
+    // printf("VectorFitPolynomial1D()\n");
+    // for (i=0;i<x->n;i++) {
+    // printf("(x, y, yErr) is (%f, %f, %f)\n", x->data.F64[i], y->data.F64[i], yErr->data.F64[i]);
+    // }
+
+    A = psImageAlloc(polyOrder, polyOrder, PS_TYPE_F64);
+    ALUD = psImageAlloc(polyOrder, polyOrder, PS_TYPE_F64);
+
+    B = psVectorAlloc(polyOrder, PS_TYPE_F64);
+    coeffs = psVectorAlloc(polyOrder, PS_TYPE_F64);
+    X = psVectorAlloc(x->n, PS_TYPE_F64);
+    xSums = psVectorAlloc(1 + 2 * polyOrder, PS_TYPE_F64);
+
+    // Initialize data structures.
+    for (i = 0; i < polyOrder; i++) {
+        B->data.F64[i] = 0.0;
+        coeffs->data.F64[i] = 0.0;
+        for (j = 0; j < polyOrder; j++) {
+            A->data.F64[i][j] = 0.0;
+            ALUD->data.F64[i][j] = 0.0;
+        }
+    }
+    for (i = 0; i < X->n; i++) {
+        X->data.F64[i] = x->data.F64[i];
+    }
+
+    // Build the B and A data structs.
+    if (yErr == NULL) {
+        for (i = 0; i < X->n; i++) {
+            psBuildSums1D(X->data.F64[i], 2 * polyOrder, xSums);
+
+            for (k = 0; k < polyOrder; k++) {
+                B->data.F64[k] += y->data.F64[i] * xSums->data.F64[k];
+            }
+
+            for (k = 0; k < polyOrder; k++) {
+                for (j = 0; j < polyOrder; j++) {
+                    A->data.F64[k][j] += xSums->data.F64[k + j];
+                }
+            }
+        }
+    } else {
+        for (i = 0; i < X->n; i++) {
+            psBuildSums1D(X->data.F64[i], 2 * polyOrder, xSums);
+
+            for (k = 0; k < polyOrder; k++) {
+                B->data.F64[k] += y->data.F64[i] * xSums->data.F64[k] /
+                                  yErr->data.F64[i];
+            }
+
+            for (k = 0; k < polyOrder; k++) {
+                for (j = 0; j < polyOrder; j++) {
+                    A->data.F64[k][j] += xSums->data.F64[k + j] /
+                                         yErr->data.F64[i];
+                }
+            }
+        }
+    }
+
+    // XXX: How do we know if these routines were successful?
+    ALUD = psMatrixLUD(ALUD, &outPerm, A);
+    coeffs = psMatrixLUSolve(coeffs, ALUD, B, outPerm);
+
+    for (k = 0; k < polyOrder; k++) {
+        myPoly->coeff[k] = coeffs->data.F64[k];
+        // printf("myPoly->coeff[%d] is %f\n", k, myPoly->coeff[k]);
+    }
+
+    psFree(A);
+    psFree(ALUD);
+    psFree(B);
+    psFree(coeffs);
+    psFree(X);
+    psFree(outPerm);
+    psFree(xSums);
+
+    psTrace(".psLib.dataManip.VectorFitPolynomial1DOrd", 4,
+            "---- VectorFitPolynomial1DOrd() begin ----\n");
+    return (myPoly);
+}
+
+/******************************************************************************
+psVectorFitPolynomial1D():  This routine must fit a polynomial of degree
+myPoly to the data points (x, y) and return the coefficients of that
+polynomial.
+ 
+XXX: type F32 is done via vector conversion only.
+ *****************************************************************************/
+psPolynomial1D* psVectorFitPolynomial1D(psPolynomial1D* myPoly,
+                                        const psVector* x,
+                                        const psVector* y,
+                                        const psVector* yErr)
+{
+    PS_POLY_CHECK_NULL(myPoly, NULL);
+    PS_INT_CHECK_NON_NEGATIVE(myPoly->n, NULL);
+    PS_VECTOR_CHECK_NULL(y, NULL);
+    PS_VECTOR_CHECK_EMPTY(y, NULL);
+    PS_VECTOR_CHECK_TYPE_F32_OR_F64(y, NULL);
+
+    psS32 i;
+    psVector *x64 = NULL;
+    psVector *y64 = NULL;
+    psVector *yErr64 = NULL;
+    static psVector *x64Static = NULL;
+    static psVector *y64Static = NULL;
+    static psVector *yErr64Static = NULL;
+
+    PS_VECTOR_CONVERT_F32_TO_F64_STATIC(y, y64, y64Static);
+    // If yErr==NULL, set all errors equal.
+    if (yErr == NULL) {
+        PS_VECTOR_GEN_YERR_STATIC_F64(yErr64Static, y->n);
+        yErr64 = yErr64Static;
+    } else {
+        PS_VECTOR_CHECK_TYPE_F32_OR_F64(yErr, NULL);
+        PS_VECTOR_CONVERT_F32_TO_F64_STATIC(yErr, yErr64, yErr64Static);
+    }
+
+    // If x==NULL, create an x64 vector with x values set to (0:n).
+    if (x == NULL) {
+        PS_VECTOR_GEN_X_INDEX_STATIC_F64(x64Static, y->n);
+        if (myPoly->type == PS_POLYNOMIAL_CHEB) {
+            p_psNormalizeVectorRangeF64(x64Static, -1.0, 1.0);
+        }
+        x64 = x64Static;
+    } else {
+        PS_VECTOR_CHECK_TYPE_F32_OR_F64(x, NULL);
+        PS_VECTOR_CONVERT_F32_TO_F64_STATIC(x, x64, x64Static);
+        if (myPoly->type == PS_POLYNOMIAL_CHEB) {
+            p_psNormalizeVectorRangeF64(x64, -1.0, 1.0);
+        }
+    }
+    PS_VECTOR_CHECK_SIZE_EQUAL(x64, y64, NULL);
+    PS_VECTOR_CHECK_SIZE_EQUAL(yErr64, y64, NULL);
+
+    // Call the appropriate vector fitting routine.
+    psPolynomial1D *rc = NULL;
+    if (myPoly->type == PS_POLYNOMIAL_CHEB) {
+        rc = VectorFitPolynomial1DCheby(myPoly, x64, y64, yErr64);
+    } else if (myPoly->type == PS_POLYNOMIAL_ORD) {
+        rc = VectorFitPolynomial1DOrd(myPoly, x64, y64, yErr64);
+    } else {
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true,
+                "unknown polynomial type.\n");
+        return(NULL);
+    }
+    if (rc == NULL) {
+        psError(PS_ERR_UNKNOWN, true, "Could not fit a polynomial to the data.  Returning NULL.\n");
+        return(NULL);
+    }
+
+    return(myPoly);
+}
+
+
+
+/******************************************************************************
+ *****************************************************************************/
+psMinimization *psMinimizationAlloc(psS32 maxIter,
+                                    psF32 tol)
+{
+    PS_INT_CHECK_NON_NEGATIVE(maxIter, NULL);
+
+    psMinimization *min = psAlloc(sizeof(psMinimization));
+    min->maxIter = maxIter;
+    min->tol = tol;
+    min->value = 0.0;
+    min->iter = 0;
+    min->lastDelta = 0.0;
+
+    return(min);
+}
+
+// This macro takes as input the vector BASE and adds a multiple of the vector
+// LINE to it.  We assume BASEMASK is non-null.
+#define PS_VECTOR_ADD_MULTIPLE(BASE, BASEMASK, LINE, OUT, MUL) \
+for (psS32 i=0;i<BASE->n;i++) { \
+    if (BASEMASK->data.U8[i] == 0) { \
+        OUT->data.F32[i] = BASE->data.F32[i] + (MUL * LINE->data.F32[i]); \
+    } else { \
+        OUT->data.F32[i] = BASE->data.F32[i]; \
+    } \
+} \
+
+#define PS_VECTOR_F32_CHECK_ZERO_VECTOR(IN, BOOL_VAR) \
+BOOL_VAR = true; \
+for (psS32 i=0;i<IN->n;i++) { \
+    if (fabs(IN->data.F32[i]) >= FLT_EPSILON) { \
+        BOOL_VAR = false; \
+        break; \
+    } \
+} \
+
+#define PS_VECTOR_WITH_MASK_F32_CHECK_ZERO_VECTOR(IN, INMASK, BOOL_VAR) \
+BOOL_VAR = true; \
+for (psS32 i=0;i<IN->n;i++) { \
+    if ((INMASK->data.U8[i] == 0) && (fabs(IN->data.F32[i]) >= FLT_EPSILON)) { \
+        BOOL_VAR = false; \
+        break; \
+    } \
+} \
+
+
+/******************************************************************************
+p_psDetermineBracket():  This routine takes as input an arbitrary function,
+and the parameter to vary, and the line along which it must vary.  This
+function produces as output a bracket [a, b, c] such that
+f(param + b * line) < f(param + a * line)
+f(param + b * line) < f(param + c * line)
+a < b < c
+ 
+Algorithm:
+ 
+XXX completely ad hoc:
+start with the user-supplied starting parameter and
+call that b.  Calculate a/c as a fractional amount smaller/larger than b.
+Repeat this process until a local minimum is found.
+ 
+XXX:
+new algorithm:
+start at x=0, expand in one direction until the function
+decreases.  Then you have two points in the bracket.  Keep going until it
+increases, or x is too large.  If thst does not work, expand in the other
+direction.
+ 
+XXX:
+This is F32 only.
+ 
+XXX:
+output bracket vector should be an input as well.
+*****************************************************************************/
+psVector *p_psDetermineBracket(psVector *params,
+                               psVector *line,
+                               const psVector *paramMask,
+                               const psArray *coords,
+                               psMinimizePowellFunc func)
+{
+    psF32 a = 0.0;
+    psF32 b = 0.0;
+    psF32 c = 0.0;
+    psF32 fa = 0.0;
+    psF32 fb = 0.0;
+    psF32 fc = 0.0;
+    psS32 iter = 100;
+    psF32 aDir = 0.0;
+    psF32 cDir = 0.0;
+    psF32 new_aDir = 0.0;
+    psF32 new_cDir = 0.0;
+    psVector *bracket = psVectorAlloc(3, PS_TYPE_F32);
+    psF32 stepSize = PS_DETERMINE_BRACKET_STEP_SIZE;
+    psVector *tmp = NULL;
+    psBool boolLineIsNull = true;
+
+    psTrace(".psLib.dataManip.p_psDetermineBracket", 4,
+            "---- p_psDetermineBracket() begin ----\n");
+
+    // If the line vector is zero, then return NULL.
+    PS_VECTOR_WITH_MASK_F32_CHECK_ZERO_VECTOR(params, paramMask, boolLineIsNull);
+    if (boolLineIsNull == true) {
+        psTrace(".psLib.dataManip.p_psDetermineBracket", 2,
+                "p_psDetermineBracket() called with zero line vector.\n");
+        psTrace(".psLib.dataManip.p_psDetermineBracket", 4,
+                "---- p_psDetermineBracket() end (NULL) ----\n");
+        psFree(bracket);
+        return(NULL);
+    }
+
+    tmp = psVectorAlloc(params->n, PS_TYPE_F32);
+
+    b = 0;
+    a = -stepSize;
+    c = stepSize;
+
+    PS_VECTOR_ADD_MULTIPLE(params, paramMask, line, tmp, a);
+    fa = func(tmp, coords);
+
+    PS_VECTOR_ADD_MULTIPLE(params, paramMask, line, tmp, b);
+    fb = func(tmp, coords);
+
+    PS_VECTOR_ADD_MULTIPLE(params, paramMask, line, tmp, c);
+    fc = func(tmp, coords);
+
+    if (fa < fb) {
+        aDir = -1;
+    } else {
+        aDir = 1;
+    }
+
+    if (fc < fb) {
+        cDir = -1;
+    } else {
+        cDir = 1;
+    }
+
+    psTrace(".psLib.dataManip.p_psDetermineBracket", 6,
+            "(a, b, c) is (%f %f %f) (fa, fb, fc) is (%f %f %f)\n", a, b, c, fa, fb, fc);
+
+    while (iter > 0) {
+        psTrace(".psLib.dataManip.p_psDetermineBracket", 6,
+                "psDetermineBracket(): iteration %d\n", iter);
+        if ((fb < fa) && (fb < fc)) {
+            bracket->data.F32[0] = a;
+            bracket->data.F32[1] = b;
+            bracket->data.F32[2] = c;
+            psFree(tmp);
+            psTrace(".psLib.dataManip.p_psDetermineBracket", 6,
+                    "---- p_psDetermineBracket() end ----\n");
+            return(bracket);
+        }
+        stepSize*= (1.0 + stepSize);
+        a =- stepSize;
+        c =+ stepSize;
+
+        PS_VECTOR_ADD_MULTIPLE(params, paramMask, line, tmp, a);
+        fa = func(tmp, coords);
+
+        PS_VECTOR_ADD_MULTIPLE(params, paramMask, line, tmp, c);
+        fc = func(tmp, coords);
+
+        psTrace(".psLib.dataManip.p_psDetermineBracket", 6,
+                "Iter(%d): (a, b, c) is (%f %f %f) (fa, fb, fc) is (%f %f %f)\n", iter, a, b, c, fa, fb, fc);
+
+        if (fa < fb) {
+            new_aDir = -1;
+        } else {
+            new_aDir = 1;
+        }
+
+        if (fc < fb) {
+            new_cDir = -1;
+        } else {
+            new_cDir = 1;
+        }
+        if ((new_aDir == 1) && (aDir == -1)) {
+            bracket->data.F32[0] = a;
+            bracket->data.F32[1] = b;
+            bracket->data.F32[2] = c;
+            psFree(tmp);
+            psTrace(".psLib.dataManip.p_psDetermineBracket", 4,
+                    "---- p_psDetermineBracket() end ----\n");
+            return(bracket);
+        }
+
+        if ((new_cDir == 1) && (cDir == -1)) {
+            bracket->data.F32[0] = a;
+            bracket->data.F32[1] = b;
+            bracket->data.F32[2] = c;
+            psFree(tmp);
+            psTrace(".psLib.dataManip.p_psDetermineBracket", 4,
+                    "---- p_psDetermineBracket() end ----\n");
+            return(bracket);
+        }
+        aDir = new_aDir;
+        cDir = new_cDir;
+        iter--;
+    }
+    psFree(tmp);
+    psFree(bracket);
+    psTrace(".psLib.dataManip.p_psDetermineBracket", 4,
+            "---- p_psDetermineBracket() end (NULL) ----\n");
+    return(NULL);
+}
+
+
+#define RETURN_FINAL_BRACKET(d) \
+if (a < c) { \
+    bracket->data.F32[0] = a; \
+    bracket->data.F32[1] = b; \
+    bracket->data.F32[2] = c; \
+} else { \
+    bracket->data.F32[0] = c; \
+    bracket->data.F32[1] = b; \
+    bracket->data.F32[2] = a; \
+} \
+psTrace(".psLib.dataManip.p_psDetermineBracket", 4, \
+        "---- p_psDetermineBracket() end ----\n"); \
+psTrace(".psLib.dataManip.p_psDetermineBracket", 4, "Final bracket (a, b, c) is (%f %f %f) (fa, fb, fc) is (%f %f %f)\n", a, b, c, fa, fb, fc); \
+return(bracket); \
+
+#define PS_DETERMINE_BRACKET_MAX_ITERATIONS 100
+psVector *p_psDetermineBracket2(psVector *params,
+                                psVector *line,
+                                const psVector *paramMask,
+                                const psArray *coords,
+                                psMinimizePowellFunc func)
+{
+    psF32 a = 0.0;
+    psF32 b = 0.0;
+    psF32 c = 0.0;
+    psF32 fa = 0.0;
+    psF32 fb = 0.0;
+    psF32 fc = 0.0;
+    psS32 iter = 0;
+    PS_VECTOR_GEN_STATIC_RECYCLED(tmp, params->n, PS_TYPE_F32);
+    psBool boolLineIsNull = true;
+    psF32 prevMin = 0.0;
+    psS32 countMin = 0;
+
+    psTrace(".psLib.dataManip.p_psDetermineBracket", 4,
+            "---- p_psDetermineBracket() begin ----\n");
+
+    // If the line vector is zero, then return NULL.
+    PS_VECTOR_WITH_MASK_F32_CHECK_ZERO_VECTOR(params, paramMask, boolLineIsNull);
+    if (boolLineIsNull == true) {
+        psTrace(".psLib.dataManip.p_psDetermineBracket", 2,
+                "p_psDetermineBracket() called with zero line vector.\n");
+        psTrace(".psLib.dataManip.p_psDetermineBracket", 4,
+                "---- p_psDetermineBracket() end (NULL) ----\n");
+        return(NULL);
+    }
+
+    // We determine in what x-direction does the function decrease.
+    a = 0.0;
+    fa = func(params, coords);
+    b = 0.5;
+    iter = 0;
+    do {
+        b*= (1.0 + PS_DETERMINE_BRACKET_STEP_SIZE);
+        PS_VECTOR_ADD_MULTIPLE(params, paramMask, line, tmp, b);
+        fb = func(tmp, coords);
+    } while ((fabs(fb - fa) < FLT_EPSILON) && (iter++ < 100));
+
+    if (fb > fa) {
+        a = b;
+        fa = fb;
+        b = 0.0;
+        fb = func(params, coords);
+    }
+    c = b;
+
+    // At this point we have (a, b) and we know that (fa >= fb).  Initially, c=b;
+    // We keep stretching b out further from "a" until (fc > previous fc).  If
+    // that happens, then we have our bracket.
+    psVector *bracket = psVectorAlloc(3, PS_TYPE_F32);
+    iter = 0;
+    while (iter < PS_DETERMINE_BRACKET_MAX_ITERATIONS) {
+        psTrace(".psLib.dataManip.p_psDetermineBracket", 6,
+                "psDetermineBracket(): iterationA %d\n", iter);
+        c+= (1.0 + PS_DETERMINE_BRACKET_STEP_SIZE) * (c - a);
+
+        PS_VECTOR_ADD_MULTIPLE(params, paramMask, line, tmp, c);
+        fc = func(tmp, coords);
+
+        psTrace(".psLib.dataManip.p_psDetermineBracket", 6,
+                "Iteration(%d) (bracket): (a, b, c) is (%f %f %f) (fa, fb, fc) is (%f %f %f)\n", iter, a, b, c, fa, fb, fc);
+
+        if ((fb < fa) && (fb < fc)) {
+            RETURN_FINAL_BRACKET();
+        } else {
+            b = c;
+            fb = fc;
+        }
+
+        // This code maintains a count of how many times the minimum fc has
+        // stayed the same.  If it gets too high, we exit this loop.
+        if (fc == prevMin) {
+            countMin++;
+        } else {
+            countMin = 0;
+        }
+        prevMin = fc;
+        if (countMin == 10) {
+            RETURN_FINAL_BRACKET();
+        }
+
+        iter++;
+    }
+
+    psFree(bracket);
+    psTrace(".psLib.dataManip.p_psDetermineBracket", 4,
+            "---- p_psDetermineBracket() end (NULL) (BAD) ----\n");
+    return(NULL);
+}
+
+/******************************************************************************
+This routine takes as input a possibly multi-dimensional function, along
+with an initial guess at the parameters of that function and vector "line"
+of the same size as the parameter vector.  It will minimize the function
+along that vector and returns the offset along that vector at which the
+minimum is determined.
+ 
+XXX: This routine is not very efficient in terms of total evaluations of the
+function.
+XXX: This is F32 only
+XXX: Since this is an internal function, many of the parameter checks are
+     redundant.
+XXX: Don't modify the psMinimization argument.
+ *****************************************************************************/
+#define PS_LINEMIN_MAX_ITERATIONS 30
+psF32 p_psLineMin(psMinimization *min,
+                  psVector *params,
+                  psVector *line,
+                  const psVector *paramMask,
+                  const psArray *coords,
+                  psMinimizePowellFunc func)
+{
+    PS_PTR_CHECK_NULL(min, NAN);
+    PS_VECTOR_CHECK_NULL(params, NAN);
+    PS_VECTOR_CHECK_EMPTY(params, NAN);
+    PS_VECTOR_CHECK_TYPE(params, PS_TYPE_F32, NAN);
+    PS_VECTOR_CHECK_NULL(line, NAN);
+    PS_VECTOR_CHECK_EMPTY(line, NAN);
+    PS_VECTOR_CHECK_TYPE(line, PS_TYPE_F32, NAN);
+    PS_VECTOR_CHECK_NULL(paramMask, NAN);
+    PS_VECTOR_CHECK_EMPTY(paramMask, NAN);
+    PS_VECTOR_CHECK_TYPE(paramMask, PS_TYPE_U8, NAN);
+    PS_PTR_CHECK_NULL(coords, NAN);
+    PS_PTR_CHECK_NULL(func, NAN);
+    psVector *bracket;
+    psF32 a = 0.0;
+    psF32 b = 0.0;
+    psF32 c = 0.0;
+    psF32 n = 0.0;
+    psF32 fa = 0.0;
+    psF32 fb = 0.0;
+    psF32 fc = 0.0;
+    psF32 fn = 0.0;
+    psF32 mul = 0.0;
+    PS_VECTOR_GEN_STATIC_RECYCLED(tmpa, params->n, PS_TYPE_F32);
+    PS_VECTOR_GEN_STATIC_RECYCLED(tmpb, params->n, PS_TYPE_F32);
+    PS_VECTOR_GEN_STATIC_RECYCLED(tmpc, params->n, PS_TYPE_F32);
+    PS_VECTOR_GEN_STATIC_RECYCLED(tmpn, params->n, PS_TYPE_F32);
+    psS32 i = 0;
+    psS32 boolLineIsNull = true;
+    psS32 numIterations = 0;
+
+    psTrace(".psLib.dataManip.p_psLineMin", 4, "---- p_psLineMin() begin ----\n");
+    PS_VECTOR_F32_CHECK_ZERO_VECTOR(line, boolLineIsNull);
+
+    if (boolLineIsNull == true) {
+        min->value = func(params, coords);
+        psTrace(".psLib.dataManip.p_psLineMin", 2,
+                "p_psLineMin() called with zero line vector.  Return 0.0.  Function value is %f\n", min->value);
+        return(0.0);
+    }
+
+    for (i=0;i<params->n;i++) {
+        psTrace(".psLib.dataManip.p_psLineMin", 6,
+                "(params, paramMask, line)[%d] is (%f %d %f)\n", i,
+                params->data.F32[i],
+                paramMask->data.U8[i],
+                line->data.F32[i]);
+    }
+
+    bracket = p_psDetermineBracket2(params, line, paramMask, coords, func);
+    if (bracket == NULL) {
+        psError(PS_ERR_UNKNOWN, false,
+                "Could not bracket minimum.  Returning NAN.\n");
+        return(NAN);
+    }
+    numIterations = 0;
+    while (numIterations < PS_LINEMIN_MAX_ITERATIONS) {
+        numIterations++;
+        psTrace(".psLib.dataManip.p_psLineMin", 6,
+                "p_psLineMin(): iteration %d\n", numIterations);
+
+        a = bracket->data.F32[0];
+        b = bracket->data.F32[1];
+        c = bracket->data.F32[2];
+        PS_VECTOR_ADD_MULTIPLE(params, paramMask, line, tmpa, a);
+        PS_VECTOR_ADD_MULTIPLE(params, paramMask, line, tmpb, b);
+        PS_VECTOR_ADD_MULTIPLE(params, paramMask, line, tmpc, c);
+        fa = func(tmpa, coords);
+        fb = func(tmpb, coords);
+        fc = func(tmpc, coords);
+        psTrace(".psLib.dataManip.p_psLineMin", 6,
+                "LineMin: f(%f %f %f) is (%f %f %f)\n", a, b, c, fa, fb, fc);
+
+        // We determine which is the biggest segment in [a,b,c] then split
+        // that with the point n.
+        if ((b-a) > (c-b)) {
+            // This is the golden section formula
+            n = a + (0.69 * (b-a));
+            for (i=0;i<params->n;i++) {
+                tmpn->data.F32[i] = params->data.F32[i] + (n * line->data.F32[i]);
+            }
+            fn = func(tmpn, coords);
+
+            if (fn > fb) {
+                // a = n, b = b, c = c
+                bracket->data.F32[0] = n;
+            } else {
+                // a = a, b = n, c = b
+                bracket->data.F32[1] = n;
+                bracket->data.F32[2] = b;
+            }
+        } else {
+            n = b + (0.69 * (c-b));
+            for (i=0;i<params->n;i++) {
+                tmpn->data.F32[i] = params->data.F32[i] + (n * line->data.F32[i]);
+            }
+            fn = func(tmpn, coords);
+
+            if (fn > fb) {
+                // a = a, b = b, c = n
+                bracket->data.F32[2] = n;
+            } else {
+                // a = b, b = n, c = c
+                bracket->data.F32[0] = b;
+                bracket->data.F32[1] = n;
+            }
+        }
+        psTrace(".psLib.dataManip.p_psLineMin", 6,
+                "LineMin: new bracket is (%f %f %f)\n", bracket->data.F32[0], bracket->data.F32[1], bracket->data.F32[2]);
+
+        mul = bracket->data.F32[1];
+        if ((fabs(a-b) < min->tol) && (fabs(b-c) < min->tol)) {
+            PS_VECTOR_ADD_MULTIPLE(params, paramMask, line, params, mul);
+            min->value = func(params, coords);
+            psFree(bracket);
+            psTrace(".psLib.dataManip.p_psLineMin", 4,
+                    "---- p_psLineMin() end.a (%f) (%f) ----\n", mul, min->value);
+            return(mul);
+        }
+    }
+
+    mul = bracket->data.F32[1];
+    PS_VECTOR_ADD_MULTIPLE(params, paramMask, line, params, mul);
+    min->value = func(params, coords);
+    psTrace(".psLib.dataManip.p_psLineMin", 4,
+            "---- p_psLineMin() end.b (%f) %f ----\n", mul, min->value);
+
+    psFree(bracket);
+    return(mul);
+}
+
+
+/******************************************************************************
+This routine must minimize a possibly multi-dimensional function.  The
+function to be minimized "func" is:
+    psF32 func(psVector *params, psArray *coords)
+The "params" are the parameters of the function which are varied.  The data
+points at which the function is varied are in the argument "coords" which is
+a psArray of psVectors: each vector represents a different coordinate.
+ 
+XXX: We do not use Brent's method.
+ 
+XXX: The SDR is silent about data types.  F32 is implemented here.
+ 
+XXX: Check for F32 types?
+ *****************************************************************************/
+#define PS_MINIMIZE_POWELL_LINEMIN_MAX_ITERATIONS 20
+#define PS_MINIMIZE_POWELL_LINEMIN_ERROR_TOLERANCE 0.01
+
+psBool psMinimizePowell(psMinimization *min,
+                        psVector *params,
+                        const psVector *paramMask,
+                        const psArray *coords,
+                        psMinimizePowellFunc func)
+{
+    PS_PTR_CHECK_NULL(min, NULL);
+    PS_VECTOR_CHECK_NULL(params, NULL);
+    PS_VECTOR_CHECK_EMPTY(params, NULL);
+    PS_VECTOR_CHECK_TYPE(params, PS_TYPE_F32, NULL);
+    PS_PTR_CHECK_NULL(coords, NULL);
+    PS_PTR_CHECK_NULL(func, NULL);
+    psS32 numDims = params->n;
+    PS_VECTOR_GEN_STATIC_RECYCLED(pQP, numDims, PS_TYPE_F32);
+    PS_VECTOR_GEN_STATIC_RECYCLED(u, numDims, PS_TYPE_F32);
+    PS_VECTOR_GEN_STATIC_RECYCLED(Q, numDims, PS_TYPE_F32);
+    psS32 i = 0;
+    psS32 j = 0;
+    psVector *myParamMask = NULL;
+    psMinimization dummyMin;
+    psF32 mul = 0.0;
+    psF32 baseFuncVal = 0.0;
+    psF32 currFuncVal = 0.0;
+    psS32 biggestIter = 0;
+    psF32 biggestDiff = 0.0;
+    psS32 iterationNumber = 0;
+
+    psTrace(".psLib.dataManip.psMinimizePowell", 4,
+            "---- psMinimizePowell() begin ----\n");
+    psTrace(".psLib.dataManip.psMinimizePowell", 6,
+            "min->maxIter is %d\n", min->maxIter);
+    psTrace(".psLib.dataManip.psMinimizePowell", 6,
+            "min->tol is %f\n", min->tol);
+
+    if (paramMask == NULL) {
+        myParamMask = psVectorRecycle(myParamMask, params->n, PS_TYPE_U8);
+        p_psMemSetPersistent(myParamMask, true);
+        p_psMemSetPersistent(myParamMask->data.U8, true);
+        for (i=0;i<myParamMask->n;i++) {
+            myParamMask->data.U8[i] = 0;
+        }
+    } else {
+        myParamMask = (psVector *) paramMask;
+    }
+    PS_VECTOR_CHECK_SIZE_EQUAL(params, myParamMask, NULL);
+
+    // 1: Set v[i] to be the unit vectors for each dimension in params
+    psArray *v = psArrayAlloc(numDims);
+    for (i=0;i<numDims;i++) {
+        (v->data[i]) = (psVector *) psVectorAlloc(numDims, PS_TYPE_F32);
+        for (j=0;j<numDims;j++) {
+            if (i == j) {
+                ((psVector *) (v->data[i]))->data.F32[j] = 1.0;
+            } else {
+                ((psVector *) (v->data[i]))->data.F32[j] = 0.0;
+            }
+        }
+    }
+
+    // 2: Set Q to be the initial params (P in the ADD)
+    for (i=0;i<numDims;i++) {
+        Q->data.F32[i] = params->data.F32[i];
+    }
+
+    while (iterationNumber < min->maxIter) {
+        iterationNumber++;
+        psTrace(".psLib.dataManip.psMinimizePowell", 6,
+                "psMinimizePowell() iteration %d\n", iterationNumber);
+
+        // 3: For each dimension in params, move Q only in the vector v[i] to
+        //    minimize the function.
+
+        baseFuncVal = func(Q, coords);
+        currFuncVal = baseFuncVal;
+        psTrace(".psLib.dataManip.psMinimizePowell", 6,
+                "Current function value is %f\n", currFuncVal);
+
+        biggestDiff = 0;
+        biggestIter = 0;
+        for (i=0;i<numDims;i++) {
+            if (myParamMask->data.U8[i] == 0) {
+                dummyMin.maxIter = PS_MINIMIZE_POWELL_LINEMIN_MAX_ITERATIONS;
+                dummyMin.tol = PS_MINIMIZE_POWELL_LINEMIN_ERROR_TOLERANCE;
+                mul = p_psLineMin(&dummyMin,
+                                  Q,
+                                  ((psVector *) v->data[i]),
+                                  myParamMask,
+                                  coords,
+                                  func);
+                if (isnan(mul)) {
+                    psError(PS_ERR_UNKNOWN, false,
+                            "Could not perform line minimization.  Returning FALSE.\n");
+                    psFree(v);
+                    return(false);
+                }
+                psTrace(".psLib.dataManip.psMinimizePowell", 6,
+                        "LineMin along dimension %d has multiple %f\n", i, mul);
+
+                if (fabs(dummyMin.value - currFuncVal) > biggestDiff) {
+                    biggestDiff = fabs(dummyMin.value - currFuncVal);
+                    biggestIter = i;
+                }
+                currFuncVal = dummyMin.value;
+            }
+        }
+        psTrace(".psLib.dataManip.psMinimizePowell", 6,
+                "New function value is %f\n", currFuncVal);
+
+        // 4: Set the vector u = Q - P
+        for (i=0;i<numDims;i++) {
+            if (myParamMask->data.U8[i] == 0) {
+                u->data.F32[i] = Q->data.F32[i] - params->data.F32[i];
+
+                psTrace(".psLib.dataManip.psMinimizePowell", 6,
+                        "u[i]=Q[i]-P[i] (%f = %f - %f)\n", u->data.F32[i],
+                        Q->data.F32[i],
+                        params->data.F32[i]);
+
+            } else {
+                u->data.F32[i] = 0.0;
+            }
+        }
+
+        // 5: Move Q only in the direction u, and minimize the function.
+        for (i=0;i<numDims;i++) {
+            psTrace(".psLib.dataManip.psMinimizePowell", 6,
+                    "u[i] is %f\n", u->data.F32[i]);
+        }
+
+        mul = p_psLineMin(&dummyMin, params, u, myParamMask, coords, func);
+        if (isnan(mul)) {
+            psError(PS_ERR_UNKNOWN, false,
+                    "Could not perform line minimization.  Returning FALSE.\n");
+            psFree(v);
+            return(false);
+        }
+
+        // 6:
+        if (dummyMin.value > currFuncVal) {
+            psFree(v);
+            min->iter = iterationNumber;
+            // XXX: Ensure that currFuncVal is the correct value to use here.
+            min->value = currFuncVal;
+            psTrace(".psLib.dataManip.psMinimizePowell", 4,
+                    "---- psMinimizePowell() end (1)(true) ----\n");
+            return(true);
+        }
+
+        for (i=0;i<numDims;i++) {
+            if (myParamMask->data.U8[i] == 0) {
+                pQP->data.F32[i] = (2 * Q->data.F32[i]) - params->data.F32[i];
+            } else {
+                pQP->data.F32[i] = params->data.F32[i];
+            }
+        }
+        psF32 fqp = func(pQP, coords);
+        psF32 term1 = (baseFuncVal - currFuncVal) - biggestDiff;
+        term1*= term1;
+        term1*= 2.0 * (baseFuncVal - (2.0 * currFuncVal) + fqp);
+        psF32 term2 = baseFuncVal - fqp;
+        term2*= term2 * biggestDiff;
+        if (term1 < term2) {
+            for (i=0;i<numDims;i++) {
+                if (myParamMask->data.U8[i] == 0) {
+                    ((psVector *) v->data[biggestIter])->data.F32[i] = u->data.F32[i];
+                }
+            }
+        }
+
+        // 7: Set P to Q
+        for (i=0;i<numDims;i++) {
+            if (myParamMask->data.U8[i] == 0) {
+                params->data.F32[i] = Q->data.F32[i];
+            }
+        }
+
+        // 8: Go to step 3 until the change is less than some tolerance.
+        if (fabs(baseFuncVal - currFuncVal) <= min->tol) {
+            psFree(v);
+            // XXX: Ensure that currFuncVal is the correct value to use here.
+            min->value = currFuncVal;
+            min->iter = iterationNumber;
+            psTrace(".psLib.dataManip.psMinimizePowell", 4,
+                    "---- psMinimizePowell() end (2) (true) ----\n");
+            return(true);
+        }
+    }
+
+    psFree(v);
+    min->iter = iterationNumber;
+    psTrace(".psLib.dataManip.psMinimizePowell", 4,
+            "---- psMinimizePowell() end (0) (false) ----\n");
+    return(false);
+}
+
+
+/******************************************************************************
+XXX: We assume unnormalized gaussians.
+XXX: Currently, yErr is ignored.
+ *****************************************************************************/
+psVector *psMinimizePowellChi2Gauss1D(const psVector *params,
+                                      const psArray *coords)
+{
+    PS_PTR_CHECK_NULL(coords, NULL);
+    PS_PTR_CHECK_NULL(params, NULL);
+
+    psF32 x;
+    psS32 i;
+    psF32 mean = params->data.F32[0];
+    psF32 stdev = params->data.F32[1];
+    psVector *out = psVectorAlloc(coords->n, PS_TYPE_F32);
+
+    for (i=0;i<coords->n;i++) {
+        x = ((psVector *) (coords->data[i]))->data.F32[0];
+        out->data.F32[i] = psGaussian(x, mean, stdev, false);
+    }
+
+    return(out);
+}
+
+/******************************************************************************
+This routine is to be used with the psMinimizeChi2Powell() function below.
+and the psMinimizePowell() function above.
+ 
+The basic idea is calculate chi-squared for a set of params/coords/errors.
+This functions uses global variables to receive the function pointer, the
+data values, and the data errors.
+XXX: This is F32 only
+ *****************************************************************************/
+psF32 myPowellChi2Func(const psVector *params,
+                       const psArray *coords)
+{
+    psTrace(".psLib.dataManip.myPowellChi2Func", 4,
+            "---- myPowellChi2Func() begin ----\n");
+    PS_VECTOR_CHECK_NULL(params, NAN);
+    PS_VECTOR_CHECK_EMPTY(params, NAN);
+    PS_VECTOR_CHECK_NULL(myValue, NAN);
+    PS_VECTOR_CHECK_EMPTY(myValue, NAN);
+    PS_PTR_CHECK_NULL(coords, NAN);
+
+    psF32 chi2 = 0.0;
+    psF32 d;
+    psS32 i;
+    psVector *tmp;
+
+    tmp = Chi2PowellFunc(params, coords);
+    if (myError == NULL) {
+        for (i=0;i<coords->n;i++) {
+            d = (tmp->data.F32[i] - myValue->data.F32[i]);
+            chi2+= d * d;
+        }
+    } else {
+        for (i=0;i<coords->n;i++) {
+            d = (tmp->data.F32[i] - myValue->data.F32[i]) / myError->data.F32[i];
+            chi2+= d * d;
+        }
+    }
+    psFree(tmp);
+    psTrace(".psLib.dataManip.myPowellChi2Func", 4,
+            "---- myPowellChi2Func() end (chi2 is %f) ----\n", chi2);
+    return(chi2);
+}
+
+
+/******************************************************************************
+This routine must minimize the chi-squared match of a set of data points and
+values for a possibly multi-dimensional function.
+ 
+The basic idea is to use the psMinimizePowell() function defined above.  In
+order to do so, we defined above a function myPowellChi2Func() which takes
+the "func" function and returns chi-squared over the params/coords/values.
+We then use that function myPowellChi2Func() in the call to
+psMinimizePowell().
+ *****************************************************************************/
+psBool psMinimizeChi2Powell(psMinimization *min,
+                            psVector *params,
+                            const psVector *paramMask,
+                            const psArray *coords,
+                            const psVector *value,
+                            const psVector *error,
+                            psMinimizeChi2PowellFunc func)
+{
+    myValue = (psVector *) value;
+    myError = (psVector *) error;
+
+    Chi2PowellFunc = func;
+
+    return(psMinimizePowell(min, params, paramMask, coords, myPowellChi2Func));
+}
+
+
Index: /tags/ipp-1-X/bug123/psLib/src/math/psMinimize.h
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/math/psMinimize.h	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/math/psMinimize.h	(revision 22331)
@@ -0,0 +1,126 @@
+/** @file  psMinimize.c
+ *  \brief basic minimization functions
+ *  @ingroup Math
+ *
+ *  This file will contain function prototypes for various minimization,
+ *  chi-squared minimization, and 1-D polynomial fitting routines.
+ *
+ *  @author GLG, MHPCC
+ *
+ *  @version $Revision: 1.39 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-02-17 19:26:23 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ *
+ */
+
+#if !defined(PS_MINIMIZE_H)
+#define PS_MINIMIZE_H
+
+/** \file psMinimize.h
+ *  \brief minimization operations
+ *  \ingroup Stats
+ */
+/** \addtogroup Stats
+ *  \{
+ */
+
+#include "psVector.h"
+#include "psMemory.h"
+#include "psArray.h"
+#include "psImage.h"
+#include "psMatrix.h"
+#include "psFunctions.h"
+#include "psStats.h"
+#include "psTrace.h"
+#include "psError.h"
+#include "psConstants.h"
+
+typedef struct
+{
+    psS32 maxIter;                       ///< Convergence limit
+    psF32 tol;                         ///< Error Tolerance
+    psF32 value;                       ///< Value of function at minimum
+    psS32 iter;                          ///< Number of iterations required
+    psF32 lastDelta;                   ///< The last difference for the fit
+}
+psMinimization;
+
+psMinimization *psMinimizationAlloc(psS32 maxIter,
+                                    psF32 tol);
+
+/** Derive a polynomial fit.
+ *
+ *  psVectorFitPolynomial1d returns the polynomial that best fits the 
+ *  observations. The input parameters are a polynomial that specifies the 
+ *  fit order, myPoly, which will be altered and returned with the best-fit 
+ *  coefficients; and the observations, x, y and yErr. The independent 
+ *  variable list, x may be NULL, in which case the vector index is used. 
+ *  The dependent variable error, yErr may be null, in which case the solution 
+ *  is determined in the assumption that all data errors are equal. This 
+ *  function must be valid only for types psF32, psF64.
+ *
+ *  @return psPolynomial1D*    polynomial fit
+ */
+psPolynomial1D* psVectorFitPolynomial1D(
+    psPolynomial1D* myPoly,            ///< Polynomial to fit
+    const psVector* x,                 ///< Ordinates (or NULL to just use the indices)
+    const psVector* y,                 ///< Coordinates
+    const psVector* yErr               ///< Errors in coordinates, or NULL
+);
+
+psSpline1D *psVectorFitSpline1D(psSpline1D *mySpline,     ///< The spline which will be generated.
+                                const psVector* x,        ///< Ordinates (or NULL to just use the indices)
+                                const psVector* y,        ///< Coordinates
+                                const psVector* yErr      ///< Errors in coordinates, or NULL
+                               );
+
+typedef
+psVector* (*psMinimizeLMChi2Func)(psImage *deriv,
+                                  const psVector *params,
+                                  const psArray *x);
+
+psBool psMinimizeLMChi2(psMinimization *min,
+                        psImage *covar,
+                        psVector *params,
+                        const psVector *paramMask,
+                        const psArray *x,
+                        const psVector *y,
+                        const psVector *yErr,
+                        psMinimizeLMChi2Func func);
+
+typedef
+psF32 (*psMinimizePowellFunc)(const psVector *params,
+                              const psArray *coords);
+
+psBool psMinimizePowell(psMinimization *min,
+                        psVector *params,
+                        const psVector *paramMask,
+                        const psArray *coords,
+                        psMinimizePowellFunc func);
+
+psVector *psMinimizeLMChi2Gauss1D(psImage *deriv,
+                                  const psVector *params,
+                                  const psArray *coords);
+
+psVector *psMinimizePowellChi2Gauss1D(const psVector *params,
+                                      const psArray *coords);
+
+typedef
+psVector *(*psMinimizeChi2PowellFunc)(const psVector *params,
+                                      const psArray *coords);
+
+psBool psMinimizeChi2Powell(psMinimization *min,
+                            psVector *params,
+                            const psVector *paramMask,
+                            const psArray *coords,
+                            const psVector *value,
+                            const psVector *error,
+                            psMinimizeChi2PowellFunc func);
+
+
+
+/* \} */// End of MathGroup Functions
+
+#endif
+
Index: /tags/ipp-1-X/bug123/psLib/src/math/psPolynomial.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/math/psPolynomial.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/math/psPolynomial.c	(revision 22331)
@@ -0,0 +1,2174 @@
+/** @file  psFunctions.c
+ *
+ *  @brief Contains basic function allocation, deallocation, and evaluation
+ *         routines.
+ *
+ *  This file will hold the functions for allocated, freeing, and evaluating
+ *  polynomials.  It also contains a Gaussian functions.
+ *
+ *  @version $Revision: 1.98 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-04-19 04:16:02 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ *
+ *  XXX: What happens if the polyEval functions are called with data of the wrong
+ *       type?
+ *  XXX: Should the "coeffErr[]" be used as well?  Bug ???.  Ignore coeffErr
+ *
+ *  XXX: In the various polyAlloc(n) functions, n is really the order of the
+ *  polynomial plus 1.  To create a 2nd-order polynomial, n == 3.
+ */
+/*****************************************************************************/
+/*  INCLUDE FILES                                                            */
+/*****************************************************************************/
+#include <gsl/gsl_rng.h>
+#include <gsl/gsl_randist.h>
+
+#include <stdio.h>
+#include <stdbool.h>
+#include <float.h>
+#include <math.h>
+
+#include "psMemory.h"
+#include "psVector.h"
+#include "psScalar.h"
+#include "psTrace.h"
+#include "psError.h"
+#include "psLogMsg.h"
+#include "psFunctions.h"
+#include "psConstants.h"
+
+#include "psDataManipErrors.h"
+
+/*****************************************************************************/
+/* DEFINE STATEMENTS                                                         */
+/*****************************************************************************/
+
+/*****************************************************************************/
+/* TYPE DEFINITIONS                                                          */
+/*****************************************************************************/
+static void polynomial1DFree(psPolynomial1D* myPoly);
+static void polynomial2DFree(psPolynomial2D* myPoly);
+static void polynomial3DFree(psPolynomial3D* myPoly);
+static void polynomial4DFree(psPolynomial4D* myPoly);
+static void dPolynomial1DFree(psDPolynomial1D* myPoly);
+static void dPolynomial2DFree(psDPolynomial2D* myPoly);
+static void dPolynomial3DFree(psDPolynomial3D* myPoly);
+static void dPolynomial4DFree(psDPolynomial4D* myPoly);
+static void spline1DFree(psSpline1D *tmpSpline);
+static psS32 vectorBinDisectF32(psF32 *bins,psS32 numBins,psF32 x);
+static psS32 vectorBinDisectS32(psS32 *bins,psS32 numBins,psS32 x);
+
+/*****************************************************************************/
+/* GLOBAL VARIABLES                                                          */
+/*****************************************************************************/
+
+// None
+
+/*****************************************************************************/
+/* FILE STATIC VARIABLES                                                     */
+/*****************************************************************************/
+
+// None
+
+/*****************************************************************************/
+/* FUNCTION IMPLEMENTATION - LOCAL                                           */
+/*****************************************************************************/
+
+static void spline1DFree(psSpline1D *tmpSpline)
+{
+    psS32 i;
+
+    if (tmpSpline == NULL) {
+        return;
+    }
+
+    if (tmpSpline->spline != NULL) {
+        for (i=0;i<tmpSpline->n;i++) {
+            psFree((tmpSpline->spline)[i]);
+        }
+        psFree(tmpSpline->spline);
+    }
+
+    if (tmpSpline->p_psDeriv2 != NULL) {
+        psFree(tmpSpline->p_psDeriv2);
+    }
+    psFree(tmpSpline->knots);
+
+    return;
+}
+
+static void polynomial1DFree(psPolynomial1D* myPoly)
+{
+    psFree(myPoly->coeff);
+    psFree(myPoly->coeffErr);
+    psFree(myPoly->mask);
+}
+
+static void polynomial2DFree(psPolynomial2D* myPoly)
+{
+    psS32 x = 0;
+
+    for (x = 0; x < myPoly->nX; x++) {
+        psFree(myPoly->coeff[x]);
+        psFree(myPoly->coeffErr[x]);
+        psFree(myPoly->mask[x]);
+    }
+    psFree(myPoly->coeff);
+    psFree(myPoly->coeffErr);
+    psFree(myPoly->mask);
+}
+
+static void polynomial3DFree(psPolynomial3D* myPoly)
+{
+    psS32 x = 0;
+    psS32 y = 0;
+
+    for (x = 0; x < myPoly->nX; x++) {
+        for (y = 0; y < myPoly->nY; y++) {
+            psFree(myPoly->coeff[x][y]);
+            psFree(myPoly->coeffErr[x][y]);
+            psFree(myPoly->mask[x][y]);
+        }
+        psFree(myPoly->coeff[x]);
+        psFree(myPoly->coeffErr[x]);
+        psFree(myPoly->mask[x]);
+    }
+
+    psFree(myPoly->coeff);
+    psFree(myPoly->coeffErr);
+    psFree(myPoly->mask);
+}
+
+static void polynomial4DFree(psPolynomial4D* myPoly)
+{
+    psS32 w = 0;
+    psS32 x = 0;
+    psS32 y = 0;
+
+    for (w = 0; w < myPoly->nW; w++) {
+        for (x = 0; x < myPoly->nX; x++) {
+            for (y = 0; y < myPoly->nY; y++) {
+                psFree(myPoly->coeff[w][x][y]);
+                psFree(myPoly->coeffErr[w][x][y]);
+                psFree(myPoly->mask[w][x][y]);
+            }
+            psFree(myPoly->coeff[w][x]);
+            psFree(myPoly->coeffErr[w][x]);
+            psFree(myPoly->mask[w][x]);
+        }
+        psFree(myPoly->coeff[w]);
+        psFree(myPoly->coeffErr[w]);
+        psFree(myPoly->mask[w]);
+    }
+
+    psFree(myPoly->coeff);
+    psFree(myPoly->coeffErr);
+    psFree(myPoly->mask);
+}
+
+static void dPolynomial1DFree(psDPolynomial1D* myPoly)
+{
+    psFree(myPoly->coeff);
+    psFree(myPoly->coeffErr);
+    psFree(myPoly->mask);
+}
+
+static void dPolynomial2DFree(psDPolynomial2D* myPoly)
+{
+    //printf("dPolynomial2DFree(): HMMM: myPoly->nX is %d\n", myPoly->nX);
+    //printf("dPolynomial2DFree(): HMMM: myPoly->nY is %d\n", myPoly->nY);
+    for (psS32 x = 0; x < myPoly->nX; x++) {
+        psFree(myPoly->coeff[x]);
+        psFree(myPoly->coeffErr[x]);
+        psFree(myPoly->mask[x]);
+    }
+    psFree(myPoly->coeff);
+    psFree(myPoly->coeffErr);
+    psFree(myPoly->mask);
+}
+
+static void dPolynomial3DFree(psDPolynomial3D* myPoly)
+{
+    psS32 x = 0;
+    psS32 y = 0;
+
+    for (x = 0; x < myPoly->nX; x++) {
+        for (y = 0; y < myPoly->nY; y++) {
+            psFree(myPoly->coeff[x][y]);
+            psFree(myPoly->coeffErr[x][y]);
+            psFree(myPoly->mask[x][y]);
+        }
+        psFree(myPoly->coeff[x]);
+        psFree(myPoly->coeffErr[x]);
+        psFree(myPoly->mask[x]);
+    }
+
+    psFree(myPoly->coeff);
+    psFree(myPoly->coeffErr);
+    psFree(myPoly->mask);
+}
+
+static void dPolynomial4DFree(psDPolynomial4D* myPoly)
+{
+    psS32 w = 0;
+    psS32 x = 0;
+    psS32 y = 0;
+
+    for (w = 0; w < myPoly->nW; w++) {
+        for (x = 0; x < myPoly->nX; x++) {
+            for (y = 0; y < myPoly->nY; y++) {
+                psFree(myPoly->coeff[w][x][y]);
+                psFree(myPoly->coeffErr[w][x][y]);
+                psFree(myPoly->mask[w][x][y]);
+            }
+            psFree(myPoly->coeff[w][x]);
+            psFree(myPoly->coeffErr[w][x]);
+            psFree(myPoly->mask[w][x]);
+        }
+        psFree(myPoly->coeff[w]);
+        psFree(myPoly->coeffErr[w]);
+        psFree(myPoly->mask[w]);
+    }
+
+    psFree(myPoly->coeff);
+    psFree(myPoly->coeffErr);
+    psFree(myPoly->mask);
+}
+
+/*****************************************************************************
+createChebyshevPolys(n): this routine takes as input the required order n,
+and returns as output as a pointer to an array of n psPolynomial1D
+structures, corresponding to the first n Chebyshev polynomials.
+ 
+XXX: The output should be static since the Chebyshev polynomials might be
+used frequently and the data structure created here does not contain the
+outer coefficients of the Chebyshev polynomials.
+ *****************************************************************************/
+static psPolynomial1D **createChebyshevPolys(psS32 maxChebyPoly)
+{
+    PS_INT_CHECK_NON_NEGATIVE(maxChebyPoly, NULL);
+
+    psPolynomial1D **chebPolys = NULL;
+
+    chebPolys = (psPolynomial1D **) psAlloc(maxChebyPoly * sizeof(psPolynomial1D *));
+    for (psS32 i = 0; i < maxChebyPoly; i++) {
+        chebPolys[i] = psPolynomial1DAlloc(i + 1, PS_POLYNOMIAL_ORD);
+    }
+
+    // Create the Chebyshev polynomials.
+    // Polynomial i has i-th order.
+    chebPolys[0]->coeff[0] = 1;
+
+    // XXX: Bug 296
+    if (maxChebyPoly > 1) {
+        chebPolys[1]->coeff[1] = 1;
+    }
+    for (psS32 i = 2; i < maxChebyPoly; i++) {
+        for (psS32 j = 0; j < chebPolys[i - 1]->n; j++) {
+            chebPolys[i]->coeff[j + 1] = 2 * chebPolys[i - 1]->coeff[j];
+        }
+        for (psS32 j = 0; j < chebPolys[i - 2]->n; j++) {
+            chebPolys[i]->coeff[j] -= chebPolys[i - 2]->coeff[j];
+        }
+    }
+
+    return (chebPolys);
+}
+
+/*****************************************************************************
+    Polynomial coefficients will be accessed in [w][x][y][z] fashion.
+ *****************************************************************************/
+static psF32 ordPolynomial1DEval(psF32 x, const psPolynomial1D* myPoly)
+{
+    psS32 loop_x = 0;
+    psF32 polySum = 0.0;
+    psF32 xSum = 1.0;
+
+    psTrace(".psLib.dataManip.psFunctions.ordPolynomial1DEval", 4,
+            "---- Calling ordPolynomial1DEval(%f)\n", x);
+    psTrace(".psLib.dataManip.psFunctions.ordPolynomial1DEval", 4,
+            "Polynomial order is %d\n", myPoly->n);
+    for (loop_x = 0; loop_x < myPoly->n; loop_x++) {
+        psTrace(".psLib.dataManip.psFunctions.ordPolynomial1DEval", 4,
+                "Polynomial coeff[%d] is %f\n", loop_x, myPoly->coeff[loop_x]);
+    }
+
+    for (loop_x = 0; loop_x < myPoly->n; loop_x++) {
+        if (myPoly->mask[loop_x] == 0) {
+            psTrace(".psLib.dataManip.psFunctions.ordPolynomial1DEval", 10,
+                    "polysum+= sum*coeff [%f+= (%f * %f)\n", polySum, xSum, myPoly->coeff[loop_x]);
+            polySum += xSum * myPoly->coeff[loop_x];
+        }
+        xSum *= x;
+    }
+
+    return(polySum);
+}
+
+// XXX: You can do this without having to psAlloc() vector d.
+// XXX: How does the mask vector effect Crenshaw's formula?
+// XXX: We assume that x is scaled between -1.0 and 1.0;
+static psF32 chebPolynomial1DEval(psF32 x, const psPolynomial1D* myPoly)
+{
+    PS_FLOAT_CHECK_RANGE(x, -1.0, 1.0, 0.0);
+    psVector *d;
+    psS32 n;
+    psS32 i;
+    psF32 tmp;
+
+    n = myPoly->n;
+    d = psVectorAlloc(n, PS_TYPE_F32);
+    if(myPoly->mask[n-1] == 0) {
+        d->data.F32[n-1] = myPoly->coeff[n-1];
+    } else {
+        d->data.F32[n-1] = 0.0;
+    }
+    d->data.F32[n-2] = (2.0 * x * d->data.F32[n-1]);
+    if(myPoly->mask[n-2] == 0) {
+        d->data.F32[n-2] += myPoly->coeff[n-2];
+    }
+    for (i=n-3;i>=1;i--) {
+        d->data.F32[i] = (2.0 * x * d->data.F32[i+1]) -
+                         (d->data.F32[i+2]);
+        if(myPoly->mask[i] == 0) {
+            d->data.F32[i] += myPoly->coeff[i];
+        }
+    }
+
+    tmp = (x * d->data.F32[1]) -
+          (d->data.F32[2]);
+    if(myPoly->mask[0] == 0) {
+        tmp += (0.5 * myPoly->coeff[0]);
+    }
+    psFree(d);
+    return(tmp);
+
+    /*
+
+    psS32 n;
+    psS32 i;
+    psF32 tmp;
+    psPolynomial1D **chebPolys = NULL;
+
+    n = myPoly->n;
+    chebPolys = createChebyshevPolys(n);
+
+    tmp = 0.0;
+    for (i=0;i<myPoly->n;i++) {
+        tmp+= (myPoly->coeff[i] * psPolynomial1DEval(x, chebPolys[i]));
+    }
+    tmp-= (myPoly->coeff[0]/2.0);
+
+
+    return(tmp);
+    */
+}
+
+static psF32 ordPolynomial2DEval(psF32 x,
+                                 psF32 y,
+                                 const psPolynomial2D* myPoly)
+{
+    PS_POLY_CHECK_NULL(myPoly, NAN);
+
+    psS32 loop_x = 0;
+    psS32 loop_y = 0;
+    psF32 polySum = 0.0;
+    psF32 xSum = 1.0;
+    psF32 ySum = 1.0;
+
+    for (loop_x = 0; loop_x < myPoly->nX; loop_x++) {
+        ySum = xSum;
+        for (loop_y = 0; loop_y < myPoly->nY; loop_y++) {
+            if (myPoly->mask[loop_x][loop_y] == 0) {
+                polySum += ySum * myPoly->coeff[loop_x][loop_y];
+            }
+            ySum *= y;
+        }
+        xSum *= x;
+    }
+
+    return(polySum);
+}
+
+static psF32 chebPolynomial2DEval(psF32 x, psF32 y, const psPolynomial2D* myPoly)
+{
+    PS_FLOAT_CHECK_RANGE(x, -1.0, 1.0, 0.0);
+    PS_FLOAT_CHECK_RANGE(y, -1.0, 1.0, 0.0);
+    PS_POLY_CHECK_NULL(myPoly, NAN);
+
+    psS32 loop_x = 0;
+    psS32 loop_y = 0;
+    psS32 i = 0;
+    psF32 polySum = 0.0;
+    psPolynomial1D* *chebPolys = NULL;
+    psS32 maxChebyPoly = 0;
+
+    // Determine how many Chebyshev polynomials
+    // are needed, then create them.
+    maxChebyPoly = myPoly->nX;
+    if (myPoly->nY > maxChebyPoly) {
+        maxChebyPoly = myPoly->nY;
+    }
+    chebPolys = createChebyshevPolys(maxChebyPoly);
+
+    for (loop_x = 0; loop_x < myPoly->nX; loop_x++) {
+        for (loop_y = 0; loop_y < myPoly->nY; loop_y++) {
+            if (myPoly->mask[loop_x][loop_y] == 0) {
+                polySum += myPoly->coeff[loop_x][loop_y] *
+                           psPolynomial1DEval(chebPolys[loop_x], x) *
+                           psPolynomial1DEval(chebPolys[loop_y], y);
+            }
+        }
+    }
+    for (i=0;i<maxChebyPoly;i++) {
+        psFree(chebPolys[i]);
+    }
+    psFree(chebPolys);
+    return(polySum);
+}
+
+static psF32 ordPolynomial3DEval(psF32 x, psF32 y, psF32 z, const psPolynomial3D* myPoly)
+{
+    psS32 loop_x = 0;
+    psS32 loop_y = 0;
+    psS32 loop_z = 0;
+    psF32 polySum = 0.0;
+    psF32 xSum = 1.0;
+    psF32 ySum = 1.0;
+    psF32 zSum = 1.0;
+
+    for (loop_x = 0; loop_x < myPoly->nX; loop_x++) {
+        ySum = xSum;
+        for (loop_y = 0; loop_y < myPoly->nY; loop_y++) {
+            zSum = ySum;
+            for (loop_z = 0; loop_z < myPoly->nZ; loop_z++) {
+                if (myPoly->mask[loop_x][loop_y][loop_z] == 0) {
+                    polySum += zSum * myPoly->coeff[loop_x][loop_y][loop_z];
+                }
+                zSum *= z;
+            }
+            ySum *= y;
+        }
+        xSum *= x;
+    }
+
+    return(polySum);
+}
+
+static psF32 chebPolynomial3DEval(psF32 x, psF32 y, psF32 z, const psPolynomial3D* myPoly)
+{
+    PS_FLOAT_CHECK_RANGE(x, -1.0, 1.0, 0.0);
+    PS_FLOAT_CHECK_RANGE(y, -1.0, 1.0, 0.0);
+    PS_FLOAT_CHECK_RANGE(z, -1.0, 1.0, 0.0);
+    psS32 loop_x = 0;
+    psS32 loop_y = 0;
+    psS32 loop_z = 0;
+    psS32 i = 0;
+    psF32 polySum = 0.0;
+    psPolynomial1D* *chebPolys = NULL;
+    psS32 maxChebyPoly = 0;
+
+    // Determine how many Chebyshev polynomials
+    // are needed, then create them.
+    maxChebyPoly = myPoly->nX;
+    if (myPoly->nY > maxChebyPoly) {
+        maxChebyPoly = myPoly->nY;
+    }
+    if (myPoly->nZ > maxChebyPoly) {
+        maxChebyPoly = myPoly->nZ;
+    }
+    chebPolys = createChebyshevPolys(maxChebyPoly);
+
+    for (loop_x = 0; loop_x < myPoly->nX; loop_x++) {
+        for (loop_y = 0; loop_y < myPoly->nY; loop_y++) {
+            for (loop_z = 0; loop_z < myPoly->nZ; loop_z++) {
+                if (myPoly->mask[loop_x][loop_y][loop_z] == 0) {
+                    polySum += myPoly->coeff[loop_x][loop_y][loop_z] *
+                               psPolynomial1DEval(chebPolys[loop_x], x) *
+                               psPolynomial1DEval(chebPolys[loop_y], y) *
+                               psPolynomial1DEval(chebPolys[loop_z], z);
+                }
+            }
+        }
+    }
+
+    for (i=0;i<maxChebyPoly;i++) {
+        psFree(chebPolys[i]);
+    }
+    psFree(chebPolys);
+    return(polySum);
+}
+
+static psF32 ordPolynomial4DEval(psF32 w, psF32 x, psF32 y, psF32 z, const psPolynomial4D* myPoly)
+{
+    psS32 loop_w = 0;
+    psS32 loop_x = 0;
+    psS32 loop_y = 0;
+    psS32 loop_z = 0;
+    psF32 polySum = 0.0;
+    psF32 wSum = 1.0;
+    psF32 xSum = 1.0;
+    psF32 ySum = 1.0;
+    psF32 zSum = 1.0;
+
+    for (loop_w = 0; loop_w < myPoly->nW; loop_w++) {
+        xSum = wSum;
+        for (loop_x = 0; loop_x < myPoly->nX; loop_x++) {
+            ySum = xSum;
+            for (loop_y = 0; loop_y < myPoly->nY; loop_y++) {
+                zSum = ySum;
+                for (loop_z = 0; loop_z < myPoly->nZ; loop_z++) {
+                    if (myPoly->mask[loop_w][loop_x][loop_y][loop_z] == 0) {
+                        polySum += zSum * myPoly->coeff[loop_w][loop_x][loop_y][loop_z];
+                    }
+                    zSum *= z;
+                }
+                ySum *= y;
+            }
+            xSum *= x;
+        }
+        wSum *= w;
+    }
+
+    return(polySum);
+}
+
+static psF32 chebPolynomial4DEval(psF32 w, psF32 x, psF32 y, psF32 z, const psPolynomial4D* myPoly)
+{
+    PS_FLOAT_CHECK_RANGE(w, -1.0, 1.0, 0.0);
+    PS_FLOAT_CHECK_RANGE(x, -1.0, 1.0, 0.0);
+    PS_FLOAT_CHECK_RANGE(y, -1.0, 1.0, 0.0);
+    PS_FLOAT_CHECK_RANGE(z, -1.0, 1.0, 0.0);
+    psS32 loop_w = 0;
+    psS32 loop_x = 0;
+    psS32 loop_y = 0;
+    psS32 loop_z = 0;
+    psS32 i = 0;
+    psF32 polySum = 0.0;
+    psPolynomial1D* *chebPolys = NULL;
+    psS32 maxChebyPoly = 0;
+
+    // Determine how many Chebyshev polynomials
+    // are needed, then create them.
+    maxChebyPoly = myPoly->nW;
+    if (myPoly->nX > maxChebyPoly) {
+        maxChebyPoly = myPoly->nX;
+    }
+    if (myPoly->nY > maxChebyPoly) {
+        maxChebyPoly = myPoly->nY;
+    }
+    if (myPoly->nZ > maxChebyPoly) {
+        maxChebyPoly = myPoly->nZ;
+    }
+    chebPolys = createChebyshevPolys(maxChebyPoly);
+
+    for (loop_w = 0; loop_w < myPoly->nW; loop_w++) {
+        for (loop_x = 0; loop_x < myPoly->nX; loop_x++) {
+            for (loop_y = 0; loop_y < myPoly->nY; loop_y++) {
+                for (loop_z = 0; loop_z < myPoly->nZ; loop_z++) {
+                    if (myPoly->mask[loop_w][loop_x][loop_y][loop_z] == 0) {
+                        polySum += myPoly->coeff[loop_w][loop_x][loop_y][loop_z] *
+                                   psPolynomial1DEval(chebPolys[loop_w], w) *
+                                   psPolynomial1DEval(chebPolys[loop_x], x) *
+                                   psPolynomial1DEval(chebPolys[loop_y], y) *
+                                   psPolynomial1DEval(chebPolys[loop_z], z);
+                    }
+                }
+            }
+        }
+    }
+
+    for (i=0;i<maxChebyPoly;i++) {
+        psFree(chebPolys[i]);
+    }
+    psFree(chebPolys);
+    return(polySum);
+}
+
+/*****************************************************************************
+    Polynomial coefficients will be accessed in [w][x][y][z] fashion.
+ *****************************************************************************/
+static psF64 dOrdPolynomial1DEval(psF64 x, const psDPolynomial1D* myPoly)
+{
+    psS32 loop_x = 0;
+    psF64 polySum = 0.0;
+    psF64 xSum = 1.0;
+
+    for (loop_x = 0; loop_x < myPoly->n; loop_x++) {
+        if (myPoly->mask[loop_x] == 0) {
+            polySum += xSum * myPoly->coeff[loop_x];
+        }
+        xSum *= x;
+    }
+
+    return(polySum);
+}
+
+// XXX: You can do this without having to psAlloc() vector d.
+// XXX: How does the mask vector effect Crenshaw's formula?
+static psF64 dChebPolynomial1DEval(psF64 x, const psDPolynomial1D* myPoly)
+{
+    PS_FLOAT_CHECK_RANGE(x, -1.0, 1.0, 0.0);
+    psVector *d;
+    psS32 n;
+    psS32 i;
+    psF64 tmp;
+
+    n = myPoly->n;
+    d = psVectorAlloc(n, PS_TYPE_F64);
+    if(myPoly->mask[n-1] == 0) {
+        d->data.F64[n-1] = myPoly->coeff[n-1];
+    } else {
+        d->data.F64[n-1] = 0.0;
+    }
+    d->data.F64[n-2] = (2.0 * x * d->data.F64[n-1]);
+    if(myPoly->mask[n-2] == 0) {
+        d->data.F64[n-2] += myPoly->coeff[n-2];
+    }
+    for (i=n-3;i>=1;i--) {
+        d->data.F64[i] = (2.0 * x * d->data.F64[i+1]) -
+                         (d->data.F64[i+2]);
+        if(myPoly->mask[i] == 0) {
+            d->data.F64[i] += myPoly->coeff[i];
+        }
+    }
+
+    tmp = (x * d->data.F64[1]) -
+          (d->data.F64[2]);
+    if(myPoly->mask[0] == 0) {
+        tmp += (0.5 * myPoly->coeff[0]);
+    }
+
+    psFree(d);
+    return(tmp);
+}
+
+static psF64 dOrdPolynomial2DEval(psF64 x, psF64 y, const psDPolynomial2D* myPoly)
+{
+    psS32 loop_x = 0;
+    psS32 loop_y = 0;
+    psF64 polySum = 0.0;
+    psF64 xSum = 1.0;
+    psF64 ySum = 1.0;
+
+    for (loop_x = 0; loop_x < myPoly->nX; loop_x++) {
+        ySum = xSum;
+        for (loop_y = 0; loop_y < myPoly->nY; loop_y++) {
+            if (myPoly->mask[loop_x][loop_y] == 0) {
+                polySum += ySum * myPoly->coeff[loop_x][loop_y];
+            }
+            ySum *= y;
+        }
+        xSum *= x;
+    }
+
+    return(polySum);
+}
+
+static psF64 dChebPolynomial2DEval(psF64 x, psF64 y, const psDPolynomial2D* myPoly)
+{
+    PS_FLOAT_CHECK_RANGE(x, -1.0, 1.0, 0.0);
+    PS_FLOAT_CHECK_RANGE(y, -1.0, 1.0, 0.0);
+    psS32 loop_x = 0;
+    psS32 loop_y = 0;
+    psS32 i = 0;
+    psF64 polySum = 0.0;
+    psPolynomial1D* *chebPolys = NULL;
+    psS32 maxChebyPoly = 0;
+
+    // Determine how many Chebyshev polynomials
+    // are needed, then create them.
+    maxChebyPoly = myPoly->nX;
+    if (myPoly->nY > maxChebyPoly) {
+        maxChebyPoly = myPoly->nY;
+    }
+    chebPolys = createChebyshevPolys(maxChebyPoly);
+
+    for (loop_x = 0; loop_x < myPoly->nX; loop_x++) {
+        for (loop_y = 0; loop_y < myPoly->nY; loop_y++) {
+            if (myPoly->mask[loop_x][loop_y] == 0) {
+                polySum += myPoly->coeff[loop_x][loop_y] *
+                           psPolynomial1DEval(chebPolys[loop_x], x) *
+                           psPolynomial1DEval(chebPolys[loop_y], y);
+            }
+        }
+    }
+
+    for (i=0;i<maxChebyPoly;i++) {
+        psFree(chebPolys[i]);
+    }
+    psFree(chebPolys);
+    return(polySum);
+}
+
+static psF64 dOrdPolynomial3DEval(psF64 x, psF64 y, psF64 z, const psDPolynomial3D* myPoly)
+{
+    psS32 loop_x = 0;
+    psS32 loop_y = 0;
+    psS32 loop_z = 0;
+    psF64 polySum = 0.0;
+    psF64 xSum = 1.0;
+    psF64 ySum = 1.0;
+    psF64 zSum = 1.0;
+
+    for (loop_x = 0; loop_x < myPoly->nX; loop_x++) {
+        ySum = xSum;
+        for (loop_y = 0; loop_y < myPoly->nY; loop_y++) {
+            zSum = ySum;
+            for (loop_z = 0; loop_z < myPoly->nZ; loop_z++) {
+                if (myPoly->mask[loop_x][loop_y][loop_z] == 0) {
+                    polySum += zSum * myPoly->coeff[loop_x][loop_y][loop_z];
+                }
+                zSum *= z;
+            }
+            ySum *= y;
+        }
+        xSum *= x;
+    }
+
+    return(polySum);
+}
+
+static psF64 dChebPolynomial3DEval(psF64 x, psF64 y, psF64 z, const psDPolynomial3D* myPoly)
+{
+    PS_FLOAT_CHECK_RANGE(x, -1.0, 1.0, 0.0);
+    PS_FLOAT_CHECK_RANGE(y, -1.0, 1.0, 0.0);
+    PS_FLOAT_CHECK_RANGE(z, -1.0, 1.0, 0.0);
+    psS32 loop_x = 0;
+    psS32 loop_y = 0;
+    psS32 loop_z = 0;
+    psS32 i = 0;
+    psF64 polySum = 0.0;
+    psPolynomial1D* *chebPolys = NULL;
+    psS32 maxChebyPoly = 0;
+
+    // Determine how many Chebyshev polynomials
+    // are needed, then create them.
+    maxChebyPoly = myPoly->nX;
+    if (myPoly->nY > maxChebyPoly) {
+        maxChebyPoly = myPoly->nY;
+    }
+    if (myPoly->nZ > maxChebyPoly) {
+        maxChebyPoly = myPoly->nZ;
+    }
+    chebPolys = createChebyshevPolys(maxChebyPoly);
+
+    for (loop_x = 0; loop_x < myPoly->nX; loop_x++) {
+        for (loop_y = 0; loop_y < myPoly->nY; loop_y++) {
+            for (loop_z = 0; loop_z < myPoly->nZ; loop_z++) {
+                if (myPoly->mask[loop_x][loop_y][loop_z] == 0) {
+                    polySum += myPoly->coeff[loop_x][loop_y][loop_z] *
+                               psPolynomial1DEval(chebPolys[loop_x], x) *
+                               psPolynomial1DEval(chebPolys[loop_y], y) *
+                               psPolynomial1DEval(chebPolys[loop_z], z);
+                }
+            }
+        }
+    }
+
+    for (i=0;i<maxChebyPoly;i++) {
+        psFree(chebPolys[i]);
+    }
+    psFree(chebPolys);
+    return(polySum);
+}
+
+static psF64 dOrdPolynomial4DEval(psF64 w, psF64 x, psF64 y, psF64 z, const psDPolynomial4D* myPoly)
+{
+    psS32 loop_w = 0;
+    psS32 loop_x = 0;
+    psS32 loop_y = 0;
+    psS32 loop_z = 0;
+    psF64 polySum = 0.0;
+    psF64 wSum = 1.0;
+    psF64 xSum = 1.0;
+    psF64 ySum = 1.0;
+    psF64 zSum = 1.0;
+
+    for (loop_w = 0; loop_w < myPoly->nW; loop_w++) {
+        xSum = wSum;
+        for (loop_x = 0; loop_x < myPoly->nX; loop_x++) {
+            ySum = xSum;
+            for (loop_y = 0; loop_y < myPoly->nY; loop_y++) {
+                zSum = ySum;
+                for (loop_z = 0; loop_z < myPoly->nZ; loop_z++) {
+                    if (myPoly->mask[loop_w][loop_x][loop_y][loop_z] == 0) {
+                        polySum += zSum * myPoly->coeff[loop_w][loop_x][loop_y][loop_z];
+                    }
+                    zSum *= z;
+                }
+                ySum *= y;
+            }
+            xSum *= x;
+        }
+        wSum *= w;
+    }
+
+    return(polySum);
+}
+
+static psF64 dChebPolynomial4DEval(psF64 w, psF64 x, psF64 y, psF64 z, const psDPolynomial4D* myPoly)
+{
+    PS_FLOAT_CHECK_RANGE(w, -1.0, 1.0, 0.0);
+    PS_FLOAT_CHECK_RANGE(x, -1.0, 1.0, 0.0);
+    PS_FLOAT_CHECK_RANGE(y, -1.0, 1.0, 0.0);
+    PS_FLOAT_CHECK_RANGE(z, -1.0, 1.0, 0.0);
+    psS32 loop_w = 0;
+    psS32 loop_x = 0;
+    psS32 loop_y = 0;
+    psS32 loop_z = 0;
+    psS32 i = 0;
+    psF64 polySum = 0.0;
+    psPolynomial1D* *chebPolys = NULL;
+    psS32 maxChebyPoly = 0;
+
+    // Determine how many Chebyshev polynomials
+    // are needed, then create them.
+    maxChebyPoly = myPoly->nW;
+    if (myPoly->nX > maxChebyPoly) {
+        maxChebyPoly = myPoly->nX;
+    }
+    if (myPoly->nY > maxChebyPoly) {
+        maxChebyPoly = myPoly->nY;
+    }
+    if (myPoly->nZ > maxChebyPoly) {
+        maxChebyPoly = myPoly->nZ;
+    }
+    chebPolys = createChebyshevPolys(maxChebyPoly);
+
+    for (loop_w = 0; loop_w < myPoly->nW; loop_w++) {
+        for (loop_x = 0; loop_x < myPoly->nX; loop_x++) {
+            for (loop_y = 0; loop_y < myPoly->nY; loop_y++) {
+                for (loop_z = 0; loop_z < myPoly->nZ; loop_z++) {
+                    if (myPoly->mask[loop_w][loop_x][loop_y][loop_z] == 0) {
+                        polySum += myPoly->coeff[loop_w][loop_x][loop_y][loop_z] *
+                                   psPolynomial1DEval(chebPolys[loop_w], w) *
+                                   psPolynomial1DEval(chebPolys[loop_x], x) *
+                                   psPolynomial1DEval(chebPolys[loop_y], y) *
+                                   psPolynomial1DEval(chebPolys[loop_z], z);
+                    }
+                }
+            }
+        }
+    }
+
+    for (i=0;i<maxChebyPoly;i++) {
+        psFree(chebPolys[i]);
+    }
+    psFree(chebPolys);
+    return(polySum);
+}
+
+
+/*****************************************************************************
+fullInterpolate1DF32(): This routine will take as input n-element floating
+point arrays domain and range, and the x value, assumed to lie with the
+domain vector.  It produces as output the (n-1)-order LaGrange interpolated
+value of x.
+ 
+XXX: do we error check for non-distinct domain values?
+ *****************************************************************************/
+#define FUNC_MACRO_FULL_INTERPOLATE_1D(TYPE) \
+static psF32 fullInterpolate1D##TYPE(ps##TYPE *domain, \
+                                     ps##TYPE *range, \
+                                     psS32 n, \
+                                     ps##TYPE x) \
+{ \
+    \
+    psS32 i; \
+    psS32 m; \
+    static psVector *p = NULL; \
+    p = psVectorRecycle(p, n, PS_TYPE_##TYPE); \
+    p_psMemSetPersistent(p, true); \
+    p_psMemSetPersistent(p->data.TYPE, true); \
+    \
+    psTrace(".psLib.dataManip.psFunctions.fullInterpolate1D##TYPE", 4, \
+            "---- fullInterpolate1D##TYPE() begin (%d-order at x=%f) (%d data points)----\n", n-1, x, n); \
+    \
+    for (i=0;i<n;i++) { \
+        psTrace(".psLib.dataManip.psFunctions.fullInterpolate1D##TYPE", 6, \
+                "domain/range is (%f %f)\n", domain[i], range[i]); \
+    } \
+    \
+    for (i=0;i<n;i++) { \
+        p->data.TYPE[i] = range[i]; \
+        psTrace(".psLib.dataManip.psFunctions.fullInterpolate1D##TYPE", 6, \
+                "p->data.TYPE[%d] is %f\n", i, p->data.TYPE[i]); \
+        \
+    } \
+    \
+    /* From NR, during each iteration of the m loop, we are computing the \
+       p_{i ... i+m} terms. \
+    */ \
+    for (m=1;m<n;m++) { \
+        for (i=0;i<n-m;i++) { \
+            /* From NR: we are computing P_{i ... i+m} \
+             */ \
+            p->data.TYPE[i] = (((x-domain[i+m]) * p->data.TYPE[i]) + \
+                               ((domain[i]-x) * p->data.TYPE[i+1])) / \
+                              (domain[i] - domain[i+m]); \
+            /*printf("((%f-%f * %f) + (%f-%f * %f)) / (%f - %f)\n", x, domain[i+m], p->data.TYPE[i], domain[i], x, p->data.TYPE[i+1], domain[i], domain[i+m]); \
+             */ \
+            psTrace(".psLib.dataManip.psFunctions.fullInterpolate1D##TYPE", 6, \
+                    "p->data.TYPE[%d] is %f\n", i, p->data.TYPE[i]); \
+        } \
+    } \
+    psTrace(".psLib.dataManip.psFunctions.fullInterpolate1D##TYPE", 4, \
+            "---- fullInterpolate1D##TYPE() end ----\n"); \
+    \
+    return(p->data.TYPE[0]); \
+} \
+
+/*
+FUNC_MACRO_FULL_INTERPOLATE_1D(U8)
+FUNC_MACRO_FULL_INTERPOLATE_1D(U16)
+FUNC_MACRO_FULL_INTERPOLATE_1D(U32)
+FUNC_MACRO_FULL_INTERPOLATE_1D(U64)
+FUNC_MACRO_FULL_INTERPOLATE_1D(S8)
+FUNC_MACRO_FULL_INTERPOLATE_1D(S16)
+FUNC_MACRO_FULL_INTERPOLATE_1D(S32)
+FUNC_MACRO_FULL_INTERPOLATE_1D(S64)
+FUNC_MACRO_FULL_INTERPOLATE_1D(F64)
+*/
+FUNC_MACRO_FULL_INTERPOLATE_1D(F32)
+
+
+/*****************************************************************************
+interpolate1DF32(): this is the base 1-D flat memory routine to perform
+LaGrange interpolation.
+ *****************************************************************************/
+static psF32 interpolate1DF32(psF32 *domain,
+                              psF32 *range,
+                              psS32 n,
+                              psS32 order,
+                              psF32 x)
+{
+    PS_PTR_CHECK_NULL(domain, NAN)
+    PS_PTR_CHECK_NULL(range, NAN)
+    // XXX: Check valid values for n, order, and x?
+
+    psS32 binNum;
+    psS32 numIntPoints = order+1;
+    psS32 origin;
+
+    psTrace(".psLib.dataManip.psFunctions.interpolate1DF32", 4,
+            "---- interpolate1DF32() begin ----\n");
+
+    binNum = vectorBinDisectF32(domain, n, x);
+
+    if (0 == numIntPoints%2) {
+        origin = binNum - ((numIntPoints/2) - 1);
+    } else {
+        origin = binNum - (numIntPoints/2);
+        if ((x-domain[binNum]) > (domain[binNum+1]-x)) {
+            // x is closer to binNum+1.
+            origin = 1 + (binNum - (numIntPoints/2));
+        }
+    }
+    if (origin < 0) {
+        origin = 0;
+    }
+    if ((origin + numIntPoints) > n) {
+        origin = n - numIntPoints;
+    }
+
+    psTrace(".psLib.dataManip.psFunctions.interpolate1DF32", 4,
+            "---- interpolate1DF32() end ----\n");
+    return(fullInterpolate1DF32(&domain[origin], &range[origin], order+1, x));
+}
+
+/*****************************************************************************/
+/*  FUNCTION IMPLEMENTATION - PUBLIC                                         */
+/*****************************************************************************/
+
+/*****************************************************************************
+    Evaluate a non-normalized Gaussian with the given mean and sigma at the
+    given coordianate.  Note that this is not a Gaussian deviate.  The
+    evaluated Gaussian is: \f[ exp(-\frac{(x-mean)^2}{2\sigma^2}) \f]
+ *****************************************************************************/
+psF32 psGaussian(psF32 x, psF32 mean, psF32 sigma, psBool normal)
+{
+    psF32 tmp = 1.0;
+
+    psTrace(".psLib.dataManip.psFunctions.psGaussian", 4,
+            "---- psGaussian() begin ----\n");
+
+    if (normal == true) {
+        tmp = 1.0 / PS_SQRT_F32(2.0 * PS_PI * (sigma * sigma));
+    }
+
+    psTrace(".psLib.dataManip.psFunctions.psGaussian", 4,
+            "---- psGaussian() end ----\n");
+    return(tmp * exp(-((x - mean) * (x - mean)) / (2.0 * sigma * sigma)));
+}
+
+/*****************************************************************************
+    p_psGaussianDev()
+ This private routine (formerly a psLib API routine) creates a psVector of the
+ specified size and type F32 and fills it with a random Gaussian distribution
+ of numbers with the specified mean and sigma.  This routine makes use of the
+ GSL routines for generating both uniformly distributed numbers and the
+ Gaussian distribution as well.
+ 
+XXX: There is no way to seed the random generator.
+ *****************************************************************************/
+psVector* p_psGaussianDev(psF32 mean, psF32 sigma, psS32 Npts)
+{
+    PS_INT_CHECK_NON_NEGATIVE(Npts, NULL);
+
+    psVector* gauss = NULL;
+    const gsl_rng_type *T = NULL;
+    gsl_rng *r = NULL;
+    psS32 i = 0;
+
+
+    gauss = psVectorAlloc(Npts, PS_TYPE_F32);
+    gauss->n = Npts;
+    gsl_rng_env_setup();
+    T = gsl_rng_default;
+    r = gsl_rng_alloc(T);
+
+    for (i = 0; i < Npts; i++) {
+        gauss->data.F32[i] = mean + gsl_ran_gaussian(r, sigma);
+    }
+
+    // XXX: Should I free r, T as well?  This is a memory leak.
+    return(gauss);
+}
+
+/*****************************************************************************
+    This routine must allocate memory for the polynomial structures.
+ *****************************************************************************/
+psPolynomial1D* psPolynomial1DAlloc(psS32 n,
+                                    psPolynomialType type)
+{
+    PS_INT_CHECK_POSITIVE(n, NULL);
+
+    psS32 i = 0;
+    psPolynomial1D* newPoly = NULL;
+
+    newPoly = (psPolynomial1D* ) psAlloc(sizeof(psPolynomial1D));
+    psMemSetDeallocator(newPoly, (psFreeFcn) polynomial1DFree);
+
+    newPoly->type = type;
+    newPoly->n = n;
+    newPoly->coeff = (psF32 *)psAlloc(n * sizeof(psF32));
+    newPoly->coeffErr = (psF32 *)psAlloc(n * sizeof(psF32));
+    newPoly->mask = (psU8 *)psAlloc(n * sizeof(psU8));
+    for (i = 0; i < n; i++) {
+        newPoly->coeff[i] = 0.0;
+        newPoly->coeffErr[i] = 0.0;
+        newPoly->mask[i] = 0;
+    }
+
+    return(newPoly);
+}
+
+psPolynomial2D* psPolynomial2DAlloc(psS32 nX, psS32 nY,
+                                    psPolynomialType type)
+{
+    PS_INT_CHECK_POSITIVE(nX, NULL);
+    PS_INT_CHECK_POSITIVE(nY, NULL);
+
+    psS32 x = 0;
+    psS32 y = 0;
+    psPolynomial2D* newPoly = NULL;
+
+    newPoly = (psPolynomial2D* ) psAlloc(sizeof(psPolynomial2D));
+    psMemSetDeallocator(newPoly, (psFreeFcn) polynomial2DFree);
+
+    newPoly->type = type;
+    newPoly->nX = nX;
+    newPoly->nY = nY;
+
+    newPoly->coeff = (psF32 **)psAlloc(nX * sizeof(psF32 *));
+    newPoly->coeffErr = (psF32 **)psAlloc(nX * sizeof(psF32 *));
+    newPoly->mask = (psU8 **)psAlloc(nX * sizeof(psU8 *));
+    for (x = 0; x < nX; x++) {
+        newPoly->coeff[x] = (psF32 *)psAlloc(nY * sizeof(psF32));
+        newPoly->coeffErr[x] = (psF32 *)psAlloc(nY * sizeof(psF32));
+        newPoly->mask[x] = (psU8 *)psAlloc(nY * sizeof(psU8));
+    }
+    for (x = 0; x < nX; x++) {
+        for (y = 0; y < nY; y++) {
+            newPoly->coeff[x][y] = 0.0;
+            newPoly->coeffErr[x][y] = 0.0;
+            newPoly->mask[x][y] = 0;
+        }
+    }
+
+    return(newPoly);
+}
+
+psPolynomial3D* psPolynomial3DAlloc(psS32 nX, psS32 nY, psS32 nZ,
+                                    psPolynomialType type)
+{
+    PS_INT_CHECK_POSITIVE(nX, NULL);
+    PS_INT_CHECK_POSITIVE(nY, NULL);
+    PS_INT_CHECK_POSITIVE(nZ, NULL);
+
+    psS32 x = 0;
+    psS32 y = 0;
+    psS32 z = 0;
+    psPolynomial3D* newPoly = NULL;
+
+    newPoly = (psPolynomial3D* ) psAlloc(sizeof(psPolynomial3D));
+    psMemSetDeallocator(newPoly, (psFreeFcn) polynomial3DFree);
+
+    newPoly->type = type;
+    newPoly->nX = nX;
+    newPoly->nY = nY;
+    newPoly->nZ = nZ;
+
+    newPoly->coeff = (psF32 ***)psAlloc(nX * sizeof(psF32 **));
+    newPoly->coeffErr = (psF32 ***)psAlloc(nX * sizeof(psF32 **));
+    newPoly->mask = (psU8 ***)psAlloc(nX * sizeof(psU8 **));
+    for (x = 0; x < nX; x++) {
+        newPoly->coeff[x] = (psF32 **)psAlloc(nY * sizeof(psF32 *));
+        newPoly->coeffErr[x] = (psF32 **)psAlloc(nY * sizeof(psF32 *));
+        newPoly->mask[x] = (psU8 **)psAlloc(nY * sizeof(psU8 *));
+        for (y = 0; y < nY; y++) {
+            newPoly->coeff[x][y] = (psF32 *)psAlloc(nZ * sizeof(psF32));
+            newPoly->coeffErr[x][y] = (psF32 *)psAlloc(nZ * sizeof(psF32));
+            newPoly->mask[x][y] = (psU8 *)psAlloc(nZ * sizeof(psU8));
+        }
+    }
+    for (x = 0; x < nX; x++) {
+        for (y = 0; y < nY; y++) {
+            for (z = 0; z < nZ; z++) {
+                newPoly->coeff[x][y][z] = 0.0;
+                newPoly->coeffErr[x][y][z] = 0.0;
+                newPoly->mask[x][y][z] = 0;
+            }
+        }
+    }
+
+    return(newPoly);
+}
+
+psPolynomial4D* psPolynomial4DAlloc(psS32 nW, psS32 nX, psS32 nY, psS32 nZ,
+                                    psPolynomialType type)
+{
+    PS_INT_CHECK_POSITIVE(nW, NULL);
+    PS_INT_CHECK_POSITIVE(nX, NULL);
+    PS_INT_CHECK_POSITIVE(nY, NULL);
+    PS_INT_CHECK_POSITIVE(nZ, NULL);
+
+    psS32 w = 0;
+    psS32 x = 0;
+    psS32 y = 0;
+    psS32 z = 0;
+    psPolynomial4D* newPoly = NULL;
+
+    newPoly = (psPolynomial4D* ) psAlloc(sizeof(psPolynomial4D));
+    psMemSetDeallocator(newPoly, (psFreeFcn) polynomial4DFree);
+
+    newPoly->type = type;
+    newPoly->nW = nW;
+    newPoly->nX = nX;
+    newPoly->nY = nY;
+    newPoly->nZ = nZ;
+
+    newPoly->coeff = (psF32 ****)psAlloc(nW * sizeof(psF32 ***));
+    newPoly->coeffErr = (psF32 ****)psAlloc(nW * sizeof(psF32 ***));
+    newPoly->mask = (psU8 ****)psAlloc(nW * sizeof(psU8 ***));
+    for (w = 0; w < nW; w++) {
+        newPoly->coeff[w] = (psF32 ***)psAlloc(nX * sizeof(psF32 **));
+        newPoly->coeffErr[w] = (psF32 ***)psAlloc(nX * sizeof(psF32 **));
+        newPoly->mask[w] = (psU8 ***)psAlloc(nX * sizeof(psU8 **));
+        for (x = 0; x < nX; x++) {
+            newPoly->coeff[w][x] = (psF32 **)psAlloc(nY * sizeof(psF32 *));
+            newPoly->coeffErr[w][x] = (psF32 **)psAlloc(nY * sizeof(psF32 *));
+            newPoly->mask[w][x] = (psU8 **)psAlloc(nY * sizeof(psU8 *));
+            for (y = 0; y < nY; y++) {
+                newPoly->coeff[w][x][y] = (psF32 *)psAlloc(nZ * sizeof(psF32));
+                newPoly->coeffErr[w][x][y] = (psF32 *)psAlloc(nZ * sizeof(psF32));
+                newPoly->mask[w][x][y] = (psU8 *)psAlloc(nZ * sizeof(psU8));
+            }
+        }
+    }
+    for (w = 0; w < nW; w++) {
+        for (x = 0; x < nX; x++) {
+            for (y = 0; y < nY; y++) {
+                for (z = 0; z < nZ; z++) {
+                    newPoly->coeff[w][x][y][z] = 0.0;
+                    newPoly->coeffErr[w][x][y][z] = 0.0;
+                    newPoly->mask[w][x][y][z] = 0;
+                }
+            }
+        }
+    }
+
+    return(newPoly);
+}
+
+psF32 psPolynomial1DEval(const psPolynomial1D* myPoly, psF32 x)
+{
+    PS_POLY_CHECK_NULL(myPoly, NAN);
+
+    if (myPoly->type == PS_POLYNOMIAL_ORD) {
+        return(ordPolynomial1DEval(x, myPoly));
+    } else if (myPoly->type == PS_POLYNOMIAL_CHEB) {
+        return(chebPolynomial1DEval(x, myPoly));
+    } else {
+        psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                PS_ERRORTEXT_psFunctions_INVALID_POLYNOMIAL_TYPE,
+                myPoly->type);
+    }
+    return(NAN);
+}
+
+psVector *psPolynomial1DEvalVector(const psPolynomial1D *myPoly,
+                                   const psVector *x)
+{
+    PS_POLY_CHECK_NULL(myPoly, NULL);
+    PS_VECTOR_CHECK_NULL(x, NULL);
+    PS_VECTOR_CHECK_TYPE(x, PS_TYPE_F32, NULL);
+
+    psVector *tmp;
+
+    tmp = psVectorAlloc(x->n, PS_TYPE_F32);
+    for (psS32 i=0;i<x->n;i++) {
+        tmp->data.F32[i] = psPolynomial1DEval(myPoly, x->data.F32[i]);
+    }
+
+    return(tmp);
+}
+
+psF32 psPolynomial2DEval(const psPolynomial2D* myPoly, psF32 x, psF32 y)
+{
+    PS_POLY_CHECK_NULL(myPoly, NAN);
+
+    if (myPoly->type == PS_POLYNOMIAL_ORD) {
+        return(ordPolynomial2DEval(x, y, myPoly));
+    } else if (myPoly->type == PS_POLYNOMIAL_CHEB) {
+        return(chebPolynomial2DEval(x, y, myPoly));
+    } else {
+        psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                PS_ERRORTEXT_psFunctions_INVALID_POLYNOMIAL_TYPE,
+                myPoly->type);
+    }
+    return(NAN);
+}
+
+psVector *psPolynomial2DEvalVector(const psPolynomial2D *myPoly,
+                                   const psVector *x,
+                                   const psVector *y)
+
+{
+    PS_POLY_CHECK_NULL(myPoly, NULL);
+    PS_VECTOR_CHECK_NULL(x, NULL);
+    PS_VECTOR_CHECK_TYPE(x, PS_TYPE_F32, NULL);
+    PS_VECTOR_CHECK_NULL(y, NULL);
+    PS_VECTOR_CHECK_TYPE(y, PS_TYPE_F32, NULL);
+
+    psVector *tmp;
+    psS32 vecLen=x->n;
+
+    // Determine the length of the output vector to by the minimum of the x,y vectors
+    if (y->n < vecLen) {
+        vecLen = y->n;
+    }
+
+    // Create output vector to return
+    tmp = psVectorAlloc(vecLen, PS_TYPE_F32);
+
+    // Evaluate the polynomial at the specified points
+    for (psS32 i=0; i<vecLen; i++) {
+        tmp->data.F32[i] = psPolynomial2DEval(myPoly,x->data.F32[i],y->data.F32[i]);
+    }
+
+    // Return output vector
+    return(tmp);
+}
+
+psF32 psPolynomial3DEval(const psPolynomial3D* myPoly, psF32 x, psF32 y, psF32 z)
+{
+    PS_POLY_CHECK_NULL(myPoly, NAN);
+
+    if (myPoly->type == PS_POLYNOMIAL_ORD) {
+        return(ordPolynomial3DEval(x, y, z, myPoly));
+    } else if (myPoly->type == PS_POLYNOMIAL_CHEB) {
+        return(chebPolynomial3DEval(x, y, z, myPoly));
+    } else {
+        psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                PS_ERRORTEXT_psFunctions_INVALID_POLYNOMIAL_TYPE,
+                myPoly->type);
+    }
+    return(NAN);
+}
+
+psVector *psPolynomial3DEvalVector(const psPolynomial3D *myPoly,
+                                   const psVector *x,
+                                   const psVector *y,
+                                   const psVector *z)
+
+{
+    PS_POLY_CHECK_NULL(myPoly, NULL);
+    PS_VECTOR_CHECK_NULL(x, NULL);
+    PS_VECTOR_CHECK_TYPE(x, PS_TYPE_F32, NULL);
+    PS_VECTOR_CHECK_NULL(y, NULL);
+    PS_VECTOR_CHECK_TYPE(y, PS_TYPE_F32, NULL);
+    PS_VECTOR_CHECK_NULL(z, NULL);
+    PS_VECTOR_CHECK_TYPE(z, PS_TYPE_F32, NULL);
+
+    psVector *tmp;
+    psS32 vecLen=x->n;
+
+    // Determine the length of output vector from min of the input vectors
+    if (y->n < vecLen) {
+        vecLen = y->n;
+    }
+    if (z->n < vecLen) {
+        vecLen = z->n;
+    }
+
+    // Allocate output vector
+    tmp = psVectorAlloc(vecLen, PS_TYPE_F32);
+
+    // Evaluate polynomial
+    for (psS32 i = 0; i < vecLen; i++) {
+        tmp->data.F32[i] = psPolynomial3DEval(myPoly,
+                                              x->data.F32[i],
+                                              y->data.F32[i],
+                                              z->data.F32[i]);
+    }
+
+    // Return output vector
+    return(tmp);
+}
+
+psF32 psPolynomial4DEval(const psPolynomial4D* myPoly, psF32 w, psF32 x, psF32 y, psF32 z)
+{
+    PS_POLY_CHECK_NULL(myPoly, NAN);
+
+    if (myPoly->type == PS_POLYNOMIAL_ORD) {
+        return(ordPolynomial4DEval(w,x,y,z, myPoly));
+    } else if (myPoly->type == PS_POLYNOMIAL_CHEB) {
+        return(chebPolynomial4DEval(w,x,y,z, myPoly));
+    } else {
+        psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                PS_ERRORTEXT_psFunctions_INVALID_POLYNOMIAL_TYPE,
+                myPoly->type);
+    }
+    return(NAN);
+}
+
+psVector *psPolynomial4DEvalVector(const psPolynomial4D *myPoly,
+                                   const psVector *w,
+                                   const psVector *x,
+                                   const psVector *y,
+                                   const psVector *z)
+{
+    PS_POLY_CHECK_NULL(myPoly, NULL);
+    PS_VECTOR_CHECK_NULL(w, NULL);
+    PS_VECTOR_CHECK_TYPE(w, PS_TYPE_F32, NULL);
+    PS_VECTOR_CHECK_NULL(x, NULL);
+    PS_VECTOR_CHECK_TYPE(x, PS_TYPE_F32, NULL);
+    PS_VECTOR_CHECK_NULL(y, NULL);
+    PS_VECTOR_CHECK_TYPE(y, PS_TYPE_F32, NULL);
+    PS_VECTOR_CHECK_NULL(z, NULL);
+    PS_VECTOR_CHECK_TYPE(z, PS_TYPE_F32, NULL);
+
+    psVector *tmp;
+    psS32 vecLen=w->n;
+
+    // Determine output vector size from min of input vectors
+    if (y->n < vecLen) {
+        vecLen = y->n;
+    }
+    if (x->n < vecLen) {
+        vecLen = x->n;
+    }
+    if (z->n < vecLen) {
+        vecLen = z->n;
+    }
+
+    // Allocate output vector
+    tmp = psVectorAlloc(vecLen, PS_TYPE_F32);
+
+    // Evaluate polynomial
+    for (psS32 i = 0; i < vecLen; i++) {
+        tmp->data.F32[i] = psPolynomial4DEval(myPoly,
+                                              w->data.F32[i],
+                                              x->data.F32[i],
+                                              y->data.F32[i],
+                                              z->data.F32[i]);
+    }
+
+    // Return output vector
+    return(tmp);
+}
+
+
+psDPolynomial1D* psDPolynomial1DAlloc(psS32 n,
+                                      psPolynomialType type)
+{
+    PS_INT_CHECK_POSITIVE(n, NULL);
+
+    psS32 i = 0;
+    psDPolynomial1D* newPoly = NULL;
+
+    newPoly = (psDPolynomial1D* ) psAlloc(sizeof(psDPolynomial1D));
+    psMemSetDeallocator(newPoly, (psFreeFcn) dPolynomial1DFree);
+
+    newPoly->type = type;
+    newPoly->n = n;
+    newPoly->coeff = (psF64 *)psAlloc(n * sizeof(psF64));
+    newPoly->coeffErr = (psF64 *)psAlloc(n * sizeof(psF64));
+    newPoly->mask = (psU8 *)psAlloc(n * sizeof(psU8));
+    for (i = 0; i < n; i++) {
+        newPoly->coeff[i] = 0.0;
+        newPoly->coeffErr[i] = 0.0;
+        newPoly->mask[i] = 0;
+    }
+
+    return(newPoly);
+}
+
+psDPolynomial2D* psDPolynomial2DAlloc(psS32 nX, psS32 nY,
+                                      psPolynomialType type)
+{
+    PS_INT_CHECK_POSITIVE(nX, NULL);
+    PS_INT_CHECK_POSITIVE(nY, NULL);
+
+    psS32 x = 0;
+    psS32 y = 0;
+    psDPolynomial2D* newPoly = NULL;
+
+    newPoly = (psDPolynomial2D* ) psAlloc(sizeof(psDPolynomial2D));
+    psMemSetDeallocator(newPoly, (psFreeFcn) dPolynomial2DFree);
+
+    newPoly->type = type;
+    newPoly->nX = nX;
+    newPoly->nY = nY;
+
+    newPoly->coeff = (psF64 **)psAlloc(nX * sizeof(psF64 *));
+    newPoly->coeffErr = (psF64 **)psAlloc(nX * sizeof(psF64 *));
+    newPoly->mask = (psU8 **)psAlloc(nX * sizeof(psU8 *));
+    for (x = 0; x < nX; x++) {
+        newPoly->coeff[x] = (psF64 *)psAlloc(nY * sizeof(psF64));
+        newPoly->coeffErr[x] = (psF64 *)psAlloc(nY * sizeof(psF64));
+        newPoly->mask[x] = (psU8 *)psAlloc(nY * sizeof(psU8));
+    }
+    for (x = 0; x < nX; x++) {
+        for (y = 0; y < nY; y++) {
+            newPoly->coeff[x][y] = 0.0;
+            newPoly->coeffErr[x][y] = 0.0;
+            newPoly->mask[x][y] = 0;
+        }
+    }
+
+    return(newPoly);
+}
+
+psDPolynomial3D* psDPolynomial3DAlloc(psS32 nX, psS32 nY, psS32 nZ,
+                                      psPolynomialType type)
+{
+    PS_INT_CHECK_POSITIVE(nX, NULL);
+    PS_INT_CHECK_POSITIVE(nY, NULL);
+    PS_INT_CHECK_POSITIVE(nZ, NULL);
+
+    psS32 x = 0;
+    psS32 y = 0;
+    psS32 z = 0;
+    psDPolynomial3D* newPoly = NULL;
+
+    newPoly = (psDPolynomial3D* ) psAlloc(sizeof(psDPolynomial3D));
+    psMemSetDeallocator(newPoly, (psFreeFcn) dPolynomial3DFree);
+
+    newPoly->type = type;
+    newPoly->nX = nX;
+    newPoly->nY = nY;
+    newPoly->nZ = nZ;
+
+    newPoly->coeff = (psF64 ***)psAlloc(nX * sizeof(psF64 **));
+    newPoly->coeffErr = (psF64 ***)psAlloc(nX * sizeof(psF64 **));
+    newPoly->mask = (psU8 ***)psAlloc(nX * sizeof(psU8 **));
+    for (x = 0; x < nX; x++) {
+        newPoly->coeff[x] = (psF64 **)psAlloc(nY * sizeof(psF64 *));
+        newPoly->coeffErr[x] = (psF64 **)psAlloc(nY * sizeof(psF64 *));
+        newPoly->mask[x] = (psU8 **)psAlloc(nY * sizeof(psU8 *));
+        for (y = 0; y < nY; y++) {
+            newPoly->coeff[x][y] = (psF64 *)psAlloc(nZ * sizeof(psF64));
+            newPoly->coeffErr[x][y] = (psF64 *)psAlloc(nZ * sizeof(psF64));
+            newPoly->mask[x][y] = (psU8 *)psAlloc(nZ * sizeof(psU8));
+        }
+    }
+    for (x = 0; x < nX; x++) {
+        for (y = 0; y < nY; y++) {
+            for (z = 0; z < nZ; z++) {
+                newPoly->coeff[x][y][z] = 0.0;
+                newPoly->coeffErr[x][y][z] = 0.0;
+                newPoly->mask[x][y][z] = 0;
+            }
+        }
+    }
+
+    return(newPoly);
+}
+
+psDPolynomial4D* psDPolynomial4DAlloc(psS32 nW, psS32 nX, psS32 nY, psS32 nZ,
+                                      psPolynomialType type)
+{
+    PS_INT_CHECK_POSITIVE(nW, NULL);
+    PS_INT_CHECK_POSITIVE(nX, NULL);
+    PS_INT_CHECK_POSITIVE(nY, NULL);
+    PS_INT_CHECK_POSITIVE(nZ, NULL);
+
+    psS32 w = 0;
+    psS32 x = 0;
+    psS32 y = 0;
+    psS32 z = 0;
+    psDPolynomial4D* newPoly = NULL;
+
+    newPoly = (psDPolynomial4D* ) psAlloc(sizeof(psDPolynomial4D));
+    psMemSetDeallocator(newPoly, (psFreeFcn) dPolynomial4DFree);
+
+    newPoly->type = type;
+    newPoly->nW = nW;
+    newPoly->nX = nX;
+    newPoly->nY = nY;
+    newPoly->nZ = nZ;
+
+    newPoly->coeff = (psF64 ****)psAlloc(nW * sizeof(psF64 ***));
+    newPoly->coeffErr = (psF64 ****)psAlloc(nW * sizeof(psF64 ***));
+    newPoly->mask = (psU8 ****)psAlloc(nW * sizeof(psU8 ***));
+    for (w = 0; w < nW; w++) {
+        newPoly->coeff[w] = (psF64 ***)psAlloc(nX * sizeof(psF64 **));
+        newPoly->coeffErr[w] = (psF64 ***)psAlloc(nX * sizeof(psF64 **));
+        newPoly->mask[w] = (psU8 ***)psAlloc(nX * sizeof(psU8 **));
+        for (x = 0; x < nX; x++) {
+            newPoly->coeff[w][x] = (psF64 **)psAlloc(nY * sizeof(psF64 *));
+            newPoly->coeffErr[w][x] = (psF64 **)psAlloc(nY * sizeof(psF64 *));
+            newPoly->mask[w][x] = (psU8 **)psAlloc(nY * sizeof(psU8 *));
+            for (y = 0; y < nY; y++) {
+                newPoly->coeff[w][x][y] = (psF64 *)psAlloc(nZ * sizeof(psF64));
+                newPoly->coeffErr[w][x][y] = (psF64 *)psAlloc(nZ * sizeof(psF64));
+                newPoly->mask[w][x][y] = (psU8 *)psAlloc(nZ * sizeof(psU8));
+            }
+        }
+    }
+    for (w = 0; w < nW; w++) {
+        for (x = 0; x < nX; x++) {
+            for (y = 0; y < nY; y++) {
+                for (z = 0; z < nZ; z++) {
+                    newPoly->coeff[w][x][y][z] = 0.0;
+                    newPoly->coeffErr[w][x][y][z] = 0.0;
+                    newPoly->mask[w][x][y][z] = 0;
+                }
+            }
+        }
+    }
+
+    return(newPoly);
+}
+
+
+psF64 psDPolynomial1DEval(const psDPolynomial1D* myPoly, psF64 x)
+{
+    PS_POLY_CHECK_NULL(myPoly, NAN);
+
+    if (myPoly->type == PS_POLYNOMIAL_ORD) {
+        return(dOrdPolynomial1DEval(x, myPoly));
+    } else if (myPoly->type == PS_POLYNOMIAL_CHEB) {
+        return(dChebPolynomial1DEval(x, myPoly));
+    } else {
+        psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                PS_ERRORTEXT_psFunctions_INVALID_POLYNOMIAL_TYPE,
+                myPoly->type);
+    }
+    return(NAN);
+}
+
+psVector *psDPolynomial1DEvalVector(const psDPolynomial1D *myPoly,
+                                    const psVector *x)
+
+{
+    PS_POLY_CHECK_NULL(myPoly, NULL);
+    PS_VECTOR_CHECK_NULL(x, NULL);
+    PS_VECTOR_CHECK_TYPE(x, PS_TYPE_F64, NULL);
+
+    psVector *tmp;
+
+    tmp = psVectorAlloc(x->n, PS_TYPE_F64);
+    for (psS32 i=0;i<x->n;i++) {
+        tmp->data.F64[i] = psDPolynomial1DEval(myPoly,
+                                               x->data.F64[i]);
+    }
+
+    return(tmp);
+}
+
+
+psF64 psDPolynomial2DEval(const psDPolynomial2D* myPoly,
+                          psF64 x,
+                          psF64 y)
+{
+    PS_POLY_CHECK_NULL(myPoly, NAN);
+
+    if (myPoly->type == PS_POLYNOMIAL_ORD) {
+        return(dOrdPolynomial2DEval(x, y, myPoly));
+    } else if (myPoly->type == PS_POLYNOMIAL_CHEB) {
+        return(dChebPolynomial2DEval(x, y, myPoly));
+    } else {
+        psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                PS_ERRORTEXT_psFunctions_INVALID_POLYNOMIAL_TYPE,
+                myPoly->type);
+    }
+    return(NAN);
+}
+
+psVector *psDPolynomial2DEvalVector(const psDPolynomial2D *myPoly,
+                                    const psVector *x,
+                                    const psVector *y)
+{
+    PS_POLY_CHECK_NULL(myPoly, NULL);
+    PS_VECTOR_CHECK_NULL(x, NULL);
+    PS_VECTOR_CHECK_TYPE(x, PS_TYPE_F64, NULL);
+    PS_VECTOR_CHECK_NULL(y, NULL);
+    PS_VECTOR_CHECK_TYPE(y, PS_TYPE_F64, NULL);
+
+    psVector *tmp;
+    psS32 vecLen=x->n;
+
+    // Determine the output vector length from minimum length of input vectors
+    if (y->n < vecLen) {
+        vecLen = y->n;
+    }
+
+    // Allocate output vector
+    tmp = psVectorAlloc(vecLen, PS_TYPE_F64);
+
+    // Evaluate the polynomial
+    for (psS32 i = 0; i < vecLen; i++) {
+        tmp->data.F64[i] = psDPolynomial2DEval(myPoly,x->data.F64[i],y->data.F64[i]);
+    }
+
+    // Return output vector
+    return(tmp);
+}
+
+
+psF64 psDPolynomial3DEval(const psDPolynomial3D* myPoly,
+                          psF64 x,
+                          psF64 y,
+                          psF64 z)
+{
+    PS_POLY_CHECK_NULL(myPoly, NAN);
+
+    if (myPoly->type == PS_POLYNOMIAL_ORD) {
+        return(dOrdPolynomial3DEval(x, y, z, myPoly));
+    } else if (myPoly->type == PS_POLYNOMIAL_CHEB) {
+        return(dChebPolynomial3DEval(x, y, z, myPoly));
+    } else {
+        psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                PS_ERRORTEXT_psFunctions_INVALID_POLYNOMIAL_TYPE,
+                myPoly->type);
+    }
+    return(NAN);
+}
+
+psVector *psDPolynomial3DEvalVector(const psDPolynomial3D *myPoly,
+                                    const psVector *x,
+                                    const psVector *y,
+                                    const psVector *z)
+
+{
+    PS_POLY_CHECK_NULL(myPoly, NULL);
+    PS_VECTOR_CHECK_NULL(x, NULL);
+    PS_VECTOR_CHECK_TYPE(x, PS_TYPE_F64, NULL);
+    PS_VECTOR_CHECK_NULL(y, NULL);
+    PS_VECTOR_CHECK_TYPE(y, PS_TYPE_F64, NULL);
+    PS_VECTOR_CHECK_NULL(z, NULL);
+    PS_VECTOR_CHECK_TYPE(z, PS_TYPE_F64, NULL);
+
+    psVector *tmp;
+    psS32 vecLen=x->n;
+
+    // Determine the size of output vector from min of input vectors
+    if (y->n < vecLen) {
+        vecLen = y->n;
+    }
+    if (z->n < vecLen) {
+        vecLen = z->n;
+    }
+
+    // Allocate output vector
+    tmp = psVectorAlloc(vecLen, PS_TYPE_F64);
+
+    // Evaluate polynomial
+    for (psS32 i = 0; i < vecLen; i++) {
+        tmp->data.F64[i] = psDPolynomial3DEval(myPoly,
+                                               x->data.F64[i],
+                                               y->data.F64[i],
+                                               z->data.F64[i]);
+    }
+
+    // Return output vector
+    return(tmp);
+}
+
+psF64 psDPolynomial4DEval(const psDPolynomial4D* myPoly,
+                          psF64 w,
+                          psF64 x,
+                          psF64 y,
+                          psF64 z)
+{
+    PS_POLY_CHECK_NULL(myPoly, NAN);
+
+    if (myPoly->type == PS_POLYNOMIAL_ORD) {
+        return(dOrdPolynomial4DEval(w,x,y,z, myPoly));
+    } else if (myPoly->type == PS_POLYNOMIAL_CHEB) {
+        return(dChebPolynomial4DEval(w,x,y,z, myPoly));
+    } else {
+        psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                PS_ERRORTEXT_psFunctions_INVALID_POLYNOMIAL_TYPE,
+                myPoly->type);
+    }
+    return(NAN);
+}
+
+psVector *psDPolynomial4DEvalVector(const psDPolynomial4D *myPoly,
+                                    const psVector *w,
+                                    const psVector *x,
+                                    const psVector *y,
+                                    const psVector *z)
+{
+    PS_POLY_CHECK_NULL(myPoly, NULL);
+    PS_VECTOR_CHECK_NULL(w, NULL);
+    PS_VECTOR_CHECK_TYPE(w, PS_TYPE_F64, NULL);
+    PS_VECTOR_CHECK_NULL(x, NULL);
+    PS_VECTOR_CHECK_TYPE(x, PS_TYPE_F64, NULL);
+    PS_VECTOR_CHECK_NULL(y, NULL);
+    PS_VECTOR_CHECK_TYPE(y, PS_TYPE_F64, NULL);
+    PS_VECTOR_CHECK_NULL(z, NULL);
+    PS_VECTOR_CHECK_TYPE(z, PS_TYPE_F64, NULL);
+
+    psVector *tmp;
+    psS32 vecLen=w->n;
+
+    // Determine the output vector size from min of input vectors
+    if (y->n < vecLen) {
+        vecLen = y->n;
+    }
+    if (x->n < vecLen) {
+        vecLen = x->n;
+    }
+    if (z->n < vecLen) {
+        vecLen = z->n;
+    }
+
+    // Allocate output vector
+    tmp = psVectorAlloc(vecLen, PS_TYPE_F64);
+
+    // Evaluate the polynomial
+    for (psS32 i = 0; i < vecLen; i++) {
+        tmp->data.F64[i] = psDPolynomial4DEval(myPoly,
+                                               w->data.F64[i],
+                                               x->data.F64[i],
+                                               y->data.F64[i],
+                                               z->data.F64[i]);
+    }
+
+    // Return output vector
+    return(tmp);
+}
+
+
+
+
+//typedef struct {
+//    psS32 n;
+//    psPolynomial1D **spline;
+//    psF32 *p_psDeriv2;
+//    psVector *knots;
+//} psSpline1D;
+
+/*****************************************************************************
+    NOTE: "n" specifies the number of spline polynomials.  Therefore, there
+    must exist n+1 points in "knots".
+ 
+XXX: Ensure that domain[i+1] != domain[i]
+ 
+XXX: What should be the defualty type for knots be?  psF32 is assumed.
+ *****************************************************************************/
+psSpline1D *psSpline1DAlloc(psS32 numSplines,
+                            psS32 order,
+                            psF32 min,
+                            psF32 max)
+{
+    PS_INT_CHECK_NON_NEGATIVE(numSplines, NULL);
+    PS_INT_CHECK_NON_NEGATIVE(order, NULL);
+    PS_FLOAT_CHECK_NON_EQUAL(max, min, NULL);
+
+    psSpline1D *tmp = NULL;
+    psS32 i;
+    psF32 tmpDomain;
+    psF32 width;
+
+    tmp = (psSpline1D *) psAlloc(sizeof(psSpline1D));
+    tmp->n = numSplines;
+
+    tmp->spline = (psPolynomial1D **) psAlloc(numSplines * sizeof(psPolynomial1D *));
+    for (i=0;i<numSplines;i++) {
+        (tmp->spline)[i] = psPolynomial1DAlloc(order+1, PS_POLYNOMIAL_ORD);
+    }
+
+    // This should be set by the psVectorFitSpline1D()
+    tmp->p_psDeriv2 = NULL;
+
+    tmp->knots = psVectorAlloc(numSplines+1, PS_TYPE_F32);
+    width = (max - min) / ((psF32) numSplines);
+
+    tmp->knots->data.F32[0] = min;
+    tmpDomain = min+width;
+    for (i=1;i<numSplines+1;i++) {
+        tmp->knots->data.F32[i] = tmpDomain;
+        tmpDomain+= width;
+    }
+    tmp->knots->data.F32[numSplines] = max;
+
+    psMemSetDeallocator(tmp,(psFreeFcn)spline1DFree);
+    return(tmp);
+}
+
+
+/*****************************************************************************
+XXX: What should be the defualty type for knots be?  psF32 is assumed.
+ *****************************************************************************/
+psSpline1D *psSpline1DAllocGeneric(const psVector *bounds,
+                                   psS32 order)
+{
+    PS_VECTOR_CHECK_NULL(bounds, NULL);
+    PS_VECTOR_CHECK_EMPTY(bounds, NULL);
+    PS_INT_CHECK_NON_NEGATIVE(order, NULL);
+
+    psSpline1D *tmp = NULL;
+    psS32 i;
+    psS32 numSplines;
+
+    tmp = (psSpline1D *) psAlloc(sizeof(psSpline1D));
+
+    numSplines = bounds->n - 1;
+    tmp->n = numSplines;
+
+    tmp->spline = (psPolynomial1D **) psAlloc(numSplines * sizeof(psPolynomial1D *));
+    for (i=0;i<numSplines;i++) {
+        (tmp->spline)[i] = psPolynomial1DAlloc(order+1, PS_POLYNOMIAL_ORD);
+    }
+
+    // This should be set by the psVectorFitSpline1D()
+    tmp->p_psDeriv2 = NULL;
+
+    tmp->knots = psVectorAlloc(bounds->n, PS_TYPE_F32);
+
+    for (i=0;i<bounds->n;i++) {
+        tmp->knots->data.F32[i] = bounds->data.F32[i];
+        if (i<(bounds->n-1)) {
+            if (FLT_EPSILON >= fabs(bounds->data.F32[i+1]-bounds->data.F32[i])) {
+                psError(PS_ERR_UNKNOWN, true, "data points must be distinct\n");
+            }
+        }
+    }
+
+    psMemSetDeallocator(tmp,(psFreeFcn)spline1DFree);
+    return(tmp);
+}
+
+/*****************************************************************************
+vectorBinDisectF32(): This is a macro for a private function which takes as
+input a vector an array of data as well as a single value for that data.  The
+input vector values are assumed to be non-decreasing (v[i-1] <= v[i] for all
+i).  This routine does a binary disection of the vector and returns "i" such
+that (v[i] <= x <= v[i+1).  If x lies outside the range of v[], then this
+routine prints a warning message and returns (-2 or -1).
+ *****************************************************************************/
+#define FUNC_MACRO_VECTOR_BIN_DISECT(TYPE) \
+static psS32 vectorBinDisect##TYPE(ps##TYPE *bins, \
+                                   psS32 numBins, \
+                                   ps##TYPE x) \
+{ \
+    psS32 min; \
+    psS32 max; \
+    psS32 mid; \
+    \
+    psTrace(".psLib.dataManip.psFunctions.vectorBinDisect##TYPE", 4, \
+            "---- Calling vectorBinDisect##TYPE(%f)\n", x); \
+    \
+    if (x < bins[0]) { \
+        psLogMsg(__func__, PS_LOG_WARN, \
+                 "vectorBinDisect%s(): ordinate %f is outside vector range (%f - %f).", \
+                 #TYPE, x, bins[0], bins[numBins-1]); \
+        return(-2); \
+    } \
+    \
+    if (x > bins[numBins-1]) { \
+        psLogMsg(__func__, PS_LOG_WARN, \
+                 "vectorBinDisect%s(): ordinate %f is outside vector range (%f - %f).", \
+                 #TYPE, x, bins[0], bins[numBins-1]); \
+        return(-1); \
+    } \
+    \
+    min = 0; \
+    max = numBins-2; \
+    mid = ((max+1)-min)/2; \
+    \
+    while (min != max) { \
+        psTrace(".psLib.dataManip.psFunctions.vectorBinDisect##TYPE", 4, \
+                "(min, mid, max) is (%d, %d, %d): (x, bins) is (%f, %f)\n", \
+                min, mid, max, x, bins[mid]); \
+        \
+        if (x == bins[mid]) { \
+            psTrace(".psLib.dataManip.psFunctions.vectorBinDisect##TYPE", 4, \
+                    "---- Exiting vectorBinDisect##TYPE(): bin %d\n", mid); \
+            return(mid); \
+        } else if (x < bins[mid]) { \
+            max = mid-1; \
+        } else { \
+            min = mid; \
+        } \
+        mid = ((max+1)+min)/2; \
+    } \
+    \
+    psTrace(".psLib.dataManip.psFunctions.vectorBinDisect##TYPE", 4, \
+            "---- Exiting vectorBinDisect##TYPE(): bin %d\n", min); \
+    return(min); \
+} \
+
+FUNC_MACRO_VECTOR_BIN_DISECT(S8)
+FUNC_MACRO_VECTOR_BIN_DISECT(S16)
+FUNC_MACRO_VECTOR_BIN_DISECT(S32)
+FUNC_MACRO_VECTOR_BIN_DISECT(S64)
+FUNC_MACRO_VECTOR_BIN_DISECT(U8)
+FUNC_MACRO_VECTOR_BIN_DISECT(U16)
+FUNC_MACRO_VECTOR_BIN_DISECT(U32)
+FUNC_MACRO_VECTOR_BIN_DISECT(U64)
+FUNC_MACRO_VECTOR_BIN_DISECT(F32)
+FUNC_MACRO_VECTOR_BIN_DISECT(F64)
+
+/*****************************************************************************
+p_psVectorBinDisect(): A wrapper to the above p_psVectorBinDisect().
+ *****************************************************************************/
+psS32 p_psVectorBinDisect(psVector *bins,
+                          psScalar *x)
+{
+    PS_VECTOR_CHECK_NULL(bins, -4);
+    PS_VECTOR_CHECK_EMPTY(bins, -4);
+    PS_PTR_CHECK_NULL(x, -6);
+    PS_PTR_CHECK_TYPE_EQUAL(x, bins, -3);
+    psS8* strType;
+
+    switch (x->type.type) {
+    case PS_TYPE_U8:
+        return(vectorBinDisectU8(bins->data.U8, bins->n, x->data.U8));
+    case PS_TYPE_U16:
+        return(vectorBinDisectU16(bins->data.U16, bins->n, x->data.U16));
+    case PS_TYPE_U32:
+        return(vectorBinDisectU32(bins->data.U32, bins->n, x->data.U32));
+    case PS_TYPE_U64:
+        return(vectorBinDisectU64(bins->data.U64, bins->n, x->data.U64));
+    case PS_TYPE_S8:
+        return(vectorBinDisectS8(bins->data.S8, bins->n, x->data.S8));
+    case PS_TYPE_S16:
+        return(vectorBinDisectS16(bins->data.S16, bins->n, x->data.S16));
+    case PS_TYPE_S32:
+        return(vectorBinDisectS32(bins->data.S32, bins->n, x->data.S32));
+    case PS_TYPE_S64:
+        return(vectorBinDisectS64(bins->data.S64, bins->n, x->data.S64));
+    case PS_TYPE_F32:
+        return(vectorBinDisectF32(bins->data.F32, bins->n, x->data.F32));
+    case PS_TYPE_F64:
+        return(vectorBinDisectF64(bins->data.F64, bins->n, x->data.F64));
+    case PS_TYPE_C32:
+        PS_TYPE_NAME(strType,x->type.type);
+        psError(PS_ERR_BAD_PARAMETER_TYPE,
+                PS_ERRORTEXT_psFunctions_TYPE_NOT_SUPPORTED,
+                strType);
+        return 0;
+    case PS_TYPE_C64:
+        PS_TYPE_NAME(strType,x->type.type);
+        psError(PS_ERR_BAD_PARAMETER_TYPE,
+                PS_ERRORTEXT_psFunctions_TYPE_NOT_SUPPORTED,
+                strType);
+        return 0;
+    case PS_TYPE_BOOL:
+        PS_TYPE_NAME(strType,x->type.type);
+        psError(PS_ERR_BAD_PARAMETER_TYPE,
+                PS_ERRORTEXT_psFunctions_TYPE_NOT_SUPPORTED,
+                strType);
+        return 0;
+    }
+    return(-3);
+}
+
+/*****************************************************************************
+p_psVectorInterpolate(): This routine will take as input psVectors domain and
+range, and the x value, assumed to lie with the domain vector.  It produces
+as output the LaGrange interpolated value of a polynomial of the specified
+order around the point x.
+ 
+XXX: This stuff does not currently work with a mask.
+ 
+XXX: add another psScalar argument for the result.
+ 
+XXX: The VectorCopy routines seg fault when I declare range32 as static.
+ *****************************************************************************/
+psScalar *p_psVectorInterpolate(psVector *domain,
+                                psVector *range,
+                                psS32 order,
+                                psScalar *x)
+{
+    PS_VECTOR_CHECK_NULL(domain, NULL);
+    PS_VECTOR_CHECK_NULL(range, NULL);
+    PS_PTR_CHECK_NULL(x, NULL);
+    PS_INT_CHECK_NON_NEGATIVE(order, NULL);
+    PS_VECTOR_CHECK_SIZE_EQUAL(domain, range, NULL);
+    PS_PTR_CHECK_TYPE_EQUAL(domain, range, NULL);
+    PS_PTR_CHECK_TYPE_EQUAL(domain, x, NULL);
+
+    psVector *range32 = NULL;
+    psVector *domain32 = NULL;
+    psTrace(".psLib.dataManip.psFunctions.p_psVectorInterpolate", 4,
+            "---- p_psVectorInterpolate() begin ----\n");
+
+    if (order > (domain->n - 1)) {
+        psError(PS_ERR_BAD_PARAMETER_SIZE, true,
+                PS_ERRORTEXT_psFunctions_NOT_ENOUGH_DATAPOINTS,
+                order);
+        return(NULL);
+    }
+
+    if (x->type.type == PS_TYPE_F32) {
+        psTrace(".psLib.dataManip.psFunctions.p_psVectorInterpolate", 4,
+                "---- p_psVectorInterpolate() end ----\n");
+        return(psScalarAlloc(interpolate1DF32(domain->data.F32,
+                                              range->data.F32,
+                                              domain->n,
+                                              order,
+                                              x->data.F32), PS_TYPE_F32));
+    } else if (x->type.type == PS_TYPE_F64) {
+        // XXX: use recycled vectors here.
+        range32 = psVectorCopy(range32, range, PS_TYPE_F32);
+        domain32 = psVectorCopy(domain32, domain, PS_TYPE_F32);
+
+        psScalar *tmpScalar = psScalarAlloc((psF64)
+                                            interpolate1DF32(domain32->data.F32,
+                                                             range32->data.F32,
+                                                             domain32->n,
+                                                             order,
+                                                             (psF32) x->data.F64), PS_TYPE_F64);
+        psFree(range32);
+        psFree(domain32);
+
+        psTrace(".psLib.dataManip.psFunctions.p_psVectorInterpolate", 4,
+                "---- p_psVectorInterpolate() end ----\n");
+        // XXX: Convert data type to F64?
+        return(tmpScalar);
+
+    } else {
+        psS8* strType;
+        PS_TYPE_NAME(strType,x->type.type);
+        psError(PS_ERR_BAD_PARAMETER_TYPE,
+                PS_ERRORTEXT_psFunctions_TYPE_NOT_SUPPORTED,
+                strType);
+    }
+
+    psTrace(".psLib.dataManip.psFunctions.p_psVectorInterpolate", 4,
+            "return(NULL)\n");
+    psTrace(".psLib.dataManip.psFunctions.p_psVectorInterpolate", 4,
+            "---- p_psVectorInterpolate() end ----\n");
+
+    return(NULL);
+}
+
+
+/*****************************************************************************
+psSpline1DEval(): this routine takes an existing spline of arbitrary order
+and an independent x value.  Each determines which spline that x corresponds
+to by doing a bracket disection on the knots of the spline data structure
+(vectorBinDisectF32()).  Then it evaluates the spline at that x location
+by a call to the 1D polynomial functions.
+ 
+XXX: The spline eval functions require input and output to be F32.  however
+     the spline fit functions require F32 and F64.
+ 
+XXX: This only works if spline0>knots if psF32.  Must add support for psU32 and
+psF64.
+ *****************************************************************************/
+psF32 psSpline1DEval(
+    const psSpline1D *spline,
+    psF32 x
+)
+{
+    PS_PTR_CHECK_NULL(spline, NAN);
+    PS_INT_CHECK_NON_NEGATIVE(spline->n, NAN);
+    PS_VECTOR_CHECK_TYPE(spline->knots, PS_TYPE_F32, NAN);
+
+    psS32 binNum;
+    psS32 n;
+
+    n = spline->n;
+    //XXX    binNum = vectorBinDisectF32(spline->domains, (spline->n)+1, x);
+    binNum = vectorBinDisectF32(spline->knots->data.F32, (spline->n)+1, x);
+    if (binNum < 0) {
+        psLogMsg(__func__, PS_LOG_WARN,
+                 "psSpline1DEval(): x ordinate (%f) is outside the spline range (%f - %f).",
+                 x, spline->knots->data.F32[0],
+                 spline->knots->data.F32[n-1]);
+
+        if (x < spline->knots->data.F32[0]) {
+            return(psPolynomial1DEval(spline->spline[0],
+                                      x));
+        } else if (x > spline->knots->data.F32[n-1]) {
+            return(psPolynomial1DEval(spline->spline[n-1],
+                                      x));
+        }
+    }
+
+    return(psPolynomial1DEval(spline->spline[binNum],
+                              x));
+}
+
+// XXX: The spline eval functions require input and output to be F32.
+// however the spline fit functions require F32 and F64.
+psVector *psSpline1DEvalVector(
+    const psSpline1D *spline,
+    const psVector *x
+)
+{
+    PS_PTR_CHECK_NULL(spline, NULL);
+    PS_VECTOR_CHECK_NULL(x, NULL);
+    PS_VECTOR_CHECK_TYPE_F32_OR_F64(x, NULL);
+    PS_VECTOR_CHECK_TYPE(spline->knots, PS_TYPE_F32, NULL);
+
+    psS32 i;
+    psVector *tmpVector;
+
+    tmpVector = psVectorAlloc(x->n, PS_TYPE_F32);
+    if (x->type.type == PS_TYPE_F32) {
+        for (i=0;i<x->n;i++) {
+            tmpVector->data.F32[i] = psSpline1DEval(
+                                         spline,
+                                         x->data.F32[i]
+                                     );
+        }
+    } else if (x->type.type == PS_TYPE_F64) {
+        for (i=0;i<x->n;i++) {
+            tmpVector->data.F32[i] = psSpline1DEval(
+                                         spline,
+                                         (psF32) x->data.F64[i]
+                                     );
+        }
+    } else {
+        psS8* strType;
+        PS_TYPE_NAME(strType,x->type.type);
+        psError(PS_ERR_BAD_PARAMETER_TYPE,
+                PS_ERRORTEXT_psFunctions_TYPE_NOT_SUPPORTED,
+                strType);
+        return(NULL);
+    }
+
+    return(tmpVector);
+}
Index: /tags/ipp-1-X/bug123/psLib/src/math/psPolynomial.h
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/math/psPolynomial.h	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/math/psPolynomial.h	(revision 22331)
@@ -0,0 +1,440 @@
+/** @file psFunctions.h
+ *  @brief Standard Mathematical Functions.
+ *  @ingroup Stats
+ *
+ *  This file will hold the prototypes for procedures which allocate, free,
+ *  and evaluate various polynomials.  Those polynomial structures are also
+ *  defined here.
+ *
+ *  @ingroup Stats
+ *
+ *  @author Someone at IfA
+ *  @author GLG, MHPCC
+ *
+ *  @version $Revision: 1.44 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-03-31 23:01:46 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+
+#if !defined(PS_FUNCTIONS_H)
+#define PS_FUNCTIONS_H
+
+#include <stdio.h>
+#include <stdbool.h>
+#include <float.h>
+#include <math.h>
+
+#include "psVector.h"
+#include "psScalar.h"
+
+/** \addtogroup Stats
+ *  \{
+ */
+
+/** Evaluate a non-normalized Gaussian with the given mean and sigma at the
+ *  given coordianate.  
+ *
+ *  Note that this is not a Gaussian deviate.  The evaluated Gaussian is: 
+ *        \f[ exp(-\frac{(x-mean)^2}{2\sigma^2}) \f] 
+ *
+ *  @return psF32      value on the gaussian curve given the input parameters
+ */
+psF32 psGaussian(
+    psF32 x,                           ///< Value at which to evaluate
+    psF32 mean,                        ///< Mean for the Gaussian
+    psF32 stddev,                      ///< Standard deviation for the Gaussian
+    psBool normal                        ///< Indicates whether result should be normalized
+);
+
+/** Produce a vector of random numbers from a Gaussian distribution with
+ *  the specified mean and sigma 
+ *  
+ *  @return psVector*    vector of random numbers
+ *  
+ */
+psVector* p_psGaussianDev(
+    psF32 mean,                        ///< The mean of the Gaussian
+    psF32 sigma,                       ///< The sigma of the Gaussian
+    psS32 Npts                           ///< The size of the vector
+);
+
+typedef enum {
+    PS_POLYNOMIAL_ORD,                 ///< Ordinary Polynomial
+    PS_POLYNOMIAL_CHEB                 ///< Chebyshev Polynomial
+} psPolynomialType;
+
+/** One-dimensional polynomial */
+typedef struct
+{
+    psPolynomialType type;             ///< Polynomial type
+    psS32 n;                             ///< Number of terms
+    psF32 *coeff;                      ///< Coefficients
+    psF32 *coeffErr;                   ///< Error in coefficients
+    psU8 *mask;                        ///< Coefficient mask
+}
+psPolynomial1D;
+
+/** Two-dimensional polynomial */
+typedef struct
+{
+    psPolynomialType type;             ///< Polynomial type
+    psS32 nX;                            ///< Number of terms in x
+    psS32 nY;                            ///< Number of terms in y
+    psF32 **coeff;                     ///< Coefficients
+    psF32 **coeffErr;                  ///< Error in coefficients
+    psU8 **mask;                       ///< Coefficients mask
+}
+psPolynomial2D;
+
+/** Three-dimensional polynomial */
+typedef struct
+{
+    psPolynomialType type;             ///< Polynomial type
+    psS32 nX;                            ///< Number of terms in x
+    psS32 nY;                            ///< Number of terms in y
+    psS32 nZ;                            ///< Number of terms in z
+    psF32 ***coeff;                    ///< Coefficients
+    psF32 ***coeffErr;                 ///< Error in coefficients
+    psU8 ***mask;                      ///< Coefficients mask
+}
+psPolynomial3D;
+
+/** Four-dimensional polynomial */
+typedef struct
+{
+    psPolynomialType type;             ///< Polynomial type
+    psS32 nW;                            ///< Number of terms in w
+    psS32 nX;                            ///< Number of terms in x
+    psS32 nY;                            ///< Number of terms in y
+    psS32 nZ;                            ///< Number of terms in z
+    psF32 ****coeff;                   ///< Coefficients
+    psF32 ****coeffErr;                ///< Error in coefficients
+    psU8 ****mask;                     ///< Coefficients mask
+}
+psPolynomial4D;
+
+
+/** Allocates a psPolynomial1D structure with n terms
+ *
+ *  @return  psPolynomial1D*    new 1-D polynomial struct
+ */
+psPolynomial1D* psPolynomial1DAlloc(
+    psS32 n,                              ///< Number of terms
+    psPolynomialType type               ///< Polynomial Type
+);
+
+/** Allocates a 2-D polynomial structure
+ *
+ *  @return  psPolynomial2D*    new 2-D polynomial struct
+ */
+psPolynomial2D* psPolynomial2DAlloc(
+    psS32 nX,                            ///< Number of terms in x
+    psS32 nY,                            ///< Number of terms in y
+    psPolynomialType type              ///< Polynomial Type
+);
+
+/** Allocates a 3-D polynomial structure
+ *
+ *  @return  psPolynomial3D*    new 3-D polynomial struct
+ */
+psPolynomial3D* psPolynomial3DAlloc(
+    psS32 nX,                            ///< Number of terms in x
+    psS32 nY,                            ///< Number of terms in y
+    psS32 nZ,                            ///< Number of terms in z
+    psPolynomialType type              ///< Polynomial Type
+);
+
+/** Allocates a 4-D polynomial structure
+ *
+ *  @return  psPolynomial4D*    new 4-D polynomial struct
+ */
+psPolynomial4D* psPolynomial4DAlloc(
+    psS32 nW,                            ///< Number of terms in w
+    psS32 nX,                            ///< Number of terms in x
+    psS32 nY,                            ///< Number of terms in y
+    psS32 nZ,                            ///< Number of terms in z
+    psPolynomialType type              ///< Polynomial Type
+);
+
+/** Evaluates a 1-D polynomial at specific coordinates.
+ *
+ *  @return psF32    result of polynomial at given location
+ */
+psF32 psPolynomial1DEval(
+    const psPolynomial1D* myPoly,       ///< Coefficients for the polynomial
+    psF32 x                           ///< location at which to evaluate
+);
+
+/** Evaluates a 2-D polynomial at specific coordinates.
+ *
+ *  @return psF32    result of polynomial at given location
+ */
+psF32 psPolynomial2DEval(
+    const psPolynomial2D* myPoly,       ///< Coefficients for the polynomial
+    psF32 x,                           ///< x location at which to evaluate
+    psF32 y                           ///< y location at which to evaluate
+);
+
+/** Evaluates a 3-D polynomial at specific coordinates.
+ *
+ *  @return psF32    result of polynomial at given location
+ */
+psF32 psPolynomial3DEval(
+    const psPolynomial3D* myPoly,       ///< Coefficients for the polynomial
+    psF32 x,                           ///< x location at which to evaluate
+    psF32 y,                           ///< y location at which to evaluate
+    psF32 z                           ///< z location at which to evaluate
+);
+
+/** Evaluates a 4-D polynomial at specific coordinates.
+ *
+ *  @return psF32    result of polynomial at given location
+ */
+psF32 psPolynomial4DEval(
+    const psPolynomial4D* myPoly,       ///< Coefficients for the polynomial
+    psF32 w,                           ///< w location at which to evaluate
+    psF32 x,                           ///< x location at which to evaluate
+    psF32 y,                           ///< y location at which to evaluate
+    psF32 z                           ///< z location at which to evaluate
+);
+
+psVector *psPolynomial1DEvalVector(
+    const psPolynomial1D *myPoly,   ///< Coefficients for the polynomial
+    const psVector *x             ///< x locations at which to evaluate
+);
+
+psVector *psPolynomial2DEvalVector(
+    const psPolynomial2D *myPoly,   ///< Coefficients for the polynomial
+    const psVector *x,             ///< x locations at which to evaluate
+    const psVector *y             ///< y locations at which to evaluate
+);
+
+psVector *psPolynomial3DEvalVector(
+    const psPolynomial3D *myPoly,   ///< Coefficients for the polynomial
+    const psVector *x,             ///< x locations at which to evaluate
+    const psVector *y,             ///< y locations at which to evaluate
+    const psVector *z             ///< z locations at which to evaluate
+);
+
+psVector *psPolynomial4DEvalVector(
+    const psPolynomial4D *myPoly,   ///< Coefficients for the polynomial
+    const psVector *w,             ///< w locations at which to evaluate
+    const psVector *x,             ///< x locations at which to evaluate
+    const psVector *y,             ///< y locations at which to evaluate
+    const psVector *z             ///< z locations at which to evaluate
+);
+
+/*****************************************************************************/
+
+/* Double-precision polynomials, mainly for use in astrometry */
+
+/** Double-precision one-dimensional polynomial */
+typedef struct
+{
+    psPolynomialType type;             ///< Polynomial type
+    psS32 n;                             ///< Number of terms
+    psF64 *coeff;                     ///< Coefficients
+    psF64 *coeffErr;                  ///< Error in coefficients
+    psU8 *mask;                        ///< Coefficient mask
+}
+psDPolynomial1D;
+
+/** Double-precision two-dimensional polynomial */
+typedef struct
+{
+    psPolynomialType type;             ///< Polynomial type
+    psS32 nX;                            ///< Number of terms in x
+    psS32 nY;                            ///< Number of terms in y
+    psF64 **coeff;                    ///< Coefficients
+    psF64 **coeffErr;                 ///< Error in coefficients
+    psU8 **mask;                       ///< Coefficients mask
+}
+psDPolynomial2D;
+
+/** Double-precision three-dimensional polynomial */
+typedef struct
+{
+    psPolynomialType type;             ///< Polynomial type
+    psS32 nX;                            ///< Number of terms in x
+    psS32 nY;                            ///< Number of terms in y
+    psS32 nZ;                            ///< Number of terms in z
+    psF64 ***coeff;                   ///< Coefficients
+    psF64 ***coeffErr;                ///< Error in coefficients
+    psU8 ***mask;                      ///< Coefficient mask
+}
+psDPolynomial3D;
+
+/** Double-precision four-dimensional polynomial */
+typedef struct
+{
+    psPolynomialType type;             ///< Polynomial type
+    psS32 nW;                            ///< Number of terms in w
+    psS32 nX;                            ///< Number of terms in x
+    psS32 nY;                            ///< Number of terms in y
+    psS32 nZ;                            ///< Number of terms in z
+    psF64 ****coeff;                  ///< Coefficients
+    psF64 ****coeffErr;               ///< Error in coefficients
+    psU8 ****mask;                     ///< Coefficients mask
+}
+psDPolynomial4D;
+
+/** Allocates a double-precision 1-D polynomial structure with n terms
+ *
+ *  @return  psPolynomial1D*    new double-precision 1-D polynomial struct
+ */
+psDPolynomial1D* psDPolynomial1DAlloc(
+    psS32 n,                             ///< Number of terms
+    psPolynomialType type              ///< Polynomial Type
+);
+
+/** Allocates a double-precision 2-D polynomial structure
+ *
+ *  @return  psPolynomial2D*    new double-precision 2-D polynomial struct
+ */
+psDPolynomial2D* psDPolynomial2DAlloc(
+    psS32 nX,                            ///< Number of terms in x
+    psS32 nY,                            ///< Number of terms in y
+    psPolynomialType type              ///< Polynomial Type
+);
+
+/** Allocates a double-precision 3-D polynomial structure
+ *
+ *  @return  psPolynomial3D*    new double-precision 3-D polynomial struct
+ */
+psDPolynomial3D* psDPolynomial3DAlloc(
+    psS32 nX,                            ///< Number of terms in x
+    psS32 nY,                            ///< Number of terms in y
+    psS32 nZ,                            ///< Number of terms in z
+    psPolynomialType type              ///< Polynomial Type
+);
+
+/** Allocates a double-precision 4-D polynomial structure
+ *
+ *  @return  psPolynomial4D*    new double-precision 4-D polynomial struct
+ */
+psDPolynomial4D* psDPolynomial4DAlloc(
+    psS32 nW,                            ///< Number of terms in w
+    psS32 nX,                            ///< Number of terms in x
+    psS32 nY,                            ///< Number of terms in y
+    psS32 nZ,                            ///< Number of terms in z
+    psPolynomialType type              ///< Polynomial Type
+);
+
+/** Evaluates a double-precision 1-D polynomial at specific coordinates.
+ *
+ *  @return psF32    result of polynomial at given location
+ */
+psF64 psDPolynomial1DEval(
+    const psDPolynomial1D* myPoly,      ///< Coefficients for the polynomial
+    psF64 x                          ///< Value at which to evaluate
+);
+
+/** Evaluates a double-precision 2-D polynomial at specific coordinates.
+ *
+ *  @return psF32    result of polynomial at given location
+ */
+psF64 psDPolynomial2DEval(
+    const psDPolynomial2D* myPoly,       ///< Coefficients for the polynomial
+    psF64 x,                           ///< Value x at which to evaluate
+    psF64 y            ///< Value y at which to evaluate
+);
+
+/** Evaluates a double-precision 3-D polynomial at specific coordinates.
+ *
+ *  @return psF32    result of polynomial at given location
+ */
+psF64 psDPolynomial3DEval(
+    const psDPolynomial3D* myPoly,      ///< Coefficients for the polynomial
+    psF64 x,                          ///< Value x at which to evaluate
+    psF64 y,                          ///< Value y at which to evaluate
+    psF64 z     ///< Value z at which to evaluate
+);
+
+/** Evaluates a double-precision 4-D polynomial at specific coordinates.
+ *
+ *  @return psF32    result of polynomial at given location
+ */
+psF64 psDPolynomial4DEval(
+    const psDPolynomial4D* myPoly,      ///< Coefficients for the polynomial
+    psF64 w,                          ///< Value w at which to evaluate
+    psF64 x,                          ///< Value x at which to evaluate
+    psF64 y,                          ///< Value y at which to evaluate
+    psF64 z     ///< Value z at which to evaluate
+);
+
+psVector *psDPolynomial1DEvalVector(
+    const psDPolynomial1D *myPoly, ///< Coefficients for the polynomial
+    const psVector *x             ///< x locations at which to evaluate
+);
+
+psVector *psDPolynomial2DEvalVector(
+    const psDPolynomial2D *myPoly,  ///< Coefficients for the polynomial
+    const psVector *x,             ///< x locations at which to evaluate
+    const psVector *y             ///< y locations at which to evaluate
+);
+
+psVector *psDPolynomial3DEvalVector(
+    const psDPolynomial3D *myPoly,  ///< Coefficients for the polynomial
+    const psVector *x,             ///< x locations at which to evaluate
+    const psVector *y,             ///< y locations at which to evaluate
+    const psVector *z             ///< z locations at which to evaluate
+);
+
+psVector *psDPolynomial4DEvalVector(
+    const psDPolynomial4D *myPoly,  ///< Coefficients for the polynomial
+    const psVector *w,             ///< w locations at which to evaluate
+    const psVector *x,             ///< x locations at which to evaluate
+    const psVector *y,             ///< y locations at which to evaluate
+    const psVector *z             ///< z locations at which to evaluate
+);
+
+
+
+typedef struct
+{
+    psS32 n;                       ///< The number of spline polynomials
+    psPolynomial1D **spline;       ///< An array of n pointers to the spline polynomials
+    psF32 *p_psDeriv2;             ///< For cubic splines, the second derivative at each domain point.  Size is n+1.
+    psF32 *domains;                ///< The boundaries between each spline piece.  Size is n+1.
+    psVector *knots;               ///< The boundaries between each spline piece.  Size is n+1.
+}
+psSpline1D;
+
+psSpline1D *psSpline1DAlloc(psS32 n,
+                            psS32 order,
+                            psF32 min,
+                            psF32 max);
+
+psSpline1D *psSpline1DAllocGeneric(const psVector *bounds,
+                                   psS32 order);
+
+psF32 psSpline1DEval(
+    const psSpline1D *spline,
+    psF32 x
+);
+
+psVector *psSpline1DEvalVector(
+    const psSpline1D *spline,
+    const psVector *x
+);
+
+psS32 p_psVectorBinDisect(psVector *bins,
+                          psScalar *x);
+
+psScalar *p_psVectorInterpolate(psVector *domain,
+                                psVector *range,
+                                psS32 order,
+                                psScalar *x);
+
+#if 0
+psF32 p_psNRSpline1DEval(psSpline1D *spline,
+                         const psVector* x,
+                         const psVector* y,
+                         psF32 X);
+#endif
+
+/* \} */// End of MathGroup Functions
+
+#endif
+
Index: /tags/ipp-1-X/bug123/psLib/src/math/psRandom.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/math/psRandom.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/math/psRandom.c	(revision 22331)
@@ -0,0 +1,140 @@
+/** @file psRandom.c
+*  \brief Random Number Generators
+*  \ingroup Math
+*
+*  This file will hold the functions which allocate, free,
+*  and evaluate random number Generators.
+*
+*  @ingroup Math
+*
+*  @author GLG, MHPCC
+*
+*  @version $Revision: 1.7 $ $Name: not supported by cvs2svn $
+*  @date $Date: 2005-02-17 19:26:23 $
+*
+*  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+*/
+
+#include <stdio.h>
+#include <stdbool.h>
+#include <float.h>
+#include <math.h>
+#include <time.h>
+#include <gsl/gsl_rng.h>
+#include <gsl/gsl_randist.h>
+
+#include "psMemory.h"
+#include "psRandom.h"
+#include "psScalar.h"
+#include "psError.h"
+#include "psTrace.h"
+#include "psLogMsg.h"
+#include "psConstants.h"
+#include "psDataManipErrors.h"
+
+psU64 p_psRandomGetSystemSeed()
+{
+    FILE*  fd;
+    psU64  seedVal = 0;
+    time_t timeVal;
+
+    fd = fopen("/dev/urandom","r");
+    if(fd == NULL) {
+        // Read system clock to get seed
+        seedVal = (psU64)time(&timeVal);
+    } else {
+        // Read urandom to get seed
+        fread(&seedVal, sizeof(psU64),1,fd);
+        // Close file
+        fclose(fd);
+    }
+
+    // Send log message of the system seed value used
+    psLogMsg(__func__,PS_LOG_INFO,"System random seed value used  seed = %llX hex",seedVal);
+
+    return seedVal;
+}
+
+psRandom *psRandomAlloc(psRandomType type,
+                        psU64 seed)
+{
+    gsl_rng   *r      = NULL;
+    psRandom  *myRNG  = NULL;
+
+    switch (type) {
+    case PS_RANDOM_TAUS:
+        myRNG = (psRandom*)psAlloc(sizeof(psRandom));
+        r = gsl_rng_alloc(gsl_rng_taus);
+        myRNG->gsl = r;
+        if(seed == 0) {
+            gsl_rng_set(myRNG->gsl,p_psRandomGetSystemSeed());
+        }
+        break;
+
+    default:
+        psError(PS_ERR_UNEXPECTED_NULL,
+                true,
+                PS_ERRORTEXT_psRandom_UNKNOWN_RANDFOM_NUMBER_GENERATOR_TYPE);
+        break;
+    }
+    return(myRNG);
+}
+
+void psRandomReset(psRandom *rand,
+                   psU64 seed)
+{
+    // Check null psRandom
+    if(rand==NULL) {
+        psError(PS_ERR_UNEXPECTED_NULL,
+                true,
+                PS_ERRORTEXT_psRandom_NULL_RANDOM_VAR);
+    } else {
+        // Check seed value to see if system seed should be used
+        if(seed == 0) {
+            gsl_rng_set(rand->gsl,p_psRandomGetSystemSeed());
+        } else {
+            gsl_rng_set(rand->gsl, seed);
+        }
+    }
+}
+
+psF64 psRandomUniform(const psRandom *r)
+{
+    // Check null psRandom variable
+    if(r == NULL) {
+        psError(PS_ERR_UNEXPECTED_NULL,
+                true,
+                PS_ERRORTEXT_psRandom_NULL_RANDOM_VAR);
+        return(0);
+    } else {
+        return(gsl_rng_uniform(r->gsl));
+    }
+}
+
+psF64 psRandomGaussian(const psRandom *r)
+{
+    // Check null psRandom variable
+    if(r == NULL) {
+        psError(PS_ERR_UNEXPECTED_NULL,
+                true,
+                PS_ERRORTEXT_psRandom_NULL_RANDOM_VAR);
+        return(0);
+    } else {
+        // XXX: What should sigma be?
+        return(gsl_ran_gaussian(r->gsl, 1.0));
+    }
+}
+
+psF64 psRandomPoisson(const psRandom *r, psF64 mean)
+{
+    // Check null psRandom variable
+    if(r == NULL) {
+        psError(PS_ERR_UNEXPECTED_NULL,
+                true,
+                PS_ERRORTEXT_psRandom_NULL_RANDOM_VAR);
+        return(0);
+    } else {
+        return((psF64) gsl_ran_poisson(r->gsl, mean));
+    }
+}
+
Index: /tags/ipp-1-X/bug123/psLib/src/math/psRandom.h
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/math/psRandom.h	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/math/psRandom.h	(revision 22331)
@@ -0,0 +1,59 @@
+/** @file psRandom.h
+*  \brief Random Number Generators
+*  \ingroup Math
+*
+*  This file will hold the prototypes for procedures which allocate, free,
+*  and evaluate random number Generators.
+*
+*  @ingroup Math
+*
+*  @author GLG, MHPCC
+*
+*  @version $Revision: 1.3 $ $Name: not supported by cvs2svn $
+*  @date $Date: 2005-02-17 19:26:23 $
+*
+*  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+*/
+
+#if !defined(PS_RANDOM_H)
+#define PS_RANDOM_H
+
+#include <stdio.h>
+#include <stdbool.h>
+#include <float.h>
+#include <math.h>
+
+#include "psVector.h"
+#include "psScalar.h"
+#include <gsl/gsl_rng.h>
+#include <gsl/gsl_randist.h>
+
+/** \addtogroup Math
+ *  \{
+ */
+
+typedef enum {
+    PS_RANDOM_TAUS    ///< A maximally equidistributed combined Tausworthe generator.
+} psRandomType;
+
+typedef struct
+{
+    psRandomType type; ///< The type of RNG
+    gsl_rng *gsl; ///< The RNG itself
+}
+psRandom;
+
+psRandom *psRandomAlloc(psRandomType type,
+                        psU64 seed);
+
+void psRandomReset(psRandom *rand,
+                   psU64 seed);
+
+psF64 psRandomUniform(const psRandom *r);
+psF64 psRandomGaussian(const psRandom *r);
+psF64 psRandomPoisson(const psRandom *r, psF64 mean);
+
+/* \} */// End of MathGroup Functions
+
+#endif
+
Index: /tags/ipp-1-X/bug123/psLib/src/math/psSpline.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/math/psSpline.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/math/psSpline.c	(revision 22331)
@@ -0,0 +1,2174 @@
+/** @file  psFunctions.c
+ *
+ *  @brief Contains basic function allocation, deallocation, and evaluation
+ *         routines.
+ *
+ *  This file will hold the functions for allocated, freeing, and evaluating
+ *  polynomials.  It also contains a Gaussian functions.
+ *
+ *  @version $Revision: 1.98 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-04-19 04:16:02 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ *
+ *  XXX: What happens if the polyEval functions are called with data of the wrong
+ *       type?
+ *  XXX: Should the "coeffErr[]" be used as well?  Bug ???.  Ignore coeffErr
+ *
+ *  XXX: In the various polyAlloc(n) functions, n is really the order of the
+ *  polynomial plus 1.  To create a 2nd-order polynomial, n == 3.
+ */
+/*****************************************************************************/
+/*  INCLUDE FILES                                                            */
+/*****************************************************************************/
+#include <gsl/gsl_rng.h>
+#include <gsl/gsl_randist.h>
+
+#include <stdio.h>
+#include <stdbool.h>
+#include <float.h>
+#include <math.h>
+
+#include "psMemory.h"
+#include "psVector.h"
+#include "psScalar.h"
+#include "psTrace.h"
+#include "psError.h"
+#include "psLogMsg.h"
+#include "psFunctions.h"
+#include "psConstants.h"
+
+#include "psDataManipErrors.h"
+
+/*****************************************************************************/
+/* DEFINE STATEMENTS                                                         */
+/*****************************************************************************/
+
+/*****************************************************************************/
+/* TYPE DEFINITIONS                                                          */
+/*****************************************************************************/
+static void polynomial1DFree(psPolynomial1D* myPoly);
+static void polynomial2DFree(psPolynomial2D* myPoly);
+static void polynomial3DFree(psPolynomial3D* myPoly);
+static void polynomial4DFree(psPolynomial4D* myPoly);
+static void dPolynomial1DFree(psDPolynomial1D* myPoly);
+static void dPolynomial2DFree(psDPolynomial2D* myPoly);
+static void dPolynomial3DFree(psDPolynomial3D* myPoly);
+static void dPolynomial4DFree(psDPolynomial4D* myPoly);
+static void spline1DFree(psSpline1D *tmpSpline);
+static psS32 vectorBinDisectF32(psF32 *bins,psS32 numBins,psF32 x);
+static psS32 vectorBinDisectS32(psS32 *bins,psS32 numBins,psS32 x);
+
+/*****************************************************************************/
+/* GLOBAL VARIABLES                                                          */
+/*****************************************************************************/
+
+// None
+
+/*****************************************************************************/
+/* FILE STATIC VARIABLES                                                     */
+/*****************************************************************************/
+
+// None
+
+/*****************************************************************************/
+/* FUNCTION IMPLEMENTATION - LOCAL                                           */
+/*****************************************************************************/
+
+static void spline1DFree(psSpline1D *tmpSpline)
+{
+    psS32 i;
+
+    if (tmpSpline == NULL) {
+        return;
+    }
+
+    if (tmpSpline->spline != NULL) {
+        for (i=0;i<tmpSpline->n;i++) {
+            psFree((tmpSpline->spline)[i]);
+        }
+        psFree(tmpSpline->spline);
+    }
+
+    if (tmpSpline->p_psDeriv2 != NULL) {
+        psFree(tmpSpline->p_psDeriv2);
+    }
+    psFree(tmpSpline->knots);
+
+    return;
+}
+
+static void polynomial1DFree(psPolynomial1D* myPoly)
+{
+    psFree(myPoly->coeff);
+    psFree(myPoly->coeffErr);
+    psFree(myPoly->mask);
+}
+
+static void polynomial2DFree(psPolynomial2D* myPoly)
+{
+    psS32 x = 0;
+
+    for (x = 0; x < myPoly->nX; x++) {
+        psFree(myPoly->coeff[x]);
+        psFree(myPoly->coeffErr[x]);
+        psFree(myPoly->mask[x]);
+    }
+    psFree(myPoly->coeff);
+    psFree(myPoly->coeffErr);
+    psFree(myPoly->mask);
+}
+
+static void polynomial3DFree(psPolynomial3D* myPoly)
+{
+    psS32 x = 0;
+    psS32 y = 0;
+
+    for (x = 0; x < myPoly->nX; x++) {
+        for (y = 0; y < myPoly->nY; y++) {
+            psFree(myPoly->coeff[x][y]);
+            psFree(myPoly->coeffErr[x][y]);
+            psFree(myPoly->mask[x][y]);
+        }
+        psFree(myPoly->coeff[x]);
+        psFree(myPoly->coeffErr[x]);
+        psFree(myPoly->mask[x]);
+    }
+
+    psFree(myPoly->coeff);
+    psFree(myPoly->coeffErr);
+    psFree(myPoly->mask);
+}
+
+static void polynomial4DFree(psPolynomial4D* myPoly)
+{
+    psS32 w = 0;
+    psS32 x = 0;
+    psS32 y = 0;
+
+    for (w = 0; w < myPoly->nW; w++) {
+        for (x = 0; x < myPoly->nX; x++) {
+            for (y = 0; y < myPoly->nY; y++) {
+                psFree(myPoly->coeff[w][x][y]);
+                psFree(myPoly->coeffErr[w][x][y]);
+                psFree(myPoly->mask[w][x][y]);
+            }
+            psFree(myPoly->coeff[w][x]);
+            psFree(myPoly->coeffErr[w][x]);
+            psFree(myPoly->mask[w][x]);
+        }
+        psFree(myPoly->coeff[w]);
+        psFree(myPoly->coeffErr[w]);
+        psFree(myPoly->mask[w]);
+    }
+
+    psFree(myPoly->coeff);
+    psFree(myPoly->coeffErr);
+    psFree(myPoly->mask);
+}
+
+static void dPolynomial1DFree(psDPolynomial1D* myPoly)
+{
+    psFree(myPoly->coeff);
+    psFree(myPoly->coeffErr);
+    psFree(myPoly->mask);
+}
+
+static void dPolynomial2DFree(psDPolynomial2D* myPoly)
+{
+    //printf("dPolynomial2DFree(): HMMM: myPoly->nX is %d\n", myPoly->nX);
+    //printf("dPolynomial2DFree(): HMMM: myPoly->nY is %d\n", myPoly->nY);
+    for (psS32 x = 0; x < myPoly->nX; x++) {
+        psFree(myPoly->coeff[x]);
+        psFree(myPoly->coeffErr[x]);
+        psFree(myPoly->mask[x]);
+    }
+    psFree(myPoly->coeff);
+    psFree(myPoly->coeffErr);
+    psFree(myPoly->mask);
+}
+
+static void dPolynomial3DFree(psDPolynomial3D* myPoly)
+{
+    psS32 x = 0;
+    psS32 y = 0;
+
+    for (x = 0; x < myPoly->nX; x++) {
+        for (y = 0; y < myPoly->nY; y++) {
+            psFree(myPoly->coeff[x][y]);
+            psFree(myPoly->coeffErr[x][y]);
+            psFree(myPoly->mask[x][y]);
+        }
+        psFree(myPoly->coeff[x]);
+        psFree(myPoly->coeffErr[x]);
+        psFree(myPoly->mask[x]);
+    }
+
+    psFree(myPoly->coeff);
+    psFree(myPoly->coeffErr);
+    psFree(myPoly->mask);
+}
+
+static void dPolynomial4DFree(psDPolynomial4D* myPoly)
+{
+    psS32 w = 0;
+    psS32 x = 0;
+    psS32 y = 0;
+
+    for (w = 0; w < myPoly->nW; w++) {
+        for (x = 0; x < myPoly->nX; x++) {
+            for (y = 0; y < myPoly->nY; y++) {
+                psFree(myPoly->coeff[w][x][y]);
+                psFree(myPoly->coeffErr[w][x][y]);
+                psFree(myPoly->mask[w][x][y]);
+            }
+            psFree(myPoly->coeff[w][x]);
+            psFree(myPoly->coeffErr[w][x]);
+            psFree(myPoly->mask[w][x]);
+        }
+        psFree(myPoly->coeff[w]);
+        psFree(myPoly->coeffErr[w]);
+        psFree(myPoly->mask[w]);
+    }
+
+    psFree(myPoly->coeff);
+    psFree(myPoly->coeffErr);
+    psFree(myPoly->mask);
+}
+
+/*****************************************************************************
+createChebyshevPolys(n): this routine takes as input the required order n,
+and returns as output as a pointer to an array of n psPolynomial1D
+structures, corresponding to the first n Chebyshev polynomials.
+ 
+XXX: The output should be static since the Chebyshev polynomials might be
+used frequently and the data structure created here does not contain the
+outer coefficients of the Chebyshev polynomials.
+ *****************************************************************************/
+static psPolynomial1D **createChebyshevPolys(psS32 maxChebyPoly)
+{
+    PS_INT_CHECK_NON_NEGATIVE(maxChebyPoly, NULL);
+
+    psPolynomial1D **chebPolys = NULL;
+
+    chebPolys = (psPolynomial1D **) psAlloc(maxChebyPoly * sizeof(psPolynomial1D *));
+    for (psS32 i = 0; i < maxChebyPoly; i++) {
+        chebPolys[i] = psPolynomial1DAlloc(i + 1, PS_POLYNOMIAL_ORD);
+    }
+
+    // Create the Chebyshev polynomials.
+    // Polynomial i has i-th order.
+    chebPolys[0]->coeff[0] = 1;
+
+    // XXX: Bug 296
+    if (maxChebyPoly > 1) {
+        chebPolys[1]->coeff[1] = 1;
+    }
+    for (psS32 i = 2; i < maxChebyPoly; i++) {
+        for (psS32 j = 0; j < chebPolys[i - 1]->n; j++) {
+            chebPolys[i]->coeff[j + 1] = 2 * chebPolys[i - 1]->coeff[j];
+        }
+        for (psS32 j = 0; j < chebPolys[i - 2]->n; j++) {
+            chebPolys[i]->coeff[j] -= chebPolys[i - 2]->coeff[j];
+        }
+    }
+
+    return (chebPolys);
+}
+
+/*****************************************************************************
+    Polynomial coefficients will be accessed in [w][x][y][z] fashion.
+ *****************************************************************************/
+static psF32 ordPolynomial1DEval(psF32 x, const psPolynomial1D* myPoly)
+{
+    psS32 loop_x = 0;
+    psF32 polySum = 0.0;
+    psF32 xSum = 1.0;
+
+    psTrace(".psLib.dataManip.psFunctions.ordPolynomial1DEval", 4,
+            "---- Calling ordPolynomial1DEval(%f)\n", x);
+    psTrace(".psLib.dataManip.psFunctions.ordPolynomial1DEval", 4,
+            "Polynomial order is %d\n", myPoly->n);
+    for (loop_x = 0; loop_x < myPoly->n; loop_x++) {
+        psTrace(".psLib.dataManip.psFunctions.ordPolynomial1DEval", 4,
+                "Polynomial coeff[%d] is %f\n", loop_x, myPoly->coeff[loop_x]);
+    }
+
+    for (loop_x = 0; loop_x < myPoly->n; loop_x++) {
+        if (myPoly->mask[loop_x] == 0) {
+            psTrace(".psLib.dataManip.psFunctions.ordPolynomial1DEval", 10,
+                    "polysum+= sum*coeff [%f+= (%f * %f)\n", polySum, xSum, myPoly->coeff[loop_x]);
+            polySum += xSum * myPoly->coeff[loop_x];
+        }
+        xSum *= x;
+    }
+
+    return(polySum);
+}
+
+// XXX: You can do this without having to psAlloc() vector d.
+// XXX: How does the mask vector effect Crenshaw's formula?
+// XXX: We assume that x is scaled between -1.0 and 1.0;
+static psF32 chebPolynomial1DEval(psF32 x, const psPolynomial1D* myPoly)
+{
+    PS_FLOAT_CHECK_RANGE(x, -1.0, 1.0, 0.0);
+    psVector *d;
+    psS32 n;
+    psS32 i;
+    psF32 tmp;
+
+    n = myPoly->n;
+    d = psVectorAlloc(n, PS_TYPE_F32);
+    if(myPoly->mask[n-1] == 0) {
+        d->data.F32[n-1] = myPoly->coeff[n-1];
+    } else {
+        d->data.F32[n-1] = 0.0;
+    }
+    d->data.F32[n-2] = (2.0 * x * d->data.F32[n-1]);
+    if(myPoly->mask[n-2] == 0) {
+        d->data.F32[n-2] += myPoly->coeff[n-2];
+    }
+    for (i=n-3;i>=1;i--) {
+        d->data.F32[i] = (2.0 * x * d->data.F32[i+1]) -
+                         (d->data.F32[i+2]);
+        if(myPoly->mask[i] == 0) {
+            d->data.F32[i] += myPoly->coeff[i];
+        }
+    }
+
+    tmp = (x * d->data.F32[1]) -
+          (d->data.F32[2]);
+    if(myPoly->mask[0] == 0) {
+        tmp += (0.5 * myPoly->coeff[0]);
+    }
+    psFree(d);
+    return(tmp);
+
+    /*
+
+    psS32 n;
+    psS32 i;
+    psF32 tmp;
+    psPolynomial1D **chebPolys = NULL;
+
+    n = myPoly->n;
+    chebPolys = createChebyshevPolys(n);
+
+    tmp = 0.0;
+    for (i=0;i<myPoly->n;i++) {
+        tmp+= (myPoly->coeff[i] * psPolynomial1DEval(x, chebPolys[i]));
+    }
+    tmp-= (myPoly->coeff[0]/2.0);
+
+
+    return(tmp);
+    */
+}
+
+static psF32 ordPolynomial2DEval(psF32 x,
+                                 psF32 y,
+                                 const psPolynomial2D* myPoly)
+{
+    PS_POLY_CHECK_NULL(myPoly, NAN);
+
+    psS32 loop_x = 0;
+    psS32 loop_y = 0;
+    psF32 polySum = 0.0;
+    psF32 xSum = 1.0;
+    psF32 ySum = 1.0;
+
+    for (loop_x = 0; loop_x < myPoly->nX; loop_x++) {
+        ySum = xSum;
+        for (loop_y = 0; loop_y < myPoly->nY; loop_y++) {
+            if (myPoly->mask[loop_x][loop_y] == 0) {
+                polySum += ySum * myPoly->coeff[loop_x][loop_y];
+            }
+            ySum *= y;
+        }
+        xSum *= x;
+    }
+
+    return(polySum);
+}
+
+static psF32 chebPolynomial2DEval(psF32 x, psF32 y, const psPolynomial2D* myPoly)
+{
+    PS_FLOAT_CHECK_RANGE(x, -1.0, 1.0, 0.0);
+    PS_FLOAT_CHECK_RANGE(y, -1.0, 1.0, 0.0);
+    PS_POLY_CHECK_NULL(myPoly, NAN);
+
+    psS32 loop_x = 0;
+    psS32 loop_y = 0;
+    psS32 i = 0;
+    psF32 polySum = 0.0;
+    psPolynomial1D* *chebPolys = NULL;
+    psS32 maxChebyPoly = 0;
+
+    // Determine how many Chebyshev polynomials
+    // are needed, then create them.
+    maxChebyPoly = myPoly->nX;
+    if (myPoly->nY > maxChebyPoly) {
+        maxChebyPoly = myPoly->nY;
+    }
+    chebPolys = createChebyshevPolys(maxChebyPoly);
+
+    for (loop_x = 0; loop_x < myPoly->nX; loop_x++) {
+        for (loop_y = 0; loop_y < myPoly->nY; loop_y++) {
+            if (myPoly->mask[loop_x][loop_y] == 0) {
+                polySum += myPoly->coeff[loop_x][loop_y] *
+                           psPolynomial1DEval(chebPolys[loop_x], x) *
+                           psPolynomial1DEval(chebPolys[loop_y], y);
+            }
+        }
+    }
+    for (i=0;i<maxChebyPoly;i++) {
+        psFree(chebPolys[i]);
+    }
+    psFree(chebPolys);
+    return(polySum);
+}
+
+static psF32 ordPolynomial3DEval(psF32 x, psF32 y, psF32 z, const psPolynomial3D* myPoly)
+{
+    psS32 loop_x = 0;
+    psS32 loop_y = 0;
+    psS32 loop_z = 0;
+    psF32 polySum = 0.0;
+    psF32 xSum = 1.0;
+    psF32 ySum = 1.0;
+    psF32 zSum = 1.0;
+
+    for (loop_x = 0; loop_x < myPoly->nX; loop_x++) {
+        ySum = xSum;
+        for (loop_y = 0; loop_y < myPoly->nY; loop_y++) {
+            zSum = ySum;
+            for (loop_z = 0; loop_z < myPoly->nZ; loop_z++) {
+                if (myPoly->mask[loop_x][loop_y][loop_z] == 0) {
+                    polySum += zSum * myPoly->coeff[loop_x][loop_y][loop_z];
+                }
+                zSum *= z;
+            }
+            ySum *= y;
+        }
+        xSum *= x;
+    }
+
+    return(polySum);
+}
+
+static psF32 chebPolynomial3DEval(psF32 x, psF32 y, psF32 z, const psPolynomial3D* myPoly)
+{
+    PS_FLOAT_CHECK_RANGE(x, -1.0, 1.0, 0.0);
+    PS_FLOAT_CHECK_RANGE(y, -1.0, 1.0, 0.0);
+    PS_FLOAT_CHECK_RANGE(z, -1.0, 1.0, 0.0);
+    psS32 loop_x = 0;
+    psS32 loop_y = 0;
+    psS32 loop_z = 0;
+    psS32 i = 0;
+    psF32 polySum = 0.0;
+    psPolynomial1D* *chebPolys = NULL;
+    psS32 maxChebyPoly = 0;
+
+    // Determine how many Chebyshev polynomials
+    // are needed, then create them.
+    maxChebyPoly = myPoly->nX;
+    if (myPoly->nY > maxChebyPoly) {
+        maxChebyPoly = myPoly->nY;
+    }
+    if (myPoly->nZ > maxChebyPoly) {
+        maxChebyPoly = myPoly->nZ;
+    }
+    chebPolys = createChebyshevPolys(maxChebyPoly);
+
+    for (loop_x = 0; loop_x < myPoly->nX; loop_x++) {
+        for (loop_y = 0; loop_y < myPoly->nY; loop_y++) {
+            for (loop_z = 0; loop_z < myPoly->nZ; loop_z++) {
+                if (myPoly->mask[loop_x][loop_y][loop_z] == 0) {
+                    polySum += myPoly->coeff[loop_x][loop_y][loop_z] *
+                               psPolynomial1DEval(chebPolys[loop_x], x) *
+                               psPolynomial1DEval(chebPolys[loop_y], y) *
+                               psPolynomial1DEval(chebPolys[loop_z], z);
+                }
+            }
+        }
+    }
+
+    for (i=0;i<maxChebyPoly;i++) {
+        psFree(chebPolys[i]);
+    }
+    psFree(chebPolys);
+    return(polySum);
+}
+
+static psF32 ordPolynomial4DEval(psF32 w, psF32 x, psF32 y, psF32 z, const psPolynomial4D* myPoly)
+{
+    psS32 loop_w = 0;
+    psS32 loop_x = 0;
+    psS32 loop_y = 0;
+    psS32 loop_z = 0;
+    psF32 polySum = 0.0;
+    psF32 wSum = 1.0;
+    psF32 xSum = 1.0;
+    psF32 ySum = 1.0;
+    psF32 zSum = 1.0;
+
+    for (loop_w = 0; loop_w < myPoly->nW; loop_w++) {
+        xSum = wSum;
+        for (loop_x = 0; loop_x < myPoly->nX; loop_x++) {
+            ySum = xSum;
+            for (loop_y = 0; loop_y < myPoly->nY; loop_y++) {
+                zSum = ySum;
+                for (loop_z = 0; loop_z < myPoly->nZ; loop_z++) {
+                    if (myPoly->mask[loop_w][loop_x][loop_y][loop_z] == 0) {
+                        polySum += zSum * myPoly->coeff[loop_w][loop_x][loop_y][loop_z];
+                    }
+                    zSum *= z;
+                }
+                ySum *= y;
+            }
+            xSum *= x;
+        }
+        wSum *= w;
+    }
+
+    return(polySum);
+}
+
+static psF32 chebPolynomial4DEval(psF32 w, psF32 x, psF32 y, psF32 z, const psPolynomial4D* myPoly)
+{
+    PS_FLOAT_CHECK_RANGE(w, -1.0, 1.0, 0.0);
+    PS_FLOAT_CHECK_RANGE(x, -1.0, 1.0, 0.0);
+    PS_FLOAT_CHECK_RANGE(y, -1.0, 1.0, 0.0);
+    PS_FLOAT_CHECK_RANGE(z, -1.0, 1.0, 0.0);
+    psS32 loop_w = 0;
+    psS32 loop_x = 0;
+    psS32 loop_y = 0;
+    psS32 loop_z = 0;
+    psS32 i = 0;
+    psF32 polySum = 0.0;
+    psPolynomial1D* *chebPolys = NULL;
+    psS32 maxChebyPoly = 0;
+
+    // Determine how many Chebyshev polynomials
+    // are needed, then create them.
+    maxChebyPoly = myPoly->nW;
+    if (myPoly->nX > maxChebyPoly) {
+        maxChebyPoly = myPoly->nX;
+    }
+    if (myPoly->nY > maxChebyPoly) {
+        maxChebyPoly = myPoly->nY;
+    }
+    if (myPoly->nZ > maxChebyPoly) {
+        maxChebyPoly = myPoly->nZ;
+    }
+    chebPolys = createChebyshevPolys(maxChebyPoly);
+
+    for (loop_w = 0; loop_w < myPoly->nW; loop_w++) {
+        for (loop_x = 0; loop_x < myPoly->nX; loop_x++) {
+            for (loop_y = 0; loop_y < myPoly->nY; loop_y++) {
+                for (loop_z = 0; loop_z < myPoly->nZ; loop_z++) {
+                    if (myPoly->mask[loop_w][loop_x][loop_y][loop_z] == 0) {
+                        polySum += myPoly->coeff[loop_w][loop_x][loop_y][loop_z] *
+                                   psPolynomial1DEval(chebPolys[loop_w], w) *
+                                   psPolynomial1DEval(chebPolys[loop_x], x) *
+                                   psPolynomial1DEval(chebPolys[loop_y], y) *
+                                   psPolynomial1DEval(chebPolys[loop_z], z);
+                    }
+                }
+            }
+        }
+    }
+
+    for (i=0;i<maxChebyPoly;i++) {
+        psFree(chebPolys[i]);
+    }
+    psFree(chebPolys);
+    return(polySum);
+}
+
+/*****************************************************************************
+    Polynomial coefficients will be accessed in [w][x][y][z] fashion.
+ *****************************************************************************/
+static psF64 dOrdPolynomial1DEval(psF64 x, const psDPolynomial1D* myPoly)
+{
+    psS32 loop_x = 0;
+    psF64 polySum = 0.0;
+    psF64 xSum = 1.0;
+
+    for (loop_x = 0; loop_x < myPoly->n; loop_x++) {
+        if (myPoly->mask[loop_x] == 0) {
+            polySum += xSum * myPoly->coeff[loop_x];
+        }
+        xSum *= x;
+    }
+
+    return(polySum);
+}
+
+// XXX: You can do this without having to psAlloc() vector d.
+// XXX: How does the mask vector effect Crenshaw's formula?
+static psF64 dChebPolynomial1DEval(psF64 x, const psDPolynomial1D* myPoly)
+{
+    PS_FLOAT_CHECK_RANGE(x, -1.0, 1.0, 0.0);
+    psVector *d;
+    psS32 n;
+    psS32 i;
+    psF64 tmp;
+
+    n = myPoly->n;
+    d = psVectorAlloc(n, PS_TYPE_F64);
+    if(myPoly->mask[n-1] == 0) {
+        d->data.F64[n-1] = myPoly->coeff[n-1];
+    } else {
+        d->data.F64[n-1] = 0.0;
+    }
+    d->data.F64[n-2] = (2.0 * x * d->data.F64[n-1]);
+    if(myPoly->mask[n-2] == 0) {
+        d->data.F64[n-2] += myPoly->coeff[n-2];
+    }
+    for (i=n-3;i>=1;i--) {
+        d->data.F64[i] = (2.0 * x * d->data.F64[i+1]) -
+                         (d->data.F64[i+2]);
+        if(myPoly->mask[i] == 0) {
+            d->data.F64[i] += myPoly->coeff[i];
+        }
+    }
+
+    tmp = (x * d->data.F64[1]) -
+          (d->data.F64[2]);
+    if(myPoly->mask[0] == 0) {
+        tmp += (0.5 * myPoly->coeff[0]);
+    }
+
+    psFree(d);
+    return(tmp);
+}
+
+static psF64 dOrdPolynomial2DEval(psF64 x, psF64 y, const psDPolynomial2D* myPoly)
+{
+    psS32 loop_x = 0;
+    psS32 loop_y = 0;
+    psF64 polySum = 0.0;
+    psF64 xSum = 1.0;
+    psF64 ySum = 1.0;
+
+    for (loop_x = 0; loop_x < myPoly->nX; loop_x++) {
+        ySum = xSum;
+        for (loop_y = 0; loop_y < myPoly->nY; loop_y++) {
+            if (myPoly->mask[loop_x][loop_y] == 0) {
+                polySum += ySum * myPoly->coeff[loop_x][loop_y];
+            }
+            ySum *= y;
+        }
+        xSum *= x;
+    }
+
+    return(polySum);
+}
+
+static psF64 dChebPolynomial2DEval(psF64 x, psF64 y, const psDPolynomial2D* myPoly)
+{
+    PS_FLOAT_CHECK_RANGE(x, -1.0, 1.0, 0.0);
+    PS_FLOAT_CHECK_RANGE(y, -1.0, 1.0, 0.0);
+    psS32 loop_x = 0;
+    psS32 loop_y = 0;
+    psS32 i = 0;
+    psF64 polySum = 0.0;
+    psPolynomial1D* *chebPolys = NULL;
+    psS32 maxChebyPoly = 0;
+
+    // Determine how many Chebyshev polynomials
+    // are needed, then create them.
+    maxChebyPoly = myPoly->nX;
+    if (myPoly->nY > maxChebyPoly) {
+        maxChebyPoly = myPoly->nY;
+    }
+    chebPolys = createChebyshevPolys(maxChebyPoly);
+
+    for (loop_x = 0; loop_x < myPoly->nX; loop_x++) {
+        for (loop_y = 0; loop_y < myPoly->nY; loop_y++) {
+            if (myPoly->mask[loop_x][loop_y] == 0) {
+                polySum += myPoly->coeff[loop_x][loop_y] *
+                           psPolynomial1DEval(chebPolys[loop_x], x) *
+                           psPolynomial1DEval(chebPolys[loop_y], y);
+            }
+        }
+    }
+
+    for (i=0;i<maxChebyPoly;i++) {
+        psFree(chebPolys[i]);
+    }
+    psFree(chebPolys);
+    return(polySum);
+}
+
+static psF64 dOrdPolynomial3DEval(psF64 x, psF64 y, psF64 z, const psDPolynomial3D* myPoly)
+{
+    psS32 loop_x = 0;
+    psS32 loop_y = 0;
+    psS32 loop_z = 0;
+    psF64 polySum = 0.0;
+    psF64 xSum = 1.0;
+    psF64 ySum = 1.0;
+    psF64 zSum = 1.0;
+
+    for (loop_x = 0; loop_x < myPoly->nX; loop_x++) {
+        ySum = xSum;
+        for (loop_y = 0; loop_y < myPoly->nY; loop_y++) {
+            zSum = ySum;
+            for (loop_z = 0; loop_z < myPoly->nZ; loop_z++) {
+                if (myPoly->mask[loop_x][loop_y][loop_z] == 0) {
+                    polySum += zSum * myPoly->coeff[loop_x][loop_y][loop_z];
+                }
+                zSum *= z;
+            }
+            ySum *= y;
+        }
+        xSum *= x;
+    }
+
+    return(polySum);
+}
+
+static psF64 dChebPolynomial3DEval(psF64 x, psF64 y, psF64 z, const psDPolynomial3D* myPoly)
+{
+    PS_FLOAT_CHECK_RANGE(x, -1.0, 1.0, 0.0);
+    PS_FLOAT_CHECK_RANGE(y, -1.0, 1.0, 0.0);
+    PS_FLOAT_CHECK_RANGE(z, -1.0, 1.0, 0.0);
+    psS32 loop_x = 0;
+    psS32 loop_y = 0;
+    psS32 loop_z = 0;
+    psS32 i = 0;
+    psF64 polySum = 0.0;
+    psPolynomial1D* *chebPolys = NULL;
+    psS32 maxChebyPoly = 0;
+
+    // Determine how many Chebyshev polynomials
+    // are needed, then create them.
+    maxChebyPoly = myPoly->nX;
+    if (myPoly->nY > maxChebyPoly) {
+        maxChebyPoly = myPoly->nY;
+    }
+    if (myPoly->nZ > maxChebyPoly) {
+        maxChebyPoly = myPoly->nZ;
+    }
+    chebPolys = createChebyshevPolys(maxChebyPoly);
+
+    for (loop_x = 0; loop_x < myPoly->nX; loop_x++) {
+        for (loop_y = 0; loop_y < myPoly->nY; loop_y++) {
+            for (loop_z = 0; loop_z < myPoly->nZ; loop_z++) {
+                if (myPoly->mask[loop_x][loop_y][loop_z] == 0) {
+                    polySum += myPoly->coeff[loop_x][loop_y][loop_z] *
+                               psPolynomial1DEval(chebPolys[loop_x], x) *
+                               psPolynomial1DEval(chebPolys[loop_y], y) *
+                               psPolynomial1DEval(chebPolys[loop_z], z);
+                }
+            }
+        }
+    }
+
+    for (i=0;i<maxChebyPoly;i++) {
+        psFree(chebPolys[i]);
+    }
+    psFree(chebPolys);
+    return(polySum);
+}
+
+static psF64 dOrdPolynomial4DEval(psF64 w, psF64 x, psF64 y, psF64 z, const psDPolynomial4D* myPoly)
+{
+    psS32 loop_w = 0;
+    psS32 loop_x = 0;
+    psS32 loop_y = 0;
+    psS32 loop_z = 0;
+    psF64 polySum = 0.0;
+    psF64 wSum = 1.0;
+    psF64 xSum = 1.0;
+    psF64 ySum = 1.0;
+    psF64 zSum = 1.0;
+
+    for (loop_w = 0; loop_w < myPoly->nW; loop_w++) {
+        xSum = wSum;
+        for (loop_x = 0; loop_x < myPoly->nX; loop_x++) {
+            ySum = xSum;
+            for (loop_y = 0; loop_y < myPoly->nY; loop_y++) {
+                zSum = ySum;
+                for (loop_z = 0; loop_z < myPoly->nZ; loop_z++) {
+                    if (myPoly->mask[loop_w][loop_x][loop_y][loop_z] == 0) {
+                        polySum += zSum * myPoly->coeff[loop_w][loop_x][loop_y][loop_z];
+                    }
+                    zSum *= z;
+                }
+                ySum *= y;
+            }
+            xSum *= x;
+        }
+        wSum *= w;
+    }
+
+    return(polySum);
+}
+
+static psF64 dChebPolynomial4DEval(psF64 w, psF64 x, psF64 y, psF64 z, const psDPolynomial4D* myPoly)
+{
+    PS_FLOAT_CHECK_RANGE(w, -1.0, 1.0, 0.0);
+    PS_FLOAT_CHECK_RANGE(x, -1.0, 1.0, 0.0);
+    PS_FLOAT_CHECK_RANGE(y, -1.0, 1.0, 0.0);
+    PS_FLOAT_CHECK_RANGE(z, -1.0, 1.0, 0.0);
+    psS32 loop_w = 0;
+    psS32 loop_x = 0;
+    psS32 loop_y = 0;
+    psS32 loop_z = 0;
+    psS32 i = 0;
+    psF64 polySum = 0.0;
+    psPolynomial1D* *chebPolys = NULL;
+    psS32 maxChebyPoly = 0;
+
+    // Determine how many Chebyshev polynomials
+    // are needed, then create them.
+    maxChebyPoly = myPoly->nW;
+    if (myPoly->nX > maxChebyPoly) {
+        maxChebyPoly = myPoly->nX;
+    }
+    if (myPoly->nY > maxChebyPoly) {
+        maxChebyPoly = myPoly->nY;
+    }
+    if (myPoly->nZ > maxChebyPoly) {
+        maxChebyPoly = myPoly->nZ;
+    }
+    chebPolys = createChebyshevPolys(maxChebyPoly);
+
+    for (loop_w = 0; loop_w < myPoly->nW; loop_w++) {
+        for (loop_x = 0; loop_x < myPoly->nX; loop_x++) {
+            for (loop_y = 0; loop_y < myPoly->nY; loop_y++) {
+                for (loop_z = 0; loop_z < myPoly->nZ; loop_z++) {
+                    if (myPoly->mask[loop_w][loop_x][loop_y][loop_z] == 0) {
+                        polySum += myPoly->coeff[loop_w][loop_x][loop_y][loop_z] *
+                                   psPolynomial1DEval(chebPolys[loop_w], w) *
+                                   psPolynomial1DEval(chebPolys[loop_x], x) *
+                                   psPolynomial1DEval(chebPolys[loop_y], y) *
+                                   psPolynomial1DEval(chebPolys[loop_z], z);
+                    }
+                }
+            }
+        }
+    }
+
+    for (i=0;i<maxChebyPoly;i++) {
+        psFree(chebPolys[i]);
+    }
+    psFree(chebPolys);
+    return(polySum);
+}
+
+
+/*****************************************************************************
+fullInterpolate1DF32(): This routine will take as input n-element floating
+point arrays domain and range, and the x value, assumed to lie with the
+domain vector.  It produces as output the (n-1)-order LaGrange interpolated
+value of x.
+ 
+XXX: do we error check for non-distinct domain values?
+ *****************************************************************************/
+#define FUNC_MACRO_FULL_INTERPOLATE_1D(TYPE) \
+static psF32 fullInterpolate1D##TYPE(ps##TYPE *domain, \
+                                     ps##TYPE *range, \
+                                     psS32 n, \
+                                     ps##TYPE x) \
+{ \
+    \
+    psS32 i; \
+    psS32 m; \
+    static psVector *p = NULL; \
+    p = psVectorRecycle(p, n, PS_TYPE_##TYPE); \
+    p_psMemSetPersistent(p, true); \
+    p_psMemSetPersistent(p->data.TYPE, true); \
+    \
+    psTrace(".psLib.dataManip.psFunctions.fullInterpolate1D##TYPE", 4, \
+            "---- fullInterpolate1D##TYPE() begin (%d-order at x=%f) (%d data points)----\n", n-1, x, n); \
+    \
+    for (i=0;i<n;i++) { \
+        psTrace(".psLib.dataManip.psFunctions.fullInterpolate1D##TYPE", 6, \
+                "domain/range is (%f %f)\n", domain[i], range[i]); \
+    } \
+    \
+    for (i=0;i<n;i++) { \
+        p->data.TYPE[i] = range[i]; \
+        psTrace(".psLib.dataManip.psFunctions.fullInterpolate1D##TYPE", 6, \
+                "p->data.TYPE[%d] is %f\n", i, p->data.TYPE[i]); \
+        \
+    } \
+    \
+    /* From NR, during each iteration of the m loop, we are computing the \
+       p_{i ... i+m} terms. \
+    */ \
+    for (m=1;m<n;m++) { \
+        for (i=0;i<n-m;i++) { \
+            /* From NR: we are computing P_{i ... i+m} \
+             */ \
+            p->data.TYPE[i] = (((x-domain[i+m]) * p->data.TYPE[i]) + \
+                               ((domain[i]-x) * p->data.TYPE[i+1])) / \
+                              (domain[i] - domain[i+m]); \
+            /*printf("((%f-%f * %f) + (%f-%f * %f)) / (%f - %f)\n", x, domain[i+m], p->data.TYPE[i], domain[i], x, p->data.TYPE[i+1], domain[i], domain[i+m]); \
+             */ \
+            psTrace(".psLib.dataManip.psFunctions.fullInterpolate1D##TYPE", 6, \
+                    "p->data.TYPE[%d] is %f\n", i, p->data.TYPE[i]); \
+        } \
+    } \
+    psTrace(".psLib.dataManip.psFunctions.fullInterpolate1D##TYPE", 4, \
+            "---- fullInterpolate1D##TYPE() end ----\n"); \
+    \
+    return(p->data.TYPE[0]); \
+} \
+
+/*
+FUNC_MACRO_FULL_INTERPOLATE_1D(U8)
+FUNC_MACRO_FULL_INTERPOLATE_1D(U16)
+FUNC_MACRO_FULL_INTERPOLATE_1D(U32)
+FUNC_MACRO_FULL_INTERPOLATE_1D(U64)
+FUNC_MACRO_FULL_INTERPOLATE_1D(S8)
+FUNC_MACRO_FULL_INTERPOLATE_1D(S16)
+FUNC_MACRO_FULL_INTERPOLATE_1D(S32)
+FUNC_MACRO_FULL_INTERPOLATE_1D(S64)
+FUNC_MACRO_FULL_INTERPOLATE_1D(F64)
+*/
+FUNC_MACRO_FULL_INTERPOLATE_1D(F32)
+
+
+/*****************************************************************************
+interpolate1DF32(): this is the base 1-D flat memory routine to perform
+LaGrange interpolation.
+ *****************************************************************************/
+static psF32 interpolate1DF32(psF32 *domain,
+                              psF32 *range,
+                              psS32 n,
+                              psS32 order,
+                              psF32 x)
+{
+    PS_PTR_CHECK_NULL(domain, NAN)
+    PS_PTR_CHECK_NULL(range, NAN)
+    // XXX: Check valid values for n, order, and x?
+
+    psS32 binNum;
+    psS32 numIntPoints = order+1;
+    psS32 origin;
+
+    psTrace(".psLib.dataManip.psFunctions.interpolate1DF32", 4,
+            "---- interpolate1DF32() begin ----\n");
+
+    binNum = vectorBinDisectF32(domain, n, x);
+
+    if (0 == numIntPoints%2) {
+        origin = binNum - ((numIntPoints/2) - 1);
+    } else {
+        origin = binNum - (numIntPoints/2);
+        if ((x-domain[binNum]) > (domain[binNum+1]-x)) {
+            // x is closer to binNum+1.
+            origin = 1 + (binNum - (numIntPoints/2));
+        }
+    }
+    if (origin < 0) {
+        origin = 0;
+    }
+    if ((origin + numIntPoints) > n) {
+        origin = n - numIntPoints;
+    }
+
+    psTrace(".psLib.dataManip.psFunctions.interpolate1DF32", 4,
+            "---- interpolate1DF32() end ----\n");
+    return(fullInterpolate1DF32(&domain[origin], &range[origin], order+1, x));
+}
+
+/*****************************************************************************/
+/*  FUNCTION IMPLEMENTATION - PUBLIC                                         */
+/*****************************************************************************/
+
+/*****************************************************************************
+    Evaluate a non-normalized Gaussian with the given mean and sigma at the
+    given coordianate.  Note that this is not a Gaussian deviate.  The
+    evaluated Gaussian is: \f[ exp(-\frac{(x-mean)^2}{2\sigma^2}) \f]
+ *****************************************************************************/
+psF32 psGaussian(psF32 x, psF32 mean, psF32 sigma, psBool normal)
+{
+    psF32 tmp = 1.0;
+
+    psTrace(".psLib.dataManip.psFunctions.psGaussian", 4,
+            "---- psGaussian() begin ----\n");
+
+    if (normal == true) {
+        tmp = 1.0 / PS_SQRT_F32(2.0 * PS_PI * (sigma * sigma));
+    }
+
+    psTrace(".psLib.dataManip.psFunctions.psGaussian", 4,
+            "---- psGaussian() end ----\n");
+    return(tmp * exp(-((x - mean) * (x - mean)) / (2.0 * sigma * sigma)));
+}
+
+/*****************************************************************************
+    p_psGaussianDev()
+ This private routine (formerly a psLib API routine) creates a psVector of the
+ specified size and type F32 and fills it with a random Gaussian distribution
+ of numbers with the specified mean and sigma.  This routine makes use of the
+ GSL routines for generating both uniformly distributed numbers and the
+ Gaussian distribution as well.
+ 
+XXX: There is no way to seed the random generator.
+ *****************************************************************************/
+psVector* p_psGaussianDev(psF32 mean, psF32 sigma, psS32 Npts)
+{
+    PS_INT_CHECK_NON_NEGATIVE(Npts, NULL);
+
+    psVector* gauss = NULL;
+    const gsl_rng_type *T = NULL;
+    gsl_rng *r = NULL;
+    psS32 i = 0;
+
+
+    gauss = psVectorAlloc(Npts, PS_TYPE_F32);
+    gauss->n = Npts;
+    gsl_rng_env_setup();
+    T = gsl_rng_default;
+    r = gsl_rng_alloc(T);
+
+    for (i = 0; i < Npts; i++) {
+        gauss->data.F32[i] = mean + gsl_ran_gaussian(r, sigma);
+    }
+
+    // XXX: Should I free r, T as well?  This is a memory leak.
+    return(gauss);
+}
+
+/*****************************************************************************
+    This routine must allocate memory for the polynomial structures.
+ *****************************************************************************/
+psPolynomial1D* psPolynomial1DAlloc(psS32 n,
+                                    psPolynomialType type)
+{
+    PS_INT_CHECK_POSITIVE(n, NULL);
+
+    psS32 i = 0;
+    psPolynomial1D* newPoly = NULL;
+
+    newPoly = (psPolynomial1D* ) psAlloc(sizeof(psPolynomial1D));
+    psMemSetDeallocator(newPoly, (psFreeFcn) polynomial1DFree);
+
+    newPoly->type = type;
+    newPoly->n = n;
+    newPoly->coeff = (psF32 *)psAlloc(n * sizeof(psF32));
+    newPoly->coeffErr = (psF32 *)psAlloc(n * sizeof(psF32));
+    newPoly->mask = (psU8 *)psAlloc(n * sizeof(psU8));
+    for (i = 0; i < n; i++) {
+        newPoly->coeff[i] = 0.0;
+        newPoly->coeffErr[i] = 0.0;
+        newPoly->mask[i] = 0;
+    }
+
+    return(newPoly);
+}
+
+psPolynomial2D* psPolynomial2DAlloc(psS32 nX, psS32 nY,
+                                    psPolynomialType type)
+{
+    PS_INT_CHECK_POSITIVE(nX, NULL);
+    PS_INT_CHECK_POSITIVE(nY, NULL);
+
+    psS32 x = 0;
+    psS32 y = 0;
+    psPolynomial2D* newPoly = NULL;
+
+    newPoly = (psPolynomial2D* ) psAlloc(sizeof(psPolynomial2D));
+    psMemSetDeallocator(newPoly, (psFreeFcn) polynomial2DFree);
+
+    newPoly->type = type;
+    newPoly->nX = nX;
+    newPoly->nY = nY;
+
+    newPoly->coeff = (psF32 **)psAlloc(nX * sizeof(psF32 *));
+    newPoly->coeffErr = (psF32 **)psAlloc(nX * sizeof(psF32 *));
+    newPoly->mask = (psU8 **)psAlloc(nX * sizeof(psU8 *));
+    for (x = 0; x < nX; x++) {
+        newPoly->coeff[x] = (psF32 *)psAlloc(nY * sizeof(psF32));
+        newPoly->coeffErr[x] = (psF32 *)psAlloc(nY * sizeof(psF32));
+        newPoly->mask[x] = (psU8 *)psAlloc(nY * sizeof(psU8));
+    }
+    for (x = 0; x < nX; x++) {
+        for (y = 0; y < nY; y++) {
+            newPoly->coeff[x][y] = 0.0;
+            newPoly->coeffErr[x][y] = 0.0;
+            newPoly->mask[x][y] = 0;
+        }
+    }
+
+    return(newPoly);
+}
+
+psPolynomial3D* psPolynomial3DAlloc(psS32 nX, psS32 nY, psS32 nZ,
+                                    psPolynomialType type)
+{
+    PS_INT_CHECK_POSITIVE(nX, NULL);
+    PS_INT_CHECK_POSITIVE(nY, NULL);
+    PS_INT_CHECK_POSITIVE(nZ, NULL);
+
+    psS32 x = 0;
+    psS32 y = 0;
+    psS32 z = 0;
+    psPolynomial3D* newPoly = NULL;
+
+    newPoly = (psPolynomial3D* ) psAlloc(sizeof(psPolynomial3D));
+    psMemSetDeallocator(newPoly, (psFreeFcn) polynomial3DFree);
+
+    newPoly->type = type;
+    newPoly->nX = nX;
+    newPoly->nY = nY;
+    newPoly->nZ = nZ;
+
+    newPoly->coeff = (psF32 ***)psAlloc(nX * sizeof(psF32 **));
+    newPoly->coeffErr = (psF32 ***)psAlloc(nX * sizeof(psF32 **));
+    newPoly->mask = (psU8 ***)psAlloc(nX * sizeof(psU8 **));
+    for (x = 0; x < nX; x++) {
+        newPoly->coeff[x] = (psF32 **)psAlloc(nY * sizeof(psF32 *));
+        newPoly->coeffErr[x] = (psF32 **)psAlloc(nY * sizeof(psF32 *));
+        newPoly->mask[x] = (psU8 **)psAlloc(nY * sizeof(psU8 *));
+        for (y = 0; y < nY; y++) {
+            newPoly->coeff[x][y] = (psF32 *)psAlloc(nZ * sizeof(psF32));
+            newPoly->coeffErr[x][y] = (psF32 *)psAlloc(nZ * sizeof(psF32));
+            newPoly->mask[x][y] = (psU8 *)psAlloc(nZ * sizeof(psU8));
+        }
+    }
+    for (x = 0; x < nX; x++) {
+        for (y = 0; y < nY; y++) {
+            for (z = 0; z < nZ; z++) {
+                newPoly->coeff[x][y][z] = 0.0;
+                newPoly->coeffErr[x][y][z] = 0.0;
+                newPoly->mask[x][y][z] = 0;
+            }
+        }
+    }
+
+    return(newPoly);
+}
+
+psPolynomial4D* psPolynomial4DAlloc(psS32 nW, psS32 nX, psS32 nY, psS32 nZ,
+                                    psPolynomialType type)
+{
+    PS_INT_CHECK_POSITIVE(nW, NULL);
+    PS_INT_CHECK_POSITIVE(nX, NULL);
+    PS_INT_CHECK_POSITIVE(nY, NULL);
+    PS_INT_CHECK_POSITIVE(nZ, NULL);
+
+    psS32 w = 0;
+    psS32 x = 0;
+    psS32 y = 0;
+    psS32 z = 0;
+    psPolynomial4D* newPoly = NULL;
+
+    newPoly = (psPolynomial4D* ) psAlloc(sizeof(psPolynomial4D));
+    psMemSetDeallocator(newPoly, (psFreeFcn) polynomial4DFree);
+
+    newPoly->type = type;
+    newPoly->nW = nW;
+    newPoly->nX = nX;
+    newPoly->nY = nY;
+    newPoly->nZ = nZ;
+
+    newPoly->coeff = (psF32 ****)psAlloc(nW * sizeof(psF32 ***));
+    newPoly->coeffErr = (psF32 ****)psAlloc(nW * sizeof(psF32 ***));
+    newPoly->mask = (psU8 ****)psAlloc(nW * sizeof(psU8 ***));
+    for (w = 0; w < nW; w++) {
+        newPoly->coeff[w] = (psF32 ***)psAlloc(nX * sizeof(psF32 **));
+        newPoly->coeffErr[w] = (psF32 ***)psAlloc(nX * sizeof(psF32 **));
+        newPoly->mask[w] = (psU8 ***)psAlloc(nX * sizeof(psU8 **));
+        for (x = 0; x < nX; x++) {
+            newPoly->coeff[w][x] = (psF32 **)psAlloc(nY * sizeof(psF32 *));
+            newPoly->coeffErr[w][x] = (psF32 **)psAlloc(nY * sizeof(psF32 *));
+            newPoly->mask[w][x] = (psU8 **)psAlloc(nY * sizeof(psU8 *));
+            for (y = 0; y < nY; y++) {
+                newPoly->coeff[w][x][y] = (psF32 *)psAlloc(nZ * sizeof(psF32));
+                newPoly->coeffErr[w][x][y] = (psF32 *)psAlloc(nZ * sizeof(psF32));
+                newPoly->mask[w][x][y] = (psU8 *)psAlloc(nZ * sizeof(psU8));
+            }
+        }
+    }
+    for (w = 0; w < nW; w++) {
+        for (x = 0; x < nX; x++) {
+            for (y = 0; y < nY; y++) {
+                for (z = 0; z < nZ; z++) {
+                    newPoly->coeff[w][x][y][z] = 0.0;
+                    newPoly->coeffErr[w][x][y][z] = 0.0;
+                    newPoly->mask[w][x][y][z] = 0;
+                }
+            }
+        }
+    }
+
+    return(newPoly);
+}
+
+psF32 psPolynomial1DEval(const psPolynomial1D* myPoly, psF32 x)
+{
+    PS_POLY_CHECK_NULL(myPoly, NAN);
+
+    if (myPoly->type == PS_POLYNOMIAL_ORD) {
+        return(ordPolynomial1DEval(x, myPoly));
+    } else if (myPoly->type == PS_POLYNOMIAL_CHEB) {
+        return(chebPolynomial1DEval(x, myPoly));
+    } else {
+        psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                PS_ERRORTEXT_psFunctions_INVALID_POLYNOMIAL_TYPE,
+                myPoly->type);
+    }
+    return(NAN);
+}
+
+psVector *psPolynomial1DEvalVector(const psPolynomial1D *myPoly,
+                                   const psVector *x)
+{
+    PS_POLY_CHECK_NULL(myPoly, NULL);
+    PS_VECTOR_CHECK_NULL(x, NULL);
+    PS_VECTOR_CHECK_TYPE(x, PS_TYPE_F32, NULL);
+
+    psVector *tmp;
+
+    tmp = psVectorAlloc(x->n, PS_TYPE_F32);
+    for (psS32 i=0;i<x->n;i++) {
+        tmp->data.F32[i] = psPolynomial1DEval(myPoly, x->data.F32[i]);
+    }
+
+    return(tmp);
+}
+
+psF32 psPolynomial2DEval(const psPolynomial2D* myPoly, psF32 x, psF32 y)
+{
+    PS_POLY_CHECK_NULL(myPoly, NAN);
+
+    if (myPoly->type == PS_POLYNOMIAL_ORD) {
+        return(ordPolynomial2DEval(x, y, myPoly));
+    } else if (myPoly->type == PS_POLYNOMIAL_CHEB) {
+        return(chebPolynomial2DEval(x, y, myPoly));
+    } else {
+        psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                PS_ERRORTEXT_psFunctions_INVALID_POLYNOMIAL_TYPE,
+                myPoly->type);
+    }
+    return(NAN);
+}
+
+psVector *psPolynomial2DEvalVector(const psPolynomial2D *myPoly,
+                                   const psVector *x,
+                                   const psVector *y)
+
+{
+    PS_POLY_CHECK_NULL(myPoly, NULL);
+    PS_VECTOR_CHECK_NULL(x, NULL);
+    PS_VECTOR_CHECK_TYPE(x, PS_TYPE_F32, NULL);
+    PS_VECTOR_CHECK_NULL(y, NULL);
+    PS_VECTOR_CHECK_TYPE(y, PS_TYPE_F32, NULL);
+
+    psVector *tmp;
+    psS32 vecLen=x->n;
+
+    // Determine the length of the output vector to by the minimum of the x,y vectors
+    if (y->n < vecLen) {
+        vecLen = y->n;
+    }
+
+    // Create output vector to return
+    tmp = psVectorAlloc(vecLen, PS_TYPE_F32);
+
+    // Evaluate the polynomial at the specified points
+    for (psS32 i=0; i<vecLen; i++) {
+        tmp->data.F32[i] = psPolynomial2DEval(myPoly,x->data.F32[i],y->data.F32[i]);
+    }
+
+    // Return output vector
+    return(tmp);
+}
+
+psF32 psPolynomial3DEval(const psPolynomial3D* myPoly, psF32 x, psF32 y, psF32 z)
+{
+    PS_POLY_CHECK_NULL(myPoly, NAN);
+
+    if (myPoly->type == PS_POLYNOMIAL_ORD) {
+        return(ordPolynomial3DEval(x, y, z, myPoly));
+    } else if (myPoly->type == PS_POLYNOMIAL_CHEB) {
+        return(chebPolynomial3DEval(x, y, z, myPoly));
+    } else {
+        psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                PS_ERRORTEXT_psFunctions_INVALID_POLYNOMIAL_TYPE,
+                myPoly->type);
+    }
+    return(NAN);
+}
+
+psVector *psPolynomial3DEvalVector(const psPolynomial3D *myPoly,
+                                   const psVector *x,
+                                   const psVector *y,
+                                   const psVector *z)
+
+{
+    PS_POLY_CHECK_NULL(myPoly, NULL);
+    PS_VECTOR_CHECK_NULL(x, NULL);
+    PS_VECTOR_CHECK_TYPE(x, PS_TYPE_F32, NULL);
+    PS_VECTOR_CHECK_NULL(y, NULL);
+    PS_VECTOR_CHECK_TYPE(y, PS_TYPE_F32, NULL);
+    PS_VECTOR_CHECK_NULL(z, NULL);
+    PS_VECTOR_CHECK_TYPE(z, PS_TYPE_F32, NULL);
+
+    psVector *tmp;
+    psS32 vecLen=x->n;
+
+    // Determine the length of output vector from min of the input vectors
+    if (y->n < vecLen) {
+        vecLen = y->n;
+    }
+    if (z->n < vecLen) {
+        vecLen = z->n;
+    }
+
+    // Allocate output vector
+    tmp = psVectorAlloc(vecLen, PS_TYPE_F32);
+
+    // Evaluate polynomial
+    for (psS32 i = 0; i < vecLen; i++) {
+        tmp->data.F32[i] = psPolynomial3DEval(myPoly,
+                                              x->data.F32[i],
+                                              y->data.F32[i],
+                                              z->data.F32[i]);
+    }
+
+    // Return output vector
+    return(tmp);
+}
+
+psF32 psPolynomial4DEval(const psPolynomial4D* myPoly, psF32 w, psF32 x, psF32 y, psF32 z)
+{
+    PS_POLY_CHECK_NULL(myPoly, NAN);
+
+    if (myPoly->type == PS_POLYNOMIAL_ORD) {
+        return(ordPolynomial4DEval(w,x,y,z, myPoly));
+    } else if (myPoly->type == PS_POLYNOMIAL_CHEB) {
+        return(chebPolynomial4DEval(w,x,y,z, myPoly));
+    } else {
+        psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                PS_ERRORTEXT_psFunctions_INVALID_POLYNOMIAL_TYPE,
+                myPoly->type);
+    }
+    return(NAN);
+}
+
+psVector *psPolynomial4DEvalVector(const psPolynomial4D *myPoly,
+                                   const psVector *w,
+                                   const psVector *x,
+                                   const psVector *y,
+                                   const psVector *z)
+{
+    PS_POLY_CHECK_NULL(myPoly, NULL);
+    PS_VECTOR_CHECK_NULL(w, NULL);
+    PS_VECTOR_CHECK_TYPE(w, PS_TYPE_F32, NULL);
+    PS_VECTOR_CHECK_NULL(x, NULL);
+    PS_VECTOR_CHECK_TYPE(x, PS_TYPE_F32, NULL);
+    PS_VECTOR_CHECK_NULL(y, NULL);
+    PS_VECTOR_CHECK_TYPE(y, PS_TYPE_F32, NULL);
+    PS_VECTOR_CHECK_NULL(z, NULL);
+    PS_VECTOR_CHECK_TYPE(z, PS_TYPE_F32, NULL);
+
+    psVector *tmp;
+    psS32 vecLen=w->n;
+
+    // Determine output vector size from min of input vectors
+    if (y->n < vecLen) {
+        vecLen = y->n;
+    }
+    if (x->n < vecLen) {
+        vecLen = x->n;
+    }
+    if (z->n < vecLen) {
+        vecLen = z->n;
+    }
+
+    // Allocate output vector
+    tmp = psVectorAlloc(vecLen, PS_TYPE_F32);
+
+    // Evaluate polynomial
+    for (psS32 i = 0; i < vecLen; i++) {
+        tmp->data.F32[i] = psPolynomial4DEval(myPoly,
+                                              w->data.F32[i],
+                                              x->data.F32[i],
+                                              y->data.F32[i],
+                                              z->data.F32[i]);
+    }
+
+    // Return output vector
+    return(tmp);
+}
+
+
+psDPolynomial1D* psDPolynomial1DAlloc(psS32 n,
+                                      psPolynomialType type)
+{
+    PS_INT_CHECK_POSITIVE(n, NULL);
+
+    psS32 i = 0;
+    psDPolynomial1D* newPoly = NULL;
+
+    newPoly = (psDPolynomial1D* ) psAlloc(sizeof(psDPolynomial1D));
+    psMemSetDeallocator(newPoly, (psFreeFcn) dPolynomial1DFree);
+
+    newPoly->type = type;
+    newPoly->n = n;
+    newPoly->coeff = (psF64 *)psAlloc(n * sizeof(psF64));
+    newPoly->coeffErr = (psF64 *)psAlloc(n * sizeof(psF64));
+    newPoly->mask = (psU8 *)psAlloc(n * sizeof(psU8));
+    for (i = 0; i < n; i++) {
+        newPoly->coeff[i] = 0.0;
+        newPoly->coeffErr[i] = 0.0;
+        newPoly->mask[i] = 0;
+    }
+
+    return(newPoly);
+}
+
+psDPolynomial2D* psDPolynomial2DAlloc(psS32 nX, psS32 nY,
+                                      psPolynomialType type)
+{
+    PS_INT_CHECK_POSITIVE(nX, NULL);
+    PS_INT_CHECK_POSITIVE(nY, NULL);
+
+    psS32 x = 0;
+    psS32 y = 0;
+    psDPolynomial2D* newPoly = NULL;
+
+    newPoly = (psDPolynomial2D* ) psAlloc(sizeof(psDPolynomial2D));
+    psMemSetDeallocator(newPoly, (psFreeFcn) dPolynomial2DFree);
+
+    newPoly->type = type;
+    newPoly->nX = nX;
+    newPoly->nY = nY;
+
+    newPoly->coeff = (psF64 **)psAlloc(nX * sizeof(psF64 *));
+    newPoly->coeffErr = (psF64 **)psAlloc(nX * sizeof(psF64 *));
+    newPoly->mask = (psU8 **)psAlloc(nX * sizeof(psU8 *));
+    for (x = 0; x < nX; x++) {
+        newPoly->coeff[x] = (psF64 *)psAlloc(nY * sizeof(psF64));
+        newPoly->coeffErr[x] = (psF64 *)psAlloc(nY * sizeof(psF64));
+        newPoly->mask[x] = (psU8 *)psAlloc(nY * sizeof(psU8));
+    }
+    for (x = 0; x < nX; x++) {
+        for (y = 0; y < nY; y++) {
+            newPoly->coeff[x][y] = 0.0;
+            newPoly->coeffErr[x][y] = 0.0;
+            newPoly->mask[x][y] = 0;
+        }
+    }
+
+    return(newPoly);
+}
+
+psDPolynomial3D* psDPolynomial3DAlloc(psS32 nX, psS32 nY, psS32 nZ,
+                                      psPolynomialType type)
+{
+    PS_INT_CHECK_POSITIVE(nX, NULL);
+    PS_INT_CHECK_POSITIVE(nY, NULL);
+    PS_INT_CHECK_POSITIVE(nZ, NULL);
+
+    psS32 x = 0;
+    psS32 y = 0;
+    psS32 z = 0;
+    psDPolynomial3D* newPoly = NULL;
+
+    newPoly = (psDPolynomial3D* ) psAlloc(sizeof(psDPolynomial3D));
+    psMemSetDeallocator(newPoly, (psFreeFcn) dPolynomial3DFree);
+
+    newPoly->type = type;
+    newPoly->nX = nX;
+    newPoly->nY = nY;
+    newPoly->nZ = nZ;
+
+    newPoly->coeff = (psF64 ***)psAlloc(nX * sizeof(psF64 **));
+    newPoly->coeffErr = (psF64 ***)psAlloc(nX * sizeof(psF64 **));
+    newPoly->mask = (psU8 ***)psAlloc(nX * sizeof(psU8 **));
+    for (x = 0; x < nX; x++) {
+        newPoly->coeff[x] = (psF64 **)psAlloc(nY * sizeof(psF64 *));
+        newPoly->coeffErr[x] = (psF64 **)psAlloc(nY * sizeof(psF64 *));
+        newPoly->mask[x] = (psU8 **)psAlloc(nY * sizeof(psU8 *));
+        for (y = 0; y < nY; y++) {
+            newPoly->coeff[x][y] = (psF64 *)psAlloc(nZ * sizeof(psF64));
+            newPoly->coeffErr[x][y] = (psF64 *)psAlloc(nZ * sizeof(psF64));
+            newPoly->mask[x][y] = (psU8 *)psAlloc(nZ * sizeof(psU8));
+        }
+    }
+    for (x = 0; x < nX; x++) {
+        for (y = 0; y < nY; y++) {
+            for (z = 0; z < nZ; z++) {
+                newPoly->coeff[x][y][z] = 0.0;
+                newPoly->coeffErr[x][y][z] = 0.0;
+                newPoly->mask[x][y][z] = 0;
+            }
+        }
+    }
+
+    return(newPoly);
+}
+
+psDPolynomial4D* psDPolynomial4DAlloc(psS32 nW, psS32 nX, psS32 nY, psS32 nZ,
+                                      psPolynomialType type)
+{
+    PS_INT_CHECK_POSITIVE(nW, NULL);
+    PS_INT_CHECK_POSITIVE(nX, NULL);
+    PS_INT_CHECK_POSITIVE(nY, NULL);
+    PS_INT_CHECK_POSITIVE(nZ, NULL);
+
+    psS32 w = 0;
+    psS32 x = 0;
+    psS32 y = 0;
+    psS32 z = 0;
+    psDPolynomial4D* newPoly = NULL;
+
+    newPoly = (psDPolynomial4D* ) psAlloc(sizeof(psDPolynomial4D));
+    psMemSetDeallocator(newPoly, (psFreeFcn) dPolynomial4DFree);
+
+    newPoly->type = type;
+    newPoly->nW = nW;
+    newPoly->nX = nX;
+    newPoly->nY = nY;
+    newPoly->nZ = nZ;
+
+    newPoly->coeff = (psF64 ****)psAlloc(nW * sizeof(psF64 ***));
+    newPoly->coeffErr = (psF64 ****)psAlloc(nW * sizeof(psF64 ***));
+    newPoly->mask = (psU8 ****)psAlloc(nW * sizeof(psU8 ***));
+    for (w = 0; w < nW; w++) {
+        newPoly->coeff[w] = (psF64 ***)psAlloc(nX * sizeof(psF64 **));
+        newPoly->coeffErr[w] = (psF64 ***)psAlloc(nX * sizeof(psF64 **));
+        newPoly->mask[w] = (psU8 ***)psAlloc(nX * sizeof(psU8 **));
+        for (x = 0; x < nX; x++) {
+            newPoly->coeff[w][x] = (psF64 **)psAlloc(nY * sizeof(psF64 *));
+            newPoly->coeffErr[w][x] = (psF64 **)psAlloc(nY * sizeof(psF64 *));
+            newPoly->mask[w][x] = (psU8 **)psAlloc(nY * sizeof(psU8 *));
+            for (y = 0; y < nY; y++) {
+                newPoly->coeff[w][x][y] = (psF64 *)psAlloc(nZ * sizeof(psF64));
+                newPoly->coeffErr[w][x][y] = (psF64 *)psAlloc(nZ * sizeof(psF64));
+                newPoly->mask[w][x][y] = (psU8 *)psAlloc(nZ * sizeof(psU8));
+            }
+        }
+    }
+    for (w = 0; w < nW; w++) {
+        for (x = 0; x < nX; x++) {
+            for (y = 0; y < nY; y++) {
+                for (z = 0; z < nZ; z++) {
+                    newPoly->coeff[w][x][y][z] = 0.0;
+                    newPoly->coeffErr[w][x][y][z] = 0.0;
+                    newPoly->mask[w][x][y][z] = 0;
+                }
+            }
+        }
+    }
+
+    return(newPoly);
+}
+
+
+psF64 psDPolynomial1DEval(const psDPolynomial1D* myPoly, psF64 x)
+{
+    PS_POLY_CHECK_NULL(myPoly, NAN);
+
+    if (myPoly->type == PS_POLYNOMIAL_ORD) {
+        return(dOrdPolynomial1DEval(x, myPoly));
+    } else if (myPoly->type == PS_POLYNOMIAL_CHEB) {
+        return(dChebPolynomial1DEval(x, myPoly));
+    } else {
+        psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                PS_ERRORTEXT_psFunctions_INVALID_POLYNOMIAL_TYPE,
+                myPoly->type);
+    }
+    return(NAN);
+}
+
+psVector *psDPolynomial1DEvalVector(const psDPolynomial1D *myPoly,
+                                    const psVector *x)
+
+{
+    PS_POLY_CHECK_NULL(myPoly, NULL);
+    PS_VECTOR_CHECK_NULL(x, NULL);
+    PS_VECTOR_CHECK_TYPE(x, PS_TYPE_F64, NULL);
+
+    psVector *tmp;
+
+    tmp = psVectorAlloc(x->n, PS_TYPE_F64);
+    for (psS32 i=0;i<x->n;i++) {
+        tmp->data.F64[i] = psDPolynomial1DEval(myPoly,
+                                               x->data.F64[i]);
+    }
+
+    return(tmp);
+}
+
+
+psF64 psDPolynomial2DEval(const psDPolynomial2D* myPoly,
+                          psF64 x,
+                          psF64 y)
+{
+    PS_POLY_CHECK_NULL(myPoly, NAN);
+
+    if (myPoly->type == PS_POLYNOMIAL_ORD) {
+        return(dOrdPolynomial2DEval(x, y, myPoly));
+    } else if (myPoly->type == PS_POLYNOMIAL_CHEB) {
+        return(dChebPolynomial2DEval(x, y, myPoly));
+    } else {
+        psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                PS_ERRORTEXT_psFunctions_INVALID_POLYNOMIAL_TYPE,
+                myPoly->type);
+    }
+    return(NAN);
+}
+
+psVector *psDPolynomial2DEvalVector(const psDPolynomial2D *myPoly,
+                                    const psVector *x,
+                                    const psVector *y)
+{
+    PS_POLY_CHECK_NULL(myPoly, NULL);
+    PS_VECTOR_CHECK_NULL(x, NULL);
+    PS_VECTOR_CHECK_TYPE(x, PS_TYPE_F64, NULL);
+    PS_VECTOR_CHECK_NULL(y, NULL);
+    PS_VECTOR_CHECK_TYPE(y, PS_TYPE_F64, NULL);
+
+    psVector *tmp;
+    psS32 vecLen=x->n;
+
+    // Determine the output vector length from minimum length of input vectors
+    if (y->n < vecLen) {
+        vecLen = y->n;
+    }
+
+    // Allocate output vector
+    tmp = psVectorAlloc(vecLen, PS_TYPE_F64);
+
+    // Evaluate the polynomial
+    for (psS32 i = 0; i < vecLen; i++) {
+        tmp->data.F64[i] = psDPolynomial2DEval(myPoly,x->data.F64[i],y->data.F64[i]);
+    }
+
+    // Return output vector
+    return(tmp);
+}
+
+
+psF64 psDPolynomial3DEval(const psDPolynomial3D* myPoly,
+                          psF64 x,
+                          psF64 y,
+                          psF64 z)
+{
+    PS_POLY_CHECK_NULL(myPoly, NAN);
+
+    if (myPoly->type == PS_POLYNOMIAL_ORD) {
+        return(dOrdPolynomial3DEval(x, y, z, myPoly));
+    } else if (myPoly->type == PS_POLYNOMIAL_CHEB) {
+        return(dChebPolynomial3DEval(x, y, z, myPoly));
+    } else {
+        psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                PS_ERRORTEXT_psFunctions_INVALID_POLYNOMIAL_TYPE,
+                myPoly->type);
+    }
+    return(NAN);
+}
+
+psVector *psDPolynomial3DEvalVector(const psDPolynomial3D *myPoly,
+                                    const psVector *x,
+                                    const psVector *y,
+                                    const psVector *z)
+
+{
+    PS_POLY_CHECK_NULL(myPoly, NULL);
+    PS_VECTOR_CHECK_NULL(x, NULL);
+    PS_VECTOR_CHECK_TYPE(x, PS_TYPE_F64, NULL);
+    PS_VECTOR_CHECK_NULL(y, NULL);
+    PS_VECTOR_CHECK_TYPE(y, PS_TYPE_F64, NULL);
+    PS_VECTOR_CHECK_NULL(z, NULL);
+    PS_VECTOR_CHECK_TYPE(z, PS_TYPE_F64, NULL);
+
+    psVector *tmp;
+    psS32 vecLen=x->n;
+
+    // Determine the size of output vector from min of input vectors
+    if (y->n < vecLen) {
+        vecLen = y->n;
+    }
+    if (z->n < vecLen) {
+        vecLen = z->n;
+    }
+
+    // Allocate output vector
+    tmp = psVectorAlloc(vecLen, PS_TYPE_F64);
+
+    // Evaluate polynomial
+    for (psS32 i = 0; i < vecLen; i++) {
+        tmp->data.F64[i] = psDPolynomial3DEval(myPoly,
+                                               x->data.F64[i],
+                                               y->data.F64[i],
+                                               z->data.F64[i]);
+    }
+
+    // Return output vector
+    return(tmp);
+}
+
+psF64 psDPolynomial4DEval(const psDPolynomial4D* myPoly,
+                          psF64 w,
+                          psF64 x,
+                          psF64 y,
+                          psF64 z)
+{
+    PS_POLY_CHECK_NULL(myPoly, NAN);
+
+    if (myPoly->type == PS_POLYNOMIAL_ORD) {
+        return(dOrdPolynomial4DEval(w,x,y,z, myPoly));
+    } else if (myPoly->type == PS_POLYNOMIAL_CHEB) {
+        return(dChebPolynomial4DEval(w,x,y,z, myPoly));
+    } else {
+        psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                PS_ERRORTEXT_psFunctions_INVALID_POLYNOMIAL_TYPE,
+                myPoly->type);
+    }
+    return(NAN);
+}
+
+psVector *psDPolynomial4DEvalVector(const psDPolynomial4D *myPoly,
+                                    const psVector *w,
+                                    const psVector *x,
+                                    const psVector *y,
+                                    const psVector *z)
+{
+    PS_POLY_CHECK_NULL(myPoly, NULL);
+    PS_VECTOR_CHECK_NULL(w, NULL);
+    PS_VECTOR_CHECK_TYPE(w, PS_TYPE_F64, NULL);
+    PS_VECTOR_CHECK_NULL(x, NULL);
+    PS_VECTOR_CHECK_TYPE(x, PS_TYPE_F64, NULL);
+    PS_VECTOR_CHECK_NULL(y, NULL);
+    PS_VECTOR_CHECK_TYPE(y, PS_TYPE_F64, NULL);
+    PS_VECTOR_CHECK_NULL(z, NULL);
+    PS_VECTOR_CHECK_TYPE(z, PS_TYPE_F64, NULL);
+
+    psVector *tmp;
+    psS32 vecLen=w->n;
+
+    // Determine the output vector size from min of input vectors
+    if (y->n < vecLen) {
+        vecLen = y->n;
+    }
+    if (x->n < vecLen) {
+        vecLen = x->n;
+    }
+    if (z->n < vecLen) {
+        vecLen = z->n;
+    }
+
+    // Allocate output vector
+    tmp = psVectorAlloc(vecLen, PS_TYPE_F64);
+
+    // Evaluate the polynomial
+    for (psS32 i = 0; i < vecLen; i++) {
+        tmp->data.F64[i] = psDPolynomial4DEval(myPoly,
+                                               w->data.F64[i],
+                                               x->data.F64[i],
+                                               y->data.F64[i],
+                                               z->data.F64[i]);
+    }
+
+    // Return output vector
+    return(tmp);
+}
+
+
+
+
+//typedef struct {
+//    psS32 n;
+//    psPolynomial1D **spline;
+//    psF32 *p_psDeriv2;
+//    psVector *knots;
+//} psSpline1D;
+
+/*****************************************************************************
+    NOTE: "n" specifies the number of spline polynomials.  Therefore, there
+    must exist n+1 points in "knots".
+ 
+XXX: Ensure that domain[i+1] != domain[i]
+ 
+XXX: What should be the defualty type for knots be?  psF32 is assumed.
+ *****************************************************************************/
+psSpline1D *psSpline1DAlloc(psS32 numSplines,
+                            psS32 order,
+                            psF32 min,
+                            psF32 max)
+{
+    PS_INT_CHECK_NON_NEGATIVE(numSplines, NULL);
+    PS_INT_CHECK_NON_NEGATIVE(order, NULL);
+    PS_FLOAT_CHECK_NON_EQUAL(max, min, NULL);
+
+    psSpline1D *tmp = NULL;
+    psS32 i;
+    psF32 tmpDomain;
+    psF32 width;
+
+    tmp = (psSpline1D *) psAlloc(sizeof(psSpline1D));
+    tmp->n = numSplines;
+
+    tmp->spline = (psPolynomial1D **) psAlloc(numSplines * sizeof(psPolynomial1D *));
+    for (i=0;i<numSplines;i++) {
+        (tmp->spline)[i] = psPolynomial1DAlloc(order+1, PS_POLYNOMIAL_ORD);
+    }
+
+    // This should be set by the psVectorFitSpline1D()
+    tmp->p_psDeriv2 = NULL;
+
+    tmp->knots = psVectorAlloc(numSplines+1, PS_TYPE_F32);
+    width = (max - min) / ((psF32) numSplines);
+
+    tmp->knots->data.F32[0] = min;
+    tmpDomain = min+width;
+    for (i=1;i<numSplines+1;i++) {
+        tmp->knots->data.F32[i] = tmpDomain;
+        tmpDomain+= width;
+    }
+    tmp->knots->data.F32[numSplines] = max;
+
+    psMemSetDeallocator(tmp,(psFreeFcn)spline1DFree);
+    return(tmp);
+}
+
+
+/*****************************************************************************
+XXX: What should be the defualty type for knots be?  psF32 is assumed.
+ *****************************************************************************/
+psSpline1D *psSpline1DAllocGeneric(const psVector *bounds,
+                                   psS32 order)
+{
+    PS_VECTOR_CHECK_NULL(bounds, NULL);
+    PS_VECTOR_CHECK_EMPTY(bounds, NULL);
+    PS_INT_CHECK_NON_NEGATIVE(order, NULL);
+
+    psSpline1D *tmp = NULL;
+    psS32 i;
+    psS32 numSplines;
+
+    tmp = (psSpline1D *) psAlloc(sizeof(psSpline1D));
+
+    numSplines = bounds->n - 1;
+    tmp->n = numSplines;
+
+    tmp->spline = (psPolynomial1D **) psAlloc(numSplines * sizeof(psPolynomial1D *));
+    for (i=0;i<numSplines;i++) {
+        (tmp->spline)[i] = psPolynomial1DAlloc(order+1, PS_POLYNOMIAL_ORD);
+    }
+
+    // This should be set by the psVectorFitSpline1D()
+    tmp->p_psDeriv2 = NULL;
+
+    tmp->knots = psVectorAlloc(bounds->n, PS_TYPE_F32);
+
+    for (i=0;i<bounds->n;i++) {
+        tmp->knots->data.F32[i] = bounds->data.F32[i];
+        if (i<(bounds->n-1)) {
+            if (FLT_EPSILON >= fabs(bounds->data.F32[i+1]-bounds->data.F32[i])) {
+                psError(PS_ERR_UNKNOWN, true, "data points must be distinct\n");
+            }
+        }
+    }
+
+    psMemSetDeallocator(tmp,(psFreeFcn)spline1DFree);
+    return(tmp);
+}
+
+/*****************************************************************************
+vectorBinDisectF32(): This is a macro for a private function which takes as
+input a vector an array of data as well as a single value for that data.  The
+input vector values are assumed to be non-decreasing (v[i-1] <= v[i] for all
+i).  This routine does a binary disection of the vector and returns "i" such
+that (v[i] <= x <= v[i+1).  If x lies outside the range of v[], then this
+routine prints a warning message and returns (-2 or -1).
+ *****************************************************************************/
+#define FUNC_MACRO_VECTOR_BIN_DISECT(TYPE) \
+static psS32 vectorBinDisect##TYPE(ps##TYPE *bins, \
+                                   psS32 numBins, \
+                                   ps##TYPE x) \
+{ \
+    psS32 min; \
+    psS32 max; \
+    psS32 mid; \
+    \
+    psTrace(".psLib.dataManip.psFunctions.vectorBinDisect##TYPE", 4, \
+            "---- Calling vectorBinDisect##TYPE(%f)\n", x); \
+    \
+    if (x < bins[0]) { \
+        psLogMsg(__func__, PS_LOG_WARN, \
+                 "vectorBinDisect%s(): ordinate %f is outside vector range (%f - %f).", \
+                 #TYPE, x, bins[0], bins[numBins-1]); \
+        return(-2); \
+    } \
+    \
+    if (x > bins[numBins-1]) { \
+        psLogMsg(__func__, PS_LOG_WARN, \
+                 "vectorBinDisect%s(): ordinate %f is outside vector range (%f - %f).", \
+                 #TYPE, x, bins[0], bins[numBins-1]); \
+        return(-1); \
+    } \
+    \
+    min = 0; \
+    max = numBins-2; \
+    mid = ((max+1)-min)/2; \
+    \
+    while (min != max) { \
+        psTrace(".psLib.dataManip.psFunctions.vectorBinDisect##TYPE", 4, \
+                "(min, mid, max) is (%d, %d, %d): (x, bins) is (%f, %f)\n", \
+                min, mid, max, x, bins[mid]); \
+        \
+        if (x == bins[mid]) { \
+            psTrace(".psLib.dataManip.psFunctions.vectorBinDisect##TYPE", 4, \
+                    "---- Exiting vectorBinDisect##TYPE(): bin %d\n", mid); \
+            return(mid); \
+        } else if (x < bins[mid]) { \
+            max = mid-1; \
+        } else { \
+            min = mid; \
+        } \
+        mid = ((max+1)+min)/2; \
+    } \
+    \
+    psTrace(".psLib.dataManip.psFunctions.vectorBinDisect##TYPE", 4, \
+            "---- Exiting vectorBinDisect##TYPE(): bin %d\n", min); \
+    return(min); \
+} \
+
+FUNC_MACRO_VECTOR_BIN_DISECT(S8)
+FUNC_MACRO_VECTOR_BIN_DISECT(S16)
+FUNC_MACRO_VECTOR_BIN_DISECT(S32)
+FUNC_MACRO_VECTOR_BIN_DISECT(S64)
+FUNC_MACRO_VECTOR_BIN_DISECT(U8)
+FUNC_MACRO_VECTOR_BIN_DISECT(U16)
+FUNC_MACRO_VECTOR_BIN_DISECT(U32)
+FUNC_MACRO_VECTOR_BIN_DISECT(U64)
+FUNC_MACRO_VECTOR_BIN_DISECT(F32)
+FUNC_MACRO_VECTOR_BIN_DISECT(F64)
+
+/*****************************************************************************
+p_psVectorBinDisect(): A wrapper to the above p_psVectorBinDisect().
+ *****************************************************************************/
+psS32 p_psVectorBinDisect(psVector *bins,
+                          psScalar *x)
+{
+    PS_VECTOR_CHECK_NULL(bins, -4);
+    PS_VECTOR_CHECK_EMPTY(bins, -4);
+    PS_PTR_CHECK_NULL(x, -6);
+    PS_PTR_CHECK_TYPE_EQUAL(x, bins, -3);
+    psS8* strType;
+
+    switch (x->type.type) {
+    case PS_TYPE_U8:
+        return(vectorBinDisectU8(bins->data.U8, bins->n, x->data.U8));
+    case PS_TYPE_U16:
+        return(vectorBinDisectU16(bins->data.U16, bins->n, x->data.U16));
+    case PS_TYPE_U32:
+        return(vectorBinDisectU32(bins->data.U32, bins->n, x->data.U32));
+    case PS_TYPE_U64:
+        return(vectorBinDisectU64(bins->data.U64, bins->n, x->data.U64));
+    case PS_TYPE_S8:
+        return(vectorBinDisectS8(bins->data.S8, bins->n, x->data.S8));
+    case PS_TYPE_S16:
+        return(vectorBinDisectS16(bins->data.S16, bins->n, x->data.S16));
+    case PS_TYPE_S32:
+        return(vectorBinDisectS32(bins->data.S32, bins->n, x->data.S32));
+    case PS_TYPE_S64:
+        return(vectorBinDisectS64(bins->data.S64, bins->n, x->data.S64));
+    case PS_TYPE_F32:
+        return(vectorBinDisectF32(bins->data.F32, bins->n, x->data.F32));
+    case PS_TYPE_F64:
+        return(vectorBinDisectF64(bins->data.F64, bins->n, x->data.F64));
+    case PS_TYPE_C32:
+        PS_TYPE_NAME(strType,x->type.type);
+        psError(PS_ERR_BAD_PARAMETER_TYPE,
+                PS_ERRORTEXT_psFunctions_TYPE_NOT_SUPPORTED,
+                strType);
+        return 0;
+    case PS_TYPE_C64:
+        PS_TYPE_NAME(strType,x->type.type);
+        psError(PS_ERR_BAD_PARAMETER_TYPE,
+                PS_ERRORTEXT_psFunctions_TYPE_NOT_SUPPORTED,
+                strType);
+        return 0;
+    case PS_TYPE_BOOL:
+        PS_TYPE_NAME(strType,x->type.type);
+        psError(PS_ERR_BAD_PARAMETER_TYPE,
+                PS_ERRORTEXT_psFunctions_TYPE_NOT_SUPPORTED,
+                strType);
+        return 0;
+    }
+    return(-3);
+}
+
+/*****************************************************************************
+p_psVectorInterpolate(): This routine will take as input psVectors domain and
+range, and the x value, assumed to lie with the domain vector.  It produces
+as output the LaGrange interpolated value of a polynomial of the specified
+order around the point x.
+ 
+XXX: This stuff does not currently work with a mask.
+ 
+XXX: add another psScalar argument for the result.
+ 
+XXX: The VectorCopy routines seg fault when I declare range32 as static.
+ *****************************************************************************/
+psScalar *p_psVectorInterpolate(psVector *domain,
+                                psVector *range,
+                                psS32 order,
+                                psScalar *x)
+{
+    PS_VECTOR_CHECK_NULL(domain, NULL);
+    PS_VECTOR_CHECK_NULL(range, NULL);
+    PS_PTR_CHECK_NULL(x, NULL);
+    PS_INT_CHECK_NON_NEGATIVE(order, NULL);
+    PS_VECTOR_CHECK_SIZE_EQUAL(domain, range, NULL);
+    PS_PTR_CHECK_TYPE_EQUAL(domain, range, NULL);
+    PS_PTR_CHECK_TYPE_EQUAL(domain, x, NULL);
+
+    psVector *range32 = NULL;
+    psVector *domain32 = NULL;
+    psTrace(".psLib.dataManip.psFunctions.p_psVectorInterpolate", 4,
+            "---- p_psVectorInterpolate() begin ----\n");
+
+    if (order > (domain->n - 1)) {
+        psError(PS_ERR_BAD_PARAMETER_SIZE, true,
+                PS_ERRORTEXT_psFunctions_NOT_ENOUGH_DATAPOINTS,
+                order);
+        return(NULL);
+    }
+
+    if (x->type.type == PS_TYPE_F32) {
+        psTrace(".psLib.dataManip.psFunctions.p_psVectorInterpolate", 4,
+                "---- p_psVectorInterpolate() end ----\n");
+        return(psScalarAlloc(interpolate1DF32(domain->data.F32,
+                                              range->data.F32,
+                                              domain->n,
+                                              order,
+                                              x->data.F32), PS_TYPE_F32));
+    } else if (x->type.type == PS_TYPE_F64) {
+        // XXX: use recycled vectors here.
+        range32 = psVectorCopy(range32, range, PS_TYPE_F32);
+        domain32 = psVectorCopy(domain32, domain, PS_TYPE_F32);
+
+        psScalar *tmpScalar = psScalarAlloc((psF64)
+                                            interpolate1DF32(domain32->data.F32,
+                                                             range32->data.F32,
+                                                             domain32->n,
+                                                             order,
+                                                             (psF32) x->data.F64), PS_TYPE_F64);
+        psFree(range32);
+        psFree(domain32);
+
+        psTrace(".psLib.dataManip.psFunctions.p_psVectorInterpolate", 4,
+                "---- p_psVectorInterpolate() end ----\n");
+        // XXX: Convert data type to F64?
+        return(tmpScalar);
+
+    } else {
+        psS8* strType;
+        PS_TYPE_NAME(strType,x->type.type);
+        psError(PS_ERR_BAD_PARAMETER_TYPE,
+                PS_ERRORTEXT_psFunctions_TYPE_NOT_SUPPORTED,
+                strType);
+    }
+
+    psTrace(".psLib.dataManip.psFunctions.p_psVectorInterpolate", 4,
+            "return(NULL)\n");
+    psTrace(".psLib.dataManip.psFunctions.p_psVectorInterpolate", 4,
+            "---- p_psVectorInterpolate() end ----\n");
+
+    return(NULL);
+}
+
+
+/*****************************************************************************
+psSpline1DEval(): this routine takes an existing spline of arbitrary order
+and an independent x value.  Each determines which spline that x corresponds
+to by doing a bracket disection on the knots of the spline data structure
+(vectorBinDisectF32()).  Then it evaluates the spline at that x location
+by a call to the 1D polynomial functions.
+ 
+XXX: The spline eval functions require input and output to be F32.  however
+     the spline fit functions require F32 and F64.
+ 
+XXX: This only works if spline0>knots if psF32.  Must add support for psU32 and
+psF64.
+ *****************************************************************************/
+psF32 psSpline1DEval(
+    const psSpline1D *spline,
+    psF32 x
+)
+{
+    PS_PTR_CHECK_NULL(spline, NAN);
+    PS_INT_CHECK_NON_NEGATIVE(spline->n, NAN);
+    PS_VECTOR_CHECK_TYPE(spline->knots, PS_TYPE_F32, NAN);
+
+    psS32 binNum;
+    psS32 n;
+
+    n = spline->n;
+    //XXX    binNum = vectorBinDisectF32(spline->domains, (spline->n)+1, x);
+    binNum = vectorBinDisectF32(spline->knots->data.F32, (spline->n)+1, x);
+    if (binNum < 0) {
+        psLogMsg(__func__, PS_LOG_WARN,
+                 "psSpline1DEval(): x ordinate (%f) is outside the spline range (%f - %f).",
+                 x, spline->knots->data.F32[0],
+                 spline->knots->data.F32[n-1]);
+
+        if (x < spline->knots->data.F32[0]) {
+            return(psPolynomial1DEval(spline->spline[0],
+                                      x));
+        } else if (x > spline->knots->data.F32[n-1]) {
+            return(psPolynomial1DEval(spline->spline[n-1],
+                                      x));
+        }
+    }
+
+    return(psPolynomial1DEval(spline->spline[binNum],
+                              x));
+}
+
+// XXX: The spline eval functions require input and output to be F32.
+// however the spline fit functions require F32 and F64.
+psVector *psSpline1DEvalVector(
+    const psSpline1D *spline,
+    const psVector *x
+)
+{
+    PS_PTR_CHECK_NULL(spline, NULL);
+    PS_VECTOR_CHECK_NULL(x, NULL);
+    PS_VECTOR_CHECK_TYPE_F32_OR_F64(x, NULL);
+    PS_VECTOR_CHECK_TYPE(spline->knots, PS_TYPE_F32, NULL);
+
+    psS32 i;
+    psVector *tmpVector;
+
+    tmpVector = psVectorAlloc(x->n, PS_TYPE_F32);
+    if (x->type.type == PS_TYPE_F32) {
+        for (i=0;i<x->n;i++) {
+            tmpVector->data.F32[i] = psSpline1DEval(
+                                         spline,
+                                         x->data.F32[i]
+                                     );
+        }
+    } else if (x->type.type == PS_TYPE_F64) {
+        for (i=0;i<x->n;i++) {
+            tmpVector->data.F32[i] = psSpline1DEval(
+                                         spline,
+                                         (psF32) x->data.F64[i]
+                                     );
+        }
+    } else {
+        psS8* strType;
+        PS_TYPE_NAME(strType,x->type.type);
+        psError(PS_ERR_BAD_PARAMETER_TYPE,
+                PS_ERRORTEXT_psFunctions_TYPE_NOT_SUPPORTED,
+                strType);
+        return(NULL);
+    }
+
+    return(tmpVector);
+}
Index: /tags/ipp-1-X/bug123/psLib/src/math/psSpline.h
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/math/psSpline.h	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/math/psSpline.h	(revision 22331)
@@ -0,0 +1,440 @@
+/** @file psFunctions.h
+ *  @brief Standard Mathematical Functions.
+ *  @ingroup Stats
+ *
+ *  This file will hold the prototypes for procedures which allocate, free,
+ *  and evaluate various polynomials.  Those polynomial structures are also
+ *  defined here.
+ *
+ *  @ingroup Stats
+ *
+ *  @author Someone at IfA
+ *  @author GLG, MHPCC
+ *
+ *  @version $Revision: 1.44 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-03-31 23:01:46 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+
+#if !defined(PS_FUNCTIONS_H)
+#define PS_FUNCTIONS_H
+
+#include <stdio.h>
+#include <stdbool.h>
+#include <float.h>
+#include <math.h>
+
+#include "psVector.h"
+#include "psScalar.h"
+
+/** \addtogroup Stats
+ *  \{
+ */
+
+/** Evaluate a non-normalized Gaussian with the given mean and sigma at the
+ *  given coordianate.  
+ *
+ *  Note that this is not a Gaussian deviate.  The evaluated Gaussian is: 
+ *        \f[ exp(-\frac{(x-mean)^2}{2\sigma^2}) \f] 
+ *
+ *  @return psF32      value on the gaussian curve given the input parameters
+ */
+psF32 psGaussian(
+    psF32 x,                           ///< Value at which to evaluate
+    psF32 mean,                        ///< Mean for the Gaussian
+    psF32 stddev,                      ///< Standard deviation for the Gaussian
+    psBool normal                        ///< Indicates whether result should be normalized
+);
+
+/** Produce a vector of random numbers from a Gaussian distribution with
+ *  the specified mean and sigma 
+ *  
+ *  @return psVector*    vector of random numbers
+ *  
+ */
+psVector* p_psGaussianDev(
+    psF32 mean,                        ///< The mean of the Gaussian
+    psF32 sigma,                       ///< The sigma of the Gaussian
+    psS32 Npts                           ///< The size of the vector
+);
+
+typedef enum {
+    PS_POLYNOMIAL_ORD,                 ///< Ordinary Polynomial
+    PS_POLYNOMIAL_CHEB                 ///< Chebyshev Polynomial
+} psPolynomialType;
+
+/** One-dimensional polynomial */
+typedef struct
+{
+    psPolynomialType type;             ///< Polynomial type
+    psS32 n;                             ///< Number of terms
+    psF32 *coeff;                      ///< Coefficients
+    psF32 *coeffErr;                   ///< Error in coefficients
+    psU8 *mask;                        ///< Coefficient mask
+}
+psPolynomial1D;
+
+/** Two-dimensional polynomial */
+typedef struct
+{
+    psPolynomialType type;             ///< Polynomial type
+    psS32 nX;                            ///< Number of terms in x
+    psS32 nY;                            ///< Number of terms in y
+    psF32 **coeff;                     ///< Coefficients
+    psF32 **coeffErr;                  ///< Error in coefficients
+    psU8 **mask;                       ///< Coefficients mask
+}
+psPolynomial2D;
+
+/** Three-dimensional polynomial */
+typedef struct
+{
+    psPolynomialType type;             ///< Polynomial type
+    psS32 nX;                            ///< Number of terms in x
+    psS32 nY;                            ///< Number of terms in y
+    psS32 nZ;                            ///< Number of terms in z
+    psF32 ***coeff;                    ///< Coefficients
+    psF32 ***coeffErr;                 ///< Error in coefficients
+    psU8 ***mask;                      ///< Coefficients mask
+}
+psPolynomial3D;
+
+/** Four-dimensional polynomial */
+typedef struct
+{
+    psPolynomialType type;             ///< Polynomial type
+    psS32 nW;                            ///< Number of terms in w
+    psS32 nX;                            ///< Number of terms in x
+    psS32 nY;                            ///< Number of terms in y
+    psS32 nZ;                            ///< Number of terms in z
+    psF32 ****coeff;                   ///< Coefficients
+    psF32 ****coeffErr;                ///< Error in coefficients
+    psU8 ****mask;                     ///< Coefficients mask
+}
+psPolynomial4D;
+
+
+/** Allocates a psPolynomial1D structure with n terms
+ *
+ *  @return  psPolynomial1D*    new 1-D polynomial struct
+ */
+psPolynomial1D* psPolynomial1DAlloc(
+    psS32 n,                              ///< Number of terms
+    psPolynomialType type               ///< Polynomial Type
+);
+
+/** Allocates a 2-D polynomial structure
+ *
+ *  @return  psPolynomial2D*    new 2-D polynomial struct
+ */
+psPolynomial2D* psPolynomial2DAlloc(
+    psS32 nX,                            ///< Number of terms in x
+    psS32 nY,                            ///< Number of terms in y
+    psPolynomialType type              ///< Polynomial Type
+);
+
+/** Allocates a 3-D polynomial structure
+ *
+ *  @return  psPolynomial3D*    new 3-D polynomial struct
+ */
+psPolynomial3D* psPolynomial3DAlloc(
+    psS32 nX,                            ///< Number of terms in x
+    psS32 nY,                            ///< Number of terms in y
+    psS32 nZ,                            ///< Number of terms in z
+    psPolynomialType type              ///< Polynomial Type
+);
+
+/** Allocates a 4-D polynomial structure
+ *
+ *  @return  psPolynomial4D*    new 4-D polynomial struct
+ */
+psPolynomial4D* psPolynomial4DAlloc(
+    psS32 nW,                            ///< Number of terms in w
+    psS32 nX,                            ///< Number of terms in x
+    psS32 nY,                            ///< Number of terms in y
+    psS32 nZ,                            ///< Number of terms in z
+    psPolynomialType type              ///< Polynomial Type
+);
+
+/** Evaluates a 1-D polynomial at specific coordinates.
+ *
+ *  @return psF32    result of polynomial at given location
+ */
+psF32 psPolynomial1DEval(
+    const psPolynomial1D* myPoly,       ///< Coefficients for the polynomial
+    psF32 x                           ///< location at which to evaluate
+);
+
+/** Evaluates a 2-D polynomial at specific coordinates.
+ *
+ *  @return psF32    result of polynomial at given location
+ */
+psF32 psPolynomial2DEval(
+    const psPolynomial2D* myPoly,       ///< Coefficients for the polynomial
+    psF32 x,                           ///< x location at which to evaluate
+    psF32 y                           ///< y location at which to evaluate
+);
+
+/** Evaluates a 3-D polynomial at specific coordinates.
+ *
+ *  @return psF32    result of polynomial at given location
+ */
+psF32 psPolynomial3DEval(
+    const psPolynomial3D* myPoly,       ///< Coefficients for the polynomial
+    psF32 x,                           ///< x location at which to evaluate
+    psF32 y,                           ///< y location at which to evaluate
+    psF32 z                           ///< z location at which to evaluate
+);
+
+/** Evaluates a 4-D polynomial at specific coordinates.
+ *
+ *  @return psF32    result of polynomial at given location
+ */
+psF32 psPolynomial4DEval(
+    const psPolynomial4D* myPoly,       ///< Coefficients for the polynomial
+    psF32 w,                           ///< w location at which to evaluate
+    psF32 x,                           ///< x location at which to evaluate
+    psF32 y,                           ///< y location at which to evaluate
+    psF32 z                           ///< z location at which to evaluate
+);
+
+psVector *psPolynomial1DEvalVector(
+    const psPolynomial1D *myPoly,   ///< Coefficients for the polynomial
+    const psVector *x             ///< x locations at which to evaluate
+);
+
+psVector *psPolynomial2DEvalVector(
+    const psPolynomial2D *myPoly,   ///< Coefficients for the polynomial
+    const psVector *x,             ///< x locations at which to evaluate
+    const psVector *y             ///< y locations at which to evaluate
+);
+
+psVector *psPolynomial3DEvalVector(
+    const psPolynomial3D *myPoly,   ///< Coefficients for the polynomial
+    const psVector *x,             ///< x locations at which to evaluate
+    const psVector *y,             ///< y locations at which to evaluate
+    const psVector *z             ///< z locations at which to evaluate
+);
+
+psVector *psPolynomial4DEvalVector(
+    const psPolynomial4D *myPoly,   ///< Coefficients for the polynomial
+    const psVector *w,             ///< w locations at which to evaluate
+    const psVector *x,             ///< x locations at which to evaluate
+    const psVector *y,             ///< y locations at which to evaluate
+    const psVector *z             ///< z locations at which to evaluate
+);
+
+/*****************************************************************************/
+
+/* Double-precision polynomials, mainly for use in astrometry */
+
+/** Double-precision one-dimensional polynomial */
+typedef struct
+{
+    psPolynomialType type;             ///< Polynomial type
+    psS32 n;                             ///< Number of terms
+    psF64 *coeff;                     ///< Coefficients
+    psF64 *coeffErr;                  ///< Error in coefficients
+    psU8 *mask;                        ///< Coefficient mask
+}
+psDPolynomial1D;
+
+/** Double-precision two-dimensional polynomial */
+typedef struct
+{
+    psPolynomialType type;             ///< Polynomial type
+    psS32 nX;                            ///< Number of terms in x
+    psS32 nY;                            ///< Number of terms in y
+    psF64 **coeff;                    ///< Coefficients
+    psF64 **coeffErr;                 ///< Error in coefficients
+    psU8 **mask;                       ///< Coefficients mask
+}
+psDPolynomial2D;
+
+/** Double-precision three-dimensional polynomial */
+typedef struct
+{
+    psPolynomialType type;             ///< Polynomial type
+    psS32 nX;                            ///< Number of terms in x
+    psS32 nY;                            ///< Number of terms in y
+    psS32 nZ;                            ///< Number of terms in z
+    psF64 ***coeff;                   ///< Coefficients
+    psF64 ***coeffErr;                ///< Error in coefficients
+    psU8 ***mask;                      ///< Coefficient mask
+}
+psDPolynomial3D;
+
+/** Double-precision four-dimensional polynomial */
+typedef struct
+{
+    psPolynomialType type;             ///< Polynomial type
+    psS32 nW;                            ///< Number of terms in w
+    psS32 nX;                            ///< Number of terms in x
+    psS32 nY;                            ///< Number of terms in y
+    psS32 nZ;                            ///< Number of terms in z
+    psF64 ****coeff;                  ///< Coefficients
+    psF64 ****coeffErr;               ///< Error in coefficients
+    psU8 ****mask;                     ///< Coefficients mask
+}
+psDPolynomial4D;
+
+/** Allocates a double-precision 1-D polynomial structure with n terms
+ *
+ *  @return  psPolynomial1D*    new double-precision 1-D polynomial struct
+ */
+psDPolynomial1D* psDPolynomial1DAlloc(
+    psS32 n,                             ///< Number of terms
+    psPolynomialType type              ///< Polynomial Type
+);
+
+/** Allocates a double-precision 2-D polynomial structure
+ *
+ *  @return  psPolynomial2D*    new double-precision 2-D polynomial struct
+ */
+psDPolynomial2D* psDPolynomial2DAlloc(
+    psS32 nX,                            ///< Number of terms in x
+    psS32 nY,                            ///< Number of terms in y
+    psPolynomialType type              ///< Polynomial Type
+);
+
+/** Allocates a double-precision 3-D polynomial structure
+ *
+ *  @return  psPolynomial3D*    new double-precision 3-D polynomial struct
+ */
+psDPolynomial3D* psDPolynomial3DAlloc(
+    psS32 nX,                            ///< Number of terms in x
+    psS32 nY,                            ///< Number of terms in y
+    psS32 nZ,                            ///< Number of terms in z
+    psPolynomialType type              ///< Polynomial Type
+);
+
+/** Allocates a double-precision 4-D polynomial structure
+ *
+ *  @return  psPolynomial4D*    new double-precision 4-D polynomial struct
+ */
+psDPolynomial4D* psDPolynomial4DAlloc(
+    psS32 nW,                            ///< Number of terms in w
+    psS32 nX,                            ///< Number of terms in x
+    psS32 nY,                            ///< Number of terms in y
+    psS32 nZ,                            ///< Number of terms in z
+    psPolynomialType type              ///< Polynomial Type
+);
+
+/** Evaluates a double-precision 1-D polynomial at specific coordinates.
+ *
+ *  @return psF32    result of polynomial at given location
+ */
+psF64 psDPolynomial1DEval(
+    const psDPolynomial1D* myPoly,      ///< Coefficients for the polynomial
+    psF64 x                          ///< Value at which to evaluate
+);
+
+/** Evaluates a double-precision 2-D polynomial at specific coordinates.
+ *
+ *  @return psF32    result of polynomial at given location
+ */
+psF64 psDPolynomial2DEval(
+    const psDPolynomial2D* myPoly,       ///< Coefficients for the polynomial
+    psF64 x,                           ///< Value x at which to evaluate
+    psF64 y            ///< Value y at which to evaluate
+);
+
+/** Evaluates a double-precision 3-D polynomial at specific coordinates.
+ *
+ *  @return psF32    result of polynomial at given location
+ */
+psF64 psDPolynomial3DEval(
+    const psDPolynomial3D* myPoly,      ///< Coefficients for the polynomial
+    psF64 x,                          ///< Value x at which to evaluate
+    psF64 y,                          ///< Value y at which to evaluate
+    psF64 z     ///< Value z at which to evaluate
+);
+
+/** Evaluates a double-precision 4-D polynomial at specific coordinates.
+ *
+ *  @return psF32    result of polynomial at given location
+ */
+psF64 psDPolynomial4DEval(
+    const psDPolynomial4D* myPoly,      ///< Coefficients for the polynomial
+    psF64 w,                          ///< Value w at which to evaluate
+    psF64 x,                          ///< Value x at which to evaluate
+    psF64 y,                          ///< Value y at which to evaluate
+    psF64 z     ///< Value z at which to evaluate
+);
+
+psVector *psDPolynomial1DEvalVector(
+    const psDPolynomial1D *myPoly, ///< Coefficients for the polynomial
+    const psVector *x             ///< x locations at which to evaluate
+);
+
+psVector *psDPolynomial2DEvalVector(
+    const psDPolynomial2D *myPoly,  ///< Coefficients for the polynomial
+    const psVector *x,             ///< x locations at which to evaluate
+    const psVector *y             ///< y locations at which to evaluate
+);
+
+psVector *psDPolynomial3DEvalVector(
+    const psDPolynomial3D *myPoly,  ///< Coefficients for the polynomial
+    const psVector *x,             ///< x locations at which to evaluate
+    const psVector *y,             ///< y locations at which to evaluate
+    const psVector *z             ///< z locations at which to evaluate
+);
+
+psVector *psDPolynomial4DEvalVector(
+    const psDPolynomial4D *myPoly,  ///< Coefficients for the polynomial
+    const psVector *w,             ///< w locations at which to evaluate
+    const psVector *x,             ///< x locations at which to evaluate
+    const psVector *y,             ///< y locations at which to evaluate
+    const psVector *z             ///< z locations at which to evaluate
+);
+
+
+
+typedef struct
+{
+    psS32 n;                       ///< The number of spline polynomials
+    psPolynomial1D **spline;       ///< An array of n pointers to the spline polynomials
+    psF32 *p_psDeriv2;             ///< For cubic splines, the second derivative at each domain point.  Size is n+1.
+    psF32 *domains;                ///< The boundaries between each spline piece.  Size is n+1.
+    psVector *knots;               ///< The boundaries between each spline piece.  Size is n+1.
+}
+psSpline1D;
+
+psSpline1D *psSpline1DAlloc(psS32 n,
+                            psS32 order,
+                            psF32 min,
+                            psF32 max);
+
+psSpline1D *psSpline1DAllocGeneric(const psVector *bounds,
+                                   psS32 order);
+
+psF32 psSpline1DEval(
+    const psSpline1D *spline,
+    psF32 x
+);
+
+psVector *psSpline1DEvalVector(
+    const psSpline1D *spline,
+    const psVector *x
+);
+
+psS32 p_psVectorBinDisect(psVector *bins,
+                          psScalar *x);
+
+psScalar *p_psVectorInterpolate(psVector *domain,
+                                psVector *range,
+                                psS32 order,
+                                psScalar *x);
+
+#if 0
+psF32 p_psNRSpline1DEval(psSpline1D *spline,
+                         const psVector* x,
+                         const psVector* y,
+                         psF32 X);
+#endif
+
+/* \} */// End of MathGroup Functions
+
+#endif
+
Index: /tags/ipp-1-X/bug123/psLib/src/math/psStats.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/math/psStats.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/math/psStats.c	(revision 22331)
@@ -0,0 +1,2328 @@
+/** @file  psStats.c
+ *  \brief basic statistical operations
+ *  @ingroup Stats
+ *
+ *  This file will hold the definition of the histogram and stats data
+ *  structures.  It also contains prototypes for procedures which operate
+ *  on those data structures.
+ *
+ *  @author GLG, MHPCC
+ *
+ *  @version $Revision: 1.125 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-04-07 20:27:41 $
+ *
+ *  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdarg.h>
+#include <float.h>
+#include <math.h>
+
+/*****************************************************************************/
+/* INCLUDE FILES                                                             */
+/*****************************************************************************/
+#include "psMemory.h"
+#include "psImage.h"
+#include "psVector.h"
+#include "psTrace.h"
+#include "psLogMsg.h"
+#include "psError.h"
+#include "psStats.h"
+#include "psMinimize.h"
+#include "psFunctions.h"
+#include "psConstants.h"
+
+#include "psDataManipErrors.h"
+
+/*****************************************************************************/
+/* DEFINE STATEMENTS                                                         */
+/*****************************************************************************/
+#define PS_GAUSS_WIDTH 5       // The width of the Gaussian or boxcar smoothing.
+#define PS_CLIPPED_NUM_ITER_LB 1
+#define PS_CLIPPED_NUM_ITER_UB 10
+#define PS_CLIPPED_SIGMA_LB 1.0
+#define PS_CLIPPED_SIGMA_UB 10.0
+#define PS_POLY_MEDIAN_MAX_ITERATIONS 10
+
+#define PS_BIN_MIDPOINT(HISTOGRAM, BIN_NUM) \
+(0.5 * (HISTOGRAM->bounds->data.F32[(BIN_NUM)] + HISTOGRAM->bounds->data.F32[(BIN_NUM)+1]))
+/*****************************************************************************/
+/* TYPE DEFINITIONS                                                          */
+/*****************************************************************************/
+psVector* p_psConvertToF32(psVector* in);
+/*****************************************************************************/
+/* GLOBAL VARIABLES                                                          */
+/*****************************************************************************/
+
+// None
+
+/*****************************************************************************/
+/* FILE STATIC VARIABLES                                                     */
+/*****************************************************************************/
+
+// None
+
+/*****************************************************************************/
+/* FUNCTION IMPLEMENTATION - LOCAL                                           */
+/*****************************************************************************/
+
+psBool p_psGetStatValue(const psStats* stats, psF64 *value)
+{
+
+    switch (stats->options & ~(PS_STAT_USE_RANGE | PS_STAT_USE_BINSIZE | PS_STAT_ROBUST_FOR_SAMPLE)) {
+    case PS_STAT_SAMPLE_MEAN:
+        *value = stats->sampleMean;
+        return true;
+
+    case PS_STAT_SAMPLE_MEDIAN:
+        *value = stats->sampleMedian;
+        return true;
+
+    case PS_STAT_SAMPLE_STDEV:
+        *value = stats->sampleStdev;
+        return true;
+
+    case PS_STAT_ROBUST_MEAN:
+        *value = stats->robustMean;
+        return true;
+
+    case PS_STAT_ROBUST_MEDIAN:
+        *value = stats->robustMedian;
+        return true;
+
+    case PS_STAT_ROBUST_MODE:
+        *value = stats->robustMode;
+        return true;
+
+    case PS_STAT_ROBUST_STDEV:
+        *value = stats->robustStdev;
+        return true;
+
+    case PS_STAT_CLIPPED_MEAN:
+        *value = stats->clippedMean;
+        return true;
+
+    case PS_STAT_CLIPPED_STDEV:
+        *value = stats->clippedStdev;
+        return true;
+
+    case PS_STAT_MAX:
+        *value = stats->max;
+        return true;
+
+    case PS_STAT_MIN:
+        *value = stats->min;
+        return true;
+
+    default:
+        return false;
+    }
+}
+
+/******************************************************************************
+MISC PRIVATE STATISTICAL FUNCTIONS
+ 
+NOTE: it is assumed that any call to these statistical functions will have
+been preceded by a call to the psVectorStats() function.  Various sanity tests
+will only be performed in psVectorStats().  Should we perform the sanity
+checks in each routine anyway?
+ 
+XXX: For many of these private stats routines, what should be done if there
+are no acceptable elements in the input vector (if no elements lie within
+range, or there are no unmasked elements, or the input vector is NULL)?
+Currently we set the value to NAN.
+ 
+XXX: Optimization: many routines have an "empty" boolean variable which keeps
+track of whether or not the vector has any valid elements.  This code can
+possibly be optimized away.
+ *****************************************************************************/
+/******************************************************************************
+p_psVectorSampleMean(myVector, maskVector, maskVal, stats): calculates the
+mean of the input vector.  If there was a problem with the mean calculation,
+this routine sets stats->sampleMean to NAN.
+ *****************************************************************************/
+psS32 p_psVectorSampleMean(const psVector* myVector,
+                           const psVector* errors,
+                           const psVector* maskVector,
+                           psU32 maskVal,
+                           psStats* stats)
+{
+
+    psS32 i = 0;                // Loop index variable
+    psF32 mean = 0.0;           // The mean
+    psS32 count = 0;            // # of points in this mean
+
+    // If PS_STAT_USE_RANGE is requested, then we enter a slightly different
+    // loop.
+    if (errors == NULL) {
+        if (stats->options & PS_STAT_USE_RANGE) {
+            if (maskVector != NULL) {
+                for (i = 0; i < myVector->n; i++) {
+                    // Check if the data is with the specified range
+                    if (!(maskVal & maskVector->data.U8[i]) &&
+                            (stats->min <= myVector->data.F32[i]) &&
+                            (myVector->data.F32[i] <= stats->max)) {
+                        mean += myVector->data.F32[i];
+                        count++;
+                    }
+                }
+                if (count != 0) {
+                    mean /= (psF32)count;
+                } else {
+                    mean = NAN;
+                }
+
+            } else {
+                for (i = 0; i < myVector->n; i++) {
+                    if ((stats->min <= myVector->data.F32[i]) &&
+                            (myVector->data.F32[i] <= stats->max)) {
+                        mean += myVector->data.F32[i];
+                        count++;
+                    }
+                }
+                if (count != 0) {
+                    mean /= (psF32)count;
+                } else {
+                    mean = NAN;
+                }
+            }
+        } else {
+            if (maskVector != NULL) {
+                for (i = 0; i < myVector->n; i++) {
+                    if (!(maskVal & maskVector->data.U8[i])) {
+                        mean += myVector->data.F32[i];
+                        count++;
+                    }
+                }
+                if (count != 0) {
+                    mean /= (psF32)count;
+                } else {
+                    mean = NAN;
+                }
+            } else {
+                for (i = 0; i < myVector->n; i++) {
+                    mean += myVector->data.F32[i];
+                }
+                mean /= (psF32)myVector->n;
+            }
+        }
+    } else {
+        psF32 errorDivisor = 0.0;
+        psF32 errorSqr = 0.0;
+        if (stats->options & PS_STAT_USE_RANGE) {
+            if (maskVector != NULL) {
+                for (i = 0; i < myVector->n; i++) {
+                    // Check if the data is with the specified range
+                    if (!(maskVal & maskVector->data.U8[i]) &&
+                            (stats->min <= myVector->data.F32[i]) &&
+                            (myVector->data.F32[i] <= stats->max)) {
+                        errorSqr = errors->data.F32[i]*errors->data.F32[i];
+                        mean += myVector->data.F32[i]/errorSqr;
+                        errorDivisor+= (1.0 / errorSqr);
+                        count++;
+                    }
+                }
+                if (count != 0) {
+                    mean /= errorDivisor;
+                } else {
+                    mean = NAN;
+                }
+
+            } else {
+                for (i = 0; i < myVector->n; i++) {
+                    if ((stats->min <= myVector->data.F32[i]) &&
+                            (myVector->data.F32[i] <= stats->max)) {
+                        errorSqr = errors->data.F32[i]*errors->data.F32[i];
+                        mean += myVector->data.F32[i]/errorSqr;
+                        errorDivisor+= (1.0 / errorSqr);
+                        count++;
+                    }
+                }
+                if (count != 0) {
+                    mean /= errorDivisor;
+                } else {
+                    mean = NAN;
+                }
+            }
+        } else {
+            if (maskVector != NULL) {
+                for (i = 0; i < myVector->n; i++) {
+                    if (!(maskVal & maskVector->data.U8[i])) {
+                        errorSqr = errors->data.F32[i]*errors->data.F32[i];
+                        mean += myVector->data.F32[i]/errorSqr;
+                        errorDivisor+= (1.0 / errorSqr);
+                        count++;
+                    }
+                }
+                if (count != 0) {
+                    mean /= errorDivisor;
+                } else {
+                    mean = NAN;
+                }
+            } else {
+                for (i = 0; i < myVector->n; i++) {
+                    errorSqr = errors->data.F32[i]*errors->data.F32[i];
+                    mean += myVector->data.F32[i]/errorSqr;
+                    errorDivisor+= (1.0 / errorSqr);
+                }
+                mean /= errorDivisor;
+            }
+        }
+    }
+
+    stats->sampleMean = mean;
+    if (isnan(mean)) {
+        return(-1);
+    } else {
+        return(0);
+    }
+
+}
+
+/******************************************************************************
+p_psVectorSampleMax(myVector, maskVector, maskVal, stats): calculates the
+max of the input vector.  If there was a problem with the max calculation,
+this routine sets stats->max to NAN.
+ *****************************************************************************/
+psS32 p_psVectorMax(const psVector* myVector,
+                    const psVector* maskVector,
+                    psU32 maskVal,
+                    psStats* stats)
+{
+    psS32 i = 0;                // Loop index variable
+    psF32 max = -PS_MAX_F32;    // The calculated maximum
+    psS32 empty = true;         // Does this vector have valid elements?
+
+    // If PS_STAT_USE_RANGE is requested, then we enter a different loop.
+    if (stats->options & PS_STAT_USE_RANGE) {
+        if (maskVector != NULL) {
+            for (i = 0; i < myVector->n; i++) {
+                if (!(maskVal & maskVector->data.U8[i])) {
+                    if ((myVector->data.F32[i] > max) &&
+                            (stats->min <= myVector->data.F32[i]) &&
+                            (myVector->data.F32[i] <= stats->max)) {
+                        max = myVector->data.F32[i];
+                        empty = false;
+                    }
+                }
+            }
+        } else {
+            for (i = 0; i < myVector->n; i++) {
+                if ((myVector->data.F32[i] > max) &&
+                        (stats->min <= myVector->data.F32[i]) &&
+                        (myVector->data.F32[i] <= stats->max)) {
+                    max = myVector->data.F32[i];
+                    empty = false;
+                }
+            }
+        }
+    } else {
+        if (maskVector != NULL) {
+            for (i = 0; i < myVector->n; i++) {
+                if (!(maskVal & maskVector->data.U8[i])) {
+                    if (myVector->data.F32[i] > max) {
+                        max = myVector->data.F32[i];
+                        empty = false;
+                    }
+                }
+            }
+        } else {
+            for (i = 0; i < myVector->n; i++) {
+                if (myVector->data.F32[i] > max) {
+                    max = myVector->data.F32[i];
+                    empty = false;
+                }
+            }
+        }
+    }
+    if (empty == false) {
+        stats->max = max;
+    } else {
+        stats->max = NAN;
+        return(1);
+    }
+    return(0);
+}
+
+/******************************************************************************
+p_psVectorSampleMin(myVector, maskVector, maskVal, stats): calculates the
+minimum of the input vector.  If there was a problem with the min calculation,
+this routine sets stats->min to NAN.
+ *****************************************************************************/
+psS32 p_psVectorMin(const psVector* myVector,
+                    const psVector* maskVector,
+                    psU32 maskVal,
+                    psStats* stats)
+{
+    psS32 i = 0;                // Loop index variable
+    psF32 min = PS_MAX_F32;   // The calculated maximum
+    psS32 empty = true;         // Does this vector have valid elements?
+
+    if (stats->options & PS_STAT_USE_RANGE) {
+        if (maskVector != NULL) {
+            for (i = 0; i < myVector->n; i++) {
+                if (!(maskVal & maskVector->data.U8[i])) {
+                    if ((myVector->data.F32[i] < min) &&
+                            (stats->min <= myVector->data.F32[i]) &&
+                            (myVector->data.F32[i] <= stats->max)) {
+                        min = myVector->data.F32[i];
+                        empty = false;
+                    }
+                }
+            }
+        } else {
+            for (i = 0; i < myVector->n; i++) {
+                if ((myVector->data.F32[i] < min) &&
+                        (stats->min <= myVector->data.F32[i]) &&
+                        (myVector->data.F32[i] <= stats->max)) {
+                    min = myVector->data.F32[i];
+                    empty = false;
+                }
+            }
+        }
+    } else {
+        if (maskVector != NULL) {
+            for (i = 0; i < myVector->n; i++) {
+                if (!(maskVal & maskVector->data.U8[i])) {
+                    if (myVector->data.F32[i] < min) {
+                        min = myVector->data.F32[i];
+                        empty = false;
+                    }
+                }
+            }
+        } else {
+            for (i = 0; i < myVector->n; i++) {
+                if (myVector->data.F32[i] < min) {
+                    min = myVector->data.F32[i];
+                    empty = false;
+                }
+            }
+        }
+    }
+
+    if (empty == false) {
+        stats->min = min;
+    } else {
+        stats->min = NAN;
+        return(1);
+    }
+    return(0);
+}
+
+/******************************************************************************
+p_psVectorNValues(myVector, maskVector, maskVal, stats): This routine returns
+"true" if the inputPsVector has 1 or more valid elements (a valid element is an
+unmasked element within the specified min/max range).  Otherwise, return
+"false".
+ *****************************************************************************/
+bool p_psVectorCheckNonEmpty(const psVector* myVector,
+                             const psVector* maskVector,
+                             psU32 maskVal,
+                             psStats* stats)
+{
+    PS_VECTOR_CHECK_NULL(myVector, -1);
+    PS_PTR_CHECK_NULL(stats, -1);
+    psS32 i = 0;                // Loop index variable
+
+    if (stats->options & PS_STAT_USE_RANGE) {
+        if (maskVector != NULL) {
+            for (i = 0; i < myVector->n; i++) {
+                if (!(maskVal & maskVector->data.U8[i]) &&
+                        (stats->min <= myVector->data.F32[i]) &&
+                        (myVector->data.F32[i] <= stats->max)) {
+                    return(true);
+                }
+            }
+        } else {
+            for (i = 0; i < myVector->n; i++) {
+                if ((stats->min <= myVector->data.F32[i]) &&
+                        (myVector->data.F32[i] <= stats->max)) {
+                    return(true);
+                }
+            }
+        }
+    } else {
+        if (maskVector != NULL) {
+            for (i = 0; i < myVector->n; i++) {
+                if (!(maskVal & maskVector->data.U8[i])) {
+                    return(true);
+                }
+            }
+        } else {
+            if (myVector->n > 0) {
+                return(true);
+            }
+        }
+    }
+    return(false);
+}
+
+
+/******************************************************************************
+p_psVectorNValues(myVector, maskVector, maskVal, stats): calculates the
+number of non-masked pixels in the vector that fall within the min/max
+range, if specified.
+ *****************************************************************************/
+psS32 p_psVectorNValues(const psVector* myVector,
+                        const psVector* maskVector,
+                        psU32 maskVal,
+                        psStats* stats)
+{
+    PS_VECTOR_CHECK_NULL(myVector, -1);
+    PS_PTR_CHECK_NULL(stats, -1);
+    psS32 i = 0;                // Loop index variable
+    psS32 numData = 0;          // The number of data points
+
+    if (stats->options & PS_STAT_USE_RANGE) {
+        if (maskVector != NULL) {
+            for (i = 0; i < myVector->n; i++) {
+                if (!(maskVal & maskVector->data.U8[i]) &&
+                        (stats->min <= myVector->data.F32[i]) &&
+                        (myVector->data.F32[i] <= stats->max)) {
+                    numData++;
+                }
+            }
+        } else {
+            for (i = 0; i < myVector->n; i++) {
+                if ((stats->min <= myVector->data.F32[i]) &&
+                        (myVector->data.F32[i] <= stats->max)) {
+                    numData++;
+                }
+            }
+        }
+    } else {
+        if (maskVector != NULL) {
+            for (i = 0; i < myVector->n; i++) {
+                if (!(maskVal & maskVector->data.U8[i])) {
+                    numData++;
+                }
+            }
+        } else {
+            numData = myVector->n;
+        }
+    }
+
+    return (numData);
+}
+
+/******************************************************************************
+p_psVectorSampleMedian(myVector, maskVector, maskVal, stats): calculates the
+median of the input vector.  Returns true on success (including if there were
+no valid input vector elements).
+ 
+XXX: Use static vectors for sort arrays.
+ *****************************************************************************/
+bool p_psVectorSampleMedian(const psVector* myVector,
+                            const psVector* maskVector,
+                            psU32 maskVal,
+                            psStats* stats)
+{
+    psVector* unsortedVector = NULL;    // Temporary vector
+    psVector* sortedVector = NULL;      // Temporary vector
+    psS32 i = 0;                        // Loop index variable
+    psS32 count = 0;
+    psS32 nValues = 0;
+
+    // Determine how many data points fit inside this min/max range
+    // and are not masked, if the maskVector is not NULL.
+    nValues = p_psVectorNValues(myVector, maskVector, maskVal, stats);
+
+    // XXX: Is a warning message appropriate?  What value should we set the
+    // sampleMedian to?  Should we generate an error?
+    if (nValues <= 0) {
+        psLogMsg(__func__, PS_LOG_WARN, "WARNING: p_psVectorSampleMedian(): no valid elements in input vector.\n");
+        return(true);
+        stats->sampleMedian = NAN;
+    }
+
+    // Allocate temporary vectors for the data.
+    unsortedVector = psVectorAlloc(nValues, PS_TYPE_F32);
+
+    // Determine if we must only use data points within a min/max range.
+    if (stats->options & PS_STAT_USE_RANGE) {
+        // Store all non-masked data points within the min/max range
+        // into the temporary vectors.
+        count = 0;
+        if (maskVector != NULL) {
+            for (i = 0; i < myVector->n; i++) {
+                if (!(maskVal & maskVector->data.U8[i]) &&
+                        (stats->min <= myVector->data.F32[i]) &&
+                        (myVector->data.F32[i] <= stats->max)) {
+                    unsortedVector->data.F32[count] = myVector->data.F32[i];
+                    count++;
+                }
+            }
+        } else {
+            for (i = 0; i < myVector->n; i++) {
+                if ((stats->min <= myVector->data.F32[i]) &&
+                        (myVector->data.F32[i] <= stats->max)) {
+                    unsortedVector->data.F32[count] = myVector->data.F32[i];
+                    count++;
+                }
+            }
+        }
+    } else {
+        // Store all non-masked data points into the temporary vectors.
+        count = 0;
+        if (maskVector != NULL) {
+            for (i = 0; i < myVector->n; i++) {
+                if (!(maskVal & maskVector->data.U8[i])) {
+                    unsortedVector->data.F32[count] = myVector->data.F32[i];
+                    count++;
+                }
+            }
+        } else {
+            for (i = 0; i < myVector->n; i++) {
+                unsortedVector->data.F32[i] = myVector->data.F32[i];
+            }
+        }
+    }
+    // Sort the temporary vectors.
+    sortedVector = psVectorSort(sortedVector, unsortedVector);
+    if (sortedVector == NULL) {
+        psError(PS_ERR_UNEXPECTED_NULL,
+                false,
+                PS_ERRORTEXT_psStats_STATS_SAMPLE_MEDIAN_SORT_PROBLEM);
+        return(false);
+    }
+
+    // Calculate the median exactly.  Use the average if the number of samples
+    // is even.
+    if (0 == (nValues % 2)) {
+        stats->sampleMedian = 0.5 * (sortedVector->data.F32[(nValues / 2) - 1] +
+                                     sortedVector->data.F32[nValues / 2]);
+    } else {
+        stats->sampleMedian = sortedVector->data.F32[nValues / 2];
+    }
+
+    // Free the temporary data structures.
+    psFree(unsortedVector);
+    psFree(sortedVector);
+
+    // Return "true" on success.
+    return(true);
+}
+
+/******************************************************************************
+p_psVectorSmoothHistGaussian(): This routine smoothes the data in the input
+robustHistogram with a Gaussian of width sigma.
+ 
+XXX: Only PS_TYPE_F32 is supported.
+ 
+XXX: Write a general routine which smoothes a psVector.  This routine should
+call that.  Is that possible?
+ *****************************************************************************/
+psVector* p_psVectorSmoothHistGaussian(psHistogram* robustHistogram,
+                                       psF32 sigma)
+{
+    PS_PTR_CHECK_NULL(robustHistogram, NULL);
+    PS_PTR_CHECK_NULL(robustHistogram->bounds, NULL);
+
+    psS32 i = 0;                  // Loop index variable
+    psS32 j = 0;                  // Loop index variable
+    psF32 iMid;
+    psF32 jMid;
+    psS32 numBins = robustHistogram->nums->n;
+    psS32 numBounds = robustHistogram->bounds->n;
+    psVector* smooth = psVectorAlloc(numBins, PS_TYPE_F32);
+    psS32 jMin = 0;
+    psS32 jMax = 0;
+    psF32 firstBound = robustHistogram->bounds->data.F32[0];
+    psF32 lastBound = robustHistogram->bounds->data.F32[numBounds-1];
+    psScalar x;
+
+    x.type.type = PS_TYPE_F32;
+    for (i = 0; i < numBins; i++) {
+        // Determine the midpoint of bin i.
+        iMid = (robustHistogram->bounds->data.F32[i] +
+                robustHistogram->bounds->data.F32[i+1]) / 2.0;
+
+
+        // We determine the bin numbers corresponding to a range of data
+        // values surrounding iMid.  The ranges is of size
+        // s*PS_GAUSS_WIDTH*sigma
+
+        // YYY: The p_psVectorBinDisect() routine does much of the work of
+        // the following conditionals, however, it also reports a warning
+        // message.  I don't want the warning message so I reproduce the
+        // conditionals here.  Maybe p_psVectorBinDisect() should not produce
+        // warnings?
+
+        x.data.F32 = iMid - (PS_GAUSS_WIDTH * sigma);
+        if ((x.data.F32 >= firstBound) && (x.data.F32 <= lastBound)) {
+            jMin = p_psVectorBinDisect(robustHistogram->bounds, &x);
+            if (jMin < 0) {
+                psError(PS_ERR_UNEXPECTED_NULL,
+                        false,
+                        PS_ERRORTEXT_psStats_STATS_VECTOR_BIN_DISECT_PROBLEM);
+                return(NULL);
+            }
+        } else if (x.data.F32 <= firstBound) {
+            jMin = 0;
+        } else if (x.data.F32 >= lastBound) {
+            jMin = robustHistogram->bounds->n - 1;
+        }
+
+        x.data.F32 = iMid + (PS_GAUSS_WIDTH * sigma);
+        if ((x.data.F32 >= firstBound) && (x.data.F32 <= lastBound)) {
+            jMax = p_psVectorBinDisect(robustHistogram->bounds, &x);
+            if (jMax < 0) {
+                psError(PS_ERR_UNEXPECTED_NULL,
+                        false,
+                        PS_ERRORTEXT_psStats_STATS_VECTOR_BIN_DISECT_PROBLEM);
+                return(NULL);
+            }
+        } else if (x.data.F32 <= firstBound) {
+            jMax = 0;
+        } else if (x.data.F32 >= lastBound) {
+            jMax = robustHistogram->bounds->n - 1;
+        }
+
+        smooth->data.F32[i] = 0.0;
+        for (j = jMin ; j <= jMax ; j++) {
+            jMid = (robustHistogram->bounds->data.F32[j] +
+                    robustHistogram->bounds->data.F32[j+1]) / 2.0;
+            smooth->data.F32[i] +=
+                robustHistogram->nums->data.F32[j] *
+                psGaussian(jMid, iMid, sigma, true);
+        }
+    }
+
+    return(smooth);
+}
+
+/******************************************************************************
+p_psVectorSampleQuartiles(myVector, maskVector, maskVal, stats): calculates
+the upper and/or lower quartiles of the input vector.
+Inputs
+    myVector
+    maskVector
+    maskVal
+    stats
+Returns
+    NULL
+ *****************************************************************************/
+bool p_psVectorSampleQuartiles(const psVector* myVector,
+                               const psVector* maskVector,
+                               psU32 maskVal,
+                               psStats* stats)
+{
+    psVector* unsortedVector = NULL;    // Temporary vector
+    psVector* sortedVector = NULL;      // Temporary vector
+    psS32 i = 0;                  // Loop index variable
+    psS32 count = 0;              // # of points in this mean.
+    psS32 nValues = 0;            // # data points
+
+    // Determine how many data points fit inside this min/max range
+    // and are not maxed, IF the maskVector is not NULL.
+    nValues = p_psVectorNValues(myVector, maskVector, maskVal, stats);
+
+    // Allocate temporary vectors for the data.
+    unsortedVector = psVectorAlloc(nValues, PS_TYPE_F32);
+
+    // Determine if we must only use data points within a min/max range.
+    if (stats->options & PS_STAT_USE_RANGE) {
+        // Store all non-masked data points within the min/max range
+        // into the temporary vectors.
+        count = 0;
+        if (maskVector != NULL) {
+            for (i = 0; i < myVector->n; i++) {
+                if (!(maskVal & maskVector->data.U8[i]) &&
+                        (stats->min <= myVector->data.F32[i]) && (myVector->data.F32[i] <= stats->max)) {
+                    unsortedVector->data.F32[count++] = myVector->data.F32[i];
+                }
+            }
+        } else {
+            for (i = 0; i < myVector->n; i++) {
+                if ((stats->min <= myVector->data.F32[i]) && (myVector->data.F32[i] <= stats->max)) {
+                    unsortedVector->data.F32[count++] = myVector->data.F32[i];
+                }
+            }
+        }
+    } else {
+        // Store all non-masked data points into the temporary vectors.
+        count = 0;
+        if (maskVector != NULL) {
+            for (i = 0; i < myVector->n; i++) {
+                if (!(maskVal & maskVector->data.U8[i])) {
+                    unsortedVector->data.F32[count++] = myVector->data.F32[i];
+                }
+            }
+        } else {
+            for (i = 0; i < myVector->n; i++) {
+                unsortedVector->data.F32[i] = myVector->data.F32[i];
+            }
+        }
+    }
+
+    // Sort the temporary vectors.
+    sortedVector = psVectorSort(sortedVector, unsortedVector);
+    if (sortedVector == NULL) {
+        psError(PS_ERR_UNEXPECTED_NULL,
+                false,
+                PS_ERRORTEXT_psStats_STATS_SAMPLE_MEDIAN_SORT_PROBLEM);
+        return(false);
+    }
+
+    // Calculate the quartile points exactly.
+    // XXX: We should probably do a bin-midpoint if the quartile is not an
+    // integer.
+    stats->sampleUQ = sortedVector->data.F32[3 * (nValues / 4)];
+    stats->sampleLQ = sortedVector->data.F32[nValues / 4];
+
+    // Free the temporary data structures.
+    psFree(unsortedVector);
+    psFree(sortedVector);
+    return(true);
+}
+
+/******************************************************************************
+p_psVectorSampleStdev(myVector, maskVector, maskVal, stats): calculates the
+stdev of the input vector.
+Inputs
+    myVector
+    maskVector
+    maskVal
+    stats
+Returns
+    NULL
+ 
+ *****************************************************************************/
+void p_psVectorSampleStdevOLD(const psVector* myVector,
+                              const psVector* errors,
+                              const psVector* maskVector,
+                              psU32 maskVal,
+                              psStats* stats)
+{
+    psS32 i = 0;                  // Loop index variable
+    psS32 countInt = 0;           // # of data points being used
+    psF32 countFloat = 0.0;     // # of data points being used
+    psF32 mean = 0.0;           // The mean
+    psF32 diff = 0.0;           // Used in calculating stdev
+    psF32 sumSquares = 0.0;     // temporary variable
+    psF32 sumDiffs = 0.0;       // temporary variable
+
+    // This procedure requires the mean.  If it has not been already
+    // calculated, then call p_psVectorSampleMean()
+    if (0 != isnan(stats->sampleMean)) {
+        p_psVectorSampleMean(myVector, errors, maskVector, maskVal, stats);
+    }
+    // If the mean is NAN, then generate a warning and set the stdev to NAN.
+    if (0 != isnan(stats->sampleMean)) {
+        stats->sampleStdev = NAN;
+        psLogMsg(__func__, PS_LOG_WARN, "WARNING: p_psVectorSampleStdev(): p_psVectorSampleMean() reported a NAN mean.\n");
+        return;
+    }
+
+    mean = stats->sampleMean;
+    if (stats->options & PS_STAT_USE_RANGE) {
+        if (maskVector != NULL) {
+            for (i = 0; i < myVector->n; i++) {
+                if (!(maskVal & maskVector->data.U8[i]) &&
+                        (stats->min <= myVector->data.F32[i]) &&
+                        (myVector->data.F32[i] <= stats->max)) {
+                    diff = myVector->data.F32[i] - mean;
+                    sumSquares += (diff * diff);
+                    sumDiffs += diff;
+                    countInt++;
+                }
+            }
+        } else {
+            for (i = 0; i < myVector->n; i++) {
+                if ((stats->min <= myVector->data.F32[i]) &&
+                        (myVector->data.F32[i] <= stats->max)) {
+                    diff = myVector->data.F32[i] - mean;
+                    sumSquares += (diff * diff);
+                    sumDiffs += diff;
+                    countInt++;
+                }
+            }
+            countInt = myVector->n;
+        }
+    } else {
+        if (maskVector != NULL) {
+            for (i = 0; i < myVector->n; i++) {
+                if (!(maskVal & maskVector->data.U8[i])) {
+                    diff = myVector->data.F32[i] - mean;
+                    sumSquares += (diff * diff);
+                    sumDiffs += diff;
+                    countInt++;
+                }
+            }
+        } else {
+            for (i = 0; i < myVector->n; i++) {
+                diff = myVector->data.F32[i] - mean;
+                sumSquares += (diff * diff);
+                sumDiffs += diff;
+                countInt++;
+            }
+            countInt = myVector->n;
+        }
+    }
+    if (countInt == 0) {
+        stats->sampleStdev = NAN;
+        psLogMsg(__func__, PS_LOG_WARN, "WARNING: p_psVectorSampleStdev(): no valid psVector elements (%d).  Setting stats->sampleStdev = NAN.\n", countInt);
+    } else if (countInt == 1) {
+        stats->sampleStdev = 0.0;
+        psLogMsg(__func__, PS_LOG_WARN, "WARNING: p_psVectorSampleStdev(): only one valid psVector elements (%d).  Setting stats->sampleStdev = 0.0.\n", countInt);
+    } else {
+        countFloat = (psF32)countInt;
+        stats->sampleStdev = PS_SQRT_F32((sumSquares - (sumDiffs * sumDiffs / countFloat)) / (countFloat - 1));
+    }
+}
+/******************************************************************************
+p_psVectorSampleStdev(myVector, maskVector, maskVal, stats): calculates the
+stdev of the input vector.
+Inputs
+    myVector
+    maskVector
+    maskVal
+    stats
+Returns
+    NULL
+ 
+ *****************************************************************************/
+void p_psVectorSampleStdev(const psVector* myVector,
+                           const psVector* errors,
+                           const psVector* maskVector,
+                           psU32 maskVal,
+                           psStats* stats)
+{
+    psS32 i = 0;                  // Loop index variable
+    psS32 countInt = 0;           // # of data points being used
+    psF32 countFloat = 0.0;     // # of data points being used
+    psF32 mean = 0.0;           // The mean
+    psF32 diff = 0.0;           // Used in calculating stdev
+    psF32 sumSquares = 0.0;     // temporary variable
+    psF32 sumDiffs = 0.0;       // temporary variable
+    //    psF32 sum1;
+    //    psF32 sum2;
+    psF32 errorDivisor = 0.0f;
+
+    // This procedure requires the mean.  If it has not been already
+    // calculated, then call p_psVectorSampleMean()
+    if (0 != isnan(stats->sampleMean)) {
+        p_psVectorSampleMean(myVector, errors, maskVector, maskVal, stats);
+    }
+    // If the mean is NAN, then generate a warning and set the stdev to NAN.
+    if (0 != isnan(stats->sampleMean)) {
+        stats->sampleStdev = NAN;
+        psLogMsg(__func__, PS_LOG_WARN, "WARNING: p_psVectorSampleStdev(): p_psVectorSampleMean() reported a NAN mean.\n");
+        return;
+    }
+
+    mean = stats->sampleMean;
+    if (stats->options & PS_STAT_USE_RANGE) {
+        if (maskVector != NULL) {
+            for (i = 0; i < myVector->n; i++) {
+                if (!(maskVal & maskVector->data.U8[i]) &&
+                        (stats->min <= myVector->data.F32[i]) &&
+                        (myVector->data.F32[i] <= stats->max)) {
+                    diff = myVector->data.F32[i] - mean;
+                    sumSquares += (diff * diff);
+                    sumDiffs += diff;
+                    countInt++;
+                    if (errors != NULL) {
+                        errorDivisor+= (1.0 / PS_SQR(errors->data.F32[i]));
+                    }
+                }
+            }
+        } else {
+            for (i = 0; i < myVector->n; i++) {
+                if ((stats->min <= myVector->data.F32[i]) &&
+                        (myVector->data.F32[i] <= stats->max)) {
+                    diff = myVector->data.F32[i] - mean;
+                    sumSquares += (diff * diff);
+                    sumDiffs += diff;
+                    countInt++;
+                    if (errors != NULL) {
+                        errorDivisor+= (1.0 / PS_SQR(errors->data.F32[i]));
+                    }
+                }
+            }
+            countInt = myVector->n;
+        }
+    } else {
+        if (maskVector != NULL) {
+            for (i = 0; i < myVector->n; i++) {
+                if (!(maskVal & maskVector->data.U8[i])) {
+                    diff = myVector->data.F32[i] - mean;
+                    sumSquares += (diff * diff);
+                    sumDiffs += diff;
+                    countInt++;
+                    if (errors != NULL) {
+                        errorDivisor+= (1.0 / PS_SQR(errors->data.F32[i]));
+                    }
+                }
+            }
+        } else {
+            for (i = 0; i < myVector->n; i++) {
+                diff = myVector->data.F32[i] - mean;
+                sumSquares += (diff * diff);
+                sumDiffs += diff;
+                countInt++;
+            }
+            countInt = myVector->n;
+            if (errors != NULL) {
+                errorDivisor+= (1.0 / PS_SQR(errors->data.F32[i]));
+            }
+        }
+    }
+
+    if (countInt == 0) {
+        stats->sampleStdev = NAN;
+        psLogMsg(__func__, PS_LOG_WARN, "WARNING: p_psVectorSampleStdev(): no valid psVector elements (%d).  Setting stats->sampleStdev = NAN.\n", countInt);
+    } else if (countInt == 1) {
+        stats->sampleStdev = 0.0;
+        psLogMsg(__func__, PS_LOG_WARN, "WARNING: p_psVectorSampleStdev(): only one valid psVector elements (%d).  Setting stats->sampleStdev = 0.0.\n", countInt);
+    } else {
+        // XXX: The ADD specifies this as the definition of the standard
+        // deviation if the errors are known.  Verify this with IfA: none of
+        // the data points in the vector are used.  Verify that the masks and
+        // data ranges are used correctly.
+        if (errors != NULL) {
+            stats->sampleStdev = (1.0 / PS_SQRT_F32(errorDivisor));
+        } else {
+            countFloat = (psF32)countInt;
+            stats->sampleStdev = PS_SQRT_F32((sumSquares - (sumDiffs * sumDiffs / countFloat)) / (countFloat - 1));
+
+        }
+    }
+}
+
+/******************************************************************************
+p_psVectorClippedStats(myVector, errors, maskVector, maskVal, stats): calculates the
+clipped stats (mean or stdev) of the input vector.
+ 
+Inputs
+    myVector
+    maskVector
+    maskVal
+    stats
+Returns
+    0 for success.
+    -1: error
+    -2: warning
+ 
+XXX: Do we really need to calculate median and mean?
+ 
+XXX: Use static vectors for tmpMask.
+ 
+XXX: This has not been tested.
+ *****************************************************************************/
+psS32 p_psVectorClippedStats(const psVector* myVector,
+                             const psVector* errors,
+                             const psVector* maskVector,
+                             psU32 maskVal,
+                             psStats* stats)
+{
+    psF32 clippedMean = 0.0;    // self-explanatory
+    psF32 clippedStdev = 0.0;   // self-explanatory
+    psVector* tmpMask = NULL;   // Temporary vector for masks during iterations.
+    static psStats *statsTmp = NULL;   // Temporary psStats struct.
+    psS32 rc = 0;               // Return code.
+
+    // Ensure that stats->clipIter is within the proper range.
+    PS_INT_CHECK_RANGE(stats->clipIter,
+                       PS_CLIPPED_NUM_ITER_LB,
+                       PS_CLIPPED_NUM_ITER_UB, -1);
+
+    // Ensure that stats->clipSigma is within the proper range.
+    PS_INT_CHECK_RANGE(stats->clipSigma,
+                       PS_CLIPPED_SIGMA_LB,
+                       PS_CLIPPED_SIGMA_UB, -1);
+
+    // Allocate a psStats structure for calculating the mean, median, and
+    // stdev.
+    if (statsTmp == NULL) {
+        statsTmp = psStatsAlloc(PS_STAT_SAMPLE_MEAN);
+        p_psMemSetPersistent(statsTmp, true);
+    }
+
+    // We allocate a temporary mask vector since during the iterative
+    // steps that follow, we will be masking off additional data points.
+    // However, we do no want to modify the original mask vector.
+    tmpMask = psVectorAlloc(myVector->n, PS_TYPE_U8);
+
+    // If we were called with a mask vector, then initialize the temporary
+    // mask vector with those values.  Otherwise, initialize to zero.
+    if (maskVector != NULL) {
+        for (psS32 i = 0; i < tmpMask->n; i++) {
+            tmpMask->data.U8[i] = maskVector->data.U8[i];
+        }
+    } else {
+        for (psS32 i = 0; i < tmpMask->n; i++) {
+            tmpMask->data.U8[i] = 0;
+        }
+    }
+
+    // 1. Compute the sample median.
+    p_psVectorSampleMedian(myVector, maskVector, maskVal, statsTmp);
+    if (isnan(statsTmp->sampleMedian)) {
+        psLogMsg(__func__, PS_LOG_WARN, "Call to p_psVectorSampleMedian returned NAN\n");
+        stats->clippedMean = NAN;
+        stats->clippedStdev = NAN;
+        return(-2);
+    }
+
+    // 2. Compute the sample standard deviation.
+    p_psVectorSampleStdev(myVector, errors, maskVector, maskVal, statsTmp);
+    if (isnan(statsTmp->sampleStdev)) {
+        psLogMsg(__func__, PS_LOG_WARN, "Call to p_psVectorSampleStdev returned NAN\n");
+        stats->clippedMean = NAN;
+        stats->clippedStdev = NAN;
+        return(-2);
+    }
+
+    // 3. Use the sample median as the first estimator of the mean X.
+    clippedMean = statsTmp->sampleMedian;
+
+    // 4. Use the sample stdev as the first estimator of the mean stdev.
+    clippedStdev = statsTmp->sampleStdev;
+
+    // 5. Repeat N (stats->clipIter) times:
+    for (psS32 iter = 0; iter < stats->clipIter; iter++) {
+        // a) Exclude all values x_i for which |x_i - x| > K * stdev
+        if (errors != NULL) {
+            for (psS32 j = 0; j < myVector->n; j++) {
+                if (fabs(myVector->data.F32[j] - clippedMean) >
+                        (stats->clipSigma * errors->data.F32[j])) {
+                    tmpMask->data.U8[j] = 0xff;
+                }
+            }
+        } else {
+            for (psS32 j = 0; j < myVector->n; j++) {
+                if (fabs(myVector->data.F32[j] - clippedMean) >
+                        (stats->clipSigma * clippedStdev)) {
+                    tmpMask->data.U8[j] = 0xff;
+                }
+            }
+        }
+
+        // b) compute new mean and stdev
+        p_psVectorSampleMean(myVector, errors, tmpMask, 0xff, statsTmp);
+        p_psVectorSampleStdev(myVector, errors, tmpMask, 0xff, statsTmp);
+
+        // If the new mean and stdev are NAN, we must exit the loop.
+        // Otherwise, use the new results and continue.
+        if (isnan(statsTmp->sampleMean) || isnan(statsTmp->sampleStdev)) {
+            // Exit loop.  XXX: Should we throw an error/warning here?
+            iter = stats->clipIter;
+            rc = -1;
+        } else {
+            clippedMean = statsTmp->sampleMean;
+            clippedStdev = statsTmp->sampleStdev;
+        }
+    }
+
+    // 7. The last calcuated value of x is the cliped mean.
+    if (stats->options & PS_STAT_CLIPPED_MEAN) {
+        stats->clippedMean = clippedMean;
+    }
+    // 8. The last calcuated value of stdev is the cliped stdev.
+    if (stats->options & PS_STAT_CLIPPED_STDEV) {
+        stats->clippedStdev = clippedStdev;
+    }
+
+    psFree(tmpMask);
+    return(rc);
+}
+
+/*****************************************************************************
+These macros and functions define the following functions:
+ 
+<    p_psNormalizeVectorRange(myData, low, high)
+ 
+That assumes that the low/high arguments are PS_TYPE_F64; the vector myData
+can be of any type.  Arguments low/high will be converted to the appropriate
+type and one of the type-specific functions below will be called:
+ 
+    p_psNormalizeVectorRangeU8(myData, low, high)
+    p_psNormalizeVectorRangeU16(myData, low, high)
+    p_psNormalizeVectorRangeU32(myData, low, high)
+    p_psNormalizeVectorRangeU64(myData, low, high)
+    p_psNormalizeVectorRangeS8(myData, low, high)
+    p_psNormalizeVectorRangeS16(myData, low, high)
+    p_psNormalizeVectorRangeS32(myData, low, high)
+    p_psNormalizeVectorRangeS64(myData, low, high)
+    p_psNormalizeVectorRangeF32(myData, low, high)
+    p_psNormalizeVectorRangeF64(myData, low, high)
+ *****************************************************************************/
+#define PS_FUNC_MACRO_NORMALIZE_VECTOR_RANGE(TYPE) \
+void p_psNormalizeVectorRange##TYPE(psVector* myData, \
+                                    ps##TYPE outLow, \
+                                    ps##TYPE outHigh) \
+{ \
+    ps##TYPE min = (ps##TYPE) PS_MAX_##TYPE; \
+    ps##TYPE max = (ps##TYPE) -PS_MAX_##TYPE; \
+    psS32 i = 0; \
+    \
+    for (i = 0; i < myData->n; i++) { \
+        if (myData->data.TYPE[i] < min) { \
+            min = myData->data.TYPE[i]; \
+        } \
+        if (myData->data.TYPE[i] > max) { \
+            max = myData->data.TYPE[i]; \
+        } \
+    } \
+    \
+    /* Ensure that max!=min before we divide by (max-min) */ \
+    if (max != min) { \
+        for (i = 0; i < myData->n; i++) { \
+            myData->data.TYPE[i] = (outLow + (myData->data.TYPE[i] - min) * \
+                                    (outHigh - outLow) / (max - min)); \
+        } \
+    } else { \
+        psLogMsg(__func__, PS_LOG_WARN, "WARNING: (max==min).  Setting all elements to min.\n"); \
+        for (i = 0; i < myData->n; i++) \
+        { \
+            \
+            myData->data.TYPE[i] = outLow; \
+            \
+        } \
+    } \
+} \
+
+PS_FUNC_MACRO_NORMALIZE_VECTOR_RANGE(U8)
+PS_FUNC_MACRO_NORMALIZE_VECTOR_RANGE(U16)
+PS_FUNC_MACRO_NORMALIZE_VECTOR_RANGE(U32)
+PS_FUNC_MACRO_NORMALIZE_VECTOR_RANGE(U64)
+PS_FUNC_MACRO_NORMALIZE_VECTOR_RANGE(S8)
+PS_FUNC_MACRO_NORMALIZE_VECTOR_RANGE(S16)
+PS_FUNC_MACRO_NORMALIZE_VECTOR_RANGE(S32)
+PS_FUNC_MACRO_NORMALIZE_VECTOR_RANGE(S64)
+PS_FUNC_MACRO_NORMALIZE_VECTOR_RANGE(F32)
+PS_FUNC_MACRO_NORMALIZE_VECTOR_RANGE(F64)
+
+void p_psNormalizeVectorRange(psVector* myData,
+                              psF64 outLow,
+                              psF64 outHigh)
+{
+    switch (myData->type.type) {
+    case PS_TYPE_U8:
+        p_psNormalizeVectorRangeU8(myData, (psU8) outLow, (psU8) outHigh);
+        break;
+    case PS_TYPE_U16:
+        p_psNormalizeVectorRangeU16(myData, (psU16) outLow, (psU16) outHigh);
+        break;
+    case PS_TYPE_U32:
+        p_psNormalizeVectorRangeU32(myData, (psU32) outLow, (psU32) outHigh);
+        break;
+    case PS_TYPE_U64:
+        p_psNormalizeVectorRangeU64(myData, (psU64) outLow, (psU64) outHigh);
+        break;
+    case PS_TYPE_S8:
+        p_psNormalizeVectorRangeS8(myData, (psS8) outLow, (psS8) outHigh);
+        break;
+    case PS_TYPE_S16:
+        p_psNormalizeVectorRangeS16(myData, (psS16) outLow, (psS16) outHigh);
+        break;
+    case PS_TYPE_S32:
+        p_psNormalizeVectorRangeS32(myData, (psS32) outLow, (psS32) outHigh);
+        break;
+    case PS_TYPE_S64:
+        p_psNormalizeVectorRangeS64(myData, (psS64) outLow, (psS64) outHigh);
+        break;
+    case PS_TYPE_F32:
+        p_psNormalizeVectorRangeF32(myData, (psF32) outLow, (psF32) outHigh);
+        break;
+    case PS_TYPE_F64:
+        p_psNormalizeVectorRangeF64(myData, (psF64) outLow, (psF64) outHigh);
+        break;
+    case PS_TYPE_C32:
+    case PS_TYPE_C64:
+    default:
+        psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                "Unallowable operation: %s has incorrect type.",
+                myData);
+        break;
+    }
+}
+
+/******************************************************************************
+p_ps1DPolyMedian(myPoly, rangeLow, rangeHigh, midpoint): This routine takes
+as input a 1-D polynomial of arbitrary order (though we are using 2nd-order
+polynomials here) and a range of x-values for which it is defined:
+[rangeLow, rangeHigh].  It determines the x-value of that polynomial such
+that f(x) == midpoint.  This functions uses a binary-search algorithm on the
+range and assumes that the polynomial is monotonically increasing or
+decreasing within that range.
+ 
+XXX: Terminate when f(x)-getThisValue is within some error tolerance.
+ 
+XXX: Create a 2nd-order polynomial version and solve for X analytically.
+ *****************************************************************************/
+psF32 p_ps1DPolyMedian(psPolynomial1D* myPoly,
+                       psF32 rangeLow,
+                       psF32 rangeHigh,
+                       psF32 getThisValue)
+{
+    PS_POLY_CHECK_NULL(myPoly, NAN);
+    PS_FLOAT_COMPARE(rangeLow, rangeHigh, NAN);
+    // We ensure that the requested f(y) value, which is getThisValue, is
+    // falls within the range of y-values of the polynomial "myPoly" in the
+    // specified x-range (rangeLow:rangeHigh).
+    psF32 fLo = psPolynomial1DEval(
+                    myPoly,
+                    rangeLow
+                );
+    psF32 fHi = psPolynomial1DEval(
+                    myPoly,
+                    rangeHigh
+                );
+    if (!((fLo <= getThisValue) && (fHi >= getThisValue))) {
+        psError(PS_ERR_UNKNOWN,
+                true,
+                PS_ERRORTEXT_psStats_STATS_POLY_MEDIAN_OUT_OF_RANGE);
+        return(NAN);
+    }
+
+    psS32 numIterations = 0;
+    psF32 midpoint = 0.0;
+    psF32 oldMidpoint = 1.0;
+    psF32 f = 0.0;
+
+    while (numIterations < PS_POLY_MEDIAN_MAX_ITERATIONS) {
+        midpoint = (rangeHigh + rangeLow) / 2.0;
+        if (fabs(midpoint - oldMidpoint) <= FLT_EPSILON) {
+            return (midpoint);
+        }
+        oldMidpoint = midpoint;
+
+        f = psPolynomial1DEval(
+                myPoly,
+                midpoint
+            );
+        if (fabs(f - getThisValue) <= FLT_EPSILON) {
+            return (midpoint);
+        }
+
+        if (f > getThisValue) {
+            rangeHigh = midpoint;
+        } else {
+            rangeLow = midpoint;
+        }
+        numIterations++;
+    }
+    return (midpoint);
+}
+
+/******************************************************************************
+fitQuadraticSearchForYThenReturnX(*xVec, *yVec, binNum, yVal): A general
+routine which fits a quadratic to three points and returns the x-value
+corresponding to the input y-value.  This routine takes psVectors of x/y pairs
+as input, and fits a quadratic to the 3 points surrounding element binNum in
+the vectors (the midpoint between element i and i+1 is used for x[i]).  It
+then determines for what value x does that quadratic f(x) = yVal (the input
+parameter).
+ 
+XXX: After you fit the polynomial, solve for X analytically.
+ 
+XXX: the vectors do not have to be the same length.  Must insert the proper
+tests to ensure that binNum is within acceptable ranges for both vectors.
+*****************************************************************************/
+psF32 fitQuadraticSearchForYThenReturnX(psVector *xVec,
+                                        psVector *yVec,
+                                        psS32 binNum,
+                                        psF32 yVal)
+{
+    PS_VECTOR_CHECK_NULL(xVec, NAN);
+    PS_VECTOR_CHECK_NULL(yVec, NAN);
+    PS_VECTOR_CHECK_TYPE(xVec, PS_TYPE_F32, NAN);
+    PS_VECTOR_CHECK_TYPE(yVec, PS_TYPE_F32, NAN);
+    //    PS_VECTOR_CHECK_SIZE_EQUAL(xVec, yVec, NAN);
+    PS_INT_CHECK_RANGE(binNum, 0, (xVec->n - 1), NAN);
+    PS_INT_CHECK_RANGE(binNum, 0, (yVec->n - 1), NAN);
+
+    //    PS_VECTOR_DECLARE_ALLOC_STATIC(x, 3, PS_TYPE_F64);
+    //    PS_VECTOR_DECLARE_ALLOC_STATIC(y, 3, PS_TYPE_F64);
+    //    PS_VECTOR_DECLARE_ALLOC_STATIC(yErr, 3, PS_TYPE_F64);
+    //    PS_POLY_1D_DECLARE_ALLOC_STATIC(myPoly, 2, PS_POLYNOMIAL_ORD);
+    psVector *x = psVectorAlloc(3, PS_TYPE_F64);
+    psVector *y = psVectorAlloc(3, PS_TYPE_F64);
+    psVector *yErr = psVectorAlloc(3, PS_TYPE_F64);
+    psPolynomial1D *myPoly = psPolynomial1DAlloc(2, PS_POLYNOMIAL_ORD);
+
+    psF32 tmpFloat = 0.0f;
+
+    if ((binNum > 0) && (binNum < (yVec->n - 2))) {
+        // The general case.  We have all three points.
+        x->data.F64[0] = (psF64) (0.5 * (xVec->data.F32[binNum - 1] + xVec->data.F32[binNum]));
+        x->data.F64[1] = (psF64) (0.5 * (xVec->data.F32[binNum] + xVec->data.F32[binNum+1]));
+        x->data.F64[2] = (psF64) (0.5 * (xVec->data.F32[binNum+1] + xVec->data.F32[binNum+2]));
+        y->data.F64[0] = yVec->data.F32[binNum - 1];
+        y->data.F64[1] = yVec->data.F32[binNum];
+        y->data.F64[2] = yVec->data.F32[binNum + 1];
+
+        // Ensure that yVal is within the range of the bins we are using.
+        if (!((y->data.F64[0] <= yVal) && (yVal <= y->data.F64[2]))) {
+            psError(PS_ERR_BAD_PARAMETER_VALUE, true,
+                    PS_ERRORTEXT_psStats_YVAL_OUT_OF_RANGE,
+                    (psF64)yVal,y->data.F64[2],y->data.F64[0]);
+        }
+        yErr->data.F64[0] = 1.0;
+        yErr->data.F64[1] = 1.0;
+        yErr->data.F64[2] = 1.0;
+
+        // Determine the coefficients of the polynomial.
+        myPoly = psVectorFitPolynomial1D(myPoly, x, y, yErr);
+        if (myPoly == NULL) {
+            psError(PS_ERR_UNEXPECTED_NULL,
+                    false,
+                    PS_ERRORTEXT_psStats_STATS_FIT_QUADRATIC_POLYNOMIAL_1D_FIT);
+            psFree(myPoly);
+            psFree(x);
+            psFree(y);
+            psFree(yErr);
+            return(NAN);
+        }
+        // Call p_ps1DPolyMedian(), which does a binary search on the
+        // polynomial, looking for the value x such that f(x) = yVal
+        tmpFloat = p_ps1DPolyMedian(myPoly, x->data.F64[0], x->data.F64[2], yVal);
+        if (isnan(tmpFloat)) {
+            psError(PS_ERR_UNEXPECTED_NULL,
+                    false,
+                    PS_ERRORTEXT_psStats_STATS_FIT_QUADRATIC_POLY_MEDIAN);
+            psFree(myPoly);
+            psFree(x);
+            psFree(y);
+            psFree(yErr);
+            return(NAN);
+        }
+
+    } else {
+        // The special case where we have two points only at the beginning of
+        // the vectors x and y.
+        if (binNum == 0) {
+            tmpFloat = 0.5 * (xVec->data.F32[binNum] +
+                              xVec->data.F32[binNum + 1]);
+        } else if (binNum == (xVec->n - 1)) {
+            // The special case where we have two points only at the end of
+            // the vectors x and y.
+            // XXX: Is this right?
+            tmpFloat = xVec->data.F32[binNum];
+        } else if (binNum == (xVec->n - 2)) {
+            // XXX: Is this right?
+            tmpFloat = 0.5 * (xVec->data.F32[binNum] +
+                              xVec->data.F32[binNum + 1]);
+        }
+    }
+
+    psFree(myPoly);
+    psFree(x);
+    psFree(y);
+    psFree(yErr);
+    return(tmpFloat);
+}
+
+/******************************************************************************
+p_psVectorRobustStats(myVector, maskVector, maskVal, stats): this procedure
+calculates a variety of robust stat measures:
+    PS_STAT_ROBUST_MEAN
+    PS_STAT_ROBUST_MEDIAN
+    PS_STAT_ROBUST_MODE
+    PS_STAT_ROBUST_STDEV
+    PS_STAT_ROBUST_QUARTILE
+I have included all that computation in a single function, as opposed to
+breaking it across several functions for one primary reason:  they all require
+the same basic initial processing steps (calculate the histogram, etc.).
+ 
+Inputs
+    myVector
+    maskVector
+    maskVal
+    stats
+Returns
+    0 on success.
+ 
+XXX: Check for errors in psLib routines that we call.
+*****************************************************************************/
+psS32 p_psVectorRobustStats(const psVector* myVector,
+                            const psVector* errors,
+                            const psVector* maskVector,
+                            psU32 maskVal,
+                            psStats* stats)
+{
+    psHistogram* robustHistogram = NULL;
+    psVector* robustHistogramVector = NULL;
+    psF32 binSize = 0.0;        // Size of the histogram bins
+    psS32 LQBinNum = -1;          // Bin num for lower quartile
+    psS32 UQBinNum = -1;          // Bin num for upper quartile
+    psS32 medianBinNum = -1;
+    psS32 i = 0;                  // Loop index variable
+    psS32 modeBinNum = 0;
+    psF32 modeBinCount = 0.0;
+    psF32 dL = 0.0;
+    psS32 numBins = 0;
+    psF32 myMean = 0.0;
+    psF32 myStdev = 0.0;
+    psF32 countFloat = 0.0;
+    psF32 diff = 0.0;
+    psF32 sumSquares = 0.0;
+    psF32 sumDiffs = 0.0;
+    psVector* cumulativeRobustSums = NULL;
+    psF32 sumRobust = 0.0;
+    psF32 sumN50 = 0.0;
+    psF32 sumNfit = 0.0;
+    psScalar tmpScalar;
+    tmpScalar.type.type = PS_TYPE_F32;
+    psStats* tmpStats = psStatsAlloc(PS_STAT_CLIPPED_STDEV | PS_STAT_CLIPPED_MEAN);
+
+    // Compute the initial bin size of the robust histogram.  This is done
+    // by computing the clipped standard deviation of the vector, and dividing
+    // that by 10.0;
+    //XXX: add errors
+    psS32 rc = p_psVectorClippedStats(myVector, NULL, maskVector, maskVal, tmpStats);
+    if (rc != 0) {
+        psError(PS_ERR_UNEXPECTED_NULL,
+                false,
+                PS_ERRORTEXT_psStats_ROBUST_STATS_CLIPPED_STATS);
+        return(1);
+    }
+    binSize = tmpStats->clippedStdev / 10.0f;
+
+    // If stats->clippedStdev == 0.0, then all data elements have the same
+    // value.  Therefore, we can set the appropiate results and return.
+    if (fabs(binSize) <= FLT_EPSILON) {
+        if (stats->options & PS_STAT_ROBUST_MEAN) {
+            stats->robustMean = tmpStats->clippedMean;
+        }
+        if (stats->options & PS_STAT_ROBUST_MEDIAN) {
+            stats->robustMedian = tmpStats->clippedMean;
+        }
+        if (stats->options & PS_STAT_ROBUST_MODE) {
+            stats->robustMode = tmpStats->clippedMean;
+        }
+        if (stats->options & PS_STAT_ROBUST_STDEV) {
+            stats->robustStdev = 0.0;
+        }
+        if (stats->options & PS_STAT_ROBUST_QUARTILE) {
+            stats->robustUQ = tmpStats->clippedMean;
+            stats->robustLQ = tmpStats->clippedMean;
+        }
+        // XXX: Set these to the number of unmasked data points?
+        stats->robustNfit = 0.0;
+        stats->robustN50 = 0.0;
+        psFree(tmpStats);
+        return(0);
+    }
+
+    // Determine minimum and maximum values in the data vector.
+    if (isnan(tmpStats->min)) {
+        if (0 != p_psVectorMin(myVector, maskVector, maskVal, tmpStats)) {
+            psLogMsg(__func__, PS_LOG_WARN,
+                     "WARNING: p_psVectorMin(): p_psVectorMin() reported a NAN mean.\n");
+            return(1);
+        }
+    }
+    if (isnan(tmpStats->max)) {
+        if (0 != p_psVectorMax(myVector, maskVector, maskVal, tmpStats)) {
+            psLogMsg(__func__, PS_LOG_WARN,
+                     "WARNING: p_psVectorMin(): p_psVectorMax() reported a NAN mean.\n");
+            return(1);
+        }
+    }
+
+    // Create the histogram structure.  NOTE: we can not specify the bin size
+    // precisely since the argument to psHistogramAlloc() is the number of
+    // bins, not the binSize.  Also, if we get here, we know that
+    // binSize != 0.0.
+    numBins = (psS32)((tmpStats->max - tmpStats->min) / binSize);
+    robustHistogram = psHistogramAlloc(tmpStats->min, tmpStats->max, numBins);
+
+    // Populate the histogram array.
+    psVectorHistogram(robustHistogram, myVector, errors, maskVector, maskVal);
+
+    // Smooth the histogram, Gaussian-style.
+    robustHistogramVector = p_psVectorSmoothHistGaussian(robustHistogram,
+                            tmpStats->clippedStdev / 4.0f);
+
+    /**************************************************************************
+    Determine the median/lower/upper quartile bin numbers.
+
+    We define a vector called "cumulativeRobustSums" where the value at
+    index position i is equal to the sum of bins 0:i.  This will be used in
+    determining the median and lower/upper quartiles.
+    **************************************************************************/
+    cumulativeRobustSums = psVectorAlloc(robustHistogramVector->n, PS_TYPE_F32);
+    cumulativeRobustSums->data.F32[0] = robustHistogramVector->data.F32[0];
+    for (i = 1; i < robustHistogramVector->n; i++) {
+        cumulativeRobustSums->data.F32[i] = cumulativeRobustSums->data.F32[i - 1] +
+                                            robustHistogramVector->data.F32[i];
+    }
+    sumRobust = cumulativeRobustSums->data.F32[robustHistogramVector->n - 1];
+
+    tmpScalar.data.F32 = sumRobust / 4.0;
+    LQBinNum = p_psVectorBinDisect(cumulativeRobustSums, &tmpScalar);
+    tmpScalar.data.F32 = 3.0 * sumRobust / 4.0;
+    UQBinNum = p_psVectorBinDisect(cumulativeRobustSums, &tmpScalar);
+    tmpScalar.data.F32 = sumRobust / 2.0;
+    medianBinNum = p_psVectorBinDisect(cumulativeRobustSums, &tmpScalar);
+
+    if ((LQBinNum < 0) || (UQBinNum < 0)) {
+        psError(PS_ERR_UNKNOWN, true,
+                PS_ERRORTEXT_psStats_ROBUST_QUARTILE_BINS_FAILED);
+        return(1);
+    }
+    if (medianBinNum < 0) {
+        psError(PS_ERR_UNKNOWN, true,
+                PS_ERRORTEXT_psStats_ROBUST_QUARTILE_BINS_FAILED);
+        return(1);
+    }
+    /**************************************************************************
+    Determine the mode in the range LQ:UQ.
+    **************************************************************************/
+    // Determine the bin with the peak value in the range LQ to UQ.
+    modeBinNum = LQBinNum;
+    modeBinCount = robustHistogramVector->data.F32[LQBinNum];
+    sumN50 = robustHistogram->nums->data.F32[LQBinNum];
+    for (i = LQBinNum + 1; i <= UQBinNum; i++) {
+        if (robustHistogramVector->data.F32[i] > modeBinCount) {
+            modeBinNum = i;
+            modeBinCount = robustHistogramVector->data.F32[i];
+        }
+        sumN50 += robustHistogram->nums->data.F32[i];
+    }
+
+    dL = (UQBinNum - LQBinNum) / 4;
+    /**************************************************************************
+    Determine the mean/stdev for the bins in the range mode-dL to mode+dL
+    **************************************************************************/
+    // Calculate the mean of the smoothed robust histogram in the range
+    // mode-dL to mode+dL.  We use the midpoint of each bin as the mean for
+    // that bin (this is a non-exact approximation).
+    sumNfit = 0.0;
+    myMean = 0.0;
+    for (i = modeBinNum - dL; i <= modeBinNum + dL; i++) {
+        if ((0 <= i) && (i < robustHistogramVector->n)) {
+            myMean += (robustHistogramVector->data.F32[i]) * PS_BIN_MIDPOINT(robustHistogram, i);
+            countFloat += robustHistogramVector->data.F32[i];
+        }
+
+        sumNfit += robustHistogram->nums->data.F32[i];
+    }
+    // XXX: divide by zero?
+    myMean /= countFloat;
+
+    // Calculate the stdev of the smoothed robust histogram in the range
+    // mode-dL to mode+dL.  We use the midpoint of each bin as the mean for
+    // that bin.
+    for (i = modeBinNum - dL; i <= modeBinNum + dL; i++) {
+        if ((0 <= i) && (i < robustHistogramVector->n)) {
+            diff = PS_BIN_MIDPOINT(robustHistogram, i) - myMean;
+            sumSquares += diff * diff * robustHistogramVector->data.F32[i];
+            sumDiffs += diff * robustHistogramVector->data.F32[i];
+        }
+    }
+    myStdev = PS_SQRT_F32((sumSquares - (sumDiffs * sumDiffs / countFloat)) / (countFloat - 1));
+
+    p_psNormalizeVectorRangeF32(robustHistogramVector, 0.0, 1.0);
+
+    if ((stats->options & PS_STAT_ROBUST_MEAN) ||
+            (stats->options & PS_STAT_ROBUST_STDEV)) {
+
+        // Using the above (myMean, myStdev) as initial estimates, we fit a
+        // Gaussian to the robustHistogramVector.
+        psImage *covar = NULL;
+        /* XXX: Old, remove.
+                psMinimization *min = psMinimizationAlloc(100, 0.1);
+                psVector *myParams = psVectorAlloc(2, PS_TYPE_F32);
+                psArray *myCoords = psArrayAlloc(robustHistogramVector->n);
+                psVector *y = psVectorAlloc(robustHistogramVector->n, PS_TYPE_F32);
+                myParams->data.F32[0] = myMean;
+                myParams->data.F32[1] = myStdev;
+                for (i=0;i<robustHistogramVector->n;i++) {
+                    myCoords->data[i] = (psPtr *) psVectorAlloc(2, PS_TYPE_F32);
+                    ((psVector *) (myCoords->data[i]))->data.F32[0] = (psF32) i;
+                    y->data.F32[i] = robustHistogramVector->data.F32[i];
+                }
+        */
+
+        psMinimization *min = psMinimizationAlloc(100, 0.01);
+        psVector *myParams = psVectorAlloc(2, PS_TYPE_F32);
+        psArray *myCoords = psArrayAlloc(2 * dL + 1);
+        psVector *y = psVectorAlloc(2 * dL + 1, PS_TYPE_F32);
+        myParams->data.F32[0] = myMean;
+        myParams->data.F32[1] = myStdev;
+
+        for (i = modeBinNum - dL; i <= modeBinNum + dL; i++) {
+            int index = i - modeBinNum + dL;
+            myCoords->data[index] = (psPtr *) psVectorAlloc(2, PS_TYPE_F32);
+            ((psVector *) (myCoords->data[index]))->data.F32[0] = PS_BIN_MIDPOINT(robustHistogram, i);
+            y->data.F32[index] = robustHistogramVector->data.F32[i];
+        }
+
+
+        psBool rc = psMinimizeLMChi2(min,
+                                     NULL,
+                                     myParams,
+                                     NULL,
+                                     myCoords,
+                                     y,
+                                     NULL,
+                                     (psMinimizeLMChi2Func) psMinimizeLMChi2Gauss1D);
+        if (rc == false) {
+            psLogMsg(__func__, PS_LOG_WARN,
+                     "WARNING: failed to minimize with psMinimizeLMChi2().\n");
+        }
+
+        // XXX: Verify this with IfA
+        // XXX: The check on the minimization is better than the difference from myMean.
+        //      Do they still want this code?
+
+        if (stats->options & PS_STAT_ROBUST_MEAN) {
+            if (fabs((myParams->data.F32[0] - myMean)/myMean) > 0.1) {
+                psLogMsg(__func__, PS_LOG_WARN,
+                         "WARNING: the fitted Gaussian has more than 10%% error for the mean.\n");
+                psLogMsg(__func__, PS_LOG_WARN,
+                         "WARNING: Using the calculated mean instead of Gaussian-fitted mean.");
+                //                     "WARNING: Using the calculated mean instead of Gaussian-fitted mean.(calc, fit) is (%f, %f)\n",
+                //                     myMean, myParams->data.F32[0]);
+                stats->robustMean = myMean;
+            } else {
+                stats->robustMean = myParams->data.F32[0];
+            }
+        }
+
+        if (stats->options & PS_STAT_ROBUST_STDEV) {
+            if (fabs((myParams->data.F32[1] - myStdev)/myStdev) > 0.1) {
+                psLogMsg(__func__, PS_LOG_WARN,
+                         "WARNING: the fitted Gaussian has more than 10%% error for the stdev.\n");
+                psLogMsg(__func__, PS_LOG_WARN,
+                         "WARNING: Using the calculated stdev instead of Gaussian-fitted stdev.");
+                //                     "WARNING: Using the calculated stdev instead of Gaussian-fitted stdev.(calc, fit) is (%f, %f)\n",
+                //                     myStdev, myParams->data.F32[1]);
+                stats->robustStdev = myStdev;
+            } else {
+                stats->robustStdev = myParams->data.F32[1];
+            }
+        }
+        psFree(covar);
+        psFree(min);
+        psFree(myCoords);
+        psFree(y);
+        psFree(myParams);
+    }
+
+
+    /**************************************************************************
+    Set the appropriate members in the output stats struct.
+    **************************************************************************/
+
+    if (stats->options & PS_STAT_ROBUST_MODE) {
+        stats->robustMode = PS_BIN_MIDPOINT(robustHistogram, modeBinNum);
+    }
+
+
+    // To determine the median, we fit a quadratic y=f(x) to the three bins
+    // surrounding the bin containing the median (x is the midpoint of each
+    // bin and y is the value of each bin).  Then we figure out what value
+    // of x corresponds to f(x) being the median (half of all points).
+    if (stats->options & PS_STAT_ROBUST_MEDIAN) {
+        // Take a psVector.  Fit a polynomial y = f(x) to the 3 data elements
+        // surrounding medianBinNum, then find the x-value corresponding y = sumRobust/2.0.
+
+        //XXX: robustHistogram->bounds and cumulativeRobustSums are of different lengths.
+        //Determine id that is okay.
+        stats->robustMedian = fitQuadraticSearchForYThenReturnX(
+                                  robustHistogram->bounds,
+                                  cumulativeRobustSums,
+                                  medianBinNum,
+                                  sumRobust/2.0);
+    }
+
+    // To determine the quartiles, we fit a quadratic y=f(x) to the three bins
+    // surrounding the bin containing LQ/UQ (x is the midpoint of each
+    // bin and y is the value of each bin).  Then we figure out what value
+    // of x corresponds to f(x) being the LQ/UQ.
+    if (stats->options & PS_STAT_ROBUST_QUARTILE) {
+        countFloat = cumulativeRobustSums->data.F32[robustHistogramVector->n - 1];
+
+        //XXX: robustHistogram->bounds and cumulativeRobustSums are of different lengths.
+        //Determine id that is okay.
+        stats->robustLQ = fitQuadraticSearchForYThenReturnX(
+                              robustHistogram->bounds,
+                              cumulativeRobustSums,
+                              LQBinNum,
+                              countFloat/4.0);
+        //XXX: robustHistogram->bounds and cumulativeRobustSums are of different lengths.
+        //Determine id that is okay.
+        stats->robustUQ = fitQuadraticSearchForYThenReturnX(
+                              robustHistogram->bounds,
+                              cumulativeRobustSums,
+                              UQBinNum,
+                              3.0 * countFloat/4.0);
+    }
+    // XXX: I think sumNfit == sumN50 here.
+    stats->robustNfit = sumNfit;
+    stats->robustN50 = sumN50;
+
+    psFree(tmpStats);
+    psFree(robustHistogram);
+    psFree(robustHistogramVector);
+    psFree(cumulativeRobustSums);
+    return(0);
+}
+
+/*****************************************************************************/
+
+/* FUNCTION IMPLEMENTATION - PUBLIC                                          */
+
+/*****************************************************************************/
+
+static void histogramFree(psHistogram* myHist);
+
+/******************************************************************************
+    psStatsAlloc(): This routine must create a new psStats data structure.
+ *****************************************************************************/
+psStats* psStatsAlloc(psStatsOptions options)
+{
+    psStats* newStruct = NULL;
+
+    newStruct = (psStats* ) psAlloc(sizeof(psStats));
+    newStruct->sampleMean = NAN;
+    newStruct->sampleMedian = NAN;
+    newStruct->sampleStdev = NAN;
+    newStruct->sampleUQ = NAN;
+    newStruct->sampleLQ = NAN;
+    newStruct->robustMean = NAN;
+    newStruct->robustMedian = NAN;
+    newStruct->robustMode = NAN;
+    newStruct->robustStdev = NAN;
+    newStruct->robustUQ = NAN;
+    newStruct->robustLQ = NAN;
+    newStruct->robustN50 = 0;
+    newStruct->robustNfit = 0;
+    newStruct->clippedMean = NAN;
+    newStruct->clippedStdev = NAN;
+    newStruct->clipSigma = 3.0;
+    newStruct->clipIter = 3.0;
+    newStruct->min = NAN;
+    newStruct->max = NAN;
+    newStruct->binsize = NAN;
+    newStruct->options = options;
+
+    return (newStruct);
+}
+
+/******************************************************************************
+psHistogramAlloc(lower, upper, n): allocate a uniform histogram structure
+with the specifed upper and lower limits, and the specifed number of bins.
+This routine will also set the bounds for each of the bins.
+ 
+Input:
+    lower
+    upper
+    n
+Returns:
+    The histogram structure
+ *****************************************************************************/
+psHistogram* psHistogramAlloc(psF32 lower, psF32 upper, psS32 n)
+{
+    PS_INT_CHECK_POSITIVE(n, NULL);
+    PS_FLOAT_COMPARE(lower, upper, NULL);
+
+    psS32 i = 0;                  // Loop index variable
+    psHistogram* newHist = NULL;        // The new histogram structure
+    psF32 binSize = 0.0;        // The histogram bin size
+
+    // Allocate memory for the new histogram structure.  If there are N
+    // bins, then there are N+1 bounds to those bins.
+    newHist = (psHistogram* ) psAlloc(sizeof(psHistogram));
+    psMemSetDeallocator(newHist, (psFreeFcn) histogramFree);
+    newHist->bounds = psVectorAlloc(n + 1, PS_TYPE_F32);
+    newHist->bounds->n = newHist->bounds->nalloc;
+
+    // Calculate the bounds for each bin.
+    binSize = (upper - lower) / (psF32)n;
+    // XXX: Is the following necessary? It prevents the max data point
+    // from being in a non-existant bin.
+    binSize += FLT_EPSILON;
+    for (i = 0; i < n + 1; i++) {
+        newHist->bounds->data.F32[i] = lower + (binSize * (psF32)i);
+    }
+
+    // Allocate the bins, and initialize them to zero.
+    newHist->nums = psVectorAlloc(n, PS_TYPE_F32);
+    for (i = 0; i < newHist->nums->n; i++) {
+        newHist->nums->data.F32[i] = 0.0;
+    }
+
+    // Initialize the other members.
+    newHist->minNum = 0;
+    newHist->maxNum = 0;
+    newHist->uniform = true;
+
+    return (newHist);
+}
+
+/******************************************************************************
+psHistogramAllocGeneric(bounds): allocate a non-uniform histogram structure
+with the specifed bounds.
+ 
+Input:
+    bounds
+Returns:
+    The histogram structure
+ *****************************************************************************/
+psHistogram* psHistogramAllocGeneric(const psVector* bounds)
+{
+    PS_VECTOR_CHECK_NULL(bounds, NULL);
+    PS_VECTOR_CHECK_TYPE(bounds, PS_TYPE_F32, NULL);
+    PS_INT_COMPARE(2, bounds->n, NULL);
+
+    psHistogram* newHist = NULL;        // The new histogram structure
+    psS32 i;                      // Loop index variable
+
+    // Allocate memory for the new histogram structure.
+    newHist = (psHistogram* ) psAlloc(sizeof(psHistogram));
+    psMemSetDeallocator(newHist, (psFreeFcn) histogramFree);
+    newHist->bounds = psVectorAlloc(bounds->n, PS_TYPE_F32);
+    newHist->bounds->n = newHist->bounds->nalloc;
+    for (i = 0; i < bounds->n; i++) {
+        newHist->bounds->data.F32[i] = bounds->data.F32[i];
+    }
+
+    // Allocate the bins, and initialize them to zero.  If there are N bounds,
+    // then there are N-1 bins.
+    newHist->nums = psVectorAlloc((bounds->n) - 1, PS_TYPE_F32);
+    for (i = 0; i < newHist->nums->n; i++) {
+        newHist->nums->data.F32[i] = 0.0;
+    }
+
+    // Initialize the other members.
+    newHist->minNum = 0;
+    newHist->maxNum = 0;
+    newHist->uniform = false;
+
+    return (newHist);
+}
+
+static void histogramFree(psHistogram* myHist)
+{
+    psFree(myHist->bounds);
+    psFree(myHist->nums);
+}
+
+/*****************************************************************************
+UpdateHistogramBins(binNum, out, data, error): This routine is to be used when
+updating the histogram in the presence of errors in the input data.  We treat
+the data point as a boxcar PDF and update a range of points surrounding the
+histogram bin which contains the point.  The width of that boxcar is defined
+as 2.35 * error.  Inputs:
+    binNum: the bin number of the data point in the histogram
+    out: the histogram structure
+    data: the data point value
+    error: the error in that data point
+ 
+XXX: Must test this.
+ *****************************************************************************/
+psS32 UpdateHistogramBins(psS32 binNum,
+                          psHistogram* out,
+                          psF32 data,
+                          psF32 error)
+{
+    PS_PTR_CHECK_NULL(out, -1);
+    PS_PTR_CHECK_NULL(out->bounds, -1);
+    PS_PTR_CHECK_NULL(out->nums, -1);
+    PS_INT_CHECK_RANGE(binNum, 0, ((out->nums->n)-1), -2);
+    PS_FLOAT_COMPARE(0.0, error, -3);
+    PS_FLOAT_CHECK_RANGE(data, out->bounds->data.F32[0], out->bounds->data.F32[(out->bounds->n)-1], -4);
+
+    psF32 boxcarWidth = 2.35 * error;
+    psF32 boxcarCenter = (out->bounds->data.F32[binNum] +
+                          out->bounds->data.F32[binNum+1]) / 2.0;
+    psF32 boxcarLeft = boxcarCenter - (boxcarWidth / 2.0);
+    psF32 boxcarRight = boxcarCenter + (boxcarWidth / 2.0);
+    psS32 bin;
+    psS32 boxcarLeftBinNum = 0;
+    psS32 boxcarRightBinNum = 0;
+
+    // Determine the left endpoint of the boxcar for the PDF.
+    for (bin=binNum ; bin >= 0 ; bin--) {
+        if (out->nums->data.F32[bin] <= boxcarLeft) {
+            boxcarLeftBinNum = bin;
+            break;
+        }
+    }
+
+    // Determine the right endpoint of the boxcar for the PDF.
+    for (bin=binNum ; bin < out->nums->n ; bin++) {
+        if (out->nums->data.F32[bin] >= boxcarRight) {
+            boxcarRightBinNum = bin;
+            break;
+        }
+    }
+
+    //
+    // If the boxcar fits entirely inside this bin, then simply add 1.0 to the
+    // bin and return.
+    //
+    if (boxcarLeftBinNum == boxcarRightBinNum) {
+        out->nums->data.F32[binNum]+= 1.0;
+        return(0);
+    }
+
+    //
+    // If we get here, multiple bins must be updated.  We handle the left
+    // endpoint, and right endpoint differently.
+    //
+    out->nums->data.F32[boxcarLeftBinNum]+=
+        (out->bounds->data.F32[boxcarLeftBinNum+1] - boxcarLeft) / boxcarWidth;
+
+    //
+    // Loop through the center bins, if any.
+    //
+    for (bin = boxcarLeftBinNum + 1 ; bin < (boxcarRightBinNum - 1) ; bin++) {
+        out->nums->data.F32[bin]+=
+            (out->bounds->data.F32[bin+1] - out->bounds->data.F32[bin]) / boxcarWidth;
+    }
+
+    //
+    // Handle the right endpoint differently.
+    //
+    out->nums->data.F32[boxcarRightBinNum]+=
+        (boxcarRight - out->bounds->data.F32[boxcarRightBinNum]) / boxcarWidth;
+
+    //
+    // Return 0 on success.
+    //
+    return(0);
+}
+
+
+/*****************************************************************************
+psVectorHistogram(out, in, errors, mask, maskVal): this procedure takes as
+input a preallocated and initialized histogram structure.  It fills the bins
+in that histogram structure in accordance with the input data "in" and the,
+possibly NULL, mask vector.
+ 
+Inputs:
+    out
+    in
+    mask
+    maskVal
+Returns:
+    The histogram structure "out".
+ *****************************************************************************/
+psHistogram* psVectorHistogram(psHistogram* out,
+                               const psVector* in,
+                               const psVector* errors,
+                               const psVector* mask,
+                               psU32 maskVal)
+{
+    PS_PTR_CHECK_NULL(out, NULL);
+    PS_VECTOR_CHECK_NULL(out->bounds, NULL);
+    PS_VECTOR_CHECK_TYPE(out->bounds, PS_TYPE_F32, NULL);
+    PS_INT_CHECK_NON_NEGATIVE(out->bounds->n, NULL);
+    PS_VECTOR_CHECK_NULL(out->nums, NULL);
+    PS_VECTOR_CHECK_TYPE(out->nums, PS_TYPE_F32, NULL);
+    PS_INT_CHECK_NON_NEGATIVE(out->nums->n, NULL);
+    PS_VECTOR_CHECK_NULL(in, out);
+    if (mask != NULL) {
+        PS_VECTOR_CHECK_SIZE_EQUAL(in, mask, NULL);
+        PS_VECTOR_CHECK_TYPE(mask, PS_TYPE_U8, NULL);
+    }
+    if (errors != NULL) {
+        PS_VECTOR_CHECK_SIZE_EQUAL(in, errors, NULL);
+        PS_VECTOR_CHECK_TYPE(errors, in->type.type, NULL);
+    }
+
+    psS32 i = 0;                  // Loop index variable
+    psF32 binSize = 0.0;          // Histogram bin size
+    psS32 binNum = 0;             // A temporary bin number
+    psS32 numBins = 0;            // The total number of bins
+    psScalar tmpScalar;
+    tmpScalar.type.type = PS_TYPE_F32;
+    psVector* inF32 = NULL;
+    psVector* errorsF32 = NULL;
+    psS32 mustFreeVectorIn = 1;
+    psS32 mustFreeVectorErrors = 1;
+
+    // Convert input and errors vectors to F32 if necessary.
+    inF32 = p_psConvertToF32((psVector *) in);
+    if (inF32 == NULL) {
+        inF32 = (psVector *) in;
+        mustFreeVectorIn = 0;
+    }
+    errorsF32 = p_psConvertToF32((psVector *) errors);
+    if (errorsF32 == NULL) {
+        errorsF32 = (psVector *) errors;
+        mustFreeVectorErrors = 0;
+    }
+
+    numBins = out->nums->n;
+    for (i = 0; i < inF32->n; i++) {
+        // Check if this pixel is masked, and if so, skip it.
+        if ((mask == NULL) || ((mask != NULL) && (!(mask->data.U8[i] & maskVal)))) {
+            if (inF32->data.F32[i] < out->bounds->data.F32[0]) {
+                // If this pixel is below minimum value, count it, then skip.
+                out->minNum++;
+            } else if (inF32->data.F32[i] > out->bounds->data.F32[numBins]) {
+                // If this pixel is above maximum value, count it, then skip.
+                out->maxNum++;
+            } else {
+                // If this is a uniform histogram, determining the correct
+                // number is trivial.
+                if (out->uniform == true) {
+                    binSize = out->bounds->data.F32[1] - out->bounds->data.F32[0];
+                    binNum = (psS32)((inF32->data.F32[i] - out->bounds->data.F32[0]) / binSize);
+                    if (errorsF32 != NULL) {
+                        // XXX: Check return codes.
+                        UpdateHistogramBins(binNum, out,
+                                            inF32->data.F32[i],
+                                            errorsF32->data.F32[i]);
+                    } else {
+                        // XXX: This if-statement really shouldn't be necessary.
+                        // However, due to numerical lack of precision, we
+                        // occasionally produce a binNum outside the range.
+                        if (binNum >= out->nums->n) {
+                            binNum = out->nums->n - 1;
+                        }
+                        (out->nums->data.F32[binNum])+= 1.0;
+                    }
+
+                } else {
+                    // If this is a non-uniform histogram, determining the
+                    // correct bin number requires a bit more work.
+                    tmpScalar.data.F32 = inF32->data.F32[i];
+                    binNum = p_psVectorBinDisect(out->bounds, &tmpScalar);
+                    if (binNum < 0) {
+                        psLogMsg(__func__, PS_LOG_WARN,
+                                 "WARNING: psVectorHistogram(): element outside histogram bounds.\n");
+                    } else {
+                        if (errorsF32 != NULL) {
+                            // XXX: Check return codes.
+                            UpdateHistogramBins(binNum, out,
+                                                inF32->data.F32[i],
+                                                errors->data.F32[i]);
+                        } else {
+                            (out->nums->data.F32[binNum])+= 1.0;
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    if (mustFreeVectorIn == 1) {
+        psFree(inF32);
+    }
+    if (mustFreeVectorErrors == 1) {
+        psFree(errorsF32);
+    }
+    return (out);
+}
+
+/******************************************************************************
+p_psConvertToF32(in): this is the cheap way to support a variety of vector
+data types: we simply convert the input vector to F32 at the beginning, and
+write all of our functions in F32.  If the vast majority of all vector stat
+operations are F32 (or any other single type), then this is probably the
+best way to go.  Otherwise, when the algorithms stablize, we will then macro
+everything and put type support in the various stat functions.
+ 
+XXX: Should the default data type be F64?  Since we are buying Opterons...
+ *****************************************************************************/
+psVector* p_psConvertToF32(psVector* in)
+{
+    if (in == NULL) {
+        return(NULL);
+    }
+    psS32 i = 0;
+    psVector* tmp = NULL;
+
+    if (in->type.type == PS_TYPE_S8) {
+        tmp = psVectorAlloc(in->n, PS_TYPE_F32);
+        for (i = 0; i < in->n; i++) {
+            tmp->data.F32[i] = (psF32)in->data.S8[i];
+        }
+    } else if (in->type.type == PS_TYPE_S16) {
+        tmp = psVectorAlloc(in->n, PS_TYPE_F32);
+        for (i = 0; i < in->n; i++) {
+            tmp->data.F32[i] = (psF32) in->data.S16[i];
+        }
+    } else if (in->type.type == PS_TYPE_S32) {
+        tmp = psVectorAlloc(in->n, PS_TYPE_F32);
+        for (i = 0; i < in->n; i++) {
+            tmp->data.F32[i] = (psF32)in->data.S32[i];
+        }
+    } else if (in->type.type == PS_TYPE_S64) {
+        tmp = psVectorAlloc(in->n, PS_TYPE_F32);
+        for (i = 0; i < in->n; i++) {
+            tmp->data.F32[i] = (psF32)in->data.S64[i];
+        }
+    } else if (in->type.type == PS_TYPE_U8) {
+        tmp = psVectorAlloc(in->n, PS_TYPE_F32);
+        for (i = 0; i < in->n; i++) {
+            tmp->data.F32[i] = (psF32)in->data.U8[i];
+        }
+    } else if (in->type.type == PS_TYPE_U16) {
+        tmp = psVectorAlloc(in->n, PS_TYPE_F32);
+        for (i = 0; i < in->n; i++) {
+            tmp->data.F32[i] = (psF32)in->data.U16[i];
+        }
+    } else if (in->type.type == PS_TYPE_U32) {
+        tmp = psVectorAlloc(in->n, PS_TYPE_F32);
+        for (i = 0; i < in->n; i++) {
+            tmp->data.F32[i] = (psF32)in->data.U32[i];
+        }
+    } else if (in->type.type == PS_TYPE_U64) {
+        tmp = psVectorAlloc(in->n, PS_TYPE_F32);
+        for (i = 0; i < in->n; i++) {
+            tmp->data.F32[i] = (psF32)in->data.U64[i];
+        }
+    } else if (in->type.type == PS_TYPE_F64) {
+        tmp = psVectorAlloc(in->n, PS_TYPE_F32);
+        for (i = 0; i < in->n; i++) {
+            tmp->data.F32[i] = (psF32)in->data.F64[i];
+        }
+    } else if (in->type.type == PS_TYPE_F32) {
+        // do nothing
+    } else {
+        psS8* strType;
+        PS_TYPE_NAME(strType, in->type.type);
+        psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                PS_ERRORTEXT_psStats_VECTOR_TYPE_UNSUPPORTED,
+                strType);
+    }
+    return (tmp);
+}
+
+/******************************************************************************
+psVectorStats(myVector, maskVector, maskVal, stats): this is the public API
+function which calls the above private stats functions based on what bits
+were set in stats->options.
+ 
+Inputs
+    myVector
+    maskVector
+    maskVal
+    stats
+Returns
+    The stats structure.
+ *****************************************************************************/
+psStats* psVectorStats(psStats* stats,
+                       const psVector* in,
+                       const psVector* errors,
+                       const psVector* mask,
+                       psU32 maskVal)
+{
+    PS_PTR_CHECK_NULL(stats, NULL);
+    PS_VECTOR_CHECK_NULL(in, stats);
+    if (mask != NULL) {
+        PS_VECTOR_CHECK_SIZE_EQUAL(mask, in, stats);
+        PS_VECTOR_CHECK_TYPE(mask, PS_TYPE_U8, stats);
+    }
+    if (errors != NULL) {
+        PS_VECTOR_CHECK_SIZE_EQUAL(errors, in, stats);
+        PS_VECTOR_CHECK_TYPE(errors, in->type.type, stats);
+    }
+
+    psVector* inF32 = NULL;
+    psVector* errorsF32 = NULL;
+    psS32 mustFreeVectorIn = 1;
+    psS32 mustFreeVectorErrors = 1;
+
+    inF32 = p_psConvertToF32((psVector *) in);
+    if (inF32 == NULL) {
+        inF32 = (psVector *) in;
+        mustFreeVectorIn = 0;
+    }
+    errorsF32 = p_psConvertToF32((psVector *) errors);
+    if (errorsF32 == NULL) {
+        errorsF32 = (psVector *) errors;
+        mustFreeVectorErrors = 0;
+    }
+
+    if ((stats->options & PS_STAT_USE_RANGE) && (stats->min >= stats->max)) {
+        PS_FLOAT_COMPARE(stats->min, stats->max, stats);
+    }
+
+    // ************************************************************************
+    if (stats->options & PS_STAT_SAMPLE_MEAN) {
+        if (0 != p_psVectorSampleMean(inF32, errorsF32, mask, maskVal, stats)) {
+            psLogMsg(__func__, PS_LOG_WARN,
+                     "WARNING: psVectorStats(): p_psVectorSampleMean() returned an error.\n");
+        }
+    }
+    // ************************************************************************
+    if (stats->options & PS_STAT_SAMPLE_MEDIAN) {
+        if (false == p_psVectorSampleMedian(inF32, mask, maskVal, stats)) {
+            psLogMsg(__func__, PS_LOG_WARN,
+                     "WARNING: psVectorStats(): p_psVectorSampleMedian() returned an error.\n");
+        }
+    }
+    // ************************************************************************
+    if (stats->options & PS_STAT_SAMPLE_STDEV) {
+        if (0 != p_psVectorSampleMean(inF32, errorsF32, mask, maskVal, stats)) {
+            psLogMsg(__func__, PS_LOG_WARN,
+                     "WARNING: psVectorStats(): p_psVectorSampleMean() returned an error.\n");
+        }
+        p_psVectorSampleStdev(inF32, errorsF32, mask, maskVal, stats);
+    }
+    // ************************************************************************
+    if (stats->options & PS_STAT_SAMPLE_QUARTILE) {
+        if (false == p_psVectorSampleQuartiles(inF32, mask, maskVal, stats)) {
+            psLogMsg(__func__, PS_LOG_WARN,
+                     "WARNING: psVectorStats(): p_psVectorSampleQuartiles() returned an error.\n");
+        }
+    }
+    // Since the various robust stats quantities share much computation, they
+    // are grouped together in a single private function:
+    // p_psVectorRobustStats()
+    if ((stats->options & PS_STAT_ROBUST_MEAN) ||
+            (stats->options & PS_STAT_ROBUST_MEDIAN) ||
+            (stats->options & PS_STAT_ROBUST_MODE) ||
+            (stats->options & PS_STAT_ROBUST_STDEV) ||
+            (stats->options & PS_STAT_ROBUST_QUARTILE)) {
+        if (0 != p_psVectorRobustStats(inF32, errorsF32, mask, maskVal, stats)) {
+            psError(PS_ERR_UNKNOWN, false,
+                    PS_ERRORTEXT_psStats_STATS_FAILED);
+            // XXX: Set to NAN
+        }
+    }
+
+    // XXX: Different conditions for return -1 and -2?
+    if ((stats->options & PS_STAT_CLIPPED_MEAN) || (stats->options & PS_STAT_CLIPPED_STDEV)) {
+        psS32 rc = p_psVectorClippedStats(inF32, errorsF32, mask, maskVal, stats);
+        if (-1 == rc) {
+            psError(PS_ERR_UNKNOWN, false,
+                    "Failed to calculate clipped statistics for input psVector.\n");
+            stats->clippedMean = NAN;
+            stats->clippedStdev = NAN;
+        } else if (-2 == rc) {
+            psLogMsg(__func__, PS_LOG_WARN, "Failed to calculate clipped statistics for input psVector.");
+            stats->clippedMean = NAN;
+            stats->clippedStdev = NAN;
+        }
+    }
+    // ************************************************************************
+    if (stats->options & PS_STAT_MAX) {
+        if (0 != p_psVectorMax(inF32, mask, maskVal, stats)) {
+            psError(PS_ERR_UNKNOWN, false,
+                    "Failed to calculate vector maximum");
+            stats->max = NAN;
+        }
+    }
+    // ************************************************************************
+    if (stats->options & PS_STAT_MIN) {
+        if (0 != p_psVectorMin(inF32, mask, maskVal, stats)) {
+            psError(PS_ERR_UNKNOWN, false,
+                    "Failed to calculate vector minimum");
+            stats->min = NAN;
+        }
+    }
+
+    if (mustFreeVectorIn == 1) {
+        psFree(inF32);
+    }
+    if (mustFreeVectorErrors == 1) {
+        psFree(errorsF32);
+    }
+    return (stats);
+}
+
Index: /tags/ipp-1-X/bug123/psLib/src/math/psStats.h
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/math/psStats.h	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/math/psStats.h	(revision 22331)
@@ -0,0 +1,191 @@
+
+/** @file  psStats.h
+ *  \brief basic statistical operations
+ *  @ingroup Stats
+ *
+xd *  This file will hold the definition of the histogram and stats data
+ *  structures.  It also contains prototypes for procedures which operate
+ *  on those data structures.
+ *
+ *  @author George Gusciora, MHPCC
+ *
+ *  @version $Revision: 1.40 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-03-29 22:34:59 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+#if !defined(PS_STATS_H)
+#define PS_STATS_H
+
+#include "psVector.h"
+
+/// @addtogroup Stats
+/// @{
+
+/******************************************************************************
+    Statistical functions and data structures.
+ *****************************************************************************/
+
+/** enumeration of statistical calculation options
+ *
+ *  @see psStats, psVectorStats, psImageStats
+ */
+// XXX: Is PS_STAT_ROBUST_FOR_SAMPLE obsolete?
+typedef enum {
+    PS_STAT_SAMPLE_MEAN = 0x000001,
+    PS_STAT_SAMPLE_MEDIAN = 0x000002,
+    PS_STAT_SAMPLE_STDEV = 0x000004,
+    PS_STAT_SAMPLE_QUARTILE = 0x000008,
+    PS_STAT_ROBUST_MEAN = 0x000010,
+    PS_STAT_ROBUST_MEDIAN = 0x000020,
+    PS_STAT_ROBUST_MODE = 0x000040,
+    PS_STAT_ROBUST_STDEV = 0x000080,
+    PS_STAT_ROBUST_QUARTILE = 0x000100,
+    PS_STAT_CLIPPED_MEAN = 0x000200,
+    PS_STAT_CLIPPED_STDEV = 0x000400,
+    PS_STAT_MAX =  0x000800,
+    PS_STAT_MIN =  0x001000,
+    PS_STAT_USE_RANGE =  0x002000,
+    PS_STAT_USE_BINSIZE = 0x004000,
+    PS_STAT_ROBUST_FOR_SAMPLE = 0x008000
+} psStatsOptions;
+
+/** This is the generic statistics structure.  It contails the data members
+    for the various statistic values.  It also contains the options member to
+    specifiy which statistics should be calculated. */
+typedef struct
+{
+    psF64 sampleMean;          ///< formal mean of sample
+    psF64 sampleMedian;        ///< formal median of sample
+    psF64 sampleStdev;         ///< standard deviation of sample
+    psF64 sampleUQ;            ///< upper quartile of sample
+    psF64 sampleLQ;            ///< lower quartile of sample
+    psF64 robustMean;          ///< robust mean of array
+    psF64 robustMedian;        ///< robust median of array
+    psF64 robustMode;          ///< Robust mode of array
+    psF64 robustStdev;         ///< robust standard deviation of array
+    psF64 robustUQ;            ///< robust upper quartile
+    psF64 robustLQ;            ///< robust lower quartile
+    psS32 robustN50;              ///<
+    psS32 robustNfit;             ///<
+    psF64 clippedMean;         ///< Nsigma clipped mean
+    psF64 clippedStdev;        ///< standard deviation after clipping
+    psS32 clippedNvalues;         ///< ???
+    psF64 clipSigma;           ///< Nsigma used for clipping; user input
+    psS32 clipIter;               ///< Number of clipping iterations; user input
+    psF64 min;                 ///< minimum data value in array
+    psF64 max;                 ///< maximum data value in array
+    psF64 binsize;             ///<
+    psStatsOptions options;     ///< bitmask of calculated values
+}
+psStats;
+
+/** Performs statistical calculations on a vector.
+ *
+ *  @return psStats*    the statistical results as specified by stats->options
+ */
+psStats* psVectorStats(
+    psStats* stats,    ///< stats structure defines stats to be calculated and how
+    const psVector* in,      ///< Vector to be analysed.
+    const psVector* errors,  ///< Errors.
+    const psVector* mask,    ///< Ignore elements where (maskVector & maskVal) != 0: must be INT or NULL
+    psU32 maskVal      ///< Only mask elements with one of these bits set in maskVector
+);
+
+/** Allocator of the psStats structure.
+ *
+ *  @return psStats*    A new psStats struct with the options member set to the
+ *                      value given.
+ */
+psStats* psStatsAlloc(
+    psStatsOptions options             ///< Statistics to calculate
+);
+
+/******************************************************************************
+    Histogram functions and data structures.
+ *****************************************************************************/
+
+/** The basic histogram structure which contains bounds and bins.
+ *
+ *  In this structure, the vector bounds specifies the boundaries of the 
+ *  histogram bins, and must of type psF32, while nums specifies the number 
+ *  of entries in the bin, and must of type psU32. The value of bounds.n must 
+ *  therefore be 1 greater than than nums.n. The two values minNum and maxNum 
+ *  are the number of data values which fell below the lower limit bound or 
+ *  above the upper limit bound, respectively.
+ */
+typedef struct
+{
+    psVector* bounds;                  ///< Bounds for the bins (type F32)
+    psVector* nums;                    ///< Number in each of the bins (INT)
+    psS32 minNum;                        ///< Number below the minimum
+    psS32 maxNum;                        ///< Number above the maximum
+    psBool uniform;                      ///< Is it a uniform distribution?
+}
+psHistogram;
+
+/** Allocator for psHistogram where the bounds of the bins are implicitly
+ *  specified through simply specifying an upper and lower limit along with 
+ *  the size of the bins. 
+ *
+ *  @return psHistogram*    Newly allocated psHistogram
+ */
+psHistogram* psHistogramAlloc(
+    psF32 lower,                       ///< Lower limit for the bins
+    psF32 upper,                       ///< Upper limit for the bins
+    psS32 n                              ///< Number of bins
+);
+
+/** Allocator for psHistogram where the bounds of the bins are explicitly
+ *  specified. 
+ *
+ *  @return psHistogram*    Newly allocated psHistogram
+ */
+psHistogram* psHistogramAllocGeneric(
+    const psVector* bounds             ///< Bounds for the bins
+);
+
+/** Calculate a histogram
+ *
+ *  The following function populates the histogram bins from the specified 
+ *  vector (in). It alters and returns the histogram out structure. The input
+ *  vector may be of types psU8, psU16, psF32, psF64.
+ *
+ *  @return psHistogram*   histogram result
+ */
+psHistogram* psVectorHistogram(
+    psHistogram* out,                  ///< Histogram data
+    const psVector* in,                ///< Vector to analyse
+    const psVector* errors,            ///< Errors
+    const psVector* mask,              ///< Mask dat for input vector
+    psU32 maskVal                      ///< Mask value
+);
+
+/** Extracts the statistic value specified by stats->options.
+ *
+ *  @return psBool    If more than one statistic result is set in stats->options,
+ *                  false is returned and the value parameter is not set, 
+ *                  otherwise true is returned.
+ */
+psBool p_psGetStatValue(
+    const psStats* stats,
+    ///< the statistic struct to operate on
+
+    psF64 *value
+    ///< if return is true, this is set to the specified statistic value by stats->options
+);
+
+void p_psNormalizeVectorRangeU8(psVector* myData, psU8 low, psU8 high);
+void p_psNormalizeVectorRangeU16(psVector* myData, psU16 low, psU16 high);
+void p_psNormalizeVectorRangeU32(psVector* myData, psU32 low, psU32 high);
+void p_psNormalizeVectorRangeU64(psVector* myData, psU64 low, psU64 high);
+void p_psNormalizeVectorRangeS8(psVector* myData, psS8 low, psS8 high);
+void p_psNormalizeVectorRangeS16(psVector* myData, psS16 low, psS16 high);
+void p_psNormalizeVectorRangeS32(psVector* myData, psS32 low, psS32 high);
+void p_psNormalizeVectorRangeS64(psVector* myData, psS64 low, psS64 high);
+void p_psNormalizeVectorRangeF32(psVector* myData, psF32 low, psF32 high);
+void p_psNormalizeVectorRangeF64(psVector* myData, psF64 low, psF64 high);
+
+/// @}
+
+#endif
Index: /tags/ipp-1-X/bug123/psLib/src/math/psUnaryOp.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/math/psUnaryOp.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/math/psUnaryOp.c	(revision 22331)
@@ -0,0 +1,387 @@
+/** @file  psUnary.c
+ *
+ *  @brief Provides unary functions for simple matrix and vector element operations. Functions
+ *  include:
+ *
+ *      Addition (+)
+ *      Subtraction (-)
+ *      Multiplication (*)
+ *      Division (/)
+ *      Power (^)
+ *      Minimum (min)
+ *      Maximum (max)
+ *      Absolute value (abs)
+ *      Exponent (exp)
+ *      Natural Log (ln)
+ *      Power of 10 (ten)
+ *      Log (log)
+ *      Sine (sin or dsin)
+ *      Cosine (cos or dcos)
+ *      Tangent (tan or dtan)
+ *      Arcsine (asin or dasin)
+ *      Arccosine (acos or dacos)
+ *      Arctan (atan or datan)
+ *
+ *  Currently only vector-vector and image-image binary operations are supported.
+ *
+ *  @ingroup MatrixArithmetic
+ *
+ *  @author Ross Harman, MHPCC
+ *  @author Robert DeSonia, MHPCC
+ *
+ *  @version $Revision: 1.1 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-02-10 02:36:41 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+
+/******************************************************************************
+ *  INCLUDE FILES                                                             *
+ ******************************************************************************/
+#include <string.h>
+#include <math.h>
+#include <stdint.h>
+
+#include "psMemory.h"
+#include "psError.h"
+#include "psImage.h"
+#include "psVector.h"
+#include "psScalar.h"
+#include "psLogMsg.h"
+#include "psConstants.h"
+#include "psDataManipErrors.h"
+
+/*****************************************************************************
+ *  FUNCTION IMPLEMENTATION - LOCAL                                          *
+ *****************************************************************************/
+
+// Conversion for degrees to radians
+#define D2R 0.01745329252111111  /* PI/180 */
+
+// Conversion for radians to degrees
+#define R2D 57.29577950924861   /* 180.0/PI */
+
+
+// Unary SCALAR operations
+#define SCALAR(OUT,IN,OP,TYPE)                                                                               \
+{                                                                                                            \
+    ps##TYPE *o = NULL;                                                                                      \
+    ps##TYPE *i1 = NULL;                                                                                     \
+    o  = &((psScalar* )OUT)->data.TYPE;                                                                      \
+    i1 = &((psScalar* )IN)->data.TYPE;                                                                       \
+    *o = OP;                                                                                                 \
+}
+
+// Unary IMAGE operations
+#define VECTOR(OUT,IN,OP,TYPE)                                                                               \
+{                                                                                                            \
+    psS32 i = 0;                                                                                             \
+    psS32 nIn = 0;                                                                                           \
+    psS32 nOut = 0;                                                                                          \
+    ps##TYPE *o = NULL;                                                                                      \
+    ps##TYPE *i1 = NULL;                                                                                     \
+    nIn = ((psVector* )IN)->n;                                                                               \
+    nOut = ((psVector* )OUT)->n;                                                                             \
+    if(nIn != nOut) {                                                                                        \
+        psError(PS_ERR_BAD_PARAMETER_SIZE, true,                                                             \
+                PS_ERRORTEXT_psMatrix_COUNT_DIFFERS,                                                         \
+                nIn, nOut);                                                                                  \
+        if (OUT != IN) {                                                                                     \
+            psFree(OUT);                                                                                     \
+        }                                                                                                    \
+        return NULL;                                                                                         \
+    }                                                                                                        \
+    o  = ((psVector* )OUT)->data.TYPE;                                                                       \
+    i1 = ((psVector* )IN)->data.TYPE;                                                                        \
+    for(i = 0; i < nIn; i++, o++, i1++) {                                                                    \
+        *o = OP;                                                                                             \
+    }                                                                                                        \
+}
+
+// Unary IMAGE operations
+#define IMAGE(OUT,IN,OP,TYPE)                                                                                \
+{                                                                                                            \
+    psS32 i = 0;                                                                                             \
+    psS32 j = 0;                                                                                             \
+    psS32 numRowsIn = 0;                                                                                     \
+    psS32 numColsIn = 0;                                                                                     \
+    psS32 numRowsOut = 0;                                                                                    \
+    psS32 numColsOut = 0;                                                                                    \
+    ps##TYPE *o = NULL;                                                                                      \
+    ps##TYPE *i1 = NULL;                                                                                     \
+    numRowsIn = ((psImage* )IN)->numRows;                                                                    \
+    numColsIn = ((psImage* )IN)->numCols;                                                                    \
+    numRowsOut = ((psImage* )OUT)->numRows;                                                                  \
+    numColsOut = ((psImage* )OUT)->numCols;                                                                  \
+    if(numRowsIn!=numRowsOut || numColsIn!=numColsOut) {                                                     \
+        psError(PS_ERR_BAD_PARAMETER_SIZE, true,                                                             \
+                PS_ERRORTEXT_psMatrix_IMAGE_SIZE_DIFFERS,                                                    \
+                numColsIn, numRowsIn, numColsOut, numRowsOut);                                               \
+        if (OUT != IN) {                                                                                     \
+            psFree(OUT);                                                                                     \
+        }                                                                                                    \
+        return NULL;                                                                                         \
+    }                                                                                                        \
+    for(j = 0; j < numRowsIn; j++) {                                                                         \
+        o  = ((psImage* )OUT)->data.TYPE[j];                                                                 \
+        i1 = ((psImage* )IN)->data.TYPE[j];                                                                  \
+        for(i = 0; i < numColsIn; i++, o++, i1++) {                                                          \
+            *o = OP;                                                                                         \
+        }                                                                                                    \
+    }                                                                                                        \
+}
+
+// Preprocessor macro function to create arithmetic function based on input type
+#define UNARY_TYPE(DIM,OUT,IN,OP)                                                                            \
+switch (IN->type) {                                                                                          \
+case PS_TYPE_S32:                                                                                            \
+    DIM(OUT,IN,OP,S32);                                                                                      \
+    break;                                                                                                   \
+case PS_TYPE_F32:                                                                                            \
+    DIM(OUT,IN,OP,F32);                                                                                      \
+    break;                                                                                                   \
+case PS_TYPE_F64:                                                                                            \
+    DIM(OUT,IN,OP,F64);                                                                                      \
+    break;                                                                                                   \
+case PS_TYPE_C32:                                                                                            \
+    DIM(OUT,IN,OP,C32);                                                                                      \
+    break;                                                                                                   \
+case PS_TYPE_S8:                                                                                             \
+    DIM(OUT,IN,OP,C32);                                                                                      \
+    break;                                                                                                   \
+case PS_TYPE_U8:                                                                                             \
+    DIM(OUT,IN,OP,C32);                                                                                      \
+    break;                                                                                                   \
+case PS_TYPE_S16:                                                                                            \
+    DIM(OUT,IN,OP,C32);                                                                                      \
+    break;                                                                                                   \
+case PS_TYPE_U16:                                                                                            \
+    DIM(OUT,IN,OP,C32);                                                                                      \
+    break;                                                                                                   \
+case PS_TYPE_U32:                                                                                            \
+    DIM(OUT,IN,OP,C32);                                                                                      \
+    break;                                                                                                   \
+case PS_TYPE_S64:                                                                                            \
+    DIM(OUT,IN,OP,C32);                                                                                      \
+    break;                                                                                                   \
+case PS_TYPE_U64:                                                                                            \
+    DIM(OUT,IN,OP,C32);                                                                                      \
+    break;                                                                                                   \
+case PS_TYPE_C64:                                                                                            \
+    DIM(OUT,IN,OP,C32);                                                                                      \
+    break;                                                                                                   \
+default: {                                                                                                     \
+        char* strType;                                                                                           \
+        PS_TYPE_NAME(strType, IN->type);                                                                         \
+        psError(PS_ERR_BAD_PARAMETER_TYPE, true,                                                                 \
+                PS_ERRORTEXT_psMatrix_TYPE_MISMATCH,                                                             \
+                strType);                                                                                        \
+        if (OUT != IN) {                                                                                         \
+            psFree(OUT);                                                                                         \
+        }                                                                                                        \
+        return NULL;                                                                                             \
+    } \
+}
+
+// Preprocessor macro function to create arithmetic function operation name. Functions below that add
+// FLT_EPSILON are done so to align results with a 64 bit computing architecture
+#define UNARY_OP(DIM,OUT,IN,OP)                                                                              \
+if(!strncmp(OP, "abs", 3)) {                                                                                 \
+    if(PS_IS_PSELEMTYPE_COMPLEX(IN->type)) {                                                                 \
+        UNARY_TYPE(DIM,OUT,IN,cabs(*i1));                                                                    \
+    } else {                                                                                                 \
+        UNARY_TYPE(DIM,OUT,IN,fabs(*i1));                                                                    \
+    }                                                                                                        \
+} else if(!strncmp(OP, "exp", 3)) {                                                                          \
+    if(PS_IS_PSELEMTYPE_COMPLEX(IN->type)) {                                                                 \
+        UNARY_TYPE(DIM,OUT,IN,cexp(*i1));                                                                    \
+    } else {                                                                                                 \
+        UNARY_TYPE(DIM,OUT,IN,exp(*i1));                                                                     \
+    }                                                                                                        \
+} else if(!strncmp(OP, "ln", 2)) {                                                                           \
+    if(PS_IS_PSELEMTYPE_COMPLEX(IN->type)) {                                                                 \
+        UNARY_TYPE(DIM,OUT,IN,clog(*i1));                                                                    \
+    } else {                                                                                                 \
+        UNARY_TYPE(DIM,OUT,IN,log(*i1));                                                                     \
+    }                                                                                                        \
+} else if(!strncmp(OP, "ten", 3)) {                                                                          \
+    if(PS_IS_PSELEMTYPE_COMPLEX(IN->type)) {                                                                 \
+        UNARY_TYPE(DIM,OUT,IN,cpow(10.0,*i1));                                                               \
+    } else {                                                                                                 \
+        UNARY_TYPE(DIM,OUT,IN,pow(10.0,*i1));                                                                \
+    }                                                                                                        \
+} else if(!strncmp(OP, "log", 3)) {                                                                          \
+    if(PS_IS_PSELEMTYPE_COMPLEX(IN->type)) {                                                                 \
+        UNARY_TYPE(DIM,OUT,IN,clog(*i1)/log(10.0));                                                          \
+    } else {                                                                                                 \
+        UNARY_TYPE(DIM,OUT,IN,log10(*i1));                                                                   \
+    }                                                                                                        \
+} else if(!strncmp(OP, "sin", 3)) {                                                                          \
+    if(PS_IS_PSELEMTYPE_COMPLEX(IN->type)) {                                                                 \
+        UNARY_TYPE(DIM,OUT,IN,csin(*i1));                                                                    \
+    } else {                                                                                                 \
+        UNARY_TYPE(DIM,OUT,IN,sin(*i1));                                                                     \
+    }                                                                                                        \
+} else if(!strncmp(OP, "dsin", 4)) {                                                                         \
+    if(PS_IS_PSELEMTYPE_COMPLEX(IN->type)) {                                                                 \
+        UNARY_TYPE(DIM,OUT,IN,csin(*i1*D2R));                                                                \
+    } else {                                                                                                 \
+        UNARY_TYPE(DIM,OUT,IN,sin(*i1*D2R));                                                                 \
+    }                                                                                                        \
+} else if(!strncmp(OP, "cos", 3)) {                                                                          \
+    if(PS_IS_PSELEMTYPE_COMPLEX(IN->type)) {                                                                 \
+        UNARY_TYPE(DIM,OUT,IN,ccos(*i1));                                                                    \
+    } else {                                                                                                 \
+        UNARY_TYPE(DIM,OUT,IN,cos(*i1));                                                                     \
+    }                                                                                                        \
+} else if(!strncmp(OP, "dcos", 4)) {                                                                         \
+    if(PS_IS_PSELEMTYPE_COMPLEX(IN->type)) {                                                                 \
+        UNARY_TYPE(DIM,OUT,IN,ccos(*i1*D2R));                                                                \
+    } else {                                                                                                 \
+        UNARY_TYPE(DIM,OUT,IN,cos(*i1*D2R));                                                                 \
+    }                                                                                                        \
+} else if(!strncmp(OP, "tan", 3)) {                                                                          \
+    if(PS_IS_PSELEMTYPE_COMPLEX(IN->type)) {                                                                 \
+        UNARY_TYPE(DIM,OUT,IN,ctan(*i1));                                                                    \
+    } else {                                                                                                 \
+        UNARY_TYPE(DIM,OUT,IN,tan(*i1));                                                                     \
+    }                                                                                                        \
+} else if(!strncmp(OP, "dtan", 4)) {                                                                         \
+    if(PS_IS_PSELEMTYPE_COMPLEX(IN->type)) {                                                                 \
+        UNARY_TYPE(DIM,OUT,IN,ctan(*i1*D2R));                                                                \
+    } else {                                                                                                 \
+        UNARY_TYPE(DIM,OUT,IN,tan(*i1*D2R));                                                                 \
+    }                                                                                                        \
+} else if(!strncmp(OP, "asin", 4)) {                                                                         \
+    if(PS_IS_PSELEMTYPE_COMPLEX(IN->type)) {                                                                 \
+        UNARY_TYPE(DIM,OUT,IN,casin(*i1));                                                                   \
+    } else {                                                                                                 \
+        UNARY_TYPE(DIM,OUT,IN,asin(*i1));                                                                    \
+    }                                                                                                        \
+} else if(!strncmp(OP, "dasin", 5)) {                                                                        \
+    if(PS_IS_PSELEMTYPE_COMPLEX(IN->type)) {                                                                 \
+        UNARY_TYPE(DIM,OUT,IN,R2D*casin(*i1));                                                               \
+    } else if(PS_IS_PSELEMTYPE_INT(IN->type)) {                                                              \
+        UNARY_TYPE(DIM,OUT,IN,(R2D*asin(*i1)));                                                              \
+    } else {                                                                                                 \
+        UNARY_TYPE(DIM,OUT,IN,(R2D*asin(*i1)));                                                              \
+    }                                                                                                        \
+} else if(!strncmp(OP, "acos", 4)) {                                                                         \
+    if(PS_IS_PSELEMTYPE_COMPLEX(IN->type)) {                                                                 \
+        UNARY_TYPE(DIM,OUT,IN,cacos(*i1));                                                                   \
+    } else {                                                                                                 \
+        UNARY_TYPE(DIM,OUT,IN,acos(*i1));                                                                    \
+    }                                                                                                        \
+} else if(!strncmp(OP, "dacos", 5)) {                                                                        \
+    if(PS_IS_PSELEMTYPE_COMPLEX(IN->type)) {                                                                 \
+        UNARY_TYPE(DIM,OUT,IN,R2D*cacos(*i1));                                                               \
+    } else if(PS_IS_PSELEMTYPE_INT(IN->type)) {                                                              \
+        UNARY_TYPE(DIM,OUT,IN,(R2D*acos(*i1)));                                                              \
+    } else {                                                                                                 \
+        UNARY_TYPE(DIM,OUT,IN,R2D*acos(*i1));                                                                \
+    }                                                                                                        \
+} else if(!strncmp(OP, "atan", 4)) {                                                                         \
+    if(PS_IS_PSELEMTYPE_COMPLEX(IN->type)) {                                                                 \
+        UNARY_TYPE(DIM,OUT,IN,catan(*i1));                                                                   \
+    } else {                                                                                                 \
+        UNARY_TYPE(DIM,OUT,IN,atan(*i1));                                                                    \
+    }                                                                                                        \
+} else if(!strncmp(OP, "datan", 5)) {                                                                        \
+    if(PS_IS_PSELEMTYPE_COMPLEX(IN->type)) {                                                                 \
+        UNARY_TYPE(DIM,OUT,IN,R2D*catan(*i1));                                                               \
+    } else {                                                                                                 \
+        UNARY_TYPE(DIM,OUT,IN,R2D*atan(*i1));                                                                \
+    }                                                                                                        \
+} else {                                                                                                     \
+    psError(PS_ERR_BAD_PARAMETER_VALUE, true,                                                                \
+            PS_ERRORTEXT_psMatrix_OPERATION_UNSUPPORTED,                                                     \
+            OP);                                                                                             \
+    if (OUT != IN) {                                                                                         \
+        psFree(OUT);                                                                                         \
+    }                                                                                                        \
+    return NULL;                                                                                             \
+}
+
+psPtr psUnaryOp(psPtr out, psPtr in, char *op)
+{
+    #define psUnaryOp_EXIT { \
+                             if (out != in) { \
+                             psFree(out); \
+                             } \
+                             return NULL; \
+                           }
+
+    psType* psTypeIn = (psType* ) in;
+
+    PS_PTR_CHECK_NULL_GENERAL(in, psUnaryOp_EXIT);
+    PS_PTR_CHECK_NULL_GENERAL(op, psUnaryOp_EXIT);
+
+    psDimen dimIn = psTypeIn->dimen;
+    psElemType elTypeIn = psTypeIn->type;
+
+    switch (dimIn) {
+    case PS_DIMEN_SCALAR:
+        if (out == NULL ||
+                ((psType*)out)->dimen != PS_DIMEN_SCALAR ||
+                ((psScalar*)out)->type.type != elTypeIn) {
+            psFree(out);
+            out = psScalarAlloc(0.0,elTypeIn);
+        }
+        UNARY_OP(SCALAR, out, psTypeIn, op);    // scalar
+        break;
+    case PS_DIMEN_VECTOR:
+    case PS_DIMEN_TRANSV:
+        if (((psVector*)in)->n == 0) {
+            psError(PS_ERR_BAD_PARAMETER_SIZE, true,
+                    PS_ERRORTEXT_psMatrix_VECTOR_EMPTY);
+            psUnaryOp_EXIT;
+        }
+
+        out = psVectorRecycle(out,
+                              ((psVector*)in)->n,
+                              elTypeIn);
+        if (out == NULL) {
+            psError(PS_ERR_UNKNOWN, false,
+                    PS_ERRORTEXT_psMatrix_OUTPUT_VECTOR_NOT_CREATED);
+            psUnaryOp_EXIT;
+        }
+
+        UNARY_OP(VECTOR, out, psTypeIn, op);    // vector
+        break;
+    case PS_DIMEN_IMAGE:
+        if (((psImage* ) in)->numCols == 0 || ((psImage* ) in)->numRows == 0) {
+            psError(PS_ERR_BAD_PARAMETER_SIZE, true,
+                    PS_ERRORTEXT_psMatrix_IMAGE_EMPTY);
+            psUnaryOp_EXIT;
+        }
+
+        out = psImageRecycle(out,
+                             ((psImage*)in)->numCols,
+                             ((psImage*)in)->numRows,
+                             elTypeIn);
+        if (out == NULL) {
+            psError(PS_ERR_UNKNOWN, false,
+                    PS_ERRORTEXT_psMatrix_OUTPUT_IMAGE_NOT_CREATED);
+            psUnaryOp_EXIT;
+        }
+
+        UNARY_OP(IMAGE, out, psTypeIn, op);     // image
+        break;
+    default:
+        if (out != in) {
+            psFree(out);
+        }
+        psError(PS_ERR_BAD_PARAMETER_SIZE, true,
+                PS_ERRORTEXT_psMatrix_DIMEN_INVALID,
+                "in", dimIn);
+        psUnaryOp_EXIT;
+    }
+
+    // Automtically free psScalar types, since they are usually allocated in the argument list when this
+    // function is called, provided that the input is not the output.
+    if(psTypeIn->dimen==PS_DIMEN_SCALAR && in!=out) {
+        psFree(in);
+    }
+
+    return out;
+}
Index: /tags/ipp-1-X/bug123/psLib/src/math/psUnaryOp.h
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/math/psUnaryOp.h	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/math/psUnaryOp.h	(revision 22331)
@@ -0,0 +1,69 @@
+/** @file  psUnaryOp.h
+ *
+ *  @brief Provides unary functions for simple matrix and vector element operations. Functions
+ *  include:
+ *
+ *      Addition (+)
+ *      Subtraction (-)
+ *      Multiplication (*)
+ *      Division (/)
+ *      Power (^)
+ *      Minimum (min)
+ *      Maximum (max)
+ *      Absolute value (abs)
+ *      Exponent (exp)
+ *      Natural Log (ln)
+ *      Power of 10 (ten)
+ *      Log (log)
+ *      Sine (sin or dsin)
+ *      Cosine (cos or dcos)
+ *      Tangent (tan or dtan)
+ *      Arcsine (asin or dasin)
+ *      Arccosine (acos or dacos)
+ *      Arctan (atan or datan)
+ *
+ *  Currently only vector-vector and image-image binary operations are supported.
+ *
+ *  @ingroup MatrixArithmetic
+ *
+ *  @author Ross Harman, MHPCC
+ *  @author Robert DeSonia, MHPCC
+ *
+ *  @version $Revision: 1.1 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-02-10 02:36:41 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+
+#ifndef PSUNARY_OP_H
+#define PSUNARY_OP_H
+
+/// @addtogroup MatrixArithmetic
+/// @{
+
+
+/** Perform simple unary arithmetic with images or vectors
+ *
+ *  Performs absolute value, exponent, natural log, power of 10, log, sine, cosine, tangent, arcsine,
+ *  arccosine, or arctan. operations with images and vectors. Uses the form:
+ *
+ *     out = op(in),
+ *
+ *     Where op is: "abs", "exp", "ln", "ten", "log", "sin", "cos", "tan" "asin", "acos", "atan", "dsin",
+ *                  "dcos", dtan", "dasin", "dacos", or "datan".
+ *
+ *  Trigometric Operations with "d" prefix use units of degrees. Those without are in radians.
+ *
+ *  This function only supports vector-vector or image-image opertions.
+ *
+ *  @return  psType* : Pointer to either psImage or psVector.
+ */
+psType* psUnaryOp(
+    psPtr out,                         ///< Output type, either psImage or psVector.
+    psPtr in,                          ///< Input, either psImage or psVector.
+    char *op                           ///< Operator.
+);
+
+/// @}
+
+#endif
Index: /tags/ipp-1-X/bug123/psLib/src/mathtypes/psImage.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/mathtypes/psImage.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/mathtypes/psImage.c	(revision 22331)
@@ -0,0 +1,752 @@
+/** @file  psImage.c
+ *
+ *  @brief Contains basic image definitions and operations.
+ *
+ *  This file defines the basic type for an image struct and functions useful
+ *  in manupulating images.
+ *
+ *  @author Robert DeSonia, MHPCC
+ *  @author Ross Harman, MHPCC
+ *
+ *  @version $Revision: 1.64 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-04-15 00:12:08 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ *
+ *  That is the routine used to generate matrices.
+ */
+
+#include <string.h>
+#include <math.h>
+
+#include "psMemory.h"
+#include "psError.h"
+#include "psImage.h"
+#include "psString.h"
+
+#include "psImageErrors.h"
+
+#define SQUARE(x) ((x)*(x))
+#define MIN(x,y) (((x) > (y)) ? (y) : (x))
+#define MAX(x,y) (((x) > (y)) ? (x) : (y))
+
+static void imageFree(psImage* image)
+{
+    if (image == NULL) {
+        return;
+    }
+
+    if (image->parent != NULL) {
+        psArrayRemove(image->parent->children,image);
+        image->parent = NULL;
+    }
+
+    psImageFreeChildren(image);
+
+    psFree(image->rawDataBuffer);
+    psFree(image->data.V);
+}
+
+psImage* psImageAlloc(psU32 numCols,
+                      psU32 numRows,
+                      const psElemType type)
+{
+    psS32 area = 0;
+    psS32 elementSize = PSELEMTYPE_SIZEOF(type);  // element size in bytes
+    psS32 rowSize = numCols * elementSize;        // row size in bytes.
+
+    area = numCols * numRows;
+
+    if (area < 1) {
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true,
+                PS_ERRORTEXT_psImage_AREA_NEGATIVE,
+                numRows, numCols);
+        return NULL;
+    }
+
+    psImage* image = (psImage* ) psAlloc(sizeof(psImage));
+
+    psMemSetDeallocator(image, (psFreeFcn) imageFree);
+
+    image->data.V = psAlloc(sizeof(psPtr ) * numRows);
+
+    image->rawDataBuffer = psAlloc(area * elementSize);
+
+    // set the row pointers.
+    image->data.V[0] = image->rawDataBuffer;
+    for (psS32 i = 1; i < numRows; i++) {
+        image->data.V[i] = (psPtr )((int8_t *) image->data.V[i - 1] + rowSize);
+    }
+
+    *(psS32 *)&image->col0 = 0;
+    *(psS32 *)&image->row0 = 0;
+    *(psU32 *)&image->numCols = numCols;
+    *(psU32 *)&image->numRows = numRows;
+    *(psDimen* ) & image->type.dimen = PS_DIMEN_IMAGE;
+    *(psElemType* ) & image->type.type = type;
+    image->parent = NULL;
+    image->children = NULL;
+
+    return image;
+}
+
+psRegion* psRegionAlloc(psF32 x0,
+                        psF32 x1,
+                        psF32 y0,
+                        psF32 y1)
+{
+    psRegion* out = psAlloc(sizeof(psRegion));
+
+    out->x0 = x0;
+    out->y0 = y0;
+    out->x1 = x1;
+    out->y1 = y1;
+
+    return out;
+}
+
+psRegion* psRegionFromString(char* region)
+{
+    psS32 col0;
+    psS32 col1;
+    psS32 row0;
+    psS32 row1;
+
+    // section should be of the form '[col0:col1,row0:row1]'
+    if (region == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psImage_SUBSECTION_NULL);
+        return NULL;
+    }
+
+    if (sscanf(region,"[%d:%d,%d:%d]",&col0,&col1,&row0,&row1) < 4) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psImage_SUBSECTION_INVALID,
+                region);
+        return NULL;
+    }
+
+    if (col0 > col1 || row0 > row1) {
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true,
+                PS_ERRORTEXT_psImage_SUBSET_RANGE_MALFORMED,
+                col0,col1,row0,row1);
+        return NULL;
+    }
+
+    return psRegionAlloc(col0,col1,row0,row1);
+}
+
+char* psRegionToString(psRegion* region)
+{
+    char tmpText[256]; // big enough to store any region as text
+
+    if (region == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psImage_REGION_NULL);
+        return NULL;
+    }
+
+    snprintf(tmpText,256,"[%g:%g,%g:%g]",
+             region->x0, region->x1,
+             region->y0, region->y1);
+
+    return psStringCopy(tmpText);
+}
+
+psImage* psImageRecycle(psImage* old,
+                        psU32 numCols,
+                        psU32 numRows,
+                        const psElemType type)
+{
+    psS32 elementSize = PSELEMTYPE_SIZEOF(type);  // element size in bytes
+    psS32 rowSize = numCols * elementSize;        // row size in bytes.
+
+    if (old == NULL) {
+        old = psImageAlloc(numCols, numRows, type);
+        return old;
+    }
+
+    if (old->type.dimen != PS_DIMEN_IMAGE) {
+        psFree(old);
+        psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                PS_ERRORTEXT_psImage_NOT_AN_IMAGE);
+        return NULL;
+    }
+
+    /* image already the right size/type? */
+    if (numCols == old->numCols && numRows == old->numRows &&
+            type == old->type.type) {
+        return old;
+    }
+    // Resize the image buffer
+    old->rawDataBuffer = psRealloc(old->data.V[0],
+                                   numCols * numRows * elementSize);
+    old->data.V = (psPtr *)psRealloc(old->data.V, numRows * sizeof(psPtr ));
+
+    // recreate the row pointers
+    old->data.V[0] = old->rawDataBuffer;
+    for (psS32 i = 1; i < numRows; i++) {
+        old->data.V[i] = (psPtr )((int8_t *) old->data.V[i - 1] + rowSize);
+    }
+
+    *(psU32 *)&old->numCols = numCols;
+    *(psU32 *)&old->numRows = numRows;
+    *(psElemType* ) & old->type.type = type;
+
+    return old;
+}
+
+psImage* psImageCopy(psImage* output,
+                     const psImage* input,
+                     psElemType type)
+{
+    psElemType inDatatype;
+    psS32 elementSize;
+    psS32 elements;
+    psS32 numRows;
+    psS32 numCols;
+
+    if (input == NULL || input->data.V == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psImage_IMAGE_NULL);
+        psFree(output);
+        return NULL;
+    }
+
+    if (input == output) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psImage_INPLACE_NOTSUPPORTED);
+        psFree(output);
+        return NULL;
+    }
+
+    if (input->type.dimen != PS_DIMEN_IMAGE) {
+        psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                PS_ERRORTEXT_psImage_NOT_AN_IMAGE);
+        psFree(output);
+        return NULL;
+    }
+
+    inDatatype = input->type.type;
+    numRows = input->numRows;
+    numCols = input->numCols;
+    elements = numRows * numCols;
+    elementSize = PSELEMTYPE_SIZEOF(inDatatype);
+
+    output = psImageRecycle(output, numCols, numRows, type);
+
+    // cover the trival case of copy of the same
+    // datatype.
+    if (type == inDatatype) {
+        for (psS32 row=0;row<numRows;row++) {
+            memcpy(output->data.V[row], input->data.V[row], elementSize * numCols);
+        }
+        return output;
+    }
+
+    #define PSIMAGE_ELEMENT_COPY(IN,INTYPE,OUT,OUTTYPE,ELEMENTS) { \
+        ps##INTYPE *in; \
+        ps##OUTTYPE *out; \
+        for(psS32 row=0;row<numRows;row++) { \
+            in = IN->data.INTYPE[row]; \
+            out = OUT->data.OUTTYPE[row]; \
+            for (psS32 col=0;col<numCols;col++) { \
+                *(out++) = *(in++); \
+            } \
+        } \
+    }
+
+    #define PSIMAGE_COPY_CASE(OUT,OUTTYPE) { \
+        switch (inDatatype) { \
+        case PS_TYPE_S8: \
+            PSIMAGE_ELEMENT_COPY(input,S8,OUT,OUTTYPE,elements); \
+            break; \
+        case PS_TYPE_S16: \
+            PSIMAGE_ELEMENT_COPY(input,S16,OUT,OUTTYPE,elements); \
+            break; \
+        case PS_TYPE_S32: \
+            PSIMAGE_ELEMENT_COPY(input,S32,OUT,OUTTYPE,elements); \
+            break; \
+        case PS_TYPE_S64: \
+            PSIMAGE_ELEMENT_COPY(input,S64,OUT,OUTTYPE,elements); \
+            break; \
+        case PS_TYPE_U8: \
+            PSIMAGE_ELEMENT_COPY(input,U8,OUT,OUTTYPE,elements); \
+            break; \
+        case PS_TYPE_U16: \
+            PSIMAGE_ELEMENT_COPY(input,U16,OUT,OUTTYPE,elements); \
+            break; \
+        case PS_TYPE_U32: \
+            PSIMAGE_ELEMENT_COPY(input,U32,OUT,OUTTYPE,elements); \
+            break; \
+        case PS_TYPE_U64: \
+            PSIMAGE_ELEMENT_COPY(input,U64,OUT,OUTTYPE,elements); \
+            break; \
+        case PS_TYPE_F32: \
+            PSIMAGE_ELEMENT_COPY(input,F32,OUT,OUTTYPE,elements); \
+            break; \
+        case PS_TYPE_F64: \
+            PSIMAGE_ELEMENT_COPY(input,F64,OUT,OUTTYPE,elements); \
+            break; \
+        case PS_TYPE_C32: \
+            PSIMAGE_ELEMENT_COPY(input,C32,OUT,OUTTYPE,elements); \
+            break; \
+        case PS_TYPE_C64: \
+            PSIMAGE_ELEMENT_COPY(input,C64,OUT,OUTTYPE,elements); \
+            break; \
+        default: \
+            break; \
+        } \
+    }
+
+    switch (type) {
+    case PS_TYPE_S8:
+        PSIMAGE_COPY_CASE(output, S8);
+        break;
+    case PS_TYPE_S16:
+        PSIMAGE_COPY_CASE(output, S16);
+        break;
+    case PS_TYPE_S32:
+        PSIMAGE_COPY_CASE(output, S32);
+        break;
+    case PS_TYPE_S64:
+        PSIMAGE_COPY_CASE(output, S64);
+        break;
+    case PS_TYPE_U8:
+        PSIMAGE_COPY_CASE(output, U8);
+        break;
+    case PS_TYPE_U16:
+        PSIMAGE_COPY_CASE(output, U16);
+        break;
+    case PS_TYPE_U32:
+        PSIMAGE_COPY_CASE(output, U32);
+        break;
+    case PS_TYPE_U64:
+        PSIMAGE_COPY_CASE(output, U64);
+        break;
+    case PS_TYPE_F32:
+        PSIMAGE_COPY_CASE(output, F32);
+        break;
+    case PS_TYPE_F64:
+        PSIMAGE_COPY_CASE(output, F64);
+        break;
+    case PS_TYPE_C32:
+        PSIMAGE_COPY_CASE(output, C32);
+        break;
+    case PS_TYPE_C64:
+        PSIMAGE_COPY_CASE(output, C64);
+        break;
+    default: {
+            char* typeStr;
+            PS_TYPE_NAME(typeStr,type);
+            psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                    PS_ERRORTEXT_psImage_IMAGE_TYPE_UNSUPPORTED,
+                    typeStr);
+            psFree(output);
+
+            break;
+        }
+    }
+    return output;
+}
+
+bool p_psImageCopyToRawBuffer(void* buffer,
+                              const psImage* input,
+                              psElemType type)
+{
+    psElemType inDatatype;
+    psS32 numRows;
+    psS32 numCols;
+
+    if (input == NULL || input->data.V == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psImage_IMAGE_NULL);
+        return false;
+    }
+
+    if (input->type.dimen != PS_DIMEN_IMAGE) {
+        psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                PS_ERRORTEXT_psImage_NOT_AN_IMAGE);
+        return false;
+    }
+
+    inDatatype = input->type.type;
+    numRows = input->numRows;
+    numCols = input->numCols;
+
+    // cover the trival case of copy of the same
+    // datatype.
+    if (type == inDatatype) {
+        int rowSize = PSELEMTYPE_SIZEOF(inDatatype)*numCols;
+        for (psS32 row=0;row<numRows;row++) {
+            memcpy(&((psS8*)buffer)[row*rowSize], input->data.V[row], rowSize);
+        }
+        return true;
+    }
+
+    #define PSIMAGE_BUFFER_COPY(INTYPE,OUTTYPE) { \
+        ps##INTYPE *in; \
+        ps##OUTTYPE *out = buffer; \
+        for(psS32 row=0;row<numRows;row++) { \
+            in = input->data.INTYPE[row]; \
+            for (psS32 col=0;col<numCols;col++) { \
+                *(out++) = *(in++); \
+            } \
+        } \
+    }
+
+    #define PSIMAGE_BUFFER_COPY_CASE(OUT,OUTTYPE) { \
+        switch (inDatatype) { \
+        case PS_TYPE_S8: \
+            PSIMAGE_BUFFER_COPY(S8,OUTTYPE); \
+            break; \
+        case PS_TYPE_S16: \
+            PSIMAGE_BUFFER_COPY(S16,OUTTYPE); \
+            break; \
+        case PS_TYPE_S32: \
+            PSIMAGE_BUFFER_COPY(S32,OUTTYPE); \
+            break; \
+        case PS_TYPE_S64: \
+            PSIMAGE_BUFFER_COPY(S64,OUTTYPE); \
+            break; \
+        case PS_TYPE_U8: \
+            PSIMAGE_BUFFER_COPY(U8,OUTTYPE); \
+            break; \
+        case PS_TYPE_U16: \
+            PSIMAGE_BUFFER_COPY(U16,OUTTYPE); \
+            break; \
+        case PS_TYPE_U32: \
+            PSIMAGE_BUFFER_COPY(U32,OUTTYPE); \
+            break; \
+        case PS_TYPE_U64: \
+            PSIMAGE_BUFFER_COPY(U64,OUTTYPE); \
+            break; \
+        case PS_TYPE_F32: \
+            PSIMAGE_BUFFER_COPY(F32,OUTTYPE); \
+            break; \
+        case PS_TYPE_F64: \
+            PSIMAGE_BUFFER_COPY(F64,OUTTYPE); \
+            break; \
+        case PS_TYPE_C32: \
+            PSIMAGE_BUFFER_COPY(C32,OUTTYPE); \
+            break; \
+        case PS_TYPE_C64: \
+            PSIMAGE_BUFFER_COPY(C64,OUTTYPE); \
+            break; \
+        default: \
+            break; \
+        } \
+    }
+
+    switch (type) {
+    case PS_TYPE_S8:
+        PSIMAGE_BUFFER_COPY_CASE(output, S8);
+        break;
+    case PS_TYPE_S16:
+        PSIMAGE_BUFFER_COPY_CASE(output, S16);
+        break;
+    case PS_TYPE_S32:
+        PSIMAGE_BUFFER_COPY_CASE(output, S32);
+        break;
+    case PS_TYPE_S64:
+        PSIMAGE_BUFFER_COPY_CASE(output, S64);
+        break;
+    case PS_TYPE_U8:
+        PSIMAGE_BUFFER_COPY_CASE(output, U8);
+        break;
+    case PS_TYPE_U16:
+        PSIMAGE_BUFFER_COPY_CASE(output, U16);
+        break;
+    case PS_TYPE_U32:
+        PSIMAGE_BUFFER_COPY_CASE(output, U32);
+        break;
+    case PS_TYPE_U64:
+        PSIMAGE_BUFFER_COPY_CASE(output, U64);
+        break;
+    case PS_TYPE_F32:
+        PSIMAGE_BUFFER_COPY_CASE(output, F32);
+        break;
+    case PS_TYPE_F64:
+        PSIMAGE_BUFFER_COPY_CASE(output, F64);
+        break;
+    case PS_TYPE_C32:
+        PSIMAGE_BUFFER_COPY_CASE(output, C32);
+        break;
+    case PS_TYPE_C64:
+        PSIMAGE_BUFFER_COPY_CASE(output, C64);
+        break;
+    default: {
+            char* typeStr;
+            PS_TYPE_NAME(typeStr,type);
+            psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                    PS_ERRORTEXT_psImage_IMAGE_TYPE_UNSUPPORTED,
+                    typeStr);
+            break;
+        }
+    }
+    return true;
+}
+
+
+psS32 psImageFreeChildren(psImage* image)
+{
+    psS32 numFreed = 0;
+
+    if (image == NULL) {
+        return numFreed;
+    }
+
+    if (image->children != NULL) {
+        psImage** children = (psImage**)image->children->data;
+        numFreed = image->children->n;
+
+        // orphan the children first
+        // (so psFree doesn't try to modify the parent's children array while I'm using it)
+        for (psS32 i=0;i<numFreed;i++) {
+            children[i]->parent = NULL;
+        }
+
+        psFree(image->children);
+        image->children = NULL;
+    }
+
+    return numFreed;
+}
+
+psC64 psImagePixelInterpolate(const psImage* input,
+                              float x,
+                              float y,
+                              const psImage* mask,
+                              psU32 maskVal,
+                              psC64 unexposedValue,
+                              psImageInterpolateMode mode)
+{
+
+    if (input == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL,true,
+                PS_ERRORTEXT_psImage_IMAGE_NULL);
+        return unexposedValue;
+    }
+
+    #define PSIMAGE_PIXEL_INTERPOLATE_CASE(TYPE)                             \
+case PS_TYPE_##TYPE:                                                 \
+    switch (mode) {                                                  \
+    case PS_INTERPOLATE_FLAT:                                        \
+        return p_psImagePixelInterpolateFLAT_##TYPE(                 \
+                input,                                               \
+                x,                                                   \
+                y,                                                   \
+                mask,                                                \
+                maskVal,                                             \
+                unexposedValue);                                     \
+        break;                                                       \
+    case PS_INTERPOLATE_BILINEAR:                                    \
+        return p_psImagePixelInterpolateBILINEAR_##TYPE(             \
+                input,                                               \
+                x,                                                   \
+                y,                                                   \
+                mask,                                                \
+                maskVal,                                             \
+                unexposedValue);                                     \
+        break;                                                       \
+    case PS_INTERPOLATE_BILINEAR_VARIANCE:                           \
+        return p_psImagePixelInterpolateBILINEAR_VARIANCE_##TYPE(    \
+                input,                                               \
+                x,                                                   \
+                y,                                                   \
+                mask,                                                \
+                maskVal,                                             \
+                unexposedValue);                                     \
+        break;                                                       \
+    default:                                                         \
+        psError(PS_ERR_BAD_PARAMETER_VALUE,true,                     \
+                PS_ERRORTEXT_psImage_INTERPOLATE_METHOD_INVALID,     \
+                mode);                                               \
+    }                                                                \
+    break;
+
+    switch (input->type.type) {
+        PSIMAGE_PIXEL_INTERPOLATE_CASE(U8);
+        PSIMAGE_PIXEL_INTERPOLATE_CASE(U16);
+        PSIMAGE_PIXEL_INTERPOLATE_CASE(U32);
+        PSIMAGE_PIXEL_INTERPOLATE_CASE(U64);
+        PSIMAGE_PIXEL_INTERPOLATE_CASE(S8);
+        PSIMAGE_PIXEL_INTERPOLATE_CASE(S16);
+        PSIMAGE_PIXEL_INTERPOLATE_CASE(S32);
+        PSIMAGE_PIXEL_INTERPOLATE_CASE(S64);
+        PSIMAGE_PIXEL_INTERPOLATE_CASE(F32);
+        PSIMAGE_PIXEL_INTERPOLATE_CASE(F64);
+        PSIMAGE_PIXEL_INTERPOLATE_CASE(C32);
+        PSIMAGE_PIXEL_INTERPOLATE_CASE(C64);
+    default: {
+            char* typeStr;
+            PS_TYPE_NAME(typeStr,input->type.type);
+            psError(PS_ERR_BAD_PARAMETER_TYPE,true,
+                    PS_ERRORTEXT_psImage_IMAGE_TYPE_UNSUPPORTED,
+                    typeStr);
+        }
+    }
+
+    return unexposedValue;
+}
+
+#define PSIMAGE_PIXEL_INTERPOLATE_FLAT(TYPE,RETURNTYPE) \
+inline RETURNTYPE p_psImagePixelInterpolateFLAT_##TYPE( \
+        const psImage* input, \
+        float x, \
+        float y, \
+        const psImage* mask, \
+        psU32 maskVal, \
+        RETURNTYPE unexposedValue) \
+{ \
+    psS32 intX = (psS32) round((psF64)(x) - 0.5 + FLT_EPSILON); \
+    psS32 intY = (psS32) round((psF64)(y) - 0.5 + FLT_EPSILON); \
+    psS32 lastX = input->numCols - 1; \
+    psS32 lastY = input->numRows - 1; \
+    \
+    if ((intX < 0) || \
+            (intX > lastX) || \
+            (intY < 0) || \
+            (intY > lastY) || \
+            ( (mask!=NULL) && \
+              ((mask->data.PS_TYPE_MASK_DATA[intY][intX] & maskVal) != 0) ) ) { \
+        return unexposedValue; \
+    } \
+    \
+    return input->data.TYPE[intY][intX]; \
+}
+
+PSIMAGE_PIXEL_INTERPOLATE_FLAT(U8,psF64)
+PSIMAGE_PIXEL_INTERPOLATE_FLAT(U16,psF64)
+PSIMAGE_PIXEL_INTERPOLATE_FLAT(U32,psF64)
+PSIMAGE_PIXEL_INTERPOLATE_FLAT(U64,psF64)
+PSIMAGE_PIXEL_INTERPOLATE_FLAT(S8,psF64)
+PSIMAGE_PIXEL_INTERPOLATE_FLAT(S16,psF64)
+PSIMAGE_PIXEL_INTERPOLATE_FLAT(S32,psF64)
+PSIMAGE_PIXEL_INTERPOLATE_FLAT(S64,psF64)
+PSIMAGE_PIXEL_INTERPOLATE_FLAT(F32,psF64)
+PSIMAGE_PIXEL_INTERPOLATE_FLAT(F64,psF64)
+PSIMAGE_PIXEL_INTERPOLATE_FLAT(C32,psC64)
+PSIMAGE_PIXEL_INTERPOLATE_FLAT(C64,psC64)
+
+#define PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(TYPE, RETURNTYPE, SUFFIX, FRACFUNC) \
+inline RETURNTYPE p_psImagePixelInterpolateBILINEAR_##SUFFIX( \
+        const psImage* input, \
+        float x, \
+        float y, \
+        const psImage* mask, \
+        psU32 maskVal, \
+        RETURNTYPE unexposedValue) \
+{ \
+    double floorX = floor((psF64)(x) - 0.5); \
+    double floorY = floor((psF64)(y) - 0.5); \
+    psF64 fracX = x - 0.5 - floorX; \
+    psF64 fracY = y - 0.5 - floorY; \
+    psS32 intFloorX = (psS32) floorX; \
+    psS32 intFloorY = (psS32) floorY; \
+    psS32 lastX = input->numCols - 1; \
+    psS32 lastY = input->numRows - 1; \
+    ps##TYPE V00 = 0; \
+    ps##TYPE V01 = 0; \
+    ps##TYPE V10 = 0; \
+    ps##TYPE V11 = 0; \
+    psBool valid00 = false; \
+    psBool valid01 = false; \
+    psBool valid10 = false; \
+    psBool valid11 = false; \
+    \
+    if (intFloorY >= 0 && intFloorY <= lastY) { \
+        if (intFloorX >= 0 && intFloorX <= lastX) { \
+            V00 = input->data.TYPE[intFloorY][intFloorX]; \
+            valid00 = (mask == NULL) || \
+                      ((mask->data.PS_TYPE_MASK_DATA[intFloorY][intFloorX] & maskVal) == 0); \
+        } \
+        if (intFloorX >= -1 && intFloorX < lastX) { \
+            V10 = input->data.TYPE[intFloorY][intFloorX+1]; \
+            valid10 = (mask == NULL) || \
+                      ((mask->data.PS_TYPE_MASK_DATA[intFloorY][intFloorX+1] & maskVal) == 0); \
+        } \
+    } \
+    if (intFloorY >= -1 && intFloorY < lastY) { \
+        if (intFloorX >= 0 && intFloorX <= lastX) { \
+            V01 = input->data.TYPE[intFloorY+1][intFloorX]; \
+            valid01 = (mask == NULL) || \
+                      ((mask->data.PS_TYPE_MASK_DATA[intFloorY+1][intFloorX] & maskVal) == 0); \
+        } \
+        if (intFloorX >= -1 && intFloorX < lastX) { \
+            V11 = input->data.TYPE[intFloorY+1][intFloorX+1]; \
+            valid11 = (mask == NULL) || \
+                      ((mask->data.PS_TYPE_MASK_DATA[intFloorY+1][intFloorX+1] & maskVal) == 0); \
+        } \
+    } \
+    \
+    /* cover likely case of all pixels being valid more efficiently */  \
+    if (valid00 && valid10 && valid01 && valid11) { \
+        /* formula from the ADD */ \
+        return V00*FRACFUNC((1.0-fracX)*(1.0-fracY)) + V10*FRACFUNC(fracX*(1.0-fracY)) + \
+               V01*FRACFUNC(fracY*(1.0-fracX)) + V11*FRACFUNC(fracX*fracY); \
+    } \
+    \
+    /* OK, at least one pixel is not valid - need to do it piecemeal */ \
+    \
+    RETURNTYPE V0 = 0.0; \
+    psBool valid0 = true; \
+    if (valid00 && valid10) { \
+        V0 = V00*FRACFUNC(1-fracX)+V10*FRACFUNC(fracX); \
+    } else if (valid00) { \
+        V0 = V00; \
+    } else if (valid10) { \
+        V0 = V10; \
+    } else { \
+        valid0 = false; \
+    } \
+    \
+    RETURNTYPE V1 = 0.0; \
+    psBool valid1 = true; \
+    if (valid01 && valid11) { \
+        V1 = V01*FRACFUNC(1-fracX)+V11*FRACFUNC(fracX); \
+    } else if (valid01) { \
+        V1 = V01; \
+    } else if (valid11) { \
+        V1 = V11; \
+    } else { \
+        valid1 = false; \
+    } \
+    \
+    if (valid0 && valid1) { \
+        return V0*FRACFUNC(1-fracY) + V1*FRACFUNC(fracY); \
+    } else if (valid0) { \
+        return V0; \
+    } else if (valid1) { \
+        return V1; \
+    } \
+    \
+    return unexposedValue; \
+}
+
+PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(U8,psF64,U8,)
+PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(U16,psF64,U16,)
+PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(U32,psF64,U32,)
+PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(U64,psF64,U64,)
+PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(S8,psF64,S8,)
+PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(S16,psF64,S16,)
+PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(S32,psF64,S32,)
+PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(S64,psF64,S64,)
+PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(F32,psF64,F32,)
+PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(F64,psF64,F64,)
+PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(C32,psC64,C32,)
+PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(C64,psC64,C64,)
+
+// Variance Version
+PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(U8,psF64,VARIANCE_U8,SQUARE)
+PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(U16,psF64,VARIANCE_U16,SQUARE)
+PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(U32,psF64,VARIANCE_U32,SQUARE)
+PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(U64,psF64,VARIANCE_U64,SQUARE)
+PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(S8,psF64,VARIANCE_S8,SQUARE)
+PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(S16,psF64,VARIANCE_S16,SQUARE)
+PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(S32,psF64,VARIANCE_S32,SQUARE)
+PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(S64,psF64,VARIANCE_S64,SQUARE)
+PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(F32,psF64,VARIANCE_F32,SQUARE)
+PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(F64,psF64,VARIANCE_F64,SQUARE)
+PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(C32,psC64,VARIANCE_C32,SQUARE)
+PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(C64,psC64,VARIANCE_C64,SQUARE)
Index: /tags/ipp-1-X/bug123/psLib/src/mathtypes/psImage.h
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/mathtypes/psImage.h	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/mathtypes/psImage.h	(revision 22331)
@@ -0,0 +1,234 @@
+/** @file  psImage.h
+ *
+ *  @brief Contains basic image definitions and operations
+ *
+ *  This file defines the basic type for an image struct and functions useful
+ *  in manupulating images.
+ *
+ *  @ingroup Image
+ *
+ *  @author Robert DeSonia, MHPCC
+ *  @author Ross Harman, MHPCC
+ *
+ *  @version $Revision: 1.50 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-04-15 00:12:08 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+#ifndef PS_IMAGE_H
+#define PS_IMAGE_H
+
+#include <complex.h>
+
+#include "psType.h"
+#include "psArray.h"
+
+/// @addtogroup Image
+/// @{
+
+/** enumeration of options in interpolation
+ *
+ */
+typedef enum {
+    PS_INTERPOLATE_FLAT,               ///< 'flat' interpolation (nearest pixel)
+    PS_INTERPOLATE_BILINEAR,           ///< bi-linear interpolation
+    PS_INTERPOLATE_LANCZOS2,           ///< Sinc interpolation with 4x4 pixel kernel
+    PS_INTERPOLATE_LANCZOS3,           ///< Sinc interpolation with 6x6 pixel kernel
+    PS_INTERPOLATE_LANCZOS4,           ///< Sinc interpolation with 8x8 pixel kernel
+    PS_INTERPOLATE_BILINEAR_VARIANCE,  ///< Variance version of PS_INTERPOLATE_BILINEAR
+    PS_INTERPOLATE_LANCZOS2_VARIANCE,  ///< Variance version of PS_INTERPOLATE_LANCZOS2
+    PS_INTERPOLATE_LANCZOS3_VARIANCE,  ///< Variance version of PS_INTERPOLATE_LANCZOS3
+    PS_INTERPOLATE_LANCZOS4_VARIANCE,  ///< Variance version of PS_INTERPOLATE_LANCZOS4
+    PS_INTERPOLATE_NUM_MODES           ///< enum end-marker; does not coorespond to a interpolation mode
+} psImageInterpolateMode;
+
+/** Basic image data structure.
+ *
+ * Struct for maintaining image data of varying types. It also contains
+ * information about image size, parent images and children images.
+ *
+ */
+typedef struct psImage
+{
+    const psType type;                 ///< Image data type and dimension.
+    const psU32 numCols;               ///< Number of columns in image
+    const psU32 numRows;               ///< Number of rows in image.
+    const psS32 col0;                  ///< Column position relative to parent.
+    const psS32 row0;                  ///< Row position relative to parent.
+
+    union {
+        psU8**  U8;                    ///< Unsigned 8-bit integer data.
+        psU16** U16;                   ///< Unsigned 16-bit integer data.
+        psU32** U32;                   ///< Unsigned 32-bit integer data.
+        psU64** U64;                   ///< Unsigned 64-bit integer data.
+        psS8**  S8;                    ///< Signed 8-bit integer data.
+        psS16** S16;                   ///< Signed 16-bit integer data.
+        psS32** S32;                   ///< Signed 32-bit integer data.
+        psS64** S64;                   ///< Signed 64-bit integer data.
+        psF32** F32;                   ///< Single-precision float data.
+        psF64** F64;                   ///< Double-precision float data.
+        psC32** C32;                   ///< Single-precision complex data.
+        psC64** C64;                   ///< Double-precision complex data.
+        psPtr** PTR;                   ///< Void pointers.
+        psPtr*  V;                     ///< Pointer to data.
+    } data;                            ///< Union for data types.
+    const struct psImage* parent;      ///< Parent, if a subimage.
+    psArray* children;                 ///< Children of this region.
+
+    psPtr rawDataBuffer;
+}
+psImage;
+
+/** Basic image region structure.
+ *
+ * Struct for specifying a rectangular area in an image.
+ *
+ */
+typedef struct
+{
+    psF32 x0;                         ///< the first column of the region.
+    psF32 x1;                         ///< the last column of the region.
+    psF32 y0;                         ///< the first row of the region.
+    psF32 y1;                         ///< the last row of the region.
+}
+psRegion;
+
+/** Create an image of the specified size and type.
+ *
+ * Uses psLib memory allocation functions to create an image struct of the
+ * specified size and type.
+ *
+ * @return psImage* : Pointer to psImage.
+ *
+ */
+psImage* psImageAlloc(
+    psU32 numCols,                     ///< Number of rows in image.
+    psU32 numRows,                     ///< Number of columns in image.
+    const psElemType type              ///< Type of data for image.
+);
+
+/** Create a psRegion with the specified attributes.
+ *
+ * Uses psLib memory allocation functions to create a psRegion the
+ * specified x0, x1, y0, and y1.
+ *
+ * @return psRegion* : Pointer to psRegion.
+ *
+ */
+psRegion* psRegionAlloc(
+    psF32 x0,                         ///< the first column of the region.
+    psF32 x1,                         ///< the last column of the region.
+    psF32 y0,                         ///< the first row of the region.
+    psF32 y1                          ///< the last row of the region.
+);
+
+/** Create a psRegion with the attribute values given as a string.
+ *
+ *  Create a psRegion with the attribute values given as a string.  The format
+ *  shall be of the standard IRAF form '[x0:x1,y0:y1]'
+ *
+ *  @return psRegion*:  A new psRegion struct, or NULL is not successful.
+ */
+psRegion* psRegionFromString(
+    char* region                       ///< image rectangular region in the form '[x0:x1,y0:y1]'
+);
+
+/** Create a string of the standard IRAF form '[x0:x1,y0:y1]' from a psRegion.
+ *
+ *  @return char*:  A new string representing the psRegion as text, or NULL
+ *                  is not successful.
+ */
+char* psRegionToString(
+    psRegion* region                   ///< the psRegion to convert to a string
+);
+
+/** Resize a given image to the given size/type.
+ *
+ *  @return psImage* Resized psImage.
+ *
+ */
+psImage* psImageRecycle(
+    psImage* old,                      ///< the psImage to recycle by resizing image buffer
+    psU32 numCols,                     ///< the desired number of columns in image
+    psU32 numRows,                     ///< the desired number of rows in image
+    const psElemType type              ///< the desired datatype of the image
+);
+
+/** Makes a copy of a psImage
+ *
+ * @return psImage* Copy of the input psImage.  This may not be equal to the
+ * output parameter
+ *
+ */
+psImage* psImageCopy(
+    psImage* output,                   ///< if not NULL, a psImage that could be recycled.
+    const psImage* input,              ///< the psImage to copy
+    psElemType type                    ///< the desired datatype of the returned copy
+);
+
+bool p_psImageCopyToRawBuffer(
+    void* buffer,
+    const psImage* input,
+    psElemType type
+);
+
+/** Frees all children of a psImage.
+ *
+ *  @return psS32      Number of children freed.
+ *
+ */
+psS32 psImageFreeChildren(
+    psImage* image                     ///< psImage in which all children shall be deallocated
+);
+
+/** Interpolate image pixel value given floating point coordinates.
+ *
+ *  @return psF32    Pixel value interpolated from image or unexposedValue if
+ *                   given x,y doesn't coorespond to a valid image location
+ */
+psC64 psImagePixelInterpolate(
+    const psImage* input,              ///< input image for interpolation
+    float x,                           ///< column location to derive value of
+    float y,                           ///< row location ot derive value of
+    const psImage* mask,               ///< if not NULL, the mask of the input image
+    psU32 maskVal,              ///< the mask value
+    psC64 unexposedValue,              ///< return value if x,y location is not in image.
+    psImageInterpolateMode mode        ///< interpolation mode
+);
+
+#define PIXEL_INTERPOLATE_FCN_PROTOTYPE(SUFFIX, RETURNTYPE) \
+inline RETURNTYPE p_psImagePixelInterpolate##SUFFIX( \
+        const psImage* input,          /**< input image for interpolation */ \
+        float x,                       /**< column location to derive value of */ \
+        float y,                       /**< row location ot derive value of */ \
+        const psImage* mask,           /**< if not NULL, the mask of the input image */ \
+        psU32 maskVal,                 /**< the mask value */ \
+        RETURNTYPE unexposedValue      /**< return value if x,y location is not in image. */ \
+                                                   );
+
+#define PIXEL_INTERPOLATE_FCNS(MODE) \
+PIXEL_INTERPOLATE_FCN_PROTOTYPE(MODE##_U8,psF64)  \
+PIXEL_INTERPOLATE_FCN_PROTOTYPE(MODE##_U16,psF64) \
+PIXEL_INTERPOLATE_FCN_PROTOTYPE(MODE##_U32,psF64) \
+PIXEL_INTERPOLATE_FCN_PROTOTYPE(MODE##_U64,psF64) \
+PIXEL_INTERPOLATE_FCN_PROTOTYPE(MODE##_S8,psF64)  \
+PIXEL_INTERPOLATE_FCN_PROTOTYPE(MODE##_S16,psF64) \
+PIXEL_INTERPOLATE_FCN_PROTOTYPE(MODE##_S32,psF64) \
+PIXEL_INTERPOLATE_FCN_PROTOTYPE(MODE##_S64,psF64) \
+PIXEL_INTERPOLATE_FCN_PROTOTYPE(MODE##_F32,psF64) \
+PIXEL_INTERPOLATE_FCN_PROTOTYPE(MODE##_F64,psF64) \
+PIXEL_INTERPOLATE_FCN_PROTOTYPE(MODE##_C32,psC64) \
+PIXEL_INTERPOLATE_FCN_PROTOTYPE(MODE##_C64,psC64)
+
+#ifndef SWIG
+PIXEL_INTERPOLATE_FCNS(FLAT)
+PIXEL_INTERPOLATE_FCNS(BILINEAR)
+PIXEL_INTERPOLATE_FCNS(BILINEAR_VARIANCE)
+#endif
+
+#undef PIXEL_INTERPOLATE_FCN_PROTOTYPE
+#undef PIXEL_INTERPOLATE_FCNS
+
+/// @}
+
+#endif
Index: /tags/ipp-1-X/bug123/psLib/src/mathtypes/psScalar.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/mathtypes/psScalar.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/mathtypes/psScalar.c	(revision 22331)
@@ -0,0 +1,139 @@
+/** @file  psScalar.c
+ *
+ *  @brief Contains basic scalar definitions and operations
+ *
+ *  This file defines the basic type for a scalar struct and functions useful
+ *  in manupulating scalars.
+ * *
+ *  @author Ross Harman, MHPCC
+ *
+ *  @version $Revision: 1.14 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-02-17 19:26:23 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+
+#include "psMemory.h"
+#include "psError.h"
+#include "psScalar.h"
+#include "psLogMsg.h"
+#include "psAbort.h"
+
+#include "psCollectionsErrors.h"
+
+psScalar* psScalarAlloc(psC64 value, psElemType dataType)
+{
+    psScalar* scalar = NULL;
+
+    // Create scalar
+    scalar = (psScalar* ) psAlloc(sizeof(psScalar));
+
+    scalar->type.dimen = PS_DIMEN_SCALAR;
+    scalar->type.type = dataType;
+
+    switch (dataType) {
+    case PS_TYPE_S8:
+        scalar->data.S8 = (psS8) value;
+        break;
+    case PS_TYPE_U8:
+        scalar->data.U8 = (psU8) value;
+        break;
+    case PS_TYPE_S16:
+        scalar->data.S16 = (psS16) value;
+        break;
+    case PS_TYPE_U16:
+        scalar->data.U16 = (psU16) value;
+        break;
+    case PS_TYPE_S32:
+        scalar->data.S32 = (psS32) value;
+        break;
+    case PS_TYPE_U32:
+        scalar->data.U32 = (psU32) value;
+        break;
+    case PS_TYPE_S64:
+        scalar->data.S64 = (psS64) value;
+        break;
+    case PS_TYPE_U64:
+        scalar->data.U64 = (psU64) value;
+        break;
+    case PS_TYPE_F32:
+        scalar->data.F32 = (psF32) value;
+        break;
+    case PS_TYPE_F64:
+        scalar->data.F64 = (psF64) value;
+        break;
+    case PS_TYPE_C32:
+        scalar->data.C32 = (psC32) value;
+        break;
+    case PS_TYPE_C64:
+        scalar->data.C64 = (psC64) value;
+        break;
+    default:
+        psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                PS_ERRORTEXT_psScalar_UNSUPPORTED_TYPE,
+                dataType);
+        psFree(scalar);
+        return NULL;
+    }
+
+    return scalar;
+}
+
+psScalar* psScalarCopy(psScalar *scalar)
+{
+    psElemType dataType;
+    psScalar *newScalar = NULL;
+
+    if (scalar == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psScalar_COPY_NULL);
+        return NULL;
+    }
+
+    dataType = scalar->type.type;
+    switch (dataType) {
+    case PS_TYPE_S8:
+        newScalar =  psScalarAlloc(scalar->data.S8, dataType);
+        break;
+    case PS_TYPE_U8:
+        newScalar =  psScalarAlloc(scalar->data.U8, dataType);
+        break;
+    case PS_TYPE_S16:
+        newScalar =  psScalarAlloc(scalar->data.S16, dataType);
+        break;
+    case PS_TYPE_U16:
+        newScalar =  psScalarAlloc(scalar->data.U16, dataType);
+        break;
+    case PS_TYPE_S32:
+        newScalar =  psScalarAlloc(scalar->data.S32, dataType);
+        break;
+    case PS_TYPE_U32:
+        newScalar =  psScalarAlloc(scalar->data.U32, dataType);
+        break;
+    case PS_TYPE_S64:
+        newScalar =  psScalarAlloc(scalar->data.S64, dataType);
+        break;
+    case PS_TYPE_U64:
+        newScalar =  psScalarAlloc(scalar->data.U64, dataType);
+        break;
+    case PS_TYPE_F32:
+        newScalar =  psScalarAlloc(scalar->data.F32, dataType);
+        break;
+    case PS_TYPE_F64:
+        newScalar =  psScalarAlloc(scalar->data.F64, dataType);
+        break;
+    case PS_TYPE_C32:
+        newScalar =  psScalarAlloc(scalar->data.C32, dataType);
+        break;
+    case PS_TYPE_C64:
+        newScalar =  psScalarAlloc(scalar->data.C64, dataType);
+        break;
+    default:
+        psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                PS_ERRORTEXT_psScalar_UNSUPPORTED_TYPE,
+                dataType);
+        return NULL;
+    }
+
+    return newScalar;
+}
Index: /tags/ipp-1-X/bug123/psLib/src/mathtypes/psScalar.h
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/mathtypes/psScalar.h	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/mathtypes/psScalar.h	(revision 22331)
@@ -0,0 +1,84 @@
+
+/** @file  psScalar.h
+ *
+ *  @brief Contains basic scalar definitions and operations
+ *
+ *  This file defines the basic type for a scalar struct and functions useful
+ *  in manupulating scalars.
+ *
+ *  @ingroup Scalar
+ *
+ *  @author Ross Harman, MHPCC
+ *
+ *  @version $Revision: 1.11 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-02-17 19:26:23 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+
+#ifndef PS_SCALAR_H
+#define PS_SCALAR_H
+
+#include "psType.h"
+
+/// @addtogroup Scalar
+/// @{
+
+/** Basic scalar data structure.
+ *
+ * Struct for maintaining a scalar of frequently used primitive types.
+ *
+ */
+typedef struct
+{
+    psType type;                ///< Type of data.
+
+    union {
+        psU8 U8;                ///< Unsigned 8-bit integer data.
+        psU16 U16;              ///< Unsigned 16-bit integer data.
+        psU32 U32;              ///< Unsigned 32-bit integer data.
+        psU64 U64;              ///< Unsigned 64-bit integer data.
+        psS8 S8;                ///< Signed 8-bit integer data.
+        psS16 S16;              ///< Signed 16-bit integer data.
+        psS32 S32;              ///< Signed 32-bit integer data.
+        psS64 S64;              ///< Signed 64-bit integer data.
+        psF32 F32;              ///< Single-precision float data.
+        psF64 F64;              ///< Double-precision float data.
+        psC32 C32;              ///< Single-precision complex data.
+        psC64 C64;              ///< Double-precision complex data.
+    } data;                     ///< Union for data types.
+}
+psScalar;
+
+/*****************************************************************************/
+
+/* FUNCTION PROTOTYPES                                                       */
+
+/*****************************************************************************/
+
+/** Allocate a scalar.
+ *
+ * Uses psLib memory allocation functions to create scalar data as defined by the psType type.
+ * Accepts a complex 64 bit float for input value, as max size, but resizes according to
+ * correct type.
+ *
+ * @return psScalar*   Pointer to a new psScalar.
+ */
+psScalar* psScalarAlloc(
+    psC64 value,                       ///< Data to be put into psScalar.
+    psElemType dataType                ///< Type of data to be held by psScalar.
+);
+
+/** Copy a scalar.
+ *
+ * Uses psLib memory allocation functions to copy a scalar.
+ *
+ * @return psScalar*    A copy of the input scalar
+ */
+psScalar* psScalarCopy(
+    psScalar *scalar                   ///< Scalar to copy.
+);
+
+/// @}
+
+#endif
Index: /tags/ipp-1-X/bug123/psLib/src/mathtypes/psVector.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/mathtypes/psVector.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/mathtypes/psVector.c	(revision 22331)
@@ -0,0 +1,527 @@
+/** @file  psVector.c
+*
+*  @brief Contains support for basic vector types
+*
+*  This file defines the basic type for a vector struct and functions useful
+*  in manupulating vectors.
+*
+*  @author Ross Harman, MHPCC
+*  @author Robert DeSonia, MHPCC
+*
+*  @version $Revision: 1.40 $ $Name: not supported by cvs2svn $
+*  @date $Date: 2005-04-21 21:21:01 $
+*
+*  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+*/
+
+#include <string.h>                        // for memcpy
+#include <stdlib.h>
+#include <stdio.h>
+#include <math.h>
+
+#include "psMemory.h"
+#include "psError.h"
+#include "psVector.h"
+#include "psLogMsg.h"
+#include "psCompare.h"
+
+#include "psCollectionsErrors.h"
+
+typedef struct
+{
+    p_psVectorData data; // need this first for psVectorSortIndex to work.
+    psU32 index;
+}
+indexedVector;
+
+static void vectorFree(psVector* psVec);
+
+static void vectorFree(psVector* psVec)
+{
+    if (psVec == NULL) {
+        return;
+    }
+
+    psFree(psVec->data.U8);
+}
+
+// FUNCTION IMPLEMENTATION - PUBLIC
+
+psVector* psVectorAlloc(psU32 nalloc, psElemType elemType)
+{
+    psVector* psVec = NULL;
+    psS32 elementSize = 0;
+
+    elementSize = PSELEMTYPE_SIZEOF(elemType);
+
+    // Create vector struct
+    psVec = (psVector* ) psAlloc(sizeof(psVector));
+    psMemSetDeallocator(psVec, (psFreeFcn) vectorFree);
+
+    psVec->type.dimen = PS_DIMEN_VECTOR;
+    psVec->type.type = elemType;
+    *(int*)&psVec->nalloc = nalloc;
+    psVec->n = nalloc;
+
+    // Create vector data array
+    psVec->data.U8 = psAlloc(nalloc * elementSize);
+
+    return psVec;
+}
+
+psVector* psVectorRealloc(psVector* in, psU32 nalloc)
+{
+    psS32 elementSize = 0;
+    psElemType elemType;
+
+    if (in == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psVector_REALLOC_NULL);
+        return NULL;
+    } else if (in->nalloc != nalloc) {     // No need to realloc to same size
+        elemType = in->type.type;
+        elementSize = PSELEMTYPE_SIZEOF(elemType);
+        if (nalloc < in->n) {
+            in->n = nalloc;
+        }
+        // Realloc after decrementation to avoid accessing freed array elements
+        in->data.U8 = psRealloc(in->data.U8, nalloc * elementSize);
+        *(int*)&in->nalloc = nalloc;
+    }
+
+    return in;
+}
+
+psVector* psVectorRecycle(psVector* in, psU32 n, psElemType type)
+{
+    psS32 byteSize;
+
+    if (in == NULL) {
+        return psVectorAlloc(n, type);
+    }
+
+    if (in->type.dimen !=  PS_DIMEN_VECTOR &&
+            in->type.dimen !=  PS_DIMEN_TRANSV) {
+        psFree(in);
+        psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                PS_ERRORTEXT_psVector_NOT_A_VECTOR);
+        return NULL;
+    }
+
+    byteSize = n * PSELEMTYPE_SIZEOF(type);
+
+    // need to increase data buffer?
+    if (byteSize > in->nalloc*PSELEMTYPE_SIZEOF(in->type.type)) {
+        in->data.U8 = psRealloc(in->data.U8, byteSize);
+        *(int*)&in->nalloc = n;
+    }
+
+    in->type.dimen = PS_DIMEN_VECTOR;
+    in->type.type = type;
+    in->n = n;
+    return in;
+}
+
+psVector* psVectorCopy(psVector* out, const psVector* in, psElemType type)
+{
+    if (in == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psVector_SORT_NULL);
+        psFree(out);
+        return NULL;
+    }
+
+    psS32 nElements = in->n;
+
+    out = psVectorRecycle(out, nElements, type);
+
+    #define PSVECTOR_COPY(INTYPE,OUTTYPE) { \
+        ps##INTYPE *inVec = in->data.INTYPE; \
+        ps##OUTTYPE *outVec = out->data.OUTTYPE; \
+        for (psS32 col=0;col<nElements;col++) { \
+            *(outVec++) = *(inVec++); \
+        } \
+    }
+
+    #define PSVECTOR_COPY_CASE(OUTTYPE) \
+case PS_TYPE_##OUTTYPE: { \
+        switch (in->type.type) { \
+        case PS_TYPE_S8: \
+            PSVECTOR_COPY(S8,OUTTYPE); \
+            break; \
+        case PS_TYPE_S16: \
+            PSVECTOR_COPY(S16,OUTTYPE); \
+            break; \
+        case PS_TYPE_S32: \
+            PSVECTOR_COPY(S32,OUTTYPE); \
+            break; \
+        case PS_TYPE_S64: \
+            PSVECTOR_COPY(S64,OUTTYPE); \
+            break; \
+        case PS_TYPE_U8: \
+            PSVECTOR_COPY(U8,OUTTYPE); \
+            break; \
+        case PS_TYPE_U16: \
+            PSVECTOR_COPY(U16,OUTTYPE); \
+            break; \
+        case PS_TYPE_U32: \
+            PSVECTOR_COPY(U32,OUTTYPE); \
+            break; \
+        case PS_TYPE_U64: \
+            PSVECTOR_COPY(U64,OUTTYPE); \
+            break; \
+        case PS_TYPE_F32: \
+            PSVECTOR_COPY(F32,OUTTYPE); \
+            break; \
+        case PS_TYPE_F64: \
+            PSVECTOR_COPY(F64,OUTTYPE); \
+            break; \
+        case PS_TYPE_C32: \
+            PSVECTOR_COPY(C32,OUTTYPE); \
+            break; \
+        case PS_TYPE_C64: \
+            PSVECTOR_COPY(C64,OUTTYPE); \
+            break; \
+        default: { \
+                char* typeStr; \
+                PS_TYPE_NAME(typeStr,type); \
+                psError(PS_ERR_BAD_PARAMETER_TYPE, true, \
+                        PS_ERRORTEXT_psVector_UNSUPPORTED_TYPE, \
+                        typeStr); \
+                psFree(out); \
+            } \
+        } \
+        break; \
+    }
+
+    switch (type) {
+        PSVECTOR_COPY_CASE(S8);
+        PSVECTOR_COPY_CASE(S16);
+        PSVECTOR_COPY_CASE(S32);
+        PSVECTOR_COPY_CASE(S64);
+        PSVECTOR_COPY_CASE(U8);
+        PSVECTOR_COPY_CASE(U16);
+        PSVECTOR_COPY_CASE(U32);
+        PSVECTOR_COPY_CASE(U64);
+        PSVECTOR_COPY_CASE(F32);
+        PSVECTOR_COPY_CASE(F64);
+        PSVECTOR_COPY_CASE(C32);
+        PSVECTOR_COPY_CASE(C64);
+    default: {
+            char* typeStr;
+            PS_TYPE_NAME(typeStr,type);
+            psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                    PS_ERRORTEXT_psVector_UNSUPPORTED_TYPE,
+                    typeStr);
+            psFree(out);
+
+            break;
+        }
+    }
+    return out;
+
+
+}
+
+psVector* psVectorSort(psVector* outVector, const psVector* inVector)
+{
+    psS32 N = 0;
+    psS32 elSize = 0;
+    psPtr inVec = NULL;
+    psPtr outVec = NULL;
+    psElemType inType = 0;
+
+    if (inVector == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psVector_SORT_NULL);
+        psFree(outVector);
+        return NULL;
+    }
+
+    inType = inVector->type.type;
+    N = inVector->n;
+    inVec = (psPtr)inVector->data.U8;
+    elSize = PSELEMTYPE_SIZEOF(inType);
+
+    if (outVector == NULL) {
+        outVector = psVectorAlloc(N, inType);
+    }
+
+    // check to see if output vector needs to be resized/retyped
+    if ( (N > outVector->nalloc) ||
+            (inType != outVector->type.type) ) {
+        // reshape the output vector to match the input vector's size/type.
+        outVector = psVectorRecycle(outVector,N,inType);
+    }
+    outVector->n = N;
+    outVec = outVector->data.U8;
+
+    if (N == 0) {
+        // no need to sort anything, as there are no elements in input vector.
+        return outVector;
+    }
+
+    // Copy input vector values into output vector if not in-place sorting
+    if (inVector != outVector) {
+        memcpy(outVec, inVec, elSize * N);
+    }
+
+    // Sort output vector
+    switch (inType) {
+    case PS_TYPE_U8:
+        qsort(outVec, N, elSize, psCompareU8);
+        break;
+    case PS_TYPE_U16:
+        qsort(outVec, N, elSize, psCompareU16);
+        break;
+    case PS_TYPE_U32:
+        qsort(outVec, N, elSize, psCompareU32);
+        break;
+    case PS_TYPE_U64:
+        qsort(outVec, N, elSize, psCompareU64);
+        break;
+    case PS_TYPE_S8:
+        qsort(outVec, N, elSize, psCompareS8);
+        break;
+    case PS_TYPE_S16:
+        qsort(outVec, N, elSize, psCompareS16);
+        break;
+    case PS_TYPE_S32:
+        qsort(outVec, N, elSize, psCompareS32);
+        break;
+    case PS_TYPE_S64:
+        qsort(outVec, N, elSize, psCompareS64);
+        break;
+    case PS_TYPE_F32:
+        qsort(outVec, N, elSize, psCompareF32);
+        break;
+    case PS_TYPE_F64:
+        qsort(outVec, N, elSize, psCompareF64);
+        break;
+    default:
+        psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                PS_ERRORTEXT_psVector_UNSUPPORTED_TYPE,
+                inType);
+        psFree(outVector);
+        return NULL;
+    }
+
+    return outVector;
+}
+
+psVector* psVectorSortIndex(psVector* outVector, const psVector* inVector)
+{
+    psS32 N = 0;
+    psElemType inType = 0;
+
+    if (inVector == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psVector_SORT_NULL);
+        psFree(outVector);
+        return NULL;
+    }
+
+    inType = inVector->type.type;
+    N = inVector->n;
+
+    if (N == 0) {
+        // no need to sort anything, as there are no elements in input vector.
+        return outVector;
+    }
+
+    // ok, let's create a temporary indexed vector
+    indexedVector* idxVector = psAlloc(sizeof(indexedVector)*N);
+    int elSize = PSELEMTYPE_SIZEOF(inType);
+    for (int i = 0; i < N; i++) {
+        idxVector[i].data.U8 = inVector->data.U8+i*elSize;
+        idxVector[i].index = i;
+    }
+
+    // Sort indexed vector
+    // n.b., since first element in indexedVector is a pointer to the data,
+    // we can use the 'Ptr' version of the standard compare functions
+    switch (inType) {
+    case PS_TYPE_U8:
+        qsort(idxVector, N, sizeof(indexedVector), (psCompareFcn)psCompareU8Ptr);
+        break;
+    case PS_TYPE_U16:
+        qsort(idxVector, N, sizeof(indexedVector), (psCompareFcn)psCompareU16Ptr);
+        break;
+    case PS_TYPE_U32:
+        qsort(idxVector, N, sizeof(indexedVector), (psCompareFcn)psCompareU32Ptr);
+        break;
+    case PS_TYPE_U64:
+        qsort(idxVector, N, sizeof(indexedVector), (psCompareFcn)psCompareU64Ptr);
+        break;
+    case PS_TYPE_S8:
+        qsort(idxVector, N, sizeof(indexedVector), (psCompareFcn)psCompareS8Ptr);
+        break;
+    case PS_TYPE_S16:
+        qsort(idxVector, N, sizeof(indexedVector), (psCompareFcn)psCompareS16Ptr);
+        break;
+    case PS_TYPE_S32:
+        qsort(idxVector, N, sizeof(indexedVector), (psCompareFcn)psCompareS32Ptr);
+        break;
+    case PS_TYPE_S64:
+        qsort(idxVector, N, sizeof(indexedVector), (psCompareFcn)psCompareS64Ptr);
+        break;
+    case PS_TYPE_F32:
+        qsort(idxVector, N, sizeof(indexedVector), (psCompareFcn)psCompareF32Ptr);
+        break;
+    case PS_TYPE_F64:
+        qsort(idxVector, N, sizeof(indexedVector), (psCompareFcn)psCompareF64Ptr);
+        break;
+    default:
+        psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                PS_ERRORTEXT_psVector_UNSUPPORTED_TYPE,
+                inType);
+        psFree(idxVector);
+        psFree(outVector);
+        return NULL;
+    }
+
+    // extract the indices to the output vector
+    outVector = psVectorRecycle(outVector, N, PS_TYPE_U32);
+    psU32* outData = outVector->data.U32;
+    for (int i = 0; i < N; i++) {
+        outData[i] = idxVector[i].index;
+    }
+
+    // Free temp memory
+    psFree(idxVector);
+
+    return outVector;
+}
+
+char* psVectorToString(psVector* vector, int maxLength)
+{
+
+    if (maxLength < 5) {
+        return NULL;
+    }
+
+    char* str = psAlloc(sizeof(char)*maxLength+1);
+
+    if (vector == NULL) {
+        snprintf(str,maxLength, "NULL");
+        return str;
+    }
+
+    int size = vector->n;
+
+    if (size == 0) {
+        snprintf(str,maxLength, "[]");
+        return str;
+    }
+
+    char* tempStr = psAlloc(sizeof(char)*maxLength+1);
+    *str = '\0';
+    bool full = false;
+
+    #define APPEND_ELEMENTS_CASE(TYPE, NATIVE_TYPE, FORMAT) \
+case PS_TYPE_##TYPE: \
+    for (lcv=0; lcv < size && ! full; lcv++) { \
+        snprintf(tempStr, maxLength, "%s" FORMAT, prefix, (NATIVE_TYPE) (vector->data.TYPE[lcv])); \
+        strncat(str,tempStr,maxLength); \
+        full = (strlen(str) > maxLength-2); \
+        prefix = ","; \
+    } \
+    break;
+
+    #define APPEND_ELEMENTS_CASE_COMPLEX(TYPE,CREAL,CIMAG) \
+case PS_TYPE_##TYPE: \
+    for (lcv=0; lcv < size && ! full; lcv++) { \
+        snprintf(tempStr, maxLength, "%s%g%+gi", prefix, \
+                 CREAL(vector->data.TYPE[lcv]), \
+                 CIMAG(vector->data.TYPE[lcv])); \
+        full = (strlen(str) > maxLength-2); \
+        prefix = ","; \
+    } \
+    break;
+
+    int lcv;
+    char* prefix = "[";
+    switch(vector->type.type) {
+        APPEND_ELEMENTS_CASE(S8,char,"%hd")
+        APPEND_ELEMENTS_CASE(S16,short int,"%hd")
+        APPEND_ELEMENTS_CASE(S32,int,"%d")
+        APPEND_ELEMENTS_CASE(S64,long,"%ld")
+        APPEND_ELEMENTS_CASE(U8,unsigned char,"%hu")
+        APPEND_ELEMENTS_CASE(U16,unsigned short,"%hu")
+        APPEND_ELEMENTS_CASE(U32,unsigned int, "%u")
+        APPEND_ELEMENTS_CASE(U64,unsigned long,"%lu")
+        APPEND_ELEMENTS_CASE(F32,double,"%g")
+        APPEND_ELEMENTS_CASE(F64,double,"%g")
+        APPEND_ELEMENTS_CASE_COMPLEX(C32,crealf,cimagf)
+        APPEND_ELEMENTS_CASE_COMPLEX(C64,creal,cimag)
+    default:
+        snprintf(str,maxLength,"[...]");
+        break;
+    }
+
+    if (full) {
+        // couldn't all fit in given string length
+
+        // remove elements until there is room for ",...]"
+        while (strlen(str) > maxLength - 5) {
+            char* lastComma = strrchr(str,',');
+            if (lastComma == NULL) { // no comma, must be first number
+                str[1] = '\0';
+            } else {
+                *lastComma = '\0';
+            }
+        }
+        strncat(str,",...]",maxLength);
+    } else {
+        strncat(str,"]",maxLength);
+    }
+
+    psFree(tempStr);
+
+    return str;
+}
+
+psF64 p_psVectorGetElementF64(psVector* vector,
+                              int position)
+{
+    if (vector == NULL) {
+        return NAN;
+    }
+    if (position < 0 || position >= vector->n) {
+        return NAN;
+    }
+
+    switch (vector->type.type) {
+    case PS_TYPE_U8:
+        return vector->data.U8[position];
+        break;
+    case PS_TYPE_U16:
+        return vector->data.U16[position];
+        break;
+    case PS_TYPE_U32:
+        return vector->data.U32[position];
+        break;
+    case PS_TYPE_U64:
+        return vector->data.U64[position];
+        break;
+    case PS_TYPE_S8:
+        return vector->data.S8[position];
+        break;
+    case PS_TYPE_S16:
+        return vector->data.S16[position];
+        break;
+    case PS_TYPE_S32:
+        return vector->data.S32[position];
+        break;
+    case PS_TYPE_S64:
+        return vector->data.S64[position];
+        break;
+    case PS_TYPE_F32:
+        return vector->data.F32[position];
+        break;
+    case PS_TYPE_F64:
+        return vector->data.F64[position];
+    default:
+        return NAN;
+    }
+}
Index: /tags/ipp-1-X/bug123/psLib/src/mathtypes/psVector.h
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/mathtypes/psVector.h	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/mathtypes/psVector.h	(revision 22331)
@@ -0,0 +1,167 @@
+/** @file  psVector.h
+ *
+ *  @brief Contains basic vector definitions and operations
+ *
+ *  This file defines the basic type for a vector struct and functions useful
+ *  in manupulating vectors.
+ *
+ *  @ingroup Vector
+ *
+ *  @author Robert DeSonia, MHPCC
+ *  @author Ross Harman, MHPCC
+ *
+ *  @version $Revision: 1.32 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-04-21 21:18:23 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+
+#ifndef PS_VECTOR_H
+#define PS_VECTOR_H
+
+#include "psType.h"
+
+/// @addtogroup Vector
+/// @{
+
+///< Union of psVector data types.
+typedef union {
+    psU8* U8;               ///< Unsigned 8-bit integer data.
+    psU16* U16;             ///< Unsigned 16-bit integer data.
+    psU32* U32;             ///< Unsigned 32-bit integer data.
+    psU64* U64;             ///< Unsigned 64-bit integer data.
+    psS8* S8;               ///< Signed 8-bit integer data.
+    psS16* S16;             ///< Signed 16-bit integer data.
+    psS32* S32;             ///< Signed 32-bit integer data.
+    psS64* S64;             ///< Signed 64-bit integer data.
+    psF32* F32;             ///< Single-precision float data.
+    psF64* F64;             ///< Double-precision float data.
+    psC32* C32;             ///< Single-precision complex data.
+    psC64* C64;             ///< Double-precision complex data.
+} p_psVectorData;
+
+/** An vector to support primitive types.
+ *
+ * Struct for maintaining an vector of frequently used primitive types.
+ *
+ */
+typedef struct
+{
+    psType type;                ///< Type of data.
+    int n;                      ///< Number of elements in use.
+    const int nalloc;           ///< Total number of elements available.
+    p_psVectorData data;        ///< Union for data types.
+}
+psVector;
+
+/*****************************************************************************/
+
+/* FUNCTION PROTOTYPES                                                       */
+
+/*****************************************************************************/
+
+
+/** Allocate a vector.
+ *
+ *  Uses psLib memory allocation functions to create a vector collection of
+ *  data as defined by the psType type.
+ *
+ * @return psVector*    Pointer to psVector.
+ */
+psVector* psVectorAlloc(
+    psU32 nalloc,               ///< Total number of elements to make available.
+    psElemType dataType                ///< Type of data to be held by vector.
+);
+
+/** Reallocate a vector.
+ *
+ *  Uses psLib memory allocation functions to reallocate a vector collection
+ *  of data. The vector is reallocated according to the psType type member
+ *  contained within the vector.
+ *
+ *  @return psVector*      Pointer to psVector.
+ *
+ */
+psVector* psVectorRealloc(
+    psVector* psVec,                   ///< Vector to reallocate.
+    psU32 nalloc                       ///< Total number of elements to make available.
+);
+
+/** Recycle a vector.
+ *
+ *  Uses psLib memory allocation functions to reallocate a vector collection
+ *  of data. The vector is reallocated according to the psElemType type
+ *  parameter.
+ *
+ * @return psVector*       Pointer to psVector.
+ *
+ */
+psVector* psVectorRecycle(
+    psVector* psVec,
+    ///< Vector to recycle.  If NULL, a new vector is created.  No effort
+    ///< taken to preserve the values.
+
+    psU32 nalloc,                      ///< Total number of elements to make available.
+    psElemType type                    ///< the datatype of the returned vector
+);
+
+/** Copy a vector, converting types.
+ *
+ *  Performs a deep copy of the elements of one psVector to a new psVector,
+ *  converting numeric types to a specified type.
+ *
+ * @return psVector*       Pointer to resulting psVector.
+ *
+ */
+psVector* psVectorCopy(
+    psVector* out,                     ///< if non-NULL, a psVector to recycle
+    const psVector* in,                ///< the vector to copy.
+    psElemType type                    ///< the data type of the resulting psVector
+);
+
+/** Sort an array of floats.
+ *
+ *  Sorts an array of floats in ascending order.  This function is valid for
+ *  all non-complex data types.
+ *
+ *  @return  psVector*     Pointer to sorted psVector.
+ */
+psVector* psVectorSort(
+    psVector* outVector,               ///< the output vector to recycle, or NULL if new vector desired.
+    const psVector* inVector           ///< the vector to sort.
+);
+
+/** Creates an array of indices based on sort ordered of array.
+ *
+ *  Sorts a vector and creates an integer array holding indices of
+ *  sorted float values based on pre-sort index positions.
+ *
+ *  @return  psVector*     vector of the indices of sort.
+ */
+psVector* psVectorSortIndex(
+    psVector* outVector,               ///< vector to recycle
+    const psVector* inVector           ///< vector to sort
+);
+
+/** Creates a string from a psVector's values in the form "[x0,x1,x2]".
+ *
+ *  @return psPtr          a newly allocated string
+ */
+char* psVectorToString(
+    psVector* vector,                  ///< vector to create a string from
+    int maxLength                      ///< the maximum length of the resulting string
+);
+
+/** Returns an element in the vector as a psF64 value
+ *
+ *  @return psF64          the value at specified position, or NAN if position is invalid.
+ */
+psF64 p_psVectorGetElementF64(
+    psVector* vector,                  ///< vector to retrieve element
+    int position                       ///< the vector position to get
+);
+
+
+/// @}
+
+#endif
Index: /tags/ipp-1-X/bug123/psLib/src/parseErrorCodes.pl
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/parseErrorCodes.pl	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/parseErrorCodes.pl	(revision 22331)
@@ -0,0 +1,97 @@
+#!/usr/bin/perl
+
+# Provides functions for handling long command line options
+use Getopt::Long;
+
+my @ErrorCodes        = ();
+my @ErrorDescriptions = ();
+
+my $data = "psErrorCodes.dat";
+
+# Assign variables based on the presence of command line options to the script
+GetOptions(
+    "data=s"  => \$data,
+    "verbose" => \$verbose,
+    "help"    => \$help
+);
+
+if ($help) {
+    print "Usage: parseErrorCodes ", "[--data=$data] ", "[--help] ",
+      "[--verbose] filename [filename ...]\n\n";
+    exit(0);
+}
+
+print "Using data file '$data'\n" if $verbose;
+unless ( open( DATAFILE, "<", $data ) ) {
+    die "Can not open data file $data.";
+}
+
+print "Datafile:\n" if $verbose;
+while (<DATAFILE>) {
+    chop;
+    if (/^\s*\#/) {
+        print "C $_\n" if $verbose;
+    }
+    else {
+        if (/^\s*(\w+)\s+([\%\w].*)/) {
+            my $ErrorCode        = $1;
+            my $ErrorDescription = $2;
+            print "  $ErrorCode: '$ErrorDescription'\n" if $verbose;
+            push( @ErrorCodes,        $ErrorCode );
+            push( @ErrorDescriptions, $ErrorDescription );
+        } else {
+            print "I $_\n" if $verbose;
+        }
+    }
+}
+close(DATAFILE);
+
+my $found = $#ErrorCodes + 1;
+print "\nFound $found error codes.\n" if $verbose;
+
+foreach (@ARGV) {
+    my $filename = $_;
+    my @result   = ();
+
+    die "Failed to open input file '$filename'"
+      if !open( INFILE, "<", $filename );
+
+    print "\nOutput File:\n" if $verbose;
+    while (<INFILE>) {
+        chop;
+        push( @result, $_ );
+        if (/^\s*\/\/~Start(.*)$/) {
+            $line = $1;
+            for ( $n = 0 ; $n < $found ; $n++ ) {
+                $_ = $line;
+                s/\$1/$ErrorCodes[$n]/g;
+                s/\$2/$ErrorDescriptions[$n]/g;
+                s/\$n/$n/g;
+                push( @result, $_ );
+                print "$_\n" if $verbose;
+            }
+
+            $break = 0;
+            while ( ( $break == 0 ) && ( $_ = <INFILE> ) ) {
+                if (/^\s*\/\/~End/) {
+                    $break = 1;
+                }
+            }
+            chop;
+            push( @result, $_ );
+        }
+    }
+
+    close(INFILE);
+
+    die "Failed to overwrite input file"
+      if !open( OUTFILE, ">", $filename );
+
+    foreach (@result) {
+        print OUTFILE "$_\n";
+        print "$_\n" if $verbose;
+    }
+
+    close(OUTFILE);
+
+}
Index: /tags/ipp-1-X/bug123/psLib/src/psErrorCodes.dat
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/psErrorCodes.dat	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/psErrorCodes.dat	(revision 22331)
@@ -0,0 +1,19 @@
+#
+#  This file is used to generate psErrorCode.h content
+#
+# Format:
+#    ERROR_CLASS_NAME    ERROR_CLASS_DESCRIPTION
+#
+# Note: the ERROR_CLASS_NAME will appear in the code with a "PS_ERR_" prefix
+#
+UNKNOWN                        unknown error
+IO                             I/O error
+LOCATION_INVALID               specified location is unknown
+MEMORY_CORRUPTION              memory corruption detected
+MEMORY_DEREF_USAGE             dereferenced memory still used
+BAD_PARAMETER_VALUE            parameter is out-of-range
+BAD_PARAMETER_TYPE             parameter is of unsupported type
+BAD_PARAMETER_NULL             parameter is null
+BAD_PARAMETER_SIZE             size of parameter's data is outside of acceptable range.
+UNEXPECTED_NULL                unexpected NULL found
+OS_CALL_FAILED                 unexpected result from an OS standard library call.
Index: /tags/ipp-1-X/bug123/psLib/src/psTest.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/psTest.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/psTest.c	(revision 22331)
@@ -0,0 +1,280 @@
+//
+// C Implementation: psTest
+//
+// Description:
+//
+//
+// Author: Robert DeSonia <robert.desonia@mhpcc.hpc.mil>, (C) 2004
+//
+// Copyright: See COPYING file that comes with this distribution
+//
+//
+#include "config.h"
+
+#include <sys/types.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <sys/wait.h>
+#include <stdbool.h>
+#include <string.h>
+
+#include "psTest.h"
+#include "psMemory.h"
+#include "psError.h"
+#include "psTrace.h"
+
+#define HEADER_TOP    "/***************************** TESTPOINT ******************************************\\\n"
+#define HEADER_LINE_STRING   "* %20s: %-58s *\n"
+#define HEADER_LINE_INT      "* %20s: %-58d *\n"
+#define HEADER_BOTTOM "\\**********************************************************************************/\n\n"
+
+psBool p_runTestSuite( FILE *fp, const char* testPointFile, const char* packageName,
+                       testDescription tests[], psS32 argc, char * const argv[] )
+{
+    psBool success = true;
+    psBool runAll = true;
+    psBool useFork = true;
+    psBool found;
+    psS32 c;
+    psS32 n;
+    extern char *optarg;
+
+    char* fileName = (char*)testPointFile;
+    char* lastSlashInFile = strrchr(testPointFile,'/');
+    if (lastSlashInFile != NULL) {
+        fileName = lastSlashInFile+1;
+    }
+
+    if ( argc > 0 ) {
+        while ( ( c = getopt( argc, argv, "lhn:dt:" ) ) != -1 ) {
+            switch ( c ) {
+            case 'h':
+                printf( "Usage: %s [-l] [-d] [-h] [-n=Testpoint#] [-t=TestpointName]\n"
+                        "    where:\n"
+                        "           -l  : lists the testpoints contained in this test driver executable\n"
+                        "           -d  : turns on debugger-friendly mode (no forking, aborts/signals are not handled)\n"
+                        "           -h  : prints this help\n"
+                        "           -n  : specifies a particular testpoint by number to run\n"
+                        "           -t  : specifies a particular testpoint by name to run\n"
+                        "    (if no -l, -n or -t options are given, all testpoints are run)\n",
+                        argv[ 0 ] );
+                runAll = false;
+                break;
+            case 'd':
+                useFork = false;
+                break;
+            case 'l':
+                printf( "Test Driver:  %s\n", fileName );
+                printf( "Package Name: %s\n", packageName );
+                printf( "Testpoints:\n" );
+                runAll = false;
+                for ( psS32 index = 0; tests[ index ].fcn != NULL; index++ ) {
+                    printf( "    %6d - %s \n", tests[ index ].testPointNumber,
+                            tests[ index ].testPointName );
+                }
+                printf( "\n" );
+                break;
+            case 't':
+                runAll = false;
+                for ( psS32 index = 0; tests[ index ].fcn != NULL; index++ ) {
+                    if ( strcmp( optarg, tests[ index ].testPointName ) == 0 ) {
+                        success = p_runTest( fp,
+                                             fileName,
+                                             packageName,
+                                             tests[ index ].testPointName,
+                                             tests[ index ].fcn,
+                                             tests[ index ].expectedReturn,
+                                             useFork ) && success;
+                    }
+                }
+                break;
+            case 'n':
+                runAll = false;
+                if ( sscanf( optarg, "%i", &n ) != 1 ) {
+                    psError(PS_ERR_UNKNOWN, true, "Failed to parse the testpoint number (%s).",
+                            optarg );
+                    break;
+                }
+                found = false;
+                for ( psS32 index = 0; tests[ index ].fcn != NULL; index++ ) {
+                    if ( n == tests[ index ].testPointNumber ) {
+                        found = true;
+                        success = p_runTest( fp,
+                                             fileName,
+                                             packageName,
+                                             tests[ index ].testPointName,
+                                             tests[ index ].fcn,
+                                             tests[ index ].expectedReturn,
+                                             useFork ) && success;
+                    }
+                }
+                if ( ! found ) {
+                    psError(PS_ERR_UNKNOWN, true, "The specified testpoint number (%d) doesn't exist in this test driver.",
+                            n );
+                    break;
+                }
+                break;
+            case '?':
+                psError(PS_ERR_UNKNOWN, true, "Option %s is not recognized and is ignored.", optarg );
+                break;
+            }
+        }
+    }
+
+    if ( runAll ) {
+        for ( psS32 index = 0; tests[ index ].fcn != NULL; index++ ) {
+            if ( ! tests[ index ].isDuplicateEntry ) {
+                success = p_runTest( fp,
+                                     fileName,
+                                     packageName,
+                                     tests[ index ].testPointName,
+                                     tests[ index ].fcn,
+                                     tests[ index ].expectedReturn,
+                                     useFork ) && success;
+            }
+        }
+    }
+
+    if ( ! success ) {
+        psError( PS_ERR_UNKNOWN, true,
+                 "One or more tests failed" );
+    }
+
+    return success;
+}
+
+psBool p_runTest( FILE *fp, const char* testPointFile, const char* packageName, const char* testPointName,
+                  testFcn fcn, psS32 expectedReturn, psBool useFork )
+{
+    psS32 childReturn = 0;
+    pid_t child;
+
+    char* fileName = (char*)testPointFile;
+    char* lastSlashInFile = strrchr(testPointFile,'/');
+    if (lastSlashInFile != NULL) {
+        fileName = lastSlashInFile+1;
+    }
+
+    p_printPositiveTestHeader( fp, fileName, packageName, testPointName );
+
+    if ( useFork ) {
+        child = fork();
+        if ( child == 0 ) {                   // I am the child process, run the test
+            psS32 currentId = psMemGetId();
+            psS32 retVal = fcn();
+            fflush(stdout);
+            fflush(stderr);
+            if ( retVal == 0 ) { // only bother checking memory if test executed to end.
+                if ( psMemCheckLeaks( currentId, NULL, stderr, false ) != 0 ) {
+                    psError(PS_ERR_UNKNOWN, true, "Memory Leaks Detected" );
+                    retVal = 64;
+                }
+                psMemCheckCorruption( 1 );
+            }
+            exit( retVal );
+        } else
+            if ( child < 0 ) {
+                fprintf( fp, "Couldn't fork a process to run a negative test (%s|%s)",
+                         packageName, testPointName );
+                abort();
+            }
+
+        waitpid( child, &childReturn, 0 );
+        if ( WIFSIGNALED( childReturn ) ) {
+            childReturn = -WTERMSIG( childReturn );
+        } else {
+            childReturn = WEXITSTATUS( childReturn );
+        }
+    } else {
+        psS32 currentId = psMemGetId();
+        childReturn = fcn();
+        fflush(stdout);
+        fflush(stderr);
+        if ( childReturn == 0 ) { // only bother checking memory if test executed to end.
+            if ( psMemCheckLeaks( currentId, NULL, stderr, false ) != 0 ) {
+                psError(PS_ERR_UNKNOWN, true, "Memory Leaks Detected" );
+                childReturn = 64;
+            }
+            psMemCheckCorruption( 1 );
+        }
+    }
+
+
+    if ( childReturn != expectedReturn ) {
+        fprintf( fp, "Return value mismatch: expected %d, got %d",
+                 expectedReturn, childReturn );
+    }
+
+    p_printFooter( fp, fileName, packageName, testPointName,
+                   ( childReturn == expectedReturn ) );
+
+    return ( childReturn == expectedReturn );
+}
+
+void p_printPositiveTestHeader( FILE *fp,
+                                const char* testPointFile,
+                                const char* packageName,
+                                const char* testPointName )
+{
+    char TP[ 80 ];
+
+    char* fileName = (char*)testPointFile;
+    char* lastSlashInFile = strrchr(testPointFile,'/');
+    if (lastSlashInFile != NULL) {
+        fileName = lastSlashInFile+1;
+    }
+
+    snprintf( TP, 80, "%s{%s}", packageName, testPointName );
+
+    fprintf( fp, HEADER_TOP );
+    fprintf( fp, HEADER_LINE_STRING, "TestFile", fileName);
+    fprintf( fp, HEADER_LINE_STRING, "TestPoint", TP );
+    fprintf( fp, HEADER_LINE_STRING, "TestType", "Positive" );
+    fprintf( fp, HEADER_BOTTOM );
+}
+
+void p_printNegativeTestHeader( FILE *fp,
+                                const char* testPointFile,
+                                const char* packageName,
+                                const char* testPointName,
+                                const char* expectedError,
+                                psS32 exitValue )
+{
+    char TP[ 80 ];
+
+    char* fileName = (char*)testPointFile;
+    char* lastSlashInFile = strrchr(testPointFile,'/');
+    if (lastSlashInFile != NULL) {
+        fileName = lastSlashInFile+1;
+    }
+
+    snprintf( TP, 80, "%s{%s}", packageName, testPointName );
+
+    fprintf( fp, HEADER_TOP );
+    fprintf( fp, HEADER_LINE_STRING, "TestFile", fileName);
+    fprintf( fp, HEADER_LINE_STRING, "TestPoint", TP );
+    fprintf( fp, HEADER_LINE_STRING, "TestType", "Negative" );
+    fprintf( fp, HEADER_LINE_STRING, "ExpectedErrorText", expectedError );
+    fprintf( fp, HEADER_LINE_INT, "ExpectedStatusValue", exitValue );
+    fprintf( fp, HEADER_BOTTOM );
+}
+
+
+void p_printFooter( FILE *fp,
+                    const char* testPointFile,
+                    const char* packageName,
+                    const char* testPointName,
+                    psBool success )
+{
+    char* fileName = (char*)testPointFile;
+    char* lastSlashInFile = strrchr(testPointFile,'/');
+    if (lastSlashInFile != NULL) {
+        fileName = lastSlashInFile+1;
+    }
+
+    if ( success ) {
+        fprintf( fp, "\n---> TESTPOINT PASSED (%s{%s} | %s)\n\n", packageName, testPointName, fileName);
+    } else {
+        fprintf( fp, "\n---> TESTPOINT FAILED (%s{%s} | %s)\n\n", packageName, testPointName, fileName);
+    }
+}
Index: /tags/ipp-1-X/bug123/psLib/src/psTest.h
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/psTest.h	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/psTest.h	(revision 22331)
@@ -0,0 +1,95 @@
+/** @file  psTest.h
+ *
+ *  Testing infrastructure functions.
+ *
+ *  @author Robert DeSonia, MHPCC
+ *
+ *  @version $Revision: 1.2 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-03-31 23:01:46 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ *
+ */
+
+
+#ifndef PSTEST_H
+#define PSTEST_H
+
+#include <stdio.h>
+
+#include "psType.h"
+
+#define printPositiveTestHeader(filePtr, packageName, testPointName) \
+p_printPositiveTestHeader(filePtr, __FILE__, packageName, testPointName)
+
+#define printNegativeTestHeader(filePtr, packageName, testPointName, expectedError, exitValue) \
+p_printNegativeTestHeader(filePtr, __FILE__, packageName, testPointName, expectedError, exitValue)
+
+#define printFooter(filePtr, packageName, testPointName, success) \
+p_printFooter(filePtr, __FILE__, packageName, testPointName, success)
+
+typedef psS32 (*testFcn)(void);
+
+typedef struct
+{
+    testFcn     fcn;
+    psS32       testPointNumber;
+    const char* testPointName;
+    psS32       expectedReturn;
+    psBool      isDuplicateEntry;
+}
+testDescription;
+
+#define runTest(filePtr, packageName, testPointName, fcn, expectedReturn, useFork) \
+p_runTest(filePtr, __FILE__, packageName, testPointName, fcn, expectedReturn, useFork)
+
+#define runTestSuite(filePtr, packageName, tests, argc, argv) \
+p_runTestSuite(filePtr, __FILE__, packageName, tests, argc, argv)
+
+
+/////////////////////////// PRIVATE FUNCTIONS //////////////////////////////
+
+psBool p_runTest(
+    FILE *fp,
+    const char* testPointFile,
+    const char* packageName,
+    const char* testPointName,
+    testFcn fcn,
+    psS32 expectedReturn,
+    psBool useFork
+);
+
+psBool p_runTestSuite(
+    FILE *fp,
+    const char* testPointFile,
+    const char* packageName,
+    testDescription tests[],
+    psS32 argc,
+    char * const argv[]
+);
+
+void p_printPositiveTestHeader(
+    FILE *fp,
+    const char* testPointFile,
+    const char* packageName,
+    const char* testPointName
+);
+
+void p_printNegativeTestHeader(
+    FILE *fp,
+    const char* testPointFile,
+    const char* packageName,
+    const char* testPointName,
+    const char* expectedError,
+    psS32 exitValue
+);
+
+void p_printFooter(
+    FILE *fp,
+    const char* testPointFile,
+    const char* packageName,
+    const char* testPointName,
+    psBool success
+);
+
+#endif
Index: /tags/ipp-1-X/bug123/psLib/src/pslib.h
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/pslib.h	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/pslib.h	(revision 22331)
@@ -0,0 +1,21 @@
+/** @file  pslib.h
+*
+*  @brief Contains the complete list of header files for pslib.
+*
+*  This header file includes all the necessary header files for a user to
+*  user all public functions within the pslib library.
+*
+*  @author Eric Van Alst, MHPCC
+*
+*  @version $Revision: 1.35 $ $Name: not supported by cvs2svn $
+*  @date $Date: 2005-04-07 20:27:41 $
+*
+*  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+*/
+
+#ifndef PS_LIB_H
+#define PS_LIB_H
+
+#include "pslib_strict.h"
+
+#endif
Index: /tags/ipp-1-X/bug123/psLib/src/pslib_strict.h
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/pslib_strict.h	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/pslib_strict.h	(revision 22331)
@@ -0,0 +1,187 @@
+/** @file  pslib_strict.h
+*
+*  @brief Contains the complete list of header files for pslib while poisoning
+*         the use of standard memory allocation routines.
+*
+*  This header file includes all the necessary header files for a user to
+*  user all public functions within the pslib library.
+*
+*  @author Eric Van Alst, MHPCC
+*
+*  @version $Revision: 1.1 $ $Name: not supported by cvs2svn $
+*  @date $Date: 2005-04-07 20:27:41 $
+*
+*  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+*/
+
+#ifndef PS_LIB_STRICT_H
+#define PS_LIB_STRICT_H
+
+#ifdef PS_LIB_H  /* this is included from pslib.h, so don't poison anything */
+#ifndef PS_ALLOW_MALLOC
+#define PS_ALLOW_MALLOC
+#endif
+#else
+#undef PS_ALLOW_MALLOC /* don't allow code to not poison malloc, i.e., strict poisioning */
+#endif
+
+// // System Utilities
+
+/// @defgroup SysUtils System Utilities
+/// @{
+
+/** @defgroup MemoryManagement Memory Management Utilities
+ *
+ *  This is the generic memory management system put inbetween the user's high level code and the OS-level
+ *  memory allocation routines.  This system adds such features as callback routines for memory error events,
+ *  tracing capabilities, and reference counting.
+ *
+ *  @ingroup SysUtils
+ */
+
+#include "fitsio.h"
+
+#include "psMemory.h"
+
+/// @defgroup LogTrace Tracing and Logging
+/// @ingroup SysUtils
+#include "psLogMsg.h"
+#include "psTrace.h"
+
+/// @defgroup ErrorHandling Error Handling
+/// @ingroup SysUtils
+#include "psAbort.h"
+#include "psError.h"
+
+#include "psString.h"
+
+/// @defgroup Configure Configure psLib
+/// @ingroup SysUtils
+#include "psConfigure.h"
+
+/// @}
+
+// Collections
+/// @defgroup DataContainer Data Containers
+/// @{
+
+#include "psType.h"
+
+/// @defgroup LinkedList Linked List
+/// @ingroup DataContainer
+#include "psList.h"
+
+/// @defgroup HashTable Hash Table
+/// @ingroup DataContainer
+#include "psHash.h"
+
+/// @defgroup Scalar Scalar
+/// @ingroup DataContainer
+#include "psScalar.h"
+
+/// @defgroup Vector Vector Container
+/// @ingroup DataContainer
+#include "psVector.h"
+
+/// @defgroup Array Array Container
+/// @ingroup DataContainer
+#include "psArray.h"
+
+/// @defgroup Image Image Container
+/// @ingroup DataContainer
+/// @{
+#include "psImage.h"
+#include "psImageExtraction.h"
+#include "psImageManip.h"
+#include "psImageConvolve.h"
+
+/// @defgroup ImageIO Image File I/O Functions
+/// @ingroup Image
+#include "psImageIO.h"
+
+/// @defgroup ImageStats Image Statistical Functions
+/// @ingroup Image
+#include "psImageStats.h"
+
+/// @}
+
+/// @defgroup BitSet Bit Set Container
+/// @ingroup DataContainer
+#include "psBitSet.h"
+
+/// @}
+
+// Data Manipulation
+/// @defgroup DataManip Data Manipulation
+/// @{
+
+/// @defgroup Compare Comparison Functions
+/// @ingroup DataManip
+#include "psCompare.h"
+
+/// @defgroup Stats Statistic Functions
+/// @ingroup DataManip
+#include "psStats.h"
+
+/// @defgroup Matrix Matrix Operations
+/// @ingroup DataManip
+#include "psMatrix.h"
+
+/// @defgroup MatrixArithmetic Matrix Arithmetic Operations
+/// @ingroup DataManip
+#include "psBinaryOp.h"
+#include "psUnaryOp.h"
+
+#include "psRandom.h"
+
+/// @defgroup Transform Fourier Transform Operations
+/// @ingroup DataManip
+#include "psVectorFFT.h"
+#include "psImageFFT.h"
+
+#include "psFunctions.h"
+#include "psMinimize.h"
+
+/// @}
+
+// Astronomy
+/// @defgroup Astronomy Astronomy Functions
+/// @{
+
+/// @defgroup CoordinateTransform Coordinate Functions
+/// @ingroup Astronomy
+#include "psCoord.h"
+
+/// @defgroup Photometry Photometry
+/// @ingroup Astronomy
+#include "psPhotometry.h"
+
+/// @defgroup Time Time Functions
+/// @ingroup Astronomy
+#include "psTime.h"
+
+/// @defgroup Metadata Metadata Functions
+/// @ingroup Astronomy
+#include "psMetadata.h"
+#include "psMetadataIO.h"
+
+/// @defgroup AstroImage Astrometry Functions
+/// @ingroup Astronomy
+#include "psAstrometry.h"
+#include "psConstants.h"
+#include "psDB.h"
+
+/// @}
+
+// FileUtils
+/// @defgroup FileUtils File Utilities
+/// @{
+#include "psFits.h"
+
+/// @defgroup LookupTable Lookup Table
+/// @ingroup FileUtils
+#include "psLookupTable.h"
+
+/// @}
+
+#endif
Index: /tags/ipp-1-X/bug123/psLib/src/sys/psAbort.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/sys/psAbort.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/sys/psAbort.c	(revision 22331)
@@ -0,0 +1,38 @@
+
+/** @file  psAbort.c
+ *
+ *  @brief Contains the definition for abort function
+ *
+ *  The abort logging and handling shall be performed by psAbort function.
+ *  This will allow for consistent handling of other software units
+ *  needing to abort from program execution.
+ *
+ *  @author Eric Van Alst, MHPCC
+ *   
+ *  @version $Revision: 1.10 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-02-17 19:26:24 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+
+#include <stdarg.h>
+#include <stdlib.h>
+#include "psAbort.h"
+#include "psLogMsg.h"
+
+void psAbort(const char *name, const char *fmt, ...)
+{
+    va_list argPtr;             // variable list arguement pointer
+
+    // Get the variable list parameters to pass to logging function
+    va_start(argPtr, fmt);
+
+    // Call logging function with PS_LOG_ABORT level
+    psLogMsgV(name, PS_LOG_ABORT, fmt, argPtr);
+
+    // Clean up stack after variable arguement has been used
+    va_end(argPtr);
+
+    // Call system abort function to terminate program execution
+    abort();
+}
Index: /tags/ipp-1-X/bug123/psLib/src/sys/psAbort.h
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/sys/psAbort.h	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/sys/psAbort.h	(revision 22331)
@@ -0,0 +1,47 @@
+
+/** @file  psAbort.h
+ *
+ *  @brief Contains the declarations for the abort function
+ *
+ *  The abort logging and handling shall be performed by psAbort function.
+ *  This will allow for consistent handling of other software units
+ *  needing to abort from program execution.
+ *
+ *  @ingroup ErrorHandling
+ *
+ *  @author Eric Van Alst, MHPCC
+ *
+ *  @version $Revision: 1.9 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-02-17 19:26:24 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+
+#ifndef PS_ABORT_H
+#define PS_ABORT_H
+
+// Doxygen grouping tags
+
+/** @addtogroup ErrorHandling
+ *  @{
+ */
+
+/** Reports an abort message to logging facility
+ *
+ *  This function will invoke the psLogMsg function with a level of 
+ *  PS_LOG_ABORT and pass the parameters name and fmt to generate a proper
+ *  log message.  After logging, this function will call system abort 
+ *  function to abnormally terminate the program.
+ *
+ *  @return  void No return value
+ *
+ */
+void psAbort(
+    const char *name,                  ///< Source of abort such as file or function detected
+    const char *fmt,                   ///< A printf style formatting statement defining msg
+    ...
+);
+
+/* @} */// Doxygen - End of SystemGroup Functions
+
+#endif
Index: /tags/ipp-1-X/bug123/psLib/src/sys/psConfigure.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/sys/psConfigure.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/sys/psConfigure.c	(revision 22331)
@@ -0,0 +1,54 @@
+/** @file  psConfigure.c
+ *
+ *  @brief Contains the declarations for initialization, memory finalization, and configuration.
+ *
+ *  These functions initalize psLib data before the beginning of a run and remove (finalize) the
+ *  same data after the run is complete. A function is also provided to return the current
+ *  psLib version.
+ *
+ *  @ingroup Configure
+ *
+ *  @author Ross Harman, MHPCC
+ *  @author Robert DeSonia, MHPCC
+ *
+ *  @version $Revision: 1.7 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-02-17 19:26:24 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+#include "psString.h"
+#include "psTime.h"
+#include "psError.h"
+#include "psConfigure.h"
+#include "psSysUtilsErrors.h"
+#include "config.h"
+
+char* psLibVersion(void)
+{
+    char version[80];
+    snprintf(version,80,"%s-v%s",PACKAGE,VERSION);
+
+    return(psStringCopy(version));
+}
+
+void psLibInit(bool predictable, const char* timeConfig)
+{
+    // Still needs error codes to be set
+    // Still needs random number generator initialization
+    // Please code me, Robert and George.
+
+    if(!p_psTimeInit(timeConfig)) {
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true, PS_ERRORTEXT_psConfigure_INITIALIZATION_FAILED, "psTime");
+        return;
+    }
+}
+
+void psLibFinalize(void)
+{
+    // Users of persistent memory should free them in this function
+
+    if(!p_psTimeFinalize()) {
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true, PS_ERRORTEXT_psConfigure_FINALIZATION_FAILED, "psTime");
+        return;
+    }
+}
Index: /tags/ipp-1-X/bug123/psLib/src/sys/psConfigure.h
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/sys/psConfigure.h	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/sys/psConfigure.h	(revision 22331)
@@ -0,0 +1,66 @@
+/** @file  psConfigure.h
+ *
+ *  @brief Contains the declarations for initialization, memory finalization, and configuration.
+ *
+ *  These functions initalize psLib data before the beginning of a run and remove (finalize) the
+ *  same data after the run is complete. A function is also provided to return the current
+ *  psLib version.
+ *
+ *  @ingroup Configure
+ *
+ *  @author Ross Harman, MHPCC
+ *  @author George Gusciora, MHPCC
+ *  @author Robert DeSonia, MHPCC
+ *
+ *  @version $Revision: 1.3 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-02-17 19:26:24 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+
+#ifndef PS_CONFIGURE_H
+#define PS_CONFIGURE_H
+
+
+/** @addtogroup Configure
+ *  @{
+ */
+
+/** Get current psLib version
+ *
+ *  Returns the current psLib version name as a string.
+ *
+ *  @return char*: String with version name.
+ */
+char* psLibVersion(
+    void
+);
+
+/** Initializes persistent memory.
+ *
+ *  Creates persistant memory items used throughout psLib. Items created within this method should be freed
+ *  with the psLibFinalize function.
+ *  current, a non-NULL psErr is returned with code PS_ERR_NONE.
+ *
+ *  @return void: void.
+ */
+void psLibInit(
+    bool predictable,
+    const char* timeConfig
+);
+
+/** Removes persistant memory created with the psLibInit function.
+ *
+ *  The memory created but not freed by psLib modules should be freed within this
+ *  function at the end of a psLib execution cycle.
+ *
+ *  @return void: void.
+ */
+void psLibFinalize(
+    void
+);
+
+
+/* @} */
+
+#endif
Index: /tags/ipp-1-X/bug123/psLib/src/sys/psError.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/sys/psError.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/sys/psError.c	(revision 22331)
@@ -0,0 +1,216 @@
+/** @file  psError.c
+ *
+ *  @brief Contains the definitions for the error reporting functions
+ *
+ *  Error reporting functions shall be used to create log entries in the
+ *  event errors are detected.  The messages shall give enough information
+ *  to allow the user to know where the error has occurred and the type
+ *  of error detected.
+ *
+ *  @author Eric Van Alst, MHPCC
+ *
+ *  @version $Revision: 1.24 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-04-07 20:27:41 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+
+#include <stdarg.h>
+#include <pthread.h>
+#include <string.h>
+
+#include "psLogMsg.h"
+#include "psError.h"
+#include "psMemory.h"
+
+#define MAX_ERROR_STACK_SIZE 64
+static psErr* errorStack[MAX_ERROR_STACK_SIZE];
+static psU32 errorStackSize = 0;
+pthread_mutex_t lockErrorStack = PTHREAD_MUTEX_INITIALIZER;
+
+static void pushErrorStack(psErr* err);
+
+static void pushErrorStack(psErr* err)
+{
+
+    pthread_mutex_lock(&lockErrorStack);
+
+    if (errorStackSize < MAX_ERROR_STACK_SIZE) {
+        errorStack[errorStackSize] = psMemIncrRefCounter(err);
+        errorStackSize++;
+        p_psMemSetPersistent(err,true);
+        p_psMemSetPersistent(err->msg,true);
+        p_psMemSetPersistent(err->name,true);
+    }
+
+    pthread_mutex_unlock(&lockErrorStack);
+}
+
+static void errFree(psErr* err)
+{
+    if (err != NULL) {
+        psFree(err->msg);
+        psFree(err->name);
+    }
+}
+
+psErr* psErrAlloc(const char* name, psErrorCode code, const char* msg)
+{
+    psErr* err = psAlloc(sizeof(psErr));
+    err->msg = strcpy(psAlloc(strlen(msg) + 1), msg);
+    err->name = strcpy(psAlloc(strlen(name) + 1), name);
+    err->code = code;
+
+    psMemSetDeallocator(err,(psFreeFcn)errFree);
+
+    return err;
+}
+
+psErrorCode p_psError(const char* file,
+                      int lineno,
+                      const char* func,
+                      psErrorCode code,
+                      psBool new,
+                      const char* fmt,
+                      ...)
+{
+    char errMsg[2048];
+    psErr* err;
+    char msgName[1024];
+
+    snprintf(msgName,1024,"%s (%s:%d)",func,file,lineno);
+
+    va_list argPtr;             // variable list arguement pointer
+
+    if (new) {
+        psErrorClear();
+    }
+
+    // Get the variable list parameters to pass to logging function
+    va_start(argPtr, fmt);
+
+    vsnprintf(errMsg,2048,fmt,argPtr);
+    err = psErrAlloc(msgName,code,errMsg);
+    pushErrorStack(err);
+
+    // Call logging function with PS_LOG_ERROR level
+    psLogMsg(msgName, PS_LOG_ERROR, errMsg);
+
+    // Clean up stack after variable argument has been used
+    va_end(argPtr);
+
+    psFree(err);
+
+    return code;
+}
+
+void p_psWarning(const char* file,
+                 int lineno,
+                 const char* func,
+                 const char* fmt,
+                 ...)
+{
+    char msgName[1024];
+
+    snprintf(msgName,1024,"%s (%s:%d)",func,file,lineno);
+
+    va_list argPtr;             // variable list argument pointer
+
+    // Get the variable list parameters to pass to logging function
+    va_start(argPtr, fmt);
+
+    psLogMsgV(msgName, PS_LOG_WARN, fmt, argPtr);
+
+    // Clean up stack after variable argument has been used
+    va_end(argPtr);
+
+    return;
+}
+
+psErr* psErrorGet(psS32 which)
+{
+    psErr* result;
+
+    pthread_mutex_lock(&lockErrorStack);
+
+    // Check for negative reference and if found return PS_ERR_NONE
+    if (which < 0 ) {
+        result = psErrAlloc("", PS_ERR_NONE, "");
+    } else {
+
+        which = errorStackSize-1-which;     // the which input is from the end of errorStack
+        if (which < 0 || which >= errorStackSize) {
+            result = psErrAlloc("",PS_ERR_NONE,"");    // no error at the given location
+        } else {
+            result = psMemIncrRefCounter(errorStack[which]); // a new reference passed back
+        }
+    }
+
+    pthread_mutex_unlock(&lockErrorStack);
+
+    return result;
+}
+
+psS32 psErrorGetStackSize()
+{
+    return errorStackSize;
+}
+
+psErr* psErrorLast(void)
+{
+    return psErrorGet(0);
+}
+
+void psErrorClear(void)
+{
+    pthread_mutex_lock(&lockErrorStack);
+
+    for (int lcv=0;lcv < errorStackSize; lcv++) {
+        p_psMemSetPersistent(errorStack[lcv],false);
+        p_psMemSetPersistent(errorStack[lcv]->msg,false);
+        p_psMemSetPersistent(errorStack[lcv]->name,false);
+        psFree(errorStack[lcv]);
+    }
+    errorStackSize = 0;
+
+    pthread_mutex_unlock(&lockErrorStack);
+
+}
+void psErrorStackPrint(FILE *fd, const char *fmt, ...)
+{
+    va_list argPtr;             // variable list arguement pointer
+
+    // Get the variable list parameters to pass to logging function
+    va_start(argPtr, fmt);
+
+    psErrorStackPrintV(fd,fmt,argPtr);
+
+    va_end(argPtr);
+}
+
+void psErrorStackPrintV(FILE *fd, const char *fmt, va_list va)
+{
+
+    pthread_mutex_lock(&lockErrorStack);
+
+    if (errorStackSize > 0) {
+        vfprintf(fd,fmt,va);
+
+        for (psS32 lcv=0;lcv<errorStackSize;lcv++) {
+            if(errorStack[lcv]->code >= PS_ERR_BASE) {
+                fprintf(fd," -> %s: %s\n     %s\n",
+                        errorStack[lcv]->name,
+                        psErrorCodeString(errorStack[lcv]->code),
+                        errorStack[lcv]->msg);
+            } else {
+                fprintf(fd," -> %s: %s\n     %s\n",
+                        errorStack[lcv]->name,
+                        strerror(errorStack[lcv]->code),
+                        errorStack[lcv]->msg);
+            }
+        }
+    }
+
+    pthread_mutex_unlock(&lockErrorStack);
+}
+
Index: /tags/ipp-1-X/bug123/psLib/src/sys/psError.h
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/sys/psError.h	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/sys/psError.h	(revision 22331)
@@ -0,0 +1,177 @@
+/** @file  psError.h
+ *
+ *  @brief Contains the declarations for the error reporting functions
+ *
+ *  Error reporting functions shall be used to create log entries in the
+ *  event errors are detected.  The messages shall give enough information
+ *  to allow the user to know where the error has occurred and the type
+ *  of error detected.
+ *
+ *  @ingroup ErrorHandling
+ *
+ *  @author Eric Van Alst, MHPCC
+ *
+ *  @version $Revision: 1.20 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-03-22 21:52:49 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+
+#ifndef PS_ERROR_H
+#define PS_ERROR_H
+
+#include<stdio.h>
+#include<stdbool.h>
+#include<stdarg.h>
+
+#include "psErrorCodes.h"
+
+/** @addtogroup ErrorHandling
+ *  @{
+ */
+
+/** Error message object */
+typedef struct
+{
+    char* name;                        ///< category of code that caused the error
+    psErrorCode code;                  ///< class of error
+    char* msg;                         ///< the message associated with the error
+}
+psErr;
+
+/** Get a error from the error stack
+ *
+ *  Previous errors on the stack are returned by psErrorGet (a value of 0
+ *  passed to psErrorGet is equivalent to a call to psErrorLast).
+ *
+ *  if no error is at the which position, a non-NULL psErr is returned with
+ *  code PS_ERR_NONE.
+ *
+ *  @return    Error message object at 'which'
+ */
+psErr* psErrorGet(
+    psS32 which                          ///< position in the error stack. 0 is last error on stack.
+);
+
+/** Get last error put on the error stack
+ *
+ *  The last error reported is available from psErrorLast; if no errors are
+ *  current, a non-NULL psErr is returned with code PS_ERR_NONE.
+ *
+ *  @return psErr*     Reference to last error message on error stack
+ */
+psErr* psErrorLast(void);
+
+/** Clears the error stack.
+ *
+ *  The error stack may be completely cleared with psErrorClear.
+ *
+ */
+void psErrorClear(void);
+
+/** Get the error stack depth
+ *
+ *  @return psS32   The number of items on the error stack
+ */
+psS32 psErrorGetStackSize();
+
+/** Prints error stack to specified open file descriptor
+ *
+ *  The entire error stack may be printed to an open file descriptor by
+ *  calling psErrorStackPrint; if and only if there are current errors, the
+ *  printf-style string fmt is first printed to the file descriptor fd. In
+ *  this printout, error codes are replaced by their string equivalents.
+ *
+ */
+void psErrorStackPrint(
+    FILE* fd,                          ///< destination file descriptor
+    const char* fmt,                   ///< printf-style format of header line
+    ...                                ///< any parameters required in fmt
+);
+
+#ifndef SWIG
+/** Prints error stack to specified open file descriptor
+ *
+ *  The entire error stack may be printed to an open file descriptor by
+ *  calling psErrorStackPrintV; if and only if there are current errors, the
+ *  vprintf-style string fmt is first printed to the file descriptor fd. In
+ *  this printout, error codes are replaced by their string equivalents.
+ *
+ */
+void psErrorStackPrintV(
+    FILE* fd,                          ///< destination file descriptor
+    const char* fmt,                   ///< printf-style format of header line
+    va_list va                         ///< any parameters required in fmt
+);
+#endif
+
+#ifdef DOXYGEN
+/** Reports an error message to the logging facility
+ *
+ *  This function will invoke the psLogMsg function with a level of
+ *  PS_LOG_ERROR and pass the parameters name and fmt to generate a proper
+ *  log message.
+ *
+ *  This function modifies the error stack.
+ *
+ *  @return psErrorCode    the given error code
+ */
+psErrorCode psError(
+    psErrorCode code,                  ///< Error class code
+    psBool new,                        ///< true if error originates at this location
+    const char* fmt,
+    ...
+);
+
+/** Logs a warning message.
+ *
+ *  This procedure logs a message to the destination set by a prior
+ *  call to psLogSetDestination(), This is equivalent to calling
+ *  psLogMsg with a level of PS_LOG_WARN.
+ *
+ */
+void psWarning(
+    const char* fmt,
+    ...
+);
+#else
+psErrorCode p_psError(
+    const char* file,
+    int lineno,
+    const char* func,
+    psErrorCode code,                  ///< Error class code
+    psBool new,                        ///< true if error originates at this location
+    const char* fmt,
+    ...
+);
+void p_psWarning(
+    const char* file,
+    int lineno,
+    const char* func,
+    const char* fmt,
+    ...
+);
+
+
+#ifndef SWIG
+#define psError(code,new,...) p_psError(__FILE__,__LINE__,__func__,code,new,__VA_ARGS__)
+#define psWarning(...) p_psWarning(__FILE__,__LINE__,__func__,__VA_ARGS__)
+#endif
+
+#endif
+
+/** Create a new psErr struct
+ *
+ *  Creates a new psErr struct, making a copy of the parameters.
+ *
+ *  @return psErr*     new psErr object
+ */
+psErr* psErrAlloc(
+    const char* name,                  ///< Name of error in the form aaa.bbb.ccc
+    psErrorCode code,                  ///< Error class code
+    const char* msg                    ///< Error message
+);
+
+/* @} */// End of SysUtils Functions
+
+#endif
Index: /tags/ipp-1-X/bug123/psLib/src/sys/psErrorCodes.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/sys/psErrorCodes.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/sys/psErrorCodes.c	(revision 22331)
@@ -0,0 +1,188 @@
+/** @file  psErrorCodes.c
+ *
+ *  @brief Contains the error codes for the error classes
+ *
+ *  @ingroup ErrorHandling
+ *
+ *  @author Robert DeSonia, MHPCC
+ *
+ *  @version $Revision: 1.17 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-04-07 20:27:41 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+
+#include <string.h>
+
+#include "psError.h"
+#include "psErrorCodes.h"
+#include "psList.h"
+#include "psMemory.h"
+
+#include "psSysUtilsErrors.h"
+
+/* N.B., lines between '//~Start' and '//~End' are automatic generated from
+ * the template following the '//~Start'.  The template is used to generate
+ * the other lines by, for each error class in psErrorCodes.dat, the following
+ * substitutions are made:
+ *     $1  The error code name (first word in the psErrorCodes.dat lines)
+ *     $2  The error description (rest of the line in psErrorCodes.dat)
+ *     $n  The order of the source line in psErrorCodes.dat (comments excluded)
+ * 
+ * DO NOT EDIT THE LINES BETWEEN //~Start and //~End!  ANY CHANGES WILL BE OVERWRITTEN.
+ */
+
+static psErrorDescription staticErrorCodes[] = {
+            {PS_ERR_NONE,"not an error"},
+            {PS_ERR_BASE,"base error"},
+            //~Start    {PS_ERR_$1,"$2"},
+            {PS_ERR_UNKNOWN,"unknown error"},
+            {PS_ERR_IO,"I/O error"},
+            {PS_ERR_LOCATION_INVALID,"specified location is unknown"},
+            {PS_ERR_MEMORY_CORRUPTION,"memory corruption detected"},
+            {PS_ERR_MEMORY_DEREF_USAGE,"dereferenced memory still used"},
+            {PS_ERR_BAD_PARAMETER_VALUE,"parameter is out-of-range"},
+            {PS_ERR_BAD_PARAMETER_TYPE,"parameter is of unsupported type"},
+            {PS_ERR_BAD_PARAMETER_NULL,"parameter is null"},
+            {PS_ERR_BAD_PARAMETER_SIZE,"size of parameter's data is outside of acceptable range."},
+            {PS_ERR_UNEXPECTED_NULL,"unexpected NULL found"},
+            {PS_ERR_OS_CALL_FAILED,"unexpected result from an OS standard library call"},
+            //~End
+            {PS_ERR_N_ERR_CLASSES,"error classes end marker"}
+        };
+
+static psList* dynamicErrorCodes = NULL;
+static const psErrorDescription* getErrorDescription(psErrorCode code);
+
+
+static const psErrorDescription* getErrorDescription(psErrorCode code)
+{
+    // first, search the static error codes
+
+    psS32 n = 0;
+    while(staticErrorCodes[n].code != PS_ERR_N_ERR_CLASSES &&
+            staticErrorCodes[n].code != code) {
+        n++;
+    }
+
+    if (staticErrorCodes[n].code == code) {
+        return &staticErrorCodes[n];
+    } else {
+        psErrorDescription* desc;
+        // make sure there is a list to search
+        if (dynamicErrorCodes == NULL) {
+            return NULL;
+        }
+
+        // search dynamic list of error descriptions before giving up.
+        psListIterator* iter = psListIteratorAlloc(dynamicErrorCodes,PS_LIST_HEAD,true);
+        while ((desc = (psErrorDescription*)psListGetAndIncrement(iter)) != NULL) {
+            if (desc->code == code) {
+                psFree(iter);
+                return desc;
+            }
+        }
+        psFree(iter);
+    }
+    return NULL;
+}
+
+static void freeErrorDescription(psErrorDescription* err)
+{
+    psFree((psPtr)err->description);
+}
+
+psErrorDescription* psErrorDescriptionAlloc(psErrorCode code,
+        const char *description)
+{
+    psErrorDescription* err = psAlloc(sizeof(psErrorDescription));
+    err->code = code;
+    if (description == NULL) {
+        err->description = NULL;
+    } else {
+        err->description = psAlloc(sizeof(char)*strlen(description)+1);
+        strcpy((char*)err->description,description);
+    }
+
+    psMemSetDeallocator(err,(psFreeFcn)freeErrorDescription);
+    return err;
+}
+
+
+const char *psErrorCodeString(psErrorCode code)
+{
+    // Check input argument is non-negative
+    if ( code < 0 ) {
+        return NULL;
+    }
+
+    const psErrorDescription* desc = getErrorDescription(code);
+
+    if (desc == NULL) {
+        return NULL;
+    }
+
+    return desc->description;
+}
+
+void psErrorRegister(const psErrorDescription* errors,
+                     psS32 nerror)
+{
+    if (nerror < 1) {
+        return;
+    }
+
+    if (errors == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psErrorCode_NULL_ERRORDESCRIPTION);
+        return;
+    }
+
+    if (dynamicErrorCodes == NULL) {
+        dynamicErrorCodes = psListAlloc(NULL);
+        p_psMemSetPersistent(dynamicErrorCodes,true);
+
+        p_psMemSetPersistent(dynamicErrorCodes->iterators,true);
+        p_psMemSetPersistent(dynamicErrorCodes->iterators->data,true);
+        for (int i = 0; i < dynamicErrorCodes->iterators->n;i++) {
+            p_psMemSetPersistent(dynamicErrorCodes->iterators->data[i],true);
+        }
+    }
+
+    for (psS32 i=0;i<nerror;i++) {
+        psErrorDescription* err = psErrorDescriptionAlloc(
+                                      errors[i].code, errors[i].description);
+        p_psMemSetPersistent(err,true);
+        p_psMemSetPersistent((psPtr)err->description,true);
+        if (! psListAdd(dynamicErrorCodes,
+                        PS_LIST_HEAD,
+                        err) ) {
+
+            psError(PS_ERR_UNKNOWN, false,
+                    PS_ERRORTEXT_psErrorCode_ERRORCODE_REGISTER_FAILED,
+                    i);
+        }
+        p_psMemSetPersistent(dynamicErrorCodes->head,true);
+        psFree(err);
+    }
+}
+
+psBool p_psErrorUnregister(psErrorCode code)
+{
+    // Check input argument is non-negative
+    if ( code < 0 ) {
+        return false;
+    }
+
+    const psErrorDescription* desc = getErrorDescription(code);
+
+    if (desc == NULL) {
+        return false;
+    }
+
+    if (dynamicErrorCodes == NULL) {
+        return false;
+    }
+
+    return psListRemoveData(dynamicErrorCodes,(psPtr)desc);
+}
Index: /tags/ipp-1-X/bug123/psLib/src/sys/psErrorCodes.h
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/sys/psErrorCodes.h	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/sys/psErrorCodes.h	(revision 22331)
@@ -0,0 +1,111 @@
+/** @file  psErrorCodes.h
+ *
+ *  @brief Contains the error codes for the error classes
+ *
+ *  @ingroup ErrorHandling
+ *
+ *  @author Robert DeSonia, MHPCC
+ *
+ *  @version $Revision: 1.14 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-02-17 19:26:24 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+
+#ifndef PS_ERROR_CODES_H
+#define PS_ERROR_CODES_H
+
+#include "psType.h"
+
+/* N.B., lines between '//~Start' and '//~End' are automatic generated from
+ * the template following the '//~Start'.  The template is used to generate
+ * the other lines by, for each error class in psErrorCodes.dat, the following
+ * substitutions are made:
+ *     $1  The error code name (first word in the psErrorCodes.dat lines)
+ *     $2  The error description (rest of the line in psErrorCodes.dat)
+ *     $n  The order of the source line in psErrorCodes.dat (comments excluded)
+ * 
+ * DO NOT EDIT THE LINES BETWEEN //~Start and //~End!  ANY CHANGES WILL BE OVERWRITTEN.
+ */
+
+/** @addtogroup ErrorHandling
+ *  @{
+ */
+
+/** enumeration of the static error code classes
+ */
+typedef enum {
+    PS_ERR_NONE = 0,                   ///< not an error
+    PS_ERR_BASE = 256,
+    /**< base error.  Any psErrorCode less than this should be taken to be
+     *   valid values of errno
+     */
+
+    //~Start     PS_ERR_$1,   ///< $2
+    PS_ERR_UNKNOWN,   ///< unknown error
+    PS_ERR_IO,   ///< I/O error
+    PS_ERR_LOCATION_INVALID,   ///< specified location is unknown
+    PS_ERR_MEMORY_CORRUPTION,   ///< memory corruption detected
+    PS_ERR_MEMORY_DEREF_USAGE,   ///< dereferenced memory still used
+    PS_ERR_BAD_PARAMETER_VALUE,   ///< parameter is out-of-range
+    PS_ERR_BAD_PARAMETER_TYPE,   ///< parameter is of unsupported type
+    PS_ERR_BAD_PARAMETER_NULL,   ///< parameter is null
+    PS_ERR_BAD_PARAMETER_SIZE,   ///< size of parameter's data is outside of acceptable range.
+    PS_ERR_UNEXPECTED_NULL,   ///< unexpected NULL found
+    PS_ERR_OS_CALL_FAILED,   ///< unexpected result from an OS standard library call
+    //~End
+    PS_ERR_N_ERR_CLASSES               ///< end marker - should not be used as a true error
+} psErrorCode;
+
+/** An error code with description
+ */
+typedef struct
+{
+    psErrorCode code;                  ///< An error code
+    const char *description;           ///< the associated description
+}
+psErrorDescription;
+
+/** Allocates a new psErrorDescription
+ *
+ *  @return psErrorDescription*        new psErrorDescription struct.
+ */
+psErrorDescription* psErrorDescriptionAlloc(
+    psErrorCode code,                  ///< An error code
+    const char *description            ///< the associated description
+);
+
+/** Retrieves the description of an error code.
+ *
+ *  The routine psErrorCodeString returns the string associated with an error 
+ *  code.
+ *
+ *  @return const char*     the description associated with the given code.
+ */
+const char *psErrorCodeString(
+    psErrorCode code                   ///< the associated error code
+);
+
+/** Register an error code
+ *
+ *  Any project needed to use psLib must define the necessary error codes and
+ *  associated message strings.  This function registers an array of error 
+ *  codes with the error handling subsystem.
+ *
+ */
+void psErrorRegister(
+    const psErrorDescription* errors,  ///< Array of error codes to register
+    psS32 nerror                         ///< number of errors in input array
+);
+
+/** Clears error codes registered via psErrorRegister.
+ *
+ *  @return psBool    TRUE if given errorcode was removed, otherwise FALSE.
+ */
+psBool p_psErrorUnregister(
+    psErrorCode code                   ///< the error code to find and remove
+);
+
+/// @}
+
+#endif
Index: /tags/ipp-1-X/bug123/psLib/src/sys/psLogMsg.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/sys/psLogMsg.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/sys/psLogMsg.c	(revision 22331)
@@ -0,0 +1,384 @@
+/** @file  psLogMsg.c
+ *  @brief Procedures for logging messages.
+ *  \ingroup LogTrace
+ *
+ *  This file will hold the prototypes for defining procedure which set
+ *  message log levels, messahe log formats, message log destinations, and
+ *  for generating the messages themselves.
+ *  @ingroup LogTrace
+ *
+ *  @author Robert Lupton, Princeton University
+ *  @author George Gusciora, MHPCC
+ *
+ *  @version $Revision: 1.39 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-03-22 21:52:49 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+
+/*****************************************************************************
+NOTES: currently, the prototype code has the following global variables:
+    static psS32 p_psGlobalLogDest;
+    static psS32 p_psGlobalLogLevel;
+    static psS32 p_psLogTime;
+    static psS32 p_psLogHost;
+    static psS32 p_psLogLevel;
+    static psS32 p_psLogName;
+    static psS32 p_psLogMsg;
+ *****************************************************************************/
+#include "config.h"
+
+#include <limits.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdarg.h>
+#include <time.h>
+#include <unistd.h>
+
+#include "psLogMsg.h"
+#include "psError.h"
+#include "psTrace.h"
+
+#include "psSysUtilsErrors.h"
+
+#define MIN_LOG_LEVEL 0
+#define MAX_LOG_LEVEL 9
+
+#define MAX_LOG_LINE_LENGTH 256
+
+static FILE *logDest = (FILE *) 1;      // flag to initialize to stderr before using.
+static psS32 globalLogLevel = PS_LOG_INFO;        // log all messages at this or above
+static psBool logTime = true;     // Flag to include time info
+static psBool logHost = true;     // Flag to include host info
+static psBool logLevel = true;    // Flag to include level info
+static psBool logName = true;     // Flag to include name info
+static psBool logMsg = true;      // Flag to include message info
+
+/*****************************************************************************
+psLogSetLevel(): Set the current log level and return old level.
+Input:
+ level (psS32): the new log level.
+Output:
+ none
+Return:
+ The old log level.
+ *****************************************************************************/
+psS32 psLogSetLevel(psS32 level)
+{
+    // Save old global log level for changing it.
+    psS32 oldLevel = globalLogLevel;
+
+    if ((level < MIN_LOG_LEVEL) || (level > MAX_LOG_LEVEL)) {
+        psLogMsg("logmsg", PS_LOG_WARN, "Attempt to set invalid logMsg level: %d", level);
+        level = (level < MIN_LOG_LEVEL) ? MIN_LOG_LEVEL : MAX_LOG_LEVEL;
+    }
+    // Set new global log level
+    globalLogLevel = level;
+
+    // Return old global log level
+    return oldLevel;
+}
+
+/*****************************************************************************
+psLogSetDestination(): sets the destination where log messages will be
+sent to.
+ 
+Input:
+ dest (psS32): the new log destination
+Output:
+ None.
+Return:
+ An integer specifying the old log destination.
+ *****************************************************************************/
+psBool psLogSetDestination(const char *dest)
+{
+    char protocol[5];
+    char location[257];
+
+    // if logDest has not been initialized, do so before using it
+    if (logDest == (FILE *) 1) {
+        logDest = stderr;
+    }
+
+    if (dest == NULL || strcmp(dest, "none") == 0) {
+        if (logDest != NULL && logDest != stderr && logDest != stdout) {
+            fclose(logDest);
+        }
+        logDest = NULL;
+        return true;
+    }
+
+    if (sscanf(dest, "%4s:%256s", protocol, location) < 2) {
+        psError(PS_ERR_LOCATION_INVALID, true,
+                PS_ERRORTEXT_psLogMsg_DESTINATION_MALFORMED,
+                dest);
+        return false;
+    }
+
+    if (strcmp(protocol, "dest") == 0) {
+        if (strcmp(location, "stderr") == 0) {
+            if (logDest != NULL && logDest != stderr && logDest != stdout) {
+                fclose(logDest);
+            }
+            logDest = stderr;
+            return true;
+        }
+        if (strcmp(location, "stdout") == 0) {
+            if (logDest != NULL && logDest != stderr && logDest != stdout) {
+                fclose(logDest);
+            }
+            logDest = stdout;
+            return true;
+        }
+        psError(PS_ERR_LOCATION_INVALID, true,
+                PS_ERRORTEXT_psLogMsg_DEST_LOCATION_INVALID,
+                location);
+        return 1;
+    } else if (strcmp(protocol, "file") == 0) {
+        FILE *file = fopen(location, "w");
+
+        if (file == NULL) {
+            psError(PS_ERR_IO, true,
+                    PS_ERRORTEXT_psLogMsg_OPEN_FILE_FAILED,
+                    location);
+            return false;
+        }
+        if (logDest != NULL && logDest != stderr && logDest != stdout) {
+            fclose(logDest);
+        }
+        logDest = file;
+        return true;
+    }
+
+    psError(PS_ERR_LOCATION_INVALID, true,
+            PS_ERRORTEXT_psLogMsg_UNSUPPORTED_PROTOCOL,
+            protocol);
+    return false;
+}
+
+/*****************************************************************************
+psLogSetFormat(): Set the format of psLogMsg output.  More precisely,
+    provide a string consisting of the letters {H (host), L (level), M
+    (message), N (name), T (time)}.  The default is "HLMNT".  This string
+    determines whether or not they associated type of information will be
+    included in message logs.  It does not determine the order in which that
+    information will appear (that order is fixed).
+ 
+Input:
+    fmt: a string specifying the format.
+Output:
+    none.
+Return:
+    NULL.
+ *****************************************************************************/
+void psLogSetFormat(const char *fmt)
+{
+    // assume nothing desired unless specified
+    logHost = false;
+    logLevel = false;
+    logMsg = false;
+    logName = false;
+    logTime = false;
+
+    // if fmt is NULL, no logging is desired.
+    if (fmt == NULL) {
+        return;
+    }
+
+    if (strlen(fmt) == 0) {
+        fmt = "THLNM";
+    }
+    // Step through each character in the format string.  For each letter
+    // in that string, set/unset the appropriate logging.
+
+    for (const char *ptr = fmt; *ptr != '\0'; ptr++) {
+        switch (*ptr) {
+        case 'H':
+        case 'h':
+            logHost = true;
+            break;
+        case 'L':
+        case 'l':
+            logLevel = true;
+            break;
+        case 'M':
+        case 'm':
+            logMsg = true;
+            break;
+        case 'N':
+        case 'n':
+            logName = true;
+            break;
+        case 'T':
+        case 't':
+            logTime = true;
+            break;
+        default:
+            psError(PS_ERR_BAD_PARAMETER_VALUE, true,
+                    PS_ERRORTEXT_psLogMsg_UNKNOWN_KEY, *ptr);
+            break;
+        }
+    }
+
+    if (!logMsg) {
+        psTrace("utils.logMsg", 1, "You must at least log error messages (You chose \"%s\")", fmt);
+    }
+}
+
+#if !defined(HOST_NAME_MAX)                // should be in limits.h
+#define HOST_NAME_MAX 256
+#endif
+
+/*****************************************************************************
+    psVLogMsg(): This routine sends the message, which is a printf style
+ string specified in the "..." argument, to the current message log
+ destination with the severity specified by the "level" argument.
+    Input:
+ name
+ level
+ fmt
+ ap
+    Output:
+ none
+    Return:
+ NULL.
+ *****************************************************************************/
+void psLogMsgV(const char *name, psS32 level, const char *fmt, va_list ap)
+{
+    static psS32 first = 1;       // Flag for calling gethostname()
+    static char hostname[HOST_NAME_MAX + 1];
+
+    // Buffer for hostname.
+    char clevel = 0;            // letter-name for level
+    char head[MAX_LOG_LINE_LENGTH + 2]; // the added two are for the ending | and \0
+    char *head_ptr = head;      // where we've got to in head
+    psS32 maxLength = MAX_LOG_LINE_LENGTH;
+    time_t clock = time(NULL);  // The current time.
+    struct tm *utc = gmtime(&clock);    // The current gm time.
+
+    // if logDest has not been initialized, do so before using it
+    if (logDest == (FILE *) 1) {
+        logDest = stderr;
+    }
+    // If logging is off, or if the level is too high, return immediately.
+    if ((level > globalLogLevel) || (logDest == NULL)) {
+        return;
+    }
+    // If I have not been here yet, determine my hostname and save it.
+    if (first) {
+        first = 0;
+        gethostname(hostname, HOST_NAME_MAX);
+    }
+
+    switch (level) {
+    case PS_LOG_ABORT:
+        clevel = 'A';
+        break;
+
+    case PS_LOG_ERROR:
+        clevel = 'E';
+        break;
+
+    case PS_LOG_WARN:
+        clevel = 'W';
+        break;
+
+    case PS_LOG_INFO:
+        clevel = 'I';
+        break;
+
+    case 4:
+    case 5:
+    case 6:
+    case 7:
+    case 8:
+    case 9:
+        clevel = level + '0';
+        break;
+
+    default:
+        psTrace("utils.logMsg", 2, "Invalid logMsg level: %d (%s)\n", level, fmt);
+        level = (level < 0) ? 0 : 9;
+        clevel = level + '0';
+        break;
+    }
+
+    // Create the various log fields...
+    if (logTime) {
+        maxLength -= snprintf(head_ptr, maxLength, "%4d:%02d:%02d %02d:%02d:%02dZ",
+                              utc->tm_year + 1900, utc->tm_mon + 1, utc->tm_mday,
+                              utc->tm_hour, utc->tm_min, utc->tm_sec) - 1;
+        head_ptr += strlen(head_ptr);
+    }
+    // Hostname should be 20 characters.
+    if (logHost) {
+        if (head_ptr > head) {
+            *head_ptr++ = '|';
+        }
+        maxLength -= snprintf(head_ptr, maxLength, "%-20s", hostname);
+        head_ptr += strlen(head_ptr);
+    }
+    if (logLevel) {
+        if (head_ptr > head) {
+            *head_ptr++ = '|';
+        }
+        maxLength -= snprintf(head_ptr, maxLength, "%c", clevel);
+        head_ptr += strlen(head_ptr);
+    }
+    if (logName) {
+        if (head_ptr > head) {
+            *head_ptr++ = '|';
+        }
+        maxLength -= snprintf(head_ptr, maxLength, "%s", name);
+
+        head_ptr += strlen(head_ptr);
+    }
+
+    if (head_ptr > head) {
+        *head_ptr++ = '\n';
+    } else if (!logMsg) {                  // no output desired
+        return;
+    }
+    *head_ptr = '\0';
+
+    fputs(head, logDest);
+    if (logMsg) {
+        char msg[1024];
+        char* msgPtr;
+        vsnprintf(msg,1024, fmt, ap);  // create message
+
+        // detect multiple lines in message and indent each line by 4 spaces.
+        char* line = strtok_r(msg,"\n",&msgPtr);
+        while (line != NULL) {
+            fprintf(logDest,"    %s\n",line);
+            line = strtok_r(NULL,"\n",&msgPtr);
+        }
+    } else {
+        fputc('\n', logDest);
+    }
+}
+
+/*****************************************************************************
+    psLogMsg(): This routine sends the message, which is a printf style
+ string specified in the "..." argument, to the current message log
+ destination with the severity specified by the "level" argument.
+    Input:
+ name: Indicates the source of this log message.
+ level: The severity of this log message.
+ fmt: The printf-stype formatted string, followed by the arguments
+  to that string.
+ ... The arguments to the above printf-style string.
+    Output:
+ none
+    Return:
+ NULL
+ *****************************************************************************/
+void psLogMsg(const char *name, psS32 level, const char *fmt, ...)
+{
+    va_list ap;
+
+    va_start(ap, fmt);
+    psLogMsgV(name, level, fmt, ap);
+    va_end(ap);
+}
Index: /tags/ipp-1-X/bug123/psLib/src/sys/psLogMsg.h
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/sys/psLogMsg.h	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/sys/psLogMsg.h	(revision 22331)
@@ -0,0 +1,106 @@
+/** @file  psLogMsg.h
+ *  @brief Procedures for logging messages.
+ *  \ingroup LogTrace
+ *
+ *  This file will hold the prototypes for defining procedure which set
+ *  message log levels, messahe log formats, message log destinations, and
+ *  for generating the messages themselves.
+ *  @ingroup LogTrace
+ *
+ *  @author Robert Lupton, Princeton University
+ *  @author George Gusciora, MHPCC
+ *
+ *  @version $Revision: 1.22 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-03-22 21:52:49 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+#if !defined(PS_LOG_MSG_H)
+#define PS_LOG_MSG_H
+#include <stdarg.h>
+
+#include "psType.h"
+
+/** @addtogroup LogTrace
+ *  @{
+ */
+
+/** This procedure sets the destination for future log messages.  Currently
+ *  the destination is specified by an integer which can have the following
+ *  pre-defined values: PS_LOG_NONE, PS_LOG_TO_STDOUT, and PS_LOG_TO_STDERR.
+ *  In future versions, this procedure will take a character string as an
+ *  argument which can specify more general log destinations.
+ *
+ *  @return psS32     true if set successfully, otherwise false.
+ */
+psBool psLogSetDestination(
+    const char *dest                   ///< Specifies where to send messages.
+);
+
+/** This procedure sets the message level for future log messages.  Subsequent
+ *  log messages, with a log level of "mylevel", will only be logged if
+ *  "mylevel" is less than the current log level set by this procedure.
+ *  Ie. higher values set by this procedure will cause more log messages to
+ *  be displayed.
+ *
+ *  @return psS32    old logging level
+ */
+psS32 psLogSetLevel(
+    psS32 level                          ///< Specifies the system log level
+);
+
+/** This procedure sets the log format for future log messages.  The argument
+ *  must be a character string consistsing of the letters H (host), L
+ *  (level), M (message), N (name), and T (time).  The default is "THLNM".
+ *  Deleting a letter from the string will cause the associated information
+ *  to not be logged.
+ *
+ */
+void psLogSetFormat(
+    const char *fmt                    ///< Specifies the system log format
+);
+
+/** This procedure logs a message to the destination set by a prior
+ *  call to psLogSetDestination(), if myLevel is less than the level
+ *  specified by a prior call to psLogSetLevel().  The message is specified
+ *  with a printf-stype string an arguments.
+ *
+ */
+void psLogMsg(
+    const char *name,                  ///< name of the log source
+    psS32 myLevel,                       ///< severity level of this log message
+    const char *fmt,                   ///< printf-style format command
+    ...
+);
+
+#ifndef SWIG
+/** This procedure is functionally equivalent to psLogMsg(), except that
+ *  it takes a va_list as the message parameter, not a printf-style string.
+ *
+ */
+void psLogMsgV(
+    const char *name,                  ///< name of the log source
+    psS32 myLevel,                       ///< severity level of this log message
+    const char *fmt,                   ///< printf-style format command
+    va_list ap                         ///< varargs argument list
+);
+#endif
+
+///< Status codes for log messages
+enum {
+    PS_LOG_ABORT = 0,                  ///< log message is a critical error, perform an abort after printing
+    PS_LOG_ERROR,                      ///< log message is an error, but don't abort
+    PS_LOG_WARN,                       ///< log message is a warning
+    PS_LOG_INFO                        ///< log message is informational only
+};
+
+///< Destinations for log messages
+enum {
+    PS_LOG_NONE,                       ///< turn off logging
+    PS_LOG_TO_STDERR,                  ///< log to system's stderr
+    PS_LOG_TO_STDOUT                   ///< log to system's stdout
+};
+
+/// @}
+
+#endif
Index: /tags/ipp-1-X/bug123/psLib/src/sys/psMemory.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/sys/psMemory.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/sys/psMemory.c	(revision 22331)
@@ -0,0 +1,701 @@
+/** @file  psMemory.c
+*
+*  @brief Contains the definitions for the memory management system
+*
+*  psMemory.h has additional information and documentation of the routines found in this file.
+*
+*  @author Robert DeSonia, MHPCC
+*  @author Robert Lupton, Princeton University
+*
+*  @version $Revision: 1.50 $ $Name: not supported by cvs2svn $
+*  @date $Date: 2005-04-07 20:27:41 $
+*
+*  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+*/
+
+#define PS_ALLOW_MALLOC                    // we're allowed to call malloc()
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <stdint.h>
+
+#include "psMemory.h"
+#include "psError.h"
+#include "psAbort.h"
+#include "psLogMsg.h"
+
+#include "psSysUtilsErrors.h"
+
+#define P_PS_MEMMAGIC (psPtr )0xdeadbeef   // Magic number in psMemBlock header
+
+#define P_PS_LARGE_BLOCK_SIZE 65536        // size where under, we try to recycle
+
+static psS32 checkMemBlock(const psMemBlock* m, const char *funcName);
+static psMemBlock* lastMemBlockAllocated = NULL;
+static pthread_mutex_t memBlockListMutex = PTHREAD_MUTEX_INITIALIZER;
+static pthread_mutex_t memIdMutex = PTHREAD_MUTEX_INITIALIZER;
+
+static pthread_mutex_t recycleMemBlockListMutex = PTHREAD_MUTEX_INITIALIZER;
+
+static psS32 recycleBins = 13;
+static psS32 recycleBinSize[14] = {
+                                      8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768, P_PS_LARGE_BLOCK_SIZE
+                                  };
+
+// N.B. recycleBinSize should be terminated by P_PS_LARGE_BLOCK_SIZE (simplifies search loops)
+static psMemBlock* recycleMemBlockList[13] = {
+            NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
+        };
+
+#ifdef PS_MEM_DEBUG
+static psMemBlock* deadBlockList;       // a place to put dead memBlocks in debug mode.
+#endif
+
+/**
+ * Unique ID for allocated blocks
+ */
+static psMemoryId memid = 0;
+
+/**
+ *  Default memExhausted callback.
+ */
+static psPtr memExhaustedCallbackDefault(size_t size)
+{
+    psPtr ptr = NULL;
+
+    pthread_mutex_lock(&recycleMemBlockListMutex);
+    psS32 level = recycleBins - 1;
+
+    while (level >= 0 && ptr == NULL) {
+        while (recycleMemBlockList[level] != NULL && ptr == NULL) {
+            psMemBlock* old = recycleMemBlockList[level];
+
+            recycleMemBlockList[level] = recycleMemBlockList[level]->nextBlock;
+            free(old);
+            ptr = malloc(size);
+        }
+        level--;
+    }
+    pthread_mutex_unlock(&recycleMemBlockListMutex);
+
+    return ptr;
+}
+
+static psMemExhaustedCallback memExhaustedCallback = memExhaustedCallbackDefault;
+
+psMemExhaustedCallback psMemExhaustedCallbackSet(psMemExhaustedCallback func)
+{
+    psMemExhaustedCallback old = memExhaustedCallback;
+
+    if (func != NULL) {
+        memExhaustedCallback = func;
+    } else {
+        memExhaustedCallback = memExhaustedCallbackDefault;
+    }
+
+    return old;
+}
+
+static void memProblemCallbackDefault(const psMemBlock* ptr, const char *file, psS32 lineno)
+{
+    if (ptr->refCounter < 1) {
+        psError(PS_ERR_MEMORY_CORRUPTION, false,
+                PS_ERRORTEXT_psMemory_MULTIPLE_FREE,
+                ptr->id, ptr->file, ptr->lineno, file, lineno);
+    }
+
+    if (lineno > 0) {
+        psAbort(__func__, "Detected a problem in the memory system at %s:%d", file, lineno);
+    }
+}
+static psMemProblemCallback memProblemCallback = memProblemCallbackDefault;
+
+psMemProblemCallback psMemProblemCallbackSet(psMemProblemCallback func)
+{
+    psMemProblemCallback old = memProblemCallback;
+
+    if (func != NULL) {
+        memProblemCallback = func;
+    } else {
+        memProblemCallback = memProblemCallbackDefault;
+    }
+
+    return old;
+}
+
+/*
+ * And now the I-want-to-be-informed callbacks
+ *
+ * Call the callbacks when these IDs are allocated/freed
+ */
+psMemoryId p_psMemAllocateID = 0;       // notify user this block is allocated
+psMemoryId p_psMemFreeID = 0;   // notify user this block is freed
+
+psMemoryId psMemAllocateCallbackSetID(psMemoryId id)
+{
+    psMemoryId old = p_psMemAllocateID;
+
+    p_psMemAllocateID = id;
+
+    return old;
+}
+
+psMemoryId psMemFreeCallbackSetID(psMemoryId id)
+{
+    psMemoryId old = p_psMemFreeID;
+
+    p_psMemFreeID = id;
+
+    return old;
+}
+
+/*
+ * Default callback for both allocate and free. Note that the
+ * value of p_psMemAllocateID/p_psMemFreeID is incremented
+ * by the return value (so returning 0 means that the callback
+ * isn't resignalled)
+ */
+static psMemoryId memAllocateCallbackDefault(const psMemBlock* ptr)
+{
+    static psMemoryId incr = 0; // "p_psMemAllocateID += incr"
+
+    return incr;
+}
+
+static psMemoryId memFreeCallbackDefault(const psMemBlock* ptr)
+{
+    static psMemoryId incr = 0; // "p_psMemFreeID += incr"
+
+    return incr;
+}
+
+/*
+ * The default callbacks, and the routines to change them
+ */
+static psMemAllocateCallback memAllocateCallback = memAllocateCallbackDefault;
+static psMemFreeCallback memFreeCallback = memFreeCallbackDefault;
+
+psMemAllocateCallback psMemAllocateCallbackSet(psMemAllocateCallback func)
+{
+    psMemFreeCallback old = memAllocateCallback;
+
+    if (func != NULL) {
+        memAllocateCallback = func;
+    } else {
+        memAllocateCallback = memAllocateCallbackDefault;
+    }
+
+    return old;
+}
+
+psMemFreeCallback psMemFreeCallbackSet(psMemFreeCallback func)
+{
+    psMemFreeCallback old = memFreeCallback;
+
+    if (func != NULL) {
+        memFreeCallback = func;
+    } else {
+        memFreeCallback = memFreeCallbackDefault;
+    }
+
+    return old;
+}
+
+/*
+ * Return memory ID counter for next block to be allocated
+ */
+psMemoryId psMemGetId(void)
+{
+    psMemoryId id;
+
+    pthread_mutex_lock(&memIdMutex);
+    id = memid + 1;
+    pthread_mutex_unlock(&memIdMutex);
+
+    return id;
+}
+
+/*
+ * Routines to check the consistency of the allocated and/or free memory arena
+ *
+ * N.b. If the block wasn't allocated by psAlloc, it will appear corrupted
+ */
+
+static psS32 checkMemBlock(const psMemBlock* m, const char *funcName)
+{
+    // n.b. since this is called by psMemCheckCorruption while the memblock list is mutex locked,
+    // we shouldn't call such things as p_psAlloc/p_psFree here.
+
+    if (m == NULL) {
+        psError(PS_ERR_MEMORY_CORRUPTION, true,
+                PS_ERRORTEXT_psMemory_NULL_BLOCK);
+        return 1;
+    }
+
+    if (m->refCounter == 0) {
+        // using an unreferenced block of memory, are you?
+        psError(PS_ERR_MEMORY_CORRUPTION, true,
+                PS_ERRORTEXT_psMemory_DEREF_BLOCK_USE,
+                m->id);
+        return 1;
+    }
+
+    if (m->startblock != P_PS_MEMMAGIC || m->endblock != P_PS_MEMMAGIC) {
+        psError(PS_ERR_MEMORY_CORRUPTION, true,
+                PS_ERRORTEXT_psMemory_UNDERFLOW,
+                m->id);
+        return 1;
+    }
+    if (*(psPtr *)((int8_t *) (m + 1) + m->userMemorySize) != P_PS_MEMMAGIC) {
+        psError(PS_ERR_MEMORY_CORRUPTION, true,
+                PS_ERRORTEXT_psMemory_OVERFLOW,
+                m->id);
+        return 1;
+    }
+
+    return 0;
+}
+
+psS32 psMemCheckCorruption(psBool abort_on_error)
+{
+    psS32 nbad = 0;               // number of bad blocks
+    psBool failure = false;
+
+    // get exclusive access to the memBlock list to avoid it changing on us while we use it.
+    //    pthread_mutex_lock(&memBlockListMutex);
+
+    for (psMemBlock* iter = lastMemBlockAllocated; iter != NULL; iter = iter->nextBlock) {
+        pthread_mutex_unlock(&memBlockListMutex);
+        failure = checkMemBlock(iter, __func__);
+        pthread_mutex_lock(&memBlockListMutex);
+        if ( failure ) {
+            nbad++;
+
+            memProblemCallback(iter, __func__, __LINE__);
+
+            if (abort_on_error) {
+                // release the lock on the memblock list
+                pthread_mutex_unlock(&memBlockListMutex);
+                psAbort(__func__, "Detected memory corruption");
+                return nbad;
+            }
+        }
+    }
+
+    // release the lock on the memblock list
+    pthread_mutex_unlock(&memBlockListMutex);
+    return nbad;
+}
+
+psPtr p_psAlloc(size_t size, const char *file, psS32 lineno)
+{
+
+    psMemBlock* ptr = NULL;
+
+    size = (size < recycleBinSize[0]) ? recycleBinSize[0] : size; // set the minimum size to allocate
+
+    // memory is of the size I want to bother recycling?
+    if (size < P_PS_LARGE_BLOCK_SIZE) {
+        // find the bin we need.
+        psS32 level = 0;
+
+        while (size > recycleBinSize[level]) {
+            level++;
+        }
+        // Are we in one of the bins
+        if (level < recycleBins) {
+
+            size = recycleBinSize[level];  // round-up size to next sized bin.
+
+            pthread_mutex_lock(&recycleMemBlockListMutex);
+
+            if (recycleMemBlockList[level] != NULL) {
+                ptr = recycleMemBlockList[level];
+                recycleMemBlockList[level] = ptr->nextBlock;
+                if (recycleMemBlockList[level] != NULL) {
+                    recycleMemBlockList[level]->previousBlock = NULL;
+                }
+                size = ptr->userMemorySize;
+            }
+
+            pthread_mutex_unlock(&recycleMemBlockListMutex);
+        }
+    }
+
+    if (ptr == NULL) {
+        ptr = malloc(sizeof(psMemBlock) + size + sizeof(psPtr ));
+
+        if (ptr == NULL) {
+            ptr = memExhaustedCallback(size);
+            if (ptr == NULL) {
+                psAbort(__func__, "Failed to allocate %u bytes at %s:%d", size, file, lineno);
+            }
+        }
+
+        *(psPtr*)&ptr->startblock = P_PS_MEMMAGIC;
+        *(psPtr*)&ptr->endblock = P_PS_MEMMAGIC;
+        ptr->userMemorySize = size;
+        pthread_mutex_init(&ptr->refCounterMutex, NULL);
+    }
+    // increment the memory id safely.
+    pthread_mutex_lock(&memBlockListMutex);
+    *(psMemoryId* ) & ptr->id = ++memid;
+    pthread_mutex_unlock(&memBlockListMutex);
+
+    ptr->file = file;
+    ptr->freeFcn = NULL;
+    ptr->persistent = false;
+    *(psU32 *)&ptr->lineno = lineno;
+    *(psPtr *)((int8_t *) (ptr + 1) + size) = P_PS_MEMMAGIC;
+    ptr->previousBlock = NULL;
+
+    ptr->refCounter = 1;                   // one user so far
+
+    // need exclusive access of the memory block list now...
+    pthread_mutex_lock(&memBlockListMutex);
+
+    // insert the new block to the front of the memBlock linked-list
+    ptr->nextBlock = lastMemBlockAllocated;
+    if (ptr->nextBlock != NULL) {
+        ptr->nextBlock->previousBlock = ptr;
+    }
+    lastMemBlockAllocated = ptr;
+
+    pthread_mutex_unlock(&memBlockListMutex);
+
+    // Did the user ask to be informed about this allocation?
+    if (ptr->id == p_psMemAllocateID) {
+        p_psMemAllocateID += memAllocateCallback(ptr);
+    }
+    // And return the user the memory that they allocated
+    return ptr + 1;                        // user memory
+}
+
+psPtr p_psRealloc(psPtr vptr, size_t size, const char *file, psS32 lineno)
+{
+    size = (size < recycleBinSize[0]) ? recycleBinSize[0] : size; // set the minimum size to allocate
+
+    if (vptr == NULL) {
+        return p_psAlloc(size, file, lineno);
+    } else {
+        psMemBlock* ptr = ((psMemBlock* ) vptr) - 1;
+        psBool isBlockLast = false;
+
+        if (checkMemBlock(ptr, __func__) != 0) {
+            memProblemCallback(ptr, file, lineno);
+            psAbort(file, "Realloc detected a memory corruption (id %lld @ %s:%d).",
+                    ptr->id, ptr->file, ptr->lineno);
+        }
+
+        pthread_mutex_lock(&memBlockListMutex);
+
+        isBlockLast = (ptr == lastMemBlockAllocated);
+
+        ptr = (psMemBlock* ) realloc(ptr, sizeof(psMemBlock) + size + sizeof(psPtr ));
+
+        if (ptr == NULL) {
+            ptr = memExhaustedCallback(size);
+            if(ptr == NULL) {
+                psAbort(__func__, "Failed to reallocate %ld bytes at %s:%d", size, file, lineno);
+            }
+        }
+
+        ptr->userMemorySize = size;
+        *(psPtr *)((int8_t *) (ptr + 1) + size) = P_PS_MEMMAGIC;
+
+        if (isBlockLast) {
+            lastMemBlockAllocated = ptr;
+        }
+        // the block location may have changed, so fix the linked list addresses.
+        if (ptr->nextBlock != NULL) {
+            ptr->nextBlock->previousBlock = ptr;
+        }
+        if (ptr->previousBlock != NULL) {
+            ptr->previousBlock->nextBlock = ptr;
+        }
+
+        pthread_mutex_unlock(&memBlockListMutex);
+
+        // Did the user ask to be informed about this allocation?
+        if (ptr->id == p_psMemAllocateID) {
+            p_psMemAllocateID += memAllocateCallback(ptr);
+        }
+
+        return ptr + 1;                    // usr memory
+    }
+}
+
+void p_psFree(psPtr vptr, const char *file, psS32 lineno)
+{
+    if (vptr == NULL) {
+        return;
+    }
+    psMemBlock* ptr = ((psMemBlock* ) vptr) - 1;
+    if (ptr->refCounter < 1) {
+        psMemBlock* ptr = ((psMemBlock* ) vptr) - 1;
+
+        psAbort(__func__,PS_ERRORTEXT_psMemory_MULTIPLE_FREE,
+                ptr->id, ptr->file, ptr->lineno, file, lineno);
+    }
+
+    if (checkMemBlock(ptr, __func__) != 0) {
+        memProblemCallback(ptr, file, lineno);
+        psAbort(__func__,"Memory Corruption Detected.");
+    }
+
+    (void)p_psMemDecrRefCounter(vptr, file, lineno);    // this handles the free, if required.
+}
+
+/*
+ * Check for memory leaks.
+ */
+psS32 psMemCheckLeaks(psMemoryId id0, psMemBlock* ** arr, FILE * fd, psBool persistence)
+{
+    psS32 nleak = 0;
+    psS32 j = 0;
+    psMemBlock* topBlock = lastMemBlockAllocated;
+
+    pthread_mutex_lock(&memBlockListMutex);
+
+    for (psMemBlock* iter = topBlock; iter != NULL; iter = iter->nextBlock) {
+        if ( (iter->refCounter > 0) &&
+                ( (persistence) || (!persistence && !iter->persistent) ) &&
+                (iter->id >= id0)) {
+
+            nleak++;
+
+            if (fd != NULL) {
+                if (nleak == 1) {
+                    fprintf(fd, "   %20s:line ID\n", "file");
+                }
+
+                fprintf(fd, "   %20s:%-4d %ld\n", iter->file, (int)iter->lineno, (long)iter->id);
+            }
+        }
+    }
+
+    pthread_mutex_unlock(&memBlockListMutex);
+
+    if (nleak == 0 || arr == NULL) {
+        return nleak;
+    }
+
+    *arr = p_psAlloc(nleak * sizeof(psMemBlock), __FILE__, __LINE__);
+    pthread_mutex_lock(&memBlockListMutex);
+
+    for (psMemBlock* iter = topBlock; iter != NULL; iter = iter->nextBlock) {
+        if ( (iter->refCounter > 0) &&
+                ( (persistence) || (!persistence && !iter->persistent) ) &&
+                (iter->id >= id0)) {
+
+            (*arr)[j++] = iter;
+            if (j == nleak) {              // found them all
+                break;
+            }
+        }
+    }
+
+    pthread_mutex_unlock(&memBlockListMutex);
+
+    return nleak;
+}
+
+/*
+ * Reference counting APIs
+ */
+// return refCounter
+psReferenceCount psMemGetRefCounter(psPtr vptr)
+{
+    psMemBlock* ptr;
+    psU32 refCount;
+
+    if (vptr == NULL) {
+        return 0;
+    }
+
+    ptr = ((psMemBlock* ) vptr) - 1;
+
+    if (checkMemBlock(ptr, __func__) != 0) {
+        memProblemCallback(ptr, __func__, __LINE__);
+    }
+
+    pthread_mutex_lock(&ptr->refCounterMutex);
+    refCount = ptr->refCounter;
+    pthread_mutex_unlock(&ptr->refCounterMutex);
+
+    return refCount;
+}
+
+// increment and return refCounter
+psPtr p_psMemIncrRefCounter(psPtr vptr, const char *file, psS32 lineno)
+{
+    psMemBlock* ptr;
+
+    if (vptr == NULL) {
+        return vptr;
+    }
+
+    ptr = ((psMemBlock* ) vptr) - 1;
+
+    if (checkMemBlock(ptr, __func__)) {
+        memProblemCallback(ptr, file, lineno);
+    }
+
+    pthread_mutex_lock(&ptr->refCounterMutex);
+    ptr->refCounter++;
+    pthread_mutex_unlock(&ptr->refCounterMutex);
+
+    return vptr;
+}
+
+// decrement and return refCounter
+psPtr p_psMemDecrRefCounter(psPtr vptr, const char *file, psS32 lineno)
+{
+    if (vptr == NULL) {
+        return NULL;
+    }
+
+    psMemBlock* ptr = ((psMemBlock* ) vptr) - 1;
+
+    if (checkMemBlock(ptr, __func__) != 0) {
+        memProblemCallback(ptr, file, lineno);
+        return NULL;
+    }
+
+    pthread_mutex_lock(&ptr->refCounterMutex);
+
+    if (ptr->refCounter > 1) {
+        ptr->refCounter--;                 // multiple references, just decrement the count.
+        pthread_mutex_unlock(&ptr->refCounterMutex);
+
+    } else {
+        pthread_mutex_unlock(&ptr->refCounterMutex);
+
+        // Did the user ask to be informed about this deallocation?
+        if (ptr->id == p_psMemFreeID) {
+            p_psMemFreeID += memFreeCallback(ptr);
+        }
+
+        if (ptr->freeFcn != NULL) {
+            ptr->freeFcn(vptr);
+        }
+
+        pthread_mutex_lock(&memBlockListMutex);
+
+        // cut the memBlock out of the memBlock list
+        if (ptr->nextBlock != NULL) {
+            ptr->nextBlock->previousBlock = ptr->previousBlock;
+        }
+        if (ptr->previousBlock != NULL) {
+            ptr->previousBlock->nextBlock = ptr->nextBlock;
+        }
+        if (lastMemBlockAllocated == ptr) {
+            lastMemBlockAllocated = ptr->nextBlock;
+        }
+
+        pthread_mutex_unlock(&memBlockListMutex);
+
+        // do we need to recycle?
+        if (ptr->userMemorySize < P_PS_LARGE_BLOCK_SIZE) {
+
+            psS32 level = 1;
+
+            while (ptr->userMemorySize >= recycleBinSize[level]) {
+                level++;
+            }
+            level--;
+
+            ptr->refCounter = 0;
+            ptr->previousBlock = NULL;
+
+            pthread_mutex_lock(&recycleMemBlockListMutex);
+            ptr->nextBlock = recycleMemBlockList[level];
+            if (recycleMemBlockList[level] != NULL) {
+                recycleMemBlockList[level]->previousBlock = ptr;
+            }
+            recycleMemBlockList[level] = ptr;
+            pthread_mutex_unlock(&recycleMemBlockListMutex);
+
+        } else {
+            // memory is larger than I want to recycle.
+            #ifdef PS_MEM_DEBUG
+            (void)p_psRealloc(vptr, 0, file, lineno);
+            ptr->previousBlock = NULL;
+            ptr->nextBlock = deadBlockList;
+            if (deadBlockList != NULL) {
+                deadBlockList->previous = ptr;
+            }
+            deadBlockList = ptr;
+            #else
+
+            pthread_mutex_destroy(&ptr->refCounterMutex);
+            free(ptr);
+            #endif
+
+        }
+
+        vptr = NULL;                       // since we freed it, make sure we return NULL.
+    }
+
+    return vptr;
+}
+
+void psMemSetDeallocator(psPtr vptr, psFreeFcn freeFcn)
+{
+    if (vptr == NULL) {
+        return;
+    }
+
+    psMemBlock* ptr = ((psMemBlock* ) vptr) - 1;
+
+    if (checkMemBlock(ptr, __func__) != 0) {
+        memProblemCallback(ptr, __func__, __LINE__);
+    }
+
+    ptr->freeFcn = freeFcn;
+
+}
+psFreeFcn psMemGetDeallocator(psPtr vptr)
+{
+    if (vptr == NULL) {
+        return NULL;
+    }
+
+    psMemBlock* ptr = ((psMemBlock* ) vptr) - 1;
+
+    if (checkMemBlock(ptr, __func__) != 0) {
+        memProblemCallback(ptr, __func__, __LINE__);
+    }
+
+    return ptr->freeFcn;
+}
+
+psBool p_psMemGetPersistent(psPtr vptr)
+{
+    if (vptr == NULL) {
+        return NULL;
+    }
+
+    psMemBlock* ptr = ((psMemBlock* ) vptr) - 1;
+
+    if (checkMemBlock(ptr, __func__) != 0) {
+        memProblemCallback(ptr, __func__, __LINE__);
+    }
+
+    return ptr->persistent;
+}
+
+void p_psMemSetPersistent(psPtr vptr,psBool value)
+{
+    if (vptr == NULL) {
+        return;
+    }
+
+    psMemBlock* ptr = ((psMemBlock* ) vptr) - 1;
+
+    if (checkMemBlock(ptr, __func__) != 0) {
+        memProblemCallback(ptr, __func__, __LINE__);
+    }
+
+    ptr->persistent = value;
+}
Index: /tags/ipp-1-X/bug123/psLib/src/sys/psMemory.h
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/sys/psMemory.h	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/sys/psMemory.h	(revision 22331)
@@ -0,0 +1,455 @@
+/** @file  psMemory.h
+ *
+ *  @brief Contains the definitions for the memory management system
+ *
+ *  This is the generic memory management system put inbetween the user's high level code and the OS-level
+ *  memory allocation routines.  This system adds such features as callback routines for memory error events,
+ *  tracing capabilities, and reference counting.
+ *
+ *  @author Robert DeSonia, MHPCC
+ *  @author Robert Lupton, Princeton University
+ *
+ *  @ingroup MemoryManagement
+ *
+ *  @version $Revision: 1.36 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-04-07 20:27:41 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+
+#if !defined(PS_MEMORY_H)
+#define PS_MEMORY_H
+
+#include <stdio.h>                     // needed for FILE
+#include <pthread.h>                   // we need a mutex to make this stuff thread safe.
+
+#include "psType.h"
+
+/** @addtogroup MemoryManagement
+ *  @{
+ */
+
+/**
+ *  @addtogroup memCallback Memory Callbacks
+ *
+ *  Routines dealing with the creating and setting of memory management callback functions.
+ */
+
+/**
+ *  @addtogroup memTracing Memory Tracing
+ *
+ *  Routines dealing with memory tracing and corruption checking.
+ */
+
+/**
+ *  @addtogroup memRefCount Reference Count
+ *
+ *  Routines dealing with the reference counting of allocated buffers.
+ */
+
+/// typedef for memory identification numbers.  Guaranteed to be some variety of integer.
+typedef psU64 psMemoryId;
+
+/// typedef for a memory block's reference count. Guaranteed to be some variety of integer.
+typedef psU64 psReferenceCount;
+
+/// typedef for deallocator.
+typedef void (*psFreeFcn) (psPtr ptr);
+
+/** Book-keeping data for storage allocator.
+ *  N.b. sizeof(psMemBlock) must be chosen such that if ptr is a pointer
+ *  returned by malloc, then ((char *)ptr + sizeof(psMemBlock)) is properly
+ *  aligned for all storage types.
+ */
+typedef struct psMemBlock
+{
+    const psPtr startblock;            ///< initialised to p_psMEMMAGIC
+    struct psMemBlock* previousBlock;  ///< previous block in allocation list
+    struct psMemBlock* nextBlock;      ///< next block allocation list
+    psFreeFcn freeFcn;                 ///< deallocator.  If NULL, use generic deallocation.
+    size_t userMemorySize;             ///< the size of the user-portion of the memory block
+    const psMemoryId id;               ///< a unique ID for this allocation
+    const char *file;                  ///< set from __FILE__ in e.g. p_psAlloc
+    const psS32 lineno;                  ///< set from __LINE__ in e.g. p_psAlloc
+    pthread_mutex_t refCounterMutex;   ///< mutex to ensure exclusive access to reference counter
+    psReferenceCount refCounter;       ///< how many times pointer is referenced
+    psBool persistent;                   ///< marks if this non-user persistent data like error stack, etc.
+    const psPtr endblock;              ///< initialised to p_psMEMMAGIC
+}
+psMemBlock;
+
+/** prototype of a basic callback used by memory functions
+ *
+ *  @see psMemAllocateCallbackSet
+ *  @ingroup memCallback
+ */
+typedef psMemoryId(*psMemAllocateCallback) (
+    const psMemBlock* ptr              ///< the psMemBlock just allocated
+);
+
+/** prototype of memory free callback used by memory functions
+ *
+ *  @see psMemFreeCallbackSet
+ *  @ingroup memCallback
+ */
+typedef psMemoryId(*psMemFreeCallback) (
+    const psMemBlock* ptr              ///< the psMemBlock being freed
+);
+
+/** prototype of a callback used in error conditions
+ *
+ *  This callback should not try to call psAlloc or psFree.
+ *
+ *  @see psMemProblemCallbackSet
+ *  @ingroup memCallback
+ */
+typedef void (*psMemProblemCallback) (
+    const psMemBlock* ptr,             ///< the pointer to the problematic memory block.
+    const char *file,                  ///< the file in which the problem originated
+    psS32 lineno                         ///< the line number in which the problem originated
+);
+
+/** prototype of a callback function used when memory runs out
+ *
+ *  @return psPtr pointer to requested buffer of the size size_t, or NULL if memory could not
+ *          be found.
+ *
+ *  @see psMemExhaustedCallbackSet
+ *  @ingroup memCallback
+ */
+typedef psPtr (*psMemExhaustedCallback) (
+    size_t size                        ///< the size of buffer required
+);
+
+/** Memory allocation.  This operates much like malloc(), but is guaranteed to return a non-NULL value.
+ *
+ *  @return psPtr pointer to the allocated buffer. This will not be NULL.
+ *  @see psFree 
+ */
+#ifdef DOXYGEN
+psPtr psAlloc(size_t size       ///< Size required
+             );
+#else
+psPtr p_psAlloc(size_t size,    ///< Size required
+                const char *file,       ///< File of call
+                psS32 lineno      ///< Line number of call
+               );
+
+/// Memory allocation. psAlloc sends file and line number to p_psAlloc.
+#ifndef SWIG
+#define psAlloc(size) p_psAlloc(size, __FILE__, __LINE__)
+#endif
+
+#endif
+
+/** Set the deallocator routine
+ *
+ *  A deallocator routine can optionally be assigned to a memory block to 
+ *  ensure that associated memory blocks also get freed, e.g., memory buffers
+ *  referenced within a struct.
+ *
+ */
+void psMemSetDeallocator(
+    psPtr ptr,                         ///< the memory block to operate on
+    psFreeFcn freeFcn                  ///< the function to be executed at deallocation
+);
+
+/** Get the deallocator routine
+ *
+ *  This function returns the deallocator for a memory block.  A deallocator 
+ *  routine can optionally be assigned to a memory block to ensure that 
+ *  associated memory blocks also get freed, e.g., memory buffers referenced 
+ *  within a struct.  
+ *
+ *  @return psFreeFcn    the routine to be called at deallocation.
+ */
+psFreeFcn psMemGetDeallocator(
+    psPtr ptr                          ///< the memory block
+);
+
+/** Set the memory as persistent so that it is ignored when detecting memory leaks.
+ *
+ *  Used to mark a memory block as persistent data within the library, 
+ *  i.e., non user-level data used to hold psLib's state or cache data.  Such
+ *  examples of this class of memory is psTrace's trace-levels and dynamic
+ *  error codes.
+ *
+ *  Memory marked as persistent is excluded from memory leak checks.
+ *
+ */
+void p_psMemSetPersistent(
+    psPtr ptr,                         ///< the memory block to operate on
+    psBool value                         ///< true if memory is persistent, otherwise false
+);
+
+/** Get the memory's persistent flag.
+ *
+ *  Checks if a memory block has been marked as persistent by 
+ *  p_psMemSetPresistent.
+ *
+ *  Memory marked as persistent is excluded from memory leak checks.
+ *
+ *  @return psBool    true if memory is marked persistent, otherwise false.
+ */
+psBool p_psMemGetPersistent(
+    psPtr ptr                          ///< the memory block to check.
+);
+
+
+/** Memory re-allocation.  This operates much like realloc(), but is guaranteed to return a non-NULL value.
+ *
+ *  @return psPtr pointer to resized buffer. This will not be NULL.
+ *  @see psAlloc, psFree
+ */
+#ifdef DOXYGEN
+psPtr psRealloc(
+    psPtr ptr,                          ///< Pointer to re-allocate
+    size_t size                         ///< Size required
+);
+#else
+psPtr p_psRealloc(
+    psPtr ptr,                         ///< Pointer to re-allocate
+    size_t size,                       ///< Size required
+    const char *file,                  ///< File of call
+    psS32 lineno                       ///< Line number of call
+);
+
+/// Memory re-allocation.  psRealloc sends file and line number to p_psRealloc.
+#ifndef SWIG
+#define psRealloc(ptr, size) p_psRealloc(ptr, size, __FILE__, __LINE__)
+#endif
+
+#endif
+
+/** Free memory.  This operates much like free().
+ *
+ *  @see psAlloc, psRealloc
+ */
+#ifdef DOXYGEN
+void psFree(
+    psPtr ptr                          ///< Pointer to free, if NULL, function returns immediately.
+);
+#else
+void p_psFree(
+    psPtr ptr,                         ///< Pointer to free
+    const char *file,                  ///< File of call
+    psS32 lineno                       ///< Line number of call
+);
+
+/// Free memory.  psFree sends file and line number to p_psFree.
+#ifndef SWIG
+#define psFree(ptr) p_psFree(ptr, __FILE__, __LINE__)
+#endif
+
+#endif
+
+/** Check for memory leaks.  This scans for allocated memory buffers not freed with an ID not less than id0.
+ *  This is used to check for memory leaks by:
+ *      -# before a block of code to be checked, store the current ID count via psGetMemId
+ *      -# after the block of code to be checked, call this function using the ID stored above.  If all
+ *         memory in the block that was allocated has been freed, this call should output nothing and
+ *         return 0.
+ *
+ *  If memory leaks are found, the Memory Problem callback will be called as well.
+ *
+ *  return psS32  number of memory blocks found as 'leaks', i.e., the number of currently allocated memory
+ *              blocks above id0 that have not been freed.
+ *  @see psAlloc, psFree, psgetMemId, psMemProblemCallbackSet
+ *  @ingroup memTracing
+ */
+psS32 psMemCheckLeaks(
+    psMemoryId id0,                    ///< don't list blocks with id < id0
+    psMemBlock* ** arr,                ///< pointer to array of pointers to leaked blocks, or NULL
+    FILE * fd,                         ///< print list of leaks to fd (or NULL)
+    psBool persistence                 ///< make check across all object even persistent ones
+);
+
+/** Check for memory corruption.  Scans all currently allocated memory buffers and checks for corruptions,
+ *  i.e., invalid markers that signify a buffer under/overflow.
+ *
+ *  @ingroup memTracing
+ */
+psS32 psMemCheckCorruption(
+    psBool abort_on_error                ///< Abort on detecting corruption?
+);
+
+/** Return reference counter
+ *
+ *  @ingroup memRefCount
+ */
+psReferenceCount psMemGetRefCounter(
+    psPtr vptr                         ///< Pointer to get refCounter for
+);
+
+/** Increment reference counter and return the pointer
+ *
+ *  @ingroup memRefCount
+ */
+#ifdef DOXYGEN
+psPtr psMemIncrRefCounter(
+    psPtr vptr                         ///< Pointer to increment refCounter, and return
+);
+#else
+psPtr p_psMemIncrRefCounter(
+    psPtr vptr,                        ///< Pointer to increment refCounter, and return
+    const char *file,                  ///< File of call
+    psS32 lineno                         ///< Line number of call
+);
+
+#ifndef SWIG
+#define psMemIncrRefCounter(vptr) p_psMemIncrRefCounter(vptr, __FILE__, __LINE__)
+#endif
+
+#endif
+
+/** Decrement reference counter and return the pointer
+ *
+ *  @ingroup memRefCount
+ *
+ *  @return psPtr    the pointer deremented in refCount, or NULL if pointer is 
+ *                   fully dereferenced.
+ */
+#ifdef DOXYGEN
+psPtr psMemDecrRefCounter(
+    psPtr vptr                         ///< Pointer to decrement refCounter, and return
+);
+#else
+psPtr p_psMemDecrRefCounter(
+    psPtr vptr,                        ///< Pointer to decrement refCounter, and return
+    const char *file,                  ///< File of call
+    psS32 lineno                         ///< Line number of call
+);
+
+#ifndef SWIG
+#define psMemDecrRefCounter(vptr) p_psMemDecrRefCounter(vptr, __FILE__, __LINE__)
+#endif
+
+#endif
+
+/** Set callback for problems.
+ *
+ *  At various occasions, the memory manager can check the state of the memory 
+ *  stack. If any of these checks discover that the memory stack is corrupted,
+ *  the psMemProblemCallback is called.
+ 
+ *  @ingroup memCallback
+ *
+ *  @return psMemProblemCallback       old psMemProblemCallback function
+ */
+psMemProblemCallback psMemProblemCallbackSet(
+    psMemProblemCallback func          ///< Function to run at memory problem detection
+);
+
+/** Set callback for out-of-memory.
+ *
+ *  If not enough memory is available to satisfy a request by psAlloc or 
+ *  psRealloc, these functions attempt to find an alternative solution by 
+ *  calling the psMemExhaustedCallback, a function which may be set by the 
+ *  programmer in appropriate circumstances, rather than immediately fail. 
+ *  The typical use of such a feature may be when a program needs a large 
+ *  chunk of memory to do an operation, but the exact size is not critical. 
+ *  This feature gives the programmer the opportunity to make a smaller 
+ *  request and try again, limiting the size of the operating buffer.
+ *
+ *  @ingroup memCallback
+ *
+ *  @return psMemExhaustedCallback     old psMemExhaustedCallback function
+ */
+psMemExhaustedCallback psMemExhaustedCallbackSet(
+    psMemExhaustedCallback func        ///< Function to run at memory exhaustion
+);
+
+/** Set call back for when a particular memory block is allocated
+ *
+ *  A private variable, p_psMemAllocateID, can be used to trace the allocation 
+ *  and freeing of specific memory blocks. If p_psMemAllocateID is set and a 
+ *  memory block with that ID is allocated, psMemAllocateCallback is called 
+ *  just before memory is returned to the calling function.
+ *
+ *  @ingroup memCallback
+ *
+ *  @return psMemAllocateCallback      old psMemAllocateCallback function
+ */
+psMemAllocateCallback psMemAllocateCallbackSet(
+    psMemAllocateCallback func       ///< Function to run at memory allocation of specific mem block
+);
+
+/** Set call back for when a particular memory block is freed
+ *
+ *  A private variable, p_psMemFreeID, can be used to trace the freeing of 
+ *  specific memory blocks. If p_psMemFreeID is set and the memory block with 
+ *  the ID is about to be freed, the psMemFreeCallback callback is called just
+ *  before the memory block is freed.
+ *
+ *  @ingroup memCallback
+ *
+ *  @return psMemFreeCallback          old psMemFreeCallback function
+ */
+psMemFreeCallback psMemFreeCallbackSet(
+    psMemFreeCallback func             ///< Function to run at memory free of specific mem block
+);
+
+/** get next memory ID
+ *
+ *  @ingroup memCallback
+ *
+ *  @return psMemoryId                 the next memory ID to be used
+ */
+psMemoryId psMemGetId(void);
+
+/** set p_psMemAllocateID to specific id
+ *
+ *  A private variable, p_psMemAllocateID, can be used to trace the allocation 
+ *  and freeing of specific memory blocks. If p_psMemAllocateID is set and a 
+ *  memory block with that ID is allocated, psMemAllocateCallback is called 
+ *  just before memory is returned to the calling function.
+ *
+ *  @ingroup memCallback
+ *
+ *  @return psMemoryId       
+ *
+ *  @see psMemAllocateCallbackSet    
+ */
+psMemoryId psMemAllocateCallbackSetID(
+    psMemoryId id                      ///< ID to set
+);
+
+/** set p_psMemFreeID to id
+ *
+ *  A private variable, p_psMemFreeID, can be used to trace the freeing of 
+ *  specific memory blocks. If p_psMemFreeID is set and the memory block with 
+ *  the ID is about to be freed, the psMemFreeCallback callback is called just
+ *  before the memory block is freed.
+ *
+ *  @ingroup memCallback
+ *
+ *  @return psMemoryId                 the old p_psMemFreeID
+ *
+ *  @see psMemFreeCallbackSet
+ */
+psMemoryId psMemFreeCallbackSetID(
+    psMemoryId id                      ///< ID to set
+);
+
+//@} End of Memory Management Functions
+
+#ifndef DOXYGEN
+
+/*
+ * Ensure that any program using malloc/realloc/free will fail to compile
+ */
+#ifndef PS_ALLOW_MALLOC
+#ifdef __GNUC__
+#pragma GCC poison malloc realloc calloc free
+#else
+#define malloc(S)       _Pragma("error Use of malloc is not allowed.  Use psAlloc instead.")
+#define realloc(P,S)    _Pragma("error Use of realloc is not allowed.  Use psRealloc instead.")
+#define calloc(S)       _Pragma("error Use of calloc is not allowed.  Use psAlloc instead.")
+#define free(P)         _Pragma("error Use of free is not allowed.  Use psFree instead.")
+#endif
+#endif
+
+#endif
+// doxygen skip
+
+#endif // end of header file
Index: /tags/ipp-1-X/bug123/psLib/src/sys/psString.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/sys/psString.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/sys/psString.c	(revision 22331)
@@ -0,0 +1,56 @@
+
+/** @file  psString.c
+ *
+ *  @brief Contains the definition of string utility functions
+ *
+ *  String utility functions defined shall provide basic string copying
+ *  capabilities while using the preferred memory management utilities.
+ *
+ *  @author Eric Van Alst, MHPCC
+ *
+ *  @version $Revision: 1.15 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-02-17 19:26:24 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+
+#include <stdlib.h>
+#include <string.h>
+#include "psString.h"
+#include "psMemory.h"
+#include "psError.h"
+
+#include "psSysUtilsErrors.h"
+
+char *psStringCopy(const char *str)
+{
+    // Allocate memory using psAlloc function
+    // Copy input string to memory just allocated
+    // Return the copy
+    return strcpy(psAlloc(strlen(str) + 1), str);
+}
+
+char *psStringNCopy(const char *str, psS32 nChar)
+{
+    char *returnValue = NULL;
+
+    // Check the number of characters to copy is non-negative
+    if (nChar < 0) {
+        // Log error message and return NULL
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true,
+                PS_ERRORTEXT_psString_NCHAR_NEGATIVE,
+                nChar);
+        return NULL;
+    }
+    // Allocate memory using psAlloc function - nChar bytes
+    // Copy input string to memory allocated up to nChar characters
+    // Return the copy
+    returnValue = strncpy(psAlloc((size_t) nChar + 1), str, (size_t) nChar);
+
+    // Ensure the last byte is NULL character
+    if (nChar > 0) {
+        returnValue[nChar] = '\0';
+    }
+    // Return the string pointer
+    return returnValue;
+}
Index: /tags/ipp-1-X/bug123/psLib/src/sys/psString.h
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/sys/psString.h	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/sys/psString.h	(revision 22331)
@@ -0,0 +1,71 @@
+/** @file  psString.h
+ *
+ *  @brief Contains the declarations of string utility functions
+ *
+ *  @ingroup SysUtils
+ *
+ *  String utility functions defined shall provide basic string copying
+ *  capabilities.
+ *
+ *  @author Eric Van Alst, MHPCC
+ *
+ *  @version $Revision: 1.10 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-02-17 19:26:24 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+
+#ifndef PS_STRING_H
+#define PS_STRING_H
+
+#include "psType.h"
+
+/** This macro will convert the argument to a quoted string */
+#define PS_STRING(S)  #S
+
+// Doxygen group tags
+
+/** @addtogroup SysUtils
+ *  @{
+ */
+
+/** Copies the input string
+ *
+ *  This function shall allocate memory to the length of the input string
+ *  plus one and copy the input string to the newly allocated memory.
+ *
+ *  @return char*      Copy of input string
+ *
+ */
+char *psStringCopy(
+    const char *str
+    /**< Input string of characters to copy */
+);
+
+/** Copies the input string up to the specified number of characters
+ *
+ *  This function shall allocate memory to the length specified by nChar
+ *  plus one and copy the input string to the newly allocated memory.
+ *  This function will only copy nChar bytes from the input to new string,
+ *  so if the input string is larger than nChar characters the copied
+ *  string will be a substring of the input string.  If the input string
+ *  is smaller than nChar bytes then the remaining bytes allocated will
+ *  be set to NULL.
+ *
+ *  @return  char* Copy of input string
+ *
+ */
+
+/*@null@*/
+
+char *psStringNCopy(
+    const char *str,
+    /**< Input string of characters to copy */
+
+    psS32 nChar
+    /**< Number of bytes to allocate for string copy */
+);
+
+/* @} */// Doxygen - End of SystemGroup Functions
+
+#endif
Index: /tags/ipp-1-X/bug123/psLib/src/sys/psTrace.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/sys/psTrace.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/sys/psTrace.c	(revision 22331)
@@ -0,0 +1,539 @@
+/** @file psTrace.c
+ *  \brief basic run-time trace facilities
+ *  \ingroup LogTrace
+ *
+ *  This file will hold the code for procedures to insert
+ *  trace messages into the code.
+ *
+ *  @author Robert Lupton, Princeton University
+ *  @author GLG, MHPCC
+ *
+ *  @version $Revision: 1.45 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-04-07 20:27:41 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+
+/*****************************************************************************
+    NOTES:
+ In the SRD, higher trace levels correspond to a numerically lower trace
+ value in the code.  This is a bit confusing.  For example, a high-level
+ message might be something like "Begin Processing".  The module programmer
+ might give that a numerically low trace level, such as 1, so then any
+ non-zero trace level in that code component will display thatmessage.
+ 
+ We build a tree of trace components.  Every node in the tree has a
+ depth, which is it's distance from the root.  However, this is not
+ not the same thing as a node's "level", which corresponds to the
+ trace level of that node.
+ 
+I think the following is the correct behavior, but not sure:
+    PS_UNKNOWN_TRACE_LEVEL: We never set the level of a component to this
+    value.  This value is only used when psTraceGetLevel is called with
+    a bad component name, or if the component root is undefined, I think.
+ 
+    PS_DEFAULT_TRACE_LEVEL: This should only be used when adding the
+    intermediate components of a psS64 name.  Ie. the "B" in .A.B.C
+ 
+ *****************************************************************************/
+
+#ifndef PS_NO_TRACE
+
+#include <unistd.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdarg.h>
+#include "psMemory.h"
+#include "psTrace.h"
+#include "psString.h"
+#include "psError.h"
+#include "psLogMsg.h"
+
+#include "psSysUtilsErrors.h"
+
+static p_psComponent* cRoot = NULL; // The root of the trace component
+static FILE *traceFP = NULL;        // File destination for messages.
+
+static void componentFree(p_psComponent* comp);
+static p_psComponent* componentAlloc(const char *name, psS32 level);
+
+/*****************************************************************************
+componentAlloc(): allocate memory for a new node, and initialize members.
+ *****************************************************************************/
+static p_psComponent* componentAlloc(const char *name, psS32 level)
+{
+    p_psComponent* comp = psAlloc(sizeof(p_psComponent));
+
+    p_psMemSetPersistent(comp,true);
+    psMemSetDeallocator(comp, (psFreeFcn) componentFree);
+    comp->name = psStringCopy(name);
+    p_psMemSetPersistent((psPtr)comp->name,true);
+    comp->level = level;
+    comp->n = 0;
+    comp->p_psSpecified = false;
+    comp->subcomp = NULL;
+    return comp;
+}
+
+/*****************************************************************************
+componentFree(): free the current node in the root tree, and all children
+nodes as well.
+ *****************************************************************************/
+static void componentFree(p_psComponent* comp)
+{
+    if (comp == NULL) {
+        return;
+    }
+
+    if (comp->subcomp != NULL) {
+        for (psS32 i = 0; i < comp->n; i++) {
+            p_psMemSetPersistent(comp->subcomp[i],false);
+            psFree(comp->subcomp[i]);
+        }
+        p_psMemSetPersistent(comp->subcomp,false);
+        psFree(comp->subcomp);
+    }
+
+    p_psMemSetPersistent((psPtr)comp->name,false);
+    psFree((psPtr)comp->name);
+}
+
+/*****************************************************************************
+initTrace(): simply initialize the component root tree.
+*****************************************************************************/
+static void initTrace(void)
+{
+    if (cRoot == NULL) {
+        cRoot = componentAlloc(".", PS_DEFAULT_TRACE_LEVEL);
+    }
+}
+
+/*****************************************************************************
+Set all trace levels to zero.
+ 
+XXX: Currently, no function calls this routine.
+ *****************************************************************************/
+void p_psTraceReset(p_psComponent* currentNode)
+{
+    psS32 i = 0;
+
+    if (NULL == currentNode) {
+        return;
+    }
+
+    currentNode->level = 0;
+    for (i = 0; i < currentNode->n; i++) {
+        if (NULL == currentNode->subcomp[i]) {
+            psLogMsg("p_psTraceReset", PS_LOG_WARN,
+                     PS_ERRORTEXT_psTrace_NULL_SUBCOMPONENT,
+                     i, currentNode->name);
+        } else {
+            p_psTraceReset(currentNode->subcomp[i]);
+        }
+    }
+    return;
+}
+
+/*****************************************************************************
+Set all trace levels to zero.
+ *****************************************************************************/
+void psTraceReset()
+{
+    psFree(cRoot);
+    cRoot = NULL;
+}
+
+/*****************************************************************************
+componentAdd(): Adds the component named "addNodeName" to the root tree.
+ *****************************************************************************/
+static psBool componentAdd(const char *addNodeName, psS32 level)
+{
+    psS32 i = 0;                        // Loop index variable.
+    char name[strlen(addNodeName) + 1]; // buffer for writeable copy.
+    char *pname = name;
+    char *firstComponent = NULL;        // first component of name
+    p_psComponent* currentNode = cRoot;
+    psS32 nodeExists = 0;
+
+    // XXX: Verify that this is the correct behavior.
+    if (strcmp("", addNodeName) == 0) {
+        psError(PS_ERR_BAD_PARAMETER_NULL,true,
+                PS_ERRORTEXT_psTrace_ADD_NULL_COMPONENT);
+        return false;
+    }
+
+    // Is this the root node? If so, simply set level and return.
+    if (strcmp(".", addNodeName) == 0) {
+        cRoot->level = level;
+        return true;
+    }
+
+    if (addNodeName[0] != '.') {
+        psError(PS_ERR_BAD_PARAMETER_VALUE,true,
+                PS_ERRORTEXT_psTrace_MALFORMED_COMPONENT_NAME,
+                addNodeName);
+        return false;
+    }
+
+    strcpy(name, addNodeName);
+    pname = name+1;
+    // Iterate through the components of addNodeName.  Strip off the first
+    // component of the name, find that in the root tree, or add it if it
+    // does not exist, then move to the next component in the name.
+
+    while (pname != NULL) {
+        firstComponent = pname;
+        pname = strchr(firstComponent, '.');
+        if (pname != NULL) {
+            *pname = '\0';
+            pname++;
+        }
+        nodeExists = 0;
+        for (i = 0; i < currentNode->n; i++) {
+            if (strcmp(currentNode->subcomp[i]->name, firstComponent) == 0) {
+                currentNode = currentNode->subcomp[i];
+                nodeExists = 1;
+                if (pname == NULL) {
+                    currentNode->level = level;
+                }
+            }
+        }
+
+        if (nodeExists == 0) {
+            currentNode->subcomp = psRealloc(currentNode->subcomp,
+                                             (currentNode->n + 1) * sizeof(p_psComponent* ));
+            p_psMemSetPersistent(currentNode->subcomp,true);
+
+            currentNode->n = (currentNode->n) + 1;
+
+            if (pname == NULL) {
+                // This is the final component to add.
+                currentNode->subcomp[(currentNode->n) - 1] = componentAlloc(firstComponent, level);
+            } else {
+                // We are adding an intermediate component.  The trace level
+                // is not defined.  An undefined trace level inherits the
+                // trace level of it's parent.  However, we do not set that
+                // specifically here since that would inheritance to be a
+                // static, one-time, type of behavior.
+
+                currentNode->subcomp[(currentNode->n) - 1] = componentAlloc(firstComponent, PS_DEFAULT_TRACE_LEVEL);
+            }
+            currentNode = currentNode->subcomp[(currentNode->n) - 1];
+        }
+    }
+
+    return true;
+}
+
+/*****************************************************************************
+    psSetTraceLevel(): add the component named "comp" to the component tree,
+ if it is not already there, and set it's trace level to "level".
+ 
+    NOTE: We modified this so that the user may omit the leading "," in a
+    component name.  Since the code was already implemented assuming the "."
+    was required, rather than change all that code, in this function, I
+    simply add a leading "." to the component name if there is none.
+ 
+    Input:
+ comp
+ level
+    Output:
+ none
+    Returns:
+ zero
+*****************************************************************************/
+psBool psTraceSetLevel(const char *comp,   // component of interest
+                       psS32 level)  // desired trace level
+{
+    char *compName = NULL;
+
+    // If the root component tree does not exist, then initialize it.
+    if (cRoot == NULL) {
+        initTrace();
+    }
+
+    // If the component name has no leading dot, then supply it.
+    if (comp[0] != '.') {
+        compName = (char *) psAlloc(10 + strlen(comp));
+        strcpy(compName, ".");
+        compName = strcat(compName, comp);
+    } else {
+        compName = (char *) comp;
+    }
+
+    // Add the new component to the component tree.
+    if ( !componentAdd(compName, level) ) {
+        psError(PS_ERR_UNKNOWN, false,
+                PS_ERRORTEXT_psTrace_FAILED_TO_ADD_COMPONENT,
+                level,
+                compName);
+
+        if (comp[0] != '.') {
+            psFree(compName);
+        }
+        return false;
+    }
+
+    if (comp[0] != '.') {
+        psFree(compName);
+    }
+
+    return true;
+}
+
+/*****************************************************************************
+    doGetTraceLevel()
+ This function recursively searches the root component tree for the
+ component named "name", which is supplied by a parameter.  If it
+ finds that component, it returns the level of that component.
+ Otherwise, it returns ???.
+ 
+    NOTE: We modified this so that the user may omit the leading "," in a
+    component name.  Since the code was already implemented assuming the "."
+    was required, rather than change all that code, in this function, I
+    simply add a leading "." to the component name if there is none.
+ 
+    Inputs:
+ name:
+    Outputs:
+ none
+    Returns:
+ The trace level of the "name" component.
+ *****************************************************************************/
+static psS32 doGetTraceLevel(const char *aname)
+{
+    char name[strlen(aname) + 1];       // need a writeable copy: for strsep()
+    char *pname = name;
+    char *firstComponent = NULL;        // first component of name
+    p_psComponent* currentNode = cRoot;
+    psS32 i = 0;
+    psS32 defaultLevel = 0;
+
+    if (NULL == currentNode) {
+        return (PS_UNKNOWN_TRACE_LEVEL);
+    }
+
+    if (strcmp(".", aname) == 0) {
+        return (cRoot->level);
+    }
+
+    if (aname[0] != '.') {
+        return (PS_UNKNOWN_TRACE_LEVEL);
+    }
+
+    defaultLevel = cRoot->level;
+    strcpy(name, aname);
+    pname = name+1;
+    while (pname != NULL) {
+        firstComponent = pname;
+        pname = strchr(firstComponent, '.');
+        if (pname != NULL) {
+            *pname = '\0';
+            pname++;
+        }
+        for (i = 0; i < currentNode->n; i++) {
+            if (NULL == currentNode->subcomp[i]) {
+                psLogMsg("p_psTraceReset", PS_LOG_WARN,
+                         PS_ERRORTEXT_psTrace_NULL_SUBCOMPONENT,
+                         i, currentNode->name);
+            }
+
+            if (strcmp(currentNode->subcomp[i]->name, firstComponent) == 0) {
+                currentNode = currentNode->subcomp[i];
+                // For level inheritance purpose, we save the level of this
+                // component if it is not DEFAULT.
+                if (currentNode->level != PS_DEFAULT_TRACE_LEVEL) {
+                    defaultLevel = currentNode->level;
+                }
+                // Determine if this is the last component:
+                if (pname == NULL) {
+                    if (currentNode->level != PS_DEFAULT_TRACE_LEVEL) {
+                        return (currentNode->level);
+                    } else {
+                        return(defaultLevel);
+                    }
+                }
+            }
+        }
+    }
+    return(defaultLevel);
+}
+
+/*****************************************************************************
+    psTraceLevelGet()
+ Return a trace level of "name" in the root component tree.  If the
+ exact string of components in "name" does not exist in the root
+ tree, we return the deepest level of the match.
+    Input:
+ name
+    Output:
+ none
+    Return:
+ The level of "name" in the root component tree.
+ *****************************************************************************/
+psS32 psTraceGetLevel(const char *name)
+{
+    char *compName = NULL;
+    psS32 traceLevel;
+
+    if (cRoot == NULL) {
+        return (PS_UNKNOWN_TRACE_LEVEL);
+    }
+
+    // If the component name has no leading dot, then supply it.
+    if (name[0] != '.') {
+        compName = (char *) psAlloc(10 + strlen(name));
+        strcpy(compName, ".");
+        compName = strcat(compName, name);
+        traceLevel = doGetTraceLevel(compName);
+        psFree(compName);
+    } else {
+        // Search the component root tree, determine the trace level.
+        traceLevel = doGetTraceLevel(name);
+    }
+
+    // XXX: The default trace level is currently set at -1, which is not a
+    // valid trace level.  This is convenient in determining whether or not
+    // a component should inherit the trace level from parent nodes.  However,
+    // it's not clear that -1 should ever be returned by this function.
+    // The SDR is unclear on this point and we should probably request IfA
+    // comment.
+    if (traceLevel == PS_DEFAULT_TRACE_LEVEL) {
+        traceLevel = PS_THE_OTHER_DEFAULT_TRACE_LEVEL;
+    }
+
+    return(traceLevel);
+}
+
+/*****************************************************************************
+    doPrintTraceLevels()
+ This function recursively searches the component tree supplied by the
+ parameter "comp" and prints the name and level of each component.
+    Inputs:
+ comp: a node in the component tree.
+ level: the level of that node
+    Outputs:
+ none
+    Returns:
+ null
+ *****************************************************************************/
+static void doPrintTraceLevels(const p_psComponent* comp,
+                               psS32 depth,
+                               psS32 defLevel)
+{
+    psS32 i = 0;
+
+    if (comp->name[0] == '\0') {
+        return;
+    } else {
+        if (comp->level == PS_DEFAULT_TRACE_LEVEL) {
+            if (traceFP == NULL) {
+                printf("%*s%-*s %d\n", depth, "", 20 - depth, comp->name,
+                       defLevel);
+            } else {
+                fprintf(traceFP,"%*s%-*s %d\n", depth, "", 20 - depth, comp->name,
+                        defLevel);
+            }
+        } else {
+            if (traceFP == NULL) {
+                printf("%*s%-*s %d\n", depth, "", 20 - depth, comp->name,
+                       comp->level);
+            } else {
+                fprintf(traceFP, "%*s%-*s %d\n", depth, "", 20 - depth, comp->name,
+                        comp->level);
+            }
+        }
+    }
+
+    for (i = 0; i < comp->n; i++) {
+        if (comp->level == PS_DEFAULT_TRACE_LEVEL) {
+            doPrintTraceLevels(comp->subcomp[i], depth + 1, defLevel);
+        } else {
+            doPrintTraceLevels(comp->subcomp[i], depth + 1, comp->level);
+        }
+    }
+}
+
+
+/*****************************************************************************
+psPrintTraceLevels(): Simply print all the trace levels in the trace level
+component tree.
+Inputs:
+ none
+Outputs:
+ none
+Returns:
+ null
+*****************************************************************************/
+void psTracePrintLevels(void)
+{
+    if (cRoot == NULL) {
+        return;
+    }
+
+    doPrintTraceLevels(cRoot, 0, PS_THE_OTHER_DEFAULT_TRACE_LEVEL);
+}
+
+/*****************************************************************************
+p_psTrace(): we display the trace message to standard output if the trace
+level of that message, supplied by the parameter "level" is higher than the
+trace level that is currently associated with the component named by the
+parameter "comp".
+Input:
+ comp
+ level
+ ...  a printf-style output string.
+Output:
+ none
+Return:
+ null
+ *****************************************************************************/
+void p_psTrace(const char *comp,        // component being traced
+               psS32 level,       // desired trace level
+               ...)             // arguments
+{
+    char *fmt = NULL;
+    va_list ap;
+    psS32 i = 0;
+
+    if (NULL == comp) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psTrace_NULL_TRACETREE,
+                __func__);
+        return;
+    }
+    // Only display this message if it's trace level is less than the level
+    // of it's associatedcomponent.
+    if (level <= psTraceGetLevel(comp)) {
+        va_start(ap, level);
+
+        // The following functions get the variable list of parameters with
+        // which this function was called, and print them to the standard
+        // output.
+        fmt = va_arg(ap, char *);
+
+        if (traceFP != NULL) {
+            // We indent each message one space for each level of the message.
+            for (i = 0; i < level; i++) {
+                fprintf(traceFP, " ");
+            }
+            vfprintf(traceFP, fmt, ap);
+        } else {
+            // We indent each message one space for each level of the message.
+            for (i = 0; i < level; i++) {
+                putchar(' ');
+            }
+            vprintf(fmt, ap);
+        }
+        va_end(ap);
+    }
+    // NOTE: should we free *fmt as well? Read the man page.
+}
+
+void psTraceSetDestination(FILE * fp)
+{
+    traceFP = fp;
+}
+
+#endif
Index: /tags/ipp-1-X/bug123/psLib/src/sys/psTrace.h
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/sys/psTrace.h	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/sys/psTrace.h	(revision 22331)
@@ -0,0 +1,100 @@
+/** @file psTrace.h
+ *  \brief basic run-time trace facilities
+ *  \ingroup LogTrace
+ *
+ *  This file will hold the prototypes for defining procedures to insert
+ *  trace messages into the code.
+ *
+ *  @author Robert Lupton, Princeton University
+ *  @author GLG, MHPCC
+ *
+ *  @version $Revision: 1.31 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-02-17 19:26:24 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+#if !defined(PS_TRACE_H)
+#define PS_TRACE_H 1
+
+#define PS_UNKNOWN_TRACE_LEVEL -9999   // we don't know this name's level
+#define PS_DEFAULT_TRACE_LEVEL -1
+#define PS_THE_OTHER_DEFAULT_TRACE_LEVEL 0
+
+/** \addtogroup LogTrace
+ *  \{
+ */
+
+/** Functions **************************************************************/
+
+//#define PS_NO_TRACE 1   ///< to turn off all tracing
+
+#if defined(PS_NO_TRACE)
+#        define psTrace(facil, level, ...) (void)0
+/* do nothing */
+#        define p_psTrace(facil, level, ...)  (void)0
+/* do nothing */
+#        define psTraceSetLevel(facil,level) 0
+#        define psTraceGetLevel(facil) 0
+#        define psTraceReset() (void)0     /* do nothing */
+#        define psTraceFree() (void)0      /* do nothing */
+#        define psTracePrintLevels() (void)0
+/* do nothing */
+#        define psTraceSetDestination(fp) (void)0
+/* do nothing */
+#    else
+
+    /** Basic structure for the component tree.  A component is a string of the
+        form aaa.bbb.ccc, and may itself contain further subcomponents.  The
+        Component structure doesn't in fact contain it's full name, but only the
+        last part. */
+    typedef struct p_psComponent
+    {
+        const char *name;           // last part of name of component
+        psS32 level;                  // trace level for this component
+        bool p_psSpecified;
+        psS32 n;                      // number of subcomponents
+        struct p_psComponent* *subcomp;     // next level of subcomponents
+    }
+p_psComponent;
+
+#ifdef DOXYGEN
+void psTrace(const char *facil,        ///< facilty of interest
+             psS32 myLevel,            ///< desired trace level
+             ...)                      ///< trace message arguments
+;
+#else
+/// Send a trace message
+void p_psTrace(const char *facil,      ///< facilty of interest
+               psS32 myLevel,          ///< desired trace level
+               ...)                    ///< trace message arguments
+;
+
+#ifndef SWIG
+#define psTrace(facil, level, ...) p_psTrace(facil, level, __VA_ARGS__)
+#endif
+
+#endif
+
+/// Set trace level
+psBool psTraceSetLevel(const char *facil,     ///< facilty of interest
+                       psS32 level)     ///< desired trace level
+;
+
+/// Get the trace level
+psS32 psTraceGetLevel(const char *facil)     ///< facilty of interest
+;
+
+/// Set all trace levels to zero (do not free nodes in the component tree).
+void psTraceReset();
+
+/// print trace levels
+void psTracePrintLevels(void);
+
+/// Set the destination of future trace messages.
+void psTraceSetDestination(FILE * fp);
+
+/* \} */// End of SystemGroup Functions
+
+#endif
+
+#endif
Index: /tags/ipp-1-X/bug123/psLib/src/sys/psType.h
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/sys/psType.h	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/sys/psType.h	(revision 22331)
@@ -0,0 +1,245 @@
+/** @file  psType.h
+*
+*  @brief Contains support for basic types
+*
+*  This file defines common datatypes used throughout psLib.
+*
+*  @ingroup DataContainer
+*
+*  @author Robert DeSonia, MHPCC
+*  @author Ross Harman, MHPCC
+*
+*  @version $Revision: 1.32 $ $Name: not supported by cvs2svn $
+*  @date $Date: 2005-04-06 01:12:58 $
+*
+*  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+*/
+
+#ifndef PS_TYPE_H
+#define PS_TYPE_H
+
+#include <complex.h>
+#include <stdint.h>
+#include <float.h>
+#include <stdbool.h>
+
+/// @addtogroup DataContainer
+/// @{
+
+/******************************************************************************/
+
+/*  TYPE DEFINITIONS                                                          */
+
+/******************************************************************************/
+
+/** Basic data types used by the containers.
+ *
+ * The basic types of the primitives used by psLib are defined within this enum. This enum is in turn used by
+ * the psType struct.
+ *
+ */
+
+typedef uint8_t psU8;                  ///< 8-bit unsigned int
+typedef uint16_t psU16;                ///< 16-bit unsigned int
+typedef uint32_t psU32;                ///< 32-bit unsigned int
+typedef uint64_t psU64;                ///< 64-bit unsigned int
+typedef int8_t psS8;                   ///< 8-bit signed int
+typedef int16_t psS16;                 ///< 16-bit signed int
+typedef int32_t psS32;                 ///< 32-bit signed int
+typedef int64_t psS64;                 ///< 64-bit signed int
+typedef float psF32;                   ///< 32-bit floating point
+typedef double psF64;                  ///< 64-bit floating point
+
+#ifdef SWIG
+typedef struct
+{
+    float re, im;
+}
+psC32;
+typedef struct
+{
+    double re,im;
+}
+psC64;
+#else
+typedef float _Complex psC32;          ///< complex with 32-bit floating point Real and Imagary numbers
+typedef double _Complex psC64;         ///< complex with 64-bit floating point Real and Imagary numbers
+#endif
+
+typedef void* psPtr;                   ///< void pointer
+typedef bool psBool;                   ///< boolean value
+
+typedef enum {
+    PS_TYPE_S8   = 0x0101,             ///< Character.
+    PS_TYPE_S16  = 0x0102,             ///< Short integer.
+    PS_TYPE_S32  = 0x0104,             ///< Integer.
+    PS_TYPE_S64  = 0x0108,             ///< Long integer.
+    PS_TYPE_U8   = 0x0301,             ///< Unsigned character.
+    PS_TYPE_U16  = 0x0302,             ///< Unsigned psS16 integer.
+    PS_TYPE_U32  = 0x0304,             ///< Unsigned integer.
+    PS_TYPE_U64  = 0x0308,             ///< Unsigned psS64 integer.
+    PS_TYPE_F32  = 0x0404,             ///< Single-precision Floating point.
+    PS_TYPE_F64  = 0x0408,             ///< Double-precision floating point.
+    PS_TYPE_C32  = 0x0808,             ///< Complex numbers consisting of single-precision floating point.
+    PS_TYPE_C64  = 0x0810,             ///< Complex numbers consisting of double-precision floating point.
+    PS_TYPE_BOOL = 0x1301              ///< Boolean.
+} psElemType;
+
+#define PS_TYPE_MASK PS_TYPE_U8        /**< the psElemType to use for mask image */
+#define PS_TYPE_MASK_DATA U8           /**< the data member to use for mask image */
+#define PS_TYPE_MASK_NAME "psU8"       /**< the data type for mask as a string */
+
+typedef psU8 psMaskType;               ///< the C datatype for a mask image
+typedef psBool psBOOL;                 ///< allow psBOOL to be used instead of psBool (for macros)
+
+#define PS_MIN_S8        INT8_MIN      /**< minimum valid psS8 value */
+#define PS_MIN_S16       INT16_MIN     /**< minimum valid psS16 value */
+#define PS_MIN_S32       INT32_MIN     /**< minimum valid psS32 value */
+#define PS_MIN_S64       INT64_MIN     /**< minimum valid psS64 value */
+#define PS_MIN_U8        0             /**< minimum valid psU8 value */
+#define PS_MIN_U16       0             /**< minimum valid psU16 value */
+#define PS_MIN_U32       0             /**< minimum valid psU32 value */
+#define PS_MIN_U64       0             /**< minimum valid psU64 value */
+#define PS_MIN_F32       -FLT_MAX      /**< minimum valid psF32 value */
+#define PS_MIN_F64       -DBL_MAX      /**< minimum valid psF64 value */
+#define PS_MIN_C32       -FLT_MAX      /**< minimum valid real or imaginary psC32 value */
+#define PS_MIN_C64       -DBL_MAX      /**< minimum valid real or imaginary psC32 value */
+
+#define PS_MAX_S8        INT8_MAX      /**< maximum valid psS8 value */
+#define PS_MAX_S16       INT16_MAX     /**< maximum valid psS16 value */
+#define PS_MAX_S32       INT32_MAX     /**< maximum valid psS32 value */
+#define PS_MAX_S64       INT64_MAX     /**< maximum valid psS64 value */
+#define PS_MAX_U8        UINT8_MAX     /**< maximum valid psU8 value */
+#define PS_MAX_U16       UINT16_MAX    /**< maximum valid psU16 value */
+#define PS_MAX_U32       UINT32_MAX    /**< maximum valid psU32 value */
+#define PS_MAX_U64       UINT64_MAX    /**< maximum valid psU64 value */
+#define PS_MAX_F32       FLT_MAX       /**< maximum valid psF32 value */
+#define PS_MAX_F64       DBL_MAX       /**< maximum valid psF64 value */
+#define PS_MAX_C32       FLT_MAX       /**< maximum valid real or imaginary psC32 value */
+#define PS_MAX_C64       DBL_MAX       /**< maximum valid real or imaginary psC32 value */
+
+#define PS_TYPE_BOOL_NAME "psBool"
+#define PS_TYPE_S8_NAME   "psS8"
+#define PS_TYPE_S16_NAME  "psS16"
+#define PS_TYPE_S32_NAME  "psS32"
+#define PS_TYPE_S64_NAME  "psS64"
+#define PS_TYPE_U8_NAME   "psU8"
+#define PS_TYPE_U16_NAME  "psU16"
+#define PS_TYPE_U32_NAME  "psU32"
+#define PS_TYPE_U64_NAME  "psU64"
+#define PS_TYPE_F32_NAME  "psF32"
+#define PS_TYPE_F64_NAME  "psF64"
+#define PS_TYPE_C32_NAME  "psC32"
+#define PS_TYPE_C64_NAME  "psC64"
+
+#define PS_TYPE_NAME(value,type) \
+switch(type) { \
+case PS_TYPE_BOOL: \
+    value = PS_TYPE_BOOL_NAME; \
+    break; \
+case PS_TYPE_S8: \
+    value = PS_TYPE_S8_NAME; \
+    break; \
+case PS_TYPE_S16: \
+    value = PS_TYPE_S16_NAME; \
+    break; \
+case PS_TYPE_S32: \
+    value = PS_TYPE_S32_NAME; \
+    break; \
+case PS_TYPE_S64: \
+    value = PS_TYPE_S64_NAME; \
+    break; \
+case PS_TYPE_U8: \
+    value = PS_TYPE_U8_NAME; \
+    break; \
+case PS_TYPE_U16: \
+    value = PS_TYPE_U16_NAME; \
+    break; \
+case PS_TYPE_U32: \
+    value = PS_TYPE_U32_NAME; \
+    break; \
+case PS_TYPE_U64: \
+    value = PS_TYPE_U64_NAME; \
+    break; \
+case PS_TYPE_F32: \
+    value = PS_TYPE_F32_NAME; \
+    break; \
+case PS_TYPE_F64: \
+    value = PS_TYPE_F64_NAME; \
+    break; \
+case PS_TYPE_C32: \
+    value = PS_TYPE_C32_NAME; \
+    break; \
+case PS_TYPE_C64: \
+    value = PS_TYPE_C64_NAME; \
+    break; \
+default: \
+    value = "unknown"; \
+};
+
+/// Macro to get the bad pixel reason code (stored as part of mask value)
+#define PS_BADPIXEL_BITMASK 0x0f
+#define PS_GET_BADPIXEL(maskValue) (maskValue & PS_BADPIXEL_BITMASK)
+
+#define PS_IS_BADPIXEL(maskValue) (PS_GET_BADPIXEL(maskValue) != 0)
+
+/// Macro to apply a bad pixel reason code to mask image
+#define PS_SET_BADPIXEL(maskValue, reasonCode) \
+{ \
+    maskValue = (psMaskType)((reasonCode & PS_BADPIXEL_BITMASK) | (maskValue & ~PS_BADPIXEL_BITMASK)); \
+}
+
+/// Macro to determine if the psElemType is an integer.
+#define PS_IS_PSELEMTYPE_INT(x) ((x & 0x100) == 0x100)
+/// Macro to determine if the psElemType is unsigned.
+#define PS_IS_PSELEMTYPE_UNSIGNED(x) ((x & 0x200) == 0x200)
+/// Macro to determine if the psElemType is a real (non-complex) floating-point type.
+#define PS_IS_PSELEMTYPE_REAL(x) ((x & 0x400) == 0x400)
+/// Macro to determine if the psElemType is complex number type.
+#define PS_IS_PSELEMTYPE_COMPLEX(x) ((x & 0x800) == 0x800)
+/// Macro to determine if the psElemType is boolean type.
+#define PS_IS_PSELEMTYPE_BOOL(x) ((x & 0x1000) == 0x1000)
+/// Macro to determine the storage size, in bytes, of the psElemType.
+#define PSELEMTYPE_SIZEOF(x) (x & 0xFF)
+
+/** Dimensions of a data type.
+ *
+ * The dimensions of containers used by psLib are defined within this enum. This enum is used by the psType
+struct. *
+ */
+typedef enum {
+    PS_DIMEN_SCALAR,            ///< Scalar.
+    PS_DIMEN_VECTOR,            ///< Vector.
+    PS_DIMEN_TRANSV,            ///< Transposed vector.
+    PS_DIMEN_IMAGE,             ///< Image.
+    PS_DIMEN_OTHER              ///< Something else that's not supported for arithmetic.
+} psDimen;
+
+/** The type of a data type.
+ *
+ * All psLib complex types consist of primitive components. This struct provides the description of those
+ * primitives.
+ *
+ */
+typedef struct
+{
+    psElemType type;            ///< Primitive type.
+    psDimen dimen;              ///< Dimensionality.
+}
+psType;
+
+/** The type of a basic data type
+ *
+ *  All psLib complex types consist of primitive components.  This structure provides the ability to cast
+ *  an unknown data structure to safely test the underlining data type.
+ *
+ */
+typedef struct
+{
+    psType  type;              ///< Data type information
+}
+psMath;
+
+/// @}
+
+#endif
Index: /tags/ipp-1-X/bug123/psLib/src/sysUtils/.cvsignore
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/sysUtils/.cvsignore	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/sysUtils/.cvsignore	(revision 22331)
@@ -0,0 +1,7 @@
+Makefile.in
+.deps
+.libs
+Makefile
+*.lo
+*.la
+
Index: /tags/ipp-1-X/bug123/psLib/src/sysUtils/Makefile.am
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/sysUtils/Makefile.am	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/sysUtils/Makefile.am	(revision 22331)
@@ -0,0 +1,40 @@
+#Makefile for sysUtils functions of psLib
+#
+INCLUDES = \
+	-I$(top_srcdir)/src/astronomy \
+	-I$(top_srcdir)/src/collections \
+	-I$(top_srcdir)/src/dataManip \
+	-I$(top_srcdir)/src/dataIO \
+	-I$(top_srcdir)/src/image \
+	$(all_includes)
+
+noinst_LTLIBRARIES = libpslibsysUtils.la
+
+libpslibsysUtils_la_SOURCES = \
+	psMemory.c     \
+	psError.c      \
+	psTrace.c      \
+	psLogMsg.c     \
+	psAbort.c      \
+	psString.c     \
+	psConfigure.c  \
+	psErrorCodes.c 
+
+BUILT_SOURCES = psSysUtilsErrors.h
+EXTRA_DIST = psSysUtilsErrors.dat psSysUtilsErrors.h sysUtils.i
+
+psSysUtilsErrors.h: psSysUtilsErrors.dat
+	perl $(top_srcdir)/src/parseErrorCodes.pl --data=$? $@
+
+pslibincludedir = $(includedir)
+pslibinclude_HEADERS = \
+	psType.h       \
+	psMemory.h     \
+	psError.h      \
+	psTrace.h      \
+	psLogMsg.h     \
+	psAbort.h      \
+	psString.h     \
+	psConfigure.h  \
+	psErrorCodes.h
+
Index: /tags/ipp-1-X/bug123/psLib/src/sysUtils/psAbort.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/sysUtils/psAbort.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/sysUtils/psAbort.c	(revision 22331)
@@ -0,0 +1,38 @@
+
+/** @file  psAbort.c
+ *
+ *  @brief Contains the definition for abort function
+ *
+ *  The abort logging and handling shall be performed by psAbort function.
+ *  This will allow for consistent handling of other software units
+ *  needing to abort from program execution.
+ *
+ *  @author Eric Van Alst, MHPCC
+ *   
+ *  @version $Revision: 1.10 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-02-17 19:26:24 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+
+#include <stdarg.h>
+#include <stdlib.h>
+#include "psAbort.h"
+#include "psLogMsg.h"
+
+void psAbort(const char *name, const char *fmt, ...)
+{
+    va_list argPtr;             // variable list arguement pointer
+
+    // Get the variable list parameters to pass to logging function
+    va_start(argPtr, fmt);
+
+    // Call logging function with PS_LOG_ABORT level
+    psLogMsgV(name, PS_LOG_ABORT, fmt, argPtr);
+
+    // Clean up stack after variable arguement has been used
+    va_end(argPtr);
+
+    // Call system abort function to terminate program execution
+    abort();
+}
Index: /tags/ipp-1-X/bug123/psLib/src/sysUtils/psAbort.h
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/sysUtils/psAbort.h	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/sysUtils/psAbort.h	(revision 22331)
@@ -0,0 +1,47 @@
+
+/** @file  psAbort.h
+ *
+ *  @brief Contains the declarations for the abort function
+ *
+ *  The abort logging and handling shall be performed by psAbort function.
+ *  This will allow for consistent handling of other software units
+ *  needing to abort from program execution.
+ *
+ *  @ingroup ErrorHandling
+ *
+ *  @author Eric Van Alst, MHPCC
+ *
+ *  @version $Revision: 1.9 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-02-17 19:26:24 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+
+#ifndef PS_ABORT_H
+#define PS_ABORT_H
+
+// Doxygen grouping tags
+
+/** @addtogroup ErrorHandling
+ *  @{
+ */
+
+/** Reports an abort message to logging facility
+ *
+ *  This function will invoke the psLogMsg function with a level of 
+ *  PS_LOG_ABORT and pass the parameters name and fmt to generate a proper
+ *  log message.  After logging, this function will call system abort 
+ *  function to abnormally terminate the program.
+ *
+ *  @return  void No return value
+ *
+ */
+void psAbort(
+    const char *name,                  ///< Source of abort such as file or function detected
+    const char *fmt,                   ///< A printf style formatting statement defining msg
+    ...
+);
+
+/* @} */// Doxygen - End of SystemGroup Functions
+
+#endif
Index: /tags/ipp-1-X/bug123/psLib/src/sysUtils/psConfigure.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/sysUtils/psConfigure.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/sysUtils/psConfigure.c	(revision 22331)
@@ -0,0 +1,54 @@
+/** @file  psConfigure.c
+ *
+ *  @brief Contains the declarations for initialization, memory finalization, and configuration.
+ *
+ *  These functions initalize psLib data before the beginning of a run and remove (finalize) the
+ *  same data after the run is complete. A function is also provided to return the current
+ *  psLib version.
+ *
+ *  @ingroup Configure
+ *
+ *  @author Ross Harman, MHPCC
+ *  @author Robert DeSonia, MHPCC
+ *
+ *  @version $Revision: 1.7 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-02-17 19:26:24 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+#include "psString.h"
+#include "psTime.h"
+#include "psError.h"
+#include "psConfigure.h"
+#include "psSysUtilsErrors.h"
+#include "config.h"
+
+char* psLibVersion(void)
+{
+    char version[80];
+    snprintf(version,80,"%s-v%s",PACKAGE,VERSION);
+
+    return(psStringCopy(version));
+}
+
+void psLibInit(bool predictable, const char* timeConfig)
+{
+    // Still needs error codes to be set
+    // Still needs random number generator initialization
+    // Please code me, Robert and George.
+
+    if(!p_psTimeInit(timeConfig)) {
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true, PS_ERRORTEXT_psConfigure_INITIALIZATION_FAILED, "psTime");
+        return;
+    }
+}
+
+void psLibFinalize(void)
+{
+    // Users of persistent memory should free them in this function
+
+    if(!p_psTimeFinalize()) {
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true, PS_ERRORTEXT_psConfigure_FINALIZATION_FAILED, "psTime");
+        return;
+    }
+}
Index: /tags/ipp-1-X/bug123/psLib/src/sysUtils/psConfigure.h
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/sysUtils/psConfigure.h	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/sysUtils/psConfigure.h	(revision 22331)
@@ -0,0 +1,66 @@
+/** @file  psConfigure.h
+ *
+ *  @brief Contains the declarations for initialization, memory finalization, and configuration.
+ *
+ *  These functions initalize psLib data before the beginning of a run and remove (finalize) the
+ *  same data after the run is complete. A function is also provided to return the current
+ *  psLib version.
+ *
+ *  @ingroup Configure
+ *
+ *  @author Ross Harman, MHPCC
+ *  @author George Gusciora, MHPCC
+ *  @author Robert DeSonia, MHPCC
+ *
+ *  @version $Revision: 1.3 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-02-17 19:26:24 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+
+#ifndef PS_CONFIGURE_H
+#define PS_CONFIGURE_H
+
+
+/** @addtogroup Configure
+ *  @{
+ */
+
+/** Get current psLib version
+ *
+ *  Returns the current psLib version name as a string.
+ *
+ *  @return char*: String with version name.
+ */
+char* psLibVersion(
+    void
+);
+
+/** Initializes persistent memory.
+ *
+ *  Creates persistant memory items used throughout psLib. Items created within this method should be freed
+ *  with the psLibFinalize function.
+ *  current, a non-NULL psErr is returned with code PS_ERR_NONE.
+ *
+ *  @return void: void.
+ */
+void psLibInit(
+    bool predictable,
+    const char* timeConfig
+);
+
+/** Removes persistant memory created with the psLibInit function.
+ *
+ *  The memory created but not freed by psLib modules should be freed within this
+ *  function at the end of a psLib execution cycle.
+ *
+ *  @return void: void.
+ */
+void psLibFinalize(
+    void
+);
+
+
+/* @} */
+
+#endif
Index: /tags/ipp-1-X/bug123/psLib/src/sysUtils/psError.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/sysUtils/psError.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/sysUtils/psError.c	(revision 22331)
@@ -0,0 +1,216 @@
+/** @file  psError.c
+ *
+ *  @brief Contains the definitions for the error reporting functions
+ *
+ *  Error reporting functions shall be used to create log entries in the
+ *  event errors are detected.  The messages shall give enough information
+ *  to allow the user to know where the error has occurred and the type
+ *  of error detected.
+ *
+ *  @author Eric Van Alst, MHPCC
+ *
+ *  @version $Revision: 1.24 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-04-07 20:27:41 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+
+#include <stdarg.h>
+#include <pthread.h>
+#include <string.h>
+
+#include "psLogMsg.h"
+#include "psError.h"
+#include "psMemory.h"
+
+#define MAX_ERROR_STACK_SIZE 64
+static psErr* errorStack[MAX_ERROR_STACK_SIZE];
+static psU32 errorStackSize = 0;
+pthread_mutex_t lockErrorStack = PTHREAD_MUTEX_INITIALIZER;
+
+static void pushErrorStack(psErr* err);
+
+static void pushErrorStack(psErr* err)
+{
+
+    pthread_mutex_lock(&lockErrorStack);
+
+    if (errorStackSize < MAX_ERROR_STACK_SIZE) {
+        errorStack[errorStackSize] = psMemIncrRefCounter(err);
+        errorStackSize++;
+        p_psMemSetPersistent(err,true);
+        p_psMemSetPersistent(err->msg,true);
+        p_psMemSetPersistent(err->name,true);
+    }
+
+    pthread_mutex_unlock(&lockErrorStack);
+}
+
+static void errFree(psErr* err)
+{
+    if (err != NULL) {
+        psFree(err->msg);
+        psFree(err->name);
+    }
+}
+
+psErr* psErrAlloc(const char* name, psErrorCode code, const char* msg)
+{
+    psErr* err = psAlloc(sizeof(psErr));
+    err->msg = strcpy(psAlloc(strlen(msg) + 1), msg);
+    err->name = strcpy(psAlloc(strlen(name) + 1), name);
+    err->code = code;
+
+    psMemSetDeallocator(err,(psFreeFcn)errFree);
+
+    return err;
+}
+
+psErrorCode p_psError(const char* file,
+                      int lineno,
+                      const char* func,
+                      psErrorCode code,
+                      psBool new,
+                      const char* fmt,
+                      ...)
+{
+    char errMsg[2048];
+    psErr* err;
+    char msgName[1024];
+
+    snprintf(msgName,1024,"%s (%s:%d)",func,file,lineno);
+
+    va_list argPtr;             // variable list arguement pointer
+
+    if (new) {
+        psErrorClear();
+    }
+
+    // Get the variable list parameters to pass to logging function
+    va_start(argPtr, fmt);
+
+    vsnprintf(errMsg,2048,fmt,argPtr);
+    err = psErrAlloc(msgName,code,errMsg);
+    pushErrorStack(err);
+
+    // Call logging function with PS_LOG_ERROR level
+    psLogMsg(msgName, PS_LOG_ERROR, errMsg);
+
+    // Clean up stack after variable argument has been used
+    va_end(argPtr);
+
+    psFree(err);
+
+    return code;
+}
+
+void p_psWarning(const char* file,
+                 int lineno,
+                 const char* func,
+                 const char* fmt,
+                 ...)
+{
+    char msgName[1024];
+
+    snprintf(msgName,1024,"%s (%s:%d)",func,file,lineno);
+
+    va_list argPtr;             // variable list argument pointer
+
+    // Get the variable list parameters to pass to logging function
+    va_start(argPtr, fmt);
+
+    psLogMsgV(msgName, PS_LOG_WARN, fmt, argPtr);
+
+    // Clean up stack after variable argument has been used
+    va_end(argPtr);
+
+    return;
+}
+
+psErr* psErrorGet(psS32 which)
+{
+    psErr* result;
+
+    pthread_mutex_lock(&lockErrorStack);
+
+    // Check for negative reference and if found return PS_ERR_NONE
+    if (which < 0 ) {
+        result = psErrAlloc("", PS_ERR_NONE, "");
+    } else {
+
+        which = errorStackSize-1-which;     // the which input is from the end of errorStack
+        if (which < 0 || which >= errorStackSize) {
+            result = psErrAlloc("",PS_ERR_NONE,"");    // no error at the given location
+        } else {
+            result = psMemIncrRefCounter(errorStack[which]); // a new reference passed back
+        }
+    }
+
+    pthread_mutex_unlock(&lockErrorStack);
+
+    return result;
+}
+
+psS32 psErrorGetStackSize()
+{
+    return errorStackSize;
+}
+
+psErr* psErrorLast(void)
+{
+    return psErrorGet(0);
+}
+
+void psErrorClear(void)
+{
+    pthread_mutex_lock(&lockErrorStack);
+
+    for (int lcv=0;lcv < errorStackSize; lcv++) {
+        p_psMemSetPersistent(errorStack[lcv],false);
+        p_psMemSetPersistent(errorStack[lcv]->msg,false);
+        p_psMemSetPersistent(errorStack[lcv]->name,false);
+        psFree(errorStack[lcv]);
+    }
+    errorStackSize = 0;
+
+    pthread_mutex_unlock(&lockErrorStack);
+
+}
+void psErrorStackPrint(FILE *fd, const char *fmt, ...)
+{
+    va_list argPtr;             // variable list arguement pointer
+
+    // Get the variable list parameters to pass to logging function
+    va_start(argPtr, fmt);
+
+    psErrorStackPrintV(fd,fmt,argPtr);
+
+    va_end(argPtr);
+}
+
+void psErrorStackPrintV(FILE *fd, const char *fmt, va_list va)
+{
+
+    pthread_mutex_lock(&lockErrorStack);
+
+    if (errorStackSize > 0) {
+        vfprintf(fd,fmt,va);
+
+        for (psS32 lcv=0;lcv<errorStackSize;lcv++) {
+            if(errorStack[lcv]->code >= PS_ERR_BASE) {
+                fprintf(fd," -> %s: %s\n     %s\n",
+                        errorStack[lcv]->name,
+                        psErrorCodeString(errorStack[lcv]->code),
+                        errorStack[lcv]->msg);
+            } else {
+                fprintf(fd," -> %s: %s\n     %s\n",
+                        errorStack[lcv]->name,
+                        strerror(errorStack[lcv]->code),
+                        errorStack[lcv]->msg);
+            }
+        }
+    }
+
+    pthread_mutex_unlock(&lockErrorStack);
+}
+
Index: /tags/ipp-1-X/bug123/psLib/src/sysUtils/psError.h
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/sysUtils/psError.h	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/sysUtils/psError.h	(revision 22331)
@@ -0,0 +1,177 @@
+/** @file  psError.h
+ *
+ *  @brief Contains the declarations for the error reporting functions
+ *
+ *  Error reporting functions shall be used to create log entries in the
+ *  event errors are detected.  The messages shall give enough information
+ *  to allow the user to know where the error has occurred and the type
+ *  of error detected.
+ *
+ *  @ingroup ErrorHandling
+ *
+ *  @author Eric Van Alst, MHPCC
+ *
+ *  @version $Revision: 1.20 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-03-22 21:52:49 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+
+#ifndef PS_ERROR_H
+#define PS_ERROR_H
+
+#include<stdio.h>
+#include<stdbool.h>
+#include<stdarg.h>
+
+#include "psErrorCodes.h"
+
+/** @addtogroup ErrorHandling
+ *  @{
+ */
+
+/** Error message object */
+typedef struct
+{
+    char* name;                        ///< category of code that caused the error
+    psErrorCode code;                  ///< class of error
+    char* msg;                         ///< the message associated with the error
+}
+psErr;
+
+/** Get a error from the error stack
+ *
+ *  Previous errors on the stack are returned by psErrorGet (a value of 0
+ *  passed to psErrorGet is equivalent to a call to psErrorLast).
+ *
+ *  if no error is at the which position, a non-NULL psErr is returned with
+ *  code PS_ERR_NONE.
+ *
+ *  @return    Error message object at 'which'
+ */
+psErr* psErrorGet(
+    psS32 which                          ///< position in the error stack. 0 is last error on stack.
+);
+
+/** Get last error put on the error stack
+ *
+ *  The last error reported is available from psErrorLast; if no errors are
+ *  current, a non-NULL psErr is returned with code PS_ERR_NONE.
+ *
+ *  @return psErr*     Reference to last error message on error stack
+ */
+psErr* psErrorLast(void);
+
+/** Clears the error stack.
+ *
+ *  The error stack may be completely cleared with psErrorClear.
+ *
+ */
+void psErrorClear(void);
+
+/** Get the error stack depth
+ *
+ *  @return psS32   The number of items on the error stack
+ */
+psS32 psErrorGetStackSize();
+
+/** Prints error stack to specified open file descriptor
+ *
+ *  The entire error stack may be printed to an open file descriptor by
+ *  calling psErrorStackPrint; if and only if there are current errors, the
+ *  printf-style string fmt is first printed to the file descriptor fd. In
+ *  this printout, error codes are replaced by their string equivalents.
+ *
+ */
+void psErrorStackPrint(
+    FILE* fd,                          ///< destination file descriptor
+    const char* fmt,                   ///< printf-style format of header line
+    ...                                ///< any parameters required in fmt
+);
+
+#ifndef SWIG
+/** Prints error stack to specified open file descriptor
+ *
+ *  The entire error stack may be printed to an open file descriptor by
+ *  calling psErrorStackPrintV; if and only if there are current errors, the
+ *  vprintf-style string fmt is first printed to the file descriptor fd. In
+ *  this printout, error codes are replaced by their string equivalents.
+ *
+ */
+void psErrorStackPrintV(
+    FILE* fd,                          ///< destination file descriptor
+    const char* fmt,                   ///< printf-style format of header line
+    va_list va                         ///< any parameters required in fmt
+);
+#endif
+
+#ifdef DOXYGEN
+/** Reports an error message to the logging facility
+ *
+ *  This function will invoke the psLogMsg function with a level of
+ *  PS_LOG_ERROR and pass the parameters name and fmt to generate a proper
+ *  log message.
+ *
+ *  This function modifies the error stack.
+ *
+ *  @return psErrorCode    the given error code
+ */
+psErrorCode psError(
+    psErrorCode code,                  ///< Error class code
+    psBool new,                        ///< true if error originates at this location
+    const char* fmt,
+    ...
+);
+
+/** Logs a warning message.
+ *
+ *  This procedure logs a message to the destination set by a prior
+ *  call to psLogSetDestination(), This is equivalent to calling
+ *  psLogMsg with a level of PS_LOG_WARN.
+ *
+ */
+void psWarning(
+    const char* fmt,
+    ...
+);
+#else
+psErrorCode p_psError(
+    const char* file,
+    int lineno,
+    const char* func,
+    psErrorCode code,                  ///< Error class code
+    psBool new,                        ///< true if error originates at this location
+    const char* fmt,
+    ...
+);
+void p_psWarning(
+    const char* file,
+    int lineno,
+    const char* func,
+    const char* fmt,
+    ...
+);
+
+
+#ifndef SWIG
+#define psError(code,new,...) p_psError(__FILE__,__LINE__,__func__,code,new,__VA_ARGS__)
+#define psWarning(...) p_psWarning(__FILE__,__LINE__,__func__,__VA_ARGS__)
+#endif
+
+#endif
+
+/** Create a new psErr struct
+ *
+ *  Creates a new psErr struct, making a copy of the parameters.
+ *
+ *  @return psErr*     new psErr object
+ */
+psErr* psErrAlloc(
+    const char* name,                  ///< Name of error in the form aaa.bbb.ccc
+    psErrorCode code,                  ///< Error class code
+    const char* msg                    ///< Error message
+);
+
+/* @} */// End of SysUtils Functions
+
+#endif
Index: /tags/ipp-1-X/bug123/psLib/src/sysUtils/psErrorCodes.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/sysUtils/psErrorCodes.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/sysUtils/psErrorCodes.c	(revision 22331)
@@ -0,0 +1,188 @@
+/** @file  psErrorCodes.c
+ *
+ *  @brief Contains the error codes for the error classes
+ *
+ *  @ingroup ErrorHandling
+ *
+ *  @author Robert DeSonia, MHPCC
+ *
+ *  @version $Revision: 1.17 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-04-07 20:27:41 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+
+#include <string.h>
+
+#include "psError.h"
+#include "psErrorCodes.h"
+#include "psList.h"
+#include "psMemory.h"
+
+#include "psSysUtilsErrors.h"
+
+/* N.B., lines between '//~Start' and '//~End' are automatic generated from
+ * the template following the '//~Start'.  The template is used to generate
+ * the other lines by, for each error class in psErrorCodes.dat, the following
+ * substitutions are made:
+ *     $1  The error code name (first word in the psErrorCodes.dat lines)
+ *     $2  The error description (rest of the line in psErrorCodes.dat)
+ *     $n  The order of the source line in psErrorCodes.dat (comments excluded)
+ * 
+ * DO NOT EDIT THE LINES BETWEEN //~Start and //~End!  ANY CHANGES WILL BE OVERWRITTEN.
+ */
+
+static psErrorDescription staticErrorCodes[] = {
+            {PS_ERR_NONE,"not an error"},
+            {PS_ERR_BASE,"base error"},
+            //~Start    {PS_ERR_$1,"$2"},
+            {PS_ERR_UNKNOWN,"unknown error"},
+            {PS_ERR_IO,"I/O error"},
+            {PS_ERR_LOCATION_INVALID,"specified location is unknown"},
+            {PS_ERR_MEMORY_CORRUPTION,"memory corruption detected"},
+            {PS_ERR_MEMORY_DEREF_USAGE,"dereferenced memory still used"},
+            {PS_ERR_BAD_PARAMETER_VALUE,"parameter is out-of-range"},
+            {PS_ERR_BAD_PARAMETER_TYPE,"parameter is of unsupported type"},
+            {PS_ERR_BAD_PARAMETER_NULL,"parameter is null"},
+            {PS_ERR_BAD_PARAMETER_SIZE,"size of parameter's data is outside of acceptable range."},
+            {PS_ERR_UNEXPECTED_NULL,"unexpected NULL found"},
+            {PS_ERR_OS_CALL_FAILED,"unexpected result from an OS standard library call"},
+            //~End
+            {PS_ERR_N_ERR_CLASSES,"error classes end marker"}
+        };
+
+static psList* dynamicErrorCodes = NULL;
+static const psErrorDescription* getErrorDescription(psErrorCode code);
+
+
+static const psErrorDescription* getErrorDescription(psErrorCode code)
+{
+    // first, search the static error codes
+
+    psS32 n = 0;
+    while(staticErrorCodes[n].code != PS_ERR_N_ERR_CLASSES &&
+            staticErrorCodes[n].code != code) {
+        n++;
+    }
+
+    if (staticErrorCodes[n].code == code) {
+        return &staticErrorCodes[n];
+    } else {
+        psErrorDescription* desc;
+        // make sure there is a list to search
+        if (dynamicErrorCodes == NULL) {
+            return NULL;
+        }
+
+        // search dynamic list of error descriptions before giving up.
+        psListIterator* iter = psListIteratorAlloc(dynamicErrorCodes,PS_LIST_HEAD,true);
+        while ((desc = (psErrorDescription*)psListGetAndIncrement(iter)) != NULL) {
+            if (desc->code == code) {
+                psFree(iter);
+                return desc;
+            }
+        }
+        psFree(iter);
+    }
+    return NULL;
+}
+
+static void freeErrorDescription(psErrorDescription* err)
+{
+    psFree((psPtr)err->description);
+}
+
+psErrorDescription* psErrorDescriptionAlloc(psErrorCode code,
+        const char *description)
+{
+    psErrorDescription* err = psAlloc(sizeof(psErrorDescription));
+    err->code = code;
+    if (description == NULL) {
+        err->description = NULL;
+    } else {
+        err->description = psAlloc(sizeof(char)*strlen(description)+1);
+        strcpy((char*)err->description,description);
+    }
+
+    psMemSetDeallocator(err,(psFreeFcn)freeErrorDescription);
+    return err;
+}
+
+
+const char *psErrorCodeString(psErrorCode code)
+{
+    // Check input argument is non-negative
+    if ( code < 0 ) {
+        return NULL;
+    }
+
+    const psErrorDescription* desc = getErrorDescription(code);
+
+    if (desc == NULL) {
+        return NULL;
+    }
+
+    return desc->description;
+}
+
+void psErrorRegister(const psErrorDescription* errors,
+                     psS32 nerror)
+{
+    if (nerror < 1) {
+        return;
+    }
+
+    if (errors == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psErrorCode_NULL_ERRORDESCRIPTION);
+        return;
+    }
+
+    if (dynamicErrorCodes == NULL) {
+        dynamicErrorCodes = psListAlloc(NULL);
+        p_psMemSetPersistent(dynamicErrorCodes,true);
+
+        p_psMemSetPersistent(dynamicErrorCodes->iterators,true);
+        p_psMemSetPersistent(dynamicErrorCodes->iterators->data,true);
+        for (int i = 0; i < dynamicErrorCodes->iterators->n;i++) {
+            p_psMemSetPersistent(dynamicErrorCodes->iterators->data[i],true);
+        }
+    }
+
+    for (psS32 i=0;i<nerror;i++) {
+        psErrorDescription* err = psErrorDescriptionAlloc(
+                                      errors[i].code, errors[i].description);
+        p_psMemSetPersistent(err,true);
+        p_psMemSetPersistent((psPtr)err->description,true);
+        if (! psListAdd(dynamicErrorCodes,
+                        PS_LIST_HEAD,
+                        err) ) {
+
+            psError(PS_ERR_UNKNOWN, false,
+                    PS_ERRORTEXT_psErrorCode_ERRORCODE_REGISTER_FAILED,
+                    i);
+        }
+        p_psMemSetPersistent(dynamicErrorCodes->head,true);
+        psFree(err);
+    }
+}
+
+psBool p_psErrorUnregister(psErrorCode code)
+{
+    // Check input argument is non-negative
+    if ( code < 0 ) {
+        return false;
+    }
+
+    const psErrorDescription* desc = getErrorDescription(code);
+
+    if (desc == NULL) {
+        return false;
+    }
+
+    if (dynamicErrorCodes == NULL) {
+        return false;
+    }
+
+    return psListRemoveData(dynamicErrorCodes,(psPtr)desc);
+}
Index: /tags/ipp-1-X/bug123/psLib/src/sysUtils/psErrorCodes.h
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/sysUtils/psErrorCodes.h	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/sysUtils/psErrorCodes.h	(revision 22331)
@@ -0,0 +1,111 @@
+/** @file  psErrorCodes.h
+ *
+ *  @brief Contains the error codes for the error classes
+ *
+ *  @ingroup ErrorHandling
+ *
+ *  @author Robert DeSonia, MHPCC
+ *
+ *  @version $Revision: 1.14 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-02-17 19:26:24 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+
+#ifndef PS_ERROR_CODES_H
+#define PS_ERROR_CODES_H
+
+#include "psType.h"
+
+/* N.B., lines between '//~Start' and '//~End' are automatic generated from
+ * the template following the '//~Start'.  The template is used to generate
+ * the other lines by, for each error class in psErrorCodes.dat, the following
+ * substitutions are made:
+ *     $1  The error code name (first word in the psErrorCodes.dat lines)
+ *     $2  The error description (rest of the line in psErrorCodes.dat)
+ *     $n  The order of the source line in psErrorCodes.dat (comments excluded)
+ * 
+ * DO NOT EDIT THE LINES BETWEEN //~Start and //~End!  ANY CHANGES WILL BE OVERWRITTEN.
+ */
+
+/** @addtogroup ErrorHandling
+ *  @{
+ */
+
+/** enumeration of the static error code classes
+ */
+typedef enum {
+    PS_ERR_NONE = 0,                   ///< not an error
+    PS_ERR_BASE = 256,
+    /**< base error.  Any psErrorCode less than this should be taken to be
+     *   valid values of errno
+     */
+
+    //~Start     PS_ERR_$1,   ///< $2
+    PS_ERR_UNKNOWN,   ///< unknown error
+    PS_ERR_IO,   ///< I/O error
+    PS_ERR_LOCATION_INVALID,   ///< specified location is unknown
+    PS_ERR_MEMORY_CORRUPTION,   ///< memory corruption detected
+    PS_ERR_MEMORY_DEREF_USAGE,   ///< dereferenced memory still used
+    PS_ERR_BAD_PARAMETER_VALUE,   ///< parameter is out-of-range
+    PS_ERR_BAD_PARAMETER_TYPE,   ///< parameter is of unsupported type
+    PS_ERR_BAD_PARAMETER_NULL,   ///< parameter is null
+    PS_ERR_BAD_PARAMETER_SIZE,   ///< size of parameter's data is outside of acceptable range.
+    PS_ERR_UNEXPECTED_NULL,   ///< unexpected NULL found
+    PS_ERR_OS_CALL_FAILED,   ///< unexpected result from an OS standard library call
+    //~End
+    PS_ERR_N_ERR_CLASSES               ///< end marker - should not be used as a true error
+} psErrorCode;
+
+/** An error code with description
+ */
+typedef struct
+{
+    psErrorCode code;                  ///< An error code
+    const char *description;           ///< the associated description
+}
+psErrorDescription;
+
+/** Allocates a new psErrorDescription
+ *
+ *  @return psErrorDescription*        new psErrorDescription struct.
+ */
+psErrorDescription* psErrorDescriptionAlloc(
+    psErrorCode code,                  ///< An error code
+    const char *description            ///< the associated description
+);
+
+/** Retrieves the description of an error code.
+ *
+ *  The routine psErrorCodeString returns the string associated with an error 
+ *  code.
+ *
+ *  @return const char*     the description associated with the given code.
+ */
+const char *psErrorCodeString(
+    psErrorCode code                   ///< the associated error code
+);
+
+/** Register an error code
+ *
+ *  Any project needed to use psLib must define the necessary error codes and
+ *  associated message strings.  This function registers an array of error 
+ *  codes with the error handling subsystem.
+ *
+ */
+void psErrorRegister(
+    const psErrorDescription* errors,  ///< Array of error codes to register
+    psS32 nerror                         ///< number of errors in input array
+);
+
+/** Clears error codes registered via psErrorRegister.
+ *
+ *  @return psBool    TRUE if given errorcode was removed, otherwise FALSE.
+ */
+psBool p_psErrorUnregister(
+    psErrorCode code                   ///< the error code to find and remove
+);
+
+/// @}
+
+#endif
Index: /tags/ipp-1-X/bug123/psLib/src/sysUtils/psLogMsg.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/sysUtils/psLogMsg.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/sysUtils/psLogMsg.c	(revision 22331)
@@ -0,0 +1,384 @@
+/** @file  psLogMsg.c
+ *  @brief Procedures for logging messages.
+ *  \ingroup LogTrace
+ *
+ *  This file will hold the prototypes for defining procedure which set
+ *  message log levels, messahe log formats, message log destinations, and
+ *  for generating the messages themselves.
+ *  @ingroup LogTrace
+ *
+ *  @author Robert Lupton, Princeton University
+ *  @author George Gusciora, MHPCC
+ *
+ *  @version $Revision: 1.39 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-03-22 21:52:49 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+
+/*****************************************************************************
+NOTES: currently, the prototype code has the following global variables:
+    static psS32 p_psGlobalLogDest;
+    static psS32 p_psGlobalLogLevel;
+    static psS32 p_psLogTime;
+    static psS32 p_psLogHost;
+    static psS32 p_psLogLevel;
+    static psS32 p_psLogName;
+    static psS32 p_psLogMsg;
+ *****************************************************************************/
+#include "config.h"
+
+#include <limits.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdarg.h>
+#include <time.h>
+#include <unistd.h>
+
+#include "psLogMsg.h"
+#include "psError.h"
+#include "psTrace.h"
+
+#include "psSysUtilsErrors.h"
+
+#define MIN_LOG_LEVEL 0
+#define MAX_LOG_LEVEL 9
+
+#define MAX_LOG_LINE_LENGTH 256
+
+static FILE *logDest = (FILE *) 1;      // flag to initialize to stderr before using.
+static psS32 globalLogLevel = PS_LOG_INFO;        // log all messages at this or above
+static psBool logTime = true;     // Flag to include time info
+static psBool logHost = true;     // Flag to include host info
+static psBool logLevel = true;    // Flag to include level info
+static psBool logName = true;     // Flag to include name info
+static psBool logMsg = true;      // Flag to include message info
+
+/*****************************************************************************
+psLogSetLevel(): Set the current log level and return old level.
+Input:
+ level (psS32): the new log level.
+Output:
+ none
+Return:
+ The old log level.
+ *****************************************************************************/
+psS32 psLogSetLevel(psS32 level)
+{
+    // Save old global log level for changing it.
+    psS32 oldLevel = globalLogLevel;
+
+    if ((level < MIN_LOG_LEVEL) || (level > MAX_LOG_LEVEL)) {
+        psLogMsg("logmsg", PS_LOG_WARN, "Attempt to set invalid logMsg level: %d", level);
+        level = (level < MIN_LOG_LEVEL) ? MIN_LOG_LEVEL : MAX_LOG_LEVEL;
+    }
+    // Set new global log level
+    globalLogLevel = level;
+
+    // Return old global log level
+    return oldLevel;
+}
+
+/*****************************************************************************
+psLogSetDestination(): sets the destination where log messages will be
+sent to.
+ 
+Input:
+ dest (psS32): the new log destination
+Output:
+ None.
+Return:
+ An integer specifying the old log destination.
+ *****************************************************************************/
+psBool psLogSetDestination(const char *dest)
+{
+    char protocol[5];
+    char location[257];
+
+    // if logDest has not been initialized, do so before using it
+    if (logDest == (FILE *) 1) {
+        logDest = stderr;
+    }
+
+    if (dest == NULL || strcmp(dest, "none") == 0) {
+        if (logDest != NULL && logDest != stderr && logDest != stdout) {
+            fclose(logDest);
+        }
+        logDest = NULL;
+        return true;
+    }
+
+    if (sscanf(dest, "%4s:%256s", protocol, location) < 2) {
+        psError(PS_ERR_LOCATION_INVALID, true,
+                PS_ERRORTEXT_psLogMsg_DESTINATION_MALFORMED,
+                dest);
+        return false;
+    }
+
+    if (strcmp(protocol, "dest") == 0) {
+        if (strcmp(location, "stderr") == 0) {
+            if (logDest != NULL && logDest != stderr && logDest != stdout) {
+                fclose(logDest);
+            }
+            logDest = stderr;
+            return true;
+        }
+        if (strcmp(location, "stdout") == 0) {
+            if (logDest != NULL && logDest != stderr && logDest != stdout) {
+                fclose(logDest);
+            }
+            logDest = stdout;
+            return true;
+        }
+        psError(PS_ERR_LOCATION_INVALID, true,
+                PS_ERRORTEXT_psLogMsg_DEST_LOCATION_INVALID,
+                location);
+        return 1;
+    } else if (strcmp(protocol, "file") == 0) {
+        FILE *file = fopen(location, "w");
+
+        if (file == NULL) {
+            psError(PS_ERR_IO, true,
+                    PS_ERRORTEXT_psLogMsg_OPEN_FILE_FAILED,
+                    location);
+            return false;
+        }
+        if (logDest != NULL && logDest != stderr && logDest != stdout) {
+            fclose(logDest);
+        }
+        logDest = file;
+        return true;
+    }
+
+    psError(PS_ERR_LOCATION_INVALID, true,
+            PS_ERRORTEXT_psLogMsg_UNSUPPORTED_PROTOCOL,
+            protocol);
+    return false;
+}
+
+/*****************************************************************************
+psLogSetFormat(): Set the format of psLogMsg output.  More precisely,
+    provide a string consisting of the letters {H (host), L (level), M
+    (message), N (name), T (time)}.  The default is "HLMNT".  This string
+    determines whether or not they associated type of information will be
+    included in message logs.  It does not determine the order in which that
+    information will appear (that order is fixed).
+ 
+Input:
+    fmt: a string specifying the format.
+Output:
+    none.
+Return:
+    NULL.
+ *****************************************************************************/
+void psLogSetFormat(const char *fmt)
+{
+    // assume nothing desired unless specified
+    logHost = false;
+    logLevel = false;
+    logMsg = false;
+    logName = false;
+    logTime = false;
+
+    // if fmt is NULL, no logging is desired.
+    if (fmt == NULL) {
+        return;
+    }
+
+    if (strlen(fmt) == 0) {
+        fmt = "THLNM";
+    }
+    // Step through each character in the format string.  For each letter
+    // in that string, set/unset the appropriate logging.
+
+    for (const char *ptr = fmt; *ptr != '\0'; ptr++) {
+        switch (*ptr) {
+        case 'H':
+        case 'h':
+            logHost = true;
+            break;
+        case 'L':
+        case 'l':
+            logLevel = true;
+            break;
+        case 'M':
+        case 'm':
+            logMsg = true;
+            break;
+        case 'N':
+        case 'n':
+            logName = true;
+            break;
+        case 'T':
+        case 't':
+            logTime = true;
+            break;
+        default:
+            psError(PS_ERR_BAD_PARAMETER_VALUE, true,
+                    PS_ERRORTEXT_psLogMsg_UNKNOWN_KEY, *ptr);
+            break;
+        }
+    }
+
+    if (!logMsg) {
+        psTrace("utils.logMsg", 1, "You must at least log error messages (You chose \"%s\")", fmt);
+    }
+}
+
+#if !defined(HOST_NAME_MAX)                // should be in limits.h
+#define HOST_NAME_MAX 256
+#endif
+
+/*****************************************************************************
+    psVLogMsg(): This routine sends the message, which is a printf style
+ string specified in the "..." argument, to the current message log
+ destination with the severity specified by the "level" argument.
+    Input:
+ name
+ level
+ fmt
+ ap
+    Output:
+ none
+    Return:
+ NULL.
+ *****************************************************************************/
+void psLogMsgV(const char *name, psS32 level, const char *fmt, va_list ap)
+{
+    static psS32 first = 1;       // Flag for calling gethostname()
+    static char hostname[HOST_NAME_MAX + 1];
+
+    // Buffer for hostname.
+    char clevel = 0;            // letter-name for level
+    char head[MAX_LOG_LINE_LENGTH + 2]; // the added two are for the ending | and \0
+    char *head_ptr = head;      // where we've got to in head
+    psS32 maxLength = MAX_LOG_LINE_LENGTH;
+    time_t clock = time(NULL);  // The current time.
+    struct tm *utc = gmtime(&clock);    // The current gm time.
+
+    // if logDest has not been initialized, do so before using it
+    if (logDest == (FILE *) 1) {
+        logDest = stderr;
+    }
+    // If logging is off, or if the level is too high, return immediately.
+    if ((level > globalLogLevel) || (logDest == NULL)) {
+        return;
+    }
+    // If I have not been here yet, determine my hostname and save it.
+    if (first) {
+        first = 0;
+        gethostname(hostname, HOST_NAME_MAX);
+    }
+
+    switch (level) {
+    case PS_LOG_ABORT:
+        clevel = 'A';
+        break;
+
+    case PS_LOG_ERROR:
+        clevel = 'E';
+        break;
+
+    case PS_LOG_WARN:
+        clevel = 'W';
+        break;
+
+    case PS_LOG_INFO:
+        clevel = 'I';
+        break;
+
+    case 4:
+    case 5:
+    case 6:
+    case 7:
+    case 8:
+    case 9:
+        clevel = level + '0';
+        break;
+
+    default:
+        psTrace("utils.logMsg", 2, "Invalid logMsg level: %d (%s)\n", level, fmt);
+        level = (level < 0) ? 0 : 9;
+        clevel = level + '0';
+        break;
+    }
+
+    // Create the various log fields...
+    if (logTime) {
+        maxLength -= snprintf(head_ptr, maxLength, "%4d:%02d:%02d %02d:%02d:%02dZ",
+                              utc->tm_year + 1900, utc->tm_mon + 1, utc->tm_mday,
+                              utc->tm_hour, utc->tm_min, utc->tm_sec) - 1;
+        head_ptr += strlen(head_ptr);
+    }
+    // Hostname should be 20 characters.
+    if (logHost) {
+        if (head_ptr > head) {
+            *head_ptr++ = '|';
+        }
+        maxLength -= snprintf(head_ptr, maxLength, "%-20s", hostname);
+        head_ptr += strlen(head_ptr);
+    }
+    if (logLevel) {
+        if (head_ptr > head) {
+            *head_ptr++ = '|';
+        }
+        maxLength -= snprintf(head_ptr, maxLength, "%c", clevel);
+        head_ptr += strlen(head_ptr);
+    }
+    if (logName) {
+        if (head_ptr > head) {
+            *head_ptr++ = '|';
+        }
+        maxLength -= snprintf(head_ptr, maxLength, "%s", name);
+
+        head_ptr += strlen(head_ptr);
+    }
+
+    if (head_ptr > head) {
+        *head_ptr++ = '\n';
+    } else if (!logMsg) {                  // no output desired
+        return;
+    }
+    *head_ptr = '\0';
+
+    fputs(head, logDest);
+    if (logMsg) {
+        char msg[1024];
+        char* msgPtr;
+        vsnprintf(msg,1024, fmt, ap);  // create message
+
+        // detect multiple lines in message and indent each line by 4 spaces.
+        char* line = strtok_r(msg,"\n",&msgPtr);
+        while (line != NULL) {
+            fprintf(logDest,"    %s\n",line);
+            line = strtok_r(NULL,"\n",&msgPtr);
+        }
+    } else {
+        fputc('\n', logDest);
+    }
+}
+
+/*****************************************************************************
+    psLogMsg(): This routine sends the message, which is a printf style
+ string specified in the "..." argument, to the current message log
+ destination with the severity specified by the "level" argument.
+    Input:
+ name: Indicates the source of this log message.
+ level: The severity of this log message.
+ fmt: The printf-stype formatted string, followed by the arguments
+  to that string.
+ ... The arguments to the above printf-style string.
+    Output:
+ none
+    Return:
+ NULL
+ *****************************************************************************/
+void psLogMsg(const char *name, psS32 level, const char *fmt, ...)
+{
+    va_list ap;
+
+    va_start(ap, fmt);
+    psLogMsgV(name, level, fmt, ap);
+    va_end(ap);
+}
Index: /tags/ipp-1-X/bug123/psLib/src/sysUtils/psLogMsg.h
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/sysUtils/psLogMsg.h	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/sysUtils/psLogMsg.h	(revision 22331)
@@ -0,0 +1,106 @@
+/** @file  psLogMsg.h
+ *  @brief Procedures for logging messages.
+ *  \ingroup LogTrace
+ *
+ *  This file will hold the prototypes for defining procedure which set
+ *  message log levels, messahe log formats, message log destinations, and
+ *  for generating the messages themselves.
+ *  @ingroup LogTrace
+ *
+ *  @author Robert Lupton, Princeton University
+ *  @author George Gusciora, MHPCC
+ *
+ *  @version $Revision: 1.22 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-03-22 21:52:49 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+#if !defined(PS_LOG_MSG_H)
+#define PS_LOG_MSG_H
+#include <stdarg.h>
+
+#include "psType.h"
+
+/** @addtogroup LogTrace
+ *  @{
+ */
+
+/** This procedure sets the destination for future log messages.  Currently
+ *  the destination is specified by an integer which can have the following
+ *  pre-defined values: PS_LOG_NONE, PS_LOG_TO_STDOUT, and PS_LOG_TO_STDERR.
+ *  In future versions, this procedure will take a character string as an
+ *  argument which can specify more general log destinations.
+ *
+ *  @return psS32     true if set successfully, otherwise false.
+ */
+psBool psLogSetDestination(
+    const char *dest                   ///< Specifies where to send messages.
+);
+
+/** This procedure sets the message level for future log messages.  Subsequent
+ *  log messages, with a log level of "mylevel", will only be logged if
+ *  "mylevel" is less than the current log level set by this procedure.
+ *  Ie. higher values set by this procedure will cause more log messages to
+ *  be displayed.
+ *
+ *  @return psS32    old logging level
+ */
+psS32 psLogSetLevel(
+    psS32 level                          ///< Specifies the system log level
+);
+
+/** This procedure sets the log format for future log messages.  The argument
+ *  must be a character string consistsing of the letters H (host), L
+ *  (level), M (message), N (name), and T (time).  The default is "THLNM".
+ *  Deleting a letter from the string will cause the associated information
+ *  to not be logged.
+ *
+ */
+void psLogSetFormat(
+    const char *fmt                    ///< Specifies the system log format
+);
+
+/** This procedure logs a message to the destination set by a prior
+ *  call to psLogSetDestination(), if myLevel is less than the level
+ *  specified by a prior call to psLogSetLevel().  The message is specified
+ *  with a printf-stype string an arguments.
+ *
+ */
+void psLogMsg(
+    const char *name,                  ///< name of the log source
+    psS32 myLevel,                       ///< severity level of this log message
+    const char *fmt,                   ///< printf-style format command
+    ...
+);
+
+#ifndef SWIG
+/** This procedure is functionally equivalent to psLogMsg(), except that
+ *  it takes a va_list as the message parameter, not a printf-style string.
+ *
+ */
+void psLogMsgV(
+    const char *name,                  ///< name of the log source
+    psS32 myLevel,                       ///< severity level of this log message
+    const char *fmt,                   ///< printf-style format command
+    va_list ap                         ///< varargs argument list
+);
+#endif
+
+///< Status codes for log messages
+enum {
+    PS_LOG_ABORT = 0,                  ///< log message is a critical error, perform an abort after printing
+    PS_LOG_ERROR,                      ///< log message is an error, but don't abort
+    PS_LOG_WARN,                       ///< log message is a warning
+    PS_LOG_INFO                        ///< log message is informational only
+};
+
+///< Destinations for log messages
+enum {
+    PS_LOG_NONE,                       ///< turn off logging
+    PS_LOG_TO_STDERR,                  ///< log to system's stderr
+    PS_LOG_TO_STDOUT                   ///< log to system's stdout
+};
+
+/// @}
+
+#endif
Index: /tags/ipp-1-X/bug123/psLib/src/sysUtils/psMemory.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/sysUtils/psMemory.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/sysUtils/psMemory.c	(revision 22331)
@@ -0,0 +1,701 @@
+/** @file  psMemory.c
+*
+*  @brief Contains the definitions for the memory management system
+*
+*  psMemory.h has additional information and documentation of the routines found in this file.
+*
+*  @author Robert DeSonia, MHPCC
+*  @author Robert Lupton, Princeton University
+*
+*  @version $Revision: 1.50 $ $Name: not supported by cvs2svn $
+*  @date $Date: 2005-04-07 20:27:41 $
+*
+*  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+*/
+
+#define PS_ALLOW_MALLOC                    // we're allowed to call malloc()
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <stdint.h>
+
+#include "psMemory.h"
+#include "psError.h"
+#include "psAbort.h"
+#include "psLogMsg.h"
+
+#include "psSysUtilsErrors.h"
+
+#define P_PS_MEMMAGIC (psPtr )0xdeadbeef   // Magic number in psMemBlock header
+
+#define P_PS_LARGE_BLOCK_SIZE 65536        // size where under, we try to recycle
+
+static psS32 checkMemBlock(const psMemBlock* m, const char *funcName);
+static psMemBlock* lastMemBlockAllocated = NULL;
+static pthread_mutex_t memBlockListMutex = PTHREAD_MUTEX_INITIALIZER;
+static pthread_mutex_t memIdMutex = PTHREAD_MUTEX_INITIALIZER;
+
+static pthread_mutex_t recycleMemBlockListMutex = PTHREAD_MUTEX_INITIALIZER;
+
+static psS32 recycleBins = 13;
+static psS32 recycleBinSize[14] = {
+                                      8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768, P_PS_LARGE_BLOCK_SIZE
+                                  };
+
+// N.B. recycleBinSize should be terminated by P_PS_LARGE_BLOCK_SIZE (simplifies search loops)
+static psMemBlock* recycleMemBlockList[13] = {
+            NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
+        };
+
+#ifdef PS_MEM_DEBUG
+static psMemBlock* deadBlockList;       // a place to put dead memBlocks in debug mode.
+#endif
+
+/**
+ * Unique ID for allocated blocks
+ */
+static psMemoryId memid = 0;
+
+/**
+ *  Default memExhausted callback.
+ */
+static psPtr memExhaustedCallbackDefault(size_t size)
+{
+    psPtr ptr = NULL;
+
+    pthread_mutex_lock(&recycleMemBlockListMutex);
+    psS32 level = recycleBins - 1;
+
+    while (level >= 0 && ptr == NULL) {
+        while (recycleMemBlockList[level] != NULL && ptr == NULL) {
+            psMemBlock* old = recycleMemBlockList[level];
+
+            recycleMemBlockList[level] = recycleMemBlockList[level]->nextBlock;
+            free(old);
+            ptr = malloc(size);
+        }
+        level--;
+    }
+    pthread_mutex_unlock(&recycleMemBlockListMutex);
+
+    return ptr;
+}
+
+static psMemExhaustedCallback memExhaustedCallback = memExhaustedCallbackDefault;
+
+psMemExhaustedCallback psMemExhaustedCallbackSet(psMemExhaustedCallback func)
+{
+    psMemExhaustedCallback old = memExhaustedCallback;
+
+    if (func != NULL) {
+        memExhaustedCallback = func;
+    } else {
+        memExhaustedCallback = memExhaustedCallbackDefault;
+    }
+
+    return old;
+}
+
+static void memProblemCallbackDefault(const psMemBlock* ptr, const char *file, psS32 lineno)
+{
+    if (ptr->refCounter < 1) {
+        psError(PS_ERR_MEMORY_CORRUPTION, false,
+                PS_ERRORTEXT_psMemory_MULTIPLE_FREE,
+                ptr->id, ptr->file, ptr->lineno, file, lineno);
+    }
+
+    if (lineno > 0) {
+        psAbort(__func__, "Detected a problem in the memory system at %s:%d", file, lineno);
+    }
+}
+static psMemProblemCallback memProblemCallback = memProblemCallbackDefault;
+
+psMemProblemCallback psMemProblemCallbackSet(psMemProblemCallback func)
+{
+    psMemProblemCallback old = memProblemCallback;
+
+    if (func != NULL) {
+        memProblemCallback = func;
+    } else {
+        memProblemCallback = memProblemCallbackDefault;
+    }
+
+    return old;
+}
+
+/*
+ * And now the I-want-to-be-informed callbacks
+ *
+ * Call the callbacks when these IDs are allocated/freed
+ */
+psMemoryId p_psMemAllocateID = 0;       // notify user this block is allocated
+psMemoryId p_psMemFreeID = 0;   // notify user this block is freed
+
+psMemoryId psMemAllocateCallbackSetID(psMemoryId id)
+{
+    psMemoryId old = p_psMemAllocateID;
+
+    p_psMemAllocateID = id;
+
+    return old;
+}
+
+psMemoryId psMemFreeCallbackSetID(psMemoryId id)
+{
+    psMemoryId old = p_psMemFreeID;
+
+    p_psMemFreeID = id;
+
+    return old;
+}
+
+/*
+ * Default callback for both allocate and free. Note that the
+ * value of p_psMemAllocateID/p_psMemFreeID is incremented
+ * by the return value (so returning 0 means that the callback
+ * isn't resignalled)
+ */
+static psMemoryId memAllocateCallbackDefault(const psMemBlock* ptr)
+{
+    static psMemoryId incr = 0; // "p_psMemAllocateID += incr"
+
+    return incr;
+}
+
+static psMemoryId memFreeCallbackDefault(const psMemBlock* ptr)
+{
+    static psMemoryId incr = 0; // "p_psMemFreeID += incr"
+
+    return incr;
+}
+
+/*
+ * The default callbacks, and the routines to change them
+ */
+static psMemAllocateCallback memAllocateCallback = memAllocateCallbackDefault;
+static psMemFreeCallback memFreeCallback = memFreeCallbackDefault;
+
+psMemAllocateCallback psMemAllocateCallbackSet(psMemAllocateCallback func)
+{
+    psMemFreeCallback old = memAllocateCallback;
+
+    if (func != NULL) {
+        memAllocateCallback = func;
+    } else {
+        memAllocateCallback = memAllocateCallbackDefault;
+    }
+
+    return old;
+}
+
+psMemFreeCallback psMemFreeCallbackSet(psMemFreeCallback func)
+{
+    psMemFreeCallback old = memFreeCallback;
+
+    if (func != NULL) {
+        memFreeCallback = func;
+    } else {
+        memFreeCallback = memFreeCallbackDefault;
+    }
+
+    return old;
+}
+
+/*
+ * Return memory ID counter for next block to be allocated
+ */
+psMemoryId psMemGetId(void)
+{
+    psMemoryId id;
+
+    pthread_mutex_lock(&memIdMutex);
+    id = memid + 1;
+    pthread_mutex_unlock(&memIdMutex);
+
+    return id;
+}
+
+/*
+ * Routines to check the consistency of the allocated and/or free memory arena
+ *
+ * N.b. If the block wasn't allocated by psAlloc, it will appear corrupted
+ */
+
+static psS32 checkMemBlock(const psMemBlock* m, const char *funcName)
+{
+    // n.b. since this is called by psMemCheckCorruption while the memblock list is mutex locked,
+    // we shouldn't call such things as p_psAlloc/p_psFree here.
+
+    if (m == NULL) {
+        psError(PS_ERR_MEMORY_CORRUPTION, true,
+                PS_ERRORTEXT_psMemory_NULL_BLOCK);
+        return 1;
+    }
+
+    if (m->refCounter == 0) {
+        // using an unreferenced block of memory, are you?
+        psError(PS_ERR_MEMORY_CORRUPTION, true,
+                PS_ERRORTEXT_psMemory_DEREF_BLOCK_USE,
+                m->id);
+        return 1;
+    }
+
+    if (m->startblock != P_PS_MEMMAGIC || m->endblock != P_PS_MEMMAGIC) {
+        psError(PS_ERR_MEMORY_CORRUPTION, true,
+                PS_ERRORTEXT_psMemory_UNDERFLOW,
+                m->id);
+        return 1;
+    }
+    if (*(psPtr *)((int8_t *) (m + 1) + m->userMemorySize) != P_PS_MEMMAGIC) {
+        psError(PS_ERR_MEMORY_CORRUPTION, true,
+                PS_ERRORTEXT_psMemory_OVERFLOW,
+                m->id);
+        return 1;
+    }
+
+    return 0;
+}
+
+psS32 psMemCheckCorruption(psBool abort_on_error)
+{
+    psS32 nbad = 0;               // number of bad blocks
+    psBool failure = false;
+
+    // get exclusive access to the memBlock list to avoid it changing on us while we use it.
+    //    pthread_mutex_lock(&memBlockListMutex);
+
+    for (psMemBlock* iter = lastMemBlockAllocated; iter != NULL; iter = iter->nextBlock) {
+        pthread_mutex_unlock(&memBlockListMutex);
+        failure = checkMemBlock(iter, __func__);
+        pthread_mutex_lock(&memBlockListMutex);
+        if ( failure ) {
+            nbad++;
+
+            memProblemCallback(iter, __func__, __LINE__);
+
+            if (abort_on_error) {
+                // release the lock on the memblock list
+                pthread_mutex_unlock(&memBlockListMutex);
+                psAbort(__func__, "Detected memory corruption");
+                return nbad;
+            }
+        }
+    }
+
+    // release the lock on the memblock list
+    pthread_mutex_unlock(&memBlockListMutex);
+    return nbad;
+}
+
+psPtr p_psAlloc(size_t size, const char *file, psS32 lineno)
+{
+
+    psMemBlock* ptr = NULL;
+
+    size = (size < recycleBinSize[0]) ? recycleBinSize[0] : size; // set the minimum size to allocate
+
+    // memory is of the size I want to bother recycling?
+    if (size < P_PS_LARGE_BLOCK_SIZE) {
+        // find the bin we need.
+        psS32 level = 0;
+
+        while (size > recycleBinSize[level]) {
+            level++;
+        }
+        // Are we in one of the bins
+        if (level < recycleBins) {
+
+            size = recycleBinSize[level];  // round-up size to next sized bin.
+
+            pthread_mutex_lock(&recycleMemBlockListMutex);
+
+            if (recycleMemBlockList[level] != NULL) {
+                ptr = recycleMemBlockList[level];
+                recycleMemBlockList[level] = ptr->nextBlock;
+                if (recycleMemBlockList[level] != NULL) {
+                    recycleMemBlockList[level]->previousBlock = NULL;
+                }
+                size = ptr->userMemorySize;
+            }
+
+            pthread_mutex_unlock(&recycleMemBlockListMutex);
+        }
+    }
+
+    if (ptr == NULL) {
+        ptr = malloc(sizeof(psMemBlock) + size + sizeof(psPtr ));
+
+        if (ptr == NULL) {
+            ptr = memExhaustedCallback(size);
+            if (ptr == NULL) {
+                psAbort(__func__, "Failed to allocate %u bytes at %s:%d", size, file, lineno);
+            }
+        }
+
+        *(psPtr*)&ptr->startblock = P_PS_MEMMAGIC;
+        *(psPtr*)&ptr->endblock = P_PS_MEMMAGIC;
+        ptr->userMemorySize = size;
+        pthread_mutex_init(&ptr->refCounterMutex, NULL);
+    }
+    // increment the memory id safely.
+    pthread_mutex_lock(&memBlockListMutex);
+    *(psMemoryId* ) & ptr->id = ++memid;
+    pthread_mutex_unlock(&memBlockListMutex);
+
+    ptr->file = file;
+    ptr->freeFcn = NULL;
+    ptr->persistent = false;
+    *(psU32 *)&ptr->lineno = lineno;
+    *(psPtr *)((int8_t *) (ptr + 1) + size) = P_PS_MEMMAGIC;
+    ptr->previousBlock = NULL;
+
+    ptr->refCounter = 1;                   // one user so far
+
+    // need exclusive access of the memory block list now...
+    pthread_mutex_lock(&memBlockListMutex);
+
+    // insert the new block to the front of the memBlock linked-list
+    ptr->nextBlock = lastMemBlockAllocated;
+    if (ptr->nextBlock != NULL) {
+        ptr->nextBlock->previousBlock = ptr;
+    }
+    lastMemBlockAllocated = ptr;
+
+    pthread_mutex_unlock(&memBlockListMutex);
+
+    // Did the user ask to be informed about this allocation?
+    if (ptr->id == p_psMemAllocateID) {
+        p_psMemAllocateID += memAllocateCallback(ptr);
+    }
+    // And return the user the memory that they allocated
+    return ptr + 1;                        // user memory
+}
+
+psPtr p_psRealloc(psPtr vptr, size_t size, const char *file, psS32 lineno)
+{
+    size = (size < recycleBinSize[0]) ? recycleBinSize[0] : size; // set the minimum size to allocate
+
+    if (vptr == NULL) {
+        return p_psAlloc(size, file, lineno);
+    } else {
+        psMemBlock* ptr = ((psMemBlock* ) vptr) - 1;
+        psBool isBlockLast = false;
+
+        if (checkMemBlock(ptr, __func__) != 0) {
+            memProblemCallback(ptr, file, lineno);
+            psAbort(file, "Realloc detected a memory corruption (id %lld @ %s:%d).",
+                    ptr->id, ptr->file, ptr->lineno);
+        }
+
+        pthread_mutex_lock(&memBlockListMutex);
+
+        isBlockLast = (ptr == lastMemBlockAllocated);
+
+        ptr = (psMemBlock* ) realloc(ptr, sizeof(psMemBlock) + size + sizeof(psPtr ));
+
+        if (ptr == NULL) {
+            ptr = memExhaustedCallback(size);
+            if(ptr == NULL) {
+                psAbort(__func__, "Failed to reallocate %ld bytes at %s:%d", size, file, lineno);
+            }
+        }
+
+        ptr->userMemorySize = size;
+        *(psPtr *)((int8_t *) (ptr + 1) + size) = P_PS_MEMMAGIC;
+
+        if (isBlockLast) {
+            lastMemBlockAllocated = ptr;
+        }
+        // the block location may have changed, so fix the linked list addresses.
+        if (ptr->nextBlock != NULL) {
+            ptr->nextBlock->previousBlock = ptr;
+        }
+        if (ptr->previousBlock != NULL) {
+            ptr->previousBlock->nextBlock = ptr;
+        }
+
+        pthread_mutex_unlock(&memBlockListMutex);
+
+        // Did the user ask to be informed about this allocation?
+        if (ptr->id == p_psMemAllocateID) {
+            p_psMemAllocateID += memAllocateCallback(ptr);
+        }
+
+        return ptr + 1;                    // usr memory
+    }
+}
+
+void p_psFree(psPtr vptr, const char *file, psS32 lineno)
+{
+    if (vptr == NULL) {
+        return;
+    }
+    psMemBlock* ptr = ((psMemBlock* ) vptr) - 1;
+    if (ptr->refCounter < 1) {
+        psMemBlock* ptr = ((psMemBlock* ) vptr) - 1;
+
+        psAbort(__func__,PS_ERRORTEXT_psMemory_MULTIPLE_FREE,
+                ptr->id, ptr->file, ptr->lineno, file, lineno);
+    }
+
+    if (checkMemBlock(ptr, __func__) != 0) {
+        memProblemCallback(ptr, file, lineno);
+        psAbort(__func__,"Memory Corruption Detected.");
+    }
+
+    (void)p_psMemDecrRefCounter(vptr, file, lineno);    // this handles the free, if required.
+}
+
+/*
+ * Check for memory leaks.
+ */
+psS32 psMemCheckLeaks(psMemoryId id0, psMemBlock* ** arr, FILE * fd, psBool persistence)
+{
+    psS32 nleak = 0;
+    psS32 j = 0;
+    psMemBlock* topBlock = lastMemBlockAllocated;
+
+    pthread_mutex_lock(&memBlockListMutex);
+
+    for (psMemBlock* iter = topBlock; iter != NULL; iter = iter->nextBlock) {
+        if ( (iter->refCounter > 0) &&
+                ( (persistence) || (!persistence && !iter->persistent) ) &&
+                (iter->id >= id0)) {
+
+            nleak++;
+
+            if (fd != NULL) {
+                if (nleak == 1) {
+                    fprintf(fd, "   %20s:line ID\n", "file");
+                }
+
+                fprintf(fd, "   %20s:%-4d %ld\n", iter->file, (int)iter->lineno, (long)iter->id);
+            }
+        }
+    }
+
+    pthread_mutex_unlock(&memBlockListMutex);
+
+    if (nleak == 0 || arr == NULL) {
+        return nleak;
+    }
+
+    *arr = p_psAlloc(nleak * sizeof(psMemBlock), __FILE__, __LINE__);
+    pthread_mutex_lock(&memBlockListMutex);
+
+    for (psMemBlock* iter = topBlock; iter != NULL; iter = iter->nextBlock) {
+        if ( (iter->refCounter > 0) &&
+                ( (persistence) || (!persistence && !iter->persistent) ) &&
+                (iter->id >= id0)) {
+
+            (*arr)[j++] = iter;
+            if (j == nleak) {              // found them all
+                break;
+            }
+        }
+    }
+
+    pthread_mutex_unlock(&memBlockListMutex);
+
+    return nleak;
+}
+
+/*
+ * Reference counting APIs
+ */
+// return refCounter
+psReferenceCount psMemGetRefCounter(psPtr vptr)
+{
+    psMemBlock* ptr;
+    psU32 refCount;
+
+    if (vptr == NULL) {
+        return 0;
+    }
+
+    ptr = ((psMemBlock* ) vptr) - 1;
+
+    if (checkMemBlock(ptr, __func__) != 0) {
+        memProblemCallback(ptr, __func__, __LINE__);
+    }
+
+    pthread_mutex_lock(&ptr->refCounterMutex);
+    refCount = ptr->refCounter;
+    pthread_mutex_unlock(&ptr->refCounterMutex);
+
+    return refCount;
+}
+
+// increment and return refCounter
+psPtr p_psMemIncrRefCounter(psPtr vptr, const char *file, psS32 lineno)
+{
+    psMemBlock* ptr;
+
+    if (vptr == NULL) {
+        return vptr;
+    }
+
+    ptr = ((psMemBlock* ) vptr) - 1;
+
+    if (checkMemBlock(ptr, __func__)) {
+        memProblemCallback(ptr, file, lineno);
+    }
+
+    pthread_mutex_lock(&ptr->refCounterMutex);
+    ptr->refCounter++;
+    pthread_mutex_unlock(&ptr->refCounterMutex);
+
+    return vptr;
+}
+
+// decrement and return refCounter
+psPtr p_psMemDecrRefCounter(psPtr vptr, const char *file, psS32 lineno)
+{
+    if (vptr == NULL) {
+        return NULL;
+    }
+
+    psMemBlock* ptr = ((psMemBlock* ) vptr) - 1;
+
+    if (checkMemBlock(ptr, __func__) != 0) {
+        memProblemCallback(ptr, file, lineno);
+        return NULL;
+    }
+
+    pthread_mutex_lock(&ptr->refCounterMutex);
+
+    if (ptr->refCounter > 1) {
+        ptr->refCounter--;                 // multiple references, just decrement the count.
+        pthread_mutex_unlock(&ptr->refCounterMutex);
+
+    } else {
+        pthread_mutex_unlock(&ptr->refCounterMutex);
+
+        // Did the user ask to be informed about this deallocation?
+        if (ptr->id == p_psMemFreeID) {
+            p_psMemFreeID += memFreeCallback(ptr);
+        }
+
+        if (ptr->freeFcn != NULL) {
+            ptr->freeFcn(vptr);
+        }
+
+        pthread_mutex_lock(&memBlockListMutex);
+
+        // cut the memBlock out of the memBlock list
+        if (ptr->nextBlock != NULL) {
+            ptr->nextBlock->previousBlock = ptr->previousBlock;
+        }
+        if (ptr->previousBlock != NULL) {
+            ptr->previousBlock->nextBlock = ptr->nextBlock;
+        }
+        if (lastMemBlockAllocated == ptr) {
+            lastMemBlockAllocated = ptr->nextBlock;
+        }
+
+        pthread_mutex_unlock(&memBlockListMutex);
+
+        // do we need to recycle?
+        if (ptr->userMemorySize < P_PS_LARGE_BLOCK_SIZE) {
+
+            psS32 level = 1;
+
+            while (ptr->userMemorySize >= recycleBinSize[level]) {
+                level++;
+            }
+            level--;
+
+            ptr->refCounter = 0;
+            ptr->previousBlock = NULL;
+
+            pthread_mutex_lock(&recycleMemBlockListMutex);
+            ptr->nextBlock = recycleMemBlockList[level];
+            if (recycleMemBlockList[level] != NULL) {
+                recycleMemBlockList[level]->previousBlock = ptr;
+            }
+            recycleMemBlockList[level] = ptr;
+            pthread_mutex_unlock(&recycleMemBlockListMutex);
+
+        } else {
+            // memory is larger than I want to recycle.
+            #ifdef PS_MEM_DEBUG
+            (void)p_psRealloc(vptr, 0, file, lineno);
+            ptr->previousBlock = NULL;
+            ptr->nextBlock = deadBlockList;
+            if (deadBlockList != NULL) {
+                deadBlockList->previous = ptr;
+            }
+            deadBlockList = ptr;
+            #else
+
+            pthread_mutex_destroy(&ptr->refCounterMutex);
+            free(ptr);
+            #endif
+
+        }
+
+        vptr = NULL;                       // since we freed it, make sure we return NULL.
+    }
+
+    return vptr;
+}
+
+void psMemSetDeallocator(psPtr vptr, psFreeFcn freeFcn)
+{
+    if (vptr == NULL) {
+        return;
+    }
+
+    psMemBlock* ptr = ((psMemBlock* ) vptr) - 1;
+
+    if (checkMemBlock(ptr, __func__) != 0) {
+        memProblemCallback(ptr, __func__, __LINE__);
+    }
+
+    ptr->freeFcn = freeFcn;
+
+}
+psFreeFcn psMemGetDeallocator(psPtr vptr)
+{
+    if (vptr == NULL) {
+        return NULL;
+    }
+
+    psMemBlock* ptr = ((psMemBlock* ) vptr) - 1;
+
+    if (checkMemBlock(ptr, __func__) != 0) {
+        memProblemCallback(ptr, __func__, __LINE__);
+    }
+
+    return ptr->freeFcn;
+}
+
+psBool p_psMemGetPersistent(psPtr vptr)
+{
+    if (vptr == NULL) {
+        return NULL;
+    }
+
+    psMemBlock* ptr = ((psMemBlock* ) vptr) - 1;
+
+    if (checkMemBlock(ptr, __func__) != 0) {
+        memProblemCallback(ptr, __func__, __LINE__);
+    }
+
+    return ptr->persistent;
+}
+
+void p_psMemSetPersistent(psPtr vptr,psBool value)
+{
+    if (vptr == NULL) {
+        return;
+    }
+
+    psMemBlock* ptr = ((psMemBlock* ) vptr) - 1;
+
+    if (checkMemBlock(ptr, __func__) != 0) {
+        memProblemCallback(ptr, __func__, __LINE__);
+    }
+
+    ptr->persistent = value;
+}
Index: /tags/ipp-1-X/bug123/psLib/src/sysUtils/psMemory.h
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/sysUtils/psMemory.h	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/sysUtils/psMemory.h	(revision 22331)
@@ -0,0 +1,455 @@
+/** @file  psMemory.h
+ *
+ *  @brief Contains the definitions for the memory management system
+ *
+ *  This is the generic memory management system put inbetween the user's high level code and the OS-level
+ *  memory allocation routines.  This system adds such features as callback routines for memory error events,
+ *  tracing capabilities, and reference counting.
+ *
+ *  @author Robert DeSonia, MHPCC
+ *  @author Robert Lupton, Princeton University
+ *
+ *  @ingroup MemoryManagement
+ *
+ *  @version $Revision: 1.36 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-04-07 20:27:41 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+
+#if !defined(PS_MEMORY_H)
+#define PS_MEMORY_H
+
+#include <stdio.h>                     // needed for FILE
+#include <pthread.h>                   // we need a mutex to make this stuff thread safe.
+
+#include "psType.h"
+
+/** @addtogroup MemoryManagement
+ *  @{
+ */
+
+/**
+ *  @addtogroup memCallback Memory Callbacks
+ *
+ *  Routines dealing with the creating and setting of memory management callback functions.
+ */
+
+/**
+ *  @addtogroup memTracing Memory Tracing
+ *
+ *  Routines dealing with memory tracing and corruption checking.
+ */
+
+/**
+ *  @addtogroup memRefCount Reference Count
+ *
+ *  Routines dealing with the reference counting of allocated buffers.
+ */
+
+/// typedef for memory identification numbers.  Guaranteed to be some variety of integer.
+typedef psU64 psMemoryId;
+
+/// typedef for a memory block's reference count. Guaranteed to be some variety of integer.
+typedef psU64 psReferenceCount;
+
+/// typedef for deallocator.
+typedef void (*psFreeFcn) (psPtr ptr);
+
+/** Book-keeping data for storage allocator.
+ *  N.b. sizeof(psMemBlock) must be chosen such that if ptr is a pointer
+ *  returned by malloc, then ((char *)ptr + sizeof(psMemBlock)) is properly
+ *  aligned for all storage types.
+ */
+typedef struct psMemBlock
+{
+    const psPtr startblock;            ///< initialised to p_psMEMMAGIC
+    struct psMemBlock* previousBlock;  ///< previous block in allocation list
+    struct psMemBlock* nextBlock;      ///< next block allocation list
+    psFreeFcn freeFcn;                 ///< deallocator.  If NULL, use generic deallocation.
+    size_t userMemorySize;             ///< the size of the user-portion of the memory block
+    const psMemoryId id;               ///< a unique ID for this allocation
+    const char *file;                  ///< set from __FILE__ in e.g. p_psAlloc
+    const psS32 lineno;                  ///< set from __LINE__ in e.g. p_psAlloc
+    pthread_mutex_t refCounterMutex;   ///< mutex to ensure exclusive access to reference counter
+    psReferenceCount refCounter;       ///< how many times pointer is referenced
+    psBool persistent;                   ///< marks if this non-user persistent data like error stack, etc.
+    const psPtr endblock;              ///< initialised to p_psMEMMAGIC
+}
+psMemBlock;
+
+/** prototype of a basic callback used by memory functions
+ *
+ *  @see psMemAllocateCallbackSet
+ *  @ingroup memCallback
+ */
+typedef psMemoryId(*psMemAllocateCallback) (
+    const psMemBlock* ptr              ///< the psMemBlock just allocated
+);
+
+/** prototype of memory free callback used by memory functions
+ *
+ *  @see psMemFreeCallbackSet
+ *  @ingroup memCallback
+ */
+typedef psMemoryId(*psMemFreeCallback) (
+    const psMemBlock* ptr              ///< the psMemBlock being freed
+);
+
+/** prototype of a callback used in error conditions
+ *
+ *  This callback should not try to call psAlloc or psFree.
+ *
+ *  @see psMemProblemCallbackSet
+ *  @ingroup memCallback
+ */
+typedef void (*psMemProblemCallback) (
+    const psMemBlock* ptr,             ///< the pointer to the problematic memory block.
+    const char *file,                  ///< the file in which the problem originated
+    psS32 lineno                         ///< the line number in which the problem originated
+);
+
+/** prototype of a callback function used when memory runs out
+ *
+ *  @return psPtr pointer to requested buffer of the size size_t, or NULL if memory could not
+ *          be found.
+ *
+ *  @see psMemExhaustedCallbackSet
+ *  @ingroup memCallback
+ */
+typedef psPtr (*psMemExhaustedCallback) (
+    size_t size                        ///< the size of buffer required
+);
+
+/** Memory allocation.  This operates much like malloc(), but is guaranteed to return a non-NULL value.
+ *
+ *  @return psPtr pointer to the allocated buffer. This will not be NULL.
+ *  @see psFree 
+ */
+#ifdef DOXYGEN
+psPtr psAlloc(size_t size       ///< Size required
+             );
+#else
+psPtr p_psAlloc(size_t size,    ///< Size required
+                const char *file,       ///< File of call
+                psS32 lineno      ///< Line number of call
+               );
+
+/// Memory allocation. psAlloc sends file and line number to p_psAlloc.
+#ifndef SWIG
+#define psAlloc(size) p_psAlloc(size, __FILE__, __LINE__)
+#endif
+
+#endif
+
+/** Set the deallocator routine
+ *
+ *  A deallocator routine can optionally be assigned to a memory block to 
+ *  ensure that associated memory blocks also get freed, e.g., memory buffers
+ *  referenced within a struct.
+ *
+ */
+void psMemSetDeallocator(
+    psPtr ptr,                         ///< the memory block to operate on
+    psFreeFcn freeFcn                  ///< the function to be executed at deallocation
+);
+
+/** Get the deallocator routine
+ *
+ *  This function returns the deallocator for a memory block.  A deallocator 
+ *  routine can optionally be assigned to a memory block to ensure that 
+ *  associated memory blocks also get freed, e.g., memory buffers referenced 
+ *  within a struct.  
+ *
+ *  @return psFreeFcn    the routine to be called at deallocation.
+ */
+psFreeFcn psMemGetDeallocator(
+    psPtr ptr                          ///< the memory block
+);
+
+/** Set the memory as persistent so that it is ignored when detecting memory leaks.
+ *
+ *  Used to mark a memory block as persistent data within the library, 
+ *  i.e., non user-level data used to hold psLib's state or cache data.  Such
+ *  examples of this class of memory is psTrace's trace-levels and dynamic
+ *  error codes.
+ *
+ *  Memory marked as persistent is excluded from memory leak checks.
+ *
+ */
+void p_psMemSetPersistent(
+    psPtr ptr,                         ///< the memory block to operate on
+    psBool value                         ///< true if memory is persistent, otherwise false
+);
+
+/** Get the memory's persistent flag.
+ *
+ *  Checks if a memory block has been marked as persistent by 
+ *  p_psMemSetPresistent.
+ *
+ *  Memory marked as persistent is excluded from memory leak checks.
+ *
+ *  @return psBool    true if memory is marked persistent, otherwise false.
+ */
+psBool p_psMemGetPersistent(
+    psPtr ptr                          ///< the memory block to check.
+);
+
+
+/** Memory re-allocation.  This operates much like realloc(), but is guaranteed to return a non-NULL value.
+ *
+ *  @return psPtr pointer to resized buffer. This will not be NULL.
+ *  @see psAlloc, psFree
+ */
+#ifdef DOXYGEN
+psPtr psRealloc(
+    psPtr ptr,                          ///< Pointer to re-allocate
+    size_t size                         ///< Size required
+);
+#else
+psPtr p_psRealloc(
+    psPtr ptr,                         ///< Pointer to re-allocate
+    size_t size,                       ///< Size required
+    const char *file,                  ///< File of call
+    psS32 lineno                       ///< Line number of call
+);
+
+/// Memory re-allocation.  psRealloc sends file and line number to p_psRealloc.
+#ifndef SWIG
+#define psRealloc(ptr, size) p_psRealloc(ptr, size, __FILE__, __LINE__)
+#endif
+
+#endif
+
+/** Free memory.  This operates much like free().
+ *
+ *  @see psAlloc, psRealloc
+ */
+#ifdef DOXYGEN
+void psFree(
+    psPtr ptr                          ///< Pointer to free, if NULL, function returns immediately.
+);
+#else
+void p_psFree(
+    psPtr ptr,                         ///< Pointer to free
+    const char *file,                  ///< File of call
+    psS32 lineno                       ///< Line number of call
+);
+
+/// Free memory.  psFree sends file and line number to p_psFree.
+#ifndef SWIG
+#define psFree(ptr) p_psFree(ptr, __FILE__, __LINE__)
+#endif
+
+#endif
+
+/** Check for memory leaks.  This scans for allocated memory buffers not freed with an ID not less than id0.
+ *  This is used to check for memory leaks by:
+ *      -# before a block of code to be checked, store the current ID count via psGetMemId
+ *      -# after the block of code to be checked, call this function using the ID stored above.  If all
+ *         memory in the block that was allocated has been freed, this call should output nothing and
+ *         return 0.
+ *
+ *  If memory leaks are found, the Memory Problem callback will be called as well.
+ *
+ *  return psS32  number of memory blocks found as 'leaks', i.e., the number of currently allocated memory
+ *              blocks above id0 that have not been freed.
+ *  @see psAlloc, psFree, psgetMemId, psMemProblemCallbackSet
+ *  @ingroup memTracing
+ */
+psS32 psMemCheckLeaks(
+    psMemoryId id0,                    ///< don't list blocks with id < id0
+    psMemBlock* ** arr,                ///< pointer to array of pointers to leaked blocks, or NULL
+    FILE * fd,                         ///< print list of leaks to fd (or NULL)
+    psBool persistence                 ///< make check across all object even persistent ones
+);
+
+/** Check for memory corruption.  Scans all currently allocated memory buffers and checks for corruptions,
+ *  i.e., invalid markers that signify a buffer under/overflow.
+ *
+ *  @ingroup memTracing
+ */
+psS32 psMemCheckCorruption(
+    psBool abort_on_error                ///< Abort on detecting corruption?
+);
+
+/** Return reference counter
+ *
+ *  @ingroup memRefCount
+ */
+psReferenceCount psMemGetRefCounter(
+    psPtr vptr                         ///< Pointer to get refCounter for
+);
+
+/** Increment reference counter and return the pointer
+ *
+ *  @ingroup memRefCount
+ */
+#ifdef DOXYGEN
+psPtr psMemIncrRefCounter(
+    psPtr vptr                         ///< Pointer to increment refCounter, and return
+);
+#else
+psPtr p_psMemIncrRefCounter(
+    psPtr vptr,                        ///< Pointer to increment refCounter, and return
+    const char *file,                  ///< File of call
+    psS32 lineno                         ///< Line number of call
+);
+
+#ifndef SWIG
+#define psMemIncrRefCounter(vptr) p_psMemIncrRefCounter(vptr, __FILE__, __LINE__)
+#endif
+
+#endif
+
+/** Decrement reference counter and return the pointer
+ *
+ *  @ingroup memRefCount
+ *
+ *  @return psPtr    the pointer deremented in refCount, or NULL if pointer is 
+ *                   fully dereferenced.
+ */
+#ifdef DOXYGEN
+psPtr psMemDecrRefCounter(
+    psPtr vptr                         ///< Pointer to decrement refCounter, and return
+);
+#else
+psPtr p_psMemDecrRefCounter(
+    psPtr vptr,                        ///< Pointer to decrement refCounter, and return
+    const char *file,                  ///< File of call
+    psS32 lineno                         ///< Line number of call
+);
+
+#ifndef SWIG
+#define psMemDecrRefCounter(vptr) p_psMemDecrRefCounter(vptr, __FILE__, __LINE__)
+#endif
+
+#endif
+
+/** Set callback for problems.
+ *
+ *  At various occasions, the memory manager can check the state of the memory 
+ *  stack. If any of these checks discover that the memory stack is corrupted,
+ *  the psMemProblemCallback is called.
+ 
+ *  @ingroup memCallback
+ *
+ *  @return psMemProblemCallback       old psMemProblemCallback function
+ */
+psMemProblemCallback psMemProblemCallbackSet(
+    psMemProblemCallback func          ///< Function to run at memory problem detection
+);
+
+/** Set callback for out-of-memory.
+ *
+ *  If not enough memory is available to satisfy a request by psAlloc or 
+ *  psRealloc, these functions attempt to find an alternative solution by 
+ *  calling the psMemExhaustedCallback, a function which may be set by the 
+ *  programmer in appropriate circumstances, rather than immediately fail. 
+ *  The typical use of such a feature may be when a program needs a large 
+ *  chunk of memory to do an operation, but the exact size is not critical. 
+ *  This feature gives the programmer the opportunity to make a smaller 
+ *  request and try again, limiting the size of the operating buffer.
+ *
+ *  @ingroup memCallback
+ *
+ *  @return psMemExhaustedCallback     old psMemExhaustedCallback function
+ */
+psMemExhaustedCallback psMemExhaustedCallbackSet(
+    psMemExhaustedCallback func        ///< Function to run at memory exhaustion
+);
+
+/** Set call back for when a particular memory block is allocated
+ *
+ *  A private variable, p_psMemAllocateID, can be used to trace the allocation 
+ *  and freeing of specific memory blocks. If p_psMemAllocateID is set and a 
+ *  memory block with that ID is allocated, psMemAllocateCallback is called 
+ *  just before memory is returned to the calling function.
+ *
+ *  @ingroup memCallback
+ *
+ *  @return psMemAllocateCallback      old psMemAllocateCallback function
+ */
+psMemAllocateCallback psMemAllocateCallbackSet(
+    psMemAllocateCallback func       ///< Function to run at memory allocation of specific mem block
+);
+
+/** Set call back for when a particular memory block is freed
+ *
+ *  A private variable, p_psMemFreeID, can be used to trace the freeing of 
+ *  specific memory blocks. If p_psMemFreeID is set and the memory block with 
+ *  the ID is about to be freed, the psMemFreeCallback callback is called just
+ *  before the memory block is freed.
+ *
+ *  @ingroup memCallback
+ *
+ *  @return psMemFreeCallback          old psMemFreeCallback function
+ */
+psMemFreeCallback psMemFreeCallbackSet(
+    psMemFreeCallback func             ///< Function to run at memory free of specific mem block
+);
+
+/** get next memory ID
+ *
+ *  @ingroup memCallback
+ *
+ *  @return psMemoryId                 the next memory ID to be used
+ */
+psMemoryId psMemGetId(void);
+
+/** set p_psMemAllocateID to specific id
+ *
+ *  A private variable, p_psMemAllocateID, can be used to trace the allocation 
+ *  and freeing of specific memory blocks. If p_psMemAllocateID is set and a 
+ *  memory block with that ID is allocated, psMemAllocateCallback is called 
+ *  just before memory is returned to the calling function.
+ *
+ *  @ingroup memCallback
+ *
+ *  @return psMemoryId       
+ *
+ *  @see psMemAllocateCallbackSet    
+ */
+psMemoryId psMemAllocateCallbackSetID(
+    psMemoryId id                      ///< ID to set
+);
+
+/** set p_psMemFreeID to id
+ *
+ *  A private variable, p_psMemFreeID, can be used to trace the freeing of 
+ *  specific memory blocks. If p_psMemFreeID is set and the memory block with 
+ *  the ID is about to be freed, the psMemFreeCallback callback is called just
+ *  before the memory block is freed.
+ *
+ *  @ingroup memCallback
+ *
+ *  @return psMemoryId                 the old p_psMemFreeID
+ *
+ *  @see psMemFreeCallbackSet
+ */
+psMemoryId psMemFreeCallbackSetID(
+    psMemoryId id                      ///< ID to set
+);
+
+//@} End of Memory Management Functions
+
+#ifndef DOXYGEN
+
+/*
+ * Ensure that any program using malloc/realloc/free will fail to compile
+ */
+#ifndef PS_ALLOW_MALLOC
+#ifdef __GNUC__
+#pragma GCC poison malloc realloc calloc free
+#else
+#define malloc(S)       _Pragma("error Use of malloc is not allowed.  Use psAlloc instead.")
+#define realloc(P,S)    _Pragma("error Use of realloc is not allowed.  Use psRealloc instead.")
+#define calloc(S)       _Pragma("error Use of calloc is not allowed.  Use psAlloc instead.")
+#define free(P)         _Pragma("error Use of free is not allowed.  Use psFree instead.")
+#endif
+#endif
+
+#endif
+// doxygen skip
+
+#endif // end of header file
Index: /tags/ipp-1-X/bug123/psLib/src/sysUtils/psString.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/sysUtils/psString.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/sysUtils/psString.c	(revision 22331)
@@ -0,0 +1,56 @@
+
+/** @file  psString.c
+ *
+ *  @brief Contains the definition of string utility functions
+ *
+ *  String utility functions defined shall provide basic string copying
+ *  capabilities while using the preferred memory management utilities.
+ *
+ *  @author Eric Van Alst, MHPCC
+ *
+ *  @version $Revision: 1.15 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-02-17 19:26:24 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+
+#include <stdlib.h>
+#include <string.h>
+#include "psString.h"
+#include "psMemory.h"
+#include "psError.h"
+
+#include "psSysUtilsErrors.h"
+
+char *psStringCopy(const char *str)
+{
+    // Allocate memory using psAlloc function
+    // Copy input string to memory just allocated
+    // Return the copy
+    return strcpy(psAlloc(strlen(str) + 1), str);
+}
+
+char *psStringNCopy(const char *str, psS32 nChar)
+{
+    char *returnValue = NULL;
+
+    // Check the number of characters to copy is non-negative
+    if (nChar < 0) {
+        // Log error message and return NULL
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true,
+                PS_ERRORTEXT_psString_NCHAR_NEGATIVE,
+                nChar);
+        return NULL;
+    }
+    // Allocate memory using psAlloc function - nChar bytes
+    // Copy input string to memory allocated up to nChar characters
+    // Return the copy
+    returnValue = strncpy(psAlloc((size_t) nChar + 1), str, (size_t) nChar);
+
+    // Ensure the last byte is NULL character
+    if (nChar > 0) {
+        returnValue[nChar] = '\0';
+    }
+    // Return the string pointer
+    return returnValue;
+}
Index: /tags/ipp-1-X/bug123/psLib/src/sysUtils/psString.h
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/sysUtils/psString.h	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/sysUtils/psString.h	(revision 22331)
@@ -0,0 +1,71 @@
+/** @file  psString.h
+ *
+ *  @brief Contains the declarations of string utility functions
+ *
+ *  @ingroup SysUtils
+ *
+ *  String utility functions defined shall provide basic string copying
+ *  capabilities.
+ *
+ *  @author Eric Van Alst, MHPCC
+ *
+ *  @version $Revision: 1.10 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-02-17 19:26:24 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+
+#ifndef PS_STRING_H
+#define PS_STRING_H
+
+#include "psType.h"
+
+/** This macro will convert the argument to a quoted string */
+#define PS_STRING(S)  #S
+
+// Doxygen group tags
+
+/** @addtogroup SysUtils
+ *  @{
+ */
+
+/** Copies the input string
+ *
+ *  This function shall allocate memory to the length of the input string
+ *  plus one and copy the input string to the newly allocated memory.
+ *
+ *  @return char*      Copy of input string
+ *
+ */
+char *psStringCopy(
+    const char *str
+    /**< Input string of characters to copy */
+);
+
+/** Copies the input string up to the specified number of characters
+ *
+ *  This function shall allocate memory to the length specified by nChar
+ *  plus one and copy the input string to the newly allocated memory.
+ *  This function will only copy nChar bytes from the input to new string,
+ *  so if the input string is larger than nChar characters the copied
+ *  string will be a substring of the input string.  If the input string
+ *  is smaller than nChar bytes then the remaining bytes allocated will
+ *  be set to NULL.
+ *
+ *  @return  char* Copy of input string
+ *
+ */
+
+/*@null@*/
+
+char *psStringNCopy(
+    const char *str,
+    /**< Input string of characters to copy */
+
+    psS32 nChar
+    /**< Number of bytes to allocate for string copy */
+);
+
+/* @} */// Doxygen - End of SystemGroup Functions
+
+#endif
Index: /tags/ipp-1-X/bug123/psLib/src/sysUtils/psSysUtilsErrors.dat
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/sysUtils/psSysUtilsErrors.dat	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/sysUtils/psSysUtilsErrors.dat	(revision 22331)
@@ -0,0 +1,50 @@
+#
+#  This file is used to generate psSysUtilsErrors.h content
+#
+#  Format is:
+#  ERRORNAME(one word)    ERROR_TEXT
+#
+#  N.b. The ERRORNAME is exposed in the code as PS_ERR_ERRORNAME, e.g.,
+#  if ERRORNAME=psMemory_NULL_BLOCK, then use PS_ERR_psMemory_NULL_BLOCK in
+#  the code.
+#
+####################################################################
+#
+# Error Messages from psLogMsg.c:
+#
+psLogMsg_DESTINATION_MALFORMED         The specified destination, %s, is malformed.
+psLogMsg_DEST_LOCATION_INVALID         The location, %s, for protocol 'dest' is invalid.
+psLogMsg_OPEN_FILE_FAILED              Could not open file '%s' for output.
+psLogMsg_UNSUPPORTED_PROTOCOL          Do not know how to handle the protocol '%s'.
+psLogMsg_UNKNOWN_KEY                   Unknown logging keyword %c.
+#
+# Error Messages from psMemory.c:
+#
+psMemory_NULL_BLOCK                    NULL memory block found.
+psMemory_DEREF_BLOCK_USE               Memory block %lld was freed but still being used.
+psMemory_UNDERFLOW                     Memory block %lld is corrupted; buffer underflow detected.
+psMemory_OVERFLOW                      Memory block %lld is corrupted; buffer overflow detected.
+psMemory_MULTIPLE_FREE                 Block %lld, allocated at %s:%d, freed multiple times at %s:%d.
+#
+# Error Messages from psString.c:
+#
+psString_NCHAR_NEGATIVE                Can not copy a negative number of characters (%d).
+#
+# Error Messages from psTrace.c:
+#
+psTrace_NULL_SUBCOMPONENT              Sub-component %d of node %s in trace tree is NULL.
+psTrace_NULL_TRACETREE                 Function %s called on a NULL trace level tree.
+psTrace_ADD_NULL_COMPONENT             Failed to add null component to trace tree.
+psTrace_MALFORMED_COMPONENT_NAME       Failed to add '%s' to the root component tree; component must start with '.'.
+psTrace_FAILED_TO_ADD_COMPONENT        Failed to set trace level (%d) to '%s'.
+#
+# Error Messages from psErrorCodes.c
+#
+psErrorCode_NULL_ERRORDESCRIPTION      Specified psErrorDescription pointer can not be NULL.
+psErrorCode_ERRORCODE_REGISTER_FAILED  Failed to add input psErrorDescription at array index %d.
+#
+# Error Messages from psConfigure.c
+#
+psConfigure_INITIALIZATION_FAILED      Failed to initialize %s.
+psConfigure_FINALIZATION_FAILED        Failed to finalize %s.
+
Index: /tags/ipp-1-X/bug123/psLib/src/sysUtils/psSysUtilsErrors.h
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/sysUtils/psSysUtilsErrors.h	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/sysUtils/psSysUtilsErrors.h	(revision 22331)
@@ -0,0 +1,52 @@
+/** @file  psSysUtilsErrors.h
+ *
+ *  @brief Contains the error text for the system utility functions
+ *
+ *  @ingroup ErrorHandling
+ *
+ *  @author Robert DeSonia, MHPCC
+ *
+ *  @version $Revision: 1.15 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-02-17 19:26:24 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+
+#ifndef PS_SYSUTILS_ERRORS_H
+#define PS_SYSUTILS_ERRORS_H
+
+/* N.B., lines between '//~Start' and '//~End' are automatic generated from
+ * the template following the '//~Start'.  The template is used to generate
+ * the other lines by, for each error text in psSysUtilsErrors.dat, the following
+ * substitutions are made:
+ *     $1  The error text macro name (first word in the psSysUtilsErrors.dat lines)
+ *     $2  The error text (rest of the line in psSysUtilsErrors.dat)
+ *     $n  The order of the source line in psSysUtilsErrors.dat (comments excluded)
+ * 
+ * DO NOT EDIT THE LINES BETWEEN //~Start and //~End!  ANY CHANGES WILL BE OVERWRITTEN.
+ */
+
+//~Start #define PS_ERRORTEXT_$1 "$2"
+#define PS_ERRORTEXT_psLogMsg_DESTINATION_MALFORMED "The specified destination, %s, is malformed."
+#define PS_ERRORTEXT_psLogMsg_DEST_LOCATION_INVALID "The location, %s, for protocol 'dest' is invalid."
+#define PS_ERRORTEXT_psLogMsg_OPEN_FILE_FAILED "Could not open file '%s' for output."
+#define PS_ERRORTEXT_psLogMsg_UNSUPPORTED_PROTOCOL "Do not know how to handle the protocol '%s'."
+#define PS_ERRORTEXT_psLogMsg_UNKNOWN_KEY "Unknown logging keyword %c."
+#define PS_ERRORTEXT_psMemory_NULL_BLOCK "NULL memory block found."
+#define PS_ERRORTEXT_psMemory_DEREF_BLOCK_USE "Memory block %lld was freed but still being used."
+#define PS_ERRORTEXT_psMemory_UNDERFLOW "Memory block %lld is corrupted; buffer underflow detected."
+#define PS_ERRORTEXT_psMemory_OVERFLOW "Memory block %lld is corrupted; buffer overflow detected."
+#define PS_ERRORTEXT_psMemory_MULTIPLE_FREE "Block %lld, allocated at %s:%d, freed multiple times at %s:%d."
+#define PS_ERRORTEXT_psString_NCHAR_NEGATIVE "Can not copy a negative number of characters (%d)."
+#define PS_ERRORTEXT_psTrace_NULL_SUBCOMPONENT "Sub-component %d of node %s in trace tree is NULL."
+#define PS_ERRORTEXT_psTrace_NULL_TRACETREE "Function %s called on a NULL trace level tree."
+#define PS_ERRORTEXT_psTrace_ADD_NULL_COMPONENT "Failed to add null component to trace tree."
+#define PS_ERRORTEXT_psTrace_MALFORMED_COMPONENT_NAME "Failed to add '%s' to the root component tree; component must start with '.'."
+#define PS_ERRORTEXT_psTrace_FAILED_TO_ADD_COMPONENT "Failed to set trace level (%d) to '%s'."
+#define PS_ERRORTEXT_psErrorCode_NULL_ERRORDESCRIPTION "Specified psErrorDescription pointer can not be NULL."
+#define PS_ERRORTEXT_psErrorCode_ERRORCODE_REGISTER_FAILED "Failed to add input psErrorDescription at array index %d."
+#define PS_ERRORTEXT_psConfigure_INITIALIZATION_FAILED "Failed to initialize %s."
+#define PS_ERRORTEXT_psConfigure_FINALIZATION_FAILED "Failed to finalize %s."
+//~End
+
+#endif
Index: /tags/ipp-1-X/bug123/psLib/src/sysUtils/psTrace.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/sysUtils/psTrace.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/sysUtils/psTrace.c	(revision 22331)
@@ -0,0 +1,539 @@
+/** @file psTrace.c
+ *  \brief basic run-time trace facilities
+ *  \ingroup LogTrace
+ *
+ *  This file will hold the code for procedures to insert
+ *  trace messages into the code.
+ *
+ *  @author Robert Lupton, Princeton University
+ *  @author GLG, MHPCC
+ *
+ *  @version $Revision: 1.45 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-04-07 20:27:41 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+
+/*****************************************************************************
+    NOTES:
+ In the SRD, higher trace levels correspond to a numerically lower trace
+ value in the code.  This is a bit confusing.  For example, a high-level
+ message might be something like "Begin Processing".  The module programmer
+ might give that a numerically low trace level, such as 1, so then any
+ non-zero trace level in that code component will display thatmessage.
+ 
+ We build a tree of trace components.  Every node in the tree has a
+ depth, which is it's distance from the root.  However, this is not
+ not the same thing as a node's "level", which corresponds to the
+ trace level of that node.
+ 
+I think the following is the correct behavior, but not sure:
+    PS_UNKNOWN_TRACE_LEVEL: We never set the level of a component to this
+    value.  This value is only used when psTraceGetLevel is called with
+    a bad component name, or if the component root is undefined, I think.
+ 
+    PS_DEFAULT_TRACE_LEVEL: This should only be used when adding the
+    intermediate components of a psS64 name.  Ie. the "B" in .A.B.C
+ 
+ *****************************************************************************/
+
+#ifndef PS_NO_TRACE
+
+#include <unistd.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdarg.h>
+#include "psMemory.h"
+#include "psTrace.h"
+#include "psString.h"
+#include "psError.h"
+#include "psLogMsg.h"
+
+#include "psSysUtilsErrors.h"
+
+static p_psComponent* cRoot = NULL; // The root of the trace component
+static FILE *traceFP = NULL;        // File destination for messages.
+
+static void componentFree(p_psComponent* comp);
+static p_psComponent* componentAlloc(const char *name, psS32 level);
+
+/*****************************************************************************
+componentAlloc(): allocate memory for a new node, and initialize members.
+ *****************************************************************************/
+static p_psComponent* componentAlloc(const char *name, psS32 level)
+{
+    p_psComponent* comp = psAlloc(sizeof(p_psComponent));
+
+    p_psMemSetPersistent(comp,true);
+    psMemSetDeallocator(comp, (psFreeFcn) componentFree);
+    comp->name = psStringCopy(name);
+    p_psMemSetPersistent((psPtr)comp->name,true);
+    comp->level = level;
+    comp->n = 0;
+    comp->p_psSpecified = false;
+    comp->subcomp = NULL;
+    return comp;
+}
+
+/*****************************************************************************
+componentFree(): free the current node in the root tree, and all children
+nodes as well.
+ *****************************************************************************/
+static void componentFree(p_psComponent* comp)
+{
+    if (comp == NULL) {
+        return;
+    }
+
+    if (comp->subcomp != NULL) {
+        for (psS32 i = 0; i < comp->n; i++) {
+            p_psMemSetPersistent(comp->subcomp[i],false);
+            psFree(comp->subcomp[i]);
+        }
+        p_psMemSetPersistent(comp->subcomp,false);
+        psFree(comp->subcomp);
+    }
+
+    p_psMemSetPersistent((psPtr)comp->name,false);
+    psFree((psPtr)comp->name);
+}
+
+/*****************************************************************************
+initTrace(): simply initialize the component root tree.
+*****************************************************************************/
+static void initTrace(void)
+{
+    if (cRoot == NULL) {
+        cRoot = componentAlloc(".", PS_DEFAULT_TRACE_LEVEL);
+    }
+}
+
+/*****************************************************************************
+Set all trace levels to zero.
+ 
+XXX: Currently, no function calls this routine.
+ *****************************************************************************/
+void p_psTraceReset(p_psComponent* currentNode)
+{
+    psS32 i = 0;
+
+    if (NULL == currentNode) {
+        return;
+    }
+
+    currentNode->level = 0;
+    for (i = 0; i < currentNode->n; i++) {
+        if (NULL == currentNode->subcomp[i]) {
+            psLogMsg("p_psTraceReset", PS_LOG_WARN,
+                     PS_ERRORTEXT_psTrace_NULL_SUBCOMPONENT,
+                     i, currentNode->name);
+        } else {
+            p_psTraceReset(currentNode->subcomp[i]);
+        }
+    }
+    return;
+}
+
+/*****************************************************************************
+Set all trace levels to zero.
+ *****************************************************************************/
+void psTraceReset()
+{
+    psFree(cRoot);
+    cRoot = NULL;
+}
+
+/*****************************************************************************
+componentAdd(): Adds the component named "addNodeName" to the root tree.
+ *****************************************************************************/
+static psBool componentAdd(const char *addNodeName, psS32 level)
+{
+    psS32 i = 0;                        // Loop index variable.
+    char name[strlen(addNodeName) + 1]; // buffer for writeable copy.
+    char *pname = name;
+    char *firstComponent = NULL;        // first component of name
+    p_psComponent* currentNode = cRoot;
+    psS32 nodeExists = 0;
+
+    // XXX: Verify that this is the correct behavior.
+    if (strcmp("", addNodeName) == 0) {
+        psError(PS_ERR_BAD_PARAMETER_NULL,true,
+                PS_ERRORTEXT_psTrace_ADD_NULL_COMPONENT);
+        return false;
+    }
+
+    // Is this the root node? If so, simply set level and return.
+    if (strcmp(".", addNodeName) == 0) {
+        cRoot->level = level;
+        return true;
+    }
+
+    if (addNodeName[0] != '.') {
+        psError(PS_ERR_BAD_PARAMETER_VALUE,true,
+                PS_ERRORTEXT_psTrace_MALFORMED_COMPONENT_NAME,
+                addNodeName);
+        return false;
+    }
+
+    strcpy(name, addNodeName);
+    pname = name+1;
+    // Iterate through the components of addNodeName.  Strip off the first
+    // component of the name, find that in the root tree, or add it if it
+    // does not exist, then move to the next component in the name.
+
+    while (pname != NULL) {
+        firstComponent = pname;
+        pname = strchr(firstComponent, '.');
+        if (pname != NULL) {
+            *pname = '\0';
+            pname++;
+        }
+        nodeExists = 0;
+        for (i = 0; i < currentNode->n; i++) {
+            if (strcmp(currentNode->subcomp[i]->name, firstComponent) == 0) {
+                currentNode = currentNode->subcomp[i];
+                nodeExists = 1;
+                if (pname == NULL) {
+                    currentNode->level = level;
+                }
+            }
+        }
+
+        if (nodeExists == 0) {
+            currentNode->subcomp = psRealloc(currentNode->subcomp,
+                                             (currentNode->n + 1) * sizeof(p_psComponent* ));
+            p_psMemSetPersistent(currentNode->subcomp,true);
+
+            currentNode->n = (currentNode->n) + 1;
+
+            if (pname == NULL) {
+                // This is the final component to add.
+                currentNode->subcomp[(currentNode->n) - 1] = componentAlloc(firstComponent, level);
+            } else {
+                // We are adding an intermediate component.  The trace level
+                // is not defined.  An undefined trace level inherits the
+                // trace level of it's parent.  However, we do not set that
+                // specifically here since that would inheritance to be a
+                // static, one-time, type of behavior.
+
+                currentNode->subcomp[(currentNode->n) - 1] = componentAlloc(firstComponent, PS_DEFAULT_TRACE_LEVEL);
+            }
+            currentNode = currentNode->subcomp[(currentNode->n) - 1];
+        }
+    }
+
+    return true;
+}
+
+/*****************************************************************************
+    psSetTraceLevel(): add the component named "comp" to the component tree,
+ if it is not already there, and set it's trace level to "level".
+ 
+    NOTE: We modified this so that the user may omit the leading "," in a
+    component name.  Since the code was already implemented assuming the "."
+    was required, rather than change all that code, in this function, I
+    simply add a leading "." to the component name if there is none.
+ 
+    Input:
+ comp
+ level
+    Output:
+ none
+    Returns:
+ zero
+*****************************************************************************/
+psBool psTraceSetLevel(const char *comp,   // component of interest
+                       psS32 level)  // desired trace level
+{
+    char *compName = NULL;
+
+    // If the root component tree does not exist, then initialize it.
+    if (cRoot == NULL) {
+        initTrace();
+    }
+
+    // If the component name has no leading dot, then supply it.
+    if (comp[0] != '.') {
+        compName = (char *) psAlloc(10 + strlen(comp));
+        strcpy(compName, ".");
+        compName = strcat(compName, comp);
+    } else {
+        compName = (char *) comp;
+    }
+
+    // Add the new component to the component tree.
+    if ( !componentAdd(compName, level) ) {
+        psError(PS_ERR_UNKNOWN, false,
+                PS_ERRORTEXT_psTrace_FAILED_TO_ADD_COMPONENT,
+                level,
+                compName);
+
+        if (comp[0] != '.') {
+            psFree(compName);
+        }
+        return false;
+    }
+
+    if (comp[0] != '.') {
+        psFree(compName);
+    }
+
+    return true;
+}
+
+/*****************************************************************************
+    doGetTraceLevel()
+ This function recursively searches the root component tree for the
+ component named "name", which is supplied by a parameter.  If it
+ finds that component, it returns the level of that component.
+ Otherwise, it returns ???.
+ 
+    NOTE: We modified this so that the user may omit the leading "," in a
+    component name.  Since the code was already implemented assuming the "."
+    was required, rather than change all that code, in this function, I
+    simply add a leading "." to the component name if there is none.
+ 
+    Inputs:
+ name:
+    Outputs:
+ none
+    Returns:
+ The trace level of the "name" component.
+ *****************************************************************************/
+static psS32 doGetTraceLevel(const char *aname)
+{
+    char name[strlen(aname) + 1];       // need a writeable copy: for strsep()
+    char *pname = name;
+    char *firstComponent = NULL;        // first component of name
+    p_psComponent* currentNode = cRoot;
+    psS32 i = 0;
+    psS32 defaultLevel = 0;
+
+    if (NULL == currentNode) {
+        return (PS_UNKNOWN_TRACE_LEVEL);
+    }
+
+    if (strcmp(".", aname) == 0) {
+        return (cRoot->level);
+    }
+
+    if (aname[0] != '.') {
+        return (PS_UNKNOWN_TRACE_LEVEL);
+    }
+
+    defaultLevel = cRoot->level;
+    strcpy(name, aname);
+    pname = name+1;
+    while (pname != NULL) {
+        firstComponent = pname;
+        pname = strchr(firstComponent, '.');
+        if (pname != NULL) {
+            *pname = '\0';
+            pname++;
+        }
+        for (i = 0; i < currentNode->n; i++) {
+            if (NULL == currentNode->subcomp[i]) {
+                psLogMsg("p_psTraceReset", PS_LOG_WARN,
+                         PS_ERRORTEXT_psTrace_NULL_SUBCOMPONENT,
+                         i, currentNode->name);
+            }
+
+            if (strcmp(currentNode->subcomp[i]->name, firstComponent) == 0) {
+                currentNode = currentNode->subcomp[i];
+                // For level inheritance purpose, we save the level of this
+                // component if it is not DEFAULT.
+                if (currentNode->level != PS_DEFAULT_TRACE_LEVEL) {
+                    defaultLevel = currentNode->level;
+                }
+                // Determine if this is the last component:
+                if (pname == NULL) {
+                    if (currentNode->level != PS_DEFAULT_TRACE_LEVEL) {
+                        return (currentNode->level);
+                    } else {
+                        return(defaultLevel);
+                    }
+                }
+            }
+        }
+    }
+    return(defaultLevel);
+}
+
+/*****************************************************************************
+    psTraceLevelGet()
+ Return a trace level of "name" in the root component tree.  If the
+ exact string of components in "name" does not exist in the root
+ tree, we return the deepest level of the match.
+    Input:
+ name
+    Output:
+ none
+    Return:
+ The level of "name" in the root component tree.
+ *****************************************************************************/
+psS32 psTraceGetLevel(const char *name)
+{
+    char *compName = NULL;
+    psS32 traceLevel;
+
+    if (cRoot == NULL) {
+        return (PS_UNKNOWN_TRACE_LEVEL);
+    }
+
+    // If the component name has no leading dot, then supply it.
+    if (name[0] != '.') {
+        compName = (char *) psAlloc(10 + strlen(name));
+        strcpy(compName, ".");
+        compName = strcat(compName, name);
+        traceLevel = doGetTraceLevel(compName);
+        psFree(compName);
+    } else {
+        // Search the component root tree, determine the trace level.
+        traceLevel = doGetTraceLevel(name);
+    }
+
+    // XXX: The default trace level is currently set at -1, which is not a
+    // valid trace level.  This is convenient in determining whether or not
+    // a component should inherit the trace level from parent nodes.  However,
+    // it's not clear that -1 should ever be returned by this function.
+    // The SDR is unclear on this point and we should probably request IfA
+    // comment.
+    if (traceLevel == PS_DEFAULT_TRACE_LEVEL) {
+        traceLevel = PS_THE_OTHER_DEFAULT_TRACE_LEVEL;
+    }
+
+    return(traceLevel);
+}
+
+/*****************************************************************************
+    doPrintTraceLevels()
+ This function recursively searches the component tree supplied by the
+ parameter "comp" and prints the name and level of each component.
+    Inputs:
+ comp: a node in the component tree.
+ level: the level of that node
+    Outputs:
+ none
+    Returns:
+ null
+ *****************************************************************************/
+static void doPrintTraceLevels(const p_psComponent* comp,
+                               psS32 depth,
+                               psS32 defLevel)
+{
+    psS32 i = 0;
+
+    if (comp->name[0] == '\0') {
+        return;
+    } else {
+        if (comp->level == PS_DEFAULT_TRACE_LEVEL) {
+            if (traceFP == NULL) {
+                printf("%*s%-*s %d\n", depth, "", 20 - depth, comp->name,
+                       defLevel);
+            } else {
+                fprintf(traceFP,"%*s%-*s %d\n", depth, "", 20 - depth, comp->name,
+                        defLevel);
+            }
+        } else {
+            if (traceFP == NULL) {
+                printf("%*s%-*s %d\n", depth, "", 20 - depth, comp->name,
+                       comp->level);
+            } else {
+                fprintf(traceFP, "%*s%-*s %d\n", depth, "", 20 - depth, comp->name,
+                        comp->level);
+            }
+        }
+    }
+
+    for (i = 0; i < comp->n; i++) {
+        if (comp->level == PS_DEFAULT_TRACE_LEVEL) {
+            doPrintTraceLevels(comp->subcomp[i], depth + 1, defLevel);
+        } else {
+            doPrintTraceLevels(comp->subcomp[i], depth + 1, comp->level);
+        }
+    }
+}
+
+
+/*****************************************************************************
+psPrintTraceLevels(): Simply print all the trace levels in the trace level
+component tree.
+Inputs:
+ none
+Outputs:
+ none
+Returns:
+ null
+*****************************************************************************/
+void psTracePrintLevels(void)
+{
+    if (cRoot == NULL) {
+        return;
+    }
+
+    doPrintTraceLevels(cRoot, 0, PS_THE_OTHER_DEFAULT_TRACE_LEVEL);
+}
+
+/*****************************************************************************
+p_psTrace(): we display the trace message to standard output if the trace
+level of that message, supplied by the parameter "level" is higher than the
+trace level that is currently associated with the component named by the
+parameter "comp".
+Input:
+ comp
+ level
+ ...  a printf-style output string.
+Output:
+ none
+Return:
+ null
+ *****************************************************************************/
+void p_psTrace(const char *comp,        // component being traced
+               psS32 level,       // desired trace level
+               ...)             // arguments
+{
+    char *fmt = NULL;
+    va_list ap;
+    psS32 i = 0;
+
+    if (NULL == comp) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psTrace_NULL_TRACETREE,
+                __func__);
+        return;
+    }
+    // Only display this message if it's trace level is less than the level
+    // of it's associatedcomponent.
+    if (level <= psTraceGetLevel(comp)) {
+        va_start(ap, level);
+
+        // The following functions get the variable list of parameters with
+        // which this function was called, and print them to the standard
+        // output.
+        fmt = va_arg(ap, char *);
+
+        if (traceFP != NULL) {
+            // We indent each message one space for each level of the message.
+            for (i = 0; i < level; i++) {
+                fprintf(traceFP, " ");
+            }
+            vfprintf(traceFP, fmt, ap);
+        } else {
+            // We indent each message one space for each level of the message.
+            for (i = 0; i < level; i++) {
+                putchar(' ');
+            }
+            vprintf(fmt, ap);
+        }
+        va_end(ap);
+    }
+    // NOTE: should we free *fmt as well? Read the man page.
+}
+
+void psTraceSetDestination(FILE * fp)
+{
+    traceFP = fp;
+}
+
+#endif
Index: /tags/ipp-1-X/bug123/psLib/src/sysUtils/psTrace.h
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/sysUtils/psTrace.h	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/sysUtils/psTrace.h	(revision 22331)
@@ -0,0 +1,100 @@
+/** @file psTrace.h
+ *  \brief basic run-time trace facilities
+ *  \ingroup LogTrace
+ *
+ *  This file will hold the prototypes for defining procedures to insert
+ *  trace messages into the code.
+ *
+ *  @author Robert Lupton, Princeton University
+ *  @author GLG, MHPCC
+ *
+ *  @version $Revision: 1.31 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-02-17 19:26:24 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+#if !defined(PS_TRACE_H)
+#define PS_TRACE_H 1
+
+#define PS_UNKNOWN_TRACE_LEVEL -9999   // we don't know this name's level
+#define PS_DEFAULT_TRACE_LEVEL -1
+#define PS_THE_OTHER_DEFAULT_TRACE_LEVEL 0
+
+/** \addtogroup LogTrace
+ *  \{
+ */
+
+/** Functions **************************************************************/
+
+//#define PS_NO_TRACE 1   ///< to turn off all tracing
+
+#if defined(PS_NO_TRACE)
+#        define psTrace(facil, level, ...) (void)0
+/* do nothing */
+#        define p_psTrace(facil, level, ...)  (void)0
+/* do nothing */
+#        define psTraceSetLevel(facil,level) 0
+#        define psTraceGetLevel(facil) 0
+#        define psTraceReset() (void)0     /* do nothing */
+#        define psTraceFree() (void)0      /* do nothing */
+#        define psTracePrintLevels() (void)0
+/* do nothing */
+#        define psTraceSetDestination(fp) (void)0
+/* do nothing */
+#    else
+
+    /** Basic structure for the component tree.  A component is a string of the
+        form aaa.bbb.ccc, and may itself contain further subcomponents.  The
+        Component structure doesn't in fact contain it's full name, but only the
+        last part. */
+    typedef struct p_psComponent
+    {
+        const char *name;           // last part of name of component
+        psS32 level;                  // trace level for this component
+        bool p_psSpecified;
+        psS32 n;                      // number of subcomponents
+        struct p_psComponent* *subcomp;     // next level of subcomponents
+    }
+p_psComponent;
+
+#ifdef DOXYGEN
+void psTrace(const char *facil,        ///< facilty of interest
+             psS32 myLevel,            ///< desired trace level
+             ...)                      ///< trace message arguments
+;
+#else
+/// Send a trace message
+void p_psTrace(const char *facil,      ///< facilty of interest
+               psS32 myLevel,          ///< desired trace level
+               ...)                    ///< trace message arguments
+;
+
+#ifndef SWIG
+#define psTrace(facil, level, ...) p_psTrace(facil, level, __VA_ARGS__)
+#endif
+
+#endif
+
+/// Set trace level
+psBool psTraceSetLevel(const char *facil,     ///< facilty of interest
+                       psS32 level)     ///< desired trace level
+;
+
+/// Get the trace level
+psS32 psTraceGetLevel(const char *facil)     ///< facilty of interest
+;
+
+/// Set all trace levels to zero (do not free nodes in the component tree).
+void psTraceReset();
+
+/// print trace levels
+void psTracePrintLevels(void);
+
+/// Set the destination of future trace messages.
+void psTraceSetDestination(FILE * fp);
+
+/* \} */// End of SystemGroup Functions
+
+#endif
+
+#endif
Index: /tags/ipp-1-X/bug123/psLib/src/sysUtils/psType.h
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/sysUtils/psType.h	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/sysUtils/psType.h	(revision 22331)
@@ -0,0 +1,245 @@
+/** @file  psType.h
+*
+*  @brief Contains support for basic types
+*
+*  This file defines common datatypes used throughout psLib.
+*
+*  @ingroup DataContainer
+*
+*  @author Robert DeSonia, MHPCC
+*  @author Ross Harman, MHPCC
+*
+*  @version $Revision: 1.32 $ $Name: not supported by cvs2svn $
+*  @date $Date: 2005-04-06 01:12:58 $
+*
+*  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+*/
+
+#ifndef PS_TYPE_H
+#define PS_TYPE_H
+
+#include <complex.h>
+#include <stdint.h>
+#include <float.h>
+#include <stdbool.h>
+
+/// @addtogroup DataContainer
+/// @{
+
+/******************************************************************************/
+
+/*  TYPE DEFINITIONS                                                          */
+
+/******************************************************************************/
+
+/** Basic data types used by the containers.
+ *
+ * The basic types of the primitives used by psLib are defined within this enum. This enum is in turn used by
+ * the psType struct.
+ *
+ */
+
+typedef uint8_t psU8;                  ///< 8-bit unsigned int
+typedef uint16_t psU16;                ///< 16-bit unsigned int
+typedef uint32_t psU32;                ///< 32-bit unsigned int
+typedef uint64_t psU64;                ///< 64-bit unsigned int
+typedef int8_t psS8;                   ///< 8-bit signed int
+typedef int16_t psS16;                 ///< 16-bit signed int
+typedef int32_t psS32;                 ///< 32-bit signed int
+typedef int64_t psS64;                 ///< 64-bit signed int
+typedef float psF32;                   ///< 32-bit floating point
+typedef double psF64;                  ///< 64-bit floating point
+
+#ifdef SWIG
+typedef struct
+{
+    float re, im;
+}
+psC32;
+typedef struct
+{
+    double re,im;
+}
+psC64;
+#else
+typedef float _Complex psC32;          ///< complex with 32-bit floating point Real and Imagary numbers
+typedef double _Complex psC64;         ///< complex with 64-bit floating point Real and Imagary numbers
+#endif
+
+typedef void* psPtr;                   ///< void pointer
+typedef bool psBool;                   ///< boolean value
+
+typedef enum {
+    PS_TYPE_S8   = 0x0101,             ///< Character.
+    PS_TYPE_S16  = 0x0102,             ///< Short integer.
+    PS_TYPE_S32  = 0x0104,             ///< Integer.
+    PS_TYPE_S64  = 0x0108,             ///< Long integer.
+    PS_TYPE_U8   = 0x0301,             ///< Unsigned character.
+    PS_TYPE_U16  = 0x0302,             ///< Unsigned psS16 integer.
+    PS_TYPE_U32  = 0x0304,             ///< Unsigned integer.
+    PS_TYPE_U64  = 0x0308,             ///< Unsigned psS64 integer.
+    PS_TYPE_F32  = 0x0404,             ///< Single-precision Floating point.
+    PS_TYPE_F64  = 0x0408,             ///< Double-precision floating point.
+    PS_TYPE_C32  = 0x0808,             ///< Complex numbers consisting of single-precision floating point.
+    PS_TYPE_C64  = 0x0810,             ///< Complex numbers consisting of double-precision floating point.
+    PS_TYPE_BOOL = 0x1301              ///< Boolean.
+} psElemType;
+
+#define PS_TYPE_MASK PS_TYPE_U8        /**< the psElemType to use for mask image */
+#define PS_TYPE_MASK_DATA U8           /**< the data member to use for mask image */
+#define PS_TYPE_MASK_NAME "psU8"       /**< the data type for mask as a string */
+
+typedef psU8 psMaskType;               ///< the C datatype for a mask image
+typedef psBool psBOOL;                 ///< allow psBOOL to be used instead of psBool (for macros)
+
+#define PS_MIN_S8        INT8_MIN      /**< minimum valid psS8 value */
+#define PS_MIN_S16       INT16_MIN     /**< minimum valid psS16 value */
+#define PS_MIN_S32       INT32_MIN     /**< minimum valid psS32 value */
+#define PS_MIN_S64       INT64_MIN     /**< minimum valid psS64 value */
+#define PS_MIN_U8        0             /**< minimum valid psU8 value */
+#define PS_MIN_U16       0             /**< minimum valid psU16 value */
+#define PS_MIN_U32       0             /**< minimum valid psU32 value */
+#define PS_MIN_U64       0             /**< minimum valid psU64 value */
+#define PS_MIN_F32       -FLT_MAX      /**< minimum valid psF32 value */
+#define PS_MIN_F64       -DBL_MAX      /**< minimum valid psF64 value */
+#define PS_MIN_C32       -FLT_MAX      /**< minimum valid real or imaginary psC32 value */
+#define PS_MIN_C64       -DBL_MAX      /**< minimum valid real or imaginary psC32 value */
+
+#define PS_MAX_S8        INT8_MAX      /**< maximum valid psS8 value */
+#define PS_MAX_S16       INT16_MAX     /**< maximum valid psS16 value */
+#define PS_MAX_S32       INT32_MAX     /**< maximum valid psS32 value */
+#define PS_MAX_S64       INT64_MAX     /**< maximum valid psS64 value */
+#define PS_MAX_U8        UINT8_MAX     /**< maximum valid psU8 value */
+#define PS_MAX_U16       UINT16_MAX    /**< maximum valid psU16 value */
+#define PS_MAX_U32       UINT32_MAX    /**< maximum valid psU32 value */
+#define PS_MAX_U64       UINT64_MAX    /**< maximum valid psU64 value */
+#define PS_MAX_F32       FLT_MAX       /**< maximum valid psF32 value */
+#define PS_MAX_F64       DBL_MAX       /**< maximum valid psF64 value */
+#define PS_MAX_C32       FLT_MAX       /**< maximum valid real or imaginary psC32 value */
+#define PS_MAX_C64       DBL_MAX       /**< maximum valid real or imaginary psC32 value */
+
+#define PS_TYPE_BOOL_NAME "psBool"
+#define PS_TYPE_S8_NAME   "psS8"
+#define PS_TYPE_S16_NAME  "psS16"
+#define PS_TYPE_S32_NAME  "psS32"
+#define PS_TYPE_S64_NAME  "psS64"
+#define PS_TYPE_U8_NAME   "psU8"
+#define PS_TYPE_U16_NAME  "psU16"
+#define PS_TYPE_U32_NAME  "psU32"
+#define PS_TYPE_U64_NAME  "psU64"
+#define PS_TYPE_F32_NAME  "psF32"
+#define PS_TYPE_F64_NAME  "psF64"
+#define PS_TYPE_C32_NAME  "psC32"
+#define PS_TYPE_C64_NAME  "psC64"
+
+#define PS_TYPE_NAME(value,type) \
+switch(type) { \
+case PS_TYPE_BOOL: \
+    value = PS_TYPE_BOOL_NAME; \
+    break; \
+case PS_TYPE_S8: \
+    value = PS_TYPE_S8_NAME; \
+    break; \
+case PS_TYPE_S16: \
+    value = PS_TYPE_S16_NAME; \
+    break; \
+case PS_TYPE_S32: \
+    value = PS_TYPE_S32_NAME; \
+    break; \
+case PS_TYPE_S64: \
+    value = PS_TYPE_S64_NAME; \
+    break; \
+case PS_TYPE_U8: \
+    value = PS_TYPE_U8_NAME; \
+    break; \
+case PS_TYPE_U16: \
+    value = PS_TYPE_U16_NAME; \
+    break; \
+case PS_TYPE_U32: \
+    value = PS_TYPE_U32_NAME; \
+    break; \
+case PS_TYPE_U64: \
+    value = PS_TYPE_U64_NAME; \
+    break; \
+case PS_TYPE_F32: \
+    value = PS_TYPE_F32_NAME; \
+    break; \
+case PS_TYPE_F64: \
+    value = PS_TYPE_F64_NAME; \
+    break; \
+case PS_TYPE_C32: \
+    value = PS_TYPE_C32_NAME; \
+    break; \
+case PS_TYPE_C64: \
+    value = PS_TYPE_C64_NAME; \
+    break; \
+default: \
+    value = "unknown"; \
+};
+
+/// Macro to get the bad pixel reason code (stored as part of mask value)
+#define PS_BADPIXEL_BITMASK 0x0f
+#define PS_GET_BADPIXEL(maskValue) (maskValue & PS_BADPIXEL_BITMASK)
+
+#define PS_IS_BADPIXEL(maskValue) (PS_GET_BADPIXEL(maskValue) != 0)
+
+/// Macro to apply a bad pixel reason code to mask image
+#define PS_SET_BADPIXEL(maskValue, reasonCode) \
+{ \
+    maskValue = (psMaskType)((reasonCode & PS_BADPIXEL_BITMASK) | (maskValue & ~PS_BADPIXEL_BITMASK)); \
+}
+
+/// Macro to determine if the psElemType is an integer.
+#define PS_IS_PSELEMTYPE_INT(x) ((x & 0x100) == 0x100)
+/// Macro to determine if the psElemType is unsigned.
+#define PS_IS_PSELEMTYPE_UNSIGNED(x) ((x & 0x200) == 0x200)
+/// Macro to determine if the psElemType is a real (non-complex) floating-point type.
+#define PS_IS_PSELEMTYPE_REAL(x) ((x & 0x400) == 0x400)
+/// Macro to determine if the psElemType is complex number type.
+#define PS_IS_PSELEMTYPE_COMPLEX(x) ((x & 0x800) == 0x800)
+/// Macro to determine if the psElemType is boolean type.
+#define PS_IS_PSELEMTYPE_BOOL(x) ((x & 0x1000) == 0x1000)
+/// Macro to determine the storage size, in bytes, of the psElemType.
+#define PSELEMTYPE_SIZEOF(x) (x & 0xFF)
+
+/** Dimensions of a data type.
+ *
+ * The dimensions of containers used by psLib are defined within this enum. This enum is used by the psType
+struct. *
+ */
+typedef enum {
+    PS_DIMEN_SCALAR,            ///< Scalar.
+    PS_DIMEN_VECTOR,            ///< Vector.
+    PS_DIMEN_TRANSV,            ///< Transposed vector.
+    PS_DIMEN_IMAGE,             ///< Image.
+    PS_DIMEN_OTHER              ///< Something else that's not supported for arithmetic.
+} psDimen;
+
+/** The type of a data type.
+ *
+ * All psLib complex types consist of primitive components. This struct provides the description of those
+ * primitives.
+ *
+ */
+typedef struct
+{
+    psElemType type;            ///< Primitive type.
+    psDimen dimen;              ///< Dimensionality.
+}
+psType;
+
+/** The type of a basic data type
+ *
+ *  All psLib complex types consist of primitive components.  This structure provides the ability to cast
+ *  an unknown data structure to safely test the underlining data type.
+ *
+ */
+typedef struct
+{
+    psType  type;              ///< Data type information
+}
+psMath;
+
+/// @}
+
+#endif
Index: /tags/ipp-1-X/bug123/psLib/src/sysUtils/sysUtils.i
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/sysUtils/sysUtils.i	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/sysUtils/sysUtils.i	(revision 22331)
@@ -0,0 +1,49 @@
+/* sysUtils */
+%include "psType.h"
+%include "psAbort.h"
+%include "psConfigure.h"
+%include "psErrorCodes.h"
+%include "psError.h"
+%include "psLogMsg.h"
+%include "psMemory.h"
+%include "psString.h"
+%include "psTrace.h"
+
+%inline %{
+
+psErrorCode psError(psErrorCode code, psBool new, const char* msg) {
+    return p_psError("UNKNOWN",0,"SWIG",code,new,msg);
+}
+
+psPtr psAlloc(size_t size) {
+    return p_psAlloc(size,"UNKNOWN",0);
+}
+
+psPtr psRealloc(psPtr ptr, size_t size) {
+    return p_psRealloc(ptr,size,"UNKNOWN",0);
+}
+
+void psFree(psPtr ptr) {
+    p_psFree(ptr,"UNKNOWN",0);
+}
+
+psPtr psMemIncrRefCounter(psPtr vptr) {
+    return p_psMemIncrRefCounter(vptr,"UNKNOWN",0);
+}
+
+psPtr psMemDecrRefCounter(psPtr vptr) {
+    return p_psMemDecrRefCounter(vptr,"UNKNOWN",0);
+}
+
+void psTrace(const char* facil, psS32 myLevel, const char* msg) {
+    p_psTrace(facil, myLevel, msg);
+}
+
+psS32 psMemCheckLeaksToStderr(psMemoryId id0, psMemBlock*** arr, psBool persistence) {
+    return psMemCheckLeaks(id0, arr, stderr, persistence);
+}
+psS32 psMemCheckLeaksToStdout(psMemoryId id0, psMemBlock*** arr, psBool persistence) {
+    return psMemCheckLeaks(id0, arr, stdout, persistence);
+}
+
+%}
Index: /tags/ipp-1-X/bug123/psLib/src/types/psArray.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/types/psArray.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/types/psArray.c	(revision 22331)
@@ -0,0 +1,207 @@
+
+/** @file  psArray.c
+ *
+ *  @brief Contains support for basic vector types
+ *
+ *  This file defines the basic type for a vector struct and functions useful
+ *  in manupulating vectors.
+ *
+ *  @author Ross Harman, MHPCC
+ *
+ *  @version $Revision: 1.27 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-04-07 20:27:41 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+
+/******************************************************************************/
+
+/*  INCLUDE FILES                                                             */
+
+/******************************************************************************/
+#include<stdlib.h>                         // for qsort, etc.
+#include<string.h>
+
+#include "psMemory.h"
+#include "psError.h"
+#include "psArray.h"
+#include "psLogMsg.h"
+
+#include "psCollectionsErrors.h"
+
+/*****************************************************************************
+  FUNCTION IMPLEMENTATION - LOCAL
+ *****************************************************************************/
+static void arrayFree(psArray* psArr);
+
+static void arrayFree(psArray* psArr)
+{
+    if (psArr == NULL) {
+        return;
+    }
+
+    psArrayElementFree(psArr);
+
+    psFree(psArr->data);
+}
+
+/*****************************************************************************
+  FUNCTION IMPLEMENTATION - PUBLIC
+ *****************************************************************************/
+psArray* psArrayAlloc(psU32 nalloc)
+{
+    psArray* psArr = NULL;
+
+    // Create vector struct
+    psArr = (psArray* ) psAlloc(sizeof(psArray));
+    psMemSetDeallocator(psArr, (psFreeFcn) arrayFree);
+
+    psArr->nalloc = nalloc;
+    psArr->n = nalloc;
+
+    // Create vector data array
+    psArr->data = psAlloc(nalloc * sizeof(psPtr));
+
+    return psArr;
+}
+
+psArray* psArrayRealloc(psArray* in, psU32 nalloc)
+{
+    if (in == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL,true,PS_ERRORTEXT_psArray_REALLOC_NULL);
+        return NULL;
+    } else if (in->nalloc != nalloc) {     // No need to realloc to same size
+        if (nalloc < in->n) {
+            for (psS32 i = nalloc; i < in->n; i++) {      // For reduction in vector size
+                psFree(in->data[i]);
+            }
+            in->n = nalloc;
+        }
+        // Realloc after decrementation to avoid accessing freed array elements
+        in->data = psRealloc(in->data, nalloc * sizeof(psPtr));
+        in->nalloc = nalloc;
+    }
+
+    return in;
+}
+
+psArray* psArrayAdd(psArray* psArr,
+                    int delta,
+                    psPtr data)
+{
+    if (psArr == NULL) {
+        return psArr;
+    }
+
+    int n = psArr->n;
+
+    if (n >= psArr->nalloc) {
+        // array needs to be expanded to make room for more elements
+        int d = (delta > 0) ? delta : 10; // as spec'ed in SDRS.
+        psArr = psArrayRealloc(psArr, n+d);
+    }
+
+    // add the element to the end of the array.
+    psArr->data[n] = psMemIncrRefCounter(data);
+    psArr->n = n+1;
+
+    return psArr;
+}
+
+psBool psArrayRemove(psArray* psArr,
+                     psPtr data)
+{
+    psBool success = false;
+
+    if (psArr == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psArray_ARRAY_NULL);
+        return false;
+    }
+
+    psS32 n = psArr->n;
+    psPtr* psArrData = psArr->data;
+    for (psS32 i = n-1; i >= 0; i--) {
+        if (psArrData[i] == data) {
+            memmove(&psArr->data[i],&psArr->data[i+1],(n-i-1)*sizeof(psPtr));
+            n--;
+            success = true;
+        }
+    }
+    psArr->n = n; // reset the array size to indicate the removed item(s)
+
+    return success;
+}
+
+void psArrayElementFree(psArray* psArr)
+{
+
+    if (psArr == NULL) {
+        return;
+    }
+
+    for (psS32 i = 0; i < psArr->n; i++) {
+        psFree(psArr->data[i]);
+        psArr->data[i] = NULL;
+    }
+}
+
+psArray* psArraySort(psArray* in, psComparePtrFcn compare)
+{
+    if (in == NULL) {
+        return NULL;
+    }
+
+    qsort(in->data, in->n, sizeof(psPtr), (int (*)(const void* , const void*))compare);
+
+    return in;
+}
+
+/// Set an element in the array.
+psBool psArraySet(psArray* in,                       ///< input array to set element in
+                  psU32 position,                    ///< the element position to set
+                  void* value)                       ///< the value to set it to
+{
+    if (in == NULL)
+    {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psArray_ARRAY_NULL);
+        return false;
+    }
+
+    if (position >= in->nalloc)
+    {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psArray_POSITION_BEYOND_NALLOC,
+                position, in->nalloc);
+        return false;
+    }
+
+    psFree(in->data[position]);
+    in->data[position] = value;
+
+    return true;
+}
+
+/// Get an element in the array.
+void* psArrayGet(psArray* in, psU32 position )
+{
+    if (in == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psArray_ARRAY_NULL);
+        return NULL;
+    }
+
+    if (position >= in->nalloc) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psArray_POSITION_BEYOND_NALLOC,
+                position, in->nalloc);
+        return NULL;
+    }
+
+    return in->data[position];
+}
+
+
+
+
Index: /tags/ipp-1-X/bug123/psLib/src/types/psArray.h
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/types/psArray.h	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/types/psArray.h	(revision 22331)
@@ -0,0 +1,150 @@
+
+/** @file  psArray.h
+ *
+ *  @brief Contains basic array definitions and operations
+ *
+ *  This file defines the basic type for a array struct and functions useful
+ *  in manupulating arrays.
+ *
+ *  @ingroup Array
+ *
+ *  @author Robert DeSonia, MHPCC
+ *  @author Ross Harman, MHPCC
+ *
+ *  @version $Revision: 1.22 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-02-17 19:26:23 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+
+#ifndef PS_ARRAY_H
+#define PS_ARRAY_H
+
+#include "psType.h"
+#include "psCompare.h"
+
+/// @addtogroup Array
+/// @{
+
+/** An array to support primitive types.
+ *
+ * Struct for maintaining an array of frequently used primitive types.
+ *
+ */
+typedef struct
+{
+    psU32 nalloc;        ///< Total number of elements available.
+    psU32 n;             ///< Number of elements in use.
+    psPtr* data;                ///< An Array of pointer elements
+}
+psArray;
+
+/*****************************************************************************/
+
+/* FUNCTION PROTOTYPES                                                       */
+
+/*****************************************************************************/
+
+/** Allocate an array.
+ *
+ * Uses psLib memory allocation functions to create an array collection of 
+ * data
+ *
+ * @return psArray* : Pointer to psArray.
+ *
+ */
+psArray* psArrayAlloc(
+    psU32 nalloc                       ///< Total number of elements to make available.
+);
+
+/** Reallocate an array.
+ *
+ * Uses psLib memory allocation functions to reallocate an array collection 
+ * of data. 
+ *
+ * @return psArray* : Pointer to psArray.
+ *
+ */
+psArray* psArrayRealloc(
+    psArray* psArr,                    ///< array to reallocate.
+    psU32 nalloc                       ///< Total number of elements to make available.
+);
+
+/** Add an element to the end the array, expanding the array storage if
+ *  necessary.
+ *
+ *  @return psArray*        The array with the element added
+ */
+psArray* psArrayAdd(
+    psArray* psArr,                    ///< array to operate on
+    int delta,
+    ///< the amount to expand array, if necessary.  If less than one, 10 will be used.
+    psPtr data                         ///< the data pointer to add to psArray
+);
+
+/** Remove an element from the array
+ *
+ *  Finds and removes the specified data pointer from the list.  
+ *
+ * @return bool:  TRUE if the specified data pointer was found and removed, 
+ *                otherwise FALSE.
+ *
+ */
+psBool psArrayRemove(
+    psArray* psArr,                    ///< array to operate on
+    psPtr data                         ///< the data pointer to remove from psArray
+);
+
+/** Deallocate/Dereference elements of an array.
+ *
+ * Uses psLib memory allocation functions to deallocate/dereference elements 
+ * of a array of void pointers.  The array psArr is not freed, and its elements
+ * will all be set to NULL.
+ *
+ */
+void psArrayElementFree(
+    psArray* psArr                     ///< Void pointer array to destroy.
+);
+
+/** Sort the array according to an external compare function.
+ *
+ *  Sorts an array via the specification of a comparison function
+ *  to specify how the objects on the array should be sorted.
+ *
+ *  The comparison function must return an integer less than, equal to, or 
+ *  greater than zero if the first argument is considered to be respectively 
+ *  less than, equal to, or greater than the second. 
+ *
+ *  If two members compare as equal, their order in the sorted array is 
+ *  undefined.
+ *
+ *  @return psArray* The sorted array.
+ */
+psArray* psArraySort(
+    psArray* in,                       ///< input array to sort.
+    psComparePtrFcn compare            ///< the compare function
+);
+
+/** Set an element in the array.  If the current element is non-NULL, the old
+ *  element is freed.
+ *
+ *  @return psBool  TRUE if the element was set successfully, otherwise FALSE
+ */
+psBool psArraySet(
+    psArray* in,                       ///< input array to set element in
+    psU32 position,                    ///< the element position to set
+    void* value                        ///< the value to set it to
+);
+
+/** Get an element from the array.
+ *
+ *  @return void*   the element at given position.
+ */
+void* psArrayGet(
+    psArray* in,                       ///< input array to get element from
+    psU32 position                     ///< the element position to get
+);
+
+/// @}
+
+#endif
Index: /tags/ipp-1-X/bug123/psLib/src/types/psBitSet.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/types/psBitSet.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/types/psBitSet.c	(revision 22331)
@@ -0,0 +1,295 @@
+/** @file  psBitSet.c
+ *
+ *  @brief Creates an array of bytes of arbitrary length for storing individual bits.
+ *
+ *  Bit masks are useful tools for toggling various flags and options. This set of functions module provides
+ *  a mechanism to create an array of bits of arbitrary length and manipulate them with basic binary
+ *  operations. A print function is also provided to display the entire set of bits in binary format as a
+ *  string.
+ *
+ *  @author Ross Harman, MHPCC
+ *  @author Robert DeSonia, MHPCC
+ *
+ *  @version $Revision: 1.24 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-04-07 20:27:41 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+
+#include <string.h>
+#include <stdio.h>
+#include <ctype.h>
+#include <math.h>
+
+#include "psBitSet.h"
+#include "psMemory.h"
+#include "psError.h"
+#include "psAbort.h"
+#include "psString.h"
+
+#include "psCollectionsErrors.h"
+
+enum {
+    UNKNOWN_OP,
+    AND_OP,
+    OR_OP,
+    XOR_OP,
+    NOT_OP
+};
+
+static void bitSetFree(psBitSet* inBitSet);
+
+/** Private function to create a mask.
+ *
+ *  Creates an eight bit mask with the given bit set. All other bits in the byte are zero. The input bit uses
+ *  zero-based indexing, and is the cumulitive index within the array, not the localized byte's bit position.
+ *
+ *  @return  char*: Pointer to byte in which bit is contained.
+ */
+static char mask(psS32 bit)
+{
+    char mask = (char)0x01;
+
+    // Ignore splint warning about negative bit shifts
+    /* @i@ */
+    mask = mask << (bit % 8);
+
+    return mask;
+}
+
+static void bitSetFree(psBitSet* inBitSet)
+{
+    if (inBitSet == NULL) {
+        return;
+    }
+    psFree(inBitSet->bits);
+}
+
+psBitSet* psBitSetAlloc(psS32 n)
+{
+    psS32 numBytes = 0;
+    psBitSet* newObj = NULL;
+
+    if (n < 0) {
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true,
+                PS_ERRORTEXT_psBitSet_ALLOC_NEG_SIZE,
+                n);
+        return NULL;
+    }
+
+    numBytes = ceil(n / 8.0);
+    newObj = psAlloc(sizeof(psBitSet));
+    psMemSetDeallocator(newObj, (psFreeFcn) bitSetFree);
+    newObj->n = numBytes;
+
+    // Ignore splint warning about releasing pointer members, since they've not been allocated yet
+    /* @i@ */
+    newObj->bits = psAlloc(sizeof(char) * numBytes);
+
+    memset(newObj->bits, 0, numBytes);
+
+    return newObj;
+}
+
+psBitSet* psBitSetSet(psBitSet* inBitSet,
+                      psS32 bit)
+{
+    char *byte = NULL;
+
+    if (inBitSet == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psBitSet_SET_NULL);
+        return inBitSet;
+    } else if ( (bit < 0) ||
+                (bit > inBitSet->n * 8 - 1) ) {
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true,
+                PS_ERRORTEXT_psBitSet_BIT_OUTOFRANGE,
+                bit,inBitSet->n * 8 - 1);
+        return inBitSet;
+    }
+    // Variable byte is the byte in the array that contains the bit to be set
+    byte = inBitSet->bits + bit / 8;
+    *byte |= mask(bit);
+
+    return inBitSet;
+}
+
+psBitSet* psBitSetClear(psBitSet* inBitSet,
+                        psS32 bit)
+{
+    char *byte = NULL;
+
+    if (inBitSet == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psBitSet_SET_NULL);
+        return inBitSet;
+    } else if ( (bit < 0) ||
+                (bit > inBitSet->n * 8 - 1) ) {
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true,
+                PS_ERRORTEXT_psBitSet_BIT_OUTOFRANGE,
+                bit,inBitSet->n * 8 - 1);
+        return inBitSet;
+    }
+    // Variable byte is the byte in the array that contains the bit to be set
+    byte = inBitSet->bits + bit / 8;
+    *byte &= ! mask(bit);
+
+    return inBitSet;
+}
+
+psBool psBitSetTest(const psBitSet* inBitSet,
+                    psS32 bit)
+{
+    char *byte = NULL;
+
+    if (inBitSet == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psBitSet_SET_NULL);
+        return false;
+    } else if ( (bit < 0) ||
+                (bit > inBitSet->n * 8 - 1) ) {
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true,
+                PS_ERRORTEXT_psBitSet_BIT_OUTOFRANGE,
+                bit,inBitSet->n * 8 - 1);
+        return false;
+    }
+
+    // Variable byte is the byte in the array that contains the bit to be tested
+    byte = inBitSet->bits + bit / 8;
+    return ((*byte & mask(bit)) != 0);
+}
+
+psBitSet* psBitSetOp(psBitSet* outBitSet,
+                     const psBitSet* inBitSet1,
+                     char *operator,
+                     const psBitSet* inBitSet2)
+{
+    psS32 i = 0;
+    psS32 n = 0;
+    char* outBits = NULL;
+    char* inBits1 = NULL;
+    char* inBits2 = NULL;
+    psS32 op = UNKNOWN_OP;
+
+    if (inBitSet1 == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psBitSet_FIRST_OPERAND_NULL);
+        psFree(outBitSet);
+        return NULL;
+    }
+    inBits1 = inBitSet1->bits;
+
+    if (operator == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psBitSet_OPERATOR_NULL);
+        psFree(outBitSet);
+        return NULL;
+    }
+
+    // parse the operator
+    if (strcmp(operator,"AND")==0) {
+        op = AND_OP;
+    } else if (strcmp(operator,"OR")==0) {
+        op = OR_OP;
+    } else if (strcmp(operator,"XOR")==0) {
+        op = XOR_OP;
+    } else if (strcmp(operator,"NOT")==0) {
+        op = NOT_OP;
+    } else {
+        psFree(outBitSet);
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true,
+                PS_ERRORTEXT_psBitSet_OPERATOR_INVALID,
+                operator);
+        return NULL;
+    }
+
+    if (op != NOT_OP) {
+        if (inBitSet2 == NULL) {
+            psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                    PS_ERRORTEXT_psBitSet_SECOND_OPERAND_NULL);
+            psFree(outBitSet);
+            return NULL;
+        }
+
+        if (inBitSet1->n != inBitSet2->n) {
+            psError(PS_ERR_BAD_PARAMETER_SIZE, true,
+                    PS_ERRORTEXT_psBitSet_OPERANDS_SIZE_DIFFER);
+            psFree(outBitSet);
+            return NULL;
+        }
+        inBits2 = inBitSet2->bits;
+    }
+
+    if (outBitSet == NULL) {
+        outBitSet = psBitSetAlloc(inBitSet1->n*8);
+    } else if (outBitSet->n != inBitSet1->n) {
+        outBitSet->n = inBitSet1->n;
+        outBitSet->bits = psRealloc(outBitSet->bits, inBitSet1->n);
+    }
+
+    n = outBitSet->n;
+    outBits = outBitSet->bits;
+
+    switch (op) {
+    case AND_OP:
+        for (i = 0; i < n; i++) {
+            outBits[i] = inBits1[i] & inBits2[i];
+        }
+        break;
+    case OR_OP:
+        for (i = 0; i < n; i++) {
+            outBits[i] = inBits1[i] | inBits2[i];
+        }
+        break;
+    case XOR_OP:
+        for (i = 0; i < n; i++) {
+            outBits[i] = inBits1[i] ^ inBits2[i];
+        }
+        break;
+    case NOT_OP:
+        for (i = 0; i < n; i++) {
+            outBits[i] = ~inBits1[i];
+        }
+        break;
+    default:
+        psAbort("psBitSetOp",
+                "Unexpected error - operator parsed successfully but not valid?");
+    }
+
+    return outBitSet;
+}
+
+psBitSet* psBitSetNot(psBitSet* outBitSet,
+                      const psBitSet* inBitSet)
+{
+    if (inBitSet == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psBitSet_OPERAND_NULL);
+        psFree(outBitSet);
+        return NULL;
+    }
+
+    outBitSet = psBitSetOp(outBitSet,inBitSet,"NOT",NULL);
+
+    if (outBitSet == NULL) {
+        psError(PS_ERR_UNKNOWN, false,
+                PS_ERRORTEXT_psBitSet_NOT_OP_FAILED);
+    }
+
+    return outBitSet;
+}
+
+char *psBitSetToString(const psBitSet* inBitSet)
+{
+    psS32 i = 0;
+    psS32 numBits = inBitSet->n * 8;
+    char *outString = psAlloc((size_t) numBits + 1);
+
+    for (i = 0; i < numBits; i++) {
+        outString[numBits - i - 1] = psBitSetTest(inBitSet, i) ? '1' : '0';
+    }
+
+    outString[numBits] = 0;
+
+    return outString;
+}
Index: /tags/ipp-1-X/bug123/psLib/src/types/psBitSet.h
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/types/psBitSet.h	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/types/psBitSet.h	(revision 22331)
@@ -0,0 +1,145 @@
+/** @file  psBitSet.h
+ *
+ *  @brief Creates an array of bytes of arbitrary length for storing individual bits.
+ *
+ *  Bit masks are useful tools for toggling various flags and options. This set of functions module provides
+ *  a mechanism to create an array of bits of arbitrary length and manipulate them with basic binary
+ *  operations. A print function is also provided to display the entire set of bits in binary format as a
+ *  string.
+ *
+ *  @ingroup BitSet
+ *
+ *  @author Ross Harman, MHPCC
+ *
+ *  @version $Revision: 1.17 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-02-17 19:26:23 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+
+#ifndef PSBITSET_H
+#define PSBITSET_H
+
+#include "psType.h"
+
+/// @addtogroup BitSet
+/// @{
+
+/******************************************************************************/
+/*  TYPE DEFINITIONS                                                          */
+/******************************************************************************/
+
+/** Struct containing array of bytes to hold bit data and corresponding array length.
+ *
+ *  The bits in the struct are assembled in as an array of bytes with eight bits per byte. The bits are
+ *  arranged with the LSB in first (right most) position of the first array element.
+ */
+typedef struct
+{
+    psS32 n;                             ///< Number of bytes in the array
+    char *bits;                        ///< Aray of bytes holding bits
+}
+psBitSet;
+
+/*****************************************************************************/
+/* FUNCTION PROTOTYPES                                                       */
+/*****************************************************************************/
+
+/** Allocate a psBitSet.
+ *
+ *  Create a psBitSet with the number of bits specified by the user. All bits are set to zero upon
+ *  allocation.
+ *
+ *  @return  psBitSet* : Pointer to struct containing array of bits and size of array.
+ */
+
+/*@null@*/
+psBitSet* psBitSetAlloc(
+    psS32 n                            ///< Number of bits in psBitSet array
+);
+
+/** Set a bit.
+ *
+ *  Sets a bit at a given bit location. The bit is set based on a zero index with the
+ *  first bit set in the zero bit slot of the zero element of the byte array. As an example, setting bit 3 in
+ *  an array with two elements would result in an psBitSet that looks like 00000000 00001000.
+ *
+ *  @return  psBitSet* : Pointer to struct containing psBitSet.
+ */
+psBitSet* psBitSetSet(
+    /* @returned@ */
+    psBitSet* inMask,                  ///< Pointer to psBitSet to be set.
+    psS32 bit                          ///< Bit to be set.
+);
+
+/** Clear a bit.
+ *
+ *  Clear a bit at a given bit location. The bit is cleared based on a zero 
+ *  index with the first bit set in the zero bit slot of the zero element of 
+ *  the byte array. 
+ *
+ *  @return  psBitSet* : Pointer to struct containing psBitSet.
+ */
+psBitSet* psBitSetClear(
+    /* @returned@ */
+    psBitSet* inMask,                  ///< Pointer to psBitSet to be cleared.
+    psS32 bit                          ///< Bit to be cleared.
+);
+
+/** Test the value of a bit.
+ *
+ *  Prints the value of a bit at a given bit location, either one or zero. The resulting bit is based on a
+ *  zero index format with the first bit set in the zero bit slot of the zero element of the byte array
+ *  As an example, testing bit 3 in a psBitSet with two bytes that looks like 00000000 00001000 would return a
+ *  value of one, since that is the value that was set.
+ *
+ *  @return  int: Value of bit, either one or zero.
+ */
+
+psBool psBitSetTest(
+    const psBitSet* inMask,            ///< Pointer psBitSet to be tested.
+    psS32 bit                          ///< Bit to be tested.
+);
+
+/** Perform a binary operation on two psBitSets
+ *
+ *  Perform an AND, OR, or XOR on two psBitSets. If the BitMasks are not the same size, the operation will not
+ *  be performed and an error message will be logged.
+ *
+ *  @return  psBitSet* : Pointer to struct containing result of binary operation.
+ */
+psBitSet* psBitSetOp(
+    /* @returned@ */
+    psBitSet* outMask,                 ///< Resulting psBitSet from binary operation
+    const psBitSet* inMask1,           ///< First psBitSet on which to operate
+    char *operator,                    ///< Bit operation
+    const psBitSet* inMask2            ///< First psBitSet on which to operate
+);
+
+/** Perform a not operation on a psBitSet
+ *
+ *  Toggles bits in a psBitset. All zero bits are set to one and all one bits are set to zero.
+ *
+ *  @return  psBitSet* : Pointer to struct containing result of operation.
+ */
+
+psBitSet* psBitSetNot(
+    psBitSet* outBitSet,               ///< Resulting psBitSet from operation
+    const psBitSet* inBitSet           ///< Input psBitSet
+);
+
+/** Convert the psBitSet to a string of ones and zeros.
+ *
+ *  Converts the contents of a psBitSet to a string representation of its binary form of ones and zeros. The
+ *  LSB is the right-most chracter. Each set of eight characters represents one byte.
+ *
+ *  @return  char*: Pointer to character array containing string data.
+ */
+
+char *psBitSetToString(
+    const psBitSet* inMask             ///< psBitSet to convert */
+);
+
+/// @}
+
+#endif
Index: /tags/ipp-1-X/bug123/psLib/src/types/psHash.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/types/psHash.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/types/psHash.c	(revision 22331)
@@ -0,0 +1,466 @@
+
+/** @file  psHash.c
+*
+*  @brief Contains support for basic hashing functions.
+*
+*  This file will hold the functions for defining a hash table with arbitrary
+*  data types, allocating/deallocating that hash table, adding and removing
+*  data from that hash table, and listing all keys defined in the hash table.
+*
+*  @author Robert Lupton, Princeton University
+*  @author George Gusciora, MHPCC
+*  @author Robert DeSonia, MHPCC
+*
+*  @version $Revision: 1.14 $ $Name: not supported by cvs2svn $
+*  @date $Date: 2005-04-07 20:27:41 $
+*
+*  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+*/
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include "psHash.h"
+#include "psMemory.h"
+#include "psString.h"
+#include "psTrace.h"
+#include "psError.h"
+
+#include "psCollectionsErrors.h"
+
+static psHashBucket* hashBucketAlloc(const char *key, psPtr data, psHashBucket* next);
+static void hashBucketFree(psHashBucket* bucket);
+static psPtr doHashWork(psHash* table, const char *key, psPtr data, psBool remove
+                           );
+static void hashFree(psHash* table);
+
+/******************************************************************************
+psHashKeyList(table): this function creates a linked list with an entry in
+that list for every key in the hash table.
+Inputs:
+    table: a hash table
+Return;
+    The linked list
+ *****************************************************************************/
+psList* psHashKeyList(psHash* table)
+{
+    psS32 i = 0;                  // Loop index variable
+    psList* myLinkList = NULL;  // The output data structure
+    psHashBucket* ptr = NULL;   // Used to step thru linked list.
+
+    if (table == NULL) {
+        return NULL;
+    }
+    // Create the linked list
+    myLinkList = psListAlloc(NULL);
+
+    // Loop through every bucket in the hash table.  If that bucket is not
+    // NULL, then add the bucket's key to the linked list.
+    for (i = 0; i < table->nbucket; i++) {
+        if (table->buckets[i] != NULL) {
+            // Since a bucket contains a linked list of keys/data, we must
+            // step trough each key in that linked list:
+
+            ptr = table->buckets[i];
+            while (ptr != NULL) {
+                psListAdd(myLinkList, PS_LIST_HEAD, ptr->key);
+                ptr = ptr->next;
+            }
+        }
+    }
+
+    // Return the linked list
+    return (myLinkList);
+}
+
+/******************************************************************************
+hashBucketAlloc(key, data, next): This procedure creates a new hash bucket
+with the specified key, data, and next.
+Inputs:
+    key:  the new bucket's key pointer
+    data: the new bucket's data pointer
+    next: the new bucket's key pointer
+Return:
+    the new hash bucket.
+ *****************************************************************************/
+static psHashBucket* hashBucketAlloc(const char *key,
+                                     psPtr data,
+                                     psHashBucket* next)
+{
+    // Allocate memory for the new hash bucket.
+    psHashBucket* bucket = psAlloc(sizeof(psHashBucket));
+
+    psMemSetDeallocator(bucket, (psFreeFcn) hashBucketFree);
+
+    // Initialize the bucket.
+    bucket->key = psStringCopy(key);
+
+    if (data == NULL) {
+        // NOTE: Should we flag a warning message?
+        bucket->data = NULL;
+    } else {
+        bucket->data = psMemIncrRefCounter(data);
+    }
+
+    bucket->next = next;
+
+    return bucket;
+}
+
+/******************************************************************************
+hashBucketFree(bucket): This procedure deallocates the specified
+hash bucket.
+Inputs:
+    bucket: the hash bucket to be freed.
+Return:
+    NONE
+ *****************************************************************************/
+static void hashBucketFree(psHashBucket* bucket)
+{
+    if (bucket == NULL) {
+        return;
+    }
+
+    psFree(bucket->key);
+
+    psFree(bucket->data);
+}
+
+/******************************************************************************
+psHashAlloc(nbucket): this procedure creates a new hash table with the
+specified number of buckets.
+Inputs:
+    nbucket: initial number of buckets
+Return:
+    The new hash table.
+ *****************************************************************************/
+psHash* psHashAlloc(psS32 nbucket)        // initial number of buckets
+{
+    psS32 i = 0;                  // loop index variable
+
+    // Create the new hash table.
+    psHash* table = psAlloc(sizeof(psHash));
+
+    psMemSetDeallocator(table, (psFreeFcn) hashFree);
+
+    // Allocate memory for the buckets.
+    table->buckets = psAlloc(nbucket * sizeof(psHashBucket* ));
+    table->nbucket = nbucket;
+
+    psTrace("utils.hash", 1, "Creating %d-element hash table\n", nbucket);
+
+    // Initialize all buckets to NULL.
+    for (i = 0; i < nbucket; i++)
+    {
+        table->buckets[i] = NULL;
+    }
+
+    // Return the new hash table.
+    return table;
+}
+
+/******************************************************************************
+hashFree(table): This procedure deallocates the specified hash
+table.  It loops through each bucket, and calls hashBucketFree() on that
+bucket.
+ 
+Inputs:
+    table: a hash table
+Return:
+    NONE
+ *****************************************************************************/
+static void hashFree(psHash* table)
+{
+    psS32 i = 0;                  // Loop index variable.
+
+    if (table == NULL) {
+        return;
+    }
+    // Loop through each bucket in the hash table.  If that bucket is not
+    // NULL, then free the bucket via a function call to hashBucketFree();
+    for (i = 0; i < table->nbucket; i++) {
+
+        // A bucket is composed of a linked list of buckets.
+        while (table->buckets[i] != NULL) {
+            psHashBucket* bucket = table->buckets[i];
+            table->buckets[i] = bucket->next;
+            psFree(bucket);
+        }
+    }
+
+    // Free the bucket structure, then the hash table.
+    psFree(table->buckets);
+}
+
+/******************************************************************************
+doHashWork(table, key, data, remove): This is an internal
+procedure which does the bulk of the work in using the hash table.  Depending
+upon the input parameters, it will either insert a new key/data into the hash
+table, retrieve the data for a specified key, or remove a key/data item.  If
+we try to insert a key that already exists in the hash table, then we deallocate
+the existing data/key item.
+Inputs:
+    table: a hash table
+    key: the key to insert, retrieve, or remove.  Must not be NULL.
+    data: the data to insert, if not NULL
+    remove: set to non-zero if the key/data should be removed from the table.
+Return:
+    NONE
+ 
+NOTE: consider removing this private function and simply putting the code
+into the psHashInsert(), psHashLookup(), and psHashRemove().  Why?  Because
+there is little common code between those functions.
+  *****************************************************************************/
+static psPtr doHashWork(psHash* table,
+                        const char *key,
+                        psPtr data, psBool remove
+                           )
+{
+    psS64 hash = 1;          // This will contain an integer value
+
+    // "hashed" from the key.
+    char *tmpchar = NULL;       // Used in computing the hash function.
+    psHashBucket* ptr = NULL;   // Used to retrieve the hash bucket.
+    psHashBucket* optr = NULL;  // "original pointer": used to step
+
+    // thru the linked list for a bucket.
+
+    // The following condition should never be true, since this is a private
+    // function, but I'm checking it anyway since future coders might change
+    // the way this procedure is called.
+    if ((table == NULL) || (key == NULL)) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psHash_KEY_NULL);
+        return NULL;
+    }
+    // NOTE: This is the originally supplied hash function.
+    // for (psS32 i = 0, len = strlen(key); i < len; i++) {
+    // hash = (hash << 1) ^ key[i];
+    // }
+    // hash &= (table->nbucket - 1);
+
+    // This hash algorithm is from Sedgewick.  NOTE: must reread to ensure that
+    // the size of the hash table is not required to be a prime number.
+    tmpchar = (char *)key;
+    for (hash = 0; *tmpchar != '\0'; tmpchar++) {
+        hash = (64 * hash + *tmpchar) % (table->nbucket);
+    }
+
+    // NOTE: This should not be necessary, but for now, I'm checking bounds
+    // anyway.
+    if ((hash < 0) || (hash >= table->nbucket)) {
+        psError(PS_ERR_UNKNOWN, true,
+                "Internal hash function out of range (%d)", hash);
+    }
+    // ptr will have the correct hash bucket.
+    ptr = table->buckets[hash];
+
+    // We know the correct hash bucket, now we need to know what to do.
+    // If the data parameter is NULL, then, by definition, this is a retrieve
+    // or a remove operation on the hash table.
+
+    if (data == NULL) {
+        if (remove
+           ) {
+            // We search through the linked list for this bucket in
+            // the hash table and look for an entry for this key.
+
+            optr = ptr;
+            while (ptr != NULL) {
+                // Determine if this entry holds the correct key.
+                if (strcmp(key, ptr->key) == 0) {
+                    // The following lines of code are fairly standard ways
+                    // of removing an item from a single-linked list.
+
+                    psPtr data = ptr->data;
+
+                    optr->next = ptr->next;
+                    if (ptr == table->buckets[hash]) {
+                        table->buckets[hash] = ptr->next;
+                    }
+                    psFree(ptr);
+
+                    // By definition, the data associated with that key
+                    // must be returned, not freed.
+                    return data;
+                }
+                optr = ptr;
+                ptr = ptr->next;
+            }
+            return NULL;                   // not in hash
+        }
+        else {
+            // If we get here, then a retrieve operation is requested.  So,
+            // we step trough the linked list at this bucket, and return the
+            // data once we find it, or return NULL if we don't.
+            while (ptr != NULL) {
+                if (strcmp(key, ptr->key) == 0) {
+                    return ptr->data;
+                }
+                ptr = ptr->next;
+            }
+            return NULL;                   // not in hash
+        }
+    } else {
+        // We get here if this procedure was called with non-NULL data.
+        // Therefore, we should insert that data into the hash table.
+        // First, we search through the linked list for this bucket in
+        // the hash table and look for a duplicate entry for this key.
+
+        while (ptr != NULL) {
+            if (strcmp(key, ptr->key) == 0) {
+                // We have found this key in the hash table.
+
+                psTrace("utils.hash.insert", 3, "Replacing data for %s\n", key);
+
+                // NOTE: I have changed this behavior from the originally
+                // supplied code.  Formerly, if itemFree was NULL, then
+                // the new data was not inserted into the hash table.
+
+                psFree(ptr->data);
+
+                ptr->data = psMemIncrRefCounter(data);
+                return data;
+            }
+            ptr = ptr->next;
+        }
+        // We did not found key in the linked list for this bucket of the hash
+        // table.  So, we insert this data at the head of that linked list.
+
+        table->buckets[hash] = hashBucketAlloc(key, data, table->buckets[hash]);
+        return data;
+    }
+}
+
+/******************************************************************************
+psHashAdd(table, key, data): this procedure, which is part of
+the public API, inserts a new key/data pair into the hash table.
+Inputs:
+    table: a hash table
+    key: the key to use
+    data: the data to insert.
+Return:
+    boolean value defining success or failure
+ *****************************************************************************/
+psBool psHashAdd(psHash* table,
+                 const char *key,
+                 psPtr data)
+{
+    if (table == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psHash_TABLE_NULL);
+        return false;
+    }
+    if (key == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psHash_KEY_NULL);
+        return false;
+    }
+    if (data == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psHash_DATA_NULL);
+        return false;
+    }
+
+    return (doHashWork(table, key, data, false) != NULL);
+}
+
+/******************************************************************************
+psHashLookup(table, key): this procedure, which is part of the public API,
+looks up the specified key in the hash table and returns the data associated
+with that key.
+ 
+Inputs:
+    table: a hash table
+    key: the key to use
+Return:
+    The data associated with that key.
+ *****************************************************************************/
+psPtr psHashLookup(psHash* table,      // table to lookup key in
+                   const char *key)     // key to lookup
+{
+    if (table == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psHash_TABLE_NULL);
+        return NULL;
+    }
+    if (key == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psHash_KEY_NULL);
+        return NULL;
+    }
+
+    return doHashWork(table, key, NULL, false);
+}
+
+/******************************************************************************
+psHashRemove(table, key): this procedure, which is part of the
+public API, removes the specified key from the hash table.
+Inputs:
+    table: a hash table
+    key: the key to remove
+Return:
+    boolean value defining success or failure
+ *****************************************************************************/
+psBool psHashRemove(psHash* table,
+                    const char *key)
+{
+    psPtr data = NULL;
+    psBool retVal = false;
+
+    if (table == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psHash_TABLE_NULL);
+        return false;
+    }
+    if (key == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psHash_KEY_NULL);
+        return false;
+    }
+
+    data = doHashWork(table, key, NULL, true);
+    if (data != NULL) {
+        retVal = true;
+    } else {
+        retVal = false;
+    }
+
+    return retVal;
+}
+
+psArray* psHashToArray(psHash* table)
+{
+
+    if (table == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psHash_TABLE_NULL);
+        return NULL;
+    }
+
+    // first, let's just count the number of data elements to know what size
+    // psArray we need to allocate.
+    int nElements = 0;
+    int nbucket = table->nbucket;
+    for (int i = 0; i < nbucket; i++) {
+        psHashBucket* tmpBucket = table->buckets[i];
+        while (tmpBucket != NULL) {
+            nElements++;
+            tmpBucket = tmpBucket->next;
+        }
+    }
+
+    psArray* result = psArrayAlloc(nElements);
+    result->n = nElements;
+
+    // now fill in the array with the hash table's data
+    psPtr* data = result->data;
+    for (int i = 0; i < nbucket; i++) {
+        psHashBucket* tmpBucket = table->buckets[i];
+        while (tmpBucket != NULL) {
+            *(data++) = psMemIncrRefCounter(tmpBucket->data);
+            tmpBucket = tmpBucket->next;
+        }
+    }
+
+    return result;
+}
Index: /tags/ipp-1-X/bug123/psLib/src/types/psHash.h
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/types/psHash.h	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/types/psHash.h	(revision 22331)
@@ -0,0 +1,86 @@
+
+/** @file  psHash.h
+ *  @brief Contains support for basic hashing functions.
+ *  @ingroup HashTable
+ *
+ *  This file will hold the prototypes for defining a hash table with arbitrary
+ *  data types, allocating/deallocating that has table, adding and removing
+ *  data from that hash table, and listing all keys defined in the hash table.
+ *
+ *  @author Robert Lupton, Princeton University
+ *  @author George Gusciora, MHPCC
+ *  @author Robert DeSonia, MHPCC
+ *
+ *  @version $Revision: 1.7 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-02-17 19:26:23 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+#if !defined(PS_HASH_H)
+#define PS_HASH_H
+
+/** \addtogroup HashTable
+ *  \{
+ */
+
+#include "psList.h"
+
+/** A bucket that holds an item of data. */
+typedef struct psHashBucket
+{
+    char *key;                         ///< key for this item of data
+    psPtr data;                        ///< the data itself
+    struct psHashBucket* next;         ///< list of other possible keys
+}
+psHashBucket;
+
+//typedef struct HashTable psHash; ///< Opaque type for a hash table
+
+/** The hash-table itself. */
+typedef struct psHash
+{
+    psS32 nbucket;                     ///< Number of buckets in hash table.
+    psHashBucket* *buckets;            ///< The bucket data.
+}
+psHash;
+
+/// Allocate hash buckets in table.
+psHash* psHashAlloc(
+    psS32 nbucket                  ///< The number of buckets to allocate.
+);
+
+/// Insert entry into table.
+psBool psHashAdd(
+    psHash* table,                 ///< table to insert in
+    const char *key,               ///< key to use
+    psPtr data                     ///< data to insert
+);
+
+/// Lookup key in table.
+psPtr psHashLookup(
+    psHash* table,                 ///< table to lookup key in
+    const char *key                ///< key to lookup
+);
+
+/// Remove key from table.
+psBool psHashRemove(
+    psHash* table,                 ///< table to lookup key in
+    const char *key                ///< key to lookup
+);
+
+/// List all keys in table.
+psList* psHashKeyList(
+    psHash* table                  ///< table to list keys from.
+);
+
+/** Create a psArray from a psHash contents.
+ *
+ *  @return psArray*       A new psArray with duplicate contents of the input psHash
+ */
+psArray* psHashToArray(
+    psHash* table                  ///< table to convert to psArray
+);
+
+/* \} */// End of DataGroup Functions
+
+#endif
Index: /tags/ipp-1-X/bug123/psLib/src/types/psList.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/types/psList.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/types/psList.c	(revision 22331)
@@ -0,0 +1,639 @@
+/** @file psList.c
+ *  @brief Support for doubly linked lists
+ *  @ingroup LinkedList
+ *
+ *  @author Robert Lupton, Princeton University
+ *  @author Robert Daniel DeSonia, MHPCC
+ *
+ *  @version $Revision: 1.35 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-04-07 20:27:41 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <pthread.h>                       // we need a mutex to make this stuff thread safe.
+
+#include "psError.h"
+#include "psAbort.h"
+#include "psMemory.h"
+#include "psList.h"
+#include "psTrace.h"
+#include "psLogMsg.h"
+
+#include "psCollectionsErrors.h"
+
+#define ITER_INIT_HEAD ((psPtr )1)         // next iteration should return head
+#define ITER_INIT_TAIL ((psPtr )2)         // next iteration should return tail
+
+// private functions.
+static void listFree(psList* list);
+static void listIteratorFree(psListIterator* iter);
+static psBool listIteratorRemove(psListIterator* iterator);
+
+static void listFree(psList* list)
+{
+    if (list == NULL) {
+        return;
+    }
+
+    pthread_mutex_lock(&list->lock)
+    ;
+
+    // remove the free function of iterators to avoid double removal from list
+    psArray* iterators = list->iterators;
+    for (int i = 0; i < iterators->n; i++) {
+        psMemSetDeallocator(iterators->data[i], NULL);
+    }
+
+    psFree(list->iterators);
+
+    for (psListElem* ptr = list->head; ptr != NULL;) {
+        psListElem* next = ptr->next;
+
+        psFree(ptr->data);
+        psFree(ptr);
+
+        ptr = next;
+    }
+
+    pthread_mutex_unlock(&list->lock)
+    ;
+
+    pthread_mutex_destroy(&list->lock)
+    ;
+
+}
+
+static void listIteratorFree(psListIterator* iter)
+{
+    if (iter == NULL) {
+        return;
+    }
+
+    // remove this iterator from the parent list
+    psArrayRemove(iter->list->iterators,iter);
+
+}
+
+static psBool listIteratorRemove(psListIterator* iterator)
+{
+    if (iterator == NULL || iterator->cursor == NULL) {
+        return false;
+    }
+
+    psListElem* elem = iterator->cursor;
+    psList* list = iterator->list;
+    int index = iterator->index;
+
+    pthread_mutex_lock(&list->lock)
+    ;
+
+    if (elem == list->head) {        // head of list?
+        list->head = elem->next;
+    } else {
+        elem->prev->next = elem->next;
+    }
+
+    if (elem == list->tail) {        // tail of list?
+        list->tail = elem->prev;
+    } else {
+        elem->next->prev = elem->prev;
+    }
+
+    psArray* iterators = list->iterators;
+    for (int i = 0; i < iterators->n; i++) {
+        psListIterator* iter = (psListIterator*) iterators->data[i];
+        if (iter->cursor == elem) {
+            iter->cursor = NULL;
+        } else if (iter->index > index && iter->index > 0) {
+            iter->index--;
+        }
+    }
+
+    list->size--;
+
+    pthread_mutex_unlock(&list->lock)
+    ;
+
+    // OK, delete orphaned list element and its data
+    psFree(elem->data);
+    psFree(elem);
+
+    return true;
+}
+
+psList* psListAlloc(psPtr data)
+{
+    psList* list = psAlloc(sizeof(psList));
+
+    psMemSetDeallocator(list, (psFreeFcn) listFree);
+
+    list->size = 0;
+    list->head = list->tail = NULL;
+    list->iterators = psArrayAlloc(16);
+    list->iterators->n = 0;
+
+    // create a default iterator
+    psListIteratorAlloc(list,PS_LIST_HEAD,true);
+
+    pthread_mutex_init(&(list->lock), NULL)
+    ;
+
+    if (data != NULL) {
+        psListAdd(list, PS_LIST_TAIL, data);
+    }
+
+    return list;
+}
+
+psListIterator* psListIteratorAlloc(psList* list, int location, bool mutable)
+{
+    psListIterator* iter = psAlloc(sizeof(psListIterator));
+
+    psMemSetDeallocator(iter, (psFreeFcn) listIteratorFree);
+
+    // initialize the attributes
+    iter->list = list;
+    iter->cursor = NULL;
+    iter->index = 0;
+    iter->offEnd = false;
+    iter->mutable = mutable;
+
+    // add to the list's array of iterators
+    psArray* listIterators = list->iterators;
+    int num = listIterators->n;
+    if ( num >= listIterators->nalloc) {
+        // need to resize the array to make more room for another iterator.
+        list->iterators = psArrayRealloc(listIterators,listIterators->nalloc*2);
+        listIterators = list->iterators;
+    }
+    listIterators->data[num] = iter;
+    listIterators->n = num+1;
+
+    if (! psListIteratorSet(iter,location)) {
+        psFree(iter);
+        iter = NULL;
+    }
+
+    return iter;
+}
+
+psBool psListIteratorSet(psListIterator* iterator,
+                         int location)
+{
+    if (iterator == NULL) {
+        return false;
+    }
+
+    psList* list = iterator->list;
+
+    if (location == PS_LIST_TAIL) {
+        iterator->cursor = list->tail;
+        iterator->index = list->size - 1;
+        iterator->offEnd = false;
+        return true;
+    }
+
+    if (location == PS_LIST_HEAD) {
+        iterator->cursor = list->head;
+        iterator->index = 0;
+        iterator->offEnd = false;
+        return true;
+    }
+
+    if (location < 0) {
+        location = list->size + location;
+    }
+
+    if (location < 0 || location >= (int)list->size) {
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true,
+                PS_ERRORTEXT_psList_LOCATION_INVALID,
+                location);
+        return false;
+    }
+
+    psListElem* cursor = iterator->cursor;
+    int index = iterator->index;
+    if (cursor == NULL) {      // set the cursor to the head if it is NULL
+        if (location > list->size/2) { // closer to tail or head?
+            cursor = list->tail;
+            index = list->size - 1;
+        } else {
+            cursor = list->head;
+            index = 0;
+        }
+    }
+
+    if (location < index) {
+        psS32 diff = index - location;
+
+        for (psS32 count = 0; count < diff; count++) {
+            cursor = cursor->prev; // shouldn't need to check for NULL
+        }
+    } else {
+        psS32 diff = location - index;
+
+        for (psS32 count = 0; count < diff; count++) {
+            cursor = cursor->next; // shouldn't need to check for NULL
+        }
+    }
+    iterator->cursor = cursor;
+    iterator->index = location;
+    iterator->offEnd = false;
+
+    return true;
+}
+
+psBool psListAdd(psList* list, psS32 location, psPtr data)
+{
+
+    if (list == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psList_LIST_NULL);
+        return false;
+    }
+
+    if (data == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psList_DATA_NULL);
+        return false;
+    }
+
+    if (location > 0 && location >= (int)list->size) {
+        psLogMsg(__func__,PS_LOG_WARN,
+                 "Specified location, %d, is beyond the end of the list.  "
+                 "Adding data item to tail.",
+                 location);
+        location = PS_LIST_TAIL;
+    }
+
+    // move ourselves to the given position
+    if (! psListIteratorSet(list->iterators->data[0],location)) {
+        return false;
+    }
+
+    if (location == PS_LIST_TAIL) {
+        // insert the element at the end of the list
+        return psListAddAfter(list->iterators->data[0],data);
+    } else {
+        return psListAddBefore(list->iterators->data[0],data);
+    }
+}
+
+bool psListAddAfter(psListIterator* iterator, void* data)
+{
+    if (data == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psList_DATA_NULL);
+        return false;
+    }
+
+    if (iterator == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psList_ITERATOR_NULL);
+        return false;
+    }
+
+    // Check if the list pointed by the iterator can be changed
+    if (!iterator->mutable) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psList_ITERATOR_NONMUTABLE);
+        return false;
+    }
+
+    psListElem* cursor = iterator->cursor;
+    psList* list = iterator->list;
+
+    if (cursor == NULL && list->head != NULL) {
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true,
+                PS_ERRORTEXT_psList_ITERATOR_INVALID);
+        return false;
+    }
+
+    psListElem* elem = psAlloc(sizeof(psListElem));
+
+    pthread_mutex_lock(&list->lock)
+    ;
+
+    // set the new list element's attributes
+    if (cursor == NULL) { // must be an empty list
+        elem->prev = NULL;
+        elem->next = NULL;
+        list->head = elem;
+        list->tail = elem;
+    } else {
+        elem->prev = cursor;
+        elem->next = cursor->next;
+        cursor->next = elem;
+        if (elem->next == NULL) {
+            list->tail = elem;
+        } else {
+            elem->next->prev = elem;
+        }
+    }
+
+    elem->data = psMemIncrRefCounter(data);
+
+    list->size++;
+
+    if (cursor == list->tail) {
+        list->tail = elem;
+    }
+
+    psArray* iterators = list->iterators;
+    int index = iterator->index;
+    for (int i = 0; i < iterators->n; i++) {
+        psListIterator* iter = (psListIterator*) iterators->data[i];
+        if (iter->index > index) {
+            iter->index++;
+        }
+    }
+
+    pthread_mutex_unlock(&list->lock)
+    ;
+
+    return true;
+}
+
+bool psListAddBefore(psListIterator* iterator, void* data)
+{
+    if (data == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psList_DATA_NULL);
+        return false;
+    }
+
+    if (iterator == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psList_ITERATOR_NULL);
+        return false;
+    }
+
+    // Check if the list pointed by the iterator can be changed
+    if (!iterator->mutable) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psList_ITERATOR_NONMUTABLE);
+        return false;
+    }
+
+    psListElem* cursor = iterator->cursor;
+    psList* list = iterator->list;
+
+    if (cursor == NULL && list->head != NULL) {
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true,
+                PS_ERRORTEXT_psList_ITERATOR_INVALID);
+        return false;
+    }
+
+    psListElem* elem = psAlloc(sizeof(psListElem));
+
+    pthread_mutex_lock(&list->lock)
+    ;
+
+    // set the new list element's attributes
+    if (cursor == NULL) { // empty list.
+        elem->prev = NULL;
+        elem->next = NULL;
+        list->head = elem;
+        list->tail = elem;
+    } else {
+        elem->prev = cursor->prev;
+        elem->next = cursor;
+        cursor->prev = elem;
+        if (elem->prev == NULL) {
+            list->head = elem;
+        } else {
+            elem->prev->next = elem;
+        }
+    }
+
+    elem->data = psMemIncrRefCounter(data);
+
+    list->size++;
+
+    if (cursor == list->head) {
+        list->head = elem;
+    }
+
+    psArray* iterators = list->iterators;
+    int index = iterator->index;
+    for (int i = 0; i < iterators->n; i++) {
+        psListIterator* iter = (psListIterator*) iterators->data[i];
+        if (iter->index >= index) {
+            iter->index++;
+        }
+    }
+
+    pthread_mutex_unlock(&list->lock)
+    ;
+
+    return true;
+}
+
+psBool psListRemove(psList* list,
+                    psS32 location)
+{
+    if (list == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psList_LIST_NULL);
+        return false;
+    }
+
+    // move ourselves to the given position
+    psListIterator* defaultIterator = list->iterators->data[0];
+    if (! psListIteratorSet(defaultIterator,location)) {
+        return false;
+    }
+
+    return listIteratorRemove(defaultIterator);
+}
+
+psBool psListRemoveData(psList* list,
+                        psPtr data)
+{
+    if (list == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psList_LIST_NULL);
+        return false;
+    }
+
+    if (data == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psList_DATA_NULL);
+        return false;
+    }
+
+    psListElem* elem = list->head;
+    int index = 0;
+    while (elem != NULL && elem->data != data) {
+        elem = elem->next;
+        index++;
+    }
+    if (elem == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psList_DATA_NOT_FOUND);
+        return false;
+    }
+
+    psListIterator* iterator = (psListIterator*)list->iterators->data[0];
+    iterator->index = index;
+    iterator->cursor = elem;
+
+    return listIteratorRemove(iterator);
+}
+
+psPtr psListGet(psList* list, psS32 location)
+{
+    if (list == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_NULL, true,
+                PS_ERRORTEXT_psList_LIST_NULL);
+        return NULL;
+    }
+
+    if (list->head == NULL) { // list empty?
+        return NULL;
+    }
+
+    psListIterator* iterator = list->iterators->data[0];
+
+    if (! psListIteratorSet(iterator,location)) {
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true,
+                PS_ERRORTEXT_psList_LOCATION_INVALID,
+                location);
+        return NULL;
+    }
+
+    return iterator->cursor->data;
+}
+
+/*
+ * and now return the previous/next element of the list
+ */
+psPtr psListGetAndIncrement(psListIterator* iterator)
+{
+    if (iterator == NULL ) {
+        return NULL;
+    }
+    if (( iterator->cursor == NULL) && (iterator->offEnd)) {
+        return NULL;
+    }
+    if ( (iterator->cursor == NULL) && (!iterator->offEnd)) {
+        iterator->cursor = iterator->list->head;
+        iterator->index = 0;
+        return NULL;
+    }
+
+    psPtr data = iterator->cursor->data;
+
+    iterator->cursor = iterator->cursor->next;
+    iterator->index++;
+    if (iterator->cursor == NULL) {
+        iterator->offEnd = true;
+    }
+
+    return data;
+}
+
+psPtr psListGetAndDecrement(psListIterator* iterator)
+{
+    if (iterator == NULL ) {
+        return NULL;
+    }
+    if ((iterator->cursor == NULL) && (!iterator->offEnd))  {
+        psLogMsg(__func__,PS_LOG_WARN,"Attempt to get previous with itertator cursor NULL and offEnd false");
+        return NULL;
+    }
+    if ( (iterator->cursor == NULL) && (iterator->offEnd) ) {
+        iterator->cursor = iterator->list->tail;
+        iterator->index = iterator->list->size-1;
+        iterator->offEnd = false;
+        return NULL;
+    }
+
+    psPtr data = iterator->cursor->data;
+
+    iterator->cursor = iterator->cursor->prev;
+    iterator->index--;
+
+    return data;
+}
+
+/*
+ * Convert a psList to/from a psVoidPtrArray
+ */
+psArray* psListToArray(psList* restrict list)
+{
+    psListElem* ptr;
+    psU32 n;
+    psArray* restrict arr;
+
+    if (list == NULL) {
+        return NULL;
+    }
+
+    if (list->size > 0) {
+        arr = psArrayAlloc(list->size);
+    } else {
+        arr = psArrayAlloc(1);
+    }
+
+    arr->n = list->size;
+
+    ptr = list->head;
+    n = list->size;
+    for (psS32 i = 0; i < n; i++) {
+        arr->data[i] = psMemIncrRefCounter(ptr->data);
+        ptr = ptr->next;
+    }
+
+    return arr;
+}
+
+psList* psArrayToList(psArray* arr)
+{
+    psU32 n;
+    psList* list;               // list of elements
+
+    if (arr == NULL) {
+        return NULL;
+    }
+
+    list = psListAlloc(NULL);
+    n = arr->n;
+    for (psS32 i = 0; i < n; i++) {
+        psListAdd(list, PS_LIST_TAIL, arr->data[i]);
+    }
+
+    return list;
+}
+
+psList* psListSort(psList* list, psComparePtrFcn compare)
+{
+    psArray* arr;
+
+    if (list == NULL) {
+        return NULL;
+    }
+    // convert to indexable vector for use by qsort.
+    arr = psListToArray(list);
+    psArray* iterators = psMemIncrRefCounter(list->iterators);
+    psFree(list);
+
+    arr = psArraySort(arr, compare);
+
+    // convert back to linked list
+    list = psArrayToList(arr);
+    psFree(list->iterators);
+    list->iterators = iterators;
+    psFree(arr);
+
+    // sorting should invalidate all iterator positions.
+    for (int i = 0; i < iterators->n; i++) {
+        ((psListIterator*)iterators->data[i])->cursor = NULL;
+    }
+
+    return list;
+}
+
Index: /tags/ipp-1-X/bug123/psLib/src/types/psList.h
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/types/psList.h	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/types/psList.h	(revision 22331)
@@ -0,0 +1,228 @@
+#if !defined(PS_LIST_H)
+#define PS_LIST_H
+
+/** @file psList.h
+ *  @brief Support for doubly linked lists
+ *
+ *  @author Robert Lupton, Princeton University
+ *  @author Robert Daniel DeSonia, MHPCC
+ *
+ *  @ingroup LinkedList
+ *
+ *  @version $Revision: 1.23 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-03-11 23:17:46 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+
+#include <pthread.h>                   // we need a mutex to make this stuff thread safe.
+
+#include "psCompare.h"
+#include "psArray.h"
+
+/** @addtogroup LinkedList
+ *  @{
+ */
+
+/** Special values of index into list
+ *
+ *  This list of possible list position values should be contiguous non-positive values ending with
+ *  PS_LIST_UNKNOWN.  Any value less-than-or-equal-to PS_LIST_UNKNOWN is considered a undefined position.
+ *
+ */
+enum {
+    PS_LIST_HEAD = 0,                  ///< at head
+    PS_LIST_TAIL = -1,                 ///< at tail
+};
+
+/** Doubly-linked list element */
+typedef struct psListElem
+{
+    struct psListElem* prev;           ///< previous link in list
+    struct psListElem* next;           ///< next link in list
+    psPtr data;                        ///< real data item
+}
+psListElem;
+
+/** The psList Linked list structure.  User should not allocate this struct
+ *  directly; rather the psListAlloc should be used.
+ *
+ *  @see psListAlloc
+ */
+typedef struct
+{
+    psU32 size;                        ///< number of elements on list
+    psListElem* head;                  ///< first element on list (may be NULL)
+    psListElem* tail;                  ///< last element on list (may be NULL)
+    psArray* iterators;
+    ///< array of all iterators associated with this list.  First iterator is
+    ///< used internally to improve performance when using indexed access, all
+    ///< others are user-level iterators created by psListIteratorAlloc.
+
+    pthread_mutex_t lock;              ///< mutex to lock a node during changes
+}
+psList;
+
+/** The psList iterator structure.  This should be allocated via
+ *  psListIteratorAlloc and not directly.
+ *
+ *  The life span of a psListIterator object is ended by either a psFree
+ *  of this structure OR psFree of the psList in which it operates on.
+ *
+ *  @see psListIteratorAlloc, psListIteratorSet, psListGetAndIncrement, psListGetAndDecrement
+ */
+typedef struct
+{
+psList* list;                      ///< List iterator to works on
+psListElem* cursor;                ///< current cursor position
+int index;                         ///< the index number in the list
+bool offEnd;                       ///< Iterator off the end?
+bool mutable;                      ///< Is it permissible to modify the list?
+}
+psListIterator;
+
+
+/** Creates a psList linked list object.
+ *
+ *  @return psList* A new psList object.
+ */
+psList* psListAlloc(
+    psPtr data
+    ///< initial data item; may be NULL if no an empty psList is desired
+)
+;
+
+/** Creates a psListIterator object and associates it with a psList.
+ *
+ *  @return psListIterator* A new psListIterator object.
+ */
+psListIterator* psListIteratorAlloc(
+    psList* list,                      ///< the psList to iterate with
+    int location,                      ///< the initial starting point.
+    ///<  This can be a numeric index, PS_LIST_HEAD, or PS_LIST_TAIL.
+    bool mutable                       ///< Is it permissible to modify list?
+);
+
+/** Set the iterator of the list to a given position.  If location is invalid the
+ *  iterator position is not changed.
+ *
+ *  @return psBool        TRUE if iterator successfully set, otherwise FALSE.
+ */
+psBool psListIteratorSet(
+    psListIterator* iterator,            ///< list iterator
+    int location                         ///< index number, PS_LIST_HEAD, or PS_LIST_TAIL
+);
+
+/** Adds an element to a psList at position given.
+ *
+ *  @return psBool        TRUE if item was successfully added, otherwise FALSE.
+ */
+psBool psListAdd(
+    psList* list,                      ///< list to add item to
+    psS32 location,                    ///< index, PS_LIST_HEAD, PS_LIST_TAIL, or numbered location.
+    psPtr data                         ///< data item to add.  If NULL, list is not modified.
+);
+
+/** Adds an data item to a psList at position just after the list position given
+ *
+ *  @return psBool        TRUE if item was successfully added, otherwise FALSE.
+ */
+psBool psListAddAfter(
+    psListIterator* list,              ///< list position to add item to
+    psPtr data                         ///< data item to add.  If NULL, list is not modified.
+);
+
+/** Adds an data item to a psList at position just before the list position given
+ *
+ *  @return psBool        TRUE if item was successfully added, otherwise FALSE.
+ */
+psBool psListAddBefore(
+    psListIterator* list,              ///< list position to add item to
+    psPtr data                         ///< data item to add.  If NULL, list is not modified.
+);
+
+/** Remove an item at the specified location from a list.
+ *
+ *  @return psBool        TRUE if element is successfully removed, otherwise FALSE.
+ */
+psBool psListRemove(
+    psList* list,                      ///< list to remove element from
+    psS32 location                     ///< index of item
+);
+
+/** Remove an item from a list.
+ *
+ *  @return psBool        TRUE if element is successfully removed, otherwise FALSE.
+ */
+psBool psListRemoveData(
+    psList* list,                      ///< list to remove element from
+    psPtr data                         ///< data item to find and remove
+);
+
+/** Retrieve an item from a list.
+ *
+ *  @return psPtr       the item corresponding to the location parameter.  If
+ *                      location is invalid (e.g., a numbered index greater
+ *                      than the list size or if the list is empty), a
+ *                      NULL is returned.
+ */
+psPtr psListGet(
+    psList* list,                      ///< list to retrieve element from
+    psS32 location                     ///< index number, PS_LIST_HEAD, or PS_LIST_TAIL
+);
+
+/** Position the specified iterator to the next item in list.
+ *
+ *  @return psPtr       the data item at the original iterator position or NULL if the
+ *                      iterator went past the end of the list.
+ */
+psPtr psListGetAndIncrement(
+    psListIterator* iterator           ///< iterator to move
+);
+
+/** Position the specified iterator to the previous item in list.
+ *
+ *  @return psPtr       the data item at the original iterator position or NULL if the
+ *                      iterator went past the beginning of the list.
+ */
+psPtr psListGetAndDecrement(
+    psListIterator* iterator           ///< iterator to move
+);
+
+/** Convert a linked list to an array
+ *
+ *  @return psArray* A new psArray populated with elements from the list,
+ *                      or NULL if the given dlist parameter is NULL.
+ */
+psArray* psListToArray(
+    psList* dlist                      ///< List to convert
+);
+
+/** Convert array to a doubly-linked list
+ *
+ *  @return psList* A new psList populated with elements formt the psArray,
+ *                      or NULL is the given arr parameter is NULL.
+ */
+psList* psArrayToList(
+    psArray* arr                       ///< vector to convert
+);
+
+/** Sort a list via a comparison function.
+ *
+ *  The comparison function must return an integer less than, equal to, or 
+ *  greater than zero if the first argument is considered to be respectively 
+ *  less than, equal to, or greater than the second. 
+ *
+ *  If two members compare as equal, their order in the sorted array is 
+ *  undefined.
+ *
+ *  @return psList*     Sorted list.
+ */
+psList* psListSort(
+    psList* list,                      ///< the list to sort
+    psComparePtrFcn compare            ///< the comparison function
+);
+
+/// @} End of DataGroup Functions
+
+#endif
Index: /tags/ipp-1-X/bug123/psLib/src/types/psLookupTable.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/types/psLookupTable.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/types/psLookupTable.c	(revision 22331)
@@ -0,0 +1,959 @@
+/** @file  psLookupTable.c
+*
+*  @brief This file defines the structure and functions for table lookups.
+*
+*  @ingroup dataIO
+*
+*  @author Ross Harman, MHPCC
+*
+*  @version $Revision: 1.13 $ $Name: not supported by cvs2svn $
+*  @date $Date: 2005-04-08 17:58:57 $
+*
+*  Copyright 2004-5 Maui High Performance Computing Center, University of Hawaii
+*/
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+//#ifdef DARWIN
+#undef __STRICT_ANSI__
+//#endif
+#include <stdlib.h>
+//#ifdef DARWIN
+#define __STRICT_ANSI__
+//#endif
+#include <math.h>
+#include <stdlib.h>
+
+#include "psMemory.h"
+#include "psString.h"
+#include "psError.h"
+#include "psLookupTable.h"
+#include "psFileUtilsErrors.h"
+#include "psConstants.h"
+
+/******************************************************************************/
+/*  DEFINE STATEMENTS                                                         */
+/******************************************************************************/
+
+/** Maximum size of a string */
+#define MAX_STRING_LENGTH 256
+
+/******************************************************************************/
+/*  TYPE DEFINITIONS                                                          */
+/******************************************************************************/
+
+// None
+
+/*****************************************************************************/
+/*  GLOBAL VARIABLES                                                         */
+/*****************************************************************************/
+
+// None
+
+/*****************************************************************************/
+/*  FILE STATIC VARIABLES                                                    */
+/*****************************************************************************/
+
+// None
+
+/*****************************************************************************/
+/*  FUNCTION IMPLEMENTATION - LOCAL                                          */
+/*****************************************************************************/
+
+static bool ignoreLine(char *inString);
+static char *cleanString(char *inString, int sLen);
+static char* getToken(char **inString, char *delimiter, psParseErrorType *status);
+static psU8 parseU8(char *inString, psParseErrorType *status);
+static psS8 parseS8(char *inString, psParseErrorType *status);
+static psU16 parseU16(char *inString, psParseErrorType *status);
+static psS16 parseS16(char *inString, psParseErrorType *status);
+static psU32 parseU32(char *inString, psParseErrorType *status);
+static psS32 parseS32(char *inString, psParseErrorType *status);
+static psU64 parseU64(char *inString, psParseErrorType *status);
+static psS64 parseS64(char *inString, psParseErrorType *status);
+static psF32 parseF32(char *inString, psParseErrorType *status);
+static psF64 parseF64(char *inString, psParseErrorType *status);
+static void parseValue(psVector *vec, psU64 index, char* strValue, psParseErrorType *status);
+static void lookupTableFree(psLookupTable* table);
+
+/** Determines if a line is blank (whitespace only) or a commentline. It returns true if so. The input string
+ *  must be null terminated. */
+static bool ignoreLine(char *inString)
+{
+    while(*inString!='\0' && *inString!='#') {
+        if(!isspace(*inString)) {
+            return false;
+        }
+        inString++;
+    }
+
+    return true;
+}
+
+
+/** Removes leading and trailing whitespace and # characters from a string. The cleaned string is a new null
+ *  terminated copy of the original input string. */
+static char *cleanString(char *inString, int sLen)
+{
+    char *ptrB = NULL;
+    char *ptrE = NULL;
+    char *cleaned = NULL;
+
+
+    ptrB = inString;
+
+    /* Skip over leading # or whitespace */
+    while (isspace(*ptrB) || *ptrB=='#') {
+        ptrB++;
+    }
+
+    /* Skip over trailing whitespace, null terminators, and # characters */
+    ptrE = inString + sLen;
+    while(isspace(*ptrE) || *ptrE=='\0' || *ptrE=='#') {
+        ptrE--;
+    }
+
+    // Length, sLen, does not include '\0'
+    sLen = ptrE - ptrB + 1;
+
+    // Adds '\0' to end of string and +1 to sLen
+    cleaned = psStringNCopy(ptrB, sLen);
+
+    return cleaned;
+}
+
+
+/** Returns cleaned token based on delimiter, but not including delimiter. Also changes the pointer location
+ * the beginning of the string. Tokens are newly allocated null terminated strings. */
+static char* getToken(char **inString, char *delimiter, psParseErrorType *status)
+{
+    char *cleanToken = NULL;
+    int sLen = 0;
+
+
+    // Skip over leading whitespace
+    while(isspace(**inString)) {
+        (*inString)++;
+    }
+
+    // Length of token, not including delimiter
+    sLen = strcspn(*inString, delimiter);
+    if(sLen) {
+
+        // Create new, cleaned, and null terminated token
+        cleanToken = cleanString(*inString, sLen);
+
+        // Move to end of token
+        (*inString) += sLen;
+    } else if(**inString!='\0' && sLen==0) {
+        *status = PS_PARSE_ERROR_GENERAL;
+    }
+
+    return cleanToken;
+}
+
+/** Returns single parsed value as a psU8. The input string must be cleaned and null terminated. */
+static psU8 parseU8(char *inString, psParseErrorType *status)
+{
+    char *end = NULL;
+    psU8 value = 0.0;
+
+
+    value = (psU8)strtoul(inString, &end, 0);
+    if(*end != '\0') {
+        *status = PS_PARSE_ERROR_VALUE;
+    } else if(inString==end) {
+        *status = PS_PARSE_ERROR_VALUE;
+    }
+
+    return value;
+}
+
+/** Returns single parsed value as a psS8. The input string must be cleaned and null terminated. */
+static psS8 parseS8(char *inString, psParseErrorType *status)
+{
+    char *end = NULL;
+    psS8 value = 0.0;
+
+
+    value = (psS8)strtol(inString, &end, 0);
+    if(*end != '\0') {
+        *status = PS_PARSE_ERROR_VALUE;
+    } else if(inString==end) {
+        *status = PS_PARSE_ERROR_VALUE;
+    }
+
+    return value;
+}
+
+/** Returns single parsed value as a psU16. The input string must be cleaned and null terminated. */
+static psU16 parseU16(char *inString, psParseErrorType *status)
+{
+    char *end = NULL;
+    psU16 value = 0.0;
+
+
+    value = (psU16)strtoul(inString, &end, 0);
+    if(*end != '\0') {
+        *status = PS_PARSE_ERROR_VALUE;
+    } else if(inString==end) {
+        *status = PS_PARSE_ERROR_VALUE;
+    }
+
+    return value;
+}
+
+/** Returns single parsed value as a psS16. The input string must be cleaned and null terminated. */
+static psS16 parseS16(char *inString, psParseErrorType *status)
+{
+    char *end = NULL;
+    psS16 value = 0.0;
+
+
+    value = (psS16)strtol(inString, &end, 0);
+    if(*end != '\0') {
+        *status = PS_PARSE_ERROR_VALUE;
+    } else if(inString==end) {
+        *status = PS_PARSE_ERROR_VALUE;
+    }
+
+    return value;
+}
+
+/** Returns single parsed value as a psU32. The input string must be cleaned and null terminated. */
+static psU32 parseU32(char *inString, psParseErrorType *status)
+{
+    char *end = NULL;
+    psU32 value = 0.0;
+
+
+    value = (psU32)strtoul(inString, &end, 0);
+    if(*end != '\0') {
+        *status = PS_PARSE_ERROR_VALUE;
+    } else if(inString==end) {
+        *status = PS_PARSE_ERROR_VALUE;
+    }
+
+    return value;
+}
+
+/** Returns single parsed value as a psS32. The input string must be cleaned and null terminated. */
+static psS32 parseS32(char *inString, psParseErrorType *status)
+{
+    char *end = NULL;
+    psS32 value = 0.0;
+
+
+    value = (psS32)strtol(inString, &end, 0);
+    if(*end != '\0') {
+        *status = PS_PARSE_ERROR_VALUE;
+    } else if(inString==end) {
+        *status = PS_PARSE_ERROR_VALUE;
+    }
+
+    return value;
+}
+
+/** Returns single parsed value as a psU64. The input string must be cleaned and null terminated. */
+static psU64 parseU64(char *inString, psParseErrorType *status)
+{
+    char *end = NULL;
+    psU64 value = 0.0;
+
+
+    value = (psU64)strtoull(inString, &end, 0);
+    if(*end != '\0') {
+        *status = PS_PARSE_ERROR_VALUE;
+    } else if(inString==end) {
+        *status = PS_PARSE_ERROR_VALUE;
+    }
+
+    return value;
+}
+
+/** Returns single parsed value as a psS64. The input string must be cleaned and null terminated. */
+static psS64 parseS64(char *inString, psParseErrorType *status)
+{
+    char *end = NULL;
+    psS64 value = 0.0;
+
+
+    value = (psS64)strtoll(inString, &end, 0);
+    if(*end != '\0') {
+        *status = PS_PARSE_ERROR_VALUE;
+    } else if(inString==end) {
+        *status = PS_PARSE_ERROR_VALUE;
+    }
+
+    return value;
+}
+
+/** Returns single parsed value as a psF32. The input string must be cleaned and null terminated. */
+static psF32 parseF32(char *inString, psParseErrorType *status)
+{
+    char *end = NULL;
+    psF32 value = 0.0;
+
+
+    value = (psF32)strtof(inString, &end);
+    if(*end != '\0') {
+        *status = PS_PARSE_ERROR_VALUE;
+    } else if(inString==end) {
+        *status = PS_PARSE_ERROR_VALUE;
+    }
+
+    return value;
+}
+
+/** Returns single parsed value as a psF64. The input string must be cleaned and null terminated. */
+static psF64 parseF64(char *inString, psParseErrorType *status)
+{
+    char *end = NULL;
+    psF64 value = 0.0;
+
+
+    value = (psF64)strtod(inString, &end);
+    if(*end != '\0') {
+        *status = PS_PARSE_ERROR_VALUE;
+    } else if(inString==end) {
+        *status = PS_PARSE_ERROR_VALUE;
+    }
+
+    return value;
+}
+
+/** Returns single parsed value as a double precision number. The input string must be cleaned and null
+ * terminated. */
+static void parseValue(psVector *vec, psU64 index, char* strValue, psParseErrorType *status)
+{
+    psElemType type;
+
+
+    if(vec == NULL) {
+        *status = 1;
+        return;
+    }
+
+    type = vec->type.type;
+
+    switch(type) {
+    case PS_TYPE_U8:
+        vec->data.U8[index] = parseU8(strValue, status);
+        break;
+    case PS_TYPE_S8:
+        vec->data.S8[index] = parseS8(strValue, status);
+        break;
+    case PS_TYPE_U16:
+        vec->data.U16[index] = parseU16(strValue, status);
+        break;
+    case PS_TYPE_S16:
+        vec->data.S16[index] = parseS16(strValue, status);
+        break;
+    case PS_TYPE_U32:
+        vec->data.U32[index] = parseU32(strValue, status);
+        break;
+    case PS_TYPE_S32:
+        vec->data.S32[index] = parseS32(strValue, status);
+        break;
+    case PS_TYPE_U64:
+        vec->data.U64[index] = parseU64(strValue, status);
+        break;
+    case PS_TYPE_S64:
+        vec->data.S64[index] = parseS64(strValue, status);
+        break;
+    case PS_TYPE_F32:
+        vec->data.F32[index] = parseF32(strValue, status);
+        break;
+    case PS_TYPE_F64:
+        vec->data.F64[index] = parseF64(strValue, status);
+        break;
+    default:
+        *status = PS_PARSE_ERROR_TYPE;
+    }
+
+    return;
+}
+
+static psParseErrorType printError(psU64 lineCount, char* badText, psParseErrorType status)
+{
+    switch(status) {
+    case PS_PARSE_ERROR_VALUE:
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true, PS_ERRORTEXT_psLookupTable_PARSE_VALUE, badText, lineCount);
+        break;
+    case PS_PARSE_ERROR_TYPE:
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true, PS_ERRORTEXT_psLookupTable_PARSE_TYPE, badText, lineCount);
+        break;
+    case PS_PARSE_ERROR_GENERAL:
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true, PS_ERRORTEXT_psLookupTable_PARSE_GENERAL, badText, lineCount);
+        break;
+    default:
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true, PS_ERRORTEXT_psLookupTable_INVALID_TYPE, badText, lineCount);
+    }
+
+    return PS_LOOKUP_SUCCESS;
+}
+
+static void lookupTableFree(psLookupTable* table)
+{
+    if (table == NULL) {
+        return;
+    }
+
+    psFree(table->values);
+    psFree(table->index);
+    psFree((char*)table->fileName);
+}
+
+/*****************************************************************************/
+/* FUNCTION IMPLEMENTATION - PUBLIC                                          */
+/*****************************************************************************/
+
+psLookupTable* psLookupTableAlloc(const char *fileName, psF64 validFrom, psF64 validTo)
+{
+    psLookupTable *outTable = NULL;
+
+
+    // Can't read table if you don't know its name
+    PS_PTR_CHECK_NULL(fileName,NULL);
+
+    // Allocate lookup table
+    outTable = (psLookupTable*)psAlloc(sizeof(psLookupTable));
+
+    // Set deallocator
+    psMemSetDeallocator(outTable, (psFreeFcn)lookupTableFree);
+
+    // Allocate and set metadata item comment
+    outTable->fileName = psStringCopy(fileName);
+
+    // Number of table rows and columns. Automatically resized by table read.
+    outTable->numRows = 0;
+    outTable->numCols = 0;
+
+    // Valid ranges. Automatically set by table read if both zero.
+    outTable->validFrom = validFrom;
+    outTable->validTo = validTo;
+
+    // Vector of independent index values. Filled by table read.
+    outTable->index = NULL;
+
+    // Array of dependent table values corresponding to index values. Filled by table read.
+    outTable->values = NULL;
+
+    return outTable;
+}
+
+#define UPDATE_VALID_TO_FROM(TABLE)                                             \
+switch (TABLE->index->type.type) {                                              \
+case PS_TYPE_U8:                                                                \
+    TABLE->validFrom = (psF64)TABLE->index->data.U8[0];                         \
+    TABLE->validTo   = (psF64)TABLE->index->data.U8[TABLE->index->nalloc-1];    \
+    break;                                                                      \
+case PS_TYPE_S8:                                                                \
+    TABLE->validFrom = (psF64)TABLE->index->data.S8[0];                         \
+    TABLE->validTo   = (psF64)TABLE->index->data.S8[TABLE->index->nalloc-1];    \
+    break;                                                                      \
+case PS_TYPE_U16:                                                               \
+    TABLE->validFrom = (psF64)TABLE->index->data.U16[0];                        \
+    TABLE->validTo   = (psF64)TABLE->index->data.U16[TABLE->index->nalloc-1];   \
+    break;                                                                      \
+case PS_TYPE_S16:                                                               \
+    TABLE->validFrom = (psF64)TABLE->index->data.S16[0];                        \
+    TABLE->validTo   = (psF64)TABLE->index->data.S16[TABLE->index->nalloc-1];   \
+    break;                                                                      \
+case PS_TYPE_U32:                                                               \
+    TABLE->validFrom = (psF64)TABLE->index->data.U32[0];                        \
+    TABLE->validTo   = (psF64)TABLE->index->data.U32[TABLE->index->nalloc-1];   \
+    break;                                                                      \
+case PS_TYPE_S32:                                                               \
+    TABLE->validFrom = (psF64)TABLE->index->data.S32[0];                        \
+    TABLE->validTo   = (psF64)TABLE->index->data.S32[TABLE->index->nalloc-1];   \
+    break;                                                                      \
+case PS_TYPE_U64:                                                               \
+    TABLE->validFrom = (psF64)TABLE->index->data.U64[0];                        \
+    TABLE->validTo   = (psF64)TABLE->index->data.U64[TABLE->index->nalloc-1];   \
+    break;                                                                      \
+case PS_TYPE_S64:                                                               \
+    TABLE->validFrom = (psF64)TABLE->index->data.S64[0];                        \
+    TABLE->validTo   = (psF64)TABLE->index->data.S64[TABLE->index->nalloc-1];   \
+    break;                                                                      \
+case PS_TYPE_F32:                                                               \
+    TABLE->validFrom = (psF64)TABLE->index->data.F32[0];                        \
+    TABLE->validTo   = (psF64)TABLE->index->data.F32[TABLE->index->nalloc-1];   \
+    break;                                                                      \
+case PS_TYPE_F64:                                                               \
+    TABLE->validFrom = (psF64)TABLE->index->data.F64[0];                        \
+    TABLE->validTo   = (psF64)TABLE->index->data.F64[TABLE->index->nalloc-1];   \
+    break;                                                                      \
+default:                                                                        \
+    TABLE->validFrom = (psF64)0;                                                \
+    TABLE->validTo   = (psF64)0;                                                \
+    break;                                                                      \
+}
+
+#define COPY_VECTOR_VALUES(VEC_OUT,INDEX_OUT,VEC_IN,INDEX_IN)                              \
+switch(((psVector*)(VEC_IN))->type.type) {                                                 \
+case PS_TYPE_U8:                                                                           \
+    ((psVector*)VEC_OUT)->data.U8[INDEX_OUT] = ((psVector*)VEC_IN)->data.U8[INDEX_IN];     \
+    break;                                                                                 \
+case PS_TYPE_U16:                                                                          \
+    ((psVector*)VEC_OUT)->data.U16[INDEX_OUT] = ((psVector*)VEC_IN)->data.U16[INDEX_IN];   \
+    break;                                                                                 \
+case PS_TYPE_U32:                                                                          \
+    ((psVector*)VEC_OUT)->data.U32[INDEX_OUT] = ((psVector*)VEC_IN)->data.U32[INDEX_IN];   \
+    break;                                                                                 \
+case PS_TYPE_U64:                                                                          \
+    ((psVector*)VEC_OUT)->data.U64[INDEX_OUT] = ((psVector*)VEC_IN)->data.U64[INDEX_IN];   \
+    break;                                                                                 \
+case PS_TYPE_S8:                                                                           \
+    ((psVector*)VEC_OUT)->data.S8[INDEX_OUT] = ((psVector*)VEC_IN)->data.S8[INDEX_IN];     \
+    break;                                                                                 \
+case PS_TYPE_S16:                                                                          \
+    ((psVector*)VEC_OUT)->data.S16[INDEX_OUT] = ((psVector*)VEC_IN)->data.S16[INDEX_IN];   \
+    break;                                                                                 \
+case PS_TYPE_S32:                                                                          \
+    ((psVector*)VEC_OUT)->data.S32[INDEX_OUT] = ((psVector*)VEC_IN)->data.S32[INDEX_IN];   \
+    break;                                                                                 \
+case PS_TYPE_S64:                                                                          \
+    ((psVector*)VEC_OUT)->data.S64[INDEX_OUT] = ((psVector*)VEC_IN)->data.S64[INDEX_IN];   \
+    break;                                                                                 \
+case PS_TYPE_F32:                                                                          \
+    ((psVector*)VEC_OUT)->data.F32[INDEX_OUT] = ((psVector*)VEC_IN)->data.F32[INDEX_IN];   \
+    break;                                                                                 \
+case PS_TYPE_F64:                                                                          \
+    ((psVector*)VEC_OUT)->data.F64[INDEX_OUT] = ((psVector*)VEC_IN)->data.F64[INDEX_IN];   \
+    break;                                                                                 \
+default:                                                                                   \
+    break;                                                                                 \
+}
+
+
+psLookupTable* psLookupTableRead(psLookupTable *table)
+{
+    bool typeLine = true;
+    char *line = NULL;
+    char *strType = NULL;
+    char *strValue = NULL;
+    char *linePtr = NULL;
+    psParseErrorType status = PS_PARSE_SUCCESS;
+    psParseErrorType lineStatus = PS_PARSE_SUCCESS;
+    psU64 lineCount = 0;
+    psU64 numRows = 0;
+    psU64 numCols = 0;
+    psU64 failedLines = 0;
+    FILE *fp = NULL;
+    psElemType elemType;
+    psVector *indexVec = NULL;
+    psVector *valuesVec = NULL;
+    psArray *values = NULL;
+    psBool sortIndex = false;
+
+    // Check for NULL input table
+    PS_PTR_CHECK_NULL(table,NULL);
+
+    // Check for input table with NULL file name
+    PS_PTR_CHECK_NULL(table->fileName,NULL);
+
+    // Open table file specified by table->fileName
+    if((fp=fopen(table->fileName, "r")) == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true, PS_ERRORTEXT_psLookupTable_FILE_NOT_FOUND,
+                table->fileName);
+        return table;
+    }
+
+    // Initialize vector pointers
+    indexVec = table->index;
+    values = table->values = psArrayAlloc(10);
+    values->n = 0;
+
+    // Create reusable line for continuous read
+    line = (char*)psAlloc(MAX_STRING_LENGTH*sizeof(char));
+
+    // Loop through file to get numRows, numCols, and column data types
+    while((fgets(line, MAX_STRING_LENGTH, fp) != NULL) && (lineStatus == PS_PARSE_SUCCESS)) {
+
+        // Initialize variables for new line
+        linePtr = line;
+        lineCount++;
+
+        // If line is not a comment or blank, then extract data
+        if(!ignoreLine(linePtr)) {
+
+            if(typeLine == true) {
+
+                // Determine column types from first line in data file after comments
+                while((strType=getToken(&linePtr," ",&status))) {
+                    numCols++;
+                    typeLine = false;
+                    if(!strncmp(strType, "psU8", 4)) {
+                        elemType = PS_TYPE_U8;
+                    } else if(!strncmp(strType, "psS8", 4)) {
+                        elemType = PS_TYPE_S8;
+                    } else if(!strncmp(strType, "psU16", 5)) {
+                        elemType = PS_TYPE_U16;
+                    } else if(!strncmp(strType, "psS16", 5)) {
+                        elemType = PS_TYPE_S16;
+                    } else if(!strncmp(strType, "psU32", 5)) {
+                        elemType = PS_TYPE_U32;
+                    } else if(!strncmp(strType, "psS32", 5)) {
+                        elemType = PS_TYPE_S32;
+                    } else if(!strncmp(strType, "psU64", 5)) {
+                        elemType = PS_TYPE_U64;
+                    } else if(!strncmp(strType, "psS64", 5)) {
+                        elemType = PS_TYPE_S64;
+                    } else if(!strncmp(strType, "psF32", 5)) {
+                        elemType = PS_TYPE_F32;
+                    } else if(!strncmp(strType, "psF64", 5)) {
+                        elemType = PS_TYPE_F64;
+                    } else {
+                        status = PS_PARSE_ERROR_TYPE;
+                    }
+
+                    // Realloc number of columns as you go
+                    psVector* vec = psVectorAlloc(0, elemType);
+                    if(numCols == 1) {
+                        indexVec = vec;
+                    } else {
+                        psArrayAdd(values,0,vec);
+                        psFree(vec);
+                    }
+
+                    if(status) {
+                        printError(lineCount, strValue, status);
+                        failedLines++;
+                        lineStatus = status;
+                        status = PS_PARSE_SUCCESS;
+                    }
+                    psFree(strType);
+                }
+            } else {
+                // Parse and add values to all columns
+                numRows++;
+                numCols = 0;
+                while((strValue=getToken(&linePtr," ",&status))) {
+                    numCols++;
+
+                    // Realloc number of rows as you go
+                    if(numCols == 1) {
+                        sortIndex = false;
+                        indexVec = psVectorRecycle(indexVec, numRows, indexVec->type.type);
+                        parseValue(indexVec, numRows-1, strValue, &status);
+                    } else {
+                        valuesVec = values->data[numCols-2];
+                        valuesVec = psVectorRecycle(valuesVec, numRows, valuesVec->type.type);
+                        parseValue(valuesVec, numRows-1, strValue, &status);
+                    }
+
+                    if(status) {
+                        printError(lineCount, strValue, status);
+                        failedLines++;
+                        lineStatus = status;
+                        status = PS_PARSE_SUCCESS;
+                    }
+                    psFree(strValue);
+                } // end while
+            } // end else
+        } // if ignoreLine
+    } // end while
+
+    psFree(line);
+
+    // Set table for return
+    table->numRows = numRows;
+    table->numCols = numCols-1;
+    table->index = indexVec;
+    table->values = values;
+
+    // Set table values to indicate error detected during the read
+    if(lineStatus) {
+        table->numRows = 0;
+        table->numCols = 0;
+        table->validFrom = 0;
+        table->validTo = 0;
+        psError(PS_ERR_UNKNOWN,false,PS_ERRORTEXT_psLookupTable_TABLE_INVALID);
+    } else {
+        // Check if index vector needs to be sorted
+        psVector* sortedIndex = psVectorAlloc(table->numRows,PS_TYPE_U32);
+        sortedIndex = psVectorSortIndex(sortedIndex,table->index);
+        for(psS32 i = 0; i < numRows; i++ ) {
+            if(sortedIndex->data.U32[i] != i) {
+                sortIndex = true;
+                break;
+            }
+        }
+        // Check if it is necessary to sort value vectors
+        if(sortIndex) {
+            // Allocate new index vector
+            psVector* newIndexVector = psVectorAlloc(numRows,indexVec->type.type);
+            // Allocate new value vectors
+            psArray* newValueArray = psArrayAlloc(numCols-1);
+            for(psS32 j = 0; j < numCols-1; j++) {
+                psS32 type = ((psVector*)(table->values->data[j]))->type.type;
+                newValueArray->data[j] = psVectorAlloc(numRows,type);
+            }
+            for(psS32 i = 0; i < numRows; i++) {
+                // Populate new index vector
+                psU32 sortIndex = sortedIndex->data.U32[i];
+                COPY_VECTOR_VALUES(newIndexVector,i, indexVec,sortIndex)
+                // For every column populate new value vectors
+                for(psS32 j=0; j < numCols-1; j++) {
+                    COPY_VECTOR_VALUES(newValueArray->data[j],i,table->values->data[j], sortIndex)
+                }
+            }
+            // Free old index vector
+            psFree(table->index);
+            // Free old value vectors
+            psFree(table->values);
+            // Assign new vector value to table
+            table->index = newIndexVector;
+            // Assign new value vectors to table array
+            table->values = newValueArray;
+        }
+        psFree(sortedIndex);
+        // Update the validTo and validFrom
+        UPDATE_VALID_TO_FROM(table)
+    }
+
+    fclose(fp);
+
+    return table;
+}
+
+#define CONVERT_VALUE_TO_F64(VECTOR,INDEX,RESULT)     \
+switch(VECTOR->type.type) {                           \
+case PS_TYPE_U8:                                      \
+    RESULT = (psF64)VECTOR->data.U8[INDEX];           \
+    break;                                            \
+case PS_TYPE_U16:                                     \
+    RESULT = (psF64)VECTOR->data.U16[INDEX];          \
+    break;                                            \
+case PS_TYPE_U32:                                     \
+    RESULT = (psF64)VECTOR->data.U32[INDEX];          \
+    break;                                            \
+case PS_TYPE_U64:                                     \
+    RESULT = (psF64)VECTOR->data.U64[INDEX];          \
+    break;                                            \
+case PS_TYPE_S8:                                      \
+    RESULT = (psF64)VECTOR->data.S8[INDEX];           \
+    break;                                            \
+case PS_TYPE_S16:                                     \
+    RESULT = (psF64)VECTOR->data.S16[INDEX];          \
+    break;                                            \
+case PS_TYPE_S32:                                     \
+    RESULT = (psF64)VECTOR->data.S32[INDEX];          \
+    break;                                            \
+case PS_TYPE_S64:                                     \
+    RESULT = (psF64)VECTOR->data.S64[INDEX];          \
+    break;                                            \
+case PS_TYPE_F32:                                     \
+    RESULT = (psF64)VECTOR->data.F32[INDEX];          \
+    break;                                            \
+case PS_TYPE_F64:                                     \
+    RESULT = VECTOR->data.F64[INDEX];                 \
+    break;                                            \
+default:                                              \
+    RESULT = NAN;                                     \
+    break;                                            \
+}
+
+
+#define CHECK_LOWER_UPPER_BOUND(TABLE,INDEX,COLUMN)                                \
+switch (TABLE->index->type.type) {                                                 \
+case PS_TYPE_U8:                                                                   \
+    if( (psU8)index < TABLE->index->data.U8[0] ) {                                 \
+        *status = PS_LOOKUP_PAST_TOP;                                              \
+    }                                                                              \
+    if( (psU8)index > TABLE->index->data.U8[numRows-1]) {                          \
+        *status = PS_LOOKUP_PAST_BOTTOM;                                           \
+    }                                                                              \
+    break;                                                                         \
+case PS_TYPE_U16:                                                                  \
+    if( (psU16)index < TABLE->index->data.U16[0] ) {                               \
+        *status = PS_LOOKUP_PAST_TOP;                                              \
+    }                                                                              \
+    if( (psU16)index > TABLE->index->data.U16[numRows-1] ) {                       \
+        *status = PS_LOOKUP_PAST_BOTTOM;                                           \
+    }                                                                              \
+    break;                                                                         \
+case PS_TYPE_U32:                                                                  \
+    if( (psU32)index < TABLE->index->data.U32[0]) {                                \
+        *status = PS_LOOKUP_PAST_TOP;                                              \
+    }                                                                              \
+    if ( (psU32)index > TABLE->index->data.U32[numRows-1] ) {                      \
+        *status = PS_LOOKUP_PAST_BOTTOM;                                           \
+    }                                                                              \
+    break;                                                                         \
+case PS_TYPE_U64:                                                                  \
+    if( (psU64)index < TABLE->index->data.U64[0] ) {                               \
+        *status = PS_LOOKUP_PAST_TOP;                                              \
+    }                                                                              \
+    if( (psU64)index > TABLE->index->data.U64[numRows-1] ) {                       \
+        *status = PS_LOOKUP_PAST_BOTTOM;                                           \
+    }                                                                              \
+    break;                                                                         \
+case PS_TYPE_S8:                                                                   \
+    if( (psS8)index < TABLE->index->data.S8[0] ) {                                 \
+        *status = PS_LOOKUP_PAST_TOP;                                              \
+    }                                                                              \
+    if( (psS8)index > TABLE->index->data.S8[numRows-1] ) {                         \
+        *status = PS_LOOKUP_PAST_BOTTOM;                                           \
+    }                                                                              \
+    break;                                                                         \
+case PS_TYPE_S16:                                                                  \
+    if( (psS16)index < TABLE->index->data.S16[0] ) {                               \
+        *status = PS_LOOKUP_PAST_TOP;                                              \
+    }                                                                              \
+    if( (psS16)index > TABLE->index->data.S16[numRows-1] ) {                       \
+        *status = PS_LOOKUP_PAST_BOTTOM;                                           \
+    }                                                                              \
+    break;                                                                         \
+case PS_TYPE_S32:                                                                  \
+    if( (psS32)index < TABLE->index->data.S32[0] ) {                               \
+        *status = PS_LOOKUP_PAST_TOP;                                              \
+    }                                                                              \
+    if( (psS32)index > TABLE->index->data.S32[numRows-1] ) {                       \
+        *status = PS_LOOKUP_PAST_BOTTOM;                                           \
+    }                                                                              \
+    break;                                                                         \
+case PS_TYPE_S64:                                                                  \
+    if( (psS64)index < TABLE->index->data.S64[0] ) {                               \
+        *status = PS_LOOKUP_PAST_TOP;                                              \
+    }                                                                              \
+    if( (psS64)index > TABLE->index->data.S64[numRows-1] ) {                       \
+        *status = PS_LOOKUP_PAST_BOTTOM;                                           \
+    }                                                                              \
+    break;                                                                         \
+case PS_TYPE_F32:                                                                  \
+    if( (psF32)index < TABLE->index->data.F32[0] ) {                               \
+        *status = PS_LOOKUP_PAST_TOP;                                              \
+    }                                                                              \
+    if( (psF32)index > TABLE->index->data.F32[numRows-1] ) {                       \
+        *status = PS_LOOKUP_PAST_BOTTOM;                                           \
+    }                                                                              \
+    break;                                                                         \
+case PS_TYPE_F64:                                                                  \
+    if( index < TABLE->index->data.F64[0] ) {                                      \
+        *status = PS_LOOKUP_PAST_TOP;                                              \
+    }                                                                              \
+    if( index > TABLE->index->data.F64[numRows-1] ) {                              \
+        *status = PS_LOOKUP_PAST_BOTTOM;                                           \
+    }                                                                              \
+    break;                                                                         \
+default:                                                                           \
+    *status = PS_LOOKUP_ERROR;                                                     \
+    return NAN;                                                                    \
+    break;                                                                         \
+}                                                                                  \
+if(*status == PS_LOOKUP_PAST_TOP) {                                                \
+    CONVERT_VALUE_TO_F64(((psVector*)(TABLE->values->data[COLUMN])),0,out)         \
+    return out;                                                                    \
+} else if (*status == PS_LOOKUP_PAST_BOTTOM) {                                     \
+    CONVERT_VALUE_TO_F64(((psVector*)(TABLE->values->data[COLUMN])),numRows-1,out) \
+    return out;                                                                    \
+}
+
+
+psF64 psLookupTableInterpolate(psLookupTable *table, psF64 index, psU64 column, psLookupStatusType *status)
+{
+    psU64 hiIdx = 0;
+    psU64 loIdx = 0;
+    psU64 numRows = 0;
+    psU64 numCols = 0;
+    psF64 out = 0.0;
+    psF64 denom = 0.0;
+    psF64 convertVal = 0.0;
+    psF64 tempVal = 0.0;
+    psVector *indexVec = NULL;
+    psVector *valuesVec = NULL;
+    psArray *values = NULL;
+
+    // Error checks
+    // Set status to error prior to check since if checks fails it will immediately return
+    PS_PTR_CHECK_NULL(status,NAN);
+    *status = PS_LOOKUP_ERROR;
+    PS_PTR_CHECK_NULL(table,NAN);
+    indexVec = table->index;
+    values = table->values;
+    numRows = table->numRows;
+    numCols = table->numCols;
+    PS_PTR_CHECK_NULL(indexVec,NAN);
+    PS_PTR_CHECK_NULL(values,NAN);
+    PS_INT_CHECK_EQUALS(numRows, 0,NAN);
+    PS_INT_CHECK_EQUALS(numCols, 0,NAN);
+    PS_INT_CHECK_RANGE(column, 0, (int)(numCols-1), NAN);
+
+    valuesVec = (psVector*)values->data[column];
+    PS_PTR_CHECK_NULL(indexVec,NAN);
+
+    // Set status to success since it passed all parameter checks
+    *status = PS_LOOKUP_SUCCESS;
+
+    // Verify the index is within the bounds of the table
+    CHECK_LOWER_UPPER_BOUND(table,index,column)
+
+    // Find location in table where specified index is between to entries
+    CONVERT_VALUE_TO_F64(indexVec, 0, convertVal)
+    while(index > convertVal ) {
+        hiIdx++;
+        if(hiIdx >= numRows) {
+            psError(PS_ERR_BAD_PARAMETER_VALUE, true,
+                    PS_ERRORTEXT_psLookupTable_INTERPOLATE_HIGH, hiIdx);
+            *status = PS_LOOKUP_ERROR;
+            return NAN;
+        }
+        CONVERT_VALUE_TO_F64(indexVec, hiIdx, convertVal)
+    }
+
+    // Check for negative low index and generate error
+    loIdx = hiIdx--;
+    if(loIdx < 0) {
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true,
+                PS_ERRORTEXT_psLookupTable_INTERPOLATE_LOW, loIdx);
+        *status = PS_LOOKUP_ERROR;
+        return NAN;
+    }
+
+    // Perform linear interpolation to calculate return value
+    CONVERT_VALUE_TO_F64(indexVec, hiIdx, denom)
+    CONVERT_VALUE_TO_F64(indexVec, loIdx, convertVal);
+    denom -= convertVal;
+    if(fabs(denom) < FLT_EPSILON) {
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true, PS_ERRORTEXT_psLookupTable_DIVIDE_BY_ZERO);
+        *status = PS_LOOKUP_ERROR;
+        return NAN;
+    } else {
+        CONVERT_VALUE_TO_F64(valuesVec,hiIdx,tempVal)
+        CONVERT_VALUE_TO_F64(valuesVec,loIdx,convertVal)
+        tempVal -= convertVal;
+        CONVERT_VALUE_TO_F64(indexVec,loIdx,convertVal)
+        out = tempVal*(index-convertVal)/denom;
+        CONVERT_VALUE_TO_F64(valuesVec,loIdx,convertVal)
+        out += convertVal;
+    }
+
+    return out;
+}
+
+psVector* psLookupTableInterpolateAll(psLookupTable *table, psF64 index, psVector *stats)
+{
+    psU64 i = 0;
+    psU64 numCols = 0;
+    psVector *outVector = NULL;
+    psLookupStatusType status = PS_LOOKUP_SUCCESS;
+
+    // Error checks
+    PS_PTR_CHECK_NULL(table,NULL);
+    PS_PTR_CHECK_NULL(stats,NULL);
+    numCols = table->numCols;
+    PS_INT_CHECK_EQUALS(numCols, 0,NULL);
+
+    outVector = psVectorAlloc(numCols+1, PS_TYPE_F64);
+
+    // Fill vectors with results and status of results
+    for(i=0; i<numCols; i++) {
+        outVector->data.F64[i] = psLookupTableInterpolate(table, index, i, &status);
+        stats->data.U32[i] = status;
+    }
+
+    return outVector;
+}
+
Index: /tags/ipp-1-X/bug123/psLib/src/types/psLookupTable.h
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/types/psLookupTable.h	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/types/psLookupTable.h	(revision 22331)
@@ -0,0 +1,112 @@
+/** @file  psLookupTable.h
+*
+*  @brief This file defines the structure and functions for table lookups.
+*
+*  @ingroup dataIO
+*
+*  @author Ross Harman, MHPCC
+*
+*  @version $Revision: 1.5 $ $Name: not supported by cvs2svn $
+*  @date $Date: 2005-04-08 17:58:57 $
+*
+*  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
+*/
+
+#ifndef PS_LOOKUPTABLE_H
+#define PS_LOOKUPTABLE_H
+
+#include "psType.h"
+#include "psVector.h"
+#include "psArray.h"
+
+
+/** Lookup table structure
+ *
+ *  Holds table data read from external data files.
+ *
+ */
+typedef struct
+{
+    const char *fileName;              ///< Name of file with table
+    psU64 numRows;                     ///< Number of table rows
+    psU64 numCols;                     ///< Number of table columns
+    psF64 validFrom;                   ///< Lower bound for rable read
+    psF64 validTo;                     ///< Upper bound for table read
+    psVector *index;                   ///< Vector of independent index values
+    psArray *values;                   ///< Array of dependent table values corresponding to index values
+}
+psLookupTable;
+
+
+/** Lookup table lookup status and error conditions
+ *
+ *  Success, failure, and status conditions for table lookups.
+ */
+typedef enum {
+    PS_LOOKUP_SUCCESS             = 0x0000,        ///< Table lookup succeeded
+    PS_LOOKUP_PAST_TOP            = 0x0101,        ///< Lookup off top of table
+    PS_LOOKUP_PAST_BOTTOM         = 0x0102,        ///< Lookup off bottom of table
+    PS_LOOKUP_ERROR               = 0x0104         ///< Any other type of lookup error
+} psLookupStatusType;
+
+/** Lookup table parse status and error conditions
+ *
+ *  Success, failure, and status conditions for table parsing.
+ */
+typedef enum {
+    PS_PARSE_SUCCESS              = 0x0000,        ///< Table lookup succeeded
+    PS_PARSE_ERROR_TYPE           = 0x0101,        ///< Error parsing type
+    PS_PARSE_ERROR_VALUE          = 0x0102,        ///< Error parsing numerical value
+    PS_PARSE_ERROR_GENERAL        = 0x0104         ///< Any other type of lookup error
+}psParseErrorType;
+
+/** Allocator for psLookupTable struct
+ *
+ *  Allocates a new psLookupTable struct.
+ *
+ *  @return psLookupTable*     New psLookupTable struct.
+ */
+psLookupTable* psLookupTableAlloc(
+    const char *fileName,           ///< Name of file to read
+    psF64 validFrom,                ///< Lower bound for rable read
+    psF64 validTo                   ///< Upper bound for table read
+);
+
+/** Read lookup table
+ *
+ *  Reads a lookup table and fills corresponding psLookupTable struct.
+ *
+ *  @return psLookupTable*     New psLookupTable struct.
+ */
+psLookupTable* psLookupTableRead(
+    psLookupTable *table            ///< Table to read
+);
+
+/** Lookup and interpolate value from table.
+ *
+ *  Interpolates value from table. Sets status bit for success or one of several possible failure
+ *  conditions.
+ *
+ *  @return psLookupTable*     New psLookupTable struct
+ */
+psF64 psLookupTableInterpolate(
+    psLookupTable *table,           ///< Table with data
+    psF64 index,                    ///< Value to be interpolated
+    psU64 column,                   ///< Column in table to be interpolated
+    psLookupStatusType *status      ///< Status of lookup
+);
+
+/** Lookup and interpolate all values from table.
+ *
+ *  Interpolates all values from table. Sets status bit for success or one of several possible failure
+ *  conditions.
+ *
+ *  @return psLookupTable*     New psLookupTable struct
+ */
+psVector* psLookupTableInterpolateAll(
+    psLookupTable *table,           ///< Table with data
+    psF64 index,                    ///< Value to be interpolated
+    psVector *stats                 ///< Vector of status for each lookup
+);
+
+#endif
Index: /tags/ipp-1-X/bug123/psLib/src/types/psMetadata.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/types/psMetadata.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/types/psMetadata.c	(revision 22331)
@@ -0,0 +1,729 @@
+/** @file  psMetadata.c
+*
+*
+*  @brief Contains metadata structures, enumerations and functions prototypes.
+*
+*  This file defines metadata item, metadata type, metadata flags, metadata containers, and function
+*  prototypes necessary creating psLib metadata APIs
+*
+*  @ingroup Metadata
+*
+*  @author Robert DeSonia, MHPCC
+*  @author Ross Harman, MHPCC
+*
+*  @version $Revision: 1.58 $ $Name: not supported by cvs2svn $
+*  @date $Date: 2005-04-07 20:27:41 $
+*
+*  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+*/
+
+/******************************************************************************/
+/*  INCLUDE FILES                                                             */
+/******************************************************************************/
+#include<stdio.h>
+#include<stdarg.h>
+#include<string.h>
+
+#include "fitsio.h"
+#include "psType.h"
+#include "psMemory.h"
+#include "psError.h"
+#include "psAbort.h"
+#include "psList.h"
+#include "psHash.h"
+#include "psVector.h"
+#include "psMetadata.h"
+#include "psLookupTable.h"
+#include "psString.h"
+#include "psAstronomyErrors.h"
+#include "psConstants.h"
+
+/******************************************************************************/
+/*  DEFINE STATEMENTS                                                         */
+/******************************************************************************/
+
+/** Maximum size of a string */
+#define MAX_STRING_LENGTH 1024
+
+/******************************************************************************/
+/*  TYPE DEFINITIONS                                                          */
+/******************************************************************************/
+
+// None
+
+/*****************************************************************************/
+/*  GLOBAL VARIABLES                                                         */
+/*****************************************************************************/
+
+// None
+
+/*****************************************************************************/
+/*  FILE STATIC VARIABLES                                                    */
+/*****************************************************************************/
+
+static psS32 metadataId = 0;
+
+/*****************************************************************************/
+/*  FUNCTION IMPLEMENTATION - LOCAL                                          */
+/*****************************************************************************/
+
+static psMetadataItem* makeMetaMulti(psHash* table, const char* key, psMetadataItem* existing)
+{
+
+    if (existing != NULL && existing->type == PS_META_MULTI) {
+        return existing;
+    }
+
+    // move any existing entry into a psList
+    psList* newList = psListAlloc(existing);
+
+    psMetadataItem* item = psMetadataItemAlloc(key,
+                           PS_META_MULTI,
+                           "",
+                           newList);
+
+    if (existing != NULL) {
+        psHashRemove(table,key); // take out the old entry
+    }
+
+    psHashAdd(table, key, item); // put in the new entry
+
+    // free local references of newly allocated items.
+    psFree(newList);
+    psFree(item);
+
+    return item;
+}
+
+static void metadataItemFree(psMetadataItem* metadataItem)
+{
+    psMetadataType type;
+
+    type = metadataItem->type;
+
+    if (metadataItem == NULL) {
+        return;
+    }
+
+    psFree(metadataItem->name);
+    psFree(metadataItem->comment);
+    if (! PS_META_IS_PRIMITIVE(type)) {
+        psFree(metadataItem->data.V);
+    }
+}
+
+static void metadataIteratorFree(psMetadataIterator* iter)
+{
+    if (iter == NULL) {
+        return;
+    }
+    psFree(iter->iter);
+
+    if (iter->preg != NULL) {
+        regfree(iter->preg);
+    }
+}
+
+static void metadataFree(psMetadata* metadata)
+{
+    if (metadata == NULL) {
+        return;
+    }
+    psFree(metadata->list);
+    psFree(metadata->table);
+}
+
+/*****************************************************************************/
+/* FUNCTION IMPLEMENTATION - PUBLIC                                          */
+/*****************************************************************************/
+
+psMetadataItem* psMetadataItemAlloc(const char *name, psMetadataType type,
+                                    const char *comment, ...)
+{
+    va_list argPtr;
+    psMetadataItem* metadataItem = NULL;
+
+    // Get the variable list parameters to pass to allocation function
+    va_start(argPtr, comment);
+
+    // Call metadata item allocation
+    metadataItem = psMetadataItemAllocV(name, type, comment, argPtr);
+
+    // Clean up stack after variable arguement has been used
+    va_end(argPtr);
+
+    return metadataItem;
+}
+
+#define METADATAITEM_ALLOC_TYPE(NAME,TYPE,METATYPE) \
+psMetadataItem* psMetadataItemAlloc##NAME(const char* name, \
+        const char* comment, \
+        TYPE value) \
+{ \
+    return psMetadataItemAlloc(name, METATYPE, comment, value); \
+}
+
+METADATAITEM_ALLOC_TYPE(Str,const char*,PS_META_STR)
+METADATAITEM_ALLOC_TYPE(F32,psF32,PS_META_F32)
+METADATAITEM_ALLOC_TYPE(F64,psF64,PS_META_F64)
+METADATAITEM_ALLOC_TYPE(S32,psS32,PS_META_S32)
+METADATAITEM_ALLOC_TYPE(Bool,psBool,PS_META_BOOL)
+
+psMetadataItem* psMetadataItemAllocV(const char *name, psMetadataType type,
+                                     const char *comment, va_list argPtr)
+{
+    psMetadataItem* metadataItem = NULL;
+
+
+    PS_PTR_CHECK_NULL(name,NULL);
+
+    // Allocate metadata item
+    metadataItem = (psMetadataItem*) psAlloc(sizeof(psMetadataItem));
+    metadataItem->data.V = NULL;
+
+    // Set deallocator
+    psMemSetDeallocator(metadataItem, (psFreeFcn) metadataItemFree);
+
+    // Allocate and set metadata item comment
+    metadataItem->comment = (char *)psAlloc(sizeof(char) * MAX_STRING_LENGTH);
+    if (comment == NULL) {
+        // Per SDRS, null isn't allowed, must use "" instead
+        strncpy(metadataItem->comment, "", MAX_STRING_LENGTH);
+    } else {
+        strncpy(metadataItem->comment, comment, MAX_STRING_LENGTH);
+    }
+
+    // Set metadata item unique id
+    *(psS32 *)(&metadataItem->id) = ++metadataId;
+
+    // Set metadata item type
+    metadataItem->type = type & PS_METADATA_TYPE_MASK;
+
+    // Allocate and set metadata item name
+    metadataItem->name = (char *)psAlloc(sizeof(char) * MAX_STRING_LENGTH);
+    vsprintf(metadataItem->name, name, argPtr);
+
+    // Set metadata item value
+    switch(metadataItem->type) {
+    case PS_META_BOOL:
+        metadataItem->data.B = (psBool)va_arg(argPtr, psS32);
+        break;
+    case PS_META_S32:
+        metadataItem->data.S32 = (psS32)va_arg(argPtr, psS32);
+        break;
+    case PS_META_F32:
+        metadataItem->data.F32 = (psF32)va_arg(argPtr, psF64);
+        break;
+    case PS_META_F64:
+        metadataItem->data.F64 = (psF64)va_arg(argPtr, psF64);
+        break;
+    case PS_META_STR:
+        // Perform copy of input strings
+        metadataItem->data.V = psStringNCopy(va_arg(argPtr, char *), MAX_STRING_LENGTH);
+        break;
+    case PS_META_LIST:
+    case PS_META_VEC:
+    case PS_META_HASH:
+    case PS_META_LOOKUPTABLE:
+    case PS_META_JPEG:
+    case PS_META_PNG:
+    case PS_META_ASTROM:
+    case PS_META_UNKNOWN:
+    case PS_META_MULTI:
+        // Copy of input data not performed due to variability of data types
+        metadataItem->data.V = psMemIncrRefCounter(va_arg(argPtr, psPtr));
+        break;
+    default:
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true, PS_ERRORTEXT_psMetadata_METATYPE_INVALID, type);
+        psFree(metadataItem);
+        metadataItem = NULL;
+    }
+
+    return metadataItem;
+}
+
+psMetadata* psMetadataAlloc(void)
+{
+    psList* list = NULL;
+    psHash* table = NULL;
+    psMetadata* metadata = NULL;
+
+    // Allocate metadata
+    metadata = (psMetadata*) psAlloc(sizeof(psMetadata));
+    // Set deallocator
+    psMemSetDeallocator(metadata, (psFreeFcn) metadataFree);
+
+    // Allocate metadata's internal containers
+    list = (psList*) psListAlloc(NULL);
+    table = (psHash*) psHashAlloc(10);
+
+    metadata->list = list;
+    metadata->table = table;
+
+    return metadata;
+}
+
+psBool psMetadataAddItem(psMetadata *md, psMetadataItem *metadataItem, psS32 location, psS32 flags)
+{
+    char * key = NULL;
+    psHash *mdTable = NULL;
+    psList *mdList = NULL;
+    psMetadataItem *existingEntry = NULL;
+
+    PS_PTR_CHECK_NULL(md,NULL);
+    PS_PTR_CHECK_NULL(md->table,NULL);
+    PS_PTR_CHECK_NULL(md->list,NULL);
+    PS_PTR_CHECK_NULL(metadataItem,NULL);
+    PS_PTR_CHECK_NULL(metadataItem->name,NULL);
+
+    mdTable = md->table;
+    mdList = md->list;
+    key = metadataItem->name;
+
+    // See if key is already in table
+    existingEntry = (psMetadataItem*)psHashLookup(mdTable, key);
+
+    if (metadataItem->type == PS_META_MULTI) {
+        // the incoming entry is PS_META_MULTI
+
+        // force the hash entry to be PS_META_MULTI
+        existingEntry = makeMetaMulti(mdTable,key,existingEntry);
+
+        // add all the items in the incoming entry to metadata
+        psList* list = metadataItem->data.list;
+        if (list != NULL) {
+            psListIterator* iter = psListIteratorAlloc(list,PS_LIST_HEAD,true);
+            psMetadataItem* listItem;
+            while ((listItem=(psMetadataItem*)psListGetAndIncrement(iter)) != NULL) {
+                psMetadataAddItem(md,listItem,location,flags);
+            }
+            psFree(iter);
+        }
+
+        return true; // all done.
+    }
+
+    // how the item is added to the hash depends on prior existence, flags, etc.
+    if(existingEntry != NULL) { // prior existence
+        if (existingEntry->type == PS_META_MULTI || (flags & PS_META_DUPLICATE_OK) != 0) {
+            // duplicate entries allowed - add another entry.
+
+            // make sure the existing entry is PS_META_MULTI
+            existingEntry = makeMetaMulti(mdTable,key,existingEntry);
+
+            // add to the hash's list of duplicate entries
+            if (! psListAdd(existingEntry->data.list, PS_LIST_TAIL, metadataItem) ) {
+                psError(PS_ERR_UNKNOWN,false,PS_ERRORTEXT_psMetadata_ADD_COLLECTION_FAILED,key);
+                return false;
+            }
+        } else if ((flags & PS_META_REPLACE) != 0) {
+            // replace entry instead of creating a duplicate entry.
+
+            // remove the existing entry from metadata
+            psMetadataRemove(md,0,key);
+
+            // treat as if new (added to list below)
+            if(!psHashAdd(mdTable, key, metadataItem)) {
+                psError(PS_ERR_UNKNOWN,false,PS_ERRORTEXT_psMetadata_ADD_TABLE_FAILED,key);
+                return false;
+            }
+        } else {
+            // default is to error on duplicate entry.
+            psError(PS_ERR_BAD_PARAMETER_VALUE, true,
+                    PS_ERRORTEXT_psMetadata_DUPLICATE_NOT_ALLOWED);
+            return false;
+        }
+    } else {
+        // OK, this is a new item.
+
+        // Node doesn't exist - Add new metadata item to metadata collection's hash
+        if(!psHashAdd(mdTable, key, metadataItem)) {
+            psError(PS_ERR_UNKNOWN,false,PS_ERRORTEXT_psMetadata_ADD_TABLE_FAILED,key);
+            return false;
+        }
+    }
+
+    if(!psListAdd(mdList, location, metadataItem)) {
+        psError(PS_ERR_UNKNOWN,false,PS_ERRORTEXT_psMetadata_ADD_COLLECTION_FAILED,key);
+        return false;
+    }
+
+    return true;
+}
+
+psBool psMetadataAdd(psMetadata *md, psS32 location, const char *name,
+                     psS32 type, const char *comment, ...)
+{
+    va_list argPtr;
+
+    va_start(argPtr, comment);
+    psBool result = psMetadataAddV(md,location,name,type,comment,argPtr);
+    va_end(argPtr);
+
+    return result;
+}
+
+psBool psMetadataAddV(psMetadata *md, psS32 location, const char *name,
+                      psS32 type, const char *comment, va_list list)
+{
+    psMetadataItem* metadataItem = NULL;
+
+    metadataItem = psMetadataItemAllocV(name, type & PS_METADATA_TYPE_MASK, comment, list);
+
+    if (!psMetadataAddItem(md, metadataItem, location, type & PS_METADATA_FLAGS_MASK)) {
+        psError(PS_ERR_UNKNOWN,false,PS_ERRORTEXT_psMetadata_ADD_FAILED);
+        psFree(metadataItem);
+        return false;
+    }
+    // Decrement reference count, since the metadata item is now in metadata collection and no longer needed
+    psFree(metadataItem);
+
+    return true;
+}
+
+#define METADATA_ADD_TYPE(NAME,TYPE,METATYPE) \
+psBool psMetadataAdd##NAME(psMetadata* md, psS32 where, const char* name, \
+                           const char* comment, TYPE value) { \
+    return psMetadataAdd(md,where,name, METATYPE,comment,value); \
+}
+
+METADATA_ADD_TYPE(S32,psS32,PS_META_S32)
+METADATA_ADD_TYPE(F32,psF32,PS_META_F32)
+METADATA_ADD_TYPE(F64,psF64,PS_META_F64)
+METADATA_ADD_TYPE(List,psList*,PS_META_LIST)
+METADATA_ADD_TYPE(Str,const char*,PS_META_STR)
+METADATA_ADD_TYPE(Vector,psVector*,PS_META_VEC)
+METADATA_ADD_TYPE(Image,psImage*,PS_META_IMG)
+METADATA_ADD_TYPE(Hash,psHash*,PS_META_HASH)
+METADATA_ADD_TYPE(LookupTable,psLookupTable*,PS_META_LOOKUPTABLE)
+METADATA_ADD_TYPE(Unknown,void*,PS_META_UNKNOWN)
+
+psBool psMetadataRemove(psMetadata *md, psS32 where, const char *key)
+{
+    PS_PTR_CHECK_NULL(md,NULL);
+
+    PS_PTR_CHECK_NULL(md->list,NULL);
+    psList* mdList = md->list;
+
+    PS_PTR_CHECK_NULL(md->table,NULL);
+    psHash* mdTable = md->table;
+
+    // Select removal by key or index
+    if (key != NULL) {
+        // Remove by key name
+        psMetadataItem* entry = psHashLookup(mdTable,key);
+        if (entry == NULL) {
+            psError(PS_ERR_UNKNOWN, false, PS_ERRORTEXT_psMetadata_REMOVE_TABLE_FAILED, key);
+            return false;
+        }
+        if (entry->type == PS_META_MULTI) {
+            psMetadataItem* listItem;
+            psListIterator* iter = psListIteratorAlloc(
+                                       entry->data.list,
+                                       PS_LIST_HEAD,true);
+            while ((listItem=psListGetAndIncrement(iter)) != NULL) {
+                psListRemoveData(mdList, listItem);
+            }
+            psFree(iter);
+            psHashRemove(mdTable,key);
+
+        } else {
+            psListRemoveData(mdList, entry);
+            psHashRemove(mdTable, key);
+        }
+    } else {
+        // Remove by index
+        psMetadataItem* entry = psListGet(mdList, where);
+        if (entry == NULL) {
+            psError(PS_ERR_BAD_PARAMETER_VALUE, true, PS_ERRORTEXT_psMetadata_FIND_INDEX_FAILED, where);
+            return false;
+        }
+        key = entry->name;
+
+        if (key == NULL) {
+            psError(PS_ERR_BAD_PARAMETER_VALUE, true, PS_ERRORTEXT_psMetadata_REMOVE_LIST_INDEX_FAILED, where);
+            return false;
+        }
+
+        psMetadataItem* tableItem = psHashLookup(mdTable, key);
+        if (tableItem == NULL) {
+            psError(PS_ERR_UNKNOWN, false, PS_ERRORTEXT_psMetadata_REMOVE_TABLE_FAILED, key);
+            return false;
+        }
+
+        if (tableItem->type == PS_META_MULTI) {
+            // multiple entries with same key, remove just the specified one
+            psListRemoveData(tableItem->data.list, entry);
+        } else {
+            if (!psHashRemove(mdTable, key)) {
+                psError(PS_ERR_UNKNOWN, false, PS_ERRORTEXT_psMetadata_REMOVE_TABLE_FAILED, key);
+                return false;
+            }
+        }
+        psListRemove(mdList, where);
+    }
+
+    return true;
+}
+
+psMetadataItem* psMetadataLookup(psMetadata *md, const char *key)
+{
+    psHash* mdTable = NULL;
+    psMetadataItem* entry = NULL;
+
+
+    PS_PTR_CHECK_NULL(md,NULL);
+    PS_PTR_CHECK_NULL(md->table,NULL);
+    PS_PTR_CHECK_NULL(key,NULL);
+
+    mdTable = md->table;
+    entry = (psMetadataItem*)psHashLookup(mdTable, key);
+
+    return entry;
+}
+
+void* psMetadataLookupPtr(psBool *status, psMetadata *md, const char *key)
+{
+    psMetadataItem *metadataItem = NULL;
+
+    if (status) {
+        *status = true;
+    }
+
+    metadataItem = psMetadataLookup(md, key);
+    if(metadataItem == NULL) {
+        if (status) {
+            *status = false;
+        }
+        return NULL;
+    }
+    if (metadataItem->type == PS_META_MULTI) {
+        // if multiple keys found, use the first.
+        metadataItem = (psMetadataItem*)((metadataItem->data.list)->head);
+    }
+
+    if(PS_META_IS_PRIMITIVE(metadataItem->type)) {
+        if (status) {
+            *status = false;
+        }
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true,
+                PS_ERRORTEXT_psMetadata_METATYPE_INVALID,
+                metadataItem->type);
+        return NULL;
+    } else {
+        return metadataItem->data.V;
+    }
+}
+
+#define psMetadataLookupNumTYPE(TYPE) \
+ps##TYPE psMetadataLookup##TYPE(psBool *status, psMetadata *md, const char *key) \
+{ \
+    psMetadataItem *metadataItem = NULL; \
+    ps##TYPE value = 0; \
+    \
+    if (status) { \
+        *status = true; \
+    } \
+    \
+    metadataItem = psMetadataLookup(md, key); \
+    if(metadataItem == NULL) { \
+        if (status) { \
+            *status = false; \
+        } \
+        return 0; \
+    } \
+    if (metadataItem->type == PS_META_MULTI) { \
+        /* if multiple keys found, use the first. */ \
+        metadataItem = (psMetadataItem*)((metadataItem->data.list)->head); \
+    } \
+    \
+    switch (metadataItem->type) { \
+    case PS_META_S32: \
+        value = (ps##TYPE)metadataItem->data.S32; \
+        break; \
+    case PS_META_F32: \
+        value = (ps##TYPE)metadataItem->data.F32; \
+        break; \
+    case PS_META_F64: \
+        value = (ps##TYPE)metadataItem->data.F64; \
+        break; \
+    case PS_META_BOOL: \
+        if (metadataItem->data.B) { \
+            value = 1; \
+        } \
+        break; \
+    default: \
+        /* if you get to this point, the value is not a number. */ \
+        if (status) { \
+            *status = false; \
+        } \
+        break; \
+    } \
+    \
+    /* psFree(metadataItem); currently, the lookup doesn't increment the ref count */ \
+    return value; \
+}
+
+psMetadataLookupNumTYPE(F32)
+psMetadataLookupNumTYPE(F64)
+psMetadataLookupNumTYPE(S32)
+psMetadataLookupNumTYPE(Bool)
+
+psMetadataItem* psMetadataGet(psMetadata *md, psS32 where)
+{
+    psMetadataItem* entry = NULL;
+
+    PS_PTR_CHECK_NULL(md,NULL);
+    PS_PTR_CHECK_NULL(md->list,NULL);
+
+    entry = (psMetadataItem*) psListGet(md->list, where);
+    if (entry == NULL) {
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true, PS_ERRORTEXT_psMetadata_FIND_INDEX_FAILED, where);
+        return NULL;
+    }
+
+    return entry;
+}
+
+psMetadataIterator* psMetadataIteratorAlloc(psMetadata* md,
+        int location,
+        const char* regex)
+{
+    PS_PTR_CHECK_NULL(md,NULL);
+    PS_PTR_CHECK_NULL(md->list,NULL);
+
+    psMetadataIterator* newIter = psAlloc(sizeof(psMetadataIterator));
+    newIter->preg = NULL;
+    newIter->iter = NULL;
+
+    // Set deallocator
+    psMemSetDeallocator(newIter, (psFreeFcn) metadataIteratorFree);
+
+    if (regex == NULL) {
+        newIter->iter = psListIteratorAlloc(md->list, location, false);
+        return newIter;
+    } else {
+        int regRtn = regcomp(newIter->preg,regex,0);
+        if (regRtn != 0) {
+            char errMsg[256];
+            regerror(regRtn, newIter->preg, errMsg, 256);
+            regfree(newIter->preg);
+            psError(PS_ERR_BAD_PARAMETER_VALUE, true,
+                    PS_ERRORTEXT_psMetadata_REGEX_INVALID,
+                    errMsg);
+            psFree(newIter);
+            return NULL;
+        }
+    }
+
+    psMetadataIteratorSet(newIter, location); // XXX: do we error if no match is found?
+
+    return newIter;
+}
+
+psBool psMetadataIteratorSet(psMetadataIterator* iterator,
+                             int location)
+{
+    int match;
+    psMetadataItem* cursor;
+
+    PS_PTR_CHECK_NULL(iterator,NULL);
+
+    psListIterator* iter = iterator->iter;
+    PS_PTR_CHECK_NULL(iterator->iter,NULL);
+
+    regex_t* preg = iterator->preg;
+
+    // handle trivial case where no regex subsetting is required.
+    if (preg == NULL) {
+        return psListIteratorSet(iter,location);
+    }
+
+    if (location < 0) {
+        // match from the tail
+        match = 0;
+        psListIteratorSet(iter,PS_LIST_TAIL);
+        while ( (cursor=(psMetadataItem*)iter->cursor) != NULL) {
+            if (regexec(preg, cursor->name, 0, NULL, 0) == 0) {
+                // this key is a match
+                match--;
+                if (match == location) {
+                    break;
+                }
+            }
+            (void)psListGetAndDecrement(iter);
+        }
+        return (match == location);
+    }
+
+    // find the n-th match from the head
+    match = -1;
+    psListIteratorSet(iter,PS_LIST_HEAD);
+    while ( (cursor=(psMetadataItem*)iter->cursor) != NULL) {
+        if (regexec(preg, cursor->name, 0, NULL, 0) == 0) {
+            // this key is a match
+            match++;
+            if (match == location) {
+                break;
+            }
+        }
+        (void)psListGetAndIncrement(iter);
+    }
+    return (match == location);
+}
+
+psMetadataItem* psMetadataGetAndIncrement(psMetadataIterator* iterator)
+{
+    psMetadataItem* oldValue;
+
+    PS_PTR_CHECK_NULL(iterator,NULL);
+
+    psListIterator* iter = iterator->iter;
+    PS_PTR_CHECK_NULL(iterator->iter,NULL);
+
+    regex_t* preg = iterator->preg;
+
+    // handle trivial case where no regex subsetting is required.
+    if (preg == NULL) {
+        return (psMetadataItem*)psListGetAndIncrement(iter);
+    }
+
+    oldValue = (psMetadataItem*)iter->cursor;
+
+    while (psListGetAndIncrement(iter) != NULL) {
+        if (iter->cursor != NULL &&
+                regexec(preg, ((psMetadataItem*)iter->cursor)->name, 0, NULL, 0) == 0) {
+            // this key is a match
+            break;
+        }
+    }
+    return oldValue;
+}
+
+psMetadataItem* psMetadataGetAndDecrement(psMetadataIterator* iterator)
+{
+    psMetadataItem* oldValue;
+
+    PS_PTR_CHECK_NULL(iterator,NULL);
+
+    psListIterator* iter = iterator->iter;
+    PS_PTR_CHECK_NULL(iterator->iter,NULL);
+
+    regex_t* preg = iterator->preg;
+
+    // handle trivial case where no regex subsetting is required.
+    if (preg == NULL) {
+        return (psMetadataItem*)psListGetAndDecrement(iter);
+    }
+
+    oldValue = (psMetadataItem*)iter->cursor;
+
+    while (psListGetAndDecrement(iter) != NULL) {
+        if (iter->cursor != NULL &&
+                regexec(preg, ((psMetadataItem*)iter->cursor)->name, 0, NULL, 0) == 0) {
+            // this key is a match
+            break;
+        }
+    }
+    return oldValue;
+}
Index: /tags/ipp-1-X/bug123/psLib/src/types/psMetadata.h
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/types/psMetadata.h	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/types/psMetadata.h	(revision 22331)
@@ -0,0 +1,479 @@
+/** @file  psMetadata.h
+*
+*  @brief Contains metadata struuctures, enumerations and functions prototypes
+*
+*  This file defines metadata item, metadata type, metadata flags, metadata containers, and function
+*  prototypes necessary creating psLib metadata APIs
+*
+*  @ingroup Metadata
+*
+*  @author Robert DeSonia, MHPCC
+*  @author Ross Harman, MHPCC
+*
+*  @version $Revision: 1.44 $ $Name: not supported by cvs2svn $
+*  @date $Date: 2005-04-08 17:58:57 $
+*
+*  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+*/
+#ifndef PS_METADATA_H
+#define PS_METADATA_H
+
+#include <stdarg.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <regex.h>
+
+#include "psHash.h"
+#include "psList.h"
+#include "psImage.h"
+#include "psLookupTable.h"
+
+/// @addtogroup Metadata
+/// @{
+
+/** Metadata item type.
+ *
+ * Enumeration for maintaining metadata item types.
+ */
+typedef enum {
+    PS_META_S32 = PS_TYPE_S32,         ///< psS32 primitive data.
+    PS_META_F32 = PS_TYPE_F32,         ///< psF32 primitive data.
+    PS_META_F64 = PS_TYPE_F64,         ///< psF64 primitive data.
+    PS_META_BOOL = PS_TYPE_BOOL,       ///< psBool primitive data.
+    PS_META_LIST = 0x10000,            ///< List data (Stored as item.data.list).
+    PS_META_STR,                       ///< String data (Stored as item.data.V).
+    PS_META_VEC,                       ///< Vector data (Stored as item.data.V).
+    PS_META_IMG,                       ///< Image data (Stored as item.data.V).
+    PS_META_HASH,                      ///< Hash data (Stored as item.data.V).
+    PS_META_LOOKUPTABLE,               ///< Lookup table data (Stored as item.data.V).
+    PS_META_JPEG,                      ///< JPEG data (Stored as item.data.V).
+    PS_META_PNG,                       ///< PNG data (Stored as item.data.V).
+    PS_META_ASTROM,                    ///< Astrometric coefficients (Stored as item.data.V).
+    PS_META_UNKNOWN,                   ///< Other data (Stored as item.data.V).
+    PS_META_MULTI                      ///< Used internally, do not create an metadata item of this type.
+} psMetadataType;
+
+#define PS_META_IS_PRIMITIVE(TYPE) \
+(TYPE == PS_META_S32 || \
+ TYPE == PS_META_F32 || \
+ TYPE == PS_META_F64 || \
+ TYPE == PS_META_BOOL)
+
+#define PS_META_PRIMITIVE_TYPE(METATYPE) ( \
+        (METATYPE==PS_META_S32) ? PS_TYPE_S32 : \
+        (METATYPE==PS_META_F32) ? PS_TYPE_F32 : \
+        (METATYPE==PS_META_F64) ? PS_TYPE_F64 : \
+        (METATYPE==PS_META_BOOL) ? PS_TYPE_BOOL : 0 )
+
+/** Option flags for psMetadata functions
+ *
+ *  Enumeration for the modification of the behaviour in psMetadataAddItem.
+ * 
+ *  @see psMetadataAddItem
+ */
+typedef enum {
+    PS_META_DEFAULT = 0,               ///< default behaviour (duplicate entry is an error)
+    PS_META_REPLACE = 0x1000000,       ///< allow entry to be replaced
+    PS_META_DUPLICATE_OK = 0x2000000   ///< allow duplicate entries
+} psMetadataFlags;
+
+#define PS_METADATA_FLAGS_MASK 0xFF000000
+#define PS_METADATA_TYPE_MASK 0x00FFFFFF
+
+/** Metadata data structure.
+ *
+ *  Struct for holding metadata items. Metadata items are held in two
+ *  containers. The first employs a doubly-linked list to preserve the order
+ *  of the metadata. The second container employs a hash table which
+ *  allows fast lookup when given a metadata keyword.
+ */
+typedef struct psMetadata
+{
+    psList*  list;                     ///< Metadata in linked-list
+    psHash*  table;                    ///< Metadata in a hash table
+}
+psMetadata;
+
+/** Metadata iterator
+ *
+ *  Iterator for metadata.
+ */
+typedef struct
+{
+    psListIterator* iter;              ///< iterator for the psMetadata's psList
+    regex_t* preg;                     ///< the subsetting regular expression
+}
+psMetadataIterator;
+
+
+/** Metadata item data structure.
+ *
+ * Struct for maintaining metadata items of varying types. It also contains
+ * information about the item name, flags, comments, and other items with the same name.
+ */
+typedef struct psMetadataItem
+{
+    const psS32 id;                    ///< Unique ID for metadata item.
+    char *name;                        ///< Name of metadata item.
+    psMetadataType type;               ///< Type of metadata item.
+    union {
+        psBool B;                      ///< boolean data
+        psS32 S32;                     ///< Signed 32-bit integer data.
+        psF32 F32;                     ///< Single-precision float data.
+        psF64 F64;                     ///< Double-precision float data.
+        psList *list;                  ///< List data.
+        psMetadata *md;                ///< Metadata data.
+        psPtr V;                       ///< Pointer to other type of data.
+    } data;                            ///< Union for data types.
+    char *comment;                     ///< Optional comment ("", not NULL).
+}
+psMetadataItem;
+
+/** Create a metadata item.
+ *
+ *  Returns a fill psMetadataItem ready for insertion into the psMetadata
+ *  struct. The name argument specifies the name to use for this item, and
+ *  may include sprintf formatting codes. The format entry specifies both
+ *  the metadata type and optional flags and is created by bit-wise or of the
+ *  appropriate type and flag. The comment argument is a fixed string used to
+ *  comment the metadata item. The arguments to the name formatting codes and
+ *  the metadata itself are passed as arguments following the comment string.
+ *  The data must be a pointer for any of the elements stored in data.void.
+ *  The argument list must be interpreted appropriately by the va_list
+ *  operators in the function specified size and type.
+ *
+ * @return psMetadataItem* : Pointer metadata item.
+ */
+psMetadataItem* psMetadataItemAlloc(
+    const char *name,                  ///< Name of metadata item.
+    psMetadataType type,               ///< Type of metadata item.
+    const char *comment,               ///< Comment for metadata item.
+    ...                                ///< Arguments for name formatting and metadata item data.
+);
+
+/** Create a metadata item with specified string data.
+ *
+ *  Returns a fill psMetadataItem ready for insertion into the psMetadata
+ *  struct.
+ *
+ * @return psMetadataItem* : Pointer metadata item.
+ */
+psMetadataItem* psMetadataItemAllocStr(
+    const char* name,                  ///< Name of metadata item.
+    const char* comment,               ///< Comment for metadata item.
+    const char* value                  ///< the value of the metadata item.
+);
+
+/** Create a metadata item with specified psF32 data.
+ *
+ *  Returns a fill psMetadataItem ready for insertion into the psMetadata
+ *  struct.
+ *
+ * @return psMetadataItem* : Pointer metadata item.
+ */
+psMetadataItem* psMetadataItemAllocF32(
+    const char* name,                  ///< Name of metadata item.
+    const char* comment,               ///< Comment for metadata item.
+    psF32 value                        ///< the value of the metadata item.
+);
+
+/** Create a metadata item with specified psF64 data.
+ *
+ *  Returns a fill psMetadataItem ready for insertion into the psMetadata
+ *  struct.
+ *
+ * @return psMetadataItem* : Pointer metadata item.
+ */
+psMetadataItem* psMetadataItemAllocF64(
+    const char* name,                  ///< Name of metadata item.
+    const char* comment,               ///< Comment for metadata item.
+    psF64 value                        ///< the value of the metadata item.
+);
+
+/** Create a metadata item with specified psS32 data.
+ *
+ *  Returns a fill psMetadataItem ready for insertion into the psMetadata
+ *  struct.
+ *
+ * @return psMetadataItem* : Pointer metadata item.
+ */
+psMetadataItem* psMetadataItemAllocS32(
+    const char* name,                  ///< Name of metadata item.
+    const char* comment,               ///< Comment for metadata item.
+    psS32 value                        ///< the value of the metadata item.
+);
+
+/** Create a metadata item with specified psBool data.
+ *
+ *  Returns a fill psMetadataItem ready for insertion into the psMetadata
+ *  struct.
+ *
+ * @return psMetadataItem* : Pointer metadata item.
+ */
+psMetadataItem* psMetadataItemAllocBool(
+    const char* name,                  ///< Name of metadata item.
+    const char* comment,               ///< Comment for metadata item.
+    psBool value                       ///< the value of the metadata item.
+);
+
+#ifndef SWIG
+/** Create a metadata item with va_list.
+ *
+ *  Returns a fill psMetadataItem ready for insertion into the psMetadata
+ *  struct. The name argument specifies the name to use for this item, and
+ *  may include sprintf formatting codes. The format entry specifies both
+ *  the metadata type and optional flags and is created by bit-wise or of the
+ *  appropriate type and flag. The comment argument is a fixed string used to
+ *  comment the metadata item. The arguments to the name formatting codes and
+ *  the metadata itself are passed as arguments following the comment string.
+ *  The data must be a pointer for any of the elements stored in data.void.
+ *  The argument list must be interpreted appropriately by the va_list
+ *  operators in the function specified size and type.
+ *
+ * @return psMetadataItem* : Pointer metadata item.
+ */
+psMetadataItem* psMetadataItemAllocV(
+    const char *name,                  ///< Name of metadata item.
+    psMetadataType type,               ///< Type of metadata item.
+    const char *comment,               ///< Comment for metadata item.
+    va_list list                       ///< Arguments for name formatting and metadata item data.
+);
+#endif
+
+/** Create a metadata collection.
+ *
+ *  Returns an empty metadata container with fully allocated internal metadata
+ *  containers.
+ *
+ *  @return psMetadata* : Pointer metadata.
+ */
+psMetadata* psMetadataAlloc(void);
+
+/** Add existing metadata item to metadata collection.
+ *
+ *  Add a metadata item that has already been created to the metadata
+ *  collection.
+ *
+ *  @return bool: True for success, false for failure.
+ */
+psBool psMetadataAddItem(
+    psMetadata*  md,                   ///< Metadata collection to insert metadat item.
+    psMetadataItem*  item,             ///< Metadata item to be added.
+    psS32 location,                    ///< Location to be added.
+    psS32 flags                        ///< Options flag mask, see psMetadataFlags enum
+);
+
+/** Create and add a metadata item to metadata collection.
+ *
+ * Creates a new metadata item add to the metadata collection.
+ *
+ * @return bool: True for success, false for failure.
+ */
+psBool psMetadataAdd(
+    psMetadata* md,                    ///< Metadata collection to insert metadata item.
+    psS32 location,                    ///< Location to be added.
+    const char *name,                  ///< Name of metadata item.
+    int type,                          ///< Type of metadata item (psMetadataType) and options (psMetadataFlags)
+    const char *comment,               ///< Comment for metadata item.
+    ...                                ///< Arguments for name formatting and metadata item data.
+);
+
+#ifndef SWIG
+/** Create and add a metadata item to metadata collection.
+ *
+ * Creates a new metadata item add to the metadata collection.
+ *
+ * @return bool: True for success, false for failure.
+ */
+psBool psMetadataAddV(
+    psMetadata* md,                    ///< Metadata collection to insert metadat item.
+    psS32 location,                    ///< Location to be added.
+    const char *name,                  ///< Name of metadata item.
+    int type,                          ///< Type of metadata item (psMetadataType) and options (psMetadataFlags)
+    const char *comment,               ///< Comment for metadata item.
+    va_list list                       ///< Arguments for name formatting and metadata item data.
+);
+#endif
+
+psBool psMetadataAddS32(psMetadata* md, psS32 location, const char* name,
+                        const char* comment, psS32 value);
+psBool psMetadataAddF32(psMetadata* md, psS32 location, const char* name,
+                        const char* comment, psF32 value);
+psBool psMetadataAddF64(psMetadata* md, psS32 location, const char* name,
+                        const char* comment, psF64 value);
+psBool psMetadataAddList(psMetadata* md, psS32 location, const char* name,
+                         const char* comment, psList* value);
+psBool psMetadataAddStr(psMetadata* md, psS32 location, const char* name,
+                        const char* comment, const char* value);
+psBool psMetadataAddVector(psMetadata* md, psS32 location, const char* name,
+                           const char* comment, psVector* value);
+psBool psMetadataAddImage(psMetadata* md, psS32 location, const char* name,
+                          const char* comment, psImage* value);
+psBool psMetadataAddHash(psMetadata* md, psS32 location, const char* name,
+                         const char* comment, psHash* value);
+psBool psMetadataAddLookupTable(psMetadata* md, psS32 location, const char* name,
+                                const char* comment, psLookupTable* value);
+psBool psMetadataAddUnknown(psMetadata* md, psS32 location, const char* name,
+                            const char* comment, psPtr value);
+
+/** Remove an item from metadata collection.
+ *
+ *  Items may be removed from metadata by specifing a key or location. If the
+ *  name is null, the where argument is used instead. If name is not null,
+ *  where is set to PS_LIST_UNKNOWN. If the item is found, it is removed from
+ *  the metadata and true is returned.  If the key is not unique, then all
+ *  items corresponding to it are removed.
+ *
+ * @return bool: True for success, false for failure.
+ */
+psBool psMetadataRemove(
+    psMetadata*  md,           ///< Metadata collection to remove metadata item.
+    psS32 where,               ///< Location to be removed.
+    const char * key           ///< Name of metadata key.
+);
+
+/** Find an item in the metadata collection based on key name.
+ *
+ *  Items may be found in the metadata by providing a key. If the key is
+ *  non-unique, the first item is returned. If the item is not found, null is
+ *  returned.
+ *
+ * @return psMetadataItem* : Pointer metadata item.
+ */
+psMetadataItem* psMetadataLookup(
+    psMetadata * md,                   ///< Metadata collection to lookup metadata item.
+    const char * key                   ///< Name of metadata key.
+);
+
+/** Find an item in the metadata collection based on key name and return its double precision value.
+ *
+ *  Items may be found in the metadata by providing a key. If the key is
+ *  non-unique, the value of the first item is returned. If the item is not found, zero is
+ *  returned.
+ *
+ * @return psF64 : Value of metadata item.
+ */
+psF64 psMetadataLookupF64(
+    psBool *status,                    ///< Status of lookup.
+    psMetadata *md,                    ///< Metadata collection to lookup metadata item.
+    const char *key                    ///< Name of metadata key.
+);
+
+/** Find an item in the metadata collection based on key name and return its single precision value.
+ *
+ *  Items may be found in the metadata by providing a key. If the key is
+ *  non-unique, the value of the first item is returned. If the item is not found, zero is
+ *  returned.
+ *
+ * @return psF32 : Value of metadata item.
+ */
+psF32 psMetadataLookupF32(
+    psBool *status,                    ///< Status of lookup.
+    psMetadata *md,                    ///< Metadata collection to lookup metadata item.
+    const char *key                    ///< Name of metadata key.
+);
+
+/** Find an item in the metadata collection based on key name and return its integer value.
+ *
+ *  Items may be found in the metadata by providing a key. If the key is
+ *  non-unique, the value of the first item is returned. If the item is not found, zero is
+ *  returned.
+ *
+ * @return psS32 : Value of metadata item.
+ */
+psS32 psMetadataLookupS32(
+    psBool *status,                    ///< Status of lookup.
+    psMetadata *md,                    ///< Metadata collection to lookup metadata item.
+    const char *key                    ///< Name of metadata key.
+);
+
+/** Find an item in the metadata collection based on key name and return its boolean value.
+ *
+ *  Items may be found in the metadata by providing a key. If the key is
+ *  non-unique, the value of the first item is returned. If the item is not found, zero is
+ *  returned.
+ *
+ * @return psBool : Value of metadata item.
+ */
+psBool psMetadataLookupBool(
+    psBool *status,                    ///< Status of lookup.
+    psMetadata *md,                    ///< Metadata collection to lookup metadata item.
+    const char *key                    ///< Name of metadata key.
+);
+
+/** Find an item in the metadata collection based on key name and return its integer value.
+ *
+ *  Items may be found in the metadata by providing a key. If the key is
+ *  non-unique, the value of the first item is returned. If the item is not found, zero is
+ *  returned.
+ *
+ * @return void* : Value of metadata item.
+ */
+psPtr psMetadataLookupPtr(
+    psBool *status,                    ///< Status of lookup.
+    psMetadata* md,                    ///< Metadata collection to lookup metadata item.
+    const char *key                    ///< Name of metadata key.
+);
+
+/** Find an item in the metadata collection based on list index.
+ *
+ *  Items may be found in the metadata by their entry position in the list
+ *  container.
+ *
+ *  @return psMetadataItem* : Pointer metadata item.
+ */
+psMetadataItem* psMetadataGet(
+    psMetadata*  md,                   ///< Metadata collection to insert metadat item.
+    psS32 location                     ///< Location to be retrieved.
+);
+
+/** Creates a psMetadataIterator to iterate over the specified psMetadata.
+ *
+ *  Supports the subsetting of the metadata via keyword using regular
+ *  expression.  If no regular expression is specified, iteration
+ *  over the entire psMetadata is performed.
+ *
+ *  @return psMetadataIterator*        a new psMetadataIterator, of NULL if error occurred
+ */
+psMetadataIterator* psMetadataIteratorAlloc(
+    psMetadata* md,                    ///< the psMetadata to iterate with
+    int location,                      ///< the initial starting point (after subsetting).
+    const char* regex
+    ///< A regular expression for subsetting the psMetadata.  If NULL, no
+    ///< subsetting is performed.
+);
+
+/** Set the iterator of the psMetadat to a given position.  If location is
+ *  invalid the iterator position is not changed.
+ *
+ *  @return psBool        TRUE if iterator successfully set, otherwise FALSE.
+*/
+psBool psMetadataIteratorSet(
+    psMetadataIterator* iterator,      ///< psMetadata iterator
+    int location                       ///< index number, PS_LIST_HEAD, or PS_LIST_TAIL
+);
+
+/** Position the specified iterator to the next matching item in psMetadata,
+ *  given the regular expression of the iterator
+ *
+ *  @return psPtr       the psMetadataItem at the original iterator position
+ *                      or NULL if the iterator went past the end of the list.
+ */
+psMetadataItem* psMetadataGetAndIncrement(
+    psMetadataIterator* iterator           ///< iterator to move
+);
+
+/** Position the specified iterator to the previous matching item in psMetadata,
+ *  given the regular expression of the iterator
+ *
+ *  @return psPtr       the psMetadataItem at the original iterator position
+ *                      or NULL if the iterator went past the beginning of the
+ *                      list.
+ */
+psMetadataItem* psMetadataGetAndDecrement(
+    psMetadataIterator* iterator           ///< iterator to move
+);
+
+/// @}
+
+#endif
Index: /tags/ipp-1-X/bug123/psLib/src/types/psMetadataConfig.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/types/psMetadataConfig.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/types/psMetadataConfig.c	(revision 22331)
@@ -0,0 +1,1168 @@
+/** @file  psMetadataIO.c
+*
+*  @brief Contains metadata input/output functions.
+*
+*  This file defines functions to read and write metadata to/from an external file.
+*
+*  @ingroup Metadata
+*
+*  @author Ross Harman, MHPCC
+*
+*  @version $Revision: 1.24 $ $Name: not supported by cvs2svn $
+*  @date $Date: 2005-04-06 01:12:58 $
+*
+*  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+*/
+
+#include <libxml/parser.h>
+#include <fitsio.h>
+#include <string.h>
+#include <ctype.h>
+#include <limits.h>
+
+#include "psAbort.h"
+#include "psType.h"
+#include "psMemory.h"
+#include "psError.h"
+#include "psString.h"
+#include "psList.h"
+#include "psHash.h"
+#include "psVector.h"
+#include "psMetadata.h"
+#include "psMetadataIO.h"
+#include "psConstants.h"
+#include "psAstronomyErrors.h"
+
+
+/******************************************************************************/
+/*  DEFINE STATEMENTS                                                         */
+/******************************************************************************/
+
+/** Check for FITS errors */
+#define FITS_ERROR(STRING,PS_ERROR)                                                                          \
+fits_get_errstatus(status, fitsErr);                                                                         \
+psError(PS_ERR_IO,true, STRING, PS_ERROR, fitsErr);                                                          \
+status = 0;                                                                                                  \
+fits_close_file(fd, &status);                                                                                \
+if(status){                                                                                                  \
+    fits_get_errstatus(status, fitsErr);                                                                     \
+    psError(PS_ERR_IO,true, "Couldn't close FITS file. FITS error: %s", fitsErr);                            \
+}                                                                                                            \
+status = 0;                                                                                                  \
+psFree(output);                                                                                              \
+return NULL;
+
+/** Free and null temporary variables used by config file parser */
+#define CLEAR_TEMPS()                                                                                        \
+if(strName) {                                                                                                \
+    psFree(strName);                                                                                         \
+    strName = NULL;                                                                                          \
+}                                                                                                            \
+if(strType) {                                                                                                \
+    psFree(strType);                                                                                         \
+    strType = NULL;                                                                                          \
+}                                                                                                            \
+if(strValue) {                                                                                               \
+    psFree(strValue);                                                                                        \
+    strValue = NULL;                                                                                         \
+}                                                                                                            \
+if(strComment) {                                                                                             \
+    psFree(strComment);                                                                                      \
+    strComment = NULL;                                                                                       \
+}
+
+/** Maximum size of a FITS line */
+#define FITS_LINE_SIZE 80
+
+/** Maximum size of a string */
+#define MAX_STRING_LENGTH 256
+
+
+/******************************************************************************/
+/*  TYPE DEFINITIONS                                                          */
+/******************************************************************************/
+
+// None
+
+/*****************************************************************************/
+/*  GLOBAL VARIABLES                                                         */
+/*****************************************************************************/
+
+// None
+
+/*****************************************************************************/
+/*  FILE STATIC VARIABLES                                                    */
+/*****************************************************************************/
+
+// None
+
+/*****************************************************************************/
+/*  FUNCTION IMPLEMENTATION - LOCAL                                          */
+/*****************************************************************************/
+
+static void saxEndElement(void *ctx, const xmlChar *tagName);
+static void initVectorXml(void *ctx, char *tagName);
+static void initMetadataItemXml(void *ctx, char *tagName);
+static void saxStartElement(void *ctx, const xmlChar *tagName, const xmlChar **atts);
+
+/** Determines if a line is blank (whitespace only) or a commentline. It returns true if so. The input string
+ *  must be null terminated. */
+psBool ignoreLine(char *inString)
+{
+    while(*inString!='\0' && *inString!='#') {
+        if(!isspace(*inString)) {
+            return false;
+        }
+        inString++;
+    }
+
+    return true;
+}
+
+
+/** Removes leading and trailing whitespace and # characters from a string. The cleaned string is a new null
+ *  terminated copy of the original input string. */
+char *cleanString(char *inString, psS32 sLen)
+{
+    char *ptrB = NULL;
+    char *ptrE = NULL;
+    char *cleaned = NULL;
+
+
+    ptrB = inString;
+
+    /* Skip over leading # or whitespace */
+    while (isspace(*ptrB) || *ptrB=='#') {
+        ptrB++;
+    }
+
+    /* Skip over trailing whitespace, null terminators, and # characters */
+    ptrE = inString + sLen;
+    while(isspace(*ptrE) || *ptrE=='\0' || *ptrE=='#') {
+        ptrE--;
+    }
+
+    // Length, sLen, does not include '\0'
+    sLen = ptrE - ptrB + 1;
+
+    // Adds '\0' to end of string and +1 to sLen
+    cleaned = psStringNCopy(ptrB, sLen);
+
+    return cleaned;
+}
+
+/** Count repeat occurances of a single character within a line. The input string must be null terminated. */
+psS32 repeatedChars(char *inString, char ch)
+{
+    psS32 count = 0;
+
+
+    while(*inString!='\0') {
+        if(*inString == ch) {
+            count++;
+        }
+        inString++;
+    }
+
+    return count;
+}
+
+/** Returns cleaned token based on delimiter, but not including delimiter. Also changes the pointer location
+ * the beginning of the string. Tokens are newly allocated null terminated strings. */
+char* getToken(char **inString, char *delimiter, psS32 *status)
+{
+    char *cleanToken = NULL;
+    psS32 sLen = 0;
+
+
+    // Skip over leading whitespace
+    while(isspace(**inString)) {
+        (*inString)++;
+    }
+
+    // Length of token, not including delimiter
+    sLen = strcspn(*inString, delimiter);
+    if(sLen) {
+
+        // Create new, cleaned, and null terminated token
+        cleanToken = cleanString(*inString, sLen);
+
+        // Move to end of token
+        (*inString) += sLen;
+    } else if(**inString!='\0' && sLen==0) {
+        *status = 1;
+    }
+
+    return cleanToken;
+}
+
+/** Returns single parsed value as a double precision number. The input string must be cleaned and null
+ * terminated. */
+double parseValue(char *inString, psS32 *status)
+{
+    char *end = NULL;
+    double value = 0.0;
+
+
+    value = strtod(inString, &end);
+    if(*end != '\0') {
+        *status = 1;
+    } else if(inString==end) {
+        *status = 1;
+    }
+
+    return value;
+}
+
+/** Returns true or false. 'T', 't', '1', 'F', 'f', and '0' are acceptable, parsable variations. */
+psBool parseBool(char *inString, psS32 *status)
+{
+    psBool value = false;
+
+
+    if(*inString=='T' || *inString=='t' || *inString=='1') {
+        value = true;
+    } else if(*inString=='F' || *inString=='f' || *inString=='0') {
+        value = false;
+    } else {
+        *status = 1;
+    }
+
+    return value;
+}
+
+/** Returns parsed vector filled with with data. The input string must be null terminated. */
+psVector* parseVector(char *inString, psElemType elemType, psS32 *status)
+{
+    char *end = NULL;
+    char *saveValue = NULL;
+    psS32 i = 0;
+    psS32 numValues = 0;
+    double value = 0.0;
+    psVector *vec = NULL;
+
+
+    // Cycle through string and count entries
+    saveValue = inString;
+    while(*inString!='\0') {
+        strtod(inString, &end);
+        if(inString==end) {
+            *status = 1;
+            return NULL;
+        }
+        while(*end==' ' || *end==',') { // Commas or spaces may be used as delimiters for vector values
+            end++;
+        }
+        inString=end;
+        numValues++;
+    }
+
+    // Cycle through string and convert string values to values
+    if(numValues) {
+        inString = saveValue;
+        end = NULL;
+        vec = psVectorAlloc(numValues, elemType);
+
+        while(*inString!='\0') {
+            value = strtod(inString, &end);
+            if(inString==end) {
+                *status = 1;
+                return vec;
+            }
+            switch(elemType) {
+            case PS_TYPE_U8:
+                vec->data.U8[i++] = (psU8)value;
+                break;
+            case PS_TYPE_S32:
+                vec->data.S32[i++] = (psS32)value;
+                break;
+            case PS_TYPE_F32:
+                vec->data.F32[i++] = (psF32)value;
+                break;
+            case PS_TYPE_F64:
+                vec->data.F64[i++] = (psF64)value;
+                break;
+            default:
+                *status = 1;
+                psError(PS_ERR_BAD_PARAMETER_VALUE,true,
+                        PS_ERRORTEXT_psMetadataIO_TYPE_INVALID,
+                        elemType);
+            }
+
+            while(*end==' ' || *end==',') {
+                end++;
+            }
+            inString=end;
+        }
+    }
+
+    return vec;
+}
+
+/*****************************************************************************/
+/* FUNCTION IMPLEMENTATION - PUBLIC                                          */
+/*****************************************************************************/
+
+bool psMetadataItemPrint(FILE * fd, const char *format, const psMetadataItem* metadataItem)
+{
+    psMetadataType type;
+    psBool success = true;
+
+    PS_PTR_CHECK_NULL(fd, success);
+    PS_PTR_CHECK_NULL(format, success);
+    PS_PTR_CHECK_NULL(metadataItem, success);
+
+    type = metadataItem->type;
+
+    // determining the format type
+    char* fType = strchr(format,'%');
+    if (fType == NULL) {
+        // well, the format contains no reference to the metadataItem's data:
+        // that is truly trival to do!
+        fprintf(fd,format);
+        return success;
+    }
+
+    // skip over any format modifiers
+    const char* formatEnd = format+strlen(format);
+    while ( (fType < formatEnd) &&
+        (strchr(" +-01234567890.$#, hlL",*(++fType)) != NULL) ) {}
+
+    #define METADATAITEM_NUMERIC_CAST(FORMAT_TYPE) { \
+        switch(type) { \
+        case PS_META_BOOL: \
+            fprintf(fd, format, (FORMAT_TYPE) metadataItem->data.B); \
+            break; \
+        case PS_META_S32: \
+            fprintf(fd,format,(FORMAT_TYPE)  metadataItem->data.S32); \
+            break; \
+        case PS_META_F32: \
+            fprintf(fd, format,(FORMAT_TYPE)  metadataItem->data.F32); \
+            break; \
+        case PS_META_F64: \
+            fprintf(fd, format,(FORMAT_TYPE) metadataItem->data.F64); \
+            break; \
+        default: \
+            psError(PS_ERR_BAD_PARAMETER_TYPE,true, \
+                    PS_ERRORTEXT_psMetadata_METATYPE_INVALID, (int)type); \
+            success = false; \
+        } \
+    }
+
+    switch(*fType) {
+    case 'd':
+    case 'i':
+    case 'c':
+        METADATAITEM_NUMERIC_CAST(int)
+        break;
+    case 'o':
+    case 'u':
+    case 'x':
+    case 'X':
+        METADATAITEM_NUMERIC_CAST(unsigned int)
+        break;
+    case 'e':
+    case 'E':
+    case 'f':
+    case 'F':
+    case 'g':
+    case 'G':
+    case 'a':
+    case 'A':
+        METADATAITEM_NUMERIC_CAST(double)
+        break;
+    case 's':
+        if (type == PS_META_STR) {
+            fprintf(fd,format,(char*)metadataItem->data.V);
+        } else {
+            psError(PS_ERR_BAD_PARAMETER_TYPE,true,
+                    PS_ERRORTEXT_psMetadata_METATYPE_INVALID, (int)type);
+            success = false;
+        }
+        break;
+    case 'p':
+        fprintf(fd,format,metadataItem->data.V);
+        break;
+    default:
+        psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                PS_ERRORTEXT_psMetadata_FORMAT_INVALID, *fType);
+        break;
+    }
+
+    return success;
+}
+
+
+psMetadata* psMetadataReadHeader(psMetadata* output, char *extName, psS32 extNum, char *fileName)
+{
+    psBool tempBool;
+    psBool success;
+    char keyType;
+    char keyName[FITS_LINE_SIZE];
+    char keyValue[FITS_LINE_SIZE];
+    char keyComment[FITS_LINE_SIZE];
+    char fitsErr[MAX_STRING_LENGTH];
+    psS32 i;
+    psS32 hduType = 0;
+    psS32 status = 0;
+    psS32 numKeys = 0;
+    psS32 keyNum = 0;
+    fitsfile *fd = NULL;
+
+    PS_PTR_CHECK_NULL(fileName,NULL);
+
+    fits_open_file(&fd, fileName, READONLY, &status);
+    if(fd == NULL || status != 0) {
+        FITS_ERROR("FITS error while opening file: %s %s", fileName);
+        return NULL;
+    }
+
+    if (extName == NULL && extNum < 1) {
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true,
+                PS_ERRORTEXT_psMetadataIO_EXTNUM_NOTPOSITIVE,
+                extNum);
+        return NULL;
+    }
+
+    // Allocate metadata if user didn't
+    if (output == NULL) {
+        output = psMetadataAlloc();
+    }
+
+    // Move to user designated HDU number or HDU name in FITS file. HDU numbers starts at one.
+    if (extName != NULL) {
+        if (fits_movnam_hdu(fd, ANY_HDU, extName, 0, &status) != 0) {
+            FITS_ERROR("FITS error while locating header %s: %s", extName);
+        }
+    } else {
+        if (fits_movabs_hdu(fd, extNum, &hduType, &status) != 0) {
+            FITS_ERROR("FITS error while locating header %d: %s", extNum);
+        }
+    }
+
+    // Get number of key names
+    if (fits_get_hdrpos(fd, &numKeys, &keyNum, &status) != 0) {
+        FITS_ERROR("FITS error while reading key %d: %s", keyNum);
+    }
+
+    // Get each key name. Keywords start at one.
+    for (i = 1; i <= numKeys; i++) {
+        if (fits_read_keyn(fd, i, keyName, keyValue, keyComment, &status) != 0) {
+            FITS_ERROR("FITS error while reading key %d: %s", keyNum);
+        }
+        if (fits_get_keytype(keyValue, &keyType, &status) != 0) {
+            fits_get_errstatus(status, fitsErr);
+            if (status != VALUE_UNDEFINED) {
+                FITS_ERROR("FITS error while determining key %d type: %s", keyNum);
+            } else {
+                // Some keywords are still valid if they don't have a type (like COMMENTS and HISTORY)
+                keyType = 'C';
+                status = 0;
+            }
+        }
+
+        switch (keyType) {
+        case 'I':
+            success = psMetadataAdd(output, PS_LIST_TAIL, keyName,
+                                    PS_META_S32 | PS_META_DUPLICATE_OK,
+                                    keyComment, atoi(keyValue));
+            break;
+        case 'F':
+            success = psMetadataAdd(output, PS_LIST_TAIL, keyName,
+                                    PS_META_F64 | PS_META_DUPLICATE_OK,
+                                    keyComment, atof(keyValue));
+            break;
+        case 'C':
+            success = psMetadataAdd(output, PS_LIST_TAIL, keyName,
+                                    PS_META_STR | PS_META_DUPLICATE_OK,
+                                    keyComment, keyValue);
+            break;
+        case 'L':
+            tempBool = (keyValue[0] == 'T') ? 1 : 0;
+            success = psMetadataAdd(output, PS_LIST_TAIL, keyName,
+                                    PS_META_BOOL | PS_META_DUPLICATE_OK,
+                                    keyComment, tempBool);
+            break;
+        case 'U':
+        case 'X':
+        default:
+            psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_FITS_METATYPE_INVALID, keyType);
+            return output;
+        }
+
+        if (!success) {
+            psError(PS_ERR_UNKNOWN, false, PS_ERRORTEXT_psMetadataIO_ADD_FAILED, keyName);
+            return output;
+        }
+    }
+
+    return output;
+}
+
+psMetadata* psMetadataParseConfig(psMetadata* md, psU32 *nFail, const char *fileName, psBool overwrite)
+{
+    psBool tempBool;
+    char *line = NULL;
+    char *strName = NULL;
+    char *strType = NULL;
+    char *strValue = NULL;
+    char *strComment = NULL;
+    char *linePtr = NULL;
+    psElemType vecType = 0;
+    psS32 status = 0;
+    psU32 lineCount = 0;
+    psF64 tempDbl = 0.0;
+    psS32 tempInt = 0.0;
+    psVector *tempVec = NULL;
+    FILE *fp = NULL;
+    psMetadataType mdType;
+    psMetadataFlags flags;
+    psBool addStatus;
+
+    // Check for nulls
+    PS_PTR_CHECK_NULL(fileName,NULL);
+    if((fp=fopen(fileName, "r")) == NULL) {
+        psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_FILE_OPEN_FAILED, fileName);
+        return NULL;
+    }
+
+    // Allocate metadata if necessary
+    if (md == NULL) {
+        md = psMetadataAlloc();
+    }
+
+    // Create reusable line for continuous read
+    line = (char*)psAlloc(MAX_STRING_LENGTH*sizeof(char));
+
+    // While loop to parse the file
+    while(fgets(line, MAX_STRING_LENGTH, fp) != NULL) {
+
+        // Initialize variables for new line
+        linePtr = line;
+        lineCount++;
+        CLEAR_TEMPS();
+
+        // If line is not a comment or blank, then extract data
+        if(!ignoreLine(linePtr)) {
+
+            // Check for more than one '*' or '@' in a line
+            if(repeatedChars(linePtr, '@') > 1) {
+                (*nFail)++;
+                psError(PS_ERR_IO, true,
+                        PS_ERRORTEXT_psMetadataIO_FILE_MULTIPLE_CHAR, '@', lineCount, fileName);
+                continue;
+            } else if(repeatedChars(linePtr, '*') > 1) {
+                (*nFail)++;
+                psError(PS_ERR_IO, true,
+                        PS_ERRORTEXT_psMetadataIO_FILE_MULTIPLE_CHAR, '*', lineCount, fileName);
+                continue;
+            } else if(repeatedChars(linePtr, '~') > 0) {
+                (*nFail)++;
+                psError(PS_ERR_IO, true,
+                        PS_ERRORTEXT_psMetadataIO_FILE_MULTIPLE_CHAR, '~', lineCount, fileName);
+                continue;
+            }
+
+            // Get metadata item name
+            strName = getToken(&linePtr, " ", &status);
+            if(strName==NULL || status) {
+                (*nFail)++;
+                status = 0;
+                psError(PS_ERR_IO, true,
+                        PS_ERRORTEXT_psMetadataIO_FILE_ELEMENT_NULL, "name", lineCount, fileName);
+                continue;
+            }
+
+            flags = (overwrite) ? PS_META_REPLACE : PS_META_DEFAULT;
+
+            // Get the metadata item type
+            strType = getToken(&linePtr, " ", &status);
+            if(strType==NULL) {
+                (*nFail)++;
+                status = 0;
+                psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_FILE_ELEMENT_NULL, "type",lineCount,
+                        fileName);
+                continue;
+            } else {
+                char* tempStrType = strType;
+                if(*strType == '*') {
+                    flags = PS_META_DUPLICATE_OK;
+                    tempStrType = strType+1;
+                }
+
+                if(!strncmp(tempStrType, "STR", 3)) {
+                    mdType = PS_META_STR;
+                } else if(!strncmp(tempStrType, "BOOL", 4)) {
+                    mdType = PS_META_BOOL;
+                } else if(!strncmp(tempStrType, "S32", 3)) {
+                    mdType = PS_META_S32;
+                } else if(!strncmp(tempStrType, "F32", 3)) {
+                    mdType = PS_META_F32;
+                } else if(!strncmp(tempStrType, "F64", 3)) {
+                    mdType = PS_META_F64;
+                } else {
+                    (*nFail)++;
+                    psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_FILE_TYPE_INVALID, strType, lineCount,
+                            fileName);
+                    continue;
+                }
+            }
+
+            if(*strName == '@') {
+                vecType = PS_META_PRIMITIVE_TYPE(mdType);
+                mdType = PS_META_VEC;
+            }
+
+            // Get the metadata item value if there is one.
+            strValue = getToken(&linePtr, "#", &status);
+            if(status) {
+                (*nFail)++;
+                status = 0;
+                psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_FILE_ELEMENT_NULL, "comment", lineCount,
+                        fileName);
+                continue;
+            }
+            if(strValue==NULL) {
+                (*nFail)++;
+                status = 0;
+                psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_FILE_ELEMENT_NULL, "value", lineCount,
+                        fileName);
+                continue;
+            }
+
+            // Not all lines will have comments, so NULL is ok.
+            strComment = getToken(&linePtr,"~", &status);
+            if(status) {
+                (*nFail)++;
+                status = 0;
+                psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_FILE_ELEMENT_NULL, "comment", lineCount,
+                        fileName);
+                continue;
+            }
+
+            // Create and add metadata item to metadata and parse values
+            switch (mdType) {
+            case PS_META_STR:
+                addStatus = psMetadataAdd(md, PS_LIST_TAIL, strName,
+                                          mdType | flags,
+                                          strComment, strValue);
+                break;
+            case PS_META_VEC:
+                tempVec = parseVector(strValue, vecType, &status);
+                if(!status) {
+                    addStatus = psMetadataAdd(md, PS_LIST_TAIL, strName+1,
+                                              mdType | flags,
+                                              strComment, tempVec);
+                } else {
+                    status = 0;
+                    (*nFail)++;
+                    psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_PARSE_FAILED, strValue, strName,
+                            strType, lineCount, fileName);
+                    continue;
+                }
+                psFree(tempVec);
+                break;
+            case PS_META_BOOL:
+                tempBool = parseBool(strValue, &status);
+                if(!status) {
+                    addStatus = psMetadataAdd(md, PS_LIST_TAIL, strName,
+                                              mdType | flags,
+                                              strComment, tempBool);
+                } else {
+                    status = 0;
+                    (*nFail)++;
+                    psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_PARSE_FAILED, strValue, strName,
+                            strType, lineCount, fileName);
+                    continue;
+                }
+                break;
+            case PS_META_S32:
+                tempInt = (psS32)parseValue(strValue, &status);
+                if(!status) {
+                    addStatus = psMetadataAdd(md, PS_LIST_TAIL, strName,
+                                              mdType | flags,
+                                              strComment, tempInt);
+                } else {
+                    status = 0;
+                    (*nFail)++;
+                    psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_PARSE_FAILED, strValue, strName,
+                            strType, lineCount, fileName);
+                    continue;
+                }
+                break;
+            case PS_META_F32:
+            case PS_META_F64:
+                tempDbl = parseValue(strValue, &status);
+                if(!status) {
+                    addStatus = psMetadataAdd(md, PS_LIST_TAIL, strName,
+                                              mdType | flags,
+                                              strComment, tempDbl);
+                } else {
+                    status = 0;
+                    (*nFail)++;
+                    psError(PS_ERR_IO, true,
+                            PS_ERRORTEXT_psMetadataIO_PARSE_FAILED, strValue, strName, strType, lineCount,
+                            fileName);
+                    continue;
+                }
+                break;
+            default:
+                (*nFail)++;
+                psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_FILE_TYPE_INVALID, mdType, lineCount,
+                        fileName);
+                continue;
+            } // switch
+            if (! addStatus) {
+                (*nFail)++;
+                psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_OVERWRITE_ITEM, strName, lineCount,
+                        fileName);
+            }
+
+        } // if ignoreLine
+    } // while loop
+
+    psFree(line);
+
+    return md;
+}
+
+static void saxStartElement(void *ctx, const xmlChar *tagName, const xmlChar **atts)
+{
+    psU64 i = 0;
+    char* psTagName = NULL;
+    char *psAttName = NULL;
+    char *psAttValue = NULL;
+    const xmlChar *attName = NULL;
+    const xmlChar *attValue = NULL;
+    psMetadata* md = NULL;
+    psHash* htAtts = NULL;
+    xmlParserCtxtPtr ctxt = NULL;
+    xmlParserInputPtr input = NULL;
+
+
+    // Get and check initial data pointers
+    ctxt = (xmlParserCtxtPtr)ctx;
+    PS_PTR_CHECK_NULL_GENERAL(ctxt, return);
+    md = (psMetadata*)ctxt->sax->_private;
+    PS_PTR_CHECK_NULL_GENERAL(md, return);
+    input = (xmlParserInputPtr)ctxt->input;
+    PS_PTR_CHECK_NULL_GENERAL(input, return);
+
+    // Copy XML strings to psStrings to avoid libxml2/psLib memory corruption problems
+    psTagName = psStringCopy(tagName);
+
+    // Metadata containter for housing element attributes used by other SAX events
+    htAtts = psHashAlloc(10);
+
+
+    // Get tag name
+    if(psTagName != NULL) {
+        psHashAdd(htAtts, "tagName", psTagName);
+    } else {
+        PS_PTR_CHECK_NULL_GENERAL(psTagName, return);
+        psFree(htAtts);
+        psFree(psTagName);
+        return;
+    }
+
+    // Get all attribute names and attribute values
+    if(atts != NULL) {
+        attName = atts[i++];
+        attValue = atts[i++];
+        while(attName != NULL) {
+            if(attValue != NULL) {
+
+                // Copy XML strings to psStrings to avoid libxml2/psLib memory corruption problems
+                psAttName = psStringCopy(attName);
+                psAttValue = psStringCopy(attValue);
+                psHashAdd(htAtts, psAttName, psAttValue);
+                psFree(psAttName);
+                psFree(psAttValue);
+            } else {
+                PS_PTR_CHECK_NULL_GENERAL(psAttValue, return);
+                psFree(htAtts);
+                psFree(psTagName);
+                return;
+            }
+            attName = atts[i++];
+            attValue = atts[i++];
+        }
+    }
+
+    // Add attributes to metadata
+
+    psMetadataAdd(md, PS_LIST_TAIL, "htAtts",
+                  PS_META_HASH | PS_META_DUPLICATE_OK,
+                  NULL, htAtts);
+
+    psFree(psTagName);
+    psFree(htAtts);
+
+    return;
+}
+
+static void initMetadataItemXml(void *ctx, char *tagName)
+{
+    psBool overwrite = false;
+    psBool tempBool = false;
+    psS32 status = 0;
+    psU32 lineNumber = 0;
+    psF64 tempDbl = 0.0;
+    psS32 tempInt = 0.0;
+    psMetadataType mdType = PS_META_UNKNOWN;
+    char *fileName = NULL;
+    char *strName = NULL;
+    char *strType = NULL;
+    char *strValue = NULL;
+    psMetadata* md = NULL;
+    psHash* htAtts = NULL;
+    psMetadataItem *metadataItem = NULL;
+    xmlParserCtxtPtr ctxt = NULL;
+    xmlParserInputPtr input = NULL;
+
+
+    // Get and check initial data pointers
+    ctxt = (xmlParserCtxtPtr)ctx;
+    PS_PTR_CHECK_NULL_GENERAL(ctxt, return);
+    md = (psMetadata*)ctxt->sax->_private;
+    PS_PTR_CHECK_NULL_GENERAL(md, return);
+    input = (xmlParserInputPtr)ctxt->input;
+    PS_PTR_CHECK_NULL_GENERAL(input, return);
+    metadataItem = psMetadataLookup(md, "htAtts");
+    PS_PTR_CHECK_NULL_GENERAL(metadataItem, return);
+    PS_PTR_CHECK_NULL_GENERAL(metadataItem->data.list, return);
+    metadataItem = (psMetadataItem*)psListGet(metadataItem->data.list,PS_LIST_TAIL);
+    htAtts = (psHash*)metadataItem->data.list;
+    PS_PTR_CHECK_NULL_GENERAL(htAtts, return);
+    fileName = (char*)input->filename;
+    PS_PTR_CHECK_NULL_GENERAL(fileName, return);
+    lineNumber = input->line;
+
+    // Get attribute name
+    strName = psHashLookup(htAtts, "name");
+    if(strName == NULL) {
+        psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_NO_NAME, lineNumber, fileName);
+        return;
+    }
+
+    // Get attribute type, if there is one
+    strType = psHashLookup(htAtts, "psType");
+    if(strType!= NULL) {
+        if(xmlStrEqual(BAD_CAST strType, BAD_CAST "psString")) {
+            mdType = PS_META_STR;
+        } else if(xmlStrEqual(BAD_CAST strType, BAD_CAST "psBool")) {
+            mdType = PS_META_BOOL;
+        } else if(xmlStrEqual(BAD_CAST strType, BAD_CAST "psS32")) {
+            mdType = PS_META_S32;
+        } else if(xmlStrEqual(BAD_CAST strType, BAD_CAST "psF32")) {
+            mdType = PS_META_F32;
+        } else if(xmlStrEqual(BAD_CAST strType, BAD_CAST "psF64")) {
+            mdType = PS_META_F64;
+        } else {
+            psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_TYPE_INVALID_LINE_FILE, strType, lineNumber,
+                    fileName);
+            return;
+        }
+    }
+
+    // Get attribute value, if there is one
+    strValue = psHashLookup(htAtts, "value");
+
+    /* If metadata item is found, and is not a folder node, and overwrite is allowed, then remove
+    existing and allow switch/case below to add new item. If overwrite is false, then report error. If
+    found item is folder node, then psMetadataAdd will automatically add a new child. */
+    metadataItem = psMetadataLookup(md, "overwrite");
+    if(metadataItem != NULL) {
+        overwrite = parseBool((char*)strValue, &status);
+        if(status) {
+            status = 0;
+            psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_PARSE_FAILED, strValue, strName, strType,
+                    lineNumber, fileName);
+        }
+        metadataItem = psMetadataLookup(md, strName);
+        if(metadataItem != NULL) {
+            if(metadataItem->type != PS_META_LIST) {
+                if(overwrite) {
+                    psMetadataRemove(md, INT_MIN, strName);
+                } else {
+                    psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_OVERWRITE_ITEM, strName, lineNumber,
+                            fileName);
+                    return;
+                }
+            }
+        }
+    }
+
+    // Create metadata item and add to metadata
+    switch(mdType) {
+    case PS_META_LIST:
+        psMetadataAdd(md, PS_LIST_TAIL, strName,
+                      mdType | PS_META_DUPLICATE_OK,
+                      NULL, NULL);
+        break;
+    case PS_META_STR:
+        psMetadataAdd(md, PS_LIST_TAIL, strName,
+                      mdType | PS_META_DUPLICATE_OK,
+                      NULL, strValue);
+        break;
+    case PS_META_BOOL:
+        tempBool = parseBool((char*)strValue, &status);
+        if(!status) {
+            psMetadataAdd(md, PS_LIST_TAIL, strName,
+                          mdType | PS_META_DUPLICATE_OK,
+                          NULL, tempBool);
+        } else {
+            status = 0;
+            psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_PARSE_FAILED, strValue, strName, strType,
+                    lineNumber, fileName);
+        }
+        break;
+    case PS_META_S32:
+        tempInt = (psS32)parseValue((char*)strValue, &status);
+        if(!status) {
+            psMetadataAdd(md, PS_LIST_TAIL, strName,
+                          mdType | PS_META_DUPLICATE_OK,
+                          NULL, tempInt);
+        } else {
+            status = 0;
+            psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_PARSE_FAILED, strValue, strName, strType,
+                    lineNumber, fileName);
+        }
+        break;
+    case PS_META_F32:
+    case PS_META_F64:
+        tempDbl = parseValue((char*)strValue, &status);
+        if(!status) {
+            psMetadataAdd(md, PS_LIST_TAIL, strName,
+                          mdType | PS_META_DUPLICATE_OK,
+                          NULL, tempDbl);
+        } else {
+            status = 0;
+            psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_PARSE_FAILED, strValue, strName, strType,
+                    lineNumber, fileName);
+        }
+        break;
+    default:
+        psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_FILE_TYPE_INVALID, strType, lineNumber, fileName);
+    } // End switch
+
+    return;
+}
+
+
+static void initVectorXml(void *ctx, char *tagName)
+{
+    bool overwrite = false;
+    psS32 status = 0;
+    psU32 lineNumber = 0;
+    psElemType pType = 0;
+    char *strName = NULL;
+    char *strType = NULL;
+    char *strValue = NULL;
+    char *fileName = NULL;
+    psMetadataItem *table = NULL;
+    psMetadataItem *tables = NULL;
+    psMetadataItem *metadataItem = NULL;
+    psVector *vec = NULL;
+    psMetadata* md = NULL;
+    psHash* htAtts = NULL;
+    xmlParserCtxtPtr ctxt = NULL;
+    xmlParserInputPtr input = NULL;
+
+
+    // Get and check initial data pointers
+    ctxt = (xmlParserCtxtPtr)ctx;
+    PS_PTR_CHECK_NULL_GENERAL(ctxt, return);
+    md = (psMetadata*)ctxt->sax->_private;
+    PS_PTR_CHECK_NULL_GENERAL(md, return);
+    input = (xmlParserInputPtr)ctxt->input;
+    PS_PTR_CHECK_NULL_GENERAL(input, return);
+    tables = psMetadataLookup(md, "htAtts");
+    PS_PTR_CHECK_NULL_GENERAL(tables, return);
+    PS_PTR_CHECK_NULL_GENERAL(tables->data.list, return);
+    table = (psMetadataItem*)psListGet(tables->data.list,PS_LIST_TAIL);
+    htAtts = (psHash*)table->data.list;
+    PS_PTR_CHECK_NULL_GENERAL(htAtts, return);
+    fileName = (char*)input->filename;
+    PS_PTR_CHECK_NULL_GENERAL(fileName, return);
+    lineNumber = input->line;
+
+    // Get attribute name
+    strName = psHashLookup(htAtts, "name");
+    if(strName == NULL) {
+        psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_NO_NAME, lineNumber, fileName);
+        return;
+    }
+
+    // Get attribute type, if there is one
+    strType = psHashLookup(htAtts, "psType");
+    if(strType!= NULL) {
+        if(xmlStrEqual(BAD_CAST strType, BAD_CAST "psBool")) {
+            pType = PS_TYPE_U8;
+        } else if(xmlStrEqual(BAD_CAST strType, BAD_CAST "psS32")) {
+            pType = PS_TYPE_S32;
+        } else if(xmlStrEqual(BAD_CAST strType, BAD_CAST "psF32")) {
+            pType = PS_TYPE_F32;
+        } else if(xmlStrEqual(BAD_CAST strType, BAD_CAST "psF64")) {
+            pType = PS_TYPE_F64;
+        } else {
+            psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_TYPE_INVALID_LINE_FILE, strName, lineNumber,
+                    fileName);
+            return;
+        }
+    }
+
+    strValue = psHashLookup(htAtts, "value");
+    PS_PTR_CHECK_NULL_GENERAL(strValue, return);
+
+
+    /* If metadata item is found, and is not a folder node, and overwrite is allowed, then remove
+    existing and allow switch/case below to add new item. If overwrite is false, then report error. If
+    found item is folder node, then psMetadataAdd will automatically add a new child. */
+    metadataItem = psMetadataLookup(md, "overwrite");
+    if(metadataItem != NULL) {
+        overwrite = parseBool((char*)strValue, &status);
+        if(status) {
+            status = 0;
+            psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_PARSE_FAILED, strValue, strName, strType,
+                    input->line, input->filename);
+        }
+        metadataItem = psMetadataLookup(md, strName);
+        if(metadataItem != NULL) {
+            if(metadataItem->type != PS_META_LIST) {
+                if(overwrite) {
+                    psMetadataRemove(md, INT_MIN, strName);
+                } else {
+                    psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_OVERWRITE_ITEM, strName, lineNumber,
+                            fileName);
+                    return;
+                }
+            }
+        }
+    }
+
+    // Get value
+    vec = parseVector((char*)strValue, pType, &status);
+    if(!status) {
+        psMetadataAdd(md, PS_LIST_TAIL, strName+1,
+                      PS_META_VEC | PS_META_DUPLICATE_OK,
+                      NULL, vec);
+    } else {
+        psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_PARSE_FAILED, strValue, strName, strType,
+                lineNumber, fileName);
+    }
+    psFree(vec);
+}
+
+static void saxEndElement(void *ctx, const xmlChar *tagName)
+{
+    char *psStartTagName = NULL;
+    char *psEndTagName = NULL;
+    psMetadata* md = NULL;
+    psHash* htAtts = NULL;
+    psMetadataItem *table = NULL;
+    psMetadataItem *tables = NULL;
+    xmlParserCtxtPtr ctxt = NULL;
+    xmlParserInputPtr input = NULL;
+
+
+    // Get and check initial data pointers
+    ctxt = (xmlParserCtxtPtr)ctx;
+    PS_PTR_CHECK_NULL_GENERAL(ctxt, return);
+    md = (psMetadata*)ctxt->sax->_private;
+    PS_PTR_CHECK_NULL_GENERAL(md, return);
+    input = (xmlParserInputPtr)ctxt->input;
+    PS_PTR_CHECK_NULL_GENERAL(input, return);
+    tables = psMetadataLookup(md, "htAtts");
+    PS_PTR_CHECK_NULL_GENERAL(tables, return);
+    PS_PTR_CHECK_NULL_GENERAL(tables->data.list, return);
+    table = (psMetadataItem*)psListGet(tables->data.list,PS_LIST_TAIL);
+    htAtts = (psHash*)table->data.list;
+    PS_PTR_CHECK_NULL_GENERAL(htAtts, return);
+
+    // Copy XML strings to psStrings to avoid libxml2/psLib memory corruption problems
+    psEndTagName = psStringCopy(tagName);
+
+    // Compare start and end tag names
+    psStartTagName = psHashLookup(htAtts, "tagName");
+    PS_PTR_CHECK_NULL_GENERAL(psStartTagName, return);
+    if(strcmp(psEndTagName, psStartTagName)) {
+        psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_TAG_MISMATCH, psStartTagName, psEndTagName);
+    }
+
+    // Initialize psLib structs
+    if(!strcmp(psEndTagName, "psMetadataItem")) {
+        initMetadataItemXml(ctx, psEndTagName);
+    } else if(!strcmp(psEndTagName, "psVector")) {
+        initVectorXml(ctx, psEndTagName);
+    } else if(strcmp(psEndTagName, "psRoot")) {
+        psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_TAG_UNKNOWN, psEndTagName);
+    }
+
+    // Free temporary metadata item and its hash table
+    psListRemove(tables->data.list, PS_LIST_TAIL);
+
+    psFree(psEndTagName);
+
+    return;
+}
+
+psMetadata*  psMetadataParseConfigXml(psMetadata* md, psU32 *nFail, const char *fileName, psBool overwrite)
+{
+    xmlSAXHandler saxHandler;
+
+
+    // Error checks
+    PS_PTR_CHECK_NULL(fileName, NULL);
+
+    // Allocate metadata if necessary
+    if (md == NULL) {
+        md = psMetadataAlloc();
+    }
+
+    // Sax handler initializations
+    saxHandler.internalSubset           = NULL;
+    saxHandler.isStandalone             = NULL;
+    saxHandler.hasInternalSubset        = NULL;
+    saxHandler.hasExternalSubset        = NULL;
+    saxHandler.resolveEntity            = NULL;
+    saxHandler.getEntity                = NULL;
+    saxHandler.entityDecl               = NULL;
+    saxHandler.notationDecl             = NULL;
+    saxHandler.attributeDecl            = NULL;
+    saxHandler.elementDecl              = NULL;
+    saxHandler.unparsedEntityDecl       = NULL;
+    saxHandler.setDocumentLocator       = NULL;
+    saxHandler.startDocument            = NULL;
+    saxHandler.endDocument              = NULL;
+    saxHandler.startElement             = saxStartElement;
+    saxHandler.endElement               = saxEndElement;
+    saxHandler.reference                = NULL;
+    saxHandler.characters               = NULL;
+    saxHandler.ignorableWhitespace      = NULL;
+    saxHandler.processingInstruction    = NULL;
+    saxHandler.comment                  = NULL;
+    saxHandler.warning                  = xmlParserError;
+    saxHandler.error                    = xmlParserError;
+    saxHandler.fatalError               = xmlParserError;
+    saxHandler.getParameterEntity       = NULL;
+    saxHandler.cdataBlock               = NULL;
+    saxHandler.externalSubset           = NULL;
+    saxHandler.initialized              = 1;
+    saxHandler._private                 = md;
+    saxHandler.startElementNs           = NULL;
+    saxHandler.endElementNs             = NULL;
+    saxHandler.serror                   = NULL;
+
+    // Parse XML file
+    if (xmlSAXUserParseFile(&saxHandler, NULL, fileName)) {
+        psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_FILE_OPEN_FAILED, fileName);
+        return NULL;
+    }
+
+    // Parser and memory cleanups for libxml2
+    xmlCleanupParser();
+    xmlMemoryDump();
+
+    return md;
+}
Index: /tags/ipp-1-X/bug123/psLib/src/types/psMetadataConfig.h
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/types/psMetadataConfig.h	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/types/psMetadataConfig.h	(revision 22331)
@@ -0,0 +1,85 @@
+/** @file  psMetadataIO.h
+ *
+ *  @brief Contains metadata input/output functions.
+ *
+ *  This file defines functions to read and write metadata to/from an external file.
+ *
+ *  @ingroup Metadata
+ *
+ *  @author Ross Harman, MHPCC
+ *  @author Robert DeSonia, MHPCC
+ *
+ *  @version $Revision: 1.9 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-03-07 20:58:50 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+#ifndef PS_METADATAIO_H
+#define PS_METADATAIO_H
+
+/// @addtogroup Metadata
+/// @{
+
+
+/** Print metadata item to file.
+ *
+ *  Metadata items may be printed to an open file descriptor based on a
+ *  provided format. The format is a sprintf format statement with exactly
+ *  one % formatting command. If the metadata item type is a numeric type,
+ *  this formatting command must also be numeric, and the type conversion
+ *  performed to the value to match the format type. If the metadata type is
+ *  a string, the fromatting command must also be for a string. If the
+ *  metadata type is any other data type, printing is not allowed.
+ *
+ * @return psMetadataItem* : Pointer metadata item.
+ */
+bool psMetadataItemPrint(
+    FILE * fd,                         ///< Pointer to file to write metadata item.
+    const char *format,                ///< Format to print metadata item.
+    const psMetadataItem* metadataItem ///< Metadata item to print.
+);
+
+/** Read metadata header.
+ *
+ *  Read a metadata header from file. If the file is not found, an error is
+ *  reported.
+ *
+ *  @return psMetadata* : Pointer to resulting metadata.
+ */
+psMetadata* psMetadataReadHeader(
+    psMetadata* output,                ///< Resulting metadata from read.
+    char *extName,                     ///< File name extension string.
+    psS32 extNum,                      ///< File name extension number. Starts at 1.
+    char *fileName                     ///< Name of file to read.
+);
+
+/** Read metadata configuration file.
+ *
+ *  Loads pre-defined settings by parsing a configuration file into a psMetadata structure.
+ *
+ *  @return psMetadata* : Resulting metadata from read.
+ */
+psMetadata* psMetadataParseConfig(
+    psMetadata* md,                    ///< Resulting metadata from read.
+    psU32 *nFail,                      ///< Number of failed lines.
+    const char *fileName,              ///< Name of file to read.
+    psBool overwrite                   ///< Allow overwrite of duplicate specifications.
+);
+
+/** Read XML metadata configuration file.
+ *
+ *  Loads pre-defined XML settings by parsing a configuration file into a psMetadata structure.
+ *
+ *  @return psMetadata* : Resulting metadata from read.
+ */
+
+psMetadata*  psMetadataParseConfigXml(
+    psMetadata* md,                    ///< Resulting metadata from read.
+    psU32 *nFail,                      ///< Number of failed lines.
+    const char *fileName,              ///< Name of file to read.
+    psBool overwrite                   ///< Allow overwrite of duplicate specifications.
+);
+
+/// @}
+
+#endif
Index: /tags/ipp-1-X/bug123/psLib/src/xml/psXML.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/xml/psXML.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/xml/psXML.c	(revision 22331)
@@ -0,0 +1,1168 @@
+/** @file  psMetadataIO.c
+*
+*  @brief Contains metadata input/output functions.
+*
+*  This file defines functions to read and write metadata to/from an external file.
+*
+*  @ingroup Metadata
+*
+*  @author Ross Harman, MHPCC
+*
+*  @version $Revision: 1.24 $ $Name: not supported by cvs2svn $
+*  @date $Date: 2005-04-06 01:12:58 $
+*
+*  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+*/
+
+#include <libxml/parser.h>
+#include <fitsio.h>
+#include <string.h>
+#include <ctype.h>
+#include <limits.h>
+
+#include "psAbort.h"
+#include "psType.h"
+#include "psMemory.h"
+#include "psError.h"
+#include "psString.h"
+#include "psList.h"
+#include "psHash.h"
+#include "psVector.h"
+#include "psMetadata.h"
+#include "psMetadataIO.h"
+#include "psConstants.h"
+#include "psAstronomyErrors.h"
+
+
+/******************************************************************************/
+/*  DEFINE STATEMENTS                                                         */
+/******************************************************************************/
+
+/** Check for FITS errors */
+#define FITS_ERROR(STRING,PS_ERROR)                                                                          \
+fits_get_errstatus(status, fitsErr);                                                                         \
+psError(PS_ERR_IO,true, STRING, PS_ERROR, fitsErr);                                                          \
+status = 0;                                                                                                  \
+fits_close_file(fd, &status);                                                                                \
+if(status){                                                                                                  \
+    fits_get_errstatus(status, fitsErr);                                                                     \
+    psError(PS_ERR_IO,true, "Couldn't close FITS file. FITS error: %s", fitsErr);                            \
+}                                                                                                            \
+status = 0;                                                                                                  \
+psFree(output);                                                                                              \
+return NULL;
+
+/** Free and null temporary variables used by config file parser */
+#define CLEAR_TEMPS()                                                                                        \
+if(strName) {                                                                                                \
+    psFree(strName);                                                                                         \
+    strName = NULL;                                                                                          \
+}                                                                                                            \
+if(strType) {                                                                                                \
+    psFree(strType);                                                                                         \
+    strType = NULL;                                                                                          \
+}                                                                                                            \
+if(strValue) {                                                                                               \
+    psFree(strValue);                                                                                        \
+    strValue = NULL;                                                                                         \
+}                                                                                                            \
+if(strComment) {                                                                                             \
+    psFree(strComment);                                                                                      \
+    strComment = NULL;                                                                                       \
+}
+
+/** Maximum size of a FITS line */
+#define FITS_LINE_SIZE 80
+
+/** Maximum size of a string */
+#define MAX_STRING_LENGTH 256
+
+
+/******************************************************************************/
+/*  TYPE DEFINITIONS                                                          */
+/******************************************************************************/
+
+// None
+
+/*****************************************************************************/
+/*  GLOBAL VARIABLES                                                         */
+/*****************************************************************************/
+
+// None
+
+/*****************************************************************************/
+/*  FILE STATIC VARIABLES                                                    */
+/*****************************************************************************/
+
+// None
+
+/*****************************************************************************/
+/*  FUNCTION IMPLEMENTATION - LOCAL                                          */
+/*****************************************************************************/
+
+static void saxEndElement(void *ctx, const xmlChar *tagName);
+static void initVectorXml(void *ctx, char *tagName);
+static void initMetadataItemXml(void *ctx, char *tagName);
+static void saxStartElement(void *ctx, const xmlChar *tagName, const xmlChar **atts);
+
+/** Determines if a line is blank (whitespace only) or a commentline. It returns true if so. The input string
+ *  must be null terminated. */
+psBool ignoreLine(char *inString)
+{
+    while(*inString!='\0' && *inString!='#') {
+        if(!isspace(*inString)) {
+            return false;
+        }
+        inString++;
+    }
+
+    return true;
+}
+
+
+/** Removes leading and trailing whitespace and # characters from a string. The cleaned string is a new null
+ *  terminated copy of the original input string. */
+char *cleanString(char *inString, psS32 sLen)
+{
+    char *ptrB = NULL;
+    char *ptrE = NULL;
+    char *cleaned = NULL;
+
+
+    ptrB = inString;
+
+    /* Skip over leading # or whitespace */
+    while (isspace(*ptrB) || *ptrB=='#') {
+        ptrB++;
+    }
+
+    /* Skip over trailing whitespace, null terminators, and # characters */
+    ptrE = inString + sLen;
+    while(isspace(*ptrE) || *ptrE=='\0' || *ptrE=='#') {
+        ptrE--;
+    }
+
+    // Length, sLen, does not include '\0'
+    sLen = ptrE - ptrB + 1;
+
+    // Adds '\0' to end of string and +1 to sLen
+    cleaned = psStringNCopy(ptrB, sLen);
+
+    return cleaned;
+}
+
+/** Count repeat occurances of a single character within a line. The input string must be null terminated. */
+psS32 repeatedChars(char *inString, char ch)
+{
+    psS32 count = 0;
+
+
+    while(*inString!='\0') {
+        if(*inString == ch) {
+            count++;
+        }
+        inString++;
+    }
+
+    return count;
+}
+
+/** Returns cleaned token based on delimiter, but not including delimiter. Also changes the pointer location
+ * the beginning of the string. Tokens are newly allocated null terminated strings. */
+char* getToken(char **inString, char *delimiter, psS32 *status)
+{
+    char *cleanToken = NULL;
+    psS32 sLen = 0;
+
+
+    // Skip over leading whitespace
+    while(isspace(**inString)) {
+        (*inString)++;
+    }
+
+    // Length of token, not including delimiter
+    sLen = strcspn(*inString, delimiter);
+    if(sLen) {
+
+        // Create new, cleaned, and null terminated token
+        cleanToken = cleanString(*inString, sLen);
+
+        // Move to end of token
+        (*inString) += sLen;
+    } else if(**inString!='\0' && sLen==0) {
+        *status = 1;
+    }
+
+    return cleanToken;
+}
+
+/** Returns single parsed value as a double precision number. The input string must be cleaned and null
+ * terminated. */
+double parseValue(char *inString, psS32 *status)
+{
+    char *end = NULL;
+    double value = 0.0;
+
+
+    value = strtod(inString, &end);
+    if(*end != '\0') {
+        *status = 1;
+    } else if(inString==end) {
+        *status = 1;
+    }
+
+    return value;
+}
+
+/** Returns true or false. 'T', 't', '1', 'F', 'f', and '0' are acceptable, parsable variations. */
+psBool parseBool(char *inString, psS32 *status)
+{
+    psBool value = false;
+
+
+    if(*inString=='T' || *inString=='t' || *inString=='1') {
+        value = true;
+    } else if(*inString=='F' || *inString=='f' || *inString=='0') {
+        value = false;
+    } else {
+        *status = 1;
+    }
+
+    return value;
+}
+
+/** Returns parsed vector filled with with data. The input string must be null terminated. */
+psVector* parseVector(char *inString, psElemType elemType, psS32 *status)
+{
+    char *end = NULL;
+    char *saveValue = NULL;
+    psS32 i = 0;
+    psS32 numValues = 0;
+    double value = 0.0;
+    psVector *vec = NULL;
+
+
+    // Cycle through string and count entries
+    saveValue = inString;
+    while(*inString!='\0') {
+        strtod(inString, &end);
+        if(inString==end) {
+            *status = 1;
+            return NULL;
+        }
+        while(*end==' ' || *end==',') { // Commas or spaces may be used as delimiters for vector values
+            end++;
+        }
+        inString=end;
+        numValues++;
+    }
+
+    // Cycle through string and convert string values to values
+    if(numValues) {
+        inString = saveValue;
+        end = NULL;
+        vec = psVectorAlloc(numValues, elemType);
+
+        while(*inString!='\0') {
+            value = strtod(inString, &end);
+            if(inString==end) {
+                *status = 1;
+                return vec;
+            }
+            switch(elemType) {
+            case PS_TYPE_U8:
+                vec->data.U8[i++] = (psU8)value;
+                break;
+            case PS_TYPE_S32:
+                vec->data.S32[i++] = (psS32)value;
+                break;
+            case PS_TYPE_F32:
+                vec->data.F32[i++] = (psF32)value;
+                break;
+            case PS_TYPE_F64:
+                vec->data.F64[i++] = (psF64)value;
+                break;
+            default:
+                *status = 1;
+                psError(PS_ERR_BAD_PARAMETER_VALUE,true,
+                        PS_ERRORTEXT_psMetadataIO_TYPE_INVALID,
+                        elemType);
+            }
+
+            while(*end==' ' || *end==',') {
+                end++;
+            }
+            inString=end;
+        }
+    }
+
+    return vec;
+}
+
+/*****************************************************************************/
+/* FUNCTION IMPLEMENTATION - PUBLIC                                          */
+/*****************************************************************************/
+
+bool psMetadataItemPrint(FILE * fd, const char *format, const psMetadataItem* metadataItem)
+{
+    psMetadataType type;
+    psBool success = true;
+
+    PS_PTR_CHECK_NULL(fd, success);
+    PS_PTR_CHECK_NULL(format, success);
+    PS_PTR_CHECK_NULL(metadataItem, success);
+
+    type = metadataItem->type;
+
+    // determining the format type
+    char* fType = strchr(format,'%');
+    if (fType == NULL) {
+        // well, the format contains no reference to the metadataItem's data:
+        // that is truly trival to do!
+        fprintf(fd,format);
+        return success;
+    }
+
+    // skip over any format modifiers
+    const char* formatEnd = format+strlen(format);
+    while ( (fType < formatEnd) &&
+        (strchr(" +-01234567890.$#, hlL",*(++fType)) != NULL) ) {}
+
+    #define METADATAITEM_NUMERIC_CAST(FORMAT_TYPE) { \
+        switch(type) { \
+        case PS_META_BOOL: \
+            fprintf(fd, format, (FORMAT_TYPE) metadataItem->data.B); \
+            break; \
+        case PS_META_S32: \
+            fprintf(fd,format,(FORMAT_TYPE)  metadataItem->data.S32); \
+            break; \
+        case PS_META_F32: \
+            fprintf(fd, format,(FORMAT_TYPE)  metadataItem->data.F32); \
+            break; \
+        case PS_META_F64: \
+            fprintf(fd, format,(FORMAT_TYPE) metadataItem->data.F64); \
+            break; \
+        default: \
+            psError(PS_ERR_BAD_PARAMETER_TYPE,true, \
+                    PS_ERRORTEXT_psMetadata_METATYPE_INVALID, (int)type); \
+            success = false; \
+        } \
+    }
+
+    switch(*fType) {
+    case 'd':
+    case 'i':
+    case 'c':
+        METADATAITEM_NUMERIC_CAST(int)
+        break;
+    case 'o':
+    case 'u':
+    case 'x':
+    case 'X':
+        METADATAITEM_NUMERIC_CAST(unsigned int)
+        break;
+    case 'e':
+    case 'E':
+    case 'f':
+    case 'F':
+    case 'g':
+    case 'G':
+    case 'a':
+    case 'A':
+        METADATAITEM_NUMERIC_CAST(double)
+        break;
+    case 's':
+        if (type == PS_META_STR) {
+            fprintf(fd,format,(char*)metadataItem->data.V);
+        } else {
+            psError(PS_ERR_BAD_PARAMETER_TYPE,true,
+                    PS_ERRORTEXT_psMetadata_METATYPE_INVALID, (int)type);
+            success = false;
+        }
+        break;
+    case 'p':
+        fprintf(fd,format,metadataItem->data.V);
+        break;
+    default:
+        psError(PS_ERR_BAD_PARAMETER_TYPE, true,
+                PS_ERRORTEXT_psMetadata_FORMAT_INVALID, *fType);
+        break;
+    }
+
+    return success;
+}
+
+
+psMetadata* psMetadataReadHeader(psMetadata* output, char *extName, psS32 extNum, char *fileName)
+{
+    psBool tempBool;
+    psBool success;
+    char keyType;
+    char keyName[FITS_LINE_SIZE];
+    char keyValue[FITS_LINE_SIZE];
+    char keyComment[FITS_LINE_SIZE];
+    char fitsErr[MAX_STRING_LENGTH];
+    psS32 i;
+    psS32 hduType = 0;
+    psS32 status = 0;
+    psS32 numKeys = 0;
+    psS32 keyNum = 0;
+    fitsfile *fd = NULL;
+
+    PS_PTR_CHECK_NULL(fileName,NULL);
+
+    fits_open_file(&fd, fileName, READONLY, &status);
+    if(fd == NULL || status != 0) {
+        FITS_ERROR("FITS error while opening file: %s %s", fileName);
+        return NULL;
+    }
+
+    if (extName == NULL && extNum < 1) {
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true,
+                PS_ERRORTEXT_psMetadataIO_EXTNUM_NOTPOSITIVE,
+                extNum);
+        return NULL;
+    }
+
+    // Allocate metadata if user didn't
+    if (output == NULL) {
+        output = psMetadataAlloc();
+    }
+
+    // Move to user designated HDU number or HDU name in FITS file. HDU numbers starts at one.
+    if (extName != NULL) {
+        if (fits_movnam_hdu(fd, ANY_HDU, extName, 0, &status) != 0) {
+            FITS_ERROR("FITS error while locating header %s: %s", extName);
+        }
+    } else {
+        if (fits_movabs_hdu(fd, extNum, &hduType, &status) != 0) {
+            FITS_ERROR("FITS error while locating header %d: %s", extNum);
+        }
+    }
+
+    // Get number of key names
+    if (fits_get_hdrpos(fd, &numKeys, &keyNum, &status) != 0) {
+        FITS_ERROR("FITS error while reading key %d: %s", keyNum);
+    }
+
+    // Get each key name. Keywords start at one.
+    for (i = 1; i <= numKeys; i++) {
+        if (fits_read_keyn(fd, i, keyName, keyValue, keyComment, &status) != 0) {
+            FITS_ERROR("FITS error while reading key %d: %s", keyNum);
+        }
+        if (fits_get_keytype(keyValue, &keyType, &status) != 0) {
+            fits_get_errstatus(status, fitsErr);
+            if (status != VALUE_UNDEFINED) {
+                FITS_ERROR("FITS error while determining key %d type: %s", keyNum);
+            } else {
+                // Some keywords are still valid if they don't have a type (like COMMENTS and HISTORY)
+                keyType = 'C';
+                status = 0;
+            }
+        }
+
+        switch (keyType) {
+        case 'I':
+            success = psMetadataAdd(output, PS_LIST_TAIL, keyName,
+                                    PS_META_S32 | PS_META_DUPLICATE_OK,
+                                    keyComment, atoi(keyValue));
+            break;
+        case 'F':
+            success = psMetadataAdd(output, PS_LIST_TAIL, keyName,
+                                    PS_META_F64 | PS_META_DUPLICATE_OK,
+                                    keyComment, atof(keyValue));
+            break;
+        case 'C':
+            success = psMetadataAdd(output, PS_LIST_TAIL, keyName,
+                                    PS_META_STR | PS_META_DUPLICATE_OK,
+                                    keyComment, keyValue);
+            break;
+        case 'L':
+            tempBool = (keyValue[0] == 'T') ? 1 : 0;
+            success = psMetadataAdd(output, PS_LIST_TAIL, keyName,
+                                    PS_META_BOOL | PS_META_DUPLICATE_OK,
+                                    keyComment, tempBool);
+            break;
+        case 'U':
+        case 'X':
+        default:
+            psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_FITS_METATYPE_INVALID, keyType);
+            return output;
+        }
+
+        if (!success) {
+            psError(PS_ERR_UNKNOWN, false, PS_ERRORTEXT_psMetadataIO_ADD_FAILED, keyName);
+            return output;
+        }
+    }
+
+    return output;
+}
+
+psMetadata* psMetadataParseConfig(psMetadata* md, psU32 *nFail, const char *fileName, psBool overwrite)
+{
+    psBool tempBool;
+    char *line = NULL;
+    char *strName = NULL;
+    char *strType = NULL;
+    char *strValue = NULL;
+    char *strComment = NULL;
+    char *linePtr = NULL;
+    psElemType vecType = 0;
+    psS32 status = 0;
+    psU32 lineCount = 0;
+    psF64 tempDbl = 0.0;
+    psS32 tempInt = 0.0;
+    psVector *tempVec = NULL;
+    FILE *fp = NULL;
+    psMetadataType mdType;
+    psMetadataFlags flags;
+    psBool addStatus;
+
+    // Check for nulls
+    PS_PTR_CHECK_NULL(fileName,NULL);
+    if((fp=fopen(fileName, "r")) == NULL) {
+        psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_FILE_OPEN_FAILED, fileName);
+        return NULL;
+    }
+
+    // Allocate metadata if necessary
+    if (md == NULL) {
+        md = psMetadataAlloc();
+    }
+
+    // Create reusable line for continuous read
+    line = (char*)psAlloc(MAX_STRING_LENGTH*sizeof(char));
+
+    // While loop to parse the file
+    while(fgets(line, MAX_STRING_LENGTH, fp) != NULL) {
+
+        // Initialize variables for new line
+        linePtr = line;
+        lineCount++;
+        CLEAR_TEMPS();
+
+        // If line is not a comment or blank, then extract data
+        if(!ignoreLine(linePtr)) {
+
+            // Check for more than one '*' or '@' in a line
+            if(repeatedChars(linePtr, '@') > 1) {
+                (*nFail)++;
+                psError(PS_ERR_IO, true,
+                        PS_ERRORTEXT_psMetadataIO_FILE_MULTIPLE_CHAR, '@', lineCount, fileName);
+                continue;
+            } else if(repeatedChars(linePtr, '*') > 1) {
+                (*nFail)++;
+                psError(PS_ERR_IO, true,
+                        PS_ERRORTEXT_psMetadataIO_FILE_MULTIPLE_CHAR, '*', lineCount, fileName);
+                continue;
+            } else if(repeatedChars(linePtr, '~') > 0) {
+                (*nFail)++;
+                psError(PS_ERR_IO, true,
+                        PS_ERRORTEXT_psMetadataIO_FILE_MULTIPLE_CHAR, '~', lineCount, fileName);
+                continue;
+            }
+
+            // Get metadata item name
+            strName = getToken(&linePtr, " ", &status);
+            if(strName==NULL || status) {
+                (*nFail)++;
+                status = 0;
+                psError(PS_ERR_IO, true,
+                        PS_ERRORTEXT_psMetadataIO_FILE_ELEMENT_NULL, "name", lineCount, fileName);
+                continue;
+            }
+
+            flags = (overwrite) ? PS_META_REPLACE : PS_META_DEFAULT;
+
+            // Get the metadata item type
+            strType = getToken(&linePtr, " ", &status);
+            if(strType==NULL) {
+                (*nFail)++;
+                status = 0;
+                psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_FILE_ELEMENT_NULL, "type",lineCount,
+                        fileName);
+                continue;
+            } else {
+                char* tempStrType = strType;
+                if(*strType == '*') {
+                    flags = PS_META_DUPLICATE_OK;
+                    tempStrType = strType+1;
+                }
+
+                if(!strncmp(tempStrType, "STR", 3)) {
+                    mdType = PS_META_STR;
+                } else if(!strncmp(tempStrType, "BOOL", 4)) {
+                    mdType = PS_META_BOOL;
+                } else if(!strncmp(tempStrType, "S32", 3)) {
+                    mdType = PS_META_S32;
+                } else if(!strncmp(tempStrType, "F32", 3)) {
+                    mdType = PS_META_F32;
+                } else if(!strncmp(tempStrType, "F64", 3)) {
+                    mdType = PS_META_F64;
+                } else {
+                    (*nFail)++;
+                    psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_FILE_TYPE_INVALID, strType, lineCount,
+                            fileName);
+                    continue;
+                }
+            }
+
+            if(*strName == '@') {
+                vecType = PS_META_PRIMITIVE_TYPE(mdType);
+                mdType = PS_META_VEC;
+            }
+
+            // Get the metadata item value if there is one.
+            strValue = getToken(&linePtr, "#", &status);
+            if(status) {
+                (*nFail)++;
+                status = 0;
+                psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_FILE_ELEMENT_NULL, "comment", lineCount,
+                        fileName);
+                continue;
+            }
+            if(strValue==NULL) {
+                (*nFail)++;
+                status = 0;
+                psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_FILE_ELEMENT_NULL, "value", lineCount,
+                        fileName);
+                continue;
+            }
+
+            // Not all lines will have comments, so NULL is ok.
+            strComment = getToken(&linePtr,"~", &status);
+            if(status) {
+                (*nFail)++;
+                status = 0;
+                psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_FILE_ELEMENT_NULL, "comment", lineCount,
+                        fileName);
+                continue;
+            }
+
+            // Create and add metadata item to metadata and parse values
+            switch (mdType) {
+            case PS_META_STR:
+                addStatus = psMetadataAdd(md, PS_LIST_TAIL, strName,
+                                          mdType | flags,
+                                          strComment, strValue);
+                break;
+            case PS_META_VEC:
+                tempVec = parseVector(strValue, vecType, &status);
+                if(!status) {
+                    addStatus = psMetadataAdd(md, PS_LIST_TAIL, strName+1,
+                                              mdType | flags,
+                                              strComment, tempVec);
+                } else {
+                    status = 0;
+                    (*nFail)++;
+                    psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_PARSE_FAILED, strValue, strName,
+                            strType, lineCount, fileName);
+                    continue;
+                }
+                psFree(tempVec);
+                break;
+            case PS_META_BOOL:
+                tempBool = parseBool(strValue, &status);
+                if(!status) {
+                    addStatus = psMetadataAdd(md, PS_LIST_TAIL, strName,
+                                              mdType | flags,
+                                              strComment, tempBool);
+                } else {
+                    status = 0;
+                    (*nFail)++;
+                    psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_PARSE_FAILED, strValue, strName,
+                            strType, lineCount, fileName);
+                    continue;
+                }
+                break;
+            case PS_META_S32:
+                tempInt = (psS32)parseValue(strValue, &status);
+                if(!status) {
+                    addStatus = psMetadataAdd(md, PS_LIST_TAIL, strName,
+                                              mdType | flags,
+                                              strComment, tempInt);
+                } else {
+                    status = 0;
+                    (*nFail)++;
+                    psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_PARSE_FAILED, strValue, strName,
+                            strType, lineCount, fileName);
+                    continue;
+                }
+                break;
+            case PS_META_F32:
+            case PS_META_F64:
+                tempDbl = parseValue(strValue, &status);
+                if(!status) {
+                    addStatus = psMetadataAdd(md, PS_LIST_TAIL, strName,
+                                              mdType | flags,
+                                              strComment, tempDbl);
+                } else {
+                    status = 0;
+                    (*nFail)++;
+                    psError(PS_ERR_IO, true,
+                            PS_ERRORTEXT_psMetadataIO_PARSE_FAILED, strValue, strName, strType, lineCount,
+                            fileName);
+                    continue;
+                }
+                break;
+            default:
+                (*nFail)++;
+                psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_FILE_TYPE_INVALID, mdType, lineCount,
+                        fileName);
+                continue;
+            } // switch
+            if (! addStatus) {
+                (*nFail)++;
+                psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_OVERWRITE_ITEM, strName, lineCount,
+                        fileName);
+            }
+
+        } // if ignoreLine
+    } // while loop
+
+    psFree(line);
+
+    return md;
+}
+
+static void saxStartElement(void *ctx, const xmlChar *tagName, const xmlChar **atts)
+{
+    psU64 i = 0;
+    char* psTagName = NULL;
+    char *psAttName = NULL;
+    char *psAttValue = NULL;
+    const xmlChar *attName = NULL;
+    const xmlChar *attValue = NULL;
+    psMetadata* md = NULL;
+    psHash* htAtts = NULL;
+    xmlParserCtxtPtr ctxt = NULL;
+    xmlParserInputPtr input = NULL;
+
+
+    // Get and check initial data pointers
+    ctxt = (xmlParserCtxtPtr)ctx;
+    PS_PTR_CHECK_NULL_GENERAL(ctxt, return);
+    md = (psMetadata*)ctxt->sax->_private;
+    PS_PTR_CHECK_NULL_GENERAL(md, return);
+    input = (xmlParserInputPtr)ctxt->input;
+    PS_PTR_CHECK_NULL_GENERAL(input, return);
+
+    // Copy XML strings to psStrings to avoid libxml2/psLib memory corruption problems
+    psTagName = psStringCopy(tagName);
+
+    // Metadata containter for housing element attributes used by other SAX events
+    htAtts = psHashAlloc(10);
+
+
+    // Get tag name
+    if(psTagName != NULL) {
+        psHashAdd(htAtts, "tagName", psTagName);
+    } else {
+        PS_PTR_CHECK_NULL_GENERAL(psTagName, return);
+        psFree(htAtts);
+        psFree(psTagName);
+        return;
+    }
+
+    // Get all attribute names and attribute values
+    if(atts != NULL) {
+        attName = atts[i++];
+        attValue = atts[i++];
+        while(attName != NULL) {
+            if(attValue != NULL) {
+
+                // Copy XML strings to psStrings to avoid libxml2/psLib memory corruption problems
+                psAttName = psStringCopy(attName);
+                psAttValue = psStringCopy(attValue);
+                psHashAdd(htAtts, psAttName, psAttValue);
+                psFree(psAttName);
+                psFree(psAttValue);
+            } else {
+                PS_PTR_CHECK_NULL_GENERAL(psAttValue, return);
+                psFree(htAtts);
+                psFree(psTagName);
+                return;
+            }
+            attName = atts[i++];
+            attValue = atts[i++];
+        }
+    }
+
+    // Add attributes to metadata
+
+    psMetadataAdd(md, PS_LIST_TAIL, "htAtts",
+                  PS_META_HASH | PS_META_DUPLICATE_OK,
+                  NULL, htAtts);
+
+    psFree(psTagName);
+    psFree(htAtts);
+
+    return;
+}
+
+static void initMetadataItemXml(void *ctx, char *tagName)
+{
+    psBool overwrite = false;
+    psBool tempBool = false;
+    psS32 status = 0;
+    psU32 lineNumber = 0;
+    psF64 tempDbl = 0.0;
+    psS32 tempInt = 0.0;
+    psMetadataType mdType = PS_META_UNKNOWN;
+    char *fileName = NULL;
+    char *strName = NULL;
+    char *strType = NULL;
+    char *strValue = NULL;
+    psMetadata* md = NULL;
+    psHash* htAtts = NULL;
+    psMetadataItem *metadataItem = NULL;
+    xmlParserCtxtPtr ctxt = NULL;
+    xmlParserInputPtr input = NULL;
+
+
+    // Get and check initial data pointers
+    ctxt = (xmlParserCtxtPtr)ctx;
+    PS_PTR_CHECK_NULL_GENERAL(ctxt, return);
+    md = (psMetadata*)ctxt->sax->_private;
+    PS_PTR_CHECK_NULL_GENERAL(md, return);
+    input = (xmlParserInputPtr)ctxt->input;
+    PS_PTR_CHECK_NULL_GENERAL(input, return);
+    metadataItem = psMetadataLookup(md, "htAtts");
+    PS_PTR_CHECK_NULL_GENERAL(metadataItem, return);
+    PS_PTR_CHECK_NULL_GENERAL(metadataItem->data.list, return);
+    metadataItem = (psMetadataItem*)psListGet(metadataItem->data.list,PS_LIST_TAIL);
+    htAtts = (psHash*)metadataItem->data.list;
+    PS_PTR_CHECK_NULL_GENERAL(htAtts, return);
+    fileName = (char*)input->filename;
+    PS_PTR_CHECK_NULL_GENERAL(fileName, return);
+    lineNumber = input->line;
+
+    // Get attribute name
+    strName = psHashLookup(htAtts, "name");
+    if(strName == NULL) {
+        psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_NO_NAME, lineNumber, fileName);
+        return;
+    }
+
+    // Get attribute type, if there is one
+    strType = psHashLookup(htAtts, "psType");
+    if(strType!= NULL) {
+        if(xmlStrEqual(BAD_CAST strType, BAD_CAST "psString")) {
+            mdType = PS_META_STR;
+        } else if(xmlStrEqual(BAD_CAST strType, BAD_CAST "psBool")) {
+            mdType = PS_META_BOOL;
+        } else if(xmlStrEqual(BAD_CAST strType, BAD_CAST "psS32")) {
+            mdType = PS_META_S32;
+        } else if(xmlStrEqual(BAD_CAST strType, BAD_CAST "psF32")) {
+            mdType = PS_META_F32;
+        } else if(xmlStrEqual(BAD_CAST strType, BAD_CAST "psF64")) {
+            mdType = PS_META_F64;
+        } else {
+            psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_TYPE_INVALID_LINE_FILE, strType, lineNumber,
+                    fileName);
+            return;
+        }
+    }
+
+    // Get attribute value, if there is one
+    strValue = psHashLookup(htAtts, "value");
+
+    /* If metadata item is found, and is not a folder node, and overwrite is allowed, then remove
+    existing and allow switch/case below to add new item. If overwrite is false, then report error. If
+    found item is folder node, then psMetadataAdd will automatically add a new child. */
+    metadataItem = psMetadataLookup(md, "overwrite");
+    if(metadataItem != NULL) {
+        overwrite = parseBool((char*)strValue, &status);
+        if(status) {
+            status = 0;
+            psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_PARSE_FAILED, strValue, strName, strType,
+                    lineNumber, fileName);
+        }
+        metadataItem = psMetadataLookup(md, strName);
+        if(metadataItem != NULL) {
+            if(metadataItem->type != PS_META_LIST) {
+                if(overwrite) {
+                    psMetadataRemove(md, INT_MIN, strName);
+                } else {
+                    psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_OVERWRITE_ITEM, strName, lineNumber,
+                            fileName);
+                    return;
+                }
+            }
+        }
+    }
+
+    // Create metadata item and add to metadata
+    switch(mdType) {
+    case PS_META_LIST:
+        psMetadataAdd(md, PS_LIST_TAIL, strName,
+                      mdType | PS_META_DUPLICATE_OK,
+                      NULL, NULL);
+        break;
+    case PS_META_STR:
+        psMetadataAdd(md, PS_LIST_TAIL, strName,
+                      mdType | PS_META_DUPLICATE_OK,
+                      NULL, strValue);
+        break;
+    case PS_META_BOOL:
+        tempBool = parseBool((char*)strValue, &status);
+        if(!status) {
+            psMetadataAdd(md, PS_LIST_TAIL, strName,
+                          mdType | PS_META_DUPLICATE_OK,
+                          NULL, tempBool);
+        } else {
+            status = 0;
+            psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_PARSE_FAILED, strValue, strName, strType,
+                    lineNumber, fileName);
+        }
+        break;
+    case PS_META_S32:
+        tempInt = (psS32)parseValue((char*)strValue, &status);
+        if(!status) {
+            psMetadataAdd(md, PS_LIST_TAIL, strName,
+                          mdType | PS_META_DUPLICATE_OK,
+                          NULL, tempInt);
+        } else {
+            status = 0;
+            psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_PARSE_FAILED, strValue, strName, strType,
+                    lineNumber, fileName);
+        }
+        break;
+    case PS_META_F32:
+    case PS_META_F64:
+        tempDbl = parseValue((char*)strValue, &status);
+        if(!status) {
+            psMetadataAdd(md, PS_LIST_TAIL, strName,
+                          mdType | PS_META_DUPLICATE_OK,
+                          NULL, tempDbl);
+        } else {
+            status = 0;
+            psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_PARSE_FAILED, strValue, strName, strType,
+                    lineNumber, fileName);
+        }
+        break;
+    default:
+        psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_FILE_TYPE_INVALID, strType, lineNumber, fileName);
+    } // End switch
+
+    return;
+}
+
+
+static void initVectorXml(void *ctx, char *tagName)
+{
+    bool overwrite = false;
+    psS32 status = 0;
+    psU32 lineNumber = 0;
+    psElemType pType = 0;
+    char *strName = NULL;
+    char *strType = NULL;
+    char *strValue = NULL;
+    char *fileName = NULL;
+    psMetadataItem *table = NULL;
+    psMetadataItem *tables = NULL;
+    psMetadataItem *metadataItem = NULL;
+    psVector *vec = NULL;
+    psMetadata* md = NULL;
+    psHash* htAtts = NULL;
+    xmlParserCtxtPtr ctxt = NULL;
+    xmlParserInputPtr input = NULL;
+
+
+    // Get and check initial data pointers
+    ctxt = (xmlParserCtxtPtr)ctx;
+    PS_PTR_CHECK_NULL_GENERAL(ctxt, return);
+    md = (psMetadata*)ctxt->sax->_private;
+    PS_PTR_CHECK_NULL_GENERAL(md, return);
+    input = (xmlParserInputPtr)ctxt->input;
+    PS_PTR_CHECK_NULL_GENERAL(input, return);
+    tables = psMetadataLookup(md, "htAtts");
+    PS_PTR_CHECK_NULL_GENERAL(tables, return);
+    PS_PTR_CHECK_NULL_GENERAL(tables->data.list, return);
+    table = (psMetadataItem*)psListGet(tables->data.list,PS_LIST_TAIL);
+    htAtts = (psHash*)table->data.list;
+    PS_PTR_CHECK_NULL_GENERAL(htAtts, return);
+    fileName = (char*)input->filename;
+    PS_PTR_CHECK_NULL_GENERAL(fileName, return);
+    lineNumber = input->line;
+
+    // Get attribute name
+    strName = psHashLookup(htAtts, "name");
+    if(strName == NULL) {
+        psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_NO_NAME, lineNumber, fileName);
+        return;
+    }
+
+    // Get attribute type, if there is one
+    strType = psHashLookup(htAtts, "psType");
+    if(strType!= NULL) {
+        if(xmlStrEqual(BAD_CAST strType, BAD_CAST "psBool")) {
+            pType = PS_TYPE_U8;
+        } else if(xmlStrEqual(BAD_CAST strType, BAD_CAST "psS32")) {
+            pType = PS_TYPE_S32;
+        } else if(xmlStrEqual(BAD_CAST strType, BAD_CAST "psF32")) {
+            pType = PS_TYPE_F32;
+        } else if(xmlStrEqual(BAD_CAST strType, BAD_CAST "psF64")) {
+            pType = PS_TYPE_F64;
+        } else {
+            psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_TYPE_INVALID_LINE_FILE, strName, lineNumber,
+                    fileName);
+            return;
+        }
+    }
+
+    strValue = psHashLookup(htAtts, "value");
+    PS_PTR_CHECK_NULL_GENERAL(strValue, return);
+
+
+    /* If metadata item is found, and is not a folder node, and overwrite is allowed, then remove
+    existing and allow switch/case below to add new item. If overwrite is false, then report error. If
+    found item is folder node, then psMetadataAdd will automatically add a new child. */
+    metadataItem = psMetadataLookup(md, "overwrite");
+    if(metadataItem != NULL) {
+        overwrite = parseBool((char*)strValue, &status);
+        if(status) {
+            status = 0;
+            psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_PARSE_FAILED, strValue, strName, strType,
+                    input->line, input->filename);
+        }
+        metadataItem = psMetadataLookup(md, strName);
+        if(metadataItem != NULL) {
+            if(metadataItem->type != PS_META_LIST) {
+                if(overwrite) {
+                    psMetadataRemove(md, INT_MIN, strName);
+                } else {
+                    psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_OVERWRITE_ITEM, strName, lineNumber,
+                            fileName);
+                    return;
+                }
+            }
+        }
+    }
+
+    // Get value
+    vec = parseVector((char*)strValue, pType, &status);
+    if(!status) {
+        psMetadataAdd(md, PS_LIST_TAIL, strName+1,
+                      PS_META_VEC | PS_META_DUPLICATE_OK,
+                      NULL, vec);
+    } else {
+        psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_PARSE_FAILED, strValue, strName, strType,
+                lineNumber, fileName);
+    }
+    psFree(vec);
+}
+
+static void saxEndElement(void *ctx, const xmlChar *tagName)
+{
+    char *psStartTagName = NULL;
+    char *psEndTagName = NULL;
+    psMetadata* md = NULL;
+    psHash* htAtts = NULL;
+    psMetadataItem *table = NULL;
+    psMetadataItem *tables = NULL;
+    xmlParserCtxtPtr ctxt = NULL;
+    xmlParserInputPtr input = NULL;
+
+
+    // Get and check initial data pointers
+    ctxt = (xmlParserCtxtPtr)ctx;
+    PS_PTR_CHECK_NULL_GENERAL(ctxt, return);
+    md = (psMetadata*)ctxt->sax->_private;
+    PS_PTR_CHECK_NULL_GENERAL(md, return);
+    input = (xmlParserInputPtr)ctxt->input;
+    PS_PTR_CHECK_NULL_GENERAL(input, return);
+    tables = psMetadataLookup(md, "htAtts");
+    PS_PTR_CHECK_NULL_GENERAL(tables, return);
+    PS_PTR_CHECK_NULL_GENERAL(tables->data.list, return);
+    table = (psMetadataItem*)psListGet(tables->data.list,PS_LIST_TAIL);
+    htAtts = (psHash*)table->data.list;
+    PS_PTR_CHECK_NULL_GENERAL(htAtts, return);
+
+    // Copy XML strings to psStrings to avoid libxml2/psLib memory corruption problems
+    psEndTagName = psStringCopy(tagName);
+
+    // Compare start and end tag names
+    psStartTagName = psHashLookup(htAtts, "tagName");
+    PS_PTR_CHECK_NULL_GENERAL(psStartTagName, return);
+    if(strcmp(psEndTagName, psStartTagName)) {
+        psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_TAG_MISMATCH, psStartTagName, psEndTagName);
+    }
+
+    // Initialize psLib structs
+    if(!strcmp(psEndTagName, "psMetadataItem")) {
+        initMetadataItemXml(ctx, psEndTagName);
+    } else if(!strcmp(psEndTagName, "psVector")) {
+        initVectorXml(ctx, psEndTagName);
+    } else if(strcmp(psEndTagName, "psRoot")) {
+        psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_TAG_UNKNOWN, psEndTagName);
+    }
+
+    // Free temporary metadata item and its hash table
+    psListRemove(tables->data.list, PS_LIST_TAIL);
+
+    psFree(psEndTagName);
+
+    return;
+}
+
+psMetadata*  psMetadataParseConfigXml(psMetadata* md, psU32 *nFail, const char *fileName, psBool overwrite)
+{
+    xmlSAXHandler saxHandler;
+
+
+    // Error checks
+    PS_PTR_CHECK_NULL(fileName, NULL);
+
+    // Allocate metadata if necessary
+    if (md == NULL) {
+        md = psMetadataAlloc();
+    }
+
+    // Sax handler initializations
+    saxHandler.internalSubset           = NULL;
+    saxHandler.isStandalone             = NULL;
+    saxHandler.hasInternalSubset        = NULL;
+    saxHandler.hasExternalSubset        = NULL;
+    saxHandler.resolveEntity            = NULL;
+    saxHandler.getEntity                = NULL;
+    saxHandler.entityDecl               = NULL;
+    saxHandler.notationDecl             = NULL;
+    saxHandler.attributeDecl            = NULL;
+    saxHandler.elementDecl              = NULL;
+    saxHandler.unparsedEntityDecl       = NULL;
+    saxHandler.setDocumentLocator       = NULL;
+    saxHandler.startDocument            = NULL;
+    saxHandler.endDocument              = NULL;
+    saxHandler.startElement             = saxStartElement;
+    saxHandler.endElement               = saxEndElement;
+    saxHandler.reference                = NULL;
+    saxHandler.characters               = NULL;
+    saxHandler.ignorableWhitespace      = NULL;
+    saxHandler.processingInstruction    = NULL;
+    saxHandler.comment                  = NULL;
+    saxHandler.warning                  = xmlParserError;
+    saxHandler.error                    = xmlParserError;
+    saxHandler.fatalError               = xmlParserError;
+    saxHandler.getParameterEntity       = NULL;
+    saxHandler.cdataBlock               = NULL;
+    saxHandler.externalSubset           = NULL;
+    saxHandler.initialized              = 1;
+    saxHandler._private                 = md;
+    saxHandler.startElementNs           = NULL;
+    saxHandler.endElementNs             = NULL;
+    saxHandler.serror                   = NULL;
+
+    // Parse XML file
+    if (xmlSAXUserParseFile(&saxHandler, NULL, fileName)) {
+        psError(PS_ERR_IO, true, PS_ERRORTEXT_psMetadataIO_FILE_OPEN_FAILED, fileName);
+        return NULL;
+    }
+
+    // Parser and memory cleanups for libxml2
+    xmlCleanupParser();
+    xmlMemoryDump();
+
+    return md;
+}
Index: /tags/ipp-1-X/bug123/psLib/src/xml/psXML.h
===================================================================
--- /tags/ipp-1-X/bug123/psLib/src/xml/psXML.h	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/src/xml/psXML.h	(revision 22331)
@@ -0,0 +1,85 @@
+/** @file  psMetadataIO.h
+ *
+ *  @brief Contains metadata input/output functions.
+ *
+ *  This file defines functions to read and write metadata to/from an external file.
+ *
+ *  @ingroup Metadata
+ *
+ *  @author Ross Harman, MHPCC
+ *  @author Robert DeSonia, MHPCC
+ *
+ *  @version $Revision: 1.9 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-03-07 20:58:50 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+#ifndef PS_METADATAIO_H
+#define PS_METADATAIO_H
+
+/// @addtogroup Metadata
+/// @{
+
+
+/** Print metadata item to file.
+ *
+ *  Metadata items may be printed to an open file descriptor based on a
+ *  provided format. The format is a sprintf format statement with exactly
+ *  one % formatting command. If the metadata item type is a numeric type,
+ *  this formatting command must also be numeric, and the type conversion
+ *  performed to the value to match the format type. If the metadata type is
+ *  a string, the fromatting command must also be for a string. If the
+ *  metadata type is any other data type, printing is not allowed.
+ *
+ * @return psMetadataItem* : Pointer metadata item.
+ */
+bool psMetadataItemPrint(
+    FILE * fd,                         ///< Pointer to file to write metadata item.
+    const char *format,                ///< Format to print metadata item.
+    const psMetadataItem* metadataItem ///< Metadata item to print.
+);
+
+/** Read metadata header.
+ *
+ *  Read a metadata header from file. If the file is not found, an error is
+ *  reported.
+ *
+ *  @return psMetadata* : Pointer to resulting metadata.
+ */
+psMetadata* psMetadataReadHeader(
+    psMetadata* output,                ///< Resulting metadata from read.
+    char *extName,                     ///< File name extension string.
+    psS32 extNum,                      ///< File name extension number. Starts at 1.
+    char *fileName                     ///< Name of file to read.
+);
+
+/** Read metadata configuration file.
+ *
+ *  Loads pre-defined settings by parsing a configuration file into a psMetadata structure.
+ *
+ *  @return psMetadata* : Resulting metadata from read.
+ */
+psMetadata* psMetadataParseConfig(
+    psMetadata* md,                    ///< Resulting metadata from read.
+    psU32 *nFail,                      ///< Number of failed lines.
+    const char *fileName,              ///< Name of file to read.
+    psBool overwrite                   ///< Allow overwrite of duplicate specifications.
+);
+
+/** Read XML metadata configuration file.
+ *
+ *  Loads pre-defined XML settings by parsing a configuration file into a psMetadata structure.
+ *
+ *  @return psMetadata* : Resulting metadata from read.
+ */
+
+psMetadata*  psMetadataParseConfigXml(
+    psMetadata* md,                    ///< Resulting metadata from read.
+    psU32 *nFail,                      ///< Number of failed lines.
+    const char *fileName,              ///< Name of file to read.
+    psBool overwrite                   ///< Allow overwrite of duplicate specifications.
+);
+
+/// @}
+
+#endif
Index: /tags/ipp-1-X/bug123/psLib/swig/.cvsignore
===================================================================
--- /tags/ipp-1-X/bug123/psLib/swig/.cvsignore	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/swig/.cvsignore	(revision 22331)
@@ -0,0 +1,3 @@
+psLibModule
+Makefile
+Makefile.in
Index: /tags/ipp-1-X/bug123/psLib/swig/Makefile.PL
===================================================================
--- /tags/ipp-1-X/bug123/psLib/swig/Makefile.PL	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/swig/Makefile.PL	(revision 22331)
@@ -0,0 +1,35 @@
+# File : Makefile.PL 
+use ExtUtils::MakeMaker; 
+use FileHandle;
+
+sub ReadSetup {
+  my $filename = shift;
+      #return val
+  my %opts;
+
+  my $fh = FileHandle->new($filename, 'r');
+  while(<$fh>) {
+    /([a-z]+)=(.+)/ && do {
+      $opts{$1} = $2;
+      next;
+    };
+
+    #default:  
+    die "Error:  syntaxt error in setup.txt line $_";
+  }
+  return %opts;
+}
+
+###############  Main ##############
+
+my %opts = ReadSetup("setup.txt");
+
+
+WriteMakefile( 
+	'NAME' => 'pslib',             # Name of package 
+	'INC' => $opts{includes},
+	'LIBS' => ["$opts{ldflags}"],  # Name of custom libraries 
+	'OBJECT' => 'pslib_wrap.o',    # Name of custom libraries 
+	'OPTIMIZE' => $opts{cflags},
+	'LD' => $opts{ld}
+);
Index: /tags/ipp-1-X/bug123/psLib/swig/Makefile.am
===================================================================
--- /tags/ipp-1-X/bug123/psLib/swig/Makefile.am	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/swig/Makefile.am	(revision 22331)
@@ -0,0 +1,49 @@
+
+EXTRA_DIST = pslib.i Makefile.PL example/phase2.pl example/data/*
+
+clean-generic:
+	rm -rf psLibModule
+
+SRCDIR = $(shell cd $(top_srcdir) && pwd)
+INCLUDES = -I$(SRCDIR)/src \
+	-I$(SRCDIR)/src/astronomy \
+	-I$(SRCDIR)/src/collections \
+	-I$(SRCDIR)/src/dataManip \
+	-I$(SRCDIR)/src/dataIO \
+	-I$(SRCDIR)/src/image \
+	-I$(SRCDIR)/src/sysUtils \
+	-I/usr/include \
+	-I/usr/local/include
+
+####################################################
+## PsLibModule swig build section.  
+
+psLibModule:
+	mkdir psLibModule
+
+psLibModule/Makefile.PL: psLibModule
+	cp -f $(srcdir)/Makefile.PL psLibModule/Makefile.PL
+
+psLibModule/setup.txt:psLibModule Makefile
+	echo "includes=$(INCLUDES)" > psLibModule/setup.txt
+	echo "ldflags=-L$(top_builddir)/src $(PSLIB_LIBS)" >> psLibModule/setup.txt
+	echo "cflags=$(CFLAGS) -std=c99 -Wno-unused -Wno-strict-aliasing" >> psLibModule/setup.txt
+
+psLibModule/pslib_wrap.c: psLibModule pslib.i
+	$(SWIG) -perl $(INCLUDES) -w451 -o $@ $(srcdir)/pslib.i 
+
+psLibModule/Makefile:psLibModule psLibModule/Makefile.PL psLibModule/setup.txt
+	cd psLibModule && $(PERL) Makefile.PL PREFIX=$(PERL_PREFIX)
+
+all: psLibModule psLibModule/pslib_wrap.c psLibModule/setup.txt psLibModule/Makefile.PL
+
+swig: all psLibModule/Makefile
+	cd psLibModule && make
+
+swig-check: swig
+	export PERLLIB=psLibModule:psLibModule/blib/arch/auto/pslib && perl -Mpslib -e 'print "pslib version = " . pslib::psLibVersion() . "\n";'
+
+swig-install: swig
+	cd psLibModule && make install
+
+install-exec-hook: swig-install
Index: /tags/ipp-1-X/bug123/psLib/swig/example/data/badpix.fits
===================================================================
--- /tags/ipp-1-X/bug123/psLib/swig/example/data/badpix.fits	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/swig/example/data/badpix.fits	(revision 22331)
@@ -0,0 +1,50 @@
+SIMPLE  =                    T / file does conform to FITS standard             BITPIX  =                  -64 / number of bits per data pixel                  NAXIS   =                    2 / number of data axes                            NAXIS1  =                   10 / length of data axis 1                          NAXIS2  =                   10 / length of data axis 2                          EXTEND  =                    T / FITS dataset may contain extensions            COMMENT   FITS (Flexible Image Transport System) format is defined in 'AstronomyCOMMENT   and Astrophysics', volume 376, page 359; bibcode: 2001A&A...376..359H END                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             p
+
+import os, re, sys
+from math import *
+import pdb
+import rhl
+
+if 0:
+    try:
+        import psLib
+        import ps
+    except: pass
+    
+try:
+    from actUtils import *
+except:
+    print "Failed to import actUtils"
+
+try:
+    from actSim import *
+except:
+    print "Failed to import actSim"
+
+try: import objects
+except: pass
+
+def tb():
+    pdb.pm()
+
+def grep(pattern, list):
+    print filter(lambda x: re.search(pattern, x), list)
+
+try:
+    import psLib
+    mortal = rhl.memCheckLeaks; id0=psLib.psMemGetId()
+except:
+    pass
+
+try:
+    from ds9 import mtv, dot, erase, line, zoom
+except:
+    print "Failed to load ds9"
+    pass
+
+###############################################################################
+
+class foo:
+    def __init__(self, a = 1, b = 2):
+        self.__dict__['a'] = a
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        
Index: /tags/ipp-1-X/bug123/psLib/swig/example/data/base.config
===================================================================
--- /tags/ipp-1-X/bug123/psLib/swig/example/data/base.config	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/swig/example/data/base.config	(revision 22331)
@@ -0,0 +1,3 @@
+#
+SITE    STR     data/site.config
+
Index: /tags/ipp-1-X/bug123/psLib/swig/example/data/bias.fits
===================================================================
--- /tags/ipp-1-X/bug123/psLib/swig/example/data/bias.fits	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/swig/example/data/bias.fits	(revision 22331)
@@ -0,0 +1,50 @@
+SIMPLE  =                    T / file does conform to FITS standard             BITPIX  =                  -64 / number of bits per data pixel                  NAXIS   =                    2 / number of data axes                            NAXIS1  =                   10 / length of data axis 1                          NAXIS2  =                   10 / length of data axis 2                          EXTEND  =                    T / FITS dataset may contain extensions            COMMENT   FITS (Flexible Image Transport System) format is defined in 'AstronomyCOMMENT   and Astrophysics', volume 376, page 359; bibcode: 2001A&A...376..359H END                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             p
+
+import os, re, sys
+from math import *
+import pdb
+import rhl
+
+if 0:
+    try:
+        import psLib
+        import ps
+    except: pass
+    
+try:
+    from actUtils import *
+except:
+    print "Failed to import actUtils"
+
+try:
+    from actSim import *
+except:
+    print "Failed to import actSim"
+
+try: import objects
+except: pass
+
+def tb():
+    pdb.pm()
+
+def grep(pattern, list):
+    print filter(lambda x: re.search(pattern, x), list)
+
+try:
+    import psLib
+    mortal = rhl.memCheckLeaks; id0=psLib.psMemGetId()
+except:
+    pass
+
+try:
+    from ds9 import mtv, dot, erase, line, zoom
+except:
+    print "Failed to load ds9"
+    pass
+
+###############################################################################
+
+class foo:
+    def __init__(self, a = 1, b = 2):
+        self.__dict__['a'] = a
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        
Index: /tags/ipp-1-X/bug123/psLib/swig/example/data/camera-0.config
===================================================================
--- /tags/ipp-1-X/bug123/psLib/swig/example/data/camera-0.config	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/swig/example/data/camera-0.config	(revision 22331)
@@ -0,0 +1,17 @@
+#
+# Fakes for phase2
+#
+RECIPE.PHASE2   STR  data/recipe.config
+NCHIPS          S32  2
+
+NCELLS          S32  3
+CELL_NROW       S32  20
+CELL_NCOL       S32  20
+
+NREADOUTS.0.0   S32  1
+NREADOUTS.0.1   S32  1
+NREADOUTS.0.2   S32  1
+
+NREADOUTS.1.0   S32  1
+NREADOUTS.1.1   S32  1
+NREADOUTS.1.2   S32  1
Index: /tags/ipp-1-X/bug123/psLib/swig/example/data/dark.fits
===================================================================
--- /tags/ipp-1-X/bug123/psLib/swig/example/data/dark.fits	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/swig/example/data/dark.fits	(revision 22331)
@@ -0,0 +1,50 @@
+SIMPLE  =                    T / file does conform to FITS standard             BITPIX  =                  -64 / number of bits per data pixel                  NAXIS   =                    2 / number of data axes                            NAXIS1  =                   10 / length of data axis 1                          NAXIS2  =                   10 / length of data axis 2                          EXTEND  =                    T / FITS dataset may contain extensions            COMMENT   FITS (Flexible Image Transport System) format is defined in 'AstronomyCOMMENT   and Astrophysics', volume 376, page 359; bibcode: 2001A&A...376..359H END                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             p
+
+import os, re, sys
+from math import *
+import pdb
+import rhl
+
+if 0:
+    try:
+        import psLib
+        import ps
+    except: pass
+    
+try:
+    from actUtils import *
+except:
+    print "Failed to import actUtils"
+
+try:
+    from actSim import *
+except:
+    print "Failed to import actSim"
+
+try: import objects
+except: pass
+
+def tb():
+    pdb.pm()
+
+def grep(pattern, list):
+    print filter(lambda x: re.search(pattern, x), list)
+
+try:
+    import psLib
+    mortal = rhl.memCheckLeaks; id0=psLib.psMemGetId()
+except:
+    pass
+
+try:
+    from ds9 import mtv, dot, erase, line, zoom
+except:
+    print "Failed to load ds9"
+    pass
+
+###############################################################################
+
+class foo:
+    def __init__(self, a = 1, b = 2):
+        self.__dict__['a'] = a
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        
Index: /tags/ipp-1-X/bug123/psLib/swig/example/data/data.fits
===================================================================
--- /tags/ipp-1-X/bug123/psLib/swig/example/data/data.fits	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/swig/example/data/data.fits	(revision 22331)
@@ -0,0 +1,50 @@
+SIMPLE  =                    T / file does conform to FITS standard             BITPIX  =                  -64 / number of bits per data pixel                  NAXIS   =                    2 / number of data axes                            NAXIS1  =                   10 / length of data axis 1                          NAXIS2  =                   10 / length of data axis 2                          EXTEND  =                    T / FITS dataset may contain extensions            COMMENT   FITS (Flexible Image Transport System) format is defined in 'AstronomyCOMMENT   and Astrophysics', volume 376, page 359; bibcode: 2001A&A...376..359H END                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             p
+
+import os, re, sys
+from math import *
+import pdb
+import rhl
+
+if 0:
+    try:
+        import psLib
+        import ps
+    except: pass
+    
+try:
+    from actUtils import *
+except:
+    print "Failed to import actUtils"
+
+try:
+    from actSim import *
+except:
+    print "Failed to import actSim"
+
+try: import objects
+except: pass
+
+def tb():
+    pdb.pm()
+
+def grep(pattern, list):
+    print filter(lambda x: re.search(pattern, x), list)
+
+try:
+    import psLib
+    mortal = rhl.memCheckLeaks; id0=psLib.psMemGetId()
+except:
+    pass
+
+try:
+    from ds9 import mtv, dot, erase, line, zoom
+except:
+    print "Failed to load ds9"
+    pass
+
+###############################################################################
+
+class foo:
+    def __init__(self, a = 1, b = 2):
+        self.__dict__['a'] = a
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        
Index: /tags/ipp-1-X/bug123/psLib/swig/example/data/flat.fits
===================================================================
--- /tags/ipp-1-X/bug123/psLib/swig/example/data/flat.fits	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/swig/example/data/flat.fits	(revision 22331)
@@ -0,0 +1,50 @@
+SIMPLE  =                    T / file does conform to FITS standard             BITPIX  =                  -64 / number of bits per data pixel                  NAXIS   =                    2 / number of data axes                            NAXIS1  =                   10 / length of data axis 1                          NAXIS2  =                   10 / length of data axis 2                          EXTEND  =                    T / FITS dataset may contain extensions            COMMENT   FITS (Flexible Image Transport System) format is defined in 'AstronomyCOMMENT   and Astrophysics', volume 376, page 359; bibcode: 2001A&A...376..359H END                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             p
+
+import os, re, sys
+from math import *
+import pdb
+import rhl
+
+if 0:
+    try:
+        import psLib
+        import ps
+    except: pass
+    
+try:
+    from actUtils import *
+except:
+    print "Failed to import actUtils"
+
+try:
+    from actSim import *
+except:
+    print "Failed to import actSim"
+
+try: import objects
+except: pass
+
+def tb():
+    pdb.pm()
+
+def grep(pattern, list):
+    print filter(lambda x: re.search(pattern, x), list)
+
+try:
+    import psLib
+    mortal = rhl.memCheckLeaks; id0=psLib.psMemGetId()
+except:
+    pass
+
+try:
+    from ds9 import mtv, dot, erase, line, zoom
+except:
+    print "Failed to load ds9"
+    pass
+
+###############################################################################
+
+class foo:
+    def __init__(self, a = 1, b = 2):
+        self.__dict__['a'] = a
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        
Index: /tags/ipp-1-X/bug123/psLib/swig/example/data/fringe.fits
===================================================================
--- /tags/ipp-1-X/bug123/psLib/swig/example/data/fringe.fits	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/swig/example/data/fringe.fits	(revision 22331)
@@ -0,0 +1,50 @@
+SIMPLE  =                    T / file does conform to FITS standard             BITPIX  =                  -64 / number of bits per data pixel                  NAXIS   =                    2 / number of data axes                            NAXIS1  =                   10 / length of data axis 1                          NAXIS2  =                   10 / length of data axis 2                          EXTEND  =                    T / FITS dataset may contain extensions            COMMENT   FITS (Flexible Image Transport System) format is defined in 'AstronomyCOMMENT   and Astrophysics', volume 376, page 359; bibcode: 2001A&A...376..359H END                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             p
+
+import os, re, sys
+from math import *
+import pdb
+import rhl
+
+if 0:
+    try:
+        import psLib
+        import ps
+    except: pass
+    
+try:
+    from actUtils import *
+except:
+    print "Failed to import actUtils"
+
+try:
+    from actSim import *
+except:
+    print "Failed to import actSim"
+
+try: import objects
+except: pass
+
+def tb():
+    pdb.pm()
+
+def grep(pattern, list):
+    print filter(lambda x: re.search(pattern, x), list)
+
+try:
+    import psLib
+    mortal = rhl.memCheckLeaks; id0=psLib.psMemGetId()
+except:
+    pass
+
+try:
+    from ds9 import mtv, dot, erase, line, zoom
+except:
+    print "Failed to load ds9"
+    pass
+
+###############################################################################
+
+class foo:
+    def __init__(self, a = 1, b = 2):
+        self.__dict__['a'] = a
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        
Index: /tags/ipp-1-X/bug123/psLib/swig/example/data/recipe.config
===================================================================
--- /tags/ipp-1-X/bug123/psLib/swig/example/data/recipe.config	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/swig/example/data/recipe.config	(revision 22331)
@@ -0,0 +1,35 @@
+#
+# Default filenames
+#
+BADPIX.IMAGE    STR     FILE:data/badpix.fits
+BIAS.IMAGE      STR     FILE:data/bias.fits
+DARK.IMAGE      STR     FILE:data/dark.fits
+FLAT.IMAGE      STR     FILE:data/flat.fits
+FRINGE.IMAGE    STR     FILE:data/fringe.fits
+#
+BIAS.OVERSCAN STR  HEADER:BIASSEC
+
+BIAS.OVERSCAN.STATS     STR     XXX
+
+# BIAS.OVERSCAN.FIT: NONE POLYNOMIAL SPLINE 
+BIAS.OVERSCAN.FIT       STR     NONE
+
+BIAS.OVERSCAN.FIT.NBIN  S32     10
+BIAS.OVERSCAN.FIT.NPTS  S32     10
+BIAS.OVERSCAN.FIT.ORDER S32     1
+
+# The dark scaling
+DARK.FACTOR     STR     VALUE:1
+
+# Linearity corrections
+#NONLINEAR.METHOD: LOOKUP NONE POLYNOMIAL
+NONLINEAR.METHOD   STR  NONE
+NONLINEAR.ORDER    S32  3               # Why do we need this? It's implicit in .COEFFS
+@NONLINEAR.COEFFS  F64 1 2 3
+NONLINEAR.IN_FLUX          STR  foo.in.fits
+NONLINEAR.OUT_FLUX         STR  foo.out.fits
+
+#
+# How to trim the file
+#
+TRIM.DATASEC    STR     HEADER:DATASEC
Index: /tags/ipp-1-X/bug123/psLib/swig/example/data/site.config
===================================================================
--- /tags/ipp-1-X/bug123/psLib/swig/example/data/site.config	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/swig/example/data/site.config	(revision 22331)
@@ -0,0 +1,1 @@
+CAMERA.0 STR data/camera-0.config # Camera filename
Index: /tags/ipp-1-X/bug123/psLib/swig/example/phase2.pl
===================================================================
--- /tags/ipp-1-X/bug123/psLib/swig/example/phase2.pl	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/swig/example/phase2.pl	(revision 22331)
@@ -0,0 +1,484 @@
+#!/usr/bin/perl -w
+package phase2;
+
+use strict;
+use pslib;
+#
+# Prototypes
+#
+sub DefineStats($);
+sub DirectionFromOverscan($);
+sub bias_subtract_readout($$$; @);
+sub dark_subtract_readout($$$);
+sub defringe_readout($$$$);
+sub getScalingFactor($$$);
+sub load_image($$$$);
+sub make_kernel();
+sub make_mask($$);
+sub mask_readout($$$$$);
+sub nonlinearity_correct_readout($$$$);
+sub phase2($$; @);
+sub pmCameraFromHeader($);
+sub pmCameraValidateHeaders($$);
+sub pmFPAfromHeader($$);
+sub pmFlatField($$$);
+sub pmRecipeDefineSection($$$);
+sub pmSectiontoRectangle($);
+sub pmSubtractBias($$$$$$$$);
+sub psFITSReadHeaderSet($);
+sub trim_readout($$$);
+
+###############################################################################
+#
+# Do the real work
+#
+sub phase2($$; @)
+{
+   my($input, $outroot, $cameraname, $recipefile, $basefile, $verbose) = @_;
+   $basefile ||= "base.config"; $verbose ||= 0;
+   my($nFail) = 0;
+   $outroot++;
+
+   pslib::psTraceSetLevel("ps.phase2", $verbose);
+
+   my($site);
+   if ($basefile) {
+      pslib::psTrace("ps.phase2", 2, "Basefile: $basefile\n");
+      
+      my($base) = pslib::psMetadataAlloc();
+      pslib::psMetadataParseConfig($base, $basefile, 1);
+      
+      my($sitefile) = pslib::psMetadataLookup($base, "SITE")->get_STR();
+      
+      $site = pslib::psMetadataAlloc();
+      pslib::psMetadataParseConfig($site, $sitefile, 1);
+   } else {
+      $site = undef;
+   }
+   
+   # load only the headers from the given file input a list of headers
+   my($headers) = psFITSReadHeaderSet($input);
+   
+   # identify camera (may be specified on command line)
+   my($camera);
+   if (!$cameraname) {
+      $cameraname = pmCameraFromHeader(pslib::psHashLookup($headers, "PHU"));
+      my($camerafile) = pslib::psMetadataLookup($site, ("CAMERA.$cameraname"))->get_STR();
+
+      # load the camera details for the specific camera
+      $camera = pslib::psMetadataAlloc();
+      pslib::psMetadataParseConfig($camera, $camerafile, 0);
+   }
+
+   # recipefile is defined in the camera metadata, if not specified on command line
+   if (!$recipefile) {
+      if (1) {			# 
+	 $recipefile = pslib::psMetadataLookup($camera, "RECIPE.PHASE2")->get_STR();
+      } else {                           # an alternative make this a database lookup & a function of date
+	 $recipefile = DetrendDatabaseLookup ("recipe", $camera, $headers);
+      }
+   }
+   
+   pslib::psTrace("ps.phase2", 2, "Reading recipe from $recipefile\n");
+   my($recipe) = pslib::psMetadataAlloc();
+   pslib::psMetadataParseConfig($recipe, $recipefile, 0);
+
+   # END CONFIG loading code
+
+   # check the validity of the given set of headers based on expectactions for this camera
+   pslib::psTrace("ps.phase2", 3, "Validating headers\n");
+   pmCameraValidateHeaders($headers, $camera);
+
+   # construct a complete, empty (ie, no pixel data) FPA structure for this camera / header set
+   # we need to construct the output container.  is it big enough to fit in memory?  assume so?
+   my($FPA) = pmFPAfromHeader($headers, $camera);
+   
+   # I\'m pretending the extname value for each cell in part of psCell
+   # Do we need to construct a list of the extname values associated with each readout?
+   # Is EXTNAME invarient?  (probably not; does not always exist)
+   #
+   # XXX Faked psCell->{extname} to exist and be NULL in pslib.i XXX
+   
+   my($i, $j, $k);
+   for ($i = 0; $i < $FPA->{chips}->{n}; $i++) {
+      my($chip) = $FPA->{chips}->get_chip($i);
+
+      pslib::psTrace("ps.phase2", 3, "Processing chip $i\n");
+      for ($j = 0; $j < $chip->{cells}->{n}; $j++) {
+	 my($cell) = $chip->{cells}->get_cell($j);
+	 
+	 pslib::psTrace("ps.phase2", 4, "Processing cell $j\n");
+	 my($bias) = load_image("BIAS", $recipe, $cell->{metadata}, $cell->{extname});
+	 my($dark) = load_image("DARK", $recipe, $cell->{metadata}, $cell->{extname});
+	 my($flat) = load_image("FLAT", $recipe, $cell->{metadata}, $cell->{extname});
+	 my($badpix) = load_image("BADPIX", $recipe, $cell->{metadata}, $cell->{extname});
+	 my($fringe) = load_image("FRINGE", $recipe, $cell->{metadata}, $cell->{extname});
+	 pslib::psTrace("ps.phase2", 5, "Read images for cell $j\n");
+	 
+	 for ($k = 0; $k < $cell->{readouts}->{n}; $k++) {
+	    pslib::psTrace("ps.phase2", 6, "Reading readout $k\n");
+	    
+	    my($readout) = $cell->{readouts}->get_readout($k);
+	    $readout->{image} = pslib::psImageReadSection(undef, 0, 0, 0, 0, 0, $cell->{extname}, $k, $input);
+
+	    if (!defined($readout->{metadata})) {
+	       pslib::psTrace("ps.phase2", 7, "Creating metadata\n");
+	       $readout->{metadata} = pslib::psMetadataAlloc();
+
+	       my($nbias) = 2;
+	       pslib::psMetadataAddStr($readout->{metadata}, $pslib::PS_LIST_TAIL,
+				       "BIASSEC", "Define bias section",
+				       sprintf("[0:%d,0:%d]",
+					       ($readout->{image}->{numRows} - 1, $nbias - 1)));
+	       pslib::psMetadataAddStr($readout->{metadata}, $pslib::PS_LIST_TAIL,
+				       "DATASEC", "Define datasection section",
+				       sprintf("[0:%d,%d:%d]",
+					       ($readout->{image}->{numRows} - 1, $nbias,
+						$readout->{image}->{numCols} - 1)));
+	    }
+	    
+	    my($kernel) = make_kernel();
+	    my($mask) = make_mask($readout->{image}->{numRows}, $readout->{image}->{numCols});
+	    
+	    pslib::psTrace("ps.phase2", 7, "Bias subtraction\n");
+	    bias_subtract_readout($readout, $bias, $recipe);
+	    
+	    pslib::psTrace("ps.phase2", 7, "Dark subtraction\n");
+	    dark_subtract_readout($readout, $dark, $recipe);
+	    nonlinearity_correct_readout($readout, $mask, $recipe, $camera);
+	    # 
+	    pslib::psTrace("ps.phase2", 7, "Trimming\n");
+	    trim_readout($readout, $mask, $recipe);
+	    mask_readout($readout, $mask, $badpix, $kernel, $recipe);
+	    # 
+	    # where do we convolve the flat with the kernel?
+	    #
+	    pmFlatField($readout, $mask, $flat);
+	    # 
+	    pslib::psTrace("ps.phase2", 7, "Defringing\n");
+	    defringe_readout($readout, $mask, $fringe, $recipe);
+
+	 }
+      }
+   }
+}
+
+sub bias_subtract_readout($$$; @)
+{
+   #"bias subtract the given readout according to the recipe (bias image may be None)
+   #no mask needed yet"
+   
+   my($readout, $bias, $recipe, $mask) = (undef, undef, undef, undef);
+   ($readout, $bias, $recipe, $mask) = @_;
+   #determine overscan option
+   my($biassec) = pmRecipeDefineSection($recipe, $readout->{metadata}, "BIAS.OVERSCAN");
+   my($overscan) = pslib::psImageSubsection($readout->{image}, $biassec);
+
+   # the type of statistic is defined by the recipe: BIAS.OVERSCAN.STATS
+   my($statname) = pslib::psMetadataLookup ($recipe, "BIAS.OVERSCAN.STATS")->get_STR();
+   my($stats) = DefineStats($statname);
+   
+   # identify the type of fit requested and relevant parameters
+   # the type of fit is defined by the recipe: BIAS.OVERSCAN.STATS
+   my($fitname) = pslib::psMetadataLookup($recipe, "BIAS.OVERSCAN.FIT")->get_STR();  # string defining overscan stats
+   
+   my($fitType, $fitSpec, $nBin, $nPts, $order);
+   if ($fitname eq "NONE") {
+      $fitType = "PM_FIT_NONE";
+      $fitSpec = undef;
+      $nBin = 0;
+   } elsif ($fitname eq "SPLINE") {
+      my($Npix) = "XXX";
+
+      $fitType = "PM_FIT_SPLINE";
+      $nBin = pslib::psMetadataLookup($recipe, "BIAS.OVERSCAN.FIT.NBIN");
+      $nPts = pslib::psMetadataLookup($recipe, "BIAS.OVERSCAN.FIT.NPTS");
+      $order = pslib::psMetadataLookup($recipe, "BIAS.OVERSCAN.FIT.ORDER");
+      $fitSpec = psSpline1DAlloc($nPts, 3, 0, $Npix);                  # Npix is either NAXIS1 or NAXIS2 (Nx or Ny)
+   } elsif ($fitname eq "POLYNOMIAL") {
+      $fitType = "PM_FIT_POLYNOMIAL";
+      $nBin = pslib::psMetadataLookup($recipe, "BIAS.OVERSCAN.FIT.NBIN");
+      $nPts = pslib::psMetadataLookup($recipe, "BIAS.OVERSCAN.FIT.NPTS");
+      $order = pslib::psMetadataLookup($recipe, "BIAS.OVERSCAN.FIT.ORDER");
+      $fitSpec = psPolynomial1DAlloc($nPts, "PS_POLYNOMIAL_CHEB");
+   } else {
+      #raise pslib::PsUtilsError ("unknown fitname: %s" % fitname)
+   }
+   
+   my($overscanlist) = pslib::psListAlloc($overscan);
+   $readout->{image} = pmSubtractBias($readout->{image}, $fitSpec, $overscanlist,
+				      DirectionFromOverscan($biassec), $stats, $nBin, $fitType, $bias);
+
+   # add these to the readout->{metadata}? 
+   # or to the chip / cell metadata?
+}
+
+sub dark_subtract_readout($$$)
+{
+   #"subtract dark image using the appropriate scaling factor for this exposure time
+   #no mask needed yet"
+
+   my($readout, $dark, $recipe) = @_;
+
+   if (!defined($dark)) {
+      return;
+   }
+
+   # need to get a lookup table from the database, apply exptime for readout and dark
+   my($factor) = getScalingFactor($recipe, $readout, $dark);
+   
+   # $out = in - dark * factor
+   my($tmp) = pslib::psImageCopy(undef, $dark, $dark->{type}->{type});
+   pslib::psBinaryOp($tmp, $dark, "*", $factor);
+   pslib::psBinaryOp($readout->{image}, $readout->{image}, "-", $tmp);
+}
+
+sub nonlinearity_correct_readout($$$$)
+{
+   #"this corrects the non-linear response, but probably should use data determined at the cell level
+   #we need to set a mask value for pixels which have were out of range (TBD)"
+
+   my($readout, $mask, $recipe, $camera) = @_;
+   
+   my($method) = pslib::psMetadataLookup($recipe, "NONLINEAR.METHOD")->get_STR();
+   
+   # use a polynomial; get coeffs from recipe
+   if ($method eq "NONE") {
+      ;
+   } elsif ($method eq "POLYNOMIAL") {
+      my($correction);
+      $correction->{n} = pslib::psMetadataLookup($recipe, "NONLINEAR.ORDER")->{data}->{S32};
+      $correction->{coeffs} = pslib::psMetadataLookup($recipe, "NONLINEAR.COEFFS");
+      pslib::pmNonLinearityPolynomial($readout, $correction);
+   } elsif ($method eq "LOOKUP") {
+      my($time) = "XXX";
+      my($lookup_table) = DetrendDatabaseLookup($time, $camera, "etc?");
+      my($inFlux) = pslib::psFITSTableRead($lookup_table, "NONLINEAR.IN_FLUX");
+      my($outFlux) = pslib::psFITSTableRead($lookup_table, "NONLINEAR.OUT_FLUX");
+      pslib::pmNonLinearityLookup($readout, $inFlux, $outFlux);
+   } else {
+      #raise pslib::PsUtilsError ("unknown method: %s" % method);
+   }
+}
+
+sub trim_readout($$$)
+{
+   #"trim the image and mask based on the requested region"
+   my($readout, $mask, $recipe) = @_;
+   my($datasec) = pmRecipeDefineSection($recipe, $readout->{metadata}, "TRIM.DATASEC");
+   
+   my($r0, $r1, $c0, $c1) = ($datasec =~ /\[([0-9]+):([0-9]+),([0-9]+):([0-9]+)\]/);
+   
+   pslib::psImageTrim($readout->{image}, $c0, $r0, $c1, $r1);
+   $mask = pslib::psImageTrim($mask, $c0, $r0, $c1, $r1);
+}
+
+# apply the bad pixel mask to the image mask
+sub mask_readout($$$$$)
+{
+   my($readout, $mask, $badpix, $kernel, $recipe) = @_;
+}
+
+sub load_image($$$$)
+{
+   #"load in the complete corresponding image of proper type (this should be done once per cell)
+   #we are implying that the bias image is guaranteed to have the corresponding EXTNAME"
+
+   my($type, $recipe, $header, $extname) = @_;
+   my($source) = pslib::psMetadataLookup($recipe, $type . ".IMAGE")->get_STR();
+
+   my($name);
+   if (uc(substr($source, 0, 5)) eq "FILE:") {
+      $name = substr($source, 5);
+   } elsif (uc($source) eq "DB:BEST") {
+      $name = DetrendDatabaseLookup("best", $header);   # these APIs need to be seriously fleshed out!!
+   } elsif (uc($source) eq "DB:CLOSE") {
+      $name = DetrendDatabaseLookup("close", $header);   # these APIs need to be seriously fleshed out!!
+   } else {
+      #raise PsUtilsError ("Unknown source for $type: $source");
+   }
+
+   my($image);
+   if (defined($name)) {
+      $image = pslib::psImageReadSection (undef, 0, 0, 0, 0, 0, $extname, 0, $name);
+   } else {
+      $image = undef;
+   }
+
+   return $image;
+}
+
+sub pmRecipeDefineSection($$$)
+{
+   my($recipe, $header, $name) = @_;
+
+   my($source) = pslib::psMetadataLookup($recipe, $name)->get_STR();
+   
+   pslib::psTrace("ps.phase2.recipe", 10, "pmRecipeDefineSection (recipe, header, $name)\n");
+   
+   if (uc($source) eq "NONE") {
+      return psRectangleAlloc(0, 0, 0, 0); # the None section
+   } elsif (uc(substr($source, 0, 7)) eq "HEADER:") {
+      my($keyword) = substr($source,7);
+      my($section) = pslib::psMetadataLookup($header, $keyword)->get_STR();
+      return pmSectiontoRectangle($section);
+   } elsif (uc(substr($source, 0, 7)) eq "RECIPE:") {
+      my($section) = substr($source, 7);
+      return pmSectiontoRectangle($section);
+   }
+   
+   #raise pslib::PsUtilsError ("invalid section: $section");
+}
+
+#-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
+
+sub DirectionFromOverscan($)
+{
+   #"The direction is implied by noting the long dimension of the biassec"
+   my($secstr) = @_;
+
+   return 1;
+}
+
+sub pmSectiontoRectangle($)
+{
+   #"Parse a specification of the form [col0:col1,row0:row1]
+   #For now, simply return it"
+   my($secstr) = @_;
+
+   return $secstr;
+}
+
+sub psFITSReadHeaderSet($)
+{
+   my($input) = @_;
+   
+   pslib::psTrace("ps.phase2", 2, "Reading headers: $input\n");
+
+   my($meta) = pslib::psMetadataAlloc();
+   pslib::psMetadataAddStr($meta, $pslib::PS_LIST_TAIL, "CAMERA", "Camera ID", "0");
+
+   my($headers) = pslib::psHashAlloc(64);
+   pslib::psHashAdd($headers, "PHU", $meta);
+   
+   return $headers;
+}
+
+sub pmCameraFromHeader($)
+{
+   #"Return a camera given the metadata read from a fits header"
+   my($meta) = @_;
+
+   return "0";
+}
+
+sub pmCameraValidateHeaders($$)
+{
+   my($headers, $camera) = @_;
+
+   if (0) {
+      #raise pslib::PsUtilsError ("Failed to validate $headers:$camera");
+   }
+}
+
+sub pmFPAfromHeader($$)
+{
+   my($headers, $camera) = @_;
+   
+   my($ra) = 1; my($dec) = 2; my($hourAngle) = 3; my($zenith) = 4; my($azimuth) = 5;
+   my($rotAngle) = 8;
+   my($temperature) = 9; my($pressure) = 10; my($humidity) = 11;
+   my($exposureTime) = 12;
+
+   my($nchips) = pslib::psMetadataLookup($camera, "NCHIPS")->{data}->{S32};
+   my($ncells) = pslib::psMetadataLookup($camera, "NCELLS")->{data}->{S32};
+   
+   my($obs) = pslib::psObservatoryAlloc("Haleakala", 21, 150, 3000, 0.1);
+   my($wavelength) = 5500e-10;
+   my($localTime) = pslib::psTimeGetTime($pslib::PS_TIME_TAI);
+
+   my($exposure) = pslib::psExposureAlloc($ra, $dec, $hourAngle, $zenith, $azimuth, $localTime,
+					  $rotAngle, $temperature, $pressure, $humidity, $exposureTime,
+					  $wavelength, $obs);
+   my($FPA) = pslib::psFPAAlloc($nchips, $exposure);
+   my($chips) = pslibc::psFPA_chips_get($FPA);
+   
+   my($i, $j, $k);
+   for ($i = 0; $i <$nchips; $i++) {
+      my($chip) = pslib::psChipAlloc($ncells, $FPA);
+      pslib::psArraySet($chips, $i, $chip);
+      my($cells) = pslibc::psChip_cells_get($chip);
+      for ($j = 0; $j <$ncells; $j++) {
+	 my($nReadouts) = pslib::psMetadataLookup($camera, "NREADOUTS.$i.$j")->{data}->{S32};
+
+	 my($cell) = pslib::psCellAlloc($nReadouts, $chip);
+	 
+	 pslib::psArraySet($cells, $j, $cell);
+	 
+	 my($readouts) = pslibc::psCell_readouts_get($cell);
+	 for ($k = 0; $k < $nReadouts; $k++) {
+	     pslib::psArraySet($readouts, $k, pslib::psReadoutAlloc());
+	 }
+      }
+   }
+
+   return $FPA;
+}
+
+sub make_kernel()
+{
+   my($nrow) = 5; my($ncol) = 5;
+   return pslib::psImageAlloc($ncol, $nrow, $pslib::PS_TYPE_F64);
+}
+
+sub make_mask($$)
+{
+   my($nrow, $ncol) = @_;
+
+   return pslib::psImageAlloc($ncol, $nrow, $pslib::PS_TYPE_F64);
+}
+
+sub DefineStats($)
+{
+   my($str) = @_;
+   return $str;
+}
+
+sub pmSubtractBias($$$$$$$$)
+{
+   #"Subtract the bias. Don't do a very good job..."
+   my($rawImage, $fitSpec, $overscanlist, $direction, $stats, $nBin, $type, $bias) = @_;
+   return pslib::psImageAlloc($rawImage->{numCols}, $rawImage->{numRows}, $pslib::PS_TYPE_F64);
+}
+
+sub getScalingFactor($$$)
+{
+   my($recipe, $readout, $dark) = @_;
+   my($source) = pslib::psMetadataLookup($recipe, "DARK.FACTOR")->get_STR();
+
+   if (uc(substr($source, 0, length("VALUE:"))) eq "VALUE:") {
+      return pslib::psScalarF32Alloc(substr($source, length("VALUE:")), $pslib::PS_TYPE_F64);
+   }
+
+   #raise pslib::PsUtilsError ("Unknown recipe for dark factor: $source");
+}
+
+sub pmFlatField($$$)
+{
+   my($readout, $mask, $flat) = @_;
+}
+
+sub defringe_readout($$$$)
+{
+   my($readout, $mask, $fringe, $recipe) = @_;
+}
+
+#(input, outroot, cameraname = None, recipefile = None, basefile = "base.config", verbose=0)
+if (1) {
+   phase2('data/data.fits', undef, undef, undef, "data/base.config", 4);
+   
+   if (pslib::psMemCheckLeaksToStderr(0,undef,0)) {
+      die "You leaked memory\n";
+   }
+}
+
Index: /tags/ipp-1-X/bug123/psLib/swig/pslib.i
===================================================================
--- /tags/ipp-1-X/bug123/psLib/swig/pslib.i	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/swig/pslib.i	(revision 22331)
@@ -0,0 +1,65 @@
+%module pslib
+
+%{
+#define PS_ALLOW_MALLOC 
+#define SWIG
+#include "pslib.h"
+
+/* SWIG uses malloc/free - make it use the pslib memory functions instead. */
+/* 
+#define malloc(S)    psAlloc(S)
+#define realloc(P,S) psRealloc(P,S)
+#define free(P)      psFree(P)
+*/
+
+%}
+
+/* XXX: this is temporary -- not portable, but should work with any current OS supported */
+typedef unsigned char  uint8_t;
+typedef unsigned short uint16_t;
+typedef unsigned int   uint32_t;
+typedef unsigned long  uint64_t;
+typedef char           int8_t;
+typedef short          int16_t;
+typedef int            int32_t;
+typedef long long      int64_t;
+
+/* grab the typedefs used throughout psLib, e.g. psU8, psU16,... */
+%include "cpointer.i"
+%include "typemaps.i"
+
+/**
+ * Typemap to map FILE* input to the script's native file descriptor wrapper.
+ * Used for such functions as psErrorStackPrint and psTraceSetDestination.
+ */
+%typemap(in) FILE * {
+#if defined(SWIGPERL)
+   if (!SvOK($input)) {
+      $1 = NULL;      
+   } else {
+      $1 = PerlIO_findFILE(IoIFP(sv_2io($input)));
+   }
+#elif defined(SWIGPYTHON)
+    if ($input == Py_None) {
+	$1 = NULL;
+    } else if (!PyFile_Check($input)) {
+	PyErr_SetString(PyExc_TypeError, "Need a file!");
+	goto fail;
+    } else {
+	$1 = PyFile_AsFile($input);
+    }
+#endif
+}
+
+%{
+typedef struct { float re, im; } swig_psC32;  ///< 32-bit complex floating point
+typedef struct { double re, im; } swig_psC64; ///< 64-bit complex floating point
+%}
+
+/* the actual including of headers are found in each of the directories. */
+%include "sysUtils.i"
+%include "image.i"
+%include "dataIO.i"
+%include "dataManip.i"
+%include "collections.i"
+%include "astronomy.i"
Index: /tags/ipp-1-X/bug123/psLib/test/.cvsignore
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/.cvsignore	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/.cvsignore	(revision 22331)
@@ -0,0 +1,3 @@
+temp
+Makefile
+Makefile.in
Index: /tags/ipp-1-X/bug123/psLib/test/FullUnitTest
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/FullUnitTest	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/FullUnitTest	(revision 22331)
@@ -0,0 +1,360 @@
+#!/usr/bin/perl
+#
+#  This is a perl script test harness which will recursively search the
+#  directory tree looking for files named UnitTest and then execute
+#  the script
+#
+#  SYNOSIS :  FullUnitTest options arguements
+#
+#       where  options =
+#             --verbose     Display extra information to user
+#             --noverbose   Don't display extra information to user
+#             --recursiv e  Recursively run tests in directory tree
+#             --norecursive Test only the specified or current directory
+#             --silent      Don't display any information to user
+#             --nosilent    Display progress of script to user
+#
+#              arguements = directory(ies) to perform tests
+#
+#  RETURN : integer number of tests which failed
+#
+#  $Revision: 1.22 $  $Name: not supported by cvs2svn $
+#  $Date: 2005-04-09 00:04:57 $
+#
+#  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
+#
+##############################################################################
+
+use FindBin qw($Bin);
+
+$runTest = "$Bin/runTest";
+
+# Provide functions for determining the pathname of current working directory
+use Cwd;
+
+# Provides functions for handling psS64 command line options
+use Getopt::Long;
+
+# Assign variables based on the presence of command line options to the script
+# The ! option allows for --nooption to be set to zero
+# (e.g. --noverbose --recursive causes $verbose=0 and $recursive=1)
+GetOptions(
+    "verbose!"   => \$verbose,
+    "recursive!" => \$recursive,
+    "silent!"    => \$silent,
+    "clean!"     => \$clean
+);
+
+# Check if both silent and verbose options are set and if so stop the script
+die "Can't specify both verbose and silent options." if ( $verbose && $silent );
+
+# Set up the PSLIB_ROOT environment variable if the user doesn't have
+if ( !$ENV{'PSLIB_ROOT'} ) {
+
+    # Use the directory directly above where FullUnitTest script resides
+    $PSLIB_ROOT = `cd ..;pwd`;
+
+    # Remove newline for the end of path returned
+    chomp($PSLIB_ROOT);
+
+    # Set the environment variable
+    $ENV{'PSLIB_ROOT'} = $PSLIB_ROOT;
+    print("PSLIB_ROOT not found: set to $PSLIB_ROOT.\n") if $verbose;
+}
+
+# add PSLIB_ROOT/lib to LD_LIBRARY_PATH and DYLD_LIBRARY_PATH environment
+# variables
+$ENV{'LD_LIBRARY_PATH'}   = "$ENV{'PSLIB_ROOT'}/src/.libs:$ENV{'LD_LIBRARY_PATH'}";
+$ENV{'DYLD_LIBRARY_PATH'} = "$ENV{'PSLIB_ROOT'}/src/.libs:$ENV{'DYLD_LIBRARY_PATH'}";
+
+# Initialize variables for counting the makes and test failures and the
+# total makes and tests performed
+$makeFailCount       = 0;
+$testpointFailCount  = 0;
+$testDriverFailCount = 0;
+$totalTestpoints     = 0;
+$totalTestDrivers    = 0;
+$totalMakes          = 0;
+
+# Initialize variable indicating how many arguements were passed
+$args = 0;
+
+# Loop through all the arguements passed to the script
+foreach (@ARGV) {
+
+    # Remove newline if there is one
+    chomp;
+
+    # Increment number of arguements found
+    $args++;
+
+    # Set variable to current working directory
+    $cwd = cwd;
+
+    # Change directory to the directory of the arguement
+    chdir($_);
+
+    # Check for the recursive option
+    if ($recursive) {
+
+        # Invoke subroutine to go to the lowest directory in tree
+        # starting at the specified directory
+        &worm($_);
+    }
+    else {
+
+        # Invoke subroutines to run the test at the specified directory
+        &makeTestDrivers($_);
+        &executeTestDrivers($_);
+    }
+
+    # Change directory back to the directory where FullUnitTest was invoked
+    chdir($cwd);
+}
+
+# Check if there were no arguements specified
+if ( $args == 0 ) {
+
+    # Display message to user that all directories under the current will be
+    # tested
+    print("Recursively testing current directory tree.\n") if $verbose;
+
+    # Invoke subroutine to go to recursively test each directory in tree
+    &worm( $ENV{"PWD"} );
+}
+
+# Check if there were any failures during make or testing
+if ( $makeFailCount > 0 || $testDriverFailCount > 0 ) {
+
+    # Display summary of failures
+    print("\nMake Failures = $makeFailCount out of $totalMakes");
+    print(
+"\nTest Driver Failures = $testDriverFailCount out of $totalTestDrivers\n"
+    );
+    print( "\nMakes that failed:\n  " . join( "\n  ", @makesFailed ) . "\n" )
+      if $makeFailCount;
+    print( "\nTests that failed:\n  " . join( "\n  ", @testsFailed ) . "\n" )
+      if $testDriverFailCount;
+}
+else {
+
+    # Display message of all makes and tests pass to user if silent option
+    # not specified
+    print(
+"\nAll $totalTestDrivers Test Drivers Passed with $totalTestpoints Testpoints.\n"
+      )
+      if ( !$silent );
+}
+
+# Exit with the number of tests that failed
+exit($testDriverFailCount);
+
+################################################################################
+#
+# SUBROUTINE: worm
+#
+#     Description:  This subroutine will perform the necessary unit tests be
+#                   calling makeTestDrivers and executeTestDrivers  subroutines
+#                   and then check each subdirectory below the base directory
+#                   recursively.
+#
+#     Parameter(s):  base directory to start testing
+#
+#     Return:  None
+#
+################################################################################
+
+sub worm {
+
+    # Assign local variable to input parameter
+    local ($base_dir) = @_;
+    local ( @files, $i );
+
+    # Invoke subroutine to make test driver in the base directory
+    &makeTestDrivers($base_dir);
+
+    # Invoke subroutine to execute tests in the base directory
+    &executeTestDrivers($base_dir);
+
+    # Create array of entries found in directory
+    @files = <*>;
+
+    # Loop through the file list looking for another directory that is not
+    # labelled CVS and recursively invoke subroutine worm
+    $i = 0;
+    while ( $files[$i] ) {
+
+        # Check for directory and directory not labelled CVS
+        if (   -d $files[$i]
+            && ( $files[$i] ne "CVS" )
+            && ( $files[$i] ne "temp" )
+            && ( $files[$i] ne "verified" ) )
+        {
+
+            # Change current directory to directory found
+            chdir( $files[$i] );
+
+            # Invoke subroutine worm again
+            &worm( $files[$i] );
+
+            # Change current directory back to parent
+            chdir("..");
+        }
+
+        # Increment file list index
+        $i++;
+    }
+}
+
+################################################################################
+#
+#  SUBROUTINE: makeTestDrivers
+#
+#      Description:  This subroutine will perform a make for all the necessary
+#                    test drivers.    This will occur in the specified
+#                    base directory which is passed as the only parameter.
+#
+#      Parameter(s):  base directory where make and test drivers are located
+#
+#      Return:  None
+#
+################################################################################
+
+sub makeTestDrivers {
+    local ($base_dir) = @_;
+    local ($pwd);
+
+    # Set variable pwd to current working directory
+    $pwd = cwd;
+
+    # Display message to user in which directory testing is taken place only
+    # if the silent command option was not specified
+    print("---- Entering $pwd ----\n") if ( !$silent );
+
+    # Check for the existence of a file name Makefile in current directory
+    if ( -e "Makefile" ) {
+
+        # Increment the total number of makes executed
+        $totalMakes++;
+
+        if ($clean) {
+
+            # Execute the make clean
+            `make clean`;
+
+        }
+
+        # Execute the make and save results
+        $_ = join( "\n|| ", split( "\n", "\n" . `make tests` ) );
+
+        # Check the output of make for return value != 0 or any of the
+        # following words: FAILED, FAULT, ERROR, Not found, SIGNAL
+        if ( $? != 0 ) {
+
+            # Display the errored output of make if silent option not enabled
+            print("$_\n") if ( !$silent );
+
+            # Display the make failed in the current directory
+            print("\nMake for $pwd Failed\n");
+
+            # Increment the number of makes that have failed
+            $makeFailCount++;
+
+            # Push the current working directory onto the list of failed
+            # make directories list
+            push( @makesFailed, $pwd );
+        }
+        else {
+
+            # Display the results of the successful make if verbose option set
+            print("$_\n") if $verbose;
+
+            # Display the make was successful if silent option not set
+            print("\nMake successful.\n") if ( !$silent );
+        }
+    }
+}
+
+################################################################################
+#
+#  SUBROUTINE: executeTestDrivers
+#
+#      Description:  This subroutine will execute all the necessary
+#                    test drivers.    This will occur in the specified
+#                    base directory which is passed as the only parameter.
+#
+#      Parameter(s):  base directory where make and test drivers are located
+#
+################################################################################
+
+sub executeTestDrivers {
+    local ($base_dir) = @_;
+    local ( @files, $j );
+    local ($pwd);
+    local ($exitValue) = 0;
+
+    # Set variable to pwd to current test directory
+    $pwd = cwd;
+
+    # Create a list of all elements in base directory
+    @files = <*>;
+
+    # Loop through all the items in the files array
+    $initialTest = 0;
+    $j           = 0;
+    while ( $files[$j] ) {
+
+        # Check that the item is not a directory and is executable and
+        # conforms to the test driver naming convention TST
+        if (   !( -d $files[$j] )
+            && ( -x $files[$j] )
+            && ( $files[$j] =~ /^TST/i || $files[$j] =~ /^ATST/i ) )
+        {
+
+            # Increment total number of test drivers executed
+            $totalTestDrivers++;
+
+            # Display message to user of which test driver is being executed
+            print("--- Executing test driver $files[$j]\n") if ( !$silent );
+
+            # Execute the test driver
+            if ($silent) {
+                system("$runTest --quiet ./$files[$j]");
+            } elsif ($verbose) {
+                system("$runTest --printpassfail ./$files[$j]");
+            } else {
+                system("$runTest ./$files[$j]");
+            }
+            $retVal = $?;
+
+            # Count testpoints
+            $testPattern = "\"\\*\\*\\*\\* TESTPOINT \\*\\*\\*\\*\"";
+            $totalPoints = `grep -c $testPattern temp/$files[$j].stdout`;
+            $totalPoints += `grep -c $testPattern temp/$files[$j].stderr`;
+            $failPoints =
+              `grep "> TESTPOINT FAILED" temp/$files[$j].stdout | wc -l`;
+            $failPoints +=
+              `grep "> TESTPOINT FAILED" temp/$files[$j].stderr | wc -l`;
+            $testpointFailCount += $failPoints;
+            $totalTestpoints    += $totalPoints;
+
+            # Check result of test driver
+            if ( $retVal != 0 )
+            {
+
+                # Display test driver failed
+                $failPoints++;
+                print(
+                    "Test driver: $files[$j] Failed (Return value $retVal).\n");
+
+                # Increment the total number of test failed
+                $testDriverFailCount++;
+
+                # Push the current working directory on the list of failed
+                push( @testsFailed, $pwd . "/" . $files[$j] );
+            }
+        }
+        $j++;
+    }
+}
+
Index: /tags/ipp-1-X/bug123/psLib/test/Makefile.am
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/Makefile.am	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/Makefile.am	(revision 22331)
@@ -0,0 +1,11 @@
+# not a GNU package. You can remove this line, if
+# have all needed files, that a GNU package needs
+AUTOMAKE_OPTIONS = foreign 1.4
+
+SUBDIRS = astronomy collections dataManip dataIO image sysUtils
+
+EXTRA_DIST = runTest FullUnitTest
+
+test: check
+
+tests:
Index: /tags/ipp-1-X/bug123/psLib/test/astronomy/.cvsignore
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/astronomy/.cvsignore	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/astronomy/.cvsignore	(revision 22331)
@@ -0,0 +1,21 @@
+psTime.config
+test.psTime.config1
+test.psTime.config2
+test.psTime.config3
+test.psTime.config4
+temp
+tst_psTime_01
+tst_psTime_02
+tst_psAstrometry
+tst_psAstrometry01
+tst_psCoord
+tst_psTime_03
+tst_psTime_04
+.deps
+Makefile.in
+Makefile
+.deps
+.libs
+test.ser7.dat
+tst_psCoord01
+
Index: /tags/ipp-1-X/bug123/psLib/test/astronomy/Makefile.am
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/astronomy/Makefile.am	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/astronomy/Makefile.am	(revision 22331)
@@ -0,0 +1,75 @@
+ #Makefile for astronomy functions of psLib
+#
+INCLUDES = \
+	-I$(top_srcdir)/src \
+	-I$(top_srcdir)/src/astronomy \
+	-I$(top_srcdir)/src/collections \
+	-I$(top_srcdir)/src/dataManip \
+	-I$(top_srcdir)/src/dataIO \
+	-I$(top_srcdir)/src/image \
+	-I$(top_srcdir)/src/sysUtils \
+	$(all_includes)
+
+AM_LDFLAGS = -L$(top_builddir)/src -lpslib $(PSLIB_LIBS)
+
+TESTS = tst_psTime_01 \
+         tst_psTime_02 \
+         tst_psTime_03 \
+         tst_psTime_04 \
+         tst_psCoord \
+         tst_psCoord01 \
+         tst_psAstrometry \
+         tst_psAstrometry01
+
+check_PROGRAMS = $(TESTS)
+
+check_DATA = psTime.config \
+        test.psTime.config1 \
+        test.psTime.config2 \
+        test.psTime.config3 \
+        test.psTime.config4 \
+        test.ser7.dat
+
+TESTS_ENVIRONMENT = export PS_CONFIG_FILE="psTime.config" && perl $(top_srcdir)/test/runTest --verified=$(srcdir)/verified
+
+tests: $(check_DATA) $(TESTS)
+        
+tst_psTime_01_SOURCES = tst_psTime_01.c
+tst_psTime_02_SOURCES = tst_psTime_02.c
+tst_psTime_03_SOURCES = tst_psTime_03.c
+tst_psTime_04_SOURCES = tst_psTime_04.c
+tst_psAstrometry_SOURCES = tst_psAstrometry.c
+tst_psCoord_SOURCES = tst_psCoord.c
+tst_psCoord01_SOURCES = tst_psCoord01.c
+tst_psAstrometry01_SOURCES = tst_psAstrometry01.c
+
+EXTRA_DIST = data/test.psTime.config1.template \
+	data/test.psTime.config2.template \
+	data/test.psTime.config3.template \
+	data/test.psTime.config4.template \
+	data/test.ser7.dat \
+	verified 
+
+CLEANFILES = $(TESTS) $(check_DATA) temp/*
+
+psTime.config: $(top_srcdir)/etc/pslib/psTime.config.template
+	sed 's|PREFIX|$(top_srcdir)|' $? > $@
+
+test.psTime.config1: data/test.psTime.config1.template
+	cp $? $@
+
+test.psTime.config2: data/test.psTime.config2.template
+	sed 's|PREFIX|$(top_srcdir)|' $? > $@
+
+test.psTime.config3: data/test.psTime.config3.template
+	sed 's|PREFIX|$(top_srcdir)|' $? > $@
+
+test.psTime.config4: data/test.psTime.config4.template
+	cp $? $@
+
+test.ser7.dat: data/test.ser7.dat
+	cp $? $@
+
+test: check
+
+
Index: /tags/ipp-1-X/bug123/psLib/test/astronomy/builddir/tst_psMetadata_01.d
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/astronomy/builddir/tst_psMetadata_01.d	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/astronomy/builddir/tst_psMetadata_01.d	(revision 22331)
@@ -0,0 +1,15 @@
+builddir/tst_psMetadata_01.o: tst_psMetadata_01.c ../../include/pslib_strict.h \
+  ../../include/psMemory.h ../../include/psLogMsg.h \
+  ../../include/psTrace.h ../../include/psAbort.h ../../include/psError.h \
+  ../../include/psString.h ../../include/psType.h ../../include/psList.h \
+  ../../include/psCompare.h ../../include/psArray.h \
+  ../../include/psHash.h ../../include/psScalar.h \
+  ../../include/psVector.h ../../include/psImage.h \
+  ../../include/psImageExtraction.h ../../include/psStats.h \
+  ../../include/psImageManip.h ../../include/psImageIO.h \
+  ../../include/psImageStats.h ../../include/psFunctions.h \
+  ../../include/psBitSet.h ../../include/psMatrix.h \
+  ../../include/psMatrixVectorArithmetic.h ../../include/psFFT.h \
+  ../../include/psMinimize.h ../../include/psCoord.h \
+  ../../include/psTime.h ../../include/psPhotometry.h \
+  ../../include/psMetadata.h ../../include/psTest.h
Index: /tags/ipp-1-X/bug123/psLib/test/astronomy/builddir/tst_psMetadata_02.d
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/astronomy/builddir/tst_psMetadata_02.d	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/astronomy/builddir/tst_psMetadata_02.d	(revision 22331)
@@ -0,0 +1,15 @@
+builddir/tst_psMetadata_02.o: tst_psMetadata_02.c ../../include/pslib_strict.h \
+  ../../include/psMemory.h ../../include/psLogMsg.h \
+  ../../include/psTrace.h ../../include/psAbort.h ../../include/psError.h \
+  ../../include/psString.h ../../include/psType.h ../../include/psList.h \
+  ../../include/psCompare.h ../../include/psArray.h \
+  ../../include/psHash.h ../../include/psScalar.h \
+  ../../include/psVector.h ../../include/psImage.h \
+  ../../include/psImageExtraction.h ../../include/psStats.h \
+  ../../include/psImageManip.h ../../include/psImageIO.h \
+  ../../include/psImageStats.h ../../include/psFunctions.h \
+  ../../include/psBitSet.h ../../include/psMatrix.h \
+  ../../include/psMatrixVectorArithmetic.h ../../include/psFFT.h \
+  ../../include/psMinimize.h ../../include/psCoord.h \
+  ../../include/psTime.h ../../include/psPhotometry.h \
+  ../../include/psMetadata.h ../../include/psTest.h
Index: /tags/ipp-1-X/bug123/psLib/test/astronomy/builddir/tst_psMetadata_03.d
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/astronomy/builddir/tst_psMetadata_03.d	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/astronomy/builddir/tst_psMetadata_03.d	(revision 22331)
@@ -0,0 +1,15 @@
+builddir/tst_psMetadata_03.o: tst_psMetadata_03.c ../../include/pslib_strict.h \
+  ../../include/psMemory.h ../../include/psLogMsg.h \
+  ../../include/psTrace.h ../../include/psAbort.h ../../include/psError.h \
+  ../../include/psString.h ../../include/psType.h ../../include/psList.h \
+  ../../include/psCompare.h ../../include/psArray.h \
+  ../../include/psHash.h ../../include/psScalar.h \
+  ../../include/psVector.h ../../include/psImage.h \
+  ../../include/psImageExtraction.h ../../include/psStats.h \
+  ../../include/psImageManip.h ../../include/psImageIO.h \
+  ../../include/psImageStats.h ../../include/psFunctions.h \
+  ../../include/psBitSet.h ../../include/psMatrix.h \
+  ../../include/psMatrixVectorArithmetic.h ../../include/psFFT.h \
+  ../../include/psMinimize.h ../../include/psCoord.h \
+  ../../include/psTime.h ../../include/psPhotometry.h \
+  ../../include/psMetadata.h ../../include/psTest.h
Index: /tags/ipp-1-X/bug123/psLib/test/astronomy/builddir/tst_psMetadata_04.d
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/astronomy/builddir/tst_psMetadata_04.d	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/astronomy/builddir/tst_psMetadata_04.d	(revision 22331)
@@ -0,0 +1,15 @@
+builddir/tst_psMetadata_04.o: tst_psMetadata_04.c ../../include/pslib_strict.h \
+  ../../include/psMemory.h ../../include/psLogMsg.h \
+  ../../include/psTrace.h ../../include/psAbort.h ../../include/psError.h \
+  ../../include/psString.h ../../include/psType.h ../../include/psList.h \
+  ../../include/psCompare.h ../../include/psArray.h \
+  ../../include/psHash.h ../../include/psScalar.h \
+  ../../include/psVector.h ../../include/psImage.h \
+  ../../include/psImageExtraction.h ../../include/psStats.h \
+  ../../include/psImageManip.h ../../include/psImageIO.h \
+  ../../include/psImageStats.h ../../include/psFunctions.h \
+  ../../include/psBitSet.h ../../include/psMatrix.h \
+  ../../include/psMatrixVectorArithmetic.h ../../include/psFFT.h \
+  ../../include/psMinimize.h ../../include/psCoord.h \
+  ../../include/psTime.h ../../include/psPhotometry.h \
+  ../../include/psMetadata.h ../../include/psTest.h
Index: /tags/ipp-1-X/bug123/psLib/test/astronomy/builddir/tst_psMetadata_05.d
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/astronomy/builddir/tst_psMetadata_05.d	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/astronomy/builddir/tst_psMetadata_05.d	(revision 22331)
@@ -0,0 +1,15 @@
+builddir/tst_psMetadata_05.o: tst_psMetadata_05.c ../../include/pslib_strict.h \
+  ../../include/psMemory.h ../../include/psLogMsg.h \
+  ../../include/psTrace.h ../../include/psAbort.h ../../include/psError.h \
+  ../../include/psString.h ../../include/psType.h ../../include/psList.h \
+  ../../include/psCompare.h ../../include/psArray.h \
+  ../../include/psHash.h ../../include/psScalar.h \
+  ../../include/psVector.h ../../include/psImage.h \
+  ../../include/psImageExtraction.h ../../include/psStats.h \
+  ../../include/psImageManip.h ../../include/psImageIO.h \
+  ../../include/psImageStats.h ../../include/psFunctions.h \
+  ../../include/psBitSet.h ../../include/psMatrix.h \
+  ../../include/psMatrixVectorArithmetic.h ../../include/psFFT.h \
+  ../../include/psMinimize.h ../../include/psCoord.h \
+  ../../include/psTime.h ../../include/psPhotometry.h \
+  ../../include/psMetadata.h ../../include/psTest.h
Index: /tags/ipp-1-X/bug123/psLib/test/astronomy/builddir/tst_psMetadata_06.d
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/astronomy/builddir/tst_psMetadata_06.d	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/astronomy/builddir/tst_psMetadata_06.d	(revision 22331)
@@ -0,0 +1,15 @@
+builddir/tst_psMetadata_06.o: tst_psMetadata_06.c ../../include/pslib_strict.h \
+  ../../include/psMemory.h ../../include/psLogMsg.h \
+  ../../include/psTrace.h ../../include/psAbort.h ../../include/psError.h \
+  ../../include/psString.h ../../include/psType.h ../../include/psList.h \
+  ../../include/psCompare.h ../../include/psArray.h \
+  ../../include/psHash.h ../../include/psScalar.h \
+  ../../include/psVector.h ../../include/psImage.h \
+  ../../include/psImageExtraction.h ../../include/psStats.h \
+  ../../include/psImageManip.h ../../include/psImageIO.h \
+  ../../include/psImageStats.h ../../include/psFunctions.h \
+  ../../include/psBitSet.h ../../include/psMatrix.h \
+  ../../include/psMatrixVectorArithmetic.h ../../include/psFFT.h \
+  ../../include/psMinimize.h ../../include/psCoord.h \
+  ../../include/psTime.h ../../include/psPhotometry.h \
+  ../../include/psMetadata.h ../../include/psTest.h
Index: /tags/ipp-1-X/bug123/psLib/test/astronomy/builddir/tst_psTime_01.d
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/astronomy/builddir/tst_psTime_01.d	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/astronomy/builddir/tst_psTime_01.d	(revision 22331)
@@ -0,0 +1,15 @@
+builddir/tst_psTime_01.o: tst_psTime_01.c ../../include/pslib_strict.h \
+  ../../include/psMemory.h ../../include/psLogMsg.h \
+  ../../include/psTrace.h ../../include/psAbort.h ../../include/psError.h \
+  ../../include/psString.h ../../include/psType.h ../../include/psList.h \
+  ../../include/psCompare.h ../../include/psArray.h \
+  ../../include/psHash.h ../../include/psScalar.h \
+  ../../include/psVector.h ../../include/psImage.h \
+  ../../include/psImageExtraction.h ../../include/psStats.h \
+  ../../include/psImageManip.h ../../include/psImageIO.h \
+  ../../include/psImageStats.h ../../include/psFunctions.h \
+  ../../include/psBitSet.h ../../include/psMatrix.h \
+  ../../include/psMatrixVectorArithmetic.h ../../include/psFFT.h \
+  ../../include/psMinimize.h ../../include/psCoord.h \
+  ../../include/psTime.h ../../include/psPhotometry.h \
+  ../../include/psMetadata.h ../../include/psTest.h
Index: /tags/ipp-1-X/bug123/psLib/test/astronomy/builddir/tst_psTime_02.d
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/astronomy/builddir/tst_psTime_02.d	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/astronomy/builddir/tst_psTime_02.d	(revision 22331)
@@ -0,0 +1,15 @@
+builddir/tst_psTime_02.o: tst_psTime_02.c ../../include/pslib_strict.h \
+  ../../include/psMemory.h ../../include/psLogMsg.h \
+  ../../include/psTrace.h ../../include/psAbort.h ../../include/psError.h \
+  ../../include/psString.h ../../include/psType.h ../../include/psList.h \
+  ../../include/psCompare.h ../../include/psArray.h \
+  ../../include/psHash.h ../../include/psScalar.h \
+  ../../include/psVector.h ../../include/psImage.h \
+  ../../include/psImageExtraction.h ../../include/psStats.h \
+  ../../include/psImageManip.h ../../include/psImageIO.h \
+  ../../include/psImageStats.h ../../include/psFunctions.h \
+  ../../include/psBitSet.h ../../include/psMatrix.h \
+  ../../include/psMatrixVectorArithmetic.h ../../include/psFFT.h \
+  ../../include/psMinimize.h ../../include/psCoord.h \
+  ../../include/psTime.h ../../include/psPhotometry.h \
+  ../../include/psMetadata.h ../../include/psTest.h
Index: /tags/ipp-1-X/bug123/psLib/test/astronomy/data/psTime.config.template
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/astronomy/data/psTime.config.template	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/astronomy/data/psTime.config.template	(revision 22331)
@@ -0,0 +1,23 @@
+# This configuration file specifies values required for time calculations by psLib.
+psLib.time.tables.dir STR PREFIX/share/pslib                                            # Directory for time tables
+psLib.time.tables.n S32 4                                                               # Number of time tables
+psLib.time.tables.files STR ser7.dat eopc01_1900_2004.dat finals_all.dat tai_utc.dat    # These are the table file names
+@psLib.time.tables.from F64 53258.0, 15020.0, 41684.0 2437300.5                         # Valid from these dates
+@psLib.time.tables.to F64 53622.0, 53258.0, 53627.0 2451179.5                           # Valid to these dates
+psLib.time.before.xp F64 0.0                                                            # Value of XP for before the earliest MJD
+psLib.time.before.yp F64 0.0                                                            # Value of YP for before the earliest MJD
+psLib.time.before.dut F64 0.0                                                           # Value of UT1-UTC for before the earliest MJD
+
+# Now follows formulae for predicting ahead of the most recent available table entry.
+# xp = [0] + [1]*cos A + [2]*sin A + [3]*cos C + [4]*sin C
+# yp = [0] + [1]*cos A + [2]*sin A + [3]*cos C + [4]*sin C
+# A = 2*pi*(MJD - pslib.time.predict.mjd)/365.25
+# C = 2*pi*(MJD - pslib.time.predict.mjd)/435.0
+# dut = ut1-utc = [0] + [1]*(MJD - [2]) - (UT2-UT1)
+# ut2-ut1 = 0.022 sin(2*pi*T) - 0.012 cos(2*pi*T) - 0.006 sin(4*pi*T) + 0.007 cos(4*pi*T)
+# T = 2000.0 + (MJD - 51544.03)/365.2422
+@psLib.time.predict.xp F64 0.0569, 0.0555, -0.0200, 0.0513, 0.1483
+@psLib.time.predict.yp F64 0.3498, -0.0176, -0.0498, 0.1483, -0.0513
+psLib.time.predict.mjd F64 53257.0
+@psLib.time.predict.dut F64 -0.4944, -0.00023, 53262.0
+
Index: /tags/ipp-1-X/bug123/psLib/test/astronomy/data/test.psTime.config1.template
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/astronomy/data/test.psTime.config1.template	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/astronomy/data/test.psTime.config1.template	(revision 22331)
@@ -0,0 +1,23 @@
+# This configuration file specifies values required for time calculations by psLib.
+psLib.time.tables.dir STR bogus                                                    # Directory for time tables
+psLib.time.tables.n S32 4                                                               # Number of time tables
+psLib.time.tables.files STR ser7.dat eopc01_1900_2004.dat finals_all.dat tai_utc.dat    # These are the table file names
+@psLib.time.tables.from F64 53258.0, 15020.0, 41684.0 2437300.5                         # Valid from these dates
+@psLib.time.tables.to F64 53622.0, 53258.0, 53627.0 2451179.5                           # Valid to these dates
+psLib.time.before.xp F64 0.0                                                            # Value of XP for before the earliest MJD
+psLib.time.before.yp F64 0.0                                                            # Value of YP for before the earliest MJD
+psLib.time.before.dut F64 0.0                                                           # Value of UT1-UTC for before the earliest MJD
+
+# Now follows formulae for predicting ahead of the most recent available table entry.
+# xp = [0] + [1]*cos A + [2]*sin A + [3]*cos C + [4]*sin C
+# yp = [0] + [1]*cos A + [2]*sin A + [3]*cos C + [4]*sin C
+# A = 2*pi*(MJD - pslib.time.predict.mjd)/365.25
+# C = 2*pi*(MJD - pslib.time.predict.mjd)/435.0
+# dut = ut1-utc = [0] + [1]*(MJD - [2]) - (UT2-UT1)
+# ut2-ut1 = 0.022 sin(2*pi*T) - 0.012 cos(2*pi*T) - 0.006 sin(4*pi*T) + 0.007 cos(4*pi*T)
+# T = 2000.0 + (MJD - 51544.03)/365.2422
+@psLib.time.predict.xp F64 0.0569, 0.0555, -0.0200, 0.0513, 0.1483
+@psLib.time.predict.yp F64 0.3498, -0.0176, -0.0498, 0.1483, -0.0513
+psLib.time.predict.mjd F64 53257.0
+@psLib.time.predict.dut F64 -0.4944, -0.00023, 53262.0
+
Index: /tags/ipp-1-X/bug123/psLib/test/astronomy/data/test.psTime.config2.template
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/astronomy/data/test.psTime.config2.template	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/astronomy/data/test.psTime.config2.template	(revision 22331)
@@ -0,0 +1,23 @@
+# This configuration file specifies values required for time calculations by psLib.
+psLib.time.tables.dir STR PREFIX/share/pslib                                            # Directory for time tables
+psLib.time.tables.n S32 4                                                               # Number of time tables
+psLib.time.tables.files STR eopc01_1900_2004.dat finals_all.dat tai_utc.dat    # These are the table file names
+@psLib.time.tables.from F64 53258.0, 15020.0, 41684.0 2437300.5                         # Valid from these dates
+@psLib.time.tables.to F64 53622.0, 53258.0, 53627.0 2451179.5                           # Valid to these dates
+psLib.time.before.xp F64 0.0                                                            # Value of XP for before the earliest MJD
+psLib.time.before.yp F64 0.0                                                            # Value of YP for before the earliest MJD
+psLib.time.before.dut F64 0.0                                                           # Value of UT1-UTC for before the earliest MJD
+
+# Now follows formulae for predicting ahead of the most recent available table entry.
+# xp = [0] + [1]*cos A + [2]*sin A + [3]*cos C + [4]*sin C
+# yp = [0] + [1]*cos A + [2]*sin A + [3]*cos C + [4]*sin C
+# A = 2*pi*(MJD - pslib.time.predict.mjd)/365.25
+# C = 2*pi*(MJD - pslib.time.predict.mjd)/435.0
+# dut = ut1-utc = [0] + [1]*(MJD - [2]) - (UT2-UT1)
+# ut2-ut1 = 0.022 sin(2*pi*T) - 0.012 cos(2*pi*T) - 0.006 sin(4*pi*T) + 0.007 cos(4*pi*T)
+# T = 2000.0 + (MJD - 51544.03)/365.2422
+@psLib.time.predict.xp F64 0.0569, 0.0555, -0.0200, 0.0513, 0.1483
+@psLib.time.predict.yp F64 0.3498, -0.0176, -0.0498, 0.1483, -0.0513
+psLib.time.predict.mjd F64 53257.0
+@psLib.time.predict.dut F64 -0.4944, -0.00023, 53262.0
+
Index: /tags/ipp-1-X/bug123/psLib/test/astronomy/data/test.psTime.config3.template
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/astronomy/data/test.psTime.config3.template	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/astronomy/data/test.psTime.config3.template	(revision 22331)
@@ -0,0 +1,23 @@
+# This configuration file specifies values required for time calculations by psLib.
+psLib.time.tables.dir STR PREFIX/share/pslib                                            # Directory for time tables
+psLib.time.tables.n S32 4                                                               # Number of time tables
+psLib.time.tables.files STR ser7.dat eopc01_1900_2004.dat finals_all.dat tai_utc.dat    # These are the table file names
+@psLib.time.tables.from F64 15020.0, 41684.0 2437300.5                         # Valid from these dates
+@psLib.time.tables.to F64 53622.0, 53258.0, 53627.0 2451179.5                           # Valid to these dates
+psLib.time.before.xp F64 0.0                                                            # Value of XP for before the earliest MJD
+psLib.time.before.yp F64 0.0                                                            # Value of YP for before the earliest MJD
+psLib.time.before.dut F64 0.0                                                           # Value of UT1-UTC for before the earliest MJD
+
+# Now follows formulae for predicting ahead of the most recent available table entry.
+# xp = [0] + [1]*cos A + [2]*sin A + [3]*cos C + [4]*sin C
+# yp = [0] + [1]*cos A + [2]*sin A + [3]*cos C + [4]*sin C
+# A = 2*pi*(MJD - pslib.time.predict.mjd)/365.25
+# C = 2*pi*(MJD - pslib.time.predict.mjd)/435.0
+# dut = ut1-utc = [0] + [1]*(MJD - [2]) - (UT2-UT1)
+# ut2-ut1 = 0.022 sin(2*pi*T) - 0.012 cos(2*pi*T) - 0.006 sin(4*pi*T) + 0.007 cos(4*pi*T)
+# T = 2000.0 + (MJD - 51544.03)/365.2422
+@psLib.time.predict.xp F64 0.0569, 0.0555, -0.0200, 0.0513, 0.1483
+@psLib.time.predict.yp F64 0.3498, -0.0176, -0.0498, 0.1483, -0.0513
+psLib.time.predict.mjd F64 53257.0
+@psLib.time.predict.dut F64 -0.4944, -0.00023, 53262.0
+
Index: /tags/ipp-1-X/bug123/psLib/test/astronomy/data/test.psTime.config4.template
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/astronomy/data/test.psTime.config4.template	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/astronomy/data/test.psTime.config4.template	(revision 22331)
@@ -0,0 +1,23 @@
+# This configuration file specifies values required for time calculations by psLib.
+psLib.time.tables.dir STR .                                                             # Directory for time tables
+psLib.time.tables.n S32 1                                                               # Number of time tables
+psLib.time.tables.files STR test.ser7.dat                                               # This the table file
+@psLib.time.tables.from F64 53258.0                                                     # Valid from this date
+@psLib.time.tables.to F64 53622.0                                                       # Valid to this date
+psLib.time.before.xp F64 0.0                                                            # Value of XP for before the earliest MJD
+psLib.time.before.yp F64 0.0                                                            # Value of YP for before the earliest MJD
+psLib.time.before.dut F64 0.0                                                           # Value of UT1-UTC for before the earliest MJD
+
+# Now follows formulae for predicting ahead of the most recent available table entry.
+# xp = [0] + [1]*cos A + [2]*sin A + [3]*cos C + [4]*sin C
+# yp = [0] + [1]*cos A + [2]*sin A + [3]*cos C + [4]*sin C
+# A = 2*pi*(MJD - pslib.time.predict.mjd)/365.25
+# C = 2*pi*(MJD - pslib.time.predict.mjd)/435.0
+# dut = ut1-utc = [0] + [1]*(MJD - [2]) - (UT2-UT1)
+# ut2-ut1 = 0.022 sin(2*pi*T) - 0.012 cos(2*pi*T) - 0.006 sin(4*pi*T) + 0.007 cos(4*pi*T)
+# T = 2000.0 + (MJD - 51544.03)/365.2422
+@psLib.time.predict.xp F64 0.0569
+@psLib.time.predict.yp F64 0.3498
+psLib.time.predict.mjd F64 53257.0
+@psLib.time.predict.dut F64 -0.4944
+
Index: /tags/ipp-1-X/bug123/psLib/test/astronomy/data/test.ser7.dat
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/astronomy/data/test.ser7.dat	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/astronomy/data/test.ser7.dat	(revision 22331)
@@ -0,0 +1,380 @@
+#  ser7.dat
+#
+#  This file comes from http://maia.usno.navy.mil (Click on General Information about Earth Orientation). This
+#  file may also be directly downloaded from ftp://maia.usno.navy.mil/ser7/ser7.dat. See readme.ser7 (located
+#  in the psLib/data directory) for details.
+#
+#  @author Ross Harman, MHPCC
+#
+#  @version $Revision: 1.1 $ $Name: not supported by cvs2svn $
+#  @date $Date: 2005-02-17 01:58:43 $
+#
+#
+#        MJD         PM-x        PM-y       UT1-UTC
+#      (days)      (arcsec)    (arcsec)      (sec)
+        psF64        psF64       psF64       psF64
+        53yyy244       0.1377      0.5027     -0.45210
+        53245       0.1394      0.5015     -0.45190
+        53246       0.1411      0.5002     -0.45197
+        53247       0.1429      0.4989     -0.45234
+        53248       0.1447      0.4976     -0.45293
+        53249       0.1465      0.4962     -0.45361
+        53250       0.1484      0.4948     -0.45424
+        53251       0.1503      0.4934     -0.45476
+        53252       0.1521      0.4920     -0.45512
+        53253       0.1540      0.4905     -0.45530
+        53254       0.1558      0.4890     -0.45531
+        53255       0.1577      0.4874     -0.45519
+        53256       0.1595      0.4859     -0.45497
+        53257       0.1613      0.4843     -0.45474
+        53258       0.1631      0.4827     -0.45458
+        53259       0.1649      0.4810     -0.45456
+        53260       0.1667      0.4794     -0.45474
+        53261       0.1684      0.4777     -0.45514
+        53262       0.1701      0.4760     -0.45578
+        53263       0.1717      0.4742     -0.45660
+        53264       0.1734      0.4725     -0.45754
+        53265       0.1750      0.4707     -0.45849
+        53266       0.1765      0.4689     -0.45932
+        53267       0.1780      0.4671     -0.45996
+        53268       0.1795      0.4652     -0.46036
+        53269       0.1810      0.4634     -0.46055
+        53270       0.1824      0.4615     -0.46061
+        53271       0.1838      0.4596     -0.46068
+        53272       0.1852      0.4576     -0.46086
+        53273       0.1865      0.4557     -0.46126
+        53274       0.1878      0.4537     -0.46192
+        53275       0.1890      0.4517     -0.46280
+        53276       0.1902      0.4497     -0.46382
+        53277       0.1914      0.4477     -0.46486
+        53278       0.1925      0.4457     -0.46581
+        53279       0.1936      0.4436     -0.46658
+        53280       0.1946      0.4415     -0.46715
+        53281       0.1956      0.4394     -0.46750
+        53282       0.1966      0.4373     -0.46766
+        53283       0.1976      0.4352     -0.46772
+        53284       0.1985      0.4331     -0.46773
+        53285       0.1993      0.4309     -0.46778
+        53286       0.2001      0.4288     -0.46795
+        53287       0.2009      0.4266     -0.46830
+        53288       0.2017      0.4244     -0.46887
+        53289       0.2024      0.4222     -0.46968
+        53290       0.2031      0.4200     -0.47071
+        53291       0.2037      0.4178     -0.47191
+        53292       0.2043      0.4155     -0.47317
+        53293       0.2049      0.4133     -0.47435
+        53294       0.2054      0.4111     -0.47536
+        53295       0.2059      0.4088     -0.47610
+        53296       0.2063      0.4065     -0.47659
+        53297       0.2067      0.4042     -0.47691
+        53298       0.2071      0.4020     -0.47718
+        53299       0.2075      0.3997     -0.47755
+        53300       0.2078      0.3974     -0.47811
+        53301       0.2080      0.3951     -0.47893
+        53302       0.2083      0.3928     -0.47998
+        53303       0.2085      0.3905     -0.48119
+        53304       0.2086      0.3881     -0.48247
+        53305       0.2088      0.3858     -0.48369
+        53306       0.2089      0.3835     -0.48477
+        53307       0.2089      0.3812     -0.48565
+        53308       0.2090      0.3789     -0.48630
+        53309       0.2089      0.3765     -0.48674
+        53310       0.2089      0.3742     -0.48701
+        53311       0.2088      0.3719     -0.48718
+        53312       0.2088      0.3696     -0.48732
+        53313       0.2086      0.3672     -0.48753
+        53314       0.2085      0.3649     -0.48785
+        53315       0.2082      0.3626     -0.48835
+        53316       0.2080      0.3603     -0.48906
+        53317       0.2077      0.3579     -0.48997
+        53318       0.2074      0.3556     -0.49106
+        53319       0.2071      0.3533     -0.49226
+        53320       0.2067      0.3510     -0.49344
+        53321       0.2063      0.3487     -0.49449
+        53322       0.2059      0.3464     -0.49531
+        53323       0.2054      0.3441     -0.49585
+        53324       0.2049      0.3418     -0.49618
+        53325       0.2044      0.3396     -0.49639
+        53326       0.2038      0.3373     -0.49664
+        53327       0.2032      0.3350     -0.49705
+        53328       0.2026      0.3328     -0.49769
+        53329       0.2020      0.3305     -0.49854
+        53330       0.2013      0.3283     -0.49953
+        53331       0.2006      0.3261     -0.50058
+        53332       0.1999      0.3239     -0.50158
+        53333       0.1991      0.3217     -0.50243
+        53334       0.1983      0.3195     -0.50308
+        53335       0.1975      0.3173     -0.50350
+        53336       0.1967      0.3151     -0.50369
+        53337       0.1958      0.3130     -0.50370
+        53338       0.1949      0.3108     -0.50358
+        53339       0.1940      0.3087     -0.50342
+        53340       0.1931      0.3066     -0.50329
+        53341       0.1921      0.3045     -0.50327
+        53342       0.1911      0.3024     -0.50340
+        53343       0.1901      0.3004     -0.50372
+        53344       0.1890      0.2983     -0.50423
+        53345       0.1880      0.2963     -0.50493
+        53346       0.1869      0.2943     -0.50574
+        53347       0.1858      0.2923     -0.50660
+        53348       0.1846      0.2903     -0.50739
+        53349       0.1835      0.2883     -0.50808
+        53350       0.1823      0.2864     -0.50851
+        53351       0.1811      0.2844     -0.50870
+        53352       0.1799      0.2825     -0.50874
+        53353       0.1786      0.2807     -0.50875
+        53354       0.1773      0.2788     -0.50890
+        53355       0.1760      0.2769     -0.50927
+        53356       0.1747      0.2751     -0.50987
+        53357       0.1734      0.2733     -0.51064
+        53358       0.1720      0.2715     -0.51148
+        53359       0.1707      0.2698     -0.51228
+        53360       0.1693      0.2680     -0.51295
+        53361       0.1679      0.2663     -0.51342
+        53362       0.1664      0.2646     -0.51367
+        53363       0.1650      0.2629     -0.51371
+        53364       0.1635      0.2613     -0.51357
+        53365       0.1620      0.2596     -0.51330
+        53366       0.1605      0.2580     -0.51298
+        53367       0.1590      0.2565     -0.51268
+        53368       0.1575      0.2549     -0.51247
+        53369       0.1559      0.2534     -0.51241
+        53370       0.1543      0.2519     -0.51253
+        53371       0.1528      0.2504     -0.51283
+        53372       0.1511      0.2489     -0.51331
+        53373       0.1495      0.2475     -0.51391
+        53374       0.1479      0.2461     -0.51458
+        53375       0.1463      0.2447     -0.51522
+        53376       0.1446      0.2434     -0.51574
+        53377       0.1429      0.2420     -0.51605
+        53378       0.1412      0.2407     -0.51614
+        53379       0.1395      0.2395     -0.51605
+        53380       0.1378      0.2382     -0.51590
+        53381       0.1361      0.2370     -0.51585
+        53382       0.1344      0.2358     -0.51603
+        53383       0.1326      0.2347     -0.51648
+        53384       0.1308      0.2335     -0.51717
+        53385       0.1291      0.2324     -0.51800
+        53386       0.1273      0.2313     -0.51881
+        53387       0.1255      0.2303     -0.51951
+        53388       0.1237      0.2293     -0.52000
+        53389       0.1219      0.2283     -0.52027
+        53390       0.1200      0.2273     -0.52032
+        53391       0.1182      0.2264     -0.52018
+        53392       0.1164      0.2255     -0.51992
+        53393       0.1145      0.2246     -0.51959
+        53394       0.1126      0.2237     -0.51928
+        53395       0.1108      0.2229     -0.51905
+        53396       0.1089      0.2221     -0.51897
+        53397       0.1070      0.2213     -0.51908
+        53398       0.1051      0.2206     -0.51939
+        53399       0.1032      0.2199     -0.51987
+        53400       0.1013      0.2192     -0.52050
+        53401       0.0994      0.2186     -0.52119
+        53402       0.0975      0.2180     -0.52187
+        53403       0.0956      0.2174     -0.52246
+        53404       0.0936      0.2168     -0.52288
+        53405       0.0917      0.2163     -0.52309
+        53406       0.0898      0.2158     -0.52311
+        53407       0.0878      0.2153     -0.52305
+        53408       0.0859      0.2149     -0.52303
+        53409       0.0840      0.2144     -0.52321
+        53410       0.0820      0.2141     -0.52368
+        53411       0.0801      0.2137     -0.52444
+        53412       0.0781      0.2134     -0.52542
+        53413       0.0761      0.2131     -0.52646
+        53414       0.0742      0.2128     -0.52744
+        53415       0.0722      0.2126     -0.52822
+        53416       0.0703      0.2124     -0.52877
+        53417       0.0683      0.2122     -0.52907
+        53418       0.0663      0.2120     -0.52916
+        53419       0.0644      0.2119     -0.52910
+        53420       0.0624      0.2118     -0.52897
+        53421       0.0605      0.2117     -0.52883
+        53422       0.0585      0.2117     -0.52876
+        53423       0.0566      0.2117     -0.52882
+        53424       0.0546      0.2117     -0.52907
+        53425       0.0526      0.2118     -0.52951
+        53426       0.0507      0.2118     -0.53014
+        53427       0.0487      0.2119     -0.53091
+        53428       0.0468      0.2121     -0.53174
+        53429       0.0449      0.2122     -0.53254
+        53430       0.0429      0.2124     -0.53321
+        53431       0.0410      0.2126     -0.53368
+        53432       0.0391      0.2129     -0.53392
+        53433       0.0372      0.2131     -0.53393
+        53434       0.0352      0.2134     -0.53380
+        53435       0.0333      0.2138     -0.53366
+        53436       0.0314      0.2141     -0.53365
+        53437       0.0296      0.2145     -0.53389
+        53438       0.0277      0.2149     -0.53443
+        53439       0.0258      0.2154     -0.53526
+        53440       0.0239      0.2159     -0.53627
+        53441       0.0221      0.2164     -0.53733
+        53442       0.0202      0.2169     -0.53830
+        53443       0.0184      0.2174     -0.53908
+        53444       0.0166      0.2180     -0.53964
+        53445       0.0147      0.2186     -0.53998
+        53446       0.0129      0.2192     -0.54014
+        53447       0.0111      0.2198     -0.54018
+        53448       0.0093      0.2205     -0.54018
+        53449       0.0076      0.2212     -0.54022
+        53450       0.0058      0.2219     -0.54037
+        53451       0.0040      0.2227     -0.54069
+        53452       0.0023      0.2234     -0.54118
+        53453       0.0005      0.2242     -0.54185
+        53454      -0.0012      0.2250     -0.54266
+        53455      -0.0029      0.2258     -0.54356
+        53456      -0.0046      0.2267     -0.54447
+        53457      -0.0063      0.2276     -0.54530
+        53458      -0.0079      0.2285     -0.54598
+        53459      -0.0096      0.2294     -0.54647
+        53460      -0.0112      0.2303     -0.54675
+        53461      -0.0128      0.2313     -0.54688
+        53462      -0.0144      0.2323     -0.54699
+        53463      -0.0160      0.2333     -0.54724
+        53464      -0.0176      0.2343     -0.54775
+        53465      -0.0191      0.2353     -0.54858
+        53466      -0.0207      0.2364     -0.54970
+        53467      -0.0222      0.2375     -0.55097
+        53468      -0.0237      0.2386     -0.55228
+        53469      -0.0252      0.2397     -0.55354
+        53470      -0.0267      0.2408     -0.55465
+        53471      -0.0281      0.2420     -0.55556
+        53472      -0.0295      0.2431     -0.55626
+        53473      -0.0310      0.2443     -0.55677
+        53474      -0.0323      0.2455     -0.55715
+        53475      -0.0337      0.2468     -0.55748
+        53476      -0.0351      0.2480     -0.55785
+        53477      -0.0364      0.2493     -0.55833
+        53478      -0.0377      0.2505     -0.55899
+        53479      -0.0390      0.2518     -0.55988
+        53480      -0.0403      0.2531     -0.56095
+        53481      -0.0415      0.2545     -0.56216
+        53482      -0.0427      0.2558     -0.56347
+        53483      -0.0439      0.2572     -0.56478
+        53484      -0.0451      0.2585     -0.56599
+        53485      -0.0463      0.2599     -0.56699
+        53486      -0.0474      0.2613     -0.56769
+        53487      -0.0485      0.2627     -0.56808
+        53488      -0.0496      0.2641     -0.56824
+        53489      -0.0507      0.2656     -0.56830
+        53490      -0.0517      0.2670     -0.56839
+        53491      -0.0527      0.2685     -0.56860
+        53492      -0.0537      0.2700     -0.56897
+        53493      -0.0547      0.2714     -0.56955
+        53494      -0.0556      0.2729     -0.57032
+        53495      -0.0565      0.2744     -0.57119
+        53496      -0.0574      0.2760     -0.57204
+        53497      -0.0583      0.2775     -0.57277
+        53498      -0.0591      0.2790     -0.57329
+        53499      -0.0600      0.2806     -0.57354
+        53500      -0.0607      0.2821     -0.57350
+        53501      -0.0615      0.2837     -0.57328
+        53502      -0.0622      0.2853     -0.57298
+        53503      -0.0630      0.2869     -0.57261
+        53504      -0.0636      0.2885     -0.57218
+        53505      -0.0643      0.2901     -0.57175
+        53506      -0.0649      0.2917     -0.57143
+        53507      -0.0655      0.2933     -0.57124
+        53508      -0.0661      0.2949     -0.57117
+        53509      -0.0667      0.2966     -0.57124
+        53510      -0.0672      0.2982     -0.57139
+        53511      -0.0677      0.2999     -0.57158
+        53512      -0.0682      0.3015     -0.57166
+        53513      -0.0686      0.3032     -0.57155
+        53514      -0.0690      0.3048     -0.57116
+        53515      -0.0694      0.3065     -0.57057
+        53516      -0.0698      0.3082     -0.56989
+        53517      -0.0701      0.3098     -0.56921
+        53518      -0.0704      0.3115     -0.56860
+        53519      -0.0707      0.3132     -0.56818
+        53520      -0.0710      0.3149     -0.56799
+        53521      -0.0712      0.3166     -0.56800
+        53522      -0.0714      0.3183     -0.56809
+        53523      -0.0716      0.3200     -0.56815
+        53524      -0.0717      0.3217     -0.56808
+        53525      -0.0718      0.3234     -0.56781
+        53526      -0.0719      0.3251     -0.56728
+        53527      -0.0720      0.3268     -0.56651
+        53528      -0.0720      0.3285     -0.56557
+        53529      -0.0720      0.3302     -0.56454
+        53530      -0.0720      0.3319     -0.56347
+        53531      -0.0720      0.3336     -0.56244
+        53532      -0.0719      0.3353     -0.56148
+        53533      -0.0718      0.3370     -0.56060
+        53534      -0.0717      0.3387     -0.55990
+        53535      -0.0715      0.3404     -0.55943
+        53536      -0.0713      0.3421     -0.55916
+        53537      -0.0711      0.3438     -0.55897
+        53538      -0.0709      0.3455     -0.55881
+        53539      -0.0707      0.3472     -0.55859
+        53540      -0.0704      0.3489     -0.55820
+        53541      -0.0701      0.3506     -0.55751
+        53542      -0.0697      0.3523     -0.55650
+        53543      -0.0694      0.3540     -0.55529
+        53544      -0.0690      0.3557     -0.55402
+        53545      -0.0686      0.3573     -0.55279
+        53546      -0.0682      0.3590     -0.55173
+        53547      -0.0677      0.3607     -0.55093
+        53548      -0.0673      0.3623     -0.55037
+        53549      -0.0668      0.3640     -0.54994
+        53550      -0.0662      0.3656     -0.54947
+        53551      -0.0657      0.3673     -0.54884
+        53552      -0.0651      0.3689     -0.54798
+        53553      -0.0645      0.3705     -0.54689
+        53554      -0.0639      0.3721     -0.54560
+        53555      -0.0633      0.3738     -0.54414
+        53556      -0.0626      0.3754     -0.54257
+        53557      -0.0620      0.3770     -0.54101
+        53558      -0.0613      0.3786     -0.53952
+        53559      -0.0605      0.3801     -0.53819
+        53560      -0.0598      0.3817     -0.53705
+        53561      -0.0590      0.3833     -0.53611
+        53562      -0.0583      0.3848     -0.53535
+        53563      -0.0575      0.3864     -0.53475
+        53564      -0.0566      0.3879     -0.53425
+        53565      -0.0558      0.3895     -0.53374
+        53566      -0.0549      0.3910     -0.53315
+        53567      -0.0541      0.3925     -0.53243
+        53568      -0.0532      0.3940     -0.53152
+        53569      -0.0523      0.3955     -0.53042
+        53570      -0.0513      0.3969     -0.52913
+        53571      -0.0504      0.3984     -0.52776
+        53572      -0.0494      0.3998     -0.52644
+        53573      -0.0485      0.4013     -0.52532
+        53574      -0.0475      0.4027     -0.52451
+        53575      -0.0464      0.4041     -0.52400
+        53576      -0.0454      0.4055     -0.52377
+        53577      -0.0444      0.4069     -0.52366
+        53578      -0.0433      0.4083     -0.52344
+        53579      -0.0423      0.4096     -0.52299
+        53580      -0.0412      0.4110     -0.52228
+        53581      -0.0401      0.4123     -0.52130
+        53582      -0.0390      0.4136     -0.52010
+        53583      -0.0378      0.4149     -0.51872
+        53584      -0.0367      0.4162     -0.51725
+        53585      -0.0356      0.4175     -0.51578
+        53586      -0.0344      0.4188     -0.51436
+        53587      -0.0332      0.4200     -0.51310
+        53588      -0.0320      0.4212     -0.51204
+        53589      -0.0309      0.4224     -0.51120
+        53590      -0.0297      0.4236     -0.51055
+        53591      -0.0284      0.4248     -0.51006
+        53592      -0.0272      0.4260     -0.50966
+        53593      -0.0260      0.4271     -0.50922
+        53594      -0.0247      0.4283     -0.50872
+        53595      -0.0235      0.4294     -0.50809
+        53596      -0.0222      0.4305     -0.50729
+        53597      -0.0210      0.4315     -0.50638
+        53598      -0.0197      0.4326     -0.50535
+        53599      -0.0184      0.4336     -0.50431
+        53600      -0.0171      0.4347     -0.50339
+        53601      -0.0158      0.4357     -0.50273
+        53602      -0.0145      0.4367     -0.50244
+        53603      -0.0132      0.4376     -0.50247
+        53604      -0.0119      0.4386     -0.50267
+        53605      -0.0106      0.4395     -0.50286
+        53606      -0.0093      0.4404     -0.50287
+        53607      -0.0079      0.4413     -0.50263
+        53608      -0.0066      0.4422     -0.50217
Index: /tags/ipp-1-X/bug123/psLib/test/astronomy/tst_psAstrometry.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/astronomy/tst_psAstrometry.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/astronomy/tst_psAstrometry.c	(revision 22331)
@@ -0,0 +1,786 @@
+/** @file  tst_psAstrometry.c
+ *
+ *  @brief Contains the tests for psAstrometry.[ch]
+ *
+ *  @author Robert DeSonia, MHPCC
+ *
+ *  @version $Revision: 1.18 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-04-18 23:55:29 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+
+#include "config.h"
+
+#include <math.h>
+#include <string.h>
+
+#include "psTest.h"
+#include "pslib_strict.h"
+
+static psS32 testExposureAlloc(void);
+static psS32 testObservatoryAlloc(void);
+static psS32 testFPAAlloc(void);
+static psS32 testChipAlloc(void);
+static psS32 testCellAlloc(void);
+static psS32 testReadoutAlloc(void);
+
+testDescription tests[] = {
+                              {testExposureAlloc,735,"psExposureAlloc",0,false},
+                              {testObservatoryAlloc,736,"psObservatoryAlloc",0,false},
+                              {testFPAAlloc,739,"psFPAAlloc",0,false},
+                              {testChipAlloc,740,"psChipAlloc",0,false},
+                              {testCellAlloc,741,"psCellAlloc",0,false},
+                              {testReadoutAlloc,742,"psReadoutAlloc",0,false},
+                              {NULL}
+                          };
+
+psS32 main(psS32 argc, char* argv[])
+{
+    psLogSetLevel(PS_LOG_INFO);
+
+    return ! runTestSuite(stderr,"psAstrometry",tests,argc,argv);
+}
+
+static psS32 testExposureAlloc(void)
+{
+    psTime* now = psTimeGetNow(PS_TIME_UTC);
+    char* name = "The Kaiser Royal Observatory";
+
+    psObservatory* obs = psObservatoryAlloc(name,
+                                            20.7, 156.3, 3055.0, 9.0);
+
+    psExposure* exp = psExposureAlloc(1.0, 2.0, 3.0, 4.0, 5.0,
+                                      now, 6.0f, 7.0f, 8.0f, 9.0f, 10.0f, 11.0f, obs);
+
+    if (fabs(exp->ra - 1.0) > DBL_EPSILON) {
+        psLogMsg(__func__,PS_LOG_ERROR,"psExposureAlloc did not set ra.");
+        return 1;
+    }
+
+    if (fabs(exp->dec - 2.0) > DBL_EPSILON) {
+        psLogMsg(__func__,PS_LOG_ERROR,"psExposureAlloc did not set dec.");
+        return 2;
+    }
+
+    if (fabs(exp->hourAngle - 3.0) > DBL_EPSILON) {
+        psLogMsg(__func__,PS_LOG_ERROR,"psExposureAlloc did not set hourAngle.");
+        return 3;
+    }
+
+    if (fabs(exp->zenithDistance - 4.0) > DBL_EPSILON) {
+        psLogMsg(__func__,PS_LOG_ERROR,"psExposureAlloc did not set zenithDistance.");
+        return 4;
+    }
+
+    if (fabs(exp->azimuth - 5.0) > DBL_EPSILON) {
+        psLogMsg(__func__,PS_LOG_ERROR,"psExposureAlloc did not set azimuth.");
+        return 5;
+    }
+    if (exp->time != now) {
+        psLogMsg(__func__,PS_LOG_ERROR,"psExposureAlloc did not set time.");
+        return 6;
+    }
+
+    if (fabsf(exp->rotAngle - 6.0f) > FLT_EPSILON) {
+        psLogMsg(__func__,PS_LOG_ERROR,"psExposureAlloc did not set rotAngle.");
+        return 7;
+    }
+
+    if (fabsf(exp->temperature - 7.0f) > FLT_EPSILON) {
+        psLogMsg(__func__,PS_LOG_ERROR,"psExposureAlloc did not set temperature.");
+        return 8;
+    }
+
+    if (fabsf(exp->pressure - 8.0f) > FLT_EPSILON) {
+        psLogMsg(__func__,PS_LOG_ERROR,"psExposureAlloc did not set pressure.");
+        return 9;
+    }
+
+    if (fabsf(exp->humidity - 9.0f) > FLT_EPSILON) {
+        psLogMsg(__func__,PS_LOG_ERROR,"psExposureAlloc did not set humidity.");
+        return 10;
+    }
+
+    if (fabsf(exp->exposureTime - 10.0f) > FLT_EPSILON) {
+        psLogMsg(__func__,PS_LOG_ERROR,"psExposureAlloc did not set exposureTime.");
+        return 11;
+    }
+
+    if (fabsf(exp->wavelength - 11.0f) > FLT_EPSILON) {
+        psLogMsg(__func__,PS_LOG_ERROR,"psExposureAlloc did not set wavelength.");
+        return 12;
+    }
+
+    if (exp->observatory != obs) {
+        psLogMsg(__func__,PS_LOG_ERROR,"psExposureAlloc did not set wavelength.");
+        return 12;
+    }
+
+    psFree(exp);
+    psFree(now);
+    psFree(obs);
+    psLibFinalize();
+    return 0;
+}
+
+static psS32 testObservatoryAlloc(void)
+{
+    char* name = "The Kaiser Royal Observatory";
+
+    psObservatory* obs = psObservatoryAlloc(name,
+                                            20.7*M_PI/180.0, 156.3*M_PI/180.0, 3055.0, 9.0);
+
+    if (fabs(obs->latitude - 20.7*M_PI/180.0) > DBL_EPSILON) {
+        psLogMsg(__func__,PS_LOG_ERROR,"psObservatoryAlloc did not set latitude.");
+        return 1;
+    }
+
+    if (fabs(obs->longitude - 156.3*M_PI/180.0) > DBL_EPSILON) {
+        psLogMsg(__func__,PS_LOG_ERROR,"psObservatoryAlloc did not set longitude.");
+        return 2;
+    }
+
+    if (fabs(obs->height - 3055.0) > DBL_EPSILON) {
+        psLogMsg(__func__,PS_LOG_ERROR,"psObservatoryAlloc did not set height.");
+        return 3;
+    }
+
+    if (fabs(obs->tlr - 9.0) > DBL_EPSILON) {
+        psLogMsg(__func__,PS_LOG_ERROR,"psObservatoryAlloc did not set tlr.");
+        return 4;
+    }
+
+    if (strcmp(obs->name,name) != 0) {
+        psLogMsg(__func__,PS_LOG_ERROR,"psObservatoryAlloc did not set name.");
+        return 5;
+    }
+
+    if (obs->name == name) {
+        psLogMsg(__func__,PS_LOG_ERROR,"psObservatoryAlloc did not copy name.");
+        return 6;
+    }
+
+    psObservatory* obs2 = psObservatoryAlloc(NULL,
+                          20.7*M_PI/180.0, 156.3*M_PI/180.0, 3055.0, 9.0);
+
+    if (obs2->name != NULL) {
+        psLogMsg(__func__,PS_LOG_ERROR,"psObservatoryAlloc did not handle NULL name.");
+        return 7;
+    }
+
+    psFree(obs);
+    psFree(obs2);
+
+    return 0;
+}
+
+static psS32 testFPAAlloc(void)
+{
+
+    psTime* now = psTimeGetNow(PS_TIME_TAI);
+    char* name = "The Kaiser Royal Observatory";
+
+    psObservatory* obs = psObservatoryAlloc(name,
+                                            20.7*M_PI/180.0, 156.3*M_PI/180.0, 3055.0, 0.0065f);
+
+    psExposure* exp = psExposureAlloc(1.0, 2.0, 3.0, 4.0, 5.0,
+                                      now, 6.0f, 260.0f, 1013.0f, 0.7f, 10.0f, 0.650f, obs);
+
+    /*
+        1. Call psFPAAlloc with nChips > 0 and a non-NULL psExposure.
+        a) Verify that the psExposure reference is: 1. is set in struct as
+        exposure; 2. its reference count is incremented.
+        b) Verify that the chip attribute is of the size specified by the
+        parameter nChips and that the chips array elements are all NULL.
+        c) verify that all other references in the struct is NULL.
+    */
+
+    psFPA* fpa = psFPAAlloc(8, exp);
+
+    if (fpa == NULL) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "psFPAAlloc returned a NULL.");
+        return 1;
+    }
+
+    if (fpa->exposure != exp) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "psFPAAlloc did not set the exposure.");
+        return 2;
+    }
+
+    if (psMemGetRefCounter(exp) != 2) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "psFPAAlloc did not increment reference counter for exposure.");
+        return 3;
+    }
+
+    if (fpa->chips->n != 0) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "psFPAAlloc did not set the number of chips properly.");
+        return 4;
+    }
+
+    if (fpa->chips->nalloc != 8) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "psFPAAlloc did not allocate space for the number of chips properly.");
+        return 4;
+    }
+
+    for (psS32 lcv=0; lcv < 8; lcv++) {
+        if (fpa->chips->data[lcv] != NULL) {
+            psLogMsg(__func__,PS_LOG_ERROR,
+                     "psFPAAlloc did not set chip %d to NULL.", lcv);
+            return 5;
+        }
+    }
+
+    if (fpa->metadata != NULL) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "psFPAAlloc did not set metadata to NULL.");
+        return 6;
+    }
+
+    if (fpa->fromTangentPlane != NULL) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "psFPAAlloc did not set fromTangentPlane to NULL.");
+        return 7;
+    }
+
+    if (fpa->toTangentPlane != NULL) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "psFPAAlloc did not set toTangentPlane to NULL.");
+        return 8;
+    }
+
+    if (fpa->pattern != NULL) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "psFPAAlloc did not set pattern to NULL.");
+        return 9;
+    }
+
+    if (fpa->grommit == NULL) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "psFPAAlloc did not set grommit using given exposure.");
+        return 10;
+    }
+
+    if (fpa->colorPlus != NULL) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "psFPAAlloc did not set colorPlus to NULL.");
+        return 11;
+    }
+
+    if (fpa->colorMinus != NULL) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "psFPAAlloc did not set colorMinus to NULL.");
+        return 12;
+    }
+
+    if (fpa->projection != NULL) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "psFPAAlloc did not set projection to NULL.");
+        return 13;
+    }
+
+    /*
+        2. Call psFPAAlloc with nChips = 0. Verify that the chips array is
+           zero in size and the program execution does not stop.
+    */
+
+    psFPA* fpa2 = psFPAAlloc(0,exp);
+
+    if (fpa2->chips->n != 0) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "psFPAAlloc did not set the number of chips properly.");
+        return 14;
+    }
+
+    if (fpa2->chips->nalloc != 0) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "psFPAAlloc did not set the nalloc number of chips properly.");
+        return 14;
+    }
+
+    /*
+        3. Call psFPAAlloc with a NULL psExposure. Verify that the program
+           execution doe not stop and the exposure attribute is NULL.
+    */
+
+    psFPA* fpa3 = psFPAAlloc(4,NULL);
+    if (fpa3->exposure != NULL) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "psFPAAlloc did not set the exposure to NULL given NULL parameter.");
+        return 15;
+    }
+
+    /*
+        4. Call psFPAAlloc and set all references in the struct to a memory
+           buffer. Verify that psFree cleans up all the buffers referenced in
+           the struct, i.e., there is no memory leaks generated.
+    */
+
+    fpa->chips->n = fpa->chips->nalloc;
+    for (psS32 lcv=0; lcv < 8; lcv++) {
+        fpa->chips->data[lcv] = psAlloc(4);
+    }
+
+    fpa->metadata = psAlloc(4);
+    fpa->fromTangentPlane = psAlloc(4);
+    fpa->toTangentPlane = psAlloc(4);
+    fpa->pattern = psAlloc(4);
+    fpa->colorPlus  = psAlloc(4);
+    fpa->colorMinus  = psAlloc(4);
+    fpa->projection  = psAlloc(4);
+
+    psFree(fpa3);
+    psFree(fpa2);
+    psFree(fpa);
+    psFree(exp);
+    psFree(obs);
+    psFree(now);
+    psLibFinalize();
+
+    return 0;
+}
+
+static psS32 testChipAlloc(void)
+{
+    char* name = "The Kaiser Royal Observatory";
+
+    psTime* now = psTimeGetNow(PS_TIME_TAI);
+
+    psObservatory* obs = psObservatoryAlloc(name,
+                                            20.7*M_PI/180.0, 156.3*M_PI/180.0, 3055.0, 0.0065f);
+
+    psExposure* exp = psExposureAlloc(1.0, 2.0, 3.0, 4.0, 5.0,
+                                      now, 6.0f, 260.0f, 1013.0f, 0.7f, 10.0f, 0.650f, obs);
+
+    psFPA* fpa = psFPAAlloc(8, exp);
+
+    // N.B. psFPAAlloc made made a reference to any of these that it is
+    // referencing, so these don't necessary are actually freed here.  Just
+    // these references to the buffers are freed.
+    psFree(exp);
+    psFree(obs);
+    psFree(now);
+
+    /*
+        1. invoke psChipAlloc with nCells > 0 and parentFPA non-NULL. Verify
+           that:
+        a. the cells array is of the size nCells and all elements are NULL.
+        b. parent attribute is set to parentFPA parameter and the ref. count
+           was incremented.
+        c. all other attributes are initialized to NULL or 0.
+    */
+
+    psChip* chip = psChipAlloc(8, fpa);
+
+    if (chip == NULL) {
+        psLogMsg(__func__,PS_LOG_ERROR,"psChipAlloc returned NULL.");
+        return 1;
+    }
+
+    if (chip->cells->n != 0) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "psChipAlloc did not set the number of cells properly.");
+        return 2;
+    }
+
+    if (chip->cells->nalloc != 8) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "psChipAlloc did not allocate cell array size properly.");
+        return 2;
+    }
+
+    for (psS32 lcv=0; lcv < 8; lcv++) {
+        if (chip->cells->data[lcv] != NULL) {
+            psLogMsg(__func__,PS_LOG_ERROR,
+                     "psChipAlloc did not set cell %d to NULL.", lcv);
+            return 3;
+        }
+        chip->cells->data[lcv] = psAlloc(4); // to check if these are freed.
+    }
+    chip->cells->n = 8;
+
+    if (chip->parent != fpa) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "psChipAlloc did not set the parent properly.");
+        return 4;
+    }
+
+    if (psMemGetRefCounter(fpa) != 1) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "psChipAlloc incremented reference counter for parent FPA.");
+        return 5;
+    }
+
+    if (chip->metadata != NULL) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "psChipAlloc did not set metadata to NULL.");
+        return 6;
+    }
+    chip->metadata = psAlloc(4); // to check if these are freed.
+
+    if (chip->toFPA != NULL) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "psChipAlloc did not set toFPA to NULL.");
+        return 7;
+    }
+    chip->toFPA = psAlloc(4); // to check if these are freed.
+
+    if (chip->fromFPA != NULL) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "psChipAlloc did not set fromFPA to NULL.");
+        return 8;
+    }
+    chip->fromFPA = psAlloc(4); // to check if these are freed.
+
+    /*
+        2. invoke psChipAlloc with nCells = 0. Verify that:
+        a. execution does not halt
+        b. the cells array is of the size of one.
+    */
+
+    psChip* chip2 = psChipAlloc(0,fpa);
+
+    if (chip2 == NULL) {
+        psLogMsg(__func__,PS_LOG_ERROR,"psChipAlloc returned NULL.");
+        return 11;
+    }
+
+    if (chip2->cells->n != 0) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "psChipAlloc did not set the number of cells properly.");
+        return 12;
+    }
+
+    if (chip2->cells->nalloc != 1) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "psChipAlloc did not allocate cell array size properly.");
+        return 12;
+    }
+
+    if (chip2->parent != fpa) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "psChipAlloc did not set the parent properly.");
+        return 14;
+    }
+
+    if (psMemGetRefCounter(fpa) != 1) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "psChipAlloc incremented reference counter for parent FPA.");
+        return 15;
+    }
+
+    /*
+        3. invoke psChipAlloc with parentFPA = NULL. Verify that parent
+           attribute is NULL and no error is generated.
+    */
+
+    psChip* chip3 = psChipAlloc(8,NULL);
+
+    if (chip3 == NULL) {
+        psLogMsg(__func__,PS_LOG_ERROR,"psChipAlloc returned NULL.");
+        return 21;
+    }
+
+    if (chip3->cells->n != 0) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "psChipAlloc did not set the number of cells properly.");
+        return 22;
+    }
+
+    if (chip3->cells->nalloc != 8) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "psChipAlloc did not allocate cell array properly.");
+        return 23;
+    }
+
+    if (chip3->parent != NULL) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "psChipAlloc did not set the parent to NULL.");
+        return 24;
+    }
+
+    psFree(chip);
+    psFree(chip2);
+    psFree(chip3);
+    psFree(fpa);
+    psLibFinalize();
+
+    return 0;
+}
+
+static psS32 testCellAlloc(void)
+{
+    char* name = "The Kaiser Royal Observatory";
+
+    psTime* now = psTimeGetNow(PS_TIME_TAI);
+
+    psObservatory* obs = psObservatoryAlloc(name,
+                                            20.7*M_PI/180.0,
+                                            156.3*M_PI/180.0,
+                                            3055.0,
+                                            0.0065f);
+
+    psExposure* exp = psExposureAlloc(1.0,
+                                      2.0,
+                                      3.0,
+                                      4.0,
+                                      5.0,
+                                      now,
+                                      6.0f,
+                                      260.0f,
+                                      1013.0f,
+                                      0.7f,
+                                      10.0f,
+                                      0.650f,
+                                      obs);
+
+    psFPA* fpa = psFPAAlloc(8, exp);
+
+    psChip* chip = psChipAlloc(8, fpa);
+
+    // N.B. psChipAlloc made a reference to any of these that it is
+    // referencing, so these are not actually freed here.  Just
+    // these references to the buffers are freed.
+    psFree(fpa);
+    psFree(exp);
+    psFree(obs);
+    psFree(now);
+
+    /*
+        1. invoke psCellAlloc with nReadouts > 0 and parentChip non-NULL. Verify that:
+        a. the readouts array is of the size nReadouts and all elements are NULL.
+        b. parent attribute is set to parentChip parameter and the ref. count
+           was incremented.
+        c. all other attributes are initialized to NULL or 0.
+    */
+
+    psCell* cell1 = psCellAlloc(8,chip);
+
+    if (cell1 == NULL) {
+        psLogMsg(__func__,PS_LOG_ERROR,"psCellAlloc returned NULL.");
+        return 1;
+    }
+
+    if (cell1->readouts->n != 0) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "psCellAlloc did not set the number of readouts properly.");
+        return 2;
+    }
+
+    if (cell1->readouts->nalloc != 8) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "psCellAlloc did not allocat the readout array properly.");
+        return 2;
+    }
+
+    for (psS32 lcv=0; lcv < 8; lcv++) {
+        if (cell1->readouts->data[lcv] != NULL) {
+            psLogMsg(__func__,PS_LOG_ERROR,
+                     "psCellAlloc did not set readout %d to NULL.", lcv);
+            return 3;
+        }
+        cell1->readouts->data[lcv] = psAlloc(4); // to check if these are freed.
+    }
+    cell1->readouts->n = 8;
+
+    if (cell1->parent != chip) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "psCellAlloc did not set the parent properly.");
+        return 4;
+    }
+
+    if (psMemGetRefCounter(chip) != 1) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "psCellAlloc incremented reference counter for parent.");
+        return 5;
+    }
+
+    if (cell1->metadata != NULL) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "psCellAlloc did not set metadata to NULL.");
+        return 6;
+    }
+    cell1->metadata = psAlloc(4); // to check if these are freed.
+
+    if (cell1->toChip != NULL) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "psCellAlloc did not set toChip to NULL.");
+        return 7;
+    }
+    cell1->toChip = psAlloc(4); // to check if these are freed.
+
+    if (cell1->fromChip != NULL) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "psCellAlloc did not set fromChip to NULL.");
+        return 8;
+    }
+    cell1->fromChip = psAlloc(4); // to check if these are freed.
+
+    if (cell1->toFPA != NULL) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "psCellAlloc did not set toFPA to NULL.");
+        return 9;
+    }
+    cell1->toFPA = psAlloc(4); // to check if these are freed.
+
+    if (cell1->toTP != NULL) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "psCellAlloc did not set toTP to NULL.");
+        return 10;
+    }
+    cell1->toTP = psAlloc(4); // to check if these are freed.
+
+    /*
+        2. invoke psChipAlloc with nCells = 0. Verify that:
+        a. execution does not halt
+        b. the cells array is of the size of one.
+    */
+
+    psCell* cell2 = psCellAlloc(0,chip);
+
+    if (cell2 == NULL) {
+        psLogMsg(__func__,PS_LOG_ERROR,"psCellAlloc returned NULL.");
+        return 11;
+    }
+
+    if (cell2->readouts->n != 0) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "psCellAlloc did not set the number of readouts properly.");
+        return 12;
+    }
+
+    if (cell2->readouts->nalloc != 1) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "psCellAlloc did not allocate the readout array properly.");
+        return 13;
+    }
+
+    if (cell2->parent != chip) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "psCellAlloc did not set the parent properly.");
+        return 14;
+    }
+
+    if (psMemGetRefCounter(chip) != 1) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "psCellAlloc incremented reference counter for parent FPA.");
+        return 15;
+    }
+
+    /*
+        3. invoke psChipAlloc with parentFPA = NULL. Verify that parent
+           attribute is NULL and no error is generated.
+    */
+
+    psCell* cell3 = psCellAlloc(8,NULL);
+
+    if (cell3 == NULL) {
+        psLogMsg(__func__,PS_LOG_ERROR,"psCellAlloc returned NULL.");
+        return 21;
+    }
+
+    if (cell3->readouts->n != 0) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "psCellAlloc did not set the number of cells properly.");
+        return 22;
+    }
+
+    if (cell3->readouts->nalloc != 8) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "psCellAlloc did not set the number of cells properly.");
+        return 23;
+    }
+
+    if (cell3->parent != NULL) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "psCellAlloc did not set the parent to NULL.");
+        return 24;
+    }
+
+    psFree(chip);
+    psFree(cell1);
+    psFree(cell2);
+    psFree(cell3);
+    psLibFinalize();
+
+    return 0;
+}
+
+static psS32 testReadoutAlloc(void)
+{
+    psReadout* readout = psReadoutAlloc();
+
+    if (readout == NULL) {
+        psLogMsg(__func__,PS_LOG_ERROR,"psReadoutAlloc returned NULL.");
+        return 1;
+    }
+
+    if (readout->col0 != 0) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "psReadoutAlloc did not set col0 properly.");
+        return 2;
+    }
+
+    if (readout->row0 != 0) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "psReadoutAlloc did not set row0 properly.");
+        return 3;
+    }
+
+    if (readout->image != NULL) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "psReadoutAlloc did not set the image properly.");
+        return 4;
+    }
+
+    readout->image = psAlloc(4); // to check if these are freed.
+
+    if (readout->metadata != NULL) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "psReadoutAlloc did not set metadata to NULL.");
+        return 6;
+    }
+    readout->metadata = psAlloc(4); // to check if these are freed.
+
+    if (readout->mask != NULL) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "psReadoutAlloc did not set mask to NULL.");
+        return 7;
+    }
+    readout->mask = psAlloc(4); // to check if these are freed.
+
+    if (readout->objects != NULL) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "psReadoutAlloc did not set objects to NULL.");
+        return 8;
+    }
+    readout->objects = psAlloc(4); // to check if these are freed.
+
+    /*
+        2. invoke psReadoutAlloc with NULL image. Verify that:
+        a. execution does not halt
+        b. the image attribute is NULL.
+    */
+
+    psReadout* readout2 = psReadoutAlloc(3,4,NULL);
+
+    if (readout2 == NULL) {
+        psLogMsg(__func__,PS_LOG_ERROR,"psReadoutAlloc returned NULL.");
+        return 11;
+    }
+
+    if (readout2->image != NULL) {
+        psLogMsg(__func__,PS_LOG_ERROR,"psReadoutAlloc didn't set image to NULL, as given.");
+        return 12;
+    }
+
+    psFree(readout);
+    psFree(readout2);
+
+    return 0;
+}
Index: /tags/ipp-1-X/bug123/psLib/test/astronomy/tst_psAstrometry01.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/astronomy/tst_psAstrometry01.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/astronomy/tst_psAstrometry01.c	(revision 22331)
@@ -0,0 +1,997 @@
+/** @file  tst_psAstrometry01.c
+*
+*  @brief This code will test the code in psAstrometry.[ch]
+*
+*  @author GLG, MHPCC
+*
+*  @version $Revision: 1.24 $ $Name: not supported by cvs2svn $
+*  @date $Date: 2005-04-19 07:00:20 $
+*
+* XXX: Must test
+* pmSourceAddModel
+* pmSourceSubModel
+* pmSourceFitModel
+* pmSourceContour
+* pmSourceModelGuess
+* pmSourceRoughClass
+* pmSourceMoments
+* pmSourceLocalSky
+*
+*
+*  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+*/
+
+#include "psTest.h"
+#include "pslib_strict.h"
+
+static psS32 test1( void );
+static psS32 test2( void );
+static psS32 test3( void );
+static psS32 test4( void );
+static psS32 test5( void );
+static psS32 test6( void );
+
+testDescription tests[] = {
+                              {test1, -1, "Tests psFixedPatternAlloc()", 0, false},
+                              {test2, -2, "Tests psGrommitAlloc()", 0, false},
+                              {test3, -3, "MISC", 0, false},
+                              {test4, -1, "psPlaneTransformCombine()", 0, false},
+                              {test5, -1, "psPlaneTransformFit()", 0, false},
+                              {test6, -1, "psPlaneTransformInvert()", 0, false},
+                              {NULL}
+                          };
+
+#define PS_PERCENT_COMPARE(X, Y, PERCENT_FRACTION) \
+(fabs((Y)-(X))/fabs(X) < (PERCENT_FRACTION))
+
+#define RA  1.0
+#define DEC  2.0
+#define HA  3.0
+#define ZD  4.0
+#define AZ  5.0
+#define ROT_ANGLE 6.0
+#define TEMPERATURE 7.0
+#define PRESSURE 8.0
+#define HUMIDITY 20.0
+#define EXP_TIME 22.0
+#define WAVELENGTH 11.0
+#define NAME  "The Kaiser Royal Observatory"
+#define LATITUDE 20.7
+#define LONGITUDE 156.3
+#define HEIGHT  3055.0
+#define LAPSERATE 20.0
+
+#define NUM_READOUTS 2
+#define READOUT_NUM_ROWS 8
+#define READOUT_NUM_COLS 8
+
+#define CELL_WIDTH READOUT_NUM_COLS
+#define CELL_HEIGHT READOUT_NUM_ROWS
+
+#define CELL_GAP 2
+
+#define NUM_CELLS 4
+#define CELL_MIN_X 0
+#define CELL_MAX_X CELL_WIDTH
+#define CELL_MIN_Y 0
+#define CELL_MAX_Y CELL_HEIGHT
+
+#define NUM_CHIPS 2
+#define CHIP_MIN_X 0
+#define CHIP_MAX_X ((NUM_CELLS * CELL_WIDTH) + ((NUM_CELLS) * CELL_GAP))
+#define CHIP_MIN_Y 0
+#define CHIP_MAX_Y CELL_HEIGHT
+
+#define CHIP_WIDTH CHIP_MAX_X
+#define CHIP_HEIGHT CHIP_MAX_Y
+#define CHIP_GAP 2
+
+#define FPA_MIN_X 0
+#define FPA_MAX_X ((NUM_CHIPS * CHIP_WIDTH) + ((NUM_CHIPS) * CHIP_GAP))
+#define FPA_MIN_Y 0
+#define FPA_MAX_Y CHIP_HEIGHT
+
+#define ROW0  0
+#define COL0  0
+
+static void psPlaneDistortFree(psPlaneDistort *pd)
+{
+    psFree(pd->x);
+    psFree(pd->y);
+}
+
+static void psPlaneTransformFree(psPlaneTransform *pd)
+{
+    psFree(pd->x);
+    psFree(pd->y);
+}
+
+#define PS_CREATE_2D_IDENTITY_PLANE_TRANSFORM(NAME) \
+{\
+    NAME = (psPlaneTransform *) psAlloc(sizeof(psPlaneTransform)); \
+    psMemSetDeallocator(NAME, (psFreeFcn) psPlaneTransformFree); \
+    NAME->x = psDPolynomial2DAlloc(2, 2, PS_POLYNOMIAL_ORD); \
+    NAME->y = psDPolynomial2DAlloc(2, 2, PS_POLYNOMIAL_ORD); \
+    NAME->x->coeff[1][0] = 1.0; \
+    NAME->y->coeff[0][1] = 1.0; \
+}
+
+#define PS_CREATE_4D_IDENTITY_PLANE_DISTORT(NAME) \
+{\
+    NAME = (psPlaneDistort *) psAlloc(sizeof(psPlaneDistort)); \
+    psMemSetDeallocator(NAME, (psFreeFcn) psPlaneDistortFree); \
+    NAME->x = psDPolynomial4DAlloc(2, 2, 2, 2, PS_POLYNOMIAL_ORD); \
+    NAME->y = psDPolynomial4DAlloc(2, 2, 2, 2, PS_POLYNOMIAL_ORD); \
+    NAME->x->coeff[1][0][0][0] = 1.0; \
+    NAME->y->coeff[0][1][0][0] = 1.0; \
+}
+
+/*
+    This routine will create a system of FPAs/Chips/Cells/Readouts.  For
+    simplicity, an FPA is defined as a linear array of chips, and a chip is
+    defined as a linear array of cells, both in the x direction.  The transforms
+    between the various layers take into account the cell/chip and the boundaries
+    between each.
+*/
+psFPA *genSystem()
+{
+    psS32 i;
+    psS32 j;
+    psS32 k;
+    psImage *tmpImage;
+    //    psTime* now = psTimeGetNow(PS_TIME_UTC);
+    //    psObservatory* obs = psObservatoryAlloc(NAME, LATITUDE, LONGITUDE, HEIGHT, LAPSERATE);
+    //    psExposure* exp = psExposureAlloc(RA, DEC, HA, ZD, AZ,
+    //                                      now, ROT_ANGLE, TEMPERATURE, PRESSURE, HUMIDITY,
+    //                                      EXP_TIME, WAVELENGTH, obs);
+    //    psGrommit *grom = psGrommitAlloc(exp);
+    psFPA *myFPA = psFPAAlloc(NUM_CHIPS, NULL);
+    psChip **chips;
+    psCell **cells;
+    psReadout **readouts;
+
+    // We create the transforms between the FPA and tangent plane.  The
+    // transform is a simple identity transform.
+    PS_CREATE_4D_IDENTITY_PLANE_DISTORT(myFPA->fromTangentPlane);
+    PS_CREATE_4D_IDENTITY_PLANE_DISTORT(myFPA->toTangentPlane);
+
+    chips = (psChip **) myFPA->chips->data;
+    myFPA->chips->n = NUM_CHIPS;
+
+    for (i=0;i<NUM_CHIPS;i++) {
+        chips[i] = psChipAlloc(NUM_CELLS, myFPA);
+        // We create the transforms between the chip and FPA.  The
+        // transform is a simple identity transform.
+        PS_CREATE_2D_IDENTITY_PLANE_TRANSFORM(chips[i]->toFPA);
+        chips[i]->toFPA->x->coeff[0][0] = (double) (i * (CHIP_WIDTH + CHIP_GAP));
+        chips[i]->toFPA->x->coeff[1][1] = 0.0;
+        PS_CREATE_2D_IDENTITY_PLANE_TRANSFORM(chips[i]->fromFPA);
+        chips[i]->fromFPA->x->coeff[0][0] = (double) (-i * (CHIP_WIDTH + CHIP_GAP));
+        chips[i]->fromFPA->x->coeff[1][1] = 0.0;
+
+        cells = (psCell **) chips[i]->cells->data;
+        chips[i]->cells->n = NUM_CELLS;
+
+        for (j=0;j<NUM_CELLS;j++) {
+            cells[j] = psCellAlloc(NUM_READOUTS, chips[i]);
+            // We create the transforms between the cell and the chip.  The
+            // transform is a simple identity transform.
+            PS_CREATE_2D_IDENTITY_PLANE_TRANSFORM(cells[j]->toChip);
+            cells[j]->toChip->x->coeff[0][0] = (double) (j * (CELL_WIDTH + CELL_GAP));
+            cells[j]->toChip->x->coeff[1][1] = 0.0;
+            PS_CREATE_2D_IDENTITY_PLANE_TRANSFORM(cells[j]->fromChip);
+            cells[j]->fromChip->x->coeff[0][0] = (double) (-j * (CELL_WIDTH + CELL_GAP));
+            cells[j]->fromChip->x->coeff[1][1] = 0.0;
+            PS_CREATE_2D_IDENTITY_PLANE_TRANSFORM(cells[j]->toFPA);
+            cells[j]->toFPA->x->coeff[0][0] = (double) ((i * (CHIP_WIDTH + CHIP_GAP)) +
+                                              (j * (CELL_WIDTH + CELL_GAP)));
+            cells[j]->toFPA->x->coeff[1][1] = 0.0;
+            PS_CREATE_2D_IDENTITY_PLANE_TRANSFORM(cells[j]->toTP);
+            cells[j]->toTP->x->coeff[0][0] = cells[j]->toFPA->x->coeff[0][0];
+            cells[j]->toTP->x->coeff[1][1] = 0.0;
+
+            readouts = (psReadout **) cells[j]->readouts->data;
+            cells[j]->readouts->n = NUM_READOUTS;
+
+            for (k=0;k<NUM_READOUTS;k++) {
+                tmpImage = psImageAlloc(READOUT_NUM_COLS, READOUT_NUM_ROWS, PS_TYPE_F32);
+                for (psS32 row=0;row<READOUT_NUM_ROWS;row++) {
+                    for(psS32 col=0;col<READOUT_NUM_COLS;col++) {
+                        tmpImage->data.F32[row][col] = (float) ((i * (CHIP_WIDTH + CHIP_GAP)) +
+                                                                (j * (CELL_WIDTH + CELL_GAP)));
+                    }
+                }
+                readouts[k] = psReadoutAlloc();
+                readouts[k]->image = tmpImage;
+                *(psS32*)&readouts[k]->col0 = (j * (CELL_WIDTH + CELL_GAP));
+                *(psS32*)&readouts[k]->row0 = 0;
+
+
+            }
+        }
+    }
+
+    return(myFPA);
+}
+
+psS32 main( psS32 argc, char* argv[] )
+{
+    psLogSetLevel( PS_LOG_INFO );
+
+    return ( ! runTestSuite( stderr, "psAstrometry", tests, argc, argv ) );
+}
+
+#define X_NUM_ROWS 4
+#define X_NUM_COLS 5
+#define Y_NUM_ROWS 6
+#define Y_NUM_COLS 7
+#define X_SCALE  1.0
+#define Y_SCALE  2.0
+#define X0  50.0
+#define Y0  60.0
+
+psS32 test1( void )
+{
+    psS32 i;
+    psS32 j;
+    psFixedPattern *tmp = NULL;
+    float x0 = X0;
+    float y0 = Y0;
+    float xScale = X_SCALE;
+    float yScale = Y_SCALE;
+    psImage *x = psImageAlloc(X_NUM_COLS, X_NUM_ROWS, PS_TYPE_F64);
+    psImage *y = psImageAlloc(Y_NUM_COLS, Y_NUM_ROWS, PS_TYPE_F64);
+    psS32 testStatus = 0;
+    psS32 numPixels = 0;
+
+    for (i=0;i<X_NUM_ROWS;i++) {
+        for (j=0;j<X_NUM_COLS;j++) {
+            x->data.F64[i][j] = (double) (i + j);
+        }
+    }
+    for (i=0;i<Y_NUM_ROWS;i++) {
+        for (j=0;j<Y_NUM_COLS;j++) {
+            y->data.F64[i][j] = (double) (i - j);
+        }
+    }
+
+    tmp = psFixedPatternAlloc(x0, y0, xScale, yScale, x, y);
+
+    // Test the x pattern
+    for (i=0;i<X_NUM_ROWS;i++) {
+        for (j=0;j<X_NUM_COLS;j++) {
+            if ((tmp->x)[i][j] != x->data.F64[i][j]) {
+                printf("ERROR: (tmp->x)[%d][%d] is %.2f, should be %.2f\n", i, j,
+                       (tmp->x)[i][j], x->data.F64[i][j]);
+                testStatus = 1;
+                numPixels++;
+            }
+        }
+    }
+    if (numPixels != 0) {
+        printf("ERROR: x: %d incorrect pixels\n", numPixels);
+    }
+
+    // Test the y pattern
+    numPixels = 0;
+    for (i=0;i<Y_NUM_ROWS;i++) {
+        for (j=0;j<Y_NUM_COLS;j++) {
+            if ((tmp->y)[i][j] != y->data.F64[i][j]) {
+                printf("ERROR: (tmp->y)[%d][%d] is %.2f, should be %.2f\n", i, j,
+                       (tmp->y)[i][j], y->data.F64[i][j]);
+
+                testStatus = 1;
+                numPixels++;
+            }
+        }
+    }
+    if (numPixels != 0) {
+        printf("ERROR: y: %d incorrect pixels\n", numPixels);
+    }
+
+    // Test the x variables
+    if (tmp->nX != (X_NUM_ROWS * X_NUM_COLS)) {
+        printf("ERROR: tmp->nX is %d, should be %d\n", tmp->nX, (X_NUM_ROWS * X_NUM_COLS));
+        testStatus = 1;
+    }
+    if (tmp->x0 != X0) {
+        printf("ERROR: tmp->x0 is %.2f, should be %.2f\n", tmp->x0, X0);
+        testStatus = 1;
+    }
+    if (tmp->xScale != X_SCALE) {
+        printf("ERROR: tmp->xScale is %.2f, should be %.2f\n", tmp->xScale, X_SCALE);
+        testStatus = 1;
+    }
+
+    // Test the y variables
+    if (tmp->nY != (Y_NUM_ROWS * Y_NUM_COLS)) {
+        printf("ERROR: tmp->nY is %d, should be %d\n", tmp->nY, (Y_NUM_ROWS * Y_NUM_COLS));
+        testStatus = 1;
+    }
+    if (tmp->y0 != Y0) {
+        printf("ERROR: tmp->y0 is %.2f, should be %.2f\n", tmp->y0, Y0);
+        testStatus = 1;
+    }
+    if (tmp->yScale != Y_SCALE) {
+        printf("ERROR: tmp->yScale is %.2f, should be %.2f\n", tmp->yScale, Y_SCALE);
+        testStatus = 1;
+    }
+
+    psFree(tmp);
+    psFree(x);
+    psFree(y);
+
+    return 0;
+}
+
+psS32 test2()
+{
+    psS32 testStatus = 0;
+
+    psTime* now = psTimeGetNow(PS_TIME_TAI);
+
+    psObservatory* obs = psObservatoryAlloc(NAME, LATITUDE, LONGITUDE, HEIGHT, LAPSERATE);
+
+    psExposure* exp = psExposureAlloc(RA, DEC, HA, ZD, AZ,
+                                      now, ROT_ANGLE, TEMPERATURE, PRESSURE, HUMIDITY,
+                                      EXP_TIME, WAVELENGTH, obs);
+
+    psGrommit *grom = psGrommitAlloc(exp);
+
+    if (grom->height != HEIGHT) {
+        printf("ERROR: grom->height is %.2f, should be %.2f\n", grom->height, HEIGHT);
+        testStatus = 1;
+    }
+    if (grom->temperature != TEMPERATURE) {
+        printf("ERROR: grom->temperature is %.2f, should be %.2f\n", grom->temperature, TEMPERATURE);
+        testStatus = 2;
+    }
+
+    if (grom->pressure != PRESSURE) {
+        printf("ERROR: grom->pressure is %.2f, should be %.2f\n", grom->pressure, PRESSURE);
+        testStatus = 3;
+    }
+
+    if (grom->humidity != HUMIDITY) {
+        printf("ERROR: grom->humidity is %.2f, should be %.2f\n", grom->humidity, HUMIDITY);
+        testStatus = 4;
+    }
+
+    if (grom->wavelength != WAVELENGTH) {
+        printf("ERROR: grom->wavelength is %.2f, should be %.2f\n", grom->wavelength, WAVELENGTH);
+        testStatus = 5;
+    }
+
+    if (grom->lapseRate != LAPSERATE) {
+        printf("ERROR: grom->lapseRate is %.2f, should be %.2f\n", grom->lapseRate, LAPSERATE);
+        testStatus = 6;
+    }
+
+    /*
+        XXX: Don't know how to verify: latitude, sinLat, cosLat, abberationMag,
+             refractA, refractB, longitudeOffset, siderealTime
+
+       if (grom-> != ) {
+            printf("ERROR: grom-> is %.2f, should be %.2f\n", grom->, );
+            testStatus = 1;
+       }
+    */
+
+    printf("grom->latitude is %.2f\n", grom->latitude);
+    printf("grom->sinLat is %.2f\n", grom->sinLat);
+    printf("grom->cosLat is %.2f\n", grom->cosLat);
+    printf("grom->abberationMag is %.2f\n", grom->abberationMag);
+    printf("grom->height is %.2f\n", grom->height);
+    printf("grom->temperature is %.2f\n", grom->temperature);
+    printf("grom->pressure is %.2f\n", grom->pressure);
+    printf("grom->humidity is %.2f\n", grom->humidity);
+    printf("grom->wavelength is %.2f\n", grom->wavelength);
+    printf("grom->lapseRate is %.2f\n", grom->lapseRate);
+    printf("grom->refractA is %.2f\n", grom->refractA);
+    printf("grom->refractB is %.2f\n", grom->refractB);
+    printf("grom->longitudeOffset is %.2f\n", grom->longitudeOffset);
+    // printf("grom->siderealTime is %.2f\n", grom->siderealTime);
+
+    psFree(now);
+    psFree(obs);
+    psFree(exp);
+    psFree(grom);
+    psLibFinalize();
+
+    return(testStatus);
+}
+
+psS32 printCell(psCell *cell)
+{
+    psReadout **readouts = (psReadout **) cell->readouts->data;
+    psReadout *readout = readouts[0];
+
+    printf("-------------------------------\n");
+    for (psS32 i = 0; i < readout->image->numRows ; i++) {
+        for (psS32 j = 0; j < readout->image->numCols ; j++) {
+            printf("(%.1f) ", readout->image->data.F32[i][j]);
+        }
+        printf("\n");
+    }
+    return(0);
+}
+
+
+/******************************************************************************
+This routine tests many Astrometry functions:
+    psChipInFPA()
+    psCellInFPA()
+    psCoordFPAToChip()
+    psCoordChipToCell()
+This routine loops through all valid cell coordinates and maintains a running
+set of (x,y) coordinates in the FPA plane.  It calls the first two functions
+with each FPA coordinate and determines the chip/cell that that coordinate
+corresponds to.  It then calls the last two functions to determine the actual
+chip and cell coordinates.  The cell coordinate is verified for correctness.
+ 
+It then calls
+    psCoordCellToChip()
+to determine if the chip coordinates that were generated agree with the chip
+coords returned above.
+ 
+Then, it calls
+    psCellInChip()
+and flags an ERROR if the cell it returns is different from that of
+psCellInFPA().
+ 
+Then, it calls
+    psCoordChipToFPA
+to determine if the FPA coordinates are correct.
+ 
+ 
+ *****************************************************************************/
+psS32 test3( void )
+{
+    psS32 x;
+    psS32 y;
+    psPlane fpaCoord;
+    psFPA *myFPA = genSystem();
+    psCell *myCell = NULL;
+    psPlane chipCoord;
+    psPlane cellCoord;
+    psPlane testCoord;
+
+    psS32 xReadout = 0;
+    psS32 xFPA = 0;
+    for (psS32 chip=0;chip<NUM_CHIPS;chip++) {
+        for (psS32 cell=0;cell<NUM_CELLS;cell++) {
+            for(x=0;x<CELL_WIDTH;x++) {
+                for (y=0;y<CELL_HEIGHT;y++) {
+                    fpaCoord.x = (double) xFPA;
+                    fpaCoord.y = (double) y;
+                    //printf("------------------ (%.2f, %.2f) ------------------\n", fpaCoord.x, fpaCoord.y);
+                    psChip* tmpChip = psChipInFPA(&fpaCoord, myFPA);
+                    myCell = psCellInFPA(&fpaCoord, myFPA);
+
+                    if ((myCell == NULL) || (tmpChip == NULL)) {
+                        if (myCell == NULL) {
+                            printf("ERROR: myCell is NULL\n");
+                        }
+                        if (tmpChip == NULL) {
+                            printf("ERROR: tmpChip is NULL\n");
+                        }
+                    } else {
+                        psCoordFPAToChip(&chipCoord, &fpaCoord, tmpChip);
+                        psCoordChipToCell(&cellCoord, &chipCoord, myCell);
+
+                        if (x != (psS32) cellCoord.x) {
+                            printf("ERROR: x coord was %.2f, should be %d\n", cellCoord.x, x);
+                        }
+                        if (y != (psS32) cellCoord.y) {
+                            printf("ERROR: y coord was %.2f, should be %d\n", cellCoord.y, y);
+                        }
+
+                        psCoordCellToChip(&testCoord, &cellCoord, myCell);
+                        if (testCoord.x != chipCoord.x) {
+                            printf("ERROR: psCoordCellToChip() x coord was %.2f, should be %d\n", cellCoord.x, x);
+                        }
+                        if (testCoord.y != chipCoord.y) {
+                            printf("ERROR: psCoordCellToChip() y coord was %.2f, should be %d\n", cellCoord.y, y);
+                        }
+
+                        psCell *myCell2 = psCellInChip(&chipCoord, tmpChip);
+                        if (myCell2 != myCell) {
+                            printf("ERROR: psCellInFPA() != psCellInChip(psChipInFPA()) (%p %p)\n", myCell2, myCell);
+                            printCell(myCell2);
+                            printCell(myCell);
+
+                        }
+
+                        psCoordChipToFPA(&testCoord, &chipCoord, tmpChip);
+                        if (testCoord.x != xFPA) {
+                            printf("ERROR: psCoordChipToFPA() x coord was %.2f, should be %d\n", cellCoord.x, x);
+                        }
+                        if (testCoord.y != y) {
+                            printf("ERROR: psCoordChipToFPA() y coord was %.2f, should be %d\n", cellCoord.y, y);
+                        }
+
+                        psCoordFPAToTP(&testCoord, &fpaCoord, 0.0, 0.0, myFPA);
+                        if (testCoord.x != fpaCoord.x) {
+                            printf("ERROR: psCoordFPAToTP() x coord was %.2f, should be %d\n", cellCoord.x, x);
+                        }
+                        if (testCoord.y != fpaCoord.y) {
+                            printf("ERROR: psCoordFPAToTP() y coord was %.2f, should be %d\n", cellCoord.y, y);
+                        }
+
+                        psCoordCellToFPA(&testCoord, &cellCoord, myCell);
+                        if (testCoord.x != fpaCoord.x) {
+                            printf("ERROR: psCoordFPAToTP() x coord was %.2f, should be %d\n", cellCoord.x, x);
+                        }
+                        if (testCoord.y != fpaCoord.y) {
+                            printf("ERROR: psCoordFPAToTP() y coord was %.2f, should be %d\n", cellCoord.y, y);
+                        }
+
+                        psCoordTPToFPA(&testCoord, &fpaCoord, 0.0, 0.0, myFPA);
+                        if (testCoord.x != fpaCoord.x) {
+                            printf("ERROR: psCoordFPAToTP() x coord was %.2f, should be %d\n", cellCoord.x, x);
+                        }
+                        if (testCoord.y != fpaCoord.y) {
+                            printf("ERROR: psCoordFPAToTP() y coord was %.2f, should be %d\n", cellCoord.y, y);
+                        }
+                    }
+                }
+                xFPA++;
+                xReadout++;
+            }
+            // We skip the gaps between cells.
+            for(x=0;x<CELL_GAP;x++) {
+                xFPA++;
+                xReadout=0;
+            }
+        }
+        // We skip the gaps between chips.
+        for (x=0;x<CHIP_GAP;x++) {
+            xFPA++;
+            xReadout=0;
+        }
+    }
+    psFree(myFPA);
+
+    return(0);
+}
+
+int printTrans(psPlaneTransform *trans)
+{
+    printf("-------------------- trans->x coeffs --------------------\n");
+    for (psS32 i = 0 ; i < trans->x->nX ; i++) {
+        for (psS32 j = 0 ; j < trans->x->nY ; j++) {
+            printf("(%.1f) ", trans->x->coeff[i][j]);
+        }
+        printf("\n");
+    }
+    printf("-------------------- trans->y coeffs --------------------\n");
+    for (psS32 i = 0 ; i < trans->y->nX ; i++) {
+        for (psS32 j = 0 ; j < trans->y->nY ; j++) {
+            printf("(%.1f) ", trans->y->coeff[i][j]);
+        }
+        printf("\n");
+    }
+    return(0);
+}
+
+
+/******************************************************************************
+TEST04: The strategy behind test04() is to generate a pair of transforms t1
+and t2 with a wide variety of sizes for the x/y components of the x/y
+transforms, then set the coefficients of t1/t2 to arbitray values, then
+generate a new transform t3 via psPlaneTransformCombine() function.  Then, for
+several arbitrary input plane coordinates, we tarnsform them via the new
+transform t3, as well as individually via t1 then t2, and verify that they
+produce identical output coordinates.
+ *****************************************************************************/
+// These macros determine the number of x/y test points which will be x-formed.
+#define TST04_X_MIN 0.0
+#define TST04_X_MAX 10.0
+#define TST04_Y_MIN 0.0
+#define TST04_Y_MAX 10.0
+#define TST04_NUM 5.0
+// These macros define the max sizes of the various input transforms.
+#define TST04_T1_X_X 6
+#define TST04_T1_X_Y 3
+#define TST04_T1_Y_X 3
+#define TST04_T1_Y_Y 3
+#define TST04_T2_X_X 3
+#define TST04_T2_X_Y 3
+#define TST04_T2_Y_X 3
+#define TST04_T2_Y_Y 3
+/******************************************************************************
+tstTransforms(t1, t2, t3): this function generates a set of arbitrary x/y
+coordinates, then transforms them into output coordinates via the t3
+transform, as well as the t1 followed by the t2 transform.  It verifies the
+output coordinates are identical and returns TRUE if so.  Otherwise, it prints
+an error message and returns FALSE.
+ *****************************************************************************/
+bool tstTransforms(psPlaneTransform *t1, psPlaneTransform *t2, psPlaneTransform *t3)
+{
+    bool testStatus = true;
+    psPlane *in = psPlaneAlloc();
+    in->xErr = 0.0;
+    in->yErr = 0.0;
+
+    for (in->x = TST04_X_MIN ;
+            in->x <= TST04_X_MAX ;
+            in->x+= (TST04_X_MAX-TST04_X_MIN) / TST04_NUM) {
+        for (in->y = TST04_Y_MIN ; in->y <= TST04_Y_MAX ; in->y+= (TST04_Y_MAX-TST04_Y_MIN) / TST04_NUM) {
+            // Apply the t1/t2 transforms individually to the in coords.
+            psPlane *mid = psPlaneTransformApply(NULL, t1, in);
+            if (mid == NULL) {
+                printf("TEST ERROR: intermediate psPlane coords are NULL.\n");
+                psFree(in);
+                return(false);
+            }
+
+            psPlane *outT1T2 = psPlaneTransformApply(NULL, t2, mid);
+            if (outT1T2 == NULL) {
+                printf("TEST ERROR: intermediate psPlane coords are NULL.\n");
+                psFree(mid);
+                return(false);
+            }
+
+            // Apply the t3 transforms individually to the in coords.
+            psPlane *outT3 = psPlaneTransformApply(NULL, t3, in);
+            if (outT3 == NULL) {
+                printf("TEST ERROR: intermediate psPlane coords are NULL.\n");
+                psFree(mid);
+                psFree(outT1T2);
+                return(false);
+            }
+
+            // Verify that the results are identical.
+            if (fabs(outT3->x - outT1T2->x) > FLT_EPSILON) {
+                printf("TEST ERROR: x is %f, should be %f\n", outT3->x, outT1T2->x);
+                testStatus = false;
+            }
+            if (fabs(outT3->y - outT1T2->y) > FLT_EPSILON) {
+                printf("TEST ERROR: y is %f, should be %f\n", outT3->y, outT1T2->y);
+                testStatus = false;
+            }
+            psFree(mid);
+            psFree(outT1T2);
+            psFree(outT3);
+        }
+    }
+
+    psFree(in);
+    return(testStatus);
+}
+
+/******************************************************************************
+setCoeffs(t1, t2): this function sets the coefficients of the t1 and t2
+transforms to somewhat arbitrary values.
+ *****************************************************************************/
+int setCoeffs(psPlaneTransform *t1, psPlaneTransform *t2)
+{
+    for (psS32 t1xx = 0 ; t1xx < t1->x->nX ; t1xx++) {
+        for (psS32 t1xy = 0 ; t1xy < t1->x->nY ; t1xy++) {
+            t1->x->coeff[t1xx][t1xy] = (psF32) (t1xx + t1xy);
+        }
+    }
+
+    for (psS32 t1yx = 0 ; t1yx < t1->y->nX ; t1yx++) {
+        for (psS32 t1yy = 0 ; t1yy < t1->y->nY ; t1yy++) {
+            t1->y->coeff[t1yx][t1yy] = (psF32) (t1yx + t1yy - 10);
+        }
+    }
+    for (psS32 t2xx = 0 ; t2xx < t2->x->nX ; t2xx++) {
+        for (psS32 t2xy = 0 ; t2xy < t2->x->nY ; t2xy++) {
+            t2->x->coeff[t2xx][t2xy] = (psF32) (2 + (t2xx * t2xy));
+        }
+    }
+    for (psS32 t2yx = 0 ; t2yx < t2->y->nX ; t2yx++) {
+        for (psS32 t2yy = 0 ; t2yy < t2->y->nY ; t2yy++) {
+            t2->y->coeff[t2yx][t2yy] = (psF32) (3 - t2yx + t2yy);
+        }
+    }
+
+    return(0);
+}
+
+/******************************************************************************
+test04(): We test psPlaneTransformCombine() with a variety of input
+transforms, as well as input coordinates, as well as erroneous input
+parameters.
+ *****************************************************************************/
+psS32 test4( void )
+{
+    bool testStatus = true;
+
+
+    //
+    // Create a variety of input input transforms, then test them.
+    //
+    for (psS32 t1xx = 1 ; t1xx < TST04_T1_X_X ; t1xx++) {
+        for (psS32 t1xy = 1 ; t1xy < TST04_T1_X_Y ; t1xy++) {
+            for (psS32 t1yx = 1 ; t1yx < TST04_T1_Y_X ; t1yx++) {
+                for (psS32 t1yy = 1 ; t1yy < TST04_T1_Y_Y ; t1yy++) {
+                    for (psS32 t2xx = 1 ; t2xx < TST04_T2_X_X ; t2xx++) {
+                        for (psS32 t2xy = 1 ; t2xy < TST04_T2_X_Y ; t2xy++) {
+                            for (psS32 t2yx = 1 ; t2yx < TST04_T2_Y_X ; t2yx++) {
+                                for (psS32 t2yy = 1 ; t2yy < TST04_T2_Y_Y ; t2yy++) {
+                                    psPlaneTransform *trans1 = psPlaneTransformAlloc(PS_MAX(t1xx, t1yx), PS_MAX(t1xy, t1yy));
+                                    psPlaneTransform *trans2 = psPlaneTransformAlloc(PS_MAX(t2xx, t2yx), PS_MAX(t2xy, t2yy));
+                                    psPlaneTransform *trans3 = NULL;
+                                    setCoeffs(trans1, trans2);
+                                    trans3 = psPlaneTransformCombine(NULL, trans1, trans2);
+
+                                    if (trans3 == NULL) {
+                                        printf("TEST ERROR: psPlaneTransformCombine() returned NULL/\n");
+                                        testStatus = false;
+                                    } else {
+                                        testStatus = tstTransforms(trans1, trans2, trans3);
+                                    }
+                                    psFree(trans1);
+                                    psFree(trans2);
+                                    psFree(trans3);
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+
+    //
+    // Test erroneous input parameter combinations
+    //
+    psPlaneTransform *trans1 = psPlaneTransformAlloc(2, 2);
+    psPlaneTransform *trans2 = psPlaneTransformAlloc(2, 2);
+    psPlaneTransform *trans3 = NULL;
+
+    printf("----------------------------------------------------------------------------------\n");
+    printf("Calling psPlaneTransformCombine with NULL trans1.  Should generate error and return NULL.\n");
+    trans3 = psPlaneTransformCombine(NULL, NULL, trans2);
+    if (trans3 != NULL) {
+        printf("TEST ERROR: psPlaneTransformCombine() returned a non-NULL psPlaneTransform.\n");
+        testStatus = false;
+        psFree(trans3);
+    }
+
+    printf("----------------------------------------------------------------------------------\n");
+    printf("Calling psPlaneTransformCombine with NULL trans2.  Should generate error and return NULL.\n");
+    trans3 = psPlaneTransformCombine(NULL, trans1, NULL);
+    if (trans3 != NULL) {
+        printf("TEST ERROR: psPlaneTransformCombine() returned a non-NULL psPlaneTransform.\n");
+        testStatus = false;
+        psFree(trans3);
+    }
+
+    psFree(trans1);
+    psFree(trans2);
+    return(!testStatus);
+}
+
+
+#define TST05_X_MIN 0.0
+#define TST05_X_MAX 10.0
+#define TST05_Y_MIN 0.0
+#define TST05_Y_MAX 10.0
+#define TST05_NUM_X 10.0
+#define TST05_NUM_Y 10.0
+#define TST05_X_POLY_ORDER 2
+#define TST05_Y_POLY_ORDER 2
+#define TST05_NUM_DATA (TST05_NUM_X * TST05_NUM_Y)
+/******************************************************************************
+XXX: This is only a rudimentary test of the psPlaneTransformFit() function.
+It tests a few NULL input parameter conditions, and some simple linear
+transformations.
+ *****************************************************************************/
+psS32 test5( void )
+{
+    bool testStatus = true;
+    psPlaneTransform *trans = psPlaneTransformAlloc(TST05_X_POLY_ORDER, TST05_Y_POLY_ORDER);
+    psPlaneTransform *transInit = psPlaneTransformAlloc(TST05_X_POLY_ORDER, TST05_Y_POLY_ORDER);
+    psArray *src = psArrayAlloc((int) TST05_NUM_DATA);
+    psArray *dst = psArrayAlloc((int) TST05_NUM_DATA);
+    bool rc;
+
+    //
+    // We set an arbitrary non-linear transformation.
+    //
+    for (psS32 x = 0 ; x < TST05_X_POLY_ORDER ; x++) {
+        for (psS32 y = 0 ; y < TST05_Y_POLY_ORDER ; y++) {
+            transInit->x->coeff[x][y] = ((psF32) (random() % 1000000)) / 100000.0;
+            transInit->y->coeff[x][y] = ((psF32) (random() % 1000000)) / 100000.0;
+        }
+    }
+
+    // okay, for now, it's linear.
+    transInit->x->coeff[1][1] = 0.0;
+    transInit->y->coeff[1][1] = 0.0;
+
+    /*
+        //
+        // We set an arbitrary linear transformation.
+        // 
+        transInit->x->coeff[0][0] = 1.0;
+        transInit->x->coeff[0][1] = 3.0;
+        transInit->x->coeff[1][0] = 2.0;
+        transInit->x->coeff[1][1] = 7.0;
+        transInit->y->coeff[0][0] = 4.0;
+        transInit->y->coeff[0][1] = 6.0;
+        transInit->y->coeff[1][0] = 5.0;
+        transInit->y->coeff[1][1] = 3.0;
+    */
+    //
+    // We generate a grid of input data points in the x1,y1 plane, calculate the
+    // corresponding values in the transformed plane, and set these to
+    // the src and dst psVectors.
+    //
+    psS32 i = 0;
+    for (psF32 x = TST05_X_MIN ; x < TST05_X_MAX ; x+= (TST05_X_MAX-TST05_X_MIN)/TST05_NUM_X) {
+        for (psF32 y = TST05_Y_MIN ; y < TST05_Y_MAX ; y+= (TST05_Y_MAX-TST05_Y_MIN)/TST05_NUM_Y) {
+            src->data[i] = (psPtr *) psPlaneAlloc();
+            ((psPlane *) src->data[i])->x = x;
+            ((psPlane *) src->data[i])->y = y;
+
+            dst->data[i] = psPlaneTransformApply(NULL, transInit, ((psPlane *) src->data[i]));
+            i++;
+        }
+    }
+
+    printf("----------------------------------------------------------------------------------\n");
+    printf("Calling psPlaneTransformFit with NULL trans.  Should generate error and return NULL.\n");
+    rc = psPlaneTransformFit(NULL, src, dst, 100, 100.0);
+    if (rc == true) {
+        printf("TEST ERROR: psPlaneTransformFit() returned TRUE.\n");
+        testStatus = false;
+    }
+
+    printf("----------------------------------------------------------------------------------\n");
+    printf("Calling psPlaneTransformFit with NULL src psArray.  Should generate error and return NULL.\n");
+    rc = psPlaneTransformFit(trans, NULL, dst, 100, 100.0);
+    if (rc == true) {
+        printf("TEST ERROR: psPlaneTransformFit() returned TRUE.\n");
+        testStatus = false;
+    }
+
+    printf("----------------------------------------------------------------------------------\n");
+    printf("Calling psPlaneTransformFit with NULL dst psArray.  Should generate error and return NULL.\n");
+    rc = psPlaneTransformFit(trans, src, NULL, 100, 100.0);
+    if (rc == true) {
+        printf("TEST ERROR: psPlaneTransformFit() returned TRUE.\n");
+        testStatus = false;
+    }
+
+    printf("----------------------------------------------------------------------------------\n");
+    printf("Calling psPlaneTransformFit with acceptable data.\n");
+    rc = psPlaneTransformFit(trans, src, dst, 100, 100.0);
+    if (rc != true) {
+        printf("TEST ERROR: psPlaneTransformFit() returned FALSE.\n");
+        testStatus = false;
+    }
+
+    printf("The initial transformation was:\n");
+    printTrans(transInit);
+    printf("The derived transformation is:\n");
+    printTrans(trans);
+
+    //
+    // For the initial grid of input points, we transform them to output points with
+    // the derived transformation, and verify that they are within 10%.
+    //
+
+    for (psS32 i = 0 ; i < src->n ; i++) {
+        psPlane *inData = (psPlane *) src->data[i];
+        psPlane *outData = (psPlane *) dst->data[i];
+        psPlane *outDataDeriv = psPlaneTransformApply(NULL, trans, inData);
+
+        if (!PS_PERCENT_COMPARE(outDataDeriv->x, outData->x, 0.10) ||
+                !PS_PERCENT_COMPARE(outDataDeriv->y, outData->y, 0.10)) {
+            printf("TEST ERROR: the derived output coords were (%f, %f) should have been (%f, %f).\n",
+                   outDataDeriv->x, outDataDeriv->y, outData->x, outData->y);
+            testStatus = false;
+        }
+        psFree(outDataDeriv);
+    }
+
+    psFree(transInit);
+    psFree(trans);
+    psFree(src);
+    psFree(dst);
+
+    return(!testStatus);
+}
+
+/******************************************************************************
+XXX: This is only a rudimentary test of the psPlaneTransformInvert()
+function.  It tests a few NULL input parameter conditions.
+ 
+XXX: We call it with acceptable data, but we do not verify the output.
+ *****************************************************************************/
+psS32 test6( void )
+{
+    bool testStatus = true;
+    psPlaneTransform *trans = psPlaneTransformAlloc(2, 2);
+    psPlaneTransform *transOut = NULL;
+    psRegion *myRegion = psRegionAlloc(1.0, 5.0, 1.0, 5.0);
+
+    //
+    // Set non-linear transformation
+    //
+    trans->x->coeff[0][0] = 1.0;
+    trans->x->coeff[0][1] = 3.0;
+    trans->x->coeff[1][0] = 2.0;
+    trans->x->coeff[1][1] = 1.0;
+    trans->y->coeff[0][0] = 4.0;
+    trans->y->coeff[0][1] = 6.0;
+    trans->y->coeff[1][0] = 5.0;
+    trans->y->coeff[1][1] = 1.0;
+
+    printf("----------------------------------------------------------------------------------\n");
+    printf("Calling psPlaneTransformInvert with NULL trans.  Should generate error and return NULL.\n");
+    transOut = psPlaneTransformInvert(NULL, NULL, myRegion, 10);
+    if (transOut != NULL) {
+        printf("TEST ERROR: psPlaneTransformInvert() returned a non-NULL psPlaneTransform.\n");
+        testStatus = false;
+        psFree(transOut);
+    }
+
+    printf("----------------------------------------------------------------------------------\n");
+    printf("Calling psPlaneTransformInvert with NULL psRegion.  Should generate error and return NULL.\n");
+    transOut = psPlaneTransformInvert(NULL, trans, NULL, 10);
+    if (transOut != NULL) {
+        printf("TEST ERROR: psPlaneTransformInvert() returned a non-NULL psPlaneTransform.\n");
+        testStatus = false;
+        psFree(transOut);
+    }
+    printf("----------------------------------------------------------------------------------\n");
+    printf("Calling psPlaneTransformInvert with zero nSamples.  Should generate error and return NULL.\n");
+    transOut = psPlaneTransformInvert(NULL, trans, myRegion, 0);
+    if (transOut != NULL) {
+        printf("TEST ERROR: psPlaneTransformInvert() returned a non-NULL psPlaneTransform.\n");
+        testStatus = false;
+        psFree(transOut);
+    }
+
+    printf("Calling psPlaneTransformInvert with an acceptable linear transformation.\n");
+    for (psS32 n = 0 ; n < 100 ; n++) {
+        //
+        // We create a random linear transformation and hope it is invertible.
+        //
+        trans->x->coeff[0][0] = ((psF32) (random() % 1000000)) / 100000.0;
+        trans->x->coeff[0][1] = ((psF32) (random() % 1000000)) / 100000.0;
+        trans->x->coeff[1][0] = ((psF32) (random() % 1000000)) / 100000.0;
+        trans->x->coeff[1][1] = 0.0;
+        trans->y->coeff[0][0] = ((psF32) (random() % 1000000)) / 100000.0;
+        trans->y->coeff[0][1] = ((psF32) (random() % 1000000)) / 100000.0;
+        trans->y->coeff[1][0] = ((psF32) (random() % 1000000)) / 100000.0;
+        trans->y->coeff[1][1] = 0.0;
+
+        transOut = psPlaneTransformInvert(NULL, trans, myRegion, 10);
+        if (transOut == NULL) {
+            printf("TEST ERROR: psPlaneTransformInvert() returned a NULL psPlaneTransform.\n");
+            testStatus = false;
+        }
+        psPlane *in = psPlaneAlloc();
+        in->x = 2.0;
+        in->y = 3.0;
+
+        psPlane *mid = psPlaneTransformApply(NULL, trans, in);
+        psPlane *out = psPlaneTransformApply(NULL, transOut, mid);
+
+        if (((fabs(in->x - out->x) > FLT_EPSILON)) ||
+                ((fabs(in->y - out->y) > FLT_EPSILON))) {
+            printf("TEST ERROR: in coords were (%f, %f), out coords were (%f, %f).\n",
+                   in->x, in->y, out->x, out->y);
+            testStatus = false;
+        }
+
+        psFree(in);
+        psFree(mid);
+        psFree(out);
+        psFree(transOut);
+    }
+
+    psFree(trans);
+    psFree(myRegion);
+
+    return(!testStatus);
+}
+//This code will
Index: /tags/ipp-1-X/bug123/psLib/test/astronomy/tst_psCoord.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/astronomy/tst_psCoord.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/astronomy/tst_psCoord.c	(revision 22331)
@@ -0,0 +1,1354 @@
+/** @file  tst_psCoord.c
+*
+*  @brief The code will ...
+*
+*
+*  @author GLG, MHPCC
+*
+*  @version $Revision: 1.28 $ $Name: not supported by cvs2svn $
+*  @date $Date: 2005-04-07 20:27:41 $
+*
+*  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+*/
+
+#include "psTest.h"
+#include "pslib_strict.h"
+static psS32 testSphereTransformAlloc(void);
+static psS32 testPlaneTransformAlloc(void);
+static psS32 testPlaneDistortAlloc(void);
+static psS32 testPlaneTransformApply(void);
+static psS32 testPlaneDistortApply(void);
+static psS32 testSphereTransformApply1(void);
+static psS32 testSphereTransformApply2(void);
+static psS32 testSphereTransformApply3(void);
+static psS32 testSphereTransformApply4(void);
+static psS32 testSphereTransformApply5(void);
+static psS32 testSphereTransformICRSToEcliptic(void);
+static psS32 testSphereTransformEclipticToICRS(void);
+static psS32 testSphereTransformICRSToGalactic(void);
+static psS32 testSphereTransformGalacticToICRS(void);
+static psS32 testSphereTransformPrecess(void);
+testDescription tests[] = {
+                              {testSphereTransformAlloc, 819, "psSphereTransformAlloc()", 0, false},
+                              {testPlaneTransformAlloc, 826, "psPlaneTransformAlloc()", 0, false},
+                              {testPlaneDistortAlloc, 827, "psPlaneDistortAlloc()", 0, false},
+                              {testPlaneTransformApply, 831, "psPlaneTransformApply()", 0, false},
+                              {testPlaneDistortApply, 832, "psPlaneDistortApply()", 0, false},
+                              {testSphereTransformApply1, 820, "psSphereTransformApply()", 0, false},
+                              {testSphereTransformApply2, 820, "psSphereTransformApply()", 0, false},
+                              {testSphereTransformApply3, 820, "psSphereTransformApply()", 0, false},
+                              {testSphereTransformApply4, 820, "psSphereTransformApply()", 0, false},
+                              {testSphereTransformApply5, 820, "psSphereTransformApply()", 0, false},
+                              {testSphereTransformICRSToEcliptic, 821, "psSphereTransformICRSToEcliptic()", 0, false},
+                              {testSphereTransformEclipticToICRS, 822, "psSphereTransformEclipticToICRS()", 0, false},
+                              {testSphereTransformICRSToGalactic, 824, "psSphereTransformICRSToGalactic()", 0, false},
+                              {testSphereTransformGalacticToICRS, 823, "psSphereTransformGalacticToICRS()", 0, false},
+                              {testSphereTransformPrecess, 825, "psSphereTransformPrecess()", 0, false},
+                              {NULL}
+                          };
+
+psS32 main( psS32 argc, char* argv[] )
+{
+    psLogSetLevel( PS_LOG_INFO );
+
+    return ( ! runTestSuite( stderr, "psCoord", tests, argc, argv ) );
+}
+
+#define DEG_INC   30.0
+
+#define MJD_1900  15021.0        // Modified Julian Day 1/1/1900 00:00:00
+#define MJD_2000  51544.0        // Modified Julian Day 1/1/2000 00:00:00
+#define MJD_2100  88069.0        // Modified Julian Day 1/1/2100 00:00:00
+
+#define ERROR_TOL   0.0001
+
+#define ALPHA_P 1.0
+#define DELTA_P 2.0
+#define PHI_P 3.0
+
+psS32 testSphereTransformAlloc( void )
+{
+    // Allocate data structure
+    psSphereTransform *myST = psSphereTransformAlloc(ALPHA_P, DELTA_P, PHI_P);
+    // Verify null not returned
+    if(myST == NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Returned NULL with valid parameters");
+        return 1;
+    }
+    // Verify sin member is updated
+    psF32 sinDeltaP = sin(DELTA_P);
+    if (FLT_EPSILON < fabs(sinDeltaP - myST->sinDeltaP)) {
+        psError(PS_ERR_UNKNOWN,true,"myST->sinDeltaP is %f, should be %f\n", myST->sinDeltaP, sinDeltaP);
+        return 2;
+    }
+    // Verify cos member is update
+    psF32 cosDeltaP = cos(DELTA_P);
+    if (FLT_EPSILON < fabs(cosDeltaP - myST->cosDeltaP)) {
+        psError(PS_ERR_UNKNOWN,true,"myST->cosDeltaP is %f, should be %f\n", myST->cosDeltaP, cosDeltaP);
+        return 3;
+    }
+    // Verify alpha is updated
+    if (FLT_EPSILON < fabs(ALPHA_P - myST->alphaP)) {
+        psError(PS_ERR_UNKNOWN,true,"myST->alphaP is %f, should be %f\n", myST->alphaP, ALPHA_P);
+        return 4;
+    }
+    // Verify phi is updated
+    if (FLT_EPSILON < fabs(PHI_P - myST->phiP)) {
+        psError(PS_ERR_UNKNOWN,true,"myST->phiP is %f, should be %f\n", myST->phiP, PHI_P);
+        return 5;
+    }
+    // Free data structure
+    psFree(myST);
+
+    return 0;
+}
+
+#define NW_TERMS 2
+#define NX_TERMS 3
+#define NY_TERMS 4
+#define NZ_TERMS 5
+
+psS32 testPlaneTransformAlloc( void )
+{
+    // Allocate psPlaneTransform with known x and y terms
+    psPlaneTransform *myPT = psPlaneTransformAlloc(NX_TERMS, NY_TERMS);
+
+    // Verify returned value is not NULL
+    if(myPT == NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Function returned NULL not expected.");
+        return 1;
+    }
+
+    // Verify returned transform has members set properly
+    if (myPT->x->nX != NX_TERMS) {
+        psError(PS_ERR_UNKNOWN,true,"myPT->x->nX is %d, should be %d",
+                myPT->x->nX, NX_TERMS);
+        return 2;
+    }
+    if (myPT->y->nX != NX_TERMS) {
+        psError(PS_ERR_UNKNOWN,true,"myPT->y->nX is %d, should be %d",
+                myPT->y->nX, NX_TERMS);
+        return 3;
+    }
+    if (myPT->x->nY != NY_TERMS) {
+        psError(PS_ERR_UNKNOWN,true,"myPT->x->nY is %d, should be %d",
+                myPT->x->nY, NY_TERMS);
+        return 4;
+    }
+    if (myPT->y->nY != NY_TERMS) {
+        psError(PS_ERR_UNKNOWN,true,"myPT->y->nY is %d, should be %d",
+                myPT->y->nY, NY_TERMS);
+        return 5;
+    }
+
+    // Free plane transform
+    psFree(myPT);
+
+    // Attempt to specify negative x terms and verify NULL returned and errror message generated
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message: negative x terms");
+    myPT = psPlaneTransformAlloc(-1.0, 1.0);
+    if (myPT != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"psPlaneTransformAlloc() did not return NULL.");
+        return 6;
+    }
+
+    // Attempt to specify negative y terms and verify NULL returned and error message generated
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message: negative y terms");
+    myPT = psPlaneTransformAlloc(1.0, -1.0);
+    if (myPT != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"psPlaneTransformAlloc() did not return NULL.");
+        return 7;
+    }
+
+    psFree(myPT);
+
+    return 0;
+}
+
+
+psS32 testPlaneDistortAlloc( void )
+{
+    // Invoke function with known parameters
+    psPlaneDistort *myPD = psPlaneDistortAlloc(NW_TERMS, NX_TERMS, NY_TERMS, NZ_TERMS);
+
+    // Verify NULL is not returned
+    if(myPD == NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Return of NULL not expected");
+        return 1;
+    }
+    // Verify the terms are properly set after allocation
+    if (myPD->x->nW != NW_TERMS) {
+        psError(PS_ERR_UNKNOWN,true,"myPD->x->nW is %d, should be %d",
+                myPD->x->nW, NW_TERMS);
+        return 2;
+    }
+    if (myPD->y->nW != NW_TERMS) {
+        psError(PS_ERR_UNKNOWN,true,"myPD->y->nW is %d, should be %d",
+                myPD->y->nW, NW_TERMS);
+        return 3;
+    }
+    if (myPD->x->nX != NX_TERMS) {
+        psError(PS_ERR_UNKNOWN,true,"myPD->x->nX is %d, should be %d",
+                myPD->x->nX, NX_TERMS);
+        return 4;
+    }
+    if (myPD->y->nX != NX_TERMS) {
+        psError(PS_ERR_UNKNOWN,true,"myPD->y->nX is %d, should be %d",
+                myPD->y->nX, NX_TERMS);
+        return 5;
+    }
+    if (myPD->x->nY != NY_TERMS) {
+        psError(PS_ERR_UNKNOWN,true,"myPD->x->nY is %d, should be %d",
+                myPD->x->nY, NY_TERMS);
+        return 6;
+    }
+    if (myPD->y->nY != NY_TERMS) {
+        psError(PS_ERR_UNKNOWN,true,"myPD->y->nY is %d, should be %d",
+                myPD->y->nY, NY_TERMS);
+        return 7;
+    }
+    if (myPD->x->nZ != NZ_TERMS) {
+        psError(PS_ERR_UNKNOWN,true,"myPD->x->nZ is %d, should be %d",
+                myPD->x->nZ, NZ_TERMS);
+        return 8;
+    }
+    if (myPD->y->nZ != NZ_TERMS) {
+        psError(PS_ERR_UNKNOWN,true,"myPD->y->nZ is %d, should be %d",
+                myPD->y->nZ, NZ_TERMS);
+        return 9;
+    }
+    // Free psPlaneTransform
+    psFree(myPD);
+
+    // Invoke function with negative x term parameter
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message for negative x term");
+    myPD = psPlaneDistortAlloc(-1.0, 1.0, 1.0, 1.0);
+    if (myPD != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"psPlaneDistortAlloc() did not return NULL.");
+        return 10;
+    }
+
+    // Invoke function with negative y term parameter
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message for negative y term");
+    myPD = psPlaneDistortAlloc(1.0, -1.0, 1.0, 1.0);
+    if (myPD != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"psPlaneDistortAlloc() did not return NULL.");
+        return 11;
+    }
+
+    // Invoke function with negative z term parameter
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message for negative z term");
+    myPD = psPlaneDistortAlloc(1.0, 1.0, -1.0, 1.0);
+    if (myPD != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"psPlaneDistortAlloc() did not return NULL.");
+        return 12;
+    }
+
+    // Invoke function with negative w term parameter
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message for negative w term");
+    myPD = psPlaneDistortAlloc(1.0, 1.0, 1.0, -1.0);
+    if (myPD != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"psPlaneDistortAlloc() did not return NULL.");
+    }
+
+    return 0;
+}
+
+#define N 10
+// We do a simple identity transformation on a few x,y pairs.
+psS32 testPlaneTransformApply( void )
+{
+    psPlane*          out = NULL;
+    psDPolynomial2D*  tmp2DPoly = NULL;
+    psPlane*          rc;
+
+    // Create input coordinate
+    psPlane* in = psPlaneAlloc();
+    if(in == NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Did not expect NULL return from psPlaneAlloc");
+        return 1;
+    }
+
+    // Create transform
+    psPlaneTransform* pt = psPlaneTransformAlloc(2,2);
+
+    // Set transform coefficients so the x coord input will equal x coord output, same for y
+    pt->x->coeff[1][0] = 1.0;
+    pt->y->coeff[0][1] = 1.0;
+
+    // Apply transform for several points
+    for (psS32 i = 0; i < N; i++) {
+        in->x = (psF64) i;
+        in->y = (psF64) (i + 5.0);
+        in->xErr = 0.0;
+        in->yErr = 0.0;
+
+        // Verify function does not return NULL
+        out = psPlaneTransformApply(out, pt, in);
+        if( out  == NULL) {
+            psError(PS_ERR_UNKNOWN,true,"Expected non-NULL return value");
+            return 1;
+        }
+        // Verify the expected values are returned
+        if (FLT_EPSILON < fabs(out->x - in->x)) {
+            psError(PS_ERR_UNKNOWN,true,"out.x is %lf, should be %lf", out->x, in->x);
+            return 3;
+        }
+        if (FLT_EPSILON < fabs(out->y - in->y)) {
+            psError(PS_ERR_UNKNOWN,true,"out.y is %lf, should be %lf", out->y, in->y);
+            return 4;
+        }
+    }
+    psFree(out);
+
+    // Verify return null and error message generater for null specified transform
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate error message for NULL psPlaneTransform");
+    rc = psPlaneTransformApply(NULL, NULL, in);
+    if (rc != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Function did not return NULL as expected for NULL psPlaneTransform.");
+        return 5;
+    }
+
+    // Verify return null and error message generated for null psPlaneTransform x coeff
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate error message for NULL x coeff psPlaneTransform");
+    tmp2DPoly = pt->x;
+    pt->x = NULL;
+    rc = psPlaneTransformApply(NULL, pt, in);
+    if (rc != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Function did not return NULL as expected for NULL x coeff psPlaneTransform");
+        return 6;
+    }
+    pt->x = tmp2DPoly;
+
+    // Verify return null and error message generated for null psPlaneTransform y coeff
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate error message for NULL y coeff psPlaneTransform");
+    tmp2DPoly = pt->y;
+    pt->y = NULL;
+    rc = psPlaneTransformApply(NULL, pt, in);
+    if (rc != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Function did not return NULL as expected for NULL y coeff psPlaneTransform");
+        return 7;
+    }
+    pt->y = tmp2DPoly;
+
+    // Verify return null and error message generated for null psPlane coordinate
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate error message for NULL psPlane");
+    rc = psPlaneTransformApply(NULL, pt, NULL);
+    if (rc != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Function did not return NULL as expected for NULL psPlane");
+        return 8;
+    }
+
+    psFree(pt);
+    psFree(in);
+
+    return 0;
+}
+
+#define COLOR 1.0
+#define MAGNITUDE 1.0
+// We do a simple identity transformation on a few x,y pairs.  For x and y,
+// we add in the COLOR and MAGNITUDE.
+psS32 testPlaneDistortApply( void )
+{
+    psPlane*         out       = NULL;
+    psPlane*         rc        = NULL;
+    psDPolynomial4D* tmp4DPoly = NULL;
+
+    // Allocate input coordinate
+    psPlane* in = psPlaneAlloc();
+
+    // Create psPlaneTransform structure
+    psPlaneDistort*  pt = psPlaneDistortAlloc(2, 2, 2, 2);
+
+    pt->x->coeff[1][0][0][0] = 1.0;
+    pt->x->coeff[0][0][1][0] = 1.0;
+    pt->x->coeff[0][0][0][1] = 1.0;
+
+    pt->y->coeff[0][1][0][0] = 1.0;
+    pt->y->coeff[0][0][1][0] = 1.0;
+    pt->y->coeff[0][0][0][1] = 1.0;
+
+    for (psS32 i = 0; i < N; i++) {
+        in->x = (psF64) i;
+        in->y = (psF64) (i + 5.0);
+        in->xErr = 0.0;
+        in->yErr = 0.0;
+        out = psPlaneDistortApply(out, pt, in, COLOR, MAGNITUDE);
+
+        // Verify return value is not NULL
+        if(out == NULL) {
+            psError(PS_ERR_UNKNOWN,true,"Expected non-NULL return");
+            return 1;
+        }
+        // Verify return value contains expected values
+        if (FLT_EPSILON < fabs(out->x - COLOR - MAGNITUDE - in->x)) {
+            psError(PS_ERR_UNKNOWN,true,"out->x is %lf, should be %lf",
+                    out->x, in->x + COLOR + MAGNITUDE);
+            return 2;
+        }
+        if (FLT_EPSILON < fabs(out->y - COLOR - MAGNITUDE - in->y)) {
+            psError(PS_ERR_UNKNOWN,true,"out->y is %lf, should be %lf",
+                    out->y, in->y + COLOR + MAGNITUDE);
+            return 3;
+        }
+    }
+    psFree(out);
+
+    // Attempt to invoke psPlaneDistortApply with NULL psPlaneDistort
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message for null psPlaneDistort");
+    rc = psPlaneDistortApply(NULL, NULL, in, COLOR, MAGNITUDE);
+    if (rc != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Did not return NULL.");
+        return 4;
+    }
+
+    // Attempt to invoke psPlaneDistortApply with NULL psPlaneDistort x member
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message for null x member psPlaneDistort");
+    tmp4DPoly = pt->x;
+    pt->x = NULL;
+    rc = psPlaneDistortApply(NULL, pt, in, COLOR, MAGNITUDE);
+    if (rc != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Did not return NULL.");
+        return 5;
+    }
+    pt->x = tmp4DPoly;
+
+    // Attempt to invoke psPlaneDistortApply with NULL psPlaneDistort y member
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message for null y member psPlaneDistort");
+    tmp4DPoly = pt->y;
+    pt->y = NULL;
+    rc = psPlaneDistortApply(NULL, pt, in, COLOR, MAGNITUDE);
+    if (rc != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Did not return NULL.");
+        return 6;
+    }
+    pt->y = tmp4DPoly;
+
+    // Attempt to invoke psPlaneDistortApply with NULL input psPlane
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message for null input psPlane");
+    rc = psPlaneDistortApply(NULL, pt, NULL, COLOR, MAGNITUDE);
+    if (rc != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Did not return NULL");
+        return 7;
+    }
+
+    psFree(pt);
+    psFree(in);
+
+    return 0;
+}
+
+// We do a simple identity transformation on a few RA, DEC pairs.
+psS32 testSphereTransformApply1( void )
+{
+    psSphere *in = psSphereAlloc();
+    psSphere *out = psSphereAlloc();
+    psSphere *temp = NULL;
+    psSphere *rc = NULL;
+    psSphereTransform *myST = psSphereTransformAlloc(0.0, 0.0, 0.0);
+
+    for (float r=0.0;r<180.0;r+=DEG_INC) {
+        for (float d=0.0;d<90.0;d+=DEG_INC) {
+            in->r = DEG_TO_RAD(r);
+            in->d = DEG_TO_RAD(d);
+            in->rErr = 0.0;
+            in->dErr = 0.0;
+
+            if(psSphereTransformApply(out, myST, in) != out) {
+                psError(PS_ERR_UNKNOWN,true,"Did not return output pointer.");
+                return 1;
+            }
+            if (ERROR_TOL < fabs(out->r - in->r)) {
+                psError(PS_ERR_UNKNOWN,true,"out->r is %f, should be %f\n", out->r, in->r);
+                return 2;
+            }
+            if (ERROR_TOL < fabs(out->d - in->d)) {
+                psError(PS_ERR_UNKNOWN,true,"out->d is %f, should be %f\n", out->d, in->d);
+                return 3;
+            }
+        }
+    }
+
+    // Verify new sphere object is created if out parameter NULL
+    temp = psSphereTransformApply(NULL, myST, in);
+    if ( temp == NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Returned NULL when out parameter was null");
+        return 4;
+    }
+    psFree(temp);
+
+    // Verify NULL returned if transform structure null
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error");
+    rc = psSphereTransformApply(NULL, NULL, in);
+    if (rc != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"psSphereTransformApply() did not return NULL.");
+        return 5;
+    }
+
+    // Verify NULL returned when input sphere is NULL
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error");
+    rc = psSphereTransformApply(NULL, myST, NULL);
+    if (rc != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"psSphereTransformApply() did not return NULL");
+        return 6;
+    }
+
+    psFree(myST);
+    psFree(out);
+    psFree(in);
+
+    return 0;
+}
+
+/******************************************************************************
+testSphereTransformApply2(): This test verifies that psSphereTransformApply()
+works properly.  We create two psSphereTransforms: a forward transform and a
+reverse transform (which is the mathematical inverse of the forward transform).
+We apply both transforms to several spherical coordinates and ensure that the
+original input coordinate is obtained after applying both transforms.
+ 
+XXX: We currently test the alpha and delta offsets independently.  Attempts to
+test them both concurrently failed.  Determine why this is.  Are the following
+spherical transforms not mathematical inverses?
+    psSphereTransformAlloc(X, Y, 0.0)
+    psSphereTransformAlloc(-X, -Y, 0.0)
+ *****************************************************************************/
+#define ERROR_PERCENT 0.01
+psS32 testSphereTransformApply2( void )
+{
+    psS32 testStatus = 0;
+    psSphere in;
+    psSphere out;
+    psSphere out2;
+    psSphereTransform *mySphereTransformForward = NULL;
+    psSphereTransform *mySphereTransformReverse = NULL;
+
+
+    mySphereTransformForward = psSphereTransformAlloc(DEG_TO_RAD(22.0),
+                               0.0,
+                               0.0);
+    mySphereTransformReverse = psSphereTransformAlloc(DEG_TO_RAD(-22.0),
+                               0.0,
+                               0.0);
+
+    for (float r=0.1;r<180.0;r+=(DEG_INC/5.0)) {
+        for (float d=0.1;d<90.0;d+=(DEG_INC/5.0)) {
+            in.r = DEG_TO_RAD(r);
+            in.d = DEG_TO_RAD(d);
+            in.rErr = 0.0;
+            in.dErr = 0.0;
+
+            psSphereTransformApply(&out, mySphereTransformForward, &in);
+            psSphereTransformApply(&out2, mySphereTransformReverse, &out);
+
+            if ((fabs((in.r - out2.r) / in.r) > ERROR_PERCENT) ||
+                    (fabs((in.d - out2.d) / in.d) > ERROR_PERCENT)) {
+                printf("ERROR: \n");
+                printf("Input  coords (R, D) are (%f, %f)\n", in.r, in.d);
+                printf("Output coords (R, D) are (%f, %f)\n", out2.r, out2.d);
+                testStatus = 4;
+            }
+        }
+    }
+    psFree(mySphereTransformForward);
+    psFree(mySphereTransformReverse);
+
+    mySphereTransformForward = psSphereTransformAlloc(0.0,
+                               DEG_TO_RAD(33.0),
+                               0.0);
+    mySphereTransformReverse = psSphereTransformAlloc(0.0,
+                               DEG_TO_RAD(-33.0),
+                               0.0);
+    for (float r=0.1;r<180.0;r+=(DEG_INC/5.0)) {
+        for (float d=0.1;d<90.0;d+=(DEG_INC/5.0)) {
+            in.r = DEG_TO_RAD(r);
+            in.d = DEG_TO_RAD(d);
+            in.rErr = 0.0;
+            in.dErr = 0.0;
+
+            psSphereTransformApply(&out, mySphereTransformForward, &in);
+            psSphereTransformApply(&out2, mySphereTransformReverse, &out);
+
+            if ((fabs((in.r - out2.r) / in.r) > ERROR_PERCENT) ||
+                    (fabs((in.d - out2.d) / in.d) > ERROR_PERCENT)) {
+                printf("ERROR: \n");
+                printf("Input  coords (R, D) are (%f, %f)\n", in.r, in.d);
+                printf("Output coords (R, D) are (%f, %f)\n", out2.r, out2.d);
+                testStatus = 4;
+            }
+        }
+    }
+    psFree(mySphereTransformForward);
+    psFree(mySphereTransformReverse);
+
+    return(testStatus);
+}
+
+// Test point 1  ADD  ICRS(0,0) to Galactic (96.337272,-60.188553)
+//                              to Ecliptic (0,0) with T=1
+#define SPHERE_COORD_TP1_GAL_R           1.681409       //  96.337272 degrees
+#define SPHERE_COORD_TP1_GAL_D          -1.050488       // -60.188553 degrees
+#define SPHERE_COORD_TP1_ECL_R           0.0
+#define SPHERE_COORD_TP1_ECL_D           0.0
+#define SPHERE_COORD_TP1_INVERSE_R       0.0
+#define SPHERE_COORD_TP1_INVERSE_D       0.0
+
+// Test point 2 ADD  ICRS(0,90) to Galactic (122.93192, 27.12825)
+//                              to Ecliptic (90,66.560719) with T=1
+#define SPHERE_COORD_TP2_GAL_R           2.145567       // 122.93192 degrees
+#define SPHERE_COORD_TP2_GAL_D           0.473477       // 27.12825  degrees
+#define SPHERE_COORD_TP2_ECL_R           1.570796       // 90        degrees
+#define SPHERE_COORD_TP2_ECL_D           1.161704       // 66.560719 degrees
+#define SPHERE_COORD_TP2_INVERSE_R       0.0            // 0         degrees
+#define SPHERE_COORD_TP2_INVERSE_D       1.570796       // 90        degrees
+
+// Test point 3 ADD  ICRS(180,30) to Galactic (195.639488, 78.353806)
+//                                to Ecliptic (167.072470, 27.308813) with T=2
+#define SPHERE_COORD_TP3_GAL_R           3.414553       // 195.639488 degrees
+#define SPHERE_COORD_TP3_GAL_D           1.367532       // 78.353806  degrees
+#define SPHERE_COORD_TP3_ECL_R           2.915965       // 167.07247  degrees
+#define SPHERE_COORD_TP3_ECL_D           0.476629       // 27.308813  degrees
+#define SPHERE_COORD_TP3_INVERSE_R       3.141593       // 180.0      degrees
+#define SPHERE_COORD_TP3_INVERSE_D       0.523599       // 30.0       degrees
+
+psS32 testSphereTransformApply3( void)
+{
+
+    psSphereTransform*  testTransform;
+    psSphere*           inputCoord = psSphereAlloc();
+    psSphere*           outputCoord = NULL;
+    psSphere*           inverseOutputCoord = NULL;
+
+    inputCoord->r = SPHERE_COORD_TP1_INVERSE_R;
+    inputCoord->d = SPHERE_COORD_TP1_INVERSE_D;
+    inputCoord->rErr = 0.0;
+    inputCoord->dErr = 0.0;
+
+    // Set test date time to 1/1/2000 00:00:00
+    psTime* testDateTime = psTimeFromMJD(MJD_2000);
+
+    // Create transform ICRS to Galactic
+    testTransform = psSphereTransformICRSToGalactic();
+
+    // Perform transform from ICRS to Galactic
+    outputCoord = psSphereTransformApply(outputCoord,testTransform,inputCoord);
+    // Verify output not NULL and member values set correctly
+    if(outputCoord == NULL) {
+        psError(PS_ERR_UNKNOWN,true,"psSphereTransformApply returned NULL");
+        return 1;
+    }
+    if(fabs(outputCoord->r - SPHERE_COORD_TP1_GAL_R) > ERROR_TOL) {
+        psError(PS_ERR_UNKNOWN,true,"psSphereTransformApply return coord r %lg not as expected %lg",
+                outputCoord->r, SPHERE_COORD_TP1_GAL_R);
+        return 2;
+    }
+    if(fabs(outputCoord->d - SPHERE_COORD_TP1_GAL_D) > ERROR_TOL) {
+        psError(PS_ERR_UNKNOWN,true,"psSphereTransformApply return coord d %ld not as expected %lg",
+                outputCoord->d, SPHERE_COORD_TP1_GAL_D);
+        return 3;
+    }
+    psFree(testTransform);
+
+    // Create inverse transform Galactic to ICRS
+    testTransform = psSphereTransformGalacticToICRS();
+
+    // Perform transform from Galactic to ICRS
+    inverseOutputCoord = psSphereTransformApply(inverseOutputCoord,testTransform,outputCoord);
+    // Verify output not NULL and member values set correctly
+    if(inverseOutputCoord == NULL) {
+        psError(PS_ERR_UNKNOWN,true,"psSphereTransformApply returned NULL");
+        return 4;
+    }
+
+    if(fabs(inverseOutputCoord->r - SPHERE_COORD_TP1_INVERSE_R) > ERROR_TOL) {
+        psError(PS_ERR_UNKNOWN,true,"psSphereTransformApply return coord r %lg not as expected %lg",
+                inverseOutputCoord->r, SPHERE_COORD_TP1_INVERSE_R);
+        return 5;
+    }
+    if(fabs(inverseOutputCoord->d - SPHERE_COORD_TP1_INVERSE_D) > ERROR_TOL) {
+        psError(PS_ERR_UNKNOWN,true,"psSphereTransformApply return coord d %ld not as expected %lg",
+                inverseOutputCoord->d, SPHERE_COORD_TP1_INVERSE_D);
+        return 6;
+    }
+    psFree(testTransform);
+
+    // Create transform ICRS to Ecliptic
+    testTransform = psSphereTransformICRSToEcliptic(testDateTime);
+
+    // Perform transform from ICRS to Ecliptic
+    outputCoord = psSphereTransformApply(outputCoord,testTransform,inputCoord);
+    // Verify output not NULL and member values set correctly
+    if(outputCoord == NULL) {
+        psError(PS_ERR_UNKNOWN,true,"psSphereTransformApply returned NULL");
+        return 7;
+    }
+    if(fabs(outputCoord->r - SPHERE_COORD_TP1_ECL_R) > ERROR_TOL) {
+        psError(PS_ERR_UNKNOWN,true,"psSphereTransformApply return coord r %lg not as expected %lg",
+                outputCoord->r, SPHERE_COORD_TP1_ECL_R);
+        return 8;
+    }
+    if(fabs(outputCoord->d - SPHERE_COORD_TP1_ECL_D) > ERROR_TOL) {
+        psError(PS_ERR_UNKNOWN,true,"psSphereTransformApply return coord d %ld not as expected %lg",
+                outputCoord->d, SPHERE_COORD_TP1_ECL_D);
+        return 9;
+    }
+    psFree(testTransform);
+
+    // Create inverse transform Ecliptic to ICRS
+    testTransform = psSphereTransformEclipticToICRS(testDateTime);
+
+    // Perform transform from Ecliptic to ICRS
+    inverseOutputCoord = psSphereTransformApply(inverseOutputCoord,testTransform,outputCoord);
+    // Verify output not NULL and member values set correctly
+    if(inverseOutputCoord == NULL) {
+        psError(PS_ERR_UNKNOWN,true,"psSphereTransformApply returned NULL");
+        return 10;
+    }
+    if(fabs(inverseOutputCoord->r - SPHERE_COORD_TP1_INVERSE_R) > ERROR_TOL) {
+        psError(PS_ERR_UNKNOWN,true,"psSphereTransformApply return coord r %lg not as expected %lg",
+                inverseOutputCoord->r, SPHERE_COORD_TP1_INVERSE_R);
+        return 11;
+    }
+    if(fabs(inverseOutputCoord->d - SPHERE_COORD_TP1_INVERSE_D) > ERROR_TOL) {
+        psError(PS_ERR_UNKNOWN,true,"psSphereTransformApply return coord d %ld not as expected %lg",
+                inverseOutputCoord->d, SPHERE_COORD_TP1_INVERSE_D);
+        return 12;
+    }
+    psFree(testTransform);
+
+    psFree(testDateTime);
+    psFree(outputCoord);
+    psFree(inputCoord);
+    psFree(inverseOutputCoord);
+
+    return 0;
+}
+
+psS32 testSphereTransformApply4( void)
+{
+
+    psSphereTransform*  testTransform;
+    psSphere*           inputCoord = psSphereAlloc();
+    psSphere*           outputCoord = NULL;
+    psSphere*           inverseOutputCoord = NULL;
+
+    inputCoord->r = SPHERE_COORD_TP2_INVERSE_R;
+    inputCoord->d = SPHERE_COORD_TP2_INVERSE_D;
+    inputCoord->rErr = 0.0;
+    inputCoord->dErr = 0.0;
+
+    // Set test date time to 1/1/2000 00:00:00
+    psTime* testDateTime = psTimeFromMJD(MJD_2000);
+
+    // Create transform ICRS to Galactic
+    testTransform = psSphereTransformICRSToGalactic();
+
+    // Perform transform from ICRS to Galactic
+    outputCoord = psSphereTransformApply(outputCoord,testTransform,inputCoord);
+    // Verify output not NULL and member values set correctly
+    if(outputCoord == NULL) {
+        psError(PS_ERR_UNKNOWN,true,"psSphereTransformApply returned NULL");
+        return 1;
+    }
+    if(fabs(outputCoord->r - SPHERE_COORD_TP2_GAL_R) > ERROR_TOL) {
+        psError(PS_ERR_UNKNOWN,true,"psSphereTransformApply return coord r %lg not as expected %lg",
+                outputCoord->r, SPHERE_COORD_TP2_GAL_R);
+        return 2;
+    }
+    if(fabs(outputCoord->d - SPHERE_COORD_TP2_GAL_D) > ERROR_TOL) {
+        psError(PS_ERR_UNKNOWN,true,"psSphereTransformApply return coord d %ld not as expected %lg",
+                outputCoord->d, SPHERE_COORD_TP2_GAL_D);
+        return 3;
+    }
+    psFree(testTransform);
+
+    // Create inverse transform Galactic to ICRS
+    testTransform = psSphereTransformGalacticToICRS();
+
+    // Perform transform from Galactic to ICRS
+    inverseOutputCoord = psSphereTransformApply(inverseOutputCoord,testTransform,outputCoord);
+    // Verify output not NULL and member values set correctly
+    if(inverseOutputCoord == NULL) {
+        psError(PS_ERR_UNKNOWN,true,"psSphereTransformApply returned NULL");
+        return 4;
+    }
+    // atan2 function introduces some error with y close to zero, increased error tolerance
+    if(fabs(inverseOutputCoord->r - SPHERE_COORD_TP2_INVERSE_R) > ERROR_TOL+0.1) {
+        psError(PS_ERR_UNKNOWN,true,"psSphereTransformApply return coord r %lg not as expected %lg",
+                inverseOutputCoord->r, SPHERE_COORD_TP2_INVERSE_R);
+        return 5;
+    }
+    if(fabs(inverseOutputCoord->d - SPHERE_COORD_TP2_INVERSE_D) > ERROR_TOL) {
+        psError(PS_ERR_UNKNOWN,true,"psSphereTransformApply return coord d %ld not as expected %lg",
+                inverseOutputCoord->d, SPHERE_COORD_TP2_INVERSE_D);
+        return 6;
+    }
+    psFree(testTransform);
+
+    // Create transform ICRS to Ecliptic
+    testTransform = psSphereTransformICRSToEcliptic(testDateTime);
+
+    // Perform transform from ICRS to Ecliptic
+    outputCoord = psSphereTransformApply(outputCoord,testTransform,inputCoord);
+    // Verify output not NULL and member values set correctly
+    if(outputCoord == NULL) {
+        psError(PS_ERR_UNKNOWN,true,"psSphereTransformApply returned NULL");
+        return 7;
+    }
+    if(fabs(outputCoord->r - SPHERE_COORD_TP2_ECL_R) > ERROR_TOL) {
+        psError(PS_ERR_UNKNOWN,true,"psSphereTransformApply return coord r %lg not as expected %lg",
+                outputCoord->r, SPHERE_COORD_TP2_ECL_R);
+        return 8;
+    }
+    if(fabs(outputCoord->d - SPHERE_COORD_TP2_ECL_D) > ERROR_TOL) {
+        psError(PS_ERR_UNKNOWN,true,"psSphereTransformApply return coord d %ld not as expected %lg",
+                outputCoord->d, SPHERE_COORD_TP2_ECL_D);
+        return 9;
+    }
+    psFree(testTransform);
+
+    // Create inverse transform Ecliptic to ICRS
+    testTransform = psSphereTransformEclipticToICRS(testDateTime);
+
+    // Perform transform from Ecliptic to ICRS
+    inverseOutputCoord = psSphereTransformApply(inverseOutputCoord,testTransform,outputCoord);
+    // Verify output not NULL and member values set correctly
+    if(inverseOutputCoord == NULL) {
+        psError(PS_ERR_UNKNOWN,true,"psSphereTransformApply returned NULL");
+        return 10;
+    }
+    if(fabs(inverseOutputCoord->r - SPHERE_COORD_TP2_INVERSE_R) > ERROR_TOL) {
+        psError(PS_ERR_UNKNOWN,true,"psSphereTransformApply return coord r %lg not as expected %lg",
+                inverseOutputCoord->r, SPHERE_COORD_TP2_INVERSE_R);
+        return 11;
+    }
+    if(fabs(inverseOutputCoord->d - SPHERE_COORD_TP2_INVERSE_D) > ERROR_TOL) {
+        psError(PS_ERR_UNKNOWN,true,"psSphereTransformApply return coord d %ld not as expected %lg",
+                inverseOutputCoord->d, SPHERE_COORD_TP2_INVERSE_D);
+        return 12;
+    }
+    psFree(testTransform);
+
+    psFree(testDateTime);
+    psFree(outputCoord);
+    psFree(inputCoord);
+    psFree(inverseOutputCoord);
+
+    return 0;
+}
+
+psS32 testSphereTransformApply5( void)
+{
+    psSphereTransform*  testTransform;
+    psSphere*           inputCoord = psSphereAlloc();
+    psSphere*           outputCoord = NULL;
+    psSphere*           inverseOutputCoord = NULL;
+
+    inputCoord->r = SPHERE_COORD_TP3_INVERSE_R;
+    inputCoord->d = SPHERE_COORD_TP3_INVERSE_D;
+    inputCoord->rErr = 0.0;
+    inputCoord->dErr = 0.0;
+
+    // Set test date time to 1/1/2100 00:00:00
+    psTime* testDateTime = psTimeFromMJD(MJD_2100);
+
+    // Create transform ICRS to Galactic
+    testTransform = psSphereTransformICRSToGalactic();
+
+    // Perform transform from ICRS to Galactic
+    outputCoord = psSphereTransformApply(outputCoord,testTransform,inputCoord);
+    // Verify output not NULL and member values set correctly
+    if(outputCoord == NULL) {
+        psError(PS_ERR_UNKNOWN,true,"psSphereTransformApply returned NULL");
+        return 1;
+    }
+    if(fabs(outputCoord->r - SPHERE_COORD_TP3_GAL_R) > ERROR_TOL) {
+        psError(PS_ERR_UNKNOWN,true,"psSphereTransformApply return coord r %lg not as expected %lg",
+                outputCoord->r, SPHERE_COORD_TP3_GAL_R);
+        return 2;
+    }
+    if(fabs(outputCoord->d - SPHERE_COORD_TP3_GAL_D) > ERROR_TOL) {
+        psError(PS_ERR_UNKNOWN,true,"psSphereTransformApply return coord d %ld not as expected %lg",
+                outputCoord->d, SPHERE_COORD_TP3_GAL_D);
+        return 3;
+    }
+    psFree(testTransform);
+
+    // Create inverse transform Galactic to ICRS
+    testTransform = psSphereTransformGalacticToICRS();
+
+    // Perform transform from Galactic to ICRS
+    inverseOutputCoord = psSphereTransformApply(inverseOutputCoord,testTransform,outputCoord);
+    // Verify output not NULL and member values set correctly
+    if(inverseOutputCoord == NULL) {
+        psError(PS_ERR_UNKNOWN,true,"psSphereTransformApply returned NULL");
+        return 4;
+    }
+    if(fabs(inverseOutputCoord->r - SPHERE_COORD_TP3_INVERSE_R) > ERROR_TOL+0.1) {
+        psError(PS_ERR_UNKNOWN,true,"psSphereTransformApply return coord r %lg not as expected %lg",
+                inverseOutputCoord->r, SPHERE_COORD_TP3_INVERSE_R);
+        return 5;
+    }
+    if(fabs(inverseOutputCoord->d - SPHERE_COORD_TP3_INVERSE_D) > ERROR_TOL) {
+        psError(PS_ERR_UNKNOWN,true,"psSphereTransformApply return coord d %ld not as expected %lg",
+                inverseOutputCoord->d, SPHERE_COORD_TP3_INVERSE_D);
+        return 6;
+    }
+    psFree(testTransform);
+
+    // Create transform ICRS to Ecliptic
+    testTransform = psSphereTransformICRSToEcliptic(testDateTime);
+
+    // Perform transform from ICRS to Ecliptic
+    outputCoord = psSphereTransformApply(outputCoord,testTransform,inputCoord);
+    // Verify output not NULL and member values set correctly
+    if(outputCoord == NULL) {
+        psError(PS_ERR_UNKNOWN,true,"psSphereTransformApply returned NULL");
+        return 7;
+    }
+    if(fabs(outputCoord->r - SPHERE_COORD_TP3_ECL_R) > ERROR_TOL) {
+        psError(PS_ERR_UNKNOWN,true,"psSphereTransformApply return coord r %lg not as expected %lg",
+                outputCoord->r, SPHERE_COORD_TP3_ECL_R);
+        return 8;
+    }
+    if(fabs(outputCoord->d - SPHERE_COORD_TP3_ECL_D) > ERROR_TOL) {
+        psError(PS_ERR_UNKNOWN,true,"psSphereTransformApply return coord d %ld not as expected %lg",
+                outputCoord->d, SPHERE_COORD_TP3_ECL_D);
+        return 9;
+    }
+    psFree(testTransform);
+
+    // Create inverse transform Ecliptic to ICRS
+    testTransform = psSphereTransformEclipticToICRS(testDateTime);
+
+    // Perform transform from Ecliptic to ICRS
+    inverseOutputCoord = psSphereTransformApply(inverseOutputCoord,testTransform,outputCoord);
+    // Verify output not NULL and member values set correctly
+    if(inverseOutputCoord == NULL) {
+        psError(PS_ERR_UNKNOWN,true,"psSphereTransformApply returned NULL");
+        return 10;
+    }
+    if(fabs(inverseOutputCoord->r - SPHERE_COORD_TP3_INVERSE_R) > ERROR_TOL) {
+        psError(PS_ERR_UNKNOWN,true,"psSphereTransformApply return coord r %lg not as expected %lg",
+                inverseOutputCoord->r, SPHERE_COORD_TP3_INVERSE_R);
+        return 11;
+    }
+    if(fabs(inverseOutputCoord->d - SPHERE_COORD_TP3_INVERSE_D) > ERROR_TOL) {
+        psError(PS_ERR_UNKNOWN,true,"psSphereTransformApply return coord d %ld not as expected %lg",
+                inverseOutputCoord->d, SPHERE_COORD_TP3_INVERSE_D);
+        return 12;
+    }
+    psFree(testTransform);
+
+    psFree(testDateTime);
+    psFree(outputCoord);
+    psFree(inputCoord);
+    psFree(inverseOutputCoord);
+
+    return 0;
+}
+
+#define SPHERE_PRECESS_TP1_R            0.0               //    0.0       degrees
+#define SPHERE_PRECESS_TP1_D            0.0               //    0.0       degrees
+#define SPHERE_PRECESS_TP1_EXPECT_R     6.238453          //  357.437     degrees
+#define SPHERE_PRECESS_TP1_EXPECT_D    -0.019426          //   -1.113     degrees
+#define SPHERE_PRECESS_TP2_R            0.0               //    0.0       degrees
+#define SPHERE_PRECESS_TP2_D            1.570796          //   90.0       degrees
+#define SPHERE_PRECESS_TP2_EXPECT_R     6.260828          //  358.719     degrees
+#define SPHERE_PRECESS_TP2_EXPECT_D     1.551353          //   88.886     degrees
+#define SPHERE_PRECESS_TP3_R            3.141593          //  180.0       degrees
+#define SPHERE_PRECESS_TP3_D            0.523599          //   30.0       degrees
+#define SPHERE_PRECESS_TP3_EXPECT_R     3.096616          //  177.423     degrees
+#define SPHERE_PRECESS_TP3_EXPECT_D     0.543024          //   31.113     degrees
+
+psS32 testSphereTransformPrecess( void )
+{
+    psSphere*     inputCoord  = psSphereAlloc();
+    psSphere*     outputCoord = NULL;
+    psTime*       fromTime    = psTimeFromMJD(MJD_2100);
+    psTime*       toTime      = psTimeFromMJD(MJD_1900);
+
+    // Set input coordinate
+    inputCoord->r = SPHERE_PRECESS_TP1_R;
+    inputCoord->d = SPHERE_PRECESS_TP1_D;
+    inputCoord->rErr = 0.0;
+    inputCoord->dErr = 0.0;
+
+    // Calculate precess
+    outputCoord = psSpherePrecess(inputCoord, fromTime, toTime);
+    // Verify return is not NULL
+    if(outputCoord == NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Returned NULL not expected");
+        return 1;
+    }
+    // Verify return with expected values
+    if( fabs(outputCoord->r - SPHERE_PRECESS_TP1_EXPECT_R) > ERROR_TOL) {
+        psError(PS_ERR_UNKNOWN,true,"Precess r = %lg not equal to expected = %lg",
+                outputCoord->r,SPHERE_PRECESS_TP1_EXPECT_R);
+        return 2;
+    }
+    if( fabs(outputCoord->d - SPHERE_PRECESS_TP1_EXPECT_D) > ERROR_TOL) {
+        psError(PS_ERR_UNKNOWN,true,"Precess d = %lg not equal to expected = %lg",
+                outputCoord->d,SPHERE_PRECESS_TP1_EXPECT_D);
+        return 3;
+    }
+    psFree(outputCoord);
+
+    // Set input coordinate
+    inputCoord->r = SPHERE_PRECESS_TP2_R;
+    inputCoord->d = SPHERE_PRECESS_TP2_D;
+    inputCoord->rErr = 0.0;
+    inputCoord->dErr = 0.0;
+
+    // Calculate precess
+    outputCoord = psSpherePrecess(inputCoord, fromTime, toTime);
+    // Verify return is not NULL
+    if(outputCoord == NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Returned NULL not expected");
+        return 4;
+    }
+    // Verify return with expected values
+    if( fabs(outputCoord->r - SPHERE_PRECESS_TP2_EXPECT_R) > ERROR_TOL) {
+        psError(PS_ERR_UNKNOWN,true,"Precess r = %lg not equal to expected = %lg",
+                outputCoord->r,SPHERE_PRECESS_TP2_EXPECT_R);
+        return 5;
+    }
+    if( fabs(outputCoord->d - SPHERE_PRECESS_TP2_EXPECT_D) > ERROR_TOL) {
+        psError(PS_ERR_UNKNOWN,true,"Precess d = %lg not equal to expected = %lg",
+                outputCoord->d,SPHERE_PRECESS_TP2_EXPECT_D);
+        return 6;
+    }
+    psFree(outputCoord);
+
+    // Set input coordinate
+    inputCoord->r = SPHERE_PRECESS_TP3_R;
+    inputCoord->d = SPHERE_PRECESS_TP3_D;
+    inputCoord->rErr = 0.0;
+    inputCoord->dErr = 0.0;
+
+    // Calculate precess
+    outputCoord = psSpherePrecess(inputCoord, fromTime, toTime);
+    // Verify return is not NULL
+    if(outputCoord == NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Returned NULL not expected");
+        return 7;
+    }
+    // Verify return with expected values
+    if( fabs(outputCoord->r - SPHERE_PRECESS_TP3_EXPECT_R) > ERROR_TOL) {
+        psError(PS_ERR_UNKNOWN,true,"Precess r = %lg not equal to expected = %lg",
+                outputCoord->r,SPHERE_PRECESS_TP3_EXPECT_R);
+        return 8;
+    }
+    if( fabs(outputCoord->d - SPHERE_PRECESS_TP3_EXPECT_D) > ERROR_TOL) {
+        psError(PS_ERR_UNKNOWN,true,"Precess d = %lg not equal to expected = %lg",
+                outputCoord->d,SPHERE_PRECESS_TP3_EXPECT_D);
+        return 9;
+    }
+    psFree(outputCoord);
+
+    // Invoke precess with invalid parameter
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message");
+    outputCoord = psSpherePrecess(inputCoord, fromTime, NULL);
+    if(outputCoord != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Did not return NULL with invalid input");
+        return 10;
+    }
+
+    // Invoke precess with invalid parameter
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message");
+    outputCoord = psSpherePrecess(inputCoord, NULL, toTime);
+    if(outputCoord != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Did not return NULL with invalid input");
+        return 11;
+    }
+
+    // Invoke precess with invalid parameter
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message");
+    outputCoord = psSpherePrecess(NULL, fromTime, toTime);
+    if(outputCoord != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Did not return NULL with invalid input");
+        return 12;
+    }
+
+    // Free objects
+    psFree(fromTime);
+    psFree(toTime);
+    psFree(inputCoord);
+
+    return 0;
+}
+
+// Thes values calculated from ADD-09 equations
+#define EXPECT_COS_DELTAP_2000    0.917482
+#define EXPECT_SIN_DELTAP_2000    0.397777
+#define EXPECT_COS_DELTAP_2100    0.917572
+#define EXPECT_SIN_DELTAP_2100    0.397567
+
+psS32 testSphereTransformICRSToEcliptic( void )
+{
+    psF64  expectedPhiP = 0.0;
+    psF64  expectedAlphaP = 0.0;
+    psF64  expectedCosDeltaP = EXPECT_COS_DELTAP_2000;
+    psF64  expectedSinDeltaP = EXPECT_SIN_DELTAP_2000;
+
+    // Set test date time to 1/1/2000 00:00:00
+    psTime* testDateTime = psTimeFromMJD(MJD_2000);
+
+    // Invoke function to set psSphereTransforma objec
+    psSphereTransform *myST = psSphereTransformICRSToEcliptic(testDateTime);
+
+    // Verify expected values for the specified time
+    if (ERROR_TOL < fabs(expectedSinDeltaP - myST->sinDeltaP)) {
+        psError(PS_ERR_UNKNOWN,true,"myST->sinDeltaP is %f, should be %f",
+                myST->sinDeltaP, expectedSinDeltaP);
+        return 1;
+    }
+    if (ERROR_TOL < fabs(expectedCosDeltaP - myST->cosDeltaP)) {
+        psError(PS_ERR_UNKNOWN,true,"myST->cosDeltaP is %f, should be %f",
+                myST->cosDeltaP, expectedCosDeltaP);
+        return 2;
+    }
+    if (ERROR_TOL < fabs(expectedAlphaP - myST->alphaP)) {
+        psError(PS_ERR_UNKNOWN,true,"myST->alphaP is %f, should be %f",
+                myST->alphaP, expectedAlphaP);
+        return 3;
+    }
+    if (ERROR_TOL < fabs(expectedPhiP - myST->phiP)) {
+        psError(PS_ERR_UNKNOWN,true,"myST->phiP is %f, should be %f",
+                myST->phiP, expectedPhiP);
+        return 4;
+    }
+    psFree(myST);
+    psFree(testDateTime);
+
+    expectedCosDeltaP = EXPECT_COS_DELTAP_2100;
+    expectedSinDeltaP = EXPECT_SIN_DELTAP_2100;
+
+    // Set test date time to 1/1/2100 00:00:00
+    testDateTime = psTimeFromMJD(MJD_2100);
+
+    // Invoke function to set psSphereTransforma objec
+    myST = psSphereTransformICRSToEcliptic(testDateTime);
+
+    // Verify expected values for the specified time
+    if (ERROR_TOL < fabs(expectedSinDeltaP - myST->sinDeltaP)) {
+        psError(PS_ERR_UNKNOWN,true,"myST->sinDeltaP is %f, should be %f",
+                myST->sinDeltaP, expectedSinDeltaP);
+        return 5;
+    }
+    if (ERROR_TOL < fabs(expectedCosDeltaP - myST->cosDeltaP)) {
+        psError(PS_ERR_UNKNOWN,true,"myST->cosDeltaP is %f, should be %f",
+                myST->cosDeltaP, expectedCosDeltaP);
+        return 6;
+    }
+    if (ERROR_TOL < fabs(expectedAlphaP - myST->alphaP)) {
+        psError(PS_ERR_UNKNOWN,true,"myST->alphaP is %f, should be %f",
+                myST->alphaP, expectedAlphaP);
+        return 7;
+    }
+    if (ERROR_TOL < fabs(expectedPhiP - myST->phiP)) {
+        psError(PS_ERR_UNKNOWN,true,"myST->phiP is %f, should be %f",
+                myST->phiP, expectedPhiP);
+        return 8;
+    }
+    psFree(myST);
+    psFree(testDateTime);
+
+    // Verify if argument psTime is NULL, function returns NULL and error message generated
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message");
+    myST = psSphereTransformICRSToEcliptic(NULL);
+    if (myST != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"psSphereTransformICRSToEcliptic() did not return NULL.");
+        return 9;
+    }
+
+    // Verify if argument psTime is less than 1900, function return NULL and error msg generated
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message");
+    testDateTime = psTimeFromMJD(MJD_1900 - 1.0);
+    myST = psSphereTransformICRSToEcliptic(testDateTime);
+    if (myST != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"psSphereTransformICRSToEcliptic() did not return NULL.");
+        return 10;
+    }
+    psFree(testDateTime);
+
+    return 0;
+}
+
+
+psS32 testSphereTransformEclipticToICRS( void )
+{
+    psF64  expectedPhiP = 0.0;
+    psF64  expectedAlphaP = 0.0;
+    psF64  expectedCosDeltaP = EXPECT_COS_DELTAP_2000;
+    psF64  expectedSinDeltaP = -EXPECT_SIN_DELTAP_2000;
+
+    // Set test date time to 1/1/2000 00:00:00
+    psTime* testDateTime = psTimeFromMJD(MJD_2000);
+
+    // Invoke function to set psSphereTransforma object
+    psSphereTransform *myST = psSphereTransformEclipticToICRS(testDateTime);
+
+    // Verify expected values for the specified time
+    if (ERROR_TOL < fabs(expectedSinDeltaP - myST->sinDeltaP)) {
+        psError(PS_ERR_UNKNOWN,true,"myST->sinDeltaP is %f, should be %f",
+                myST->sinDeltaP, expectedSinDeltaP);
+        return 1;
+    }
+    if (ERROR_TOL < fabs(expectedCosDeltaP - myST->cosDeltaP)) {
+        psError(PS_ERR_UNKNOWN,true,"myST->cosDeltaP is %f, should be %f",
+                myST->cosDeltaP, expectedCosDeltaP);
+        return 2;
+    }
+    if (ERROR_TOL < fabs(expectedAlphaP - myST->alphaP)) {
+        psError(PS_ERR_UNKNOWN,true,"myST->alphaP is %f, should be %f",
+                myST->alphaP, expectedAlphaP);
+        return 3;
+    }
+    if (ERROR_TOL < fabs(expectedPhiP - myST->phiP)) {
+        psError(PS_ERR_UNKNOWN,true,"myST->phiP is %f, should be %f",
+                myST->phiP, expectedPhiP);
+        return 4;
+    }
+    psFree(myST);
+    psFree(testDateTime);
+
+    expectedCosDeltaP = EXPECT_COS_DELTAP_2100;
+    expectedSinDeltaP = -EXPECT_SIN_DELTAP_2100;
+
+    // Set test date time to 1/1/2100 00:00:00
+    testDateTime = psTimeFromMJD(MJD_2100);
+
+    // Invoke function to set psSphereTransforma objec
+    myST = psSphereTransformEclipticToICRS(testDateTime);
+
+    // Verify expected values for the specified time
+    if (ERROR_TOL < fabs(expectedSinDeltaP - myST->sinDeltaP)) {
+        psError(PS_ERR_UNKNOWN,true,"myST->sinDeltaP is %f, should be %f",
+                myST->sinDeltaP, expectedSinDeltaP);
+        return 5;
+    }
+    if (ERROR_TOL < fabs(expectedCosDeltaP - myST->cosDeltaP)) {
+        psError(PS_ERR_UNKNOWN,true,"myST->cosDeltaP is %f, should be %f",
+                myST->cosDeltaP, expectedCosDeltaP);
+        return 6;
+    }
+    if (ERROR_TOL < fabs(expectedAlphaP - myST->alphaP)) {
+        psError(PS_ERR_UNKNOWN,true,"myST->alphaP is %f, should be %f",
+                myST->alphaP, expectedAlphaP);
+        return 7;
+    }
+    if (ERROR_TOL < fabs(expectedPhiP - myST->phiP)) {
+        psError(PS_ERR_UNKNOWN,true,"myST->phiP is %f, should be %f",
+                myST->phiP, expectedPhiP);
+        return 8;
+    }
+    psFree(myST);
+    psFree(testDateTime);
+
+    // Verify if argument psTime is NULL, function returns NULL and error message generated
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message");
+    myST = psSphereTransformEclipticToICRS(NULL);
+    if (myST != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"psSphereTransformEclipticICRS() did not return NULL.");
+        return 9;
+    }
+
+    // Verify if argument psTime is less than 1900, function return NULL and error msg generated
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message");
+    testDateTime = psTimeFromMJD(MJD_1900 - 1.0);
+    myST = psSphereTransformEclipticToICRS(testDateTime);
+    if (myST != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"psSphereTransformEclipticToICRS() did not return NULL.");
+        return 10;
+    }
+    psFree(testDateTime);
+
+    return 0;
+}
+
+#define ITG_EXPECT_ALPHAP      4.93683
+#define ITG_EXPECT_SINDELTAP   0.88999
+#define ITG_EXPECT_COSDELTAP   0.45598
+#define ITG_EXPECT_PHIP        0.57477
+
+psS32 testSphereTransformICRSToGalactic( void )
+{
+    // Invoke function
+    psSphereTransform *myST = psSphereTransformICRSToGalactic();
+
+    // Verify did not return NULL
+    if(myST == NULL) {
+        psError(PS_ERR_UNKNOWN,true,"psSphereTransformICRSToGalactic returned NULL");
+        return 1;
+    }
+    // Verify returned structure has members set properly
+    if (ERROR_TOL < fabs(ITG_EXPECT_SINDELTAP - myST->sinDeltaP)) {
+        psError(PS_ERR_UNKNOWN,true,"myST->sinDeltaP is %f, should be %f",
+                myST->sinDeltaP, ITG_EXPECT_SINDELTAP);
+        return 2;
+    }
+    if (ERROR_TOL < fabs(ITG_EXPECT_COSDELTAP - myST->cosDeltaP)) {
+        psError(PS_ERR_UNKNOWN,true,"myST->cosDeltaP is %f, should be %f",
+                myST->cosDeltaP, ITG_EXPECT_COSDELTAP);
+        return 3;
+    }
+    if (ERROR_TOL < fabs(ITG_EXPECT_ALPHAP - myST->alphaP)) {
+        psError(PS_ERR_UNKNOWN,true,"myST->alphaP is %f, should be %f",
+                myST->alphaP, ITG_EXPECT_ALPHAP);
+        return 4;
+    }
+    if (ERROR_TOL < fabs(ITG_EXPECT_PHIP - myST->phiP)) {
+        psError(PS_ERR_UNKNOWN,true,"myST->phiP is %f, should be %f",
+                myST->phiP, ITG_EXPECT_PHIP);
+        return 5;
+    }
+    // Free data structure created
+    psFree(myST);
+
+    return 0;
+}
+
+#define GTI_EXPECT_PHIP        4.93683
+#define GTI_EXPECT_SINDELTAP  -0.88999
+#define GTI_EXPECT_COSDELTAP   0.45598
+#define GTI_EXPECT_ALPHAP      0.57477
+
+psS32 testSphereTransformGalacticToICRS( void )
+{
+    // Invoke function
+    psSphereTransform *myST = psSphereTransformGalacticToICRS();
+
+    // Verify did not return NULL
+    if(myST == NULL) {
+        psError(PS_ERR_UNKNOWN,true,"psSphereTransformGalacticToICRS returned NULL");
+        return 1;
+    }
+    // Verify returned structure has members set properly
+    if (ERROR_TOL < fabs(GTI_EXPECT_SINDELTAP - myST->sinDeltaP)) {
+        psError(PS_ERR_UNKNOWN,true,"myST->sinDeltaP is %f, should be %f",
+                myST->sinDeltaP, GTI_EXPECT_SINDELTAP);
+        return 2;
+    }
+    if (ERROR_TOL < fabs(GTI_EXPECT_COSDELTAP - myST->cosDeltaP)) {
+        psError(PS_ERR_UNKNOWN,true,"myST->cosDeltaP is %f, should be %f",
+                myST->cosDeltaP, GTI_EXPECT_COSDELTAP);
+        return 3;
+    }
+    if (ERROR_TOL < fabs(GTI_EXPECT_ALPHAP - myST->alphaP)) {
+        psError(PS_ERR_UNKNOWN,true,"myST->alphaP is %f, should be %f",
+                myST->alphaP, GTI_EXPECT_ALPHAP);
+        return 4;
+    }
+    if (ERROR_TOL < fabs(GTI_EXPECT_PHIP - myST->phiP)) {
+        psError(PS_ERR_UNKNOWN,true,"myST->phiP is %f, should be %f",
+                myST->phiP, GTI_EXPECT_PHIP);
+        return 5;
+    }
+    // Free data structure created
+    psFree(myST);
+
+    return 0;
+}
+
Index: /tags/ipp-1-X/bug123/psLib/test/astronomy/tst_psCoord01.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/astronomy/tst_psCoord01.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/astronomy/tst_psCoord01.c	(revision 22331)
@@ -0,0 +1,917 @@
+/**  @file  tst_psCoord01.c
+*
+*    @brief  The code will test several functions with PSLib source file
+*            psCoord.c
+*
+*    @author Eric Van Alst, MHPCC
+*
+*    @version $Revision: 1.4 $ $Name: not supported by cvs2svn $
+*    @date  $Date: 2005-04-07 20:27:41 $
+*
+*    Copyright 2005 Maui High Performance Computing Center, Univ. of Hawaii
+*/
+
+#include "pslib_strict.h"
+#include "psTest.h"
+
+static psS32 testProjectionAlloc(void);
+static psS32 testProjectTan(void);
+static psS32 testDeprojectTan(void);
+static psS32 testProjectSin(void);
+static psS32 testDeprojectSin(void);
+static psS32 testProjectAit(void);
+static psS32 testDeprojectAit(void);
+static psS32 testProjectPar(void);
+static psS32 testDeprojectPar(void);
+static psS32 testProjectFail(void);
+static psS32 testDeprojectFail(void);
+static psS32 testSetOffsetSphere(void);
+static psS32 testSetOffsetLinear(void);
+static psS32 testGetOffsetSphere(void);
+static psS32 testGetOffsetLinear(void);
+
+testDescription tests[] = {
+                              {testProjectionAlloc, 833, "psProjectionAlloc",0,false},
+                              {testProjectTan, 834, "psProject(TAN)",0,false},
+                              {testDeprojectTan, 835, "psDeproject(TAN)",0,false},
+                              {testProjectSin, 834, "psProject(SIN)",0,false},
+                              {testDeprojectSin, 835, "psDeproject(SIN)",0,false},
+                              {testProjectAit, 834, "psProject(AIT)",0,false},
+                              {testDeprojectAit, 835, "psDeproject(AIT)",0,false},
+                              {testProjectPar, 834, "psProject(PAR)",0,false},
+                              {testDeprojectPar, 835, "psDeproject(PAR)",0,false},
+                              {testProjectFail, 834, "psProject",0,false},
+                              {testDeprojectFail, 835, "psProject",0,false},
+                              {testSetOffsetSphere, 0000, "psSphereSetOffset",0,false},
+                              {testSetOffsetLinear, 0000, "psSphereSetOffset",0,false},
+                              {testGetOffsetSphere, 0000, "psSphereGetOffset",0,false},
+                              {testGetOffsetLinear, 0000, "psSphereGetOffset",0,false},
+                              {NULL}
+                          };
+
+
+#define ERROR_TOL    0.0001
+#define TESTPOINTS   4
+#define DEG_INC   30.0
+
+#define MY_TINY 0.0001
+#define PS_COMPARE_TINY_THEN_PRINT_ERROR(ACTUAL, EXPECT, TESTSTATUS) \
+if (MY_TINY < fabs(EXPECT - ACTUAL)) { \
+    psError(PS_ERR_UNKNOWN,true,"%s is %lg, should be %lg", #ACTUAL, ACTUAL, EXPECT, TESTSTATUS); \
+    return TESTSTATUS; \
+}
+
+
+//  alpha, delta, alpha-center, delta-center, scale-x, scale-y
+psF64 projectionTestPoint[TESTPOINTS][6] = {
+            {  0.785398,  0.785398,  0.000000,  0.000000,  1.000000,  1.000000 },
+            {  0.100000,  1.500000,  0.500000,  0.250000,  1.000000,  1.000000 },
+            {  0.628319,  0.448799,  0.000000,  0.000000,  0.250000,  0.750000 },
+            { -1.047196,  0.222222, -0.250000,  0.000000,  1.500000,  1.250000 }
+        };
+
+// Expected values for TAN
+psF64 projectionTanExpected[TESTPOINTS][2] = {
+            { -1.000000, -1.414214 },
+            {  0.088884, -3.066567 },
+            { -0.181636, -0.446444 },
+            {  1.535818, -0.404231 }
+        };
+
+// Expected values for SIN
+psF64 projectionSinExpected[TESTPOINTS][2] = {
+            { -0.500000, -0.707101 },
+            {  0.027546, -0.950366 },
+            { -0.132394, -0.325413 },
+            {  1.046712, -0.275497 }
+        };
+
+// Expected values for AIT
+psF64 projectionAitExpected[TESTPOINTS][2] = {
+            { -0.549175,  0.523375 },
+            {  0.027895,  0.313807 },
+            { -0.162822,  0.607646 },
+            {  1.455312,  0.955388 }
+        };
+
+// Expected values for PAR
+psF64 projectionParExpected[TESTPOINTS][2] = {
+            { -0.541244,  0.545532 },
+            {  0.027703,  0.329366 },
+            { -0.157157,  0.633550 },
+            {  1.432951,  0.971372 }
+        };
+
+// Testpoints, offset and expected values for psSphereSetOffset test
+#define TESTPOINTS_OFFSET  4
+psF64 setOffsetTestpoint[TESTPOINTS_OFFSET][2] = {
+            { 0.50,  0.50 },
+            {-0.50,  0.50 },
+            { 0.00,  0.00 },
+            { 1.50, -0.10 }
+        };
+
+psF64 setOffsetOffset[TESTPOINTS_OFFSET][2] = {
+            { 0.190761, -0.272205 },
+            {-0.553049, -0.460926 },
+            { 0.100335,-14.172222 },
+            {14.172222, -0.100335 }
+        };
+
+psF64 setOffsetResult[TESTPOINTS_OFFSET][2] = {
+            { 0.25,  0.75 },
+            { 0.20,  0.80 },
+            {-0.10,  1.50 },
+            { 0.00,  0.00 }
+        };
+
+psF64 getOffsetTestpoint1[TESTPOINTS_OFFSET][2] = {
+            { 0.00,  0.00 },
+            {-0.25,  0.50 },
+            { 0.50, -0.25 },
+            { 0.25, -0.10 }
+        };
+
+psF64 getOffsetTestpoint2[TESTPOINTS_OFFSET][2] = {
+            { 0.75,  0.25 },
+            { 0.40, -0.60 },
+            { 1.50,  0.50 },
+            { 0.10,  0.75 }
+        };
+
+psF64 getOffsetResult[TESTPOINTS_OFFSET][2] = {
+            { -0.931596, -0.348976 },
+            { -1.632830,  2.649629 },
+            { -2.166795, -1.707211 },
+            {  0.167752, -1.151351 }
+        };
+
+
+psS32 main( psS32 argc, char* argv[] )
+{
+    psLogSetLevel( PS_LOG_INFO );
+
+    return ( !runTestSuite(stderr,"psCoord",tests,argc,argv) );
+}
+
+psS32 testProjectionAlloc(void)
+{
+    // Allocate new psProjection structure
+    psProjection*  myProjection = psProjectionAlloc(1.1, 2.2, 3.3, 4.4, PS_PROJ_AIT);
+
+    // Verify NULL is not returned
+    if(myProjection == NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Unexpected return of NULL");
+        return 1;
+    }
+    // Verify the members are set correctly
+    if(myProjection->R != 1.1) {
+        psError(PS_ERR_UNKNOWN,true,"R member set to %lg, but expected %lg",
+                myProjection->R, 1.1);
+        return 2;
+    }
+    if(myProjection->D != 2.2) {
+        psError(PS_ERR_UNKNOWN,true,"D member set to %lg, but expected %lg",
+                myProjection->D, 2.2);
+        return 3;
+    }
+    if(myProjection->Xs != 3.3) {
+        psError(PS_ERR_UNKNOWN,true,"Xs member set to %lg, but expected %lg",
+                myProjection->Xs, 3.3);
+        return 4;
+    }
+    if(myProjection->Ys != 4.4) {
+        psError(PS_ERR_UNKNOWN,true,"Ys member set to %lg, but expected %lg",
+                myProjection->Ys, 4.4);
+        return 5;
+    }
+    if(myProjection->type != PS_PROJ_AIT) {
+        psError(PS_ERR_UNKNOWN,true,"type member set to %d, but expected %d",
+                myProjection->type, PS_PROJ_AIT);
+        return 6;
+    }
+
+    // Free projection
+    psFree(myProjection);
+
+    return 0;
+}
+
+psS32 testProjectTan(void)
+{
+    psPlane*       out = NULL;
+    psSphere*      in = psSphereAlloc();
+    psProjection*  myProjection = psProjectionAlloc(0.0,0.0,1.0,1.0,PS_PROJ_TAN);
+
+    // Perform projecton on various test points
+    for(psS32 i = 0; i < TESTPOINTS; i++) {
+
+        // Initialize input and project members
+        in->r = projectionTestPoint[i][0];
+        in->d = projectionTestPoint[i][1];
+        myProjection->R = projectionTestPoint[i][2];
+        myProjection->D = projectionTestPoint[i][3];
+        myProjection->Xs = projectionTestPoint[i][4];
+        myProjection->Ys = projectionTestPoint[i][5];
+
+        // Perform projection
+        out = psProject(in, myProjection);
+
+        // Verify output not NULL
+        if(out == NULL) {
+            psError(PS_ERR_UNKNOWN,true,"Return null not expected");
+            return i*10;
+        }
+
+        // Verify output is as expected
+        if(fabs(out->x - projectionTanExpected[i][0]) > ERROR_TOL) {
+            psError(PS_ERR_UNKNOWN,true,"Testpoint %d  psPlane->x = %lg  expected %lg",
+                    i,out->x, projectionTanExpected[i][0]);
+            return i*10+1;
+        }
+        if(fabs(out->y - projectionTanExpected[i][1]) > ERROR_TOL) {
+            psError(PS_ERR_UNKNOWN,true,"Testpoint % d  psPlane->y = %lg  expected %lg",
+                    i,out->y, projectionTanExpected[i][1]);
+            return i*10+2;
+        }
+        psFree(out);
+    }
+
+    psFree(in);
+    psFree(myProjection);
+
+    return 0;
+}
+
+psS32 testDeprojectTan(void)
+{
+    psSphere*       out = NULL;
+    psPlane*        in = psPlaneAlloc();
+    psProjection*   myProjection = psProjectionAlloc(0.0,0.0,1.0,1.0,PS_PROJ_TAN);
+
+    // Perform deprojection on various test points
+    for(psS32 i = 0; i < TESTPOINTS; i++) {
+
+        // Initialize input and projection members
+        in->x = projectionTanExpected[i][0];
+        in->y = projectionTanExpected[i][1];
+        myProjection->R = projectionTestPoint[i][2];
+        myProjection->D = projectionTestPoint[i][3];
+        myProjection->Xs = projectionTestPoint[i][4];
+        myProjection->Ys = projectionTestPoint[i][5];
+
+        // Perform deprojection
+        out = psDeproject(in, myProjection);
+
+        // Verify output is not NULL
+        if(out == NULL) {
+            psError(PS_ERR_UNKNOWN,true,"Return null not expected");
+            return 20*i;
+        }
+
+        // Verify output is as expected
+        if(fabs(out->r - projectionTestPoint[i][0]) > ERROR_TOL) {
+            psError(PS_ERR_UNKNOWN,true,"Testpoint %d  psSphere->r = %lg  expected %lg",
+                    i,out->r,projectionTestPoint[i][0]);
+            return 20*i + 1;
+        }
+        if(fabs(out->d - projectionTestPoint[i][1]) > ERROR_TOL) {
+            psError(PS_ERR_UNKNOWN,true,"Testpoint %d  psSphere->d = %lg expected %lg",
+                    i, out->d, projectionTestPoint[i][1]);
+            return 20*i + 2;
+        }
+        psFree(out);
+    }
+
+    psFree(in);
+    psFree(myProjection);
+
+    return 0;
+}
+
+psS32 testProjectSin(void)
+{
+    psPlane*       out = NULL;
+    psSphere*      in = psSphereAlloc();
+    psProjection*  myProjection = psProjectionAlloc(0.0,0.0,1.0,1.0,PS_PROJ_SIN);
+
+    // Perform projecton on various test points
+    for(psS32 i = 0; i < TESTPOINTS; i++) {
+
+        // Initialize input and project members
+        in->r = projectionTestPoint[i][0];
+        in->d = projectionTestPoint[i][1];
+        myProjection->R = projectionTestPoint[i][2];
+        myProjection->D = projectionTestPoint[i][3];
+        myProjection->Xs = projectionTestPoint[i][4];
+        myProjection->Ys = projectionTestPoint[i][5];
+
+        // Perform projection
+        out = psProject(in, myProjection);
+
+        // Verify output not NULL
+        if(out == NULL) {
+            psError(PS_ERR_UNKNOWN,true,"Return null not expected");
+            return i*10;
+        }
+
+        // Verify output is as expected
+        if(fabs(out->x - projectionSinExpected[i][0]) > ERROR_TOL) {
+            psError(PS_ERR_UNKNOWN,true,"Testpoint %d  psPlane->x = %lg  expected %lg",
+                    i,out->x, projectionSinExpected[i][0]);
+            return i*10+1;
+        }
+        if(fabs(out->y - projectionSinExpected[i][1]) > ERROR_TOL) {
+            psError(PS_ERR_UNKNOWN,true,"Testpoint % d  psPlane->y = %lg  expected %lg",
+                    i,out->y, projectionSinExpected[i][1]);
+            return i*10+2;
+        }
+        psFree(out);
+    }
+
+    psFree(in);
+    psFree(myProjection);
+
+    return 0;
+}
+
+psS32 testDeprojectSin(void)
+{
+    psSphere*       out = NULL;
+    psPlane*        in = psPlaneAlloc();
+    psProjection*   myProjection = psProjectionAlloc(0.0,0.0,1.0,1.0,PS_PROJ_SIN);
+
+    // Perform deprojection on various test points
+    for(psS32 i = 0; i < TESTPOINTS; i++) {
+
+        // Initialize input and projection members
+        in->x = projectionSinExpected[i][0];
+        in->y = projectionSinExpected[i][1];
+        myProjection->R = projectionTestPoint[i][2];
+        myProjection->D = projectionTestPoint[i][3];
+        myProjection->Xs = projectionTestPoint[i][4];
+        myProjection->Ys = projectionTestPoint[i][5];
+
+        // Perform deprojection
+        out = psDeproject(in, myProjection);
+
+        // Verify output is not NULL
+        if(out == NULL) {
+            psError(PS_ERR_UNKNOWN,true,"Return null not expected");
+            return 20*i;
+        }
+
+        // Verify output is as expected
+        if(fabs(out->r - projectionTestPoint[i][0]) > ERROR_TOL) {
+            psError(PS_ERR_UNKNOWN,true,"Testpoint %d  psSphere->r = %lg  expected %lg",
+                    i,out->r,projectionTestPoint[i][0]);
+            return 20*i + 1;
+        }
+        if(fabs(out->d - projectionTestPoint[i][1]) > ERROR_TOL) {
+            psError(PS_ERR_UNKNOWN,true,"Testpoint %d  psSphere->d = %lg expected %lg",
+                    i, out->d, projectionTestPoint[i][1]);
+            return 20*i + 2;
+        }
+        psFree(out);
+    }
+
+    psFree(in);
+    psFree(myProjection);
+
+    return 0;
+}
+
+psS32 testProjectAit(void)
+{
+    psPlane*       out = NULL;
+    psSphere*      in = psSphereAlloc();
+    psProjection*  myProjection = psProjectionAlloc(0.0,0.0,1.0,1.0,PS_PROJ_AIT);
+
+    // Perform projecton on various test points
+    for(psS32 i = 0; i < TESTPOINTS; i++) {
+
+        // Initialize input and project members
+        in->r = projectionTestPoint[i][0];
+        in->d = projectionTestPoint[i][1];
+        myProjection->R = projectionTestPoint[i][2];
+        myProjection->D = projectionTestPoint[i][3];
+        myProjection->Xs = projectionTestPoint[i][4];
+        myProjection->Ys = projectionTestPoint[i][5];
+
+        // Perform projection
+        out = psProject(in, myProjection);
+
+        // Verify output not NULL
+        if(out == NULL) {
+            psError(PS_ERR_UNKNOWN,true,"Return null not expected");
+            return i*10;
+        }
+
+        // Verify output is as expected
+        if(fabs(out->x - projectionAitExpected[i][0]) > ERROR_TOL) {
+            psError(PS_ERR_UNKNOWN,true,"Testpoint %d  psPlane->x = %lg  expected %lg",
+                    i,out->x, projectionAitExpected[i][0]);
+            return i*10+1;
+        }
+        if(fabs(out->y - projectionAitExpected[i][1]) > ERROR_TOL) {
+            psError(PS_ERR_UNKNOWN,true,"Testpoint % d  psPlane->y = %lg  expected %lg",
+                    i,out->y, projectionAitExpected[i][1]);
+            return i*10+2;
+        }
+        psFree(out);
+    }
+
+    psFree(in);
+    psFree(myProjection);
+
+    return 0;
+}
+
+psS32 testDeprojectAit(void)
+{
+    psSphere*       out = NULL;
+    psPlane*        in = psPlaneAlloc();
+    psProjection*   myProjection = psProjectionAlloc(0.0,0.0,1.0,1.0,PS_PROJ_AIT);
+
+    // Perform deprojection on various test points
+    for(psS32 i = 0; i < TESTPOINTS; i++) {
+
+        // Initialize input and projection members
+        in->x = projectionAitExpected[i][0];
+        in->y = projectionAitExpected[i][1];
+        myProjection->R = projectionTestPoint[i][2];
+        myProjection->D = projectionTestPoint[i][3];
+        myProjection->Xs = projectionTestPoint[i][4];
+        myProjection->Ys = projectionTestPoint[i][5];
+
+        // Perform deprojection
+        out = psDeproject(in, myProjection);
+
+        // Verify output is not NULL
+        if(out == NULL) {
+            psError(PS_ERR_UNKNOWN,true,"Return null not expected");
+            return 20*i;
+        }
+
+        // Verify output is as expected
+        if(fabs(out->r - projectionTestPoint[i][0]) > ERROR_TOL) {
+            psError(PS_ERR_UNKNOWN,true,"Testpoint %d  psSphere->r = %lg  expected %lg",
+                    i,out->r,projectionTestPoint[i][0]);
+            return 20*i + 1;
+        }
+        if(fabs(out->d - projectionTestPoint[i][1]) > ERROR_TOL) {
+            psError(PS_ERR_UNKNOWN,true,"Testpoint %d  psSphere->d = %lg expected %lg",
+                    i, out->d, projectionTestPoint[i][1]);
+            return 20*i + 2;
+        }
+        psFree(out);
+    }
+
+    psFree(in);
+    psFree(myProjection);
+
+    return 0;
+}
+
+psS32 testProjectPar(void)
+{
+    psPlane*       out = NULL;
+    psSphere*      in = psSphereAlloc();
+    psProjection*  myProjection = psProjectionAlloc(0.0,0.0,1.0,1.0,PS_PROJ_PAR);
+
+    // Perform projecton on various test points
+    for(psS32 i = 0; i < TESTPOINTS; i++) {
+
+        // Initialize input and project members
+        in->r = projectionTestPoint[i][0];
+        in->d = projectionTestPoint[i][1];
+        myProjection->R = projectionTestPoint[i][2];
+        myProjection->D = projectionTestPoint[i][3];
+        myProjection->Xs = projectionTestPoint[i][4];
+        myProjection->Ys = projectionTestPoint[i][5];
+
+        // Perform projection
+        out = psProject(in, myProjection);
+
+        // Verify output not NULL
+        if(out == NULL) {
+            psError(PS_ERR_UNKNOWN,true,"Return null not expected");
+            return i*10;
+        }
+
+        // Verify output is as expected
+        if(fabs(out->x - projectionParExpected[i][0]) > ERROR_TOL) {
+            psError(PS_ERR_UNKNOWN,true,"Testpoint %d  psPlane->x = %lg  expected %lg",
+                    i,out->x, projectionParExpected[i][0]);
+            return i*10+1;
+        }
+        if(fabs(out->y - projectionParExpected[i][1]) > ERROR_TOL) {
+            psError(PS_ERR_UNKNOWN,true,"Testpoint % d  psPlane->y = %lg  expected %lg",
+                    i,out->y, projectionParExpected[i][1]);
+            return i*10+2;
+        }
+        psFree(out);
+    }
+
+    psFree(in);
+    psFree(myProjection);
+
+    return 0;
+}
+
+psS32 testDeprojectPar(void)
+{
+    psSphere*       out = NULL;
+    psPlane*        in = psPlaneAlloc();
+    psProjection*   myProjection = psProjectionAlloc(0.0,0.0,1.0,1.0,PS_PROJ_PAR);
+
+    // Perform deprojection on various test points
+    for(psS32 i = 0; i < TESTPOINTS; i++) {
+
+        // Initialize input and projection members
+        in->x = projectionParExpected[i][0];
+        in->y = projectionParExpected[i][1];
+        myProjection->R = projectionTestPoint[i][2];
+        myProjection->D = projectionTestPoint[i][3];
+        myProjection->Xs = projectionTestPoint[i][4];
+        myProjection->Ys = projectionTestPoint[i][5];
+
+        // Perform deprojection
+        out = psDeproject(in, myProjection);
+
+        // Verify output is not NULL
+        if(out == NULL) {
+            psError(PS_ERR_UNKNOWN,true,"Return null not expected");
+            return 20*i;
+        }
+
+        // Verify output is as expected
+        if(fabs(out->r - projectionTestPoint[i][0]) > ERROR_TOL) {
+            psError(PS_ERR_UNKNOWN,true,"Testpoint %d  psSphere->r = %lg  expected %lg",
+                    i,out->r,projectionTestPoint[i][0]);
+            return 20*i + 1;
+        }
+        if(fabs(out->d - projectionTestPoint[i][1]) > ERROR_TOL) {
+            psError(PS_ERR_UNKNOWN,true,"Testpoint %d  psSphere->d = %lg expected %lg",
+                    i, out->d, projectionTestPoint[i][1]);
+            return 20*i + 2;
+        }
+        psFree(out);
+    }
+
+    psFree(in);
+    psFree(myProjection);
+
+    return 0;
+}
+
+psS32 testProjectFail(void)
+{
+    psPlane*       out          = NULL;
+    psProjection*  myProjection = psProjectionAlloc(0.0,0.0,1.0,1.0,PS_PROJ_TAN);
+    psSphere*      in           = psSphereAlloc();
+
+    // Invoke function with null coordinate argument
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message for null coord arg");
+    out = psProject(NULL, myProjection);
+    if(out != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Did not return null as expected");
+        return 1;
+    }
+
+    // Invoke function with null projection argument
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message for null projection arg");
+    out = psProject(in, NULL);
+    if(out != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Did not return null as expected");
+        return 2;
+    }
+
+    // Invoke function with invalid projection type
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message for invalid projection type");
+    myProjection->type = PS_PROJ_NTYPE;
+    out = psProject(in,myProjection);
+    if(out != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Did not return null as expected");
+        return 3;
+    }
+
+    psFree(myProjection);
+    psFree(in);
+
+    return 0;
+}
+
+psS32 testDeprojectFail(void)
+{
+    psSphere*      out          = NULL;
+    psProjection*  myProjection = psProjectionAlloc(0.0,0.0,1.0,1.0,PS_PROJ_TAN);
+    psPlane*       in           = psPlaneAlloc();
+
+    // Invoke function with null coordinate argument
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message for null coord arg");
+    out = psDeproject(NULL, myProjection);
+    if(out != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Did not return null as expected");
+        return 1;
+    }
+
+    // Invoke function with null projection argument
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message for null projection arg");
+    out = psDeproject(in, NULL);
+    if(out != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Did not return null as expected");
+        return 2;
+    }
+
+    // Invoke function with invalid projection type
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message for invalid projection type");
+    myProjection->type = PS_PROJ_NTYPE;
+    out = psDeproject(in,myProjection);
+    if(out != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Did not return null as expected");
+        return 3;
+    }
+
+    psFree(myProjection);
+    psFree(in);
+
+    return 0;
+}
+
+psS32 testSetOffsetSphere( void )
+{
+    psSphere* position1 = psSphereAlloc();
+    psSphere* position2 = NULL;
+    psSphere* offset    = psSphereAlloc();
+    psSphere* tmpOffset = psSphereAlloc();
+
+    // Initialize first position
+    position1->r = DEG_TO_RAD(90.0);
+    position1->d = DEG_TO_RAD(45.0);
+    position1->rErr = 0.0;
+    position1->dErr = 0.0;
+
+    //  Using various offset verify spherical offset
+    //  Use all the valid unit types
+    for (psF64 r = 0.0; r < 180.0; r += DEG_INC) {
+        for (psF64 d = 0.0; d < 90.0; d += DEG_INC) {
+
+            offset->r = DEG_TO_RAD(r);
+            offset->d = DEG_TO_RAD(d);
+            offset->rErr = 0.0;
+            offset->dErr = 0.0;
+
+            position2 = psSphereSetOffset(position1, offset, PS_SPHERICAL, PS_RADIAN);
+            PS_COMPARE_TINY_THEN_PRINT_ERROR(position2->r, (position1->r + offset->r), 1);
+            PS_COMPARE_TINY_THEN_PRINT_ERROR(position2->d, (position1->d + offset->d), 2);
+            psFree(position2);
+
+            tmpOffset->r = RAD_TO_DEG(offset->r);
+            tmpOffset->d = RAD_TO_DEG(offset->d);
+            tmpOffset->rErr = 0.0;
+            tmpOffset->dErr = 0.0;
+            position2 = psSphereSetOffset(position1, tmpOffset, PS_SPHERICAL, PS_DEGREE);
+            PS_COMPARE_TINY_THEN_PRINT_ERROR(position2->r, (position1->r + offset->r), 3);
+            PS_COMPARE_TINY_THEN_PRINT_ERROR(position2->d, (position1->d + offset->d), 4);
+            psFree(position2);
+
+            tmpOffset->r = RAD_TO_MIN(offset->r);
+            tmpOffset->d = RAD_TO_MIN(offset->d);
+            tmpOffset->rErr = 0.0;
+            tmpOffset->dErr = 0.0;
+            position2 = psSphereSetOffset(position1, tmpOffset, PS_SPHERICAL, PS_ARCMIN);
+            PS_COMPARE_TINY_THEN_PRINT_ERROR(position2->r, (position1->r + offset->r), 5);
+            PS_COMPARE_TINY_THEN_PRINT_ERROR(position2->d, (position1->d + offset->d), 6);
+            psFree(position2);
+
+            tmpOffset->r = RAD_TO_SEC(offset->r);
+            tmpOffset->d = RAD_TO_SEC(offset->d);
+            tmpOffset->rErr = 0.0;
+            tmpOffset->dErr = 0.0;
+            position2 = psSphereSetOffset(position1, tmpOffset, PS_SPHERICAL, PS_ARCSEC);
+            PS_COMPARE_TINY_THEN_PRINT_ERROR(position2->r, (position1->r + offset->r), 7);
+            PS_COMPARE_TINY_THEN_PRINT_ERROR(position2->d, (position1->d + offset->d), 8);
+            psFree(position2);
+        }
+    }
+
+    // Attempt to call function with null input coordinate
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate error message null input coord");
+    position2 = psSphereSetOffset(NULL, offset, PS_LINEAR, PS_ARCSEC);
+    if (position2 != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Did not return NULL");
+        return 30;
+    }
+
+    // Attempt to call function with null offset
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate error message null offset");
+    position2 = psSphereSetOffset(position1, NULL, PS_LINEAR, PS_ARCSEC);
+    if (position2 != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Did not return NULL");
+        return 31;
+    }
+
+    // Attempt to call function with invalid mode
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate error message invalid mode");
+    position2 = psSphereSetOffset(position1, offset, 0x54321, 0);
+    if (position2 != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Did not return NULL");
+        return 32;
+    }
+
+    // Attempt to call function with invalid unit
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message invalid unit");
+    position2 = psSphereSetOffset(position1, offset, PS_SPHERICAL, 0x54321);
+    if (position2 != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Did not return NULL");
+        return 33;
+    }
+
+    psFree(position1);
+    psFree(offset);
+    psFree(tmpOffset);
+
+    return 0;
+}
+
+psS32 testSetOffsetLinear(void)
+{
+    psSphere*   coord = psSphereAlloc();
+    psSphere*   offset = psSphereAlloc();
+    psSphere*   out = NULL;
+
+    for(psS32 i = 0; i < TESTPOINTS_OFFSET; i++) {
+
+        coord->r = setOffsetTestpoint[i][0];
+        coord->d = setOffsetTestpoint[i][1];
+
+        offset->r = setOffsetOffset[i][0];
+        offset->d = setOffsetOffset[i][1];
+
+        out = psSphereSetOffset(coord, offset, PS_LINEAR, PS_RADIAN);
+
+        if(fabs(out->r - setOffsetResult[i][0]) > ERROR_TOL) {
+            psError(PS_ERR_UNKNOWN,true,"Testpoint %d: Result out->r = %lg not equal to expected %lg",
+                    i, out->r, setOffsetResult[i][0]);
+            return i*10;
+        }
+        if(fabs(out->d - setOffsetResult[i][1]) > ERROR_TOL) {
+            psError(PS_ERR_UNKNOWN,true,"Testpoint %d: Result out->d = %lg not equal to expected %lg",
+                    i,out->d, setOffsetResult[i][1]);
+            return i*10+1;
+        }
+
+        psFree(out);
+    }
+
+    psFree(coord);
+    psFree(offset);
+
+    return 0;
+}
+
+psS32 testGetOffsetSphere( void )
+{
+    psSphere* position1 = psSphereAlloc();
+    psSphere* position2 = psSphereAlloc();
+    psSphere *offset = NULL;
+
+    position1->r = DEG_TO_RAD(90.0);
+    position1->d = DEG_TO_RAD(45.0);
+    position1->rErr = 0.0;
+    position1->dErr = 0.0;
+
+    for (psF64 r = 0.0; r < 180.0;r += DEG_INC) {
+        for (psF64 d = 0.0;d < 90.0; d += DEG_INC) {
+            position2->r = DEG_TO_RAD(r);
+            position2->d = DEG_TO_RAD(d);
+            position2->rErr = 0.0;
+            position2->dErr = 0.0;
+
+            offset = psSphereGetOffset( position1,  position2,
+                                        PS_SPHERICAL, PS_RADIAN);
+            PS_COMPARE_TINY_THEN_PRINT_ERROR(offset->r, (position2->r - position1->r), 1);
+            PS_COMPARE_TINY_THEN_PRINT_ERROR(offset->d, (position2->d - position1->d), 1);
+            psFree(offset);
+
+            offset = psSphereGetOffset( position1, position2,
+                                        PS_SPHERICAL, PS_DEGREE);
+            offset->r = DEG_TO_RAD(offset->r);
+            offset->d = DEG_TO_RAD(offset->d);
+            PS_COMPARE_TINY_THEN_PRINT_ERROR(offset->r, (position2->r - position1->r), 2);
+            PS_COMPARE_TINY_THEN_PRINT_ERROR(offset->d, (position2->d - position1->d), 3);
+            psFree(offset);
+
+            offset = psSphereGetOffset( position1,  position2,
+                                        PS_SPHERICAL, PS_ARCMIN);
+            offset->r = MIN_TO_RAD(offset->r);
+            offset->d = MIN_TO_RAD(offset->d);
+            PS_COMPARE_TINY_THEN_PRINT_ERROR(offset->r, (position2->r - position1->r), 2);
+            PS_COMPARE_TINY_THEN_PRINT_ERROR(offset->d, (position2->d - position1->d), 3);
+            psFree(offset);
+
+            offset = psSphereGetOffset( position1,  position2,
+                                        PS_SPHERICAL, PS_ARCSEC);
+            offset->r = SEC_TO_RAD(offset->r);
+            offset->d = SEC_TO_RAD(offset->d);
+            PS_COMPARE_TINY_THEN_PRINT_ERROR(offset->r, (position2->r - position1->r), 2);
+            PS_COMPARE_TINY_THEN_PRINT_ERROR(offset->d, (position2->d - position1->d), 3);
+            psFree(offset);
+        }
+    }
+
+    // Attempt to invoke function with null position 1 parameter
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message for null position");
+    offset = psSphereGetOffset(NULL, position2, PS_LINEAR, 0);
+    if (offset != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Did not return NULL as expected");
+        return 10;
+    }
+
+    // Attempt to invoke function with null position 2 parameter
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message for null position");
+    offset = psSphereGetOffset(position1, NULL, PS_LINEAR, 0);
+    if (offset != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Did not return NULL as expected");
+        return 11;
+    }
+
+    // Attempt to invoke function with invalid mode
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message for invalid mode");
+    offset = psSphereGetOffset(position1, position2, 0x54321, 0);
+    if (offset != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Did not return NULL as expected");
+        return 12;
+    }
+
+    // Attempt to invoke function with invalid unit type
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message for invalid unit type");
+    offset = psSphereGetOffset(position1, position2, PS_SPHERICAL, 0x54321);
+    if (offset != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Did not return NULL as expected");
+        return 13;
+    }
+
+    // Attempt to invoke function with coordinate 1 declination value 90.0 degree
+    position1->d = DEG_TO_RAD(90.0);
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate warning message");
+    offset = psSphereGetOffset(position1, position2, PS_SPHERICAL, PS_RADIAN);
+    if (offset != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Did not return NULL as expected");
+        return 14;
+    }
+
+    // Attempt to invoke function with coordinate 2 declination value 90.0 degree
+    position1->d = DEG_TO_RAD(45.0);
+    position2->d = DEG_TO_RAD(90.0);
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate warning message");
+    offset = psSphereGetOffset(position1, position2, PS_SPHERICAL, PS_RADIAN);
+    if (offset != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Did not return NULL as expected");
+        return 15;
+    }
+
+    psFree(position1);
+    psFree(position2);
+
+    return 0;
+}
+
+psS32 testGetOffsetLinear(void)
+{
+    psSphere*   coord1 = psSphereAlloc();
+    psSphere*   coord2 = psSphereAlloc();
+    psSphere*   out = NULL;
+
+    for(psS32 i = 0; i < TESTPOINTS_OFFSET; i++) {
+
+        coord1->r = getOffsetTestpoint1[i][0];
+        coord1->d = getOffsetTestpoint1[i][1];
+
+        coord2->r = getOffsetTestpoint2[i][0];
+        coord2->d = getOffsetTestpoint2[i][1];
+
+        out = psSphereGetOffset(coord1, coord2, PS_LINEAR, PS_RADIAN);
+
+        if(fabs(out->r - getOffsetResult[i][0]) > ERROR_TOL) {
+            psError(PS_ERR_UNKNOWN,true,"Testpoint %d: Result out->r = %lg not equal to expected %lg",
+                    i, out->r, getOffsetResult[i][0]);
+            return i*10;
+        }
+        if(fabs(out->d - getOffsetResult[i][1]) > ERROR_TOL) {
+            psError(PS_ERR_UNKNOWN,true,"Testpoint %d: Result out->d = %lg not equal to expected %lg",
+                    i,out->d, getOffsetResult[i][1]);
+            return i*10+1;
+        }
+
+        psFree(out);
+    }
+
+    psFree(coord1);
+    psFree(coord2);
+
+    return 0;
+}
+
+
Index: /tags/ipp-1-X/bug123/psLib/test/astronomy/tst_psTime_01.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/astronomy/tst_psTime_01.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/astronomy/tst_psTime_01.c	(revision 22331)
@@ -0,0 +1,231 @@
+/** @file  tst_psTime_01.c
+ *
+ *  @brief Test driver for psTime functions
+ *
+ *  This test driver contains the following tests for psTime:
+ *     A) Get current TAI time
+ *     B) Print test time
+ *     C) Convert psTime to ISO time
+ *     D) Convert ISO time to psTime
+ *     E) Convert psTime to UTC time
+ *     F) Convert UTC time to psTime
+ *     G) Convert psTime to MJD time
+ *     H) Convert MJD time to psTime
+ *     I) Convert psTime to JD time
+ *     J) Convert JD time to psTime
+ *     K) Convert psTime to timeval time
+ *     L) Convert timeval time to psTime
+ *     M) Convert psTime to tm time
+ *     N) Convert tm time to psTime
+ *     O) Convert psTime time to LMST
+ *     P) Free data
+ *
+ *  @author  Ross Harman, MHPCC
+ *
+ *  @version $Revision: 1.25 $  $Name: not supported by cvs2svn $
+ *  @date  $Date: 2005-04-19 02:13:53 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ *
+ */
+
+#include <string.h>
+#include "pslib_strict.h"
+#include "psTest.h"
+
+psS32 main(psS32 argc, char* argv[])
+{
+    psTime *testTime;
+    char *testString = "2004-07-21T18:22:24.272Z";
+
+    psLibInit(true,"psTime.config");
+
+    // Test time was taken at July 21, 2004 at 18:22:24.272044
+    testTime = (psTime*)psAlloc(sizeof(psTime));
+    testTime->sec = 1090434144;
+    testTime->nsec = 272044000;
+    testTime->type = PS_TIME_TAI;
+
+    // Test A - Get current TAI time
+    printPositiveTestHeader(stdout,"psTime", "Get current TAI time");
+    psTime *timeA = NULL;
+    timeA = psTimeGetNow(PS_TIME_TAI);
+    psFree(timeA);
+    printFooter(stdout, "psTime", "Get current TAI time", true);
+
+
+    // Test B - Print test time
+    printPositiveTestHeader(stdout,"psTime", "Print test time");
+    printf("Test time: Seconds = %lld Nanoseconds = %u\n",
+           (long long int)testTime->sec,
+           testTime->nsec);
+    printFooter(stdout, "psTime", "Print test time", true);
+
+
+    // Test C - Convert psTime to ISO time
+    printPositiveTestHeader(stdout,"psTime", "Convert psTime to ISO time");
+    char *isoString;
+    isoString = psTimeToISO(testTime);
+    printf("%s\n", isoString);
+    if(strncmp(isoString, testString, 256)) {
+        printf("ERROR - ISO string incorrect\n");
+        printf("Returned: %s\n", isoString);
+    }
+    printFooter(stdout, "psTime", "Convert psTime to ISO time", true);
+
+
+    // Test D - Convert ISO time to psTime
+    printPositiveTestHeader(stdout,"psTime", "Convert ISO time to psTime");
+    psTime *timeD = NULL;
+    timeD = psTimeFromISO(isoString);
+    printf("psTime: Seconds = %lld Nanoseconds = %u\n",
+           (long long int)timeD->sec,
+           timeD->nsec);
+    psFree(isoString);
+    psFree(timeD);
+    printFooter(stdout, "psTime", "Convert ISO time to psTime", true);
+
+
+    // Test E - Convert TAI to UTC time
+    printPositiveTestHeader(stdout,"psTime", "Convert psTime time to UTC time");
+    psTime *timeE = NULL;
+    timeE = (psTime*)psAlloc(sizeof(psTime));
+    timeE->sec = 1090434144;
+    timeE->nsec = 272044000;
+    timeE->type = PS_TIME_TAI;
+    timeE = psTimeConvert(timeE, PS_TIME_UTC);
+    psFree(timeE);
+    printf("psTime: Seconds = %lld Nanoseconds = %u\n",
+           (long long int)timeE->sec,
+           timeE->nsec);
+    printFooter(stdout, "psTime", "Convert psTime time to UTC time", true);
+
+
+    // Test F - Convert UTC time to psTime
+    printPositiveTestHeader(stdout,"psTime", "Convert UTC time to psTime");
+    psTime *timeF = NULL;
+    timeF = (psTime*)psAlloc(sizeof(psTime));
+    timeF->sec = 1090434112;
+    timeF->nsec = 272044000;
+    timeF->type = PS_TIME_UTC;
+    timeF = psTimeConvert(timeF, PS_TIME_TAI);
+    psFree(timeF);
+    printf("psTime: Seconds = %lld Nanoseconds = %u\n",
+           (long long int)timeF->sec,
+           timeF->nsec);
+    printFooter(stdout, "psTime", "Convert UTC time to psTime", true);
+
+
+    // Test G - Convert psTime to MJD time
+    printPositiveTestHeader(stdout,"psTime", "Convert psTime to MJD time");
+    double mjdTime = 0.0;
+    mjdTime = psTimeToMJD(testTime);
+    printf("MJD = %f\n", mjdTime);
+    printFooter(stdout, "psTime", "Convert psTime to MJD time", true);
+
+
+    // Test H - Convert MJD time to psTime
+    printPositiveTestHeader(stdout,"psTime", "Convert MJD time to psTime");
+    psTime *timeH = NULL;
+    timeH = psTimeFromMJD(mjdTime);
+    printf("psTime: Seconds = %lld Nanoseconds = %u\n",
+           (long long int)timeH->sec,
+           timeH->nsec);
+    psFree(timeH);
+    printFooter(stdout, "psTime", "Convert MJD time to psTime", true);
+
+
+    // Test I - Convert psTime to JD time
+    printPositiveTestHeader(stdout,"psTime", "Convert psTime to JD time");
+    double jdTime = 0.0;
+    jdTime = psTimeToJD(testTime);
+    printf("JD = %f\n", jdTime);
+    printFooter(stdout, "psTime", "Convert psTime to JD time", true);
+
+
+    // Test J - Convert JD time to psTime
+    printPositiveTestHeader(stdout,"psTime", "Convert JD time to psTime");
+    psTime *timeJ = NULL;
+    timeJ = psTimeFromJD(jdTime);
+    printf("psTime: Seconds = %lld Nanoseconds = %u\n",
+           (long long int)timeJ->sec,
+           timeJ->nsec);
+    psFree(timeJ);
+    printFooter(stdout, "psTime", "Convert JD time to psTime", true);
+
+
+    // Test K - Convert psTime to timeval time
+    printPositiveTestHeader(stdout,"psTime", "Convert psTime to timeval time");
+    struct timeval timevalTime;
+    timevalTime = psTimeToTimeval(testTime);
+    printf("timevalTime: Seconds = %lld Microseconds = %lld\n",
+           (long long int)timevalTime.tv_sec,
+           (long long int)timevalTime.tv_usec);
+    printFooter(stdout, "psTime", "Convert psTime to timeval time", true);
+
+
+    // Test L - Convert timeval time to psTime
+    printPositiveTestHeader(stdout,"psTime", "Convert timeval time to psTime");
+    psTime *timeL = NULL;
+    timeL = psTimeFromTimeval(&timevalTime);
+    printf("psTime: Seconds = %lld Nanoseconds = %u\n",
+           (long long int)timeL->sec,
+           timeL->nsec);
+    psFree(timeL);
+    printFooter(stdout, "psTime", "Convert timeval time to psTime", true);
+
+
+    // Test M - Convert psTime to tm time
+    printPositiveTestHeader(stdout,"psTime", "Convert psTime to tm time");
+    struct tm *tmTime;
+    tmTime = psTimeToTM(testTime);
+    printf("tmTime:\n");
+    printf("tmTime->tm_year = %d\n", tmTime->tm_year);
+    printf("tmTime->tm_mon = %d\n", tmTime->tm_mon);
+    printf("tmTime->tm_mday = %d\n", tmTime->tm_mday);
+    printf("tmTime->tm_hour = %d\n", tmTime->tm_hour);
+    printf("tmTime->tm_min = %d\n", tmTime->tm_min);
+    printf("tmTime->tm_sec = %d\n", tmTime->tm_sec);
+    printFooter(stdout, "psTime", "Convert psTime to tm time", true);
+
+
+    // Test N - Convert tm time to psTime
+    printPositiveTestHeader(stdout, "psTime", "Convert tm time to psTime");
+    psTime *timeN = NULL;
+    timeN = psTimeFromTM(tmTime);
+    printf("psTime: Seconds = %lld Nanoseconds = %u\n",
+           (long long int)timeN->sec,
+           timeN->nsec);
+    psFree(timeN);
+    psFree(tmTime);
+    printFooter(stdout, "psTime", "Convert tm time to psTime", true);
+
+
+    // Test O - psTime to LMST
+    printPositiveTestHeader(stdout, "psTime", "Convert psTime time to LST");
+    char *testString2 = "2004-09-10T1:00:00.00Z";
+    psTime* testTime2 = NULL;
+    testTime2 = psTimeFromISO(testString2);
+    double dblTime = psTimeToLMST(testTime2, 1);
+    printf("LST (rad): %lf\n", dblTime);
+    psFree(testTime2);
+    printFooter(stdout, "psTime", "Convert psTime time to LST", true);
+
+
+    // Test P - Free data
+    printPositiveTestHeader(stdout, "psMetadata", "Test P - Free data");
+    psFree(testTime);
+    psLibFinalize();
+    if( psMemCheckLeaks(0, NULL, stdout,false) != 0 ) {
+        psError(PS_ERR_UNKNOWN,true,"Memory leaks detected");
+        return 10;
+    }
+    psMemCheckCorruption(0);
+    psS32 nBad = psMemCheckCorruption(0);
+    if(nBad) {
+        printf("ERROR: Found %d bad memory blocks\n", nBad);
+    }
+    printFooter(stdout, "psMetadata", "Test P - Free data", true);
+
+    return 0;
+}
Index: /tags/ipp-1-X/bug123/psLib/test/astronomy/tst_psTime_02.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/astronomy/tst_psTime_02.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/astronomy/tst_psTime_02.c	(revision 22331)
@@ -0,0 +1,56 @@
+/** @file  tst_psTime_02.c
+ *
+ *  @brief Test driver for psTime functions
+ *
+ *  This test driver contains the following tests for psTime:
+ *     A) Incorrect ISO time data
+ *     B) Attempt to use null timeval
+ *     C) Free data
+ *
+ *  @author  Ross Harman, MHPCC
+ *
+ *  @version $Revision: 1.11 $  $Name: not supported by cvs2svn $
+ *  @date  $Date: 2005-04-18 23:30:54 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ *
+ */
+
+#include "pslib_strict.h"
+#include "psTest.h"
+
+psS32 main(psS32 argc, char* argv[])
+{
+
+    // Test A - Incorrect ISO time data
+    printNegativeTestHeader(stdout,"psTime", "Incorrect ISO time data", "Time not allowed", 0);
+    psTimeFromISO("2004-99-21T18:22:24.272Z");
+    psTimeFromISO("2004-07-99T18:22:24.272Z");
+    psTimeFromISO("2004-07-21T99:22:24.272Z");
+    psTimeFromISO("2004-07-21T18:99:24.272Z");
+    psTimeFromISO("2004-07-21T18:22:99.272Z");
+    psTimeFromISO("2004-07-21T18:22:24.-999Z");
+    printFooter(stdout, "psTime", "Incorrect ISO time data", true);
+
+
+    // Test B - Attempt to use null timeval
+    printNegativeTestHeader(stdout,"psTime", "Attempt to use null timeval", "Null value for timeval arg not allowed", 0);
+    psTimeFromTimeval(NULL);
+    printFooter(stdout, "psTime", "Attempt to use null timeval", true);
+
+
+    // Test C - Free data
+    printPositiveTestHeader(stdout, "psTime", "Test C - Free data");
+    if ( psMemCheckLeaks(0, NULL, stdout,false) != 0) {
+        psError(PS_ERR_UNKNOWN,true,"Memory leaks detected");
+        return 10;
+    }
+    psMemCheckCorruption(0);
+    psS32 nBad = psMemCheckCorruption(0);
+    if(nBad) {
+        printf("ERROR: Found %d bad memory blocks\n", nBad);
+    }
+    printFooter(stdout, "psTime", "Test C - Free data", true);
+
+    return 0;
+}
Index: /tags/ipp-1-X/bug123/psLib/test/astronomy/tst_psTime_03.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/astronomy/tst_psTime_03.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/astronomy/tst_psTime_03.c	(revision 22331)
@@ -0,0 +1,218 @@
+
+/** @file  tst_psTime_03.c
+ *
+ *  @brief Test driver for psTime functions
+ *
+ *  This test driver contains the following tests for psTime:
+ *
+ *   Test A - Add two times
+ *   Test B - Add two times with overflow in microseconds
+ *   Test C - Subtact two times
+ *   Test D - Subtact two times with underflow in microseconds
+ *   Test E - Delta two times
+ *   Test F - Delta two times with underflow in microseconds
+ *   Test G - Add two times across leapsecond boundary
+ *   Test H - Find number of leapseconds added between two times
+ *   Test H1 - Verify error message to invalid time type in psTimeAlloc
+ *   Test G - Free data
+ *
+ *  @author  Ross Harman, MHPCC
+ *
+ *  @version $Revision: 1.16 $  $Name: not supported by cvs2svn $
+ *  @date  $Date: 2005-04-19 02:13:53 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ *
+ */
+
+#include "pslib_strict.h"
+#include "psTest.h"
+
+#define PRINT_TIME(TEXT,TIME) \
+printf("%s Seconds = %lld Nanoseconds = %u\n", TEXT, (long long int)TIME->sec, TIME->nsec);
+
+psS32 main(psS32 argc, char* argv[])
+{
+
+    psLibInit(true,"psTime.config");
+
+    // Test A - Add two times
+    printPositiveTestHeader(stdout, "psTime", "Test A - Add two times");
+    psTime *time1a = NULL;
+    psF64 time1b = 1.111111;
+    psTime *timeOut1 = NULL;
+    time1a = psTimeAlloc(PS_TIME_TAI);
+    time1a->sec  = 1;
+    time1a->nsec = 111111000;
+    timeOut1 = psTimeMath(time1a, time1b);
+    if(timeOut1->sec!=2 && timeOut1->nsec!=222222000) {
+        printf("ERROR: Incorrect time, %lld:%u. Expected 2:222222000\n",(long long int)timeOut1->sec, timeOut1->nsec);
+    }
+    printFooter(stdout, "psTime", "Test A - Add two times", true);
+
+
+    // Test B - Add two times with overflow in nanoseconds
+    printPositiveTestHeader(stdout, "psTime", "Test B - Add two times with overflow in microseconds");
+    psTime *time2a = NULL;
+    psF64 time2b = 5.500001;
+    psTime *timeOut2 = NULL;
+    time2a = psTimeAlloc(PS_TIME_TAI);
+    time2a->sec  = 6;
+    time2a->nsec = 600001000;
+    timeOut2 = psTimeMath(time2a, time2b);
+    if(timeOut2->sec!=12 && timeOut2->nsec!=100002000) {
+        printf("ERROR: Incorrect time, %lld:%u. Expected 12:100002000\n",(long long int)timeOut2->sec, timeOut2->nsec);
+    }
+    printFooter(stdout, "psTime", "Test B - Add two times with overflow in microseconds", true);
+
+
+    // Test C - Subtact two times
+    printPositiveTestHeader(stdout, "psTime", "Test C - Subtract two times");
+    psTime *time3a = NULL;
+    psF64 time3b = -1.111111;
+    psTime *timeOut3 = NULL;
+    time3a = psTimeAlloc(PS_TIME_TAI);
+    time3a->sec  = 3;
+    time3a->nsec = 333333000;
+    timeOut3 = psTimeMath(time3a, time3b);
+    if(timeOut3->sec!=2 && timeOut3->nsec!=222222000) {
+        printf("ERROR: Incorrect time, %lld:%u. Expected 2:222222000\n",(long long int)timeOut3->sec, timeOut3->nsec);
+    }
+    printFooter(stdout, "psTime", "Test C - Subtract two times", true);
+
+
+    // Test D - Subtact two times with underflow in nanoseconds
+    printPositiveTestHeader(stdout, "psTime", "Test D - Subtact two times with underflow in nanoseconds");
+    psTime *time4a = NULL;
+    psF64 time4b = -2.000003;
+    psTime *timeOut4 = NULL;
+    time4a = psTimeAlloc(PS_TIME_TAI);
+    time4a->sec  = 5;
+    time4a->nsec = 1000;
+    timeOut4 = psTimeMath(time4a, time4b);
+    if(timeOut4->sec!=2 && timeOut4->nsec!=999997000) {
+        printf("ERROR: Incorrect time, %lld:%u. Expected 2:999997000\n",(long long int)timeOut4->sec, timeOut4->nsec);
+    }
+    printFooter(stdout, "psTime", "Test D - Subtact two times with underflow in nanoseconds", true);
+
+
+    // Test E - Delta two times
+    printPositiveTestHeader(stdout, "psTime", "Test E - Delta two times");
+    psTime *time5a = NULL;
+    psTime *time5b = NULL;
+    psF64 timeOut5 = 0.0;
+    time5a = psTimeAlloc(PS_TIME_TAI);
+    time5b = psTimeAlloc(PS_TIME_TAI);
+    time5a->sec  = 8;
+    time5a->nsec = 8000;
+    time5b->sec  = 7;
+    time5b->nsec = 7000;
+    timeOut5 = psTimeDelta(time5a, time5b);
+    if(fabs(timeOut5-1.000001) > FLT_EPSILON) {
+        printf("ERROR: Incorrect delta, %lf. Expected -1.000001\n", timeOut5);
+    }
+    printFooter(stdout, "psTime", "Test E - Delta two times", true);
+
+
+    // Test F - Delta two times with underflow in microseconds
+    printPositiveTestHeader(stdout, "psTime", "Test F - Delta two times with underflow in microseconds");
+    psTime *time6a = NULL;
+    psTime *time6b = NULL;
+    psF64 timeOut6 = 0.0;
+    time6a = psTimeAlloc(PS_TIME_TAI);
+    time6b = psTimeAlloc(PS_TIME_TAI);
+    time6a->sec  = 8;
+    time6a->nsec = 1000;
+    time6b->sec  = 7;
+    time6b->nsec = 7000;
+    timeOut6 = psTimeDelta(time6a, time6b);
+    if(fabs(timeOut6-0.999994) > FLT_EPSILON) {
+        printf("ERROR: Incorrect delta, %lf. Expected 0.999994\n", timeOut6);
+    }
+    printFooter(stdout, "psTime", "Test F - Delta two times with underflow in microseconds", true);
+
+    // Test F1 - Delta two times in UTC type
+    printPositiveTestHeader(stdout,"psTime","Test F1 - Delta two UTC times");
+    psTime *time20a = NULL;
+    psTime *time20b = NULL;
+    psF64 timeOut20 = 0.0;
+    time20a = psTimeAlloc(PS_TIME_UTC);
+    time20b = psTimeAlloc(PS_TIME_UTC);
+    time20a->sec = 1090434113;
+    time20a->nsec = 272044000;
+    time20b->sec = 1090434112;
+    time20b->nsec = 272044000;
+    timeOut20 = psTimeDelta(time20a, time20b);
+    if(fabs(timeOut20-1.000000000) > FLT_EPSILON) {
+        printf("ERROR: Incorrect delta, %lf. Expected -1.00000\n",timeOut20);
+    }
+    printFooter(stdout,"psTime","Test F1 - Delta two UTC times",true);
+
+    // Test G - Add two times across leapsecond boundary
+    printPositiveTestHeader(stdout, "psTime", "Test G - Add two times across leapsecond boundary");
+    psF64 time7b = 30.0;
+    char *out7 = NULL;
+    psTime *time7a = NULL;
+    psTime *timeOut7 = NULL;
+    time7a = psTimeFromISO("1998-12-31T23:59:45.00");
+    time7a->type = PS_TIME_UTC;
+    timeOut7 = psTimeMath(time7a, time7b);
+    out7 = psTimeToISO(timeOut7);
+    printf("%s\n", out7);
+    printFooter(stdout, "psTime", "Test G - Add two times across leapsecond boundary", true);
+
+
+    // Test H - Find number of leapseconds added between two times
+    printPositiveTestHeader(stdout, "psTime", "Test H - Find number of leapseconds added between two times");
+    psS64 out = 0.0;
+    psTime *time8a = NULL;
+    psTime *time8b = NULL;
+    time8a = psTimeFromISO("2004-12-18T1:00:00.00");
+    time8b = psTimeFromISO("1972-1-1T1:00:00.00");
+    out = psTimeLeapSecondDelta(time8a, time8b);
+    printf("%lld\n", (long long int)out);
+    printFooter(stdout, "psTime", "Test H - Find number of leapseconds added between two times", true);
+
+    // Test H1 - Error in allocating time not UTC or TAI
+    printPositiveTestHeader(stdout,"psTime","Test H1 - Verify error message in allocating invalid time type");
+    psLogMsg(__func__,PS_LOG_INFO,"Invalid time type during allocation should generate error message");
+    psTime *time10 = psTimeAlloc(10);
+    if(time10 != NULL) {
+        printf("ERROR: returned time should be NULL\n");
+    }
+    printFooter(stdout,"psTime","Test H1 - Verify error message in allocating invalid time type",true);
+
+    // Test G - Free data
+    printPositiveTestHeader(stdout, "psTime", "Test I - Free data");
+    psLibFinalize();
+    psFree(time1a);
+    psFree(timeOut1);
+    psFree(time2a);
+    psFree(timeOut2);
+    psFree(time3a);
+    psFree(timeOut3);
+    psFree(time4a);
+    psFree(timeOut4);
+    psFree(time5a);
+    psFree(time5b);
+    psFree(time6a);
+    psFree(time6b);
+    psFree(out7);
+    psFree(time7a);
+    psFree(timeOut7);
+    psFree(time8a);
+    psFree(time8b);
+    psFree(time20a);
+    psFree(time20b);
+    if (psMemCheckLeaks(0, NULL, stdout,false)) {
+        psError(PS_ERR_UNKNOWN,true,"Memory leaks detected.");
+        return 10;
+    }
+    psMemCheckCorruption(0);
+    psS32 nBad = psMemCheckCorruption(0);
+    if(nBad) {
+        printf("ERROR: Found %d bad memory blocks\n", nBad);
+    }
+    printFooter(stdout, "psTime", "Test I - Free data", true);
+    return 0;
+}
Index: /tags/ipp-1-X/bug123/psLib/test/astronomy/tst_psTime_04.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/astronomy/tst_psTime_04.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/astronomy/tst_psTime_04.c	(revision 22331)
@@ -0,0 +1,92 @@
+/** @file  tst_psTime_04.c
+ *
+ *  @brief Test driver for psTime functions
+ *
+ *  This test driver contains the following tests for psTime:
+ *      Test A - Initialize time
+ *      Test B - Attempt to open non-existant time config file
+ *      Test C - Attempt to open non-existant time data files
+ *      Test D - Attempt to read incorrect number of files
+ *      Test E - Attempt to read incorrect number of from values
+ *      Test F - Attempt to read data file with typo in number
+ *      Test G - Free data
+ *
+ *  @author  Ross Harman, MHPCC
+ *
+ *  @version $Revision: 1.11 $  $Name: not supported by cvs2svn $
+ *  @date  $Date: 2005-04-07 20:27:41 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ *
+ */
+#include "config.h"
+
+#include "pslib_strict.h"
+#include "psTest.h"
+
+
+int main(int argc, char* argv[])
+{
+    // Test A - Initialize time
+    printPositiveTestHeader(stdout, "psTime", "Test A - Initialize time");
+    psLibInit(true, "psTime.config");
+    psLibFinalize();
+    printFooter(stdout, "psTime", "Test A - Initialize time", true);
+
+
+    // Test B - Attempt to open non-existant time config file
+    printNegativeTestHeader(stdout,"psTime", "Test B - Attempt to open non-existant time config file",
+                            "Failed to open file 'zzz'.  Check if it exists and it has the proper permissions.", 0);
+    psLibInit(true, "zzz");
+    printFooter(stdout, "psTime", "Test B - Attempt to open non-existant time config file", true);
+
+
+    // Test C - Attempt to open non-existant time data files
+    printNegativeTestHeader(stdout,"psTime", "Test C - Attempt to open non-existant time data files",
+                            "Failed to open file 'zzz'.  Check if it exists and it has the proper permissions.", 0);
+    psLibInit(true, "test.psTime.config1");
+    psLibFinalize();
+    printFooter(stdout, "psTime", "Test C - Attempt to open non-existant time data files", true);
+
+
+    // Test D - Attempt to read incorrect number of files
+    printNegativeTestHeader(stdout,"psTime", "Test D - Attempt to read incorrect number of files",
+                            "Incorrect number of table files entered. Found: 3. Expected: 4.", 0);
+    psLibInit(true, "test.psTime.config2");
+    psLibFinalize();
+    printFooter(stdout, "psTime", "Test D - Attempt to read incorrect number of files", true);
+
+
+    // Test E - Attempt to read incorrect number of from values
+    printNegativeTestHeader(stdout,"psTime", "Test E - Attempt to read incorrect number of from values",
+                            "Incorrect vector size. Size: 3, Expected 4.", 0);
+    psLibInit(true, "test.psTime.config3");
+    psLibFinalize();
+    printFooter(stdout, "psTime", "Test E - Attempt to read incorrect number of from values", true);
+
+
+    // Test F - Attempt to read data file with typo in number
+    printNegativeTestHeader(stdout,"psTime", "Test F - Attempt to read data file with typo in number",
+                            "Unable to parse string, number on line 16.", 0);
+    psLibInit(true, "test.psTime.config4");
+    psLibFinalize();
+    printFooter(stdout, "psTime", "Test F - Attempt to read data file with typo in number", true);
+
+
+    // Test G - Free data
+    printPositiveTestHeader(stdout, "psTime", "Test G - Free data");
+    psLibFinalize();
+    if( psMemCheckLeaks(0, NULL, stdout,false) != 0 ) {
+        psError(PS_ERR_UNKNOWN,true,"Memory leak detected.");
+        return 10;
+    }
+    psMemCheckCorruption(0);
+    int nBad = psMemCheckCorruption(0);
+    if(nBad) {
+        printf("ERROR: Found %d bad memory blocks\n", nBad);
+    }
+    printFooter(stdout, "psTime", "Test G - Free data", true);
+
+    return 0;
+}
+
Index: /tags/ipp-1-X/bug123/psLib/test/astronomy/verified/tst_psAstrometry.stderr
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/astronomy/verified/tst_psAstrometry.stderr	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/astronomy/verified/tst_psAstrometry.stderr	(revision 22331)
@@ -0,0 +1,54 @@
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psAstrometry.c                                         *
+*            TestPoint: psAstrometry{psExposureAlloc}                              *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psAstrometry{psExposureAlloc} | tst_psAstrometry.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psAstrometry.c                                         *
+*            TestPoint: psAstrometry{psObservatoryAlloc}                           *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psAstrometry{psObservatoryAlloc} | tst_psAstrometry.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psAstrometry.c                                         *
+*            TestPoint: psAstrometry{psFPAAlloc}                                   *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psAstrometry{psFPAAlloc} | tst_psAstrometry.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psAstrometry.c                                         *
+*            TestPoint: psAstrometry{psChipAlloc}                                  *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psAstrometry{psChipAlloc} | tst_psAstrometry.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psAstrometry.c                                         *
+*            TestPoint: psAstrometry{psCellAlloc}                                  *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psAstrometry{psCellAlloc} | tst_psAstrometry.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psAstrometry.c                                         *
+*            TestPoint: psAstrometry{psReadoutAlloc}                               *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psAstrometry{psReadoutAlloc} | tst_psAstrometry.c)
+
Index: /tags/ipp-1-X/bug123/psLib/test/astronomy/verified/tst_psAstrometry01.stderr
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/astronomy/verified/tst_psAstrometry01.stderr	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/astronomy/verified/tst_psAstrometry01.stderr	(revision 22331)
@@ -0,0 +1,70 @@
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psAstrometry01.c                                       *
+*            TestPoint: psAstrometry{Tests psFixedPatternAlloc()}                  *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psAstrometry{Tests psFixedPatternAlloc()} | tst_psAstrometry01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psAstrometry01.c                                       *
+*            TestPoint: psAstrometry{Tests psGrommitAlloc()}                       *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psAstrometry{Tests psGrommitAlloc()} | tst_psAstrometry01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psAstrometry01.c                                       *
+*            TestPoint: psAstrometry{MISC}                                         *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psAstrometry{MISC} | tst_psAstrometry01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psAstrometry01.c                                       *
+*            TestPoint: psAstrometry{psPlaneTransformCombine()}                    *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|E|psPlaneTransformCombine (FILE:LINENO)
+    Unallowable operation: trans1 is NULL.
+<DATE><TIME>|<HOST>|E|psPlaneTransformCombine (FILE:LINENO)
+    Unallowable operation: trans2 is NULL.
+
+---> TESTPOINT PASSED (psAstrometry{psPlaneTransformCombine()} | tst_psAstrometry01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psAstrometry01.c                                       *
+*            TestPoint: psAstrometry{psPlaneTransformFit()}                        *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|E|psPlaneTransformFit (FILE:LINENO)
+    Unallowable operation: trans is NULL.
+<DATE><TIME>|<HOST>|E|psPlaneTransformFit (FILE:LINENO)
+    Unallowable operation: source is NULL.
+<DATE><TIME>|<HOST>|E|psPlaneTransformFit (FILE:LINENO)
+    Unallowable operation: dest is NULL.
+
+---> TESTPOINT PASSED (psAstrometry{psPlaneTransformFit()} | tst_psAstrometry01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psAstrometry01.c                                       *
+*            TestPoint: psAstrometry{psPlaneTransformInvert()}                     *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|E|psPlaneTransformInvert (FILE:LINENO)
+    Unallowable operation: in is NULL.
+<DATE><TIME>|<HOST>|E|psPlaneTransformInvert (FILE:LINENO)
+    Unallowable operation: region is NULL.
+<DATE><TIME>|<HOST>|E|psPlaneTransformInvert (FILE:LINENO)
+    Error: (1 > nSamples) (1 0).
+
+---> TESTPOINT PASSED (psAstrometry{psPlaneTransformInvert()} | tst_psAstrometry01.c)
+
Index: /tags/ipp-1-X/bug123/psLib/test/astronomy/verified/tst_psAstrometry01.stdout
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/astronomy/verified/tst_psAstrometry01.stdout	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/astronomy/verified/tst_psAstrometry01.stdout	(revision 22331)
@@ -0,0 +1,67 @@
+grom->latitude is 1.29
+grom->sinLat is 0.96
+grom->cosLat is 0.28
+grom->abberationMag is 0.00
+grom->height is 3055.00
+grom->temperature is 7.00
+grom->pressure is 8.00
+grom->humidity is 20.00
+grom->wavelength is 11.00
+grom->lapseRate is 20.00
+grom->refractA is 0.00
+grom->refractB is -0.00
+grom->longitudeOffset is 2.36
+trans1: x = x+y, y = x+y
+-------------------- trans->x coeffs --------------------
+(0.0) (1.0) 
+(1.0) (0.0) 
+-------------------- trans->y coeffs --------------------
+(0.0) (1.0) 
+(1.0) (0.0) 
+trans2: x = x+y, y = x+y
+-------------------- trans->x coeffs --------------------
+(0.0) (1.0) 
+(1.0) (0.0) 
+-------------------- trans->y coeffs --------------------
+(0.0) (1.0) 
+(1.0) (0.0) 
+trans2: x = xy, y = xy
+-------------------- trans->x coeffs --------------------
+(0.0) (0.0) 
+(0.0) (1.0) 
+-------------------- trans->y coeffs --------------------
+(0.0) (0.0) 
+(0.0) (1.0) 
+----------------------------------------------------------------------------------
+Calling psPlaneTransformCombine with NULL trans1.  Should generate error and return NULL.
+----------------------------------------------------------------------------------
+Calling psPlaneTransformCombine with NULL trans2.  Should generate error and return NULL.
+----------------------------------------------------------------------------------
+Calling psPlaneTransformCombine with acceptable data.
+trans3: 
+-------------------- trans->x coeffs --------------------
+(0.0) (0.0) (1.0) (0.0) 
+(0.0) (2.0) (0.0) (0.0) 
+(1.0) (0.0) (0.0) (0.0) 
+(0.0) (0.0) (0.0) (0.0) 
+-------------------- trans->y coeffs --------------------
+(0.0) (0.0) (1.0) (0.0) 
+(0.0) (2.0) (0.0) (0.0) 
+(1.0) (0.0) (0.0) (0.0) 
+(0.0) (0.0) (0.0) (0.0) 
+----------------------------------------------------------------------------------
+Calling psPlaneTransformFit with NULL trans.  Should generate error and return NULL.
+----------------------------------------------------------------------------------
+Calling psPlaneTransformFit with NULL src psArray.  Should generate error and return NULL.
+----------------------------------------------------------------------------------
+Calling psPlaneTransformFit with NULL dst psArray.  Should generate error and return NULL.
+----------------------------------------------------------------------------------
+Calling psPlaneTransformFit with acceptable data.
+----------------------------------------------------------------------------------
+Calling psPlaneTransformInvert with NULL trans.  Should generate error and return NULL.
+----------------------------------------------------------------------------------
+Calling psPlaneTransformInvert with NULL psRegion.  Should generate error and return NULL.
+----------------------------------------------------------------------------------
+Calling psPlaneTransformInvert with zero nSamples.  Should generate error and return NULL.
+----------------------------------------------------------------------------------
+Calling psPlaneTransformInvert with acceptable data.
Index: /tags/ipp-1-X/bug123/psLib/test/astronomy/verified/tst_psCoord.stderr
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/astronomy/verified/tst_psCoord.stderr	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/astronomy/verified/tst_psCoord.stderr	(revision 22331)
@@ -0,0 +1,227 @@
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psCoord.c                                              *
+*            TestPoint: psCoord{psSphereTransformAlloc()}                          *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psCoord{psSphereTransformAlloc()} | tst_psCoord.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psCoord.c                                              *
+*            TestPoint: psCoord{psPlaneTransformAlloc()}                           *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|I|testPlaneTransformAlloc
+    Following should generate an error message: negative x terms
+<DATE><TIME>|<HOST>|E|psPlaneTransformAlloc (FILE:LINENO)
+    Error: n1 is less than 0.
+<DATE><TIME>|<HOST>|I|testPlaneTransformAlloc
+    Following should generate an error message: negative y terms
+<DATE><TIME>|<HOST>|E|psPlaneTransformAlloc (FILE:LINENO)
+    Error: n2 is less than 0.
+
+---> TESTPOINT PASSED (psCoord{psPlaneTransformAlloc()} | tst_psCoord.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psCoord.c                                              *
+*            TestPoint: psCoord{psPlaneDistortAlloc()}                             *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|I|testPlaneDistortAlloc
+    Following should generate an error message for negative x term
+<DATE><TIME>|<HOST>|E|psPlaneDistortAlloc (FILE:LINENO)
+    Error: n1 is less than 0.
+<DATE><TIME>|<HOST>|I|testPlaneDistortAlloc
+    Following should generate an error message for negative y term
+<DATE><TIME>|<HOST>|E|psPlaneDistortAlloc (FILE:LINENO)
+    Error: n2 is less than 0.
+<DATE><TIME>|<HOST>|I|testPlaneDistortAlloc
+    Following should generate an error message for negative z term
+<DATE><TIME>|<HOST>|E|psPlaneDistortAlloc (FILE:LINENO)
+    Error: n3 is less than 0.
+<DATE><TIME>|<HOST>|I|testPlaneDistortAlloc
+    Following should generate an error message for negative w term
+<DATE><TIME>|<HOST>|E|psPlaneDistortAlloc (FILE:LINENO)
+    Error: n4 is less than 0.
+
+---> TESTPOINT PASSED (psCoord{psPlaneDistortAlloc()} | tst_psCoord.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psCoord.c                                              *
+*            TestPoint: psCoord{psPlaneTransformApply()}                           *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|I|testPlaneTransformApply
+    Following should generate error message for NULL psPlaneTransform
+<DATE><TIME>|<HOST>|E|psPlaneTransformApply (FILE:LINENO)
+    Unallowable operation: transform is NULL.
+<DATE><TIME>|<HOST>|I|testPlaneTransformApply
+    Following should generate error message for NULL x coeff psPlaneTransform
+<DATE><TIME>|<HOST>|E|psPlaneTransformApply (FILE:LINENO)
+    Unallowable operation: transform->x is NULL.
+<DATE><TIME>|<HOST>|I|testPlaneTransformApply
+    Following should generate error message for NULL y coeff psPlaneTransform
+<DATE><TIME>|<HOST>|E|psPlaneTransformApply (FILE:LINENO)
+    Unallowable operation: transform->y is NULL.
+<DATE><TIME>|<HOST>|I|testPlaneTransformApply
+    Following should generate error message for NULL psPlane
+<DATE><TIME>|<HOST>|E|psPlaneTransformApply (FILE:LINENO)
+    Unallowable operation: coords is NULL.
+
+---> TESTPOINT PASSED (psCoord{psPlaneTransformApply()} | tst_psCoord.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psCoord.c                                              *
+*            TestPoint: psCoord{psPlaneDistortApply()}                             *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|I|testPlaneDistortApply
+    Following should generate an error message for null psPlaneDistort
+<DATE><TIME>|<HOST>|E|psPlaneDistortApply (FILE:LINENO)
+    Unallowable operation: transform is NULL.
+<DATE><TIME>|<HOST>|I|testPlaneDistortApply
+    Following should generate an error message for null x member psPlaneDistort
+<DATE><TIME>|<HOST>|E|psPlaneDistortApply (FILE:LINENO)
+    Unallowable operation: transform->x is NULL.
+<DATE><TIME>|<HOST>|I|testPlaneDistortApply
+    Following should generate an error message for null y member psPlaneDistort
+<DATE><TIME>|<HOST>|E|psPlaneDistortApply (FILE:LINENO)
+    Unallowable operation: transform->y is NULL.
+<DATE><TIME>|<HOST>|I|testPlaneDistortApply
+    Following should generate an error message for null input psPlane
+<DATE><TIME>|<HOST>|E|psPlaneDistortApply (FILE:LINENO)
+    Unallowable operation: coords is NULL.
+
+---> TESTPOINT PASSED (psCoord{psPlaneDistortApply()} | tst_psCoord.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psCoord.c                                              *
+*            TestPoint: psCoord{psSphereTransformApply()}                          *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|I|testSphereTransformApply1
+    Following should generate an error
+<DATE><TIME>|<HOST>|E|psSphereTransformApply (FILE:LINENO)
+    Unallowable operation: transform is NULL.
+<DATE><TIME>|<HOST>|I|testSphereTransformApply1
+    Following should generate an error
+<DATE><TIME>|<HOST>|E|psSphereTransformApply (FILE:LINENO)
+    Unallowable operation: coord is NULL.
+
+---> TESTPOINT PASSED (psCoord{psSphereTransformApply()} | tst_psCoord.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psCoord.c                                              *
+*            TestPoint: psCoord{psSphereTransformApply()}                          *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psCoord{psSphereTransformApply()} | tst_psCoord.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psCoord.c                                              *
+*            TestPoint: psCoord{psSphereTransformApply()}                          *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psCoord{psSphereTransformApply()} | tst_psCoord.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psCoord.c                                              *
+*            TestPoint: psCoord{psSphereTransformApply()}                          *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psCoord{psSphereTransformApply()} | tst_psCoord.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psCoord.c                                              *
+*            TestPoint: psCoord{psSphereTransformApply()}                          *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psCoord{psSphereTransformApply()} | tst_psCoord.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psCoord.c                                              *
+*            TestPoint: psCoord{psSphereTransformICRSToEcliptic()}                 *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|I|testSphereTransformICRSToEcliptic
+    Following should generate an error message
+<DATE><TIME>|<HOST>|E|psSphereTransformICRSToEcliptic (FILE:LINENO)
+    Unallowable operation: time is NULL.
+<DATE><TIME>|<HOST>|I|testSphereTransformICRSToEcliptic
+    Following should generate an error message
+<DATE><TIME>|<HOST>|E|psSphereTransformICRSToEcliptic (FILE:LINENO)
+    Specified time is less than 1900.
+
+---> TESTPOINT PASSED (psCoord{psSphereTransformICRSToEcliptic()} | tst_psCoord.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psCoord.c                                              *
+*            TestPoint: psCoord{psSphereTransformEclipticToICRS()}                 *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|I|testSphereTransformEclipticToICRS
+    Following should generate an error message
+<DATE><TIME>|<HOST>|E|psSphereTransformEclipticToICRS (FILE:LINENO)
+    Unallowable operation: time is NULL.
+<DATE><TIME>|<HOST>|I|testSphereTransformEclipticToICRS
+    Following should generate an error message
+<DATE><TIME>|<HOST>|E|psSphereTransformEclipticToICRS (FILE:LINENO)
+    Specified time is less than 1900.
+
+---> TESTPOINT PASSED (psCoord{psSphereTransformEclipticToICRS()} | tst_psCoord.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psCoord.c                                              *
+*            TestPoint: psCoord{psSphereTransformICRSToGalactic()}                 *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psCoord{psSphereTransformICRSToGalactic()} | tst_psCoord.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psCoord.c                                              *
+*            TestPoint: psCoord{psSphereTransformGalacticToICRS()}                 *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psCoord{psSphereTransformGalacticToICRS()} | tst_psCoord.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psCoord.c                                              *
+*            TestPoint: psCoord{psSphereTransformPrecess()}                        *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|I|testSphereTransformPrecess
+    Following should generate an error message
+<DATE><TIME>|<HOST>|E|psSpherePrecess (FILE:LINENO)
+    Unallowable operation: toTime is NULL.
+<DATE><TIME>|<HOST>|I|testSphereTransformPrecess
+    Following should generate an error message
+<DATE><TIME>|<HOST>|E|psSpherePrecess (FILE:LINENO)
+    Unallowable operation: fromTime is NULL.
+<DATE><TIME>|<HOST>|I|testSphereTransformPrecess
+    Following should generate an error message
+<DATE><TIME>|<HOST>|E|psSpherePrecess (FILE:LINENO)
+    Unallowable operation: coords is NULL.
+
+---> TESTPOINT PASSED (psCoord{psSphereTransformPrecess()} | tst_psCoord.c)
+
Index: /tags/ipp-1-X/bug123/psLib/test/astronomy/verified/tst_psCoord01.stderr
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/astronomy/verified/tst_psCoord01.stderr	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/astronomy/verified/tst_psCoord01.stderr	(revision 22331)
@@ -0,0 +1,199 @@
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psCoord01.c                                            *
+*            TestPoint: psCoord{psProjectionAlloc}                                 *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psCoord{psProjectionAlloc} | tst_psCoord01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psCoord01.c                                            *
+*            TestPoint: psCoord{psProject(TAN)}                                    *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psCoord{psProject(TAN)} | tst_psCoord01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psCoord01.c                                            *
+*            TestPoint: psCoord{psDeproject(TAN)}                                  *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psCoord{psDeproject(TAN)} | tst_psCoord01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psCoord01.c                                            *
+*            TestPoint: psCoord{psProject(SIN)}                                    *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psCoord{psProject(SIN)} | tst_psCoord01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psCoord01.c                                            *
+*            TestPoint: psCoord{psDeproject(SIN)}                                  *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psCoord{psDeproject(SIN)} | tst_psCoord01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psCoord01.c                                            *
+*            TestPoint: psCoord{psProject(AIT)}                                    *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psCoord{psProject(AIT)} | tst_psCoord01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psCoord01.c                                            *
+*            TestPoint: psCoord{psDeproject(AIT)}                                  *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psCoord{psDeproject(AIT)} | tst_psCoord01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psCoord01.c                                            *
+*            TestPoint: psCoord{psProject(PAR)}                                    *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psCoord{psProject(PAR)} | tst_psCoord01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psCoord01.c                                            *
+*            TestPoint: psCoord{psDeproject(PAR)}                                  *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psCoord{psDeproject(PAR)} | tst_psCoord01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psCoord01.c                                            *
+*            TestPoint: psCoord{psProject}                                         *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|I|testProjectFail
+    Following should generate an error message for null coord arg
+<DATE><TIME>|<HOST>|E|psProject (FILE:LINENO)
+    Unallowable operation: coord is NULL.
+<DATE><TIME>|<HOST>|I|testProjectFail
+    Following should generate an error message for null projection arg
+<DATE><TIME>|<HOST>|E|psProject (FILE:LINENO)
+    Unallowable operation: projection is NULL.
+<DATE><TIME>|<HOST>|I|testProjectFail
+    Following should generate an error message for invalid projection type
+<DATE><TIME>|<HOST>|E|psProject (FILE:LINENO)
+    The projection type, 4, is unknown.
+
+---> TESTPOINT PASSED (psCoord{psProject} | tst_psCoord01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psCoord01.c                                            *
+*            TestPoint: psCoord{psProject}                                         *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|I|testDeprojectFail
+    Following should generate an error message for null coord arg
+<DATE><TIME>|<HOST>|E|psDeproject (FILE:LINENO)
+    Unallowable operation: coord is NULL.
+<DATE><TIME>|<HOST>|I|testDeprojectFail
+    Following should generate an error message for null projection arg
+<DATE><TIME>|<HOST>|E|psDeproject (FILE:LINENO)
+    Unallowable operation: projection is NULL.
+<DATE><TIME>|<HOST>|I|testDeprojectFail
+    Following should generate an error message for invalid projection type
+<DATE><TIME>|<HOST>|E|psDeproject (FILE:LINENO)
+    The projection type, 4, is unknown.
+
+---> TESTPOINT PASSED (psCoord{psProject} | tst_psCoord01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psCoord01.c                                            *
+*            TestPoint: psCoord{psSphereSetOffset}                                 *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|I|testSetOffsetSphere
+    Following should generate error message null input coord
+<DATE><TIME>|<HOST>|E|psSphereSetOffset (FILE:LINENO)
+    Unallowable operation: position is NULL.
+<DATE><TIME>|<HOST>|I|testSetOffsetSphere
+    Following should generate error message null offset
+<DATE><TIME>|<HOST>|E|psSphereSetOffset (FILE:LINENO)
+    Unallowable operation: offset is NULL.
+<DATE><TIME>|<HOST>|I|testSetOffsetSphere
+    Following should generate error message invalid mode
+<DATE><TIME>|<HOST>|E|psSphereSetOffset (FILE:LINENO)
+    Specified offset mode, 0x54321, is not supported.
+<DATE><TIME>|<HOST>|I|testSetOffsetSphere
+    Following should generate an error message invalid unit
+<DATE><TIME>|<HOST>|E|psSphereSetOffset (FILE:LINENO)
+    Specified units, 0x54321, is not supported.
+
+---> TESTPOINT PASSED (psCoord{psSphereSetOffset} | tst_psCoord01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psCoord01.c                                            *
+*            TestPoint: psCoord{psSphereSetOffset}                                 *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psCoord{psSphereSetOffset} | tst_psCoord01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psCoord01.c                                            *
+*            TestPoint: psCoord{psSphereGetOffset}                                 *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|I|testGetOffsetSphere
+    Following should generate an error message for null position
+<DATE><TIME>|<HOST>|E|psSphereGetOffset (FILE:LINENO)
+    Unallowable operation: position1 is NULL.
+<DATE><TIME>|<HOST>|I|testGetOffsetSphere
+    Following should generate an error message for null position
+<DATE><TIME>|<HOST>|E|psSphereGetOffset (FILE:LINENO)
+    Unallowable operation: position2 is NULL.
+<DATE><TIME>|<HOST>|I|testGetOffsetSphere
+    Following should generate an error message for invalid mode
+<DATE><TIME>|<HOST>|E|psSphereGetOffset (FILE:LINENO)
+    Specified offset mode, 0x54321, is not supported.
+<DATE><TIME>|<HOST>|I|testGetOffsetSphere
+    Following should generate an error message for invalid unit type
+<DATE><TIME>|<HOST>|E|psSphereGetOffset (FILE:LINENO)
+    Specified units, 0x54321, is not supported.
+<DATE><TIME>|<HOST>|I|testGetOffsetSphere
+    Following should generate warning message
+<DATE><TIME>|<HOST>|W|psSphereGetOffset
+    WARNING: psDeproject(): position1->d is larger than 90 degrees.  Returning NULL.
+<DATE><TIME>|<HOST>|I|testGetOffsetSphere
+    Following should generate warning message
+<DATE><TIME>|<HOST>|W|psSphereGetOffset
+    WARNING: psDeproject(): position2->d is larger than 90 degrees.  Returning NULL.
+
+---> TESTPOINT PASSED (psCoord{psSphereGetOffset} | tst_psCoord01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psCoord01.c                                            *
+*            TestPoint: psCoord{psSphereGetOffset}                                 *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psCoord{psSphereGetOffset} | tst_psCoord01.c)
+
Index: /tags/ipp-1-X/bug123/psLib/test/astronomy/verified/tst_psTime_01.stdout
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/astronomy/verified/tst_psTime_01.stdout	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/astronomy/verified/tst_psTime_01.stdout	(revision 22331)
@@ -0,0 +1,164 @@
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psTime_01.c                                            *
+*            TestPoint: psTime{Get current TAI time}                               *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psTime{Get current TAI time} | tst_psTime_01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psTime_01.c                                            *
+*            TestPoint: psTime{Print test time}                                    *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Test time: Seconds = 1090434144 Nanoseconds = 272044000
+
+---> TESTPOINT PASSED (psTime{Print test time} | tst_psTime_01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psTime_01.c                                            *
+*            TestPoint: psTime{Convert psTime to ISO time}                         *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+2004-07-21T<DATE>.272Z
+
+---> TESTPOINT PASSED (psTime{Convert psTime to ISO time} | tst_psTime_01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psTime_01.c                                            *
+*            TestPoint: psTime{Convert ISO time to psTime}                         *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+psTime: Seconds = 1090434144 Nanoseconds = 272000000
+
+---> TESTPOINT PASSED (psTime{Convert ISO time to psTime} | tst_psTime_01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psTime_01.c                                            *
+*            TestPoint: psTime{Convert psTime time to UTC time}                    *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+psTime: Seconds = 1090434112 Nanoseconds = 272044000
+
+---> TESTPOINT PASSED (psTime{Convert psTime time to UTC time} | tst_psTime_01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psTime_01.c                                            *
+*            TestPoint: psTime{Convert UTC time to psTime}                         *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+psTime: Seconds = 1090434144 Nanoseconds = 272044000
+
+---> TESTPOINT PASSED (psTime{Convert UTC time to psTime} | tst_psTime_01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psTime_01.c                                            *
+*            TestPoint: psTime{Convert psTime to MJD time}                         *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+MJD = 53207.765559
+
+---> TESTPOINT PASSED (psTime{Convert psTime to MJD time} | tst_psTime_01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psTime_01.c                                            *
+*            TestPoint: psTime{Convert MJD time to psTime}                         *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+psTime: Seconds = 1090434144 Nanoseconds = 272043704
+
+---> TESTPOINT PASSED (psTime{Convert MJD time to psTime} | tst_psTime_01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psTime_01.c                                            *
+*            TestPoint: psTime{Convert psTime to JD time}                          *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+JD = 2453208.265559
+
+---> TESTPOINT PASSED (psTime{Convert psTime to JD time} | tst_psTime_01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psTime_01.c                                            *
+*            TestPoint: psTime{Convert JD time to psTime}                          *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+psTime: Seconds = 1090434144 Nanoseconds = 272048711
+
+---> TESTPOINT PASSED (psTime{Convert JD time to psTime} | tst_psTime_01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psTime_01.c                                            *
+*            TestPoint: psTime{Convert psTime to timeval time}                     *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+timevalTime: Seconds = 1090434144 Microseconds = 272044
+
+---> TESTPOINT PASSED (psTime{Convert psTime to timeval time} | tst_psTime_01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psTime_01.c                                            *
+*            TestPoint: psTime{Convert timeval time to psTime}                     *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+psTime: Seconds = 1090434144 Nanoseconds = 272044000
+
+---> TESTPOINT PASSED (psTime{Convert timeval time to psTime} | tst_psTime_01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psTime_01.c                                            *
+*            TestPoint: psTime{Convert psTime to tm time}                          *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+tmTime:
+tmTime->tm_year = 104
+tmTime->tm_mon = 6
+tmTime->tm_mday = 21
+tmTime->tm_hour = 18
+tmTime->tm_min = 22
+tmTime->tm_sec = 24
+
+---> TESTPOINT PASSED (psTime{Convert psTime to tm time} | tst_psTime_01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psTime_01.c                                            *
+*            TestPoint: psTime{Convert tm time to psTime}                          *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+psTime: Seconds = 1090434144 Nanoseconds = 0
+
+---> TESTPOINT PASSED (psTime{Convert tm time to psTime} | tst_psTime_01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psTime_01.c                                            *
+*            TestPoint: psTime{Convert psTime time to LST}                         *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+LST (rad): 1.074588
+
+---> TESTPOINT PASSED (psTime{Convert psTime time to LST} | tst_psTime_01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psTime_01.c                                            *
+*            TestPoint: psMetadata{Test P - Free data}                             *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psMetadata{Test P - Free data} | tst_psTime_01.c)
+
Index: /tags/ipp-1-X/bug123/psLib/test/astronomy/verified/tst_psTime_02.stderr
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/astronomy/verified/tst_psTime_02.stderr	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/astronomy/verified/tst_psTime_02.stderr	(revision 22331)
@@ -0,0 +1,14 @@
+<DATE><TIME>|<HOST>|E|psTimeFromISO (FILE:LINENO)
+    Error: tmTime.tm_mon, 99, is out of range.  Must be between 1 and 12.
+<DATE><TIME>|<HOST>|E|psTimeFromISO (FILE:LINENO)
+    Error: tmTime.tm_mday, 99, is out of range.  Must be between 1 and 31.
+<DATE><TIME>|<HOST>|E|psTimeFromISO (FILE:LINENO)
+    Error: tmTime.tm_hour, 99, is out of range.  Must be between 0 and 23.
+<DATE><TIME>|<HOST>|E|psTimeFromISO (FILE:LINENO)
+    Error: tmTime.tm_min, 99, is out of range.  Must be between 0 and 59.
+<DATE><TIME>|<HOST>|E|psTimeFromISO (FILE:LINENO)
+    Error: tmTime.tm_sec, 99, is out of range.  Must be between 0 and 59.
+<DATE><TIME>|<HOST>|E|psTimeFromISO (FILE:LINENO)
+    Error: millisecond, -999, is out of range.  Must be between 0 and 999.
+<DATE><TIME>|<HOST>|E|psTimeFromTimeval (FILE:LINENO)
+    Unallowable operation: time is NULL.
Index: /tags/ipp-1-X/bug123/psLib/test/astronomy/verified/tst_psTime_02.stdout
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/astronomy/verified/tst_psTime_02.stdout	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/astronomy/verified/tst_psTime_02.stdout	(revision 22331)
@@ -0,0 +1,31 @@
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psTime_02.c                                            *
+*            TestPoint: psTime{Incorrect ISO time data}                            *
+*             TestType: Negative                                                   *
+*    ExpectedErrorText: Time not allowed                                           *
+*  ExpectedStatusValue: 0                                                          *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psTime{Incorrect ISO time data} | tst_psTime_02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psTime_02.c                                            *
+*            TestPoint: psTime{Attempt to use null timeval}                        *
+*             TestType: Negative                                                   *
+*    ExpectedErrorText: Null value for timeval arg not allowed                     *
+*  ExpectedStatusValue: 0                                                          *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psTime{Attempt to use null timeval} | tst_psTime_02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psTime_02.c                                            *
+*            TestPoint: psTime{Test C - Free data}                                 *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psTime{Test C - Free data} | tst_psTime_02.c)
+
Index: /tags/ipp-1-X/bug123/psLib/test/astronomy/verified/tst_psTime_03.stderr
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/astronomy/verified/tst_psTime_03.stderr	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/astronomy/verified/tst_psTime_03.stderr	(revision 22331)
@@ -0,0 +1,4 @@
+<DATE><TIME>|<HOST>|I|main
+    Invalid time type during allocation should generate error message
+<DATE><TIME>|<HOST>|E|psTimeAlloc (FILE:LINENO)
+    Specified type, 10, is not supported.
Index: /tags/ipp-1-X/bug123/psLib/test/astronomy/verified/tst_psTime_03.stdout
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/astronomy/verified/tst_psTime_03.stdout	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/astronomy/verified/tst_psTime_03.stdout	(revision 22331)
@@ -0,0 +1,101 @@
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psTime_03.c                                            *
+*            TestPoint: psTime{Test A - Add two times}                             *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psTime{Test A - Add two times} | tst_psTime_03.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psTime_03.c                                            *
+*            TestPoint: psTime{Test B - Add two times with overflow in microseconds} *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psTime{Test B - Add two times with overflow in microseconds} | tst_psTime_03.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psTime_03.c                                            *
+*            TestPoint: psTime{Test C - Subtract two times}                        *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psTime{Test C - Subtract two times} | tst_psTime_03.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psTime_03.c                                            *
+*            TestPoint: psTime{Test D - Subtact two times with underflow in nanoseconds} *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psTime{Test D - Subtact two times with underflow in nanoseconds} | tst_psTime_03.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psTime_03.c                                            *
+*            TestPoint: psTime{Test E - Delta two times}                           *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psTime{Test E - Delta two times} | tst_psTime_03.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psTime_03.c                                            *
+*            TestPoint: psTime{Test F - Delta two times with underflow in microseconds} *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psTime{Test F - Delta two times with underflow in microseconds} | tst_psTime_03.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psTime_03.c                                            *
+*            TestPoint: psTime{Test F1 - Delta two UTC times}                      *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psTime{Test F1 - Delta two UTC times} | tst_psTime_03.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psTime_03.c                                            *
+*            TestPoint: psTime{Test G - Add two times across leapsecond boundary}  *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+1999-01-01T<DATE>.000Z
+
+---> TESTPOINT PASSED (psTime{Test G - Add two times across leapsecond boundary} | tst_psTime_03.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psTime_03.c                                            *
+*            TestPoint: psTime{Test H - Find number of leapseconds added between two times} *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+22
+
+---> TESTPOINT PASSED (psTime{Test H - Find number of leapseconds added between two times} | tst_psTime_03.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psTime_03.c                                            *
+*            TestPoint: psTime{Test H1 - Verify error message in allocating invalid time type} *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psTime{Test H1 - Verify error message in allocating invalid time type} | tst_psTime_03.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psTime_03.c                                            *
+*            TestPoint: psTime{Test I - Free data}                                 *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psTime{Test I - Free data} | tst_psTime_03.c)
+
Index: /tags/ipp-1-X/bug123/psLib/test/astronomy/verified/tst_psTime_04.stderr
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/astronomy/verified/tst_psTime_04.stderr	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/astronomy/verified/tst_psTime_04.stderr	(revision 22331)
@@ -0,0 +1,22 @@
+<DATE><TIME>|<HOST>|E|psMetadataParseConfig (FILE:LINENO)
+    Failed to open file 'zzz'. Check if it exists and it has the proper permissions.
+<DATE><TIME>|<HOST>|E|psLibInit (FILE:LINENO)
+    Failed to initialize psTime.
+<DATE><TIME>|<HOST>|E|psLookupTableRead (FILE:LINENO)
+    Failed to open file bogus/ser7.dat.
+<DATE><TIME>|<HOST>|E|psLookupTableRead (FILE:LINENO)
+    Failed to open file bogus/eopc01_1900_2004.dat.
+<DATE><TIME>|<HOST>|E|psLookupTableRead (FILE:LINENO)
+    Failed to open file bogus/finals_all.dat.
+<DATE><TIME>|<HOST>|E|psLookupTableRead (FILE:LINENO)
+    Failed to open file bogus/tai_utc.dat.
+<DATE><TIME>|<HOST>|E|p_psTimeInit (FILE:LINENO)
+    Incorrect number of table files entered. Found: 3. Expected: 4.
+<DATE><TIME>|<HOST>|E|p_psTimeInit (FILE:LINENO)
+    Incorrect vector size. Size: 3, Expected 4.
+<DATE><TIME>|<HOST>|E|psLibInit (FILE:LINENO)
+    Failed to initialize psTime.
+<DATE><TIME>|<HOST>|E|printError (FILE:LINENO)
+    Unable to parse string, 53yyy244 on line 16.
+<DATE><TIME>|<HOST>|E|psLookupTableRead (FILE:LINENO)
+    Lookup table is invalid.
Index: /tags/ipp-1-X/bug123/psLib/test/astronomy/verified/tst_psTime_04.stdout
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/astronomy/verified/tst_psTime_04.stdout	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/astronomy/verified/tst_psTime_04.stdout	(revision 22331)
@@ -0,0 +1,73 @@
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psTime_04.c                                            *
+*            TestPoint: psTime{Test A - Initialize time}                           *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psTime{Test A - Initialize time} | tst_psTime_04.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psTime_04.c                                            *
+*            TestPoint: psTime{Test B - Attempt to open non-existant time config file} *
+*             TestType: Negative                                                   *
+*    ExpectedErrorText: Failed to open file 'zzz'.  Check if it exists and it has the proper permissions. *
+*  ExpectedStatusValue: 0                                                          *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psTime{Test B - Attempt to open non-existant time config file} | tst_psTime_04.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psTime_04.c                                            *
+*            TestPoint: psTime{Test C - Attempt to open non-existant time data files} *
+*             TestType: Negative                                                   *
+*    ExpectedErrorText: Failed to open file 'zzz'.  Check if it exists and it has the proper permissions. *
+*  ExpectedStatusValue: 0                                                          *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psTime{Test C - Attempt to open non-existant time data files} | tst_psTime_04.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psTime_04.c                                            *
+*            TestPoint: psTime{Test D - Attempt to read incorrect number of files} *
+*             TestType: Negative                                                   *
+*    ExpectedErrorText: Incorrect number of table files entered. Found: 3. Expected: 4. *
+*  ExpectedStatusValue: 0                                                          *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psTime{Test D - Attempt to read incorrect number of files} | tst_psTime_04.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psTime_04.c                                            *
+*            TestPoint: psTime{Test E - Attempt to read incorrect number of from values} *
+*             TestType: Negative                                                   *
+*    ExpectedErrorText: Incorrect vector size. Size: 3, Expected 4.                *
+*  ExpectedStatusValue: 0                                                          *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psTime{Test E - Attempt to read incorrect number of from values} | tst_psTime_04.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psTime_04.c                                            *
+*            TestPoint: psTime{Test F - Attempt to read data file with typo in number} *
+*             TestType: Negative                                                   *
+*    ExpectedErrorText: Unable to parse string, number on line 16.                 *
+*  ExpectedStatusValue: 0                                                          *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psTime{Test F - Attempt to read data file with typo in number} | tst_psTime_04.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psTime_04.c                                            *
+*            TestPoint: psTime{Test G - Free data}                                 *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psTime{Test G - Free data} | tst_psTime_04.c)
+
Index: /tags/ipp-1-X/bug123/psLib/test/collections/.cvsignore
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/collections/.cvsignore	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/collections/.cvsignore	(revision 22331)
@@ -0,0 +1,50 @@
+.deps
+.libs
+Makefile.in
+temp
+Makefile
+tst_psBitSet_01
+tst_psBitSet_02
+tst_psBitSet_03
+tst_psBitSet_04
+tst_psBitSet_05
+tst_psBitSet_06
+tst_psBitSet_07
+tst_psBitSet_08
+tst_psImage
+tst_psSort_01
+tst_psSort_02
+tst_psSort_03
+tst_psSort_04
+tst_psVector_01
+tst_psVector_02
+tst_psVector_03
+tst_psList
+tst_psArray
+tst_psArray02
+tst_psVector
+tst_psVectorSort_01
+tst_psVectorSort_02
+tst_psVectorSort_03
+tst_psVectorSort_04
+tst_psHash00
+tst_psHash01
+tst_psHash02
+tst_psHash03
+tst_psHash04
+tst_psHash05
+tst_psBitSet
+tst_psArray01
+tst_psScalar
+tst_psMetadata05_OUT
+tst_psMetadata_01
+tst_psMetadata_02
+tst_psMetadata_03
+tst_psMetadata_04
+tst_psMetadata_05
+tst_psMetadata_06
+tst_psMetadata_07
+tst_psMetadataIO
+header_1.fits
+header_2.fits
+test.config
Index: /tags/ipp-1-X/bug123/psLib/test/collections/Makefile.am
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/collections/Makefile.am	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/collections/Makefile.am	(revision 22331)
@@ -0,0 +1,92 @@
+#Makefile for collections functions of psLib
+#
+EXTRA_DIST = verified \
+	data/header_1.fits \
+	data/header_2.fits \
+	data/test.config
+
+INCLUDES = \
+	-I$(top_srcdir)/src \
+	-I$(top_srcdir)/src/astronomy \
+	-I$(top_srcdir)/src/collections \
+	-I$(top_srcdir)/src/dataManip \
+	-I$(top_srcdir)/src/dataIO \
+	-I$(top_srcdir)/src/image \
+	-I$(top_srcdir)/src/sysUtils \
+	$(all_includes)
+
+AM_LDFLAGS = -L$(top_builddir)/src -lpslib $(PSLIB_LIBS)
+AM_CFLAGS = -DXML_CONFIG_FILE="\"$(top_srcdir)/etc/pslib/psTime.xml\""
+
+TESTS = \
+         tst_psVector          \
+         tst_psArray           \
+         tst_psBitSet          \
+         tst_psVectorSort_01   \
+         tst_psVectorSort_02   \
+         tst_psVectorSort_03   \
+         tst_psVectorSort_04   \
+         tst_psList            \
+         tst_psHash00          \
+         tst_psHash01          \
+         tst_psHash02          \
+         tst_psHash03          \
+         tst_psHash04          \
+         tst_psHash05          \
+         tst_psScalar \
+         tst_psMetadataIO  \
+         tst_psMetadata_01 \
+         tst_psMetadata_02 \
+         tst_psMetadata_03 \
+         tst_psMetadata_04 \
+         tst_psMetadata_05 \
+         tst_psMetadata_06 \
+         tst_psMetadata_07
+
+check_PROGRAMS =$(TESTS)
+
+check_DATA = test.config \
+	header_1.fits \
+	header_2.fits
+
+
+TESTS_ENVIRONMENT = perl $(top_srcdir)/test/runTest -verified=$(srcdir)/verified 
+
+CLEANFILES = $(TESTS) $(check_DATA) temp/*
+
+tests: $(check_DATA) $(TESTS)
+
+tst_psVector_SOURCES = tst_psVector.c
+tst_psArray_SOURCES = tst_psArray.c
+tst_psBitSet_SOURCES = tst_psBitSet.c
+tst_psVectorSort_01_SOURCES = tst_psVectorSort_01.c
+tst_psVectorSort_02_SOURCES = tst_psVectorSort_02.c
+tst_psVectorSort_03_SOURCES = tst_psVectorSort_03.c
+tst_psVectorSort_04_SOURCES = tst_psVectorSort_04.c
+tst_psList_SOURCES = tst_psList.c
+tst_psHash00_SOURCES = tst_psHash00.c
+tst_psHash01_SOURCES = tst_psHash01.c
+tst_psHash02_SOURCES = tst_psHash02.c
+tst_psHash03_SOURCES = tst_psHash03.c
+tst_psHash04_SOURCES = tst_psHash04.c
+tst_psHash05_SOURCES = tst_psHash05.c
+tst_psScalar_SOURCES = tst_psScalar.c
+tst_psMetadataIO_SOURCES = tst_psMetadataIO.c
+tst_psMetadata_01_SOURCES = tst_psMetadata_01.c
+tst_psMetadata_02_SOURCES = tst_psMetadata_02.c
+tst_psMetadata_03_SOURCES = tst_psMetadata_03.c
+tst_psMetadata_04_SOURCES = tst_psMetadata_04.c
+tst_psMetadata_05_SOURCES = tst_psMetadata_05.c
+tst_psMetadata_06_SOURCES = tst_psMetadata_06.c
+tst_psMetadata_07_SOURCES = tst_psMetadata_07.c
+
+test.config: data/test.config
+	cp $? $@
+
+header_1.fits: data/header_1.fits
+	cp $? $@
+
+header_2.fits: data/header_2.fits
+	cp $? $@
+
+test: check
Index: /tags/ipp-1-X/bug123/psLib/test/collections/data/header_1.fits
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/collections/data/header_1.fits	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/collections/data/header_1.fits	(revision 22331)
@@ -0,0 +1,1 @@
+SIMPLE  =                    T / file does conform to FITS standard             BITPIX  =                    8 / number of bits per data pixel                  NAXIS   =                    0 / number of data axes                            HISTORY File modified by user 'harman' with fv  on 2004-08-04T11:11:18          END                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             
Index: /tags/ipp-1-X/bug123/psLib/test/collections/data/header_2.fits
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/collections/data/header_2.fits	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/collections/data/header_2.fits	(revision 22331)
@@ -0,0 +1,1 @@
+SIMPLE  =                    T / file does conform to FITS standard             BITPIX  =                  -64 / number of bits per data pixel                  NAXIS   =                    1 / number of data axes                            NAXIS1  =                   64 / length of data axis 1                          EXTEND  =                    T / FITS dataset may contain extensions            COMMENT   FITS (Flexible Image Transport System) format is defined in 'AstronomyCOMMENT   and Astrophysics', volume 376, page 359; bibcode: 2001A&A...376..359H END                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             XTENSION= 'IMAGE   '           / IMAGE extension                                BITPIX  =                  -64 / number of bits per data pixel                  NAXIS   =                    1 / number of data axes                            NAXIS1  =                   64 / length of data axis 1                          PCOUNT  =                    0 / required keyword; must = 0                     GCOUNT  =                    1 / required keyword; must = 1                     BITPIX  =                  -64 / number of bits per data pixel                  EXTNAME = 'MY_DATA_1'                                                           HISTORY File modified by user 'harman' with fv  on 2004-08-04T13:14:45          HISTORY File modified by user 'harman' with fv  on 2004-08-04T13:15:29          HISTORY File modified by user 'harman' with fv  on 2004-08-04T13:21:18          HISTORY File modified by user 'harman' with fv  on 2004-08-04T13:21:46          END                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             XTENSION= 'IMAGE   '           / IMAGE extension                                BITPIX  =                  -64 / number of bits per data pixel                  NAXIS   =                    1 / number of data axes                            NAXIS1  =                   64 / length of data axis 1                          PCOUNT  =                    0 / required keyword; must = 0                     GCOUNT  =                    1 / required keyword; must = 1                     EXTNAME = 'MY_DATA_2'                                                           HISTORY File modified by user 'harman' with fv  on 2004-08-04T13:22:12          HISTORY File modified by user 'harman' with fv  on 2004-08-04T13:22:52          END                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             
Index: /tags/ipp-1-X/bug123/psLib/test/collections/data/test.config
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/collections/data/test.config	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/collections/data/test.config	(revision 22331)
@@ -0,0 +1,128 @@
+##########################################################################################################
+#  test.config
+#
+#  This is a sample metadata configuration file used to test the metadata configuration file parser. 
+#  It tests both positive and negative cases as described in the comments below.
+#
+#  author  Ross Harman, MHPCC
+#
+#  version $Revision: 1.1 $  $Name: not supported by cvs2svn $
+#  date  $Date: 2005-04-09 00:04:58 $
+#
+#  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
+##########################################################################################################
+#
+#
+#
+########## Test 1 ##########
+# Lines beginning with # are comments. The line below, as well as those above are comments. They should be ignored by the parser.
+# I am a comment.
+#
+#
+#
+########## Test 2 ##########
+# The line below is a comment that begins with some whitespace. It should be ignored by the parser.
+      #        		Another comment
+#
+#
+#
+########## Test 3 ##########
+# The line below is completely blank except for a carriage return. It should be ignored by the parser.
+
+#
+#
+#
+########## Test 4 ##########
+# The line below consists of spaces and tabs (whitespace). It should be ignored by the parser.
+     	   			                    
+#
+#
+#
+########## Test 5 ##########
+# The line below consists of a variable name, type, value, and trailing comment. It should be read by the parser
+pi          F64         3.1415926535897932384626433832795029        # Definition of pi
+#
+#
+#
+########## Test 6 ##########
+# The line below consists of a variable name, type, and value, but without a trailing comment. It should be read by the parser.
+altitude          S32         10000   
+#
+#
+#
+########## Test 7 ##########
+# The lines below contain variations in name, type, value, trailing comment, and whitespace. They should all be read by the parser.
+   time F32 1234.5678 
+ myBool     BOOL            F           # F, f, 0, T, t, 1 are also acceptable
+title1  STR   Hello world #This is a comment for the string value
+    title2  STRING   Good bye world   #    STRING or STR may be used as the string type 
+#
+#
+#
+########## Test 8 ##########
+# The line below creates a vector. It should be read by the parser.
+@primes     S32     2, 3, 5, 7, 11, 13, 17   # These are prime numbers
+#
+#
+#
+########## Test 9 ##########
+# The line below creates a vector with commas mixed with spaces in the values. It should be read by the parser.
+@negatives  S32     -1,  -2 -3    -4, -5, -6,      -7
+#
+#
+#
+########## Test 10  ##########
+# The lines below should create a folder node with children that are strings. They should be read by the parser.
+comment *STR This
+comment *STR     is
+comment *STR         an
+comment *STR             ugly
+comment *STR                 comment
+comment *STR                         but
+comment *STR                             still
+comment *STR                                 valid
+#
+#
+#
+########## Test 11  ##########
+# The line below contains an incorrect value. It should produce an error.
+xPosition    F64          9876.54qqq32
+#
+#
+#
+########## Test 12  ##########
+# The line below contains no value. It should produce an error.
+yPosition    F64          
+#
+#
+#
+########## Test 13  ##########
+# The line below contains no type. It should produce an error.
+zPosition       99.999          
+#
+#
+#
+########## Test 14  ##########
+# The line below contains two * characters. It should produce an error.
+aPosition   **          
+#
+#
+#
+########## Test 15 ##########
+# The line below contains two @ characters. It should produce an error.
+@@bPosition     F64     22.33             
+#
+#
+#
+########## Test 16 ##########
+# The line below contains a ~ character used for special processing. It should produce an error.
+range     F64     140.0 ~             
+#
+#
+#
+########## Test 17 ##########
+# The variable name below is repeated. It should produce an error if the overwrite function argument is set to false.
+# If overwrite is true, then the last name and value will be stored and there will be no error.
+speed     F32     55.55
+speed     F32     66.66
+             
Index: /tags/ipp-1-X/bug123/psLib/test/collections/tst_psArray.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/collections/tst_psArray.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/collections/tst_psArray.c	(revision 22331)
@@ -0,0 +1,448 @@
+/** @file  tst_psArray.c
+ *
+ *  @brief Test driver for psArray integer functions
+ *
+ *  This test driver contains the following tests for psArray test point 1:
+ *     A)  Create void pointer array
+ *     B)  Add data to void pointer array
+ *     C)  Reallocate void pointer array bigger
+ *     D)  Reallocate void pointer array smaller
+ *     E)  Reallocate with null pointer
+ *     F)  Remove item from array
+ *     G)  Remove invalid item from array
+ *     H)  Remove item from null array
+ *     I)  Remove null item from array
+ *     J)  Free void pointer array
+ *
+ *  @author  Ross Harman, MHPCC
+ *
+ *  @version $Revision: 1.13 $  $Name: not supported by cvs2svn $
+ *  @date  $Date: 2005-04-07 20:27:41 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ *
+ */
+
+#include <math.h>
+
+#include "pslib_strict.h"
+#include "psTest.h"
+
+typedef struct
+{
+    psS32 x;
+    float y;
+}
+testStruct;
+
+static int testStructCompare(const void **a, const void **b)
+{
+    testStruct* first = (testStruct*)*a;
+    testStruct* second = (testStruct*)*b;
+
+    if(first->x < second->x)
+        return -1;
+    else if (first->x > second->x)
+        return 1;
+    else
+        return 0;
+}
+
+static psS32 testArray( void );
+static psS32 testArray01( void );
+static psS32 testArrayAdd( void );
+
+testDescription tests[] = {
+                              {testArray, -1, "psArray", 0, false},
+                              {testArray01, -2, "psArray", 0, false},
+                              {testArrayAdd, 788, "psArrayAdd", 0, false},
+                              {NULL}
+                          };
+
+psS32 main( psS32 argc, char* argv[] )
+{
+    psLogSetLevel( PS_LOG_INFO );
+
+    return ( ! runTestSuite( stderr, "psArray", tests, argc, argv ) );
+}
+
+
+psS32 testArray(void)
+{
+    // Create array of pointers
+    testStruct *mySt[10];
+    psArray *psArr1 = NULL;
+
+    // Test A - Create void pointer array
+    printPositiveTestHeader(stderr,"psArray", "Create void pointer array");
+    psArray *psArr = psArrayAlloc(5);
+    if (psArr->nalloc != 5) {
+        psError(PS_ERR_UNKNOWN, true,"psArray didn't have proper number of elements.");
+        return 1;
+    }
+    printFooter(stderr, "psArray", "Create void pointer array", true);
+
+
+    // Test B - Add data to void pointer array
+    printPositiveTestHeader(stderr, "psArray", "Add data to void pointer array");
+    for(psS32 i = 0; i < 5; i++) {
+        testStruct *ts = psAlloc(sizeof(testStruct));
+        ts->x = 10*i;
+        ts->y = 10.1*i;
+        mySt[i] = ts;
+        psArr->data[i] = ts;
+        psMemIncrRefCounter(ts);
+    }
+
+    for(psS32 i = 0; i < 5; i++) {
+        testStruct *ts = (testStruct*)psArr->data[i];
+        fprintf(stderr,"ts[%d].x = %d ts[%d].y = %.2f\n", i, ts->x, i, ts->y);
+        if (fabsf(ts->x - 10*i) > 0.01f || fabsf(ts->y - 10.1*i) > 0.01f) {
+            psError(PS_ERR_UNKNOWN, true,"Couldn't properly get elements from array.");
+            return 2;
+        }
+    }
+    fprintf(stderr,"array size = %d\n", psArr->nalloc);
+    if (psArr->nalloc != 5) {
+        psError(PS_ERR_UNKNOWN, true,"Array Size wrong");
+        return 3;
+    }
+    fprintf(stderr,"array population = %d\n", psArr->n);
+    if (psArr->n != 5) {
+        psError(PS_ERR_UNKNOWN, true,"Array population wrong");
+        return 4;
+    }
+    printFooter(stderr, "psArray", "Add data to void pointer array", true);
+
+
+    // Test C - Reallocate void pointer array bigger
+    printPositiveTestHeader(stderr,"psArray", "Reallocate void pointer array bigger");
+    psArr = psArrayRealloc(psArr,10);
+    fprintf(stderr,"Adding more elements to void pointer array...\n");
+    for(psS32 i = 5; i < 10; i++) {
+        testStruct *ts = psAlloc(sizeof(testStruct));
+        ts->x = 10*i;
+        ts->y = 10.1*i;
+        mySt[i] = ts;
+        psArr->data[i] = ts;
+        psArr->n++;
+        psMemIncrRefCounter(ts);
+    }
+    for(psS32 i = 0; i < 10; i++) {
+        testStruct *ts = (testStruct*)psArr->data[i];
+        fprintf(stderr,"ts[%d].x = %d ts[%d].y = %.2f\n", i, ts->x, i, ts->y);
+        if (fabsf(ts->x - 10*i) > 0.01f || fabsf(ts->y - 10.1*i) > 0.01f) {
+            psError(PS_ERR_UNKNOWN, true,"Couldn't properly get elements from array.");
+            return 5;
+        }
+    }
+    fprintf(stderr,"array size = %d\n", psArr->nalloc);
+    if (psArr->nalloc != 10) {
+        psError(PS_ERR_UNKNOWN, true,"Array Size wrong");
+        return 6;
+    }
+    fprintf(stderr,"array population = %d\n", psArr->n);
+    if (psArr->n != 10) {
+        psError(PS_ERR_UNKNOWN, true,"Array Population wrong");
+        return 7;
+    }
+    printFooter(stderr, "psArray", "Reallocate void pointer array bigger", true);
+
+    // Test D - Reallocate void pointer array smaller
+    printPositiveTestHeader(stderr,"psArray","Reallocate void pointer array smaller");
+    psArr = psArrayRealloc(psArr,3);
+    for(psS32 i = 0; i < 3; i++) {
+        testStruct *ts = (testStruct*)psArr->data[i];
+        fprintf(stderr,"ts[%d].x = %d ts[%d].y = %.2f\n", i, ts->x, i, ts->y);
+        if (fabsf(ts->x - 10*i) > 0.01f || fabsf(ts->y - 10.1*i) > 0.01f) {
+            psError(PS_ERR_UNKNOWN, true,"Couldn't properly get elements from array.");
+            return 8;
+        }
+    }
+    fprintf(stderr,"array size = %d\n", psArr->nalloc);
+    if (psArr->nalloc != 3) {
+        psError(PS_ERR_UNKNOWN, true,"Array Size wrong");
+        return 9;
+    }
+    fprintf(stderr,"array population = %d\n", psArr->n);
+    if (psArr->n != 3) {
+        psError(PS_ERR_UNKNOWN, true,"Array Population wrong");
+        return 10;
+    }
+    printFooter(stderr, "psArray", "Reallocate integer void pointer smaller", true);
+
+    // Test E - Reallocate with a null
+    printNegativeTestHeader(stderr,"psArray","Reallocate with a null array",
+                            "Error message generator", 0 );
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message.");
+    psArr1 = psArrayRealloc(NULL,5);
+    if ( psArr1 != NULL ) {
+        fprintf(stderr,"ERROR: Return is not NULL\n");
+    }
+    printFooter(stderr,"psArray","Reallocate with a null array",true);
+
+
+    // Test F - Remove item from array
+    printPositiveTestHeader(stderr, "psArray", "Remove valid item");
+    if( !psArrayRemove(psArr,mySt[0]) ) {
+        psError(PS_ERR_UNKNOWN,true,"Unable to remove valid item");
+        return 100;
+    }
+    fprintf(stderr,"Array size after removal = %d\n",psArr->n);
+    if ( psArr->n != 2 ) {
+        psError(PS_ERR_UNKNOWN, true, "Items in array not decremented after removal");
+        return 101;
+    }
+    for(psS32 i = 0; i < psArr->n; i++) {
+        testStruct *ts = (testStruct*)psArr->data[i];
+        fprintf(stderr,"ts[%d].x = %d ts[%d].y = %.2f\n", i, ts->x, i, ts->y);
+        if(fabsf(ts->x - 10*(i+1)) > 0.01f || fabsf(ts->y - 10.1*(i+1)) > 0.01f) {
+            psError(PS_ERR_UNKNOWN, true, "Elements not as expected after remove.");
+            return 102;
+        }
+    }
+    psFree(mySt[0]);
+    printFooter(stderr,"psArray","Remove valid item", true);
+
+    // Test G - Remove invalid item from array
+    printPositiveTestHeader(stderr, "psArray", "Remove invalid item from array");
+    if( psArrayRemove(psArr,mySt[9]) ) {
+        psError(PS_ERR_UNKNOWN,true,"Removed invalid item from array");
+        return 103;
+    }
+    printFooter(stderr,"psArray","Remove invalid item from array",true);
+
+    // Test H - Remove item from null array
+    printPositiveTestHeader(stderr, "psArray", "Remove item from null array");
+    if ( psArrayRemove(NULL,mySt[1]) ) {
+        psError(PS_ERR_UNKNOWN,true,"Removed valid item from null array");
+        return 104;
+    }
+    printFooter(stderr,"psArray","Remove item from null array",true);
+
+    // Test I - Remove null item from array
+    printPositiveTestHeader(stderr, "psArray", "Remove null item from array");
+    if( psArrayRemove(psArr,NULL) ) {
+        psError(PS_ERR_UNKNOWN,true,"Remove null item from array",true);
+        return 105;
+    }
+    printFooter(stderr,"psArray","Remove null item from array",true);
+
+    // Test J - Free void pointer array
+    printPositiveTestHeader(stderr, "psArray", "Free void pointer array");
+    psFree(psArr);
+    for(psS32 i = 0; i < 10; i++) {
+        psFree(mySt[i]);
+    }
+    if( psMemCheckLeaks(0, NULL, stderr, false) != 0) {
+        psError(PS_ERR_UNKNOWN,true,"Memory leaks detected.");
+        return 110;
+    }
+    psS32 nBad = psMemCheckCorruption(0);
+    if(nBad) {
+        fprintf(stderr,"ERROR: Found %d bad memory blocks\n", nBad);
+        return 111;
+    }
+    printFooter(stderr, "psArray" ,"Free void pointer array", true);
+
+    return 0;
+}
+
+psS32 testArray01(void)
+{
+    // Create array of pointers
+    testStruct *mySt[10];
+
+    // Test A - Create void pointer array
+    printPositiveTestHeader(stderr,"psArray", "Create void pointer array");
+    psArray *psArr = psArrayAlloc(10);
+    if (psArr->nalloc != 10) {
+        psError(PS_ERR_UNKNOWN, true,"psArray didn't have proper number of elements.");
+        return 1;
+    }
+    printFooter(stderr, "psArray", "Create void pointer array", true);
+
+    // Test B - Add data to void pointer array
+    printPositiveTestHeader(stderr, "psArray", "Add data to void pointer array");
+    for(psS32 i = 0; i < 10; i++) {
+        testStruct *ts = psAlloc(sizeof(testStruct));
+        ts->x = 10*(10-i);
+        ts->y = 10.1*(10-i);
+        mySt[i] = ts;
+        psArr->data[i] = ts;
+        psMemIncrRefCounter(ts);
+    }
+
+    for(psS32 i = 0; i < 10; i++) {
+        testStruct *ts = (testStruct*)psArr->data[i];
+        fprintf(stderr,"ts[%d].x = %d ts[%d].y = %.2f\n", i, ts->x, i, ts->y);
+        if (fabsf(ts->x - 10*(10-i)) > 0.01f || fabsf(ts->y - 10.1*(10-i)) > 0.01f) {
+            psError(PS_ERR_UNKNOWN, true,"Couldn't properly get elements from array.");
+            return 2;
+        }
+    }
+    fprintf(stderr,"array size = %d\n", psArr->nalloc);
+    if (psArr->nalloc != 10) {
+        psError(PS_ERR_UNKNOWN, true,"Array Size wrong");
+        return 3;
+    }
+    fprintf(stderr,"array population = %d\n", psArr->n);
+    if (psArr->n != 10) {
+        psError(PS_ERR_UNKNOWN, true,"Array population wrong");
+        return 4;
+    }
+    printFooter(stderr, "psArray", "Add data to void pointer array", true);
+
+    // Test C - Sort data in array
+    printPositiveTestHeader(stderr,"psArray","Sort data in array");
+    psArr = psArraySort(psArr,testStructCompare);
+    for(psS32 i = 0; i < 10; i++) {
+        testStruct *ts = (testStruct*)psArr->data[i];
+        fprintf(stderr,"ts[%d].x = %d ts[%d].y = %.2f\n", i, ts->x, i, ts->y);
+        if (fabsf(ts->x - 10*(i+1)) > 0.01f || fabsf(ts->y - 10.1*(i+1)) > 0.01f) {
+            psError(PS_ERR_UNKNOWN, true,"Couldn't properly get elements from array.");
+            return 5;
+        }
+    }
+    printFooter(stderr,"psArray","Sort data in array",true);
+
+    // Test D - Attempt to sort null array
+    printPositiveTestHeader(stderr,"psArray","Attempt to sort array");
+    psArray* tempArr = psArraySort(NULL,testStructCompare);
+    if(tempArr != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Array sort did not return null when sorting null array");
+        return 6;
+    }
+    printFooter(stderr,"psArray","Attempt to sort array",true);
+
+    // Test E - Free void pointer array
+    printPositiveTestHeader(stderr, "psArray", "Free void pointer array");
+    psFree(psArr);
+    for(psS32 i = 0; i < 10; i++) {
+        psFree(mySt[i]);
+    }
+    if( psMemCheckLeaks(0, NULL, stderr, false) != 0) {
+        psError(PS_ERR_UNKNOWN,true,"Memory leaks detected.");
+        return 110;
+    }
+    psS32 nBad = psMemCheckCorruption(0);
+    if(nBad) {
+        fprintf(stderr,"ERROR: Found %d bad memory blocks\n", nBad);
+        return 111;
+    }
+    printFooter(stderr, "psArray" ,"Free void pointer array", true);
+
+    return 0;
+}
+
+psS32 testArrayAdd( void )
+{
+    int subtest = 0;
+    float* data;
+    int nalloc = 5;
+    int n = 0;
+    int delta = 5;
+
+    // allocate the array.
+    psArray* arr = psArrayAlloc(nalloc);
+    arr->n = n;
+
+    // test arrayAdd until n == nalloc
+    while (n < nalloc) {
+        data = psAlloc(sizeof(float));
+        arr = psArrayAdd(arr, delta*2, data); // make delta unique versus next delta used.
+
+        subtest++;
+        if (psMemGetRefCounter(data) != 2) {
+            // in response of Bug #302
+            psError(PS_ERR_UNKNOWN, true,
+                    "psArrayAdd did not increment the data reference count.");
+            return subtest;
+        }
+
+        psFree(data);
+
+        subtest++;
+        if (arr->nalloc != nalloc) {
+            psError(PS_ERR_UNKNOWN,true,
+                    "psArrayAdd expanded the psArray unnecessarily.  n=%d",
+                    n);
+            return subtest;
+        }
+
+        subtest++;
+        if (arr->n != ++n) {
+            psError(PS_ERR_UNKNOWN,true,
+                    "psArrayAdd did not increment the size of the psArray. n=%d",
+                    n);
+            return subtest;
+        }
+
+        subtest++;
+        if (arr->data[n-1] != data) {
+            psError(PS_ERR_UNKNOWN,true,
+                    "psArrayAdd didn't set the element to data. n=%d",
+                    n);
+            return subtest;
+        }
+    }
+
+    // now try to add an element when the array is full.
+    data = psAlloc(sizeof(float));
+    arr = psArrayAdd(arr, delta, data);
+    psFree(data);
+
+    // make sure the array was expanded
+    subtest++;
+    if (arr->nalloc != nalloc+delta) {
+        psError(PS_ERR_UNKNOWN,true,
+                "psArrayAdd did not expand the psArray when it was already full."
+                " old nalloc=%d, nalloc=%d, delta=%d",
+                nalloc, arr->nalloc, delta);
+        return subtest;
+    }
+    nalloc = arr->nalloc;
+
+    subtest++;
+    if (arr->n != ++n) {
+        psError(PS_ERR_UNKNOWN,true,
+                "psArrayAdd did not increment psArray.n by 1 after expanding it.");
+        return subtest;
+    }
+
+    subtest++;
+    if (arr->data[n-1] != data) {
+        psError(PS_ERR_UNKNOWN,true,
+                "psArrayAdd didn't set the second element to data.");
+        return subtest;
+    }
+
+    // make the array full again (operation tested already)
+    while (arr->n < arr->nalloc) {
+        data = psAlloc(sizeof(float));
+        arr = psArrayAdd(arr, 0, data);
+        psFree(data);
+    }
+    nalloc = arr->nalloc;
+    n = arr->n;
+
+    // now add to full array with delta = 0; verify that the array is
+    // expanded by 10
+    data = psAlloc(sizeof(float));
+    arr = psArrayAdd(arr, 0, data);
+    psFree(data);
+
+    subtest++;
+    if (arr->nalloc != nalloc+10) {
+        psError(PS_ERR_UNKNOWN,true,
+                "psArrayAdd did not expand the psArray by 10 when delta < 1."
+                " old nalloc=%d, nalloc=%d",
+                nalloc, arr->nalloc);
+        return subtest;
+    }
+
+    psFree(arr);
+
+    return 0;  // the value that indicates success is part of the testDescription
+}
+
Index: /tags/ipp-1-X/bug123/psLib/test/collections/tst_psBitSet.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/collections/tst_psBitSet.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/collections/tst_psBitSet.c	(revision 22331)
@@ -0,0 +1,683 @@
+/** @file  tst_psBitSet_01.c
+ *
+ *  @brief Test driver for psBitSet functions
+ *
+ *  This test driver contains the following tests for psBitSet test point 1:
+ *     A)  Create psBitSet
+ *     B)  Set bits
+ *     C)  Test bits
+ *     D)  Attempt to test negative bit
+ *     E)  Attempt to test bit to large
+ *     F)  Attempt to test bit in null BitSet
+ *     G)  Attempt to set negative bit
+ *     H)  Attempt to set bit to large
+ *     I)  Attempt to set bit in null BitSet
+ *     J)  Free psBitSet
+ *
+ *  @author  Ross Harman, MHPCC
+ *
+ *  @version $Revision: 1.8 $  $Name: not supported by cvs2svn $
+ *  @date  $Date: 2005-04-07 20:27:41 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ *
+ */
+
+#include "pslib_strict.h"
+#include "psTest.h"
+
+static psS32 testBitSet01a(void);
+static psS32 testBitSet01b(void);
+static psS32 testBitSet01c(void);
+static psS32 testBitSet02(void);
+static psS32 testBitSet03(void);
+static psS32 testBitSet04(void);
+static psS32 testBitSet05(void);
+static psS32 testBitSet06(void);
+
+testDescription tests[] = {
+                              {testBitSet01a, 1, "psBitSetAlloc", 0, false},
+                              {testBitSet01b, 2, "psBitSetSet/psBitSetClear", 0, false},
+                              {testBitSet01c, 3, "psBitSetTest", 0, false},
+                              {testBitSet06, 4, "psBitSetOp", 0, false},
+                              {testBitSet02, 5, "psBitSetOp AND Operator", 0, false},
+                              {testBitSet03, 6, "psBitSetOp OR Operator", 0, false},
+                              {testBitSet04, 7, "psBitSetOp XOR Operator", 0, false},
+                              {testBitSet05, 8, "psBitSetNot", 0, false},
+
+                              {NULL}
+                          };
+
+
+psS32 main( psS32 argc, char* argv[] )
+{
+    psLogSetLevel( PS_LOG_INFO );
+
+    return ( ! runTestSuite( stderr, "psBitSet", tests, argc, argv ) );
+}
+
+psS32 testBitSet01a(void)
+{
+    psErr* err;
+
+    // Test A - Create psBitSet
+    fprintf(stderr,"Creating psBitSet with 24 bits...\n");
+    psBitSet* bs = psBitSetAlloc(24);
+    if (bs == NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Failed to create a psBitSet");
+        return 1;
+    }
+    if (bs->n != 3) {
+        psError(PS_ERR_UNKNOWN,true,"Number of bytes for psBitSet incorrect (%d vs 3)",
+                bs->n);
+        return 2;
+    }
+    if (bs->bits[0] != 0 || bs->bits[1] != 0 || bs->bits[2] != 0) {
+        psError(PS_ERR_UNKNOWN,true,"psBitSetAlloc didn't clean ou the bits by default (%x%x%x).",
+                bs->bits[2],bs->bits[1],bs->bits[0]);
+        return 3;
+    }
+    psFree(bs);
+
+    // Test A - Create psBitSet
+    fprintf(stderr,"Creating psBitSet with 25 bits...\n");
+    bs = psBitSetAlloc(25);
+    if (bs == NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Failed to create a psBitSet with 25 bits");
+        return 4;
+    }
+    if (bs->n != 4) {
+        psError(PS_ERR_UNKNOWN,true,"Number of bytes for psBitSet incorrect (%d vs 4)",bs->n);
+        return 5;
+    }
+    psFree(bs);
+
+    psErrorClear();
+    psLogMsg(__func__,PS_LOG_INFO,"Following is an error.");
+    bs = psBitSetAlloc(-4);
+    if (bs != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"psBitSetAlloc returned something in case of a negative size");
+        return 6;
+    }
+    err = psErrorLast();
+    if (err->code != PS_ERR_BAD_PARAMETER_VALUE) {
+        psErrorStackPrint(stderr,"Error Stack:");
+        psError(PS_ERR_UNKNOWN,true,"psBitSetAlloc didn't generate expected error with size = -4");
+        return 7;
+    }
+    psFree(err);
+
+    return 0;
+}
+
+psS32 testBitSet01b(void)
+{
+    char *binOut = NULL;
+    psBitSet *tempBs = NULL;
+    psErr* err = NULL;
+
+    psBitSet* bs = psBitSetAlloc(24);
+
+    if (psBitSetTest(bs,0) ||
+            psBitSetTest(bs,2) ||
+            psBitSetTest(bs,23) ) {
+
+        psAbort("testBitSet01b","psBitSetAlloc failed to clear all bits at allocation.");
+    }
+
+    // Test B - Set bits
+    tempBs = bs;
+    fprintf(stderr,"Setting first bit...\n");
+    bs = psBitSetSet(bs, 0);
+    fprintf(stderr,"Setting third bit...\n");
+    bs = psBitSetSet(bs, 2);
+    fprintf(stderr,"Setting last bit...\n");
+    bs = psBitSetSet(bs, 23);
+    if(bs != tempBs) {
+        psAbort("testBitSet01b",
+                "Return pointer not equal to output argument pointer.");
+    }
+    if(bs->bits[0] != 0x05) {
+        psAbort(__func__,
+                "Unexpected value for first byte (%d vs 5).",
+                bs->bits[0]);
+    }
+
+
+    binOut = psBitSetToString(bs);
+    fprintf(stderr,"%s\n\n", binOut);
+    psFree(binOut);
+
+    // Test C - Test bits
+    if (! psBitSetTest(bs,0) ||
+            ! psBitSetTest(bs,2) ||
+            ! psBitSetTest(bs,23) ) {
+
+        psAbort("testBitSet01b","Failed to set a bit.");
+    }
+
+    fprintf(stderr,"Clearing first bit...\n");
+    bs = psBitSetClear(bs, 0);
+    fprintf(stderr,"Clearing third bit...\n");
+    bs = psBitSetClear(bs, 2);
+    fprintf(stderr,"Clearing last bit...\n");
+    bs = psBitSetClear(bs, 23);
+
+    binOut = psBitSetToString(bs);
+    fprintf(stderr,"%s\n\n", binOut);
+    psFree(binOut);
+
+
+    if (psBitSetTest(bs,0) ||
+            psBitSetTest(bs,2) ||
+            psBitSetTest(bs,23) ) {
+
+        psAbort("testBitSet01b","Failed to clear a bit.");
+    }
+
+    psLogMsg(__func__,PS_LOG_INFO,"Following should be an error");
+    if(psBitSetClear(NULL,2) != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"psBitSetClear did not return NULL with NULL bitset");
+        return 20;
+    }
+
+    psLogMsg(__func__,PS_LOG_INFO,"Following should be an error");
+    if(psBitSetClear(bs,-3) != bs) {
+        psError(PS_ERR_UNKNOWN,true,"psBitSetClear did not return original bitset");
+        return 21;
+    }
+
+    psLogMsg("testBitSet01b",PS_LOG_INFO,"Following should be an error");
+    psErrorClear();
+    psBitSetSet(bs, -4);
+
+    err = psErrorLast();
+    if (err->code != PS_ERR_BAD_PARAMETER_VALUE) {
+        psErrorStackPrint(stderr,"Error Stack:");
+        psAbort("testBitSet01c","psBitSetSet(bs, -4) didn't generate expected error.\n");
+    }
+    psFree(err);
+
+    psLogMsg("testBitSet01b",PS_LOG_INFO,"Following should be an error");
+    psErrorClear();
+    psBitSetSet(bs, 200);
+
+    err = psErrorLast();
+    if (err->code != PS_ERR_BAD_PARAMETER_VALUE) {
+        psErrorStackPrint(stderr,"Error Stack:");
+        psAbort("testBitSet01c","psBitSetSet(bs, 200) didn't generate expected error.\n");
+    }
+    psFree(err);
+
+    psLogMsg("testBitSet01b",PS_LOG_INFO,"Following should be an error");
+    psErrorClear();
+    psBitSetSet(NULL, 0);
+
+    err = psErrorLast();
+    if (err->code != PS_ERR_BAD_PARAMETER_NULL) {
+        psErrorStackPrint(stderr,"Error Stack:");
+        psAbort("testBitSet01c","psBitSetSet(NULL,0) didn't generate expected error.\n");
+    }
+    psFree(err);
+
+    psFree(bs);
+
+    return 0;
+}
+
+static psS32 testBitSet01c(void)
+{
+    psBitSet* bs = psBitSetAlloc(24);
+    psErr* err = NULL;
+
+    fprintf(stderr,"Setting first bit...\n");
+    bs = psBitSetSet(bs, 0);
+    fprintf(stderr,"Setting third bit...\n");
+    bs = psBitSetSet(bs, 2);
+    fprintf(stderr,"Setting last bit...\n");
+    bs = psBitSetSet(bs, 23);
+
+    if (! psBitSetTest(bs,0) ||
+            ! psBitSetTest(bs,2) ||
+            ! psBitSetTest(bs,23) ) {
+
+        psAbort("testBitSet01c","Set bits returned false.");
+    }
+
+    psLogMsg("testBitSet01c",PS_LOG_INFO,"Following should be an error");
+    psErrorClear();
+    if(psBitSetTest(bs, -4)) {
+        psAbort("testBitSet01c","psBitSetTest returned true with negative bit position.\n");
+    }
+
+    err = psErrorLast();
+    if (err->code != PS_ERR_BAD_PARAMETER_VALUE) {
+        psErrorStackPrint(stderr,"Error Stack:");
+        psAbort("testBitSet01c","psBitSetTest(bs, -4) didn't generate proper error.\n");
+    }
+    psFree(err);
+
+    psLogMsg("testBitSet01c",PS_LOG_INFO,"Following should be an error");
+    psErrorClear();
+    if(psBitSetTest(bs, 200)) {
+        psAbort("testBitSet01c","psBitSetTest returned true with too-large bit position.\n");
+    }
+
+    err = psErrorLast();
+    if (err->code != PS_ERR_BAD_PARAMETER_VALUE) {
+        psErrorStackPrint(stderr,"Error Stack:");
+        psAbort("testBitSet01c","psBitSetTest(bs, 200) didn't generate proper error.\n");
+    }
+    psFree(err);
+
+    psLogMsg("testBitSet01c",PS_LOG_INFO,"Following should be an error");
+    psErrorClear();
+    if (psBitSetTest(NULL, 0)) {
+        psAbort("testBitSet01c","psBitSetTest returned true with NULL psBitSet.\n");
+    }
+
+    err = psErrorLast();
+    if (err->code != PS_ERR_BAD_PARAMETER_NULL) {
+        psErrorStackPrint(stderr,"Error Stack:");
+        psAbort("testBitSet01c","psBitSetTest(NULL, 0) didn't generate proper error.\n");
+    }
+    psFree(err);
+
+    psFree(bs);
+
+    return 0;
+}
+
+psS32 testBitSet02()
+{
+    char *binOut1 = NULL;
+    char *binOut2 = NULL;
+    char *binOut3 = NULL;
+
+    psBitSet* bs1 = psBitSetAlloc(24);
+    psBitSet* bs2 = psBitSetAlloc(24);
+    psBitSet* and = psBitSetAlloc(24);
+    for(psS32 i=0; i<24; i++) {
+        if ((i & 2) == 0) {
+            bs1 = psBitSetSet(bs1, i);
+        }
+        if ((i & 1) == 0) {
+            bs2 = psBitSetSet(bs2, i);
+        }
+        if (((i & 1) == 0) && ((i & 2) == 0) ) {
+            and = psBitSetSet(and, i);
+        }
+    }
+    binOut1 = psBitSetToString(bs1);
+    binOut2 = psBitSetToString(bs2);
+    binOut3 = psBitSetToString(and);
+    fprintf(stderr,"psBitSetOp input is %s, %s.  Truth is %s.\n",
+            binOut1,binOut2,binOut3);
+    psFree(binOut1);
+    psFree(binOut2);
+    psFree(binOut3);
+
+    // Test B - Perform binary AND with psBitSets
+    psLogMsg(__func__,PS_LOG_INFO,"Perform binary AND with psBitSets");
+    psBitSet* outbs = psBitSetAlloc(24);
+    outbs = psBitSetOp(outbs, bs1, "AND", bs2);
+    if (outbs == NULL) {
+        psAbort(__func__,"psBitSetOp returned a NULL result for AND operation");
+    }
+
+    for(psS32 i=0; i<24; i++) {
+        psBool truth = psBitSetTest(and,i);
+        psBool res = psBitSetTest(outbs,i);
+        if ( res != truth) {
+            binOut1 = psBitSetToString(bs1);
+            binOut2 = psBitSetToString(bs2);
+            binOut3 = psBitSetToString(outbs);
+            psAbort(__func__,"psBitSetOp with AND operator failed.\nInput was %s, %s.  Output was %s",
+                    binOut1,binOut2,binOut3);
+        }
+    }
+    psFree(outbs);
+
+    // Test C - Perform binary AND and auto allocate output
+    psLogMsg(__func__,PS_LOG_INFO,"Perform binary AND and auto allocate output");
+    outbs = psBitSetOp(NULL, bs1, "AND", bs2);
+    if (outbs == NULL) {
+        psAbort(__func__,"psBitSetOp failed to create a new psBitSet for the result");
+    }
+    for(psS32 i=0; i<24; i++) {
+        psBool truth = psBitSetTest(and,i);
+        psBool res = psBitSetTest(outbs,i);
+        if ( res != truth) {
+            binOut1 = psBitSetToString(bs1);
+            binOut2 = psBitSetToString(bs2);
+            binOut3 = psBitSetToString(outbs);
+            psAbort(__func__,"psBitSetOp with AND operator failed.\nInput was %s, %s.  Output was %s",
+                    binOut1,binOut2,binOut3);
+        }
+    }
+    psFree(outbs);
+
+    psFree(bs1);
+    psFree(bs2);
+    psFree(and);
+
+    return 0;
+}
+
+static psS32 testBitSet03(void)
+{
+    char *binOut1 = NULL;
+    char *binOut2 = NULL;
+    char *binOut3 = NULL;
+
+    psBitSet* bs1 = psBitSetAlloc(24);
+    psBitSet* bs2 = psBitSetAlloc(24);
+    psBitSet* or = psBitSetAlloc(24);
+    for(psS32 i=0; i<24; i++) {
+        if ((i/2) % 2) {
+            bs1 = psBitSetSet(bs1, i);
+        }
+        if ((i) % 2) {
+            bs2 = psBitSetSet(bs2, i);
+        }
+        if ( ((i/2) % 2) || ((i) % 2) ) {
+            or = psBitSetSet(or, i);
+        }
+    }
+
+    binOut1 = psBitSetToString(bs1);
+    binOut2 = psBitSetToString(bs2);
+    binOut3 = psBitSetToString(or);
+    fprintf(stderr,"psBitSetOp input is %s, %s.  Truth is %s.\n",
+            binOut1,binOut2,binOut3);
+    psFree(binOut1);
+    psFree(binOut2);
+    psFree(binOut3);
+
+    // Test B - Perform binary AND with psBitSets
+    psLogMsg(__func__,PS_LOG_INFO,"Perform binary OR with psBitSets");
+    psBitSet* outbs = psBitSetAlloc(24);
+    outbs = psBitSetOp(outbs, bs1, "OR", bs2);
+    if (outbs == NULL) {
+        psAbort(__func__,"psBitSetOp returned a NULL result for OR operation");
+    }
+
+    for(psS32 i=0; i<24; i++) {
+        psBool truth = psBitSetTest(or,i);
+        psBool res = psBitSetTest(outbs,i);
+        if ( res != truth) {
+            binOut1 = psBitSetToString(bs1);
+            binOut2 = psBitSetToString(bs2);
+            binOut3 = psBitSetToString(outbs);
+            psAbort(__func__,"psBitSetOp with OR operator failed.\nInput was %s, %s.  Output was %s",
+                    binOut1,binOut2,binOut3);
+        }
+    }
+    psFree(outbs);
+
+    // Test C - Perform binary AND and auto allocate output
+    psLogMsg(__func__,PS_LOG_INFO,"Perform binary OR and auto allocate output");
+    outbs = psBitSetOp(NULL, bs1, "OR", bs2);
+    if (outbs == NULL) {
+        psAbort(__func__,"psBitSetOp failed to create a new psBitSet for the result");
+    }
+    for(psS32 i=0; i<24; i++) {
+        psBool truth = psBitSetTest(or,i);
+        psBool res = psBitSetTest(outbs,i);
+        if ( res != truth) {
+            binOut1 = psBitSetToString(bs1);
+            binOut2 = psBitSetToString(bs2);
+            binOut3 = psBitSetToString(outbs);
+            psAbort(__func__,"psBitSetOp with OR operator failed.\nInput was %s, %s.  Output was %s",
+                    binOut1,binOut2,binOut3);
+        }
+    }
+    psFree(outbs);
+    outbs = NULL;
+
+    psFree(bs1);
+    psFree(bs2);
+    psFree(or);
+
+    return 0;
+}
+
+static psS32 testBitSet04(void)
+{
+    char *binOut1 = NULL;
+    char *binOut2 = NULL;
+    char *binOut3 = NULL;
+
+    psBitSet* bs1 = psBitSetAlloc(24);
+    psBitSet* bs2 = psBitSetAlloc(24);
+    psBitSet* xor = psBitSetAlloc(24);
+    for(psS32 i=0; i<24; i++) {
+        if ((i/2) % 2) {
+            bs1 = psBitSetSet(bs1, i);
+        }
+        if ((i) % 2) {
+            bs2 = psBitSetSet(bs2, i);
+        }
+        if ( ((i/2) % 2) != ((i) % 2) ) {
+            xor = psBitSetSet(xor, i);
+        }
+    }
+
+    binOut1 = psBitSetToString(bs1);
+    binOut2 = psBitSetToString(bs2);
+    binOut3 = psBitSetToString(xor);
+    fprintf(stderr,"psBitSetOp input is %s, %s.  Truth is %s.\n",
+            binOut1,binOut2,binOut3);
+    psFree(binOut1);
+    psFree(binOut2);
+    psFree(binOut3);
+
+    // Test B - Perform binary AND with psBitSets
+    psLogMsg(__func__,PS_LOG_INFO,"Perform binary XOR with psBitSets");
+    psBitSet* outbs = psBitSetAlloc(24);
+    outbs = psBitSetOp(outbs, bs1, "XOR", bs2);
+    if (outbs == NULL) {
+        psAbort(__func__,"psBitSetOp returned a NULL result for XOR operation");
+    }
+
+    for(psS32 i=0; i<24; i++) {
+        psBool truth = psBitSetTest(xor,i);
+        psBool res = psBitSetTest(outbs,i);
+        if ( res != truth) {
+            binOut1 = psBitSetToString(bs1);
+            binOut2 = psBitSetToString(bs2);
+            binOut3 = psBitSetToString(outbs);
+            psAbort(__func__,"psBitSetOp with XOR operator failed.\nInput was %s, %s.  Output was %s",
+                    binOut1,binOut2,binOut3);
+        }
+    }
+    psFree(outbs);
+
+    // Test C - Perform binary AND and auto allocate output
+    psLogMsg(__func__,PS_LOG_INFO,"Perform binary XOR and auto allocate output");
+    outbs = psBitSetOp(NULL, bs1, "XOR", bs2);
+    if (outbs == NULL) {
+        psAbort(__func__,"psBitSetOp failed to create a new psBitSet for the result");
+    }
+    for(psS32 i=0; i<24; i++) {
+        psBool truth = psBitSetTest(xor,i);
+        psBool res = psBitSetTest(outbs,i);
+        if ( res != truth) {
+            binOut1 = psBitSetToString(bs1);
+            binOut2 = psBitSetToString(bs2);
+            binOut3 = psBitSetToString(outbs);
+            psAbort(__func__,"psBitSetOp with XOR operator failed.\nInput was %s, %s.  Output was %s",
+                    binOut1,binOut2,binOut3);
+        }
+    }
+    psFree(outbs);
+    outbs = NULL;
+
+    psFree(bs1);
+    psFree(bs2);
+    psFree(xor);
+
+    return 0;
+}
+
+static psS32 testBitSet05(void)
+{
+    char *binOut1 = NULL;
+    char *binOut2 = NULL;
+
+    psBitSet* bs1 = psBitSetAlloc(24);
+    psBitSet* not = psBitSetAlloc(24);
+    for(psS32 i=0; i<24; i++) {
+        if (i % 2) {
+            bs1 = psBitSetSet(bs1, i);
+        }
+        if (i % 2 == 0) {
+            not = psBitSetSet(not, i);
+        }
+    }
+
+    binOut1 = psBitSetToString(bs1);
+    binOut2 = psBitSetToString(not);
+    fprintf(stderr,"psBitSetOp input is %s.  Truth is %s.\n",
+            binOut1,binOut2);
+    psFree(binOut1);
+    psFree(binOut2);
+
+    // Test B - Perform binary AND with psBitSets
+    psLogMsg(__func__,PS_LOG_INFO,"Perform binary NOT with psBitSets");
+    psBitSet* outbs = psBitSetAlloc(24);
+    outbs = psBitSetNot(outbs, bs1);
+    if (outbs == NULL) {
+        psAbort(__func__,"psBitSetOp returned a NULL result for NOT operation");
+    }
+
+    for(psS32 i=0; i<24; i++) {
+        psBool truth = psBitSetTest(not,i);
+        psBool res = psBitSetTest(outbs,i);
+        if ( res != truth) {
+            binOut1 = psBitSetToString(bs1);
+            binOut2 = psBitSetToString(outbs);
+            psAbort(__func__,"psBitSetOp with NOT operator failed.\nInput was %s.  Output was %s",
+                    binOut1,binOut2);
+        }
+    }
+    psFree(outbs);
+
+    // Test C - Perform binary AND and auto allocate output
+    psLogMsg(__func__,PS_LOG_INFO,"Perform binary NOT and auto allocate output");
+    outbs = psBitSetNot(NULL, bs1);
+    if (outbs == NULL) {
+        psAbort(__func__,"psBitSetOp failed to create a new psBitSet for the result");
+    }
+    for(psS32 i=0; i<24; i++) {
+        psBool truth = psBitSetTest(not,i);
+        psBool res = psBitSetTest(outbs,i);
+        if ( res != truth) {
+            binOut1 = psBitSetToString(bs1);
+            binOut2 = psBitSetToString(outbs);
+            psAbort(__func__,"psBitSetOp with NOT operator failed.\nInput was %s.  Output was %s",
+                    binOut1,binOut2);
+        }
+    }
+    psFree(outbs);
+    outbs = NULL;
+
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error");
+    if(psBitSetNot(NULL,NULL) != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"psBitSetNot did not return NULL with NULL input");
+        return 30;
+    }
+
+    psFree(bs1);
+    psFree(not);
+
+    return 0;
+}
+
+static psS32 testBitSet06(void)
+{
+    psErr* err;
+
+    psBitSet* bs1 = psBitSetAlloc(24);
+    psBitSet* bs2 = psBitSetAlloc(40);
+
+    psLogMsg(__func__,PS_LOG_INFO,"Following should be an error");
+    psBitSet* outbs = psBitSetOp(NULL, bs1, "XOR", bs2);
+    if (outbs != NULL) {
+        psAbort(__func__,"psBitSetOp did not return a NULL result when input sizes differ");
+    }
+
+    err = psErrorLast();
+    if (err->code != PS_ERR_BAD_PARAMETER_SIZE) {
+        psErrorStackPrint(stderr,"Error Stack:");
+        psAbort(__func__,"psBitSetOp didn't generate expected error with operands' sizes differed.");
+    }
+    psFree(err);
+    psFree(bs1);
+    psFree(bs2);
+
+    bs1 = psBitSetAlloc(24);
+    bs2 = psBitSetAlloc(24);
+
+    outbs = psBitSetAlloc(40);
+    psBitSet* outbs2 = psBitSetOp(outbs, bs1, "XOR", bs2);
+    if (outbs2 == NULL) {
+        psAbort(__func__,"psBitSetOp failed when input size and output size differed (a recoverable error).");
+    }
+    if (outbs2 != outbs) {
+        psAbort(__func__,"psBitSetOp didn't reuse the given output struct.");
+    }
+    if (outbs2->n != bs1->n) {
+        psAbort(__func__,"psBitSetOp did properly adjust the output psBitSet size.");
+    }
+
+    psErrorClear();
+    psLogMsg(__func__,PS_LOG_INFO,"Following is an error.");
+    outbs = psBitSetOp(outbs, bs1, "FOO", bs2);
+    if (outbs != NULL) {
+        psAbort(__func__,"psBitSetOp returned something in case of a bogus operation.");
+    }
+    err = psErrorLast();
+    if (err->code != PS_ERR_BAD_PARAMETER_VALUE) {
+        psErrorStackPrint(stderr,"Error Stack:");
+        psAbort(__func__,"psBitSetOp didn't generate expected error with bogus operator.");
+    }
+    psFree(err);
+
+
+    // try again, though give a valid output bitset -- should free the out upon error to avoid leak.
+    outbs = psBitSetAlloc(24);
+    psErrorClear();
+    psLogMsg(__func__,PS_LOG_INFO,"Following is an error.");
+    outbs = psBitSetOp(outbs, bs1, "FOO", bs2);
+
+    err = psErrorLast();
+    if (err->code != PS_ERR_BAD_PARAMETER_VALUE) {
+        psErrorStackPrint(stderr,"Error Stack:");
+        psAbort(__func__,"psBitSetOp didn't generate expected error with bogus operator.");
+    }
+    psFree(err);
+
+
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error");
+    if(psBitSetOp(outbs,NULL,"AND",bs2) != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"psBitSetOp did not return NULL with NULL input 1 bit set");
+        return 40;
+    }
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error");
+    if(psBitSetOp(outbs,bs1,NULL,bs2) != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"psBitSetOp did not return NULL with NULL operator");
+        return 41;
+    }
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error");
+    if(psBitSetOp(outbs,bs1,"AND",NULL) != NULL)  {
+        psError(PS_ERR_UNKNOWN,true,"psBitSetOp did not return NULL with NULL input 2 bit set");
+        return 42;
+    }
+
+    psFree(bs1);
+    psFree(bs2);
+    psFree(outbs);
+
+    return 0;
+}
Index: /tags/ipp-1-X/bug123/psLib/test/collections/tst_psHash00.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/collections/tst_psHash00.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/collections/tst_psHash00.c	(revision 22331)
@@ -0,0 +1,64 @@
+/*****************************************************************************
+    This code will test whether a hash table can be allocated successfully,
+    then deallocated successfully.
+ *****************************************************************************/
+#include <stdio.h>
+#include "pslib_strict.h"
+#include "psTest.h"
+#include "psHash.h"
+#define NUM_HASH_TABLE_BUCKETS 10
+psS32 main()
+{
+    psHash *myHashTable = NULL;
+    psS32 testStatus      = true;
+    psS32 i               = 0;
+    psS32 currentId = psMemGetId();
+    psS32 memLeaks        = 0;
+    printPositiveTestHeader(stdout,
+                            "psHash functions",
+                            "psHashAlloc()");
+
+    myHashTable = psHashAlloc(NUM_HASH_TABLE_BUCKETS);
+
+    if (myHashTable == NULL) {
+        fprintf(stderr, "%s: could not allocate a hash table.", __func__);
+        testStatus = false;
+    }
+
+    if (myHashTable->nbucket != NUM_HASH_TABLE_BUCKETS) {
+        fprintf(stderr, "%s: myHashTable->nbucket not set properly.\n",
+                __func__);
+        testStatus = false;
+
+    }
+
+    if (myHashTable->buckets == NULL) {
+        fprintf(stderr, "%s: myHashTable->buckets is NULL.\n",
+                __func__);
+        testStatus = false;
+
+    }
+
+    for (i=0;i<NUM_HASH_TABLE_BUCKETS;i++) {
+        if (myHashTable->buckets[i] != NULL) {
+            fprintf(stderr, "%s: hash table bucket[%d] not equal to NULL.\n",
+                    __func__, i);
+            testStatus = false;
+        }
+    }
+
+    printFooter(stdout,
+                "psHash functions",
+                "psHashAlloc()",
+                testStatus);
+
+    psFree(myHashTable);
+
+    memLeaks = psMemCheckLeaks(currentId,NULL,stderr,false);
+    if (0 != memLeaks) {
+        psAbort(__func__,"Memory Leaks! (%d leaks)", memLeaks);
+    }
+    psMemCheckCorruption(1);
+
+    return (!testStatus);
+}
Index: /tags/ipp-1-X/bug123/psLib/test/collections/tst_psHash01.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/collections/tst_psHash01.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/collections/tst_psHash01.c	(revision 22331)
@@ -0,0 +1,155 @@
+/*****************************************************************************
+    This code will test whether a hash table can be de-allocated successfully.
+ *****************************************************************************/
+#include <stdio.h>
+#include <string.h>
+#include "pslib_strict.h"
+#include "psTest.h"
+#include "psHash.h"
+#define NUM_HASH_TABLE_BUCKETS 100
+psS32 imGlobal = 0;
+
+typedef struct
+{
+    char *name;
+}
+ID;
+
+static void IdFree(ID *id);
+
+static ID *IdAlloc(const char *name)
+{
+    ID *id = psAlloc(sizeof(ID));
+    psMemSetDeallocator(id,(psFreeFcn)IdFree);
+    id->name = psStringCopy(name);
+
+    return id;
+}
+
+static void IdFree(ID *id)
+{
+    imGlobal++;
+    psFree(id->name);
+}
+
+psS32 main()
+{
+    psHash *myHashTable = NULL;
+    psS32 testStatus      = true;
+    psS32 currentId = psMemGetId();
+    ID* id = NULL;
+    ID* replaceId = NULL;
+    psS32 memLeaks        = 0;
+    psBool  retVal = false;
+
+    // Allocate memory for Hash Table
+    printPositiveTestHeader(stdout,"psHash functions","psHashAlloc");
+    myHashTable = psHashAlloc(NUM_HASH_TABLE_BUCKETS);
+    if(myHashTable == NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Unable to allocate psHash table");
+        return 10;
+    }
+    printFooter(stdout,"psHash functions","psHashAlloc",true);
+
+    // Add items to Hash table
+    id = IdAlloc("IDA");
+    printPositiveTestHeader(stdout,"psHash functions","psHashAdd");
+    retVal = psHashAdd(myHashTable, "ENTRY00", id);
+    psFree(id);
+    if( !retVal) {
+        psError(PS_ERR_UNKNOWN, true, "psHashAdd unable to add ENTRY00");
+        return 1;
+    }
+
+    id = IdAlloc("IDB");
+    retVal = psHashAdd(myHashTable, "ENTRY01", id);
+    psFree(id);
+    if (!retVal) {
+        psError(PS_ERR_UNKNOWN, true, "psHashAdd unable to add ENTRY01");
+        return 2;
+    }
+
+    id = IdAlloc("IDC");
+    retVal = psHashAdd(myHashTable, "ENTRY02", id);
+    psFree(id);
+    if(!retVal) {
+        psError(PS_ERR_UNKNOWN,true,"psHashAdd unable to add ENTRY02");
+        return 3;
+    }
+
+    id = IdAlloc("IDD");
+    retVal =psHashAdd(myHashTable, "ENTRY03", id);
+    psFree(id);
+    if(!retVal) {
+        psError(PS_ERR_UNKNOWN,true,"psHashAdd unable to add ENTRY03");
+        return 4;
+    }
+    printFooter(stdout,"psHash functions","psHashAdd",true);
+
+    // Replace item with same key
+    printPositiveTestHeader(stdout,"psHash replace item","psHashAdd");
+    id = IdAlloc("IDE");
+    retVal = psHashAdd(myHashTable,"ENTRY02",id);
+    if(!retVal) {
+        psError(PS_ERR_UNKNOWN,true,"psHashAdd unable to replace ENTRY02");
+        return 5;
+    }
+    replaceId = psHashLookup(myHashTable,"ENTRY02");
+    if(strcmp(replaceId->name,"IDE") != 0) {
+        psError(PS_ERR_UNKNOWN,true,"psHashAdd did not replace ENTRY02 with correct item");
+        return 6;
+    }
+    printFooter(stdout,"psHash replace item","psHashAdd",true);
+
+    // Add with NULL hash table specified
+    printNegativeTestHeader(stdout,"psHashAdd","NULL hash table","Hash table can not be NULL.",0);
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message: psHashAdd with null table");
+    retVal = psHashAdd(NULL,"ENTRY04",id);
+    if(retVal) {
+        psError(PS_ERR_UNKNOWN,true,"psHashAdd added entry to NULL hash table.");
+        return 20;
+    }
+    printFooter(stdout,"psHashAdd","NULL hash table",true);
+
+    // Add with key to valid hash table NULL
+    printNegativeTestHeader(stdout,"psHashAdd","NULL key","Hash key can not be NULL.",0);
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message: psHashAdd with null key");
+    retVal = psHashAdd(myHashTable,NULL,id);
+    if(retVal) {
+        psError(PS_ERR_UNKNOWN,true,"psHashAdd added entry to hash table with NULL key.");
+        return 21;
+    }
+    printFooter(stdout,"psHashAdd","NULL hash key",true);
+
+    // Add NULL hash data to valid table and key
+    printNegativeTestHeader(stdout,"psHashAdd","NULL hash data","Hash data can not be NULL.",0);
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message: psHashAdd with null data");
+    retVal = psHashAdd(myHashTable,"ENTRY04",NULL);
+    if(retVal) {
+        psError(PS_ERR_UNKNOWN,true,"psHashAdd added entry to hash table with NULL data.");
+        return 22;
+    }
+    printFooter(stdout,"psHashAdd","NULL hash data",true);
+
+    // Free hash table
+    printPositiveTestHeader(stdout,"psHash functions","psHashFree");
+    psFree(id);
+
+    psFree(myHashTable);
+
+    if (imGlobal != 5) {
+        fprintf(stderr, "%s: only (%d/4) entries were freed",
+                __func__, imGlobal);
+        testStatus = false;
+    }
+
+    printFooter(stdout,"psHash functions","psHashFree()",testStatus);
+
+    memLeaks = psMemCheckLeaks(currentId,NULL,stderr,false);
+    if (memLeaks != 0) {
+        psAbort(__func__,"Memory Leaks! (%d leaks)", memLeaks);
+    }
+    psMemCheckCorruption(1);
+
+    return (!testStatus);
+}
Index: /tags/ipp-1-X/bug123/psLib/test/collections/tst_psHash02.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/collections/tst_psHash02.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/collections/tst_psHash02.c	(revision 22331)
@@ -0,0 +1,113 @@
+/*****************************************************************************
+    This code will test whether hash tables entries can be inserted correctly,
+    and retrieved correctly.
+ 
+    NOTE: Add code to test whether duplicates are handled correctly (use a
+    small hash table and lots of keys).
+ *****************************************************************************/
+#include <stdio.h>
+#include <string.h>
+#include "pslib_strict.h"
+#include "psTest.h"
+#include "psHash.h"
+#define NUM_HASH_TABLE_BUCKETS 100
+psS32 imGlobal = 0;
+
+typedef struct
+{
+    char *name;
+}
+ID;
+static void IdFree(ID *id);
+
+static ID *IdAlloc(const char *name)
+{
+    ID *id = psAlloc(sizeof(ID));
+    psMemSetDeallocator(id,(psFreeFcn)IdFree);
+    id->name = psStringCopy(name);
+
+    return id;
+}
+
+static void IdFree(ID *id)
+{
+    imGlobal++;
+    psFree(id->name);
+}
+
+psS32 main()
+{
+    psHash *myHashTable = NULL;
+    psS32 testStatus      = true;
+    psS32 i               = 0;
+    ID *id = NULL;
+    char *myKeys[] = {"ENTRY00", "ENTRY01", "ENTRY02", "ENTRY03", NULL
+                     };
+    char *myData[] = {"IDA", "IDB", "IDC", "IDD", NULL
+                     };
+    psS32 currentId = psMemGetId();
+    psS32 memLeaks        = 0;
+
+    printPositiveTestHeader(stdout,"psHash functions","psHashLookup");
+
+    myHashTable = psHashAlloc(NUM_HASH_TABLE_BUCKETS);
+    i = 0;
+    while (myKeys[i] != NULL) {
+        id = IdAlloc(myData[i]);
+        psHashAdd(myHashTable, myKeys[i], id);
+        psFree(id);
+        i++;
+    }
+
+    i = 0;
+    while (myKeys[i] != NULL) {
+        id = psHashLookup(myHashTable, myKeys[i]);
+        if (0 != strcmp(myData[i], id->name)) {
+            fprintf(stderr, "%s: Hash table entry for key %s was %s (should be %s).\n",
+                    __func__, myKeys[i], id->name, myData[i]);
+            return 1;
+        }
+        i++;
+    }
+    printFooter(stdout,"psHash functions","psHashLookup",true);
+
+    // Use an invalid key in the hash table: verify no item is returned
+    printNegativeTestHeader(stdout,"psHashLookup","Invalid key","Key is not found in the table",0);
+    id = psHashLookup(myHashTable, "BogusKey");
+    if (id != NULL) {
+        fprintf(stderr, "%s: Hash table entry for key %s was not NULL.\n",
+                __func__, "BogusKey");
+        return 2;
+    }
+    printFooter(stdout,"psHashLookup","Invalid key",true);
+
+    // Lookup with null table
+    printNegativeTestHeader(stdout,"psHashLookup","NULL table","Can not lookup with NULL table",0);
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message: psHashLookup with null table");
+    id = psHashLookup(NULL,"ENTRY01");
+    if (id != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"psHashLookup retrieved an entry from NULL hash table.");
+        return 3;
+    }
+    printFooter(stdout,"psHashLookup","NULL table",true);
+
+    // Lookup with null key
+    printNegativeTestHeader(stdout,"psHashLookup","NULL key","Can not lookup with NULL key.",0);
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message: psHashLookup with null key");
+    id = psHashLookup(myHashTable,NULL);
+    if (id != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"psHashLookup retrieved an entry with NULL key.");
+        return 4;
+    }
+    printFooter(stdout,"psHashLookup","NULL key",true);
+
+    psFree(myHashTable);
+
+    memLeaks = psMemCheckLeaks(currentId,NULL,stderr,false);
+    if (0 != memLeaks) {
+        psAbort(__func__,"Memory Leaks! (%d leaks)", memLeaks);
+    }
+    psMemCheckCorruption(1);
+
+    return (!testStatus);
+}
Index: /tags/ipp-1-X/bug123/psLib/test/collections/tst_psHash03.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/collections/tst_psHash03.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/collections/tst_psHash03.c	(revision 22331)
@@ -0,0 +1,142 @@
+/*****************************************************************************
+    This code will test whether hash tables entries can be removed correctly.
+ 
+    NOTE: Add code to test whether duplicates are handled correctly.
+ *****************************************************************************/
+#include <stdio.h>
+#include <string.h>
+#include "pslib_strict.h"
+#include "psTest.h"
+#include "psHash.h"
+#include "psMemory.h"
+#define NUM_HASH_TABLE_BUCKETS 100
+psS32 imGlobal = 0;
+psS32 currentId = 0;
+
+typedef struct
+{
+    char *name;
+}
+ID;
+static void IdFree(ID *id);
+
+static ID *IdAlloc(const char *name)
+{
+    ID *id = NULL;
+
+    id = psAlloc(sizeof(ID));
+    psMemSetDeallocator(id,(psFreeFcn)IdFree);
+
+    id->name = psStringCopy(name);
+
+    return id;
+}
+
+static void IdFree(ID *id)
+{
+    imGlobal++;
+    psFree(id->name);
+}
+
+psS32 main()
+{
+    psHash *myHashTable = NULL;
+    psS32 testStatus      = true;
+    psS32 i               = 0;
+    psS32 TotalKeys       = 0;
+    psBool retVal         = false;
+    ID *id = NULL;
+    ID *ids[4];
+    char *myKeys[] = {"ENTRY00", "ENTRY01", "ENTRY02", "ENTRY03", NULL
+                     };
+    char *myData[] = {"IDA", "IDB", "IDC", "IDD", NULL
+                     };
+    psS32 memLeaks        = 0;
+
+    currentId = psMemGetId();
+
+    printPositiveTestHeader(stdout,"psHash functions","psHashRemove");
+
+    // Add items to hash table
+    myHashTable = psHashAlloc(NUM_HASH_TABLE_BUCKETS);
+    i = 0;
+    while (myKeys[i] != NULL) {
+        ids[i] = IdAlloc(myData[i]);
+        psHashAdd(myHashTable, myKeys[i], ids[i]);
+        i++;
+    }
+    TotalKeys = i - 1;
+
+    // Verify items which were just add to hash table
+    i = TotalKeys;
+    while (i >= 0) {
+
+        id = psHashLookup(myHashTable, myKeys[i]);
+        if (0 != strcmp(myData[i], id->name)) {
+            fprintf(stderr, "%s: Hash table entry for key %s was %s (should be %s).\n",
+                    __func__, myKeys[i], id->name, myData[i]);
+            return 1;
+        }
+        i--;
+    }
+
+    // Remove each item from the table and verify item is no longer in the list
+    i = 0;
+    while (myKeys[i] != NULL) {
+        // The psHashRemove() procedure removes the entry from the hash
+        // table and deletes the data.
+        retVal = psHashRemove(myHashTable, myKeys[i]);
+        if (!retVal) {
+            fprintf(stderr,"%s: Hash table entry not removed.\n",__func__);
+            return 2;
+        }
+        id = psHashLookup(myHashTable, myKeys[i]);
+        if (id != NULL) {
+            fprintf(stderr, "%s: Hash table entry for key %s not removed.\n",
+                    __func__, "IDA");
+            return 3;
+        }
+        i++;
+    }
+    printFooter(stdout,"psHash functions","psHashRemove()",true);
+
+    // Use an invalid key in the hash table: verify false is returned
+    printNegativeTestHeader(stdout,"psHashRemove","Invalid key","Key is not found in table",0);
+    if (psHashRemove(myHashTable,"BogusKey") ) {
+        psError(PS_ERR_UNKNOWN,true,"psHashRemove removed an entry with a bogus key.");
+        return 4;
+    }
+    printFooter(stdout,"psHashRemove","Invalid key",true);
+
+    // Remove with null table
+    printNegativeTestHeader(stdout,"psHashRemove","NULL table","Can not remove with NULL table",0);
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message: psHashRemove with null table");
+    retVal = psHashRemove(NULL,"ENTRY02");
+    if (retVal) {
+        psError(PS_ERR_UNKNOWN,true,"psHashRemove removed an entry from NULL hash table.");
+        return 5;
+    }
+    printFooter(stdout,"psHashRemove","NULL table",true);
+
+    // Remove with null key
+    printNegativeTestHeader(stdout,"psHashRemove","NULL key","Can not remove with NULL key",0);
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message: psHashRemove with null key");
+    if (psHashRemove(myHashTable,NULL) ) {
+        psError(PS_ERR_UNKNOWN,true,"psHashRemove removed an entry from NULL key");
+        return 6;
+    }
+    printFooter(stdout,"psHashRemove","NULL key",true);
+
+    psFree(myHashTable);
+    for(i=0; i<(TotalKeys+1); i++) {
+        psFree(ids[i]);
+    }
+    memLeaks = psMemCheckLeaks(currentId,NULL,stdout,false);
+    if (memLeaks != 0) {
+        psAbort(__func__,"Memory Leaks! (%d leaks)", memLeaks);
+    }
+    psMemCheckCorruption(true);
+
+    return (!testStatus);
+}
+
Index: /tags/ipp-1-X/bug123/psLib/test/collections/tst_psHash04.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/collections/tst_psHash04.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/collections/tst_psHash04.c	(revision 22331)
@@ -0,0 +1,84 @@
+/*****************************************************************************
+    This code will test whether the call psHashKeyList() function works.
+ *****************************************************************************/
+#include <stdio.h>
+#include "pslib_strict.h"
+#include "psTest.h"
+#include "psHash.h"
+#define NUM_HASH_TABLE_BUCKETS 100
+psS32 imGlobal = 0;
+
+typedef struct
+{
+    char *name;
+}
+ID;
+static void IdFree(ID *id);
+
+static ID *IdAlloc(const char *name)
+{
+    ID *id = psAlloc(sizeof(ID));
+    psMemSetDeallocator(id,(psFreeFcn)IdFree);
+
+    id->name = psStringCopy(name);
+
+    return id;
+}
+
+static void IdFree(ID *id)
+{
+    imGlobal++;
+    psFree(id->name);
+}
+
+psS32 main()
+{
+    psHash *myHashTable = NULL;
+    psS32 testStatus      = true;
+    psS32 i               = 0;
+    char *myKeys[] = {"ENTRY00", "ENTRY01", "ENTRY02", "ENTRY03", NULL
+                     };
+    char *myData[] = {"IDA", "IDB", "IDC", "IDD", NULL
+                     };
+    psS32 currentId = psMemGetId();
+    psS32 memLeaks        = 0;
+    psList *myLinkList = NULL;
+    psListElem *tmp = NULL;
+    ID* id = NULL;
+
+    printPositiveTestHeader(stdout,"psHash functions","psHashKeyList()");
+    myHashTable = psHashAlloc(NUM_HASH_TABLE_BUCKETS);
+    i = 0;
+    while (myKeys[i] != NULL) {
+        id = IdAlloc(myData[i]);
+        psHashAdd(myHashTable, myKeys[i], id);
+        psFree(id);
+        i++;
+    }
+    myLinkList = psHashKeyList(myHashTable);
+    tmp = myLinkList->head;
+    while (tmp != NULL) {
+        printf("Linked List Entries: %s\n", (char *) tmp->data);
+        tmp = tmp->next;
+    }
+    printFooter(stdout,"psHash functions","psHashKeyList()",testStatus);
+    psFree(myLinkList);
+
+    printNegativeTestHeader(stdout,"psHashKeyList","NULL table","Can not lookup with NULL table",0);
+    myLinkList = psHashKeyList(NULL);
+    if(myLinkList != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"psHashKeyList retrieved a key list from a NULL table.");
+        return 1;
+    }
+    printFooter(stdout,"psHashKeyList","NULL table",true);
+
+    psFree(myHashTable);
+
+    memLeaks = psMemCheckLeaks(currentId,NULL,stderr,false);
+    if (memLeaks != 0) {
+        psAbort(__func__,"Memory Leaks! (%d leaks)", memLeaks);
+    }
+    psMemCheckCorruption(1);
+
+    return(!testStatus);
+}
Index: /tags/ipp-1-X/bug123/psLib/test/collections/tst_psHash05.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/collections/tst_psHash05.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/collections/tst_psHash05.c	(revision 22331)
@@ -0,0 +1,172 @@
+/** @file  tst_psHash05.c
+*
+*  @brief Contains the tests for psHash.[ch]
+*
+*
+*  @author Robert DeSonia, MHPCC
+*
+*  @version $Revision: 1.3 $ $Name: not supported by cvs2svn $
+*  @date $Date: 2005-04-07 20:27:41 $
+*
+*  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+*/
+
+#include "psTest.h"
+#include "pslib_strict.h"
+
+static psS32 hashToArray( void );
+
+testDescription tests[] = {
+                              {hashToArray, 789, "psHashToArray", 0, false},
+                              {NULL}
+                          };
+
+static void printIntArray(char* name, psArray* arr)
+{
+    if (arr == NULL) {
+        printf("%s = NULL\n",name);
+        return;
+    }
+
+    printf("%s = {",name);
+    for (int i = 0; i < arr->n; i++) {
+        if (arr->data[i] == NULL) {
+            printf("NULL");
+        } else {
+            printf("%d",*(int*)arr->data[i]);
+        }
+        if (i != arr->n-1) {
+            printf(",");
+        }
+    }
+    printf("}");
+}
+
+psS32 main( psS32 argc, char* argv[] )
+{
+    psLogSetLevel( PS_LOG_INFO );
+
+    return ( ! runTestSuite( stderr, "psHash", tests, argc, argv ) );
+}
+
+psS32 hashToArray( void )
+{
+    int testNum = 0;
+    psArray* array;
+    #define BUCKETS 10
+
+    psHash* hash = psHashAlloc(BUCKETS);
+    char key[2] = "A";
+    bool found[BUCKETS];
+
+    for (int i = 0; i < BUCKETS; i++) {
+
+        array = psHashToArray(hash);
+
+        // return non-null?
+        testNum++;
+        if (array == NULL) {
+            psError(PS_ERR_UNKNOWN, false,
+                    "Failed to create an array from a psHash of %d elements.",
+                    i);
+            return testNum;
+        }
+
+        // the size correct
+        testNum++;
+        if (array->n != i) {
+            printIntArray("array",array);
+            psError(PS_ERR_UNKNOWN, false,
+                    "psHashToArray created a psArray of %d elements from a psHash of %d elements.",
+                    array->n, i);
+            return testNum;
+        }
+
+        // the values correct?
+
+        // zero out the found boolean vector
+        for (int j = 0; j < i; j++) {
+            found[j] = false;
+        }
+
+        // check if all the items in array are valid
+        for (int k = 0; k < array->n; k++) {
+            int* item = array->data[k];
+
+            testNum++;
+            if (item == NULL) {
+                printIntArray("array",array);
+                psError(PS_ERR_UNKNOWN, true,
+                        "The array position %d was NULL.",
+                        k);
+                return testNum;
+            }
+
+            testNum++;
+            if (*item < 0 || *item >= BUCKETS) {
+                printIntArray("array",array);
+                psError(PS_ERR_UNKNOWN, true,
+                        "The array position %d was invalid (%d).",
+                        k,*item);
+                return testNum;
+            }
+
+            testNum++;
+            if (found[*item]) {
+                printIntArray("array",array);
+                psError(PS_ERR_UNKNOWN, true,
+                        "The array position %d was a duplicate (%d).",
+                        k,*item);
+                return testNum;
+            }
+
+            testNum++;
+            if (psMemGetRefCounter(item) != 2) {
+                printIntArray("array",array);
+                psError(PS_ERR_UNKNOWN, true,
+                        "The array position %d was not properly reference counted (%d).",
+                        k,psMemGetRefCounter(item));
+                return testNum;
+            }
+
+            found[*item] = true;
+        }
+
+        // check that all the items in psHash was found
+        for (int j = 0; j < i; j++) {
+            testNum++;
+            if (! found[j]) {
+                printIntArray("array",array);
+                psError(PS_ERR_UNKNOWN, true,
+                        "Item %d not found in array.",
+                        j);
+                return testNum;
+            }
+        }
+
+        psFree(array);
+
+        // add one element
+        int* value = psAlloc(sizeof(int));
+        *value = i;
+        psHashAdd(hash, key, value);
+        *key += 1; // increment the key value
+
+        psFree(value);
+    }
+
+    psFree(hash);
+
+    psLogMsg(__func__,PS_LOG_INFO,"Following should be an error.");
+    array = psHashToArray(NULL);
+    testNum++;
+    if (array != NULL) {
+        printIntArray("array",array);
+        psError(PS_ERR_UNKNOWN, false,
+                "psHashToArray returned non-null psArray given a null psHash.");
+        return testNum;
+    }
+
+    return 0;
+}
+
Index: /tags/ipp-1-X/bug123/psLib/test/collections/tst_psList.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/collections/tst_psList.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/collections/tst_psList.c	(revision 22331)
@@ -0,0 +1,1272 @@
+/** @file  tst_psList.c
+ *
+ *  @brief Contains the tests for psList.[ch]
+ *
+ *
+ *  @author Robert DeSonia, MHPCC
+ *
+ *  @version $Revision: 1.30 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-04-07 20:27:41 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+
+#include "psTest.h"
+#include "pslib_strict.h"
+
+void printListInt(psList* list);
+
+
+static psS32 testListAlloc(void);
+static psS32 testListAdd(void);
+static psS32 testListGet(void);
+static psS32 testListRemove(void);
+static psS32 testListConvert(void);
+static psS32 testListIterator(void);
+static psS32 testListFree(void);
+static psS32 testListSort(void);
+static psS32 testListAddAfter(void);
+static psS32 testListAddBefore(void);
+
+testDescription tests[] = {
+                              {testListAlloc,487,"psListAlloc",0,false},
+                              {testListAdd,488,"psListAdd",0,false},
+                              {testListGet,489,"psListGet",0,false},
+                              {testListRemove,490,"psListRemove",0,false},
+                              {testListConvert,491,"psListConvert",0,false},
+                              {testListIterator,494,"psListIterator",0,false},
+                              {testListFree,627,"psListFree",0,false},
+                              {testListSort,624,"psListSort",0,false},
+                              {testListAddAfter,811,"psListAddAfter",0,false},
+                              {testListAddBefore,811,"psListAddBefore",0,false},
+                              {NULL}
+                          };
+
+psS32 main(psS32 argc, char* argv[])
+{
+    psLogSetLevel(PS_LOG_INFO);
+
+    if (! runTestSuite(stderr,"psList",tests,argc,argv) ) {
+        psError(PS_ERR_UNKNOWN,true,"One or more tests failed");
+        return 1;
+    }
+    return 0;
+}
+
+psS32 testListAlloc(void)
+{
+    psList* list;
+    psS32 ref;
+    float* data;
+
+    psLogMsg(__func__,PS_LOG_INFO,"psListAlloc shall create a psList with either 0 or 1 element.");
+
+    data = psAlloc(sizeof(float));
+
+    // if psListAlloc is invoked with a NULL parameter, it shall return an
+    // empty psList struct with head=tail=NULL and n=0. Otherwise, it shall
+    // return a psList of one element (head=tail=data, n=1).
+    // Test requirement SDR-167
+    list = psListAlloc(NULL);
+    if (list == NULL) {
+        psError(PS_ERR_UNKNOWN, true,"psListAlloc failed to return a list.");
+        return 1;
+    }
+    if (list->head != NULL || list->tail != NULL) {
+        psError(PS_ERR_UNKNOWN, true,"head and/or tail was not NULL for empty list.");
+        return 2;
+    }
+    if (list->size != 0) {
+        psError(PS_ERR_UNKNOWN, true,"size of list wasn't zero for empty list.");
+        return 3;
+    }
+
+    psFree(list);
+
+    // Test requirement SDR-165
+    list = psListAlloc(data);
+    if (list == NULL) {
+        psError(PS_ERR_UNKNOWN, true,"psListAlloc failed to return a list.");
+        return 4;
+    }
+
+    if (list->head == NULL || list->tail == NULL) {
+        psError(PS_ERR_UNKNOWN, true,"head and/or tail was NULL for one-element new list.");
+        return 5;
+    }
+
+    if (list->head->data != data || list->tail->data != data) {
+        psError(PS_ERR_UNKNOWN, true,"head and/or tail didn't point to data's node for one-element new list.");
+        return 6;
+    }
+
+    if (list->size != 1) {
+        psError(PS_ERR_UNKNOWN, true,"size of list wasn't correctly set for new, one-element list.");
+        return 7;
+    }
+
+    ref = psMemGetRefCounter(data);
+    if (ref != 2) {
+        psError(PS_ERR_UNKNOWN, true,"psList didn't increment reference count of data (%d.",ref);
+        return 8;
+    }
+
+    psFree(list);
+
+    psFree(data);
+
+    return 0;
+}
+
+psS32 testListAddAfter(void)
+{
+    psList* list = NULL;
+    psS32*  data = NULL;
+    psS32*  data1 = NULL;
+    psS32*  data2 = NULL;
+    psListIterator *currentIterator = NULL;
+
+    data = psAlloc(sizeof(psS32));
+    *data = 1;
+    data1 = psAlloc(sizeof(psS32));
+    *data1 = 2;
+    data2 = psAlloc(sizeof(psS32));
+    *data2 = 3;
+
+    list = psListAlloc(data);
+    currentIterator = psListIteratorAlloc(list,PS_LIST_HEAD,true);
+
+    // Add data after HEAD and verify data
+    // Test requirement SDR-755
+    if(!psListAddAfter(currentIterator,data1)) {
+        psError(PS_ERR_UNKNOWN,true,"psListAddAfter failed to add item");
+        return 1;
+    }
+    if(*(psS32*)list->head->next->data != 2) {
+        psError(PS_ERR_UNKNOWN,true,"psListAddAfter did not add the item properly");
+        return 2;
+    }
+    // Test requirement SDR-175
+    if (psMemGetRefCounter(data1) != 2) {
+        psError(PS_ERR_UNKNOWN, true,"psListAddAfter didn't increment the data reference count.");
+        return 20;
+    }
+    psFree(currentIterator);
+
+    currentIterator = psListIteratorAlloc(list,PS_LIST_TAIL,true);
+
+    // Add data after TAIL and verify data
+    if(!psListAddAfter(currentIterator,data2)) {
+        psError(PS_ERR_UNKNOWN,true,"psListAddAfter failed to add item");
+        return 3;
+    }
+    if(*(psS32*)list->tail->data != 3) {
+        psError(PS_ERR_UNKNOWN,true,"psListAddAfter did not add the item properly");
+        return 4;
+    }
+    // Test requirement SDR-175
+    if (psMemGetRefCounter(data2) != 2) {
+        psError(PS_ERR_UNKNOWN, true,"psListAddAfter didn't increment the data reference count.");
+        return 40;
+    }
+
+    // Verify error message generated with data pointer is NULL
+    psLogMsg(__func__,PS_LOG_INFO,"NULL data pointer should generate error message");
+    if(psListAddAfter(currentIterator,NULL)) {
+        psError(PS_ERR_UNKNOWN,true,"psListAddAfter should have generated error.");
+        return 5;
+    }
+
+    // Verify error message generated with iterator NULL
+    psLogMsg(__func__,PS_LOG_INFO,"NULL iterator should generate error message");
+    if(psListAddAfter(NULL,data2)) {
+        psError(PS_ERR_UNKNOWN,true,"psListAddAfter should have generated error.");
+        return 6;
+    }
+
+    // Verify error message is generate with non-mutable iterator
+    psLogMsg(__func__,PS_LOG_INFO,"Non-mutable list should generate error message");
+    currentIterator->mutable = false;
+    if(psListAddAfter(currentIterator,data2)) {
+        psError(PS_ERR_UNKNOWN,true,"psListAddAfter should have generated error for non-mutable list add");
+        return 7;
+    }
+    currentIterator->mutable = true;
+
+    psFree(data);
+    psFree(data1);
+    psFree(data2);
+    psFree(list);
+
+    return 0;
+}
+
+psS32 testListAddBefore(void)
+{
+    psList* list = NULL;
+    psS32*  data1 = NULL;
+    psS32*  data2 = NULL;
+    psListIterator *currentIterator = NULL;
+
+    data1 = psAlloc(sizeof(psS32));
+    *data1 = 2;
+    data2 = psAlloc(sizeof(psS32));
+    *data2 = 3;
+
+    list = psListAlloc(NULL);
+    currentIterator = psListIteratorAlloc(list,PS_LIST_HEAD,true);
+
+    // Add data before HEAD and verify data
+    // Test requirement SDR-756
+    if(!psListAddBefore(currentIterator,data1)) {
+        psError(PS_ERR_UNKNOWN,true,"psListAddBefore failed to add item");
+        return 1;
+    }
+    if(*(psS32*)list->head->data != 2) {
+        psError(PS_ERR_UNKNOWN,true,"psListAddBefore did not add the item properly");
+        return 2;
+    }
+    // Test requirement SDR-175
+    if (psMemGetRefCounter(data1) != 2) {
+        psError(PS_ERR_UNKNOWN, true,"psListAddBefore didn't increment the data reference count.");
+        return 20;
+    }
+    psFree(currentIterator);
+
+    currentIterator = psListIteratorAlloc(list,PS_LIST_TAIL,true);
+
+    // Add data after TAIL and verify data
+    if(!psListAddBefore(currentIterator,data2)) {
+        psError(PS_ERR_UNKNOWN,true,"psListAddBefore failed to add item");
+        return 3;
+    }
+    if(*(psS32*)list->tail->prev->data != 3) {
+        psError(PS_ERR_UNKNOWN,true,"psListAddBefore did not add the item properly");
+        return 4;
+    }
+    // Test requirement SDR-175
+    if (psMemGetRefCounter(data2) != 2) {
+        psError(PS_ERR_UNKNOWN, true,"psListAddBefore didn't increment the data reference count.");
+        return 40;
+    }
+
+    // Verify error message generated with data pointer is NULL
+    psLogMsg(__func__,PS_LOG_INFO,"NULL data pointer should generate error message");
+    if(psListAddBefore(currentIterator,NULL)) {
+        psError(PS_ERR_UNKNOWN,true,"psListAddBefore should have generated error.");
+        return 5;
+    }
+
+    // Verify error message generated with iterator NULL
+    psLogMsg(__func__,PS_LOG_INFO,"NULL iterator should generate error message");
+    if(psListAddBefore(NULL,data2)) {
+        psError(PS_ERR_UNKNOWN,true,"psListAddBefore should have generated error.");
+        return 6;
+    }
+
+    // Verify error message is generate with non-mutable iterator
+    psLogMsg(__func__,PS_LOG_INFO,"Non-mutable list should generate error message");
+    currentIterator->mutable = false;
+    if(psListAddBefore(currentIterator,data2)) {
+        psError(PS_ERR_UNKNOWN,true,"psListAddBefore should have generated error for non-mutable list add");
+        return 7;
+    }
+    currentIterator->mutable = true;
+
+    psFree(data1);
+    psFree(data2);
+    psFree(list);
+
+    return 0;
+}
+
+psS32 testListAdd(void)
+{
+    psList* list = NULL;
+    psS32* data = NULL;
+
+    psLogMsg(__func__,PS_LOG_INFO,"psListAdd shall add an element to list");
+
+    /*
+        psListAdd(list,data,where) should be tested in the instance where:
+
+        1. list is NULL (error)
+        2. data is NULL (error, list should not grow)
+        3. where is PS_LIST_HEAD or PS_LIST_TAIL
+        4. where is not PS_LIST_* but <0
+        5. where is >0
+    */
+
+    data = psAlloc(sizeof(psS32));
+    *data = 1;
+
+    //  1. list is NULL (error)
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error for using NULL list.");
+    if (psListAdd(NULL,PS_LIST_HEAD,data)) {
+        psError(PS_ERR_UNKNOWN, true,"psListAdd was given a NULL list, but returned a true/success.");
+        return 1;
+    }
+
+    list = psListAlloc(data);
+    psFree(data);
+    if (list->size != 1) {
+        psError(PS_ERR_UNKNOWN, true,"psListAlloc didn't create a list properly.");
+        return 2;
+    }
+
+    //  2. data is NULL (error, list should not grow)
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error msg to add NULL data");
+    if (psListAdd(list, PS_LIST_HEAD,NULL)) {
+        psError(PS_ERR_UNKNOWN, true,"psListAdd successfully added a NULL data item?");
+        return 40;
+    }
+    if ( list->size != 1) {
+        psError(PS_ERR_UNKNOWN, true,"psListAdd with a NULL data element changed the list size or returned success.");
+        return 3;
+    }
+
+    //  3. where is PS_LIST_HEAD or PS_LIST_TAIL
+    data = psAlloc(sizeof(psS32));
+    *data = 2;
+    if ( ! psListAdd(list,PS_LIST_HEAD,data) ) {
+        psError(PS_ERR_UNKNOWN, true,"psListAdd failed to add a data item to head.");
+        return 21;
+    }
+    // Test requirement SDR-175
+    if (psMemGetRefCounter(data) != 2) {
+        psError(PS_ERR_UNKNOWN, true,"psListAdd didn't increment the data reference count.");
+        return 20;
+    }
+    psFree(data);
+
+    // verify that the size incremented
+    if (list->size != 2) {
+        psError(PS_ERR_UNKNOWN, true,"psListAdd didn't increment the size by one");
+        return 4;
+    }
+
+    // verify that the head is the inserted data item
+    if (*(psS32*)list->head->data != 2) {
+        psError(PS_ERR_UNKNOWN, true,"psListAdd with PS_LIST_HEAD didn't insert at the head.");
+        return 5;
+    }
+
+    data = psAlloc(sizeof(psS32));
+    *data = 3;
+    if ( ! psListAdd(list,PS_LIST_TAIL,data) ) {
+        psError(PS_ERR_UNKNOWN, true,"psListAdd failed to add a data item to tail.");
+        return 21;
+    }
+    // Test requirement SDR-175
+    if (psMemGetRefCounter(data) != 2) {
+        psError(PS_ERR_UNKNOWN, true,"psListAdd didn't increment the data reference count.");
+        return 22;
+    }
+    psFree(data);
+    // verify that the size incremented
+    if (list->size != 3) {
+        psError(PS_ERR_UNKNOWN, true,"psListAdd didn't increment the size by 1");
+        return 6;
+    }
+
+    // verify that the head is still the same
+    if (*(psS32*)list->head->data != 2) {
+        psError(PS_ERR_UNKNOWN, true,"psListAdd with PS_LIST_TAIL modified the head.");
+        return 7;
+    }
+
+    // verify that the tail is the data item inserted
+    if (*(psS32*)list->tail->data != 3) {
+        psError(PS_ERR_UNKNOWN, true,"psListAdd with PS_LIST_TAIL didn't insert at the tail.");
+        return 8;
+    }
+
+    // 4. where is not PS_LIST_* but <0
+
+    data = psAlloc(sizeof(psS32));
+    *data = 4;
+    psLogMsg(__func__,PS_LOG_INFO,"Following should error with invalid insert location");
+
+    if ( psListAdd(list,-10,data) ) {
+        psError(PS_ERR_UNKNOWN, true,"psListAdd successfully added data to a -10 position?");
+        return 30;
+    }
+    // Test requirement SDR-175
+    if (psMemGetRefCounter(data) != 1) {
+        psError(PS_ERR_UNKNOWN, true,"psListAdd incremented the data reference count.");
+        return 24;
+    }
+    psFree(data);
+    // verify that the size wasn't incremented
+    if (list->size != 3) {
+        printListInt(list);
+        psError(PS_ERR_UNKNOWN, true,"psListAdd didn't insert to head when where was invalid.");
+        return 9;
+    }
+
+    // 5. where is >0
+    data = psAlloc(sizeof(psS32));
+    *data = 5;
+
+    if ( ! psListAdd(list,1,data) ) {
+        psError(PS_ERR_UNKNOWN, true,"psListAdd failed to add data to 1 position.");
+        return 30;
+    }
+    // Test requirement SDR-175
+    if (psMemGetRefCounter(data) != 2) {
+        psError(PS_ERR_UNKNOWN, true,"psListAdd didn't increment the data reference count.");
+        return 25;
+    }
+    psFree(data);
+    // verify that the size incremented
+    if (list->size != 4 || *(psS32*)list->head->next->data != 5) {
+        printListInt(list);
+        psError(PS_ERR_UNKNOWN, true,"psListAdd didn't insert to position #1.");
+        return 10;
+    }
+
+    data = psAlloc(sizeof(psS32));
+    *data = 6;
+    if ( ! psListAdd(list,3,data) ) {
+        psError(PS_ERR_UNKNOWN, true,"psListAdd failed to add data to 4 position.");
+        return 31;
+    }
+    // Test requirment SDR-175
+    if (psMemGetRefCounter(data) != 2) {
+        psError(PS_ERR_UNKNOWN, true,"psListAdd didn't increment the data reference count.");
+        return 26;
+    }
+    psFree(data);
+    // verify that the size incremented
+    if (list->size != 5  || *(psS32 *)list->head->next->next->next->data != 6) {
+        printListInt(list);
+        psError(PS_ERR_UNKNOWN, true,"psListAdd didn't insert to position #4.");
+        return 50;
+    }
+
+    data = psAlloc(sizeof(psS32));
+    *data = 7;
+    // Test requirment SDR-169
+    if ( ! psListAdd(list,-2,data) ) {
+        psError(PS_ERR_UNKNOWN, true,"psListAdd failed to add data to 2 position.");
+        return 32;
+    }
+
+    // Test requirment SDR-175
+    if (psMemGetRefCounter(data) != 2) {
+        psError(PS_ERR_UNKNOWN, true,"psListAdd didn't increment the data reference count.");
+        return 28;
+    }
+    psFree(data);
+    // verify that the size incremented
+    if (list->size != 6  || *(psS32 *)list->tail->prev->prev->data != 7) {
+        printListInt(list);
+        psError(PS_ERR_UNKNOWN, true,"psListAdd didn't insert to position #2.");
+        return 11;
+    }
+
+    // Test requirement SDR-757
+    data = psAlloc(sizeof(psS32));
+    *data = 8;
+    psLogMsg(__func__,PS_LOG_INFO,"Following should be a warning.");
+
+    if ( ! psListAdd(list,9,data) ) {
+        psError(PS_ERR_UNKNOWN, true,"psListAdd failed to add data to a 9 position?");
+        return 30;
+    }
+    // Test requirment SDR-175
+    if (psMemGetRefCounter(data) != 2) {
+        psError(PS_ERR_UNKNOWN, true,"psListAdd didn't increment the data reference count.");
+        return 29;
+    }
+    if(list->size != 7 || *(psS32 *)list->tail->data != 8) {
+        printListInt(list);
+        psError(PS_ERR_UNKNOWN,true,"psListAdd didn't place added item at tail.");
+        return 12;
+    }
+
+    psFree(data);
+
+    psFree(list);
+
+    return 0;
+}
+
+void printListInt(psList* list)
+{
+    psS32* data = NULL;
+    psBool first = true;
+
+    psListIterator* iter = psListIteratorAlloc(list,PS_LIST_HEAD,true);
+
+    while ( (data=(psS32*)psListGetAndIncrement(iter)) != NULL ) {
+        if (!first) {
+            printf(", %d",*(psS32*)data);
+        } else {
+            printf("%d",*(psS32*)data);
+            first = false;
+        }
+    }
+
+    printf(".\n");
+}
+
+
+psS32 testListGet(void)
+{
+    psList* list = NULL;
+    psS32* data;
+
+    /*
+     psListGet(list,which) shall be tested with the following instances
+
+        1. list is NULL.
+        2. which>0 and which<list.n.
+        3. which>list.n.
+        4. which=PS_LIST_HEAD
+        5. which=PS_LIST_NEXT
+        6. which=PS_LIST_TAIL
+        7. which=PS_LIST_PREV
+        8. which<0 and not any PS_LIST_* values
+    */
+
+    //  1. list is NULL.
+    psLogMsg(__func__,PS_LOG_INFO,"Following should be an error");
+    if (psListGet(list,PS_LIST_HEAD) != NULL) {
+        psError(PS_ERR_UNKNOWN, true,"psListGet didn't return NULL given a NULL list.");
+        return 1;
+    };
+
+    // create a list
+    data = psAlloc(sizeof(psS32));
+    *data = 0;
+    list = psListAlloc(data);
+    psFree(data);
+
+    data = psAlloc(sizeof(psS32));
+    *data = 1;
+    psListAdd(list,PS_LIST_TAIL,data);
+    psFree(data);
+
+    data = psAlloc(sizeof(psS32));
+    *data = 2;
+    psListAdd(list,PS_LIST_TAIL,data);
+    psFree(data);
+
+    data = psAlloc(sizeof(psS32));
+    *data = 3;
+    psListAdd(list,PS_LIST_TAIL,data);
+    psFree(data);
+
+    //  2. which>0 and which<list.n.
+    data = (psS32*)psListGet(list,3);
+    if (data == NULL || *data != 3) {
+        psError(PS_ERR_UNKNOWN, true,"psListGet failed with which=3");
+        return 2;
+    }
+    data = (psS32*)psListGet(list,1);
+    if (data == NULL || *data != 1) {
+        psError(PS_ERR_UNKNOWN, true,"psListGet failed with which=1");
+        return 3;
+    }
+
+    //  3. which>=list.n.
+    data = (psS32*)psListGet(list,5);
+    if (data != NULL) {
+        psError(PS_ERR_UNKNOWN, true,"psListGet failed with which=5");
+        return 4;
+    }
+    data = (psS32*)psListGet(list,4);
+    if (data != NULL) {
+        psError(PS_ERR_UNKNOWN, true,"psListGet failed with which=4");
+        return 5;
+    }
+
+    //  4. which=PS_LIST_HEAD
+    data = (psS32*)psListGet(list,PS_LIST_HEAD);
+    if (data == NULL || *data != 0) {
+        psError(PS_ERR_UNKNOWN, true,"psListGet failed with which=PS_LIST_HEAD");
+        return 6;
+    }
+
+    //  6. which=PS_LIST_TAIL
+    data = (psS32*)psListGet(list,PS_LIST_TAIL);
+    if (data == NULL || *data != 3) {
+        psError(PS_ERR_UNKNOWN, true,"psListGet failed with which=PS_LIST_TAIL");
+        return 8;
+    }
+
+    data = (psS32*)psListGet(list,-2);
+    if (data == NULL || *data !=2) {
+        psError(PS_ERR_UNKNOWN,true,"psListGet failed with location=-2");
+        return 9;
+    }
+
+    psFree(list);
+
+    return 0;
+}
+
+psS32 testListRemove(void)
+{
+    psList* list = NULL;
+    psS32* data;
+    int items = 15;
+
+    /*
+        psListRemove(list,data,which) should be tested under the following conditions:
+
+        1. list is NULL
+        2. which is PS_LIST_HEAD (remove first element of list)
+        3. which is PS_LIST_TAIL (remove last element of list)
+        4. which is PS_LIST_NEXT (element right of cursor [which should be head,tail, and neither])
+        5. which is PS_LIST_PREV (element left of cursor [which should be head,tail, and neither])
+        6. which is PS_LIST_UNKNOWN and data=NULL (error)
+        7. which is PS_LIST_UNKNOWN and data=[head,tail,other list items]
+        8. which is PS_LIST_UNKNOWN and data!=NULL and data!=any element in list
+
+        In all conditions that are not an error, list.n shall be decremented and only the specified element
+        shall be removed. After each step, list.n should be checked to verify that it is the true
+        number of elements in list.
+    */
+
+    //  1. list is NULL.
+    psLogMsg(__func__,PS_LOG_INFO,"Following should be an error");
+    if (psListRemove(list,PS_LIST_HEAD)) {
+        psError(PS_ERR_UNKNOWN, true,"psListRemove didn't return false given a NULL list.");
+        return 1;
+    };
+
+    // create a list
+    list = psListAlloc(NULL);
+
+    for (psS32 lcv=0;lcv<items;lcv++) {
+        data = psAlloc(sizeof(psS32));
+        *data = lcv;
+        psListAdd(list,PS_LIST_TAIL,data);
+        psMemDecrRefCounter(data);
+    }
+
+
+    // 2. which is PS_LIST_HEAD (remove first element of list)
+    psS32* data1 = (psS32 *)psListGet(list,PS_LIST_HEAD);
+    psMemIncrRefCounter(data1);
+    // Test requirement SDR-172, SDR-173
+    if ( (! psListRemove(list,PS_LIST_HEAD)) ||
+            (psListGet(list,PS_LIST_HEAD) == data) ) {
+        printListInt(list);
+        psError(PS_ERR_UNKNOWN, true,"Failed to remove PS_LIST_HEAD");
+        return 1;
+    }
+
+    if (list->size != --items) {
+        printListInt(list);
+        psError(PS_ERR_UNKNOWN, true,"Didn't decrement size properly to %d.",items);
+        return 1;
+    }
+    // Test requirement SDR-176
+    if (psMemGetRefCounter(data1) != 1) {
+        psError(PS_ERR_UNKNOWN, true,"psListRemove didn't decrement the data reference count.");
+        return 20;
+    }
+    psMemDecrRefCounter(data1);
+
+    // 3. which is PS_LIST_TAIL (remove last element of list)
+    data = psListGet(list,PS_LIST_TAIL);
+    // Test requirement SDR-173
+    if ( (! psListRemove(list,PS_LIST_TAIL)) ||
+            (psListGet(list,PS_LIST_TAIL) == data) ) {
+        printListInt(list);
+        psError(PS_ERR_UNKNOWN, true,"Failed to remove PS_LIST_TAIL");
+        return 1;
+    }
+
+    if (list->size != --items) {
+        printListInt(list);
+        psError(PS_ERR_UNKNOWN, true,"Didn't decrement size properly to %d.",items);
+        return 1;
+    }
+
+    data = psListGet(list,-2);
+    // Test requirement SDR-173
+    if ( (! psListRemove(list,-2)) ||
+            (psListGet(list,-2) == data) ) {
+        printListInt(list);
+        psError(PS_ERR_UNKNOWN, true,"Failed to remove from location -2");
+        return 11;
+    }
+
+    if (list->size != --items) {
+        printListInt(list);
+        psError(PS_ERR_UNKNOWN, true,"Didn't decrement size properly to %d.",items);
+        return 1;
+    }
+
+    // 6. psListRemoveData where data=NULL (error)
+    psLogMsg(__func__,PS_LOG_INFO,"Next message should be an error");
+    if (psListRemoveData(list,NULL)) {
+        printListInt(list);
+        psError(PS_ERR_UNKNOWN, true,"removed something for PS_LIST_UNKNOWN with data=NULL");
+        return 1;
+    }
+
+    // 7. which is PS_LIST_UNKNOWN and data=[head,tail,other list items]
+    data = psListGet(list,PS_LIST_HEAD);
+    // Test requirement SDR-762
+    if ( (! psListRemoveData(list,data)) ||
+            (psListGet(list,PS_LIST_HEAD) == data) ) {
+        printListInt(list);
+        psError(PS_ERR_UNKNOWN, true,"Failed to remove PS_LIST_UNKNOWN @ PS_LIST_HEAD");
+        return 1;
+    }
+
+    if (list->size != --items) {
+        printListInt(list);
+        psError(PS_ERR_UNKNOWN, true,"Didn't decrement size properly to %d.",items);
+        return 1;
+    }
+
+    psS32* data2 = psListGet(list,PS_LIST_TAIL);
+    psMemIncrRefCounter(data2);
+    if ( (!psListRemoveData(list,data2)) ||
+            (psListGet(list,PS_LIST_TAIL) == data2) ) {
+        printListInt(list);
+        psError(PS_ERR_UNKNOWN, true,"Failed to remove PS_LIST_UNKNOWN @ PS_LIST_TAIL");
+        return 1;
+    }
+
+    if (list->size != --items) {
+        printListInt(list);
+        psError(PS_ERR_UNKNOWN, true,"Didn't decrement size properly to %d.",items);
+        return 1;
+    }
+    // Test requirement SDR-176
+    if (psMemGetRefCounter(data2) != 1) {
+        psError(PS_ERR_UNKNOWN, true,"psListRemoveData didn't decrement the data reference count.");
+        return 20;
+    }
+    psMemDecrRefCounter(data2);
+
+    data = psListGet(list,1);
+    if ( (! psListRemoveData(list,data))||
+            (psListGet(list,1) == data) ) {
+        printListInt(list);
+        psError(PS_ERR_UNKNOWN, true,"Failed to remove data @ which=1");
+        return 1;
+    }
+
+    if (list->size != --items) {
+        printListInt(list);
+        psError(PS_ERR_UNKNOWN, true,"Didn't decrement size properly to %d.",items);
+        return 1;
+    }
+
+    // 8. data!=NULL and data!=any element in list
+    psLogMsg(__func__,PS_LOG_INFO,"Next message should be an error");
+    // Test requirement SDR-764
+    if ( psListRemoveData(list,data) ) {
+        printListInt(list);
+        psError(PS_ERR_UNKNOWN, true,"removed something for PS_LIST_UNKNOWN with previously removed item");
+        return 1;
+    }
+
+    if (list->size != items) {
+        printListInt(list);
+        psError(PS_ERR_UNKNOWN, true,"size not %d, as expected.",items);
+        return 1;
+    }
+
+    // clear out the list
+    while (items > 1) {
+        psListRemove(list,PS_LIST_HEAD);
+        items--;
+    }
+
+    data = psListGet(list,PS_LIST_HEAD);
+    if ( (! psListRemove(list,PS_LIST_HEAD)) ||
+            (psListGet(list,PS_LIST_HEAD) == data) ) {
+        printListInt(list);
+        psError(PS_ERR_UNKNOWN, true,"Failed to remove last element");
+        return 1;
+    }
+
+    if (list->size != 0) {
+        printListInt(list);
+        psError(PS_ERR_UNKNOWN, true,"Didn't remove all the elements.");
+        return 1;
+    }
+
+    psLogMsg(__func__,PS_LOG_INFO,"NULL list in psListRemoveData should generate error message.");
+    if(psListRemoveData(NULL,data)) {
+        psError(PS_ERR_UNKNOWN,true,"psListRemoveData should have generated an error with NULL list");
+        return 2;
+    }
+
+    psFree(list);
+
+    return 0;
+
+}
+
+psS32 testListConvert(void)
+{
+
+    psList* list = NULL;
+    psArray* arr = NULL;
+    psS32* data;
+
+    /*
+        array=psListToArray(list) shall take each element of the list, increment
+        their reference, and insert them into the returned fresh psPtr array.
+        The list shall not be changed, except for the element reference increment.
+    */
+
+    // test dlist -> array
+
+    // create a list
+    list = psListAlloc(NULL);
+    for (psS32 lcv=0;lcv<15;lcv++) {
+        data = psAlloc(sizeof(psS32));
+        *data = lcv;
+        psListAdd(list,PS_LIST_TAIL,data);
+        psMemDecrRefCounter(data);
+    }
+
+    arr = psListToArray(list);
+
+    if (arr->n != 15 || list->size != 15) {
+        psError(PS_ERR_UNKNOWN, true,"The created array didn't have the proper size");
+        return 1;
+    }
+    for (psS32 i=0;i<arr->n;i++) {
+        if (i != *(psS32*)arr->data[i]) {
+            psError(PS_ERR_UNKNOWN, true,"Element %d of array is incorrect (%d).",
+                    i,*(psS32*)arr->data[i]);
+            return 1;
+        }
+        if (i != *(psS32*)psListGet(list,i)) {
+            psError(PS_ERR_UNKNOWN, true,"Element %d of list is incorrect (%d).",
+                    i,*(psS32*)arr->data[i]);
+            return 1;
+        }
+        if (psMemGetRefCounter(arr->data[i]) != 2) {
+            psError(PS_ERR_UNKNOWN, true,"Element %d had wrong reference count (%d).",
+                    i,psMemGetRefCounter(arr->data[i]));
+            return 1;
+        }
+    }
+
+    psFree(arr);
+    psFree(list);
+
+    // test array -> dlist
+
+    // create an array
+    arr = psArrayAlloc(15);
+    arr->n = arr->nalloc;
+    for (psS32 lcv=0;lcv<15;lcv++) {
+        data = psAlloc(sizeof(psS32));
+        *data = lcv;
+        arr->data[lcv] = data;
+    }
+
+    list = psArrayToList(arr);
+
+    if (arr->n != 15 || list->size != 15) {
+        psError(PS_ERR_UNKNOWN, true,"The created array didn't have the proper size");
+        return 1;
+    }
+    for (psS32 i=0;i<arr->n;i++) {
+        if (i != *(psS32*)arr->data[i]) {
+            psError(PS_ERR_UNKNOWN, true,"Element %d of array is incorrect (%d).",
+                    i,*(psS32*)arr->data[i]);
+            return 1;
+        }
+        if (i != *(psS32*)psListGet(list,i)) {
+            psError(PS_ERR_UNKNOWN, true,"Element %d of list is incorrect (%d).",
+                    i,*(psS32*)arr->data[i]);
+            return 1;
+        }
+        if (psMemGetRefCounter(arr->data[i]) != 2) {
+            psError(PS_ERR_UNKNOWN, true,"Element %d had wrong reference count (%d).",
+                    i,psMemGetRefCounter(arr->data[i]));
+            return 1;
+        }
+    }
+
+    psFree(arr);
+    psFree(list);
+
+    // now, make sure if input array/list is NULL, output is NULL
+
+    arr = psListToArray(NULL);
+    if (arr != NULL) {
+        psError(PS_ERR_UNKNOWN, true,"psListToArray didn't return NULL when given NULL");
+        return 1;
+    }
+
+    list = psArrayToList(NULL);
+    if (list != NULL) {
+        psError(PS_ERR_UNKNOWN, true,"psArrayToList didn't return NULL when given NULL");
+        return 1;
+    }
+
+    // now, see what happens with a zero-size array/list
+    arr = psArrayAlloc(1);
+    arr->n = 0;
+    list = psArrayToList(arr);
+    if (list == NULL) {
+        psError(PS_ERR_UNKNOWN, true,"psArrayToList didn't create an empty list from an "
+                "empty array.");
+        return 1;
+    }
+    psFree(arr);
+    psFree(list);
+
+    list = psListAlloc(NULL);
+    arr = psListToArray(list);
+    if (arr == NULL) {
+        psError(PS_ERR_UNKNOWN, true,"psArrayToList didn't create an empty array from an "
+                "empty list.");
+        return 1;
+    }
+    psFree(arr);
+    psFree(list);
+
+    return 0;
+}
+
+psS32 testListIterator(void)
+{
+    psList* list = NULL;
+    psS32* data;
+
+    psLogMsg(__func__,PS_LOG_INFO," psListSetIterator/psListGetNext/psListGetPrev"
+             " shall move the list cursor to the specified location");
+
+    /*
+            psDlistSetIterator(list,where) shall:
+
+            1. output error message and do nothing if list=NULL
+            2. set list.cursor to list.head if where=PS_LIST_HEAD
+            3. set list.cursor to list.tail if where=PS_LIST_TAIL
+            4. set list.cursor to list.cursor->next if where=PS_LIST_NEXT
+            5. set list.cursor to list.cursor->prev if where=PS_LIST_PREV
+            6. leave list.cursor untouched if where=PS_LIST_UNKNOWN or PS_LIST_CURRENT
+
+            psDlistGetNext(list) shall be functionally equivalent to
+            psDlistSetIterator(list,PS_LIST_NEXT) but returns list.cursor.
+
+            psDlistGetPrev(list) shall be functionally equivalent to
+            psDlistSetIterator(list,PS_LIST_PREV) but returns list.cursor.
+    */
+
+    // create a list
+    list = psListAlloc(NULL);
+    for (psS32 lcv=0;lcv<15;lcv++) {
+        data = psAlloc(sizeof(psS32));
+        *data = lcv;
+        psListAdd(list,PS_LIST_TAIL,data);
+        psFree(data);
+    }
+
+    psListIterator* iter = psListIteratorAlloc(list,PS_LIST_HEAD,true);
+    if (iter == NULL) {
+        psError(PS_ERR_UNKNOWN, true,"Failed to make an iterator.");
+        return 22;
+    }
+
+    // 1. output error message and do nothing if iterator=NULL
+    psListIteratorSet(NULL,PS_LIST_HEAD);
+    if (psListIteratorSet(NULL,PS_LIST_HEAD)) {
+        psError(PS_ERR_UNKNOWN, true,"Success while setting position of a NULL iterator?");
+        return 23;
+    }
+
+    // Attempt to get next with NULL iterator
+    if ( psListGetAndIncrement(NULL) != NULL ) {
+        psError(PS_ERR_UNKNOWN,true,"Did not return NULL when NULL iterator specified");
+        return 24;
+    }
+
+    // Attempt to get previous with NULL iterator
+    if( psListGetAndDecrement(NULL) != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Did not return NULL when NULL iterator specified");
+        return 25;
+    }
+
+    // 3. set list.cursor to list.tail if where=PS_LIST_TAIL
+
+    if (!psListIteratorSet(iter,PS_LIST_TAIL) ||
+            *(psS32*)iter->cursor->data != 14 ||
+            iter->index != 14) {
+        psError(PS_ERR_UNKNOWN, true,"Didn't successfully move cursor to tail.");
+        return 1;
+    }
+
+    // 2. set list.cursor to list.head if where=PS_LIST_HEAD
+    if (!psListIteratorSet(iter,PS_LIST_HEAD) ||
+            *(psS32*)iter->cursor->data != 0 ||
+            iter->index != 0) {
+        psError(PS_ERR_UNKNOWN, true,"Didn't successfully move cursor to head.");
+        return 2;
+    }
+
+    // test psListGetPrevious/Next
+    if (*(psS32*)psListGetAndIncrement(iter) != 0) {
+        psError(PS_ERR_UNKNOWN, true,"psListGetNext didn't move cursor to next.");
+        return 8;
+    }
+    if (*(psS32*)psListGetAndIncrement(iter) != 1) {
+        psError(PS_ERR_UNKNOWN, true,"psListGetNext didn't move cursor to next.");
+        return 9;
+    }
+    if (*(psS32*)psListGetAndIncrement(iter) != 2) {
+        psError(PS_ERR_UNKNOWN, true,"psListGetNext didn't move cursor to next.");
+        return 10;
+    }
+
+    if (*(psS32*)psListGetAndDecrement(iter) != 3) {
+        psError(PS_ERR_UNKNOWN, true,"psListGetPrevious didn't move cursor to previous.");
+        return 11;
+    }
+    if (*(psS32*)psListGetAndDecrement(iter) != 2) {
+        psError(PS_ERR_UNKNOWN, true,"psListGetPrevious didn't move cursor to previous.");
+        return 12;
+    }
+    if (*(psS32*)psListGetAndDecrement(iter) != 1) {
+        psError(PS_ERR_UNKNOWN, true,"psListGetPrevious didn't move cursor to previous..");
+        return 13;
+    }
+    if (*(psS32*)psListGetAndDecrement(iter) != 0) {
+        psError(PS_ERR_UNKNOWN, true,"psListGetPrevious didn't move cursor to previous..");
+        return 14;
+    }
+    if (psListGetAndDecrement(iter) != NULL) {
+        psError(PS_ERR_UNKNOWN, true,"psListGetPrevious moved cursor beyond head.");
+        return 15;
+    }
+    if (psListGetAndIncrement(iter) != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"psListGetNext should return NULL when above head");
+        return 22;
+    }
+    if (*(psS32*)psListGetAndIncrement(iter) != 0 ) {
+        psError(PS_ERR_UNKNOWN,true,"psListGetNext didn't move cursor to next.");
+        return 23;
+    }
+
+    psListIteratorSet(iter,PS_LIST_TAIL); // works according to an above test
+    if (*(psS32*)psListGetAndIncrement(iter) != 14) {
+        psError(PS_ERR_UNKNOWN, true,"psListGetNext moved cursor beyond tail.");
+        return 16;
+    }
+    if ((psListGetAndIncrement(iter) != NULL) || (!iter->offEnd)) {
+        psError(PS_ERR_UNKNOWN, true,"psListGetNext moved cursor beyond tail.");
+        return 17;
+    }
+    if(psListGetAndDecrement(iter) != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"psListGetPrevious did not return NULL when offEnd is true");
+        return 18;
+    }
+    if(iter->offEnd) {
+        psError(PS_ERR_UNKNOWN,true,"psListGetPrevious did not move back onto the list.");
+        return 19;
+    }
+    if(*(psS32*)psListGetAndDecrement(iter) != 14) {
+        psError(PS_ERR_UNKNOWN,true,"psListGetPrevious did not return correct value of tail.");
+        return 20;
+    }
+
+    psFree(list);
+
+    return 0;
+}
+
+psS32 testListFree(void)
+{
+    float* data[15];
+    psList* list;
+
+    /*
+    Call psDlistAlloc to create a doubly linked list.
+
+    Create several data items and add them to the list.
+
+    Verify the data item's reference counter are incremented after adding to the list.
+    (not really needed, as psListAdd is tested elsewhere)
+    */
+
+    list = psListAlloc(NULL);
+    for (psS32 lcv=0;lcv<15;lcv++) {
+        data[lcv] = psAlloc(sizeof(psS32));
+        *data[lcv] = lcv;
+        psListAdd(list,PS_LIST_TAIL,data[lcv]);
+        if (psMemGetRefCounter(data[lcv]) != 2) {
+            psError(PS_ERR_UNKNOWN, true,"Reference counter for data was not incremented");
+            return 1;
+        }
+    }
+
+    /*
+    Verify items are within the list.
+    (not needed, as psListAdd is tested elsewhere, but check anyway.)
+    */
+    if (list->size != 15) {
+        psError(PS_ERR_UNKNOWN, true,"List wasn't populated as expected?");
+        return 2;
+    }
+
+    /*
+    Call psDlistFree with NULL specified as the elemFree function.
+    */
+
+    psFree(list);
+
+    /*
+    Verify the list is deallocated but not the data items.
+    (accomplished by checking for memory leaks)
+
+    Verify the data item's reference counters are decremented by one compared to when added to the list.
+    (technically, this could be accomplished by checking memory leaks too, but I checked anyway)
+    */
+
+    for (psS32 i=0;i<15;i++) {
+        if (psMemGetRefCounter(data[i]) != 1) {
+            psError(PS_ERR_UNKNOWN, true,"pslistFree didn't decrement the data item's reference counter");
+            return 3;
+        }
+        psFree(data[i]);
+    }
+
+    return 0;
+}
+
+psS32 testListSort(void)
+{
+    psList* list;
+    psListIterator* iter;
+    float* fValue;
+    psU32* uValue;
+
+    list = psListAlloc(NULL);
+
+    for (psS32 lcv=0;lcv<15;lcv++) {
+        float* data = psAlloc(sizeof(psS32));
+        if (lcv < 7) {
+            *data = 13-lcv*2;
+        } else {
+            *data = lcv*2-12;
+        }
+        psListAdd(list,PS_LIST_TAIL,data);
+        psFree(data);
+
+    }
+
+    printf("original list = [");
+    iter = psListIteratorAlloc(list,PS_LIST_HEAD,true);
+    while( (fValue=psListGetAndIncrement(iter)) != NULL ) {
+        printf(" %.1f",*fValue);
+    }
+    printf(" ]\n");
+
+    list = psListSort(list,psCompareF32Ptr);
+
+    printf("sorted list = [");
+    psListIteratorSet(iter,PS_LIST_HEAD);
+    while( (fValue=psListGetAndIncrement(iter)) != NULL ) {
+        printf(" %.1f",*fValue);
+    }
+    printf(" ]\n");
+
+    psListIteratorSet(iter,PS_LIST_HEAD);
+    float* prevFValue = psListGetAndIncrement(iter);
+    while( (fValue=psListGetAndIncrement(iter)) != NULL ) {
+        if (*prevFValue > *fValue) {
+            psError(PS_ERR_UNKNOWN, true,"Hey, the list wasn't sorted!?");
+            return 1;
+        }
+    }
+
+    list = psListSort(list,psCompareDescendingF32Ptr);
+
+    printf("descending sort list = [");
+    psListIteratorSet(iter,PS_LIST_HEAD);
+    while( (fValue=psListGetAndIncrement(iter)) != NULL ) {
+        printf(" %.1f",*fValue);
+    }
+    printf(" ]\n");
+
+    psListIteratorSet(iter,PS_LIST_HEAD);
+    prevFValue = psListGetAndIncrement(iter);
+    while( (fValue=psListGetAndIncrement(iter)) != NULL ) {
+        if (*prevFValue < *fValue) {
+            psError(PS_ERR_UNKNOWN, true,"Hey, the list wasn't sorted!?");
+            return 2;
+        }
+    }
+
+    psFree(list);
+
+    /********** OK, now do the same thing with ints. *************/
+
+    list = psListAlloc(NULL);
+
+    for (psS32 lcv=0;lcv<15;lcv++) {
+        psU32* data = psAlloc(sizeof(psS32));
+        if (lcv < 7) {
+            *data = 13-lcv*2;
+        } else {
+            *data = lcv*2-12;
+        }
+        psListAdd(list,PS_LIST_TAIL,data);
+        psFree(data);
+
+    }
+
+    printf("original list = [");
+    iter = psListIteratorAlloc(list,PS_LIST_HEAD,true);
+    while( (uValue=psListGetAndIncrement(iter)) != NULL ) {
+        printf(" %d",*uValue);
+    }
+    printf(" ]\n");
+
+    list = psListSort(list,psCompareU32Ptr);
+
+    printf("sorted list = [");
+    psListIteratorSet(iter,PS_LIST_HEAD);
+    while( (uValue=psListGetAndIncrement(iter)) != NULL ) {
+        printf(" %d",*uValue);
+    }
+    printf(" ]\n");
+
+    psListIteratorSet(iter,PS_LIST_HEAD);
+    psU32* prevUValue = psListGetAndIncrement(iter);
+    while( (uValue=psListGetAndIncrement(iter)) != NULL ) {
+        if (*prevUValue > *uValue) {
+            psError(PS_ERR_UNKNOWN, true,"Hey, the list wasn't sorted!?");
+            return 3;
+        }
+    }
+
+    list = psListSort(list,psCompareDescendingU32Ptr);
+
+    printf("descending sort list = [");
+    psListIteratorSet(iter,PS_LIST_HEAD);
+    while( (uValue=psListGetAndIncrement(iter)) != NULL ) {
+        printf(" %d",*uValue);
+    }
+    printf(" ]\n");
+
+    psListIteratorSet(iter,PS_LIST_HEAD);
+    prevUValue = psListGetAndIncrement(iter);
+    while( (uValue=psListGetAndIncrement(iter)) != NULL ) {
+        if (*prevUValue < *uValue) {
+            psError(PS_ERR_UNKNOWN, true,"Hey, the list wasn't sorted!?");
+            return 4;
+        }
+    }
+
+    psFree(list);
+
+    return 0;
+}
Index: /tags/ipp-1-X/bug123/psLib/test/collections/tst_psMetadataIO.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/collections/tst_psMetadataIO.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/collections/tst_psMetadataIO.c	(revision 22331)
@@ -0,0 +1,172 @@
+/** @file  tst_psMetadataIO.c
+ *
+ *  @brief Test driver for psMetadataIO functions
+ *
+ *  This test driver contains the following tests for psMetadata:
+ *    Test A - Read config file with overwrite set true
+ *    Test B - Read config file with overwrite set false
+ *    Test C - Read config file without auto-allocation of metadata
+ *    Test D - Attempt to use null fileName argument
+ *    Test E - Attempt to open nonexistant file
+ *    Test F - Free psMetadata
+ *
+ *  @author  Ross Harman, MHPCC
+ *  @author  Robert DeSonia, MHPCC
+ *
+ *  @version $Revision: 1.13 $  $Name: not supported by cvs2svn $
+ *  @date  $Date: 2005-04-07 20:27:41 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ *
+ */
+
+#include <string.h>
+#include "pslib_strict.h"
+#include "psTest.h"
+
+static void printMetadataItem(psMetadataItem *metadataItem, char *spaces);
+static void printMetadata(psMetadata *metadata);
+static void printMetadataList(psList *metadataItemList, char* spaces);
+static void printMetadataTable(psHash *mdTable);
+
+static void printMetadata(psMetadata *metadata)
+{
+    printf("Contents of metadata list:\n");
+    printMetadataList(metadata->list, " ");
+    printf("\nContents of metadata table:\n");
+    printMetadataTable(metadata->table);
+}
+
+static void printMetadataList(psList *metadataItemList, char* spaces)
+{
+    psMetadataItem *entryChild = NULL;
+
+    psListIterator* iter = psListIteratorAlloc(metadataItemList, PS_LIST_HEAD, true);
+
+    while ( (entryChild=psListGetAndIncrement(iter)) != NULL) {
+        printMetadataItem(entryChild, spaces);
+    }
+
+    psFree(iter);
+}
+
+static void printMetadataTable(psHash *mdTable)
+{
+    psS32 i;
+    psHashBucket* ptr = NULL;
+    for(i=0; i<mdTable->nbucket; i++) {
+        ptr = mdTable->buckets[i];
+        while (ptr != NULL) {
+            printMetadataItem(ptr->data, " ");
+            ptr = ptr->next;
+        }
+    }
+}
+
+static void printMetadataItem(psMetadataItem *metadataItem, char *spaces)
+{
+    char* vecStr;
+
+    printf("%sKey Name: %8s  ", spaces, metadataItem->name);
+    printf("Key mdType: 0x%08x ", metadataItem->type);
+
+    switch (metadataItem->type) {
+    case PS_META_MULTI:
+        printf("Key Value: %17c", ' ');
+        break;
+    case PS_META_BOOL:
+        printf("Key Value: %15d  ", metadataItem->data.B);
+        break;
+    case PS_META_S32:
+        printf("Key Value: %15d  ", metadataItem->data.S32);
+        break;
+    case PS_META_F32:
+        printf("Key Value: %15.3f  ", metadataItem->data.F32);
+        break;
+    case PS_META_F64:
+        printf("Key Value: %15.3f  ", metadataItem->data.F64);
+        break;
+    case PS_META_VEC:
+        vecStr = (char*)psVectorToString((psVector*)metadataItem->data.V, 15);
+        printf("Key Value: %15s  ", vecStr);
+        psFree(vecStr);
+        break;
+    case PS_META_STR:
+        printf("Key Value: %15s  ", (char*)metadataItem->data.V);
+        break;
+    default:
+        printf("Bad type: 0x%08x ", metadataItem->type);
+    }
+    printf("Key Comment: %s\n", metadataItem->comment);
+
+    if(metadataItem->data.V && metadataItem->type==PS_META_MULTI) {
+        printMetadataList(metadataItem->data.V, "    ");
+    }
+}
+
+
+psS32 main(psS32 argc, char* argv[])
+{
+    // Test A - Read config file with overwrite set true
+    printPositiveTestHeader(stdout, "psMetadata", "Test A - Read config file with overwrite set true");
+    psMetadata *metadata1 = NULL;
+    psU32 failedLines1 = 0;
+    metadata1 = psMetadataParseConfig(metadata1, &failedLines1, "test.config", true);
+    printf("Failed lines: %d Expected: 6\n", failedLines1);
+    printMetadata(metadata1);
+    printFooter(stdout, "psMetadata", "Test A - Read config file with overwrite set true", true);
+
+
+    // Test B - Read config file with overwrite set false
+    printPositiveTestHeader(stdout, "psMetadata", "Test B - Read config file with overwrite set false");
+    psMetadata *metadata2 = NULL;
+    psS32 failedLines2 = 0;
+    metadata2 = psMetadataParseConfig(metadata2, &failedLines2, "test.config", false);
+    printf("Failed lines: %d Expected: 7 ", failedLines2);
+    printMetadata(metadata2);
+    printFooter(stdout, "psMetadata", "Test B - Read config file with overwrite set false", true);
+
+
+    // Test C - Read config file without auto-allocation of metadata
+    printPositiveTestHeader(stdout, "psMetadata", "Test C - Read config file without auto-allocation of metadata");
+    psMetadata *metadata3 = psMetadataAlloc();
+    psS32 failedLines3 = 0;
+    metadata3 = psMetadataParseConfig(metadata3, &failedLines3, "test.config", true);
+    printf("Failed lines: %d Expected: 6 ", failedLines3);
+    printMetadata(metadata3);
+    printFooter(stdout, "psMetadata", "Test C - Read config file without auto-allocation of metadata", true);
+
+
+    // Test D - Attempt to use null fileName argument
+    printNegativeTestHeader(stdout,"psMetadataIO", "Test D - Attempt to use null fileName argument",
+                            "Null failedLines not allowed", 0);
+    psMetadataParseConfig(metadata1, &failedLines1, NULL, true);
+    printFooter(stdout, "psMetadata", "Test D - Attempt to use null fileName argument", true);
+
+
+    // Test E - Attempt to open nonexistant file
+    printNegativeTestHeader(stdout,"psMetadataIO", "Test E - Attempt to open nonexistant file",
+                            "Error opening file", 0);
+    psMetadataParseConfig(metadata1, &failedLines1, "abcedfg", true);
+    printFooter(stdout, "psMetadata", "Test E - Attempt to open nonexistant file", true);
+
+
+    // Test F - Free psMetadata
+    printPositiveTestHeader(stdout, "psMetadata", "Test F - Free psMetadata");
+    psFree(metadata1);
+    psFree(metadata2);
+    psFree(metadata3);
+    if(psMemCheckLeaks(0, NULL, stdout,false)) {
+        psError(PS_ERR_UNKNOWN,true,"Memory leak detected");
+        return 10;
+    }
+    psMemCheckCorruption(0);
+    psS32 nBad = psMemCheckCorruption(0);
+    if(nBad) {
+        printf("ERROR: Found %d bad memory blocks\n", nBad);
+    }
+    printFooter(stdout, "psMetadata", "Test F - Free psMetadata", true);
+
+
+    return 0;
+}
Index: /tags/ipp-1-X/bug123/psLib/test/collections/tst_psMetadata_01.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/collections/tst_psMetadata_01.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/collections/tst_psMetadata_01.c	(revision 22331)
@@ -0,0 +1,263 @@
+/** @file  tst_psMetadata_01.c
+*
+*  @brief Test driver for psMetadata functions
+*
+*  This test driver contains the following tests for psMetadata:
+*     Test A - Read 1st hdr from simple FITS file
+*     Test B - Read 2nd hdr from complex FITS file
+*     Test C - Read named hdr from complex FITS file
+*     Test D - Remove items with same name from all metadata
+*     Test E - Attempt to use null file descriptor
+*     Test F - Attempt to open nonexistant file
+*     Test G - Attempt to use two null inputs
+*     Test H - Attempt to use bad extNum
+*     Test I - Attempt to use bad extNameTest
+*     Test J - Read named hdr w/ invalid extnum
+*     Test K - Free psMetadata
+*
+*  @author  Ross Harman, MHPCC
+*
+*  @version $Revision: 1.24 $  $Name: not supported by cvs2svn $
+*  @date  $Date: 2005-04-07 20:27:41 $
+*
+*  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+*
+*/
+
+#include <string.h>
+#include "pslib_strict.h"
+#include "psTest.h"
+
+static void printMetadataItem(psMetadataItem *metadataItem, char *spaces);
+static void printMetadata(psMetadata *metadata);
+static void printMetadataList(psList *metadataItemList, char* spaces);
+static void printMetadataTable(psHash *mdTable);
+
+static void printMetadata(psMetadata *metadata)
+{
+    printf("Contents of metadata list:\n");
+    printMetadataList(metadata->list, " ");
+    printf("\nContents of metadata table:\n");
+    printMetadataTable(metadata->table);
+}
+
+static void printMetadataList(psList *metadataItemList, char* spaces)
+{
+    psMetadataItem *entryChild = NULL;
+
+    psListIterator* iter = psListIteratorAlloc(metadataItemList, PS_LIST_HEAD, true);
+
+    while ( (entryChild=psListGetAndIncrement(iter)) != NULL) {
+        printMetadataItem(entryChild, spaces);
+    }
+
+    psFree(iter);
+
+}
+
+static void printMetadataTable(psHash *mdTable)
+{
+    psS32 i;
+    psHashBucket* ptr = NULL;
+    for(i=0; i<mdTable->nbucket; i++) {
+        ptr = mdTable->buckets[i];
+        while (ptr != NULL) {
+            printMetadataItem(ptr->data, " ");
+            ptr = ptr->next;
+        }
+    }
+}
+
+static void printMetadataItem(psMetadataItem *metadataItem, char *spaces)
+{
+    printf("%sKey Name: %8s  ", spaces, metadataItem->name);
+    printf("Key mdType: 0x%08x  ", metadataItem->type);
+
+    switch (metadataItem->type) {
+    case PS_META_MULTI:
+        printf("Key Value: %17c", ' ');
+        break;
+    case PS_META_BOOL:
+        printf("Key Value: %15d  ", metadataItem->data.B);
+        break;
+    case PS_META_S32:
+        printf("Key Value: %15d  ", metadataItem->data.S32);
+        break;
+    case PS_META_F32:
+        printf("Key Value: %15.3f  ", metadataItem->data.F32);
+        break;
+    case PS_META_F64:
+        printf("Key Value: %15.3f  ", metadataItem->data.F64);
+        break;
+    case PS_META_STR:
+        printf("Key Value: %15s  ", (char*)metadataItem->data.V);
+        break;
+    default:
+        printf("Bad type: %d ", metadataItem->type);
+    }
+    printf("Key Comment: %s\n", metadataItem->comment);
+
+    if(metadataItem->data.V && metadataItem->type==PS_META_MULTI) {
+        printMetadataList(metadataItem->data.V, "    ");
+    }
+}
+
+
+psS32 main(psS32 argc, char* argv[])
+{
+    psMetadata *metadata1 = NULL;
+    psMetadata *metadata2 = NULL;
+    psMetadata *metadata3 = NULL;
+
+
+    // Test A - Read 1st hdr from simple FITS file
+
+    /* Header contents for header_1.fits:
+
+        SIMPLE  =                    T / file does conform to FITS standard
+        BITPIX  =                    8 / number of bits per data pixel
+        NAXIS   =                    0 / number of data axes
+        HISTORY File modified by user 'harman' with fv  on 2004-08-04T11:11:18
+        END
+    */
+    printPositiveTestHeader(stdout, "psMetadata", "Test A - Read 1st hdr from simple FITS file");
+    metadata1 = psMetadataReadHeader(metadata1, NULL, 1, "header_1.fits");
+    printMetadata(metadata1);
+    printFooter(stdout, "psMetadata", "Test A - Read 1st hdr from simple FITS file", true);
+
+    printf("ID=%d\n",(int)psMemGetId());
+
+    // Test B - Read 2nd hdr from complex FITS file
+
+    /* Header contents for header_2.fits:
+
+        SIMPLE  =                    T / file does conform to FITS standard
+        BITPIX  =                  -64 / number of bits per data pixel
+        NAXIS   =                    1 / number of data axes
+        NAXIS1  =                   64 / length of data axis 1
+        EXTEND  =                    T / FITS dataset may contain extensions
+        COMMENT   FITS (Flexible Image Transport System) format is defined in 'Astronomy
+        COMMENT   and Astrophysics', volume 376, page 359; bibcode: 2001A&A...376..359H
+        END
+        <DATA>
+
+        XTENSION= 'IMAGE   '           / IMAGE extension
+        BITPIX  =                  -64 / number of bits per data pixel
+        NAXIS   =                    1 / number of data axes
+        NAXIS1  =                   64 / length of data axis 1
+        PCOUNT  =                    0 / required keyword; must = 0
+        GCOUNT  =                    1 / required keyword; must = 1
+        BITPIX  =                  -64 / number of bits per data pixel
+        EXTNAME = 'MY_DATA_1'
+        HISTORY File modified by user 'harman' with fv  on 2004-08-04T13:14:45
+        HISTORY File modified by user 'harman' with fv  on 2004-08-04T13:15:29
+        HISTORY File modified by user 'harman' with fv  on 2004-08-04T13:21:18
+        HISTORY File modified by user 'harman' with fv  on 2004-08-04T13:21:46
+        END
+        <DATA>
+
+        XTENSION= 'IMAGE   '           / IMAGE extension
+        BITPIX  =                  -64 / number of bits per data pixel
+        NAXIS   =                    1 / number of data axes
+        NAXIS1  =                   64 / length of data axis 1
+        PCOUNT  =                    0 / required keyword; must = 0
+        GCOUNT  =                    1 / required keyword; must = 1
+        EXTNAME = 'MY_DATA_2'
+        HISTORY File modified by user 'harman' with fv  on 2004-08-04T13:22:12
+        HISTORY File modified by user 'harman' with fv  on 2004-08-04T13:22:52
+        END
+        <DATA>
+    */
+    printPositiveTestHeader(stdout, "psMetadata", "Test B - Read 2nd hdr from complex FITS file");
+    metadata2 = psMetadataReadHeader(metadata2, NULL, 2, "header_2.fits");
+    printMetadata(metadata2);
+    printFooter(stdout, "psMetadata", "Test B - Read 2nd hdr from complex FITS file", true);
+
+    printf("ID=%d\n",(int)psMemGetId());
+
+    // Test C - Read named hdr from complex FITS file
+    printPositiveTestHeader(stdout, "psMetadata", "Test C - Read named hdr from complex FITS file");
+    metadata3 = psMetadataReadHeader(metadata3, "MY_DATA_2", -1, "header_2.fits");
+    printMetadata(metadata3);
+    printFooter(stdout, "psMetadata", "Test C - Read named hdr from complex FITS file", true);
+
+
+    // Test D - Remove items with same name from all metadata
+    printPositiveTestHeader(stdout, "psMetadata", "Test D - Remove items with same name from all metadata");
+    printf("Removed HISTORY from all metadata from prior test. Resulting metadata:\n\n");
+    psMetadataRemove(metadata3, 0, "HISTORY");
+    printMetadata(metadata3);
+    printFooter(stdout, "psMetadata", "Test D - Remove items with same name from all metadata", true);
+
+
+    // Test E - Attempt to use null file filename
+    printNegativeTestHeader(stdout,"psMetadata", "Test E - Attempt to use null filename",
+                            "Null fileName not allowed", 0);
+    psMetadataReadHeader(NULL, NULL, 1, NULL);
+    printFooter(stdout, "psMetadata", "Test E - Attempt to use null filename", true);
+
+
+    // Test F - Attempt to open nonexistant file
+    printNegativeTestHeader(stdout,"psMetadata", "Test F - Attempt to open nonexistant file",
+                            "FITS error while opening file: missing.dat...Couldn't close FITS file...", 0);
+    psMetadataReadHeader(NULL, NULL, 1, "missing.dat");
+    printFooter(stdout, "psMetadata", "Test F - Attempt to open nonexistant file", true);
+
+
+    // Test G - Attempt to use two null inputs
+    printNegativeTestHeader(stdout,"psMetadata", "Test G - Attempt to use two null inputs",
+                            "Null extName and extNum = 0 not allowed", 0);
+    psMetadataReadHeader(NULL, NULL, 0, "header_2.fits");
+    printFooter(stdout, "psMetadata", "Test G - Attempt to use two null inputs", true);
+
+
+    // Test H - Attempt to use bad extNum
+    printNegativeTestHeader(stdout,"psMetadata", "Test H - Attempt to use bad extNum",
+                            "FITS error while locating header 22: tried to move past end of file", 0);
+    metadata1 = psMetadataReadHeader(metadata1, NULL, 22, "header_2.fits");
+    if (metadata1 != NULL ) {
+        psError(PS_ERR_UNKNOWN, true,"psMetadataReadHeader did not return null when invalid ext given.");
+        return 10;
+    }
+    printFooter(stdout, "psMetadata", "Test H - Attempt to use bad extNum", true);
+
+
+    // Test I - Attempt to use bad extName
+    printNegativeTestHeader(stdout,"psMetadata", "Test I - Attempt to use bad extName",
+                            "FITS error while locating header AARGH: illegal HDU number", 0);
+    metadata1 = psMetadataReadHeader(NULL, "AARGH", -1, "header_2.fits");
+    if (metadata1 != NULL ) {
+        psError(PS_ERR_UNKNOWN, true,"psMetadataReadHeader did not return null invalid extname give.");
+        return 11;
+    }
+    printFooter(stdout, "psMetadata", "Test I - Attempt to use bad extName", true);
+
+
+    // Test J - Read named hdr w/ invalid extnum
+    printNegativeTestHeader(stdout, "psMetadata", "Test J - Read named hdr w/ invalid extnum",
+                            "If extName specified, extNum should be -1.", 0);
+    metadata1 = psMetadataReadHeader(NULL, NULL, 0, "header_2.fits");
+    if (metadata1 != NULL ) {
+        psError(PS_ERR_UNKNOWN, true,"psMetadataReadHeader did not return null w/ valid extname, invalid extnum");
+        return 12;
+    }
+    printFooter(stdout, "psMetadata", "Test J - Read named hdr w/ invalid extnum", true);
+
+
+    // Test K - Free psMetadata
+    printPositiveTestHeader(stdout, "psMetadata", "Test K - Free psMetadata");
+    psFree(metadata1);
+    psFree(metadata2);
+    psFree(metadata3);
+    if(psMemCheckLeaks(0, NULL, stdout,false)) {
+        psError(PS_ERR_UNKNOWN,true,"Memory leaks detected.");
+    }
+    psMemCheckCorruption(0);
+    psS32 nBad = psMemCheckCorruption(0);
+    if(nBad) {
+        printf("ERROR: Found %d bad memory blocks\n", nBad);
+    }
+    printFooter(stdout, "psMetadata", "Test K - Free psMetadata", true);
+
+    return 0;
+}
Index: /tags/ipp-1-X/bug123/psLib/test/collections/tst_psMetadata_02.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/collections/tst_psMetadata_02.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/collections/tst_psMetadata_02.c	(revision 22331)
@@ -0,0 +1,145 @@
+/** @file  tst_psMetadata_02.c
+ *
+ *  @brief Test driver for psMetadata functions
+ *
+ *  This test driver contains the following tests for psMetadata:
+ *     Test A - Allocate metadata items
+ *     Test B - Attempt to create metadata item with null name
+ *     Test C - Attempt to create metadata item with invalid type
+ *     Test D - Allocate metadata
+ *     Test E - Attempt to add metadata item to null metadata
+ *     Test F - Attempt to add null metadata item to metadata
+ *     Test G - Free psMetadata
+ *
+ *  @author  Ross Harman, MHPCC
+ *  @author  Robert DeSonia, MHPCC
+ *
+ *  @version $Revision: 1.15 $  $Name: not supported by cvs2svn $
+ *  @date  $Date: 2005-04-07 20:27:41 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ *
+ */
+
+#include <string.h>
+#include "pslib_strict.h"
+#include "psTest.h"
+
+static void printMetadataItem(psMetadataItem *metadataItem)
+{
+    printf("Key Name: %8s  ", metadataItem->name);
+    printf("Key mdType: 0x%08x  ", metadataItem->type);
+
+    switch (metadataItem->type) {
+    case PS_META_MULTI:
+        printf("Key Value: %17c", ' ');
+        break;
+    case PS_META_BOOL:
+        printf("Key Value: %15d  ", metadataItem->data.B);
+        break;
+    case PS_META_S32:
+        printf("Key Value: %15d  ", metadataItem->data.S32);
+        break;
+    case PS_META_F32:
+        printf("Key Value: %15.3f  ", metadataItem->data.F32);
+        break;
+    case PS_META_F64:
+        printf("Key Value: %15.3f  ", metadataItem->data.F64);
+        break;
+    case PS_META_STR:
+        printf("Key Value: %15s  ", (char*)metadataItem->data.V);
+        break;
+    default:
+        printf("Bad type: %d ", metadataItem->type);
+    }
+    printf("Key Comment: %s\n", metadataItem->comment);
+}
+
+
+psS32 main( psS32 argc, char* argv[] )
+{
+    psMetadataItem *item1 = NULL;
+    psMetadata *metadata = NULL;
+    psMetadataItem *item2 = NULL;
+    psMetadataItem *item3 = NULL;
+    psMetadataItem *item4 = NULL;
+    psMetadataItem *item5 = NULL;
+    psMetadataItem *badItem = NULL;
+
+
+    // Test A - Allocate metadata items
+    printPositiveTestHeader(stdout, "psMetadata", "Test A - Allocate metadata items");
+    item1 = psMetadataItemAlloc("myItem1", PS_META_BOOL, "I am a boolean", true);
+    item2 = psMetadataItemAlloc("myItem2", PS_META_S32, "I am a signed integer", 111);
+    item3 = psMetadataItemAlloc("myItem3", PS_META_F32, "I am a single precision floating point", 222.222);
+    item4 = psMetadataItemAlloc("myItem4", PS_META_F64, "I am a double precision floating point", 333.333);
+    item5 = psMetadataItemAlloc("myItem5", PS_META_STR, "I am a string", "HELLO WORLD");
+    printMetadataItem(item1);
+    printMetadataItem(item2);
+    printMetadataItem(item3);
+    printMetadataItem(item4);
+    printMetadataItem(item5);
+    printFooter(stdout, "psMetadata", "Test A - Allocate metadata items", true);
+
+
+    // Test B - Attempt to create metadata item with null name
+    printNegativeTestHeader(stdout,"psMetadata", "Test B - Attempt to create metadata item with null name",
+                            "Null value for name not allowed", 0);
+    psLogMsg(__func__,PS_LOG_INFO,"Following should produce error for null name.");
+    badItem = psMetadataItemAlloc(NULL, PS_META_STR, "I am a string", "HELLO WORLD");
+    if (badItem != NULL) {
+        psError(PS_ERR_UNKNOWN, true,"psMetadataItemAlloc did not return null with null name item.");
+        return 10;
+    }
+    printFooter(stdout, "psMetadata", "Test B - Attempt to create metadata item with null name", true);
+
+
+    // Test C - Attempt to create metadata item with invalid type
+    printNegativeTestHeader(stdout,"psMetadata", "Test C - Attempt to create metadata item with invalid type",
+                            "Invalid psMetadataType: 6", 0);
+    badItem = psMetadataItemAlloc("badItem", -1, "I am bad", "Bad comment");
+    printFooter(stdout, "psMetadata", "Test C - Attempt to create metadata item with invalid type", true);
+
+
+    // Test D - Allocate metadata
+    printPositiveTestHeader(stdout, "psMetadata", "Test D - Allocate metadata");
+    metadata = psMetadataAlloc();
+    printFooter(stdout, "psMetadata", "Test D - Allocate metadata", true);
+
+
+    // Test E - Attempt add metadata item to null metadata
+    printNegativeTestHeader(stdout,"psMetadata", "Test E - Attempt to add metadata item to null metadata",
+                            "Null metadata collection not allowed", 0);
+    psMetadataAddItem(NULL, item1, PS_LIST_HEAD, PS_META_DEFAULT);
+    printFooter(stdout, "psMetadata", "Test E - Attempt to add metadata item to null metadata", true);
+
+
+    // Test F - Attempt add null metadata item to metadata
+    printNegativeTestHeader(stdout,"psMetadata", "Test F - Attempt to add null metadata item to metadata",
+                            "Null metadata item not allowed", 0);
+    psMetadataAddItem(metadata, NULL, PS_LIST_HEAD, PS_META_DEFAULT);
+    printFooter(stdout, "psMetadata", "Test F - Attempt to add null metadata item to metadata", true);
+
+
+    // Test G - Free psMetadata
+    printPositiveTestHeader(stdout, "psMetadata", "Test G - Free psMetadata");
+    psFree(item1);
+    psFree(item2);
+    psFree(item3);
+    psFree(item4);
+    psFree(item5);
+    psFree(badItem);
+    psFree(metadata);
+    if(psMemCheckLeaks(0, NULL, stdout,false) ) {
+        psError(PS_ERR_UNKNOWN,true,"Memory leaks detected.");
+        return 10;
+    }
+    psMemCheckCorruption(0);
+    psS32 nBad = psMemCheckCorruption(0);
+    if(nBad) {
+        printf("ERROR: Found %d bad memory blocks\n", nBad);
+    }
+    printFooter(stdout, "psMetadata", "Test G - Free psMetadata", true);
+
+    return 0;
+}
Index: /tags/ipp-1-X/bug123/psLib/test/collections/tst_psMetadata_03.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/collections/tst_psMetadata_03.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/collections/tst_psMetadata_03.c	(revision 22331)
@@ -0,0 +1,241 @@
+/** @file  tst_psMetadata_03.c
+*
+*  @brief Test driver for psMetadata functions
+*
+*  This test driver contains the following tests for psMetadata:
+*     Test A - Allocate metadata and items
+*     Test B - Remove items from metadata by name
+*     Test C - Remove items from metadata by index
+*     Test D - Attempt to use null metadata
+*     Test E - Attempt to remove non-existant metadata item by name
+*     Test F - Attempt to remove non-existant metadata item by index
+*     Test G - Attempt to add item to an invalid metadata structure
+*     Test H - Attempt to add item to an invalid metadata structure
+*     Test I - Attempt to add item with a null name
+*     Test J - Attempt to add item to an invalid metadata structure
+*     Test K - Free psMetadata
+*
+*  @author  Ross Harman, MHPCC
+*
+*  @version $Revision: 1.17 $  $Name: not supported by cvs2svn $
+*  @date  $Date: 2005-04-07 20:27:41 $
+*
+*  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+*
+*/
+
+#include <string.h>
+#include "pslib_strict.h"
+#include "psTest.h"
+
+static void printMetadataItem(psMetadataItem *metadataItem)
+{
+    printf("Key Name: %8s  ", metadataItem->name);
+    printf("Key mdType: 0x%08x  ", metadataItem->type);
+
+    switch (metadataItem->type) {
+    case PS_META_MULTI:
+        printf("Key Value: %17c", ' ');
+        break;
+    case PS_META_BOOL:
+        printf("Key Value: %15d  ", metadataItem->data.B);
+        break;
+    case PS_META_S32:
+        printf("Key Value: %15d  ", metadataItem->data.S32);
+        break;
+    case PS_META_F32:
+        printf("Key Value: %15.3f  ", metadataItem->data.F32);
+        break;
+    case PS_META_F64:
+        printf("Key Value: %15.3f  ", metadataItem->data.F64);
+        break;
+    case PS_META_STR:
+        printf("Key Value: %15s  ", (char*)metadataItem->data.V);
+        break;
+    default:
+        printf("Bad type: %d ", metadataItem->type);
+    }
+    printf("Key Comment: %s\n", metadataItem->comment);
+}
+
+
+psS32 main( psS32 argc, char* argv[] )
+{
+    psMetadataItem *item1 = NULL;
+    psMetadataItem *item2 = NULL;
+    psMetadataItem *item3 = NULL;
+    psMetadataItem *item4 = NULL;
+    psMetadataItem *errItem = NULL;
+    psMetadata *metadata = NULL;
+    psMetadata *errMetadata = NULL;
+    psHash *mdTable = NULL;
+    psList *mdList = NULL;
+    char *errName = NULL;
+
+    // Test A - Allocate metadata and items
+    printPositiveTestHeader(stdout, "psMetadata", "Test A - Allocate metadata items");
+    metadata = psMetadataAlloc();
+    item1 = psMetadataItemAlloc("myItem1", PS_META_BOOL, "I am a boolean", true);
+    item2 = psMetadataItemAlloc("myItem2", PS_META_S32, "I am a integer", 55);
+    item3 = psMetadataItemAlloc("myItem3", PS_META_BOOL, "I am a boolean", false);
+    item4 = psMetadataItemAlloc("myItem4", PS_META_S32, "I am a integer", 66);
+    errItem = psMetadataItemAlloc("errItem", PS_META_S32, "I am a integer", 99);
+    printMetadataItem(item1);
+    printMetadataItem(item2);
+    printMetadataItem(item3);
+    printMetadataItem(item4);
+    printFooter(stdout, "psMetadata", "Test A - Allocate metadata items", true);
+
+
+    // Test B - Remove items from metadata by name
+    printPositiveTestHeader(stdout, "psMetadata", "Test B - Remove items from metadata by name");
+    if(!psMetadataAddItem(metadata, item1, PS_LIST_HEAD, PS_META_DEFAULT)) {
+        psError(PS_ERR_UNKNOWN, true,"psMetadataAddItem did not return true when adding by name.");
+        return 10;
+    }
+    if(!psMetadataAdd(metadata,PS_LIST_HEAD,"myItem2", PS_META_S32, "I am S32 integer",77)) {
+        psError(PS_ERR_UNKNOWN, true,"psMetadataAddItem did not return true when adding by name.");
+        return 11;
+    }
+    if (!psMetadataRemove(metadata, 0, "myItem1")) {
+        psError(PS_ERR_UNKNOWN, true,"psMetadataRemove did not return true when removing by name.");
+        return 12;
+    }
+    if (!psMetadataRemove(metadata, 0, "myItem2")) {
+        psError(PS_ERR_UNKNOWN, true,"psMetadataRemove did not return true when removing by name.");
+        return 13;
+    }
+    printFooter(stdout, "psMetadata", "Test B - Remove items from metadata by name", true);
+
+
+    // Test C - Remove items from metadata by index
+    printPositiveTestHeader(stdout, "psMetadata", "Test C - Remove items from metadata by index");
+    if ( ! psMetadataAddItem(metadata, item3, PS_LIST_HEAD, PS_META_DEFAULT) ) {
+        psError(PS_ERR_UNKNOWN, true,"psMetadataAddItem did not return true when adding by index.");
+        return 14;
+    }
+    if ( ! psMetadataAdd(metadata,PS_LIST_HEAD,"myItem4", PS_META_S32, "I am S32 integer",88) ) {
+        psError(PS_ERR_UNKNOWN, true,"psMetadataAddItem did not return true when adding by index.");
+        return 15;
+    }
+    if( ! psMetadataRemove(metadata, 0, NULL) ) {
+        psError(PS_ERR_UNKNOWN, true,"psMetadataRemove did not return true when removing by index.");
+        return 16;
+    }
+    if ( ! psMetadataRemove(metadata, 0, NULL ) ) {
+        psError(PS_ERR_UNKNOWN, true,"psMetadataRemove did not return true when removing by index.");
+        return 17;
+    }
+    printFooter(stdout, "psMetadata", "Test C - Remove items from metadata by index", true);
+
+
+    // Test D - Attempt to use null metadata
+    printNegativeTestHeader(stdout,"psMetadata", "Test D - Attempt to use null metadata",
+                            "Null metadata collection not allowed", 0);
+    if ( psMetadataRemove(NULL, 0, NULL) ) {
+        psError(PS_ERR_UNKNOWN, true,"psMetadataRemove did not return false when removing from null metadata.");
+        return 18;
+    }
+    printFooter(stdout, "psMetadata", "Test D - Attempt to use null metadata", true);
+
+
+    // Test E - Attempt to remove non-existant metadata item by name
+    printNegativeTestHeader(stdout,"psMetadata", "Test E - Attempt to remove non-existant metadata item by name",
+                            "Couldn't find metadata item. Name: AARGH", 0);
+    if( psMetadataRemove(metadata, 0, "AARGH") ) {
+        psError(PS_ERR_UNKNOWN, true,"psMetadataRemove did not return false when removing non-existant item.");
+        return 19;
+    }
+    printFooter(stdout, "psMetadata", "Test E - Attempt to remove non-existant metadata item by name", true);
+
+
+    // Test F - Attempt to remove non-existant metadata item by index
+    printNegativeTestHeader(stdout,"psMetadata", "Test E - Attempt to remove non-existant metadata item by index",
+                            "Couldn't find metadata item in list. Index: 22", 0);
+    if( psMetadataRemove(metadata, 22, NULL) ) {
+        psError(PS_ERR_UNKNOWN, true,"psMetadataRemove did not return false when removing non-existant item.");
+        return 20;
+    }
+    printFooter(stdout, "psMetadata", "Test E - Attempt to remove non-existant metadata item by index", true);
+
+
+    // Test G - Attempt to add item to an invalid metadata structure
+    printNegativeTestHeader(stdout,"psMetadata","Test G - Attempt to add item to metadata w/o hash table",
+                            "Couldn't add item to invalid metadata structure.",0);
+    errMetadata = psMetadataAlloc();
+    mdTable = errMetadata->table;
+    errMetadata->table = NULL;
+    if ( psMetadataAddItem(errMetadata, item3, PS_LIST_HEAD, PS_META_DEFAULT) ) {
+        psError(PS_ERR_UNKNOWN, true,"psMetadataAddItem did not return false w/ invalid metadata struct w/o hash table.");
+        return 21;
+    }
+    if ( psMetadataRemove(errMetadata, PS_LIST_HEAD, "errItem") ) {
+        psError(PS_ERR_UNKNOWN, true,"psMetadataRemove did not return false w/ invalid metadata struct w/o hash table.");
+        return 31;
+    }
+    errMetadata->table = mdTable;
+    printFooter(stdout,"psMetadata","Test G - Attempt to add item to invalid metadata w/o hash table", true);
+
+    // Test H - Attempt to add item to an invalid metadata structure
+    printNegativeTestHeader(stdout,"psMetadata","Test H - Attempt to add item to metadata w/o link list",
+                            "Couldn't add item to invalid metadata structure.",0);
+    mdList = errMetadata->list;
+    errMetadata->list = NULL;
+    if ( psMetadataAddItem(errMetadata, item3, PS_LIST_HEAD, PS_META_DEFAULT) ) {
+        psError(PS_ERR_UNKNOWN, true,"psMetadataAddItem did not return false w/ invalid metadata struct w/o link list.");
+        return 22;
+    }
+    if ( psMetadataRemove(errMetadata, PS_LIST_HEAD, "errItem") ) {
+        psError(PS_ERR_UNKNOWN, true,"psMetadataRemove did not return false w/ invalid metadata struct w/o link list.");
+        return 32;
+    }
+    errMetadata->list = mdList;
+    printFooter(stdout,"psMetadata","Test H - Attempt to add item to invalid metadata w/o link list", true);
+
+    // Test I - Attempt to add item with a null name
+    printNegativeTestHeader(stdout,"psMetadata","Test I - Attempt to add item with null name",
+                            "Couldn't add item with null name.",0);
+    errName = errItem->name;
+    errItem->name = NULL;
+    if ( psMetadataAddItem(errMetadata, errItem, PS_LIST_HEAD, PS_META_DEFAULT) ) {
+        psError(PS_ERR_UNKNOWN, true,"psMetadataAddItem did not return false with item with null name.");
+        return 23;
+    }
+    errItem->name = errName;
+    printFooter(stdout,"psMetadata","Test I - Attempt to add item with null name", true);
+
+    // Test J - Attempt to add item to an invalid metadata structure
+    printNegativeTestHeader(stdout,"psMetadata","Test J - Attempt to add item to metadata w/o hash table",
+                            "Couldn't add item to invalid metadata structure.",0);
+    mdTable = errMetadata->table;
+    errMetadata->table = NULL;
+    if (psMetadataAdd(errMetadata, PS_LIST_HEAD, "errItem", PS_META_S32, "Integer",22) ) {
+        psError(PS_ERR_UNKNOWN, true,"psMetadataAddItem did not return false w/ invalid metadata struct w/o hash table.");
+        return 24;
+    }
+    errMetadata->table = mdTable;
+    printFooter(stdout,"psMetadata","Test J - Attempt to add item to invalid metadata w/o hash table", true);
+
+    // Test K - Free psMetadata
+    printPositiveTestHeader(stdout, "psMetadata", "Test K - Free psMetadata");
+    psFree(metadata);
+    psFree(item1);
+    psFree(item2);
+    psFree(item3);
+    psFree(item4);
+    psFree(errItem);
+    psFree(errMetadata);
+    if( psMemCheckLeaks(0, NULL, stdout,false) != 0 ) {
+        psError(PS_ERR_UNKNOWN, true,"Memory leaks detected.");
+        return 25;
+    }
+    psMemCheckCorruption(0);
+    psS32 nBad = psMemCheckCorruption(0);
+    if(nBad) {
+        printf("ERROR: Found %d bad memory blocks\n", nBad);
+    }
+    printFooter(stdout, "psMetadata", "Test K - Free psMetadata", true);
+
+
+    return 0;
+}
Index: /tags/ipp-1-X/bug123/psLib/test/collections/tst_psMetadata_04.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/collections/tst_psMetadata_04.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/collections/tst_psMetadata_04.c	(revision 22331)
@@ -0,0 +1,292 @@
+
+/** @file  tst_psMetadata_04.c
+*
+*  @brief Test driver for psMetadata functions
+*
+*  This test driver contains the following tests for psMetadata:
+*     Test A - Allocate metadata and items
+*     Test B - Lookup metadata item by name
+*     Test C - Attempt to use null metadata
+*     Test D - Attempt to use null key
+*     Test E - Attempt to lookup non-existant metadata item
+*     Test F - Lookup metadata item by index
+*     Test G - Lookup metadata item and return psS32 value
+*     Test H - Lookup metadata item and return psF64 value
+*     Test I - Lookup metadata item and return psVector pointer
+*     Test J - Attempt to use null metadata
+*     Test K - Attempt to get non-existant metadata item
+*     Test L - Attempt to look up with an invalid metadata object
+*     Test M - Attempt get item  with an invalid metadata object
+*     Test N - Attempt get value of non-existant metadata item
+*     Test O - Free psMetadata
+*
+*  @author  Ross Harman, MHPCC
+*
+*  @version $Revision: 1.18 $  $Name: not supported by cvs2svn $
+*  @date  $Date: 2005-04-07 20:27:41 $
+*
+*  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+*
+*/
+
+#include <string.h>
+#include "pslib_strict.h"
+#include "psTest.h"
+
+static void printMetadataItem(psMetadataItem *metadataItem)
+{
+    printf("Key Name: %8s  ", metadataItem->name);
+    printf("Key mdType: 0x%08x  ", metadataItem->type);
+
+    switch (metadataItem->type) {
+    case PS_META_MULTI:
+        printf("Key Value: %17c", ' ');
+        break;
+    case PS_META_BOOL:
+        printf("Key Value: %15d  ", metadataItem->data.B);
+        break;
+    case PS_META_S32:
+        printf("Key Value: %15d  ", metadataItem->data.S32);
+        break;
+    case PS_META_F32:
+        printf("Key Value: %15.3f  ", metadataItem->data.F32);
+        break;
+    case PS_META_F64:
+        printf("Key Value: %15.3f  ", metadataItem->data.F64);
+        break;
+    case PS_META_STR:
+        printf("Key Value: %15s  ", (char*)metadataItem->data.V);
+        break;
+    default:
+        printf("Bad type: %d ", metadataItem->type);
+    }
+    printf("Key Comment: %s\n", metadataItem->comment);
+}
+
+
+psS32 main( psS32 argc, char* argv[] )
+{
+    psBool status = 0;
+    psMetadataItem *item1 = NULL;
+    psMetadataItem *item2 = NULL;
+    psMetadataItem *item3 = NULL;
+    psMetadataItem *item4 = NULL;
+    psMetadataItem *item5 = NULL;
+    psMetadataItem *item6 = NULL;
+    psMetadataItem *item = NULL;
+    psMetadata *metadata = NULL;
+    psHash* tmpTable = NULL;
+    psList* tmpList = NULL;
+
+
+    // Test A - Allocate metadata and items
+    printPositiveTestHeader(stdout, "psMetadata", "Test A - Allocate metadata items");
+    psVector *vec = psVectorAlloc(5, PS_TYPE_S32);
+    metadata = psMetadataAlloc();
+    item1 = psMetadataItemAlloc("myItem1", PS_META_BOOL, "I am a boolean", true);
+    item2 = psMetadataItemAlloc("myItem2", PS_META_S32, "I am a integer", 55);
+    item3 = psMetadataItemAlloc("myItem3", PS_META_BOOL, "I am a boolean", false);
+    item4 = psMetadataItemAlloc("myItem4", PS_META_S32, "I am a integer", 66);
+    item5 = psMetadataItemAlloc("myItem5", PS_META_F64, "I am a double", 3.14);
+    item6 = psMetadataItemAlloc("myItem6", PS_META_VEC, "I am a vector", vec);
+    printMetadataItem(item1);
+    printMetadataItem(item2);
+    printMetadataItem(item3);
+    printMetadataItem(item4);
+    printMetadataItem(item5);
+    psMetadataAddItem(metadata, item1, PS_LIST_HEAD, PS_META_DEFAULT);
+    psMetadataAddItem(metadata, item2, PS_LIST_HEAD, PS_META_DEFAULT);
+    psMetadataAddItem(metadata, item3, PS_LIST_HEAD, PS_META_DEFAULT);
+    psMetadataAddItem(metadata, item4, PS_LIST_HEAD, PS_META_DEFAULT);
+    psMetadataAddItem(metadata, item5, PS_LIST_HEAD, PS_META_DEFAULT);
+    psMetadataAddItem(metadata, item6, PS_LIST_HEAD, PS_META_DEFAULT);
+    psFree(vec);
+    printFooter(stdout, "psMetadata", "Test A - Allocate metadata items", true);
+
+
+    // Test B - Lookup metadata item by name
+    printPositiveTestHeader(stdout, "psMetadata", "Test B - Lookup metadata item by name");
+    item = psMetadataLookup(metadata, "myItem2");
+    printf("Found item named %s\n", item->name);
+    if(item == NULL) {
+        printf("ERROR: Item should not be null\n");
+        return 10;
+    }
+    printFooter(stdout, "psMetadata", "Test B - Lookup metadata item by name", true);
+
+
+    // Test C - Attempt to use null metadata
+    printNegativeTestHeader(stdout,"psMetadata", "Test C - Attempt to use null metadata",
+                            "Null metadata collection not allowed", 0);
+    if ( psMetadataLookup(NULL, "myItem2") != NULL ) {
+        psError(PS_ERR_UNKNOWN, true,"psMetadataLookup did not return NULL with null metadata.");
+        return 11;
+    }
+    printFooter(stdout, "psMetadata", "Test C - Attempt to use null metadata", true);
+
+
+    // Test D - Attempt to use null key
+    printNegativeTestHeader(stdout,"psMetadata", "Test D - Attempt to use null key",
+                            "Null key name not allowed", 0);
+    if ( psMetadataLookup(metadata, NULL) != NULL ) {
+        psError(PS_ERR_UNKNOWN, true,"psMetadata did not return NULL with null key.");
+        return 12;
+    }
+    printFooter(stdout, "psMetadata", "Test D - Attempt to use null key", true);
+
+
+    // Test E - Attempt to lookup non-existant metadata item
+    printNegativeTestHeader(stdout,"psMetadata", "Test E - Attempt to lookup non-existant metadata item",
+                            "Couldn't find metadata item. Name: AARGH", 0);
+    if ( psMetadataLookup(metadata, "AARGH") != NULL ) {
+        psError(PS_ERR_UNKNOWN, true,"psMetadata did not return NULL with a non-existant item.");
+        return 13;
+    }
+    printFooter(stdout, "psMetadata", "Test E - Attempt to lookup non-existant metadata item", true);
+
+
+    // Test F - Lookup metadata item by index
+    printPositiveTestHeader(stdout, "psMetadata", "Test F - Lookup metadata item by index");
+    item = psMetadataGet(metadata, 0);
+    printf("Found item named %s\n", item->name);
+    if(item == NULL) {
+        printf("ERROR: Item should not be null\n");
+        return 14;
+    }
+    printFooter(stdout, "psMetadata", "Test F - Lookup metadata item by index", true);
+
+    // Test G - Lookup metadata item and return psS32 value
+    printPositiveTestHeader(stdout, "psMetadata", "Test G - Lookup metadata item and return psS32 value");
+    psS32 valueS32 = 0;
+    valueS32 = psMetadataLookupS32(&status, metadata, "myItem2");
+    if(valueS32 != 55) {
+        printf("ERROR: Bad value, %d, Expected 55\n", valueS32);
+        return 15;
+    } else if(! status) {
+        printf("ERROR: Bad status, %d\n", status);
+        return 15;
+    }
+    printFooter(stdout, "psMetadata", "Test G - Lookup metadata item and return psS32 value", true);
+
+    // Test H - Lookup metadata item and return psF64 value
+    printPositiveTestHeader(stdout, "psMetadata", "Test H - Lookup metadata item and return psF64 value");
+    psF64 valueF64 = 0.0;
+    valueF64 = psMetadataLookupF64(&status, metadata, "myItem5");
+    if(fabs(valueF64-3.14) > FLT_EPSILON) {
+        printf("ERROR: Bad value, %g, Expected 3.14\n", valueF64);
+        return 16;
+    } else if(! status) {
+        printf("ERROR: Bad status, %d\n", status);
+        return 16;
+    }
+    printFooter(stdout, "psMetadata", "Test H - Lookup metadata item and return psF64 value", true);
+
+    // Test I - Lookup metadata item and return psVector pointer
+    printPositiveTestHeader(stdout, "psMetadata", "Test I - Lookup metadata item and return psVector pointer");
+    psVector *valueVec = NULL;
+    valueVec = psMetadataLookupPtr(&status, metadata, "myItem6");
+    if(valueVec != vec) {
+        printf("ERROR: Bad vector pointer\n");
+        return 17;
+    } else if(! status) {
+        printf("ERROR: Bad status, %d\n", status);
+        return 17;
+    }
+    printFooter(stdout, "psMetadata", "Test I - Lookup metadata item and return psVector pointer", true);
+
+
+    // Test J - Attempt to use null metadata
+    printNegativeTestHeader(stdout,"psMetadata", "Test J - Attempt to use null metadata",
+                            "Null metadata collection not allowed", 0);
+    item = psMetadataGet(NULL, 0);
+    if ( item != NULL ) {
+        psError(PS_ERR_UNKNOWN, true,"psMetadataGet did not return NULL with null metadata structure");
+        return 18;
+    }
+    printFooter(stdout, "psMetadata", "Test J - Attempt to use null metadata", true);
+
+
+    // Test K - Attempt to get non-existant metadata item
+    printNegativeTestHeader(stdout,"psMetadata", "Test K - Attempt to get non-existant metadata item",
+                            "Couldn't find metadata item with given index. Index: 22", 0);
+    if ( psMetadataGet(metadata, 22) != NULL ) {
+        psError(PS_ERR_UNKNOWN, true,"psMetadataGet did not return NULL with non-existant metadata item");
+        return 19;
+    }
+    printFooter(stdout, "psMetadata", "Test K - Attempt to get non-existant metadata item", true);
+
+    // Test L - Attempt to look up with an invalid metadata object
+    printNegativeTestHeader(stdout,"psMetadata","Test L - Attemp to look up with an invalid metadata",
+                            "Lookup item with invalid metadata object.", 0 );
+    tmpTable = metadata->table;
+    metadata->table = NULL;
+    if ( psMetadataLookup(metadata,"myItem2") != NULL ) {
+        psError(PS_ERR_UNKNOWN, true,"psMetadataLookup did not return null for invalid metadata object");
+        return 20;
+    }
+    metadata->table = tmpTable;
+    printFooter(stdout, "psMetadata","Test L - Attempt to lookup an invalid metadata object.",true);
+
+    // Test M - Attempt get item with an invalid metadata object
+    printNegativeTestHeader(stdout,"psMetadata","Test M - Attempt to get item with an invalid metadata",
+                            "Get item with invalid metadata object.", 0 );
+    tmpList = metadata->list;
+    metadata->list = NULL;
+    if ( psMetadataGet(metadata,0) != NULL ) {
+        psError(PS_ERR_UNKNOWN, true,"psMetadataLookup did not return null for invalid metadata object");
+        return 21;
+    }
+    metadata->list = tmpList;
+    printFooter(stdout, "psMetadata","Test M - Attempt to get item with  invalid metadata object",true);
+
+    // Test N - Attempt get psS32 value of non-existant metadata item
+    printPositiveTestHeader(stdout, "psMetadata", "Test N - Attempt get psS32 value of non-existant metadata item");
+    valueS32 = psMetadataLookupS32(&status, metadata, "myItem22");
+    if(status) {
+        printf("ERROR: Bad status, %d, \n", status);
+        return 22;
+    }
+    printFooter(stdout, "psMetadata","Test N - Attempt get psS32 value of non-existant metadata item",true);
+
+    // Test O - Attempt get psF64 value of non-existant metadata item
+    printPositiveTestHeader(stdout, "psMetadata", "Test O - Attempt get psF64 value of non-existant metadata item");
+    valueF64 = psMetadataLookupF64(&status, metadata, "myItem22");
+    if(status) {
+        printf("ERROR: Bad status, %d, \n", status);
+        return 23;
+    }
+    printFooter(stdout, "psMetadata","Test O - Attempt get psF64 value of non-existant metadata item",true);
+
+    // Test P - Attempt get psVector value of non-existant metadata item
+    printPositiveTestHeader(stdout, "psMetadata", "Test P - Attempt get psVector value of non-existant metadata item");
+    valueVec = psMetadataLookupPtr(&status, metadata, "myItem22");
+    if(status) {
+        printf("ERROR: Bad status, %d, \n", status);
+        return 24;
+    }
+    printFooter(stdout, "psMetadata","Test P - Attempt get psVector value of non-existant metadata item",true);
+
+    // Test Q - Free psMetadata
+    printPositiveTestHeader(stdout, "psMetadata", "Test Q - Free psMetadata");
+    psFree(metadata);
+    psFree(item1);
+    psFree(item2);
+    psFree(item3);
+    psFree(item4);
+    psFree(item5);
+    psFree(item6);
+    if ( psMemCheckLeaks(0, NULL, stdout,false) != 0 ) {
+        psError(PS_ERR_UNKNOWN, true,"memory leaks detected.");
+        return 23;
+    }
+    psMemCheckCorruption(0);
+    psS32 nBad = psMemCheckCorruption(0);
+    if(nBad) {
+        printf("ERROR: Found %d bad memory blocks\n", nBad);
+        return 24;
+    }
+    printFooter(stdout, "psMetadata", "Test Q - Free psMetadata", true);
+
+
+    return 0;
+}
Index: /tags/ipp-1-X/bug123/psLib/test/collections/tst_psMetadata_05.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/collections/tst_psMetadata_05.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/collections/tst_psMetadata_05.c	(revision 22331)
@@ -0,0 +1,342 @@
+
+
+/** @file  tst_psMetadata_05.c
+*
+*  @brief Test driver for psMetadata functions
+*
+*  This test driver contains the following tests for psMetadata:
+*     Test A - Allocate metadata and items
+*     Test B - Set iterator at second index
+*     Test C - Get next item at index
+*     Test D - Get next item at index and string
+*     Test E - Get previous item at index
+*     Test F - Write metadata item to file
+*     Test G - Attempt to use null metadata with setIterator
+*     Test H - Attempt to use null metadata with getNext
+*     Test I - Attempt to use null metadata with getPrevious
+*     Test J - Attempt to use null file with itemPrint
+*     Test K - Attempt to use null format with itemPrint
+*     Test L - Attempt to use null item with itemPrint
+*     Test M - Free psMetadata
+*
+*  @author  Ross Harman, MHPCC
+*
+*  @version $Revision: 1.24 $  $Name: not supported by cvs2svn $
+*  @date  $Date: 2005-04-07 20:27:41 $
+*
+*  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+*
+*/
+
+#include <string.h>
+#include "pslib_strict.h"
+#include "psTest.h"
+
+static void printMetadataItem(psMetadataItem *metadataItem)
+{
+    printf("Key Name: %8s  ", metadataItem->name);
+    printf("Key mdType: 0x%08x  ", metadataItem->type);
+
+    switch (metadataItem->type) {
+    case PS_META_MULTI:
+        printf("Key Value: %17c", ' ');
+        break;
+    case PS_META_BOOL:
+        printf("Key Value: %15d  ", metadataItem->data.B);
+        break;
+    case PS_META_S32:
+        printf("Key Value: %15d  ", metadataItem->data.S32);
+        break;
+    case PS_META_F32:
+        printf("Key Value: %15.3f  ", metadataItem->data.F32);
+        break;
+    case PS_META_F64:
+        printf("Key Value: %15.3f  ", metadataItem->data.F64);
+        break;
+    case PS_META_STR:
+        printf("Key Value: %15s  ", (char*)metadataItem->data.V);
+        break;
+    default:
+        printf("Bad type: %d ", metadataItem->type);
+    }
+    printf("Key Comment: %s\n", metadataItem->comment);
+}
+
+
+psS32 main( psS32 argc, char* argv[] )
+{
+    psMetadataItem *item1 = NULL;
+    psMetadataItem *item2 = NULL;
+    psMetadataItem *item3 = NULL;
+    psMetadataItem *item4 = NULL;
+    psMetadataItem *item5 = NULL;
+    psMetadataItem *item6 = NULL;
+    psMetadataItem *item7 = NULL;
+    //    psMetadataItem *item8 = NULL;
+    psMetadata *metadata = NULL;
+    FILE *fd = NULL;
+
+    // Test A - Allocate metadata and items
+    printPositiveTestHeader(stdout, "psMetadata", "Test A - Allocate metadata items");
+    metadata = psMetadataAlloc();
+    item1 = psMetadataItemAlloc("myItem1", PS_META_BOOL, "I am a boolean", true);
+    item2 = psMetadataItemAlloc("myItem2", PS_META_S32, "I am a integer", 55);
+    item3 = psMetadataItemAlloc("myItem3", PS_META_BOOL, "I am a boolean", false);
+    item4 = psMetadataItemAlloc("myItem4", PS_META_S32, "I am a integer", 66);
+    item5 = psMetadataItemAlloc("myItem5", PS_META_F32, "I am a float", 3.14);
+    item6 = psMetadataItemAlloc("myItem6", PS_META_F64,"I am a double", 6.28);
+    item7 = psMetadataItemAlloc("myItem7", PS_META_STR, "I am a string", "GNIRTS");
+    //    item8 = psMetadataItemAlloc("myItem8", PS_TYPE_PTR, PS_META_UNKNOWN, "I am unknown");
+    printMetadataItem(item1);
+    printMetadataItem(item2);
+    printMetadataItem(item3);
+    printMetadataItem(item4);
+    psMetadataAddItem(metadata, item1, PS_LIST_HEAD, PS_META_DEFAULT);
+    psMetadataAddItem(metadata, item2, PS_LIST_HEAD, PS_META_DEFAULT);
+    psMetadataAddItem(metadata, item3, PS_LIST_HEAD, PS_META_DEFAULT);
+    psMetadataAddItem(metadata, item4, PS_LIST_HEAD, PS_META_DEFAULT);
+    printFooter(stdout, "psMetadata", "Test A - Allocate metadata items", true);
+
+    /*
+        // Test B - Set iterator at second index
+        printPositiveTestHeader(stdout, "psMetadata", "Test B - Set iterator at second index");
+        if (!psMetadataSetIterator(metadata, 2)) {
+            psError(PS_ERR_UNKNOWN,true,"Failed to set iterator");
+            return 100;
+        }
+        printFooter(stdout, "psMetadata", "Test B - Set iterator at second index", true);
+
+
+        // Test C - Get next item at index
+        printPositiveTestHeader(stdout, "psMetadata", "Test C - Get next item at index");
+        item = psMetadataGetNext(metadata, NULL, 2);
+        if(item == NULL) {
+            printf("ERROR: Item should not be null\n");
+        } else {
+            printf("Found item named %s\n", item->name);
+        }
+        printFooter(stdout, "psMetadata", "Test C - Get next item at index", true);
+
+
+        // Test D - Get next item at index and string
+        printPositiveTestHeader(stdout, "psMetadata", "Test D - Get next item at index and string");
+        item = psMetadataGetNext(metadata, "myItem1", 1);
+        if(item == NULL) {
+            printf("ERROR: Item should not be null\n");
+        } else {
+            printf("Found item named %s\n", item->name);
+        }
+        printFooter(stdout, "psMetadata", "Test D - Get next item at index and string", true);
+
+
+        // Test E - Get previous item at index
+        printPositiveTestHeader(stdout, "psMetadata", "Test E - Get previous item at index");
+        item = psMetadataGetPrevious(metadata, NULL, 1);
+        if(item == NULL) {
+            printf("ERROR: Item should not be null\n");
+        } else {
+            printf("Found item named %s\n", item->name);
+        }
+        if( psMetadataGetPrevious(metadata,"myItem3",1) == NULL) {
+            psError(PS_ERR_UNKNOWN, true,"psMetadataGetPrevious did not return an item from metadata.");
+            return 45;
+        }
+        tmpList = metadata->list;
+        metadata->list = NULL;
+        if ( psMetadataGetPrevious(metadata,NULL,1) != NULL) {
+            psError(PS_ERR_UNKNOWN, true,"psMetadataGetPrevious did not return null for invalid metadata.");
+            return 50;
+        }
+        metadata->list = tmpList;
+        printFooter(stdout, "psMetadata", "Test E - Get previous item at index", true);
+
+    */
+    // Test F - Write metadata item to file
+    printPositiveTestHeader(stdout, "psMetadata", "Test F - Write metadata item to file");
+    fd = fopen("temp/tst_psMetadata05_OUT", "w");
+    if(fd == NULL) {
+        printf("ERROR: Couldn't open file for writing\n");
+    }
+
+    if (psMetadataItemPrint(fd, "S32 = %ld\n", item2) == false) {
+        printf("ERROR: Return type should be true\n");
+        return 10;
+    }
+
+    if (psMetadataItemPrint(fd, "S32 = %+06.1f\n", item2) == false) {
+        printf("ERROR: Return type should be true\n");
+        return 10;
+    }
+
+    if (psMetadataItemPrint(fd, "BOL = %ld\n", item3) == false) {
+        printf("ERROR: Return type should be true\n");
+        return 11;
+    }
+
+    if (psMetadataItemPrint(fd, "F32 = %g\n", item5) == false) {
+        printf("ERROR: Return type should be true\n");
+        return 12;
+    }
+
+    if (psMetadataItemPrint(fd, "F32 = % #i\n", item5) == false) {
+        printf("ERROR: Return type should be true\n");
+        return 12;
+    }
+
+    if (psMetadataItemPrint(fd, "F64 = %g\n", item6) == false) {
+        printf("ERROR: Return type should be true\n");
+        return 13;
+    }
+
+    if (psMetadataItemPrint(fd, "STR = %s\n", item7) == false) {
+        printf("ERROR: Return type should be true\n");
+        return 14;
+    }
+    //    psLogMsg(__func__,PS_LOG_INFO,"Attempt to print item of invalid type, should generate error message");
+    //    if (psMetadataItemPrint(fd, "UNK = \n", item8) == true) {
+    //        printf("ERROR: Return type should be false\n");
+    //        fclose(fd);
+    //        return 15;
+    //    }
+    fclose(fd);
+
+    fd = fopen("temp/tst_psMetadata05_OUT", "r");
+    if(fd == NULL) {
+        printf("ERROR: Couldn't open file for reading\n");
+    }
+
+    char line[256];
+    char truth1[] = "S32 = 55";
+    fgets(line, 256, fd);
+    if(strncmp(line, truth1, 8)) {
+        printf("ERROR: Data in file is not as expected. Value: %s. Should be: %s\n", line, truth1);
+    }
+
+    char truth1b[] = "S32 = +055.0";
+    fgets(line, 256, fd);
+    if(strncmp(line, truth1b, 12)) {
+        printf("ERROR: Data in file is not as expected. Value: %s. Should be: %s\n", line, truth1b);
+    }
+
+    char truth2[] = "BOL = 0";
+    fgets(line, 256, fd);
+    if(strncmp(line, truth2, 7)) {
+        printf("ERROR: Data in file is not as expected. Value: %s. Should be: %s\n", line, truth2);
+    }
+
+    char truth3[] = "F32 = 3.14";
+    fgets(line, 256, fd);
+    if(strncmp(line, truth3, 10)) {
+        printf("ERROR: Data in file is not as expected. Value: %s. Should be: %s\n", line, truth3);
+    }
+
+    char truth3b[] = "F32 =  3";
+    fgets(line, 256, fd);
+    if(strncmp(line, truth3b, 8)) {
+        printf("ERROR: Data in file is not as expected. Value: %s. Should be: %s\n", line, truth3b);
+    }
+
+    char truth4[] = "F64 = 6.28";
+    fgets(line, 256, fd);
+    if(strncmp(line, truth4, 10)) {
+        printf("ERROR: Data in file is not as expected. Value: %s. Should be: %s\n", line, truth4);
+    }
+
+    char truth5[] = "STR = GNIRTS";
+    fgets(line, 256, fd);
+    if(strncmp(line, truth5, 12)) {
+        printf("ERROR: Data in file is not as expected. Value: %s. Should be: %s\n", line, truth5);
+    }
+
+    fclose(fd);
+    printFooter(stdout, "psMetadata", "Test F - Write metadata item to file", true);
+    /*
+        // Test G - Attempt to use null metadata with setIterator
+        printNegativeTestHeader(stdout,"psMetadata", "Test G - Attempt to use null metadata with setIterator",
+                                "Null metadata collection not allowed", 0);
+        if( psMetadataSetIterator(NULL, 0)) {
+            psError(PS_ERR_UNKNOWN,true,"Set iterator did not detect invalid parameter.");
+            return 101;
+        }
+        tmpList = metadata->list;
+        metadata->list = NULL;
+        if( psMetadataSetIterator(metadata,0)) {
+            psError(PS_ERR_UNKNOWN,true,"Set iterator did not detect null list.");
+            return 102;
+        }
+        metadata->list = tmpList;
+        printFooter(stdout, "psMetadata", "Test G - Attempt to use null metadata with setIterator", true);
+
+
+        // Test H - Attempt to use null metadata with getNext
+        printNegativeTestHeader(stdout,"psMetadata", "Test H - Attempt to use null metadata with getNext",
+                                "Null metadata collection not allowed", 0);
+        if( psMetadataGetNext(NULL, "myItem2", 0) != NULL ) {
+            psError(PS_ERR_UNKNOWN, true,"psMetadataGetNext did not return null for null metadata.");
+            return 40;
+        }
+        tmpList = metadata->list;
+        metadata->list = NULL;
+        if ( psMetadataGetNext(metadata, "myItem2", 0) != NULL ) {
+            psError(PS_ERR_UNKNOWN, true,"psMetadataGetNext did not return null for invalid metadata.");
+            return 41;
+        }
+        metadata->list = tmpList;
+
+        printFooter(stdout, "psMetadata", "Test H - Attempt to use null metadata with getNext", true);
+
+
+        // Test I - Attempt to use null metadata with getPrevious
+        printNegativeTestHeader(stdout,"psMetadata", "Test I - Attempt to use null metadata with getPrevious",
+                                "Null metadata collection not allowed", 0);
+        psMetadataGetPrevious(NULL, "myItem2", 0);
+        printFooter(stdout, "psMetadata", "Test I - Attempt to use null metadata with getPrevious", true);
+
+    */
+    // Test J - Attempt to use null file with itemPrint
+    printNegativeTestHeader(stdout,"psMetadata", "Test J - Attempt to use null file with itemPrint",
+                            "Null file descriptor not allowed", 0);
+    psMetadataItemPrint(NULL, "Item value: %ld", item2);
+    printFooter(stdout, "psMetadata", "Test J - Attempt to use null file with itemPrint", true);
+
+
+    // Test K - Attempt to use null format with itemPrint
+    printNegativeTestHeader(stdout,"psMetadata", "Test K - Attempt to use null format with itemPrint",
+                            "Null format not allowed", 0);
+    psMetadataItemPrint(fd, NULL, item2);
+    printFooter(stdout, "psMetadata", "Test K - Attempt to use null format with itemPrint", true);
+
+
+    // Test L - Attempt to use null item with itemPrint
+    printNegativeTestHeader(stdout,"psMetadata", "Test L - Attempt to use null item with itemPrint",
+                            "Null metadata not allowed", 0);
+    psMetadataItemPrint(fd, "Item value: %ld", NULL);
+    printFooter(stdout, "psMetadata", "Test L - Attempt to use null item with itemPrint", true);
+
+
+    // Test M - Free psMetadata
+    printPositiveTestHeader(stdout, "psMetadata", "Test M - Free psMetadata");
+    psFree(metadata);
+    psFree(item1);
+    psFree(item2);
+    psFree(item3);
+    psFree(item4);
+    psFree(item5);
+    psFree(item6);
+    psFree(item7);
+    //    psFree(item8);
+    if ( psMemCheckLeaks(0, NULL, stdout, false) != 0 ) {
+        psError(PS_ERR_UNKNOWN, true,"Memory leaks detected.");
+        return 50;
+    }
+    psMemCheckCorruption(0);
+    psS32 nBad = psMemCheckCorruption(0);
+    if(nBad) {
+        printf("ERROR: Found %d bad memory blocks\n", nBad);
+        return 51;
+    }
+    printFooter(stdout, "psMetadata", "Test M - Free psMetadata", true);
+
+
+    return 0;
+}
Index: /tags/ipp-1-X/bug123/psLib/test/collections/tst_psMetadata_06.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/collections/tst_psMetadata_06.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/collections/tst_psMetadata_06.c	(revision 22331)
@@ -0,0 +1,166 @@
+
+/** @file  tst_psMetadata_06.c
+*
+*  @brief Test driver for psMetadata functions
+*
+*  This test driver contains the following tests for psMetadata:
+*     Test A - Allocate metadata and items
+*     Test B - Add leaf node on top of existing leaf node
+*     Test C - Add leaf node to existing folder node
+*     Test D - Add folder node on top of existing leaf node
+*     Test E - Free psMetadata
+*
+*  @author  Ross Harman, MHPCC
+*
+*  @version $Revision: 1.13 $  $Name: not supported by cvs2svn $
+*  @date  $Date: 2005-04-07 20:27:41 $
+*
+*  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+*
+*/
+
+#include <string.h>
+#include "pslib_strict.h"
+#include "psTest.h"
+
+static void printMetadataItem(psMetadataItem *metadataItem)
+{
+    printf("Key Name: %8s  ", metadataItem->name);
+    printf("Key mdType: 0x%08x  ", metadataItem->type);
+
+    switch (metadataItem->type) {
+    case PS_META_MULTI:
+        printf("Key Value: %17c", ' ');
+        break;
+    case PS_META_LIST:
+        printf("Key Value: %15s  ", "psList");
+        break;
+    case PS_META_BOOL:
+        printf("Key Value: %15d  ", metadataItem->data.B);
+        break;
+    case PS_META_S32:
+        printf("Key Value: %15d  ", metadataItem->data.S32);
+        break;
+    case PS_META_F32:
+        printf("Key Value: %15.3f  ", metadataItem->data.F32);
+        break;
+    case PS_META_F64:
+        printf("Key Value: %15.3f  ", metadataItem->data.F64);
+        break;
+    case PS_META_STR:
+        printf("Key Value: %15s  ", (char*)metadataItem->data.V);
+        break;
+    default:
+        printf("Bad type: %d ", metadataItem->type);
+    }
+    printf("Key Comment: %s\n", metadataItem->comment);
+}
+
+
+psS32 main( psS32 argc, char* argv[] )
+{
+    psMetadataItem *item1a = NULL;
+    psMetadataItem *item1b = NULL;
+    psMetadataItem *item1c = NULL;
+    psMetadataItem *item2a = NULL;
+    psMetadataItem *item2b = NULL;
+    psMetadata *metadata = NULL;
+
+
+    // Test A - Allocate metadata and items
+    printPositiveTestHeader(stdout, "psMetadata", "Test A - Allocate metadata and items");
+    item1a = psMetadataItemAlloc("myItem1", PS_META_BOOL, "I am a boolean", true);
+    item1b = psMetadataItemAlloc("myItem1", PS_META_S32, "I am a signed integer", 111);
+    item1c = psMetadataItemAlloc("myItem1", PS_META_S32, "I am a signed integer", 222);
+    item2a = psMetadataItemAlloc("myItem2", PS_META_S32, "I am a signed integer", 333);
+    item2b = psMetadataItemAlloc("myItem2", PS_META_LIST, "I am a list", NULL);
+    metadata = psMetadataAlloc();
+    printMetadataItem(item1a);
+    printMetadataItem(item1b);
+    printMetadataItem(item1c);
+    printMetadataItem(item2a);
+    printMetadataItem(item2b);
+    printFooter(stdout, "psMetadata", "Test A - Allocate metadata and items", true);
+
+
+    // Test B - Add leaf node on top of existing leaf node
+    printPositiveTestHeader(stdout, "psMetadata", "Test B - replace an item in the metadata");
+    if(!psMetadataAddItem(metadata, item1a, PS_LIST_HEAD, PS_META_DEFAULT)) {
+        psError(PS_ERR_UNKNOWN, true,"psMetadataAddItem returned false for adding a node top.");
+        return 20;
+    }
+    psMetadataItem* tempItem = psMetadataLookup(metadata, item1a->name);
+    if (tempItem != item1a) {
+        psError(PS_ERR_UNKNOWN, true,"psMetadataAddItem didn't add the metadata entry.");
+        return 20;
+    }
+
+    if (!psMetadataAddItem(metadata, item1b, PS_LIST_HEAD, PS_META_REPLACE)) {
+        psError(PS_ERR_UNKNOWN, true,"psMetadataAddItem returned false for adding a node top.");
+        return 21;
+    }
+
+    tempItem = psMetadataLookup(metadata, item1a->name);
+    if (tempItem != item1b) {
+        psError(PS_ERR_UNKNOWN, true,"psMetadataAddItem didn't replace the metadata entry.");
+        return 21;
+    }
+
+    printFooter(stdout, "psMetadata", "Test B - replace an item in the metadata", true);
+
+
+    // Test C - Add leaf node to existing folder node
+    printPositiveTestHeader(stdout, "psMetadata", "Test C - add duplicate-key metadata item");
+    if (!psMetadataAddItem(metadata, item1c, PS_LIST_HEAD, PS_META_DUPLICATE_OK)) {
+        psError(PS_ERR_UNKNOWN, true,"psMetadataAddItem return false for adding a not to existing node.");
+        return 22;
+    }
+
+    tempItem = psMetadataLookup(metadata, item1a->name);
+    if (tempItem == NULL || tempItem->type != PS_META_MULTI) {
+        psError(PS_ERR_UNKNOWN, true,"psMetadataAddItem didn't add additional metadata entry of same key.");
+        return 22;
+    }
+    printFooter(stdout, "psMetadata", "Test C - add duplicate-key metadata item", true);
+
+
+    // Test D - Add folder node on top of existing leaf node
+    printPositiveTestHeader(stdout, "psMetadata", "Test D - Add folder node on top of existing leaf node");
+    if (!psMetadataAddItem(metadata, item2a, PS_LIST_HEAD, PS_META_DEFAULT)) {
+        psError(PS_ERR_UNKNOWN, true,"psMetadataAddItem returned false for adding a node to existing leaf node.");
+        return 23;
+    }
+    if (!psMetadataAddItem(metadata, item2b, PS_LIST_HEAD, PS_META_DUPLICATE_OK)) {
+        psError(PS_ERR_UNKNOWN, true,"psMetadataAddItem returned false for adding a nod to existing leaf node.");
+        return 24;
+    }
+    printFooter(stdout, "psMetadata", "Test D - Add folder node on top of existing leaf node", true);
+    tempItem = psMetadataLookup(metadata, item1a->name);
+    if (tempItem == NULL || tempItem->type != PS_META_MULTI) {
+        psError(PS_ERR_UNKNOWN, true,"psMetadataAddItem didn't add additional metadata entry of same key.");
+        return 24;
+    }
+
+
+    // Test E - Free psMetadata
+    printPositiveTestHeader(stdout, "psMetadata", "Test E - Free psMetadata");
+    psFree(item1a);
+    psFree(item1b);
+    psFree(item1c);
+    psFree(item2a);
+    psFree(item2b);
+    psFree(metadata);
+    if ( psMemCheckLeaks(0, NULL, stdout, false) != 0 ) {
+        psError(PS_ERR_UNKNOWN, true,"Memory leaks detected.");
+        return 25;
+    }
+    psMemCheckCorruption(0);
+    psS32 nBad = psMemCheckCorruption(0);
+    if(nBad) {
+        printf("ERROR: Found %d bad memory blocks\n", nBad);
+    }
+    printFooter(stdout, "psMetadata", "Test E - Free psMetadata", true);
+
+
+    return 0;
+}
Index: /tags/ipp-1-X/bug123/psLib/test/collections/tst_psMetadata_07.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/collections/tst_psMetadata_07.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/collections/tst_psMetadata_07.c	(revision 22331)
@@ -0,0 +1,46 @@
+/** @file  tst_psMetadata_07.c
+*
+*  @brief Test driver for psMetadataIO functions
+*
+*  This test driver contains the following tests for psMetadata:
+*     Test A - Read an XML config file
+*     Test B - Free data
+*
+*  @author  Ross Harman, MHPCC
+*
+*  @version $Revision: 1.10 $  $Name: not supported by cvs2svn $
+*  @date  $Date: 2005-04-07 20:27:41 $
+*
+*  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+*
+*/
+#include "config.h"
+#include "pslib_strict.h"
+#include "psTest.h"
+
+int main(int argc, char* argv[])
+{
+    // Test A - Read an XML config file
+    printPositiveTestHeader(stdout, "psMetadata", "Test A - Read an XML config file");
+    int res = 0;
+    psU32 nFail = 0;
+    psMetadata *md = NULL;
+    md = psMetadataParseConfigXml(md, &nFail, XML_CONFIG_FILE, true);
+    if (nFail != 0) {
+        printf("psMetadataParseConfigXml returned error %d\n", res);
+    }
+
+    psFree(md);
+    printFooter(stdout, "psMetadata", "Test A - Read an XML config file", true);
+
+    // Test B - Free data
+    printPositiveTestHeader(stdout, "psMetadata", "Test B - Free data");
+    psMemCheckLeaks(0, NULL, stdout, false);
+    psS32 nBad = psMemCheckCorruption(0);
+    if(nBad) {
+        printf("ERROR: Found %d bad memory blocks\n", nBad);
+    }
+    printFooter(stdout, "psMetadata", "Test B - Free data", true);
+
+    return 0;
+}
Index: /tags/ipp-1-X/bug123/psLib/test/collections/tst_psScalar.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/collections/tst_psScalar.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/collections/tst_psScalar.c	(revision 22331)
@@ -0,0 +1,138 @@
+/** @file  tst_psScalar.c
+ *
+ *  @brief Contains the tests for psScalar.[ch]
+ *
+ *  @author Eric Van Alst, MHPCC
+ *
+ *  @version $Revision: 1.4 $
+ *           $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-04-07 20:27:41 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+
+#include "psTest.h"
+#include "pslib_strict.h"
+
+static psS32 testScalarAlloc(void);
+static psS32 testScalarCopy(void);
+
+#define tstScalarAllocByType(datatype,value)                                                                    \
+scalar = psScalarAlloc(value,PS_TYPE_##datatype);                                                               \
+if(scalar == NULL) {                                                                                            \
+    psError(PS_ERR_UNKNOWN,true,"psScalarAlloc returned NULL.");                                                \
+    return 1+value;                                                                                             \
+} else {                                                                                                        \
+    if( (scalar->type.type != PS_TYPE_##datatype) && (scalar->data.datatype != value) ) {                       \
+        psError(PS_ERR_UNKNOWN,true,"psScalarAlloc created object with unexpected type and/or value");          \
+        return 2+value;                                                                                         \
+    }                                                                                                           \
+}                                                                                                               \
+psFree(scalar);
+
+#define tstScalarCopyByType(datatype,value)                                                                               \
+scalarOrig = psScalarAlloc(value,PS_TYPE_##datatype);                                                                     \
+scalarCopy = psScalarCopy(scalarOrig);                                                                                    \
+if(scalarCopy == NULL) {                                                                                                  \
+    psError(PS_ERR_UNKNOWN,true,"psScalarCopy returned NULL.");                                                           \
+    return 3+value;                                                                                                       \
+} else {                                                                                                                  \
+    if( (scalarCopy->type.type != scalarOrig->type.type) || (scalarCopy->data.datatype != scalarOrig->data.datatype) ) {  \
+        psError(PS_ERR_UNKNOWN,true,"psScalarCopy did not copy the original scalar by type and/or value");                \
+        return 4+value;                                                                                                   \
+    }                                                                                                                     \
+}                                                                                                                         \
+psFree(scalarCopy);                                                                                                       \
+psFree(scalarOrig);
+
+testDescription tests[] = {
+                              {testScalarAlloc,783,"psScalarAlloc",0,false},
+                              {testScalarCopy,784,"psScalarCopy",0,false},
+                              {NULL}
+                          };
+
+psS32 main(psS32 argc, char* argv[])
+{
+    psLogSetLevel(PS_LOG_INFO);
+
+    if ( ! runTestSuite(stderr,"psScalar",tests,argc,argv) ) {
+        psError(PS_ERR_UNKNOWN,true,"One or more tests failed");
+        return 1;
+    }
+    return 0;
+}
+
+psS32 testScalarAlloc(void)
+{
+    psScalar* scalar;
+
+    psLogMsg(__func__,PS_LOG_INFO,"psScalarAlloc shall create scalar data objects");
+
+    // Verify the proper allocation/deallocation of scalar objects of valid types
+    tstScalarAllocByType(S8,10);
+    tstScalarAllocByType(U8,12);
+    tstScalarAllocByType(S16,14);
+    tstScalarAllocByType(U16,16);
+    tstScalarAllocByType(S32,18);
+    tstScalarAllocByType(U32,20);
+    tstScalarAllocByType(S64,22);
+    tstScalarAllocByType(U64,24);
+    tstScalarAllocByType(F32,26);
+    tstScalarAllocByType(F64,28);
+    tstScalarAllocByType(C32,30);
+    tstScalarAllocByType(C64,32);
+
+    // Verify return is null for invalid scalar type
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message");
+    scalar = psScalarAlloc(true,PS_TYPE_BOOL);
+    if(scalar != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"psScalarAlloc did not return null for invalid type");
+        return 5;
+    }
+
+    return 0;
+}
+
+psS32 testScalarCopy(void)
+{
+    psScalar*  scalarOrig;
+    psScalar*  scalarCopy;
+
+    psLogMsg(__func__,PS_LOG_INFO,"psScalarCopy shall copy scalar objects");
+
+    // Verify the proper copying of scalar objects for all valid types
+    tstScalarCopyByType(S8,100);
+    tstScalarCopyByType(U8,110);
+    tstScalarCopyByType(S16,120);
+    tstScalarCopyByType(U16,130);
+    tstScalarCopyByType(S32,140);
+    tstScalarCopyByType(U32,150);
+    tstScalarCopyByType(S64,160);
+    tstScalarCopyByType(U64,170);
+    tstScalarCopyByType(F32,180);
+    tstScalarCopyByType(F64,190);
+    tstScalarCopyByType(C32,200);
+    tstScalarCopyByType(C64,210);
+
+    // Verify the return is null for invalid scalar type in the original
+    scalarOrig = psScalarAlloc(0,PS_TYPE_S8);
+    scalarOrig->type.type = PS_TYPE_BOOL;
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message");
+    scalarCopy = psScalarCopy(scalarOrig);
+    if(scalarCopy != NULL ) {
+        psError(PS_ERR_UNKNOWN,true,"psScalarCopy did not return NULL for invalid type");
+        return 6;
+    }
+    psFree(scalarOrig);
+
+    // Verify the return is null for null original scalar value
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message");
+    scalarCopy = psScalarCopy(NULL);
+    if(scalarCopy != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"psScalarCopy did not return NULL for NULL argument");
+        return 7;
+    }
+
+    return 0;
+}
+
Index: /tags/ipp-1-X/bug123/psLib/test/collections/tst_psVector.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/collections/tst_psVector.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/collections/tst_psVector.c	(revision 22331)
@@ -0,0 +1,110 @@
+/** @file  tst_psVector.c
+ *
+ *  @brief Test driver for psVector integer functions
+ *
+ *  This test driver contains the following tests for psVector test point 1:
+ *     A)  Create S32 vector
+ *     B)  Add data to S32 vector
+ *     C)  Reallocate S32 vector bigger
+ *     D)  Reallocate S32 vector smaller
+ *     E)  Free S32 vector
+ *     F)  Attempt to create a S32 vector with zero size
+ *     G)  Attempt to realloc a null S32 vector
+ *
+ *  @author  Ross Harman, MHPCC
+ *
+ *  @version $Revision: 1.8 $  $Name: not supported by cvs2svn $
+ *  @date  $Date: 2005-04-07 20:27:41 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ *
+ */
+
+#include "pslib_strict.h"
+#include "psTest.h"
+
+psS32 main(psS32 argc,
+           char* argv[])
+{
+
+
+    // Test A - Create S32 vector
+    printPositiveTestHeader(stdout,"psVector", "Create S32 vector");
+    psVector *psVec = psVectorAlloc(5, PS_TYPE_S32);
+    printf("Vector size = %d\n", psVec->nalloc);
+    printf("Vector type = %d\n", psVec->type.type);
+    printf("Vector dimen = %d\n", psVec->type.dimen);
+    printFooter(stdout, "psVector", "Create S32 vector", true);
+
+
+    // Test B - Add data to integer vector
+    printPositiveTestHeader(stdout, "psVector", "Add data to S32 vector");
+    for(psS32 i = 0; i < 5; i++) {
+        psVec->data.S32[i] = i*10;
+        printf("Elem %d = %d\n", i, psVec->data.S32[i]);
+    }
+    printf("Vector size = %d\n", psVec->nalloc);
+    printf("Vector population = %d\n", psVec->n);
+    printFooter(stdout, "psVector", "Add data to S32 vector", true);
+
+
+    // Test C - Reallocate S32 vector bigger
+    printPositiveTestHeader(stdout,"psVector", "Reallocate S32 vector bigger");
+    psVec = psVectorRealloc(psVec,10);
+    printf("Adding more elements to S32 vector...\n");
+    for(psS32 i = 5; i < 10; i++) {
+        psVec->data.S32[i] = i*10;
+        psVec->n++;
+        printf("Elem %d = %d\n", i, psVec->data.S32[i]);
+    }
+    printf("Vector size = %d\n", psVec->nalloc);
+    printf("Vector population = %d\n", psVec->n);
+    printFooter(stdout, "psVector", "Reallocate S32 vector bigger", true);
+
+
+    // Test D - Reallocate S32 vector smaller
+    printPositiveTestHeader(stdout,"psVector","Reallocate S32 vector smaller");
+    psVec = psVectorRealloc(psVec,3);
+    printf("Vector size = %d\n", psVec->nalloc);
+    for(psS32 i = 0; i < 3; i++) {
+        printf("Elem %d = %d\n", i, psVec->data.S32[i]);
+    }
+    printf("Vector size = %d\n", psVec->nalloc);
+    printf("Vector population = %d\n", psVec->n);
+    printFooter(stdout, "psVector", "Reallocate integer S32 smaller", true);
+
+
+    // Test E - Free S32 vector
+    printPositiveTestHeader(stdout, "psVector", "Free S32 vector");
+    psFree(psVec);
+    psS32 leaks = psMemCheckLeaks(0, NULL, stdout, false);
+    if(leaks != 0) {
+        printf("ERROR: Found %d memory leaks\n",leaks);
+    }
+    psS32 nBad = psMemCheckCorruption(0);
+    if(nBad) {
+        printf("ERROR: Found %d bad memory blocks\n", nBad);
+    }
+    printFooter(stdout, "psVector" ,"Free S32 vector", true);
+
+
+    // Test F - Attempt to create a S32 vector with zero size
+    printNegativeTestHeader(stdout,"psVector", "Attempt to create a S32 vector with zero size",
+                            "Invalid value for nalloc", 0);
+    psLogMsg(__func__,PS_LOG_INFO, "Following should be an error message.");
+    psVector *vecBad = psVectorAlloc(0, PS_TYPE_S32);
+    if(vecBad != NULL) {
+        printf("ERROR: Return is not NULL\n");
+    }
+    printFooter(stdout, "psVector", "Attempt to create a S32 vector with zero size", true);
+
+
+    // Test G - Attempt to realloc a null S32 vector
+    printNegativeTestHeader(stdout,"psVector", "Attempt to realloc a null S32 vector",
+                            "Null input vector", 0);
+    psLogMsg(__func__,PS_LOG_INFO, "Following should be an error message.");
+    psVectorRealloc(NULL,6);
+    printFooter(stdout, "psVector", "Attempt to realloc a null S32 vector", true);
+
+    return 0;
+}
Index: /tags/ipp-1-X/bug123/psLib/test/collections/tst_psVectorSort_01.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/collections/tst_psVectorSort_01.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/collections/tst_psVectorSort_01.c	(revision 22331)
@@ -0,0 +1,182 @@
+/** @file  tst_psVectorSort_01.c
+ *
+ *  @brief Test driver for psVectorSort functions
+ *
+ *  This test driver contains the following tests for psVectorSort test point 1:
+ *     A)  Sort input vector to output vector for all types
+ *     B)  Sort input float vector into itself
+ *     C)  Attempt to sort vector with invalid type (i.e. PS_TYPE_BOOL)
+ *     D)  Sort input vector with zero items
+ *     C)  Free float vectors
+ *
+ *  @author  Ross Harman, MHPCC
+ *
+ *  @version $Revision: 1.9 $  $Name: not supported by cvs2svn $
+ *  @date  $Date: 2005-04-21 21:18:23 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ *
+ */
+
+#include "pslib_strict.h"
+#include "psTest.h"
+
+#define tstVectorSortByType(datatype,value)   \
+in = psVectorAlloc(7,PS_TYPE_##datatype); \
+in->n = 7;  \
+out = psVectorAlloc(7,PS_TYPE_##datatype); \
+out->n = 7;  \
+in->data.datatype[0] = 7+value; \
+in->data.datatype[1] = 9+value; \
+in->data.datatype[2] = 3+value; \
+in->data.datatype[3] = 1+value; \
+in->data.datatype[4] = 5+value; \
+in->data.datatype[5] = 5+value; \
+in->data.datatype[6] = 0+value; \
+tempVec = out; \
+out = psVectorSort(out, in); \
+if(tempVec != out) {  \
+    psError(PS_ERR_UNKNOWN,true,"Return value not equal to orignal output argument passed to function"); \
+    return 5; \
+} \
+if(out->data.datatype[0] != in->data.datatype[6]) { \
+    psError(PS_ERR_UNKNOWN,true,"Improper sort out[0] type %s",#datatype); \
+    return 10; \
+} \
+if(out->data.datatype[1] != in->data.datatype[3]) { \
+    psError(PS_ERR_UNKNOWN,true,"Improper sort out[1] type %s",#datatype); \
+    return 20; \
+} \
+if(out->data.datatype[2] != in->data.datatype[2]) { \
+    psError(PS_ERR_UNKNOWN,true,"Improper sort out[2] type %s",#datatype); \
+    return 30; \
+} \
+if(out->data.datatype[3] != in->data.datatype[4]) { \
+    psError(PS_ERR_UNKNOWN,true,"Improper sort out[3] type %s",#datatype); \
+    return 40; \
+} \
+if(out->data.datatype[4] != in->data.datatype[5]) { \
+    psError(PS_ERR_UNKNOWN,true,"Improper sort out[4] %s",#datatype); \
+    return 50; \
+} \
+if(out->data.datatype[5] != in->data.datatype[0]) { \
+    psError(PS_ERR_UNKNOWN,true,"Improper sort out[5] %s",#datatype); \
+    return 60; \
+} \
+if(out->data.datatype[6] != in->data.datatype[1]) { \
+    psError(PS_ERR_UNKNOWN,true,"Improper sort out[6] %s",#datatype); \
+    return 70; \
+} \
+psFree(in); \
+psFree(out);
+
+
+
+psS32 main(psS32 argc,
+           char* argv[])
+{
+    psVector *in = NULL;
+    psVector *out = NULL;
+    psVector *tempVec = NULL;
+
+    // Test A - Verify the sort for all supported types
+    printPositiveTestHeader(stdout,"psVectorSort","Sort all types");
+    tstVectorSortByType(S8,0);
+    tstVectorSortByType(S16,1);
+    tstVectorSortByType(S32,2);
+    tstVectorSortByType(S64,3);
+    tstVectorSortByType(U8,4);
+    tstVectorSortByType(U16,5);
+    tstVectorSortByType(U32,6);
+    tstVectorSortByType(U64,7);
+    tstVectorSortByType(F32,8);
+    tstVectorSortByType(F64,9);
+    printFooter(stdout,"psVectorSort","Sort all types",true);
+
+    // Test B - Sort input vector into itself
+    printPositiveTestHeader(stdout,"psVectorSort", "Sort input float vector into itself");
+    in = psVectorAlloc(7, PS_TYPE_F32);
+    in->n = 7;
+    in->data.F32[0] = 0.7f;
+    in->data.F32[1] = 0.9f;
+    in->data.F32[2] = 0.3f;
+    in->data.F32[3] = 0.1f;
+    in->data.F32[4] = 0.5f;
+    in->data.F32[5] = 0.5f;
+    in->data.F32[6] = -2.0f;
+    in = psVectorSort(in, in);
+    if(in->data.F32[0] != -2.0f) {
+        psError(PS_ERR_UNKNOWN,true,"Improper self sort in[0]");
+        return 100;
+    }
+    if(in->data.F32[1] != 0.1f) {
+        psError(PS_ERR_UNKNOWN,true,"Improper self sort in[1]");
+        return 200;
+    }
+    if(in->data.F32[2] != 0.3f) {
+        psError(PS_ERR_UNKNOWN,true,"Improper self sort in[2]");
+        return 300;
+    }
+    if(in->data.F32[3] != 0.5f) {
+        psError(PS_ERR_UNKNOWN,true,"Improper self sort in[3]");
+        return 400;
+    }
+    if(in->data.F32[4] != 0.5f) {
+        psError(PS_ERR_UNKNOWN,true,"Improper self sort in[4]");
+        return 500;
+    }
+    if(in->data.F32[5] != 0.7f) {
+        psError(PS_ERR_UNKNOWN,true,"Improper self sort in[5]");
+        return 600;
+    }
+    if(in->data.F32[6] != 0.9f) {
+        psError(PS_ERR_UNKNOWN,true,"Improper self sort in[6]");
+        return 700;
+    }
+    printFooter(stdout, "psVectorSort", "Sort input float vector into itself", true);
+
+    // Test C - Attempt to sort vector with invalid type
+    printPositiveTestHeader(stdout,"psVectorSort","Invalid vector type");
+    in->type.type = PS_TYPE_BOOL;
+    out = psVectorAlloc(7,PS_TYPE_F32);
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error messgae");
+    tempVec = psVectorSort(out,in);
+    if(tempVec != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Did not return NULL on error or didn't error?");
+        return 33;
+    }
+    printFooter(stdout,"psVectorSort","Invalid vector type",true);
+
+    // Test D - Sort vector with zero elements
+    printPositiveTestHeader(stdout,"psVectorSort","Sort zero element vector");
+    out = psVectorAlloc(7,PS_TYPE_F32);
+    tempVec = out;
+    in->n = 0;
+    out = psVectorSort(out,in);
+    if(tempVec != out) {
+        psError(PS_ERR_UNKNOWN,true,"Did not return the specified output vector");
+        return 44;
+    }
+    if(out->n != 0) {
+        psError(PS_ERR_UNKNOWN,true,"Did not proper set the number of elements to zero");
+        return 55;
+    }
+    printFooter(stdout,"psVectorSort","Sort zero element vector",true);
+
+
+    // Test D - Free float vectors
+    printPositiveTestHeader(stdout,"psVectorSort", "Free float vectors");
+    psFree(in);
+    psFree(out);
+    if ( psMemCheckLeaks(0, NULL, stdout, false)) {
+        psError(PS_ERR_UNKNOWN,true,"Memory leaks detected.");
+        return 10;
+    }
+    psS32 nBad = psMemCheckCorruption(0);
+    if(nBad) {
+        printf("ERROR: Found %d bad memory blocks\n", nBad);
+    }
+    printFooter(stdout, "psVectorSort", "Free float vectors", true);
+
+    return 0;
+}
Index: /tags/ipp-1-X/bug123/psLib/test/collections/tst_psVectorSort_02.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/collections/tst_psVectorSort_02.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/collections/tst_psVectorSort_02.c	(revision 22331)
@@ -0,0 +1,179 @@
+/** @file  tst_psVectorSort_02.c
+ *
+ *  @brief Test driver for psVectorSort functions
+ *
+ *  This test driver contains the following tests for psVectorSort test point 2:
+ *     A)  Create vectors
+ *     B)  Sort integer vector of indices based on pre-sort order of floating point vector
+ *     C)  Attempt to sort with null input vector
+ *     D)  Sort with output vector which needs to be resized
+ *     E)  Sort input vector with zero elements
+ *     F)  Attempt to sort input vector with invalid type
+ *     G)  Free vectors
+ *
+ *  @author  Ross Harman, MHPCC
+ *
+ *  @version $Revision: 1.9 $  $Name: not supported by cvs2svn $
+ *  @date  $Date: 2005-04-21 21:18:23 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ *
+ */
+
+#include "pslib_strict.h"
+#include "psTest.h"
+
+#define tstVectorSortIndexByType(datatype,value) \
+in = psVectorAlloc( 5, PS_TYPE_##datatype ); \
+in->n = 5; \
+in->data.datatype[0] = 7+value; \
+in->data.datatype[1] = 9+value; \
+in->data.datatype[2] = 5+value; \
+in->data.datatype[3] = 1+value; \
+in->data.datatype[4] = 5+value; \
+out = psVectorSortIndex(out,in); \
+if(out->type.type != PS_TYPE_U32) { \
+    psError(PS_ERR_UNKNOWN,true,"Output vector is not of type PS_TYPE_U32"); \
+    return 10; \
+} \
+if(out->data.U32[0] != 3 ) { \
+    psError(PS_ERR_UNKNOWN,true,"Improper index sort out[0] = %ld",out->data.U32[0]); \
+    return 20; \
+} \
+if(out->data.U32[1] != 2 ) { \
+    psError(PS_ERR_UNKNOWN,true,"Improper index sort out[1] = %ld",out->data.U32[1]); \
+    return 30; \
+} \
+if(out->data.U32[2] != 4 ) { \
+    psError(PS_ERR_UNKNOWN,true,"Improper index sort out[2] = %ld",out->data.U32[2]); \
+    return 40; \
+} \
+if(out->data.U32[3] != 0 ) { \
+    psError(PS_ERR_UNKNOWN,true,"Improper index sort out[3] = %ld",out->data.U32[3]); \
+    return 50; \
+} \
+if(out->data.U32[4] != 1 ) { \
+    psError(PS_ERR_UNKNOWN,true,"Improper index sort out[4] = %ld",out->data.U32[4]); \
+    return 60; \
+} \
+psFree(in);
+
+psS32 main(psS32 argc,
+           char* argv[])
+{
+    psVector *in = NULL;
+    psVector *out = NULL;
+    psVector *tempVect = NULL;
+
+    // Test A - Sort vectors by index for all types
+    printPositiveTestHeader(stdout,"psVectorSortIndex","Sort by index for all types");
+    tstVectorSortIndexByType(S8,0)
+    tstVectorSortIndexByType(U8,1)
+    tstVectorSortIndexByType(S16,2)
+    tstVectorSortIndexByType(U16,3)
+    tstVectorSortIndexByType(S32,4)
+    tstVectorSortIndexByType(U32,5)
+    tstVectorSortIndexByType(S64,6)
+    tstVectorSortIndexByType(U64,7)
+    tstVectorSortIndexByType(F32,8)
+    tstVectorSortIndexByType(F64,9)
+    psFree(out);
+    printFooter(stdout,"psVectorSortIndex","Sort by index for all types",true);
+
+    // Test  C  Attempt to sort with null input vector
+    printPositiveTestHeader(stdout,"psVectorSortIndex","Attempt to sort with NULL input");
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message");
+    in = NULL;
+    out = psVectorAlloc(5,PS_TYPE_U32);
+    out = psVectorSortIndex(out,in);
+    if(out != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Did not return NULL with NULL input specified");
+        return 111;
+    }
+    printFooter(stdout,"psVectorSortIndex","Attempt to sort with NULL input",true);
+
+    // Test  D  Sort with output vector which needs to be resized
+    printPositiveTestHeader(stdout,"psVectorSortIndex","Sort with resize output vector");
+    in = psVectorAlloc(5,PS_TYPE_U8);
+    for(psS32 m=0; m<5; m++) {
+        in->data.U8[m]= 20-m;
+    }
+    out = psVectorAlloc(3,PS_TYPE_U32);
+    out = psVectorSortIndex(out,in);
+    if(out->n != 5) {
+        psError(PS_ERR_UNKNOWN,true,"Did not properly resize output vector");
+        return 112;
+    }
+    if(out->data.U32[0] != 4) {
+        psError(PS_ERR_UNKNOWN,true,"Did not properly sort index out[0] = %d",out->data.U32[0]);
+        return 113;
+    }
+    if(out->data.U32[1] != 3) {
+        psError(PS_ERR_UNKNOWN,true,"Did not properly sort index out[1] = %d",out->data.U32[1]);
+        return 114;
+    }
+    if(out->data.U32[2] != 2) {
+        psError(PS_ERR_UNKNOWN,true,"Did not properly sort index out[2] = %d",out->data.U32[2]);
+        return 115;
+    }
+    if(out->data.U32[3] != 1) {
+        psError(PS_ERR_UNKNOWN,true,"Did not properly sort index out[3] = %d",out->data.U32[3]);
+        return 116;
+    }
+    if(out->data.U32[4] != 0) {
+        psError(PS_ERR_UNKNOWN,true,"Did not properly sort index out[4] = %d",out->data.U32[4]);
+        return 117;
+    }
+    psFree(in);
+    psFree(out);
+    printFooter(stdout,"psVectorSortIndex","Sort with resize output vector",true);
+
+    // Test E - Sort input vector with zero elements
+    printPositiveTestHeader(stdout,"psVectorSortIndex","Sort with input vector with zero elements");
+    in = psVectorAlloc(5,PS_TYPE_U8);
+    out = psVectorAlloc(5,PS_TYPE_U32);
+    in->n = 0;
+    out->n = 0;
+    tempVect = out;
+    out = psVectorSortIndex(out,in);
+    if ( out != tempVect ) {
+        psError(PS_ERR_UNKNOWN,true,"Did not return the same output vector");
+        return 118;
+    }
+    in->n=5;
+    out->n=5;
+    psFree(out);
+    psFree(in);
+    printFooter(stdout,"psVectorSortIndex","Sort with input vector with zero elements",true);
+
+    // Test F - Attempt to sort input vector with invalid type
+    printPositiveTestHeader(stdout,"psVectorSortIndex","Attempt to sort with invalid type");
+    in = psVectorAlloc(5,PS_TYPE_U8);
+    out = psVectorAlloc(5,PS_TYPE_U32);
+    tempVect = out;
+    in->type.type = PS_TYPE_BOOL;
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate two error messages(psVectorSort,psVectorSortIndex)");
+    out = psVectorSortIndex(out,in);
+    if( out != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Did not return NULL on error or didn't error?");
+        return 119;
+    }
+    in->type.type = PS_TYPE_U8;
+    psFree(in);
+    printFooter(stdout,"psVectorSortIndex","Attempt to sort with invalid type",true);
+
+    // Test G - Free vectors
+    printPositiveTestHeader(stdout,"psVectorSortIndex", "Free vectors");
+    psS32 nLeaks = psMemCheckLeaks(0, NULL, stdout, false);
+    if(nLeaks) {
+        printf("ERROR: Found %d memory leaks\n", nLeaks);
+        return 222;
+    }
+    psS32 nBad = psMemCheckCorruption(0);
+    if(nBad) {
+        printf("ERROR: Found %d bad memory blocks\n", nBad);
+        return 333;
+    }
+    printFooter(stdout, "psVectorSort", "Free vectors", true);
+
+}
Index: /tags/ipp-1-X/bug123/psLib/test/collections/tst_psVectorSort_03.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/collections/tst_psVectorSort_03.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/collections/tst_psVectorSort_03.c	(revision 22331)
@@ -0,0 +1,84 @@
+/** @file  tst_psVectorSort_03.c
+ *
+ *  @brief Test driver for psVectorSort functions
+ *
+ *  This test driver contains the following tests for psVectorSort test point 3:
+ *     A)  Create float vectors of different sizes
+ *     B)  Attempt to sort vectors...should get errors
+ *     C)  Create float vector and double vector
+ *     D)  Attempt to sort vectors...should get errors
+ *     E)  Free float, double vectors
+ *
+ *  @author  Ross Harman, MHPCC
+ *
+ *  @version $Revision: 1.8 $  $Name: not supported by cvs2svn $
+ *  @date  $Date: 2005-04-07 20:27:41 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ *
+ */
+
+#include "pslib_strict.h"
+#include "psTest.h"
+
+psS32 main(psS32 argc,
+           char* argv[])
+{
+    psVector *in = NULL;
+    psVector *out = NULL;
+    psVector *in2 = NULL;
+    psVector *out2 = NULL;
+
+    // Test A - Create float vectors
+    printPositiveTestHeader(stdout,"psVectorSort", "Create float vectors of different sizes");
+    in = psVectorAlloc(5, PS_TYPE_F32);
+    in->n = 5;
+    out = psVectorAlloc(6, PS_TYPE_F32);
+    out->n = 6;
+    in->n = 5;
+    for(psS32 i=0; i<5; i++) {
+        printf("arr[%d] = %f\n", i, in->data.F32[i]);
+    }
+    printFooter(stdout, "psVectorSort", "Create float vectors of different sizes", true);
+
+
+    // Test B - Sort input float vector and put results into output float vector
+    printNegativeTestHeader(stdout,"psVectorSort", "Sort float vector",
+                            "Input and output vector sizes are not equal", 0);
+    out = psVectorSort(out, in);
+    printFooter(stdout, "psVectorSort", "Sort float vector", true);
+
+    // Test C - Create float vector and double vector
+    printPositiveTestHeader(stdout,"psVectorSort","Create float & double vectors of same size");
+    in2 = psVectorAlloc(5, PS_TYPE_F32);
+    in2->n = 5;
+    out2 = psVectorAlloc(5, PS_TYPE_F64);
+    out2->n = 5;
+    for(psS32 j=0; j<5; j++) {
+        printf("vec[%d] = %f\n", j, in2->data.F32[j]);
+    }
+    printFooter(stdout, "psVectorSort", "Create float and double vectors same size", true);
+
+    // Test D - Attempt to sort vectors with output of different type should create error
+    printNegativeTestHeader(stdout,"psVectorSort", "Sort F32/F64 vector",
+                            "Input and output vector different types", 0);
+    out2 = psVectorSort(out2, in2);
+    printFooter(stdout, "psVectorSort", "Sort float vector", true);
+
+    // Test C - Free float vectors
+    printPositiveTestHeader(stdout,"psVectorSort", "Free float vectors");
+    psFree(in);
+    psFree(in2);
+    psFree(out);
+    psFree(out2);
+    psS32 nLeaks = psMemCheckLeaks(0, NULL, stdout, false);
+    if(nLeaks) {
+        printf("ERROR: Found %d memory leaks\n", nLeaks);
+    }
+    psS32 nBad = psMemCheckCorruption(0);
+    if(nBad) {
+        printf("ERROR: Found %d bad memory blocks\n", nBad);
+    }
+    printFooter(stdout, "psVectorSort", "Free float vectors", true);
+
+}
Index: /tags/ipp-1-X/bug123/psLib/test/collections/tst_psVectorSort_04.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/collections/tst_psVectorSort_04.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/collections/tst_psVectorSort_04.c	(revision 22331)
@@ -0,0 +1,47 @@
+/** @file  tst_psVectorSort_04.c
+ *
+ *  @brief Test driver for psVectorSort functions
+ *
+ *  This test driver contains the following tests for psVectorSort test point 4:
+ *     A)  Attempt to sort with null input vector
+ *     B)  Free vectors
+ *
+ *  @author  Ross Harman, MHPCC
+ *
+ *  @version $Revision: 1.7 $  $Name: not supported by cvs2svn $
+ *  @date  $Date: 2005-04-07 20:27:41 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ *
+ */
+
+#include "pslib_strict.h"
+#include "psTest.h"
+
+psS32 main(psS32 argc,
+           char* argv[])
+{
+    psVector *badIn = NULL;
+    psVector *goodOut = psVectorAlloc(5, PS_TYPE_F32);
+
+    // Test A - Attempt to sort with null input vector
+    printNegativeTestHeader(stdout,"psVectorSort", "Attempt to sort with null input vector",
+                            "Null input vector", 0);
+    goodOut = psVectorSort(goodOut, badIn);
+    printFooter(stdout, "psVectorSort", "Attempt to sort with null input vector", true);
+
+    // Test B - Free vectors
+    printPositiveTestHeader(stdout, "psVectorSort", "Free vectors");
+    psFree(goodOut);
+    psS32 nLeaks = psMemCheckLeaks(0, NULL, stdout, false);
+    if(nLeaks) {
+        printf("ERROR: Found %d memory blocks\n", nLeaks);
+    }
+    psS32 nBad = psMemCheckCorruption(0);
+    if(nBad) {
+        printf("ERROR: Found %d bad memory blocks\n", nBad);
+    }
+    printFooter(stdout, "psVectorSort", "Free arays", true);
+
+    return 0;
+}
Index: /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psArray.stderr
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psArray.stderr	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psArray.stderr	(revision 22331)
@@ -0,0 +1,220 @@
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psArray.c                                              *
+*            TestPoint: psArray{psArray}                                           *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psArray.c                                              *
+*            TestPoint: psArray{Create void pointer array}                         *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psArray{Create void pointer array} | tst_psArray.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psArray.c                                              *
+*            TestPoint: psArray{Add data to void pointer array}                    *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+ts[0].x = 0 ts[0].y = 0.00
+ts[1].x = 10 ts[1].y = 10.10
+ts[2].x = 20 ts[2].y = 20.20
+ts[3].x = 30 ts[3].y = 30.30
+ts[4].x = 40 ts[4].y = 40.40
+array size = 5
+array population = 5
+
+---> TESTPOINT PASSED (psArray{Add data to void pointer array} | tst_psArray.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psArray.c                                              *
+*            TestPoint: psArray{Reallocate void pointer array bigger}              *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Adding more elements to void pointer array...
+ts[0].x = 0 ts[0].y = 0.00
+ts[1].x = 10 ts[1].y = 10.10
+ts[2].x = 20 ts[2].y = 20.20
+ts[3].x = 30 ts[3].y = 30.30
+ts[4].x = 40 ts[4].y = 40.40
+ts[5].x = 50 ts[5].y = 50.50
+ts[6].x = 60 ts[6].y = 60.60
+ts[7].x = 70 ts[7].y = 70.70
+ts[8].x = 80 ts[8].y = 80.80
+ts[9].x = 90 ts[9].y = 90.90
+array size = 10
+array population = 10
+
+---> TESTPOINT PASSED (psArray{Reallocate void pointer array bigger} | tst_psArray.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psArray.c                                              *
+*            TestPoint: psArray{Reallocate void pointer array smaller}             *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+ts[0].x = 0 ts[0].y = 0.00
+ts[1].x = 10 ts[1].y = 10.10
+ts[2].x = 20 ts[2].y = 20.20
+array size = 3
+array population = 3
+
+---> TESTPOINT PASSED (psArray{Reallocate integer void pointer smaller} | tst_psArray.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psArray.c                                              *
+*            TestPoint: psArray{Reallocate with a null array}                      *
+*             TestType: Negative                                                   *
+*    ExpectedErrorText: Error message generator                                    *
+*  ExpectedStatusValue: 0                                                          *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|I|testArray
+    Following should generate an error message.
+<DATE><TIME>|<HOST>|E|psArrayRealloc (FILE:LINENO)
+    psArrayRealloc must be given a non-NULL psArray to resize.
+
+---> TESTPOINT PASSED (psArray{Reallocate with a null array} | tst_psArray.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psArray.c                                              *
+*            TestPoint: psArray{Remove valid item}                                 *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Array size after removal = 2
+ts[0].x = 10 ts[0].y = 10.10
+ts[1].x = 20 ts[1].y = 20.20
+
+---> TESTPOINT PASSED (psArray{Remove valid item} | tst_psArray.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psArray.c                                              *
+*            TestPoint: psArray{Remove invalid item from array}                    *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psArray{Remove invalid item from array} | tst_psArray.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psArray.c                                              *
+*            TestPoint: psArray{Remove item from null array}                       *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|E|psArrayRemove (FILE:LINENO)
+    Specified psArray can not be NULL.
+
+---> TESTPOINT PASSED (psArray{Remove item from null array} | tst_psArray.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psArray.c                                              *
+*            TestPoint: psArray{Remove null item from array}                       *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psArray{Remove null item from array} | tst_psArray.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psArray.c                                              *
+*            TestPoint: psArray{Free void pointer array}                           *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psArray{Free void pointer array} | tst_psArray.c)
+
+
+---> TESTPOINT PASSED (psArray{psArray} | tst_psArray.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psArray.c                                              *
+*            TestPoint: psArray{psArray}                                           *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psArray.c                                              *
+*            TestPoint: psArray{Create void pointer array}                         *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psArray{Create void pointer array} | tst_psArray.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psArray.c                                              *
+*            TestPoint: psArray{Add data to void pointer array}                    *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+ts[0].x = 100 ts[0].y = 101.00
+ts[1].x = 90 ts[1].y = 90.90
+ts[2].x = 80 ts[2].y = 80.80
+ts[3].x = 70 ts[3].y = 70.70
+ts[4].x = 60 ts[4].y = 60.60
+ts[5].x = 50 ts[5].y = 50.50
+ts[6].x = 40 ts[6].y = 40.40
+ts[7].x = 30 ts[7].y = 30.30
+ts[8].x = 20 ts[8].y = 20.20
+ts[9].x = 10 ts[9].y = 10.10
+array size = 10
+array population = 10
+
+---> TESTPOINT PASSED (psArray{Add data to void pointer array} | tst_psArray.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psArray.c                                              *
+*            TestPoint: psArray{Sort data in array}                                *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+ts[0].x = 10 ts[0].y = 10.10
+ts[1].x = 20 ts[1].y = 20.20
+ts[2].x = 30 ts[2].y = 30.30
+ts[3].x = 40 ts[3].y = 40.40
+ts[4].x = 50 ts[4].y = 50.50
+ts[5].x = 60 ts[5].y = 60.60
+ts[6].x = 70 ts[6].y = 70.70
+ts[7].x = 80 ts[7].y = 80.80
+ts[8].x = 90 ts[8].y = 90.90
+ts[9].x = 100 ts[9].y = 101.00
+
+---> TESTPOINT PASSED (psArray{Sort data in array} | tst_psArray.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psArray.c                                              *
+*            TestPoint: psArray{Attempt to sort array}                             *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psArray{Attempt to sort array} | tst_psArray.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psArray.c                                              *
+*            TestPoint: psArray{Free void pointer array}                           *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psArray{Free void pointer array} | tst_psArray.c)
+
+
+---> TESTPOINT PASSED (psArray{psArray} | tst_psArray.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psArray.c                                              *
+*            TestPoint: psArray{psArrayAdd}                                        *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psArray{psArrayAdd} | tst_psArray.c)
+
Index: /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psArray01.stdout
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psArray01.stdout	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psArray01.stdout	(revision 22331)
@@ -0,0 +1,67 @@
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psArray01.c                                            *
+*            TestPoint: psArray{Create void pointer array}                         *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psArray{Create void pointer array} | tst_psArray01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psArray01.c                                            *
+*            TestPoint: psArray{Add data to void pointer array}                    *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+ts[0].x = 100 ts[0].y = 101.00
+ts[1].x = 90 ts[1].y = 90.90
+ts[2].x = 80 ts[2].y = 80.80
+ts[3].x = 70 ts[3].y = 70.70
+ts[4].x = 60 ts[4].y = 60.60
+ts[5].x = 50 ts[5].y = 50.50
+ts[6].x = 40 ts[6].y = 40.40
+ts[7].x = 30 ts[7].y = 30.30
+ts[8].x = 20 ts[8].y = 20.20
+ts[9].x = 10 ts[9].y = 10.10
+array size = 10
+array population = 10
+
+---> TESTPOINT PASSED (psArray{Add data to void pointer array} | tst_psArray01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psArray01.c                                            *
+*            TestPoint: psArray{Sort data in array}                                *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+ts[0].x = 10 ts[0].y = 10.10
+ts[1].x = 20 ts[1].y = 20.20
+ts[2].x = 30 ts[2].y = 30.30
+ts[3].x = 40 ts[3].y = 40.40
+ts[4].x = 50 ts[4].y = 50.50
+ts[5].x = 60 ts[5].y = 60.60
+ts[6].x = 70 ts[6].y = 70.70
+ts[7].x = 80 ts[7].y = 80.80
+ts[8].x = 90 ts[8].y = 90.90
+ts[9].x = 100 ts[9].y = 101.00
+
+---> TESTPOINT PASSED (psArray{Sort data in array} | tst_psArray01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psArray01.c                                            *
+*            TestPoint: psArray{Attempt to sort array}                             *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psArray{Attempt to sort array} | tst_psArray01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psArray01.c                                            *
+*            TestPoint: psArray{Free void pointer array}                           *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psArray{Free void pointer array} | tst_psArray01.c)
+
Index: /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psBitSet.stderr
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psBitSet.stderr	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psBitSet.stderr	(revision 22331)
@@ -0,0 +1,171 @@
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psBitSet.c                                             *
+*            TestPoint: psBitSet{psBitSetAlloc}                                    *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Creating psBitSet with 24 bits...
+Creating psBitSet with 25 bits...
+<DATE><TIME>|<HOST>|I|testBitSet01a
+    Following is an error.
+<DATE><TIME>|<HOST>|E|psBitSetAlloc (FILE:LINENO)
+    The number of bit in a psBitSet (-4) must be greater than zero.
+
+---> TESTPOINT PASSED (psBitSet{psBitSetAlloc} | tst_psBitSet.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psBitSet.c                                             *
+*            TestPoint: psBitSet{psBitSetSet/psBitSetClear}                        *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Setting first bit...
+Setting third bit...
+Setting last bit...
+100000000000000000000101
+
+Clearing first bit...
+Clearing third bit...
+Clearing last bit...
+000000000000000000000000
+
+<DATE><TIME>|<HOST>|I|testBitSet01b
+    Following should be an error
+<DATE><TIME>|<HOST>|E|psBitSetClear (FILE:LINENO)
+    Can not operate on a NULL psBitSet.
+<DATE><TIME>|<HOST>|I|testBitSet01b
+    Following should be an error
+<DATE><TIME>|<HOST>|E|psBitSetClear (FILE:LINENO)
+    The specified bit position (-3) is invalid.  Position must be between 0 and 23.
+<DATE><TIME>|<HOST>|I|testBitSet01b
+    Following should be an error
+<DATE><TIME>|<HOST>|E|psBitSetSet (FILE:LINENO)
+    The specified bit position (-4) is invalid.  Position must be between 0 and 23.
+<DATE><TIME>|<HOST>|I|testBitSet01b
+    Following should be an error
+<DATE><TIME>|<HOST>|E|psBitSetSet (FILE:LINENO)
+    The specified bit position (200) is invalid.  Position must be between 0 and 23.
+<DATE><TIME>|<HOST>|I|testBitSet01b
+    Following should be an error
+<DATE><TIME>|<HOST>|E|psBitSetSet (FILE:LINENO)
+    Can not operate on a NULL psBitSet.
+
+---> TESTPOINT PASSED (psBitSet{psBitSetSet/psBitSetClear} | tst_psBitSet.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psBitSet.c                                             *
+*            TestPoint: psBitSet{psBitSetTest}                                     *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Setting first bit...
+Setting third bit...
+Setting last bit...
+<DATE><TIME>|<HOST>|I|testBitSet01c
+    Following should be an error
+<DATE><TIME>|<HOST>|E|psBitSetTest (FILE:LINENO)
+    The specified bit position (-4) is invalid.  Position must be between 0 and 23.
+<DATE><TIME>|<HOST>|I|testBitSet01c
+    Following should be an error
+<DATE><TIME>|<HOST>|E|psBitSetTest (FILE:LINENO)
+    The specified bit position (200) is invalid.  Position must be between 0 and 23.
+<DATE><TIME>|<HOST>|I|testBitSet01c
+    Following should be an error
+<DATE><TIME>|<HOST>|E|psBitSetTest (FILE:LINENO)
+    Can not operate on a NULL psBitSet.
+
+---> TESTPOINT PASSED (psBitSet{psBitSetTest} | tst_psBitSet.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psBitSet.c                                             *
+*            TestPoint: psBitSet{psBitSetOp}                                       *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|I|testBitSet06
+    Following should be an error
+<DATE><TIME>|<HOST>|E|psBitSetOp (FILE:LINENO)
+    The psBitSet operand must be the same size.
+<DATE><TIME>|<HOST>|I|testBitSet06
+    Following is an error.
+<DATE><TIME>|<HOST>|E|psBitSetOp (FILE:LINENO)
+    Specified operator, FOO, is invalid.  Valid operators are AND, OR, and XOR.
+<DATE><TIME>|<HOST>|I|testBitSet06
+    Following is an error.
+<DATE><TIME>|<HOST>|E|psBitSetOp (FILE:LINENO)
+    Specified operator, FOO, is invalid.  Valid operators are AND, OR, and XOR.
+<DATE><TIME>|<HOST>|I|testBitSet06
+    Following should generate an error
+<DATE><TIME>|<HOST>|E|psBitSetOp (FILE:LINENO)
+    First psBitSet operand can not be NULL.
+<DATE><TIME>|<HOST>|I|testBitSet06
+    Following should generate an error
+<DATE><TIME>|<HOST>|E|psBitSetOp (FILE:LINENO)
+    Specified operator is NULL.  Must specify desired operator.
+<DATE><TIME>|<HOST>|I|testBitSet06
+    Following should generate an error
+<DATE><TIME>|<HOST>|E|psBitSetOp (FILE:LINENO)
+    Second psBitSet operand can not be NULL.
+
+---> TESTPOINT PASSED (psBitSet{psBitSetOp} | tst_psBitSet.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psBitSet.c                                             *
+*            TestPoint: psBitSet{psBitSetOp AND Operator}                          *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+psBitSetOp input is 001100110011001100110011, 010101010101010101010101.  Truth is 000100010001000100010001.
+<DATE><TIME>|<HOST>|I|testBitSet02
+    Perform binary AND with psBitSets
+<DATE><TIME>|<HOST>|I|testBitSet02
+    Perform binary AND and auto allocate output
+
+---> TESTPOINT PASSED (psBitSet{psBitSetOp AND Operator} | tst_psBitSet.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psBitSet.c                                             *
+*            TestPoint: psBitSet{psBitSetOp OR Operator}                           *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+psBitSetOp input is 110011001100110011001100, 101010101010101010101010.  Truth is 111011101110111011101110.
+<DATE><TIME>|<HOST>|I|testBitSet03
+    Perform binary OR with psBitSets
+<DATE><TIME>|<HOST>|I|testBitSet03
+    Perform binary OR and auto allocate output
+
+---> TESTPOINT PASSED (psBitSet{psBitSetOp OR Operator} | tst_psBitSet.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psBitSet.c                                             *
+*            TestPoint: psBitSet{psBitSetOp XOR Operator}                          *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+psBitSetOp input is 110011001100110011001100, 101010101010101010101010.  Truth is 011001100110011001100110.
+<DATE><TIME>|<HOST>|I|testBitSet04
+    Perform binary XOR with psBitSets
+<DATE><TIME>|<HOST>|I|testBitSet04
+    Perform binary XOR and auto allocate output
+
+---> TESTPOINT PASSED (psBitSet{psBitSetOp XOR Operator} | tst_psBitSet.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psBitSet.c                                             *
+*            TestPoint: psBitSet{psBitSetNot}                                      *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+psBitSetOp input is 101010101010101010101010.  Truth is 010101010101010101010101.
+<DATE><TIME>|<HOST>|I|testBitSet05
+    Perform binary NOT with psBitSets
+<DATE><TIME>|<HOST>|I|testBitSet05
+    Perform binary NOT and auto allocate output
+<DATE><TIME>|<HOST>|I|testBitSet05
+    Following should generate an error
+<DATE><TIME>|<HOST>|E|psBitSetNot (FILE:LINENO)
+    Operand can not be NULL.
+
+---> TESTPOINT PASSED (psBitSet{psBitSetNot} | tst_psBitSet.c)
+
Index: /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psHash00.stdout
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psHash00.stdout	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psHash00.stdout	(revision 22331)
@@ -0,0 +1,9 @@
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psHash00.c                                             *
+*            TestPoint: psHash functions{psHashAlloc()}                            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psHash functions{psHashAlloc()} | tst_psHash00.c)
+
Index: /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psHash01.stderr
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psHash01.stderr	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psHash01.stderr	(revision 22331)
@@ -0,0 +1,12 @@
+<DATE><TIME>|<HOST>|I|main
+    Following should generate an error message: psHashAdd with null table
+<DATE><TIME>|<HOST>|E|psHashAdd (FILE:LINENO)
+    Input psHash can not be NULL.
+<DATE><TIME>|<HOST>|I|main
+    Following should generate an error message: psHashAdd with null key
+<DATE><TIME>|<HOST>|E|psHashAdd (FILE:LINENO)
+    Input key can not be NULL.
+<DATE><TIME>|<HOST>|I|main
+    Following should generate an error message: psHashAdd with null data
+<DATE><TIME>|<HOST>|E|psHashAdd (FILE:LINENO)
+    Input data can not be NULL.
Index: /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psHash01.stdout
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psHash01.stdout	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psHash01.stdout	(revision 22331)
@@ -0,0 +1,69 @@
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psHash01.c                                             *
+*            TestPoint: psHash functions{psHashAlloc}                              *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psHash functions{psHashAlloc} | tst_psHash01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psHash01.c                                             *
+*            TestPoint: psHash functions{psHashAdd}                                *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psHash functions{psHashAdd} | tst_psHash01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psHash01.c                                             *
+*            TestPoint: psHash replace item{psHashAdd}                             *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psHash replace item{psHashAdd} | tst_psHash01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psHash01.c                                             *
+*            TestPoint: psHashAdd{NULL hash table}                                 *
+*             TestType: Negative                                                   *
+*    ExpectedErrorText: Hash table can not be NULL.                                *
+*  ExpectedStatusValue: 0                                                          *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psHashAdd{NULL hash table} | tst_psHash01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psHash01.c                                             *
+*            TestPoint: psHashAdd{NULL key}                                        *
+*             TestType: Negative                                                   *
+*    ExpectedErrorText: Hash key can not be NULL.                                  *
+*  ExpectedStatusValue: 0                                                          *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psHashAdd{NULL hash key} | tst_psHash01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psHash01.c                                             *
+*            TestPoint: psHashAdd{NULL hash data}                                  *
+*             TestType: Negative                                                   *
+*    ExpectedErrorText: Hash data can not be NULL.                                 *
+*  ExpectedStatusValue: 0                                                          *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psHashAdd{NULL hash data} | tst_psHash01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psHash01.c                                             *
+*            TestPoint: psHash functions{psHashFree}                               *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psHash functions{psHashFree()} | tst_psHash01.c)
+
Index: /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psHash02.stderr
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psHash02.stderr	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psHash02.stderr	(revision 22331)
@@ -0,0 +1,8 @@
+<DATE><TIME>|<HOST>|I|main
+    Following should generate an error message: psHashLookup with null table
+<DATE><TIME>|<HOST>|E|psHashLookup (FILE:LINENO)
+    Input psHash can not be NULL.
+<DATE><TIME>|<HOST>|I|main
+    Following should generate an error message: psHashLookup with null key
+<DATE><TIME>|<HOST>|E|psHashLookup (FILE:LINENO)
+    Input key can not be NULL.
Index: /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psHash02.stdout
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psHash02.stdout	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psHash02.stdout	(revision 22331)
@@ -0,0 +1,42 @@
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psHash02.c                                             *
+*            TestPoint: psHash functions{psHashLookup}                             *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psHash functions{psHashLookup} | tst_psHash02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psHash02.c                                             *
+*            TestPoint: psHashLookup{Invalid key}                                  *
+*             TestType: Negative                                                   *
+*    ExpectedErrorText: Key is not found in the table                              *
+*  ExpectedStatusValue: 0                                                          *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psHashLookup{Invalid key} | tst_psHash02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psHash02.c                                             *
+*            TestPoint: psHashLookup{NULL table}                                   *
+*             TestType: Negative                                                   *
+*    ExpectedErrorText: Can not lookup with NULL table                             *
+*  ExpectedStatusValue: 0                                                          *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psHashLookup{NULL table} | tst_psHash02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psHash02.c                                             *
+*            TestPoint: psHashLookup{NULL key}                                     *
+*             TestType: Negative                                                   *
+*    ExpectedErrorText: Can not lookup with NULL key.                              *
+*  ExpectedStatusValue: 0                                                          *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psHashLookup{NULL key} | tst_psHash02.c)
+
Index: /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psHash03.stderr
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psHash03.stderr	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psHash03.stderr	(revision 22331)
@@ -0,0 +1,8 @@
+<DATE><TIME>|<HOST>|I|main
+    Following should generate an error message: psHashRemove with null table
+<DATE><TIME>|<HOST>|E|psHashRemove (FILE:LINENO)
+    Input psHash can not be NULL.
+<DATE><TIME>|<HOST>|I|main
+    Following should generate an error message: psHashRemove with null key
+<DATE><TIME>|<HOST>|E|psHashRemove (FILE:LINENO)
+    Input key can not be NULL.
Index: /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psHash03.stdout
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psHash03.stdout	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psHash03.stdout	(revision 22331)
@@ -0,0 +1,42 @@
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psHash03.c                                             *
+*            TestPoint: psHash functions{psHashRemove}                             *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psHash functions{psHashRemove()} | tst_psHash03.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psHash03.c                                             *
+*            TestPoint: psHashRemove{Invalid key}                                  *
+*             TestType: Negative                                                   *
+*    ExpectedErrorText: Key is not found in table                                  *
+*  ExpectedStatusValue: 0                                                          *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psHashRemove{Invalid key} | tst_psHash03.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psHash03.c                                             *
+*            TestPoint: psHashRemove{NULL table}                                   *
+*             TestType: Negative                                                   *
+*    ExpectedErrorText: Can not remove with NULL table                             *
+*  ExpectedStatusValue: 0                                                          *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psHashRemove{NULL table} | tst_psHash03.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psHash03.c                                             *
+*            TestPoint: psHashRemove{NULL key}                                     *
+*             TestType: Negative                                                   *
+*    ExpectedErrorText: Can not remove with NULL key                               *
+*  ExpectedStatusValue: 0                                                          *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psHashRemove{NULL key} | tst_psHash03.c)
+
Index: /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psHash04.stdout
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psHash04.stdout	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psHash04.stdout	(revision 22331)
@@ -0,0 +1,24 @@
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psHash04.c                                             *
+*            TestPoint: psHash functions{psHashKeyList()}                          *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Linked List Entries: ENTRY03
+Linked List Entries: ENTRY02
+Linked List Entries: ENTRY01
+Linked List Entries: ENTRY00
+
+---> TESTPOINT PASSED (psHash functions{psHashKeyList()} | tst_psHash04.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psHash04.c                                             *
+*            TestPoint: psHashKeyList{NULL table}                                  *
+*             TestType: Negative                                                   *
+*    ExpectedErrorText: Can not lookup with NULL table                             *
+*  ExpectedStatusValue: 0                                                          *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psHashKeyList{NULL table} | tst_psHash04.c)
+
Index: /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psHash05.stderr
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psHash05.stderr	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psHash05.stderr	(revision 22331)
@@ -0,0 +1,13 @@
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psHash05.c                                             *
+*            TestPoint: psHash{psHashToArray}                                      *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|I|hashToArray
+    Following should be an error.
+<DATE><TIME>|<HOST>|E|psHashToArray (FILE:LINENO)
+    Input psHash can not be NULL.
+
+---> TESTPOINT PASSED (psHash{psHashToArray} | tst_psHash05.c)
+
Index: /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psList.stderr
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psList.stderr	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psList.stderr	(revision 22331)
@@ -0,0 +1,166 @@
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psList.c                                               *
+*            TestPoint: psList{psListAlloc}                                        *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|I|testListAlloc
+    psListAlloc shall create a psList with either 0 or 1 element.
+
+---> TESTPOINT PASSED (psList{psListAlloc} | tst_psList.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psList.c                                               *
+*            TestPoint: psList{psListAdd}                                          *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|I|testListAdd
+    psListAdd shall add an element to list
+<DATE><TIME>|<HOST>|I|testListAdd
+    Following should generate an error for using NULL list.
+<DATE><TIME>|<HOST>|E|psListAdd (FILE:LINENO)
+    Specified psList reference is NULL.
+<DATE><TIME>|<HOST>|I|testListAdd
+    Following should generate an error msg to add NULL data
+<DATE><TIME>|<HOST>|E|psListAdd (FILE:LINENO)
+    Specified data item is NULL.
+<DATE><TIME>|<HOST>|I|testListAdd
+    Following should error with invalid insert location
+<DATE><TIME>|<HOST>|E|psListIteratorSet (FILE:LINENO)
+    Specified location, -7, is invalid.
+<DATE><TIME>|<HOST>|I|testListAdd
+    Following should be a warning.
+<DATE><TIME>|<HOST>|W|psListAdd
+    Specified location, 9, is beyond the end of the list.  Adding data item to tail.
+
+---> TESTPOINT PASSED (psList{psListAdd} | tst_psList.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psList.c                                               *
+*            TestPoint: psList{psListGet}                                          *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|I|testListGet
+    Following should be an error
+<DATE><TIME>|<HOST>|E|psListGet (FILE:LINENO)
+    Specified psList reference is NULL.
+<DATE><TIME>|<HOST>|E|psListIteratorSet (FILE:LINENO)
+    Specified location, 5, is invalid.
+<DATE><TIME>|<HOST>|E|psListGet (FILE:LINENO)
+    Specified location, 5, is invalid.
+<DATE><TIME>|<HOST>|E|psListIteratorSet (FILE:LINENO)
+    Specified location, 4, is invalid.
+<DATE><TIME>|<HOST>|E|psListGet (FILE:LINENO)
+    Specified location, 4, is invalid.
+
+---> TESTPOINT PASSED (psList{psListGet} | tst_psList.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psList.c                                               *
+*            TestPoint: psList{psListRemove}                                       *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|I|testListRemove
+    Following should be an error
+<DATE><TIME>|<HOST>|E|psListRemove (FILE:LINENO)
+    Specified psList reference is NULL.
+<DATE><TIME>|<HOST>|I|testListRemove
+    Next message should be an error
+<DATE><TIME>|<HOST>|E|psListRemoveData (FILE:LINENO)
+    Specified data item is NULL.
+<DATE><TIME>|<HOST>|I|testListRemove
+    Next message should be an error
+<DATE><TIME>|<HOST>|E|psListRemoveData (FILE:LINENO)
+    Specified data item is not found in the psList.
+<DATE><TIME>|<HOST>|I|testListRemove
+    NULL list in psListRemoveData should generate error message.
+<DATE><TIME>|<HOST>|E|psListRemoveData (FILE:LINENO)
+    Specified psList reference is NULL.
+
+---> TESTPOINT PASSED (psList{psListRemove} | tst_psList.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psList.c                                               *
+*            TestPoint: psList{psListConvert}                                      *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psList{psListConvert} | tst_psList.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psList.c                                               *
+*            TestPoint: psList{psListIterator}                                     *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|I|testListIterator
+     psListSetIterator/psListGetNext/psListGetPrev shall move the list cursor to the specified location
+<DATE><TIME>|<HOST>|W|psListGetAndDecrement
+    Attempt to get previous with itertator cursor NULL and offEnd false
+
+---> TESTPOINT PASSED (psList{psListIterator} | tst_psList.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psList.c                                               *
+*            TestPoint: psList{psListFree}                                         *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psList{psListFree} | tst_psList.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psList.c                                               *
+*            TestPoint: psList{psListSort}                                         *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psList{psListSort} | tst_psList.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psList.c                                               *
+*            TestPoint: psList{psListAddAfter}                                     *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|I|testListAddAfter
+    NULL data pointer should generate error message
+<DATE><TIME>|<HOST>|E|psListAddAfter (FILE:LINENO)
+    Specified data item is NULL.
+<DATE><TIME>|<HOST>|I|testListAddAfter
+    NULL iterator should generate error message
+<DATE><TIME>|<HOST>|E|psListAddAfter (FILE:LINENO)
+    Specified iterator is NULL.
+<DATE><TIME>|<HOST>|I|testListAddAfter
+    Non-mutable list should generate error message
+<DATE><TIME>|<HOST>|E|psListAddAfter (FILE:LINENO)
+    Specified iterator indicates list is non-mutable.
+
+---> TESTPOINT PASSED (psList{psListAddAfter} | tst_psList.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psList.c                                               *
+*            TestPoint: psList{psListAddBefore}                                    *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|I|testListAddBefore
+    NULL data pointer should generate error message
+<DATE><TIME>|<HOST>|E|psListAddBefore (FILE:LINENO)
+    Specified data item is NULL.
+<DATE><TIME>|<HOST>|I|testListAddBefore
+    NULL iterator should generate error message
+<DATE><TIME>|<HOST>|E|psListAddBefore (FILE:LINENO)
+    Specified iterator is NULL.
+<DATE><TIME>|<HOST>|I|testListAddBefore
+    Non-mutable list should generate error message
+<DATE><TIME>|<HOST>|E|psListAddBefore (FILE:LINENO)
+    Specified iterator indicates list is non-mutable.
+
+---> TESTPOINT PASSED (psList{psListAddBefore} | tst_psList.c)
+
Index: /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psMetadataIO.stderr
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psMetadataIO.stderr	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psMetadataIO.stderr	(revision 22331)
@@ -0,0 +1,46 @@
+<DATE><TIME>|<HOST>|E|psMetadataParseConfig (FILE:LINENO)
+    Failed to parse the value '9876.54qqq32' of metadata item xPosition, type F64, on line 89 of test.config.
+<DATE><TIME>|<HOST>|E|psMetadataParseConfig (FILE:LINENO)
+    Failed to read a metadata value on line 95 of test.config.
+<DATE><TIME>|<HOST>|E|psMetadataParseConfig (FILE:LINENO)
+    Metadata type '99.999', found on line 101 of test.config, is not invalid.
+<DATE><TIME>|<HOST>|E|psMetadataParseConfig (FILE:LINENO)
+    More than one '*' character not allowed.  Found on line 107 of test.config.
+<DATE><TIME>|<HOST>|E|psMetadataParseConfig (FILE:LINENO)
+    More than one '@' character not allowed.  Found on line 113 of test.config.
+<DATE><TIME>|<HOST>|E|psMetadataParseConfig (FILE:LINENO)
+    More than one '~' character not allowed.  Found on line 119 of test.config.
+<DATE><TIME>|<HOST>|E|psMetadataParseConfig (FILE:LINENO)
+    Failed to parse the value '9876.54qqq32' of metadata item xPosition, type F64, on line 89 of test.config.
+<DATE><TIME>|<HOST>|E|psMetadataParseConfig (FILE:LINENO)
+    Failed to read a metadata value on line 95 of test.config.
+<DATE><TIME>|<HOST>|E|psMetadataParseConfig (FILE:LINENO)
+    Metadata type '99.999', found on line 101 of test.config, is not invalid.
+<DATE><TIME>|<HOST>|E|psMetadataParseConfig (FILE:LINENO)
+    More than one '*' character not allowed.  Found on line 107 of test.config.
+<DATE><TIME>|<HOST>|E|psMetadataParseConfig (FILE:LINENO)
+    More than one '@' character not allowed.  Found on line 113 of test.config.
+<DATE><TIME>|<HOST>|E|psMetadataParseConfig (FILE:LINENO)
+    More than one '~' character not allowed.  Found on line 119 of test.config.
+<DATE><TIME>|<HOST>|E|psMetadataAddItem (FILE:LINENO)
+    Duplicate metadata item name is not allowed.  Use a psMetadataFlags option to allow such action.
+<DATE><TIME>|<HOST>|E|psMetadataAddV (FILE:LINENO)
+    Failed to add metadata item to metadata collection list.
+<DATE><TIME>|<HOST>|E|psMetadataParseConfig (FILE:LINENO)
+    Duplicate Metadata item, speed, found on line 127 of test.config.  Overwrite not allowed.
+<DATE><TIME>|<HOST>|E|psMetadataParseConfig (FILE:LINENO)
+    Failed to parse the value '9876.54qqq32' of metadata item xPosition, type F64, on line 89 of test.config.
+<DATE><TIME>|<HOST>|E|psMetadataParseConfig (FILE:LINENO)
+    Failed to read a metadata value on line 95 of test.config.
+<DATE><TIME>|<HOST>|E|psMetadataParseConfig (FILE:LINENO)
+    Metadata type '99.999', found on line 101 of test.config, is not invalid.
+<DATE><TIME>|<HOST>|E|psMetadataParseConfig (FILE:LINENO)
+    More than one '*' character not allowed.  Found on line 107 of test.config.
+<DATE><TIME>|<HOST>|E|psMetadataParseConfig (FILE:LINENO)
+    More than one '@' character not allowed.  Found on line 113 of test.config.
+<DATE><TIME>|<HOST>|E|psMetadataParseConfig (FILE:LINENO)
+    More than one '~' character not allowed.  Found on line 119 of test.config.
+<DATE><TIME>|<HOST>|E|psMetadataParseConfig (FILE:LINENO)
+    Unallowable operation: fileName is NULL.
+<DATE><TIME>|<HOST>|E|psMetadataParseConfig (FILE:LINENO)
+    Failed to open file 'abcedfg'. Check if it exists and it has the proper permissions.
Index: /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psMetadataIO.stdout
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psMetadataIO.stdout	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psMetadataIO.stdout	(revision 22331)
@@ -0,0 +1,173 @@
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMetadataIO.c                                         *
+*            TestPoint: psMetadata{Test A - Read config file with overwrite set true} *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Failed lines: 6 Expected: 6
+Contents of metadata list:
+ Key Name:       pi  Key mdType: 0x00000408 Key Value:           3.142  Key Comment: Definition of pi
+ Key Name: altitude  Key mdType: 0x00000104 Key Value:           10000  Key Comment: 
+ Key Name:     time  Key mdType: 0x00000404 Key Value:        1234.568  Key Comment: 
+ Key Name:   myBool  Key mdType: 0x00001301 Key Value:               0  Key Comment: F, f, 0, T, t, 1 are also acceptable
+ Key Name:   title1  Key mdType: 0x00010001 Key Value:     Hello world  Key Comment: This is a comment for the string value
+ Key Name:   title2  Key mdType: 0x00010001 Key Value:  Good bye world  Key Comment: STRING or STR may be used as the string type
+ Key Name:   primes  Key mdType: 0x00010002 Key Value:   [2,3,5,7,...]  Key Comment: These are prime numbers
+ Key Name: negatives  Key mdType: 0x00010002 Key Value:  [-1,-2,-3,...]  Key Comment: 
+ Key Name:  comment  Key mdType: 0x00010001 Key Value:            This  Key Comment: 
+ Key Name:  comment  Key mdType: 0x00010001 Key Value:              is  Key Comment: 
+ Key Name:  comment  Key mdType: 0x00010001 Key Value:              an  Key Comment: 
+ Key Name:  comment  Key mdType: 0x00010001 Key Value:            ugly  Key Comment: 
+ Key Name:  comment  Key mdType: 0x00010001 Key Value:         comment  Key Comment: 
+ Key Name:  comment  Key mdType: 0x00010001 Key Value:             but  Key Comment: 
+ Key Name:  comment  Key mdType: 0x00010001 Key Value:           still  Key Comment: 
+ Key Name:  comment  Key mdType: 0x00010001 Key Value:           valid  Key Comment: 
+ Key Name:    speed  Key mdType: 0x00000404 Key Value:          66.660  Key Comment: 
+
+Contents of metadata table:
+ Key Name:  comment  Key mdType: 0x0001000a Key Value:                  Key Comment: 
+    Key Name:  comment  Key mdType: 0x00010001 Key Value:            This  Key Comment: 
+    Key Name:  comment  Key mdType: 0x00010001 Key Value:              is  Key Comment: 
+    Key Name:  comment  Key mdType: 0x00010001 Key Value:              an  Key Comment: 
+    Key Name:  comment  Key mdType: 0x00010001 Key Value:            ugly  Key Comment: 
+    Key Name:  comment  Key mdType: 0x00010001 Key Value:         comment  Key Comment: 
+    Key Name:  comment  Key mdType: 0x00010001 Key Value:             but  Key Comment: 
+    Key Name:  comment  Key mdType: 0x00010001 Key Value:           still  Key Comment: 
+    Key Name:  comment  Key mdType: 0x00010001 Key Value:           valid  Key Comment: 
+ Key Name:   title2  Key mdType: 0x00010001 Key Value:  Good bye world  Key Comment: STRING or STR may be used as the string type
+ Key Name:     time  Key mdType: 0x00000404 Key Value:        1234.568  Key Comment: 
+ Key Name: negatives  Key mdType: 0x00010002 Key Value:  [-1,-2,-3,...]  Key Comment: 
+ Key Name:       pi  Key mdType: 0x00000408 Key Value:           3.142  Key Comment: Definition of pi
+ Key Name:   myBool  Key mdType: 0x00001301 Key Value:               0  Key Comment: F, f, 0, T, t, 1 are also acceptable
+ Key Name:   primes  Key mdType: 0x00010002 Key Value:   [2,3,5,7,...]  Key Comment: These are prime numbers
+ Key Name: altitude  Key mdType: 0x00000104 Key Value:           10000  Key Comment: 
+ Key Name:    speed  Key mdType: 0x00000404 Key Value:          66.660  Key Comment: 
+ Key Name:   title1  Key mdType: 0x00010001 Key Value:     Hello world  Key Comment: This is a comment for the string value
+
+---> TESTPOINT PASSED (psMetadata{Test A - Read config file with overwrite set true} | tst_psMetadataIO.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMetadataIO.c                                         *
+*            TestPoint: psMetadata{Test B - Read config file with overwrite set false} *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Failed lines: 7 Expected: 7 Contents of metadata list:
+ Key Name:       pi  Key mdType: 0x00000408 Key Value:           3.142  Key Comment: Definition of pi
+ Key Name: altitude  Key mdType: 0x00000104 Key Value:           10000  Key Comment: 
+ Key Name:     time  Key mdType: 0x00000404 Key Value:        1234.568  Key Comment: 
+ Key Name:   myBool  Key mdType: 0x00001301 Key Value:               0  Key Comment: F, f, 0, T, t, 1 are also acceptable
+ Key Name:   title1  Key mdType: 0x00010001 Key Value:     Hello world  Key Comment: This is a comment for the string value
+ Key Name:   title2  Key mdType: 0x00010001 Key Value:  Good bye world  Key Comment: STRING or STR may be used as the string type
+ Key Name:   primes  Key mdType: 0x00010002 Key Value:   [2,3,5,7,...]  Key Comment: These are prime numbers
+ Key Name: negatives  Key mdType: 0x00010002 Key Value:  [-1,-2,-3,...]  Key Comment: 
+ Key Name:  comment  Key mdType: 0x00010001 Key Value:            This  Key Comment: 
+ Key Name:  comment  Key mdType: 0x00010001 Key Value:              is  Key Comment: 
+ Key Name:  comment  Key mdType: 0x00010001 Key Value:              an  Key Comment: 
+ Key Name:  comment  Key mdType: 0x00010001 Key Value:            ugly  Key Comment: 
+ Key Name:  comment  Key mdType: 0x00010001 Key Value:         comment  Key Comment: 
+ Key Name:  comment  Key mdType: 0x00010001 Key Value:             but  Key Comment: 
+ Key Name:  comment  Key mdType: 0x00010001 Key Value:           still  Key Comment: 
+ Key Name:  comment  Key mdType: 0x00010001 Key Value:           valid  Key Comment: 
+ Key Name:    speed  Key mdType: 0x00000404 Key Value:          55.550  Key Comment: 
+
+Contents of metadata table:
+ Key Name:  comment  Key mdType: 0x0001000a Key Value:                  Key Comment: 
+    Key Name:  comment  Key mdType: 0x00010001 Key Value:            This  Key Comment: 
+    Key Name:  comment  Key mdType: 0x00010001 Key Value:              is  Key Comment: 
+    Key Name:  comment  Key mdType: 0x00010001 Key Value:              an  Key Comment: 
+    Key Name:  comment  Key mdType: 0x00010001 Key Value:            ugly  Key Comment: 
+    Key Name:  comment  Key mdType: 0x00010001 Key Value:         comment  Key Comment: 
+    Key Name:  comment  Key mdType: 0x00010001 Key Value:             but  Key Comment: 
+    Key Name:  comment  Key mdType: 0x00010001 Key Value:           still  Key Comment: 
+    Key Name:  comment  Key mdType: 0x00010001 Key Value:           valid  Key Comment: 
+ Key Name:   title2  Key mdType: 0x00010001 Key Value:  Good bye world  Key Comment: STRING or STR may be used as the string type
+ Key Name:     time  Key mdType: 0x00000404 Key Value:        1234.568  Key Comment: 
+ Key Name: negatives  Key mdType: 0x00010002 Key Value:  [-1,-2,-3,...]  Key Comment: 
+ Key Name:       pi  Key mdType: 0x00000408 Key Value:           3.142  Key Comment: Definition of pi
+ Key Name:   myBool  Key mdType: 0x00001301 Key Value:               0  Key Comment: F, f, 0, T, t, 1 are also acceptable
+ Key Name:   primes  Key mdType: 0x00010002 Key Value:   [2,3,5,7,...]  Key Comment: These are prime numbers
+ Key Name: altitude  Key mdType: 0x00000104 Key Value:           10000  Key Comment: 
+ Key Name:    speed  Key mdType: 0x00000404 Key Value:          55.550  Key Comment: 
+ Key Name:   title1  Key mdType: 0x00010001 Key Value:     Hello world  Key Comment: This is a comment for the string value
+
+---> TESTPOINT PASSED (psMetadata{Test B - Read config file with overwrite set false} | tst_psMetadataIO.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMetadataIO.c                                         *
+*            TestPoint: psMetadata{Test C - Read config file without auto-allocation of metadata} *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Failed lines: 6 Expected: 6 Contents of metadata list:
+ Key Name:       pi  Key mdType: 0x00000408 Key Value:           3.142  Key Comment: Definition of pi
+ Key Name: altitude  Key mdType: 0x00000104 Key Value:           10000  Key Comment: 
+ Key Name:     time  Key mdType: 0x00000404 Key Value:        1234.568  Key Comment: 
+ Key Name:   myBool  Key mdType: 0x00001301 Key Value:               0  Key Comment: F, f, 0, T, t, 1 are also acceptable
+ Key Name:   title1  Key mdType: 0x00010001 Key Value:     Hello world  Key Comment: This is a comment for the string value
+ Key Name:   title2  Key mdType: 0x00010001 Key Value:  Good bye world  Key Comment: STRING or STR may be used as the string type
+ Key Name:   primes  Key mdType: 0x00010002 Key Value:   [2,3,5,7,...]  Key Comment: These are prime numbers
+ Key Name: negatives  Key mdType: 0x00010002 Key Value:  [-1,-2,-3,...]  Key Comment: 
+ Key Name:  comment  Key mdType: 0x00010001 Key Value:            This  Key Comment: 
+ Key Name:  comment  Key mdType: 0x00010001 Key Value:              is  Key Comment: 
+ Key Name:  comment  Key mdType: 0x00010001 Key Value:              an  Key Comment: 
+ Key Name:  comment  Key mdType: 0x00010001 Key Value:            ugly  Key Comment: 
+ Key Name:  comment  Key mdType: 0x00010001 Key Value:         comment  Key Comment: 
+ Key Name:  comment  Key mdType: 0x00010001 Key Value:             but  Key Comment: 
+ Key Name:  comment  Key mdType: 0x00010001 Key Value:           still  Key Comment: 
+ Key Name:  comment  Key mdType: 0x00010001 Key Value:           valid  Key Comment: 
+ Key Name:    speed  Key mdType: 0x00000404 Key Value:          66.660  Key Comment: 
+
+Contents of metadata table:
+ Key Name:  comment  Key mdType: 0x0001000a Key Value:                  Key Comment: 
+    Key Name:  comment  Key mdType: 0x00010001 Key Value:            This  Key Comment: 
+    Key Name:  comment  Key mdType: 0x00010001 Key Value:              is  Key Comment: 
+    Key Name:  comment  Key mdType: 0x00010001 Key Value:              an  Key Comment: 
+    Key Name:  comment  Key mdType: 0x00010001 Key Value:            ugly  Key Comment: 
+    Key Name:  comment  Key mdType: 0x00010001 Key Value:         comment  Key Comment: 
+    Key Name:  comment  Key mdType: 0x00010001 Key Value:             but  Key Comment: 
+    Key Name:  comment  Key mdType: 0x00010001 Key Value:           still  Key Comment: 
+    Key Name:  comment  Key mdType: 0x00010001 Key Value:           valid  Key Comment: 
+ Key Name:   title2  Key mdType: 0x00010001 Key Value:  Good bye world  Key Comment: STRING or STR may be used as the string type
+ Key Name:     time  Key mdType: 0x00000404 Key Value:        1234.568  Key Comment: 
+ Key Name: negatives  Key mdType: 0x00010002 Key Value:  [-1,-2,-3,...]  Key Comment: 
+ Key Name:       pi  Key mdType: 0x00000408 Key Value:           3.142  Key Comment: Definition of pi
+ Key Name:   myBool  Key mdType: 0x00001301 Key Value:               0  Key Comment: F, f, 0, T, t, 1 are also acceptable
+ Key Name:   primes  Key mdType: 0x00010002 Key Value:   [2,3,5,7,...]  Key Comment: These are prime numbers
+ Key Name: altitude  Key mdType: 0x00000104 Key Value:           10000  Key Comment: 
+ Key Name:    speed  Key mdType: 0x00000404 Key Value:          66.660  Key Comment: 
+ Key Name:   title1  Key mdType: 0x00010001 Key Value:     Hello world  Key Comment: This is a comment for the string value
+
+---> TESTPOINT PASSED (psMetadata{Test C - Read config file without auto-allocation of metadata} | tst_psMetadataIO.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMetadataIO.c                                         *
+*            TestPoint: psMetadataIO{Test D - Attempt to use null fileName argument} *
+*             TestType: Negative                                                   *
+*    ExpectedErrorText: Null failedLines not allowed                               *
+*  ExpectedStatusValue: 0                                                          *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psMetadata{Test D - Attempt to use null fileName argument} | tst_psMetadataIO.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMetadataIO.c                                         *
+*            TestPoint: psMetadataIO{Test E - Attempt to open nonexistant file}    *
+*             TestType: Negative                                                   *
+*    ExpectedErrorText: Error opening file                                         *
+*  ExpectedStatusValue: 0                                                          *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psMetadata{Test E - Attempt to open nonexistant file} | tst_psMetadataIO.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMetadataIO.c                                         *
+*            TestPoint: psMetadata{Test F - Free psMetadata}                       *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psMetadata{Test F - Free psMetadata} | tst_psMetadataIO.c)
+
Index: /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psMetadata_01.stderr
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psMetadata_01.stderr	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psMetadata_01.stderr	(revision 22331)
@@ -0,0 +1,14 @@
+<DATE><TIME>|<HOST>|E|psMetadataReadHeader (FILE:LINENO)
+    Unallowable operation: fileName is NULL.
+<DATE><TIME>|<HOST>|E|psMetadataReadHeader (FILE:LINENO)
+    FITS error while opening file: missing.dat could not open the named file
+<DATE><TIME>|<HOST>|E|psMetadataReadHeader (FILE:LINENO)
+    Couldn't close FITS file. FITS error: NULL input pointer
+<DATE><TIME>|<HOST>|E|psMetadataReadHeader (FILE:LINENO)
+    Specified extension number, 0, is invalid.  Value must be positive if no extension name is given.
+<DATE><TIME>|<HOST>|E|psMetadataReadHeader (FILE:LINENO)
+    FITS error while locating header 22: tried to move past end of file
+<DATE><TIME>|<HOST>|E|psMetadataReadHeader (FILE:LINENO)
+    FITS error while locating header AARGH: illegal HDU number
+<DATE><TIME>|<HOST>|E|psMetadataReadHeader (FILE:LINENO)
+    Specified extension number, 0, is invalid.  Value must be positive if no extension name is given.
Index: /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psMetadata_01.stdout
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psMetadata_01.stdout	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psMetadata_01.stdout	(revision 22331)
@@ -0,0 +1,194 @@
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMetadata_01.c                                        *
+*            TestPoint: psMetadata{Test A - Read 1st hdr from simple FITS file}    *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Contents of metadata list:
+ Key Name:   SIMPLE  Key mdType: 0x00001301  Key Value:               1  Key Comment: file does conform to FITS standard
+ Key Name:   BITPIX  Key mdType: 0x00000104  Key Value:               8  Key Comment: number of bits per data pixel
+ Key Name:    NAXIS  Key mdType: 0x00000104  Key Value:               0  Key Comment: number of data axes
+ Key Name:  HISTORY  Key mdType: 0x00010001  Key Value:                  Key Comment: File modified by user 'harman' with fv  on 2004-08-04T<DATE>
+
+Contents of metadata table:
+ Key Name:    NAXIS  Key mdType: 0x00000104  Key Value:               0  Key Comment: number of data axes
+ Key Name:   SIMPLE  Key mdType: 0x00001301  Key Value:               1  Key Comment: file does conform to FITS standard
+ Key Name:   BITPIX  Key mdType: 0x00000104  Key Value:               8  Key Comment: number of bits per data pixel
+ Key Name:  HISTORY  Key mdType: 0x00010001  Key Value:                  Key Comment: File modified by user 'harman' with fv  on 2004-08-04T<DATE>
+
+---> TESTPOINT PASSED (psMetadata{Test A - Read 1st hdr from simple FITS file} | tst_psMetadata_01.c)
+
+ID=34
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMetadata_01.c                                        *
+*            TestPoint: psMetadata{Test B - Read 2nd hdr from complex FITS file}   *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Contents of metadata list:
+ Key Name: XTENSION  Key mdType: 0x00010001  Key Value:      'IMAGE   '  Key Comment: IMAGE extension
+ Key Name:   BITPIX  Key mdType: 0x00000104  Key Value:             -64  Key Comment: number of bits per data pixel
+ Key Name:    NAXIS  Key mdType: 0x00000104  Key Value:               1  Key Comment: number of data axes
+ Key Name:   NAXIS1  Key mdType: 0x00000104  Key Value:              64  Key Comment: length of data axis 1
+ Key Name:   PCOUNT  Key mdType: 0x00000104  Key Value:               0  Key Comment: required keyword; must = 0
+ Key Name:   GCOUNT  Key mdType: 0x00000104  Key Value:               1  Key Comment: required keyword; must = 1
+ Key Name:   BITPIX  Key mdType: 0x00000104  Key Value:             -64  Key Comment: number of bits per data pixel
+ Key Name:  EXTNAME  Key mdType: 0x00010001  Key Value:     'MY_DATA_1'  Key Comment: 
+ Key Name:  HISTORY  Key mdType: 0x00010001  Key Value:                  Key Comment: File modified by user 'harman' with fv  on 2004-08-04T<DATE>
+ Key Name:  HISTORY  Key mdType: 0x00010001  Key Value:                  Key Comment: File modified by user 'harman' with fv  on 2004-08-04T<DATE>
+ Key Name:  HISTORY  Key mdType: 0x00010001  Key Value:                  Key Comment: File modified by user 'harman' with fv  on 2004-08-04T<DATE>
+ Key Name:  HISTORY  Key mdType: 0x00010001  Key Value:                  Key Comment: File modified by user 'harman' with fv  on 2004-08-04T<DATE>
+
+Contents of metadata table:
+ Key Name:    NAXIS  Key mdType: 0x00000104  Key Value:               1  Key Comment: number of data axes
+ Key Name:   NAXIS1  Key mdType: 0x00000104  Key Value:              64  Key Comment: length of data axis 1
+ Key Name:   PCOUNT  Key mdType: 0x00000104  Key Value:               0  Key Comment: required keyword; must = 0
+ Key Name: XTENSION  Key mdType: 0x00010001  Key Value:      'IMAGE   '  Key Comment: IMAGE extension
+ Key Name:   BITPIX  Key mdType: 0x0001000a  Key Value:                  Key Comment: 
+    Key Name:   BITPIX  Key mdType: 0x00000104  Key Value:             -64  Key Comment: number of bits per data pixel
+    Key Name:   BITPIX  Key mdType: 0x00000104  Key Value:             -64  Key Comment: number of bits per data pixel
+ Key Name:   GCOUNT  Key mdType: 0x00000104  Key Value:               1  Key Comment: required keyword; must = 1
+ Key Name:  HISTORY  Key mdType: 0x0001000a  Key Value:                  Key Comment: 
+    Key Name:  HISTORY  Key mdType: 0x00010001  Key Value:                  Key Comment: File modified by user 'harman' with fv  on 2004-08-04T<DATE>
+    Key Name:  HISTORY  Key mdType: 0x00010001  Key Value:                  Key Comment: File modified by user 'harman' with fv  on 2004-08-04T<DATE>
+    Key Name:  HISTORY  Key mdType: 0x00010001  Key Value:                  Key Comment: File modified by user 'harman' with fv  on 2004-08-04T<DATE>
+    Key Name:  HISTORY  Key mdType: 0x00010001  Key Value:                  Key Comment: File modified by user 'harman' with fv  on 2004-08-04T<DATE>
+ Key Name:  EXTNAME  Key mdType: 0x00010001  Key Value:     'MY_DATA_1'  Key Comment: 
+
+---> TESTPOINT PASSED (psMetadata{Test B - Read 2nd hdr from complex FITS file} | tst_psMetadata_01.c)
+
+ID=138
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMetadata_01.c                                        *
+*            TestPoint: psMetadata{Test C - Read named hdr from complex FITS file} *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Contents of metadata list:
+ Key Name: XTENSION  Key mdType: 0x00010001  Key Value:      'IMAGE   '  Key Comment: IMAGE extension
+ Key Name:   BITPIX  Key mdType: 0x00000104  Key Value:             -64  Key Comment: number of bits per data pixel
+ Key Name:    NAXIS  Key mdType: 0x00000104  Key Value:               1  Key Comment: number of data axes
+ Key Name:   NAXIS1  Key mdType: 0x00000104  Key Value:              64  Key Comment: length of data axis 1
+ Key Name:   PCOUNT  Key mdType: 0x00000104  Key Value:               0  Key Comment: required keyword; must = 0
+ Key Name:   GCOUNT  Key mdType: 0x00000104  Key Value:               1  Key Comment: required keyword; must = 1
+ Key Name:  EXTNAME  Key mdType: 0x00010001  Key Value:     'MY_DATA_2'  Key Comment: 
+ Key Name:  HISTORY  Key mdType: 0x00010001  Key Value:                  Key Comment: File modified by user 'harman' with fv  on 2004-08-04T<DATE>
+ Key Name:  HISTORY  Key mdType: 0x00010001  Key Value:                  Key Comment: File modified by user 'harman' with fv  on 2004-08-04T<DATE>
+
+Contents of metadata table:
+ Key Name:    NAXIS  Key mdType: 0x00000104  Key Value:               1  Key Comment: number of data axes
+ Key Name:   NAXIS1  Key mdType: 0x00000104  Key Value:              64  Key Comment: length of data axis 1
+ Key Name:   PCOUNT  Key mdType: 0x00000104  Key Value:               0  Key Comment: required keyword; must = 0
+ Key Name: XTENSION  Key mdType: 0x00010001  Key Value:      'IMAGE   '  Key Comment: IMAGE extension
+ Key Name:   GCOUNT  Key mdType: 0x00000104  Key Value:               1  Key Comment: required keyword; must = 1
+ Key Name:   BITPIX  Key mdType: 0x00000104  Key Value:             -64  Key Comment: number of bits per data pixel
+ Key Name:  HISTORY  Key mdType: 0x0001000a  Key Value:                  Key Comment: 
+    Key Name:  HISTORY  Key mdType: 0x00010001  Key Value:                  Key Comment: File modified by user 'harman' with fv  on 2004-08-04T<DATE>
+    Key Name:  HISTORY  Key mdType: 0x00010001  Key Value:                  Key Comment: File modified by user 'harman' with fv  on 2004-08-04T<DATE>
+ Key Name:  EXTNAME  Key mdType: 0x00010001  Key Value:     'MY_DATA_2'  Key Comment: 
+
+---> TESTPOINT PASSED (psMetadata{Test C - Read named hdr from complex FITS file} | tst_psMetadata_01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMetadata_01.c                                        *
+*            TestPoint: psMetadata{Test D - Remove items with same name from all metadata} *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Removed HISTORY from all metadata from prior test. Resulting metadata:
+
+Contents of metadata list:
+ Key Name: XTENSION  Key mdType: 0x00010001  Key Value:      'IMAGE   '  Key Comment: IMAGE extension
+ Key Name:   BITPIX  Key mdType: 0x00000104  Key Value:             -64  Key Comment: number of bits per data pixel
+ Key Name:    NAXIS  Key mdType: 0x00000104  Key Value:               1  Key Comment: number of data axes
+ Key Name:   NAXIS1  Key mdType: 0x00000104  Key Value:              64  Key Comment: length of data axis 1
+ Key Name:   PCOUNT  Key mdType: 0x00000104  Key Value:               0  Key Comment: required keyword; must = 0
+ Key Name:   GCOUNT  Key mdType: 0x00000104  Key Value:               1  Key Comment: required keyword; must = 1
+ Key Name:  EXTNAME  Key mdType: 0x00010001  Key Value:     'MY_DATA_2'  Key Comment: 
+
+Contents of metadata table:
+ Key Name:    NAXIS  Key mdType: 0x00000104  Key Value:               1  Key Comment: number of data axes
+ Key Name:   NAXIS1  Key mdType: 0x00000104  Key Value:              64  Key Comment: length of data axis 1
+ Key Name:   PCOUNT  Key mdType: 0x00000104  Key Value:               0  Key Comment: required keyword; must = 0
+ Key Name: XTENSION  Key mdType: 0x00010001  Key Value:      'IMAGE   '  Key Comment: IMAGE extension
+ Key Name:   GCOUNT  Key mdType: 0x00000104  Key Value:               1  Key Comment: required keyword; must = 1
+ Key Name:   BITPIX  Key mdType: 0x00000104  Key Value:             -64  Key Comment: number of bits per data pixel
+ Key Name:  EXTNAME  Key mdType: 0x00010001  Key Value:     'MY_DATA_2'  Key Comment: 
+
+---> TESTPOINT PASSED (psMetadata{Test D - Remove items with same name from all metadata} | tst_psMetadata_01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMetadata_01.c                                        *
+*            TestPoint: psMetadata{Test E - Attempt to use null filename}          *
+*             TestType: Negative                                                   *
+*    ExpectedErrorText: Null fileName not allowed                                  *
+*  ExpectedStatusValue: 0                                                          *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psMetadata{Test E - Attempt to use null filename} | tst_psMetadata_01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMetadata_01.c                                        *
+*            TestPoint: psMetadata{Test F - Attempt to open nonexistant file}      *
+*             TestType: Negative                                                   *
+*    ExpectedErrorText: FITS error while opening file: missing.dat...Couldn't close FITS file... *
+*  ExpectedStatusValue: 0                                                          *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psMetadata{Test F - Attempt to open nonexistant file} | tst_psMetadata_01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMetadata_01.c                                        *
+*            TestPoint: psMetadata{Test G - Attempt to use two null inputs}        *
+*             TestType: Negative                                                   *
+*    ExpectedErrorText: Null extName and extNum = 0 not allowed                    *
+*  ExpectedStatusValue: 0                                                          *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psMetadata{Test G - Attempt to use two null inputs} | tst_psMetadata_01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMetadata_01.c                                        *
+*            TestPoint: psMetadata{Test H - Attempt to use bad extNum}             *
+*             TestType: Negative                                                   *
+*    ExpectedErrorText: FITS error while locating header 22: tried to move past end of file *
+*  ExpectedStatusValue: 0                                                          *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psMetadata{Test H - Attempt to use bad extNum} | tst_psMetadata_01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMetadata_01.c                                        *
+*            TestPoint: psMetadata{Test I - Attempt to use bad extName}            *
+*             TestType: Negative                                                   *
+*    ExpectedErrorText: FITS error while locating header AARGH: illegal HDU number *
+*  ExpectedStatusValue: 0                                                          *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psMetadata{Test I - Attempt to use bad extName} | tst_psMetadata_01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMetadata_01.c                                        *
+*            TestPoint: psMetadata{Test J - Read named hdr w/ invalid extnum}      *
+*             TestType: Negative                                                   *
+*    ExpectedErrorText: If extName specified, extNum should be -1.                 *
+*  ExpectedStatusValue: 0                                                          *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psMetadata{Test J - Read named hdr w/ invalid extnum} | tst_psMetadata_01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMetadata_01.c                                        *
+*            TestPoint: psMetadata{Test K - Free psMetadata}                       *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psMetadata{Test K - Free psMetadata} | tst_psMetadata_01.c)
+
Index: /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psMetadata_02.stderr
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psMetadata_02.stderr	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psMetadata_02.stderr	(revision 22331)
@@ -0,0 +1,10 @@
+<DATE><TIME>|<HOST>|I|main
+    Following should produce error for null name.
+<DATE><TIME>|<HOST>|E|psMetadataItemAllocV (FILE:LINENO)
+    Unallowable operation: name is NULL.
+<DATE><TIME>|<HOST>|E|psMetadataItemAllocV (FILE:LINENO)
+    Specified psMetadataType, -1, is not supported.
+<DATE><TIME>|<HOST>|E|psMetadataAddItem (FILE:LINENO)
+    Unallowable operation: md is NULL.
+<DATE><TIME>|<HOST>|E|psMetadataAddItem (FILE:LINENO)
+    Unallowable operation: metadataItem is NULL.
Index: /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psMetadata_02.stdout
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psMetadata_02.stdout	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psMetadata_02.stdout	(revision 22331)
@@ -0,0 +1,76 @@
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMetadata_02.c                                        *
+*            TestPoint: psMetadata{Test A - Allocate metadata items}               *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Key Name:  myItem1  Key mdType: 0x00001301  Key Value:               1  Key Comment: I am a boolean
+Key Name:  myItem2  Key mdType: 0x00000104  Key Value:             111  Key Comment: I am a signed integer
+Key Name:  myItem3  Key mdType: 0x00000404  Key Value:         222.222  Key Comment: I am a single precision floating point
+Key Name:  myItem4  Key mdType: 0x00000408  Key Value:         333.333  Key Comment: I am a double precision floating point
+Key Name:  myItem5  Key mdType: 0x00010001  Key Value:     HELLO WORLD  Key Comment: I am a string
+
+---> TESTPOINT PASSED (psMetadata{Test A - Allocate metadata items} | tst_psMetadata_02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMetadata_02.c                                        *
+*            TestPoint: psMetadata{Test B - Attempt to create metadata item with null name} *
+*             TestType: Negative                                                   *
+*    ExpectedErrorText: Null value for name not allowed                            *
+*  ExpectedStatusValue: 0                                                          *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psMetadata{Test B - Attempt to create metadata item with null name} | tst_psMetadata_02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMetadata_02.c                                        *
+*            TestPoint: psMetadata{Test C - Attempt to create metadata item with invalid type} *
+*             TestType: Negative                                                   *
+*    ExpectedErrorText: Invalid psMetadataType: 6                                  *
+*  ExpectedStatusValue: 0                                                          *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psMetadata{Test C - Attempt to create metadata item with invalid type} | tst_psMetadata_02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMetadata_02.c                                        *
+*            TestPoint: psMetadata{Test D - Allocate metadata}                     *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psMetadata{Test D - Allocate metadata} | tst_psMetadata_02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMetadata_02.c                                        *
+*            TestPoint: psMetadata{Test E - Attempt to add metadata item to null metadata} *
+*             TestType: Negative                                                   *
+*    ExpectedErrorText: Null metadata collection not allowed                       *
+*  ExpectedStatusValue: 0                                                          *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psMetadata{Test E - Attempt to add metadata item to null metadata} | tst_psMetadata_02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMetadata_02.c                                        *
+*            TestPoint: psMetadata{Test F - Attempt to add null metadata item to metadata} *
+*             TestType: Negative                                                   *
+*    ExpectedErrorText: Null metadata item not allowed                             *
+*  ExpectedStatusValue: 0                                                          *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psMetadata{Test F - Attempt to add null metadata item to metadata} | tst_psMetadata_02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMetadata_02.c                                        *
+*            TestPoint: psMetadata{Test G - Free psMetadata}                       *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psMetadata{Test G - Free psMetadata} | tst_psMetadata_02.c)
+
Index: /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psMetadata_03.stderr
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psMetadata_03.stderr	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psMetadata_03.stderr	(revision 22331)
@@ -0,0 +1,20 @@
+<DATE><TIME>|<HOST>|E|psMetadataRemove (FILE:LINENO)
+    Unallowable operation: md is NULL.
+<DATE><TIME>|<HOST>|E|psMetadataRemove (FILE:LINENO)
+    Failed to remove metadata item, AARGH, from metadata table.
+<DATE><TIME>|<HOST>|E|psMetadataRemove (FILE:LINENO)
+    Could not find metadata item at index 22.
+<DATE><TIME>|<HOST>|E|psMetadataAddItem (FILE:LINENO)
+    Unallowable operation: md->table is NULL.
+<DATE><TIME>|<HOST>|E|psMetadataRemove (FILE:LINENO)
+    Unallowable operation: md->table is NULL.
+<DATE><TIME>|<HOST>|E|psMetadataAddItem (FILE:LINENO)
+    Unallowable operation: md->list is NULL.
+<DATE><TIME>|<HOST>|E|psMetadataRemove (FILE:LINENO)
+    Unallowable operation: md->list is NULL.
+<DATE><TIME>|<HOST>|E|psMetadataAddItem (FILE:LINENO)
+    Unallowable operation: metadataItem->name is NULL.
+<DATE><TIME>|<HOST>|E|psMetadataAddItem (FILE:LINENO)
+    Unallowable operation: md->table is NULL.
+<DATE><TIME>|<HOST>|E|psMetadataAddV (FILE:LINENO)
+    Failed to add metadata item to metadata collection list.
Index: /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psMetadata_03.stdout
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psMetadata_03.stdout	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psMetadata_03.stdout	(revision 22331)
@@ -0,0 +1,117 @@
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMetadata_03.c                                        *
+*            TestPoint: psMetadata{Test A - Allocate metadata items}               *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Key Name:  myItem1  Key mdType: 0x00001301  Key Value:               1  Key Comment: I am a boolean
+Key Name:  myItem2  Key mdType: 0x00000104  Key Value:              55  Key Comment: I am a integer
+Key Name:  myItem3  Key mdType: 0x00001301  Key Value:               0  Key Comment: I am a boolean
+Key Name:  myItem4  Key mdType: 0x00000104  Key Value:              66  Key Comment: I am a integer
+
+---> TESTPOINT PASSED (psMetadata{Test A - Allocate metadata items} | tst_psMetadata_03.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMetadata_03.c                                        *
+*            TestPoint: psMetadata{Test B - Remove items from metadata by name}    *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psMetadata{Test B - Remove items from metadata by name} | tst_psMetadata_03.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMetadata_03.c                                        *
+*            TestPoint: psMetadata{Test C - Remove items from metadata by index}   *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psMetadata{Test C - Remove items from metadata by index} | tst_psMetadata_03.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMetadata_03.c                                        *
+*            TestPoint: psMetadata{Test D - Attempt to use null metadata}          *
+*             TestType: Negative                                                   *
+*    ExpectedErrorText: Null metadata collection not allowed                       *
+*  ExpectedStatusValue: 0                                                          *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psMetadata{Test D - Attempt to use null metadata} | tst_psMetadata_03.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMetadata_03.c                                        *
+*            TestPoint: psMetadata{Test E - Attempt to remove non-existant metadata item by name} *
+*             TestType: Negative                                                   *
+*    ExpectedErrorText: Couldn't find metadata item. Name: AARGH                   *
+*  ExpectedStatusValue: 0                                                          *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psMetadata{Test E - Attempt to remove non-existant metadata item by name} | tst_psMetadata_03.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMetadata_03.c                                        *
+*            TestPoint: psMetadata{Test E - Attempt to remove non-existant metadata item by index} *
+*             TestType: Negative                                                   *
+*    ExpectedErrorText: Couldn't find metadata item in list. Index: 22             *
+*  ExpectedStatusValue: 0                                                          *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psMetadata{Test E - Attempt to remove non-existant metadata item by index} | tst_psMetadata_03.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMetadata_03.c                                        *
+*            TestPoint: psMetadata{Test G - Attempt to add item to metadata w/o hash table} *
+*             TestType: Negative                                                   *
+*    ExpectedErrorText: Couldn't add item to invalid metadata structure.           *
+*  ExpectedStatusValue: 0                                                          *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psMetadata{Test G - Attempt to add item to invalid metadata w/o hash table} | tst_psMetadata_03.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMetadata_03.c                                        *
+*            TestPoint: psMetadata{Test H - Attempt to add item to metadata w/o link list} *
+*             TestType: Negative                                                   *
+*    ExpectedErrorText: Couldn't add item to invalid metadata structure.           *
+*  ExpectedStatusValue: 0                                                          *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psMetadata{Test H - Attempt to add item to invalid metadata w/o link list} | tst_psMetadata_03.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMetadata_03.c                                        *
+*            TestPoint: psMetadata{Test I - Attempt to add item with null name}    *
+*             TestType: Negative                                                   *
+*    ExpectedErrorText: Couldn't add item with null name.                          *
+*  ExpectedStatusValue: 0                                                          *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psMetadata{Test I - Attempt to add item with null name} | tst_psMetadata_03.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMetadata_03.c                                        *
+*            TestPoint: psMetadata{Test J - Attempt to add item to metadata w/o hash table} *
+*             TestType: Negative                                                   *
+*    ExpectedErrorText: Couldn't add item to invalid metadata structure.           *
+*  ExpectedStatusValue: 0                                                          *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psMetadata{Test J - Attempt to add item to invalid metadata w/o hash table} | tst_psMetadata_03.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMetadata_03.c                                        *
+*            TestPoint: psMetadata{Test K - Free psMetadata}                       *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psMetadata{Test K - Free psMetadata} | tst_psMetadata_03.c)
+
Index: /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psMetadata_04.stderr
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psMetadata_04.stderr	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psMetadata_04.stderr	(revision 22331)
@@ -0,0 +1,16 @@
+<DATE><TIME>|<HOST>|E|psMetadataLookup (FILE:LINENO)
+    Unallowable operation: md is NULL.
+<DATE><TIME>|<HOST>|E|psMetadataLookup (FILE:LINENO)
+    Unallowable operation: key is NULL.
+<DATE><TIME>|<HOST>|E|psMetadataGet (FILE:LINENO)
+    Unallowable operation: md is NULL.
+<DATE><TIME>|<HOST>|E|psListIteratorSet (FILE:LINENO)
+    Specified location, 22, is invalid.
+<DATE><TIME>|<HOST>|E|psListGet (FILE:LINENO)
+    Specified location, 22, is invalid.
+<DATE><TIME>|<HOST>|E|psMetadataGet (FILE:LINENO)
+    Could not find metadata item at index 22.
+<DATE><TIME>|<HOST>|E|psMetadataLookup (FILE:LINENO)
+    Unallowable operation: md->table is NULL.
+<DATE><TIME>|<HOST>|E|psMetadataGet (FILE:LINENO)
+    Unallowable operation: md->list is NULL.
Index: /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psMetadata_04.stdout
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psMetadata_04.stdout	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psMetadata_04.stdout	(revision 22331)
@@ -0,0 +1,174 @@
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMetadata_04.c                                        *
+*            TestPoint: psMetadata{Test A - Allocate metadata items}               *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Key Name:  myItem1  Key mdType: 0x00001301  Key Value:               1  Key Comment: I am a boolean
+Key Name:  myItem2  Key mdType: 0x00000104  Key Value:              55  Key Comment: I am a integer
+Key Name:  myItem3  Key mdType: 0x00001301  Key Value:               0  Key Comment: I am a boolean
+Key Name:  myItem4  Key mdType: 0x00000104  Key Value:              66  Key Comment: I am a integer
+Key Name:  myItem5  Key mdType: 0x00000408  Key Value:           3.140  Key Comment: I am a double
+
+---> TESTPOINT PASSED (psMetadata{Test A - Allocate metadata items} | tst_psMetadata_04.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMetadata_04.c                                        *
+*            TestPoint: psMetadata{Test B - Lookup metadata item by name}          *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Found item named myItem2
+
+---> TESTPOINT PASSED (psMetadata{Test B - Lookup metadata item by name} | tst_psMetadata_04.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMetadata_04.c                                        *
+*            TestPoint: psMetadata{Test C - Attempt to use null metadata}          *
+*             TestType: Negative                                                   *
+*    ExpectedErrorText: Null metadata collection not allowed                       *
+*  ExpectedStatusValue: 0                                                          *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psMetadata{Test C - Attempt to use null metadata} | tst_psMetadata_04.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMetadata_04.c                                        *
+*            TestPoint: psMetadata{Test D - Attempt to use null key}               *
+*             TestType: Negative                                                   *
+*    ExpectedErrorText: Null key name not allowed                                  *
+*  ExpectedStatusValue: 0                                                          *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psMetadata{Test D - Attempt to use null key} | tst_psMetadata_04.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMetadata_04.c                                        *
+*            TestPoint: psMetadata{Test E - Attempt to lookup non-existant metadata item} *
+*             TestType: Negative                                                   *
+*    ExpectedErrorText: Couldn't find metadata item. Name: AARGH                   *
+*  ExpectedStatusValue: 0                                                          *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psMetadata{Test E - Attempt to lookup non-existant metadata item} | tst_psMetadata_04.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMetadata_04.c                                        *
+*            TestPoint: psMetadata{Test F - Lookup metadata item by index}         *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Found item named myItem6
+
+---> TESTPOINT PASSED (psMetadata{Test F - Lookup metadata item by index} | tst_psMetadata_04.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMetadata_04.c                                        *
+*            TestPoint: psMetadata{Test G - Lookup metadata item and return psS32 value} *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psMetadata{Test G - Lookup metadata item and return psS32 value} | tst_psMetadata_04.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMetadata_04.c                                        *
+*            TestPoint: psMetadata{Test H - Lookup metadata item and return psF64 value} *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psMetadata{Test H - Lookup metadata item and return psF64 value} | tst_psMetadata_04.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMetadata_04.c                                        *
+*            TestPoint: psMetadata{Test I - Lookup metadata item and return psVector pointer} *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psMetadata{Test I - Lookup metadata item and return psVector pointer} | tst_psMetadata_04.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMetadata_04.c                                        *
+*            TestPoint: psMetadata{Test J - Attempt to use null metadata}          *
+*             TestType: Negative                                                   *
+*    ExpectedErrorText: Null metadata collection not allowed                       *
+*  ExpectedStatusValue: 0                                                          *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psMetadata{Test J - Attempt to use null metadata} | tst_psMetadata_04.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMetadata_04.c                                        *
+*            TestPoint: psMetadata{Test K - Attempt to get non-existant metadata item} *
+*             TestType: Negative                                                   *
+*    ExpectedErrorText: Couldn't find metadata item with given index. Index: 22    *
+*  ExpectedStatusValue: 0                                                          *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psMetadata{Test K - Attempt to get non-existant metadata item} | tst_psMetadata_04.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMetadata_04.c                                        *
+*            TestPoint: psMetadata{Test L - Attemp to look up with an invalid metadata} *
+*             TestType: Negative                                                   *
+*    ExpectedErrorText: Lookup item with invalid metadata object.                  *
+*  ExpectedStatusValue: 0                                                          *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psMetadata{Test L - Attempt to lookup an invalid metadata object.} | tst_psMetadata_04.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMetadata_04.c                                        *
+*            TestPoint: psMetadata{Test M - Attempt to get item with an invalid metadata} *
+*             TestType: Negative                                                   *
+*    ExpectedErrorText: Get item with invalid metadata object.                     *
+*  ExpectedStatusValue: 0                                                          *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psMetadata{Test M - Attempt to get item with  invalid metadata object} | tst_psMetadata_04.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMetadata_04.c                                        *
+*            TestPoint: psMetadata{Test N - Attempt get psS32 value of non-existant metadata item} *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psMetadata{Test N - Attempt get psS32 value of non-existant metadata item} | tst_psMetadata_04.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMetadata_04.c                                        *
+*            TestPoint: psMetadata{Test O - Attempt get psF64 value of non-existant metadata item} *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psMetadata{Test O - Attempt get psF64 value of non-existant metadata item} | tst_psMetadata_04.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMetadata_04.c                                        *
+*            TestPoint: psMetadata{Test P - Attempt get psVector value of non-existant metadata item} *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psMetadata{Test P - Attempt get psVector value of non-existant metadata item} | tst_psMetadata_04.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMetadata_04.c                                        *
+*            TestPoint: psMetadata{Test Q - Free psMetadata}                       *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psMetadata{Test Q - Free psMetadata} | tst_psMetadata_04.c)
+
Index: /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psMetadata_05.stderr
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psMetadata_05.stderr	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psMetadata_05.stderr	(revision 22331)
@@ -0,0 +1,6 @@
+<DATE><TIME>|<HOST>|E|psMetadataItemPrint (FILE:LINENO)
+    Unallowable operation: fd is NULL.
+<DATE><TIME>|<HOST>|E|psMetadataItemPrint (FILE:LINENO)
+    Unallowable operation: format is NULL.
+<DATE><TIME>|<HOST>|E|psMetadataItemPrint (FILE:LINENO)
+    Unallowable operation: metadataItem is NULL.
Index: /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psMetadata_05.stdout
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psMetadata_05.stdout	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psMetadata_05.stdout	(revision 22331)
@@ -0,0 +1,64 @@
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMetadata_05.c                                        *
+*            TestPoint: psMetadata{Test A - Allocate metadata items}               *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Key Name:  myItem1  Key mdType: 0x00001301  Key Value:               1  Key Comment: I am a boolean
+Key Name:  myItem2  Key mdType: 0x00000104  Key Value:              55  Key Comment: I am a integer
+Key Name:  myItem3  Key mdType: 0x00001301  Key Value:               0  Key Comment: I am a boolean
+Key Name:  myItem4  Key mdType: 0x00000104  Key Value:              66  Key Comment: I am a integer
+
+---> TESTPOINT PASSED (psMetadata{Test A - Allocate metadata items} | tst_psMetadata_05.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMetadata_05.c                                        *
+*            TestPoint: psMetadata{Test F - Write metadata item to file}           *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psMetadata{Test F - Write metadata item to file} | tst_psMetadata_05.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMetadata_05.c                                        *
+*            TestPoint: psMetadata{Test J - Attempt to use null file with itemPrint} *
+*             TestType: Negative                                                   *
+*    ExpectedErrorText: Null file descriptor not allowed                           *
+*  ExpectedStatusValue: 0                                                          *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psMetadata{Test J - Attempt to use null file with itemPrint} | tst_psMetadata_05.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMetadata_05.c                                        *
+*            TestPoint: psMetadata{Test K - Attempt to use null format with itemPrint} *
+*             TestType: Negative                                                   *
+*    ExpectedErrorText: Null format not allowed                                    *
+*  ExpectedStatusValue: 0                                                          *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psMetadata{Test K - Attempt to use null format with itemPrint} | tst_psMetadata_05.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMetadata_05.c                                        *
+*            TestPoint: psMetadata{Test L - Attempt to use null item with itemPrint} *
+*             TestType: Negative                                                   *
+*    ExpectedErrorText: Null metadata not allowed                                  *
+*  ExpectedStatusValue: 0                                                          *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psMetadata{Test L - Attempt to use null item with itemPrint} | tst_psMetadata_05.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMetadata_05.c                                        *
+*            TestPoint: psMetadata{Test M - Free psMetadata}                       *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psMetadata{Test M - Free psMetadata} | tst_psMetadata_05.c)
+
Index: /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psMetadata_06.stdout
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psMetadata_06.stdout	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psMetadata_06.stdout	(revision 22331)
@@ -0,0 +1,50 @@
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMetadata_06.c                                        *
+*            TestPoint: psMetadata{Test A - Allocate metadata and items}           *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Key Name:  myItem1  Key mdType: 0x00001301  Key Value:               1  Key Comment: I am a boolean
+Key Name:  myItem1  Key mdType: 0x00000104  Key Value:             111  Key Comment: I am a signed integer
+Key Name:  myItem1  Key mdType: 0x00000104  Key Value:             222  Key Comment: I am a signed integer
+Key Name:  myItem2  Key mdType: 0x00000104  Key Value:             333  Key Comment: I am a signed integer
+Key Name:  myItem2  Key mdType: 0x00010000  Key Value:          psList  Key Comment: I am a list
+
+---> TESTPOINT PASSED (psMetadata{Test A - Allocate metadata and items} | tst_psMetadata_06.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMetadata_06.c                                        *
+*            TestPoint: psMetadata{Test B - replace an item in the metadata}       *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psMetadata{Test B - replace an item in the metadata} | tst_psMetadata_06.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMetadata_06.c                                        *
+*            TestPoint: psMetadata{Test C - add duplicate-key metadata item}       *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psMetadata{Test C - add duplicate-key metadata item} | tst_psMetadata_06.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMetadata_06.c                                        *
+*            TestPoint: psMetadata{Test D - Add folder node on top of existing leaf node} *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psMetadata{Test D - Add folder node on top of existing leaf node} | tst_psMetadata_06.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMetadata_06.c                                        *
+*            TestPoint: psMetadata{Test E - Free psMetadata}                       *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psMetadata{Test E - Free psMetadata} | tst_psMetadata_06.c)
+
Index: /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psMetadata_07.stdout
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psMetadata_07.stdout	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psMetadata_07.stdout	(revision 22331)
@@ -0,0 +1,18 @@
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMetadata_07.c                                        *
+*            TestPoint: psMetadata{Test A - Read an XML config file}               *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psMetadata{Test A - Read an XML config file} | tst_psMetadata_07.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMetadata_07.c                                        *
+*            TestPoint: psMetadata{Test B - Free data}                             *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psMetadata{Test B - Free data} | tst_psMetadata_07.c)
+
Index: /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psScalar.stderr
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psScalar.stderr	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psScalar.stderr	(revision 22331)
@@ -0,0 +1,34 @@
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psScalar.c                                             *
+*            TestPoint: psScalar{psScalarAlloc}                                    *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|I|testScalarAlloc
+    psScalarAlloc shall create scalar data objects
+<DATE><TIME>|<HOST>|I|testScalarAlloc
+    Following should generate an error message
+<DATE><TIME>|<HOST>|E|psScalarAlloc (FILE:LINENO)
+    Specified datatype (4865) is unsupported by psScalar.
+
+---> TESTPOINT PASSED (psScalar{psScalarAlloc} | tst_psScalar.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psScalar.c                                             *
+*            TestPoint: psScalar{psScalarCopy}                                     *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|I|testScalarCopy
+    psScalarCopy shall copy scalar objects
+<DATE><TIME>|<HOST>|I|testScalarCopy
+    Following should generate an error message
+<DATE><TIME>|<HOST>|E|psScalarCopy (FILE:LINENO)
+    Specified datatype (4865) is unsupported by psScalar.
+<DATE><TIME>|<HOST>|I|testScalarCopy
+    Following should generate an error message
+<DATE><TIME>|<HOST>|E|psScalarCopy (FILE:LINENO)
+    Can not copy a NULL psScalar.
+
+---> TESTPOINT PASSED (psScalar{psScalarCopy} | tst_psScalar.c)
+
Index: /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psSort_01.stdout
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psSort_01.stdout	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psSort_01.stdout	(revision 22331)
@@ -0,0 +1,57 @@
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psSort_01.c                                            *
+*            TestPoint: psSort{Create float vectors}                               *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+vec[0] = 7.000000
+vec[1] = 9.000000
+vec[2] = 3.000000
+vec[3] = 1.000000
+vec[4] = 5.000000
+vec[5] = 5.000000
+vec[6] = -20.000000
+
+---> TESTPOINT PASSED (psSort{Create float vectors} | tst_psSort_01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psSort_01.c                                            *
+*            TestPoint: psSort{Sort float vector}                                  *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+vec[0] = -20.000000
+vec[1] = 1.000000
+vec[2] = 3.000000
+vec[3] = 5.000000
+vec[4] = 5.000000
+vec[5] = 7.000000
+vec[6] = 9.000000
+
+---> TESTPOINT PASSED (psSort{Sort float vector} | tst_psSort_01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psSort_01.c                                            *
+*            TestPoint: psSort{Sort input float vector into itself}                *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+vec[0] = -20.000000
+vec[1] = 1.000000
+vec[2] = 3.000000
+vec[3] = 5.000000
+vec[4] = 5.000000
+vec[5] = 7.000000
+vec[6] = 9.000000
+
+---> TESTPOINT PASSED (psSort{Sort input float vector into itself} | tst_psSort_01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psSort_01.c                                            *
+*            TestPoint: psSort{Free float vectors}                                 *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psSort{Free float vectors} | tst_psSort_01.c)
+
Index: /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psSort_02.stdout
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psSort_02.stdout	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psSort_02.stdout	(revision 22331)
@@ -0,0 +1,37 @@
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psSort_02.c                                            *
+*            TestPoint: psSort{Create vectors}                                     *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+arr[0] = 7.000000
+arr[1] = 9.000000
+arr[2] = 3.000000
+arr[3] = 1.000000
+arr[4] = 5.000000
+
+---> TESTPOINT PASSED (psSort{Create vectors} | tst_psSort_02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psSort_02.c                                            *
+*            TestPoint: psSort{Create sorted index vector}                         *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+arr[0] = 3
+arr[1] = 2
+arr[2] = 4
+arr[3] = 0
+arr[4] = 1
+
+---> TESTPOINT PASSED (psSort{Create sorted index vector} | tst_psSort_02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psSort_02.c                                            *
+*            TestPoint: psSort{Free vectors}                                       *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psSort{Free vectors} | tst_psSort_02.c)
+
Index: /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psSort_03.stderr
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psSort_03.stderr	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psSort_03.stderr	(revision 22331)
@@ -0,0 +1,1 @@
+ <DATE> <TIME> |<HOST>|E|         psSort| : Line 137 - Input and output vector sizes are not equal: in=5 out=6
Index: /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psSort_03.stdout
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psSort_03.stdout	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psSort_03.stdout	(revision 22331)
@@ -0,0 +1,34 @@
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psSort_03.c                                            *
+*            TestPoint: psSort{Create float vectors of different sizes}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+arr[0] = 0.000000
+arr[1] = 0.000000
+arr[2] = 0.000000
+arr[3] = 0.000000
+arr[4] = 0.000000
+
+---> TESTPOINT PASSED (psSort{Create float vectors of different sizes} | tst_psSort_03.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psSort_03.c                                            *
+*            TestPoint: psSort{Sort float vector}                                  *
+*             TestType: Negative                                                   *
+*    ExpectedErrorText: Input and output vector sizes are not equal                *
+*  ExpectedStatusValue: 0                                                          *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psSort{Sort float vector} | tst_psSort_03.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psSort_03.c                                            *
+*            TestPoint: psSort{Free float vectors}                                 *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psSort{Free float vectors} | tst_psSort_03.c)
+
Index: /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psSort_04.stderr
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psSort_04.stderr	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psSort_04.stderr	(revision 22331)
@@ -0,0 +1,1 @@
+ <DATE> <TIME> |<HOST>|E|         psSort| : Line 119 - Null input vector
Index: /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psSort_04.stdout
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psSort_04.stdout	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psSort_04.stdout	(revision 22331)
@@ -0,0 +1,20 @@
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psSort_04.c                                            *
+*            TestPoint: psSort{Attempt to sort with null input vector}             *
+*             TestType: Negative                                                   *
+*    ExpectedErrorText: Null input vector                                          *
+*  ExpectedStatusValue: 0                                                          *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psSort{Attempt to sort with null input vector} | tst_psSort_04.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psSort_04.c                                            *
+*            TestPoint: psSort{Free vectors}                                       *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psSort{Free arays} | tst_psSort_04.c)
+
Index: /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psVector.stderr
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psVector.stderr	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psVector.stderr	(revision 22331)
@@ -0,0 +1,6 @@
+<DATE><TIME>|<HOST>|I|main
+    Following should be an error message.
+<DATE><TIME>|<HOST>|I|main
+    Following should be an error message.
+<DATE><TIME>|<HOST>|E|psVectorRealloc (FILE:LINENO)
+    psVectorRealloc must a given a non-NULL psVector to resize.  Desired datatype unknown.
Index: /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psVector.stdout
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psVector.stdout	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psVector.stdout	(revision 22331)
@@ -0,0 +1,92 @@
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psVector.c                                             *
+*            TestPoint: psVector{Create S32 vector}                                *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Vector size = 5
+Vector type = 260
+Vector dimen = 1
+
+---> TESTPOINT PASSED (psVector{Create S32 vector} | tst_psVector.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psVector.c                                             *
+*            TestPoint: psVector{Add data to S32 vector}                           *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Elem 0 = 0
+Elem 1 = 10
+Elem 2 = 20
+Elem 3 = 30
+Elem 4 = 40
+Vector size = 5
+Vector population = 5
+
+---> TESTPOINT PASSED (psVector{Add data to S32 vector} | tst_psVector.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psVector.c                                             *
+*            TestPoint: psVector{Reallocate S32 vector bigger}                     *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Adding more elements to S32 vector...
+Elem 5 = 50
+Elem 6 = 60
+Elem 7 = 70
+Elem 8 = 80
+Elem 9 = 90
+Vector size = 10
+Vector population = 10
+
+---> TESTPOINT PASSED (psVector{Reallocate S32 vector bigger} | tst_psVector.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psVector.c                                             *
+*            TestPoint: psVector{Reallocate S32 vector smaller}                    *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Vector size = 3
+Elem 0 = 0
+Elem 1 = 10
+Elem 2 = 20
+Vector size = 3
+Vector population = 3
+
+---> TESTPOINT PASSED (psVector{Reallocate integer S32 smaller} | tst_psVector.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psVector.c                                             *
+*            TestPoint: psVector{Free S32 vector}                                  *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psVector{Free S32 vector} | tst_psVector.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psVector.c                                             *
+*            TestPoint: psVector{Attempt to create a S32 vector with zero size}    *
+*             TestType: Negative                                                   *
+*    ExpectedErrorText: Invalid value for nalloc                                   *
+*  ExpectedStatusValue: 0                                                          *
+\**********************************************************************************/
+
+ERROR: Return is not NULL
+
+---> TESTPOINT PASSED (psVector{Attempt to create a S32 vector with zero size} | tst_psVector.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psVector.c                                             *
+*            TestPoint: psVector{Attempt to realloc a null S32 vector}             *
+*             TestType: Negative                                                   *
+*    ExpectedErrorText: Null input vector                                          *
+*  ExpectedStatusValue: 0                                                          *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psVector{Attempt to realloc a null S32 vector} | tst_psVector.c)
+
Index: /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psVectorSort_01.stderr
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psVectorSort_01.stderr	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psVectorSort_01.stderr	(revision 22331)
@@ -0,0 +1,4 @@
+<DATE><TIME>|<HOST>|I|main
+    Following should generate an error messgae
+<DATE><TIME>|<HOST>|E|psVectorSort (FILE:LINENO)
+    Input psVector is an unsupported type (0x1301).
Index: /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psVectorSort_01.stdout
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psVectorSort_01.stdout	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psVectorSort_01.stdout	(revision 22331)
@@ -0,0 +1,45 @@
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psVectorSort_01.c                                      *
+*            TestPoint: psVectorSort{Sort all types}                               *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psVectorSort{Sort all types} | tst_psVectorSort_01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psVectorSort_01.c                                      *
+*            TestPoint: psVectorSort{Sort input float vector into itself}          *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psVectorSort{Sort input float vector into itself} | tst_psVectorSort_01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psVectorSort_01.c                                      *
+*            TestPoint: psVectorSort{Invalid vector type}                          *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psVectorSort{Invalid vector type} | tst_psVectorSort_01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psVectorSort_01.c                                      *
+*            TestPoint: psVectorSort{Sort zero element vector}                     *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psVectorSort{Sort zero element vector} | tst_psVectorSort_01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psVectorSort_01.c                                      *
+*            TestPoint: psVectorSort{Free float vectors}                           *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psVectorSort{Free float vectors} | tst_psVectorSort_01.c)
+
Index: /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psVectorSort_02.stderr
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psVectorSort_02.stderr	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psVectorSort_02.stderr	(revision 22331)
@@ -0,0 +1,8 @@
+<DATE><TIME>|<HOST>|I|main
+    Following should generate an error message
+<DATE><TIME>|<HOST>|E|psVectorSortIndex (FILE:LINENO)
+    psVectorSort can not sort a NULL psVector.
+<DATE><TIME>|<HOST>|I|main
+    Following should generate two error messages(psVectorSort,psVectorSortIndex)
+<DATE><TIME>|<HOST>|E|psVectorSortIndex (FILE:LINENO)
+    Input psVector is an unsupported type (0x1301).
Index: /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psVectorSort_02.stdout
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psVectorSort_02.stdout	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psVectorSort_02.stdout	(revision 22331)
@@ -0,0 +1,54 @@
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psVectorSort_02.c                                      *
+*            TestPoint: psVectorSortIndex{Sort by index for all types}             *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psVectorSortIndex{Sort by index for all types} | tst_psVectorSort_02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psVectorSort_02.c                                      *
+*            TestPoint: psVectorSortIndex{Attempt to sort with NULL input}         *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psVectorSortIndex{Attempt to sort with NULL input} | tst_psVectorSort_02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psVectorSort_02.c                                      *
+*            TestPoint: psVectorSortIndex{Sort with resize output vector}          *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psVectorSortIndex{Sort with resize output vector} | tst_psVectorSort_02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psVectorSort_02.c                                      *
+*            TestPoint: psVectorSortIndex{Sort with input vector with zero elements} *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psVectorSortIndex{Sort with input vector with zero elements} | tst_psVectorSort_02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psVectorSort_02.c                                      *
+*            TestPoint: psVectorSortIndex{Attempt to sort with invalid type}       *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psVectorSortIndex{Attempt to sort with invalid type} | tst_psVectorSort_02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psVectorSort_02.c                                      *
+*            TestPoint: psVectorSortIndex{Free vectors}                            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psVectorSort{Free vectors} | tst_psVectorSort_02.c)
+
Index: /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psVectorSort_03.stdout
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psVectorSort_03.stdout	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psVectorSort_03.stdout	(revision 22331)
@@ -0,0 +1,59 @@
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psVectorSort_03.c                                      *
+*            TestPoint: psVectorSort{Create float vectors of different sizes}      *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+arr[0] = 0.000000
+arr[1] = 0.000000
+arr[2] = 0.000000
+arr[3] = 0.000000
+arr[4] = 0.000000
+
+---> TESTPOINT PASSED (psVectorSort{Create float vectors of different sizes} | tst_psVectorSort_03.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psVectorSort_03.c                                      *
+*            TestPoint: psVectorSort{Sort float vector}                            *
+*             TestType: Negative                                                   *
+*    ExpectedErrorText: Input and output vector sizes are not equal                *
+*  ExpectedStatusValue: 0                                                          *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psVectorSort{Sort float vector} | tst_psVectorSort_03.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psVectorSort_03.c                                      *
+*            TestPoint: psVectorSort{Create float & double vectors of same size}   *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+vec[0] = 0.000000
+vec[1] = 0.000000
+vec[2] = 0.000000
+vec[3] = 0.000000
+vec[4] = 0.000000
+
+---> TESTPOINT PASSED (psVectorSort{Create float and double vectors same size} | tst_psVectorSort_03.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psVectorSort_03.c                                      *
+*            TestPoint: psVectorSort{Sort F32/F64 vector}                          *
+*             TestType: Negative                                                   *
+*    ExpectedErrorText: Input and output vector different types                    *
+*  ExpectedStatusValue: 0                                                          *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psVectorSort{Sort float vector} | tst_psVectorSort_03.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psVectorSort_03.c                                      *
+*            TestPoint: psVectorSort{Free float vectors}                           *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psVectorSort{Free float vectors} | tst_psVectorSort_03.c)
+
Index: /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psVectorSort_04.stderr
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psVectorSort_04.stderr	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psVectorSort_04.stderr	(revision 22331)
@@ -0,0 +1,2 @@
+<DATE><TIME>|<HOST>|E|psVectorSort (FILE:LINENO)
+    psVectorSort can not sort a NULL psVector.
Index: /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psVectorSort_04.stdout
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psVectorSort_04.stdout	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psVectorSort_04.stdout	(revision 22331)
@@ -0,0 +1,20 @@
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psVectorSort_04.c                                      *
+*            TestPoint: psVectorSort{Attempt to sort with null input vector}       *
+*             TestType: Negative                                                   *
+*    ExpectedErrorText: Null input vector                                          *
+*  ExpectedStatusValue: 0                                                          *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psVectorSort{Attempt to sort with null input vector} | tst_psVectorSort_04.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psVectorSort_04.c                                      *
+*            TestPoint: psVectorSort{Free vectors}                                 *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psVectorSort{Free arays} | tst_psVectorSort_04.c)
+
Index: /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psVector_01.stderr
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psVector_01.stderr	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psVector_01.stderr	(revision 22331)
@@ -0,0 +1,2 @@
+ <DATE> <TIME> |<HOST>|E|  psVectorAlloc|Invalid value for nalloc. nalloc: 0
+ <DATE> <TIME> |<HOST>|E|psVectorRealloc|Null input vector
Index: /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psVector_01.stdout
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psVector_01.stdout	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psVector_01.stdout	(revision 22331)
@@ -0,0 +1,91 @@
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psVector_01.c                                          *
+*            TestPoint: psVector{Create S32 vector}                                *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Vector size = 5
+Vector type = 260
+Vector dimen = 1
+
+---> TESTPOINT PASSED (psVector{Create S32 vector} | tst_psVector_01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psVector_01.c                                          *
+*            TestPoint: psVector{Add data to S32 vector}                           *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Elem 0 = 0
+Elem 1 = 10
+Elem 2 = 20
+Elem 3 = 30
+Elem 4 = 40
+Vector size = 5
+Vector population = 5
+
+---> TESTPOINT PASSED (psVector{Add data to S32 vector} | tst_psVector_01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psVector_01.c                                          *
+*            TestPoint: psVector{Reallocate S32 vector bigger}                     *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Adding more elements to S32 vector...
+Elem 5 = 50
+Elem 6 = 60
+Elem 7 = 70
+Elem 8 = 80
+Elem 9 = 90
+Vector size = 10
+Vector population = 10
+
+---> TESTPOINT PASSED (psVector{Reallocate S32 vector bigger} | tst_psVector_01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psVector_01.c                                          *
+*            TestPoint: psVector{Reallocate S32 vector smaller}                    *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Vector size = 3
+Elem 0 = 0
+Elem 1 = 10
+Elem 2 = 20
+Vector size = 3
+Vector population = 3
+
+---> TESTPOINT PASSED (psVector{Reallocate integer S32 smaller} | tst_psVector_01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psVector_01.c                                          *
+*            TestPoint: psVector{Free S32 vector}                                  *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psVector{Free S32 vector} | tst_psVector_01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psVector_01.c                                          *
+*            TestPoint: psVector{Attempt to create a S32 vector with zero size}    *
+*             TestType: Negative                                                   *
+*    ExpectedErrorText: Invalid value for nalloc                                   *
+*  ExpectedStatusValue: 0                                                          *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psVector{Attempt to create a S32 vector with zero size} | tst_psVector_01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psVector_01.c                                          *
+*            TestPoint: psVector{Attempt to realloc a null S32 vector}             *
+*             TestType: Negative                                                   *
+*    ExpectedErrorText: Null input vector                                          *
+*  ExpectedStatusValue: 0                                                          *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psVector{Attempt to realloc a null S32 vector} | tst_psVector_01.c)
+
Index: /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psVector_02.stdout
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psVector_02.stdout	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psVector_02.stdout	(revision 22331)
@@ -0,0 +1,73 @@
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psVector_02.c                                          *
+*            TestPoint: psVector{Create void pointer vector}                       *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Vector size = 5
+Vector type = 0
+Vector dimen = 1
+
+---> TESTPOINT PASSED (psVector{Create void pointer vector} | tst_psVector_02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psVector_02.c                                          *
+*            TestPoint: psVector{Add data to void pointer vector}                  *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+ts[0].x = 0 ts[0].y = 0.00
+ts[1].x = 10 ts[1].y = 10.10
+ts[2].x = 20 ts[2].y = 20.20
+ts[3].x = 30 ts[3].y = 30.30
+ts[4].x = 40 ts[4].y = 40.40
+Vector size = 5
+Vector population = 5
+
+---> TESTPOINT PASSED (psVector{Add data to void pointer vector} | tst_psVector_02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psVector_02.c                                          *
+*            TestPoint: psVector{Reallocate void pointer vector bigger}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Adding more elements to void pointer vector...
+ts[0].x = 0 ts[0].y = 0.00
+ts[1].x = 10 ts[1].y = 10.10
+ts[2].x = 20 ts[2].y = 20.20
+ts[3].x = 30 ts[3].y = 30.30
+ts[4].x = 40 ts[4].y = 40.40
+ts[5].x = 50 ts[5].y = 50.50
+ts[6].x = 60 ts[6].y = 60.60
+ts[7].x = 70 ts[7].y = 70.70
+ts[8].x = 80 ts[8].y = 80.80
+ts[9].x = 90 ts[9].y = 90.90
+Vector size = 10
+Vector population = 10
+
+---> TESTPOINT PASSED (psVector{Reallocate void pointer vector bigger} | tst_psVector_02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psVector_02.c                                          *
+*            TestPoint: psVector{Reallocate void pointer vector smaller}           *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+ts[0].x = 0 ts[0].y = 0.00
+ts[1].x = 10 ts[1].y = 10.10
+ts[2].x = 20 ts[2].y = 20.20
+Vector size = 3
+Vector population = 3
+
+---> TESTPOINT PASSED (psVector{Reallocate integer void pointer smaller} | tst_psVector_02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psVector_02.c                                          *
+*            TestPoint: psVector{Free void pointer vector}                         *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psVector{Free void pointer vector} | tst_psVector_02.c)
+
Index: /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psVector_03.stdout
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psVector_03.stdout	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/collections/verified/tst_psVector_03.stdout	(revision 22331)
@@ -0,0 +1,73 @@
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psVector_03.c                                          *
+*            TestPoint: psVector{Create void pointer vector}                       *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Vector size = 5
+Vector type = 0
+Vector dimen = 1
+
+---> TESTPOINT PASSED (psVector{Create void pointer vector} | tst_psVector_03.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psVector_03.c                                          *
+*            TestPoint: psVector{Add data to void pointer vector}                  *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+ts[0].x = 0 ts[0].y = 0.00
+ts[1].x = 10 ts[1].y = 10.10
+ts[2].x = 20 ts[2].y = 20.20
+ts[3].x = 30 ts[3].y = 30.30
+ts[4].x = 40 ts[4].y = 40.40
+Vector size = 5
+Vector population = 5
+
+---> TESTPOINT PASSED (psVector{Add data to void pointer vector} | tst_psVector_03.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psVector_03.c                                          *
+*            TestPoint: psVector{Reallocate void pointer vector bigger}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Adding more elements to void pointer vector...
+ts[0].x = 0 ts[0].y = 0.00
+ts[1].x = 10 ts[1].y = 10.10
+ts[2].x = 20 ts[2].y = 20.20
+ts[3].x = 30 ts[3].y = 30.30
+ts[4].x = 40 ts[4].y = 40.40
+ts[5].x = 50 ts[5].y = 50.50
+ts[6].x = 60 ts[6].y = 60.60
+ts[7].x = 70 ts[7].y = 70.70
+ts[8].x = 80 ts[8].y = 80.80
+ts[9].x = 90 ts[9].y = 90.90
+Vector size = 10
+Vector population = 10
+
+---> TESTPOINT PASSED (psVector{Reallocate void pointer vector bigger} | tst_psVector_03.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psVector_03.c                                          *
+*            TestPoint: psVector{Reallocate void pointer vector smaller}           *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+ts[0].x = 0 ts[0].y = 0.00
+ts[1].x = 10 ts[1].y = 10.10
+ts[2].x = 20 ts[2].y = 20.20
+Vector size = 3
+Vector population = 3
+
+---> TESTPOINT PASSED (psVector{Reallocate integer void pointer smaller} | tst_psVector_03.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psVector_03.c                                          *
+*            TestPoint: psVector{Free void pointer array with function callback}   *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psVector{Free void pointer array with function callback} | tst_psVector_03.c)
+
Index: /tags/ipp-1-X/bug123/psLib/test/dataIO/.cvsignore
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/dataIO/.cvsignore	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/dataIO/.cvsignore	(revision 22331)
@@ -0,0 +1,17 @@
+.deps
+.libs
+Makefile
+Makefile.in
+tmpImages
+temp
+tst_psLookupTable_01
+tst_psDB
+tst_psFits
+multi.fits
+table.fits
+table10.dat
+table2.dat
+table3.dat
+tableF32.dat
+tableU8.dat
+tableS32.dat
Index: /tags/ipp-1-X/bug123/psLib/test/dataIO/Makefile.am
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/dataIO/Makefile.am	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/dataIO/Makefile.am	(revision 22331)
@@ -0,0 +1,42 @@
+#Makefile for dataIO functions of psLib
+#
+EXTRA_DIST = verified
+
+EXTRA_PROGRAMS = tst_psDB
+
+INCLUDES = \
+	-I$(top_srcdir)/src \
+	-I$(top_srcdir)/src/astronomy \
+	-I$(top_srcdir)/src/collections \
+	-I$(top_srcdir)/src/dataManip \
+	-I$(top_srcdir)/src/dataIO \
+	-I$(top_srcdir)/src/image \
+	-I$(top_srcdir)/src/sysUtils \
+	$(all_includes)
+
+AM_LDFLAGS = -L$(top_builddir)/src -lpslib $(PSLIB_LIBS)
+AM_CFLAGS = -DUTC_DAT_FILE="\"$(top_srcdir)/share/pslib/tai_utc.dat\""
+
+TESTS = \
+	tst_psLookupTable_01 \
+	tst_psFits \
+	@TST_PSDB@
+
+check_PROGRAMS = $(TESTS)
+
+check_DATA = table10.dat table2.dat table3.dat tableF32.dat tableS32.dat tableU8.dat
+
+TESTS_ENVIRONMENT = perl $(top_srcdir)/test/runTest -verified=$(srcdir)/verified 
+
+tests: $(check_DATA) $(TESTS)
+
+CLEANFILES = $(TESTS) $(check_DATA) multi.fits table.fits temp/*
+
+tst_psLookupTable_01_SOURCES =  tst_psLookupTable_01.c
+tst_psFits_SOURCES =  tst_psFits.c
+tst_psDB_SOURCES = tst_psDB.c
+
+%.dat: verified/%.dat
+	cp $? $@
+
+test: check
Index: /tags/ipp-1-X/bug123/psLib/test/dataIO/tst_psDB.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/dataIO/tst_psDB.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/dataIO/tst_psDB.c	(revision 22331)
@@ -0,0 +1,893 @@
+/** @file  tst_psDB.c
+ *
+ * -*- mode: C; c-basic-indent: 4; tab-width: 8; indent-tabs-mode: nil -*-
+ * vim: set cindent ts=8 sw=4 expandtab:
+ *
+ *  @brief Contains the tests for psDB.[ch]
+ *
+ *
+ *  @author Aaron Culliney, MHPCC
+ *
+ *  @version $Revision: 1.7 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-04-07 20:27:41 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ *
+ */
+
+#include <unistd.h>
+#include <sys/wait.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <limits.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "psTest.h"
+#include "pslib_strict.h"
+
+#define STR_1 "hello world!"
+#define STR_2 "foobar"
+#define S32_1 1974
+#define S32_2 -18
+#define F32_1 3.14159
+#define F32_2 3.33
+#define F64_1 2.7182818
+#define F64_2 1.23456789
+
+static psDB *_init_psDB( void );
+static psMetadata *_get_CreateTableMetadata( void );
+static psMetadata *_get_RowMetadataValues(const char *val0, psS32 val1, psF32 val2, psF64 val3);
+static psMetadata *_get_RowMetadata(
+    const char *key0, const char *comm0, const char *val0,
+    const char *key1, const char *comm1, psS32 val1,
+    const char *key2, const char *comm2, psF32 val2,
+    const char *key3, const char *comm3, psF64 val3);
+static psMetadata *_get_row( void );
+static psMetadata *_get_where( void );
+static psMetadata *_get_update_values(const char *val0, psS32 val1, psF32 val2, psF64 val3);
+static void _print_row( psMetadata *row );
+
+//static psS32 TPDBCreate( void );
+//static psS32 TPDBDrop( void );
+static psS32 TPDBInit( void );
+static psS32 TPDBChange( void );
+static psS32 TPDBCreateTable( void );
+static psS32 TPDBDropTable( void );
+static psS32 TPDBSelectColumn( void );
+static psS32 TPDBSelectColumnNum( void );
+static psS32 TPDBSelectRows( void );
+static psS32 TPDBInsertOneRow( void );
+static psS32 TPDBInsertRows( void );
+static psS32 TPDBDumpRows( void );
+static psS32 TPDBDumpCols( void );
+static psS32 TPDBUpdateRows( void );
+static psS32 TPDBDeleteRows( void );
+
+testDescription tests[] = {
+                              {TPDBInit,            -1,  "dbInit",            0, false},
+                              {TPDBChange,          -2,  "dbChange",          0, false},
+                              {TPDBCreateTable,     -3,  "dbCreateTable",     0, false},
+                              {TPDBDropTable,       -4,  "dbDropTable",       0, false},
+                              {TPDBSelectColumn,    -5,  "dbSelectColumn",    0, false},
+                              {TPDBSelectColumnNum, -6,  "dbSelectColumnNum", 0, false},
+                              {TPDBSelectRows,      -7,  "dbSelectRows",      0, false},
+                              {TPDBInsertOneRow,    -8,  "dbInsertOneRow",    0, false},
+                              {TPDBInsertRows,      -9,  "dbInsertRows",      0, false},
+                              {TPDBDumpRows,        -10, "dbDumpRows",        0, false},
+                              {TPDBDumpCols,        -11, "dbDumpCols",        0, false},
+                              {TPDBUpdateRows,      -12, "dbUpdateRows",      0, false},
+                              {TPDBDeleteRows,      -13, "dbDeleteRows",      0, false},
+                              //{TPDBCreate,        -14, "dbCreate",          0, false},
+                              //{TPDBDrop,          -15, "dbDrop",            0, false},
+                              {NULL}
+                          };
+
+static const char *host    = "localhost";
+static const char *user    = "test";
+static const char *passwd  = "";
+static const char *dbname  = "test";
+
+// internal method to initialize DB
+psDB *_init_psDB( void )
+{
+    psDB *dbh = NULL;
+
+    psLogMsg( __func__, PS_LOG_INFO, "initialize database connection...\n" );
+
+    dbh = psDBInit(host, user, passwd, dbname);
+    if (dbh == NULL) {
+        psError(PS_ERR_UNKNOWN, true, "could not initialize DB connection in %s!", __func__ );
+    }
+
+    return dbh;
+}
+
+psMetadata *_get_CreateTableMetadata( void )
+{
+    return _get_RowMetadata(
+               "key_string", "comment-string", "90000",  // XXX value used to determine size of field ...
+               "key_s32",    "comment-s32",     0,       // NOTE: values unused here
+               "key_f32",    "comment-f32",     0.0,
+               "key_f64",    "comment-f64",     0.0);
+}
+
+psMetadata *_get_RowMetadataValues(const char *val0, psS32 val1, psF32 val2, psF64 val3)
+{
+    return _get_RowMetadata(
+               "key_string", "comment-string", val0,
+               "key_s32",    "comment-s32",    val1,
+               "key_f32",    "comment-f32",    val2,
+               "key_f64",    "comment-f64",    val3);
+}
+
+psMetadata *_get_RowMetadata(
+    const char *key0, const char *comm0, const char *val0,
+    const char *key1, const char *comm1, psS32 val1,
+    const char *key2, const char *comm2, psF32 val2,
+    const char *key3, const char *comm3, psF64 val3)
+{
+    psMetadata *md = NULL;
+    psMetadataItem *str=NULL, *s32=NULL, *f32=NULL, *f64=NULL;
+
+    md = psMetadataAlloc();
+    if (md == NULL) {
+        psError(PS_ERR_UNKNOWN, true, "could not create psMetadata in %s!", __func__ );
+        return NULL;
+    }
+    if (key0 != NULL) {
+        str = psMetadataItemAllocStr(key0, comm0, val0);
+    }
+    s32 = psMetadataItemAllocS32(key1, comm1, val1);
+    f32 = psMetadataItemAllocF32(key2, comm2, val2);
+    f64 = psMetadataItemAllocF64(key3, comm3, val3);
+    if ( ((key0 != NULL) && (str == NULL)) || (s32 == NULL) || (f32 == NULL) || (f64 == NULL)) {
+        psError(PS_ERR_UNKNOWN, true, "could not create psMetadataItem(s) in %s!", __func__ );
+        return NULL;
+    }
+    if ( ((key0 != NULL) && !psMetadataAddItem(md, str, 0, 0)) || !psMetadataAddItem(md, s32, 0, 0) ||
+            !psMetadataAddItem(md, f32, 0, 0) || !psMetadataAddItem(md, f64, 0, 0)) {
+        psError(PS_ERR_UNKNOWN, true, "could not add psMetadataItem(s) to psMetadata in %s!", __func__ );
+        return NULL;
+    }
+
+    if (str != NULL) {
+        psFree(str);
+    }
+    psFree(s32);
+    psFree(f32);
+    psFree(f64);
+
+    return md;
+}
+
+psMetadata *_get_row( void )
+{
+    return _get_RowMetadata(
+               "key_string", "comment-string", STR_1,
+               "key_s32",    "comment-s32",    S32_1,
+               "key_f32",    "comment-f32",    F32_1,
+               "key_f64",    "comment-f64",    F64_1);
+}
+
+psMetadata *_get_where( void )
+{
+    psMetadata *md = NULL;
+    psMetadataItem *s32=NULL;
+
+    md = psMetadataAlloc();
+    if (md == NULL) {
+        psError(PS_ERR_UNKNOWN, true, "could not create psMetadata in %s!", __func__ );
+        return NULL;
+    }
+    s32 = psMetadataItemAllocS32("key_s32", "", S32_1);
+    if (s32 == NULL) {
+        psError(PS_ERR_UNKNOWN, true, "could not create psMetadataItem in %s!", __func__ );
+        return NULL;
+    }
+    if (!psMetadataAddItem(md, s32, 0, 0)) {
+        psError(PS_ERR_UNKNOWN, true, "could not add psMetadataItem(s) to psMetadata in %s!", __func__ );
+        return NULL;
+    }
+
+    psFree(s32);
+    return md;
+}
+
+psMetadata *_get_update_values(const char *val0, psS32 val1, psF32 val2, psF64 val3)
+{
+    return _get_RowMetadataValues(val0, val1, val2, val3);
+}
+
+void _print_row( psMetadata *row )
+{
+    psMetadataIterator *iter=NULL;
+    psMetadataItem *item=NULL;
+
+    iter = psMetadataIteratorAlloc(row, 0, NULL);
+    while ((item = psMetadataGetAndIncrement(iter)) != NULL) {
+        if (item->type == PS_META_STR) {
+            psLogMsg( __func__, PS_LOG_INFO, "[%s]=[%s]\n", item->name, item->data.V );
+        } else if (item->type == PS_META_S32) {
+            psLogMsg( __func__, PS_LOG_INFO, "[%s]=[%d]\n", item->name, item->data.S32 );
+        } else if (item->type == PS_META_F32) {
+            psLogMsg( __func__, PS_LOG_INFO, "[%s]=[%g]\n", item->name, item->data.F32 );
+        } else if (item->type == PS_META_F64) {
+            psLogMsg( __func__, PS_LOG_INFO, "[%s]=[%g]\n", item->name, item->data.F64 );
+        }
+    }
+
+    psFree(iter);
+}
+
+psS32 main(psS32 argc, char* argv[])
+{
+    psLogSetLevel( PS_LOG_INFO );
+
+    return ( ! runTestSuite( stderr, "psDB", tests, argc, argv ) );
+}
+
+// Testpoint #XXX, initialize/break-down MySQL connection.
+psS32 TPDBInit( void )
+{
+    psS32 failed = 0;
+    psDB *dbh = NULL;
+
+    psLogMsg( __func__, PS_LOG_INFO, "psDBInit/psDBCleanup shall initialize/cleanup database connection.\n" );
+
+    dbh = _init_psDB();
+    if (dbh == NULL) {
+        return 1;
+    }
+
+    psDBCleanup(dbh);
+
+    return failed;
+}
+
+// Testpoint #XXX, psDBChange shall change databases.
+psS32 TPDBChange( void )
+{
+    psS32 failed = 0;
+    psDB *dbh = NULL;
+
+    dbh = _init_psDB();
+    if (dbh == NULL) {
+        return 1;
+    }
+
+    psLogMsg( __func__, PS_LOG_INFO, "psDBChange shall change to a new test database.\n" );
+
+    failed = ! psDBChange(dbh, dbname);
+
+    psDBCleanup(dbh);
+
+    return failed;
+}
+
+// Testpoint #XXX, psDBCreateTable shall create tables in the test database ...
+psS32 TPDBCreateTable( void )
+{
+    psS32 failed = 0;
+    psDB *dbh = NULL;
+    const char* table = "table1";
+    psMetadata *md = _get_CreateTableMetadata();
+
+    dbh = _init_psDB();
+    if (dbh == NULL) {
+        return 1;
+    }
+
+    psLogMsg( __func__, PS_LOG_INFO, "psDBCreateTable shall create a new table in the new test database.\n" );
+
+    failed = ! psDBCreateTable(dbh, table, md);
+    if (!failed) {
+        psDBDropTable(dbh, table);
+    }
+
+    psFree(md);
+    psDBCleanup(dbh);
+
+    return failed;
+}
+
+// Testpoint #XXX, psDBDropTable shall create tables in the test database ...
+psS32 TPDBDropTable( void )
+{
+    psS32 failed = 0;
+    psDB *dbh = NULL;
+    const char* table = "table2";
+    psMetadata *row=NULL, *md = _get_CreateTableMetadata();
+
+    dbh = _init_psDB();
+    if (dbh == NULL) {
+        return 1;
+    }
+
+    psLogMsg( __func__, PS_LOG_INFO, "psDBDropTable shall create/drop a new table in the new test database.\n" );
+
+    failed = ! psDBCreateTable(dbh, table, md);
+    if (!failed) {
+        failed = ! psDBDropTable(dbh, table);
+
+        // insert should fail ...
+        psLogMsg( __func__, PS_LOG_INFO, "psDBDropTable: insert should fail here...\n" );
+        row = _get_row();
+        if (psDBInsertOneRow(dbh, table, row)) {
+            psLogMsg( __func__, PS_LOG_INFO, "oops, insert unexpectedly succeeded!\n" );
+            failed = 1;
+        }
+        psFree(row);
+    }
+
+    psFree(md);
+    psDBCleanup(dbh);
+
+    return failed;
+}
+
+// Testpoint #XXX, TPDBSelectColumn shall write/select a column from a test table ...
+psS32 TPDBSelectColumn( void )
+{
+    psS32 failed = 0;
+    psDB *dbh = NULL;
+    const char* table = "table3";
+    psArray *ary = NULL;
+    psMetadata *row=NULL, *md = _get_CreateTableMetadata();
+    char *ptr=NULL;
+
+    dbh = _init_psDB();
+    if (dbh == NULL) {
+        return 1;
+    }
+
+    psLogMsg( __func__, PS_LOG_INFO, "psDBSelectColumn shall select data from a test table.\n" );
+
+    failed = ! psDBCreateTable(dbh, table, md);
+    if (!failed) {
+
+        row = _get_row();
+        psDBInsertOneRow(dbh, table, row);
+        psFree(row);
+
+        row = _get_row();
+        psDBInsertOneRow(dbh, table, row);
+        psFree(row);
+
+        row = _get_row();
+        psDBInsertOneRow(dbh, table, row);
+        psFree(row);
+
+        ary = psDBSelectColumn(dbh, table, "key_string", 0);
+        if (ary == NULL) {
+            failed = 1;
+        } else {
+            ptr = psArrayGet(ary, 0);
+            psLogMsg( __func__, PS_LOG_INFO, "psDBSelectColumn: [%s]\n", ptr );
+
+            ptr = psArrayGet(ary, 1);
+            psLogMsg( __func__, PS_LOG_INFO, "psDBSelectColumn: [%s]\n", ptr );
+
+            ptr = psArrayGet(ary, 2);
+            psLogMsg( __func__, PS_LOG_INFO, "psDBSelectColumn: [%s]\n", ptr );
+
+            if (strcmp(ptr, STR_1)) {
+                psLogMsg( __func__, PS_LOG_INFO, "oops, did not find expected string output!\n" );
+                failed = 1;
+            } else {
+                psLogMsg( __func__, PS_LOG_INFO, "found expected string output.\n" );
+            }
+
+            psFree(ary);
+        }
+        psDBDropTable(dbh, table);
+    }
+
+    psFree(md);
+    psDBCleanup(dbh);
+
+    return failed;
+}
+
+// Testpoint #XXX, TPDBSelectColumnNum shall write/select a column from a test table ...
+psS32 TPDBSelectColumnNum( void )
+{
+    psS32 failed = 0;
+    psDB *dbh = NULL;
+    const char* table = "table4";
+    psVector *vec = NULL;
+    psMetadata *row=NULL, *md = _get_CreateTableMetadata();
+
+    dbh = _init_psDB();
+    if (dbh == NULL) {
+        return 1;
+    }
+
+    psLogMsg( __func__, PS_LOG_INFO, "psDBSelectColumnNum shall select data from a test table.\n" );
+
+    failed = ! psDBCreateTable(dbh, table, md);
+    if (!failed) {
+
+        row = _get_row();
+        psDBInsertOneRow(dbh, table, row);
+        psFree(row);
+
+        row = _get_row();
+        psDBInsertOneRow(dbh, table, row);
+        psFree(row);
+
+        row = _get_row();
+        psDBInsertOneRow(dbh, table, row);
+        psFree(row);
+
+        vec = psDBSelectColumnNum(dbh, table, "key_s32", PS_TYPE_S32, 0);
+        if (vec == NULL) {
+            failed = 1;
+        } else {
+            psLogMsg( __func__, PS_LOG_INFO, "str=[%d]\n", (vec->data.S32)[0] );
+            psLogMsg( __func__, PS_LOG_INFO, "str=[%d]\n", (vec->data.S32)[1] );
+            psLogMsg( __func__, PS_LOG_INFO, "str=[%d]\n", (vec->data.S32)[2] );
+            if ((vec->data.S32)[2] != S32_1) {
+                psLogMsg( __func__, PS_LOG_INFO, "oops, did not find expected S32 output!\n" );
+                failed = 1;
+            } else {
+                psLogMsg( __func__, PS_LOG_INFO, "found expected S32 output.\n" );
+            }
+            psFree(vec);
+        }
+        psDBDropTable(dbh, table);
+    }
+
+    psFree(md);
+    psDBCleanup(dbh);
+
+    return failed;
+}
+
+// Testpoint #XXX, TPDBSelectRows shall write/select data from a test table ...
+psS32 TPDBSelectRows( void )
+{
+    psS32 failed = 0;
+    psDB *dbh = NULL;
+    const char* table = "table5";
+    psArray *ary = NULL;
+    psMetadata *where=NULL, *row=NULL, *md = _get_CreateTableMetadata();
+    psMetadataItem *item = NULL;
+
+    dbh = _init_psDB();
+    if (dbh == NULL) {
+        return 1;
+    }
+
+    psLogMsg( __func__, PS_LOG_INFO, "psDBSelectRows shall select data from a test table.\n" );
+
+    failed = ! psDBCreateTable(dbh, table, md);
+    if (!failed) {
+
+        row = _get_row();
+        psDBInsertOneRow(dbh, table, row);
+        psFree(row);
+
+        row = _get_row();
+        psDBInsertOneRow(dbh, table, row);
+        psFree(row);
+
+        row = _get_row();
+        failed = ! psDBInsertOneRow(dbh, table, row);
+        psFree(row);
+
+        if (!failed) {
+            where = _get_where();
+            ary = psDBSelectRows(dbh, table, /*NULL*/where, 0);
+            psFree(where);
+            if (ary == NULL) {
+                failed = 1;
+            } else {
+                _print_row((psMetadata*)psArrayGet(ary, 0));
+                _print_row((psMetadata*)psArrayGet(ary, 1));
+                row = (psMetadata*)psArrayGet(ary, 2);
+                _print_row(row);
+
+                item = psMetadataLookup(row, "key_s32");
+                if (item == NULL) {
+                    psLogMsg( __func__, PS_LOG_INFO, "oops, key_s32 not found!\n" );
+                    failed = 1;
+                } else if (item->data.S32 != S32_1) {
+                    psLogMsg( __func__, PS_LOG_INFO, "oops, did not find expected output (%d vs %d)!\n",
+                              item->data.S32,S32_1);
+                    failed = 1;
+                } else {
+                    psLogMsg( __func__, PS_LOG_INFO, "found expected output.\n" );
+                }
+
+                psFree(ary);
+            }
+        }
+        psDBDropTable(dbh, table);
+    }
+
+    psFree(md);
+    psDBCleanup(dbh);
+
+    return failed;
+}
+
+// Testpoint #XXX, TPDBInsertOneRow shall write a row of data into a test table ...
+psS32 TPDBInsertOneRow( void )
+{
+    psS32 failed = 0;
+    psDB *dbh = NULL;
+    const char* table = "table6";
+    psMetadata *row=NULL, *md = _get_CreateTableMetadata();
+
+    dbh = _init_psDB();
+    if (dbh == NULL) {
+        return 1;
+    }
+
+    psLogMsg( __func__, PS_LOG_INFO, "psDBInsertOneRow shall insert a row into a test table.\n" );
+
+    failed = ! psDBCreateTable(dbh, table, md);
+    if (!failed) {
+        row = _get_row();
+        failed = ! psDBInsertOneRow(dbh, table, row);
+        psFree(row);
+        psDBDropTable(dbh, table);
+    }
+
+    psFree(md);
+    psDBCleanup(dbh);
+
+    return failed;
+}
+
+// Testpoint #XXX, TPDBInsertRows shall write rows of data into a test table ...
+psS32 TPDBInsertRows( void )
+{
+    psS32 failed = 0;
+    psDB *dbh = NULL;
+    const char* table = "table7";
+    psArray *rowSet = NULL;
+    psMetadata *row=NULL, *md = _get_CreateTableMetadata();
+    psMetadataItem *item=NULL;
+
+    dbh = _init_psDB();
+    if (dbh == NULL) {
+        return 1;
+    }
+
+    psLogMsg( __func__, PS_LOG_INFO, "psDBInsertRows shall insert rows into a test table.\n" );
+
+    failed = ! psDBCreateTable(dbh, table, md);
+    if (!failed) {
+        rowSet = psArrayAlloc(3);
+        rowSet->n = 0;
+
+        row = _get_row();
+        psArrayAdd(rowSet, 0, row);
+        psFree(row);
+
+        row = _get_row();
+        psArrayAdd(rowSet, 0, row);
+        psFree(row);
+
+        row = _get_row();
+        psArrayAdd(rowSet, 0, row);
+        psFree(row);
+
+        failed = ! psDBInsertRows(dbh, table, rowSet);
+        psFree(rowSet);
+
+        // extra checks ...
+        rowSet = psDBDumpRows(dbh, table);
+        if (rowSet == NULL) {
+            failed = 1;
+        } else {
+            _print_row((psMetadata*)psArrayGet(rowSet, 0));
+            _print_row((psMetadata*)psArrayGet(rowSet, 1));
+            row = (psMetadata*)psArrayGet(rowSet, 2);
+            _print_row(row);
+
+            item = psMetadataLookup(row, "key_s32");
+            if ((item == NULL) || (item->data.S32 != S32_1)) {
+                psLogMsg( __func__, PS_LOG_INFO, "oops, did not find expected output!\n" );
+                failed = 1;
+            } else {
+                psLogMsg( __func__, PS_LOG_INFO, "found expected output.\n" );
+            }
+
+            psFree(rowSet);
+        }
+
+        psDBDropTable(dbh, table);
+    }
+
+    psFree(md);
+    psDBCleanup(dbh);
+
+    return failed;
+}
+
+// Testpoint #XXX, TPDBDumpRows shall dump all rows from a test table ...
+psS32 TPDBDumpRows( void )
+{
+    psS32 failed = 0;
+    psDB *dbh = NULL;
+    const char* table = "table8";
+    psArray *ary = NULL;
+    psMetadata *row=NULL, *md = _get_CreateTableMetadata();
+    psMetadataItem *item=NULL;
+
+    dbh = _init_psDB();
+    if (dbh == NULL) {
+        return 1;
+    }
+
+    psLogMsg( __func__, PS_LOG_INFO, "psDBDumpRows shall dump all rows from a test table.\n" );
+
+    failed = ! psDBCreateTable(dbh, table, md);
+    if (!failed) {
+
+        row = _get_row();
+        psDBInsertOneRow(dbh, table, row);
+        psFree(row);
+
+        row = _get_row();
+        psDBInsertOneRow(dbh, table, row);
+        psFree(row);
+
+        row = _get_row();
+        failed = ! psDBInsertOneRow(dbh, table, row);
+        psFree(row);
+
+        if (!failed) {
+            ary = psDBDumpRows(dbh, table);
+            if (ary == NULL) {
+                failed = 1;
+            } else {
+
+                _print_row((psMetadata*)psArrayGet(ary, 0));
+                _print_row((psMetadata*)psArrayGet(ary, 1));
+                row = (psMetadata*)psArrayGet(ary, 2);
+                _print_row(row);
+
+                item = psMetadataLookup(row, "key_s32");
+                if ((item == NULL) || (item->data.S32 != S32_1)) {
+                    psLogMsg( __func__, PS_LOG_INFO, "oops, did not find expected output!\n" );
+                    failed = 1;
+                } else {
+                    psLogMsg( __func__, PS_LOG_INFO, "found expected output.\n" );
+                }
+
+                psFree(ary);
+            }
+        }
+
+        psDBDropTable(dbh, table);
+    }
+
+    psFree(md);
+    psDBCleanup(dbh);
+
+    return failed;
+}
+
+// Testpoint #XXX, TPDBDumpCols shall dump all cols from a test table ...
+psS32 TPDBDumpCols( void )
+{
+    psS32 failed = 0;
+    psDB *dbh = NULL;
+    const char* table = "table9";
+    psMetadata *meta=NULL, *md = _get_CreateTableMetadata();
+
+    dbh = _init_psDB();
+    if (dbh == NULL) {
+        return 1;
+    }
+
+    psLogMsg( __func__, PS_LOG_INFO, "psDBDumpCols shall dump all cols from a test table.\n" );
+
+    failed = ! psDBCreateTable(dbh, table, md);
+    if (!failed) {
+        meta = psDBDumpCols(dbh, table);
+        if (meta == NULL) {
+            failed = 1;
+        } else {
+            _print_row(meta);
+            psFree(meta);
+        }
+        psDBDropTable(dbh, table);
+    }
+
+    psFree(md);
+    psDBCleanup(dbh);
+
+    return failed;
+}
+
+// Testpoint #XXX, TPDBUpdateRows shall update rows in a test table ...
+psS32 TPDBUpdateRows( void )
+{
+    psS32 failed = 0;
+    psDB *dbh = NULL;
+    const char* table = "table10";
+    psArray *ary=NULL, *rowSet=NULL;
+    psMetadata *row=NULL, *where=NULL, *updates=NULL, *md = _get_CreateTableMetadata();
+    psMetadataItem *item=NULL;
+
+    dbh = _init_psDB();
+    if (dbh == NULL) {
+        return 1;
+    }
+
+    psLogMsg( __func__, PS_LOG_INFO, "psDBUpdateRows shall update rows in a test table.\n" );
+
+    failed = ! psDBCreateTable(dbh, table, md);
+    if (!failed) {
+        rowSet = psArrayAlloc(3);
+        rowSet->n = 0;
+
+        row = _get_row();
+        psArrayAdd(rowSet, 0, row);
+        psFree(row);
+
+        row = _get_row();
+        psArrayAdd(rowSet, 0, row);
+        psFree(row);
+
+        row = _get_row();
+        psArrayAdd(rowSet, 0, row);
+        psFree(row);
+
+        failed = ! psDBInsertRows(dbh, table, rowSet);
+        if (!failed) {
+            where = _get_where();
+            updates = _get_update_values(STR_2, S32_2, F32_2, F64_2);
+            failed = (psDBUpdateRows(dbh, table, where, updates) < 0);
+
+            ary = psDBDumpRows(dbh, table);
+            if (ary == NULL) {
+                failed = 1;
+            } else {
+
+                _print_row((psMetadata*)psArrayGet(ary, 0));
+                _print_row((psMetadata*)psArrayGet(ary, 1));
+                row = (psMetadata*)psArrayGet(ary, 2);
+                _print_row(row);
+
+                item = psMetadataLookup(row, "key_s32");
+                if ((item == NULL) || (item->data.S32 != S32_2)) {
+                    psLogMsg( __func__, PS_LOG_INFO, "oops, did not find expected output!\n" );
+                    failed = 1;
+                } else {
+                    psLogMsg( __func__, PS_LOG_INFO, "found expected output.\n" );
+                }
+
+                psFree(ary);
+            }
+
+            psFree(updates);
+            psFree(where);
+        }
+        psFree(rowSet);
+        psDBDropTable(dbh, table);
+    }
+
+    psFree(md);
+    psDBCleanup(dbh);
+
+    return failed;
+}
+
+// Testpoint #XXX, TPDBDeleteRows shall update rows in a test table ...
+psS32 TPDBDeleteRows( void )
+{
+    psS32 failed = 0;
+    psDB *dbh = NULL;
+    const char* table = "table11";
+    psArray *ary=NULL, *rowSet=NULL;
+    psMetadata *where=NULL, *row=NULL, *md = _get_CreateTableMetadata();
+
+    dbh = _init_psDB();
+    if (dbh == NULL) {
+        return 1;
+    }
+
+    psLogMsg( __func__, PS_LOG_INFO, "psDBDeleteRows shall delete rows from a test table.\n" );
+
+    failed = ! psDBCreateTable(dbh, table, md);
+    if (!failed) {
+        rowSet = psArrayAlloc(3);
+        rowSet->n = 0;
+
+        row = _get_row();
+        psArrayAdd(rowSet, 0, row);
+        psFree(row);
+
+        row = _get_row();
+        psArrayAdd(rowSet, 0, row);
+        psFree(row);
+
+        row = _get_row();
+        psArrayAdd(rowSet, 0, row);
+        psFree(row);
+
+        failed = ! psDBInsertRows(dbh, table, rowSet);
+        if (!failed) {
+            where = _get_where();
+            failed = (psDBDeleteRows(dbh, table, where) < 0);
+
+            ary = psDBDumpRows(dbh, table);
+            if (ary == NULL) {
+                failed = 1;
+            } else {
+                if (ary->n > 0) {
+                    psLogMsg( __func__, PS_LOG_INFO, "oops, did not delete stuff!\n" );
+                    failed = 1;
+                } else {
+                    psLogMsg( __func__, PS_LOG_INFO, "found expected empty table.\n" );
+                }
+
+                psFree(ary);
+            }
+
+            psFree(where);
+        }
+        psFree(rowSet);
+        psDBDropTable(dbh, table);
+    }
+
+    psFree(md);
+    psDBCleanup(dbh);
+
+    return failed;
+}
+
+// Testpoint #XXX, psDBCreate shall create a new test database.
+//psS32 TPDBCreate( void )
+//{
+//    const char *test_db = "ps_test_db";
+//    psS32 failed = 0;
+//    psDB *dbh = NULL;
+//
+//    dbh = _init_psDB();
+//    if (dbh == NULL) {
+//        return 1;
+//    }
+//
+//    psLogMsg( __func__, PS_LOG_INFO, "psDBCreate shall create new new test database.\n" );
+//
+//    failed = ! psDBCreate(dbh, test_db);
+//    if (!failed) {
+//        psDBDrop(dbh, test_db);
+//    }
+//
+//    psDBCleanup(dbh);
+//
+//    return failed;
+//}
+
+// Testpoint #XXX, psDBDrop shall create a new test database.
+//psS32 TPDBDrop( void )
+//{
+//    const char *test_db = "ps_test_db";
+//    psS32 failed = 0;
+//    psDB *dbh = NULL;
+//
+//    dbh = _init_psDB();
+//    if (dbh == NULL) {
+//        return 1;
+//    }
+//
+//    psLogMsg( __func__, PS_LOG_INFO, "psDBDrop shall create/drop a new new test database.\n" );
+//
+//    failed = psDBCreate(dbh, test_db);
+//    if (!failed) {
+//        failed = ! psDBDrop(dbh, test_db);
+//    }
+//
+//    psDBCleanup(dbh);
+//
+//    return failed;
+//}
+
Index: /tags/ipp-1-X/bug123/psLib/test/dataIO/tst_psFits.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/dataIO/tst_psFits.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/dataIO/tst_psFits.c	(revision 22331)
@@ -0,0 +1,1456 @@
+/** @file  tst_psFits.c
+*
+*  @brief Contains the tests for psFits.[ch]
+*
+*
+*  @author Robert DeSonia, MHPCC
+*
+*  @version $Revision: 1.24 $ $Name: not supported by cvs2svn $
+*  @date $Date: 2005-04-07 20:27:42 $
+*
+*  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+*/
+
+#include <unistd.h>
+#include <string.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+
+#include "psTest.h"
+#include "pslib_strict.h"
+
+#define GENIMAGE(img,c,r,TYP, valueFcn) \
+img = psImageAlloc(c,r,PS_TYPE_##TYP); \
+for (psU32 row=0;row<r;row++) { \
+    ps##TYP* imgRow = img->data.TYP[row]; \
+    for (psU32 col=0;col<c;col++) { \
+        imgRow[col] = (ps##TYP)(valueFcn); \
+    } \
+}
+
+static bool makeMulti(void);  // implicitly tests psFitsSetExtName
+static bool makeTable(void);
+const char* multiFilename = "multi.fits";
+const char* tableFilename = "table.fits";
+const int tableNumRows = 10;
+
+
+// N.B., the tests to Image read/write was liberally taken from the now
+// deprecated psImageReadSection/psImageWriteSection function tests.
+static psS32 testImageRead(void);
+static psS32 testImageWrite(void);
+
+static psS32 tst_psFitsAlloc( void );
+static psS32 tst_psFitsMoveExtName( void ); // also tests psFitsGetExtName
+static psS32 tst_psFitsMoveExtNum( void );  // also tests psFitsGetExtNum, psFitsGetSize
+static psS32 tst_psFitsReadHeader( void );
+static psS32 tst_psFitsReadHeaderSet( void );
+static psS32 tst_psFitsReadTable( void );
+static psS32 tst_psFitsReadTableColumnNum(void);
+static psS32 tst_psFitsReadTableColumn(void);
+static psS32 tst_psFitsUpdateTable(void);
+
+testDescription tests[] = {
+                              {tst_psFitsAlloc, 801, "psFitsAlloc", 0, false},
+                              {tst_psFitsMoveExtName, 802, "psFitsMoveExtName", 0, false},
+                              {tst_psFitsMoveExtName, 802, "psFitsGetExtName", 0, true},
+                              {tst_psFitsMoveExtNum, 803, "psFitsMoveExtNum", 0, false},
+                              {tst_psFitsMoveExtNum, 803, "psFitsGetExtNum", 0, true},
+                              {tst_psFitsMoveExtNum, 803, "psFitsGetSize", 0, true},
+                              {tst_psFitsReadHeader, 804, "psFitsReadHeader", 0, false},
+                              {tst_psFitsReadHeaderSet,805, "psFitsReadHeaderSet", 0, false},
+                              {tst_psFitsReadTable,809, "psFitsReadTable", 0, false},
+                              {tst_psFitsReadTableColumnNum,836, "psFitsReadTableColumnNum", 0, false},
+                              {tst_psFitsReadTableColumn,839, "psFitsReadTableColumn", 0, false},
+                              {tst_psFitsUpdateTable,840, "psFitsUpdateTable", 0, false},
+                              {testImageRead,567, "psFitsReadImage", 0, false},
+                              {testImageWrite,569, "psFitsWriteImage", 0, false},
+                              {NULL}
+                          };
+
+psS32 main( psS32 argc, char* argv[] )
+{
+    psLogSetLevel( PS_LOG_INFO );
+
+    return ( ! runTestSuite( stderr, "psImage", tests, argc, argv ) );
+}
+
+bool makeMulti(void)
+{
+
+    remove
+        (multiFilename);
+
+    psFits* fitsFile = psFitsAlloc(multiFilename);
+
+    if (fitsFile == NULL) {
+        psError(PS_ERR_UNKNOWN, false,
+                "Could not create 'multi' FITS file.");
+        return false;
+    }
+
+    psImage* image = psImageAlloc(16,16,PS_TYPE_F32);
+
+    char extname[80];
+    for (int lcv = 0; lcv < 8; lcv++) {
+        snprintf(extname,80,"ext-%d", lcv);
+
+        psMetadata* header = psMetadataAlloc();
+
+        psMetadataAdd(header,PS_LIST_TAIL, "MYINT",
+                      PS_META_S32,
+                      "psS32 Item", (psS32)lcv);
+
+        psMetadataAdd(header,PS_LIST_TAIL, "MYFLT",
+                      PS_META_F32,
+                      "psF32 Item", (float)(1.0f/(float)(1+lcv)));
+
+        psMetadataAdd(header,PS_LIST_TAIL, "MYDBL",
+                      PS_META_F64,
+                      "psF64 Item", (double)(1.0/(double)(1+lcv)));
+
+        psMetadataAdd(header,PS_LIST_TAIL, "MYBOOL",
+                      PS_META_BOOL,
+                      "psBool Item",
+                      (lcv%2 == 0));
+
+        psMetadataAdd(header,PS_LIST_TAIL, "MYSTR",
+                      PS_META_STR,
+                      "String Item",
+                      extname);
+
+        // set the pixels in the image
+        psBinaryOp(image,image,"=",psScalarAlloc(lcv,PS_TYPE_F32));
+        if (! psFitsWriteImage(fitsFile,header,image,1, extname) ) {
+            psError(PS_ERR_UNKNOWN, false,
+                    "Could not write image.");
+            return false;
+        }
+
+        psFree(header);
+    }
+    psFree(image);
+    psFree(fitsFile);
+
+    return true;
+}
+
+bool makeTable(void)
+{
+
+    remove
+        (tableFilename);
+
+    psFits* fitsFile = psFitsAlloc(tableFilename);
+
+    if (fitsFile == NULL) {
+        psError(PS_ERR_UNKNOWN, false,
+                "Could not create 'table' FITS file.");
+        return false;
+    }
+
+    // make the PHU an image (per FITS standard, it must be)
+    psImage* image = psImageAlloc(16,16,PS_TYPE_F32);
+
+    if (! psFitsWriteImage(fitsFile,NULL,image,1,"primary") ) {
+        psError(PS_ERR_UNKNOWN, false,
+                "Could not write PHU image.");
+        return false;
+    }
+
+    psFree(image);
+
+    // build a table structure
+    psArray* table = psArrayAlloc(tableNumRows);
+    psMetadata* header = NULL;
+    for (int row = 0; row < tableNumRows; row++) {
+        header = psMetadataAlloc();
+
+        psMetadataAdd(header,PS_LIST_TAIL, "MYINT",
+                      PS_META_S32,
+                      "psS32 Item",
+                      (psS32)row);
+
+        psMetadataAdd(header,PS_LIST_TAIL, "MYFLT",
+                      PS_META_F32,
+                      "psF32 Item",
+                      (float)(1.0f/(float)(1+row)));
+
+        psMetadataAdd(header,PS_LIST_TAIL, "MYDBL",
+                      PS_META_F64,
+                      "psF64 Item",
+                      (double)(1.0/(double)(1+row)));
+
+        psMetadataAdd(header,PS_LIST_TAIL, "MYBOOL",
+                      PS_META_BOOL,
+                      "psBool Item",
+                      (row%2 == 0));
+
+        table->data[row] = header;
+    }
+
+    psFitsWriteTable(fitsFile, NULL, table, "table-1");
+
+    psFree(table);
+    psFree(fitsFile);
+
+    return ! psMemCheckLeaks(15,NULL,stderr,false);
+}
+
+psS32 tst_psFitsAlloc( void )
+{
+
+    if (! makeMulti() ) {
+        return 1;
+    }
+
+    psFits* fitsFile = psFitsAlloc(multiFilename);
+
+    if (fitsFile == NULL) {
+        psError(PS_ERR_UNKNOWN, false,
+                "psFitsAlloc returned NULL on existing file.");
+        return 1;
+    }
+
+    int extNum = psFitsGetExtNum(fitsFile);
+    if (extNum != 0) {
+        psError(PS_ERR_UNKNOWN, false,
+                "psFitsAlloc was not queued to the PHU, but to extension #%d.",
+                extNum);
+        return 2;
+    }
+
+    psFree(fitsFile);
+
+    // make sure the file doesn't already exist.
+    if (access("new.fits", F_OK) == 0) {
+        if (remove
+                ("new.fits") != 0) {
+            psError(PS_ERR_UNKNOWN, false,
+                    "Couldn't delete the new.fits file.");
+            return 3;
+        }
+    }
+
+    fitsFile = psFitsAlloc("new.fits");
+
+    if (fitsFile == NULL) {
+        psError(PS_ERR_UNKNOWN, false,
+                "psFitsAlloc returned NULL on existing file.");
+        return 4;
+    }
+
+    psFree(fitsFile);
+
+    // now, if psFitsAlloc actually created the file, I shouldn't error in removing it.
+    if (remove
+            ("new.fits") != 0) {
+        psError(PS_ERR_UNKNOWN, false,
+                "psFitsAlloc seemed to not have created a new file.");
+        return 5;
+    }
+
+
+    return 0;
+}
+
+psS32 tst_psFitsMoveExtName( void )
+{
+
+    if (! makeMulti() ) {
+        return 1;
+    }
+
+    psFits* fits = psFitsAlloc(multiFilename);
+
+    if (fits == NULL) {
+        psError(PS_ERR_UNKNOWN, false,
+                "psFitsAlloc returned NULL on existing file.");
+        return 1;
+    }
+
+    int numHDUs = psFitsGetSize(fits);
+
+    if (numHDUs < 2) {
+        psError(PS_ERR_UNKNOWN,true,
+                "The 'multi' FITS file does not have multiple HDUs.");
+        return 2;
+    }
+
+    char extName[80];
+    psRegion region = {0,0,0,0};
+
+    for (int lcv = 0; lcv < numHDUs; lcv++) {
+        snprintf(extName,80,"ext-%d",lcv);
+        // try to move to the named extension.
+        if (! psFitsMoveExtName(fits, extName) ) {
+            psError(PS_ERR_UNKNOWN, false,
+                    "Failed to move to ext-%d.",
+                    lcv);
+            return 3;
+        }
+
+        // check to see if I can retrieve the name back from the psFits object.
+        char* nameFromFile = psFitsGetExtName(fits);
+        if (strcmp(nameFromFile,extName) != 0) { // hey, it didn't move?
+            psError(PS_ERR_UNKNOWN, false,
+                    "Failed to retrieve the extension name back ('%s' vs '%s'",
+                    nameFromFile, extName);
+            return 3;
+        }
+        psFree(nameFromFile);
+
+        // check that the image is associated to the extension moved, i.e.,
+        // did we really move to the proper extension?
+        psImage* image = psFitsReadImage(NULL, fits,region,0);
+
+        if (image == NULL || abs(image->data.F32[0][0] - (float)lcv) > FLT_EPSILON) {
+            psError(PS_ERR_UNKNOWN, true,
+                    "The image pixel 0,0 of ext-%d was %g, expected %d.",
+                    lcv,image->data.F32[0][0],lcv);
+            return 4;
+        }
+        psFree(image);
+    }
+
+    for (int lcv = numHDUs-1; lcv >= 0; lcv--) {
+        snprintf(extName,80,"ext-%d",lcv);
+        // try to move to the named extension.
+        if (! psFitsMoveExtName(fits, extName) ) {
+            psError(PS_ERR_UNKNOWN, false,
+                    "Failed to move to ext-%d.",
+                    lcv);
+            return 5;
+        }
+
+        // check to see if I can retrieve the name back from the psFits object.
+        char* nameFromFile = psFitsGetExtName(fits);
+        if (strcmp(nameFromFile,extName) != 0) { // hey, it didn't move?
+            psError(PS_ERR_UNKNOWN, false,
+                    "Failed to retrieve the extension name back ('%s' vs '%s'",
+                    nameFromFile, extName);
+            return 5;
+        }
+        psFree(nameFromFile);
+
+        // check that the image is associated to the extension moved, i.e.,
+        // did we really move to the proper extension?
+        psImage* image = psFitsReadImage(NULL, fits,region,0);
+
+        if (abs(image->data.F32[0][0] - (float)lcv) > FLT_EPSILON) {
+            psError(PS_ERR_UNKNOWN, true,
+                    "The image pixel 0,0 of ext-%d was %g, expected %d.",
+                    lcv,image->data.F32[0][0],lcv);
+            return 6;
+        }
+        psFree(image);
+    }
+
+    // check to see if given a bogus extension name, it errors.
+    psLogMsg(__func__,PS_LOG_INFO, "Following should be an error.");
+    if (psFitsMoveExtName(fits, "bogus") || psErrorGetStackSize() != 1) {
+        psError(PS_ERR_UNKNOWN, false,
+                "Moving to non-existant HDU didn't fail.");
+        return 7;
+    }
+
+    // check to see if given a NULL psFits, it errors.
+    psLogMsg(__func__,PS_LOG_INFO, "Following should be an error.");
+    if (psFitsMoveExtName(NULL, "bogus") || psErrorGetStackSize() != 1) {
+        psError(PS_ERR_UNKNOWN, false,
+                "Operation of NULL psFits didn't fail.");
+        return 8;
+    }
+
+    // check to see if given a NULL extname, it errors.
+    psLogMsg(__func__,PS_LOG_INFO, "Following should be an error.");
+    if (psFitsMoveExtName(fits, NULL) || psErrorGetStackSize() != 1) {
+        psError(PS_ERR_UNKNOWN, false,
+                "Operation of NULL extname didn't fail.");
+        return 9;
+    }
+
+    psFree(fits);
+
+    return 0;
+}
+
+psS32 tst_psFitsMoveExtNum( void )
+{
+
+    if (! makeMulti() ) {
+        return 1;
+    }
+
+    psFits* fits = psFitsAlloc(multiFilename);
+
+    if (fits == NULL) {
+        psError(PS_ERR_UNKNOWN, false,
+                "psFitsAlloc returned NULL on existing file.");
+        return 1;
+    }
+
+    int numHDUs = psFitsGetSize(fits);
+
+    // as a side test, let's make sure psFitsGetSize can handle NULL.
+    psLogMsg(__func__,PS_LOG_INFO,
+             "Following should be an error.");
+    psErrorClear();
+    if (psFitsGetSize(NULL) != 0 || psErrorGetStackSize() != 1) {
+        psError(PS_ERR_UNKNOWN,true,
+                "The 'multi' FITS file does not have multiple HDUs.");
+        return 2;
+    }
+
+    if (numHDUs != 8) {
+        psError(PS_ERR_UNKNOWN,true,
+                "The 'multi' FITS file does not have multiple HDUs.");
+        return 2;
+    }
+
+    psRegion region = {0,0,0,0};
+
+    // test absolute positioning
+    for (int lcv = 0; lcv < numHDUs; lcv++) {
+        // try to move to the extension
+        if (! psFitsMoveExtNum(fits, lcv, false) ) {
+            psError(PS_ERR_UNKNOWN, false,
+                    "Failed to move to extension %d.",
+                    lcv);
+            return 3;
+        }
+
+        // check to see if I can retrieve the number back from the psFits object.
+        if (psFitsGetExtNum(fits) != lcv) { // hey, it didn't move?
+            psError(PS_ERR_UNKNOWN, false,
+                    "Failed to retrieve the extension number back (%d vs %d)",
+                    psFitsGetExtNum(fits), lcv);
+            return 5;
+        }
+
+        // check that the image is associated to the extension moved, i.e.,
+        // did we really move to the proper extension?
+        psImage* image = psFitsReadImage(NULL, fits,region,0);
+
+        if (image == NULL || abs(image->data.F32[0][0] - (float)lcv) > FLT_EPSILON) {
+            psError(PS_ERR_UNKNOWN, true,
+                    "The image pixel 0,0 of ext-%d was %g, expected %d.",
+                    lcv,image->data.F32[0][0],lcv);
+            return 4;
+        }
+        psFree(image);
+    }
+
+    for (int lcv = numHDUs-1; lcv >= 0; lcv--) {
+        // try to move to the extension
+        if (! psFitsMoveExtNum(fits, lcv, false) ) {
+            psError(PS_ERR_UNKNOWN, false,
+                    "Failed to move to extension %d.",
+                    lcv);
+            return 5;
+        }
+
+        // check that the image is associated to the extension moved, i.e.,
+        // did we really move to the proper extension?
+        psImage* image = psFitsReadImage(NULL, fits,region,0);
+
+        if (abs(image->data.F32[0][0] - (float)lcv) > FLT_EPSILON) {
+            psError(PS_ERR_UNKNOWN, true,
+                    "The image pixel 0,0 of ext-%d was %g, expected %d.",
+                    lcv,image->data.F32[0][0],lcv);
+            return 6;
+        }
+        psFree(image);
+    }
+
+    // test relative positioning
+    psFitsMoveExtNum(fits,0,false);
+    for (int lcv = 1; lcv < numHDUs; lcv++) {
+        // try to move to the extension
+        if (! psFitsMoveExtNum(fits, 1, true) ) {
+            psError(PS_ERR_UNKNOWN, false,
+                    "Failed to move to extension %d.",
+                    lcv);
+            return 13;
+        }
+
+        // check to see if I can retrieve the number back from the psFits object.
+        if (psFitsGetExtNum(fits) != lcv) { // hey, it didn't move?
+            psError(PS_ERR_UNKNOWN, false,
+                    "Failed to retrieve the extension number back (%d vs %d)",
+                    psFitsGetExtNum(fits), lcv);
+            return 13;
+        }
+
+        // check that the image is associated to the extension moved, i.e.,
+        // did we really move to the proper extension?
+        psImage* image = psFitsReadImage(NULL, fits,region,0);
+
+        if (image == NULL || abs(image->data.F32[0][0] - (float)lcv) > FLT_EPSILON) {
+            psError(PS_ERR_UNKNOWN, true,
+                    "The image pixel 0,0 of ext-%d was %g, expected %d.",
+                    lcv,image->data.F32[0][0],lcv);
+            return 14;
+        }
+        psFree(image);
+    }
+
+    for (int lcv = numHDUs-2; lcv >= 0; lcv--) {
+        // try to move to the extension
+        if (! psFitsMoveExtNum(fits, -1, true) ) {
+            psError(PS_ERR_UNKNOWN, false,
+                    "Failed to move to extension %d.",
+                    lcv);
+            return 15;
+        }
+
+        // check to see if I can retrieve the number back from the psFits object.
+        if (psFitsGetExtNum(fits) != lcv) { // hey, it didn't move?
+            psError(PS_ERR_UNKNOWN, false,
+                    "Failed to retrieve the extension number back (%d vs %d)",
+                    psFitsGetExtNum(fits), lcv);
+            return 15;
+        }
+
+        // check that the image is associated to the extension moved, i.e.,
+        // did we really move to the proper extension?
+        psImage* image = psFitsReadImage(NULL, fits,region,0);
+
+        if (abs(image->data.F32[0][0] - (float)lcv) > FLT_EPSILON) {
+            psError(PS_ERR_UNKNOWN, true,
+                    "The image pixel 0,0 of ext-%d was %g, expected %d.",
+                    lcv,image->data.F32[0][0],lcv);
+            return 16;
+        }
+        psFree(image);
+    }
+
+    // check to see if given a negative extension number, it errors.
+    psLogMsg(__func__,PS_LOG_INFO, "Following should be an error.");
+    psErrorClear();
+    if (psFitsMoveExtNum(fits, -1, false) || psErrorGetStackSize() != 1) {
+        psError(PS_ERR_UNKNOWN, false,
+                "Moving to negative HDU didn't fail.");
+        return 21;
+    }
+
+    // check to see if relative positioning beyond PHU, it errors.
+    psFitsMoveExtNum(fits,0,false);
+    psLogMsg(__func__,PS_LOG_INFO, "Following should be an error.");
+    psErrorClear();
+    if (psFitsMoveExtNum(fits, -1, true) || psErrorGetStackSize() != 1) {
+        psError(PS_ERR_UNKNOWN, false,
+                "Moving to negative HDU didn't fail.");
+        return 22;
+    }
+
+
+    // check to see if given a extension greater than the total #HDUs, it errors.
+    psLogMsg(__func__,PS_LOG_INFO, "Following should be an error.");
+    psErrorClear();
+    if (psFitsMoveExtNum(fits, numHDUs, false) || psErrorGetStackSize() != 1) {
+        psError(PS_ERR_UNKNOWN, false,
+                "Moving to a HDU beyond the file's contents didn't fail.");
+        return 31;
+    }
+
+    // check to see if relative positioning beyond PHU, it errors.
+    psFitsMoveExtNum(fits,numHDUs-1,false);
+    psLogMsg(__func__,PS_LOG_INFO, "Following should be an error.");
+    psErrorClear();
+    if (psFitsMoveExtNum(fits, 1, true) || psErrorGetStackSize() != 1) {
+        psError(PS_ERR_UNKNOWN, false,
+                "Moving to negative HDU didn't fail.");
+        return 32;
+    }
+
+    // check to see if given a NULL psFits, it errors.
+    psLogMsg(__func__,PS_LOG_INFO, "Following should be an error.");
+    psErrorClear();
+    if (psFitsMoveExtNum(NULL, 0, false) || psErrorGetStackSize() != 1) {
+        psError(PS_ERR_UNKNOWN, false,
+                "Operation of NULL psFits didn't fail.");
+        return 40;
+    }
+
+    psFree(fits);
+
+    return 0;
+}
+
+static psS32 tst_psFitsReadHeader( void )
+{
+    if (! makeMulti() ) {
+        return 1;
+    }
+
+    psFits* fits = psFitsAlloc(multiFilename);
+
+    if (fits == NULL) {
+        psError(PS_ERR_UNKNOWN, false,
+                "psFitsAlloc returned NULL on existing file.");
+        return 1;
+    }
+
+    int numHDUs = psFitsGetSize(fits);
+
+    if (numHDUs < 8) {
+        psError(PS_ERR_UNKNOWN,true,
+                "The 'multi' FITS file does not have multiple HDUs.");
+        return 2;
+    }
+
+    char extname[80];
+    for (int hdunum = 0; hdunum < numHDUs; hdunum++) {
+        snprintf(extname,80,"ext-%d",hdunum);
+
+        psFitsMoveExtNum(fits,hdunum,false);
+
+        psMetadata* header = psFitsReadHeader(NULL,fits);
+        if (header == NULL) {
+            psError(PS_ERR_UNKNOWN, false,
+                    "Failed to read header");
+            return 3;
+        }
+
+        psMetadata* header2 = psMetadataAlloc();
+        header2 = psFitsReadHeader(header2,fits);
+        if (header2 == NULL) {
+            psError(PS_ERR_UNKNOWN, false,
+                    "Failed to read header");
+            return 11;
+        }
+
+        if (header->list->size < 1 || header->list->size != header2->list->size) {
+            psError(PS_ERR_UNKNOWN, true,
+                    "Reading the header given a NULL input psMetadata differed "
+                    "from giving an existing psMetadata.");
+            return 12;
+        }
+
+        // check for the extra metadata items
+        psS32 intItem = psMetadataLookupS32(NULL,header, "MYINT");
+        psF32 fltItem = psMetadataLookupF32(NULL,header, "MYFLT");
+        psF64 dblItem = psMetadataLookupF64(NULL,header, "MYDBL");
+        psMetadataItem* boolItem = psMetadataLookup(header, "MYBOOL");
+        char* strItem = psMetadataLookupPtr(NULL, header, "MYSTR");
+
+        if (intItem != hdunum) {
+            psError(PS_ERR_UNKNOWN, true,
+                    "Failed to retrieve psS32 metadata item from file.");
+            return 20;
+        }
+
+        if (fabsf(fltItem - 1.0f/(float)(1+hdunum)) > FLT_EPSILON) {
+            psError(PS_ERR_UNKNOWN, true,
+                    "Failed to retrieve psF32 metadata item from file.  Got %f vs %f",
+                    fltItem,1.0f/(float)(1+hdunum));
+            return 21;
+        }
+
+        if (abs(dblItem - 1.0/(double)(1+hdunum)) > DBL_EPSILON) {
+            psError(PS_ERR_UNKNOWN, true,
+                    "Failed to retrieve psF64 metadata item from file.  Got %g vs %g",
+                    dblItem, 1.0/(double)(1+hdunum));
+            return 22;
+        }
+
+        if (boolItem == NULL ||
+                boolItem->type != PS_META_BOOL) {
+            psError(PS_ERR_UNKNOWN, true,
+                    "Failed to retrieve psBool metadata item from file.");
+            return 23;
+        }
+
+        if (strItem == NULL || strncmp(strItem,extname,strlen(extname)) != 0) {
+            psError(PS_ERR_UNKNOWN, true,
+                    "Failed to retrieve string metadata item from file.  Got '%s' vs '%s' (%d)",
+                    strItem,extname,strlen(extname));
+            return 24;
+        }
+
+        psFree(header);
+        psFree(header2);
+    }
+
+    psLogMsg(__func__,PS_LOG_INFO,"following should be an error (input psFits = NULL)");
+    psMetadata* header = psFitsReadHeader(NULL,NULL);
+
+    if (header != NULL || psErrorGetStackSize() != 1) {
+        psError(PS_ERR_UNKNOWN, true,
+                "psFitsReadHeader didn't error on a NULL psFits.");
+        return 30;
+    }
+
+
+    psFree(fits);
+
+    return 0;
+}
+
+static psS32 tst_psFitsReadHeaderSet( void )
+{
+    if (! makeMulti() ) {
+        return 1;
+    }
+
+    psFits* fits = psFitsAlloc(multiFilename);
+
+    if (fits == NULL) {
+        psError(PS_ERR_UNKNOWN, false,
+                "psFitsAlloc returned NULL on existing file.");
+        return 1;
+    }
+
+    int numHDUs = psFitsGetSize(fits);
+
+    if (numHDUs < 8) {
+        psError(PS_ERR_UNKNOWN,true,
+                "The 'multi' FITS file does not have multiple HDUs.");
+        return 2;
+    }
+
+    // move to the middle
+    psFitsMoveExtNum(fits,numHDUs/2, false);
+
+    psHash* headerSet = psFitsReadHeaderSet(NULL, fits);
+
+    if (headerSet == NULL) {
+        psError(PS_ERR_UNKNOWN, false,
+                "psFitsReadHeaderSet returned NULL unexpectedly.");
+        return 3;
+    }
+
+    if (psFitsGetExtNum(fits) != numHDUs/2) {
+        psError(PS_ERR_UNKNOWN, false,
+                "psFitsReadHeaderSet changed the CHU.");
+        return 4;
+    }
+
+    char extname[80];
+    for (int i = 0; i < numHDUs; i++) {
+        if (i == 0) {
+            snprintf(extname, 80, "PHU");
+        } else {
+            snprintf(extname, 80, "ext-%d", i);
+        }
+
+        psMetadata* header = psHashLookup(headerSet, extname);
+
+        if (header == NULL) {
+            psError(PS_ERR_UNKNOWN, false,
+                    "psFitsReadHeader returned NULL unexpectedly for HDU#%d.",
+                    i);
+            return 5;
+        }
+
+        psS32 intItem = psMetadataLookupS32(NULL, header, "MYINT");
+
+        if (intItem != i) {
+            psError(PS_ERR_UNKNOWN, false,
+                    "psFitsReadHeader for HDU#%d had a MYINT of %d, expected %d.",
+                    intItem, i);
+            return 6;
+        }
+
+    }
+
+    psHash* set2 = psHashAlloc(20);
+
+    if (psFitsReadHeaderSet(set2,NULL) != NULL) {
+        psError(PS_ERR_UNKNOWN, false,
+                "psFitsReadHeaderSet returned non-NULL given a NULL psFits.");
+        return 10;
+    }
+
+    psHash* set3 = psHashAlloc(20);
+    psFitsReadHeaderSet(set3,fits);
+
+    if (set3 == NULL) {
+        psError(PS_ERR_UNKNOWN, false,
+                "psFitsReadHeaderSet returned NULL unexpectedly.");
+        return 11;
+    }
+
+    for (int i = 0; i < numHDUs; i++) {
+        if (i == 0) {
+            snprintf(extname, 80, "PHU");
+        } else {
+            snprintf(extname, 80, "ext-%d", i);
+        }
+
+        psMetadata* header = psHashLookup(set3, extname);
+
+        if (header == NULL) {
+            psError(PS_ERR_UNKNOWN, false,
+                    "psFitsReadHeader returned NULL unexpectedly for HDU#%d.",
+                    i);
+            return 5;
+        }
+
+        psS32 intItem = psMetadataLookupS32(NULL, header, "MYINT");
+
+        if (intItem != i) {
+            psError(PS_ERR_UNKNOWN, false,
+                    "psFitsReadHeader for HDU#%d had a MYINT of %d, expected %d.",
+                    intItem, i);
+            return 6;
+        }
+
+    }
+
+
+
+    psFree(headerSet);
+    psFree(set3);
+    // set2 should have been freed by psFitsReadHeaderSet upon an error.
+
+    psFree(fits);
+
+    return 0;
+}
+
+static psS32 tst_psFitsReadTable( void )
+{
+
+
+    if (! makeTable()) {
+        return 1;
+    }
+
+    psFits* fits = psFitsAlloc(tableFilename);
+
+    if (fits == NULL) {
+        psError(PS_ERR_UNKNOWN, false,
+                "psFitsAlloc returned NULL on existing file.");
+        return 1;
+    }
+
+    psFitsMoveExtNum(fits,1,false);
+
+    psArray* table = psFitsReadTable(fits);
+
+    if (table == NULL) {
+        psError(PS_ERR_UNKNOWN, false,
+                "psFitsReadTable returned NULL unexpectedly.");
+        return 2;
+    }
+
+    if (table->n != tableNumRows) {
+        psError(PS_ERR_UNKNOWN, false,
+                "Expected %d rows, but read %d.",
+                tableNumRows, table->n);
+        return 3;
+    }
+
+
+    for (int row = 0; row < table->n; row++) {
+        psMetadata* rowData = table->data[row];
+
+        psS32 intItem = psMetadataLookupS32(NULL, rowData, "MYINT");
+        psF32 fltItem = psMetadataLookupF32(NULL, rowData, "MYFLT");
+        psF64 dblItem = psMetadataLookupF64(NULL, rowData, "MYDBL");
+        psBool boolItem = psMetadataLookupBool(NULL, rowData, "MYBOOL");
+
+        if (intItem != row) {
+            psError(PS_ERR_UNKNOWN, true,
+                    "Failed to retrieve psS32 metadata item from file (row=%d).  Got %d vs %d",
+                    row, intItem, row);
+            return 20;
+        }
+
+        if (fabsf(fltItem - 1.0f/(float)(1+row)) > FLT_EPSILON) {
+            psError(PS_ERR_UNKNOWN, true,
+                    "Failed to retrieve psF32 metadata item from file (row=%d).  Got %f vs %f",
+                    row, fltItem,1.0f/(float)(1+row));
+            return 21;
+        }
+
+        if (abs(dblItem - 1.0/(double)(1+row)) > DBL_EPSILON) {
+            psError(PS_ERR_UNKNOWN, true,
+                    "Failed to retrieve psF64 metadata item from file (row=%d).  Got %g vs %g",
+                    row, dblItem, 1.0/(double)(1+row));
+            return 22;
+        }
+
+        if ( boolItem != ((row&0x01) == 0)) {
+            psError(PS_ERR_UNKNOWN, true,
+                    "Failed to retrieve psBool metadata item from file (row=%d). Got %d vs %d",
+                    row, boolItem, ((row&0x01) == 0));
+            return 23;
+        }
+    }
+
+    psFree(table);
+    psFree(fits);
+
+    psArray* nullTest = psFitsReadTable(NULL);
+
+    if (nullTest != NULL || psErrorGetStackSize() != 1) {
+        psError(PS_ERR_UNKNOWN, true,
+                "psFitsReadTable returned non-NULL when given NULL.");
+        return 30;
+    }
+
+    return 0;
+}
+
+static psS32 tst_psFitsReadTableColumnNum( void )
+{
+    if (! makeTable()) {
+        return 1;
+    }
+
+    psFits* fits = psFitsAlloc(tableFilename);
+
+    if (fits == NULL) {
+        psError(PS_ERR_UNKNOWN, false,
+                "psFitsAlloc returned NULL on existing file.");
+        return 1;
+    }
+
+    psFitsMoveExtNum(fits,1,false);
+
+    // read the column data via number
+    psVector* colData;
+    psElemType type[4] = {PS_TYPE_S32, PS_TYPE_F32, PS_TYPE_F32, PS_TYPE_BOOL};
+    psElemType altType[4] = {PS_TYPE_S64, PS_TYPE_F64, PS_TYPE_F64, PS_TYPE_BOOL};
+    char* colname[4] = {"MYINT","MYFLT","MYDBL","MYBOOL"};
+    psF64 expectedValues[4][10] = {
+                                      {0,1,2,3,4,5,6,7,8,9},
+                                      {1.0,1.0/2.0,1.0/3.0,1.0/4.0,1.0/5.0,1.0/6.0,1.0/7.0,1.0/8.0,1.0/9.0},
+                                      {1.0,1.0/2.0,1.0/3.0,1.0/4.0,1.0/5.0,1.0/6.0,1.0/7.0,1.0/8.0,1.0/9.0},
+                                      {1.0,0.0,1.0,0.0,1.0,0.0,1.0,0.0,1.0,0.0}
+                                  };
+
+    for (int col = 0; col < 4; col++) {
+        colData = psFitsReadTableColumnNum(fits,colname[col]);
+        if (colData == NULL) {
+            psError(PS_ERR_UNKNOWN, false,
+                    "psFitsReadTableColumnNum returned NULL for col=%d",
+                    col);
+            return 2;
+        }
+        if (colData->type.type != type[col] &&
+                colData->type.type != altType[col]) {
+            char* typeRead;
+            char* typeExpected;
+            PS_TYPE_NAME(typeRead, colData->type.type);
+            PS_TYPE_NAME(typeExpected, type[col]);
+
+            psError(PS_ERR_UNKNOWN, false,
+                    "psFitsReadTableColumnNum returned different type, %s vs %s, for col=%d",
+                    typeRead, typeExpected, col);
+            return 3;
+        }
+        if (colData->n != tableNumRows) {
+            psError(PS_ERR_UNKNOWN, false,
+                    "psFitsReadTableColumnNum returned different number of rows, %d vs %d, for col=%d",
+                    colData->n, tableNumRows, col);
+            return 4;
+        }
+        for (int row = 0; row < tableNumRows; row++) {
+            if (abs(p_psVectorGetElementF64(colData,row) - expectedValues[col][row]) > FLT_EPSILON) {
+                psError(PS_ERR_UNKNOWN, false,
+                        "psFitsReadTableColumnNum returned unexpected values (%g vs %g) for col=%d",
+                        p_psVectorGetElementF64(colData,row), expectedValues[col][row], col);
+                return 5;
+            }
+        }
+        psFree(colData);
+    }
+
+    psWarning("Following should be an error.");
+    psErrorClear();
+    psVector* data = psFitsReadTableColumnNum(NULL,colname[0]);
+    psErr* err = psErrorLast();
+    if (data != NULL) {
+        psError(PS_ERR_UNKNOWN, false,
+                "psFitsReadTableColumnNum did not return NULL with NULL psFits");
+        return 6;
+    }
+    if (err->code != PS_ERR_BAD_PARAMETER_NULL) {
+        psError(PS_ERR_UNKNOWN, false,
+                "psFitsReadTableColumnNum did not error with NULL psFits");
+        return 7;
+    }
+    psFree(err);
+
+    psWarning("Following should be an error.");
+    psErrorClear();
+    data = psFitsReadTableColumnNum(fits,"BOGUS");
+    err = psErrorLast();
+    if (data != NULL) {
+        psError(PS_ERR_UNKNOWN, false,
+                "psFitsReadTableColumnNum did not return NULL with bogus column name.");
+        return 8;
+    }
+    if (err->code != PS_ERR_IO) {
+        psError(PS_ERR_UNKNOWN, false,
+                "psFitsReadTableColumnNum did not error with bogus column name.");
+        return 9;
+    }
+    psFree(err);
+
+    psFree(fits);
+
+    return 0;
+}
+
+static psS32 tst_psFitsReadTableColumn( void )
+{
+    if (! makeTable()) {
+        return 1;
+    }
+
+    psFits* fits = psFitsAlloc(tableFilename);
+
+    if (fits == NULL) {
+        psError(PS_ERR_UNKNOWN, false,
+                "psFitsAlloc returned NULL on existing file.");
+        return 1;
+    }
+
+    psFitsMoveExtNum(fits,1,false);
+
+    // read the column data via number
+    psArray* colData;
+    char* colname[4] = {"MYINT","MYFLT","MYDBL","MYBOOL"};
+    psF64 expectedValues[4][10] = {
+                                      {0,1,2,3,4,5,6,7,8,9},
+                                      {1.0,1.0/2.0,1.0/3.0,1.0/4.0,1.0/5.0,1.0/6.0,1.0/7.0,1.0/8.0,1.0/9.0},
+                                      {1.0,1.0/2.0,1.0/3.0,1.0/4.0,1.0/5.0,1.0/6.0,1.0/7.0,1.0/8.0,1.0/9.0},
+                                      {1.0,0.0,1.0,0.0,1.0,0.0,1.0,0.0,1.0,0.0}
+                                  };
+
+    for (int col = 0; col < 4; col++) {
+        colData = psFitsReadTableColumn(fits,colname[col]);
+        if (colData == NULL) {
+            psError(PS_ERR_UNKNOWN, false,
+                    "psFitsReadTableColumn returned NULL for col=%d",
+                    col);
+            return 2;
+        }
+        if (colData->n != tableNumRows) {
+            psError(PS_ERR_UNKNOWN, false,
+                    "psFitsReadTableColumn returned different number of rows, %d vs %d, for col=%d",
+                    colData->n, tableNumRows, col);
+            return 4;
+        }
+        if (col < 3) {
+            for (int row = 0; row < tableNumRows; row++) {
+                if (abs(atof((char*)colData->data[row]) - expectedValues[col][row]) > 0.0001) {
+                    psError(PS_ERR_UNKNOWN, false,
+                            "psFitsReadTableColumn returned unexpected values (%g vs %g) for col=%d",
+                            atof((char*)colData->data[row]), expectedValues[col][row], col);
+                    return 5;
+                }
+            }
+        }
+        psFree(colData);
+    }
+
+    psWarning("Following should be an error.");
+    psErrorClear();
+    psArray* data = psFitsReadTableColumn(NULL,"MYINT");
+    psErr* err = psErrorLast();
+    if (data != NULL) {
+        psError(PS_ERR_UNKNOWN, false,
+                "psFitsReadTableColumn did not return NULL with NULL psFits");
+        return 6;
+    }
+    if (err->code != PS_ERR_BAD_PARAMETER_NULL) {
+        psError(PS_ERR_UNKNOWN, false,
+                "psFitsReadTableColumn did not error with NULL psFits");
+        return 7;
+    }
+    psFree(err);
+
+    psWarning(__func__,"Following should be an error.");
+    psErrorClear();
+    data = psFitsReadTableColumn(fits,"BOGUS");
+    err = psErrorLast();
+    if (data != NULL) {
+        psError(PS_ERR_UNKNOWN, false,
+                "psFitsReadTableColumn did not return NULL with col=\"BOGUS\"");
+        return 8;
+    }
+    if (err->code != PS_ERR_IO) {
+        psError(PS_ERR_UNKNOWN, false,
+                "psFitsReadTableColumn did not error with col=\"BOGUS\"");
+        return 9;
+    }
+    psFree(err);
+
+    psFree(fits);
+
+    return 0;
+}
+
+static psS32 tst_psFitsUpdateTable( void )
+{
+    psErr* err;
+
+    if (! makeTable()) {
+        return 1;
+    }
+
+    psFits* fits = psFitsAlloc(tableFilename);
+
+    if (fits == NULL) {
+        psError(PS_ERR_UNKNOWN, false,
+                "psFitsAlloc returned NULL on existing file.");
+        return 2;
+    }
+
+    psFitsMoveExtNum(fits,1,false);
+
+    // change the data in the file, going past by one (implicit new row of data)
+    for (int row = 0; row < tableNumRows+1; row++) {
+        psMetadata* md = psMetadataAlloc();
+        psMetadataAddF32(md,PS_LIST_TAIL,"MYFLT","",(float)row/-10.0);
+        psMetadataAddF64(md,PS_LIST_TAIL,"MYDBL","",(double)row/-100.0);
+        psMetadataAddS32(md,PS_LIST_TAIL,"MYINT","",-row);
+
+        if (! psFitsUpdateTable(fits,md,row)) {
+            psError(PS_ERR_UNKNOWN, false,
+                    "psFitsUpdateTable returned false, but expected true for row=%d.",
+                    row);
+            return 3;
+        }
+        psFree(md);
+    }
+
+    for (int row = 0; row < tableNumRows+1; row++) {
+        psMetadata* md = psFitsReadTableRow(fits, row);
+        if (abs(psMetadataLookupF32(NULL,md,"MYFLT") - (float)row/-10.0) > FLT_EPSILON) {
+            psError(PS_ERR_UNKNOWN, false,
+                    "psFitsUpdateTable did not change the float value for row=%d.",
+                    row);
+            return 4;
+        }
+        if (abs(psMetadataLookupF64(NULL,md,"MYDBL") - (float)row/-100.0) > FLT_EPSILON) {
+            psError(PS_ERR_UNKNOWN, false,
+                    "psFitsUpdateTable did not change the double value for row=%d.",
+                    row);
+            return 5;
+        }
+        if (psMetadataLookupS32(NULL,md,"MYINT") != -row) {
+            psError(PS_ERR_UNKNOWN, false,
+                    "psFitsUpdateTable did not change the integer value for row=%d.",
+                    row);
+            return 6;
+        }
+        psFree(md);
+    }
+
+    psMetadata* md = psMetadataAlloc();
+    psMetadataAddF32(md,PS_LIST_TAIL,"BOGUS","",-1.0f);
+    psWarning("Following should be a warning.");
+    psErrorClear();
+    if (! psFitsUpdateTable(fits,md,0)) {
+        psError(PS_ERR_UNKNOWN, false,
+                "psFitsUpdateTable did not return false with bogus column data");
+        return 10;
+    }
+    psFree(md);
+
+    md = psMetadataAlloc();
+    psMetadataAddF32(md,PS_LIST_TAIL,"MYFLT","",-1.0f);
+    psMetadataAddF64(md,PS_LIST_TAIL,"MYDBL","",-2.0);
+    psMetadataAddS32(md,PS_LIST_TAIL,"MYINT","",-3);
+
+    psWarning("Following should be an error.");
+    psErrorClear();
+    if (psFitsUpdateTable(NULL,md,0)) {
+        psError(PS_ERR_UNKNOWN, false,
+                "psFitsUpdateTable did not return false with NULL psFits");
+        return 20;
+    }
+    err = psErrorLast();
+    if (err->code != PS_ERR_BAD_PARAMETER_NULL) {
+        psError(PS_ERR_UNKNOWN, false,
+                "psFitsUpdateTable did not error with NULL psFits");
+        return 21;
+    }
+    psFree(err);
+
+    psWarning("Following should be an error.");
+    psErrorClear();
+    if (psFitsUpdateTable(fits,NULL,0)) {
+        psError(PS_ERR_UNKNOWN, false,
+                "psFitsUpdateTable did not return false with NULL psMetadata");
+        return 22;
+    }
+    err = psErrorLast();
+    if (err->code != PS_ERR_BAD_PARAMETER_NULL) {
+        psError(PS_ERR_UNKNOWN, false,
+                "psFitsUpdateTable did not error with NULL psMetadata");
+        return 23;
+    }
+    psFree(err);
+
+    psWarning("Following should be an error.");
+    psErrorClear();
+    if (psFitsUpdateTable(fits,md,-1)) {
+        psError(PS_ERR_UNKNOWN, false,
+                "psFitsUpdateTable did not return false with row=-1");
+        return 24;
+    }
+    err = psErrorLast();
+    if (err->code != PS_ERR_IO) {
+        psError(PS_ERR_UNKNOWN, false,
+                "psFitsUpdateTable did not error with row=-1");
+        return 25;
+    }
+
+    psFree(err);
+    psFree(md);
+    psFree(fits);
+
+    return 0;
+}
+
+psS32 testImageRead(void)
+{
+    psS32 N = 256;
+    psS32 M = 128;
+
+    /*
+        This function shall open the specified FITS file, read the specified data
+        and place the data into a psImage structure. This function shall generate
+        an error message and return NULL if any of the input parameters are out of
+        range, image file doesn't exist or image is zero or one dimensional.
+
+        Verify the returned psImage structure contains expected values, if the input
+        parameter filename specifies an available FITS file with known 2dimensional
+        data, input parameters col, row, ncol, nrow, z specify data range with the
+        FITS file. Cases should include 1x1, Nx1, 1xN, NxN and MxN sub images and
+        total FITS file image. (done in macro)
+
+        Verify the returned psImage structure is equal to the input parameter
+        'output', if specified. (done in macro)
+
+        */
+
+    /* generate FITS file to read */
+
+    #define testReadTypeSize(m, n, readM0, readN0, readM, readN, TYP, filename) \
+    { \
+        psImage* img = NULL; \
+        psImage* img2 = NULL; \
+        psImage* img3 = NULL; \
+        psImage* img4 = NULL; \
+        /*        psImagimge* img_ref = NULL; */ \
+        \
+        GENIMAGE(img,m,n,TYP,row+2*col); \
+        img2 = psImageCopy(img2,img,PS_TYPE_##TYP); \
+        GENIMAGE(img3,m,n,TYP,row+2*col); \
+        psImageClip(img3,32.0,32.0,120.0,120.0); \
+        img4 = psImageCopy(img4,img3,PS_TYPE_##TYP); \
+        remove(filename); \
+        psFits* fits = psFitsAlloc(filename); \
+        psRegion region = {0,0,0,0}; \
+        if (! psFitsWriteImage(fits, NULL, img, 2, "primary")) { \
+            psError(PS_ERR_UNKNOWN, true,"Failed to write test image %s",filename); \
+            return 1; \
+        } \
+        if (! psFitsUpdateImage(fits,img3, region, 1)) { \
+            psError(PS_ERR_UNKNOWN, true,"Failed to write test image %s",filename); \
+            return 2; \
+        } \
+        if (! psFitsWriteImage(fits,NULL, img3, 2, "extension")) { \
+            psError(PS_ERR_UNKNOWN, true,"Failed to write test image %s",filename); \
+            return 3; \
+        } \
+        if (! psFitsUpdateImage(fits,img,region, 1)) { \
+            psError(PS_ERR_UNKNOWN, true,"Failed to write test image %s",filename); \
+            return 4; \
+        } \
+        psFree(img); \
+        psFree(fits); \
+        img = NULL; \
+        psFree(img3); \
+        img3 = NULL; \
+        fits = psFitsAlloc(filename); \
+        psRegion reg = {readM0, readM, readN0, readN}; \
+        img = psFitsReadImage(img, fits, reg, 0); \
+        img3 = psFitsReadImage(img3, fits, reg, 1); \
+        if (img3 == NULL) { \
+            psError(PS_ERR_UNKNOWN, true,"Failed to read test image %s",filename); \
+            return 6; \
+        } \
+        for (psU32 row = readN0; row < readN; row++) { \
+            ps##TYP* imgRow = img->data.TYP[row-readN0]; \
+            ps##TYP* img2Row = img2->data.TYP[row]; \
+            ps##TYP* img3Row = img3->data.TYP[row-readN0]; \
+            ps##TYP* img4Row = img4->data.TYP[row]; \
+            for (psU32 col = readM0; col < readM; col++) { \
+                if (fabsf(imgRow[col-readM0]-img2Row[col]) > FLT_EPSILON) { \
+                    psError(PS_ERR_UNKNOWN, true,"Image changed in I/O operation at %d,%d,0 (%.2f vs %.2f) for %s", \
+                            col,row,(psF32)imgRow[col-readM0],(psF32)img2Row[col],filename); \
+                    return 7; \
+                } \
+                if (fabsf(img3Row[col-readM0]-img4Row[col]) > FLT_EPSILON) { \
+                    psError(PS_ERR_UNKNOWN, true,"Image changed in I/O operation at %d,%d,1 (%.2f vs %.2f) for %s", \
+                            col,row,(psF32)img3Row[col-readM0],(psF32)img4Row[col],filename); \
+                    return 8; \
+                } \
+            } \
+        } \
+        psFree(img); \
+        img = NULL; \
+        psFree(img3); \
+        img3 = NULL; \
+        psFitsMoveExtNum(fits,1, false); \
+        img3 = psFitsReadImage(img3, fits, reg, 0); \
+        img = psFitsReadImage(img, fits, reg, 1); \
+        if (img == NULL) { \
+            psError(PS_ERR_UNKNOWN, true,"Failed to read test image %s",filename); \
+            return 9; \
+        } \
+        for (psU32 row = readN0; row < readN; row++) { \
+            ps##TYP* imgRow = img->data.TYP[row-readN0]; \
+            ps##TYP* img2Row = img2->data.TYP[row]; \
+            ps##TYP* img3Row = img3->data.TYP[row-readN0]; \
+            ps##TYP* img4Row = img4->data.TYP[row]; \
+            for (psU32 col = readM0; col < readM; col++) { \
+                if (fabsf(imgRow[col-readM0]-img2Row[col]) > FLT_EPSILON) { \
+                    psError(PS_ERR_UNKNOWN, true,"Image changed in I/O operation at %d,%d,0 (%.2f vs %.2f) for %s", \
+                            col,row,(psF32)imgRow[col-readM0],(psF32)img2Row[col],filename); \
+                    return 10; \
+                } \
+                if (fabsf(img3Row[col-readM0]-img4Row[col]) > FLT_EPSILON) { \
+                    psError(PS_ERR_UNKNOWN, true,"Image changed in I/O operation at %d,%d,1 (%.2f vs %.2f) for %s", \
+                            col,row,(psF32)img3Row[col-readM0],(psF32)img4Row[col],filename); \
+                    return 11; \
+                } \
+            } \
+        } \
+        psFree(img); \
+        psFree(img2); \
+        psFree(img3); \
+        psFree(img4); \
+        psFree(fits); \
+    }
+
+    #define testReadType(TYP,filename) \
+    testReadTypeSize(1,1,0,0,0,0,TYP,"tmpImages/1x1_" filename); \
+    testReadTypeSize(M,1,M/4,0,M*3/4,0,TYP,"tmpImages/Mx1_" filename); \
+    testReadTypeSize(1,N,0,N/4,0,N*3/4,TYP,"tmpImages/1xN_" filename); \
+    testReadTypeSize(M,N,M/4,N/4,M*3/4,N*3/4,TYP,"tmpImages/MxN_" filename);
+
+    mkdir("tmpImages",0777);
+
+    testReadTypeSize(1,1,0,0,0,0,U8,"tmpImages/1x1_" "U8.fits");
+    testReadTypeSize(M,1,M/4,0,M*3/4,0,U8,"tmpImages/Mx1_" "U8.fits");
+    testReadTypeSize(1,N,0,N/4,0,N*3/4,U8,"tmpImages/1xN_" "U8.fits");
+    testReadTypeSize(M,N,M/4,N/4,M*3/4,N*3/4,U8,"tmpImages/MxN_" "U8.fits");
+
+
+    testReadType(U8,"U8.fits");
+    testReadType(S8,"S8.fits");   // Not a requirement
+    testReadType(S16,"S16.fits");
+    testReadType(U16,"U16.fits"); // Not a requirement
+    testReadType(S32,"S32.fits");
+    testReadType(U32,"U32.fits"); // Not a requirement
+    testReadType(F32,"F32.fits");
+    testReadType(F64,"F64.fits");
+
+    return 0;
+}
+
+psS32 testImageWrite(void)
+{
+    psImage* img = NULL;
+    psImage* img2 = NULL;
+    psS32 m = 64;
+    psS32 n = 96;
+
+    /*
+    This function shall write the specified section within a psImage structure
+    to a FITS file. If the specifiedfile exists, then data should overwrite the
+    section to write. If the specified file doesn't exist, it shall be created.
+    If an extenstion is specified, then a basic primary header data unit shall
+    be created.
+    */
+
+    /*
+    Verify a FITS file named filename is generated and contains expected
+    values, if the input parameter input contains known data values, input
+    parameters col, row, ncol, nrow specify a valid data region within psImage
+    structure.
+
+    Verify a FITS file named filename is generated and contains a primary
+    header data unit with extension with expected values, if the input
+    parameter input contains known data values, input parameters col, row,
+    ncol, nrow specify a valid data region within psImage structure and
+    extname and/or extnum specify an extenstion to write.
+
+    N.B. : these are done in testImageRead tests, see above.
+    */
+
+    /*
+    Verify a FITS file named filename is overwritten and contains
+    expected values, if the input parameter input contains known data values,
+    input parameters col, row, ncol, nrow specify a valid data region within
+    psImage structure.
+    */
+
+    GENIMAGE(img,m,n,F32,0);
+    GENIMAGE(img2,m,n,F32,row+2*col);
+    mkdir("tmpImages",0777);
+    remove
+        ("tmpImages/writeTest.fits");
+    psRegion region = {
+                          0,0,0,0
+                      };
+    psFits* fits = psFitsAlloc("tmpImages/writeTest.fits");
+
+    if (! psFitsWriteImage(fits, NULL, img,1,NULL)) {
+        psError(PS_ERR_UNKNOWN, true,"Couldn't write writeTest.fits.");
+        return 14;
+    }
+    if (! psFitsUpdateImage(fits, img2, region, 0)) {
+        psError(PS_ERR_UNKNOWN, true,"Couldn't update writeTest.fits.");
+        return 15;
+    }
+    psFree(img);
+    psFree(img2);
+
+    // Did it really overwrite the pixel values?  Let's read it in and see.
+    psFree(fits);
+    fits = psFitsAlloc("tmpImages/writeTest.fits");
+    img = psFitsReadImage(NULL, fits, region, 0);
+    if (img == NULL) {
+        psError(PS_ERR_UNKNOWN, true,"Could not read in writeTest.fits.");
+        return 16;
+    }
+    for (psU32 row=0;row<n;row++) {
+        psF32* imgRow = img->data.F32[row];
+        for (psU32 col=0;col<m;col++) {
+            if (fabsf(imgRow[col] - (row+2*col)) > FLT_EPSILON) {
+                psError(PS_ERR_UNKNOWN, true,"The image values were not overwritten at %d,%d (%.2f vs %.2f)",
+                        col,row,imgRow[col],(row+2*col));
+                return 17;
+            }
+        }
+    }
+
+    psFree(img);
+
+    /*
+    Verify false is returned and program execution is not stopped, if the input image
+    is null.
+    */
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message because input image is null.");
+    if ( psFitsWriteImage(fits,NULL,NULL, 1, NULL) ) {
+        psError(PS_ERR_UNKNOWN, true,"psImageWriteSection did not return false when input image is NULL.");
+        return 20;
+    }
+
+    psFree(fits);
+
+    return 0;
+}
+
Index: /tags/ipp-1-X/bug123/psLib/test/dataIO/tst_psLookupTable_01.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/dataIO/tst_psLookupTable_01.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/dataIO/tst_psLookupTable_01.c	(revision 22331)
@@ -0,0 +1,621 @@
+/** @file  tst_psLookupTable_01.c
+*
+*  @brief Test driver for psLookupTable functions
+*
+*  This test driver contains the following tests for psLookupTable functions:
+*     testLookupAlloc - test allocation and freeing of psLookupTable
+*     testLookupRead - test different files and types within files
+*                      being read correctly and some failure cases
+*     testLookupTableInterpolate - test the interpolation function
+*     testLookupTableInterpolateAll - test interpolation of all row values
+*
+*  @author  Ross Harman, MHPCC
+*
+*  @version $Revision: 1.14 $  $Name: not supported by cvs2svn $
+*  @date  $Date: 2005-04-07 20:27:42 $
+*
+*  Copyright 2004-5 Maui High Performance Computing Center, University of Hawaii
+*
+*/
+
+#include "pslib_strict.h"
+#include "psTest.h"
+#include <string.h>
+
+static psS32 testLookupTableAlloc(void);
+static psS32 testLookupTableRead(void);
+static psS32 testLookupTableInterpolate(void);
+static psS32 testLookupTableInterpolateAll(void);
+
+const psF64 errorTol_psF64 = 1.0e-4;
+const psF64 tableU8_validFrom = 0;
+const psF64 tableU8_validTo = 3;
+const psS32 tableU8_size = 4;
+const psS32 tableU8_index[] =
+    {
+        0,   1,    2,   3
+    };
+const psU16 tableU8_val1[]  =
+    {
+        2,   4,    6,   8
+    };
+const psU32 tableU8_val2[]  =
+    {
+        4,   8,   12,  16
+    };
+const psU64 tableU8_val3[]  =
+    {
+        8,  16,   24,  32
+    };
+const psS8  tableU8_val4[]  =
+    {
+        0,  -1,   -2,  -3
+    };
+const psS16 tableU8_val5[]  =
+    {
+        -2,  -4,   -6,  -8
+    };
+const psS32 tableU8_val6[]  =
+    {
+        -4,  -8,  -12, -16
+    };
+const psS64 tableU8_val7[]  =
+    {
+        -8, -16,  -24, -32
+    };
+const psF32 tableU8_val8[]  =
+    {
+        -0.5, 0.0,  0.5,0.75
+    };
+const psF64 tableU8_val9[]  =
+    {
+        -1.5,-1.0,-0.25,1.75
+    };
+
+const psF64 tableS32_validFrom = -1;
+const psF64 tableS32_validTo = 33;
+const psS32 tableS32_size = 4;
+const psS32 tableS32_index[] =
+    {
+        -1,11,22,33
+    };
+
+const psF64 tableF32_validFrom = -10.05;
+const psF64 tableF32_validTo = 3500.67;
+const psF64 tableF32_size = 4;
+const psF32 tableF32_index[] =
+    {
+        -10.05,1.009,23.45,3500.67
+    };
+
+const psF64 table10_validFrom = 1;
+const psF64 table10_validTo   = 10;
+const psS32 table10_size      = 10;
+const psU8  table10_index[]   =
+    {
+        1,   2,    3,   4,    5,    6,    7,    8,   9,    10
+    };
+const psU16 table10_val1[]    =
+    {
+        4,   6,    8,  10,   12,   14,   16,   18,   20,   22
+    };
+const psU32 table10_val2[]    =
+    {
+        8,  12,   16,  20,   24,   28,   32,   36,   40,   44
+    };
+const psU64 table10_val3[]    =
+    {
+        16,  24,   32,  64,  128,  256,  512, 1024, 2048, 4096
+    };
+const psS8  table10_val4[]    =
+    {
+        -1,  -2,   -3,  -4,   -5,   -6,   -7,   -8,   -9,  -10
+    };
+const psS16 table10_val5[]    =
+    {
+        -4,  -6,   -8, -10,  -12,  -14,  -16,  -18,  -20,  -22
+    };
+const psS32 table10_val6[]    =
+    {
+        -8, -12,  -16, -20,  -24,  -28,  -32,  -36,  -40,  -44
+    };
+const psS64 table10_val7[]    =
+    {
+        -16, -24,  -32, -64, -128, -256, -512,-1024,-2048,-4096
+    };
+const psF32 table10_val8[]    =
+    {
+        -2.25,-1.5,-0.75, 0.0, 0.75, 1.50, 2.25, 3.00, 3.75, 4.50
+    };
+const psF64 table10_val9[]    =
+    {
+        -2.67,0.66, 3.99,7.32,10.65,13.98,17.31,20.64,23.97,27.30
+    };
+const psF64 interpolVal1[]    =
+    {
+        12.5, 25, 160, -5.25, -12.5, -25, -160, 0.9375, 11.4825
+    };
+const psF64 interpolVal2[]    =
+    {
+        12, 24, 128, -5, -12, -24, -128, 0.75, 10.65
+    };
+const psF64 interpolVal3[]    =
+    {
+        4, 8, 16, -1, -4, -8, -16, -2.25, -2.67
+    };
+
+testDescription tests[] = {
+                              {testLookupTableAlloc,999,"psLookupTableAlloc",0,false},
+                              {testLookupTableRead,998,"psLookupTableRead",0,false},
+                              {testLookupTableInterpolate,997,"psLookupTableInterpolate",0,false},
+                              {testLookupTableInterpolateAll,996,"psLookupTableInterpolateAll",0,false},
+                              {NULL}
+                          };
+
+psS32 main(psS32 argc, char* argv[])
+{
+    psLogSetLevel(PS_LOG_INFO);
+
+    if ( ! runTestSuite(stderr,"psLookupTable",tests,argc,argv)) {
+        return 1;
+    }
+    return 0;
+}
+
+psS32 testLookupTableAlloc(void)
+{
+    psLookupTable*  table1 = NULL;
+
+    // Allocate lookup table with valid parameters
+    table1 = psLookupTableAlloc("tableF32.dat", tableF32_validFrom, tableF32_validTo);
+    if(table1 == NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Null lookup table generated from valid parameters");
+        return 1;
+    }
+    if(strcmp(table1->fileName,"tableF32.dat") != 0) {
+        psError(PS_ERR_UNKNOWN,true,"File name not properly stored in psLookupTable structure.");
+        return 2;
+    }
+
+    if( (fabs(table1->validFrom - tableF32_validFrom) > FLT_EPSILON)  ||
+            (fabs(table1->validTo-tableF32_validTo) > FLT_EPSILON) ) {
+        psError(PS_ERR_UNKNOWN,true,"Members validTo or validFrom not set properly");
+        return 3;
+    }
+    psFree(table1);
+
+    // Allocate lookup table with invalid filename
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate error message for invalid file name");
+    table1 = psLookupTableAlloc(NULL,0,3);
+    if(table1 != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Null file name accepted by psLookupTableAlloc");
+        return 4;
+    }
+
+    return 0;
+}
+
+psS32 testLookupTableRead(void)
+{
+    psLookupTable*  table1 = NULL;
+
+    // Allocate table using table with psU8 index and valid types and index-values
+    table1 = psLookupTableAlloc("tableU8.dat", 0, 100.5);
+    if(table1 == NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Unable to allocate table with tableU8.dat");
+        return 1;
+    }
+    // Read table with index U8
+    table1 = psLookupTableRead(table1);
+    if(table1 == NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Unable to read table from file tableU8.dat");
+        return 2;
+    }
+    // Verify the validFrom and validTo are updated properly
+    if( (fabs(table1->validFrom - tableU8_validFrom) > FLT_EPSILON) ||
+            (fabs(table1->validTo - tableU8_validTo) > FLT_EPSILON) ) {
+        psError(PS_ERR_UNKNOWN,true,"ValidFrom or validTo not set properly");
+        return 3;
+    }
+    // Verify index and all values in table read properly
+    for(psS32 i=0; i < tableU8_size; i++) {
+        if(table1->index->data.U8[i] != tableU8_index[i]) {
+            psError(PS_ERR_UNKNOWN,true,"Index values do not match: index[%d]=%d  expected %d",i,
+                    table1->index->data.U8[i], tableU8_index[i]);
+            return 3*i;
+        }
+        if(((psVector*)table1->values->data[0])->data.U16[i] != tableU8_val1[i]) {
+            psError(PS_ERR_UNKNOWN,true,"Value in column 1 do not match: value[%d]=%d expected %d",i,
+                    ((psVector*)table1->values->data[0])->data.U16[i], tableU8_val1[i]);
+            return 3*i+1;
+        }
+        if(((psVector*)table1->values->data[1])->data.U32[i] != tableU8_val2[i]) {
+            psError(PS_ERR_UNKNOWN,true,"Value in column 2 do not match: value[%d]=%d expected %d",i,
+                    ((psVector*)table1->values->data[1])->data.U32[i], tableU8_val2[i]);
+            return 3*i+2;
+        }
+        if(((psVector*)table1->values->data[2])->data.U64[i] != tableU8_val3[i]) {
+            psError(PS_ERR_UNKNOWN,true,"Value in column 3 do not match: value[%d]=%lld expected %lld",i,
+                    ((psVector*)table1->values->data[2])->data.U64[i], tableU8_val3[i]);
+            return 3*i+3;
+        }
+        if(((psVector*)table1->values->data[3])->data.S8[i] != tableU8_val4[i]) {
+            psError(PS_ERR_UNKNOWN,true,"Value in column 4 do not match: value[%d]=%d expected %d",i,
+                    ((psVector*)table1->values->data[3])->data.S8[i], tableU8_val4[i]);
+            return 3*i+4;
+        }
+        if(((psVector*)table1->values->data[4])->data.S16[i] != tableU8_val5[i]) {
+            psError(PS_ERR_UNKNOWN,true,"Value in column 5 do not match: value[%d]=%d expected %d",i,
+                    ((psVector*)table1->values->data[4])->data.S16[i], tableU8_val5[i]);
+            return 3*i+5;
+        }
+        if(((psVector*)table1->values->data[5])->data.S32[i] != tableU8_val6[i]) {
+            psError(PS_ERR_UNKNOWN,true,"Value in column 6 do not match: value[%d]=%d expected %d",i,
+                    ((psVector*)table1->values->data[5])->data.S32[i], tableU8_val6[i]);
+            return 3*i+6;
+        }
+        if(((psVector*)table1->values->data[6])->data.S64[i] != tableU8_val7[i]) {
+            psError(PS_ERR_UNKNOWN,true,"Value in column 7 do not match: value[%d]=%lld expected %lld",i,
+                    ((psVector*)table1->values->data[6])->data.S64[i], tableU8_val7[i]);
+            return 3*i+7;
+        }
+        if(fabs(((psVector*)table1->values->data[7])->data.F32[i] - tableU8_val8[i]) > FLT_EPSILON ) {
+            psError(PS_ERR_UNKNOWN,true,"Value in column 8 do not match: value[%d]=%g expected %g",i,
+                    ((psVector*)table1->values->data[7])->data.F32[i], tableU8_val8[i]);
+            return 3*i+8;
+        }
+        if(fabs(((psVector*)table1->values->data[8])->data.F64[i] - tableU8_val9[i]) > FLT_EPSILON ) {
+            psError(PS_ERR_UNKNOWN,true,"Value in column 9 do not match: value[%d]=%g expected %g",i,
+                    ((psVector*)table1->values->data[8])->data.F32[i], tableU8_val9[i]);
+            return 3*i+9;
+        }
+    }
+    psFree(table1);
+
+    // Allocate table using table with psS32 index and valid types and index-values
+    table1 = psLookupTableAlloc("tableS32.dat", -110, 1000.5);
+    if(table1 == NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Unable to allocate table with tableS32.dat");
+        return 1;
+    }
+    table1 = psLookupTableRead(table1);
+    if(table1 == NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Unable to read table from file tableS32.dat");
+        return 2;
+    }
+    if( (fabs(table1->validFrom - tableS32_validFrom) > FLT_EPSILON) ||
+            (fabs(table1->validTo - tableS32_validTo) > FLT_EPSILON) ) {
+        psError(PS_ERR_UNKNOWN,true,"ValidFrom or validTo not set properly");
+        return 3;
+    }
+    for(psS32 i=0; i < tableS32_size; i++) {
+        if(table1->index->data.S32[i] != tableS32_index[i]) {
+            psError(PS_ERR_UNKNOWN,true,"Index values do not match: index[%d]=%d  expected %d",i,
+                    table1->index->data.S32[i], tableS32_index[i]);
+            return 4*i;
+        }
+    }
+    psFree(table1);
+
+    // Allocate table using table with psF32 index and valid types and index-values
+    table1 = psLookupTableAlloc("tableF32.dat", -1100, 5500.5);
+    if(table1 == NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Unable to allocate table with tableF32.dat");
+        return 1;
+    }
+    table1 = psLookupTableRead(table1);
+    if(table1 == NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Unable to read table from file tableF32.dat");
+        return 2;
+    }
+    if( (fabs(table1->validFrom - tableF32_validFrom) > errorTol_psF64) ||
+            (fabs(table1->validTo - tableF32_validTo) > errorTol_psF64) ) {
+        psError(PS_ERR_UNKNOWN,true,"ValidFrom or validTo not set properly");
+        return 3;
+    }
+    for(psS32 i=0; i < tableS32_size; i++) {
+        if(fabsf(table1->index->data.F32[i] - tableF32_index[i]) > FLT_EPSILON ) {
+            psError(PS_ERR_UNKNOWN,true,"Index values do not match: index[%d]=%d  expected %d",i,
+                    table1->index->data.F32[i], tableF32_index[i]);
+            return 4*i;
+        }
+    }
+    psFree(table1);
+
+    // Allocate table using psU8 index but with unsorted rows and verify the list is
+    // sorted properly after being read
+    table1 = psLookupTableAlloc("table10.dat",1,2);
+    if(table1 == NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Unable to allocate table with table10.dat");
+        return 1;
+    }
+    table1 = psLookupTableRead(table1);
+    if(table1 == NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Unable to read table with table10.dat");
+        return 2;
+    }
+    // Verify the validFrom and validTo are updated properly
+    if( (fabs(table1->validFrom - table10_validFrom) > FLT_EPSILON) ||
+            (fabs(table1->validTo - table10_validTo) > FLT_EPSILON) ) {
+        psError(PS_ERR_UNKNOWN,true,"ValidFrom or validTo not set properly");
+        return 3;
+    }
+    // Verify index and all values in table read properly
+    for(psS32 i=0; i < table10_size; i++) {
+        if(table1->index->data.U8[i] != table10_index[i]) {
+            psError(PS_ERR_UNKNOWN,true,"Index values do not match: index[%d]=%d  expected %d",i,
+                    table1->index->data.U8[i], table10_index[i]);
+            return 3*i;
+        }
+        if(((psVector*)table1->values->data[0])->data.U16[i] != table10_val1[i]) {
+            psError(PS_ERR_UNKNOWN,true,"Value in column 1 do not match: value[%d]=%d expected %d",i,
+                    ((psVector*)table1->values->data[0])->data.U16[i], table10_val1[i]);
+            return 3*i+1;
+        }
+        if(((psVector*)table1->values->data[1])->data.U32[i] != table10_val2[i]) {
+            psError(PS_ERR_UNKNOWN,true,"Value in column 2 do not match: value[%d]=%d expected %d",i,
+                    ((psVector*)table1->values->data[1])->data.U32[i], table10_val2[i]);
+            return 3*i+2;
+        }
+        if(((psVector*)table1->values->data[2])->data.U64[i] != table10_val3[i]) {
+            psError(PS_ERR_UNKNOWN,true,"Value in column 3 do not match: value[%d]=%lld expected %lld",i,
+                    ((psVector*)table1->values->data[2])->data.U64[i], table10_val3[i]);
+            return 3*i+3;
+        }
+        if(((psVector*)table1->values->data[3])->data.S8[i] != table10_val4[i]) {
+            psError(PS_ERR_UNKNOWN,true,"Value in column 4 do not match: value[%d]=%d expected %d",i,
+                    ((psVector*)table1->values->data[3])->data.S8[i], table10_val4[i]);
+            return 3*i+4;
+        }
+        if(((psVector*)table1->values->data[4])->data.S16[i] != table10_val5[i]) {
+            psError(PS_ERR_UNKNOWN,true,"Value in column 5 do not match: value[%d]=%d expected %d",i,
+                    ((psVector*)table1->values->data[4])->data.S16[i], table10_val5[i]);
+            return 3*i+5;
+        }
+        if(((psVector*)table1->values->data[5])->data.S32[i] != table10_val6[i]) {
+            psError(PS_ERR_UNKNOWN,true,"Value in column 6 do not match: value[%d]=%d expected %d",i,
+                    ((psVector*)table1->values->data[5])->data.S32[i], table10_val6[i]);
+            return 3*i+6;
+        }
+        if(((psVector*)table1->values->data[6])->data.S64[i] != table10_val7[i]) {
+            psError(PS_ERR_UNKNOWN,true,"Value in column 7 do not match: value[%d]=%lld expected %lld",i,
+                    ((psVector*)table1->values->data[6])->data.S64[i], table10_val7[i]);
+            return 3*i+7;
+        }
+        if(fabs(((psVector*)table1->values->data[7])->data.F32[i] - table10_val8[i]) > FLT_EPSILON ) {
+            psError(PS_ERR_UNKNOWN,true,"Value in column 8 do not match: value[%d]=%g expected %g",i,
+                    ((psVector*)table1->values->data[7])->data.F32[i], table10_val8[i]);
+            return 3*i+8;
+        }
+        if(fabs(((psVector*)table1->values->data[8])->data.F64[i] - table10_val9[i]) > FLT_EPSILON ) {
+            psError(PS_ERR_UNKNOWN,true,"Value in column 9 do not match: value[%d]=%g expected %g",i,
+                    ((psVector*)table1->values->data[8])->data.F32[i], table10_val9[i]);
+            return 3*i+9;
+        }
+    }
+    psFree(table1);
+
+    // Allocate table using table with invalid type in type row but valid index-values
+    table1 = psLookupTableAlloc("table2.dat",0,99.99);
+    if(table1 == NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Unable to allocate table with table2.dat");
+        return 3;
+    }
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message about invalid type");
+    table1 = psLookupTableRead(table1);
+    if(table1 == NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Unable to read table from file table2.dat");
+        return 4;
+    }
+    psFree(table1);
+
+    // Allocate table using table with invalid value
+    table1 = psLookupTableAlloc("table3.dat",0,75.0);
+    if(table1 == NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Unable to allocate table with table3.dat");
+        return 5;
+    }
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message about invalid value");
+    table1 = psLookupTableRead(table1);
+    if(table1 == NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Unable to read table from file table3.dat");
+        return 6;
+    }
+    psFree(table1);
+
+    // Attempt to read for non-existant file
+    table1 = psLookupTableAlloc("nonexistantFile.dat",0,100);
+    if(table1 == NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Unable to allocate table with non-existant file");
+        return 3;
+    }
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate error msg about opening file");
+    table1 = psLookupTableRead(table1);
+    if(table1 == NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Returned NULL when table should have been returned");
+        return 4;
+    }
+
+    // Attempt to read table with NULL specified file
+    psFree((char*)table1->fileName);
+    table1->fileName = NULL;
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate error msg about NULL file name");
+    if(psLookupTableRead(table1) != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Did not return NULL with table specifying NULL file name");
+        return 5;
+    }
+    psFree(table1);
+
+    // Attempt to read table with NULL table
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate error msg about NULL table");
+    if(psLookupTableRead(NULL) != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Did not return NULL with NULL table.");
+        return 6;
+    }
+
+    return 0;
+}
+
+psS32 testLookupTableInterpolate(void)
+{
+    psLookupStatusType status = 0;
+    psLookupTable*  table1 = NULL;
+    psF64            out1 = 0;
+
+    // Interpolate values within the list and verify return values
+    table1 = psLookupTableAlloc("table10.dat",0,20);
+    table1 = psLookupTableRead(table1);
+    for(psS32 i = 0; i < table1->numRows-1; i++ ) {
+        out1 = psLookupTableInterpolate(table1, 5.25, i, &status);
+        if( fabs(out1-interpolVal1[i]) > errorTol_psF64) {
+            psError(PS_ERR_UNKNOWN,true,"Did not return expected value. %lg expected %lg",out1,interpolVal1[i]);
+            return 3*i;
+        }
+    }
+    for(psS32 i = 0; i < table1->numRows-1; i++ ) {
+        out1 = psLookupTableInterpolate(table1, 5.0, i, &status);
+        if( fabs(out1-interpolVal2[i]) > errorTol_psF64) {
+            psError(PS_ERR_UNKNOWN,true,"Did not return expected value. %lg expected %lg",out1,interpolVal2[i]);
+            return 4*i;
+        }
+    }
+
+    // Interpolate value just below the lowest index value
+    out1 = psLookupTableInterpolate(table1,0,0, &status);
+    if ( fabs(out1- NAN) > FLT_EPSILON ) {
+        psError(PS_ERR_UNKNOWN,true,"Did not return NAN returned %lf",out1);
+        return 5;
+    }
+    if ( status != PS_LOOKUP_PAST_TOP) {
+        psError(PS_ERR_UNKNOWN,true,"Did not return status PAST TOP");
+        return 6;
+    }
+
+    // Interpolate value just above the highest index value
+    out1 = psLookupTableInterpolate(table1,11,0, &status);
+    if ( fabs(out1-NAN) > FLT_EPSILON ) {
+        psError(PS_ERR_UNKNOWN,true,"Did not return NAN returned %lf",out1);
+        return 7;
+    }
+    if ( status != PS_LOOKUP_PAST_BOTTOM) {
+        psError(PS_ERR_UNKNOWN,true,"Did not return status PAST BOTTOM");
+        return 8;
+    }
+
+    // Interpolate value with a column number greater than the table has
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate error out of range.");
+    out1 = psLookupTableInterpolate(table1, 5, 100, &status);
+    if ( fabs(out1-NAN) > FLT_EPSILON ) {
+        psError(PS_ERR_UNKNOWN,true,"Did not return NAN returned %lf",out1);
+        return 9;
+    }
+    if ( status != PS_LOOKUP_ERROR ) {
+        psError(PS_ERR_UNKNOWN,true,"Did not return status LOOKUP ERROR");
+        return 10;
+    }
+
+    // Interpolate with NULL table
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate error NULL table");
+    out1 = psLookupTableInterpolate(NULL,5,0,&status);
+    if( fabs(out1-NAN) > FLT_EPSILON ) {
+        psError(PS_ERR_UNKNOWN,true,"Did not return NAN returned %lf",out1);
+        return 11;
+    }
+    if ( status != PS_LOOKUP_ERROR ) {
+        psError(PS_ERR_UNKNOWN,true,"Did not return status LOOKUP ERROR");
+        return 12;
+    }
+
+    // Interpolate with status NULL
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error NULL status");
+    out1 = psLookupTableInterpolate(table1,5,0,NULL);
+    if ( fabs(out1-NAN) > FLT_EPSILON ) {
+        psError(PS_ERR_UNKNOWN,true,"Did not return NAN returned %lf",out1);
+        return 13;
+    }
+
+    psFree(table1);
+
+    return 0;
+}
+
+psS32 testLookupTableInterpolateAll(void)
+{
+    psLookupTable*  table1 = NULL;
+    psVector*        interpValues;
+    psVector*        statusVector;
+
+    // Interpolate values within the list and verify return values
+    table1 = psLookupTableAlloc("table10.dat",0,20);
+    table1 = psLookupTableRead(table1);
+    statusVector = psVectorAlloc(table1->numCols,PS_TYPE_U32);
+    interpValues = psLookupTableInterpolateAll(table1,5.25, statusVector);
+    if(interpValues == NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Returned vector is NULL.");
+        return 1;
+    }
+    for(psS32 i = 0; i < table1->numRows-1; i++ ) {
+        if( fabs(interpValues->data.F64[i]-interpolVal1[i]) > errorTol_psF64) {
+            psError(PS_ERR_UNKNOWN,true,"Did not return expected value. %lg expected %lg",
+                    interpValues->data.F64[i],interpolVal1[i]);
+            return 2*i;
+        }
+    }
+    for(psS32 j = 0; j < table1->numCols; j++) {
+        if(statusVector->data.U32[j] != PS_LOOKUP_SUCCESS) {
+            psError(PS_ERR_UNKNOWN,true,"Return status not success for col=%d status=%d",
+                    j,statusVector->data.U32[j]);
+            return 3*j;
+        }
+    }
+    psFree(statusVector);
+    psFree(interpValues);
+
+    // Interpolate values with index outside table
+    statusVector = psVectorAlloc(table1->numCols,PS_TYPE_U32);
+    interpValues = psLookupTableInterpolateAll(table1,0,statusVector);
+    if(interpValues == NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Did return NULL");
+        return 4;
+    }
+
+    for(psS32 i = 0; i < table1->numRows-1; i++ ) {
+        if( fabs(interpValues->data.F64[i]-interpolVal3[i]) > errorTol_psF64) {
+            psError(PS_ERR_UNKNOWN,true,"Did not return expected value. %lg expected %lg",
+                    interpValues->data.F64[i],interpolVal3[i]);
+            return 2*i;
+        }
+    }
+
+    for(psS32 j = 0; j < table1->numCols; j++) {
+        if(statusVector->data.S32[j] != PS_LOOKUP_PAST_TOP) {
+            psError(PS_ERR_UNKNOWN,true,"Return status did not indicate passed top  for col=%d status=%d",
+                    j,statusVector->data.U32[j]);
+            return 3*j;
+        }
+    }
+    psFree(interpValues);
+    psFree(statusVector);
+
+    // Interpolate values with NULL table
+    statusVector = psVectorAlloc(table1->numCols,PS_TYPE_S32);
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message for NULL table");
+    interpValues = psLookupTableInterpolateAll(NULL,5,statusVector);
+    if(interpValues != NULL ) {
+        psError(PS_ERR_UNKNOWN,true,"Did not return NULL for NULL table");
+        return 5;
+    }
+    psFree(statusVector);
+
+    // Interpolate values with NULL status vector
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message for NULL status vector");
+    interpValues = psLookupTableInterpolateAll(table1,5,NULL);
+    if(interpValues != NULL ) {
+        psError(PS_ERR_UNKNOWN,true,"Did not return NULL for NULL status vector");
+        return 6;
+    }
+    psFree(table1);
+
+    return 0;
+}
+
Index: /tags/ipp-1-X/bug123/psLib/test/dataIO/verified/table10.dat
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/dataIO/verified/table10.dat	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/dataIO/verified/table10.dat	(revision 22331)
@@ -0,0 +1,14 @@
+#  Table with valid types and index-values
+#
+psU8     psU16    psU32     psU64    psS8    psS16    psS32    psS64    psF32   psF64
+6        14       28        256      -6      -14      -28      -256     1.50    13.98
+10       22       44        4096     -10     -22      -44      -4096    4.50    27.30
+1        4        8         16       -1      -4       -8       -16      -2.25   -2.67
+3        8        16        32       -3      -8       -16      -32      -0.75   3.99
+9        20       40        2048     -9      -20      -40      -2048    3.75    23.97
+2        6        12        24       -2      -6       -12      -24      -1.5    0.66
+7        16       32        512      -7      -16      -32      -512     2.250   17.31
+4        10       20        64       -4      -10      -20      -64      0.00    7.32
+5        12       24        128      -5      -12      -24      -128     0.75    10.65
+8        18       36        1024     -8      -18      -36      -1024    3.00    20.64
+#
Index: /tags/ipp-1-X/bug123/psLib/test/dataIO/verified/table2.dat
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/dataIO/verified/table2.dat	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/dataIO/verified/table2.dat	(revision 22331)
@@ -0,0 +1,8 @@
+# Table with invalid type in the type row but with valid index-values
+#
+psU8     psU16    psU32     psU64    psXS8    psS16    psS32    psS64    psF32   psF64
+0        2        4         8        0       -2       -4       -8       -0.5    -1.5
+1        4        8         16       -1      -4       -8       -16      0.0     -1.0
+2        6        12        24       -2      -6       -12      -24      0.5     -0.25
+3        8        16        32       -3      -8       -16      -32      0.75     1.75
+#
Index: /tags/ipp-1-X/bug123/psLib/test/dataIO/verified/table3.dat
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/dataIO/verified/table3.dat	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/dataIO/verified/table3.dat	(revision 22331)
@@ -0,0 +1,8 @@
+#  Table with valid types and index-values
+#
+psU8     psU16    psU32     psU64    psS8    psS16    psS32    psS64    psF32   psF64
+0        2        4         8        0       -2       -4       -8       -0.5    -1.5
+1)       4=       8;        1(6      -1_     -4$      -8@      -16{     0.0[    -1.0]
+2        6        12        24       -2      -6       -12      -24      0.5     -0.25
+3        8        16        32       -3      -8       -16      -32      0.75     1.75
+#
Index: /tags/ipp-1-X/bug123/psLib/test/dataIO/verified/tableF32.dat
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/dataIO/verified/tableF32.dat	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/dataIO/verified/tableF32.dat	(revision 22331)
@@ -0,0 +1,8 @@
+#  Table with valid types and index-values
+#
+psF32     psU16    psU32     psU64    psS8    psS16    psS32    psS64    psU8   psF64
+-10.05    2        4         8        0       -2       -4       -8       5      -1.5
+1.009     4        8         16       -1      -4       -8       -16      0      -1.0
+23.45     6        12        24       -2      -6       -12      -24      5      -0.25
+3500.67   8        16        32       -3      -8       -16      -32      75     1.75
+#
Index: /tags/ipp-1-X/bug123/psLib/test/dataIO/verified/tableS32.dat
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/dataIO/verified/tableS32.dat	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/dataIO/verified/tableS32.dat	(revision 22331)
@@ -0,0 +1,8 @@
+#  Table with valid types and index-values
+#
+psS32    psU16    psU32     psU64    psS8    psS16    psU8     psS64    psF32   psF64
+-1       2        4         8        0       -2       99       -8       -0.5    -1.5
+11       4        8         16       -1      -4       100       -16      0.0     -1.0
+22       6        12        24       -2      -6       101      -24      0.5     -0.25
+33       8        16        32       -3      -8       102      -32      0.75     1.75
+#
Index: /tags/ipp-1-X/bug123/psLib/test/dataIO/verified/tableU8.dat
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/dataIO/verified/tableU8.dat	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/dataIO/verified/tableU8.dat	(revision 22331)
@@ -0,0 +1,8 @@
+#  Table with valid types and index-values
+#
+psU8     psU16    psU32     psU64    psS8    psS16    psS32    psS64    psF32   psF64
+0        2        4         8        0       -2       -4       -8       -0.5    -1.5
+1        4        8         16       -1      -4       -8       -16      0.0     -1.0
+2        6        12        24       -2      -6       -12      -24      0.5     -0.25
+3        8        16        32       -3      -8       -16      -32      0.75     1.75
+#
Index: /tags/ipp-1-X/bug123/psLib/test/dataIO/verified/tst_psDB.stderr
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/dataIO/verified/tst_psDB.stderr	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/dataIO/verified/tst_psDB.stderr	(revision 22331)
@@ -0,0 +1,305 @@
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psDB.c                                                 *
+*            TestPoint: psDB{dbInit}                                               *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|I|TPDBInit
+    psDBInit/psDBCleanup shall initialize/cleanup database connection.
+<DATE><TIME>|<HOST>|I|_init_psDB
+    initialize database connection...
+
+---> TESTPOINT PASSED (psDB{dbInit} | tst_psDB.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psDB.c                                                 *
+*            TestPoint: psDB{dbChange}                                             *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|I|_init_psDB
+    initialize database connection...
+<DATE><TIME>|<HOST>|I|TPDBChange
+    psDBChange shall change to a new test database.
+
+---> TESTPOINT PASSED (psDB{dbChange} | tst_psDB.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psDB.c                                                 *
+*            TestPoint: psDB{dbCreateTable}                                        *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|I|_init_psDB
+    initialize database connection...
+<DATE><TIME>|<HOST>|I|TPDBCreateTable
+    psDBCreateTable shall create a new table in the new test database.
+
+---> TESTPOINT PASSED (psDB{dbCreateTable} | tst_psDB.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psDB.c                                                 *
+*            TestPoint: psDB{dbDropTable}                                          *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|I|_init_psDB
+    initialize database connection...
+<DATE><TIME>|<HOST>|I|TPDBDropTable
+    psDBDropTable shall create/drop a new table in the new test database.
+<DATE><TIME>|<HOST>|I|TPDBDropTable
+    psDBDropTable: insert should fail here...
+<DATE><TIME>|<HOST>|E|psDBInsertRows (FILE:LINENO)
+    Failed to prepare query.  Error: Table 'test.table2' doesn't exist
+<DATE><TIME>|<HOST>|E|psDBInsertOneRow (FILE:LINENO)
+    Insert failed.
+
+---> TESTPOINT PASSED (psDB{dbDropTable} | tst_psDB.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psDB.c                                                 *
+*            TestPoint: psDB{dbSelectColumn}                                       *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|I|_init_psDB
+    initialize database connection...
+<DATE><TIME>|<HOST>|I|TPDBSelectColumn
+    psDBSelectColumn shall select data from a test table.
+<DATE><TIME>|<HOST>|I|TPDBSelectColumn
+    psDBSelectColumn: [hello world!]
+<DATE><TIME>|<HOST>|I|TPDBSelectColumn
+    psDBSelectColumn: [hello world!]
+<DATE><TIME>|<HOST>|I|TPDBSelectColumn
+    psDBSelectColumn: [hello world!]
+<DATE><TIME>|<HOST>|I|TPDBSelectColumn
+    found expected string output.
+
+---> TESTPOINT PASSED (psDB{dbSelectColumn} | tst_psDB.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psDB.c                                                 *
+*            TestPoint: psDB{dbSelectColumnNum}                                    *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|I|_init_psDB
+    initialize database connection...
+<DATE><TIME>|<HOST>|I|TPDBSelectColumnNum
+    psDBSelectColumnNum shall select data from a test table.
+<DATE><TIME>|<HOST>|I|TPDBSelectColumnNum
+    str=[1974]
+<DATE><TIME>|<HOST>|I|TPDBSelectColumnNum
+    str=[1974]
+<DATE><TIME>|<HOST>|I|TPDBSelectColumnNum
+    str=[1974]
+<DATE><TIME>|<HOST>|I|TPDBSelectColumnNum
+    found expected S32 output.
+
+---> TESTPOINT PASSED (psDB{dbSelectColumnNum} | tst_psDB.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psDB.c                                                 *
+*            TestPoint: psDB{dbSelectRows}                                         *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|I|_init_psDB
+    initialize database connection...
+<DATE><TIME>|<HOST>|I|TPDBSelectRows
+    psDBSelectRows shall select data from a test table.
+<DATE><TIME>|<HOST>|I|_print_row
+    [key_string]=[hello world!]
+<DATE><TIME>|<HOST>|I|_print_row
+    [key_s32]=[1974]
+<DATE><TIME>|<HOST>|I|_print_row
+    [key_f32]=[3.14159]
+<DATE><TIME>|<HOST>|I|_print_row
+    [key_f64]=[2.71828]
+<DATE><TIME>|<HOST>|I|_print_row
+    [key_string]=[hello world!]
+<DATE><TIME>|<HOST>|I|_print_row
+    [key_s32]=[1974]
+<DATE><TIME>|<HOST>|I|_print_row
+    [key_f32]=[3.14159]
+<DATE><TIME>|<HOST>|I|_print_row
+    [key_f64]=[2.71828]
+<DATE><TIME>|<HOST>|I|_print_row
+    [key_string]=[hello world!]
+<DATE><TIME>|<HOST>|I|_print_row
+    [key_s32]=[1974]
+<DATE><TIME>|<HOST>|I|_print_row
+    [key_f32]=[3.14159]
+<DATE><TIME>|<HOST>|I|_print_row
+    [key_f64]=[2.71828]
+<DATE><TIME>|<HOST>|I|TPDBSelectRows
+    found expected output.
+
+---> TESTPOINT PASSED (psDB{dbSelectRows} | tst_psDB.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psDB.c                                                 *
+*            TestPoint: psDB{dbInsertOneRow}                                       *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|I|_init_psDB
+    initialize database connection...
+<DATE><TIME>|<HOST>|I|TPDBInsertOneRow
+    psDBInsertOneRow shall insert a row into a test table.
+
+---> TESTPOINT PASSED (psDB{dbInsertOneRow} | tst_psDB.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psDB.c                                                 *
+*            TestPoint: psDB{dbInsertRows}                                         *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|I|_init_psDB
+    initialize database connection...
+<DATE><TIME>|<HOST>|I|TPDBInsertRows
+    psDBInsertRows shall insert rows into a test table.
+<DATE><TIME>|<HOST>|I|_print_row
+    [key_string]=[hello world!]
+<DATE><TIME>|<HOST>|I|_print_row
+    [key_s32]=[1974]
+<DATE><TIME>|<HOST>|I|_print_row
+    [key_f32]=[3.14159]
+<DATE><TIME>|<HOST>|I|_print_row
+    [key_f64]=[2.71828]
+<DATE><TIME>|<HOST>|I|_print_row
+    [key_string]=[hello world!]
+<DATE><TIME>|<HOST>|I|_print_row
+    [key_s32]=[1974]
+<DATE><TIME>|<HOST>|I|_print_row
+    [key_f32]=[3.14159]
+<DATE><TIME>|<HOST>|I|_print_row
+    [key_f64]=[2.71828]
+<DATE><TIME>|<HOST>|I|_print_row
+    [key_string]=[hello world!]
+<DATE><TIME>|<HOST>|I|_print_row
+    [key_s32]=[1974]
+<DATE><TIME>|<HOST>|I|_print_row
+    [key_f32]=[3.14159]
+<DATE><TIME>|<HOST>|I|_print_row
+    [key_f64]=[2.71828]
+<DATE><TIME>|<HOST>|I|TPDBInsertRows
+    found expected output.
+
+---> TESTPOINT PASSED (psDB{dbInsertRows} | tst_psDB.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psDB.c                                                 *
+*            TestPoint: psDB{dbDumpRows}                                           *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|I|_init_psDB
+    initialize database connection...
+<DATE><TIME>|<HOST>|I|TPDBDumpRows
+    psDBDumpRows shall dump all rows from a test table.
+<DATE><TIME>|<HOST>|I|_print_row
+    [key_string]=[hello world!]
+<DATE><TIME>|<HOST>|I|_print_row
+    [key_s32]=[1974]
+<DATE><TIME>|<HOST>|I|_print_row
+    [key_f32]=[3.14159]
+<DATE><TIME>|<HOST>|I|_print_row
+    [key_f64]=[2.71828]
+<DATE><TIME>|<HOST>|I|_print_row
+    [key_string]=[hello world!]
+<DATE><TIME>|<HOST>|I|_print_row
+    [key_s32]=[1974]
+<DATE><TIME>|<HOST>|I|_print_row
+    [key_f32]=[3.14159]
+<DATE><TIME>|<HOST>|I|_print_row
+    [key_f64]=[2.71828]
+<DATE><TIME>|<HOST>|I|_print_row
+    [key_string]=[hello world!]
+<DATE><TIME>|<HOST>|I|_print_row
+    [key_s32]=[1974]
+<DATE><TIME>|<HOST>|I|_print_row
+    [key_f32]=[3.14159]
+<DATE><TIME>|<HOST>|I|_print_row
+    [key_f64]=[2.71828]
+<DATE><TIME>|<HOST>|I|TPDBDumpRows
+    found expected output.
+
+---> TESTPOINT PASSED (psDB{dbDumpRows} | tst_psDB.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psDB.c                                                 *
+*            TestPoint: psDB{dbDumpCols}                                           *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|I|_init_psDB
+    initialize database connection...
+<DATE><TIME>|<HOST>|I|TPDBDumpCols
+    psDBDumpCols shall dump all cols from a test table.
+<DATE><TIME>|<HOST>|I|_print_row
+    [key_string]=[]
+<DATE><TIME>|<HOST>|I|_print_row
+    [key_s32]=[0]
+<DATE><TIME>|<HOST>|I|_print_row
+    [key_f32]=[0]
+<DATE><TIME>|<HOST>|I|_print_row
+    [key_f64]=[0]
+
+---> TESTPOINT PASSED (psDB{dbDumpCols} | tst_psDB.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psDB.c                                                 *
+*            TestPoint: psDB{dbUpdateRows}                                         *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|I|_init_psDB
+    initialize database connection...
+<DATE><TIME>|<HOST>|I|TPDBUpdateRows
+    psDBUpdateRows shall update rows in a test table.
+<DATE><TIME>|<HOST>|I|_print_row
+    [key_string]=[foobar]
+<DATE><TIME>|<HOST>|I|_print_row
+    [key_s32]=[-18]
+<DATE><TIME>|<HOST>|I|_print_row
+    [key_f32]=[3.33]
+<DATE><TIME>|<HOST>|I|_print_row
+    [key_f64]=[1.23457]
+<DATE><TIME>|<HOST>|I|_print_row
+    [key_string]=[foobar]
+<DATE><TIME>|<HOST>|I|_print_row
+    [key_s32]=[-18]
+<DATE><TIME>|<HOST>|I|_print_row
+    [key_f32]=[3.33]
+<DATE><TIME>|<HOST>|I|_print_row
+    [key_f64]=[1.23457]
+<DATE><TIME>|<HOST>|I|_print_row
+    [key_string]=[foobar]
+<DATE><TIME>|<HOST>|I|_print_row
+    [key_s32]=[-18]
+<DATE><TIME>|<HOST>|I|_print_row
+    [key_f32]=[3.33]
+<DATE><TIME>|<HOST>|I|_print_row
+    [key_f64]=[1.23457]
+<DATE><TIME>|<HOST>|I|TPDBUpdateRows
+    found expected output.
+
+---> TESTPOINT PASSED (psDB{dbUpdateRows} | tst_psDB.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psDB.c                                                 *
+*            TestPoint: psDB{dbDeleteRows}                                         *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|I|_init_psDB
+    initialize database connection...
+<DATE><TIME>|<HOST>|I|TPDBDeleteRows
+    psDBDeleteRows shall delete rows from a test table.
+<DATE><TIME>|<HOST>|I|TPDBDeleteRows
+    found expected empty table.
+
+---> TESTPOINT PASSED (psDB{dbDeleteRows} | tst_psDB.c)
+
Index: /tags/ipp-1-X/bug123/psLib/test/dataIO/verified/tst_psFits.stderr
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/dataIO/verified/tst_psFits.stderr	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/dataIO/verified/tst_psFits.stderr	(revision 22331)
@@ -0,0 +1,187 @@
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psFits.c                                               *
+*            TestPoint: psImage{psFitsAlloc}                                       *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psImage{psFitsAlloc} | tst_psFits.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psFits.c                                               *
+*            TestPoint: psImage{psFitsMoveExtName}                                 *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|I|tst_psFitsMoveExtName
+    Following should be an error.
+<DATE><TIME>|<HOST>|E|psFitsMoveExtName (FILE:LINENO)
+    Could not find HDU 'bogus' in file multi.fits.
+    CFITSIO Error: illegal HDU number
+<DATE><TIME>|<HOST>|I|tst_psFitsMoveExtName
+    Following should be an error.
+<DATE><TIME>|<HOST>|E|psFitsMoveExtName (FILE:LINENO)
+    The input psFits object can not NULL.
+<DATE><TIME>|<HOST>|I|tst_psFitsMoveExtName
+    Following should be an error.
+<DATE><TIME>|<HOST>|E|psFitsMoveExtName (FILE:LINENO)
+    Specified extension name can not be NULL.
+
+---> TESTPOINT PASSED (psImage{psFitsMoveExtName} | tst_psFits.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psFits.c                                               *
+*            TestPoint: psImage{psFitsMoveExtNum}                                  *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|I|tst_psFitsMoveExtNum
+    Following should be an error.
+<DATE><TIME>|<HOST>|E|psFitsGetSize (FILE:LINENO)
+    The input psFits object can not NULL.
+<DATE><TIME>|<HOST>|I|tst_psFitsMoveExtNum
+    Following should be an error.
+<DATE><TIME>|<HOST>|E|psFitsMoveExtNum (FILE:LINENO)
+    Could not move to specified HDU #-1 in file multi.fits.
+    CFITSIO Error: illegal HDU number
+<DATE><TIME>|<HOST>|I|tst_psFitsMoveExtNum
+    Following should be an error.
+<DATE><TIME>|<HOST>|E|psFitsMoveExtNum (FILE:LINENO)
+    Could not move -1 HDUs from current position in file multi.fits.
+    CFITSIO Error: illegal HDU number
+<DATE><TIME>|<HOST>|I|tst_psFitsMoveExtNum
+    Following should be an error.
+<DATE><TIME>|<HOST>|E|psFitsMoveExtNum (FILE:LINENO)
+    Could not move to specified HDU #8 in file multi.fits.
+    CFITSIO Error: tried to move past end of file
+<DATE><TIME>|<HOST>|I|tst_psFitsMoveExtNum
+    Following should be an error.
+<DATE><TIME>|<HOST>|E|psFitsMoveExtNum (FILE:LINENO)
+    Could not move 1 HDUs from current position in file multi.fits.
+    CFITSIO Error: tried to move past end of file
+<DATE><TIME>|<HOST>|I|tst_psFitsMoveExtNum
+    Following should be an error.
+<DATE><TIME>|<HOST>|E|psFitsMoveExtNum (FILE:LINENO)
+    The input psFits object can not NULL.
+
+---> TESTPOINT PASSED (psImage{psFitsMoveExtNum} | tst_psFits.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psFits.c                                               *
+*            TestPoint: psImage{psFitsReadHeader}                                  *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|I|tst_psFitsReadHeader
+    following should be an error (input psFits = NULL)
+<DATE><TIME>|<HOST>|E|psFitsReadHeader (FILE:LINENO)
+    The input psFits object can not NULL.
+
+---> TESTPOINT PASSED (psImage{psFitsReadHeader} | tst_psFits.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psFits.c                                               *
+*            TestPoint: psImage{psFitsReadHeaderSet}                               *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|E|psFitsReadHeaderSet (FILE:LINENO)
+    The input psFits object can not NULL.
+
+---> TESTPOINT PASSED (psImage{psFitsReadHeaderSet} | tst_psFits.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psFits.c                                               *
+*            TestPoint: psImage{psFitsReadTable}                                   *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|E|psFitsReadTable (FILE:LINENO)
+    The input psFits object can not NULL.
+
+---> TESTPOINT PASSED (psImage{psFitsReadTable} | tst_psFits.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psFits.c                                               *
+*            TestPoint: psImage{psFitsReadTableColumnNum}                          *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|W|tst_psFitsReadTableColumnNum (FILE:LINENO)
+    Following should be an error.
+<DATE><TIME>|<HOST>|E|psFitsReadTableColumnNum (FILE:LINENO)
+    The input psFits object can not NULL.
+<DATE><TIME>|<HOST>|W|tst_psFitsReadTableColumnNum (FILE:LINENO)
+    Following should be an error.
+<DATE><TIME>|<HOST>|E|psFitsReadTableColumnNum (FILE:LINENO)
+    Specified column, BOGUS, was not found.
+    CFITSIO Error: named column not found
+
+---> TESTPOINT PASSED (psImage{psFitsReadTableColumnNum} | tst_psFits.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psFits.c                                               *
+*            TestPoint: psImage{psFitsReadTableColumn}                             *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|W|tst_psFitsReadTableColumn (FILE:LINENO)
+    Following should be an error.
+<DATE><TIME>|<HOST>|E|psFitsReadTableColumn (FILE:LINENO)
+    The input psFits object can not NULL.
+<DATE><TIME>|<HOST>|W|tst_psFitsReadTableColumn (FILE:LINENO)
+    tst_psFitsReadTableColumn
+<DATE><TIME>|<HOST>|E|psFitsReadTableColumn (FILE:LINENO)
+    Specified column, BOGUS, was not found.
+    CFITSIO Error: named column not found
+
+---> TESTPOINT PASSED (psImage{psFitsReadTableColumn} | tst_psFits.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psFits.c                                               *
+*            TestPoint: psImage{psFitsUpdateTable}                                 *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|W|tst_psFitsUpdateTable (FILE:LINENO)
+    Following should be a warning.
+<DATE><TIME>|<HOST>|W|psFitsUpdateTable (FILE:LINENO)
+    No column with the name 'BOGUS' exists in the table.
+<DATE><TIME>|<HOST>|W|tst_psFitsUpdateTable (FILE:LINENO)
+    Following should be an error.
+<DATE><TIME>|<HOST>|E|psFitsUpdateTable (FILE:LINENO)
+    The input psFits object can not NULL.
+<DATE><TIME>|<HOST>|W|tst_psFitsUpdateTable (FILE:LINENO)
+    Following should be an error.
+<DATE><TIME>|<HOST>|E|psFitsUpdateTable (FILE:LINENO)
+    The input psImage was NULL.  Need a non-NULL psImage for operation to be performed.
+<DATE><TIME>|<HOST>|W|tst_psFitsUpdateTable (FILE:LINENO)
+    Following should be an error.
+<DATE><TIME>|<HOST>|E|psFitsUpdateTable (FILE:LINENO)
+    Could not write data to file,'table.fits'.
+    CFITSIO Error: bad first row number
+
+---> TESTPOINT PASSED (psImage{psFitsUpdateTable} | tst_psFits.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psFits.c                                               *
+*            TestPoint: psImage{psFitsReadImage}                                   *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psImage{psFitsReadImage} | tst_psFits.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psFits.c                                               *
+*            TestPoint: psImage{psFitsWriteImage}                                  *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|I|testImageWrite
+    Following should generate an error message because input image is null.
+<DATE><TIME>|<HOST>|E|psFitsWriteImage (FILE:LINENO)
+    The input psImage was NULL.  Need a non-NULL psImage for operation to be performed.
+
+---> TESTPOINT PASSED (psImage{psFitsWriteImage} | tst_psFits.c)
+
Index: /tags/ipp-1-X/bug123/psLib/test/dataIO/verified/tst_psLookupTable_01.stderr
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/dataIO/verified/tst_psLookupTable_01.stderr	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/dataIO/verified/tst_psLookupTable_01.stderr	(revision 22331)
@@ -0,0 +1,102 @@
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psLookupTable_01.c                                     *
+*            TestPoint: psLookupTable{psLookupTableAlloc}                          *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|I|testLookupTableAlloc
+    Following should generate error message for invalid file name
+<DATE><TIME>|<HOST>|E|psLookupTableAlloc (FILE:LINENO)
+    Unallowable operation: fileName is NULL.
+
+---> TESTPOINT PASSED (psLookupTable{psLookupTableAlloc} | tst_psLookupTable_01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psLookupTable_01.c                                     *
+*            TestPoint: psLookupTable{psLookupTableRead}                           *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|I|testLookupTableRead
+    Following should generate an error message about invalid type
+<DATE><TIME>|<HOST>|E|printError (FILE:LINENO)
+    Unable to parse type, (null) on line 3.
+<DATE><TIME>|<HOST>|E|psLookupTableRead (FILE:LINENO)
+    Lookup table is invalid.
+<DATE><TIME>|<HOST>|I|testLookupTableRead
+    Following should generate an error message about invalid value
+<DATE><TIME>|<HOST>|E|printError (FILE:LINENO)
+    Unable to parse string, 1) on line 5.
+<DATE><TIME>|<HOST>|E|printError (FILE:LINENO)
+    Unable to parse string, 4= on line 5.
+<DATE><TIME>|<HOST>|E|printError (FILE:LINENO)
+    Unable to parse string, 8; on line 5.
+<DATE><TIME>|<HOST>|E|printError (FILE:LINENO)
+    Unable to parse string, 1(6 on line 5.
+<DATE><TIME>|<HOST>|E|printError (FILE:LINENO)
+    Unable to parse string, -1_ on line 5.
+<DATE><TIME>|<HOST>|E|printError (FILE:LINENO)
+    Unable to parse string, -4$ on line 5.
+<DATE><TIME>|<HOST>|E|printError (FILE:LINENO)
+    Unable to parse string, -8@ on line 5.
+<DATE><TIME>|<HOST>|E|printError (FILE:LINENO)
+    Unable to parse string, -16{ on line 5.
+<DATE><TIME>|<HOST>|E|printError (FILE:LINENO)
+    Unable to parse string, 0.0[ on line 5.
+<DATE><TIME>|<HOST>|E|printError (FILE:LINENO)
+    Unable to parse string, -1.0] on line 5.
+<DATE><TIME>|<HOST>|E|psLookupTableRead (FILE:LINENO)
+    Lookup table is invalid.
+<DATE><TIME>|<HOST>|I|testLookupTableRead
+    Following should generate error msg about opening file
+<DATE><TIME>|<HOST>|E|psLookupTableRead (FILE:LINENO)
+    Failed to open file nonexistantFile.dat.
+<DATE><TIME>|<HOST>|I|testLookupTableRead
+    Following should generate error msg about NULL file name
+<DATE><TIME>|<HOST>|E|psLookupTableRead (FILE:LINENO)
+    Unallowable operation: table->fileName is NULL.
+<DATE><TIME>|<HOST>|I|testLookupTableRead
+    Following should generate error msg about NULL table
+<DATE><TIME>|<HOST>|E|psLookupTableRead (FILE:LINENO)
+    Unallowable operation: table is NULL.
+
+---> TESTPOINT PASSED (psLookupTable{psLookupTableRead} | tst_psLookupTable_01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psLookupTable_01.c                                     *
+*            TestPoint: psLookupTable{psLookupTableInterpolate}                    *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|I|testLookupTableInterpolate
+    Following should generate error out of range.
+<DATE><TIME>|<HOST>|E|psLookupTableInterpolate (FILE:LINENO)
+    Error: column, 100, is out of range.  Must be between 0 and 8.
+<DATE><TIME>|<HOST>|I|testLookupTableInterpolate
+    Following should generate error NULL table
+<DATE><TIME>|<HOST>|E|psLookupTableInterpolate (FILE:LINENO)
+    Unallowable operation: table is NULL.
+<DATE><TIME>|<HOST>|I|testLookupTableInterpolate
+    Following should generate an error NULL status
+<DATE><TIME>|<HOST>|E|psLookupTableInterpolate (FILE:LINENO)
+    Unallowable operation: status is NULL.
+
+---> TESTPOINT PASSED (psLookupTable{psLookupTableInterpolate} | tst_psLookupTable_01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psLookupTable_01.c                                     *
+*            TestPoint: psLookupTable{psLookupTableInterpolateAll}                 *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|I|testLookupTableInterpolateAll
+    Following should generate an error message for NULL table
+<DATE><TIME>|<HOST>|E|psLookupTableInterpolateAll (FILE:LINENO)
+    Unallowable operation: table is NULL.
+<DATE><TIME>|<HOST>|I|testLookupTableInterpolateAll
+    Following should generate an error message for NULL status vector
+<DATE><TIME>|<HOST>|E|psLookupTableInterpolateAll (FILE:LINENO)
+    Unallowable operation: stats is NULL.
+
+---> TESTPOINT PASSED (psLookupTable{psLookupTableInterpolateAll} | tst_psLookupTable_01.c)
+
Index: /tags/ipp-1-X/bug123/psLib/test/dataManip/.cvsignore
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/dataManip/.cvsignore	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/dataManip/.cvsignore	(revision 22331)
@@ -0,0 +1,66 @@
+.deps
+.libs
+Makefile
+Makefile.in
+temp
+tmpImages
+tst_psMatrix01
+tst_psStats00
+tst_psStats01
+tst_psStats02
+tst_psStats03
+tst_psStats04
+tst_psFunc00
+tst_psFunc01
+tst_psHist00
+tst_psHist01
+tst_psHist02
+tst_psImageIO
+tst_psImageStats00
+tst_psImageStats01
+tst_psImageStats02
+tst_psMatrix02
+tst_psMatrix03
+tst_psMatrix04
+tst_psMatrix05
+tst_psMatrix06
+tst_psMatrix07
+tst_psStats05
+tst_psStats06
+tst_psStats07
+tst_psStats08
+tst_psStats09
+tst_psImageFFT
+tst_psVectorFFT
+tst_psImageStats03
+tst_psMatrixVectorArithmetic01
+tst_psMatrixVectorArithmetic02
+test/dataManip/tst_psImageManip
+tst_psMatrixVectorArithmetic03
+tst_psMatrixVectorArithmetic04
+tst_psMinimize00
+tst_psMinimize01
+tst_psMinimize02
+tst_psMinimize03
+tst_psMinimize04
+tst_psImageManip
+tst_psFunc02
+tst_psFunc03
+tst_psFunc04
+tst_psFunc05
+tst_psFunc07
+tst_psHist03
+tst_psMinimize05
+tst_psMinimize06
+tst_psMinimize04_F32
+tst_psMinimize04b
+tst_psMinimize04b_F32
+tst_psMinimize07
+tst_psRandom
+seed_msglog1.txt
+seed_msglog2.txt
+tst_psFunc08
+tst_psFunc09
+tst_psFunc10
+tst_psFunc11
+
Index: /tags/ipp-1-X/bug123/psLib/test/dataManip/Makefile.am
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/dataManip/Makefile.am	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/dataManip/Makefile.am	(revision 22331)
@@ -0,0 +1,118 @@
+#Makefile for dataManip functions of psLib
+#
+EXTRA_DIST = verified
+
+INCLUDES = \
+	-I$(top_srcdir)/src \
+	-I$(top_srcdir)/src/astronomy \
+	-I$(top_srcdir)/src/collections \
+	-I$(top_srcdir)/src/dataManip \
+	-I$(top_srcdir)/src/dataIO \
+	-I$(top_srcdir)/src/image \
+	-I$(top_srcdir)/src/sysUtils \
+	$(all_includes)
+
+AM_LDFLAGS = -L$(top_builddir)/src -lpslib $(PSLIB_LIBS)
+
+TESTS = \
+	tst_psFunc00 \
+	tst_psFunc01 \
+	tst_psFunc02 \
+	tst_psFunc03 \
+	tst_psFunc04 \
+	tst_psFunc05 \
+	tst_psFunc07 \
+	tst_psFunc08 \
+	tst_psFunc09 \
+	tst_psFunc10 \
+        tst_psFunc11 \
+	tst_psHist00 \
+	tst_psHist01 \
+	tst_psHist02 \
+	tst_psHist03 \
+	tst_psMatrix01 \
+	tst_psMatrix02 \
+	tst_psMatrix03 \
+	tst_psMatrix04 \
+	tst_psMatrix05 \
+	tst_psMatrix06 \
+	tst_psMatrix07 \
+	tst_psMatrixVectorArithmetic01 \
+	tst_psMatrixVectorArithmetic02 \
+	tst_psMatrixVectorArithmetic03 \
+	tst_psMatrixVectorArithmetic04 \
+	tst_psMinimize04 \
+	tst_psMinimize04_F32 \
+	tst_psMinimize04b \
+	tst_psMinimize04b_F32 \
+	tst_psMinimize05 \
+	tst_psMinimize06 \
+	tst_psMinimize07 \
+	tst_psStats00 \
+	tst_psStats01 \
+	tst_psStats02 \
+	tst_psStats03 \
+	tst_psStats05 \
+	tst_psStats06 \
+	tst_psStats07 \
+	tst_psStats08 \
+	tst_psStats09 \
+	tst_psRandom \
+	tst_psVectorFFT 
+
+check_PROGRAMS = $(TESTS)
+
+check_DATA =
+
+CLEANFILES = $(TESTS) $(check_DATA) temp/*
+
+TESTS_ENVIRONMENT = perl $(top_srcdir)/test/runTest -verified=$(srcdir)/verified 
+
+tests: $(TESTS) $(check_DATA)
+
+tst_psFunc00_SOURCES =  tst_psFunc00.c
+tst_psFunc01_SOURCES =  tst_psFunc01.c
+tst_psFunc02_SOURCES =  tst_psFunc02.c
+tst_psFunc03_SOURCES =  tst_psFunc03.c
+tst_psFunc04_SOURCES =  tst_psFunc04.c
+tst_psFunc05_SOURCES =  tst_psFunc05.c
+tst_psFunc07_SOURCES =  tst_psFunc07.c
+tst_psFunc08_SOURCES =  tst_psFunc08.c
+tst_psFunc09_SOURCES =  tst_psFunc09.c
+tst_psFunc10_SOURCES =  tst_psFunc10.c
+tst_psFunc11_SOURCES =  tst_psFunc11.c
+tst_psHist00_SOURCES =  tst_psHist00.c
+tst_psHist01_SOURCES =  tst_psHist01.c
+tst_psHist02_SOURCES =  tst_psHist02.c
+tst_psHist03_SOURCES =  tst_psHist03.c
+tst_psMatrix01_SOURCES =  tst_psMatrix01.c
+tst_psMatrix02_SOURCES =  tst_psMatrix02.c
+tst_psMatrix03_SOURCES =  tst_psMatrix03.c
+tst_psMatrix04_SOURCES =  tst_psMatrix04.c
+tst_psMatrix05_SOURCES =  tst_psMatrix05.c
+tst_psMatrix06_SOURCES =  tst_psMatrix06.c
+tst_psMatrix07_SOURCES =  tst_psMatrix07.c
+tst_psMatrixVectorArithmetic01_SOURCES =  tst_psMatrixVectorArithmetic01.c
+tst_psMatrixVectorArithmetic02_SOURCES =  tst_psMatrixVectorArithmetic02.c
+tst_psMatrixVectorArithmetic03_SOURCES =  tst_psMatrixVectorArithmetic03.c
+tst_psMatrixVectorArithmetic04_SOURCES =  tst_psMatrixVectorArithmetic04.c
+tst_psMinimize04_SOURCES =  tst_psMinimize04.c
+tst_psMinimize04_F32_SOURCES =  tst_psMinimize04.c
+tst_psMinimize04b_SOURCES =  tst_psMinimize04b.c
+tst_psMinimize04b_F32_SOURCES =  tst_psMinimize04b.c
+tst_psMinimize05_SOURCES =  tst_psMinimize05.c
+tst_psMinimize06_SOURCES =  tst_psMinimize06.c
+tst_psMinimize07_SOURCES =  tst_psMinimize07.c
+tst_psStats00_SOURCES =  tst_psStats00.c
+tst_psStats01_SOURCES =  tst_psStats01.c
+tst_psStats02_SOURCES =  tst_psStats02.c
+tst_psStats03_SOURCES =  tst_psStats03.c
+tst_psStats05_SOURCES =  tst_psStats05.c
+tst_psStats06_SOURCES =  tst_psStats06.c
+tst_psStats07_SOURCES =  tst_psStats07.c
+tst_psStats08_SOURCES =  tst_psStats08.c
+tst_psStats09_SOURCES =  tst_psStats09.c
+tst_psRandom_SOURCES =  tst_psRandom.c
+tst_psVectorFFT_SOURCES = tst_psVectorFFT.c
+
+test: check
Index: /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psFunc00.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psFunc00.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psFunc00.c	(revision 22331)
@@ -0,0 +1,642 @@
+/** tst_Func00.c
+*
+*    This routine must ensure that the psPolynomial structures are
+*    allocated and deallocated by the psPolynomialXXXlloc() procedures.
+*    It also calls the various psPolynomialXXXEval() procedures.
+* 
+*    The F32 and F64 polynomials are tested for all orders (1 - 4) and for
+*    both ordinary and chebyshev polynomials.
+* 
+*    NOTE: This test code requries the stdout file to verify that the results
+*    are good.
+* 
+*    XXX: Modify these tests so that polynomials with a variety of different
+*    orders are created.
+* 
+*    @version $Revision: 1.21 $  $Name: not supported by cvs2svn $
+*    @date $Date: 2005-04-07 20:27:41 $
+*
+*  Copyright 2004-2005 Maui High Performance Computing Center, Univ. of Hawaii
+*   
+*****************************************************************************/
+#include <stdio.h>
+#include "pslib_strict.h"
+#include "psTest.h"
+
+// Defines
+#define ORDER    3
+
+static psS32 testPolynomial1DAlloc(void);
+static psS32 testPolynomial2DAlloc(void);
+static psS32 testPolynomial3DAlloc(void);
+static psS32 testPolynomial4DAlloc(void);
+static psS32 testDPolynomial1DAlloc(void);
+static psS32 testDPolynomial2DAlloc(void);
+static psS32 testDPolynomial3DAlloc(void);
+static psS32 testDPolynomial4DAlloc(void);
+
+testDescription tests[] = {
+                              {testPolynomial1DAlloc,578,"psPolynomial1DAlloc",0,false},
+                              {testPolynomial2DAlloc,578,"psPolynomial2DAlloc",0,false},
+                              {testPolynomial3DAlloc,578,"psPolynomial3DAlloc",0,false},
+                              {testPolynomial4DAlloc,578,"psPolynomial4DAlloc",0,false},
+                              {testDPolynomial1DAlloc,579,"psDPolynomial1DAlloc",0,false},
+                              {testDPolynomial2DAlloc,579,"psDPolynomial2DAlloc",0,false},
+                              {testDPolynomial3DAlloc,579,"psDPolynomial3DAlloc",0,false},
+                              {testDPolynomial4DAlloc,579,"psDPolynomial4DAlloc",0,false},
+                              {NULL}
+                          };
+
+
+psS32 main(psS32 argc, char* argv[])
+{
+    psLogSetLevel(PS_LOG_INFO);
+
+    return !runTestSuite(stderr,"psPolynomialXD", tests, argc, argv);
+}
+
+
+// This test will allocate a 1D polynomial and verify the structure allocated
+psS32 testPolynomial1DAlloc(void)
+{
+    psPolynomial1D*  my1DPoly  = NULL;
+
+    // Allocate polynomial
+    my1DPoly = psPolynomial1DAlloc(ORDER,PS_POLYNOMIAL_ORD);
+    // Verify structure allocated
+    if(my1DPoly == NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Returned NULL not expected");
+        return 1;
+    }
+    // Verify polynomial structure members set properly
+    if(my1DPoly->n != ORDER) {
+        psError(PS_ERR_UNKNOWN,true,"Number of terms %d not as expected %d",
+                my1DPoly->n, ORDER);
+        return 2;
+    }
+    if(my1DPoly->type != PS_POLYNOMIAL_ORD) {
+        psError(PS_ERR_UNKNOWN,true,"Type %d not as expected %d",
+                my1DPoly->type, PS_POLYNOMIAL_ORD);
+        return 3;
+    }
+    for(psS32 i = 0; i < ORDER; i++) {
+        if(my1DPoly->coeff[i] != 0.0) {
+            psError(PS_ERR_UNKNOWN,true,"Coeff[%d] %lg not as expected %lg",
+                    i, my1DPoly->coeff[i], 0.0);
+            return 4;
+        }
+        if(my1DPoly->coeffErr[i] != 0.0) {
+            psError(PS_ERR_UNKNOWN,true,"CoeffErr[%d] %lg not as expected %lg",
+                    i, my1DPoly->coeffErr[i], 0.0);
+            return 5;
+        }
+        if(my1DPoly->mask[i] != 0) {
+            psError(PS_ERR_UNKNOWN,true,"Mask[%d] %d not as expected %d",
+                    i, my1DPoly->mask[i], 0);
+            return 6;
+        }
+    }
+    psFree(my1DPoly);
+
+    // Attempt to allocate with negative order
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate error msg for negative terms");
+    if(psPolynomial1DAlloc(-1,PS_POLYNOMIAL_ORD) != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Returned structure but expected NULL");
+        return 7;
+    }
+
+    return 0;
+}
+
+// This test will allocate a 1D polynomial and verify the structure allocated
+psS32 testDPolynomial1DAlloc(void)
+{
+    psDPolynomial1D*  my1DDPoly  = NULL;
+
+    // Allocate polynomial
+    my1DDPoly = psDPolynomial1DAlloc(ORDER,PS_POLYNOMIAL_CHEB);
+    // Verify structure allocated
+    if(my1DDPoly == NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Returned NULL not expected");
+        return 1;
+    }
+    // Verify polynomial structure members set properly
+    if(my1DDPoly->n != ORDER) {
+        psError(PS_ERR_UNKNOWN,true,"Number of terms %d not as expected %d",
+                my1DDPoly->n, ORDER);
+        return 2;
+    }
+    if(my1DDPoly->type != PS_POLYNOMIAL_CHEB) {
+        psError(PS_ERR_UNKNOWN,true,"Type %d not as expected %d",
+                my1DDPoly->type, PS_POLYNOMIAL_CHEB);
+        return 3;
+    }
+    for(psS32 i = 0; i < ORDER; i++) {
+        if(my1DDPoly->coeff[i] != 0.0) {
+            psError(PS_ERR_UNKNOWN,true,"Coeff[%d] %lg not as expected %lg",
+                    i, my1DDPoly->coeff[i], 0.0);
+            return 4;
+        }
+        if(my1DDPoly->coeffErr[i] != 0.0) {
+            psError(PS_ERR_UNKNOWN,true,"CoeffErr[%d] %lg not as expected %lg",
+                    i, my1DDPoly->coeffErr[i], 0.0);
+            return 5;
+        }
+        if(my1DDPoly->mask[i] != 0) {
+            psError(PS_ERR_UNKNOWN,true,"Mask[%d] %d not as expected %d",
+                    i, my1DDPoly->mask[i], 0);
+            return 6;
+        }
+    }
+    psFree(my1DDPoly);
+
+    // Attempt to allocate with negative order
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate error msg for negative terms");
+    if(psDPolynomial1DAlloc(-1,PS_POLYNOMIAL_ORD) != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Returned structure but expected NULL");
+        return 7;
+    }
+
+    return 0;
+}
+
+// This test will allocate a 2D polynomial and verify the structure allocated
+psS32 testPolynomial2DAlloc(void)
+{
+    psPolynomial2D* my2DPoly = NULL;
+
+    // Allocate polynomial
+    my2DPoly = psPolynomial2DAlloc(ORDER,ORDER+1,PS_POLYNOMIAL_ORD);
+    // Verify structure allocated
+    if(my2DPoly == NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Returned NULL not expected");
+        return 1;
+    }
+    // Verify polynomial structure members set properly
+    if(my2DPoly->nX != ORDER) {
+        psError(PS_ERR_UNKNOWN,true,"Number of terms %d not as expected %d",
+                my2DPoly->nX, ORDER);
+        return 2;
+    }
+    // Verify polynomial structure members set properly
+    if(my2DPoly->nY != ORDER+1) {
+        psError(PS_ERR_UNKNOWN,true,"Number of terms %d not as expected %d",
+                my2DPoly->nY, ORDER+1);
+        return 3;
+    }
+    if(my2DPoly->type != PS_POLYNOMIAL_ORD) {
+        psError(PS_ERR_UNKNOWN,true,"Type %d not as expected %d",
+                my2DPoly->type, PS_POLYNOMIAL_ORD);
+        return 4;
+    }
+    for(psS32 i = 0; i < ORDER; i++) {
+        for(psS32 j = 0; j < ORDER+1; j++) {
+            if(my2DPoly->coeff[i][j] != 0.0) {
+                psError(PS_ERR_UNKNOWN,true,"Coeff[%d][%d] %lg not as expected %lg",
+                        i, j, my2DPoly->coeff[i][j], 0.0);
+                return 5;
+            }
+            if(my2DPoly->coeffErr[i][j] != 0.0) {
+                psError(PS_ERR_UNKNOWN,true,"CoeffErr[%d][%d] %lg not as expected %lg",
+                        i, j, my2DPoly->coeffErr[i][j], 0.0);
+                return 6;
+            }
+            if(my2DPoly->mask[i][j] != 0) {
+                psError(PS_ERR_UNKNOWN,true,"Mask[%d][%d] %d not as expected %d",
+                        i, j, my2DPoly->mask[i][j], 0);
+                return 7;
+            }
+        }
+    }
+    psFree(my2DPoly);
+
+    // Attempt to allocate with negative order
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate error msg for negative terms");
+    if(psPolynomial2DAlloc(-1,1,PS_POLYNOMIAL_ORD) != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Returned structure but expected NULL");
+        return 8;
+    }
+    // Attempt to allocate with negative order
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate error msg for negative terms");
+    if(psPolynomial2DAlloc(1,-1,PS_POLYNOMIAL_ORD) != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Returned structure but expected NULL");
+        return 9;
+    }
+
+    return 0;
+}
+
+// This test will allocate a 2D polynomial and verify the structure allocated
+psS32 testDPolynomial2DAlloc(void)
+{
+    psDPolynomial2D* my2DDPoly = NULL;
+
+    // Allocate polynomial
+    my2DDPoly = psDPolynomial2DAlloc(ORDER,ORDER+1,PS_POLYNOMIAL_CHEB);
+    // Verify structure allocated
+    if(my2DDPoly == NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Returned NULL not expected");
+        return 1;
+    }
+    // Verify polynomial structure members set properly
+    if(my2DDPoly->nX != ORDER) {
+        psError(PS_ERR_UNKNOWN,true,"Number of terms %d not as expected %d",
+                my2DDPoly->nX, ORDER);
+        return 2;
+    }
+    // Verify polynomial structure members set properly
+    if(my2DDPoly->nY != ORDER+1) {
+        psError(PS_ERR_UNKNOWN,true,"Number of terms %d not as expected %d",
+                my2DDPoly->nY, ORDER+1);
+        return 3;
+    }
+    if(my2DDPoly->type != PS_POLYNOMIAL_CHEB) {
+        psError(PS_ERR_UNKNOWN,true,"Type %d not as expected %d",
+                my2DDPoly->type, PS_POLYNOMIAL_ORD);
+        return 4;
+    }
+    for(psS32 i = 0; i < ORDER; i++) {
+        for(psS32 j = 0; j < ORDER+1; j++) {
+            if(my2DDPoly->coeff[i][j] != 0.0) {
+                psError(PS_ERR_UNKNOWN,true,"Coeff[%d][%d] %lg not as expected %lg",
+                        i, j, my2DDPoly->coeff[i][j], 0.0);
+                return 5;
+            }
+            if(my2DDPoly->coeffErr[i][j] != 0.0) {
+                psError(PS_ERR_UNKNOWN,true,"CoeffErr[%d][%d] %lg not as expected %lg",
+                        i, j, my2DDPoly->coeffErr[i][j], 0.0);
+                return 6;
+            }
+            if(my2DDPoly->mask[i][j] != 0) {
+                psError(PS_ERR_UNKNOWN,true,"Mask[%d][%d] %d not as expected %d",
+                        i, j, my2DDPoly->mask[i][j], 0);
+                return 7;
+            }
+        }
+    }
+    psFree(my2DDPoly);
+
+    // Attempt to allocate with negative order
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate error msg for negative terms");
+    if(psDPolynomial2DAlloc(-1,1,PS_POLYNOMIAL_ORD) != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Returned structure but expected NULL");
+        return 8;
+    }
+    // Attempt to allocate with negative order
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate error msg for negative terms");
+    if(psDPolynomial2DAlloc(1,-1,PS_POLYNOMIAL_ORD) != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Returned structure but expected NULL");
+        return 9;
+    }
+
+    return 0;
+}
+
+// This test will allocate a 3D polynomial and verify the structure allocated
+psS32 testPolynomial3DAlloc(void)
+{
+    psPolynomial3D* my3DPoly = NULL;
+
+    // Allocate polynomial
+    my3DPoly = psPolynomial3DAlloc(ORDER,ORDER+1,ORDER+2,PS_POLYNOMIAL_ORD);
+    // Verify structure allocated
+    if(my3DPoly == NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Returned NULL not expected");
+        return 1;
+    }
+    // Verify polynomial structure members set properly
+    if(my3DPoly->nX != ORDER) {
+        psError(PS_ERR_UNKNOWN,true,"Number of terms %d not as expected %d",
+                my3DPoly->nX, ORDER);
+        return 2;
+    }
+    // Verify polynomial structure members set properly
+    if(my3DPoly->nY != ORDER+1) {
+        psError(PS_ERR_UNKNOWN,true,"Number of terms %d not as expected %d",
+                my3DPoly->nY, ORDER+1);
+        return 3;
+    }
+    // Verify polynomial structure members set properly
+    if(my3DPoly->nZ != ORDER+2) {
+        psError(PS_ERR_UNKNOWN,true,"Number of terms %d not as expected %d",
+                my3DPoly->nZ, ORDER+2);
+        return 4;
+    }
+    if(my3DPoly->type != PS_POLYNOMIAL_ORD) {
+        psError(PS_ERR_UNKNOWN,true,"Type %d not as expected %d",
+                my3DPoly->type, PS_POLYNOMIAL_ORD);
+        return 5;
+    }
+    for(psS32 i = 0; i < ORDER; i++) {
+        for(psS32 j = 0; j < ORDER+1; j++) {
+            for(psS32 k = 0; k < ORDER+2; k++) {
+                if(my3DPoly->coeff[i][j][k] != 0.0) {
+                    psError(PS_ERR_UNKNOWN,true,"Coeff[%d][%d][%d] %lg not as expected %lg",
+                            i, j, k, my3DPoly->coeff[i][j][k], 0.0);
+                    return 6;
+                }
+                if(my3DPoly->coeffErr[i][j][k] != 0.0) {
+                    psError(PS_ERR_UNKNOWN,true,"CoeffErr[%d][%d][%d] %lg not as expected %lg",
+                            i, j, k, my3DPoly->coeffErr[i][j][k], 0.0);
+                    return 7;
+                }
+                if(my3DPoly->mask[i][j][k] != 0) {
+                    psError(PS_ERR_UNKNOWN,true,"Mask[%d][%d] %d not as expected %d",
+                            i, j, k, my3DPoly->mask[i][j][k], 0);
+                    return 8;
+                }
+            }
+        }
+    }
+    psFree(my3DPoly);
+
+    // Attempt to allocate with negative order
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate error msg for negative terms");
+    if(psPolynomial3DAlloc(-1,1,1,PS_POLYNOMIAL_ORD) != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Returned structure but expected NULL");
+        return 9;
+    }
+    // Attempt to allocate with negative order
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate error msg for negative terms");
+    if(psPolynomial3DAlloc(1,-1,1,PS_POLYNOMIAL_ORD) != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Returned structure but expected NULL");
+        return 10;
+    }
+    // Attempt to allocate with negative order
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate error msg for negative terms");
+    if(psPolynomial3DAlloc(1,1,-1,PS_POLYNOMIAL_ORD) != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Returned structure but expected NULL");
+        return 11;
+    }
+
+    return 0;
+}
+
+// This test will allocate a 3D polynomial and verify the structure allocated
+psS32 testDPolynomial3DAlloc(void)
+{
+    psDPolynomial3D* my3DDPoly = NULL;
+
+    // Allocate polynomial
+    my3DDPoly = psDPolynomial3DAlloc(ORDER,ORDER+1,ORDER+2,PS_POLYNOMIAL_CHEB);
+    // Verify structure allocated
+    if(my3DDPoly == NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Returned NULL not expected");
+        return 1;
+    }
+    // Verify polynomial structure members set properly
+    if(my3DDPoly->nX != ORDER) {
+        psError(PS_ERR_UNKNOWN,true,"Number of terms %d not as expected %d",
+                my3DDPoly->nX, ORDER);
+        return 2;
+    }
+    // Verify polynomial structure members set properly
+    if(my3DDPoly->nY != ORDER+1) {
+        psError(PS_ERR_UNKNOWN,true,"Number of terms %d not as expected %d",
+                my3DDPoly->nY, ORDER+1);
+        return 3;
+    }
+    // Verify polynomial structure members set properly
+    if(my3DDPoly->nZ != ORDER+2) {
+        psError(PS_ERR_UNKNOWN,true,"Number of terms %d not as expected %d",
+                my3DDPoly->nZ, ORDER+2);
+        return 4;
+    }
+    if(my3DDPoly->type != PS_POLYNOMIAL_CHEB) {
+        psError(PS_ERR_UNKNOWN,true,"Type %d not as expected %d",
+                my3DDPoly->type, PS_POLYNOMIAL_ORD);
+        return 5;
+    }
+    for(psS32 i = 0; i < ORDER; i++) {
+        for(psS32 j = 0; j < ORDER+1; j++) {
+            for(psS32 k = 0; k < ORDER+2; k++) {
+                if(my3DDPoly->coeff[i][j][k] != 0.0) {
+                    psError(PS_ERR_UNKNOWN,true,"Coeff[%d][%d][%d] %lg not as expected %lg",
+                            i, j, k, my3DDPoly->coeff[i][j][k], 0.0);
+                    return 6;
+                }
+                if(my3DDPoly->coeffErr[i][j][k] != 0.0) {
+                    psError(PS_ERR_UNKNOWN,true,"CoeffErr[%d][%d][%d] %lg not as expected %lg",
+                            i, j, k, my3DDPoly->coeffErr[i][j][k], 0.0);
+                    return 7;
+                }
+                if(my3DDPoly->mask[i][j][k] != 0) {
+                    psError(PS_ERR_UNKNOWN,true,"Mask[%d][%d] %d not as expected %d",
+                            i, j, k, my3DDPoly->mask[i][j][k], 0);
+                    return 8;
+                }
+            }
+        }
+    }
+    psFree(my3DDPoly);
+
+    // Attempt to allocate with negative order
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate error msg for negative terms");
+    if(psDPolynomial3DAlloc(-1,1,1,PS_POLYNOMIAL_ORD) != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Returned structure but expected NULL");
+        return 9;
+    }
+    // Attempt to allocate with negative order
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate error msg for negative terms");
+    if(psDPolynomial3DAlloc(1,-1,1,PS_POLYNOMIAL_ORD) != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Returned structure but expected NULL");
+        return 10;
+    }
+    // Attempt to allocate with negative order
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate error msg for negative terms");
+    if(psDPolynomial3DAlloc(1,1,-1,PS_POLYNOMIAL_ORD) != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Returned structure but expected NULL");
+        return 11;
+    }
+
+    return 0;
+}
+
+// This test will allocate a 4D polynomial and verify the structure allocated
+psS32 testPolynomial4DAlloc(void)
+{
+    psPolynomial4D* my4DPoly = NULL;
+
+    // Allocate polynomial
+    my4DPoly = psPolynomial4DAlloc(ORDER+3,ORDER,ORDER+1,ORDER+2,PS_POLYNOMIAL_ORD);
+    // Verify structure allocated
+    if(my4DPoly == NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Returned NULL not expected");
+        return 1;
+    }
+    // Verify polynomial structure members set properly
+    if(my4DPoly->nX != ORDER) {
+        psError(PS_ERR_UNKNOWN,true,"Number of terms %d not as expected %d",
+                my4DPoly->nX, ORDER);
+        return 2;
+    }
+    // Verify polynomial structure members set properly
+    if(my4DPoly->nY != ORDER+1) {
+        psError(PS_ERR_UNKNOWN,true,"Number of terms %d not as expected %d",
+                my4DPoly->nY, ORDER+1);
+        return 3;
+    }
+    // Verify polynomial structure members set properly
+    if(my4DPoly->nZ != ORDER+2) {
+        psError(PS_ERR_UNKNOWN,true,"Number of terms %d not as expected %d",
+                my4DPoly->nZ, ORDER+2);
+        return 4;
+    }
+    // Verify polynomial structure members set properly
+    if(my4DPoly->nW != ORDER+3) {
+        psError(PS_ERR_UNKNOWN,true,"Number of terms %d not as expected %d",
+                my4DPoly->nW, ORDER+3);
+        return 5;
+    }
+    if(my4DPoly->type != PS_POLYNOMIAL_ORD) {
+        psError(PS_ERR_UNKNOWN,true,"Type %d not as expected %d",
+                my4DPoly->type, PS_POLYNOMIAL_ORD);
+        return 6;
+    }
+    for(psS32 i = 0; i < ORDER+3; i++) {
+        for(psS32 j = 0; j < ORDER; j++) {
+            for(psS32 k = 0; k < ORDER+1; k++) {
+                for(psS32 l = 0; l < ORDER+2; l++) {
+                    if(my4DPoly->coeff[i][j][k][l] != 0.0) {
+                        psError(PS_ERR_UNKNOWN,true,"Coeff[%d][%d][%d][%d] %lg not as expected %lg",
+                                i, j, k, l, my4DPoly->coeff[i][j][k][l], 0.0);
+                        return 7;
+                    }
+                    if(my4DPoly->coeffErr[i][j][k][l] != 0.0) {
+                        psError(PS_ERR_UNKNOWN,true,"CoeffErr[%d][%d][%d][l] %lg not as expected %lg",
+                                i, j, k, l, my4DPoly->coeffErr[i][j][k][l], 0.0);
+                        return 8;
+                    }
+                    if(my4DPoly->mask[i][j][k][l] != 0) {
+                        psError(PS_ERR_UNKNOWN,true,"Mask[%d][%d][%d][%d] %d not as expected %d",
+                                i, j, k, l, my4DPoly->mask[i][j][k][l], 0);
+                        return 9;
+                    }
+                }
+            }
+        }
+    }
+    psFree(my4DPoly);
+
+    // Attempt to allocate with negative order
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate error msg for negative terms");
+    if(psPolynomial4DAlloc(-1,1,1,1,PS_POLYNOMIAL_ORD) != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Returned structure but expected NULL");
+        return 10;
+    }
+    // Attempt to allocate with negative order
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate error msg for negative terms");
+    if(psPolynomial4DAlloc(1,-1,1,1,PS_POLYNOMIAL_ORD) != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Returned structure but expected NULL");
+        return 11;
+    }
+    // Attempt to allocate with negative order
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate error msg for negative terms");
+    if(psPolynomial4DAlloc(1,1,-1,1,PS_POLYNOMIAL_ORD) != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Returned structure but expected NULL");
+        return 12;
+    }
+    // Attempt to allocate with negative order
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate error msg for negative terms");
+    if(psPolynomial4DAlloc(1,1,1,-1,PS_POLYNOMIAL_ORD) != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Returned structure but expected NULL");
+        return 13;
+    }
+
+    return 0;
+}
+
+// This test will allocate a 4D polynomial and verify the structure allocated
+psS32 testDPolynomial4DAlloc(void)
+{
+    psDPolynomial4D* my4DDPoly = NULL;
+
+    // Allocate polynomial
+    my4DDPoly = psDPolynomial4DAlloc(ORDER+3,ORDER,ORDER+1,ORDER+2,PS_POLYNOMIAL_ORD);
+    // Verify structure allocated
+    if(my4DDPoly == NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Returned NULL not expected");
+        return 1;
+    }
+    // Verify polynomial structure members set properly
+    if(my4DDPoly->nX != ORDER) {
+        psError(PS_ERR_UNKNOWN,true,"Number of terms %d not as expected %d",
+                my4DDPoly->nX, ORDER);
+        return 2;
+    }
+    // Verify polynomial structure members set properly
+    if(my4DDPoly->nY != ORDER+1) {
+        psError(PS_ERR_UNKNOWN,true,"Number of terms %d not as expected %d",
+                my4DDPoly->nY, ORDER+1);
+        return 3;
+    }
+    // Verify polynomial structure members set properly
+    if(my4DDPoly->nZ != ORDER+2) {
+        psError(PS_ERR_UNKNOWN,true,"Number of terms %d not as expected %d",
+                my4DDPoly->nZ, ORDER+2);
+        return 4;
+    }
+    // Verify polynomial structure members set properly
+    if(my4DDPoly->nW != ORDER+3) {
+        psError(PS_ERR_UNKNOWN,true,"Number of terms %d not as expected %d",
+                my4DDPoly->nW, ORDER+3);
+        return 5;
+    }
+    if(my4DDPoly->type != PS_POLYNOMIAL_ORD) {
+        psError(PS_ERR_UNKNOWN,true,"Type %d not as expected %d",
+                my4DDPoly->type, PS_POLYNOMIAL_ORD);
+        return 6;
+    }
+    for(psS32 i = 0; i < ORDER+3; i++) {
+        for(psS32 j = 0; j < ORDER; j++) {
+            for(psS32 k = 0; k < ORDER+1; k++) {
+                for(psS32 l = 0; l < ORDER+2; l++) {
+                    if(my4DDPoly->coeff[i][j][k][l] != 0.0) {
+                        psError(PS_ERR_UNKNOWN,true,"Coeff[%d][%d][%d][%d] %lg not as expected %lg",
+                                i, j, k, l, my4DDPoly->coeff[i][j][k][l], 0.0);
+                        return 7;
+                    }
+                    if(my4DDPoly->coeffErr[i][j][k][l] != 0.0) {
+                        psError(PS_ERR_UNKNOWN,true,"CoeffErr[%d][%d][%d][l] %lg not as expected %lg",
+                                i, j, k, l, my4DDPoly->coeffErr[i][j][k][l], 0.0);
+                        return 8;
+                    }
+                    if(my4DDPoly->mask[i][j][k][l] != 0) {
+                        psError(PS_ERR_UNKNOWN,true,"Mask[%d][%d][%d][%d] %d not as expected %d",
+                                i, j, k, l, my4DDPoly->mask[i][j][k][l], 0);
+                        return 9;
+                    }
+                }
+            }
+        }
+    }
+    psFree(my4DDPoly);
+
+    // Attempt to allocate with negative order
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate error msg for negative terms");
+    if(psDPolynomial4DAlloc(-1,1,1,1,PS_POLYNOMIAL_ORD) != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Returned structure but expected NULL");
+        return 10;
+    }
+    // Attempt to allocate with negative order
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate error msg for negative terms");
+    if(psDPolynomial4DAlloc(1,-1,1,1,PS_POLYNOMIAL_ORD) != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Returned structure but expected NULL");
+        return 11;
+    }
+    // Attempt to allocate with negative order
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate error msg for negative terms");
+    if(psDPolynomial4DAlloc(1,1,-1,1,PS_POLYNOMIAL_ORD) != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Returned structure but expected NULL");
+        return 12;
+    }
+    // Attempt to allocate with negative order
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate error msg for negative terms");
+    if(psDPolynomial4DAlloc(1,1,1,-1,PS_POLYNOMIAL_ORD) != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Returned structure but expected NULL");
+        return 13;
+    }
+
+    return 0;
+}
+
Index: /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psFunc01.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psFunc01.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psFunc01.c	(revision 22331)
@@ -0,0 +1,76 @@
+/*****************************************************************************
+    This routine must ensure that the psGaussian() shall evaluate a
+    specified Gaussian at some X.
+ 
+    It also tests the p_psGaussianDev() procedure.
+ *****************************************************************************/
+#include <stdio.h>
+#include "pslib_strict.h"
+#include "psTest.h"
+#include "psMemory.h"
+#include "psFunctions.h"
+#define MY_MEAN 30.0
+#define MY_STDEV 2.0
+#define N 30
+psS32 main()
+{
+    psS32 testStatus = true;
+    float x = 0.0;
+    psS32  memLeaks;
+    psS32  currentId = psMemGetId();
+    psVector *myGaussData = NULL;
+    printPositiveTestHeader(stdout,
+                            "psFunctions functions",
+                            "psGaussian()");
+
+
+    for (x = 0.0 ; x < (MY_MEAN * 2.0) ; x+= 1.0) {
+        printf("normal psGaussian(%f) is %f\n", x, psGaussian(x, MY_MEAN, MY_STDEV, true));
+        x = x + 1.0;
+    }
+
+    for (x = 0.0 ; x < (MY_MEAN * 2.0) ; x+= 1.0) {
+        printf("NON-normal psGaussian(%f) is %f\n", x, psGaussian(x, MY_MEAN, MY_STDEV, false));
+        x = x + 1.0;
+    }
+
+    psMemCheckCorruption(1);
+    memLeaks = psMemCheckLeaks(currentId,NULL,stderr,false);
+    if (0 != memLeaks) {
+        psAbort(__func__,"Memory Leaks! (%d leaks)", memLeaks);
+    }
+
+    printFooter(stdout,
+                "psFunctions functions",
+                "psGaussian()",
+                testStatus);
+
+
+    printPositiveTestHeader(stdout,
+                            "psFunctions functions",
+                            "p_psGaussianDev()");
+
+    myGaussData = p_psGaussianDev(MY_MEAN, MY_STDEV, N);
+    for (psS32 i = 0; i < N ; i++) {
+        printf("Gaussian Deviate [%d] is %f\n", i, myGaussData->data.F32[i]);
+    }
+
+    if ( myGaussData->type.type != PS_TYPE_F32) {
+        psAbort(__func__,"p_psGaussianDev did not return a vector of type F32");
+    }
+
+    psFree(myGaussData);
+
+    psMemCheckCorruption(1);
+    memLeaks = psMemCheckLeaks(currentId,NULL,stderr,false);
+    if (0 != memLeaks) {
+        psAbort(__func__,"Memory Leaks! (%d leaks)", memLeaks);
+    }
+
+    printFooter(stdout,
+                "psFunctions functions",
+                "p_psGaussianDev()",
+                testStatus);
+
+    return (!testStatus);
+}
Index: /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psFunc02.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psFunc02.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psFunc02.c	(revision 22331)
@@ -0,0 +1,443 @@
+/*****************************************************************************
+    This routine must ensure that the psSpline1DAlloc() function properly
+    allocates the spline data structure.  It allocates both linear and cubic
+    splines with a variety of min/max ranges.
+ *****************************************************************************/
+#include <stdio.h>
+#include "pslib_strict.h"
+#include "psTest.h"
+#include "psMemory.h"
+#include "psFunctions.h"
+
+#define N 4
+#define LINEAR 1
+#define CUBIC 3
+
+psS32 main()
+{
+    psS32 testStatus = true;
+    psS32 memLeaks=0;
+    psS32 i;
+    psS32  currentId = psMemGetId();
+    psSpline1D *tmpSpline;
+    psVector* bounds;
+
+    /****************************************************************************/
+    /****************************************************************************/
+    testStatus = true;
+    printPositiveTestHeader(stdout,
+                            "psFunction functions",
+                            "psSpline1DAlloc(): linear, normal");
+
+    tmpSpline = psSpline1DAlloc(N, LINEAR, 1.0, 10.0);
+    if (tmpSpline == NULL) {
+        printf("ERROR: Could not allocate psSpline1D data structure\n");
+        testStatus = false;
+    }
+    if (tmpSpline->spline == NULL) {
+        printf("ERROR: Could not allocate psSpline1D->spline data structure\n");
+        testStatus = false;
+    }
+
+    if (tmpSpline->n != N) {
+        printf("ERROR: spline->n set incorrectly (%d)\n", tmpSpline->n);
+        testStatus = false;
+    }
+
+    for (i=0;i<N;i++) {
+        if (tmpSpline->spline[i] == NULL) {
+            printf("ERROR: Could not allocate spline %d\n", i);
+            testStatus = false;
+        }
+        if ((tmpSpline->spline[i])->n != LINEAR+1) {
+            printf("ERROR: Spline created with order %d\n", (tmpSpline->spline[i])->n);
+            testStatus = false;
+        }
+    }
+
+    if (tmpSpline->knots == NULL) {
+        printf("ERROR: Could not allocate psSpline1D->knots data structure\n");
+        testStatus = false;
+    }
+
+    for (i=0;i<N+1;i++) {
+        printf("psSpline1D->knots->data.F32[%d] is %f\n", i,
+               tmpSpline->knots->data.F32[i]);
+    }
+
+    psFree(tmpSpline);
+    psMemCheckCorruption(1);
+    memLeaks = psMemCheckLeaks(currentId,NULL,stderr,false);
+    if (0 != memLeaks) {
+        psAbort(__func__,"Memory Leaks! (%d leaks)", memLeaks);
+    }
+
+    printFooter(stdout,
+                "psFunctions functions",
+                "psSpline1DAlloc(): linear, normal",
+                testStatus);
+
+    /****************************************************************************/
+    /****************************************************************************/
+    testStatus = true;
+    printPositiveTestHeader(stdout,
+                            "psFunction functions",
+                            "psSpline1DAlloc(): linear, min/max are equal");
+
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message.");
+    tmpSpline = psSpline1DAlloc(N, LINEAR, 1.0, 1.0);
+
+    if (tmpSpline != NULL) {
+        printf("ERROR: allocated psSpline1D data structure when min==max\n");
+        testStatus = false;
+    }
+
+    psFree(tmpSpline);
+    psMemCheckCorruption(1);
+    memLeaks = psMemCheckLeaks(currentId,NULL,stderr,false);
+    if (0 != memLeaks) {
+        psAbort(__func__,"Memory Leaks! (%d leaks)", memLeaks);
+    }
+
+    printFooter(stdout,
+                "psFunctions functions",
+                "psSpline1DAlloc(): linear, min/max are equal",
+                testStatus);
+
+    /****************************************************************************/
+    /****************************************************************************/
+    testStatus = true;
+    printPositiveTestHeader(stdout,
+                            "psFunction functions",
+                            "psSpline1DAlloc(): linear, min > max.");
+
+    tmpSpline = psSpline1DAlloc(N, LINEAR, 1.0, -1.0);
+    if (tmpSpline == NULL) {
+        printf("ERROR: Could not allocate psSpline1D data structure\n");
+        testStatus = false;
+    }
+    if (tmpSpline->spline == NULL) {
+        printf("ERROR: Could not allocate psSpline1D->spline data structure\n");
+        testStatus = false;
+    }
+
+    if (tmpSpline->n != N) {
+        printf("ERROR: spline->n set incorrectly (%d)\n", tmpSpline->n);
+        testStatus = false;
+    }
+
+    for (i=0;i<N;i++) {
+        if (tmpSpline->spline[i] == NULL) {
+            printf("ERROR: Could not allocate spline %d\n", i);
+            testStatus = false;
+        }
+        if ((tmpSpline->spline[i])->n != LINEAR+1) {
+            printf("ERROR: Spline created with order %d\n", (tmpSpline->spline[i])->n);
+            testStatus = false;
+        }
+    }
+
+    if (tmpSpline->knots == NULL) {
+        printf("ERROR: Could not allocate psSpline1D->knots data structure\n");
+        testStatus = false;
+    }
+
+    for (i=0;i<N+1;i++) {
+        printf("psSpline1D->knots->data.F32[%d] is %f\n", i,
+               tmpSpline->knots->data.F32[i]);
+    }
+
+    psFree(tmpSpline);
+    psMemCheckCorruption(1);
+    memLeaks = psMemCheckLeaks(currentId,NULL,stderr,false);
+    if (0 != memLeaks) {
+        psAbort(__func__,"Memory Leaks! (%d leaks)", memLeaks);
+    }
+
+    printFooter(stdout,
+                "psFunctions functions",
+                "psSpline1DAlloc(): linear, min > max.",
+                testStatus);
+
+    /****************************************************************************/
+    /****************************************************************************/
+    testStatus = true;
+    printPositiveTestHeader(stdout,
+                            "psFunction functions",
+                            "psSpline1DAlloc(), cubic, normal");
+
+    tmpSpline = psSpline1DAlloc(N, CUBIC, 1.0, 10.0);
+    if (tmpSpline == NULL) {
+        printf("ERROR: Could not allocate psSpline1D data structure\n");
+        testStatus = false;
+    }
+    if (tmpSpline->spline == NULL) {
+        printf("ERROR: Could not allocate psSpline1D->spline data structure\n");
+        testStatus = false;
+    }
+
+    if (tmpSpline->n != N) {
+        printf("ERROR: spline->n set incorrectly (%d)\n", tmpSpline->n);
+        testStatus = false;
+    }
+
+    for (i=0;i<N;i++) {
+        if (tmpSpline->spline[i] == NULL) {
+            printf("ERROR: Could not allocate spline %d\n", i);
+            testStatus = false;
+        }
+        if ((tmpSpline->spline[i])->n != CUBIC+1) {
+            printf("ERROR: Spline created with order %d\n", (tmpSpline->spline[i])->n);
+            testStatus = false;
+        }
+    }
+
+    if (tmpSpline->knots == NULL) {
+        printf("ERROR: Could not allocate psSpline1D->knots data structure\n");
+        testStatus = false;
+    }
+
+    for (i=0;i<N+1;i++) {
+        printf("psSpline1D->data.F32[%d] is %f\n", i,
+               tmpSpline->knots->data.F32[i]);
+    }
+
+    psFree(tmpSpline);
+    psMemCheckCorruption(1);
+    memLeaks = psMemCheckLeaks(currentId,NULL,stderr,false);
+    if (0 != memLeaks) {
+        psAbort(__func__,"Memory Leaks! (%d leaks)", memLeaks);
+    }
+
+    printFooter(stdout,
+                "psFunctions functions",
+                "psSpline1DAlloc(): cubic, normal",
+                testStatus);
+
+    /****************************************************************************/
+    /****************************************************************************/
+    testStatus = true;
+    printPositiveTestHeader(stdout,
+                            "psFunction functions",
+                            "psSpline1DAlloc(): cubic, min/max are equal");
+
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message");
+    tmpSpline = psSpline1DAlloc(N, CUBIC, 1.0, 1.0);
+
+    if (tmpSpline != NULL) {
+        printf("ERROR: allocated psSpline1D data structure when min==max\n");
+        testStatus = false;
+    }
+
+    psFree(tmpSpline);
+    psMemCheckCorruption(1);
+    memLeaks = psMemCheckLeaks(currentId,NULL,stderr,false);
+    if (0 != memLeaks) {
+        psAbort(__func__,"Memory Leaks! (%d leaks)", memLeaks);
+    }
+
+    printFooter(stdout,
+                "psFunctions functions",
+                "psSpline1DAlloc(): cubic, min/max are equal",
+                testStatus);
+
+    /****************************************************************************/
+    /****************************************************************************/
+    testStatus = true;
+    printPositiveTestHeader(stdout,
+                            "psFunction functions",
+                            "psSpline1DAlloc(): cubic, min > max.");
+
+    tmpSpline = psSpline1DAlloc(N, CUBIC, 1.0, -1.0);
+    if (tmpSpline == NULL) {
+        printf("ERROR: Could not allocate psSpline1D data structure\n");
+        testStatus = false;
+    }
+    if (tmpSpline->spline == NULL) {
+        printf("ERROR: Could not allocate psSpline1D->spline data structure\n");
+        testStatus = false;
+    }
+
+    if (tmpSpline->n != N) {
+        printf("ERROR: spline->n set incorrectly (%d)\n", tmpSpline->n);
+        testStatus = false;
+    }
+
+    for (i=0;i<N;i++) {
+        if (tmpSpline->spline[i] == NULL) {
+            printf("ERROR: Could not allocate spline %d\n", i);
+            testStatus = false;
+        }
+        if ((tmpSpline->spline[i])->n != CUBIC+1) {
+            printf("ERROR: Spline created with order %d\n", (tmpSpline->spline[i])->n);
+            testStatus = false;
+        }
+    }
+
+    if (tmpSpline->knots == NULL) {
+        printf("ERROR: Could not allocate psSpline1D->knots data structure\n");
+        testStatus = false;
+    }
+
+    for (i=0;i<N+1;i++) {
+        printf("psSpline1D->knots->data.F32[%d] is %f\n", i,
+               tmpSpline->knots->data.F32[i]);
+    }
+
+    psFree(tmpSpline);
+    psMemCheckCorruption(1);
+    memLeaks = psMemCheckLeaks(currentId,NULL,stderr,false);
+    if (0 != memLeaks) {
+        psAbort(__func__,"Memory Leaks! (%d leaks)", memLeaks);
+    }
+
+    printFooter(stdout,
+                "psFunctions functions",
+                "psSpline1DAlloc(): cubic, min > max.",
+                testStatus);
+
+    /****************************************************************************/
+    /****************************************************************************/
+    testStatus = true;
+    printPositiveTestHeader(stdout,
+                            "psFunction functions",
+                            "psSpline1DAllocGeneric(): linear, normal");
+
+    bounds = psVectorAlloc(5,PS_TYPE_F32);
+    bounds->n = bounds->nalloc;
+    for(psU32 n = 0; n < 5; n++ ) {
+        bounds->data.F32[n] = (n+1) * 2;
+    }
+    tmpSpline = psSpline1DAllocGeneric(bounds, LINEAR);
+    if (tmpSpline == NULL) {
+        printf("ERROR: Could not allocate psSpline1D data structure\n");
+        testStatus = false;
+    }
+    if (tmpSpline->spline == NULL) {
+        printf("ERROR: Could not allocate psSpline1D->spline data structure\n");
+        testStatus = false;
+    }
+
+    if (tmpSpline->n != N) {
+        printf("ERROR: spline->n set incorrectly (%d)\n", tmpSpline->n);
+        testStatus = false;
+    }
+
+    for (i=0;i<N;i++) {
+        if (tmpSpline->spline[i] == NULL) {
+            printf("ERROR: Could not allocate spline %d\n", i);
+            testStatus = false;
+        }
+        if ((tmpSpline->spline[i])->n != LINEAR+1) {
+            printf("ERROR: Spline created with order %d\n", (tmpSpline->spline[i])->n);
+            testStatus = false;
+        }
+    }
+
+    if (tmpSpline->knots == NULL) {
+        printf("ERROR: Could not allocate psSpline1D->knots data structure\n");
+        testStatus = false;
+    }
+
+    for (i=0;i<N+1;i++) {
+        printf("psSpline1D->knots->data.F32[%d] is %f\n", i,
+               tmpSpline->knots->data.F32[i]);
+    }
+    psFree(bounds);
+    psFree(tmpSpline);
+
+    psMemCheckCorruption(1);
+    memLeaks = psMemCheckLeaks(currentId,NULL,stderr,false);
+    if (0 != memLeaks) {
+        psError(PS_ERR_UNKNOWN,true,"Memory Leaks! (%d leaks)", memLeaks);
+        testStatus = false;
+    }
+    printFooter(stdout,
+                "psFunctions functions",
+                "psSpline1DAllocGeneric(): linear, normal",
+                testStatus);
+
+    /****************************************************************************/
+    /****************************************************************************/
+    testStatus = true;
+    printPositiveTestHeader(stdout,
+                            "psFunction functions",
+                            "psSpline1DAllocGeneric(): negative order");
+
+    bounds = psVectorAlloc(5,PS_TYPE_F32);
+    bounds->n = bounds->nalloc;
+    for(psU32 n = 0; n < 5; n++ ) {
+        bounds->data.F32[n] = (n+1) * 2;
+    }
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message.");
+    tmpSpline = psSpline1DAllocGeneric(bounds, -1);
+    if (tmpSpline != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Did not return null for negative order");
+        return 10;
+    }
+    psFree(bounds);
+    psMemCheckCorruption(1);
+    memLeaks = psMemCheckLeaks(currentId,NULL,stderr,false);
+    if (0 != memLeaks) {
+        psError(PS_ERR_UNKNOWN,true,"Memory Leaks! (%d leaks)", memLeaks);
+        testStatus = false;
+    }
+    printFooter(stdout,
+                "psFunctions functions",
+                "psSpline1DAllocGeneric(): negative order",
+                testStatus);
+
+    /****************************************************************************/
+    /****************************************************************************/
+    testStatus = true;
+    printPositiveTestHeader(stdout,
+                            "psFunction functions",
+                            "psSpline1DAllocGeneric(): bound equal to NULL");
+
+    bounds = NULL;
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message.");
+    tmpSpline = psSpline1DAllocGeneric(bounds, LINEAR);
+    if (tmpSpline != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Did not return null for bounds equal to NULL");
+        return 20;
+    }
+    psMemCheckCorruption(1);
+    memLeaks = psMemCheckLeaks(currentId,NULL,stderr,false);
+    if (0 != memLeaks) {
+        psError(PS_ERR_UNKNOWN,true,"Memory Leaks! (%d leaks)", memLeaks);
+        testStatus = false;
+    }
+    printFooter(stdout,
+                "psFunctions functions",
+                "psSpline1DAllocGeneric(): bound equal to NULL",
+                testStatus);
+
+    /****************************************************************************/
+    /****************************************************************************/
+    testStatus = true;
+    printPositiveTestHeader(stdout,
+                            "psFunction functions",
+                            "psSpline1DAllocGeneric(): bounds with zero elements");
+
+    bounds = psVectorAlloc(5,PS_TYPE_F32);
+    bounds->n = 0;
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message.");
+    tmpSpline = psSpline1DAllocGeneric(bounds, LINEAR);
+    if (tmpSpline != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Did not return null for negative order");
+        return 30;
+    }
+    psFree(bounds);
+    psMemCheckCorruption(1);
+    memLeaks = psMemCheckLeaks(currentId,NULL,stderr,false);
+    if (0 != memLeaks) {
+        psError(PS_ERR_UNKNOWN,true,"Memory Leaks! (%d leaks)", memLeaks);
+        testStatus = false;
+    }
+    printFooter(stdout,
+                "psFunctions functions",
+                "psSpline1DAllocGeneric(): bounds with zero elements",
+                testStatus);
+
+    return (!testStatus);
+}
Index: /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psFunc03.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psFunc03.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psFunc03.c	(revision 22331)
@@ -0,0 +1,150 @@
+/*****************************************************************************
+    This routine must ensure that the psSpline1DAllocGeneric() function properly
+    allocates the spline data structure.
+ 
+    XXX: test bounds?
+ *****************************************************************************/
+#include <stdio.h>
+#include "pslib_strict.h"
+#include "psTest.h"
+#include "psMemory.h"
+#include "psFunctions.h"
+
+#define N 10
+#define LINEAR 1
+#define CUBIC 3
+
+psS32 main()
+{
+    psS32 testStatus = true;
+    psS32 memLeaks=0;
+    psS32 i;
+    psS32  currentId = psMemGetId();
+    psSpline1D *tmpSpline;
+    psVector *bounds;
+
+    /****************************************************************************/
+    /****************************************************************************/
+    testStatus = true;
+    printPositiveTestHeader(stdout,
+                            "psFunction functions",
+                            "psSpline1DAllocGeneric(): linear");
+    bounds = psVectorAlloc(N+1, PS_TYPE_F32);
+    for (i=0;i<N+1;i++) {
+        bounds->data.F32[i] = (float) (3 * i);
+    }
+
+    tmpSpline = psSpline1DAllocGeneric(bounds, LINEAR);
+    if (tmpSpline == NULL) {
+        printf("ERROR: Could not allocate psSpline1D data structure\n");
+        testStatus = false;
+    }
+    if (tmpSpline->spline == NULL) {
+        printf("ERROR: Could not allocate psSpline1D->spline data structure\n");
+        testStatus = false;
+    }
+
+    if (tmpSpline->n != N) {
+        printf("ERROR: spline->n set incorrectly (%d)\n", tmpSpline->n);
+        testStatus = false;
+    }
+
+    for (i=0;i<N;i++) {
+        if (tmpSpline->spline[i] == NULL) {
+            printf("ERROR: Could not allocate spline %d\n", i);
+            testStatus = false;
+        }
+        if ((tmpSpline->spline[i])->n != LINEAR+1) {
+            printf("ERROR: Spline created with order %d\n", (tmpSpline->spline[i])->n);
+            testStatus = false;
+        }
+    }
+
+    if (tmpSpline->knots == NULL) {
+        printf("ERROR: Could not allocate psSpline1D->knots data structure\n");
+        testStatus = false;
+    }
+
+    for (i=0;i<N+1;i++) {
+        if (tmpSpline->knots->data.F32[i] != bounds->data.F32[i]) {
+            printf("ERROR: psSpline1D->knots->data.F32[%d] is %f\n", i,
+                   tmpSpline->knots->data.F32[i]);
+        }
+    }
+
+    psFree(tmpSpline);
+    psFree(bounds);
+    psMemCheckCorruption(1);
+    memLeaks = psMemCheckLeaks(currentId,NULL,stderr,false);
+    if (0 != memLeaks) {
+        psAbort(__func__,"Memory Leaks! (%d leaks)", memLeaks);
+    }
+
+    printFooter(stdout,
+                "psFunctions functions",
+                "psSpline1DAllocGeneric(): linear",
+                testStatus);
+    /****************************************************************************/
+    /****************************************************************************/
+    testStatus = true;
+    printPositiveTestHeader(stdout,
+                            "psFunction functions",
+                            "psSpline1DAllocGeneric(): cubic");
+    bounds = psVectorAlloc(N+1, PS_TYPE_F32);
+    for (i=0;i<N+1;i++) {
+        bounds->data.F32[i] = (float) (3 * i);
+    }
+
+    tmpSpline = psSpline1DAllocGeneric(bounds, CUBIC);
+    if (tmpSpline == NULL) {
+        printf("ERROR: Could not allocate psSpline1D data structure\n");
+        testStatus = false;
+    }
+    if (tmpSpline->spline == NULL) {
+        printf("ERROR: Could not allocate psSpline1D->spline data structure\n");
+        testStatus = false;
+    }
+
+    if (tmpSpline->n != N) {
+        printf("ERROR: spline->n set incorrectly (%d)\n", tmpSpline->n);
+        testStatus = false;
+    }
+
+    for (i=0;i<N;i++) {
+        if (tmpSpline->spline[i] == NULL) {
+            printf("ERROR: Could not allocate spline %d\n", i);
+            testStatus = false;
+        }
+        if ((tmpSpline->spline[i])->n != CUBIC+1) {
+            printf("ERROR: Spline created with order %d\n", (tmpSpline->spline[i])->n);
+            testStatus = false;
+        }
+    }
+
+    if (tmpSpline->knots == NULL) {
+        printf("ERROR: Could not allocate psSpline1D->knots data structure\n");
+        testStatus = false;
+    }
+
+    for (i=0;i<N+1;i++) {
+        if (tmpSpline->knots->data.F32[i] != bounds->data.F32[i]) {
+            printf("ERROR: psSpline1D->knots->data.F32[%d] is %f\n", i,
+                   tmpSpline->knots->data.F32[i]);
+        }
+    }
+
+    psFree(tmpSpline);
+    psFree(bounds);
+    psMemCheckCorruption(1);
+    memLeaks = psMemCheckLeaks(currentId,NULL,stderr,false);
+    if (0 != memLeaks) {
+        psAbort(__func__,"Memory Leaks! (%d leaks)", memLeaks);
+    }
+
+    printFooter(stdout,
+                "psFunctions functions",
+                "psSpline1DAllocGeneric(): cubic",
+                testStatus);
+
+    return (!testStatus);
+}
Index: /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psFunc04.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psFunc04.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psFunc04.c	(revision 22331)
@@ -0,0 +1,133 @@
+/*****************************************************************************
+    This routine must ensure that the psSpline1DEval() function works
+    properly.  It creates a spline with psSpline1DAlloc(), creates a set of
+    data values, sets the spline polynomials with psVectorFitSpline1D(), then
+    calls psSpline1DEval() on new data values and ensures that the results
+    are correct.
+ 
+    XXX: figure out the memory deallocator
+ *****************************************************************************/
+#include <stdio.h>
+#include <math.h>
+#include "pslib_strict.h"
+#include "psTest.h"
+#include "psMemory.h"
+#include "psFunctions.h"
+
+#define N 8
+
+psS32 t00()
+{
+    psS32 testStatus = true;
+    psS32 memLeaks=0;
+    psS32 i;
+    float x;
+    float y;
+    psS32  currentId = psMemGetId();
+    psSpline1D *tmpSpline;
+    psVector *data;
+
+    psTraceSetLevel(".", 0);
+
+    /****************************************************************************/
+    /****************************************************************************/
+    testStatus = true;
+    printPositiveTestHeader(stdout,
+                            "psFunction functions",
+                            "psSpline1DAlloc()");
+    data = psVectorAlloc(N+1, PS_TYPE_F32);
+    tmpSpline = psSpline1DAlloc(N, 1, 1.0, 10.0);
+
+    for (i=0;i<N+1;i++) {
+        data->data.F32[i] = tmpSpline->knots->data.F32[i];
+    }
+    psVectorFitSpline1D(tmpSpline, data, data, NULL);
+
+    for (i=0;i<N+1;i++) {
+        x = 0.5 + (float) i+1;
+        y = psSpline1DEval(
+                tmpSpline,
+                x
+            );
+        if (fabs(x-y) > FLT_EPSILON) {
+            printf("ERROR: f(%f) is %f\n", x, y);
+            testStatus = true;
+        }
+    }
+
+    psFree(tmpSpline);
+    psMemCheckCorruption(1);
+    psFree(data);
+    memLeaks = psMemCheckLeaks(currentId,NULL,stderr,false);
+    if (0 != memLeaks) {
+        psAbort(__func__,"Memory Leaks! (%d leaks)", memLeaks);
+    }
+
+    printFooter(stdout,
+                "psFunctions functions",
+                "psSpline1DAlloc()",
+                testStatus);
+
+    return (!testStatus);
+}
+
+psS32 t01()
+{
+    psS32 testStatus = true;
+    psS32 memLeaks=0;
+    psS32 i;
+    float x;
+    float y;
+    psS32  currentId = psMemGetId();
+    psSpline1D *tmpSpline;
+    psVector *data;
+
+    psTraceSetLevel(".", 0);
+
+    /****************************************************************************/
+    /****************************************************************************/
+    testStatus = true;
+    printPositiveTestHeader(stdout,
+                            "psFunction functions",
+                            "psSpline1DAlloc()");
+    data = psVectorAlloc(N+1, PS_TYPE_F32);
+    tmpSpline = psSpline1DAlloc(N, 1, 1.0, 10.0);
+
+    for (i=0;i<N+1;i++) {
+        data->data.F32[i] = tmpSpline->knots->data.F32[i];
+    }
+    psVectorFitSpline1D(tmpSpline, data, data, NULL);
+
+    for (i=0;i<N+1;i++) {
+        x = 0.5 + (float) i+1;
+        y = psSpline1DEval(
+                tmpSpline,
+                x
+            );
+        if (fabs(x-y) > FLT_EPSILON) {
+            printf("ERROR: f(%f) is %f\n", x, y);
+            testStatus = true;
+        }
+    }
+
+    psFree(tmpSpline);
+    psMemCheckCorruption(1);
+    psFree(data);
+    memLeaks = psMemCheckLeaks(currentId,NULL,stderr,false);
+    if (0 != memLeaks) {
+        psAbort(__func__,"Memory Leaks! (%d leaks)", memLeaks);
+    }
+
+    printFooter(stdout,
+                "psFunctions functions",
+                "psSpline1DAlloc()",
+                testStatus);
+
+    return (!testStatus);
+}
+
+psS32 main()
+{
+    t00();
+    //    t01();
+}
Index: /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psFunc05.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psFunc05.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psFunc05.c	(revision 22331)
@@ -0,0 +1,82 @@
+/*****************************************************************************
+    This routine must ensure that the psSpline1DEvalVector() function works
+    properly.  It creates a spline with psSpline1DAlloc(), (1-D functions
+    are used for the spline polynomials) creates a set of data values, sets
+    the spline polynomials with psVectorFitSpline1D(), then calls
+    psSpline1DEvalVector() on new data values and ensures that the results
+    are correct.
+ 
+    XXX: Only F32 types are tested here.  F64 types are tested elsewhere.
+ *****************************************************************************/
+#include <stdio.h>
+#include <math.h>
+#include "pslib_strict.h"
+#include "psTest.h"
+#include "psMemory.h"
+#include "psFunctions.h"
+#define N 8
+#define SPLINE_ORDER 1
+
+psS32 main()
+{
+    psS32 testStatus = true;
+    psS32 memLeaks=0;
+    psS32 i;
+    psS32  currentId = psMemGetId();
+    psSpline1D *tmpSpline;
+    psVector *data;
+    psVector *x;
+    psVector *y;
+
+    psTraceSetLevel(".", 0);
+    /****************************************************************************/
+    /****************************************************************************/
+    testStatus = true;
+    printPositiveTestHeader(stdout,
+                            "psFunction functions",
+                            "psSpline1DAlloc()");
+    data = psVectorAlloc(N+1, PS_TYPE_F32);
+    x = psVectorAlloc(N+1, PS_TYPE_F32);
+    tmpSpline = psSpline1DAlloc(N, SPLINE_ORDER, 1.0, 10.0);
+
+    for (i=0;i<N+1;i++) {
+        data->data.F32[i] = tmpSpline->knots->data.F32[i];
+    }
+
+    psVectorFitSpline1D(tmpSpline, data, data, NULL);
+
+    for (i=0;i<N+1;i++) {
+        x->data.F32[i] = 0.5 + (float) i+1;
+    }
+
+    y = psSpline1DEvalVector(
+            tmpSpline,
+            x
+        );
+
+    for (i=0;i<N+1;i++) {
+        if (fabs(x->data.F32[i]-y->data.F32[i]) > FLT_EPSILON) {
+            printf("ERROR: f(%f) is %f\n", x->data.F32[i], y->data.F32[i]);
+            testStatus = true;
+        }
+    }
+
+    psFree(tmpSpline);
+
+    psFree(x);
+    psFree(y);
+    psFree(data);
+
+    psMemCheckCorruption(1);
+    memLeaks = psMemCheckLeaks(currentId,NULL,stderr,false);
+    if (0 != memLeaks) {
+        psAbort(__func__,"Memory Leaks! (%d leaks)", memLeaks);
+    }
+
+    printFooter(stdout,
+                "psFunctions functions",
+                "psSpline1DAlloc()",
+                testStatus);
+
+    return (!testStatus);
+}
Index: /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psFunc07.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psFunc07.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psFunc07.c	(revision 22331)
@@ -0,0 +1,181 @@
+/*****************************************************************************
+This routine must ensure that the psVectorFitSpline1D() function works
+properly.  It creates a spline with psSpline1DAlloc(), creates a set of data
+values, sets the spline polynomials with psVectorFitSpline1D(), then calls
+psSpline1DEval() on new data values and ensures that the results are correct.
+ 
+F32 and F64 versions are used here.
+ 
+XXX: The spline eval functions are F32 only, while the spline fit functions
+are F32 and F64.
+ *****************************************************************************/
+#include <stdio.h>
+#include <math.h>
+#include "pslib_strict.h"
+#include "psTest.h"
+#include "psMemory.h"
+#include "psFunctions.h"
+
+#define NUM_SPLINES 50
+#define A 4.0
+#define B -3.0
+#define C 0.2
+#define D 0.1
+#define MIN 1.0
+#define MAX 30
+#define ERROR_TOLERANCE 0.10
+#define OFFSET (NUM_SPLINES * ERROR_TOLERANCE)
+
+float myFunc(float x)
+{
+    return(A + x * (B + x * (C + x * (D))));
+}
+
+psS32 t00()
+{
+    psS32 testStatus = true;
+    psS32 memLeaks=0;
+    psS32  currentId = psMemGetId();
+    psS32 i;
+    psSpline1D *tmpSpline = NULL;
+    psVector *x = NULL;
+    psVector *newX = NULL;
+    psVector *y = NULL;
+    psVector *newY = NULL;
+
+    psTraceSetLevel(".", 0);
+    /****************************************************************************/
+    /****************************************************************************/
+    testStatus = true;
+    x = psVectorAlloc(NUM_SPLINES+1, PS_TYPE_F32);
+    newX = psVectorAlloc(NUM_SPLINES+1, PS_TYPE_F32);
+    y = psVectorAlloc(NUM_SPLINES+1, PS_TYPE_F32);
+    tmpSpline = psSpline1DAlloc(NUM_SPLINES, 3, MIN, MAX);
+
+    for (i=0;i<NUM_SPLINES+1;i++) {
+        x->data.F32[i] = tmpSpline->knots->data.F32[i];
+        y->data.F32[i] = myFunc(x->data.F32[i]);
+    }
+
+    for (i=0;i<NUM_SPLINES;i++) {
+        newX->data.F32[i]= ((x->data.F32[i] + x->data.F32[i+1])/2.0);
+    }
+    newX->data.F32[NUM_SPLINES] = x->data.F32[NUM_SPLINES];
+    /****************************************************************************/
+    /*   psLib Code      */
+    /****************************************************************************/
+    printPositiveTestHeader(stdout,
+                            "psFunction functions",
+                            "psSpline1DAlloc(), psVectorFitSpline1D, psSpline1DEvalVector: F32 versions");
+
+    psVectorFitSpline1D(tmpSpline, x, y, NULL);
+    newY = psSpline1DEvalVector(
+               tmpSpline,
+               newX
+           );
+
+    for (i=OFFSET;i<NUM_SPLINES-OFFSET+1;i++) {
+        if ( fabs( newY->data.F32[i] - myFunc(newX->data.F32[i]) ) > fabs( ERROR_TOLERANCE * myFunc(newX->data.F32[i]) ) ) {
+            printf("ERROR[%d]: f(%f) is %f.  Should be %f\n", i,
+                   newX->data.F32[i], newY->data.F32[i], myFunc(newX->data.F32[i]));
+            testStatus = false;
+        }
+    }
+
+    psFree(x);
+    psFree(newX);
+    psFree(y);
+    psFree(tmpSpline);
+    psFree(newY);
+
+    psMemCheckCorruption(1);
+    memLeaks = psMemCheckLeaks(currentId,NULL,stderr,false);
+    if (0 != memLeaks) {
+        psAbort(__func__,"Memory Leaks! (%d leaks)", memLeaks);
+    }
+
+    printFooter(stdout,
+                "psFunctions functions",
+                "psSpline1DAlloc(), psVectorFitSpline1D, psSpline1DEvalVector: F32 versions",
+                testStatus);
+
+    return (!testStatus);
+}
+
+// This is the F64 version of the above test code.
+psS32 t01()
+{
+    psS32 testStatus = true;
+    psS32 memLeaks=0;
+    psS32  currentId = psMemGetId();
+    psS32 i;
+    psSpline1D *tmpSpline = NULL;
+    psVector *x = NULL;
+    psVector *newX = NULL;
+    psVector *y = NULL;
+    psVector *newY = NULL;
+
+    psTraceSetLevel(".", 0);
+    /****************************************************************************/
+    /****************************************************************************/
+    testStatus = true;
+    x = psVectorAlloc(NUM_SPLINES+1, PS_TYPE_F64);
+    newX = psVectorAlloc(NUM_SPLINES+1, PS_TYPE_F64);
+    y = psVectorAlloc(NUM_SPLINES+1, PS_TYPE_F64);
+    tmpSpline = psSpline1DAlloc(NUM_SPLINES, 3, MIN, MAX);
+
+    for (i=0;i<NUM_SPLINES+1;i++) {
+        x->data.F64[i] = tmpSpline->knots->data.F32[i];
+        y->data.F64[i] = myFunc(x->data.F64[i]);
+    }
+
+    for (i=0;i<NUM_SPLINES;i++) {
+        newX->data.F64[i]= ((x->data.F64[i] + x->data.F64[i+1])/2.0);
+    }
+    newX->data.F64[NUM_SPLINES] = x->data.F64[NUM_SPLINES];
+    /****************************************************************************/
+    /*   psLib Code      */
+    /****************************************************************************/
+    printPositiveTestHeader(stdout,
+                            "psFunction functions",
+                            "psSpline1DAlloc(), psVectorFitSpline1D, psSpline1DEvalVector: F64 versions");
+
+    psVectorFitSpline1D(tmpSpline, x, y, NULL);
+    newY = psSpline1DEvalVector(
+               tmpSpline,
+               newX
+           );
+
+    for (i=OFFSET;i<NUM_SPLINES-OFFSET+1;i++) {
+        if ( fabs( newY->data.F32[i] - myFunc(newX->data.F64[i]) ) > fabs( ERROR_TOLERANCE * myFunc((float)newX->data.F64[i]) ) ) {
+            printf("ERROR[%d]: f(%f) is %f.  Should be %f\n", i,
+                   newX->data.F64[i], newY->data.F32[i], myFunc((float)newX->data.F64[i]));
+            testStatus = false;
+        }
+    }
+
+    psFree(x);
+    psFree(newX);
+    psFree(y);
+    psFree(tmpSpline);
+    psFree(newY);
+
+    psMemCheckCorruption(1);
+    memLeaks = psMemCheckLeaks(currentId,NULL,stderr,false);
+    if (0 != memLeaks) {
+        psAbort(__func__,"Memory Leaks! (%d leaks)", memLeaks);
+    }
+
+    printFooter(stdout,
+                "psFunctions functions",
+                "psSpline1DAlloc(), psVectorFitSpline1D, psSpline1DEvalVector: F64 versions",
+                testStatus);
+
+    return (!testStatus);
+}
+
+psS32 main()
+{
+    //    t00();
+    t01();
+}
Index: /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psFunc08.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psFunc08.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psFunc08.c	(revision 22331)
@@ -0,0 +1,331 @@
+/** tst_psFunc08.c
+*
+*  This test driver will exercise the psPolynomialXDEval functions for both
+*  ORD and CHEB type polynomials.
+*
+*  @version  $Revision: 1.2 $  $Name: not supported by cvs2svn $
+*  @date  $Date: 2005-04-07 20:27:42 $
+*
+* Copyright 2004-2005 Maui High Performance Computing Center, Univ. of Hawaii
+*
+***************************************************************************/
+
+#include "pslib_strict.h"
+#include "psTest.h"
+
+#define  TERMS        4
+#define  TESTPOINTS   5
+#define  ERROR_TOL    0.001
+
+static psS32 testPoly1DEval(void);
+static psS32 testDPoly1DEval(void);
+static psS32 testPoly1DEvalVector(void);
+static psS32 testDPoly1DEvalVector(void);
+
+testDescription tests[] = {
+                              {testPoly1DEval,000,"psPolynomial1DEval",0,false},
+                              {testDPoly1DEval,000,"psDPolynomial1DEval",0,false},
+                              {testPoly1DEvalVector,000,"psPolynomial1DEvalVector",0,false},
+                              {testDPoly1DEvalVector,000,"psDPolynomial1DEvalVector",0,false},
+                              {NULL}
+                          };
+
+psF32 poly1DCoeff[TERMS]        = { -4.3, 2.3, -3.2, 1.9};
+psF64 Dpoly1DCoeff[TERMS]        = { -4.3, 2.3, -3.2, 1.9};
+psF32 poly1DMask[TERMS]         = {    0,   0,    1,   0  };
+
+psF32 poly1DXValue[TESTPOINTS]   = { 2.550000,    -9.8000,   0.00134,   -12.2500,   0.000};
+psF64 Dpoly1DXValue[TESTPOINTS]  = { 2.550000,    -9.8000,   0.00134,   -12.2500,   0.000};
+psF32 poly1DXResult[TESTPOINTS]  = {33.069613, -1815.1048, -4.296918, -3525.1797, -4.3000};
+psF64 Dpoly1DXResult[TESTPOINTS] = {33.069613, -1815.1048, -4.296918, -3525.1797, -4.3000};
+
+psF32 poly1DXChebValue[TESTPOINTS]   = { -0.99,    -0.33,     0.125,    0.564,    0.875};
+psF64 Dpoly1DXChebValue[TESTPOINTS]  = { -0.99,    -0.33,     0.125,    0.564,    0.875};
+psF32 poly1DXChebResult[TESTPOINTS]  = { -1.401196, 1.016252, 0.257813, 0.089625, 1.429688};
+psF64 Dpoly1DXChebResult[TESTPOINTS] = { -1.401196, 1.016252, 0.257813, 0.089625, 1.429688};
+
+psS32 main(psS32 argc, char* argv[])
+{
+    psLogSetLevel(PS_LOG_INFO);
+
+    return !runTestSuite(stderr,"psPolynomialXDEval", tests, argc, argv);
+}
+
+// This test will verify operation of 1D polynomial evaluation
+psS32 testPoly1DEval(void)
+{
+    psF32  result;
+    psF32  resultCheb;
+
+    // Allocate polynomial structure
+    psPolynomial1D*  polyOrd = psPolynomial1DAlloc(TERMS, PS_POLYNOMIAL_ORD);
+    psPolynomial1D*  polyCheb = psPolynomial1DAlloc(TERMS, PS_POLYNOMIAL_CHEB);
+    // Set polynomial members
+    for(psS32 i = 0; i < TERMS; i++) {
+        polyOrd->coeff[i] = poly1DCoeff[i];
+        polyOrd->mask[i]  = poly1DMask[i];
+        polyCheb->coeff[i] = 1.0;
+        polyCheb->mask[i]  = poly1DMask[i];
+    }
+    // Evaluate test points and verify results
+    for(psS32 i = 0; i < TESTPOINTS; i++) {
+        result = psPolynomial1DEval(polyOrd,poly1DXValue[i]);
+        if(fabs(poly1DXResult[i]-result) > ERROR_TOL ) {
+            psError(PS_ERR_UNKNOWN,true,"Evaluated value %g not as expected %g",
+                    result, poly1DXResult[i]);
+            return i;
+        }
+        resultCheb = psPolynomial1DEval(polyCheb,poly1DXChebValue[i]);
+        if(fabs(poly1DXChebResult[i]-resultCheb) > ERROR_TOL ) {
+            psError(PS_ERR_UNKNOWN,true,"Evaluated Chebyshev value %lg not as expected %lg",
+                    resultCheb, poly1DXChebResult[i]);
+            return 5*i;
+        }
+    }
+    psFree(polyOrd);
+    psFree(polyCheb);
+
+    // Allocate polynomial with invalid type
+    polyOrd = psPolynomial1DAlloc(TERMS, 99);
+    // Attempt to evaluation invalid polynomial type
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate error message invalid type");
+    result = psPolynomial1DEval(polyOrd,0.0);
+    if ( !isnan(result) ) {
+        psError(PS_ERR_UNKNOWN,true,"Did not return NAN for invalid polynomial type");
+        return 20;
+    }
+    psFree(polyOrd);
+
+    return 0;
+}
+
+// This test will verify operation of 1D polynomial evaluation
+psS32 testDPoly1DEval(void)
+{
+    psF64  result;
+    psF64  resultCheb;
+
+    // Allocate polynomial structure
+    psDPolynomial1D*  polyOrd = psDPolynomial1DAlloc(TERMS, PS_POLYNOMIAL_ORD);
+    psDPolynomial1D*  polyCheb = psDPolynomial1DAlloc(TERMS, PS_POLYNOMIAL_CHEB);
+    // Set polynomial members
+    for(psS32 i = 0; i < TERMS; i++) {
+        polyOrd->coeff[i] = Dpoly1DCoeff[i];
+        polyOrd->mask[i]  = poly1DMask[i];
+        polyCheb->coeff[i] = 1.0;
+        polyCheb->mask[i]  = poly1DMask[i];
+    }
+    // Evaluate test points and verify results
+    for(psS32 i = 0; i < TESTPOINTS; i++) {
+        result = psDPolynomial1DEval(polyOrd,Dpoly1DXValue[i]);
+        if(fabs(Dpoly1DXResult[i]-result) > ERROR_TOL ) {
+            psError(PS_ERR_UNKNOWN,true,"Evaluated value %lg not as expected %lg",
+                    result, Dpoly1DXResult[i]);
+            return i;
+        }
+        resultCheb = psDPolynomial1DEval(polyCheb,Dpoly1DXChebValue[i]);
+        if(fabs(Dpoly1DXChebResult[i]-resultCheb) > ERROR_TOL ) {
+            psError(PS_ERR_UNKNOWN,true,"Evaluated Chebyshev value %lg not as expected %lg",
+                    resultCheb, Dpoly1DXChebResult[i]);
+            return 5*i;
+        }
+    }
+    psFree(polyOrd);
+    psFree(polyCheb);
+
+    // Allocate polynomial with invalid type
+    polyOrd = psDPolynomial1DAlloc(TERMS, 99);
+    // Attempt to evaluation invalid polynomial type
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate error message invalid type");
+    result = psDPolynomial1DEval(polyOrd,0.0);
+    if ( !isnan(result) ) {
+        psError(PS_ERR_UNKNOWN,true,"Did not return NAN for invalid polynomial type");
+        return 20;
+    }
+    psFree(polyOrd);
+
+    return 0;
+}
+
+psS32 testPoly1DEvalVector(void)
+{
+    // Allocate polynomial
+    psPolynomial1D* polyOrd = psPolynomial1DAlloc(TERMS,PS_POLYNOMIAL_ORD);
+    psPolynomial1D* polyCheb = psPolynomial1DAlloc(TERMS,PS_POLYNOMIAL_CHEB);
+
+    // Set polynomial members
+    for(psS32 i = 0; i < TERMS; i++) {
+        polyOrd->coeff[i] = poly1DCoeff[i];
+        polyOrd->mask[i]  = poly1DMask[i];
+        polyCheb->coeff[i] = 1.0;
+        polyCheb->mask[i]  = poly1DMask[i];
+    }
+
+    // Create input vectors
+    psVector* inputOrd = psVectorAlloc(TESTPOINTS, PS_TYPE_F32);
+    psVector* inputCheb = psVectorAlloc(TESTPOINTS, PS_TYPE_F32);
+    for(psS32 i = 0; i < TESTPOINTS; i++) {
+        inputOrd->data.F32[i] = poly1DXValue[i];
+        inputCheb->data.F32[i] = poly1DXChebValue[i];
+    }
+
+    // Evaluate the vectors
+    psVector* outputOrd = psPolynomial1DEvalVector(polyOrd, inputOrd);
+    if(outputOrd == NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Unexpected return of NULL.");
+        return 1;
+    }
+    if(outputOrd->type.type != PS_TYPE_F32) {
+        psError(PS_ERR_UNKNOWN,true,"Output vector of type %d expected %d",
+                outputOrd->type.type, PS_TYPE_F32);
+        return 2;
+    }
+    psVector* outputCheb = psPolynomial1DEvalVector(polyCheb, inputCheb);
+    if(outputCheb == NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Unexpected return of NULL.");
+        return 1;
+    }
+    if(outputCheb->type.type != PS_TYPE_F32) {
+        psError(PS_ERR_UNKNOWN,true,"Output vector of type %d expected %d",
+                outputCheb->type.type, PS_TYPE_F32);
+        return 2;
+    }
+
+    // Verify the results
+    for(psS32 i = 0; i < TESTPOINTS; i++) {
+        if(fabs(poly1DXResult[i]-outputOrd->data.F32[i]) > ERROR_TOL) {
+            psError(PS_ERR_UNKNOWN,true,"Result[%d] %g not equal to expected %g",
+                    i, outputOrd->data.F32[i], poly1DXResult[i]);
+            return i*5;
+        }
+        if(fabs(poly1DXChebResult[i]-outputCheb->data.F32[i]) > ERROR_TOL) {
+            psError(PS_ERR_UNKNOWN,true,"ResultCheb[%d] %g not equal to expected %g",
+                    i, outputCheb->data.F32[i], poly1DXChebResult[i]);
+            return i*10;
+        }
+    }
+
+    // Attempt to invoke function with null polynomial
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message for NULL polynomial");
+    if(psPolynomial1DEvalVector(NULL, inputOrd) != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Return of NULL expected for NULL polynomial");
+        return 60;
+    }
+
+    // Attempt to invoke function with null input vector
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message for NULL input vector");
+    if(psPolynomial1DEvalVector(polyOrd,NULL) != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Return of NULL expected for NULL input vector");
+        return 61;
+    }
+
+    // Attempt to invoke function with a non F32 type input vector
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message for invalid input type");
+    inputOrd->type.type = PS_TYPE_U8;
+    if(psPolynomial1DEvalVector(polyOrd,inputOrd) != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Return NULL expected for non-F32 input vector");
+        return 62;
+    }
+    inputOrd->type.type = PS_TYPE_F32;
+
+    psFree(inputOrd);
+    psFree(inputCheb);
+    psFree(outputOrd);
+    psFree(outputCheb);
+    psFree(polyOrd);
+    psFree(polyCheb);
+
+    return 0;
+}
+
+psS32 testDPoly1DEvalVector(void)
+{
+    // Allocate polynomial
+    psDPolynomial1D* polyOrd = psDPolynomial1DAlloc(TERMS,PS_POLYNOMIAL_ORD);
+    psDPolynomial1D* polyCheb = psDPolynomial1DAlloc(TERMS,PS_POLYNOMIAL_CHEB);
+
+    // Set polynomial members
+    for(psS32 i = 0; i < TERMS; i++) {
+        polyOrd->coeff[i] = poly1DCoeff[i];
+        polyOrd->mask[i]  = poly1DMask[i];
+        polyCheb->coeff[i] = 1.0;
+        polyCheb->mask[i]  = poly1DMask[i];
+    }
+
+    // Create input vectors
+    psVector* inputOrd = psVectorAlloc(TESTPOINTS, PS_TYPE_F64);
+    psVector* inputCheb = psVectorAlloc(TESTPOINTS, PS_TYPE_F64);
+    for(psS32 i = 0; i < TESTPOINTS; i++) {
+        inputOrd->data.F64[i] = poly1DXValue[i];
+        inputCheb->data.F64[i] = poly1DXChebValue[i];
+    }
+
+    // Evaluate the vectors
+    psVector* outputOrd = psDPolynomial1DEvalVector(polyOrd, inputOrd);
+    if(outputOrd == NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Unexpected return of NULL.");
+        return 1;
+    }
+    if(outputOrd->type.type != PS_TYPE_F64) {
+        psError(PS_ERR_UNKNOWN,true,"Output vector of type %d expected %d",
+                outputOrd->type.type, PS_TYPE_F64);
+        return 2;
+    }
+    psVector* outputCheb = psDPolynomial1DEvalVector(polyCheb, inputCheb);
+    if(outputCheb == NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Unexpected return of NULL.");
+        return 1;
+    }
+    if(outputCheb->type.type != PS_TYPE_F64) {
+        psError(PS_ERR_UNKNOWN,true,"Output vector of type %d expected %d",
+                outputCheb->type.type, PS_TYPE_F64);
+        return 2;
+    }
+
+    // Verify the results
+    for(psS32 i = 0; i < TESTPOINTS; i++) {
+        if(fabs(poly1DXResult[i]-outputOrd->data.F64[i]) > ERROR_TOL) {
+            psError(PS_ERR_UNKNOWN,true,"Result[%d] %lg not equal to expected %lg",
+                    i, outputOrd->data.F64[i], poly1DXResult[i]);
+            return i*5;
+        }
+        if(fabs(poly1DXChebResult[i]-outputCheb->data.F64[i]) > ERROR_TOL) {
+            psError(PS_ERR_UNKNOWN,true,"ResultCheb[%d] %lg not equal to expected %lg",
+                    i, outputCheb->data.F64[i], poly1DXChebResult[i]);
+            return i*10;
+        }
+    }
+
+    // Attempt to invoke function with null polynomial
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message for NULL polynomial");
+    if(psDPolynomial1DEvalVector(NULL, inputOrd) != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Return of NULL expected for NULL polynomial");
+        return 60;
+    }
+
+    // Attempt to invoke function with null input vector
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message for NULL input vector");
+    if(psDPolynomial1DEvalVector(polyOrd,NULL) != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Return of NULL expected for NULL input vector");
+        return 61;
+    }
+
+    // Attempt to invoke function with a non F64 type input vector
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message for invalid input type");
+    inputOrd->type.type = PS_TYPE_U8;
+    if(psDPolynomial1DEvalVector(polyOrd,inputOrd) != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Return NULL expected for non-F64 input vector");
+        return 62;
+    }
+    inputOrd->type.type = PS_TYPE_F64;
+
+    psFree(inputOrd);
+    psFree(inputCheb);
+    psFree(outputOrd);
+    psFree(outputCheb);
+    psFree(polyOrd);
+    psFree(polyCheb);
+
+    return 0;
+}
+
Index: /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psFunc09.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psFunc09.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psFunc09.c	(revision 22331)
@@ -0,0 +1,411 @@
+/** tst_psFunc09.c
+*
+*  This test driver will exercise the psPolynomialXDEval functions for both
+*  ORD and CHEB type polynomials.
+*
+*  @version  $Revision: 1.2 $  $Name: not supported by cvs2svn $
+*  @date  $Date: 2005-04-07 20:27:42 $
+*
+* Copyright 2004-2005 Maui High Performance Computing Center, Univ. of Hawaii
+*
+***************************************************************************/
+
+#include "pslib_strict.h"
+#include "psTest.h"
+
+#define  TERMS        4
+#define  TESTPOINTS   5
+#define  ERROR_TOL    0.001
+
+static psS32 testPoly2DEval(void);
+static psS32 testDPoly2DEval(void);
+static psS32 testPoly2DEvalVector(void);
+static psS32 testDPoly2DEvalVector(void);
+
+testDescription tests[] = {
+                              {testPoly2DEval,583,"psPolynomial2DEval",0,false},
+                              {testDPoly2DEval,582,"psDPolynomial2DEval",0,false},
+                              {testPoly2DEvalVector,000,"psPolynomial2DEvalVector",0,false},
+                              {testDPoly2DEvalVector,000,"psDPolynomial2DEvalVector",0,false},
+                              {NULL}
+                          };
+
+psF32 poly2DCoeff[TERMS][TERMS]   = {  { -4.3,  2.3, -3.2,  1.9},
+                                       {  1.2,  0.7, -0.3,  1.3},
+                                       {  0.4, -2.9,  0.8, -3.1},
+                                       { -1.1,  2.1,  1.9,  0.6}
+                                    };
+psF64 Dpoly2DCoeff[TERMS][TERMS]  = {  { -4.3,  2.3, -3.2,  1.9},
+                                       {  1.2,  0.7, -0.3,  1.3},
+                                       {  0.4, -2.9,  0.8, -3.1},
+                                       { -1.1,  2.1,  1.9,  0.6}
+                                    };
+psF32 poly2DMask[TERMS][TERMS]    = {  {  0,    0,    0,    1},
+                                       {  0,    0,    1,    0},
+                                       {  1,    0,    0,    0},
+                                       {  0,    0,    0,    1}
+                                    };
+
+psF32 poly2DXYValue[TESTPOINTS][2] = {  {  1.40,  0.55},
+                                        { -0.55,  1.40},
+                                        {  0.00,  2.34},
+                                        { -0.88,  0.00},
+                                        {  3.45, -0.78}
+                                     };
+psF32 Dpoly2DXYValue[TESTPOINTS][2] = {  {  1.40,  0.55},
+                                      { -0.55,  1.40},
+                                      {  0.00,  2.34},
+                                      { -0.88,  0.00},
+                                      {  3.45, -0.78}
+                                      };
+psF32 poly2DResult[TESTPOINTS] = {  -3.415938, -14.765687, -16.43992, -4.606381, -22.650702 };
+psF64 Dpoly2DResult[TESTPOINTS] = {  -3.415938, -14.765687, -16.43992, -4.606381, -22.650702 };
+
+psF32 poly2DXYChebValue[TESTPOINTS][2] = {  {  0.500,  0.500},
+        {  0.000,  0.250},
+        { -0.250,  0.000},
+        {  0.990,  0.150},
+        {  0.333, -0.666}
+                                         };
+psF32 Dpoly2DXYChebValue[TESTPOINTS][2] = {  {  0.500,  0.500},
+        {  0.000,  0.250},
+        { -0.250,  0.000},
+        {  0.990,  0.150},
+        {  0.333, -0.666}
+                                          };
+psF32 poly2DChebResult[TESTPOINTS] = {  0.750000, 1.687500, 0.625000, -0.113040, 0.386786 };
+psF32 Dpoly2DChebResult[TESTPOINTS] = {  0.750000, 1.687500, 0.625000, -0.113040, 0.386786 };
+
+psS32 main(psS32 argc, char* argv[])
+{
+    psLogSetLevel(PS_LOG_INFO);
+
+    return !runTestSuite(stderr,"psPolynomialXDEval", tests, argc, argv);
+}
+
+// This test will verify operation of 1D polynomial evaluation
+psS32 testPoly2DEval(void)
+{
+    psF32  result;
+    psF32  resultCheb;
+
+    // Allocate polynomial structure
+    psPolynomial2D*  polyOrd = psPolynomial2DAlloc(TERMS, TERMS, PS_POLYNOMIAL_ORD);
+    psPolynomial2D*  polyCheb = psPolynomial2DAlloc(TERMS, TERMS, PS_POLYNOMIAL_CHEB);
+    // Set polynomial members
+    for(psS32 i = 0; i < TERMS; i++) {
+        for(psS32 j = 0; j < TERMS; j++) {
+            polyOrd->coeff[i][j] = poly2DCoeff[i][j];
+            polyOrd->mask[i][j]  = poly2DMask[i][j];
+            polyCheb->coeff[i][j] = 1.0;
+            polyCheb->mask[i][j]  = poly2DMask[i][j];
+        }
+    }
+    // Evaluate test points and verify results
+    for(psS32 i = 0; i < TESTPOINTS; i++) {
+        result = psPolynomial2DEval(polyOrd,poly2DXYValue[i][0],poly2DXYValue[i][1]);
+        if(fabs(poly2DResult[i]-result) > ERROR_TOL ) {
+            psError(PS_ERR_UNKNOWN,true,"Evaluated value %g not as expected %g",
+                    result, poly2DResult[i]);
+            return i;
+        }
+        resultCheb = psPolynomial2DEval(polyCheb,poly2DXYChebValue[i][0], poly2DXYChebValue[i][1]);
+        if(fabs(poly2DChebResult[i]-resultCheb) > ERROR_TOL ) {
+            psError(PS_ERR_UNKNOWN,true,"Evaluated Chebyshev value %lg not as expected %lg",
+                    resultCheb, poly2DChebResult[i]);
+            return 5*i;
+        }
+    }
+    psFree(polyOrd);
+    psFree(polyCheb);
+
+    // Allocate polynomial with invalid type
+    polyOrd = psPolynomial2DAlloc(TERMS, TERMS, 99);
+    // Attempt to evaluation invalid polynomial type
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate error message invalid type");
+    result = psPolynomial2DEval(polyOrd,0.0, 0.0);
+    if ( !isnan(result) ) {
+        psError(PS_ERR_UNKNOWN,true,"Did not return NAN for invalid polynomial type");
+        return 20;
+    }
+    psFree(polyOrd);
+
+    return 0;
+}
+
+// This test will verify operation of 1D polynomial evaluation
+psS32 testDPoly2DEval(void)
+{
+    psF64  result;
+    psF64  resultCheb;
+
+    // Allocate polynomial structure
+    psDPolynomial2D*  polyOrd = psDPolynomial2DAlloc(TERMS, TERMS, PS_POLYNOMIAL_ORD);
+    psDPolynomial2D*  polyCheb = psDPolynomial2DAlloc(TERMS, TERMS, PS_POLYNOMIAL_CHEB);
+    // Set polynomial members
+    for(psS32 i = 0; i < TERMS; i++) {
+        for(psS32 j = 0; j < TERMS; j++) {
+            polyOrd->coeff[i][j] = poly2DCoeff[i][j];
+            polyOrd->mask[i][j]  = poly2DMask[i][j];
+            polyCheb->coeff[i][j] = 1.0;
+            polyCheb->mask[i][j]  = poly2DMask[i][j];
+        }
+    }
+    // Evaluate test points and verify results
+    for(psS32 i = 0; i < TESTPOINTS; i++) {
+        result = psDPolynomial2DEval(polyOrd,Dpoly2DXYValue[i][0],Dpoly2DXYValue[i][1]);
+        if(fabs(Dpoly2DResult[i]-result) > ERROR_TOL ) {
+            psError(PS_ERR_UNKNOWN,true,"Evaluated value %lg not as expected %lg",
+                    result, Dpoly2DResult[i]);
+            return i;
+        }
+        resultCheb = psDPolynomial2DEval(polyCheb,Dpoly2DXYChebValue[i][0],Dpoly2DXYChebValue[i][1]);
+        if(fabs(Dpoly2DChebResult[i]-resultCheb) > ERROR_TOL ) {
+            psError(PS_ERR_UNKNOWN,true,"Evaluated Chebyshev value %lg not as expected %lg",
+                    resultCheb, Dpoly2DChebResult[i]);
+            return 5*i;
+        }
+    }
+    psFree(polyOrd);
+    psFree(polyCheb);
+
+    // Allocate polynomial with invalid type
+    polyOrd = psDPolynomial2DAlloc(TERMS, TERMS, 99);
+    // Attempt to evaluation invalid polynomial type
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate error message invalid type");
+    result = psDPolynomial2DEval(polyOrd,0.0, 0.0);
+    if ( !isnan(result) ) {
+        psError(PS_ERR_UNKNOWN,true,"Did not return NAN for invalid polynomial type");
+        return 20;
+    }
+    psFree(polyOrd);
+
+    return 0;
+}
+
+psS32 testPoly2DEvalVector(void)
+{
+    // Allocate polynomial
+    psPolynomial2D* polyOrd = psPolynomial2DAlloc(TERMS,TERMS,PS_POLYNOMIAL_ORD);
+    psPolynomial2D* polyCheb = psPolynomial2DAlloc(TERMS,TERMS,PS_POLYNOMIAL_CHEB);
+
+    // Set polynomial members
+    for(psS32 i = 0; i < TERMS; i++) {
+        for(psS32 j = 0; j < TERMS; j++) {
+            polyOrd->coeff[i][j] = poly2DCoeff[i][j];
+            polyOrd->mask[i][j]  = poly2DMask[i][j];
+            polyCheb->coeff[i][j] = 1.0;
+            polyCheb->mask[i][j]  = poly2DMask[i][j];
+        }
+    }
+
+    // Create input vectors
+    psVector* inputOrdX  = psVectorAlloc(TESTPOINTS, PS_TYPE_F32);
+    psVector* inputOrdY  = psVectorAlloc(TESTPOINTS, PS_TYPE_F32);
+    psVector* inputChebX = psVectorAlloc(TESTPOINTS, PS_TYPE_F32);
+    psVector* inputChebY = psVectorAlloc(TESTPOINTS, PS_TYPE_F32);
+    for(psS32 i = 0; i < TESTPOINTS; i++) {
+        inputOrdX->data.F32[i] = poly2DXYValue[i][0];
+        inputOrdY->data.F32[i] = poly2DXYValue[i][1];
+        inputChebX->data.F32[i] = poly2DXYChebValue[i][0];
+        inputChebY->data.F32[i] = poly2DXYChebValue[i][1];
+    }
+
+    // Evaluate the vectors
+    psVector* outputOrd = psPolynomial2DEvalVector(polyOrd, inputOrdX, inputOrdY);
+    if(outputOrd == NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Unexpected return of NULL.");
+        return 1;
+    }
+    if(outputOrd->type.type != PS_TYPE_F32) {
+        psError(PS_ERR_UNKNOWN,true,"Output vector of type %d expected %d",
+                outputOrd->type.type, PS_TYPE_F32);
+        return 2;
+    }
+    psVector* outputCheb = psPolynomial2DEvalVector(polyCheb, inputChebX, inputChebY);
+    if(outputCheb == NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Unexpected return of NULL.");
+        return 1;
+    }
+    if(outputCheb->type.type != PS_TYPE_F32) {
+        psError(PS_ERR_UNKNOWN,true,"Output vector of type %d expected %d",
+                outputCheb->type.type, PS_TYPE_F32);
+        return 2;
+    }
+
+    // Verify the results
+    for(psS32 i = 0; i < TESTPOINTS; i++) {
+        if(fabs(poly2DResult[i]-outputOrd->data.F32[i]) > ERROR_TOL) {
+            psError(PS_ERR_UNKNOWN,true,"Result[%d] %g not equal to expected %g",
+                    i, outputOrd->data.F32[i], poly2DResult[i]);
+            return i*5;
+        }
+        if(fabs(poly2DChebResult[i]-outputCheb->data.F32[i]) > ERROR_TOL) {
+            psError(PS_ERR_UNKNOWN,true,"ResultCheb[%d] %g not equal to expected %g",
+                    i, outputCheb->data.F32[i], poly2DChebResult[i]);
+            return i*10;
+        }
+    }
+
+    // Attempt to invoke function with null polynomial
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message for NULL polynomial");
+    if(psPolynomial2DEvalVector(NULL, inputOrdX, inputOrdY) != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Return of NULL expected for NULL polynomial");
+        return 60;
+    }
+
+    // Attempt to invoke function with null input vector
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message for NULL input vector");
+    if(psPolynomial2DEvalVector(polyOrd,NULL, inputOrdY) != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Return of NULL expected for NULL input vector");
+        return 61;
+    }
+    // Attempt to invoke function with null input vector
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message for NULL input vector");
+    if(psPolynomial2DEvalVector(polyOrd, inputOrdX, NULL) != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Return of NULL expected for NULL input vector");
+        return 62;
+    }
+
+    // Attempt to invoke function with a non F32 type input vector
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message for invalid input type");
+    inputOrdX->type.type = PS_TYPE_U8;
+    if(psPolynomial2DEvalVector(polyOrd,inputOrdX,inputOrdY) != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Return NULL expected for non-F32 input vector");
+        return 63;
+    }
+    inputOrdX->type.type = PS_TYPE_F32;
+    // Attempt to invoke function with a non F32 type input vector
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message for invalid input type");
+    inputOrdY->type.type = PS_TYPE_U8;
+    if(psPolynomial2DEvalVector(polyOrd,inputOrdX,inputOrdY) != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Return NULL expected for non-F32 input vector");
+        return 64;
+    }
+    inputOrdY->type.type = PS_TYPE_F32;
+
+    psFree(inputOrdX);
+    psFree(inputOrdY);
+    psFree(inputChebX);
+    psFree(inputChebY);
+    psFree(outputOrd);
+    psFree(outputCheb);
+    psFree(polyOrd);
+    psFree(polyCheb);
+
+    return 0;
+}
+
+psS32 testDPoly2DEvalVector(void)
+{
+    // Allocate polynomial
+    psDPolynomial2D* polyOrd = psDPolynomial2DAlloc(TERMS,TERMS,PS_POLYNOMIAL_ORD);
+    psDPolynomial2D* polyCheb = psDPolynomial2DAlloc(TERMS,TERMS,PS_POLYNOMIAL_CHEB);
+
+    // Set polynomial members
+    for(psS32 i = 0; i < TERMS; i++) {
+        for(psS32 j = 0; j < TERMS; j++) {
+            polyOrd->coeff[i][j] = poly2DCoeff[i][j];
+            polyOrd->mask[i][j]  = poly2DMask[i][j];
+            polyCheb->coeff[i][j] = 1.0;
+            polyCheb->mask[i][j]  = poly2DMask[i][j];
+        }
+    }
+
+    // Create input vectors
+    psVector* inputOrdX  = psVectorAlloc(TESTPOINTS, PS_TYPE_F64);
+    psVector* inputOrdY  = psVectorAlloc(TESTPOINTS, PS_TYPE_F64);
+    psVector* inputChebX = psVectorAlloc(TESTPOINTS, PS_TYPE_F64);
+    psVector* inputChebY = psVectorAlloc(TESTPOINTS, PS_TYPE_F64);
+    for(psS32 i = 0; i < TESTPOINTS; i++) {
+        inputOrdX->data.F64[i]  = poly2DXYValue[i][0];
+        inputOrdY->data.F64[i]  = poly2DXYValue[i][1];
+        inputChebX->data.F64[i] = poly2DXYChebValue[i][0];
+        inputChebY->data.F64[i] = poly2DXYChebValue[i][1];
+    }
+
+    // Evaluate the vectors
+    psVector* outputOrd = psDPolynomial2DEvalVector(polyOrd, inputOrdX, inputOrdY);
+    if(outputOrd == NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Unexpected return of NULL.");
+        return 1;
+    }
+    if(outputOrd->type.type != PS_TYPE_F64) {
+        psError(PS_ERR_UNKNOWN,true,"Output vector of type %d expected %d",
+                outputOrd->type.type, PS_TYPE_F64);
+        return 2;
+    }
+    psVector* outputCheb = psDPolynomial2DEvalVector(polyCheb, inputChebX, inputChebY);
+    if(outputCheb == NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Unexpected return of NULL.");
+        return 1;
+    }
+    if(outputCheb->type.type != PS_TYPE_F64) {
+        psError(PS_ERR_UNKNOWN,true,"Output vector of type %d expected %d",
+                outputCheb->type.type, PS_TYPE_F64);
+        return 2;
+    }
+
+    // Verify the results
+    for(psS32 i = 0; i < TESTPOINTS; i++) {
+        if(fabs(poly2DResult[i]-outputOrd->data.F64[i]) > ERROR_TOL) {
+            psError(PS_ERR_UNKNOWN,true,"Result[%d] %lg not equal to expected %lg",
+                    i, outputOrd->data.F64[i], poly2DResult[i]);
+            return i*5;
+        }
+        if(fabs(poly2DChebResult[i]-outputCheb->data.F64[i]) > ERROR_TOL) {
+            psError(PS_ERR_UNKNOWN,true,"ResultCheb[%d] %lg not equal to expected %lg",
+                    i, outputCheb->data.F64[i], poly2DChebResult[i]);
+            return i*10;
+        }
+    }
+
+    // Attempt to invoke function with null polynomial
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message for NULL polynomial");
+    if(psDPolynomial2DEvalVector(NULL, inputOrdX, inputOrdY) != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Return of NULL expected for NULL polynomial");
+        return 60;
+    }
+
+    // Attempt to invoke function with null input vector
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message for NULL input vector");
+    if(psDPolynomial2DEvalVector(polyOrd,NULL,inputOrdY) != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Return of NULL expected for NULL input vector");
+        return 61;
+    }
+    // Attempt to invoke function with null input vector
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message for NULL input vector");
+    if(psDPolynomial2DEvalVector(polyOrd,inputOrdX,NULL) != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Return of NULL expected for NULL input vector");
+        return 62;
+    }
+
+    // Attempt to invoke function with a non F64 type input vector
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message for invalid input type");
+    inputOrdX->type.type = PS_TYPE_U8;
+    if(psDPolynomial2DEvalVector(polyOrd,inputOrdX, inputOrdY) != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Return NULL expected for non-F64 input vector");
+        return 63;
+    }
+    inputOrdX->type.type = PS_TYPE_F64;
+    // Attempt to invoke function with a non F64 type input vector
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message for invalid input type");
+    inputOrdY->type.type = PS_TYPE_U8;
+    if(psDPolynomial2DEvalVector(polyOrd,inputOrdX, inputOrdY) != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Return NULL expected for non-F64 input vector");
+        return 64;
+    }
+    inputOrdY->type.type = PS_TYPE_F64;
+
+    psFree(inputOrdX);
+    psFree(inputOrdY);
+    psFree(inputChebX);
+    psFree(inputChebY);
+    psFree(outputOrd);
+    psFree(outputCheb);
+    psFree(polyOrd);
+    psFree(polyCheb);
+
+    return 0;
+}
+
Index: /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psFunc10.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psFunc10.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psFunc10.c	(revision 22331)
@@ -0,0 +1,514 @@
+/** tst_psFunc10.c
+*
+*  This test driver will exercise the psPolynomialXDEval functions for both
+*  ORD and CHEB type polynomials.
+*
+*  @version  $Revision: 1.2 $  $Name: not supported by cvs2svn $
+*  @date  $Date: 2005-04-07 20:27:42 $
+*
+* Copyright 2004-2005 Maui High Performance Computing Center, Univ. of Hawaii
+*
+***************************************************************************/
+
+#include "pslib_strict.h"
+#include "psTest.h"
+
+#define  TERMS        4
+#define  TESTPOINTS   5
+#define  ERROR_TOL    0.001
+
+static psS32 testPoly3DEval(void);
+static psS32 testDPoly3DEval(void);
+static psS32 testPoly3DEvalVector(void);
+static psS32 testDPoly3DEvalVector(void);
+
+testDescription tests[] = {
+                              {testPoly3DEval,583,"psPolynomial3DEval",0,false},
+                              {testDPoly3DEval,582,"psDPolynomial3DEval",0,false},
+                              {testPoly3DEvalVector,000,"psPolynomial3DEvalVector",0,false},
+                              {testDPoly3DEvalVector,000,"psDPolynomial3DEvalVector",0,false},
+                              {NULL}
+                          };
+
+psF32 poly3DCoeff[TERMS][TERMS][TERMS] = {  { { -1.1,  1.2, -1.3,  1.4},
+        {  1.5, -1.6,  1.7, -1.8},
+        {  0.1, -0.2,  0.3, -0.4},
+        { -0.5,  0.6, -0.7,  0.8}
+                                            },
+        { { -2.1,  2.2, -2.3,  2.4},
+          {  2.5, -2.6,  2.7, -2.8},
+          {  3.1, -3.2,  3.3, -3.4},
+          { -3.5,  3.6, -3.7,  3.8}
+        },
+        { { -4.1,  4.2, -4.3,  4.4},
+          {  4.5, -4.6,  4.7, -4.8},
+          {  5.1, -5.2,  5.3, -5.4},
+          { -5.5,  5.6, -5.7,  5.8}
+        },
+        { { -6.1,  6.2, -6.3,  6.4},
+          {  6.5, -6.6,  6.7, -6.8},
+          {  7.1, -7.2,  7.3, -7.4},
+          { -7.5,  7.6, -7.7,  7.8}
+        }
+                                         };
+psF64 Dpoly3DCoeff[TERMS][TERMS][TERMS] = {  { { -1.1,  1.2, -1.3,  1.4},
+        {  1.5, -1.6,  1.7, -1.8},
+        {  0.1, -0.2,  0.3, -0.4},
+        { -0.5,  0.6, -0.7,  0.8}
+                                             },
+        { { -2.1,  2.2, -2.3,  2.4},
+          {  2.5, -2.6,  2.7, -2.8},
+          {  3.1, -3.2,  3.3, -3.4},
+          { -3.5,  3.6, -3.7,  3.8}
+        },
+        { { -4.1,  4.2, -4.3,  4.4},
+          {  4.5, -4.6,  4.7, -4.8},
+          {  5.1, -5.2,  5.3, -5.4},
+          { -5.5,  5.6, -5.7,  5.8}
+        },
+        { { -6.1,  6.2, -6.3,  6.4},
+          {  6.5, -6.6,  6.7, -6.8},
+          {  7.1, -7.2,  7.3, -7.4},
+          { -7.5,  7.6, -7.7,  7.8}
+        }
+                                          };
+
+
+psF32 poly3DMask[TERMS][TERMS][TERMS]    = { {  {  0,    0,    0,    1},
+        {  0,    0,    1,    0},
+        {  1,    0,    0,    0},
+        {  0,    0,    0,    1}
+                                             },
+        {  {  1,    0,    0,    0},
+           {  1,    0,    0,    0},
+           {  1,    0,    0,    0},
+           {  1,    0,    0,    0}
+        },
+        {  {  0,    1,    0,    0},
+           {  0,    0,    1,    0},
+           {  0,    1,    0,    0},
+           {  0,    0,    1,    0}
+        },
+        {  {  1,    0,    0,    0},
+           {  0,    0,    0,    1},
+           {  1,    0,    0,    0},
+           {  0,    0,    0,    1}
+        },
+                                           };
+
+psF32 poly3DXYZValue[TESTPOINTS][3] = {  {  0.450, -0.780,  0.500},
+                                      {  0.297,  0.153, -0.354},
+                                      {  0.000,  0.153, -0.354},
+                                      {  0.297,  0.000, -0.354},
+                                      {  0.297,  0.153,  0.000}
+                                      };
+psF64 Dpoly3DXYZValue[TESTPOINTS][3] = {  {  0.450, -0.780,  0.500},
+                                       {  0.297,  0.153, -0.354},
+                                       {  0.000,  0.153, -0.354},
+                                       {  0.297,  0.000, -0.354},
+                                       {  0.297,  0.153,  0.000}
+                                       };
+psF32 poly3DResult[TESTPOINTS]  = { -1.298691, -2.011591, -1.359247, -2.548266, -1.139072};
+psF64 Dpoly3DResult[TESTPOINTS] = { -1.298691, -2.011591, -1.359247, -2.548266, -1.139072};
+
+
+psF32 poly3DXYZChebValue[TESTPOINTS][3] = {  {  0.000,  0.250, -0.250},
+        { -0.250,  0.000,  0.250},
+        {  0.250, -0.250,  0.000},
+        {  0.100, -0.300, -0.400},
+        {  0.990, -0.010,  0.500}
+                                          };
+psF64 Dpoly3DXYZChebValue[TESTPOINTS][3] = {  {  0.000,  0.250, -0.250},
+        { -0.250,  0.000,  0.250},
+        {  0.250, -0.250,  0.000},
+        {  0.100, -0.300, -0.400},
+        {  0.990, -0.010,  0.500}
+                                           };
+psF32 poly3DChebResult[TESTPOINTS]  = {  1.230469, 1.687500, 0.187500, -1.452707, 2.032344 };
+psF64 Dpoly3DChebResult[TESTPOINTS] = {  1.230469, 1.687500, 0.187500, -1.452707, 2.032344 };
+
+psS32 main(psS32 argc, char* argv[])
+{
+    psLogSetLevel(PS_LOG_INFO);
+
+    return !runTestSuite(stderr,"psPolynomialXDEval", tests, argc, argv);
+}
+
+// This test will verify operation of 1D polynomial evaluation
+psS32 testPoly3DEval(void)
+{
+    psF32  result;
+    psF32  resultCheb;
+
+    // Allocate polynomial structure
+    psPolynomial3D*  polyOrd = psPolynomial3DAlloc(TERMS, TERMS, TERMS, PS_POLYNOMIAL_ORD);
+    psPolynomial3D*  polyCheb = psPolynomial3DAlloc(TERMS, TERMS, TERMS, PS_POLYNOMIAL_CHEB);
+    // Set polynomial members
+    for(psS32 i = 0; i < TERMS; i++) {
+        for(psS32 j = 0; j < TERMS; j++) {
+            for(psS32 k = 0; k < TERMS; k++) {
+                polyOrd->coeff[i][j][k] = poly3DCoeff[i][j][k];
+                polyOrd->mask[i][j][k]  = poly3DMask[i][j][k];
+                polyCheb->coeff[i][j][k] = 1.0;
+                polyCheb->mask[i][j][k]  = poly3DMask[i][j][k];
+            }
+        }
+    }
+    // Evaluate test points and verify results
+    for(psS32 i = 0; i < TESTPOINTS; i++) {
+        result = psPolynomial3DEval(polyOrd,poly3DXYZValue[i][0],poly3DXYZValue[i][1],
+                                    poly3DXYZValue[i][2]);
+        if(fabs(poly3DResult[i]-result) > ERROR_TOL ) {
+            psError(PS_ERR_UNKNOWN,true,"Evaluated value %g not as expected %g",
+                    result, poly3DResult[i]);
+            return i;
+        }
+        resultCheb = psPolynomial3DEval(polyCheb,poly3DXYZChebValue[i][0], poly3DXYZChebValue[i][1],
+                                        poly3DXYZChebValue[i][2]);
+        if(fabs(poly3DChebResult[i]-resultCheb) > ERROR_TOL ) {
+            psError(PS_ERR_UNKNOWN,true,"Evaluated Chebyshev value %lg not as expected %lg",
+                    resultCheb, poly3DChebResult[i]);
+            return 5*i;
+        }
+    }
+    psFree(polyOrd);
+    psFree(polyCheb);
+
+    // Allocate polynomial with invalid type
+    polyOrd = psPolynomial3DAlloc(TERMS, TERMS, TERMS, 99);
+    // Attempt to evaluation invalid polynomial type
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate error message invalid type");
+    result = psPolynomial3DEval(polyOrd,0.0, 0.0, 0.0);
+    if ( !isnan(result) ) {
+        psError(PS_ERR_UNKNOWN,true,"Did not return NAN for invalid polynomial type");
+        return 20;
+    }
+    psFree(polyOrd);
+
+    return 0;
+}
+
+// This test will verify operation of 1D polynomial evaluation
+psS32 testDPoly3DEval(void)
+{
+    psF64  result;
+    psF64  resultCheb;
+
+    // Allocate polynomial structure
+    psDPolynomial3D*  polyOrd = psDPolynomial3DAlloc(TERMS,TERMS,TERMS,PS_POLYNOMIAL_ORD);
+    psDPolynomial3D*  polyCheb = psDPolynomial3DAlloc(TERMS,TERMS,TERMS,PS_POLYNOMIAL_CHEB);
+    // Set polynomial members
+    for(psS32 i = 0; i < TERMS; i++) {
+        for(psS32 j = 0; j < TERMS; j++) {
+            for(psS32 k = 0; k < TERMS; k++) {
+                polyOrd->coeff[i][j][k] = Dpoly3DCoeff[i][j][k];
+                polyOrd->mask[i][j][k]  = poly3DMask[i][j][k];
+                polyCheb->coeff[i][j][k] = 1.0;
+                polyCheb->mask[i][j][k]  = poly3DMask[i][j][k];
+            }
+        }
+    }
+    // Evaluate test points and verify results
+    for(psS32 i = 0; i < TESTPOINTS; i++) {
+        result = psDPolynomial3DEval(polyOrd,Dpoly3DXYZValue[i][0],Dpoly3DXYZValue[i][1],
+                                     Dpoly3DXYZValue[i][2]);
+        if(fabs(Dpoly3DResult[i]-result) > ERROR_TOL ) {
+            psError(PS_ERR_UNKNOWN,true,"Evaluated value %lg not as expected %lg",
+                    result, Dpoly3DResult[i]);
+            return i;
+        }
+        resultCheb = psDPolynomial3DEval(polyCheb,Dpoly3DXYZChebValue[i][0],Dpoly3DXYZChebValue[i][1],
+                                         Dpoly3DXYZChebValue[i][2]);
+        if(fabs(Dpoly3DChebResult[i]-resultCheb) > ERROR_TOL ) {
+            psError(PS_ERR_UNKNOWN,true,"Evaluated Chebyshev value %lg not as expected %lg",
+                    resultCheb, Dpoly3DChebResult[i]);
+            return 5*i;
+        }
+    }
+    psFree(polyOrd);
+    psFree(polyCheb);
+
+    // Allocate polynomial with invalid type
+    polyOrd = psDPolynomial3DAlloc(TERMS, TERMS, TERMS, 99);
+    // Attempt to evaluation invalid polynomial type
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate error message invalid type");
+    result = psDPolynomial3DEval(polyOrd,0.0, 0.0, 0.0);
+    if ( !isnan(result) ) {
+        psError(PS_ERR_UNKNOWN,true,"Did not return NAN for invalid polynomial type");
+        return 20;
+    }
+    psFree(polyOrd);
+
+    return 0;
+}
+
+psS32 testPoly3DEvalVector(void)
+{
+    // Allocate polynomial
+    psPolynomial3D* polyOrd  = psPolynomial3DAlloc(TERMS,TERMS,TERMS,PS_POLYNOMIAL_ORD);
+    psPolynomial3D* polyCheb = psPolynomial3DAlloc(TERMS,TERMS,TERMS,PS_POLYNOMIAL_CHEB);
+
+    // Set polynomial members
+    for(psS32 i = 0; i < TERMS; i++) {
+        for(psS32 j = 0; j < TERMS; j++) {
+            for(psS32 k = 0; k < TERMS; k++) {
+                polyOrd->coeff[i][j][k] = poly3DCoeff[i][j][k];
+                polyOrd->mask[i][j][k]  = poly3DMask[i][j][k];
+                polyCheb->coeff[i][j][k] = 1.0;
+                polyCheb->mask[i][j][k]  = poly3DMask[i][j][k];
+            }
+        }
+    }
+
+    // Create input vectors
+    psVector* inputOrdX  = psVectorAlloc(TESTPOINTS, PS_TYPE_F32);
+    psVector* inputOrdY  = psVectorAlloc(TESTPOINTS, PS_TYPE_F32);
+    psVector* inputOrdZ  = psVectorAlloc(TESTPOINTS, PS_TYPE_F32);
+    psVector* inputChebX = psVectorAlloc(TESTPOINTS, PS_TYPE_F32);
+    psVector* inputChebY = psVectorAlloc(TESTPOINTS, PS_TYPE_F32);
+    psVector* inputChebZ = psVectorAlloc(TESTPOINTS, PS_TYPE_F32);
+    for(psS32 i = 0; i < TESTPOINTS; i++) {
+        inputOrdX->data.F32[i] = poly3DXYZValue[i][0];
+        inputOrdY->data.F32[i] = poly3DXYZValue[i][1];
+        inputOrdZ->data.F32[i] = poly3DXYZValue[i][2];
+        inputChebX->data.F32[i] = poly3DXYZChebValue[i][0];
+        inputChebY->data.F32[i] = poly3DXYZChebValue[i][1];
+        inputChebZ->data.F32[i] = poly3DXYZChebValue[i][2];
+    }
+
+    // Evaluate the vectors
+    psVector* outputOrd = psPolynomial3DEvalVector(polyOrd,inputOrdX,inputOrdY,inputOrdZ);
+    if(outputOrd == NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Unexpected return of NULL.");
+        return 1;
+    }
+    if(outputOrd->type.type != PS_TYPE_F32) {
+        psError(PS_ERR_UNKNOWN,true,"Output vector of type %d expected %d",
+                outputOrd->type.type, PS_TYPE_F32);
+        return 2;
+    }
+    psVector* outputCheb = psPolynomial3DEvalVector(polyCheb,inputChebX,inputChebY,inputChebZ);
+    if(outputCheb == NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Unexpected return of NULL.");
+        return 1;
+    }
+    if(outputCheb->type.type != PS_TYPE_F32) {
+        psError(PS_ERR_UNKNOWN,true,"Output vector of type %d expected %d",
+                outputCheb->type.type, PS_TYPE_F32);
+        return 2;
+    }
+
+    // Verify the results
+    for(psS32 i = 0; i < TESTPOINTS; i++) {
+        if(fabs(poly3DResult[i]-outputOrd->data.F32[i]) > ERROR_TOL) {
+            psError(PS_ERR_UNKNOWN,true,"Result[%d] %g not equal to expected %g",
+                    i, outputOrd->data.F32[i], poly3DResult[i]);
+            return i*5;
+        }
+        if(fabs(poly3DChebResult[i]-outputCheb->data.F32[i]) > ERROR_TOL) {
+            psError(PS_ERR_UNKNOWN,true,"ResultCheb[%d] %g not equal to expected %g",
+                    i, outputCheb->data.F32[i], poly3DChebResult[i]);
+            return i*10;
+        }
+    }
+
+    // Attempt to invoke function with null polynomial
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message for NULL polynomial");
+    if(psPolynomial3DEvalVector(NULL, inputOrdX, inputOrdY, inputOrdZ) != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Return of NULL expected for NULL polynomial");
+        return 60;
+    }
+
+    // Attempt to invoke function with null input vector
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message for NULL input vector");
+    if(psPolynomial3DEvalVector(polyOrd,NULL, inputOrdY,inputOrdZ) != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Return of NULL expected for NULL input vector");
+        return 61;
+    }
+    // Attempt to invoke function with null input vector
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message for NULL input vector");
+    if(psPolynomial3DEvalVector(polyOrd, inputOrdX, NULL,inputOrdZ) != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Return of NULL expected for NULL input vector");
+        return 62;
+    }
+    // Attempt to invoke function with null input vector
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message for NULL input vector");
+    if(psPolynomial3DEvalVector(polyOrd, inputOrdX,inputOrdY,NULL) != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Return of NULL expected for NULL input vector");
+        return 63;
+    }
+
+    // Attempt to invoke function with a non F32 type input vector
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message for invalid input type");
+    inputOrdX->type.type = PS_TYPE_U8;
+    if(psPolynomial3DEvalVector(polyOrd,inputOrdX,inputOrdY,inputOrdZ) != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Return NULL expected for non-F32 input vector");
+        return 65;
+    }
+    inputOrdX->type.type = PS_TYPE_F32;
+    // Attempt to invoke function with a non F32 type input vector
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message for invalid input type");
+    inputOrdY->type.type = PS_TYPE_U8;
+    if(psPolynomial3DEvalVector(polyOrd,inputOrdX,inputOrdY,inputOrdZ) != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Return NULL expected for non-F32 input vector");
+        return 66;
+    }
+    inputOrdY->type.type = PS_TYPE_F32;
+    // Attempt to invoke function with a non F32 type input vector
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message for invalid input type");
+    inputOrdZ->type.type = PS_TYPE_U8;
+    if(psPolynomial3DEvalVector(polyOrd,inputOrdX,inputOrdY,inputOrdZ) != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Return NULL expected for non-F32 input vector");
+        return 67;
+    }
+    inputOrdZ->type.type = PS_TYPE_F32;
+
+    psFree(inputOrdX);
+    psFree(inputOrdY);
+    psFree(inputOrdZ);
+    psFree(inputChebX);
+    psFree(inputChebY);
+    psFree(inputChebZ);
+    psFree(outputOrd);
+    psFree(outputCheb);
+    psFree(polyOrd);
+    psFree(polyCheb);
+
+    return 0;
+}
+
+psS32 testDPoly3DEvalVector(void)
+{
+    // Allocate polynomial
+    psDPolynomial3D* polyOrd = psDPolynomial3DAlloc(TERMS,TERMS,TERMS,PS_POLYNOMIAL_ORD);
+    psDPolynomial3D* polyCheb = psDPolynomial3DAlloc(TERMS,TERMS,TERMS,PS_POLYNOMIAL_CHEB);
+
+    // Set polynomial members
+    for(psS32 i = 0; i < TERMS; i++) {
+        for(psS32 j = 0; j < TERMS; j++) {
+            for(psS32 k = 0; k < TERMS; k++) {
+                polyOrd->coeff[i][j][k] = Dpoly3DCoeff[i][j][k];
+                polyOrd->mask[i][j][k]  = poly3DMask[i][j][k];
+                polyCheb->coeff[i][j][k] = 1.0;
+                polyCheb->mask[i][j][k]  = poly3DMask[i][j][k];
+            }
+        }
+    }
+
+    // Create input vectors
+    psVector* inputOrdX  = psVectorAlloc(TESTPOINTS, PS_TYPE_F64);
+    psVector* inputOrdY  = psVectorAlloc(TESTPOINTS, PS_TYPE_F64);
+    psVector* inputOrdZ  = psVectorAlloc(TESTPOINTS, PS_TYPE_F64);
+    psVector* inputChebX = psVectorAlloc(TESTPOINTS, PS_TYPE_F64);
+    psVector* inputChebY = psVectorAlloc(TESTPOINTS, PS_TYPE_F64);
+    psVector* inputChebZ = psVectorAlloc(TESTPOINTS, PS_TYPE_F64);
+    for(psS32 i = 0; i < TESTPOINTS; i++) {
+        inputOrdX->data.F64[i]  = Dpoly3DXYZValue[i][0];
+        inputOrdY->data.F64[i]  = Dpoly3DXYZValue[i][1];
+        inputOrdZ->data.F64[i]  = Dpoly3DXYZValue[i][2];
+        inputChebX->data.F64[i] = Dpoly3DXYZChebValue[i][0];
+        inputChebY->data.F64[i] = Dpoly3DXYZChebValue[i][1];
+        inputChebZ->data.F64[i] = Dpoly3DXYZChebValue[i][2];
+    }
+
+    // Evaluate the vectors
+    psVector* outputOrd = psDPolynomial3DEvalVector(polyOrd,inputOrdX,inputOrdY,inputOrdZ);
+    if(outputOrd == NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Unexpected return of NULL.");
+        return 1;
+    }
+    if(outputOrd->type.type != PS_TYPE_F64) {
+        psError(PS_ERR_UNKNOWN,true,"Output vector of type %d expected %d",
+                outputOrd->type.type, PS_TYPE_F64);
+        return 2;
+    }
+    psVector* outputCheb = psDPolynomial3DEvalVector(polyCheb,inputChebX,inputChebY,inputChebZ);
+    if(outputCheb == NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Unexpected return of NULL.");
+        return 1;
+    }
+    if(outputCheb->type.type != PS_TYPE_F64) {
+        psError(PS_ERR_UNKNOWN,true,"Output vector of type %d expected %d",
+                outputCheb->type.type, PS_TYPE_F64);
+        return 2;
+    }
+
+    // Verify the results
+    for(psS32 i = 0; i < TESTPOINTS; i++) {
+        if(fabs(Dpoly3DResult[i]-outputOrd->data.F64[i]) > ERROR_TOL) {
+            psError(PS_ERR_UNKNOWN,true,"Result[%d] %lg not equal to expected %lg",
+                    i, outputOrd->data.F64[i], Dpoly3DResult[i]);
+            return i*5;
+        }
+        if(fabs(Dpoly3DChebResult[i]-outputCheb->data.F64[i]) > ERROR_TOL) {
+            psError(PS_ERR_UNKNOWN,true,"ResultCheb[%d] %lg not equal to expected %lg",
+                    i, outputCheb->data.F64[i], Dpoly3DChebResult[i]);
+            return i*10;
+        }
+    }
+
+    // Attempt to invoke function with null polynomial
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message for NULL polynomial");
+    if(psDPolynomial3DEvalVector(NULL,inputOrdX,inputOrdY,inputOrdZ) != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Return of NULL expected for NULL polynomial");
+        return 60;
+    }
+
+    // Attempt to invoke function with null input vector
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message for NULL input vector");
+    if(psDPolynomial3DEvalVector(polyOrd,NULL,inputOrdY,inputOrdZ) != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Return of NULL expected for NULL input vector");
+        return 61;
+    }
+    // Attempt to invoke function with null input vector
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message for NULL input vector");
+    if(psDPolynomial3DEvalVector(polyOrd,inputOrdX,NULL,inputOrdZ) != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Return of NULL expected for NULL input vector");
+        return 62;
+    }
+    // Attempt to invoke function with null input vector
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message for NULL input vector");
+    if(psDPolynomial3DEvalVector(polyOrd,inputOrdX,inputOrdY,NULL) != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Return of NULL expected for NULL input vector");
+        return 63;
+    }
+
+    // Attempt to invoke function with a non F64 type input vector
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message for invalid input type");
+    inputOrdX->type.type = PS_TYPE_U8;
+    if(psDPolynomial3DEvalVector(polyOrd,inputOrdX,inputOrdY,inputOrdZ) != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Return NULL expected for non-F64 input vector");
+        return 64;
+    }
+    inputOrdX->type.type = PS_TYPE_F64;
+    // Attempt to invoke function with a non F64 type input vector
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message for invalid input type");
+    inputOrdY->type.type = PS_TYPE_U8;
+    if(psDPolynomial3DEvalVector(polyOrd,inputOrdX,inputOrdY,inputOrdZ) != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Return NULL expected for non-F64 input vector");
+        return 65;
+    }
+    inputOrdY->type.type = PS_TYPE_F64;
+    // Attempt to invoke function with a non F64 type input vector
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message for invalid input type");
+    inputOrdZ->type.type = PS_TYPE_U8;
+    if(psDPolynomial3DEvalVector(polyOrd,inputOrdX,inputOrdY,inputOrdZ) != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Return NULL expected for non-F64 input vector");
+        return 66;
+    }
+    inputOrdZ->type.type = PS_TYPE_F64;
+
+    psFree(inputOrdX);
+    psFree(inputOrdY);
+    psFree(inputOrdZ);
+    psFree(inputChebX);
+    psFree(inputChebY);
+    psFree(inputChebZ);
+    psFree(outputOrd);
+    psFree(outputCheb);
+    psFree(polyOrd);
+    psFree(polyCheb);
+
+    return 0;
+}
+
Index: /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psFunc11.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psFunc11.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psFunc11.c	(revision 22331)
@@ -0,0 +1,804 @@
+/** tst_psFunc11.c
+*
+*  This test driver will exercise the psPolynomialXDEval functions for both
+*  ORD and CHEB type polynomials.
+*
+*  @version  $Revision: 1.2 $  $Name: not supported by cvs2svn $
+*  @date  $Date: 2005-04-07 20:27:42 $
+*
+* Copyright 2004-2005 Maui High Performance Computing Center, Univ. of Hawaii
+*
+***************************************************************************/
+
+#include "pslib_strict.h"
+#include "psTest.h"
+
+#define  TERMS        4
+#define  TESTPOINTS   5
+#define  ERROR_TOL    0.001
+
+static psS32 testPoly4DEval(void);
+static psS32 testDPoly4DEval(void);
+static psS32 testPoly4DEvalVector(void);
+static psS32 testDPoly4DEvalVector(void);
+
+testDescription tests[] = {
+                              {testPoly4DEval,583,"psPolynomial4DEval",0,false},
+                              {testDPoly4DEval,582,"psDPolynomial4DEval",0,false},
+                              {testPoly4DEvalVector,000,"psPolynomial4DEvalVector",0,false},
+                              {testDPoly4DEvalVector,000,"psDPolynomial4DEvalVector",0,false},
+                              {NULL}
+                          };
+
+psF32 poly4DCoeff[TERMS][TERMS][TERMS][TERMS] = {
+            {
+                {
+                    { -1.1,  1.2, -1.3,  1.4},
+                    {  1.5, -1.6,  1.7, -1.8},
+                    {  0.1, -0.2,  0.3, -0.4},
+                    { -0.5,  0.6, -0.7,  0.8}
+                },
+                {
+                    { -2.1,  2.2, -2.3,  2.4},
+                    {  2.5, -2.6,  2.7, -2.8},
+                    {  3.1, -3.2,  3.3, -3.4},
+                    { -3.5,  3.6, -3.7,  3.8}
+                },
+                { { -4.1,  4.2, -4.3,  4.4},
+                  {  4.5, -4.6,  4.7, -4.8},
+                  {  5.1, -5.2,  5.3, -5.4},
+                  { -5.5,  5.6, -5.7,  5.8}
+                },
+                { { -6.1,  6.2, -6.3,  6.4},
+                  {  6.5, -6.6,  6.7, -6.8},
+                  {  7.1, -7.2,  7.3, -7.4},
+                  { -7.5,  7.6, -7.7,  7.8}
+                }
+            },
+            {
+                {
+                    { -1.1,  1.2, -1.3,  1.4},
+                    {  1.5, -1.6,  1.7, -1.8},
+                    {  0.1, -0.2,  0.3, -0.4},
+                    { -0.5,  0.6, -0.7,  0.8}
+                },
+                {
+                    { -2.1,  2.2, -2.3,  2.4},
+                    {  2.5, -2.6,  2.7, -2.8},
+                    {  3.1, -3.2,  3.3, -3.4},
+                    { -3.5,  3.6, -3.7,  3.8}
+                },
+                { { -4.1,  4.2, -4.3,  4.4},
+                  {  4.5, -4.6,  4.7, -4.8},
+                  {  5.1, -5.2,  5.3, -5.4},
+                  { -5.5,  5.6, -5.7,  5.8}
+                },
+                { { -6.1,  6.2, -6.3,  6.4},
+                  {  6.5, -6.6,  6.7, -6.8},
+                  {  7.1, -7.2,  7.3, -7.4},
+                  { -7.5,  7.6, -7.7,  7.8}
+                }
+            },
+            {
+                {
+                    { -1.1,  1.2, -1.3,  1.4},
+                    {  1.5, -1.6,  1.7, -1.8},
+                    {  0.1, -0.2,  0.3, -0.4},
+                    { -0.5,  0.6, -0.7,  0.8}
+                },
+                {
+                    { -2.1,  2.2, -2.3,  2.4},
+                    {  2.5, -2.6,  2.7, -2.8},
+                    {  3.1, -3.2,  3.3, -3.4},
+                    { -3.5,  3.6, -3.7,  3.8}
+                },
+                { { -4.1,  4.2, -4.3,  4.4},
+                  {  4.5, -4.6,  4.7, -4.8},
+                  {  5.1, -5.2,  5.3, -5.4},
+                  { -5.5,  5.6, -5.7,  5.8}
+                },
+                { { -6.1,  6.2, -6.3,  6.4},
+                  {  6.5, -6.6,  6.7, -6.8},
+                  {  7.1, -7.2,  7.3, -7.4},
+                  { -7.5,  7.6, -7.7,  7.8}
+                }
+            },
+            {
+                {
+                    { -1.1,  1.2, -1.3,  1.4},
+                    {  1.5, -1.6,  1.7, -1.8},
+                    {  0.1, -0.2,  0.3, -0.4},
+                    { -0.5,  0.6, -0.7,  0.8}
+                },
+                {
+                    { -2.1,  2.2, -2.3,  2.4},
+                    {  2.5, -2.6,  2.7, -2.8},
+                    {  3.1, -3.2,  3.3, -3.4},
+                    { -3.5,  3.6, -3.7,  3.8}
+                },
+                { { -4.1,  4.2, -4.3,  4.4},
+                  {  4.5, -4.6,  4.7, -4.8},
+                  {  5.1, -5.2,  5.3, -5.4},
+                  { -5.5,  5.6, -5.7,  5.8}
+                },
+                { { -6.1,  6.2, -6.3,  6.4},
+                  {  6.5, -6.6,  6.7, -6.8},
+                  {  7.1, -7.2,  7.3, -7.4},
+                  { -7.5,  7.6, -7.7,  7.8}
+                }
+            }
+        };
+psF64 Dpoly4DCoeff[TERMS][TERMS][TERMS][TERMS] = {
+            {
+                {
+                    { -1.1,  1.2, -1.3,  1.4},
+                    {  1.5, -1.6,  1.7, -1.8},
+                    {  0.1, -0.2,  0.3, -0.4},
+                    { -0.5,  0.6, -0.7,  0.8}
+                },
+                {
+                    { -2.1,  2.2, -2.3,  2.4},
+                    {  2.5, -2.6,  2.7, -2.8},
+                    {  3.1, -3.2,  3.3, -3.4},
+                    { -3.5,  3.6, -3.7,  3.8}
+                },
+                { { -4.1,  4.2, -4.3,  4.4},
+                  {  4.5, -4.6,  4.7, -4.8},
+                  {  5.1, -5.2,  5.3, -5.4},
+                  { -5.5,  5.6, -5.7,  5.8}
+                },
+                { { -6.1,  6.2, -6.3,  6.4},
+                  {  6.5, -6.6,  6.7, -6.8},
+                  {  7.1, -7.2,  7.3, -7.4},
+                  { -7.5,  7.6, -7.7,  7.8}
+                }
+            },
+            {
+                {
+                    { -1.1,  1.2, -1.3,  1.4},
+                    {  1.5, -1.6,  1.7, -1.8},
+                    {  0.1, -0.2,  0.3, -0.4},
+                    { -0.5,  0.6, -0.7,  0.8}
+                },
+                {
+                    { -2.1,  2.2, -2.3,  2.4},
+                    {  2.5, -2.6,  2.7, -2.8},
+                    {  3.1, -3.2,  3.3, -3.4},
+                    { -3.5,  3.6, -3.7,  3.8}
+                },
+                { { -4.1,  4.2, -4.3,  4.4},
+                  {  4.5, -4.6,  4.7, -4.8},
+                  {  5.1, -5.2,  5.3, -5.4},
+                  { -5.5,  5.6, -5.7,  5.8}
+                },
+                { { -6.1,  6.2, -6.3,  6.4},
+                  {  6.5, -6.6,  6.7, -6.8},
+                  {  7.1, -7.2,  7.3, -7.4},
+                  { -7.5,  7.6, -7.7,  7.8}
+                }
+            },
+            {
+                {
+                    { -1.1,  1.2, -1.3,  1.4},
+                    {  1.5, -1.6,  1.7, -1.8},
+                    {  0.1, -0.2,  0.3, -0.4},
+                    { -0.5,  0.6, -0.7,  0.8}
+                },
+                {
+                    { -2.1,  2.2, -2.3,  2.4},
+                    {  2.5, -2.6,  2.7, -2.8},
+                    {  3.1, -3.2,  3.3, -3.4},
+                    { -3.5,  3.6, -3.7,  3.8}
+                },
+                { { -4.1,  4.2, -4.3,  4.4},
+                  {  4.5, -4.6,  4.7, -4.8},
+                  {  5.1, -5.2,  5.3, -5.4},
+                  { -5.5,  5.6, -5.7,  5.8}
+                },
+                { { -6.1,  6.2, -6.3,  6.4},
+                  {  6.5, -6.6,  6.7, -6.8},
+                  {  7.1, -7.2,  7.3, -7.4},
+                  { -7.5,  7.6, -7.7,  7.8}
+                }
+            },
+            {
+                {
+                    { -1.1,  1.2, -1.3,  1.4},
+                    {  1.5, -1.6,  1.7, -1.8},
+                    {  0.1, -0.2,  0.3, -0.4},
+                    { -0.5,  0.6, -0.7,  0.8}
+                },
+                {
+                    { -2.1,  2.2, -2.3,  2.4},
+                    {  2.5, -2.6,  2.7, -2.8},
+                    {  3.1, -3.2,  3.3, -3.4},
+                    { -3.5,  3.6, -3.7,  3.8}
+                },
+                { { -4.1,  4.2, -4.3,  4.4},
+                  {  4.5, -4.6,  4.7, -4.8},
+                  {  5.1, -5.2,  5.3, -5.4},
+                  { -5.5,  5.6, -5.7,  5.8}
+                },
+                { { -6.1,  6.2, -6.3,  6.4},
+                  {  6.5, -6.6,  6.7, -6.8},
+                  {  7.1, -7.2,  7.3, -7.4},
+                  { -7.5,  7.6, -7.7,  7.8}
+                }
+            }
+        };
+
+psF32 poly4DMask[TERMS][TERMS][TERMS][TERMS]    = {
+            {
+                {
+                    {  0,    0,    0,    1},
+                    {  0,    0,    1,    0},
+                    {  1,    0,    0,    0},
+                    {  0,    0,    0,    1}
+                },
+                {
+                    {  1,    0,    0,    0},
+                    {  1,    0,    0,    0},
+                    {  1,    0,    0,    0},
+                    {  1,    0,    0,    0}
+                },
+                {
+                    {  0,    1,    0,    0},
+                    {  0,    0,    1,    0},
+                    {  0,    1,    0,    0},
+                    {  0,    0,    1,    0}
+                },
+                {
+                    {  1,    0,    0,    0},
+                    {  0,    0,    0,    1},
+                    {  1,    0,    0,    0},
+                    {  0,    0,    0,    1}
+                }
+            },
+            {
+                {
+                    {  0,    0,    0,    1},
+                    {  0,    0,    1,    0},
+                    {  1,    0,    0,    0},
+                    {  0,    0,    0,    1}
+                },
+                {
+                    {  1,    0,    0,    0},
+                    {  1,    0,    0,    0},
+                    {  1,    0,    0,    0},
+                    {  1,    0,    0,    0}
+                },
+                {
+                    {  0,    1,    0,    0},
+                    {  0,    0,    1,    0},
+                    {  0,    1,    0,    0},
+                    {  0,    0,    1,    0}
+                },
+                {
+                    {  1,    0,    0,    0},
+                    {  0,    0,    0,    1},
+                    {  1,    0,    0,    0},
+                    {  0,    0,    0,    1}
+                }
+            },
+            {
+                {
+                    {  0,    0,    0,    1},
+                    {  0,    0,    1,    0},
+                    {  1,    0,    0,    0},
+                    {  0,    0,    0,    1}
+                },
+                {
+                    {  1,    0,    0,    0},
+                    {  1,    0,    0,    0},
+                    {  1,    0,    0,    0},
+                    {  1,    0,    0,    0}
+                },
+                {
+                    {  0,    1,    0,    0},
+                    {  0,    0,    1,    0},
+                    {  0,    1,    0,    0},
+                    {  0,    0,    1,    0}
+                },
+                {
+                    {  1,    0,    0,    0},
+                    {  0,    0,    0,    1},
+                    {  1,    0,    0,    0},
+                    {  0,    0,    0,    1}
+                }
+            },
+            {
+                {
+                    {  0,    0,    0,    1},
+                    {  0,    0,    1,    0},
+                    {  1,    0,    0,    0},
+                    {  0,    0,    0,    1}
+                },
+                {
+                    {  1,    0,    0,    0},
+                    {  1,    0,    0,    0},
+                    {  1,    0,    0,    0},
+                    {  1,    0,    0,    0}
+                },
+                {
+                    {  0,    1,    0,    0},
+                    {  0,    0,    1,    0},
+                    {  0,    1,    0,    0},
+                    {  0,    0,    1,    0}
+                },
+                {
+                    {  1,    0,    0,    0},
+                    {  0,    0,    0,    1},
+                    {  1,    0,    0,    0},
+                    {  0,    0,    0,    1}
+                }
+            }
+        };
+
+psF32 poly4DWXYZValue[TESTPOINTS][4] = {
+                                           {  0.450, -0.780,  0.500, -0.123},
+                                           {  0.297,  0.153, -0.354,  0.000},
+                                           {  0.000,  0.153, -0.354,  0.321},
+                                           {  0.297,  0.000, -0.354,  0.321},
+                                           {  0.297,  0.153,  0.000,  0.321}
+                                       };
+psF64 Dpoly4DWXYZValue[TESTPOINTS][4] = {
+                                            {  0.450, -0.780,  0.500, -0.123},
+                                            {  0.297,  0.153, -0.354,  0.000},
+                                            {  0.000,  0.153, -0.354,  0.321},
+                                            {  0.297,  0.000, -0.354,  0.321},
+                                            {  0.297,  0.153,  0.000,  0.321}
+                                        };
+
+psF32 poly4DResult[TESTPOINTS]  = { -3.588753, -2.439566, -1.175955, -1.645497, -1.216915};
+psF64 Dpoly4DResult[TESTPOINTS]  = { -3.588753, -2.439566, -1.175955, -1.645497, -1.216915};
+
+psF32 poly4DWXYZChebValue[TESTPOINTS][4] = {
+            {  0.100,  0.000,  0.250, -0.250},
+            {  0.100, -0.250,  0.000,  0.250},
+            {  0.100,  0.250, -0.250,  0.000},
+            {  0.300,  0.200, -0.300, -0.400},
+            { -0.780,  0.990, -0.010,  0.500}
+        };
+psF64 Dpoly4DWXYZChebValue[TESTPOINTS][4] = {
+            {  0.100,  0.000,  0.250, -0.250},
+            {  0.100, -0.250,  0.000,  0.250},
+            {  0.100,  0.250, -0.250,  0.000},
+            {  0.300,  0.200, -0.300, -0.400},
+            { -0.780,  0.990, -0.010,  0.500}
+        };
+psF32 poly4DChebResult[TESTPOINTS]   = { -0.216563, -0.297000, -0.033000, 0.432198, 1.785601 };
+psF64 Dpoly4DChebResult[TESTPOINTS]  = { -0.216563, -0.297000, -0.033000, 0.432198, 1.785601 };
+
+psS32 main(psS32 argc, char* argv[])
+{
+    psLogSetLevel(PS_LOG_INFO);
+
+    return !runTestSuite(stderr,"psPolynomialXDEval", tests, argc, argv);
+}
+
+// This test will verify operation of 1D polynomial evaluation
+psS32 testPoly4DEval(void)
+{
+    psF32  result;
+    psF32  resultCheb;
+
+    // Allocate polynomial structure
+    psPolynomial4D*  polyOrd  = psPolynomial4DAlloc(TERMS,TERMS,TERMS,TERMS,PS_POLYNOMIAL_ORD);
+    psPolynomial4D*  polyCheb = psPolynomial4DAlloc(TERMS,TERMS,TERMS,TERMS,PS_POLYNOMIAL_CHEB);
+    // Set polynomial members
+    for(psS32 i = 0; i < TERMS; i++) {
+        for(psS32 j = 0; j < TERMS; j++) {
+            for(psS32 k = 0; k < TERMS; k++) {
+                for(psS32 l = 0; l < TERMS; l++) {
+                    polyOrd->coeff[i][j][k][l] = poly4DCoeff[i][j][k][l];
+                    polyOrd->mask[i][j][k][l]  = poly4DMask[i][j][k][l];
+                    polyCheb->coeff[i][j][k][l] = 1.0;
+                    polyCheb->mask[i][j][k][l]  = poly4DMask[i][j][k][l];
+                }
+            }
+        }
+    }
+    // Evaluate test points and verify results
+    for(psS32 i = 0; i < TESTPOINTS; i++) {
+        result = psPolynomial4DEval(polyOrd,poly4DWXYZValue[i][0],poly4DWXYZValue[i][1],
+                                    poly4DWXYZValue[i][2], poly4DWXYZValue[i][3]);
+        if(fabs(poly4DResult[i]-result) > ERROR_TOL ) {
+            psError(PS_ERR_UNKNOWN,true,"Evaluated value %g not as expected %g",
+                    result, poly4DResult[i]);
+            return i;
+        }
+        resultCheb = psPolynomial4DEval(polyCheb,poly4DWXYZChebValue[i][0], poly4DWXYZChebValue[i][1],
+                                        poly4DWXYZChebValue[i][2], poly4DWXYZChebValue[i][3]);
+        if(fabs(poly4DChebResult[i]-resultCheb) > ERROR_TOL ) {
+            psError(PS_ERR_UNKNOWN,true,"Evaluated Chebyshev value %lg not as expected %lg",
+                    resultCheb, poly4DChebResult[i]);
+            return 5*i;
+        }
+    }
+    psFree(polyOrd);
+    psFree(polyCheb);
+
+    // Allocate polynomial with invalid type
+    polyOrd = psPolynomial4DAlloc(TERMS, TERMS, TERMS, TERMS, 99);
+    // Attempt to evaluation invalid polynomial type
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate error message invalid type");
+    result = psPolynomial4DEval(polyOrd,0.0, 0.0, 0.0, 0.0);
+    if ( !isnan(result) ) {
+        psError(PS_ERR_UNKNOWN,true,"Did not return NAN for invalid polynomial type");
+        return 20;
+    }
+    psFree(polyOrd);
+
+    return 0;
+}
+
+// This test will verify operation of 1D polynomial evaluation
+psS32 testDPoly4DEval(void)
+{
+    psF64  result;
+    psF64  resultCheb;
+
+    // Allocate polynomial structure
+    psDPolynomial4D*  polyOrd = psDPolynomial4DAlloc(TERMS,TERMS,TERMS,TERMS,PS_POLYNOMIAL_ORD);
+    psDPolynomial4D*  polyCheb = psDPolynomial4DAlloc(TERMS,TERMS,TERMS,TERMS,PS_POLYNOMIAL_CHEB);
+    // Set polynomial members
+    for(psS32 i = 0; i < TERMS; i++) {
+        for(psS32 j = 0; j < TERMS; j++) {
+            for(psS32 k = 0; k < TERMS; k++) {
+                for(psS32 l = 0; l < TERMS; l++) {
+                    polyOrd->coeff[i][j][k][l] = Dpoly4DCoeff[i][j][k][l];
+                    polyOrd->mask[i][j][k][l]  = poly4DMask[i][j][k][l];
+                    polyCheb->coeff[i][j][k][l] = 1.0;
+                    polyCheb->mask[i][j][k][l]  = poly4DMask[i][j][k][l];
+                }
+            }
+        }
+    }
+    // Evaluate test points and verify results
+    for(psS32 i = 0; i < TESTPOINTS; i++) {
+        result = psDPolynomial4DEval(polyOrd,Dpoly4DWXYZValue[i][0],Dpoly4DWXYZValue[i][1],
+                                     Dpoly4DWXYZValue[i][2],Dpoly4DWXYZValue[i][3]);
+        if(fabs(Dpoly4DResult[i]-result) > ERROR_TOL ) {
+            psError(PS_ERR_UNKNOWN,true,"Evaluated value %lg not as expected %lg",
+                    result, Dpoly4DResult[i]);
+            return i;
+        }
+        resultCheb = psDPolynomial4DEval(polyCheb,Dpoly4DWXYZChebValue[i][0],Dpoly4DWXYZChebValue[i][1],
+                                         Dpoly4DWXYZChebValue[i][2],Dpoly4DWXYZChebValue[i][3]);
+        if(fabs(Dpoly4DChebResult[i]-resultCheb) > ERROR_TOL ) {
+            psError(PS_ERR_UNKNOWN,true,"Evaluated Chebyshev value %lg not as expected %lg",
+                    resultCheb, Dpoly4DChebResult[i]);
+            return 5*i;
+        }
+    }
+    psFree(polyOrd);
+    psFree(polyCheb);
+
+    // Allocate polynomial with invalid type
+    polyOrd = psDPolynomial4DAlloc(TERMS, TERMS, TERMS, TERMS, 99);
+    // Attempt to evaluation invalid polynomial type
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate error message invalid type");
+    result = psDPolynomial4DEval(polyOrd,0.0, 0.0, 0.0, 0.0);
+    if ( !isnan(result) ) {
+        psError(PS_ERR_UNKNOWN,true,"Did not return NAN for invalid polynomial type");
+        return 20;
+    }
+    psFree(polyOrd);
+
+    return 0;
+}
+
+psS32 testPoly4DEvalVector(void)
+{
+    // Allocate polynomial
+    psPolynomial4D* polyOrd  = psPolynomial4DAlloc(TERMS,TERMS,TERMS,TERMS,PS_POLYNOMIAL_ORD);
+    psPolynomial4D* polyCheb = psPolynomial4DAlloc(TERMS,TERMS,TERMS,TERMS,PS_POLYNOMIAL_CHEB);
+
+    // Set polynomial members
+    for(psS32 i = 0; i < TERMS; i++) {
+        for(psS32 j = 0; j < TERMS; j++) {
+            for(psS32 k = 0; k < TERMS; k++) {
+                for(psS32 l = 0; l < TERMS; l++) {
+                    polyOrd->coeff[i][j][k][l] = poly4DCoeff[i][j][k][l];
+                    polyOrd->mask[i][j][k][l]  = poly4DMask[i][j][k][l];
+                    polyCheb->coeff[i][j][k][l] = 1.0;
+                    polyCheb->mask[i][j][k][l]  = poly4DMask[i][j][k][l];
+                }
+            }
+        }
+    }
+
+    // Create input vectors
+    psVector* inputOrdW  = psVectorAlloc(TESTPOINTS, PS_TYPE_F32);
+    psVector* inputOrdX  = psVectorAlloc(TESTPOINTS, PS_TYPE_F32);
+    psVector* inputOrdY  = psVectorAlloc(TESTPOINTS, PS_TYPE_F32);
+    psVector* inputOrdZ  = psVectorAlloc(TESTPOINTS, PS_TYPE_F32);
+    psVector* inputChebW = psVectorAlloc(TESTPOINTS, PS_TYPE_F32);
+    psVector* inputChebX = psVectorAlloc(TESTPOINTS, PS_TYPE_F32);
+    psVector* inputChebY = psVectorAlloc(TESTPOINTS, PS_TYPE_F32);
+    psVector* inputChebZ = psVectorAlloc(TESTPOINTS, PS_TYPE_F32);
+    for(psS32 i = 0; i < TESTPOINTS; i++) {
+        inputOrdW->data.F32[i] = poly4DWXYZValue[i][0];
+        inputOrdX->data.F32[i] = poly4DWXYZValue[i][1];
+        inputOrdY->data.F32[i] = poly4DWXYZValue[i][2];
+        inputOrdZ->data.F32[i] = poly4DWXYZValue[i][3];
+        inputChebW->data.F32[i] = poly4DWXYZChebValue[i][0];
+        inputChebX->data.F32[i] = poly4DWXYZChebValue[i][1];
+        inputChebY->data.F32[i] = poly4DWXYZChebValue[i][2];
+        inputChebZ->data.F32[i] = poly4DWXYZChebValue[i][3];
+    }
+
+    // Evaluate the vectors
+    psVector* outputOrd = psPolynomial4DEvalVector(polyOrd,inputOrdW,inputOrdX,inputOrdY,inputOrdZ);
+    if(outputOrd == NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Unexpected return of NULL.");
+        return 1;
+    }
+    if(outputOrd->type.type != PS_TYPE_F32) {
+        psError(PS_ERR_UNKNOWN,true,"Output vector of type %d expected %d",
+                outputOrd->type.type, PS_TYPE_F32);
+        return 2;
+    }
+    psVector* outputCheb = psPolynomial4DEvalVector(polyCheb,inputChebW,inputChebX,inputChebY,inputChebZ);
+    if(outputCheb == NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Unexpected return of NULL.");
+        return 1;
+    }
+    if(outputCheb->type.type != PS_TYPE_F32) {
+        psError(PS_ERR_UNKNOWN,true,"Output vector of type %d expected %d",
+                outputCheb->type.type, PS_TYPE_F32);
+        return 2;
+    }
+
+    // Verify the results
+    for(psS32 i = 0; i < TESTPOINTS; i++) {
+        if(fabs(poly4DResult[i]-outputOrd->data.F32[i]) > ERROR_TOL) {
+            psError(PS_ERR_UNKNOWN,true,"Result[%d] %g not equal to expected %g",
+                    i, outputOrd->data.F32[i], poly4DResult[i]);
+            return i*5;
+        }
+        if(fabs(poly4DChebResult[i]-outputCheb->data.F32[i]) > ERROR_TOL) {
+            psError(PS_ERR_UNKNOWN,true,"ResultCheb[%d] %g not equal to expected %g",
+                    i, outputCheb->data.F32[i], poly4DChebResult[i]);
+            return i*10;
+        }
+    }
+
+    // Attempt to invoke function with null polynomial
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message for NULL polynomial");
+    if(psPolynomial4DEvalVector(NULL, inputOrdW, inputOrdX, inputOrdY, inputOrdZ) != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Return of NULL expected for NULL polynomial");
+        return 60;
+    }
+
+    // Attempt to invoke function with null input vector
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message for NULL input vector");
+    if(psPolynomial4DEvalVector(polyOrd,NULL,inputOrdX, inputOrdY,inputOrdZ) != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Return of NULL expected for NULL input vector");
+        return 61;
+    }
+    // Attempt to invoke function with null input vector
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message for NULL input vector");
+    if(psPolynomial4DEvalVector(polyOrd, inputOrdW, NULL, inputOrdY, inputOrdZ) != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Return of NULL expected for NULL input vector");
+        return 62;
+    }
+    // Attempt to invoke function with null input vector
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message for NULL input vector");
+    if(psPolynomial4DEvalVector(polyOrd, inputOrdW, inputOrdX,NULL,inputOrdZ) != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Return of NULL expected for NULL input vector");
+        return 63;
+    }
+    // Attempt to invoke function with null input vector
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message for NULL input vector");
+    if(psPolynomial4DEvalVector(polyOrd, inputOrdW, inputOrdX,inputOrdY,NULL) != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Return of NULL expected for NULL input vector");
+        return 64;
+    }
+
+    // Attempt to invoke function with a non F32 type input vector
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message for invalid input type");
+    inputOrdX->type.type = PS_TYPE_U8;
+    if(psPolynomial4DEvalVector(polyOrd,inputOrdW,inputOrdX,inputOrdY,inputOrdZ) != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Return NULL expected for non-F32 input vector");
+        return 65;
+    }
+    inputOrdX->type.type = PS_TYPE_F32;
+    // Attempt to invoke function with a non F32 type input vector
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message for invalid input type");
+    inputOrdY->type.type = PS_TYPE_U8;
+    if(psPolynomial4DEvalVector(polyOrd,inputOrdW,inputOrdX,inputOrdY,inputOrdZ) != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Return NULL expected for non-F32 input vector");
+        return 66;
+    }
+    inputOrdY->type.type = PS_TYPE_F32;
+    // Attempt to invoke function with a non F32 type input vector
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message for invalid input type");
+    inputOrdZ->type.type = PS_TYPE_U8;
+    if(psPolynomial4DEvalVector(polyOrd,inputOrdW,inputOrdX,inputOrdY,inputOrdZ) != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Return NULL expected for non-F32 input vector");
+        return 67;
+    }
+    inputOrdZ->type.type = PS_TYPE_F32;
+    // Attempt to invoke function with a non F32 type input vector
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message for invalid input type");
+    inputOrdW->type.type = PS_TYPE_U8;
+    if(psPolynomial4DEvalVector(polyOrd,inputOrdW,inputOrdX,inputOrdY,inputOrdZ) != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Return NULL expected for non-F32 input vector");
+        return 68;
+    }
+    inputOrdW->type.type = PS_TYPE_F32;
+
+    psFree(inputOrdW);
+    psFree(inputOrdX);
+    psFree(inputOrdY);
+    psFree(inputOrdZ);
+    psFree(inputChebW);
+    psFree(inputChebX);
+    psFree(inputChebY);
+    psFree(inputChebZ);
+    psFree(outputOrd);
+    psFree(outputCheb);
+    psFree(polyOrd);
+    psFree(polyCheb);
+
+    return 0;
+}
+
+psS32 testDPoly4DEvalVector(void)
+{
+    // Allocate polynomial
+    psDPolynomial4D* polyOrd = psDPolynomial4DAlloc(TERMS,TERMS,TERMS,TERMS,PS_POLYNOMIAL_ORD);
+    psDPolynomial4D* polyCheb = psDPolynomial4DAlloc(TERMS,TERMS,TERMS,TERMS,PS_POLYNOMIAL_CHEB);
+
+    // Set polynomial members
+    for(psS32 i = 0; i < TERMS; i++) {
+        for(psS32 j = 0; j < TERMS; j++) {
+            for(psS32 k = 0; k < TERMS; k++) {
+                for(psS32 l = 0; l < TERMS; l++) {
+                    polyOrd->coeff[i][j][k][l] = Dpoly4DCoeff[i][j][k][l];
+                    polyOrd->mask[i][j][k][l]  = poly4DMask[i][j][k][l];
+                    polyCheb->coeff[i][j][k][l] = 1.0;
+                    polyCheb->mask[i][j][k][l]  = poly4DMask[i][j][k][l];
+                }
+            }
+        }
+    }
+
+    // Create input vectors
+    psVector* inputOrdW  = psVectorAlloc(TESTPOINTS, PS_TYPE_F64);
+    psVector* inputOrdX  = psVectorAlloc(TESTPOINTS, PS_TYPE_F64);
+    psVector* inputOrdY  = psVectorAlloc(TESTPOINTS, PS_TYPE_F64);
+    psVector* inputOrdZ  = psVectorAlloc(TESTPOINTS, PS_TYPE_F64);
+    psVector* inputChebW = psVectorAlloc(TESTPOINTS, PS_TYPE_F64);
+    psVector* inputChebX = psVectorAlloc(TESTPOINTS, PS_TYPE_F64);
+    psVector* inputChebY = psVectorAlloc(TESTPOINTS, PS_TYPE_F64);
+    psVector* inputChebZ = psVectorAlloc(TESTPOINTS, PS_TYPE_F64);
+    for(psS32 i = 0; i < TESTPOINTS; i++) {
+        inputOrdW->data.F64[i]  = Dpoly4DWXYZValue[i][0];
+        inputOrdX->data.F64[i]  = Dpoly4DWXYZValue[i][1];
+        inputOrdY->data.F64[i]  = Dpoly4DWXYZValue[i][2];
+        inputOrdZ->data.F64[i]  = Dpoly4DWXYZValue[i][3];
+        inputChebW->data.F64[i] = Dpoly4DWXYZChebValue[i][0];
+        inputChebX->data.F64[i] = Dpoly4DWXYZChebValue[i][1];
+        inputChebY->data.F64[i] = Dpoly4DWXYZChebValue[i][2];
+        inputChebZ->data.F64[i] = Dpoly4DWXYZChebValue[i][3];
+    }
+
+    // Evaluate the vectors
+    psVector* outputOrd = psDPolynomial4DEvalVector(polyOrd,inputOrdW,inputOrdX,inputOrdY,inputOrdZ);
+    if(outputOrd == NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Unexpected return of NULL.");
+        return 1;
+    }
+    if(outputOrd->type.type != PS_TYPE_F64) {
+        psError(PS_ERR_UNKNOWN,true,"Output vector of type %d expected %d",
+                outputOrd->type.type, PS_TYPE_F64);
+        return 2;
+    }
+    psVector* outputCheb = psDPolynomial4DEvalVector(polyCheb,inputChebW,inputChebX,inputChebY,inputChebZ);
+    if(outputCheb == NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Unexpected return of NULL.");
+        return 1;
+    }
+    if(outputCheb->type.type != PS_TYPE_F64) {
+        psError(PS_ERR_UNKNOWN,true,"Output vector of type %d expected %d",
+                outputCheb->type.type, PS_TYPE_F64);
+        return 2;
+    }
+
+    // Verify the results
+    for(psS32 i = 0; i < TESTPOINTS; i++) {
+        if(fabs(Dpoly4DResult[i]-outputOrd->data.F64[i]) > ERROR_TOL) {
+            psError(PS_ERR_UNKNOWN,true,"Result[%d] %lg not equal to expected %lg",
+                    i, outputOrd->data.F64[i], Dpoly4DResult[i]);
+            return i*5;
+        }
+        if(fabs(Dpoly4DChebResult[i]-outputCheb->data.F64[i]) > ERROR_TOL) {
+            psError(PS_ERR_UNKNOWN,true,"ResultCheb[%d] %lg not equal to expected %lg",
+                    i, outputCheb->data.F64[i], Dpoly4DChebResult[i]);
+            return i*10;
+        }
+    }
+
+    // Attempt to invoke function with null polynomial
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message for NULL polynomial");
+    if(psDPolynomial4DEvalVector(NULL,inputOrdW,inputOrdX,inputOrdY,inputOrdZ) != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Return of NULL expected for NULL polynomial");
+        return 60;
+    }
+
+    // Attempt to invoke function with null input vector
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message for NULL input vector");
+    if(psDPolynomial4DEvalVector(polyOrd,NULL,inputOrdX,inputOrdY,inputOrdZ) != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Return of NULL expected for NULL input vector");
+        return 61;
+    }
+    // Attempt to invoke function with null input vector
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message for NULL input vector");
+    if(psDPolynomial4DEvalVector(polyOrd,inputOrdW,NULL,inputOrdY,inputOrdZ) != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Return of NULL expected for NULL input vector");
+        return 62;
+    }
+    // Attempt to invoke function with null input vector
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message for NULL input vector");
+    if(psDPolynomial4DEvalVector(polyOrd,inputOrdW,inputOrdX,NULL,inputOrdZ) != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Return of NULL expected for NULL input vector");
+        return 63;
+    }
+    // Attempt to invoke function with null input vector
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message for NULL input vector");
+    if(psDPolynomial4DEvalVector(polyOrd,inputOrdW,inputOrdX,inputOrdY,NULL) != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Return of NULL expected for NULL input vector");
+        return 64;
+    }
+
+    // Attempt to invoke function with a non F64 type input vector
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message for invalid input type");
+    inputOrdX->type.type = PS_TYPE_U8;
+    if(psDPolynomial4DEvalVector(polyOrd,inputOrdW,inputOrdX,inputOrdY,inputOrdZ) != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Return NULL expected for non-F64 input vector");
+        return 65;
+    }
+    inputOrdX->type.type = PS_TYPE_F64;
+    // Attempt to invoke function with a non F64 type input vector
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message for invalid input type");
+    inputOrdY->type.type = PS_TYPE_U8;
+    if(psDPolynomial4DEvalVector(polyOrd,inputOrdW,inputOrdX,inputOrdY,inputOrdZ) != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Return NULL expected for non-F64 input vector");
+        return 66;
+    }
+    inputOrdY->type.type = PS_TYPE_F64;
+    // Attempt to invoke function with a non F64 type input vector
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message for invalid input type");
+    inputOrdZ->type.type = PS_TYPE_U8;
+    if(psDPolynomial4DEvalVector(polyOrd,inputOrdW,inputOrdX,inputOrdY,inputOrdZ) != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Return NULL expected for non-F64 input vector");
+        return 67;
+    }
+    inputOrdZ->type.type = PS_TYPE_F64;
+    // Attempt to invoke function with a non F64 type input vector
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message for invalid input type");
+    inputOrdW->type.type = PS_TYPE_U8;
+    if(psDPolynomial4DEvalVector(polyOrd,inputOrdW,inputOrdX,inputOrdY,inputOrdZ) != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Return NULL expected for non-F64 input vector");
+        return 68;
+    }
+    inputOrdW->type.type = PS_TYPE_F64;
+
+    psFree(inputOrdX);
+    psFree(inputOrdY);
+    psFree(inputOrdZ);
+    psFree(inputOrdW);
+    psFree(inputChebW);
+    psFree(inputChebX);
+    psFree(inputChebY);
+    psFree(inputChebZ);
+    psFree(outputOrd);
+    psFree(outputCheb);
+    psFree(polyOrd);
+    psFree(polyCheb);
+
+    return 0;
+}
+
Index: /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psHist00.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psHist00.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psHist00.c	(revision 22331)
@@ -0,0 +1,125 @@
+/*****************************************************************************
+    This routine must ensure that the psHistogram structure is correctly
+    allocated and deallocated by the procedure psHistogramAlloc().
+ *****************************************************************************/
+#include <stdio.h>
+#include "pslib_strict.h"
+#include "psTest.h"
+#include "psMemory.h"
+#define LOWER 20.0
+#define UPPER 30.0
+
+psS32 main()
+{
+    psHistogram *myHist = NULL;
+    psS32 testStatus      = true;
+    psS32 memLeaks        = 0;
+    psS32 i               = 0;
+    psS32 nb              = 0;
+    psS32 numBins         = 0;
+    psS32 currentId       = 0;
+
+    currentId       = psMemGetId();
+    for (nb=0;nb<4;nb++) {
+        if (nb == 0)
+            numBins = 1;
+        if (nb == 1)
+            numBins = 2;
+        if (nb == 2)
+            numBins = 10;
+        if (nb == 3)
+            numBins = 20;
+        /*********************************************************************/
+        /*  Allocate and initialize data structures                          */
+        /*********************************************************************/
+        printPositiveTestHeader(stdout,
+                                "psStats functions",
+                                "Allocate the psHistogram structure.");
+
+        myHist = psHistogramAlloc(LOWER, UPPER, numBins);
+
+        if (myHist->nums->n != numBins) {
+            printf("ERROR: myHist->nums->n is wrong size (%d)\n", myHist->nums->n);
+            testStatus = false;
+        }
+
+        if (myHist->bounds->n != numBins+1) {
+            printf("ERROR: myHist->bounds->n is wrong size (%d)\n", myHist->bounds->n);
+            testStatus = false;
+        }
+
+        for (i=0;i<numBins;i++) {
+            if (myHist->nums->data.F32[i] != 0.0) {
+                printf("ERROR: myHist->nums->data.U32[%d] not initialized to 0.\n", i);
+                testStatus = false;
+            }
+            myHist->nums->data.F32[i] = 0.0;
+        }
+
+        if (myHist->minNum != 0) {
+            printf("ERROR: myHist->minNum is %d\n", myHist->minNum);
+            testStatus = false;
+        }
+
+        if (myHist->maxNum != 0) {
+            printf("myHist->maxNum is %d\n", myHist->maxNum);
+            testStatus = false;
+        }
+
+        if (myHist->uniform != true) {
+            printf("ERROR: myHist->uniform is %d\n", myHist->uniform);
+            testStatus = false;
+        }
+
+        for (i=0;i<numBins;i++) {
+            printf("Bin number %d bounds: (%6.3f - %6.3f)\n", i,
+                   myHist->bounds->data.F32[i],
+                   myHist->bounds->data.F32[i+1]);
+        }
+
+        psMemCheckCorruption(1);
+        psFree(myHist);
+        psMemCheckCorruption(1);
+
+        printFooter(stdout,
+                    "psStats functions",
+                    "Allocate the psHistogram structure.",
+                    testStatus);
+    }
+
+
+    printPositiveTestHeader(stdout,
+                            "psStats functions",
+                            "Allocate the psHistogram structure. (UPPER<LOWER)");
+
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message.");
+    myHist = psHistogramAlloc(UPPER, LOWER, numBins);
+    if (myHist != NULL) {
+        printf("ERROR: myHist != NULL\n");
+    }
+    printFooter(stdout,
+                "psStats functions",
+                "Allocate the psHistogram structure. (UPPER<LOWER)",
+                testStatus);
+
+    /*************************************************************************/
+    /*  Deallocate data structures                                   */
+    /*************************************************************************/
+    printPositiveTestHeader(stdout,
+                            "psStats functions",
+                            "Deallocate the psHistogram structure.");
+
+    psMemCheckCorruption(1);
+    memLeaks = psMemCheckLeaks(currentId,NULL,stderr,false);
+    if (0 != memLeaks) {
+        psAbort(__func__,"Memory Leaks! (%d leaks)", memLeaks);
+    }
+    psMemCheckCorruption(1);
+
+    printFooter(stdout,
+                "psStats functions",
+                "Deallocate the psHistogram structure.",
+                testStatus);
+
+    return (!testStatus);
+}
Index: /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psHist01.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psHist01.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psHist01.c	(revision 22331)
@@ -0,0 +1,114 @@
+/*****************************************************************************
+    This routine must ensure that the psHistogram structure is correctly
+    allocated and deallocated by the procedure psHistogramAllocGeneric().
+ *****************************************************************************/
+#include <stdio.h>
+#include "pslib_strict.h"
+#include "psTest.h"
+#include "psMemory.h"
+#define LOWER 20.0
+#define UPPER 30.0
+
+psS32 main()
+{
+    psHistogram *myHist = NULL;
+    psVector *myBounds  = NULL;
+    psS32 testStatus      = true;
+    psS32 memLeaks        = 0;
+    psS32 i               = 0;
+    psS32 nb              = 0;
+    psS32 numBins         = 0;
+    psS32 currentId       = 0;
+
+    currentId       = psMemGetId();
+    for (nb=0;nb<4;nb++) {
+        if (nb == 0)
+            numBins = 1;
+        if (nb == 1)
+            numBins = 2;
+        if (nb == 2)
+            numBins = 10;
+        if (nb == 3)
+            numBins = 20;
+        /*********************************************************************/
+        /*  Allocate and initialize data structures                          */
+        /*********************************************************************/
+        printPositiveTestHeader(stdout,
+                                "psStats functions",
+                                "Allocate the psHistogram structure.");
+        myBounds = psVectorAlloc(numBins+1, PS_TYPE_F32);
+        myBounds->n = myBounds->nalloc;
+        for (i=0;i<numBins+1;i++) {
+            myBounds->data.F32[i] = LOWER + ((UPPER - LOWER) / (float) numBins) *
+                                    (float) i;
+        }
+        myHist = psHistogramAllocGeneric(myBounds);
+
+        if (myHist->nums->n != numBins) {
+            printf("ERROR: myHist->nums->n is wrong size (%d)\n", myHist->nums->n);
+            testStatus = false;
+        }
+
+        if (myHist->bounds->n != numBins+1) {
+            printf("ERROR: myHist->bounds->n is wrong size (%d)\n", myHist->bounds->n);
+            testStatus = false;
+        }
+
+        for (i=0;i<numBins;i++) {
+            if (myHist->nums->data.F32[i] != 0.0) {
+                printf("ERROR: myHist->nums->data.F32[%d] not initialized to 0.\n", i);
+                testStatus = false;
+            }
+            myHist->nums->data.F32[i] = 0.0;
+        }
+
+        if (myHist->minNum != 0) {
+            printf("ERROR: myHist->minNum is %d\n", myHist->minNum);
+            testStatus = false;
+        }
+
+        if (myHist->maxNum != 0) {
+            printf("myHist->maxNum is %d\n", myHist->maxNum);
+            testStatus = false;
+        }
+
+        if (myHist->uniform != false) {
+            printf("ERROR: myHist->uniform is %d\n", myHist->uniform);
+            testStatus = false;
+        }
+
+        for (i=0;i<numBins;i++) {
+            printf("Bin number %d bounds: (%6.3f - %6.3f)\n", i,
+                   myHist->bounds->data.F32[i],
+                   myHist->bounds->data.F32[i+1]);
+        }
+        psMemCheckCorruption(1);
+        psFree(myHist);
+        psMemCheckCorruption(1);
+        psFree(myBounds);
+
+        printFooter(stdout,
+                    "psStats functions",
+                    "Allocate the psHistogram structure.",
+                    testStatus);
+    }
+    /*************************************************************************/
+    /*  Deallocate data structures                                           */
+    /*************************************************************************/
+    printPositiveTestHeader(stdout,
+                            "psStats functions",
+                            "Deallocate the psHistogram structure.");
+    psMemCheckCorruption(1);
+    memLeaks = psMemCheckLeaks(currentId,NULL,stderr,false);
+    if (0 != memLeaks) {
+        psAbort(__func__,"Memory Leaks! (%d leaks)", memLeaks);
+    }
+    psMemCheckCorruption(1);
+
+    printFooter(stdout,
+                "psStats functions",
+                "Deallocate the psHistogram structure.",
+                testStatus);
+
+    return (!testStatus);
+}
Index: /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psHist02.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psHist02.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psHist02.c	(revision 22331)
@@ -0,0 +1,190 @@
+/*****************************************************************************
+   This routine must ensure that the psHistogram structure is correctly
+   populated by the procedure psGetArrayHistogram().
+ 
+*****************************************************************************/
+#include <stdio.h>
+#include "pslib_strict.h"
+#include "psTest.h"
+#include "psMemory.h"
+#define MISC_FLOAT_NUMBER 345.0
+#define MISC_INT_NUMBER 345
+#define LOWER 20.0
+#define UPPER 30.0
+#define NUM_DATA 10000
+
+psS32 main()
+{
+    psHistogram * myHist = NULL;
+    psHistogram *myHist2 = NULL;
+    psVector *myData = NULL;
+    psVector *myMask = NULL;
+    psS32 testStatus = true;
+    psS32 memLeaks = 0;
+    psS32 nb = 0;
+    psS32 numBins = 0;
+    psS32 i = 0;
+    psS32 currentId = 0;
+
+    currentId = psMemGetId();
+
+    /*********************************************************************/
+    /*  Allocate and initialize data structures                          */
+    /*********************************************************************/
+    myData = psVectorAlloc( NUM_DATA, PS_TYPE_F32 );
+    myData->n = myData->nalloc;
+    for ( i = 0;i < NUM_DATA;i++ ) {
+        myData->data.F32[ i ] = LOWER + ( ( UPPER - LOWER ) / ( float ) NUM_DATA ) * ( float ) i;
+    }
+
+    myMask = psVectorAlloc( NUM_DATA, PS_TYPE_U8 );
+    myMask->n = myMask->nalloc;
+    for ( i = 0;i < NUM_DATA;i++ ) {
+        if ( i >= ( NUM_DATA / 2 ) ) {
+            myMask->data.U8[ i ] = 1;
+        } else {
+            myMask->data.U8[ i ] = 0;
+        }
+    }
+
+    for ( nb = 0;nb < 4;nb++ ) {
+        if ( nb == 0 )
+            numBins = 1;
+        if ( nb == 1 )
+            numBins = 2;
+        if ( nb == 2 )
+            numBins = 10;
+        if ( nb == 3 )
+            numBins = 20;
+
+        /*********************************************************************/
+        /*  Allocate and Perform Histogram, no mask                          */
+        /*********************************************************************/
+        printPositiveTestHeader( stdout,
+                                 "psStats functions",
+                                 "Allocate and Perform Histogram, no mask" );
+
+        myHist = psHistogramAlloc( LOWER, UPPER, numBins );
+        myHist = psVectorHistogram( myHist, myData, NULL, NULL, 0 );
+
+        for ( i = 0;i < numBins;i++ ) {
+            printf( "Bin number %d bounds: (%.2f - %.2f) data (%f)\n", i,
+                    myHist->bounds->data.F32[ i ],
+                    myHist->bounds->data.F32[ i + 1 ],
+                    myHist->nums->data.F32[ i ] );
+        }
+        psMemCheckCorruption( 1 );
+        psFree( myHist );
+        psMemCheckCorruption( 1 );
+
+        printFooter( stdout,
+                     "psStats functions",
+                     "Allocate and Perform Histogram, no mask",
+                     testStatus );
+
+        /*********************************************************************/
+        /*  Allocate and Perform Histogram with mask                         */
+        /*********************************************************************/
+        printPositiveTestHeader( stdout,
+                                 "psStats functions",
+                                 "Allocate and Perform Histogram with mask" );
+
+        myHist = psHistogramAlloc( LOWER, UPPER, numBins );
+        myHist = psVectorHistogram( myHist, myData, NULL, myMask, 1 );
+
+        for ( i = 0;i < numBins;i++ ) {
+            printf( "Bin number %d bounds: (%6.3f - %6.3f) data (%f)\n", i,
+                    myHist->bounds->data.F32[ i ],
+                    myHist->bounds->data.F32[ i + 1 ],
+                    myHist->nums->data.F32[ i ] );
+        }
+        psMemCheckCorruption( 1 );
+        psFree( myHist );
+        psMemCheckCorruption( 1 );
+
+        printFooter( stdout,
+                     "psStats functions",
+                     "Allocate and Perform Histogram with mask",
+                     testStatus );
+    }
+    psFree( myMask );
+
+    printPositiveTestHeader( stdout,
+                             "psStats functions",
+                             "Calling psVectorHistogram() with various NULL inputs." );
+
+
+
+    // ********************************************************************
+    // Verify the return value is null and program execution doesn't stop,
+    // if input parameter myHist is null.
+
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message.");
+    myHist2 = psVectorHistogram( NULL, myData, NULL, NULL, 0 );
+    if ( myHist2 != NULL ) {
+        printf( "ERROR: myHist2!=NULL\n" );
+        testStatus = false;
+    }
+    psFree( myData );
+
+
+    // ********************************************************************
+    // Verify the return value is the same as the input parameter myHist and
+    // program execution doesn't stop, if the input parameter myArray is
+    // null.
+
+    myHist = psHistogramAlloc( LOWER, UPPER, numBins );
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message.");
+    myHist = psVectorHistogram( myHist, NULL, NULL, NULL, 0 );
+    if ( myHist == NULL ) {
+        printf( "ERROR: myHist==NULL\n" );
+        testStatus = false;
+    }
+    psFree( myHist );
+
+
+    //    exit(0);
+    // ********************************************************************
+    // Verify the return value is the same as the input parameter myHist and
+    // program execution doesn't stop, if the input parameter myArray has no
+    // elements.
+    // NOTE: This code segment is commented out because psVectorAlloc returns
+    // NULL if called with an N element data.
+    /*
+    myData = psVectorAlloc(0, PS_TYPE_F32);
+    myData->n = myData->nalloc;
+    myHist = psHistogramAlloc(LOWER, UPPER, numBins);
+    myHist = psVectorHistogram(myHist, NULL, NULL, NULL, 0);
+    if (myHist == NULL) {
+        printf("ERROR: myHist==NULL\n");
+        testStatus = false;
+    }
+    psFree(myHist);
+    psFree(myData);
+    */
+    printFooter( stdout,
+                 "psStats functions",
+                 "Calling psVectorHistogram() with various NULL inputs.",
+                 testStatus );
+
+    /*************************************************************************/
+    /*  Deallocate data structures                                   */
+    /*************************************************************************/
+    printPositiveTestHeader( stdout,
+                             "psStats functions",
+                             "Deallocate the psHistogram structure." );
+
+    psMemCheckCorruption( 1 );
+    memLeaks = psMemCheckLeaks(currentId,NULL,stderr,false);
+    if ( 0 != memLeaks ) {
+        psAbort( __func__, "Memory Leaks! (%d leaks)", memLeaks );
+    }
+    psMemCheckCorruption( 1 );
+
+    printFooter( stdout,
+                 "psStats functions",
+                 "Deallocate the psHistogram structure.",
+                 testStatus );
+
+    return ( !testStatus );
+}
Index: /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psHist03.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psHist03.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psHist03.c	(revision 22331)
@@ -0,0 +1,128 @@
+/*****************************************************************************
+    This routine must ensure that the psHistogram structure is correctly
+    allocated and deallocated by the procedure psHistogramAllocGeneric() and
+    that it can be populated correctly by psVectorHistogram().
+ *****************************************************************************/
+#include <stdio.h>
+#include "pslib_strict.h"
+#include "psTest.h"
+#include "psMemory.h"
+#define LOWER 20.0
+#define UPPER 30.0
+#define NUM_DATA 20
+
+psS32 main()
+{
+    psHistogram *myHist = NULL;
+    psVector *myBounds  = NULL;
+    psVector *myData = psVectorAlloc( NUM_DATA, PS_TYPE_F32 );
+    psS32 testStatus      = true;
+    psS32 memLeaks        = 0;
+    psS32 i               = 0;
+    psS32 nb              = 0;
+    psS32 numBins         = 0;
+    psS32 currentId       = 0;
+
+    currentId       = psMemGetId();
+
+    psTraceSetLevel(".psLib", 0);
+
+    myData->n = myData->nalloc;
+    for ( i = 0;i < NUM_DATA;i++ ) {
+        myData->data.F32[ i ] = LOWER + ( ( UPPER - LOWER ) / ( float ) NUM_DATA ) * ( float ) i;
+    }
+
+    for (nb=0;nb<4;nb++) {
+        if (nb == 0)
+            numBins = 1;
+        if (nb == 1)
+            numBins = 2;
+        if (nb == 2)
+            numBins = 10;
+        if (nb == 3)
+            numBins = 20;
+        /*********************************************************************/
+        /*  Allocate and initialize data structures                          */
+        /*********************************************************************/
+        printPositiveTestHeader(stdout,
+                                "psStats functions",
+                                "Allocate the psHistogram structure.");
+        myBounds = psVectorAlloc(numBins+1, PS_TYPE_F32);
+        myBounds->n = myBounds->nalloc;
+        for (i=0;i<numBins+1;i++) {
+            myBounds->data.F32[i] = LOWER + ((UPPER - LOWER) / (float) numBins) *
+                                    (float) i;
+        }
+        myHist = psHistogramAllocGeneric(myBounds);
+
+        if (myHist->nums->n != numBins) {
+            printf("ERROR: myHist->nums->n is wrong size (%d)\n", myHist->nums->n);
+            testStatus = false;
+        }
+
+        if (myHist->bounds->n != numBins+1) {
+            printf("ERROR: myHist->bounds->n is wrong size (%d)\n", myHist->bounds->n);
+            testStatus = false;
+        }
+
+        for (i=0;i<numBins;i++) {
+            if (myHist->nums->data.F32[i] != 0.0) {
+                printf("ERROR: myHist->nums->data.F32[%d] not initialized to 0.\n", i);
+                testStatus = false;
+            }
+            myHist->nums->data.F32[i] = 0.0;
+        }
+
+        if (myHist->minNum != 0) {
+            printf("ERROR: myHist->minNum is %d\n", myHist->minNum);
+            testStatus = false;
+        }
+
+        if (myHist->maxNum != 0) {
+            printf("myHist->maxNum is %d\n", myHist->maxNum);
+            testStatus = false;
+        }
+
+        if (myHist->uniform != false) {
+            printf("ERROR: myHist->uniform is %d\n", myHist->uniform);
+            testStatus = false;
+        }
+
+        myHist = psVectorHistogram( myHist, myData, NULL, NULL, 0 );
+        for (i=0;i<numBins;i++) {
+            printf("Bin number %d bounds: (%6.3f - %6.3f): data: (%f)\n", i,
+                   myHist->bounds->data.F32[i],
+                   myHist->bounds->data.F32[i+1],
+                   myHist->nums->data.F32[i]);
+        }
+
+        psMemCheckCorruption(1);
+        psFree(myHist);
+        psMemCheckCorruption(1);
+        psFree(myBounds);
+
+        printFooter(stdout,
+                    "psStats functions",
+                    "Allocate the psHistogram structure.",
+                    testStatus);
+    }
+    /*************************************************************************/
+    /*  Deallocate data structures                                           */
+    /*************************************************************************/
+    printPositiveTestHeader(stdout,
+                            "psStats functions",
+                            "Deallocate the psHistogram structure.");
+    psMemCheckCorruption(1);
+    memLeaks = psMemCheckLeaks(currentId,NULL,NULL,false);
+    if (0 != memLeaks) {
+        psAbort(__func__,"Memory Leaks! (%d leaks)", memLeaks);
+    }
+    psMemCheckCorruption(1);
+
+    printFooter(stdout,
+                "psStats functions",
+                "Deallocate the psHistogram structure.",
+                testStatus);
+
+    return (!testStatus);
+}
Index: /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psMatrix01.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psMatrix01.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psMatrix01.c	(revision 22331)
@@ -0,0 +1,131 @@
+/** @file  tst_psMatrix_01.c
+*
+*  @brief Test driver for psMatrix transpose function
+*
+*  This test driver contains the following tests for psMatrix test point 1:
+*     A)  Create input and output images
+*     B)  Transpose input image into output image
+*     C)  Transpose input image into auto allocated NULL output image
+*     D)  Free images and check for leaks
+*
+*  @author  Ross Harman, MHPCC
+*
+*  @version $Revision: 1.13 $  $Name: not supported by cvs2svn $
+*  @date  $Date: 2005-04-07 20:27:42 $
+*
+*  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+*
+*/
+
+#include "pslib_strict.h"
+#include "psTest.h"
+
+#define TOLERANCE 0.000001
+
+#define CHECK_MATRIX(IMAGE)                                                                                  \
+for(psU32 i=0; i<IMAGE->numRows; i++) {                                                                  \
+    for(psU32 j=0; j<IMAGE->numCols; j++) {                                                              \
+        if(IMAGE->type.type == PS_TYPE_F64) {                                                            \
+            if(fabs(IMAGE->data.F64[i][j]-truthMatrix[i][j]) > TOLERANCE) {                              \
+                printf("Matrix values at element %d, %d don't agree %lf vs %lf\n", i, j,                 \
+                       IMAGE->data.F64[i][j], truthMatrix[i][j]);                                        \
+            }                                                                                            \
+        } else if(IMAGE->type.type == PS_TYPE_F32){                                                      \
+            if(fabs(IMAGE->data.F32[i][j]-truthMatrix[i][j]) > TOLERANCE) {                              \
+                printf("Matrix values at element %d, %d don't agree %f vs %lf\n", i, j,                  \
+                       IMAGE->data.F32[i][j], truthMatrix[i][j]);                                        \
+            }                                                                                            \
+        }                                                                                                \
+    }                                                                                                    \
+}
+
+
+psS32 main( psS32 argc, char* argv[] )
+{
+    psImage * tempImage = NULL;
+
+    double truthMatrix[3][3] = {{1, 4, 7},
+                                {2, 5, 8},
+                                {3, 6, 9}};
+
+    // Test A - Create input and output images
+    printPositiveTestHeader(stdout, "psMatrix", "Create input and output images");
+    psImage *inImage = (psImage*)psImageAlloc(3, 3, PS_TYPE_F64);
+    psImage *outImage = (psImage*)psImageAlloc(3, 3, PS_TYPE_F64);
+    inImage->data.F64[0][0] = 1;
+    inImage->data.F64[0][1] = 2;
+    inImage->data.F64[0][2] = 3;
+    inImage->data.F64[1][0] = 4;
+    inImage->data.F64[1][1] = 5;
+    inImage->data.F64[1][2] = 6;
+    inImage->data.F64[2][0] = 7;
+    inImage->data.F64[2][1] = 8;
+    inImage->data.F64[2][2] = 9;
+    psImage *inImageF32 = (psImage*)psImageAlloc(3, 3, PS_TYPE_F32);
+    psImage *outImageF32 = (psImage*)psImageAlloc(3, 3, PS_TYPE_F32);
+    inImageF32->data.F32[0][0] = 1;
+    inImageF32->data.F32[0][1] = 2;
+    inImageF32->data.F32[0][2] = 3;
+    inImageF32->data.F32[1][0] = 4;
+    inImageF32->data.F32[1][1] = 5;
+    inImageF32->data.F32[1][2] = 6;
+    inImageF32->data.F32[2][0] = 7;
+    inImageF32->data.F32[2][1] = 8;
+    inImageF32->data.F32[2][2] = 9;
+    printFooter(stdout, "psMatrix", "Create input and output images", true);
+
+
+    // Test B - Transpose input image into output image
+    printPositiveTestHeader(stdout, "psMatrix", "Transpose input image into output image");
+    tempImage = outImage;
+    outImage = psMatrixTranspose(outImage, inImage);
+    CHECK_MATRIX(outImage);
+    if (outImage->type.dimen != PS_DIMEN_IMAGE) {
+        printf( "Error: Resulting image is not PS_DIMEN_IMAGE\n");
+    } else if (outImage != tempImage) {
+        printf("Error: Return pointer not equal to output argument pointer\n");
+    }
+
+    tempImage = outImageF32;
+    outImageF32 = psMatrixTranspose(outImageF32, inImageF32);
+    CHECK_MATRIX(outImageF32);
+    if (outImageF32->type.dimen != PS_DIMEN_IMAGE) {
+        printf("Error: Resulting image is not PS_DIMEN_IMAGE\n");
+    } else if (outImageF32 != tempImage) {
+        printf("Error: Return pointer not equal to output argument pointer\n");
+    }
+    printFooter(stdout, "psMatrix", "Transpose input image into output image", true);
+
+
+    // Test C - Transpose input image into auto allocated NULL output image
+    printPositiveTestHeader(stdout, "psMatrix", "Transpose input image into auto allocated NULL output image");
+    psImage *outImageNull = NULL;
+    outImageNull = psMatrixTranspose(outImageNull, inImage);
+    CHECK_MATRIX(outImageNull);
+
+    psImage *outImageNullF32 = NULL;
+    outImageNullF32 = psMatrixTranspose(outImageNullF32, inImageF32);
+    CHECK_MATRIX(outImageNullF32);
+    printFooter(stdout, "psMatrix", "Transpose input image into auto allocated NULL output image", true);
+
+
+    // Test D - Free images and check for leaks
+    printPositiveTestHeader(stdout, "psMatrix", "Free images and check for leaks");
+    psFree(inImage);
+    psFree(outImage);
+    psFree(outImageNull);
+    psFree(inImageF32);
+    psFree(outImageF32);
+    psFree(outImageNullF32);
+    psS32 nLeaks = psMemCheckLeaks(0, NULL, stdout, false);
+    if (nLeaks != 0) {
+        printf("ERROR: Found %d memory leaks\n", nLeaks);
+    }
+    psS32 nBad = psMemCheckCorruption(0);
+    if (nBad) {
+        printf("ERROR: Found %d bad memory blocks\n", nBad);
+    }
+    printFooter(stdout, "psMatrix" , "Free images and check for leaks", true);
+
+    return 0;
+}
Index: /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psMatrix02.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psMatrix02.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psMatrix02.c	(revision 22331)
@@ -0,0 +1,100 @@
+/** @file  tst_psMatrix_02.c
+ *
+ *  @brief Test driver for negative tests for psMatrix transpose function
+ *
+ *  This test driver contains the following tests for psMatrix test point 2:
+ *     A)  Input pointer same as output pointer
+ *     B)  Null input psImage
+ *     C)  Incorrect type for input pointer
+ *     D)  Incorrect type for output pointer
+ *     E)  Matrix not square for output pointer
+ *
+ *  @author  Ross Harman, MHPCC
+ *
+ *  @version $Revision: 1.7 $  $Name: not supported by cvs2svn $
+ *  @date  $Date: 2005-04-07 20:27:42 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ *
+ */
+
+#include "pslib_strict.h"
+#include "psTest.h"
+
+psS32 main(psS32 argc,
+           char* argv[])
+{
+    psImage *nullImage = NULL;
+    psImage *inImage = (psImage*)psImageAlloc(3, 3, PS_TYPE_F64);
+    psImage *outImage = (psImage*)psImageAlloc(3, 3, PS_TYPE_F64);
+    psImage *badImage1 = (psImage*)psImageAlloc(3, 3, PS_TYPE_C32);
+    psImage *badImage2 = (psImage*)psImageAlloc(3, 2, PS_TYPE_F64);
+
+    // Test A - Input pointer same as output pointer
+    printPositiveTestHeader(stdout,"psMatrix", "Input pointer same as output pointer");
+    psMemIncrRefCounter(inImage);
+    if (psMatrixTranspose(inImage, inImage) != NULL) {
+        psError(PS_ERR_UNKNOWN, true,
+                "inImage = outImage didn't results in NULL return");
+        return 1;
+    }
+    if (psMemGetRefCounter(inImage) != 1) {
+        psError(PS_ERR_UNKNOWN, true,
+                "the output image was not freed on an error.");
+        return 2;
+    }
+    printFooter(stdout, "psMatrix", "Input pointer same as output pointer", true);
+
+    // Test B - Null input psImage
+    printPositiveTestHeader(stdout,"psMatrix", "Null input psImage");
+    psMemIncrRefCounter(outImage);
+    if (psMatrixTranspose(outImage, nullImage) != NULL) {
+        psError(PS_ERR_UNKNOWN, true,
+                "inImage = outImage didn't results in NULL return");
+        return 3;
+    }
+    if (psMemGetRefCounter(outImage) != 1) {
+        psError(PS_ERR_UNKNOWN, true,
+                "the output image was not freed on an error.");
+        return 4;
+    }
+    printFooter(stdout, "psMatrix", "Null input psImage", true);
+
+    // Test C - Incorrect type for input pointer
+    printPositiveTestHeader(stdout,"psMatrix", "Incorrect type for input pointer");
+    psMemIncrRefCounter(outImage);
+    if (psMatrixTranspose(outImage, badImage1) != NULL) {
+        psError(PS_ERR_UNKNOWN, true,
+                "inImage = outImage didn't results in NULL return");
+        return 5;
+    }
+    if (psMemGetRefCounter(outImage) != 1) {
+        psError(PS_ERR_UNKNOWN, true,
+                "the output image was not freed on an error.");
+        return 6;
+    }
+    printFooter(stdout, "psMatrix", "Incorrect type for input pointer", true);
+
+    // Test D - Incorrect type for output pointer
+    printPositiveTestHeader(stdout,"psMatrix", "Incorrect type for output pointer");
+    badImage1 = psMatrixTranspose(badImage1, inImage);
+    if (badImage1 == NULL) {
+        psError(PS_ERR_UNKNOWN, true,
+                "inImage = outImage didn't results in NULL return");
+        return 7;
+    }
+    // check that the type was changed.
+    if (badImage1->type.type != PS_TYPE_F64) {
+        psError(PS_ERR_UNKNOWN, true,
+                "the output image was not freed on an error.");
+        return 8;
+    }
+    printFooter(stdout, "psMatrix", "Incorrect type for output pointer", true);
+
+    // Test E - Matrix not square for output pointer
+    printPositiveTestHeader(stdout,"psMatrix", "Matrix not square for output pointer");
+    psMatrixTranspose(badImage2, inImage);
+    printFooter(stdout, "psMatrix", "Matrix not square for output pointer", true);
+
+    return 0;
+}
Index: /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psMatrix03.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psMatrix03.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psMatrix03.c	(revision 22331)
@@ -0,0 +1,234 @@
+/** @file  tst_psMatrix_03.c
+ *
+ *  @brief Test driver for psMatrix LU functions
+ *
+ *  This test driver contains the following tests for psMatrix test point 3:
+ *     A)  Create input and output images and vectors
+ *     B)  Calculate LU matrix
+ *     C)  Determine solution to matrix equation
+ *     D)  Free input and output images and vectors
+ *     E)  Attempt to use null image input argument
+ *     F)  Attempt to use null input vector argument
+ *     G)  ttempt to use null LU image argument
+ *
+ *  @author  Ross Harman, MHPCC
+ *
+ *  @version $Revision: 1.16 $  $Name: not supported by cvs2svn $
+ *  @date  $Date: 2005-04-07 20:27:42 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ *
+ */
+
+#include "pslib_strict.h"
+#include "psTest.h"
+
+#define TOLERANCE 0.000001
+
+#define CHECK_MATRIX(IMAGE)                                                                                  \
+for(psU32 i=0; i<IMAGE->numRows; i++) {                                                                  \
+    for(psU32 j=0; j<IMAGE->numCols; j++) {                                                              \
+        if(IMAGE->type.type == PS_TYPE_F64) {                                                            \
+            if(fabs(IMAGE->data.F64[i][j]-truthMatrix[i][j]) > TOLERANCE) {                              \
+                printf("Matrix values at element %d, %d don't agree %lf vs %lf\n", i, j,                 \
+                       IMAGE->data.F64[i][j], truthMatrix[i][j]);                                        \
+            }                                                                                            \
+        } else if(IMAGE->type.type == PS_TYPE_F32){                                                      \
+            if(fabs(IMAGE->data.F32[i][j]-truthMatrix[i][j]) > TOLERANCE) {                              \
+                printf("Matrix values at element %d, %d don't agree %f vs %lf\n", i, j,                  \
+                       IMAGE->data.F32[i][j], truthMatrix[i][j]);                                        \
+            }                                                                                            \
+        }                                                                                                \
+    }                                                                                                    \
+}
+
+#define CHECK_VECTOR(VECTOR)                                                                                 \
+for(psU32 i=0; i<VECTOR->n; i++) {                                                                       \
+    if(VECTOR->type.type == PS_TYPE_F64) {                                                               \
+        if(fabs(VECTOR->data.F64[i]-truthVector[i]) > TOLERANCE) {                                       \
+            printf("Vector values at element %d don't agree %lf vs %lf\n", i,                            \
+                   VECTOR->data.F64[i], truthVector[i]);                                                 \
+        }                                                                                                \
+    } else if(VECTOR->type.type == PS_TYPE_F32){                                                         \
+        if(fabs(VECTOR->data.F32[i]-truthVector[i]) > TOLERANCE) {                                       \
+            printf("Vector values at element %d don't agree %f vs %lf\n", i,                             \
+                   VECTOR->data.F32[i], truthVector[i]);                                                 \
+        }                                                                                                \
+    }                                                                                                    \
+}
+
+
+psS32 main(psS32 argc, char* argv[])
+{
+    psImage *luImage = NULL;
+    psImage *inImage = NULL;
+    psImage *tempImage = NULL;
+    psVector *tempVector = NULL;
+    psVector *perm = NULL;
+    psVector *outVector = NULL;
+    psVector *inVector = NULL;
+    psImage *luImage32 = NULL;
+    psImage *inImage32 = NULL;
+    psImage *tempImage32 = NULL;
+    psVector *tempVector32 = NULL;
+    psVector *perm32 = NULL;
+    psVector *outVector32 = NULL;
+    psVector *inVector32 = NULL;
+
+    double truthVector[3] = {
+                                4.000000,
+                                -2.000000,
+                                3.000000
+                            };
+
+    double truthMatrix[3][3] = {{4.000000,  5.000000,  6.000000},
+                                {0.750000, -2.750000, -6.500000},
+                                {0.500000, -0.545455, -0.545455}};
+
+
+    // Test A - Create input and output images and vectors
+    printPositiveTestHeader(stdout, "psMatrix", "Create input and output images and vectors");
+    luImage = (psImage*)psImageAlloc(3, 3, PS_TYPE_F64);
+    perm = (psVector*)psVectorAlloc(3, PS_TYPE_F64);
+    outVector = (psVector*)psVectorAlloc(3, PS_TYPE_F64);
+    inVector = (psVector*)psVectorAlloc(3, PS_TYPE_F64);
+    inImage = (psImage*)psImageAlloc(3, 3, PS_TYPE_F64);
+    inImage->data.F64[0][0] =  2;
+    inImage->data.F64[0][1] =  4;
+    inImage->data.F64[0][2] =  6;
+    inImage->data.F64[1][0] =  4;
+    inImage->data.F64[1][1] =  5;
+    inImage->data.F64[1][2] =  6;
+    inImage->data.F64[2][0] =  3;
+    inImage->data.F64[2][1] =  1;
+    inImage->data.F64[2][2] = -2;
+    inVector->data.F64[0] = 18.0;
+    inVector->data.F64[1] = 24.0;
+    inVector->data.F64[2] =  4.0;
+    inVector->n = 3;
+    luImage32 = (psImage*)psImageAlloc(3, 3, PS_TYPE_F32);
+    outVector32 = (psVector*)psVectorAlloc(3, PS_TYPE_F32);
+    inVector32 = (psVector*)psVectorAlloc(3, PS_TYPE_F32);
+    inImage32 = (psImage*)psImageAlloc(3, 3, PS_TYPE_F32);
+    inImage32->data.F32[0][0] =  2;
+    inImage32->data.F32[0][1] =  4;
+    inImage32->data.F32[0][2] =  6;
+    inImage32->data.F32[1][0] =  4;
+    inImage32->data.F32[1][1] =  5;
+    inImage32->data.F32[1][2] =  6;
+    inImage32->data.F32[2][0] =  3;
+    inImage32->data.F32[2][1] =  1;
+    inImage32->data.F32[2][2] = -2;
+    inVector32->data.F32[0] = 18.0;
+    inVector32->data.F32[1] = 24.0;
+    inVector32->data.F32[2] =  4.0;
+    inVector32->n = 3;
+    printFooter(stdout, "psMatrix", "Create input and output images and vectors", true);
+
+
+    // Test B - Calculate LU matrix
+    printPositiveTestHeader(stdout, "psMatrix", "Calculate LU matrix");
+    tempImage = luImage;
+    luImage = psMatrixLUD(luImage, &perm, inImage);
+    CHECK_MATRIX(luImage);
+    if(luImage->type.dimen != PS_DIMEN_IMAGE) {
+        printf("Error: Resulting image is not PS_DIMEN_IMAGE\n");
+    } else if(luImage != tempImage) {
+        printf("Error: Return pointer not equal to output argument pointer\n");
+    }
+
+    tempImage32 = luImage32;
+    luImage32 = psMatrixLUD(luImage32, &perm32, inImage32);
+    CHECK_MATRIX(luImage32);
+    if(luImage32->type.dimen != PS_DIMEN_IMAGE) {
+        printf("Error: Resulting image is not PS_DIMEN_IMAGE\n");
+    } else if(luImage32 != tempImage32) {
+        printf("Error: Return pointer not equal to output argument pointer\n");
+    }
+    printFooter(stdout, "psMatrix", "Calculate LU matrix", true);
+
+    // Test C - Determine solution to matrix equation
+    printPositiveTestHeader(stdout, "psMatrix", "Determine solution to matrix equation");
+    tempVector = outVector;
+    outVector = psMatrixLUSolve(outVector, luImage, inVector, perm);
+    CHECK_VECTOR(outVector);
+    if(outVector->type.dimen != PS_DIMEN_VECTOR) {
+        printf("Error: Resulting image is not PS_DIMEN_VECTOR\n");
+    } else if(outVector != tempVector) {
+        printf("Error: Return pointer not equal to output argument pointer\n");
+    }
+
+    tempVector32 = outVector32;
+    outVector32 = psMatrixLUSolve(outVector32, luImage32, inVector32, perm32);
+    CHECK_VECTOR(outVector32);
+    if(outVector32->type.dimen != PS_DIMEN_VECTOR) {
+        printf("Error: Resulting image is not PS_DIMEN_VECTOR\n");
+    } else if(outVector32 != tempVector32) {
+        printf("Error: Return pointer not equal to output argument pointer\n");
+    }
+    printFooter(stdout, "psMatrix", "Determine solution to matrix equation", true);
+
+
+    // Test D - Free input and output images and vectors
+    printPositiveTestHeader(stdout, "psMatrix", "Free input and output images and vectors");
+    psFree(inImage);
+    psFree(luImage);
+    psFree(perm);
+    psFree(outVector);
+    psFree(inVector);
+    psFree(inImage32);
+    psFree(luImage32);
+    psFree(perm32);
+    psFree(outVector32);
+    psFree(inVector32);
+    if( psMemCheckLeaks(0, NULL, stdout, false) ) {
+        psError(PS_ERR_UNKNOWN,true,"Memory leaks detected");
+        return 10;
+    }
+    psS32 nBad = psMemCheckCorruption(0);
+    if(nBad) {
+        printf("ERROR: Found %d bad memory blocks\n", nBad);
+    }
+    printFooter(stdout, "psMatrix" ,"Free input and output images and vectors", true);
+
+
+    // Test E - Attempt to use null image input argument
+    printNegativeTestHeader(stdout,"psMatrix", "Attempt to use null image input argument",
+                            "Invalid operation: inImage or its data is NULL.", 0);
+    psImage *imageTest = (psImage*)psImageAlloc(3, 3, PS_TYPE_F64);
+    psMatrixLUD(imageTest, NULL, NULL);
+    printFooter(stdout, "psMatrix", "Attempt to use null image input argument", true);
+
+
+    // Test F - Attempt to use null input vector argument
+    printNegativeTestHeader(stdout,"psMatrix", "Attempt to use null input vector argument",
+                            "Invalid operation: inVector or its data is NULL.", 0);
+    psVector *vectorBad = NULL;
+    psVector *vectorBadOut = (psVector*)psVectorAlloc(3, PS_TYPE_F64);
+    psVector *permBad = (psVector*)psVectorAlloc(3, PS_TYPE_F64);
+    imageTest = (psImage*)psImageAlloc(3, 3, PS_TYPE_F64);
+    psMatrixLUSolve(vectorBadOut, imageTest, vectorBad, permBad);
+    printFooter(stdout, "psMatrix", "Attempt to use null input vector argument", true);
+
+
+    // Test G - Attempt to use null LU image argument
+    printNegativeTestHeader(stdout,"psMatrix", "Attempt to use null LU image argument",
+                            "Invalid operation: inImage or its data is NULL.", 0);
+    vectorBadOut = (psVector*)psVectorAlloc(3, PS_TYPE_F64);
+    psMatrixLUSolve(vectorBadOut, NULL, vectorBad, permBad);
+    printFooter(stdout, "psMatrix", "Attempt to use null LU image argument", true);
+
+    psFree(permBad);
+    psFree(imageTest);
+
+    if( psMemCheckLeaks(0, NULL, stdout, false) ) {
+        psError(PS_ERR_UNKNOWN,true,"Memory leaks detected");
+        return 10;
+    }
+    nBad = psMemCheckCorruption(0);
+    if(nBad) {
+        printf("ERROR: Found %d bad memory blocks\n", nBad);
+    }
+
+    return 0;
+}
Index: /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psMatrix04.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psMatrix04.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psMatrix04.c	(revision 22331)
@@ -0,0 +1,163 @@
+/** @file  tst_psMatrix_04.c
+ *
+ *  @brief Test driver for psMatrix invert function
+ *
+ *  This test driver contains the following tests for psMatrix test point 4:
+ *     A)  Create input and output images
+ *     B)  Invert matrix and calculate determinant
+ *     C)  Calculate determinant only
+ *     D)  Free input and output images
+ *     E)  Attempt to use null input image argument
+ *     F)  Attempt to use null input float argument
+ *
+ *  @author  Ross Harman, MHPCC
+ *
+ *  @version $Revision: 1.9 $  $Name: not supported by cvs2svn $
+ *  @date  $Date: 2005-04-07 20:27:42 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ *
+ */
+
+#include "pslib_strict.h"
+#include "psTest.h"
+
+
+#define TOLERANCE 0.000001
+
+#define CHECK_MATRIX(IMAGE)                                                                                  \
+for(psU32 i=0; i<IMAGE->numRows; i++) {                                                                  \
+    for(psU32 j=0; j<IMAGE->numCols; j++) {                                                              \
+        if(IMAGE->type.type == PS_TYPE_F64) {                                                            \
+            if(fabs(IMAGE->data.F64[i][j]-truthMatrix[i][j]) > TOLERANCE) {                              \
+                printf("Matrix values at element %d, %d don't agree %lf vs %lf\n", i, j,                 \
+                       IMAGE->data.F64[i][j], truthMatrix[i][j]);                                        \
+            }                                                                                            \
+        } else if(IMAGE->type.type == PS_TYPE_F32){                                                      \
+            if(fabs(IMAGE->data.F32[i][j]-truthMatrix[i][j]) > TOLERANCE) {                              \
+                printf("Matrix values at element %d, %d don't agree %f vs %lf\n", i, j,                  \
+                       IMAGE->data.F32[i][j], truthMatrix[i][j]);                                        \
+            }                                                                                            \
+        }                                                                                                \
+    }                                                                                                    \
+}
+
+#define CHECK_VALUE(VALUE)                                                                                   \
+if(fabs(VALUE-truthValue) > TOLERANCE) {                                                                     \
+    printf("Values don't agree %lf vs %lf\n", VALUE, truthValue);                                            \
+}
+
+psS32 main(psS32 argc, char* argv[])
+{
+    float det = 0.0f;
+    float *det2 = NULL;
+    psImage *outImage = NULL;
+    psImage *inImage = NULL;
+    psImage *tempImage = NULL;
+    psImage *outImage32 = NULL;
+    psImage *inImage32 = NULL;
+    psImage *tempImage32 = NULL;
+
+    double truthMatrix[3][3] = {{4.0000000, -4.333333, -2.333333},
+                                {-1.000000,  1.666667,  0.666667},
+                                {-1.000000,  0.666667,  0.666667}};
+    double truthValue = 3.0;
+
+
+    // Test A - Create input and output images
+    printPositiveTestHeader(stdout, "psMatrix", "Create input and output images");
+    outImage = (psImage*)psImageAlloc(3, 3, PS_TYPE_F64);
+    inImage = (psImage*)psImageAlloc(3, 3, PS_TYPE_F64);
+    inImage->data.F64[0][0] =  2;
+    inImage->data.F64[0][1] =  4;
+    inImage->data.F64[0][2] =  3;
+    inImage->data.F64[1][0] =  0;
+    inImage->data.F64[1][1] =  1;
+    inImage->data.F64[1][2] = -1;
+    inImage->data.F64[2][0] =  3;
+    inImage->data.F64[2][1] =  5;
+    inImage->data.F64[2][2] =  7;
+
+    outImage32 = (psImage*)psImageAlloc(3, 3, PS_TYPE_F32);
+    inImage32 = (psImage*)psImageAlloc(3, 3, PS_TYPE_F32);
+    inImage32->data.F32[0][0] =  2;
+    inImage32->data.F32[0][1] =  4;
+    inImage32->data.F32[0][2] =  3;
+    inImage32->data.F32[1][0] =  0;
+    inImage32->data.F32[1][1] =  1;
+    inImage32->data.F32[1][2] = -1;
+    inImage32->data.F32[2][0] =  3;
+    inImage32->data.F32[2][1] =  5;
+    inImage32->data.F32[2][2] =  7;
+    printFooter(stdout, "psMatrix", "Create input and output images", true);
+
+
+    // Test B - Invert matrix and calculate determinant
+    printPositiveTestHeader(stdout, "psMatrix", "Invert matrix and calculate determinant");
+    tempImage = outImage;
+    outImage = psMatrixInvert(outImage, inImage, &det);
+    CHECK_MATRIX(outImage);
+    CHECK_VALUE(det);
+    if(outImage->type.dimen != PS_DIMEN_IMAGE) {
+        printf("Error: Resulting image is not PS_DIMEN_IMAGE\n");
+    } else if(outImage != tempImage) {
+        printf("Error: Return pointer not equal to output argument pointer\n");
+    }
+    det = 0.0f;
+    tempImage32 = outImage32;
+    outImage32 = psMatrixInvert(outImage32, inImage32, &det);
+    CHECK_MATRIX(outImage32);
+    CHECK_VALUE(det);
+    if(outImage32->type.dimen != PS_DIMEN_IMAGE) {
+        printf("Error: Resulting image is not PS_DIMEN_IMAGE\n");
+    } else if(outImage32 != tempImage32) {
+        printf("Error: Return pointer not equal to output argument pointer\n");
+    }
+    printFooter(stdout, "psMatrix", "Invert matrix and calculate determinant", true);
+
+
+    // Test C - Calculate determinant only
+    printPositiveTestHeader(stdout, "psMatrix", "Calculate determinant only");
+    det2 = psMatrixDeterminant(inImage);
+    CHECK_VALUE(*det2);
+    psFree(det2);
+    det2 = psMatrixDeterminant(inImage32);
+    CHECK_VALUE(*det2);
+    psFree(det2);
+    printFooter(stdout, "psMatrix", "Calculate determinant only", true);
+
+
+    // Test D - Free input and output images
+    printPositiveTestHeader(stdout, "psMatrix", "Free input and output images");
+    psFree(outImage);
+    psFree(inImage);
+    psFree(outImage32);
+    psFree(inImage32);
+    if(psMemCheckLeaks(0, NULL, stdout, false) != 0 ) {
+        psError(PS_ERR_UNKNOWN,true,"Memory leaks detected.");
+        return 10;
+    }
+    psS32 nBad = psMemCheckCorruption(0);
+    if(nBad) {
+        printf("ERROR: Found %d bad memory blocks\n", nBad);
+    }
+    printFooter(stdout, "psMatrix" ,"Free input and output images", true);
+
+
+    // Test E - Attempt to use null input image argument
+    printNegativeTestHeader(stdout,"psMatrix", "Attempt to use null input image argument",
+                            "Invalid operation: inImage or its data is NULL.", 0);
+    psImage *badOutImage = (psImage*)psImageAlloc(3, 3, PS_TYPE_F64);
+    psMatrixInvert(badOutImage, NULL, &det);
+    printFooter(stdout, "psMatrix", "Attempt to use null input image argument", true);
+
+
+    // Test F - Attempt to use null input float argument
+    printNegativeTestHeader(stdout,"psMatrix", "Attempt to use null input float argument",
+                            "Invalid operation: determinant argument is NULL.", 0);
+    psImage *badInImage = (psImage*)psImageAlloc(3, 3, PS_TYPE_F64);
+    psMatrixInvert(badOutImage, badInImage, NULL);
+    printFooter(stdout, "psMatrix", "Attempt to use null input float argument", true);
+
+    return 0;
+}
Index: /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psMatrix05.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psMatrix05.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psMatrix05.c	(revision 22331)
@@ -0,0 +1,113 @@
+/** @file  tst_psMatrix_05.c
+*
+*  @brief Test driver for psMatrix multiplication function
+*
+*  This test driver contains the following tests for psMatrix test point 5:
+*     A)  Create input and output images
+*     B)  Multiply images
+*     C)  Free input and output images
+*
+*  @author  Ross Harman, MHPCC
+*
+*  @version $Revision: 1.9 $  $Name: not supported by cvs2svn $
+*  @date  $Date: 2005-04-07 20:27:42 $
+*
+*  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+*
+*/
+
+#include "pslib_strict.h"
+#include "psTest.h"
+
+#define TOLERANCE 0.000001
+
+#define CHECK_MATRIX(IMAGE)                                                                                  \
+for(psU32 i=0; i<IMAGE->numRows; i++) {                                                                  \
+    for(psU32 j=0; j<IMAGE->numCols; j++) {                                                              \
+        if(IMAGE->type.type == PS_TYPE_F64) {                                                            \
+            if(fabs(IMAGE->data.F64[i][j]-truthMatrix[i][j]) > TOLERANCE) {                              \
+                printf("Matrix values at element %d, %d don't agree %lf vs %lf\n", i, j,                 \
+                       IMAGE->data.F64[i][j], truthMatrix[i][j]);                                        \
+            }                                                                                            \
+        } else if(IMAGE->type.type == PS_TYPE_F32){                                                      \
+            if(fabs(IMAGE->data.F32[i][j]-truthMatrix[i][j]) > TOLERANCE) {                              \
+                printf("Matrix values at element %d, %d don't agree %f vs %lf\n", i, j,                  \
+                       IMAGE->data.F32[i][j], truthMatrix[i][j]);                                        \
+            }                                                                                            \
+        }                                                                                                \
+    }                                                                                                    \
+}
+
+
+psS32 main( psS32 argc,
+            char* argv[] )
+{
+    psImage * outImage = NULL;
+    psImage *inImage1 = NULL;
+    psImage *inImage2 = NULL;
+    psImage * outImage32 = NULL;
+    psImage *inImage132 = NULL;
+    psImage *inImage232 = NULL;
+
+    double truthMatrix[3][3] = {{ 8.000000, 20.000000},
+                                {-4.000000, 11.000000}};
+
+
+
+
+    // Test A - Create input and output images
+    printPositiveTestHeader(stdout, "psMatrix", "Create input and output images");
+    outImage = (psImage*) psImageAlloc(2, 2, PS_TYPE_F64);
+    inImage1 = (psImage*) psImageAlloc(2, 2, PS_TYPE_F64);
+    inImage2 = (psImage*) psImageAlloc(2, 2, PS_TYPE_F64);
+    inImage1->data.F64[0][0] = 2;
+    inImage1->data.F64[0][1] = 3;
+    inImage1->data.F64[1][0] = -1;
+    inImage1->data.F64[1][1] = 2;
+    inImage2->data.F64[0][0] = 4;
+    inImage2->data.F64[0][1] = 1;
+    inImage2->data.F64[1][0] = 0;
+    inImage2->data.F64[1][1] = 6;
+    outImage32 = (psImage*)psImageAlloc(2, 2, PS_TYPE_F32);
+    inImage132 = (psImage*)psImageAlloc(2, 2, PS_TYPE_F32);
+    inImage232 = (psImage*)psImageAlloc(2, 2, PS_TYPE_F32);
+    inImage132->data.F32[0][0] = 2;
+    inImage132->data.F32[0][1] = 3;
+    inImage132->data.F32[1][0] = -1;
+    inImage132->data.F32[1][1] = 2;
+    inImage232->data.F32[0][0] = 4;
+    inImage232->data.F32[0][1] = 1;
+    inImage232->data.F32[1][0] = 0;
+    inImage232->data.F32[1][1] = 6;
+    printFooter( stdout, "psMatrix", "Create input and output images", true );
+
+
+    // Test B - Multiply images
+    printPositiveTestHeader(stdout, "psMatrix", "Multiply images");
+    psMatrixMultiply(outImage, inImage1, inImage2);
+    CHECK_MATRIX(outImage);
+    psMatrixMultiply(outImage32, inImage132, inImage232);
+    CHECK_MATRIX(outImage32);
+    printFooter(stdout, "psMatrix", "Multiply images", true);
+
+
+    // Test C - Free input and output images
+    printPositiveTestHeader( stdout, "psMatrix", "Free input and output images" );
+    psFree(outImage);
+    psFree(inImage1);
+    psFree(inImage2);
+    psFree(outImage32);
+    psFree(inImage132);
+    psFree(inImage232);
+    psS32 nLeaks = psMemCheckLeaks( 0, NULL, stdout, false );
+    if ( nLeaks != 0 ) {
+        printf( "ERROR: Found %d memory leaks\n", nLeaks );
+    }
+    psS32 nBad = psMemCheckCorruption( 0 );
+    if ( nBad ) {
+        printf( "ERROR: Found %d bad memory blocks\n", nBad );
+    }
+    printFooter( stdout, "psMatrix" , "Free input and output images", true );
+
+    return 0;
+}
Index: /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psMatrix06.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psMatrix06.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psMatrix06.c	(revision 22331)
@@ -0,0 +1,124 @@
+/** @file  tst_psMatrix_06.c
+*
+*  @brief Test driver for psMatrix Eigenvectors function
+*
+*  This test driver contains the following tests for psMatrix test point 6:
+*     A)  Create input and output images
+*     B)  Calculate Eigenvectors
+*     C)  Free input and output images
+*
+*  @author  Ross Harman, MHPCC
+*
+*  @version $Revision: 1.9 $  $Name: not supported by cvs2svn $
+*  @date  $Date: 2005-04-07 20:27:42 $
+*
+*  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+*
+*/
+
+#include "pslib_strict.h"
+#include "psTest.h"
+
+#define TOLERANCE 0.000001
+
+#define CHECK_MATRIX(IMAGE)                                                                                  \
+for(psU32 i=0; i<IMAGE->numRows; i++) {                                                                  \
+    for(psU32 j=0; j<IMAGE->numCols; j++) {                                                              \
+        if(IMAGE->type.type == PS_TYPE_F64) {                                                            \
+            if(fabs(IMAGE->data.F64[i][j]-truthMatrix[i][j]) > TOLERANCE) {                              \
+                printf("Matrix values at element %d, %d don't agree %lf vs %lf\n", i, j,                 \
+                       IMAGE->data.F64[i][j], truthMatrix[i][j]);                                        \
+            }                                                                                            \
+        } else if(IMAGE->type.type == PS_TYPE_F32){                                                      \
+            if(fabs(IMAGE->data.F32[i][j]-truthMatrix[i][j]) > TOLERANCE) {                              \
+                printf("Matrix values at element %d, %d don't agree %f vs %lf\n", i, j,                  \
+                       IMAGE->data.F32[i][j], truthMatrix[i][j]);                                        \
+            }                                                                                            \
+        }                                                                                                \
+    }                                                                                                    \
+}
+
+
+psS32 main(psS32 argc, char* argv[])
+{
+    psImage * outImage = NULL;
+    psImage *inImage = NULL;
+    psImage * outImage32 = NULL;
+    psImage *inImage32 = NULL;
+
+    double truthMatrix[4][4] = {{0.792608,  0.582076, -0.179186, -0.029193},
+                                {0.451923, -0.370502,  0.741918,  0.328712},
+                                {0.322416, -0.509579, -0.100228, -0.791411},
+                                {0.252161, -0.514048, -0.638283,  0.514553}};
+
+
+    // Test A - Create input and output images
+    printPositiveTestHeader( stdout, "psMatrix", "Create input and output images" );
+    outImage = (psImage*) psImageAlloc(4, 4, PS_TYPE_F64);
+    inImage = (psImage*)  psImageAlloc(4, 4, PS_TYPE_F64);
+
+    inImage->data.F64[0][0] = 1./1.;
+    inImage->data.F64[0][1] = 1./2.;
+    inImage->data.F64[0][2] = 1./3.;
+    inImage->data.F64[0][3] = 1./4.;
+    inImage->data.F64[1][0] = 1./2.;
+    inImage->data.F64[1][1] = 1./3.;
+    inImage->data.F64[1][2] = 1./4.;
+    inImage->data.F64[1][3] = 1./5.;
+    inImage->data.F64[2][0] = 1./3.;
+    inImage->data.F64[2][1] = 1./4.;
+    inImage->data.F64[2][2] = 1./5.;
+    inImage->data.F64[2][3] = 1./6.;
+    inImage->data.F64[3][0] = 1./4.;
+    inImage->data.F64[3][1] = 1./5.;
+    inImage->data.F64[3][2] = 1./6.;
+    inImage->data.F64[3][3] = 1./7.;
+
+    outImage32 = (psImage*) psImageAlloc(4, 4, PS_TYPE_F32);
+    inImage32 = (psImage*)  psImageAlloc(4, 4, PS_TYPE_F32);
+    inImage32->data.F32[0][0] = 1./1.;
+    inImage32->data.F32[0][1] = 1./2.;
+    inImage32->data.F32[0][2] = 1./3.;
+    inImage32->data.F32[0][3] = 1./4.;
+    inImage32->data.F32[1][0] = 1./2.;
+    inImage32->data.F32[1][1] = 1./3.;
+    inImage32->data.F32[1][2] = 1./4.;
+    inImage32->data.F32[1][3] = 1./5.;
+    inImage32->data.F32[2][0] = 1./3.;
+    inImage32->data.F32[2][1] = 1./4.;
+    inImage32->data.F32[2][2] = 1./5.;
+    inImage32->data.F32[2][3] = 1./6.;
+    inImage32->data.F32[3][0] = 1./4.;
+    inImage32->data.F32[3][1] = 1./5.;
+    inImage32->data.F32[3][2] = 1./6.;
+    inImage32->data.F32[3][3] = 1./7.;
+    printFooter(stdout, "psMatrix", "Create input and output images", true);
+
+
+    // Test B - Calculate Eigenvectors
+    printPositiveTestHeader(stdout, "psMatrix", "Calculate Eigenvectors");
+    psMatrixEigenvectors(outImage, inImage);
+    CHECK_MATRIX(outImage);
+    psMatrixEigenvectors(outImage32, inImage32);
+    CHECK_MATRIX(outImage32);
+    printFooter(stdout, "psMatrix", "Calculate Eigenvectors", true);
+
+
+    // Test C - Free input and output images
+    printPositiveTestHeader(stdout, "psMatrix", "Free input and output images");
+    psFree(outImage);
+    psFree(inImage);
+    psFree(outImage32);
+    psFree(inImage32);
+    psS32 nLeaks = psMemCheckLeaks(0, NULL, stdout, false);
+    if (nLeaks != 0) {
+        printf("ERROR: Found %d memory leaks\n", nLeaks);
+    }
+    psS32 nBad = psMemCheckCorruption(0);
+    if (nBad) {
+        printf("ERROR: Found %d bad memory blocks\n", nBad);
+    }
+    printFooter(stdout, "psMatrix" , "Free input and output images", true);
+
+    return 0;
+}
Index: /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psMatrix07.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psMatrix07.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psMatrix07.c	(revision 22331)
@@ -0,0 +1,313 @@
+/** @file  tst_psMatrix_07.c
+ *
+ *  @brief Test driver for psMatrix vector conversion functions
+ *
+ *  This test driver contains the following tests for psMatrix test point 7:
+ *     A)  Create input and output images and vectors
+ *     B)  Convert matrix to PS_DIMEN_VECTOR vector
+ *     C)  Attempt to use null image input argument
+ *     D)  Convert matrix to PS_DIMEN_TRANSV vector
+ *     E)  Improper image size
+ *     F)  Convert PS_DIMEN_VECTOR vector to matrix
+ *     G)  Attempt to use null input vector argument
+ *     H)  Convert PS_DIMEN_TRANSV vector to matrix
+ *     I)  Free input and output images and vectors
+ *
+ *  @author  Ross Harman, MHPCC
+ *
+ *  @version $Revision: 1.12 $  $Name: not supported by cvs2svn $
+ *  @date  $Date: 2005-04-07 20:27:42 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ *
+ */
+
+#include "pslib_strict.h"
+#include "psTest.h"
+
+
+#define TOLERANCE 0.000001
+
+#define CHECK_MATRIX(IMAGE,TRUTH)                                                                        \
+for(psU32 i=0; i<IMAGE->numRows; i++) {                                                                  \
+    for(psU32 j=0; j<IMAGE->numCols; j++) {                                                              \
+        if(IMAGE->type.type == PS_TYPE_F64) {                                                            \
+            if(fabs(IMAGE->data.F64[i][j]-TRUTH[i][j]) > TOLERANCE) {                                    \
+                printf("Matrix values at element %d, %d don't agree %lf vs %lf\n", i, j,                 \
+                       IMAGE->data.F64[i][j], TRUTH[i][j]);                                              \
+            }                                                                                            \
+        } else if(IMAGE->type.type == PS_TYPE_F32){                                                      \
+            if(fabs(IMAGE->data.F32[i][j]-TRUTH[i][j]) > TOLERANCE) {                                    \
+                printf("Matrix values at element %d, %d don't agree %f vs %f\n", i, j,                  \
+                       IMAGE->data.F32[i][j], TRUTH[i][j]);                                              \
+            }                                                                                            \
+        }                                                                                                \
+    }                                                                                                    \
+}
+
+#define CHECK_VECTOR(VECTOR)                                                                                 \
+for(psU32 i=0; i<VECTOR->n; i++) {                                                                       \
+    if(VECTOR->type.type == PS_TYPE_F64) {                                                               \
+        if(fabs(VECTOR->data.F64[i]-truthVector[i]) > TOLERANCE) {                                       \
+            printf("Vector values at element %d don't agree %lf vs %lf\n", i,                            \
+                   VECTOR->data.F64[i], truthVector[i]);                                                 \
+        }                                                                                                \
+    } else if(VECTOR->type.type == PS_TYPE_F32){                                                         \
+        if(fabs(VECTOR->data.F32[i]-truthVector_32[i]) > TOLERANCE) {                                       \
+            printf("Vector values at element %d don't agree %f vs %lf\n", i,                             \
+                   VECTOR->data.F32[i], truthVector[i]);                                                 \
+        }                                                                                                \
+    }                                                                                                    \
+}
+
+
+psS32 main(psS32 argc, char* argv[])
+{
+    psVector *v1 = NULL;
+    psVector *v1_32 = NULL;
+    psVector *tempVector = NULL;
+    psVector *tempVector_32 = NULL;
+    psImage *tempImage = NULL;
+    psImage *tempImage_32 = NULL;
+    psImage *m1 = NULL;
+    psImage *m1_32 = NULL;
+    psVector *v2 = NULL;
+    psVector *v2_32 = NULL;
+    psVector *v3 = NULL;
+    psVector *v3_32 = NULL;
+    psImage *m2 = NULL;
+    psImage *m2_32 = NULL;
+    psImage *m3 = NULL;
+    psImage *m3_32 = NULL;
+    psImage *m4 = NULL;
+    psImage *m4_32 = NULL;
+    psImage *badImage = NULL;
+    psImage *badImage_32 = NULL;
+
+    psF64 truthVector[3] = {0.0, 1.0, 2.0};
+    psF32 truthVector_32[3] = {0.0, 1.0, 2.0};
+    psF64 truthMatrix[3][1] = {{0.0}, {1.0}, {2.0}};
+    psF32 truthMatrix_32[3][1] = {{0.0}, {1.0}, {2.0}};
+
+    // Test A - Create input and output images
+    printPositiveTestHeader(stdout, "psMatrix", "Create input and output images and vectors");
+    v1 = (psVector*)psVectorAlloc(3, PS_TYPE_F64);
+    v1_32 = (psVector*)psVectorAlloc(3, PS_TYPE_F32);
+    m1 = (psImage*)psImageAlloc(1, 3, PS_TYPE_F64);
+    m1_32 = (psImage*)psImageAlloc(1,3,PS_TYPE_F32);
+    v2 = (psVector*)psVectorAlloc(3, PS_TYPE_F64);
+    v2_32 = (psVector*)psVectorAlloc(3,PS_TYPE_F32);
+    m2 = (psImage*)psImageAlloc(1, 3, PS_TYPE_F64);
+    m2_32 = (psImage*)psImageAlloc(1,3,PS_TYPE_F32);
+    m3 = (psImage*)psImageAlloc(3, 1, PS_TYPE_F64);
+    m3_32 = (psImage*)psImageAlloc(3,1,PS_TYPE_F32);
+    m4 = (psImage*)psImageAlloc(3, 1, PS_TYPE_F64);
+    m4_32 = (psImage*)psImageAlloc(3,1,PS_TYPE_F32);
+    badImage = (psImage*)psImageAlloc(2, 2, PS_TYPE_F64);
+    badImage_32 = (psImage*)psImageAlloc(2,2,PS_TYPE_F32);
+    m1->data.F64[0][0] = 0.0;
+    m1->data.F64[1][0] = 1.0;
+    m1->data.F64[2][0] = 2.0;
+    m1_32->data.F32[0][0] = 0.0;
+    m1_32->data.F32[1][0] = 1.0;
+    m1_32->data.F32[2][0] = 2.0;
+    v2->data.F64[0] = 0.0;
+    v2->data.F64[1] = 1.0;
+    v2->data.F64[2] = 2.0;
+    v2->n = 3;
+    v2_32->data.F32[0] = 0.0;
+    v2_32->data.F32[1] = 1.0;
+    v2_32->data.F32[2] = 2.0;
+    v2_32->n = 3;
+    m4->data.F64[0][0] = 0.0;
+    m4->data.F64[0][1] = 1.0;
+    m4->data.F64[0][2] = 2.0;
+    m4_32->data.F32[0][0] = 0.0;
+    m4_32->data.F32[0][1] = 1.0;
+    m4_32->data.F32[0][2] = 2.0;
+    printFooter(stdout, "psMatrix", "Create input and output images and vectors", true);
+
+    // Test B - Convert matrix to PS_DIMEN_VECTOR vector
+    printPositiveTestHeader(stdout, "psMatrix", "Convert matrix to PS_DIMEN_VECTOR vector");
+    tempVector = v1;
+    v1 = psMatrixToVector(v1, m1);
+    CHECK_VECTOR(v1);
+    if(v1->type.dimen != PS_DIMEN_VECTOR) {
+        psError(PS_ERR_UNKNOWN,true,"Resulting image is not PS_DIMEN_VECTOR");
+        return 1;
+    } else if(v1 != tempVector) {
+        psError(PS_ERR_UNKNOWN,true,"Return pointer not equal to output argument pointer");
+        return 2;
+    }
+    tempVector_32 = v1_32;
+    v1_32 = psMatrixToVector(v1_32, m1_32);
+    CHECK_VECTOR(v1_32);
+    if(v1_32->type.dimen != PS_DIMEN_VECTOR) {
+        psError(PS_ERR_UNKNOWN,true,"Resulting image is not PS_DIMEN_VECTOR");
+        return 1;
+    } else if(v1_32 != tempVector_32) {
+        psError(PS_ERR_UNKNOWN,true,"Return pointer not equal to output argument pointer");
+        return 2;
+    }
+    printFooter(stdout, "psMatrix", "Convert matrix to PS_DIMEN_VECTOR vector", true);
+
+
+    // Test C - Attempt to use null image input argument
+    printNegativeTestHeader(stdout,"psMatrix", "Attempt to use null image input argument",
+                            "Invalid operation: inImage or its data is NULL.", 0);
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error.");
+    v1 = psMatrixToVector(v1, NULL);
+    if(v1 != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Did not return NULL with NULL input");
+        return 3;
+    }
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error.");
+    v1_32 = psMatrixToVector(v1_32, NULL);
+    if(v1_32 != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Did not return NULL with NULL input");
+        return 3;
+    }
+    printFooter(stdout, "psMatrix", "Attempt to use null image input argument", true);
+
+
+    // Test D - Convert matrix to PS_DIMEN_TRANSV vector
+    printPositiveTestHeader(stdout, "psMatrix", "Convert matrix to PS_DIMEN_TRANSV vector");
+    v3 = psVectorAlloc(3, PS_TYPE_F64);
+    tempVector = v3;
+    v3->type.dimen = PS_DIMEN_TRANSV;
+    psMatrixToVector(v3, m4);
+    CHECK_VECTOR(v3);
+    if(v3->type.dimen != PS_DIMEN_TRANSV) {
+        psError(PS_ERR_UNKNOWN,true,"Resulting image is not PS_DIMEN_TRANSV");
+        return 4;
+    } else if(v3 != tempVector) {
+        psError(PS_ERR_UNKNOWN,true,"Return pointer not equal to output argument pointer");
+        return 5;
+    }
+    v3_32 = psVectorAlloc(3, PS_TYPE_F32);
+    tempVector_32 = v3_32;
+    v3_32->type.dimen = PS_DIMEN_TRANSV;
+    psMatrixToVector(v3_32, m4_32);
+    CHECK_VECTOR(v3_32);
+    if(v3_32->type.dimen != PS_DIMEN_TRANSV) {
+        psError(PS_ERR_UNKNOWN,true,"Resulting image is not PS_DIMEN_TRANSV");
+        return 6;
+    } else if(v3_32 != tempVector_32) {
+        psError(PS_ERR_UNKNOWN,true,"Return pointer not equal to output argument pointer");
+        return 7;
+    }
+    printFooter(stdout, "psMatrix", "Convert matrix to PS_DIMEN_TRANSV vector", true);
+
+
+    // Test E - Improper image size
+    printNegativeTestHeader(stdout,"psMatrix", "Improper image size",
+                            "Image does not have dim with 1 col or 1 row: (2 x 2).", 0);
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate error message");
+    if(psMatrixToVector(v1, badImage) != NULL ) {
+        psError(PS_ERR_UNKNOWN,true,"Did not return NULL with improper sizes");
+        return 8;
+    }
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate error message");
+    if(psMatrixToVector(v1_32, badImage_32) != NULL ) {
+        psError(PS_ERR_UNKNOWN,true,"Did not return NULL with improper sizes");
+        return 9;
+    }
+    printFooter(stdout, "psMatrix", "Improper image size", true);
+
+
+    // Test F - Convert PS_DIMEN_VECTOR vector to matrix
+    printPositiveTestHeader(stdout, "psMatrix", "Convert PS_DIMEN_VECTOR vector to matrix");
+    tempImage = m2;
+    m2 = psVectorToMatrix(m2, v2);
+    CHECK_MATRIX(m2,truthMatrix);
+    if(m2->type.dimen != PS_DIMEN_IMAGE) {
+        psError(PS_ERR_UNKNOWN,true,"Resulting image is not PS_DIMEN_IMAGE");
+        return 10;
+    } else if(m2 != tempImage) {
+        psError(PS_ERR_UNKNOWN,true,"Return pointer not equal to output argument pointer");
+        return 11;
+    }
+    tempImage_32 = m2_32;
+    m2_32 = psVectorToMatrix(m2_32, v2_32);
+    CHECK_MATRIX(m2_32,truthMatrix_32);
+    if(m2_32->type.dimen != PS_DIMEN_IMAGE) {
+        psError(PS_ERR_UNKNOWN,true,"Resulting image is not PS_DIMEN_IMAGE");
+        return 10;
+    } else if(m2_32 != tempImage_32) {
+        psError(PS_ERR_UNKNOWN,true,"Return pointer not equal to output argument pointer");
+        return 11;
+    }
+    printFooter(stdout, "psMatrix", "Convert PS_DIMEN_VECTOR vector to matrix", true);
+
+
+    // Test G - Attempt to use null input vector argument
+    printNegativeTestHeader(stdout,"psMatrix", "Attempt to use null input vector argument",
+                            "Invalid operation: inVector or its data is NULL.", 0);
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message");
+    if(psVectorToMatrix(m2, NULL) != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Did not return output image");
+        return 12;
+    }
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message");
+    if(psVectorToMatrix(m2_32, NULL) != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Did not return output image");
+        return 13;
+    }
+    printFooter(stdout, "psMatrix", "Attempt to use null input vector argument", true);
+
+
+    // Test H - Convert PS_DIMEN_TRANSV vector to matrix
+    printPositiveTestHeader(stdout, "psMatrix", "Convert PS_DIMEN_TRANSV vector to matrix");
+    v2->type.dimen = PS_DIMEN_TRANSV;
+    tempImage = m3;
+    psVectorToMatrix(m3, v2);
+    CHECK_MATRIX(m3, truthMatrix);
+    if(m3->type.dimen != PS_DIMEN_IMAGE) {
+        psError(PS_ERR_UNKNOWN,true,"Resulting image is not PS_DIMEN_IMAGE");
+        return 14;
+    } else if(m3 != tempImage) {
+        psError(PS_ERR_UNKNOWN,true,"Return pointer not equal to output argument pointer");
+        return 15;
+    }
+    v2_32->type.dimen = PS_DIMEN_TRANSV;
+    tempImage_32 = m3_32;
+    psVectorToMatrix(m3_32, v2_32);
+    CHECK_MATRIX(m3_32, truthMatrix_32);
+    if(m3_32->type.dimen != PS_DIMEN_IMAGE) {
+        psError(PS_ERR_UNKNOWN,true,"Resulting image is not PS_DIMEN_IMAGE");
+        return 16;
+    } else if(m3_32 != tempImage_32) {
+        psError(PS_ERR_UNKNOWN,true,"Return pointer not equal to output argument pointer");
+        return 17;
+    }
+    printFooter(stdout, "psMatrix", "Convert PS_DIMEN_TRANSV vector to matrix", true);
+
+
+    // Test I - Free input and output images
+    printPositiveTestHeader(stdout, "psMatrix", "Free input and output images and vectors");
+    psFree(m1);
+    psFree(v1);
+    psFree(v2);
+    psFree(v3);
+    psFree(m3);
+    psFree(m4);
+    psFree(m1_32);
+    psFree(v1_32);
+    psFree(v2_32);
+    psFree(v3_32);
+    psFree(m3_32);
+    psFree(m4_32);
+    psFree(badImage);
+    psFree(badImage_32);
+    if( psMemCheckLeaks(0, NULL, stdout, false) != 0) {
+        psError(PS_ERR_UNKNOWN,true,"Memory leaks detected.");
+        return 10;
+    }
+    psS32 nBad = psMemCheckCorruption(0);
+    if(nBad) {
+        printf("ERROR: Found %d bad memory blocks\n", nBad);
+    }
+    printFooter(stdout, "psMatrix" ,"Free input and output images and vectors", true);
+
+    return 0;
+}
Index: /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psMatrixVectorArithmetic01.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psMatrixVectorArithmetic01.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psMatrixVectorArithmetic01.c	(revision 22331)
@@ -0,0 +1,205 @@
+/** @file  tst_psMatrixVectorArithmetic01.c
+ *
+ *  @brief Test driver for psMatrixVector arithmetic functions
+ *
+ *  This test driver tests combinations of matrix, vector, and scalar binary operations including:
+ *     Matrix-matrix with +,-,*,/ with S32, F32, F64, C32
+ *     Matrix-vector with +,-,*,/ with S32, F32, F64, C32
+ *     Matrix-scalar with +,-,*,/ with S32, F32, F64, C32
+ *
+ *  @author  Ross Harman, MHPCC
+ *
+ *  @version $Revision: 1.8 $  $Name: not supported by cvs2svn $
+ *  @date  $Date: 2005-04-07 20:27:42 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ *
+ */
+
+#include "pslib_strict.h"
+#include "psTest.h"
+
+#define PRINT_SCALAR(SCALAR,TYPE)                                                                            \
+if(PS_IS_PSELEMTYPE_COMPLEX(SCALAR->type.type)) {                                                        \
+    printf("%f+%fi ", creal(SCALAR->data.TYPE), cimag(SCALAR->data.TYPE));                               \
+} else if(PS_IS_PSELEMTYPE_INT(SCALAR->type.type)) {                                                     \
+    printf("%d ", (psS32)SCALAR->data.TYPE);                                                               \
+} else {                                                                                                 \
+    printf("%f ", (double)SCALAR->data.TYPE);                                                            \
+}                                                                                                        \
+printf("\n\n");
+
+#define PRINT_VECTOR(VECTOR,TYPE)                                                                            \
+for(psS32 i=0; i<VECTOR->n; i++) {                                                                         \
+    if(PS_IS_PSELEMTYPE_COMPLEX(VECTOR->type.type)) {                                                    \
+        printf("%f+%fi ", creal(VECTOR->data.TYPE[i]), cimag(VECTOR->data.TYPE[i]));                     \
+    } else if(PS_IS_PSELEMTYPE_INT(VECTOR->type.type)) {                                                 \
+        printf("%d ", (psS32)VECTOR->data.TYPE[i]);                                                        \
+    } else {                                                                                             \
+        printf("%f ", (double)VECTOR->data.TYPE[i]);                                                     \
+    }                                                                                                    \
+}                                                                                                        \
+printf("\n\n");
+
+
+#define PRINT_MATRIX(IMAGE,TYPE)                                                                             \
+for(psS32 i=IMAGE->numRows-1; i>-1; i--) {                                                                 \
+    for(psS32 j=0; j<IMAGE->numCols; j++) {                                                                \
+        if(PS_IS_PSELEMTYPE_COMPLEX(IMAGE->type.type)) {                                                 \
+            printf("%f+%fi ", creal(IMAGE->data.TYPE[i][j]), cimag(IMAGE->data.TYPE[i][j]));             \
+        } else if(PS_IS_PSELEMTYPE_INT(IMAGE->type.type)) {                                              \
+            printf("%d ", (psS32)IMAGE->data.TYPE[i][j]);                                                  \
+        } else {                                                                                         \
+            printf("%f ", (double)IMAGE->data.TYPE[i][j]);                                               \
+        }                                                                                                \
+    }                                                                                                    \
+    printf("\n");                                                                                        \
+}                                                                                                        \
+printf("\n");
+
+
+#define CREATE_AND_SET_VECTOR(NAME,TYPE,VALUE,SIZE)                                                          \
+psVector *NAME = (psVector*)psVectorAlloc(SIZE, PS_TYPE_##TYPE);                                         \
+for(psS32 i=0; i<SIZE; i++) {                                                                              \
+    NAME->data.TYPE[i] = VALUE;                                                                          \
+}                                                                                                        \
+NAME->n = SIZE;
+
+
+#define CREATE_AND_SET_IMAGE(NAME,TYPE,VALUE,NROWS,NCOLS)                                                    \
+psImage *NAME = (psImage*)psImageAlloc(NCOLS,NROWS,PS_TYPE_##TYPE);                                      \
+for(psS32 i=0; i<NAME->numRows; i++) {                                                                     \
+    for(psS32 j=0; j<NAME->numCols; j++) {                                                                 \
+        NAME->data.TYPE[i][j] = VALUE;                                                                   \
+    }                                                                                                    \
+}
+
+
+#define CHECK_MEMORY                                                                                     \
+if(psMemCheckLeaks(0, NULL, stdout, false) != 0 ) {                                                             \
+    psError(PS_ERR_UNKNOWN,true,"Memory leaks detected.");                                                \
+    return 10;                                                                                            \
+}                                                                                                        \
+psS32 nBad = psMemCheckCorruption(0);                                                                    \
+if(nBad) {                                                                                               \
+    printf("ERROR: Found %d bad memory blocks\n", nBad);                                                 \
+}
+
+
+psS32 main(psS32 argc, char* argv[])
+{
+
+    // Test matrix-matrix binary operations
+    #define testBinaryOpMM(OP,TYPE,VALUE1,VALUE2,NROWS,NCOLS)                                                \
+    {                                                                                                        \
+        printPositiveTestHeader(stdout, "psMatrixVectorArithmetic", "Test matrix-matrix psBinaryOp");        \
+        printf("Operation: %s\n", #OP);                                                                      \
+        CREATE_AND_SET_IMAGE(inImage,TYPE,VALUE1,NROWS,NCOLS);                                               \
+        CREATE_AND_SET_IMAGE(outImage,TYPE,VALUE2,NROWS,NCOLS);                                              \
+        printf("Input:\n");                                                                                  \
+        PRINT_MATRIX(inImage,TYPE);                                                                          \
+        PRINT_MATRIX(outImage,TYPE);                                                                         \
+        outImage = (psImage*)psBinaryOp(outImage, inImage, #OP, outImage);                                   \
+        printf("Output:\n");                                                                                 \
+        PRINT_MATRIX(outImage,TYPE);                                                                         \
+        psFree(inImage);                                                                                     \
+        psFree(outImage);                                                                                    \
+        CHECK_MEMORY;                                                                                        \
+        printFooter(stdout, "psMatrixVectorArithmetic", "Test matrix-matrix psBinaryOp", true);              \
+    }
+
+    testBinaryOpMM(+,S32,10,10,3,2);
+    testBinaryOpMM(+,F32,10.0,10.0,3,2);
+    testBinaryOpMM(+,F64,10.0,10.0,3,2);
+    testBinaryOpMM(+,C32,10.0+10.0i,10.0+10.0i,3,2);
+    testBinaryOpMM(-,S32,20,10,3,2);
+    testBinaryOpMM(-,F32,20.0,10.0,3,2);
+    testBinaryOpMM(-,F64,20.0,10.0,3,2);
+    testBinaryOpMM(*,C32,20.0+20.0i,10.0+10.0i,3,2);
+    testBinaryOpMM(*,S32,20,10,3,2);
+    testBinaryOpMM(*,F32,20.0,10.0,3,2);
+    testBinaryOpMM(*,F64,20.0,10.0,3,2);
+    testBinaryOpMM(*,C32,20.0+20.0i,10.0+10.0i,3,2);
+    testBinaryOpMM(/,C32,20.0+20.0i,10.0+10.0i,3,2);
+    testBinaryOpMM(/,S32,20,10,3,2);
+    testBinaryOpMM(/,F32,20.0,10.0,3,2);
+    testBinaryOpMM(/,F64,20.0,10.0,3,2);
+    testBinaryOpMM(/,C32,20.0+20.0i,10.0+10.0i,3,2);
+
+    // Test Matrix-Vector binary operations
+    #define testBinaryOpMV(OP,TYPE,VALUE1,VALUE2,NROWS,NCOLS)                                                \
+    {                                                                                                        \
+        printPositiveTestHeader(stdout, "psMatrixVectorArithmetic", "Test matrix-vector psBinaryOp");        \
+        printf("Operation: %s\n", #OP);                                                                      \
+        CREATE_AND_SET_IMAGE(outImage,TYPE,VALUE1,NROWS,NCOLS);                                              \
+        CREATE_AND_SET_VECTOR(inVector,TYPE,VALUE2,NROWS);                                                   \
+        printf("Input:\n");                                                                                  \
+        PRINT_MATRIX(outImage,TYPE);                                                                         \
+        PRINT_VECTOR(inVector,TYPE);                                                                         \
+        outImage = (psImage*)psBinaryOp(outImage, outImage, #OP, inVector);                                  \
+        printf("Output:\n");                                                                                 \
+        PRINT_MATRIX(outImage,TYPE);                                                                         \
+        psFree(inVector);                                                                                    \
+        psFree(outImage);                                                                                    \
+        CHECK_MEMORY;                                                                                        \
+        printFooter(stdout, "psMatrixVectorArithmetic", "Test matrix-vector psBinaryOp", true);              \
+    }
+
+    testBinaryOpMV(+,S32,10,5,3,2);
+    testBinaryOpMV(+,F32,10.0,5.0,3,2);
+    testBinaryOpMV(+,F64,10.0,5.0,3,2);
+    testBinaryOpMV(+,C32,10.0+10.0i,5.0+5.0i,3,2);
+    testBinaryOpMV(-,S32,20,5,3,2);
+    testBinaryOpMV(-,F32,20.0,5.0,3,2);
+    testBinaryOpMV(-,F64,20.0,5.0,3,2);
+    testBinaryOpMV(*,C32,20.0+20.0i,5.0+5.0i,3,2);
+    testBinaryOpMV(*,S32,20,5,3,2);
+    testBinaryOpMV(*,F32,20.0,5.0,3,2);
+    testBinaryOpMV(*,F64,20.0,5.0,3,2);
+    testBinaryOpMV(*,C32,20.0+20.0i,5.0+5.0i,3,2);
+    testBinaryOpMV(/,C32,20.0+20.0i,5.0+5.0i,3,2);
+    testBinaryOpMV(/,S32,20,5,3,2);
+    testBinaryOpMV(/,F32,20.0,5.0,3,2);
+    testBinaryOpMV(/,F64,20.0,5.0,3,2);
+    testBinaryOpMV(/,C32,20.0+20.0i,5.0+5.0i,3,2);
+
+    // Test Matrix-Scalar binary operations
+    #define testBinaryOpMS(OP,TYPE,VALUE1,VALUE2,NROWS,NCOLS)                                                \
+    {                                                                                                        \
+        printPositiveTestHeader(stdout, "psMatrixVectorArithmetic", "Test matrix-scalar psBinaryOp");        \
+        printf("Operation: %s\n", #OP);                                                                      \
+        CREATE_AND_SET_IMAGE(outImage,TYPE,VALUE1,NROWS,NCOLS);                                              \
+        psScalar *inScalar = (psScalar*)psScalarAlloc(VALUE2,PS_TYPE_##TYPE);                                \
+        printf("Input:\n");                                                                                  \
+        PRINT_MATRIX(outImage,TYPE);                                                                         \
+        PRINT_SCALAR(inScalar,TYPE);                                                                         \
+        outImage = (psImage*)psBinaryOp(outImage, outImage, #OP, psScalarCopy(inScalar));                    \
+        printf("Output:\n");                                                                                 \
+        PRINT_MATRIX(outImage,TYPE);                                                                         \
+        psFree(inScalar);                                                                                    \
+        psFree(outImage);                                                                                    \
+        CHECK_MEMORY;                                                                                        \
+        printFooter(stdout, "psMatrixVectorArithmetic", "Test matrix-scalar psBinaryOp", true);              \
+    }
+
+    testBinaryOpMS(+,S32,10,5,3,2);
+    testBinaryOpMS(+,F32,10.0,5.0,3,2);
+    testBinaryOpMS(+,F64,10.0,5.0,3,2);
+    testBinaryOpMS(+,C32,10.0+10.0i,5.0+5.0i,3,2);
+    testBinaryOpMS(-,S32,20,5,3,2);
+    testBinaryOpMS(-,F32,20.0,5.0,3,2);
+    testBinaryOpMS(-,F64,20.0,5.0,3,2);
+    testBinaryOpMS(*,C32,20.0+20.0i,5.0+5.0i,3,2);
+    testBinaryOpMS(*,S32,20,5,3,2);
+    testBinaryOpMS(*,F32,20.0,5.0,3,2);
+    testBinaryOpMS(*,F64,20.0,5.0,3,2);
+    testBinaryOpMS(*,C32,20.0+20.0i,5.0+5.0i,3,2);
+    testBinaryOpMS(/,C32,20.0+20.0i,5.0+5.0i,3,2);
+    testBinaryOpMS(/,S32,20,5,3,2);
+    testBinaryOpMS(/,F32,20.0,5.0,3,2);
+    testBinaryOpMS(/,F64,20.0,5.0,3,2);
+    testBinaryOpMS(/,C32,20.0+20.0i,5.0+5.0i,3,2);
+
+    return 0;
+}
+
Index: /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psMatrixVectorArithmetic02.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psMatrixVectorArithmetic02.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psMatrixVectorArithmetic02.c	(revision 22331)
@@ -0,0 +1,269 @@
+
+/** @file  tst_psMatrixVectorArithmetic02.c
+ *
+ *  @brief Test driver for psMatrixVector arithmetic functions
+ *
+ *  This test driver tests combinations of matrix, vector, and scalar unary operations including:
+ *     Matrix with all math operators with S32, F32, F64, C32
+ *     Vector with all math operators with S32, F32, F64, C32
+ *
+ *  @author  Ross Harman, MHPCC
+ *
+ *  @version $Revision: 1.12 $  $Name: not supported by cvs2svn $
+ *  @date  $Date: 2005-04-07 20:27:42 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ *
+ */
+
+#include "pslib_strict.h"
+#include "psTest.h"
+
+#include <math.h>
+
+
+#define CHECK_VECTOR(VECTOR,TYPE,TRUTH)                                                                      \
+for(psS32 i=0; i<VECTOR->n; i++) {                                                                             \
+    if(cabs(VECTOR->data.TYPE[i])-cabs(TRUTH) > FLT_EPSILON){                                                \
+        printf("ERROR:Truth and calculated values don't match for vector operation:\n");                     \
+        if(PS_IS_PSELEMTYPE_COMPLEX(VECTOR->type.type)) {                                                    \
+            printf("Truth: %.2f%+.2fi\n", creal(VECTOR->data.TYPE[i]), cimag(VECTOR->data.TYPE[i]));         \
+            printf("Calculated: %.2f%+.2fi\n", creal(TRUTH), cimag(TRUTH));                                  \
+        } else if(PS_IS_PSELEMTYPE_INT(VECTOR->type.type)) {                                                 \
+            printf("Truth: %d\n", (psS32)(VECTOR->data.TYPE[i]));                                              \
+            printf("Calculated: %d\n", (psS32)(TRUTH));                                                        \
+        } else {                                                                                             \
+            printf("Truth: %.2f\n", (double)(VECTOR->data.TYPE[i]));                                         \
+            printf("Calculated: %.2f\n", (double)(TRUTH));                                                   \
+        }                                                                                                    \
+    }                                                                                                        \
+}                                                                                                            \
+printf("\n");
+
+
+#define CHECK_MATRIX(IMAGE,TYPE,TRUTH)                                                                       \
+for(psS32 i=IMAGE->numRows-1; i>-1; i--) {                                                                     \
+    for(psS32 j=0; j<IMAGE->numCols; j++) {                                                                    \
+        if(cabs(IMAGE->data.TYPE[i][j])-cabs(TRUTH) > FLT_EPSILON){                                          \
+            printf("ERROR:Truth and calculated values don't match for matrix operation:\n");                 \
+            if(PS_IS_PSELEMTYPE_COMPLEX(IMAGE->type.type)) {                                                 \
+                printf("Truth: %.2f%+.2fi\n", creal(IMAGE->data.TYPE[i][j]), cimag(IMAGE->data.TYPE[i][j])); \
+                printf("Calculated: %.2f%+.2fi\n", creal(TRUTH), cimag(TRUTH));                              \
+            } else if(PS_IS_PSELEMTYPE_INT(IMAGE->type.type)) {                                              \
+                printf("Truth: %d\n", (psS32)(IMAGE->data.TYPE[i][j]));                                        \
+                printf("Calculated: %d\n", (psS32)(TRUTH));                                                    \
+            } else {                                                                                         \
+                printf("Truth: %.2f\n", (double)(IMAGE->data.TYPE[i][j]));                                   \
+                printf("Calculated: %.2f\n", (double)(TRUTH));                                               \
+            }                                                                                                \
+        }                                                                                                    \
+    }                                                                                                        \
+    printf("\n");                                                                                            \
+}                                                                                                            \
+printf("\n");
+
+
+#define CREATE_AND_SET_VECTOR(NAME,TYPE,VALUE,SIZE)                                                          \
+psVector *NAME = (psVector*)psVectorAlloc(SIZE, PS_TYPE_##TYPE);                                             \
+for(psS32 i=0; i<SIZE; i++) {                                                                                  \
+    NAME->data.TYPE[i] = VALUE;                                                                              \
+}                                                                                                            \
+NAME->n = SIZE;
+
+
+#define CREATE_AND_SET_IMAGE(NAME,TYPE,VALUE,NROWS,NCOLS)                                                    \
+psImage *NAME = (psImage*)psImageAlloc(NCOLS,NROWS,PS_TYPE_##TYPE);                                          \
+for(psS32 i=0; i<NAME->numRows; i++) {                                                                         \
+    for(psS32 j=0; j<NAME->numCols; j++) {                                                                     \
+        NAME->data.TYPE[i][j] = VALUE;                                                                       \
+    }                                                                                                        \
+}
+
+
+#define CHECK_MEMORY \
+if( psMemCheckLeaks(0, NULL, stdout, false) != 0 ) {  \
+    psError(PS_ERR_UNKNOWN, true,"Memory leaks detected."); \
+    return 50; \
+} \
+psS32 nBad = psMemCheckCorruption(0); \
+if(nBad) { \
+    psError(PS_ERR_UNKNOWN, true,"ERROR: Found %d bad memory blocks\n", nBad); \
+    return 51; \
+}
+
+
+psS32 main( psS32 argc, char* argv[] )
+{
+
+    // Test matrix unary operations
+    #define testUnaryOpM(OP,TYPE,VALUE1,VALUE2,NROWS,NCOLS,TRUTH)                                            \
+    {                                                                                                        \
+        printPositiveTestHeader(stdout, "psMatrixVectorArithmetic", "Test matrix psUnaryOp");                \
+        printf("Operation: %s\n", #OP);                                                                      \
+        CREATE_AND_SET_IMAGE(inImage,TYPE,VALUE1,NROWS,NCOLS);                                               \
+        CREATE_AND_SET_IMAGE(outImage,TYPE,VALUE2,NROWS,NCOLS);                                              \
+        outImage = (psImage*)psUnaryOp(outImage, inImage, #OP);                                              \
+        CHECK_MATRIX(outImage,TYPE,TRUTH);                                                                   \
+        psFree(inImage);                                                                                     \
+        psFree(outImage);                                                                                    \
+        CHECK_MEMORY;                                                                                        \
+        printFooter(stdout, "psMatrixVectorArithmetic", "Test matrix psUnaryOp", true);                      \
+    }
+
+    testUnaryOpM( abs, S32, -10, 0, 3, 2, 10 );
+    testUnaryOpM( abs, F32, -10.0, 0.0, 3, 2, 10.0 );
+    testUnaryOpM( abs, F64, -10.0, 0.0, 3, 2, 10.0 );
+    testUnaryOpM( abs, C32, -10.0 - 10.0i, 0.0 + 0.0i, 3, 2,10+10i );
+    testUnaryOpM( exp, S32, 10, 0, 3, 2, cexp(10));
+    testUnaryOpM( exp, F32, 10.0, 0.0, 3, 2, cexp(10.0) );
+    testUnaryOpM( exp, F64, 10.0, 0.0, 3, 2, cexp(10.0) );
+    testUnaryOpM( exp, C32, 1.0 + 1.0i, 0.0 + 0.0i, 3, 2, cexp(1.0+1.0i) );
+    testUnaryOpM( ln, S32, 10, 0, 3, 2, clog(10) );
+    testUnaryOpM( ln, F32, 10.0, 0.0, 3, 2, clog(10.0) );
+    testUnaryOpM( ln, F64, 10.0, 0.0, 3, 2, clog(10.0) );
+    testUnaryOpM( ln, C32, 10.0 + 10.0i, 0.0 + 0.0i, 3, 2, clog(10.0+10.0i) );
+    testUnaryOpM( ten, S32, 3, 0, 3, 2, 1000 );
+    testUnaryOpM( ten, F32, 3.0, 0.0, 3, 2, 1000 );
+    testUnaryOpM( ten, F64, 3.0, 0.0, 3, 2, 1000 );
+    testUnaryOpM( ten, C32, 1.0 + 0.0i, 0.0 + 0.0i, 3, 2, 10.0 );
+    testUnaryOpM( log, S32, 1000, 0, 3, 2, 3 );
+    testUnaryOpM( log, F32, 1000.0, 0.0, 3, 2, 3 );
+    testUnaryOpM( log, F64, 1000.0, 0.0, 3, 2, 3 );
+    testUnaryOpM( log, C32, 1000.0 + 0.0i, 0.0 + 0.0i, 3, 2, 3 );
+    testUnaryOpM( sin, S32, PS_PI_2, 0, 3, 2, 1 );
+    testUnaryOpM( sin, F32, PS_PI_2, 0.0, 3, 2, 1.0 );
+    testUnaryOpM( sin, F64, PS_PI_2, 0.0, 3, 2, 1.0 );
+    testUnaryOpM( sin, C32, PS_PI_2 + 0.0i, 0.0 + 0.0i, 3, 2, 1.0 );
+    testUnaryOpM( dsin, S32, 90, 0, 3, 2 , 1);
+    testUnaryOpM( dsin, F32, 90.0, 0.0, 3, 2, 1.0 );
+    testUnaryOpM( dsin, F64, 90.0, 0.0, 3, 2, 1.0 );
+    testUnaryOpM( dsin, C32, 90.0 + 00.0i, 0.0 + 0.0i, 3, 2, 1.0 );
+    testUnaryOpM( cos, S32, 0, 0, 3, 2, 1 );
+    testUnaryOpM( cos, F32, 0.0, 0.0, 3, 2, 1.0 );
+    testUnaryOpM( cos, F64, 0.0, 0.0, 3, 2, 1.0 );
+    testUnaryOpM( cos, C32, 0.0 + 0.0i, 0.0 + 0.0i, 3, 2, 1.0 );
+    testUnaryOpM( dcos, S32, 0, 0, 3, 2, 1 );
+    testUnaryOpM( dcos, F32, 0.0, 0.0, 3, 2, 1.0 );
+    testUnaryOpM( dcos, F64, 0.0, 0.0, 3, 2, 1.0 );
+    testUnaryOpM( dcos, C32, 0.0 + 0.0i, 0.0 + 0.0i, 3, 2, 1.0 );
+    testUnaryOpM( tan, S32, PS_PI_4, 0, 3, 2, 1);
+    testUnaryOpM( tan, F32, PS_PI_4, 0.0, 3, 2, 1.0 );
+    testUnaryOpM( tan, F64, PS_PI_4, 0.0, 3, 2, 1.0 );
+    testUnaryOpM( tan, C32, PS_PI_4 + 0.0i, 0.0 + 0.0i, 3, 2, 1 );
+    testUnaryOpM( dtan, S32, 45, 0, 3, 2, 1 );
+    testUnaryOpM( dtan, F32, 45.0, 0.0, 3, 2, 1.0 );
+    testUnaryOpM( dtan, F64, 45.0, 0.0, 3, 2, 1.0 );
+    testUnaryOpM( dtan, C32, 45.0 + 45.0i, 0.0 + 0.0i, 3, 2, 1.0 );
+    testUnaryOpM( asin, S32, 1, 0, 3, 2, PS_PI_2);
+    testUnaryOpM( asin, F32, 1.0, 0.0, 3, 2, PS_PI_2  );
+    testUnaryOpM( asin, F64, 1.0, 0.0, 3, 2, PS_PI_2);
+    testUnaryOpM( asin, C32, 1.0 + 1.0i, 0.0 + 0.0i, 3, 2, PS_PI_2);
+    testUnaryOpM( dasin, S32, 1.0, 0, 3, 2, 90 );
+    testUnaryOpM( dasin, F32, 1.0, 0.0, 3, 2, 90.0 );
+    testUnaryOpM( dasin, F64, 1.0, 0.0, 3, 2, 90.0 );
+    testUnaryOpM( dasin, C32, 1.0 + 1.0i, 0.0 + 0.0i, 3, 2, 90.0 );
+    testUnaryOpM( acos, S32, 0, 0, 3, 2, PS_PI_2);
+    testUnaryOpM( acos, F32, 0.0, 0.0, 3, 2, PS_PI_2 );
+    testUnaryOpM( acos, F64, 0.0, 0.0, 3, 2, PS_PI_2 );
+    testUnaryOpM( acos, C32, 0.0 + 0.0i, 0.0 + 0.0i, 3, 2, PS_PI_2 );
+    testUnaryOpM( dacos, S32, 0, 0, 3, 2, 90 );
+    testUnaryOpM( dacos, F32, 0.0, 0.0, 3, 2, 90.0 );
+    testUnaryOpM( dacos, F64, 0.0, 0.0, 3, 2, 90.0 );
+    testUnaryOpM( dacos, C32, 0.0 + 0.0i, 0.0 + 0.0i, 3, 2, 90.0 );
+    testUnaryOpM( atan, S32, 1, 0, 3, 2, PS_PI_4);
+    testUnaryOpM( atan, F32, 1.0, 0.0, 3, 2, PS_PI_4 );
+    testUnaryOpM( atan, F64, 1.0, 0.0, 3, 2, PS_PI_4);
+    testUnaryOpM( atan, C32, 1.0 + 0.0i, 0.0 + 0.0i, 3, 2, PS_PI_4);
+    testUnaryOpM( datan, S32, 1, 0, 3, 2, 45 );
+    testUnaryOpM( datan, F32, 1.0, 0.0, 3, 2, 45.0 );
+    testUnaryOpM( datan, F64, 1.0, 0.0, 3, 2, 45.0 );
+    testUnaryOpM( datan, C32, 1.0 + 0.0i, 0.0 + 0.0i, 3, 2, 45.0 );
+
+
+    // Test vector unary operations
+    #define testUnaryOpV(OP,TYPE,VALUE1,VALUE2,SIZE,TRUTH)                                                   \
+    {                                                                                                        \
+        printPositiveTestHeader(stdout, "psMatrixVectorArithmetic", "Test vector psUnaryOp");                \
+        printf("Operation: %s\n", #OP);                                                                      \
+        CREATE_AND_SET_VECTOR(inVector,TYPE,VALUE1,SIZE);                                                    \
+        CREATE_AND_SET_VECTOR(outVector,TYPE,VALUE2,SIZE);                                                   \
+        outVector = (psVector*)psUnaryOp(outVector, inVector, #OP);                                          \
+        CHECK_VECTOR(outVector,TYPE,TRUTH);                                                                  \
+        psFree(inVector);                                                                                    \
+        psFree(outVector);                                                                                   \
+        CHECK_MEMORY;                                                                                        \
+        printFooter(stdout, "psMatrixVectorArithmetic", "Test vector psUnaryOp", true);                      \
+    }
+
+    testUnaryOpV( abs, S32, -10, 0, 3, 10 );
+    testUnaryOpV( abs, F32, -10.0, 0.0, 3, 10.0 );
+    testUnaryOpV( abs, F64, -10.0, 0.0, 3, 10.0 );
+    testUnaryOpV( abs, C32, -10.0 - 10.0i, 0.0 + 0.0i, 3, 10+10i );
+    testUnaryOpV( exp, S32, 10, 0, 3, cexp(10));
+    testUnaryOpV( exp, F32, 10.0, 0.0, 3, cexp(10.0) );
+    testUnaryOpV( exp, F64, 10.0, 0.0, 3, cexp(10.0) );
+    testUnaryOpV( exp, C32, 1.0 + 1.0i, 0.0 + 0.0i, 3, cexp(1.0+1.0i) );
+    testUnaryOpV( ln, S32, 10, 0, 3, clog(10) );
+    testUnaryOpV( ln, F32, 10.0, 0.0, 3, clog(10.0) );
+    testUnaryOpV( ln, F64, 10.0, 0.0, 3, clog(10.0) );
+    testUnaryOpV( ln, C32, 10.0 + 10.0i, 0.0 + 0.0i, 3, clog(10.0+10.0i) );
+    testUnaryOpV( ten, S32, 3, 0, 3, 1000 );
+    testUnaryOpV( ten, F32, 3.0, 0.0, 3, 1000 );
+    testUnaryOpV( ten, F64, 3.0, 0.0, 3, 1000 );
+    testUnaryOpV( ten, C32, 1.0 + 0.0i, 0.0 + 0.0i, 3, 10.0 );
+    testUnaryOpV( log, S32, 1000, 0, 3,  3 );
+    testUnaryOpV( log, F32, 1000.0, 0.0, 3, 3 );
+    testUnaryOpV( log, F64, 1000.0, 0.0, 3, 3 );
+    testUnaryOpV( log, C32, 1000.0 + 0.0i, 0.0 + 0.0i, 3, 3 );
+    testUnaryOpV( sin, S32, PS_PI_2, 0, 3, 1 );
+    testUnaryOpV( sin, F32, PS_PI_2, 0.0, 3, 1.0 );
+    testUnaryOpV( sin, F64, PS_PI_2, 0.0, 3, 1.0 );
+    testUnaryOpV( sin, C32, PS_PI_2 + 0.0i, 0.0 + 0.0i, 3, 1.0 );
+    testUnaryOpV( dsin, S32, 90, 0, 3, 1);
+    testUnaryOpV( dsin, F32, 90.0, 0.0, 3, 1.0 );
+    testUnaryOpV( dsin, F64, 90.0, 0.0, 3, 1.0 );
+    testUnaryOpV( dsin, C32, 90.0 + 00.0i, 0.0 + 0.0i, 3, 1.0 );
+    testUnaryOpV( cos, S32, 0, 0, 3, 1 );
+    testUnaryOpV( cos, F32, 0.0, 0.0, 3, 1.0 );
+    testUnaryOpV( cos, F64, 0.0, 0.0, 3, 1.0 );
+    testUnaryOpV( cos, C32, 0.0 + 0.0i, 0.0 + 0.0i, 3, 1.0 );
+    testUnaryOpV( dcos, S32, 0, 0, 3, 1 );
+    testUnaryOpV( dcos, F32, 0.0, 0.0, 3, 1.0 );
+    testUnaryOpV( dcos, F64, 0.0, 0.0, 3, 1.0 );
+    testUnaryOpV( dcos, C32, 0.0 + 0.0i, 0.0 + 0.0i, 3, 1.0 );
+    testUnaryOpV( tan, S32, PS_PI_4, 0, 3, 1);
+    testUnaryOpV( tan, F32, PS_PI_4, 0.0, 3, 1.0 );
+    testUnaryOpV( tan, F64, PS_PI_4, 0.0, 3, 1.0 );
+    testUnaryOpV( tan, C32, PS_PI_4 + 0.0i, 0.0 + 0.0i, 3, 1 );
+    testUnaryOpV( dtan, S32, 45, 0, 3, 1 );
+    testUnaryOpV( dtan, F32, 45.0, 0.0, 3, 1.0 );
+    testUnaryOpV( dtan, F64, 45.0, 0.0, 3, 1.0 );
+    testUnaryOpV( dtan, C32, 45.0 + 45.0i, 0.0 + 0.0i, 3, 1.0 );
+    testUnaryOpV( asin, S32, 1, 0, 3, PS_PI_2);
+    testUnaryOpV( asin, F32, 1.0, 0.0, 3, PS_PI_2  );
+    testUnaryOpV( asin, F64, 1.0, 0.0, 3, PS_PI_2);
+    testUnaryOpV( asin, C32, 1.0 + 1.0i, 0.0 + 0.0i, 3, PS_PI_2);
+    testUnaryOpV( dasin, S32, 1.0, 0, 3, 90 );
+    testUnaryOpV( dasin, F32, 1.0, 0.0, 3, 90.0 );
+    testUnaryOpV( dasin, F64, 1.0, 0.0, 3, 90.0 );
+    testUnaryOpV( dasin, C32, 1.0 + 1.0i, 0.0 + 0.0i, 3, 90.0 );
+    testUnaryOpV( acos, S32, 0, 0, 3, PS_PI_2);
+    testUnaryOpV( acos, F32, 0.0, 0.0, 3, PS_PI_2 );
+    testUnaryOpV( acos, F64, 0.0, 0.0, 3, PS_PI_2 );
+    testUnaryOpV( acos, C32, 0.0 + 0.0i, 0.0 + 0.0i, 3, PS_PI_2 );
+    testUnaryOpV( dacos, S32, 0, 0, 3, 90 );
+    testUnaryOpV( dacos, F32, 0.0, 0.0, 3, 90.0 );
+    testUnaryOpV( dacos, F64, 0.0, 0.0, 3, 90.0 );
+    testUnaryOpV( dacos, C32, 0.0 + 0.0i, 0.0 + 0.0i, 3, 90.0 );
+    testUnaryOpV( atan, S32, 1, 0, 3, PS_PI_4);
+    testUnaryOpV( atan, F32, 1.0, 0.0, 3, PS_PI_4 );
+    testUnaryOpV( atan, F64, 1.0, 0.0, 3, PS_PI_4);
+    testUnaryOpV( atan, C32, 1.0 + 0.0i, 0.0 + 0.0i, 3, PS_PI_4);
+    testUnaryOpV( datan, S32, 1, 0, 3, 45 );
+    testUnaryOpV( datan, F32, 1.0, 0.0, 3, 45.0 );
+    testUnaryOpV( datan, F64, 1.0, 0.0, 3, 45.0 );
+    testUnaryOpV( datan, C32, 1.0 + 0.0i, 0.0 + 0.0i, 3, 45.0 );
+
+    return 0;
+}
+
Index: /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psMatrixVectorArithmetic03.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psMatrixVectorArithmetic03.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psMatrixVectorArithmetic03.c	(revision 22331)
@@ -0,0 +1,314 @@
+/** @file  tst_psMatrixVectorArithmetic03.c
+ *
+ *  @brief Test driver for psMatrixVector arithmetic functions
+ *
+ *  This test driver contains negative tests for psBinaryOp and psUanryOp:
+ *     Check for NULL arguments
+ *     Inconsistent element types
+ *     Inconsistent element count
+ *     Inconsistent dimensionality
+ *     Division by zero
+ *     Attempt to use min with complex numbers
+ *     Attempt to use max with complex numbers
+ *     Invalid operation
+ *
+ *  @author  Ross Harman, MHPCC
+ *
+ *  @version $Revision: 1.10 $  $Name: not supported by cvs2svn $
+ *  @date  $Date: 2005-04-07 20:27:42 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ *
+ */
+
+#include "pslib_strict.h"
+#include "psTest.h"
+
+#define PRINT_VECTOR(VECTOR,TYPE) \
+for(psS32 i=0; i<VECTOR->n; i++) { \
+    if(PS_IS_PSELEMTYPE_COMPLEX(VECTOR->type.type)) { \
+        printf("%f+%fi ", creal(VECTOR->data.TYPE[i]), cimag(VECTOR->data.TYPE[i])); \
+    } else if(PS_IS_PSELEMTYPE_INT(VECTOR->type.type)) { \
+        printf("%d ", (psS32)VECTOR->data.TYPE[i]); \
+    } else { \
+        printf("%f ", (double)VECTOR->data.TYPE[i]); \
+    } \
+} \
+printf("\n\n");
+
+#define PRINT_MATRIX(IMAGE,TYPE) \
+for(psS32 i=IMAGE->numRows-1; i>-1; i--) { \
+    for(psS32 j=0; j<IMAGE->numCols; j++) { \
+        if(PS_IS_PSELEMTYPE_COMPLEX(IMAGE->type.type)) { \
+            printf("%f+%fi ", creal(IMAGE->data.TYPE[i][j]), cimag(IMAGE->data.TYPE[i][j])); \
+        } else if(PS_IS_PSELEMTYPE_INT(IMAGE->type.type)) { \
+            printf("%d ", (psS32)IMAGE->data.TYPE[i][j]); \
+        } else { \
+            printf("%f ", (double)IMAGE->data.TYPE[i][j]); \
+        } \
+    } \
+    printf("\n"); \
+} \
+printf("\n");
+
+
+#define CREATE_AND_SET_VECTOR(NAME,TYPE,VALUE,SIZE) \
+psVector *NAME = (psVector*)psVectorAlloc(SIZE, PS_TYPE_##TYPE); \
+for(psS32 i=0; i<SIZE; i++) { \
+    NAME->data.TYPE[i] = VALUE; \
+} \
+NAME->n = SIZE;
+
+
+#define CREATE_AND_SET_IMAGE(NAME,TYPE,VALUE,NROWS,NCOLS) \
+psImage *NAME = (psImage*)psImageAlloc(NCOLS,NROWS,PS_TYPE_##TYPE); \
+for(psS32 i=0; i<NAME->numRows; i++) { \
+    for(psS32 j=0; j<NAME->numCols; j++) { \
+        NAME->data.TYPE[i][j] = VALUE; \
+    } \
+}
+
+
+psS32 main(psS32 argc, char* argv[])
+{
+    CREATE_AND_SET_IMAGE(image1,F64,0,3,3);
+    CREATE_AND_SET_IMAGE(image2,F64,0,3,3);
+    CREATE_AND_SET_IMAGE(image3,F32,0,3,3);
+    CREATE_AND_SET_IMAGE(image4,F64,0,2,2);
+    CREATE_AND_SET_IMAGE(image5,C32,1+1i,3,3);
+    CREATE_AND_SET_VECTOR(vector1,F64,0,2);
+    CREATE_AND_SET_VECTOR(vector2,F64,0,3);
+
+    // Check for NULL output argument
+    printPositiveTestHeader(stdout,"psBinaryOp", "Check for output generated");
+    psImage* image6 = (psImage*)psBinaryOp(NULL, image1, "+", image2);
+    if (image6 == NULL) {
+        psLogMsg(__func__,PS_LOG_ERROR,"psBinaryOp failed to make an image given no output to recycle.");
+        return 1;
+    }
+    printFooter(stdout,"psBinaryOp","Check for output generated",true);
+
+    // Check for NULL input argument #1
+    printPositiveTestHeader(stdout,"psBinaryOp","Check for null input arg 1");
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message");
+    image6 = (psImage*)psBinaryOp(image6, NULL, "+", image2);
+    if (image6 != NULL) {
+        psLogMsg(__func__,PS_LOG_ERROR,"psBinaryOp returned a result given a NULL first operand.");
+        return 2;
+    }
+    printFooter(stdout,"psBinaryOp","Check for null input arg 1",true);
+
+    // Check for NULL input argument #2
+    printPositiveTestHeader(stdout,"psBinaryOp","Check for null input arg 2");
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message");
+    image6 = (psImage*)psBinaryOp(image6, image1, "+", NULL);
+    if (image6 != NULL) {
+        psLogMsg(__func__,PS_LOG_ERROR,"psBinaryOp returned a result given a NULL second operand.");
+        return 3;
+    }
+    printFooter(stdout,"psBinaryOp","Check for null input arg 2",true);
+
+    // Check for NULL operand
+    printPositiveTestHeader(stdout,"psBinaryOp","Check for null operand");
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message");
+    image6 = (psImage*)psBinaryOp(image6, image1, NULL, image2);
+    if (image6 != NULL) {
+        psLogMsg(__func__,PS_LOG_ERROR,"psBinaryOp returned a result given a NULL operator.");
+        return 4;
+    }
+    printFooter(stdout,"psBinaryOp","Check for null operand",true);
+
+    // Check for null output
+    printPositiveTestHeader(stdout,"psUnaryOp","Check for null output");
+    image6 = (psImage*)psUnaryOp(NULL, image1, "sin");
+    if (image6 == NULL) {
+        psLogMsg(__func__,PS_LOG_ERROR,"psUnaryOp failed to make an image given no output to recycle.");
+        return 5;
+    }
+    printFooter(stdout,"psUnaryOp","Check for null output",true);
+
+    // Check for NULL input arg
+    printPositiveTestHeader(stdout,"psUnaryOp","Check for null input");
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message");
+    image6 = (psImage*)psUnaryOp(image6, NULL, "sin");
+    if (image6 != NULL) {
+        psLogMsg(__func__,PS_LOG_ERROR,"psUnaryOp returned a result given a NULL operand.");
+        return 6;
+    }
+    printFooter(stdout,"psUnaryOp","Check for null input",true);
+
+    // Check for NULL operand
+    printPositiveTestHeader(stdout,"psUnaryOp","Check for null operator");
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message");
+    image6 = (psImage*)psUnaryOp(image6, image1, NULL);
+    if (image6 != NULL) {
+        psLogMsg(__func__,PS_LOG_ERROR,"psUnaryOp returned a result given a NULL operator.");
+        return 7;
+    }
+    printFooter(stdout,"psUnaryOp","Check for null operator",true);
+
+    // Inconsistent element types
+    printPositiveTestHeader(stdout,"psBinaryOp", "Inconsistent element types");
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message");
+    image6 = (psImage*)psBinaryOp(image6, image3, "+", image2);
+    if (image6 != NULL) {
+        psLogMsg(__func__,PS_LOG_ERROR,"psBinaryOp returned a result given operands of different types.");
+        return 8;
+    }
+    printFooter(stdout,"psBinaryOp","Inconsistent element types",true);
+
+    // Check unary op to convert to correct type
+    printPositiveTestHeader(stdout,"psUnaryOp","Check output type conversion");
+    image6 = psImageCopy(image6,image2,PS_TYPE_F64);
+    image6 = (psImage*)psUnaryOp(image6, image3, "sin");
+    if (image6 == NULL || image6->type.type != PS_TYPE_F32) {
+        psLogMsg(__func__,PS_LOG_ERROR,"psUnaryOp failed to convert the type of the output.");
+        return 9;
+    }
+    printFooter(stdout,"psUnaryOp","Check output type conversion",true);
+
+    // Inconsistent element count
+    printPositiveTestHeader(stdout,"psBinaryOp","Check for inconsistent elements");
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message");
+    image6 = (psImage*)psBinaryOp(image6, image4, "+", image2);
+    if (image6 != NULL) {
+        psLogMsg(__func__,PS_LOG_ERROR,"psBinaryOp returned a result given operands of different sizes.");
+        return 10;
+    }
+    printFooter(stdout,"psBinaryOp","Check for inconsistent elements",true);
+
+    // Inconsistent element in input and output
+    printPositiveTestHeader(stdout,"psUnaryOp","Check inconsistent elements in input and output");
+    image6 = psImageCopy(image6,image2,PS_TYPE_F64);
+    image6 = (psImage*)psUnaryOp(image6, image4, "sin");
+    if (image6 == NULL ||
+            image6->numCols != image6->numCols ||
+            image6->numRows != image6->numRows) {
+        psLogMsg(__func__,PS_LOG_ERROR,"psUnaryOp failed to resize the output.");
+        return 11;
+    }
+    printFooter(stdout,"psUnaryOp","Check inconsistent elements in input and output",true);
+
+    // Inconsistent size of input 1 and input 2
+    printPositiveTestHeader(stdout,"psBinaryOp","Check inconsistent size");
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message");
+    image6 = (psImage*)psBinaryOp(image6, vector1, "+", image2);
+    if (image6 != NULL) {
+        psLogMsg(__func__,PS_LOG_ERROR,"psBinaryOp returned a result given operands of different sizes.");
+        return 12;
+    }
+    printFooter(stdout,"psBinaryOp","Check inconsistent size",true);
+
+    // Inconsistent size of input 1 and input 2
+    printPositiveTestHeader(stdout,"psBinaryOp","Check inconsistent size");
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message");
+    vector1->type.dimen = PS_DIMEN_TRANSV;
+    image6 = (psImage*)psBinaryOp(image6, vector1, "+", image2);
+    if (image6 != NULL) {
+        psLogMsg(__func__,PS_LOG_ERROR,"psBinaryOp returned a result given operands of different sizes.");
+        return 13;
+    }
+    printFooter(stdout, "psBinaryOp", "Check inconsistent size", true);
+
+
+    // Inconsistent dimensionality
+    printPositiveTestHeader(stdout,"psUnaryOp","Check inconsistent dimensionality");
+    image6 = psImageCopy(image6,image2,PS_TYPE_F64);
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an two error messages");
+    image6 = (psImage*)psUnaryOp(image6, vector2, "sin");
+    if (image6 != NULL) {
+        psLogMsg(__func__,PS_LOG_ERROR,"psUnaryOp returned result given wrong type out parameter.");
+        return 14;
+    }
+    printFooter(stdout,"psUnaryOp","Check inconsistent dimensionality",true);
+
+    // Attempt to use min with complex numbers
+    printPositiveTestHeader(stdout,"psBinaryOp","Attempt to use min with complex numbers");
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate error message");
+    image6 = (psImage*)psBinaryOp(image6, image5, "min", image5);
+    if(image6 != NULL) {
+        psLogMsg(__func__,PS_LOG_ERROR,"psUnaryOp returned result with min of complex numbers");
+        return 15;
+    }
+    printFooter(stdout, "psBinaryOp", "Attempt to use  min with complex numbers", true);
+
+
+    // Attempt to use max with complex numbers
+    printPositiveTestHeader(stdout,"psBinaryOp","Attempt to use max with complex numbers");
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message");
+    image6 = (psImage*)psBinaryOp(image6, image5, "max", image5);
+    if(image6 != NULL) {
+        psLogMsg(__func__,PS_LOG_ERROR,"psUnaryOp returned result with max of complex numbers");
+        return 16;
+    }
+    printFooter(stdout, "psBinaryOp", "Attempt to use max with complex numbers", true);
+
+
+    // Invalid operation
+    printPositiveTestHeader(stdout,"psBinary","Attempt to use invalid operator");
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error messgae");
+    image6 = (psImage*)psBinaryOp(image6, image1, "yarg", image2);
+    if(image6 != NULL) {
+        psLogMsg(__func__,PS_LOG_ERROR,"psBinaryOp returned result with invalid operator");
+        return 17;
+    }
+    printFooter(stdout,"psBinaryOp","Attempt to use invalid operator",true);
+
+    printPositiveTestHeader(stdout,"psUnaryOp","Attempt to use invalid operator");
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message");
+    image6 = (psImage*)psUnaryOp(image6, image1, "yarg");
+    if(image6 != NULL) {
+        psLogMsg(__func__,PS_LOG_ERROR,"psUnaryOp returned result with invalid operator");
+        return 18;
+    }
+    printFooter(stdout, "psUnaryOp", "Attempt to use invalid operator", true);
+
+    CREATE_AND_SET_VECTOR(vector4,F64,0,3);
+    CREATE_AND_SET_VECTOR(vector5,F64,0,3);
+
+    // Input parameter with dimension of PS_DIMEN_OTHER
+    printPositiveTestHeader(stdout,"psBinaryOp","Attempt to use input with PS_DIMEN_OTHER");
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message");
+    vector4->type.dimen = PS_DIMEN_OTHER;
+    if ( psBinaryOp(NULL,vector4,"+",vector5) != NULL) {
+        psError(PS_ERR_UNKNOWN, true,"psBinaryOp should return null when input dimen PS_DIMEN_OTHER.");
+        return 19;
+    }
+    vector4->type.dimen = PS_DIMEN_VECTOR;
+    printFooter(stdout,"psBinaryOp","Attempt to use input with PS_DIMEN_OTHER",true);
+
+    // Input parameter with dimension of PS_DIMEN_OTHER
+    printPositiveTestHeader(stdout,"psUnaryOp","Attempt to use input with PS_DIMEN_OTHER");
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message");
+    vector4->type.dimen = PS_DIMEN_OTHER;
+    if ( psUnaryOp(NULL,vector4,"sin") != NULL ) {
+        psError(PS_ERR_UNKNOWN,true,"psUnaryOp should return null when input dimen PS_DIMEN_OTHER");
+        return 20;
+    }
+    vector4->type.dimen = PS_DIMEN_VECTOR;
+    printFooter(stdout,"psUnaryOp","Attempt to use input with PS_DIMEN_OTHER",true);
+
+    psFree(vector4);
+    psFree(vector5);
+    psFree(image1);
+    psFree(image2);
+    psFree(image3);
+    psFree(image4);
+    psFree(image5);
+    psFree(vector1);
+    psFree(vector2);
+
+    psS32 nLeaks = psMemCheckLeaks(0,NULL,stdout,false);
+    if(nLeaks != 0) {
+        psError(PS_ERR_UNKNOWN,true,"Memory leaks detected");
+        return 50;
+    }
+    psS32 nBad = psMemCheckCorruption(0);
+    if(nBad) {
+        psError(PS_ERR_UNKNOWN,true,"Memory corruption detected");
+        return 51;
+    }
+
+    return 0;
+}
+
Index: /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psMatrixVectorArithmetic04.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psMatrixVectorArithmetic04.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psMatrixVectorArithmetic04.c	(revision 22331)
@@ -0,0 +1,212 @@
+/** @file  tst_psMatrixVectorArithmetic04.c
+ *
+ *  @brief Test driver for psBinary arithmetic operations with scalars
+ *
+ *  This test driver will test the following binary operation with scalar inputs
+ *        vector addition with scalar in first argument
+ *        image addition with scalar in second argument
+ *
+ * @author  Eric Van Alst, MHPCC
+ *
+ * @version $Revision: 1.3 $  $Name: not supported by cvs2svn $
+ * @date  $Date: 2005-04-07 20:27:42 $
+ *
+ * Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ *
+ */
+
+#include "pslib_strict.h"
+#include "psTest.h"
+
+static psS32 testBinOpScalarFirst(void);
+static psS32 testBinOpScalarSecond(void);
+static psS32 testBinOpScalarBoth(void);
+static psS32 testUnaryOpScalar(void);
+
+testDescription testsBinary[] = {
+                                    {testBinOpScalarFirst,737,"psBinaryOp",0,false},
+                                    {testBinOpScalarSecond,737,"psBinaryOp",0,false},
+                                    {testBinOpScalarBoth,737,"psBinaryOp",0,false},
+                                    {NULL}
+                                };
+
+testDescription testUnary[] = {
+                                  {testUnaryOpScalar,737,"psUnaryOp",0,false},
+                                  {NULL}
+                              };
+
+// Create vector
+#define CREATE_AND_SET_VECTOR(NAME,TYPE,VALUE,SIZE) \
+psVector *NAME = psVectorAlloc(SIZE,PS_TYPE_##TYPE); \
+for(psS32 i=0; i<SIZE; i++) { \
+    NAME->data.TYPE[i] = VALUE; \
+} \
+NAME->n = SIZE;
+
+// Create image
+#define CREATE_AND_SET_IMAGE(NAME,TYPE,VALUE,NROWS,NCOLS) \
+psImage *NAME = psImageAlloc(NCOLS,NROWS,PS_TYPE_##TYPE); \
+for(psS32 i=0; i<NAME->numRows; i++) { \
+    for(psS32 j=0; j<NAME->numCols; j++) { \
+        NAME->data.TYPE[i][j] = VALUE; \
+    } \
+}
+
+psS32 main(psS32 argc, char* argv[])
+{
+    psLogSetLevel(PS_LOG_INFO);
+
+    runTestSuite(stderr,"psBinaryOp",testsBinary,argc,argv);
+    runTestSuite(stderr,"psUnaryOp",testUnary,argc,argv);
+
+    return 0;
+}
+
+psS32 testBinOpScalarFirst(void)
+{
+    CREATE_AND_SET_VECTOR(vector1,S8,1,5)
+    CREATE_AND_SET_VECTOR(vector2,S8,0,5)
+
+    psScalar* inScalar1 = psScalarAlloc(2,PS_TYPE_S8);
+
+    // Add vector and scalar
+    vector2 = (psVector*)psBinaryOp(vector2,inScalar1,"+",vector1);
+    // Verify the result vector
+    for(psS32 i=0; i<vector2->n; i++) {
+        if(vector2->data.S8[i] != 3 ) {
+            psError(PS_ERR_UNKNOWN,true,"Unexpected value in return vector[%d]",i);
+            return 1;
+        }
+    }
+    psFree(vector1);
+    psFree(vector2);
+
+    CREATE_AND_SET_VECTOR(vector3,S8,1,5);
+    CREATE_AND_SET_VECTOR(vector4,S8,0,3);
+
+    psScalar* inScalar2 = psScalarAlloc(2,PS_TYPE_S8);
+    vector4->type.dimen = PS_DIMEN_TRANSV;
+    vector4 = (psVector*)psBinaryOp(vector4,inScalar2,"+",vector3);
+    for(psS32 i=0; i<vector4->n; i++) {
+        if(vector4->data.S8[i] != 3 ) {
+            psError(PS_ERR_UNKNOWN,true,"Unexpected value in return vector[%d]",i);
+            return 2;
+        }
+    }
+    psFree(vector3);
+    psFree(vector4);
+
+    CREATE_AND_SET_IMAGE(image1,S8,1,5,5)
+    psImage* image2 = NULL;
+
+    psScalar* inScalar3 = psScalarAlloc(2,PS_TYPE_S8);
+
+    image2 = (psImage*)psBinaryOp(image2,inScalar3,"+",image1);
+    for(psS32 i=0; i<image2->numRows; i++) {
+        for(psS32 j=0; j<image2->numCols; j++) {
+            if(image2->data.S8[i][j] != 3 ) {
+                psError(PS_ERR_UNKNOWN,true,"Unexpected value in return image[%d][%d]",i,j);
+                return 10;
+            }
+        }
+    }
+    psFree(image1);
+    psFree(image2);
+
+    return 0;
+}
+
+psS32 testBinOpScalarSecond(void)
+{
+    CREATE_AND_SET_VECTOR(vector1,S8,1,5)
+    CREATE_AND_SET_VECTOR(vector2,S8,0,5)
+
+    psScalar* inScalar1 = psScalarAlloc(2,PS_TYPE_S8);
+
+    vector2 = (psVector*)psBinaryOp(vector2,vector1,"+",inScalar1);
+    for(psS32 i=0; i<vector2->n; i++) {
+        if(vector2->data.S8[i] != 3 ) {
+            psError(PS_ERR_UNKNOWN,true,"Unexpected value in return vector[%d]",i);
+            return 1;
+        }
+    }
+    psFree(vector1);
+    psFree(vector2);
+
+    CREATE_AND_SET_VECTOR(vector3,S8,1,5);
+    CREATE_AND_SET_VECTOR(vector4,S8,0,3);
+
+    psScalar* inScalar2 = psScalarAlloc(2,PS_TYPE_S8);
+    vector4->type.dimen = PS_DIMEN_TRANSV;
+    vector4 = (psVector*)psBinaryOp(vector4,vector3,"+",inScalar2);
+    for(psS32 i=0; i<vector4->n; i++) {
+        if(vector4->data.S8[i] != 3 ) {
+            psError(PS_ERR_UNKNOWN,true,"Unexpected value in return vector[%d]",i);
+            return 2;
+        }
+    }
+    psFree(vector3);
+    psFree(vector4);
+
+    CREATE_AND_SET_IMAGE(image1,S8,1,5,5);
+    psImage* image2 = NULL;
+
+    psScalar* inScalar3 = psScalarAlloc(2,PS_TYPE_S8);
+
+    image2 = (psImage*)psBinaryOp(image2,image1,"+",inScalar3);
+    for(psS32 i=0; i<image2->numRows; i++) {
+        for(psS32 j=0; j<image2->numCols; j++) {
+            if(image2->data.S8[i][j] != 3 ) {
+                psError(PS_ERR_UNKNOWN,true,"Unexpected value in return image[%d][%d]",i,j);
+                return 10;
+            }
+        }
+    }
+    psFree(image1);
+    psFree(image2);
+
+    return 0;
+}
+
+psS32 testBinOpScalarBoth(void)
+{
+    psScalar* inScalar1 = psScalarAlloc(1,PS_TYPE_S8);
+    psScalar* inScalar2 = psScalarAlloc(2,PS_TYPE_S8);
+    psScalar* outScalar = psScalarAlloc(4,PS_TYPE_S8);
+
+    outScalar = (psScalar*)psBinaryOp(outScalar,inScalar1,"+",inScalar2);
+    if(outScalar->data.S8 != 3) {
+        psError(PS_ERR_UNKNOWN,true,"Unexpected value in return scalar");
+        return 3;
+    }
+    psFree(outScalar);
+
+    psScalar* inScalar3 = psScalarAlloc(10,PS_TYPE_S8);
+    psScalar* inScalar4 = psScalarAlloc(20,PS_TYPE_S8);
+    psScalar* outScalar1 = NULL;
+
+    outScalar1 = (psScalar*)psBinaryOp(outScalar1,inScalar3,"+",inScalar4);
+    if(outScalar1->data.S8 != 30 ) {
+        psError(PS_ERR_UNKNOWN,true,"Unexpected value in return scalar");
+        return 4;
+    }
+    psFree(outScalar1);
+
+    return 0;
+}
+
+psS32 testUnaryOpScalar(void)
+{
+    psScalar* inScalar = psScalarAlloc(-1,PS_TYPE_F32);
+    psScalar* outScalar = NULL;
+
+    outScalar = (psScalar*)psUnaryOp(outScalar,inScalar,"abs");
+    if(outScalar->data.F32 != 1) {
+        psError(PS_ERR_UNKNOWN,true,"Unexpected value in return scalar = %d  in = %d",outScalar->data.F32,inScalar->data.F32);
+        return 5;
+    }
+    psFree(outScalar);
+
+    return 0;
+}
+
Index: /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psMinimize00.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psMinimize00.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psMinimize00.c	(revision 22331)
@@ -0,0 +1,166 @@
+/*****************************************************************************
+    This routine must ensure that the psMinimizeChi2 function correctly
+    minimizes an arbitrary function.
+ *****************************************************************************/
+#include <stdio.h>
+#include "pslib_strict.h"
+#include "psTest.h"
+#include "psMemory.h"
+#include "psVector.h"
+#include "psImage.h"
+#include "psFunctions.h"
+#include "psMinimize.h"
+#include <math.h>
+#define NUM_DATA 10
+#define DATA_WIDTH 2
+#define NUM_PARAMS 4
+
+float myFunc(const psVector *restrict myData,
+             const psVector *restrict myParams)
+{
+    float x = myData->data.F32[0];
+    float y = myData->data.F32[1];
+    float A = myParams->data.F32[0];
+    float B = myParams->data.F32[1];
+    float C = myParams->data.F32[2];
+    float D = myParams->data.F32[3];
+    float tmp = 0.0;
+
+    tmp = (A * x) + (B*x*x) + (C*y*y) + (D*x*x*y);
+    //    printf("--------- myFunc((%.1f %.1f) %.1f %.1f %.1f %.1f) is %.1f ---------\n",
+    //           x, y, A, B, C, D, tmp);
+
+    return(tmp);
+}
+
+float myFuncDeriv(const psVector *restrict myData,
+                  const psVector *restrict myParams,
+                  psS32 whichParamDeriv)
+{
+    float x = myData->data.F32[0];
+    float y = myData->data.F32[1];
+    float tmp = 0.0;
+
+    if (whichParamDeriv == 0) {
+        tmp = 1.0;
+        tmp = x;
+    } else
+        if (whichParamDeriv == 1) {
+            tmp = x;
+            tmp = x*x;
+        } else
+            if (whichParamDeriv == 2) {
+                tmp = y;
+                tmp = y*y;
+            } else
+                if (whichParamDeriv == 3) {
+                    tmp = x * x * y;
+                }
+
+    //    printf("--------- myFuncDeriv((%.1f %.1f) %.1f %.1f %.1f %.1f (%d)) is %.1f ---------\n",
+    //            x, y, myParams->data.F32[0], myParams->data.F32[1],
+    //            myParams->data.F32[2], myParams->data.F32[3], whichParamDeriv, tmp);
+    return(tmp);
+}
+
+
+psS32 main()
+{
+    psImage *domain = NULL;
+    psVector *data = NULL;
+    psVector *errors = NULL;
+    psVector *initialGuess = NULL;
+    psVector *paramMask = NULL;
+    psVector *tmpVecPtr = NULL;
+    float chiSq = 0.0;
+    psS32 i = 0;
+    psS32 j = 0;
+    psS32 currentId = psMemGetId();
+    psS32 testStatus = true;
+    psS32 memLeaks = 0;
+    psVector *theParams = NULL;
+
+    domain = psImageAlloc(DATA_WIDTH, NUM_DATA, PS_TYPE_F32);
+    data = psVectorAlloc(NUM_DATA, PS_TYPE_F32);
+    errors = psVectorAlloc(NUM_DATA, PS_TYPE_F32);
+    initialGuess = psVectorAlloc(NUM_PARAMS, PS_TYPE_F32);
+    paramMask = psVectorAlloc(NUM_PARAMS, PS_TYPE_F32);
+    tmpVecPtr = psVectorAlloc(DATA_WIDTH, PS_TYPE_F32);
+
+
+    //--------- myFunc((0.0 1.0) -8.6 -7.6 14.6 5.0) is 6.0 ---------
+
+    initialGuess->data.F32[0] = -8.6;
+    initialGuess->data.F32[1] = -7.6;
+    initialGuess->data.F32[2] = 14.6;
+    initialGuess->data.F32[3] = 5.0;
+
+    // Build the data.
+    initialGuess->data.F32[0] = 2.0;
+    initialGuess->data.F32[1] = 3.0;
+    initialGuess->data.F32[2] = 4.0;
+    initialGuess->data.F32[3] = 5.0;
+
+
+    for (i = 0; i<NUM_DATA; i++) {
+        for (j=0; j<DATA_WIDTH; j++) {
+            domain->data.F32[i][j] = (float) (i + j);
+        }
+    }
+    for (i = 0; i<NUM_DATA; i++) {
+        errors->data.F32[i] = 0.1;
+    }
+
+    //    printf("========== Setting Data Values ==========\n");
+    for (i = 0; i<NUM_DATA; i++) {
+        for (j=0; j<DATA_WIDTH; j++) {
+            tmpVecPtr->data.F32[j] = domain->data.F32[i][j];
+        }
+        data->data.F32[i] = myFunc(tmpVecPtr, initialGuess);
+    }
+    //    printf("=========================================\n");
+
+    for (i=0;i<NUM_PARAMS;i++) {
+        initialGuess->data.F32[i]+= 1.0;
+    }
+
+    printPositiveTestHeader(stdout,
+                            "psMinimize functions",
+                            "psMinimizeChi2(): no masks");
+
+    theParams = psMinimizeChi2(myFunc,
+                               myFuncDeriv,
+                               domain,
+                               data,
+                               errors,
+                               initialGuess,
+                               NULL,
+                               &chiSq);
+    for (i=0;i<NUM_PARAMS;i++) {
+        printf("theParams[%d] is %.1f\n", i, theParams->data.F32[i]);
+    }
+
+    printf("chiSq is %f\n", chiSq);
+    psMemCheckCorruption(1);
+    printFooter(stdout,
+                "psMinimize functions",
+                "psMinimizeChi2(): no masks",
+                testStatus);
+
+
+    psMemCheckCorruption(1);
+    psFree(domain);
+    psFree(data);
+    psFree(errors);
+    psFree(initialGuess);
+    psFree(paramMask);
+    psFree(tmpVecPtr);
+
+    psMemCheckCorruption(1);
+    memLeaks = psMemCheckLeaks(currentId,NULL,stderr);
+    if (0 != memLeaks) {
+        psAbort(__func__,"Memory Leaks! (%d leaks)", memLeaks);
+    }
+
+    return (!testStatus);
+}
Index: /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psMinimize01.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psMinimize01.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psMinimize01.c	(revision 22331)
@@ -0,0 +1,172 @@
+/*****************************************************************************
+    This routine must ensure that the psMinimizeChi2 function correctly
+    minimizes an arbitrary function.
+ *****************************************************************************/
+#include <stdio.h>
+#include "pslib_strict.h"
+#include "psTest.h"
+#include "psMemory.h"
+#include "psVector.h"
+#include "psImage.h"
+#include "psFunctions.h"
+#include "psMinimize.h"
+#include <math.h>
+#define NUM_DATA 40
+#define DATA_WIDTH 1
+#define NUM_PARAMS 3
+
+// The function is f(x) = (A * e^(lambda x)) + b
+
+float myFunc(const psVector *restrict myData,
+             const psVector *restrict myParams)
+{
+    float x = myData->data.F32[0];
+    float A = myParams->data.F32[0];
+    float lambda = myParams->data.F32[1];
+    float b = myParams->data.F32[2];
+    float tmp = A * exp(-lambda * x) + b;
+
+    //    printf("--------- myFunc((%.1f) %.1f %.1f %.1f) is %.1f ---------\n",
+    //           x, A, lambda, b, tmp);
+
+    return(tmp);
+}
+
+float myFuncDeriv(const psVector *restrict myData,
+                  const psVector *restrict myParams,
+                  psS32 whichParamDeriv)
+{
+    float x = myData->data.F32[0];
+    float A = myParams->data.F32[0];
+    float lambda = myParams->data.F32[1];
+    float tmp = 0.0;
+
+    if (whichParamDeriv == 0) {
+        tmp = exp(-lambda * x);
+    } else
+        if (whichParamDeriv == 1) {
+            tmp = -x * A * exp(-lambda * x);
+        } else
+            if (whichParamDeriv == 2) {
+                tmp = 1.0;
+            }
+
+    //    printf("--------- myFuncDeriv((%.1f) %.1f %.1f %.1f, %d) is %.1f ---------\n",
+    //           x, A, lambda, myParams->data.F32[2], whichParamDeriv, tmp);
+
+    return(tmp);
+}
+
+psS32 main()
+{
+    psImage *domain = NULL;
+    psVector *data = NULL;
+    psVector *errors = NULL;
+    psVector *initialGuess = NULL;
+    psVector *paramMask = NULL;
+    psVector *tmpVecPtr = NULL;
+    float chiSq = 0.0;
+    psS32 i = 0;
+    psVector *theParams = NULL;
+    psS32 currentId = psMemGetId();
+    psS32 testStatus = true;
+    psS32 memLeaks = 0;
+
+    domain = psImageAlloc(DATA_WIDTH, NUM_DATA, PS_TYPE_F32);
+    data = psVectorAlloc(NUM_DATA, PS_TYPE_F32);
+    errors = psVectorAlloc(NUM_DATA, PS_TYPE_F32);
+    initialGuess = psVectorAlloc(NUM_PARAMS, PS_TYPE_F32);
+    paramMask = psVectorAlloc(NUM_PARAMS, PS_TYPE_F32);
+    tmpVecPtr = psVectorAlloc(DATA_WIDTH, PS_TYPE_F32);
+
+    // Build the data.
+    initialGuess->data.F32[0] = 1.0;
+    initialGuess->data.F32[1] = 0.0;
+    initialGuess->data.F32[2] = 0.0;
+
+    for (i = 0; i<NUM_DATA; i++) {
+        errors->data.F32[i] = 0.1;
+        domain->data.F32[i][0] = (float) i;
+    }
+
+    printf("========== Setting Data Values ==========\n");
+    data->data.F32[0] = 6.013392;
+    data->data.F32[1] = 5.515377;
+    data->data.F32[2] = 5.261095;
+    data->data.F32[3] = 4.777455;
+    data->data.F32[4] = 4.451353;
+    data->data.F32[5] = 3.904903;
+    data->data.F32[6] = 3.504387;
+    data->data.F32[7] = 3.414999;
+    data->data.F32[8] = 3.242736;
+    data->data.F32[9] = 3.122204;
+    data->data.F32[10] = 2.837632;
+    data->data.F32[11] = 2.534700;
+    data->data.F32[12] = 2.439173;
+    data->data.F32[13] = 2.380830;
+    data->data.F32[14] = 2.316090;
+    data->data.F32[15] = 2.060826;
+    data->data.F32[16] = 1.945679;
+    data->data.F32[17] = 1.914126;
+    data->data.F32[18] = 1.759509;
+    data->data.F32[19] = 1.665067;
+    data->data.F32[20] = 1.737926;
+    data->data.F32[21] = 1.575523;
+    data->data.F32[22] = 1.525066;
+    data->data.F32[23] = 1.409607;
+    data->data.F32[24] = 1.395209;
+    data->data.F32[25] = 1.416887;
+    data->data.F32[26] = 1.376042;
+    data->data.F32[27] = 1.260955;
+    data->data.F32[28] = 1.289627;
+    data->data.F32[29] = 1.422672;
+    data->data.F32[30] = 1.228287;
+    data->data.F32[31] = 1.199176;
+    data->data.F32[32] = 1.189989;
+    data->data.F32[33] = 0.930076;
+    data->data.F32[34] = 1.224608;
+    data->data.F32[35] = 1.147376;
+    data->data.F32[36] = 1.114001;
+    data->data.F32[37] = 1.195118;
+    data->data.F32[38] = 1.269581;
+    data->data.F32[39] = 1.061982;
+
+    printPositiveTestHeader(stdout,
+                            "psMinimize functions",
+                            "psMinimizeChi2(): no masks");
+
+    theParams = psMinimizeChi2(myFunc,
+                               myFuncDeriv,
+                               domain,
+                               data,
+                               errors,
+                               initialGuess,
+                               NULL,
+                               &chiSq);
+
+    for (i=0;i<NUM_PARAMS;i++) {
+        printf("theParams[%d] is %.1f\n", i, theParams->data.F32[i]);
+    }
+    printf("chiSq is %f\n", chiSq);
+
+    psMemCheckCorruption(1);
+    printFooter(stdout,
+                "psMinimize functions",
+                "psMinimizeChi2(): no masks",
+                testStatus);
+    psMemCheckCorruption(1);
+    psFree(domain);
+    psFree(data);
+    psFree(errors);
+    psFree(initialGuess);
+    psFree(paramMask);
+    psFree(tmpVecPtr);
+
+    psMemCheckCorruption(1);
+    memLeaks = psMemCheckLeaks(currentId,NULL,stderr);
+    if (0 != memLeaks) {
+        psAbort(__func__,"Memory Leaks! (%d leaks)", memLeaks);
+    }
+
+    return (!testStatus);
+}
Index: /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psMinimize02.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psMinimize02.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psMinimize02.c	(revision 22331)
@@ -0,0 +1,168 @@
+/*****************************************************************************
+    This routine must ensure that the psMinimize function correctly
+    minimizes an arbitrary function.
+ *****************************************************************************/
+#include <stdio.h>
+#include "pslib_strict.h"
+#include "psTest.h"
+#include "psMemory.h"
+#include "psVector.h"
+#include "psImage.h"
+#include "psFunctions.h"
+#include "psMinimize.h"
+#include <math.h>
+#define DATA_WIDTH 2
+#define NUM_PARAMS 2
+
+float myFunc0(const psVector *restrict myParams,
+              const psVector *restrict myCoords)
+{
+    float P0 = myCoords->data.F32[0];
+    float P1 = myCoords->data.F32[1];
+    float x = myParams->data.F32[0];
+    float y = myParams->data.F32[1];
+    float tmp = 0.0;
+
+    tmp = 10.0 * (x - P0) * (x - P0) + 20.0 * (y - P1) * (y - P1) + 30.0;
+    //    printf("--------- myFunc((%.1f %.1f) %.1f %.1f) is %.1f ---------\n",
+    //    printf("--------- myFunc() params: (%.1f %.1f) coords: (%.1f %.1f) is %.1f ---------\n",
+    //           x, y, P0, P1, tmp);
+
+    return(tmp);
+}
+
+float myFuncDeriv0(const psVector *restrict myParams,
+                   const psVector *restrict myCoords,
+                   psS32 whichParamDeriv)
+{
+    float P0 = myCoords->data.F32[0];
+    float P1 = myCoords->data.F32[1];
+    float x = myParams->data.F32[0];
+    float y = myParams->data.F32[1];
+    float tmp = 0.0;
+
+    if (whichParamDeriv == 0) {
+        tmp = 20.0 * (x - P0);
+    } else
+        if (whichParamDeriv == 1) {
+            tmp = 40.0 * (y - P1);
+        }
+
+    //    printf("--------- myFuncDeriv((%.1f %.1f) %.1f %.1f (%d)) is %.1f ---------\n",
+    //            x, y, myParams->data.F32[0], myParams->data.F32[1], whichParamDeriv, tmp);
+    return(tmp);
+}
+
+
+float myFunc(const psVector *restrict myParams,
+             const psVector *restrict myCoords)
+{
+    float x = myCoords->data.F32[0];
+    float y = myCoords->data.F32[1];
+    float A = myParams->data.F32[0];
+    float B = myParams->data.F32[1];
+    float C = myParams->data.F32[2];
+    float D = myParams->data.F32[3];
+    float tmp = 0.0;
+
+    tmp = (A * x) + (B*x*x) + (C*y*y) + (D*x*x*y);
+    printf("--------- myFunc((%.1f %.1f) %.1f %.1f %.1f %.1f) is %.1f ---------\n",
+           x, y, A, B, C, D, tmp);
+
+    return(tmp);
+}
+
+float myFuncDeriv(const psVector *restrict myParams,
+                  const psVector *restrict myCoords,
+                  psS32 whichParamDeriv)
+{
+    float x = myCoords->data.F32[0];
+    float y = myCoords->data.F32[1];
+    float tmp = 0.0;
+
+    if (whichParamDeriv == 0) {
+        tmp = 1.0;
+        tmp = x;
+    } else
+        if (whichParamDeriv == 1) {
+            tmp = x;
+            tmp = x*x;
+        } else
+            if (whichParamDeriv == 2) {
+                tmp = y;
+                tmp = y*y;
+            } else
+                if (whichParamDeriv == 3) {
+                    tmp = x * x * y;
+                }
+
+    printf("--------- myFuncDeriv((%.1f %.1f) %.1f %.1f %.1f %.1f (%d)) is %.1f ---------\n",
+           x, y, myParams->data.F32[0], myParams->data.F32[1],
+           myParams->data.F32[2], myParams->data.F32[3], whichParamDeriv, tmp);
+    return(tmp);
+}
+
+
+psS32 main()
+{
+    psVector *initialGuess = NULL;
+    psVector *paramMask = NULL;
+    psVector *coord = NULL;
+    psS32 i = 0;
+    psS32 currentId = psMemGetId();
+    psS32 testStatus = true;
+    psS32 memLeaks = 0;
+    psVector *theParams = NULL;
+
+    initialGuess = psVectorAlloc(NUM_PARAMS, PS_TYPE_F32);
+    paramMask = psVectorAlloc(NUM_PARAMS, PS_TYPE_F32);
+    coord = psVectorAlloc(DATA_WIDTH, PS_TYPE_F32);
+
+
+    //--------- myFunc((0.0 1.0) -8.6 -7.6 14.6 5.0) is 6.0 ---------
+
+    // Build the data.
+    initialGuess->data.F32[0] = 5.0;
+    initialGuess->data.F32[1] = 7.0;
+
+    for (i=0;i<DATA_WIDTH;i++) {
+        coord->data.F32[i] = (float) i;
+    }
+    coord->data.F32[0] = 1.0;
+    coord->data.F32[1] = 2.0;
+
+    printPositiveTestHeader(stdout,
+                            "psMinimize functions",
+                            "psMinimize(): no masks");
+
+    for (i=0;i<NUM_PARAMS;i++)
+        printf("Initial parameter %d is: %.1f\n", i, initialGuess->data.F32[i]);
+
+    theParams = psMinimize(initialGuess,
+                           myFunc0,
+                           myFuncDeriv0,
+                           coord,
+                           NULL);
+
+    for (i=0;i<NUM_PARAMS;i++)
+        printf("Parameter %d is: %.1f\n", i, theParams->data.F32[i]);
+
+    psMemCheckCorruption(1);
+    printFooter(stdout,
+                "psMinimize functions",
+                "psMinimize(): no masks",
+                testStatus);
+
+    psMemCheckCorruption(1);
+    psFree(initialGuess);
+    psFree(paramMask);
+    psFree(coord);
+
+    psMemCheckCorruption(1);
+    memLeaks = psMemCheckLeaks(currentId,NULL,stderr);
+    if (0 != memLeaks) {
+        psAbort(__func__,"Memory Leaks! (%d leaks)", memLeaks);
+    }
+
+    return (!testStatus);
+}
Index: /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psMinimize03.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psMinimize03.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psMinimize03.c	(revision 22331)
@@ -0,0 +1,172 @@
+/*****************************************************************************
+    This routine must ensure that the psMinimize function correctly
+    minimizes an arbitrary function.
+ *****************************************************************************/
+#include <stdio.h>
+#include "pslib_strict.h"
+#include "psTest.h"
+#include "psMemory.h"
+#include "psVector.h"
+#include "psImage.h"
+#include "psFunctions.h"
+#include "psMinimize.h"
+#include <math.h>
+#define DATA_WIDTH 2
+#define NUM_PARAMS 4
+
+float myFunc0(const psVector *restrict myParams,
+              const psVector *restrict myCoords)
+{
+    float P0 = myCoords->data.F32[0];
+    float P1 = myCoords->data.F32[1];
+    float x = myParams->data.F32[0];
+    float y = myParams->data.F32[1];
+    float tmp = 0.0;
+
+    tmp = 10.0 * (x - P0) * (x - P0) + 20.0 * (y - P1) * (y - P1) + 30.0;
+    //    printf("--------- myFunc((%.1f %.1f) %.1f %.1f) is %.1f ---------\n",
+    //    printf("--------- myFunc() params: (%.1f %.1f) coords: (%.1f %.1f) is %.1f ---------\n",
+    //           x, y, P0, P1, tmp);
+
+    return(tmp);
+}
+
+float myFuncDeriv0(const psVector *restrict myParams,
+                   const psVector *restrict myCoords,
+                   psS32 whichParamDeriv)
+{
+    float P0 = myCoords->data.F32[0];
+    float P1 = myCoords->data.F32[1];
+    float x = myParams->data.F32[0];
+    float y = myParams->data.F32[1];
+    float tmp = 0.0;
+
+    if (whichParamDeriv == 0) {
+        tmp = 20.0 * (x - P0);
+    } else
+        if (whichParamDeriv == 1) {
+            tmp = 40.0 * (y - P1);
+        }
+
+    //    printf("--------- myFuncDeriv((%.1f %.1f) %.1f %.1f (%d)) is %.1f ---------\n",
+    //            x, y, myParams->data.F32[0], myParams->data.F32[1], whichParamDeriv, tmp);
+    return(tmp);
+}
+
+
+float myFunc(const psVector *restrict myParams,
+             const psVector *restrict myCoords)
+{
+    float x = myCoords->data.F32[0];
+    float y = myCoords->data.F32[1];
+    float A = myParams->data.F32[0];
+    float B = myParams->data.F32[1];
+    float C = myParams->data.F32[2];
+    float D = myParams->data.F32[3];
+    float tmp = 0.0;
+
+    tmp = (A * x) + (B*x*x) + (C*y*y) + (D*x*x*y);
+    printf("-- myFunc() params: (%.1f %.1f %.1f %.1f) coords: (%.1f %.1f) is %.1f ---------\n",
+           A, B, C, D, x, y, tmp);
+
+    return(tmp);
+}
+
+float myFuncDeriv(const psVector *restrict myParams,
+                  const psVector *restrict myCoords,
+                  psS32 whichParamDeriv)
+{
+    float x = myCoords->data.F32[0];
+    float y = myCoords->data.F32[1];
+    float tmp = 0.0;
+
+    if (whichParamDeriv == 0) {
+        tmp = 1.0;
+        tmp = x;
+    } else
+        if (whichParamDeriv == 1) {
+            tmp = x;
+            tmp = x*x;
+        } else
+            if (whichParamDeriv == 2) {
+                tmp = y;
+                tmp = y*y;
+            } else
+                if (whichParamDeriv == 3) {
+                    tmp = x * x * y;
+                }
+
+    printf("--------- myFuncDeriv((%.1f %.1f) %.1f %.1f %.1f %.1f (%d)) is %.1f ---------\n",
+           x, y, myParams->data.F32[0], myParams->data.F32[1],
+           myParams->data.F32[2], myParams->data.F32[3], whichParamDeriv, tmp);
+    return(tmp);
+}
+
+
+psS32 main()
+{
+    psVector *initialGuess = NULL;
+    psVector *paramMask = NULL;
+    psVector *coord = NULL;
+    psS32 i = 0;
+    psS32 currentId = psMemGetId();
+    psS32 testStatus = true;
+    psS32 memLeaks = 0;
+    psVector *theParams = NULL;
+
+    initialGuess = psVectorAlloc(NUM_PARAMS, PS_TYPE_F32);
+    paramMask = psVectorAlloc(NUM_PARAMS, PS_TYPE_F32);
+    coord = psVectorAlloc(DATA_WIDTH, PS_TYPE_F32);
+
+
+    //--------- myFunc((0.0 1.0) -8.6 -7.6 14.6 5.0) is 6.0 ---------
+
+    // Build the data.
+    initialGuess->data.F32[0] = 2.0;
+    initialGuess->data.F32[1] = 3.0;
+    initialGuess->data.F32[2] = 4.0;
+    initialGuess->data.F32[3] = 5.0;
+
+    for (i=0;i<DATA_WIDTH;i++) {
+        coord->data.F32[i] = (float) i;
+    }
+    coord->data.F32[0] = 1.0;
+    coord->data.F32[1] = 2.0;
+
+    printPositiveTestHeader(stdout,
+                            "psMinimize functions",
+                            "psMinimize(): no masks");
+
+    for (i=0;i<NUM_PARAMS;i++)
+        printf("Initial parameter %d is: %.1f\n", i, initialGuess->data.F32[i]);
+
+    theParams = psMinimize(initialGuess,
+                           myFunc,
+                           myFuncDeriv,
+                           coord,
+                           NULL);
+
+    for (i=0;i<NUM_PARAMS;i++)
+        printf("Parameter %d is: %.1f\n", i, theParams->data.F32[i]);
+
+    printf("Function is %.1f\n", myFunc(theParams, coord));
+
+    psMemCheckCorruption(1);
+    printFooter(stdout,
+                "psMinimize functions",
+                "psMinimize(): no masks",
+                testStatus);
+
+    psMemCheckCorruption(1);
+    psFree(initialGuess);
+    psFree(paramMask);
+    psFree(coord);
+
+    psMemCheckCorruption(1);
+    memLeaks = psMemCheckLeaks(currentId,NULL,stderr);
+    if (0 != memLeaks) {
+        psAbort(__func__,"Memory Leaks! (%d leaks)", memLeaks);
+    }
+
+    return (!testStatus);
+}
Index: /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psMinimize04.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psMinimize04.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psMinimize04.c	(revision 22331)
@@ -0,0 +1,274 @@
+/*****************************************************************************
+This routine must ensure that the psVectorFitPolynomial1D works correctly.
+We create a vectors of data points (x and y), and populate them with the
+values from an arbitrary function setData().  We then call
+psVectorFitPolynomial1D() with a regular polynomial data structure.  We then
+evaluate the polynomial with the coefficients generated above and determine
+if they are within an error tolerance of the expected values.
+ 
+    t00(): all input vectors are non-NULL.
+    t01(): yErr is NULL.
+    t02(): x, yErr is NULL.
+    t03(): x, y, yErr is NULL.
+ *****************************************************************************/
+#include <stdio.h>
+#include "pslib_strict.h"
+#include "psTest.h"
+#include "psMemory.h"
+#include "psVector.h"
+#include "psImage.h"
+#include "psFunctions.h"
+#include "psMinimize.h"
+#include <math.h>
+#define NUM_DATA 10
+#define POLY_ORDER 5
+#define A 3.0
+#define B 2.0
+#define C 3.0
+#define ERROR_TOLERANCE 0.10
+#define YERR 1.0
+double setData(double x)
+{
+    return(A + (B * x) + (C * x * x));
+}
+
+psS32 t00()
+{
+    psPolynomial1D *myPoly = NULL;
+    psVector *x = NULL;
+    psVector *y = NULL;
+    psVector *yErr = NULL;
+    psS32 i = 0;
+    psS32 currentId = psMemGetId();
+    psS32 testStatus = true;
+    psS32 memLeaks = 0;
+    double expectData;
+    double actualData;
+
+    myPoly = psPolynomial1DAlloc(POLY_ORDER+1, PS_POLYNOMIAL_ORD);
+    x = psVectorAlloc(NUM_DATA, PS_TYPE_F64);
+    y = psVectorAlloc(NUM_DATA, PS_TYPE_F64);
+    yErr = psVectorAlloc(NUM_DATA, PS_TYPE_F64);
+
+    for (i=0;i<NUM_DATA;i++) {
+        x->data.F64[i] = (double) i;
+        y->data.F64[i] = setData(x->data.F64[i]);
+        yErr->data.F64[i] = YERR;
+        //        printf("Original data %d: (%.1f %.1f)\n", i, x->data.F64[i], y->data.F64[i]);
+    }
+
+    printPositiveTestHeader(stdout,
+                            "psMinimize functions",
+                            "psVectorFitPolynomial1D(): equal difference in variable yErr");
+
+    psVectorFitPolynomial1D(myPoly, x, y, yErr);
+
+    //    for (i=0;i<POLY_ORDER+1;i++) {
+    //        printf("Polynomial coefficient %d is %0.1f\n", i, myPoly->coeff[i]);
+    //    }
+
+    for (i=0;i<NUM_DATA;i++) {
+        expectData = setData(x->data.F64[i]);
+        actualData = psPolynomial1DEval(
+                         myPoly,
+                         x->data.F64[i]
+                     );
+        if (fabs(actualData-expectData) > fabs(ERROR_TOLERANCE * expectData)) {
+            printf("ERROR: Fitted data %d: (%.1f %.1f), expected was (%.1f)\n",
+                   i, x->data.F64[i], actualData, expectData);
+            testStatus = false;
+        }
+        //        } else {
+        //            printf("Fitted data %d: (%.1f %.1f), expected was (%.1f)\n",
+        //                   i, x->data.F64[i], actualData, expectData);
+        //        }
+    }
+
+    psMemCheckCorruption(1);
+    psFree(myPoly);
+    psFree(x);
+    psFree(y);
+    psFree(yErr);
+    psMemCheckCorruption(1);
+    memLeaks = psMemCheckLeaks(currentId,NULL,stderr,false);
+    if (0 != memLeaks) {
+        psAbort(__func__,"Memory Leaks! (%d leaks)", memLeaks);
+    }
+
+    printFooter(stdout,
+                "psMinimize functions",
+                "psVectorFitPolynomial1D(): equal differences in variable yErr",
+                testStatus);
+
+    return (!testStatus);
+}
+
+psS32 t01()
+{
+    psPolynomial1D *myPoly = NULL;
+    psVector *x = NULL;
+    psVector *y = NULL;
+    psS32 i = 0;
+    psS32 currentId = psMemGetId();
+    psS32 testStatus = true;
+    psS32 memLeaks = 0;
+    double expectData;
+    double actualData;
+
+    myPoly = psPolynomial1DAlloc(POLY_ORDER+1, PS_POLYNOMIAL_ORD);
+    x = psVectorAlloc(NUM_DATA, PS_TYPE_F64);
+    y = psVectorAlloc(NUM_DATA, PS_TYPE_F64);
+
+    for (i=0;i<NUM_DATA;i++) {
+        x->data.F64[i] = (double) i;
+        y->data.F64[i] = setData(x->data.F64[i]);
+        //        printf("Original data %d: (%.1f %.1f)\n", i, x->data.F64[i], y->data.F64[i]);
+    }
+
+    printPositiveTestHeader(stdout,
+                            "psMinimize functions",
+                            "psVectorFitPolynomial1D(): yErr is NULL");
+
+    psVectorFitPolynomial1D(myPoly, x, y, NULL);
+
+    //    for (i=0;i<POLY_ORDER+1;i++) {
+    //        printf("Polynomial coefficient %d is %0.1f\n", i, myPoly->coeff[i]);
+    //    }
+
+    for (i=0;i<NUM_DATA;i++) {
+        expectData = setData(x->data.F64[i]);
+        actualData = psPolynomial1DEval(
+                         myPoly,
+                         x->data.F64[i]
+                     );
+        if (fabs(actualData-expectData) > fabs(ERROR_TOLERANCE * expectData)) {
+            printf("ERROR: Fitted data %d: (%.1f %.1f), expected was (%.1f)\n",
+                   i, x->data.F64[i], actualData, expectData);
+            testStatus = false;
+            //        } else {
+            //            printf("Fitted data %d: (%.1f %.1f), expected was (%.1f)\n",
+            //                   i, x->data.F64[i], actualData, expectData);
+        }
+    }
+
+    psMemCheckCorruption(1);
+    psFree(myPoly);
+    psFree(x);
+    psFree(y);
+    psMemCheckCorruption(1);
+    memLeaks = psMemCheckLeaks(currentId,NULL,stderr,false);
+    if (0 != memLeaks) {
+        psAbort(__func__,"Memory Leaks! (%d leaks)", memLeaks);
+    }
+
+    printFooter(stdout,
+                "psMinimize functions",
+                "psVectorFitPolynomial1D(): yErr is NULL",
+                testStatus);
+
+    return (!testStatus);
+}
+
+psS32 t02()
+{
+    psPolynomial1D *myPoly = NULL;
+    psVector *y = NULL;
+    psS32 i = 0;
+    psS32 currentId = psMemGetId();
+    psS32 testStatus = true;
+    psS32 memLeaks = 0;
+    double expectData;
+    double actualData;
+
+    myPoly = psPolynomial1DAlloc(POLY_ORDER+1, PS_POLYNOMIAL_ORD);
+    y = psVectorAlloc(NUM_DATA, PS_TYPE_F64);
+
+    for (i=0;i<NUM_DATA;i++) {
+        y->data.F64[i] = setData((double) i);
+        //        printf("Original data %d: (%.1f)\n", i, y->data.F64[i]);
+    }
+
+    printPositiveTestHeader(stdout,
+                            "psMinimize functions",
+                            "psVectorFitPolynomial1D(): x, yErr is NULL");
+
+    psVectorFitPolynomial1D(myPoly, NULL, y, NULL);
+
+    //    for (i=0;i<POLY_ORDER+1;i++) {
+    //        printf("Polynomial coefficient %d is %0.1f\n", i, myPoly->coeff[i]);
+    //    }
+
+    for (i=0;i<NUM_DATA;i++) {
+        expectData = setData((double) i);
+        actualData = psPolynomial1DEval(
+                         myPoly,
+                         (double) i
+                     );
+        if (fabs(actualData-expectData) > fabs(ERROR_TOLERANCE * expectData)) {
+            printf("ERROR: Fitted data %d: (%.1f %.1f), expected was (%.1f)\n",
+                   i, (double) i, actualData, expectData);
+            testStatus = false;
+            //        } else {
+            //            printf("Fitted data %d: (%.1f %.1f), expected was (%.1f)\n",
+            //                   i, (double) i, actualData, expectData);
+        }
+    }
+
+    psMemCheckCorruption(1);
+    psFree(myPoly);
+    psFree(y);
+    psMemCheckCorruption(1);
+    memLeaks = psMemCheckLeaks(currentId,NULL,stderr,false);
+    if (0 != memLeaks) {
+        psAbort(__func__,"Memory Leaks! (%d leaks)", memLeaks);
+    }
+
+    printFooter(stdout,
+                "psMinimize functions",
+                "psVectorFitPolynomial1D(): x, yErr is NULL",
+                testStatus);
+
+    return (!testStatus);
+}
+
+psS32 t03()
+{
+    psS32 currentId = psMemGetId();
+    psS32 testStatus = true;
+    psS32 memLeaks = 0;
+    psPolynomial1D *myPoly = NULL;
+
+    printPositiveTestHeader(stdout,
+                            "psMinimize functions",
+                            "psVectorFitPolynomial1D(): all inputs are NULL");
+
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error for null input polynomial.");
+    myPoly = psVectorFitPolynomial1D(NULL, NULL, NULL, NULL);
+    if ( myPoly != NULL ) {
+        psError(PS_ERR_UNKNOWN, true,"A null polynomial should have returned a null pointer.");
+        testStatus = false;
+    }
+
+
+    psMemCheckCorruption(1);
+    memLeaks = psMemCheckLeaks(currentId,NULL,stderr,false);
+    if (0 != memLeaks) {
+        psAbort(__func__,"Memory Leaks! (%d leaks)", memLeaks);
+    }
+
+    printFooter(stdout,
+                "psMinimize functions",
+                "psVectorFitPolynomial1D(): all inputs are NULL",
+                testStatus);
+
+    return (!testStatus);
+}
+
+
+psS32 main()
+{
+    t00();
+    t01();
+    t02();
+    t03();
+}
Index: /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psMinimize04_F32.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psMinimize04_F32.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psMinimize04_F32.c	(revision 22331)
@@ -0,0 +1,268 @@
+/*****************************************************************************
+This routine must ensure that the psVectorFitPolynomial1D works correctly.
+We create a vectors of data points (x and y), and populate them with the
+values from an arbitrary function setData().  We then call
+psVectorFitPolynomial1D() with a regular polynomial data structure.  We then
+evaluate the polynomial with the coefficients generated above and determine
+if they are within an error tolerance of the expected values.
+ 
+    t00(): all input vectors are non-NULL.
+    t01(): yErr is NULL.
+    t02(): x, yErr is NULL.
+    t03(): x, y, yErr is NULL.
+ *****************************************************************************/
+#include <stdio.h>
+#include "pslib_strict.h"
+#include "psTest.h"
+#include "psMemory.h"
+#include "psVector.h"
+#include "psImage.h"
+#include "psFunctions.h"
+#include "psMinimize.h"
+#include <math.h>
+#define NUM_DATA 10
+#define POLY_ORDER 5
+#define A 3.0
+#define B 2.0
+#define C 3.0
+#define ERROR_TOLERANCE 0.10
+#define YERR 10.0
+float setData(float x)
+{
+    return(A + (B * x) + (C * x * x));
+}
+
+psS32 t00()
+{
+    psPolynomial1D *myPoly = NULL;
+    psVector *x = NULL;
+    psVector *y = NULL;
+    psVector *yErr = NULL;
+    psS32 i = 0;
+    psS32 currentId = psMemGetId();
+    psS32 testStatus = true;
+    psS32 memLeaks = 0;
+    float expectData;
+    float actualData;
+
+    myPoly = psPolynomial1DAlloc(POLY_ORDER+1, PS_POLYNOMIAL_ORD);
+    x = psVectorAlloc(NUM_DATA, PS_TYPE_F32);
+    y = psVectorAlloc(NUM_DATA, PS_TYPE_F32);
+    yErr = psVectorAlloc(NUM_DATA, PS_TYPE_F32);
+
+    for (i=0;i<NUM_DATA;i++) {
+        x->data.F32[i] = (float) i;
+        y->data.F32[i] = setData(x->data.F32[i]);
+        yErr->data.F32[i] = YERR;
+        //        printf("Original data %d: (%.1f %.1f)\n", i, x->data.F32[i], y->data.F32[i]);
+    }
+
+    printPositiveTestHeader(stdout,
+                            "psMinimize functions",
+                            "psVectorFitPolynomial1D(): equal errors in yErr");
+
+    psVectorFitPolynomial1D(myPoly, x, y, yErr);
+
+    //    for (i=0;i<POLY_ORDER+1;i++) {
+    //        printf("Polynomial coefficient %d is %0.1f\n", i, myPoly->coeff[i]);
+    //    }
+
+    for (i=0;i<NUM_DATA;i++) {
+        expectData = setData(x->data.F32[i]);
+        actualData = psPolynomial1DEval(
+                         myPoly,
+                         x->data.F32[i]
+                     );
+        if (fabs(actualData-expectData) > fabs(ERROR_TOLERANCE * expectData)) {
+            printf("ERROR: Fitted data %d: (%.1f %.1f), expected was (%.1f)\n",
+                   i, x->data.F32[i], actualData, expectData);
+            testStatus = false;
+            //        } else {
+            //            printf("Fitted data %d: (%.1f %.1f), expected was (%.1f)\n",
+            //                   i, x->data.F32[i], actualData, expectData);
+        }
+    }
+
+    psMemCheckCorruption(1);
+    psFree(myPoly);
+    psFree(x);
+    psFree(y);
+    psFree(yErr);
+    psMemCheckCorruption(1);
+    memLeaks = psMemCheckLeaks(currentId,NULL,stderr,false);
+    if (0 != memLeaks) {
+        psAbort(__func__,"Memory Leaks! (%d leaks)", memLeaks);
+    }
+
+    printFooter(stdout,
+                "psMinimize functions",
+                "psVectorFitPolynomial1D(): equal errors in yErr",
+                testStatus);
+
+    return (!testStatus);
+}
+
+psS32 t01()
+{
+    psPolynomial1D *myPoly = NULL;
+    psVector *x = NULL;
+    psVector *y = NULL;
+    psS32 i = 0;
+    psS32 currentId = psMemGetId();
+    psS32 testStatus = true;
+    psS32 memLeaks = 0;
+    float expectData;
+    float actualData;
+
+    myPoly = psPolynomial1DAlloc(POLY_ORDER+1, PS_POLYNOMIAL_ORD);
+    x = psVectorAlloc(NUM_DATA, PS_TYPE_F32);
+    y = psVectorAlloc(NUM_DATA, PS_TYPE_F32);
+
+    for (i=0;i<NUM_DATA;i++) {
+        x->data.F32[i] = (float) i;
+        y->data.F32[i] = setData(x->data.F32[i]);
+        //        printf("Original data %d: (%.1f %.1f)\n", i, x->data.F32[i], y->data.F32[i]);
+    }
+
+    printPositiveTestHeader(stdout,
+                            "psMinimize functions",
+                            "psVectorFitPolynomial1D(): yErr is NULL");
+
+    psVectorFitPolynomial1D(myPoly, x, y, NULL);
+
+    //    for (i=0;i<POLY_ORDER+1;i++) {
+    //        printf("Polynomial coefficient %d is %0.1f\n", i, myPoly->coeff[i]);
+    //    }
+
+    for (i=0;i<NUM_DATA;i++) {
+        expectData = setData(x->data.F32[i]);
+        actualData = psPolynomial1DEval(
+                         myPoly,
+                         x->data.F32[i]
+                     );
+        if (fabs(actualData-expectData) > fabs(ERROR_TOLERANCE * expectData)) {
+            printf("ERROR: Fitted data %d: (%.1f %.1f), expected was (%.1f)\n",
+                   i, x->data.F32[i], actualData, expectData);
+            testStatus = false;
+            //        } else {
+            //            printf("Fitted data %d: (%.1f %.1f), expected was (%.1f)\n",
+            //                   i, x->data.F32[i], actualData, expectData);
+        }
+    }
+
+    psMemCheckCorruption(1);
+    psFree(myPoly);
+    psFree(x);
+    psFree(y);
+    psMemCheckCorruption(1);
+    memLeaks = psMemCheckLeaks(currentId,NULL,stderr,false);
+    if (0 != memLeaks) {
+        psAbort(__func__,"Memory Leaks! (%d leaks)", memLeaks);
+    }
+
+    printFooter(stdout,
+                "psMinimize functions",
+                "psVectorFitPolynomial1D(): yErr is NULL",
+                testStatus);
+
+    return (!testStatus);
+}
+
+psS32 t02()
+{
+    psPolynomial1D *myPoly = NULL;
+    psVector *y = NULL;
+    psS32 i = 0;
+    psS32 currentId = psMemGetId();
+    psS32 testStatus = true;
+    psS32 memLeaks = 0;
+    float expectData;
+    float actualData;
+
+    myPoly = psPolynomial1DAlloc(POLY_ORDER+1, PS_POLYNOMIAL_ORD);
+    y = psVectorAlloc(NUM_DATA, PS_TYPE_F32);
+
+    for (i=0;i<NUM_DATA;i++) {
+        y->data.F32[i] = setData((float) i);
+        //        printf("Original data %d: (%.1f)\n", i, y->data.F32[i]);
+    }
+
+    printPositiveTestHeader(stdout,
+                            "psMinimize functions",
+                            "psVectorFitPolynomial1D(): x, yErr is NULL");
+
+    psVectorFitPolynomial1D(myPoly, NULL, y, NULL);
+
+    //    for (i=0;i<POLY_ORDER+1;i++) {
+    //        printf("Polynomial coefficient %d is %0.1f\n", i, myPoly->coeff[i]);
+    //    }
+
+    for (i=0;i<NUM_DATA;i++) {
+        expectData = setData((float) i);
+        actualData = psPolynomial1DEval(
+                         myPoly,
+                         (float) i
+                     );
+        if (fabs(actualData-expectData) > fabs(ERROR_TOLERANCE * expectData)) {
+            printf("ERROR: Fitted data %d: (%.1f %.1f), expected was (%.1f)\n",
+                   i, (float) i, actualData, expectData);
+            testStatus = false;
+            //        } else {
+            //            printf("Fitted data %d: (%.1f %.1f), expected was (%.1f)\n",
+            //                   i, (float) i, actualData, expectData);
+        }
+    }
+
+    psMemCheckCorruption(1);
+    psFree(myPoly);
+    psFree(y);
+    psMemCheckCorruption(1);
+    memLeaks = psMemCheckLeaks(currentId,NULL,stderr,false);
+    if (0 != memLeaks) {
+        psAbort(__func__,"Memory Leaks! (%d leaks)", memLeaks);
+    }
+
+    printFooter(stdout,
+                "psMinimize functions",
+                "psVectorFitPolynomial1D(): x, yErr is NULL",
+                testStatus);
+
+    return (!testStatus);
+}
+
+psS32 t03()
+{
+    psS32 currentId = psMemGetId();
+    psS32 testStatus = true;
+    psS32 memLeaks = 0;
+
+    printPositiveTestHeader(stdout,
+                            "psMinimize functions",
+                            "psVectorFitPolynomial1D(): all inputs are NULL");
+
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate error for null arguments.");
+    psVectorFitPolynomial1D(NULL, NULL, NULL, NULL);
+
+
+    psMemCheckCorruption(1);
+    memLeaks = psMemCheckLeaks(currentId,NULL,stderr,false);
+    if (0 != memLeaks) {
+        psAbort(__func__,"Memory Leaks! (%d leaks)", memLeaks);
+    }
+
+    printFooter(stdout,
+                "psMinimize functions",
+                "psVectorFitPolynomial1D(): all inputs are NULL",
+                testStatus);
+
+    return (!testStatus);
+}
+
+
+psS32 main()
+{
+    t00();
+    t01();
+    t02();
+    t03();
+}
Index: /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psMinimize04b.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psMinimize04b.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psMinimize04b.c	(revision 22331)
@@ -0,0 +1,259 @@
+/*****************************************************************************
+    This routine must ensure that the psVectorFitPolynomial1D works correctly.
+ *****************************************************************************/
+#include <stdio.h>
+#include "pslib_strict.h"
+#include "psTest.h"
+#include "psMemory.h"
+#include "psVector.h"
+#include "psImage.h"
+#include "psFunctions.h"
+#include "psMinimize.h"
+#include <math.h>
+#define NUM_DATA 21
+#define POLY_ORDER 10
+#define A 2.0
+#define B 3.0
+#define C 2.0
+#define D 4.0
+#define E 5.0
+#define ERROR_TOLERANCE 0.10
+#define IGNORE (ERROR_TOLERANCE * NUM_DATA)
+
+double setData(double x)
+{
+    return(A + (B * x) + (C * x * x) + (D * x * x * x) + (E * x * x * x * x));
+}
+
+psS32 t00()
+{
+    psPolynomial1D *myPoly = NULL;
+    psVector *x = NULL;
+    psVector *y = NULL;
+    psVector *yErr = NULL;
+    psS32 i = 0;
+    psS32 currentId = psMemGetId();
+    psS32 testStatus = true;
+    psS32 memLeaks = 0;
+
+    myPoly = psPolynomial1DAlloc(POLY_ORDER+1, PS_POLYNOMIAL_CHEB);
+    x = psVectorAlloc(NUM_DATA, PS_TYPE_F64);
+    y = psVectorAlloc(NUM_DATA, PS_TYPE_F64);
+    yErr = psVectorAlloc(NUM_DATA, PS_TYPE_F64);
+
+    for (i=0;i<NUM_DATA;i++) {
+        x->data.F64[i] = (double) i;
+        y->data.F64[i] = setData(x->data.F64[i]);
+        yErr->data.F64[i] = 1.0;
+    }
+    p_psNormalizeVectorRangeF64(x, -1.0, 1.0);
+
+    printPositiveTestHeader(stdout,
+                            "psMinimize functions",
+                            "psVectorFitPolynomial1D(): CHEB, equal errors in yErr");
+
+    psVectorFitPolynomial1D(myPoly, x, y, yErr);
+
+    //  Remove for testing since print out differs from platforms
+    //    for (i=0;i<POLY_ORDER+1;i++) {
+    //        printf("Polynomial coefficient %d is %0.1f\n", i, myPoly->coeff[i]);
+    //    }
+
+    // We don't test the first or last few data items.
+    for (i=IGNORE;i<NUM_DATA-IGNORE;i++) {
+        double expectData = y->data.F64[i];
+        double actualData = psPolynomial1DEval(
+                                myPoly,
+                                x->data.F64[i]
+                            );
+        if (fabs(actualData-expectData) > fabs(ERROR_TOLERANCE * expectData)) {
+            printf("ERROR: Fitted data %d: (%.1f %.1f), expected was (%.1f)\n",
+                   i, x->data.F64[i], actualData, expectData);
+            testStatus = false;
+        }
+        //      Remove for testing since print out differs from platforms
+        //        } else {
+        //            printf("Fitted data %d: (%.1f %.1f), expected was (%.1f)\n",
+        //                   i, x->data.F64[i], actualData, expectData);
+        //        }
+    }
+
+    psMemCheckCorruption(1);
+    psFree(myPoly);
+    psFree(x);
+    psFree(y);
+    psFree(yErr);
+    psMemCheckCorruption(1);
+    memLeaks = psMemCheckLeaks(currentId,NULL,stderr,false);
+    if (0 != memLeaks) {
+        psAbort(__func__,"Memory Leaks! (%d leaks)", memLeaks);
+    }
+
+    printFooter(stdout,
+                "psMinimize functions",
+                "psVectorFitPolynomial1D(): CHEB, equal errors in yErr",
+                testStatus);
+    return (!testStatus);
+}
+
+
+psS32 t01()
+{
+    psPolynomial1D *myPoly = NULL;
+    psVector *x = NULL;
+    psVector *y = NULL;
+    psS32 i = 0;
+    psS32 currentId = psMemGetId();
+    psS32 testStatus = true;
+    psS32 memLeaks = 0;
+
+    myPoly = psPolynomial1DAlloc(POLY_ORDER+1, PS_POLYNOMIAL_CHEB);
+    x = psVectorAlloc(NUM_DATA, PS_TYPE_F64);
+    y = psVectorAlloc(NUM_DATA, PS_TYPE_F64);
+
+    for (i=0;i<NUM_DATA;i++) {
+        x->data.F64[i] = (double) i;
+        y->data.F64[i] = setData(x->data.F64[i]);
+    }
+    p_psNormalizeVectorRangeF64(x, -1.0, 1.0);
+
+    printPositiveTestHeader(stdout,
+                            "psMinimize functions",
+                            "psVectorFitPolynomial1D(): CHEB, yErr is NULL");
+
+    psVectorFitPolynomial1D(myPoly, x, y, NULL);
+
+    // We don't test the first or last few data items.
+    for (i=IGNORE;i<NUM_DATA-IGNORE;i++) {
+        double expectData = y->data.F64[i];
+        double actualData = psPolynomial1DEval(
+                                myPoly,
+                                x->data.F64[i]
+                            );
+        if (fabs(actualData-expectData) > fabs(ERROR_TOLERANCE * expectData)) {
+            printf("ERROR: Fitted data %d: (%.1f %.1f), expected was (%.1f)\n",
+                   i, x->data.F64[i], actualData, expectData);
+            testStatus = false;
+        }
+        //      Remove for testing since print out differs from platforms
+        //        } else {
+        //            printf("Fitted data %d: (%.1f %.1f), expected was (%.1f)\n",
+        //                   i, x->data.F64[i], actualData, expectData);
+        //        }
+    }
+
+    psMemCheckCorruption(1);
+    psFree(myPoly);
+    psFree(x);
+    psFree(y);
+    psMemCheckCorruption(1);
+    memLeaks = psMemCheckLeaks(currentId,NULL,stderr,false);
+    if (0 != memLeaks) {
+        psAbort(__func__,"Memory Leaks! (%d leaks)", memLeaks);
+    }
+
+    printFooter(stdout,
+                "psMinimize functions",
+                "psVectorFitPolynomial1D(): CHEB, yErr is NULL",
+                testStatus);
+    return (!testStatus);
+}
+
+
+psS32 t02()
+{
+    psPolynomial1D *myPoly = NULL;
+    psVector *x = NULL;
+    psVector *y = NULL;
+    psS32 i = 0;
+    psS32 currentId = psMemGetId();
+    psS32 testStatus = true;
+    psS32 memLeaks = 0;
+
+    myPoly = psPolynomial1DAlloc(POLY_ORDER+1, PS_POLYNOMIAL_CHEB);
+    x = psVectorAlloc(NUM_DATA, PS_TYPE_F64);
+    y = psVectorAlloc(NUM_DATA, PS_TYPE_F64);
+
+    for (i=0;i<NUM_DATA;i++) {
+        x->data.F64[i] = (double) i;
+        y->data.F64[i] = setData(x->data.F64[i]);
+    }
+    p_psNormalizeVectorRangeF64(x, -1.0, 1.0);
+
+    printPositiveTestHeader(stdout,
+                            "psMinimize functions",
+                            "psVectorFitPolynomial1D(): CHEB, x, yErr is NULL");
+
+    psVectorFitPolynomial1D(myPoly, NULL, y, NULL);
+    //    psVectorFitPolynomial1D(myPoly, x, y, NULL);
+
+    // We don't test the first or last few data items.
+    for (i=IGNORE;i<NUM_DATA-IGNORE;i++) {
+        double expectData = y->data.F64[i];
+        double actualData = psPolynomial1DEval(myPoly, x->data.F64[i]);
+        if (fabs(actualData-expectData) > fabs(ERROR_TOLERANCE * expectData)) {
+            printf("ERROR: Fitted data %d: (%.2f %.2f), expected was (%.2f)\n",
+                   i, x->data.F64[i], actualData, expectData);
+            testStatus = false;
+        }
+        //      Remove for testing since print out differs from platforms
+        //        } else {
+        //            printf("Fitted data %d: (%.2f %.2f), expected was (%.2f)\n",
+        //                   i, x->data.F64[i], actualData, expectData);
+        //        }
+    }
+
+    psMemCheckCorruption(1);
+    psFree(myPoly);
+    psFree(x);
+    psFree(y);
+    psMemCheckCorruption(1);
+    memLeaks = psMemCheckLeaks(currentId,NULL,stderr,false);
+    if (0 != memLeaks) {
+        psAbort(__func__,"Memory Leaks! (%d leaks)", memLeaks);
+    }
+
+    printFooter(stdout,
+                "psMinimize functions",
+                "psVectorFitPolynomial1D(): CHEB, x, yErr is NULL",
+                testStatus);
+    return (!testStatus);
+}
+
+psS32 t03()
+{
+    psPolynomial1D *myPoly = NULL;
+    psS32 currentId = psMemGetId();
+    psS32 testStatus = true;
+    psS32 memLeaks = 0;
+
+    printPositiveTestHeader(stdout,
+                            "psMinimize functions",
+                            "psVectorFitPolynomial1D(): CHEB, yErr is NULL");
+
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error for null arguments.");
+    myPoly = psVectorFitPolynomial1D(NULL, NULL, NULL, NULL);
+    if (myPoly != NULL) {
+        printf("ERROR: psVectorFitPolynomial1D() returned a non-NULL polynomial.\n");
+        testStatus = false;
+    }
+
+    psMemCheckCorruption(1);
+    memLeaks = psMemCheckLeaks(currentId,NULL,stderr,false);
+    if (0 != memLeaks) {
+        psAbort(__func__,"Memory Leaks! (%d leaks)", memLeaks);
+    }
+    printFooter(stdout,
+                "psMinimize functions",
+                "psVectorFitPolynomial1D(): CHEB, yErr is NULL",
+                testStatus);
+    return (!testStatus);
+}
+
+psS32 main()
+{
+    t00();
+    t01();
+    t02();
+    t03();
+}
Index: /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psMinimize04b_F32.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psMinimize04b_F32.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psMinimize04b_F32.c	(revision 22331)
@@ -0,0 +1,261 @@
+/*****************************************************************************
+    This routine must ensure that the psVectorFitPolynomial1D works correctly.
+ *****************************************************************************/
+#include <stdio.h>
+#include "pslib_strict.h"
+#include "psTest.h"
+#include "psMemory.h"
+#include "psVector.h"
+#include "psImage.h"
+#include "psFunctions.h"
+#include "psMinimize.h"
+#include <math.h>
+#define NUM_DATA 20
+#define POLY_ORDER 10
+#define A 2.0
+#define B 3.0
+#define C 2.0
+#define D 4.0
+#define E 5.0
+#define ERROR_TOLERANCE 0.10
+#define IGNORE (ERROR_TOLERANCE * NUM_DATA)
+
+float setData(float x)
+{
+    return(A + (B * x) + (C * x * x) + (D * x * x * x) + (E * x * x * x * x));
+}
+
+psS32 t00()
+{
+    psPolynomial1D *myPoly = NULL;
+    psVector *x = NULL;
+    psVector *y = NULL;
+    psVector *yErr = NULL;
+    psS32 i = 0;
+    psS32 currentId = psMemGetId();
+    psS32 testStatus = true;
+    psS32 memLeaks = 0;
+
+    myPoly = psPolynomial1DAlloc(POLY_ORDER+1, PS_POLYNOMIAL_CHEB);
+    x = psVectorAlloc(NUM_DATA, PS_TYPE_F32);
+    y = psVectorAlloc(NUM_DATA, PS_TYPE_F32);
+    yErr = psVectorAlloc(NUM_DATA, PS_TYPE_F32);
+
+    for (i=0;i<NUM_DATA;i++) {
+        x->data.F32[i] = (float) i;
+        y->data.F32[i] = setData(x->data.F32[i]);
+        yErr->data.F32[i] = 1.0;
+    }
+    p_psNormalizeVectorRangeF32(x, -1.0f, 1.0f);
+
+    printPositiveTestHeader(stdout,
+                            "psMinimize functions",
+                            "psVectorFitPolynomial1D(): CHEB, equal errors in yErr");
+
+    psVectorFitPolynomial1D(myPoly, x, y, yErr);
+
+    //  Remove for testing since printout differs between platforms
+    //    for (i=0;i<POLY_ORDER+1;i++) {
+    //        printf("Polynomial coefficient %d is %0.1f\n", i, myPoly->coeff[i]);
+    //    }
+
+    // We don't test the first or last few data items.
+    for (i=IGNORE;i<NUM_DATA-IGNORE;i++) {
+        float expectData = y->data.F32[i];
+        float actualData = psPolynomial1DEval(
+                               myPoly,
+                               x->data.F32[i]
+                           );
+        if (fabs(actualData-expectData) > fabs(ERROR_TOLERANCE * expectData)) {
+            printf("ERROR: Fitted data %d: (%.1f %.1f), expected was (%.1f)\n",
+                   i, x->data.F32[i], actualData, expectData);
+            testStatus = false;
+        }
+        //       REMOVE for testing since printout is different for different platforms
+        //        } else {
+        //            printf("Fitted data %d: (%.1f %.1f), expected was (%.1f)\n",
+        //                   i, x->data.F32[i], actualData, expectData);
+        //        }
+    }
+
+    psMemCheckCorruption(1);
+    psFree(myPoly);
+    psFree(x);
+    psFree(y);
+    psFree(yErr);
+    psMemCheckCorruption(1);
+    memLeaks = psMemCheckLeaks(currentId,NULL,stderr,false);
+    if (0 != memLeaks) {
+        psAbort(__func__,"Memory Leaks! (%d leaks)", memLeaks);
+    }
+
+    printFooter(stdout,
+                "psMinimize functions",
+                "psVectorFitPolynomial1D(): CHEB, equal errors in yErr",
+                testStatus);
+    return (!testStatus);
+}
+
+
+psS32 t01()
+{
+    psPolynomial1D *myPoly = NULL;
+    psVector *x = NULL;
+    psVector *y = NULL;
+    psS32 i = 0;
+    psS32 currentId = psMemGetId();
+    psS32 testStatus = true;
+    psS32 memLeaks = 0;
+
+    myPoly = psPolynomial1DAlloc(POLY_ORDER+1, PS_POLYNOMIAL_CHEB);
+    x = psVectorAlloc(NUM_DATA, PS_TYPE_F32);
+    y = psVectorAlloc(NUM_DATA, PS_TYPE_F32);
+
+    for (i=0;i<NUM_DATA;i++) {
+        x->data.F32[i] = (float) i;
+        y->data.F32[i] = setData(x->data.F32[i]);
+    }
+    p_psNormalizeVectorRangeF32(x, -1.0f, 1.0f);
+
+    printPositiveTestHeader(stdout,
+                            "psMinimize functions",
+                            "psVectorFitPolynomial1D(): CHEB, yErr is NULL");
+
+    psVectorFitPolynomial1D(myPoly, x, y, NULL);
+
+    // We don't test the first or last few data items.
+    for (i=IGNORE;i<NUM_DATA-IGNORE;i++) {
+        float expectData = y->data.F32[i];
+        float actualData = psPolynomial1DEval(
+                               myPoly,
+                               x->data.F32[i]
+                           );
+        if (fabs(actualData-expectData) > fabs(ERROR_TOLERANCE * expectData)) {
+            printf("ERROR: Fitted data %d: (%.1f %.1f), expected was (%.1f)\n",
+                   i, x->data.F32[i], actualData, expectData);
+            testStatus = false;
+        }
+        //      Removed for testing since printout different on different platforms
+        //        } else {
+        //            printf("Fitted data %d: (%.1f %.1f), expected was (%.1f)\n",
+        //                   i, x->data.F32[i], actualData, expectData);
+        //        }
+    }
+
+    psMemCheckCorruption(1);
+    psFree(myPoly);
+    psFree(x);
+    psFree(y);
+    psMemCheckCorruption(1);
+    memLeaks = psMemCheckLeaks(currentId,NULL,stderr,false);
+    if (0 != memLeaks) {
+        psAbort(__func__,"Memory Leaks! (%d leaks)", memLeaks);
+    }
+
+    printFooter(stdout,
+                "psMinimize functions",
+                "psVectorFitPolynomial1D(): CHEB, yErr is NULL",
+                testStatus);
+    return (!testStatus);
+}
+
+
+psS32 t02()
+{
+    psPolynomial1D *myPoly = NULL;
+    psVector *x = NULL;
+    psVector *y = NULL;
+    psS32 i = 0;
+    psS32 currentId = psMemGetId();
+    psS32 testStatus = true;
+    psS32 memLeaks = 0;
+
+    myPoly = psPolynomial1DAlloc(POLY_ORDER+1, PS_POLYNOMIAL_CHEB);
+    x = psVectorAlloc(NUM_DATA, PS_TYPE_F32);
+    y = psVectorAlloc(NUM_DATA, PS_TYPE_F32);
+
+    for (i=0;i<NUM_DATA;i++) {
+        x->data.F32[i] = (float) i;
+        y->data.F32[i] = setData(x->data.F32[i]);
+    }
+    p_psNormalizeVectorRangeF32(x, -1.0, 1.0);
+
+    printPositiveTestHeader(stdout,
+                            "psMinimize functions",
+                            "psVectorFitPolynomial1D(): CHEB, x, yErr is NULL");
+
+    psVectorFitPolynomial1D(myPoly, NULL, y, NULL);
+
+    // We don't test the first or last few data items.
+    for (i=IGNORE;i<NUM_DATA-IGNORE;i++) {
+        float expectData = y->data.F32[i];
+        float  actualData = psPolynomial1DEval(
+                                myPoly,
+                                x->data.F32[i]
+                            );
+        if (fabs(actualData-expectData) > fabs(ERROR_TOLERANCE * expectData)) {
+            printf("ERROR: Fitted data %d: (%.1f %.1f), expected was (%.1f)\n",
+                   i, x->data.F32[i], actualData, expectData);
+            testStatus = false;
+        }
+        //      Remove for testing since printout different for different platforms
+        //        } else {
+        //            printf("Fitted data %d: (%.1f %.1f), expected was (%.1f)\n",
+        //                   i, x->data.F32[i], actualData, expectData);
+        //        }
+    }
+
+    psMemCheckCorruption(1);
+    psFree(myPoly);
+    psFree(x);
+    psFree(y);
+    psMemCheckCorruption(1);
+    memLeaks = psMemCheckLeaks(currentId,NULL,stderr,false);
+    if (0 != memLeaks) {
+        psAbort(__func__,"Memory Leaks! (%d leaks)", memLeaks);
+    }
+
+    printFooter(stdout,
+                "psMinimize functions",
+                "psVectorFitPolynomial1D(): CHEB, x, yErr is NULL",
+                testStatus);
+    return (!testStatus);
+}
+
+psS32 t03()
+{
+    psPolynomial1D *myPoly = NULL;
+    psS32 currentId = psMemGetId();
+    psS32 testStatus = true;
+    psS32 memLeaks = 0;
+
+    printPositiveTestHeader(stdout,
+                            "psMinimize functions",
+                            "psVectorFitPolynomial1D(): CHEB, yErr is NULL");
+
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate error for null arguments.");
+    myPoly = psVectorFitPolynomial1D(NULL, NULL, NULL, NULL);
+    if (myPoly != NULL) {
+        printf("ERROR: psVectorFitPolynomial1D() returned a non-NULL polynomial.\n");
+        testStatus = false;
+    }
+
+    psMemCheckCorruption(1);
+    memLeaks = psMemCheckLeaks(currentId,NULL,stderr,false);
+    if (0 != memLeaks) {
+        psAbort(__func__,"Memory Leaks! (%d leaks)", memLeaks);
+    }
+    printFooter(stdout,
+                "psMinimize functions",
+                "psVectorFitPolynomial1D(): CHEB, yErr is NULL",
+                testStatus);
+    return (!testStatus);
+}
+
+psS32 main()
+{
+    t00();
+    t01();
+    t02();
+    t03();
+}
Index: /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psMinimize05.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psMinimize05.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psMinimize05.c	(revision 22331)
@@ -0,0 +1,279 @@
+/*****************************************************************************
+    This routine must ensure that psMinimizePowell() works correctly.
+ 
+    We test with a NULL and non-NULL paramMask.
+ 
+    XXX: Must verify the stderr for the NULL parameter tests.
+ *****************************************************************************/
+#include <stdio.h>
+#include "pslib_strict.h"
+#include "psTest.h"
+#include <math.h>
+#define N 5
+#define MIN_VALUE 20.0
+#define NUM_PARAMS 10
+#define ERROR_TOLERANCE 0.10
+float expectedParm[NUM_PARAMS];
+psS32 testStatus = true;
+
+/*****************************************************************************
+myFunc(): This routine subtracts the associate value in expectedParm[] from
+each parameter and then squares it, then sums that for all parameters, then
+adds MIN_VALUE to it.  The minimum for this function will be MIN_VALUE, and
+will occur when each parameter equals the associated value in expectedParm[].
+ 
+This procedure ignores the coordinates, other than to ensure that they were
+passed correctly from psMinimizePowell().
+ *****************************************************************************/
+float myFunc(psVector *myParams,
+             psArray *myCoords)
+{
+    float sum = 0.0;
+    float coordData = 0.0;
+    float expData = 0.0;
+    psS32 i;
+
+    for (i=0;i<N;i++) {
+        coordData = ((psVector *) (myCoords->data[i]))->data.F32[0];
+        expData = (float) (i+10);
+        if (fabs(coordData - expData) > FLT_EPSILON) {
+            printf("ERROR(1): coordinate data was incorrectly passed to myFunc()\n");
+            printf("ERROR(1): was (%f) should be (%f)\n", coordData, expData);
+            testStatus = false;
+        }
+        coordData = ((psVector *) (myCoords->data[i]))->data.F32[1];
+        expData = (float) (i+3);
+        if (fabs(coordData - expData) > FLT_EPSILON) {
+            printf("ERROR(2): coordinate data was incorrectly passed to myFunc()\n");
+            printf("ERROR(2): was (%f) should be (%f)\n", coordData, expData);
+            testStatus = false;
+        }
+    }
+
+
+    sum = 0.0;
+    for (i=0;i<NUM_PARAMS;i++) {
+        sum+= (myParams->data.F32[i] - expectedParm[i]) * (myParams->data.F32[i] - expectedParm[i]);
+    }
+    sum = MIN_VALUE + (sum * sum);
+
+    return(sum);
+}
+
+
+psS32 t00()
+{
+    psS32 currentId = psMemGetId();
+    psS32 memLeaks = 0;
+    psS32 i = 0;
+    psArray *myCoords;
+    psVector *myParams;
+    psVector *myParamMask;
+    psMinimization *min;
+
+    psTraceSetLevel(".psLib", 0);
+    /**************************************************************************
+     *************************************************************************/
+    myParams = psVectorAlloc(NUM_PARAMS, PS_TYPE_F32);
+    myParamMask = psVectorAlloc(NUM_PARAMS, PS_TYPE_U8);
+    min = psMinimizationAlloc(100, 0.01);
+
+    myCoords = psArrayAlloc(N);
+    for (i=0;i<N;i++) {
+        myCoords->data[i] = (psPtr *) psVectorAlloc(2, PS_TYPE_F32);
+        ((psVector *) (myCoords->data[i]))->data.F32[0] = (float) (i+10);
+        ((psVector *) (myCoords->data[i]))->data.F32[1] = (float) (i+3);
+    }
+    for (i=0;i<NUM_PARAMS;i++) {
+        expectedParm[i] = 2.32 + (float) (2 * i);
+        myParams->data.F32[i] = 0.0;
+        myParams->data.F32[i] = (float) i;
+        myParamMask->data.U8[i] = 0;
+    }
+
+    printPositiveTestHeader(stdout,
+                            "psMinimize functions",
+                            "psMinimizePowell()");
+
+    psMinimizePowell(min,
+                     myParams,
+                     myParamMask,
+                     myCoords,
+                     (psMinimizePowellFunc) myFunc);
+
+    printf("\nThe minimum is %f (expected: %f)\n", min->value, MIN_VALUE);
+
+    for (i=0;i<NUM_PARAMS;i++) {
+        printf("Parameter %d at the minimum is %f (expected: %f)\n", i,
+               myParams->data.F32[i], expectedParm[i]);
+
+        if (fabs(myParams->data.F32[i] - expectedParm[i]) > fabs(ERROR_TOLERANCE * expectedParm[i])) {
+            printf("ERROR: Parameter %d: (%.1f), expected was (%.1f)\n",
+                   i, myParams->data.F32[i], expectedParm[i]);
+            testStatus = false;
+        } else {
+            printf("Parameter %d: (%.1f), expected was (%.1f)\n",
+                   i, myParams->data.F32[i], expectedParm[i]);
+        }
+    }
+
+
+    psFree(myCoords);
+    psFree(myParams);
+    psFree(myParamMask);
+    psFree(min);
+
+    psMemCheckCorruption(1);
+    memLeaks = psMemCheckLeaks(currentId,NULL,stderr,false);
+    if (0 != memLeaks) {
+        psAbort(__func__,"Memory Leaks! (%d leaks)", memLeaks);
+    }
+    printFooter(stdout,
+                "psMinimize functions",
+                "psMinimizePowell()",
+                testStatus);
+
+
+    return (!testStatus);
+}
+
+psS32 t01()
+{
+    psS32 currentId = psMemGetId();
+    psS32 memLeaks = 0;
+    psS32 i = 0;
+    psArray *myCoords;
+    psVector *myParams;
+    psMinimization *min;
+
+    psTraceSetLevel(".psLib", 0);
+    /**************************************************************************
+     *************************************************************************/
+    myParams = psVectorAlloc(NUM_PARAMS, PS_TYPE_F32);
+    min = psMinimizationAlloc(100, 0.01);
+
+    myCoords = psArrayAlloc(N);
+    for (i=0;i<N;i++) {
+        myCoords->data[i] = (psPtr *) psVectorAlloc(2, PS_TYPE_F32);
+        ((psVector *) (myCoords->data[i]))->data.F32[0] = (float) (i+10);
+        ((psVector *) (myCoords->data[i]))->data.F32[1] = (float) (i+3);
+    }
+    for (i=0;i<NUM_PARAMS;i++) {
+        expectedParm[i] = 2.32 + (float) (2 * i);
+        myParams->data.F32[i] = 0.0;
+        myParams->data.F32[i] = (float) i;
+    }
+
+    printPositiveTestHeader(stdout,
+                            "psMinimize functions",
+                            "psMinimizePowell()");
+
+    psMinimizePowell(min,
+                     myParams,
+                     NULL,
+                     myCoords,
+                     (psMinimizePowellFunc) myFunc);
+
+    printf("\nThe minimum is %f (expected: %f)\n", min->value, MIN_VALUE);
+
+    for (i=0;i<NUM_PARAMS;i++) {
+        printf("Parameter %d at the minimum is %f (expected: %f)\n", i,
+               myParams->data.F32[i], expectedParm[i]);
+
+        if (fabs(myParams->data.F32[i] - expectedParm[i]) > fabs(ERROR_TOLERANCE * expectedParm[i])) {
+            printf("ERROR: Parameter %d: (%.1f), expected was (%.1f)\n",
+                   i, myParams->data.F32[i], expectedParm[i]);
+            testStatus = false;
+        } else {
+            printf("Parameter %d: (%.1f), expected was (%.1f)\n",
+                   i, myParams->data.F32[i], expectedParm[i]);
+        }
+    }
+
+
+    psFree(myCoords);
+    psFree(myParams);
+    psFree(min);
+
+    psMemCheckCorruption(1);
+    memLeaks = psMemCheckLeaks(currentId,NULL,stderr,false);
+    if (0 != memLeaks) {
+        psAbort(__func__,"Memory Leaks! (%d leaks)", memLeaks);
+    }
+    printFooter(stdout,
+                "psMinimize functions",
+                "psMinimizePowell()",
+                testStatus);
+
+
+    return (!testStatus);
+}
+
+psS32 t02()
+{
+    psS32 currentId = psMemGetId();
+    psS32 memLeaks = 0;
+    psS32 i = 0;
+    psArray *myCoords;
+    psVector *myParams;
+    psVector *myParamMask;
+    psMinimization *min;
+
+    psTraceSetLevel(".psLib", 0);
+    /**************************************************************************
+     *************************************************************************/
+    myParams = psVectorAlloc(NUM_PARAMS, PS_TYPE_F32);
+    myParamMask = psVectorAlloc(NUM_PARAMS, PS_TYPE_U8);
+    min = psMinimizationAlloc(100, 0.01);
+
+    myCoords = psArrayAlloc(N);
+    for (i=0;i<N;i++) {
+        myCoords->data[i] = (psPtr *) psVectorAlloc(2, PS_TYPE_F32);
+        ((psVector *) (myCoords->data[i]))->data.F32[0] = (float) (i+10);
+        ((psVector *) (myCoords->data[i]))->data.F32[1] = (float) (i+3);
+    }
+    for (i=0;i<NUM_PARAMS;i++) {
+        expectedParm[i] = 2.32 + (float) (2 * i);
+        myParams->data.F32[i] = 0.0;
+        myParams->data.F32[i] = (float) i;
+        myParamMask->data.U8[i] = 0;
+    }
+
+    printPositiveTestHeader(stdout,
+                            "psMinimize functions",
+                            "psMinimizePowell(): various NULL inputs");
+
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate error for null minimize.");
+    psMinimizePowell(NULL, myParams, myParamMask, myCoords, (psMinimizePowellFunc) myFunc);
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate error for null parameter vector");
+    psMinimizePowell(min, NULL, myParamMask, myCoords,(psMinimizePowellFunc) myFunc);
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate error for null coords.");
+    psMinimizePowell(min, myParams, myParamMask, NULL, (psMinimizePowellFunc) myFunc);
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate error for null function");
+    psMinimizePowell(min, myParams, myParamMask, myCoords, NULL);
+
+    psFree(myCoords);
+    psFree(myParams);
+    psFree(myParamMask);
+    psFree(min);
+
+    psMemCheckCorruption(1);
+    memLeaks = psMemCheckLeaks(currentId,NULL,stderr,false);
+    if (0 != memLeaks) {
+        psAbort(__func__,"Memory Leaks! (%d leaks)", memLeaks);
+    }
+    printFooter(stdout,
+                "psMinimize functions",
+                "psMinimizePowell(): various NULL inputs",
+                testStatus);
+
+
+    return (!testStatus);
+}
+
+psS32 main()
+{
+    t00();
+    t01();
+    t02();
+}
Index: /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psMinimize06.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psMinimize06.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psMinimize06.c	(revision 22331)
@@ -0,0 +1,120 @@
+/*****************************************************************************
+    This routine must ensure that psMinimizeLM() works correctly.
+ *****************************************************************************/
+#include <stdio.h>
+#include "pslib_strict.h"
+#include "psTest.h"
+#include <math.h>
+#define NUM_ITERATIONS 10000
+#define ERR_TOL 0.0
+#define N 20
+#define MIN_VALUE 5.0
+#define NUM_PARAMS 3
+float expectedParm[NUM_PARAMS];
+psS32 testStatus = true;
+
+/*****************************************************************************
+myFunc(): This routine subtracts the associate value in expectedParm[] from
+each parameter and then squares it, then sums that for all parameters, then
+adds MIN_VALUE to it.  The minimum for this function will be MIN_VALUE, and
+will occur when each parameter equals the associated value in expectedParm[].
+ 
+This procedure ignores the coordinates, other than to ensure that they were
+passed correctly from psMinimizePowell().
+ 
+ *****************************************************************************/
+psVector *myFunc(psImage *myDeriv,
+                 psVector *myParams,
+                 psArray *myCoords)
+{
+    psVector *sum = psVectorAlloc(myCoords->n, PS_TYPE_F32);
+    psS32 i;
+    psS32 j;
+
+
+    if (myDeriv == NULL) {
+        myDeriv = psImageAlloc(myParams->n, myCoords->n, PS_TYPE_F32);
+        psError(PS_ERR_UNKNOWN, true, "myDeriv is NULL.\n");
+    }
+
+    for (i=0;i<N;i++) {
+        sum->data.F32[i] = MIN_VALUE;
+        for (j=0;j<NUM_PARAMS;j++) {
+            sum->data.F32[i]+= (myParams->data.F32[j] - expectedParm[j]) *
+                               (myParams->data.F32[j] - expectedParm[j]);
+
+            myDeriv->data.F32[i][j] = (2.0 * myParams->data.F32[j]) -
+                                      (2.0 * expectedParm[j]);
+        }
+    }
+
+    return(sum);
+}
+
+psS32 t01()
+{
+    psS32 currentId = psMemGetId();
+    psS32 memLeaks = 0;
+    psS32 i = 0;
+    psArray *myCoords;
+    psVector *myParams;
+    psImage *myCovar;
+    psMinimization *min;
+    psVector *y;
+
+    psTraceSetLevel(".psLib", 0);
+    /**************************************************************************
+     *************************************************************************/
+    min = psMinimizationAlloc(NUM_ITERATIONS, ERR_TOL);
+    myCovar = psImageAlloc(NUM_PARAMS, NUM_PARAMS, PS_TYPE_F32);
+    myParams = psVectorAlloc(NUM_PARAMS, PS_TYPE_F32);
+    myCoords = psArrayAlloc(N);
+    y = psVectorAlloc(N, PS_TYPE_F32);
+
+    for (i=0;i<N;i++) {
+        myCoords->data[i] = (psPtr *) psVectorAlloc(2, PS_TYPE_F32);
+        ((psVector *) (myCoords->data[i]))->data.F32[0] = (float) (i+10);
+        ((psVector *) (myCoords->data[i]))->data.F32[1] = (float) (i+3);
+        y->data.F32[i] = (float) i;
+    }
+    for (i=0;i<NUM_PARAMS;i++) {
+        expectedParm[i] = 2.42 + (float) (2 * i);
+        myParams->data.F32[i] = (float) i;
+        myParams->data.F32[i] = expectedParm[i] * 1.3;
+        myParams->data.F32[i] = (float) (5 + i);
+        myParams->data.F32[i] = 0.0;
+    }
+
+    psMinimizeLMChi2(min,
+                     myCovar,
+                     myParams,
+                     NULL,
+                     myCoords,
+                     y,
+                     NULL,
+                     (psMinimizeLMChi2Func) myFunc);
+
+    printf("\nThe chi-squared is %f\n", min->value);
+    for (i=0;i<NUM_PARAMS;i++) {
+        printf("Parameter %d at the minimum is %f (expected: %f)\n", i,
+               myParams->data.F32[i], expectedParm[i]);
+    }
+
+    psFree(min);
+    psFree(myCovar);
+    psFree(myParams);
+    psFree(myCoords);
+    psFree(y);
+
+    psMemCheckCorruption(1);
+    memLeaks = psMemCheckLeaks(currentId,NULL,NULL,false);
+    if (0 != memLeaks) {
+        psAbort(__func__,"Memory Leaks! (%d leaks)", memLeaks);
+    }
+    return (!testStatus);
+}
+
+psS32 main()
+{
+    t01();
+}
Index: /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psMinimize07.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psMinimize07.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psMinimize07.c	(revision 22331)
@@ -0,0 +1,164 @@
+/*****************************************************************************
+    This routine must ensure that psMinimizeLMChi2Gauss1D() works correctly.
+ *****************************************************************************/
+#include <stdio.h>
+#include "pslib_strict.h"
+#include "psTest.h"
+#include <math.h>
+#define NUM_ITERATIONS 100
+#define ERR_TOL 0.0
+#define N 24
+#define NUM_PARAMS 2
+#define MEAN 14.5
+#define STDEV 1.2
+
+float expectedParm[NUM_PARAMS];
+psS32 testStatus = true;
+
+// This routine generates a vector of length "n" with the specified mean and
+// stdev.
+psVector *genGaussianVector(int n, float mean, float stdev)
+{
+    psVector *y = psVectorAlloc(n, PS_TYPE_F32);
+
+    for (psS32 i=0;i<n;i++) {
+        y->data.F32[i] = psGaussian((float) i, mean, stdev, false);
+    }
+    return(y);
+}
+
+// This routine tries to fit a Gaussian to a set of data points via the
+// psMinimizeLMChi2() and psMinimizeLMChi2Gauss1D() functions.
+psS32 t00()
+{
+    psS32 currentId = psMemGetId();
+    psS32 memLeaks = 0;
+    psS32 i = 0;
+    psArray *myCoords;
+    psVector *myParams;
+    psImage *myCovar;
+    psMinimization *min;
+
+    psTraceSetLevel(".psLib.dataManip.psMinimize", 0);
+    /**************************************************************************
+     *************************************************************************/
+    min = psMinimizationAlloc(NUM_ITERATIONS, ERR_TOL);
+    myCovar = psImageAlloc(NUM_PARAMS, NUM_PARAMS, PS_TYPE_F32);
+    myParams = psVectorAlloc(NUM_PARAMS, PS_TYPE_F32);
+    myParams->data.F32[0] = MEAN * 0.7;
+    myParams->data.F32[1] = STDEV * 0.7;
+    myCoords = psArrayAlloc(N);
+    psVector *y = genGaussianVector(N, MEAN, STDEV);
+
+    for (i=0;i<N;i++) {
+        myCoords->data[i] = (psPtr *) psVectorAlloc(2, PS_TYPE_F32);
+        ((psVector *) (myCoords->data[i]))->data.F32[0] = (float) i;
+        printf("Initial data %d: (%f, %f)\n", i, ((psVector *) (myCoords->data[i]))->data.F32[0], y->data.F32[i]);
+    }
+
+    psMinimizeLMChi2(min,
+                     myCovar,
+                     myParams,
+                     NULL,
+                     myCoords,
+                     y,
+                     NULL,
+                     (psMinimizeLMChi2Func) psMinimizeLMChi2Gauss1D);
+
+    printf("\nThe chi-squared is %f\n", min->value);
+
+    expectedParm[0] = MEAN;
+    expectedParm[1] = STDEV;
+    for (i=0;i<NUM_PARAMS;i++) {
+        printf("Parameter %d at the minimum is %f (expected: %f)\n", i,
+               myParams->data.F32[i], expectedParm[i]);
+    }
+
+    psFree(min);
+    psFree(myCovar);
+    psFree(myParams);
+    psFree(myCoords);
+    psFree(y);
+
+    psMemCheckCorruption(1);
+    memLeaks = psMemCheckLeaks(currentId,NULL,NULL,false);
+    if (0 != memLeaks) {
+        psAbort(__func__,"Memory Leaks! (%d leaks)", memLeaks);
+    }
+    return (!testStatus);
+}
+
+// This routine tries to fit a Gaussian to a set of data points via the
+// psMinimizeChi2Powell() function.
+psS32 t01()
+{
+    psS32 currentId = psMemGetId();
+    psS32 memLeaks = 0;
+    psS32 i = 0;
+    psArray *myCoords;
+    psVector *myParams;
+    psImage *myCovar;
+    psMinimization *min;
+
+    psTraceSetLevel(".psLib.dataManip.psMinimize", 0);
+    psTraceSetLevel(".psLib.dataManip.psMinimizeLMChi2Gauss1D", 0);
+
+    psTraceSetLevel(".psLib.dataManip.psMinimizePowell", 0);
+    psTraceSetLevel(".psLib.dataManip.myPowellChi2Func", 0);
+    psTraceSetLevel(".psLib.dataManip.p_psLineMin", 0);
+    psTraceSetLevel(".psLib.dataManip.p_psDetermineBracket", 0);
+    psTraceSetLevel(".psLib.dataManip.psFunctions.psGaussian", 0);
+    psTraceSetLevel(".psLib.dataManip.psFunctions", 0);
+    psTraceSetLevel(".", 0);
+    //    psTracePrintLevels();
+    /**************************************************************************
+     *************************************************************************/
+    min = psMinimizationAlloc(NUM_ITERATIONS, ERR_TOL);
+    myCovar = psImageAlloc(NUM_PARAMS, NUM_PARAMS, PS_TYPE_F32);
+    myParams = psVectorAlloc(NUM_PARAMS, PS_TYPE_F32);
+    myParams->data.F32[0] = MEAN * 0.7;
+    myParams->data.F32[1] = STDEV * 0.7;
+    myCoords = psArrayAlloc(N);
+    psVector *y = genGaussianVector(N, MEAN, STDEV);
+
+    for (i=0;i<N;i++) {
+        myCoords->data[i] = (psPtr *) psVectorAlloc(2, PS_TYPE_F32);
+        ((psVector *) (myCoords->data[i]))->data.F32[0] = (float) i;
+        printf("Initial data %d: (%f, %f)\n", i, ((psVector *) (myCoords->data[i]))->data.F32[0], y->data.F32[i]);
+    }
+
+    //    psMinimizeChi2Powell(min, myParams, NULL, myCoords, y, NULL,
+    //                         (psMinimizeChi2PowellFunc) myFunc);
+    psMinimizeChi2Powell(min, myParams, NULL, myCoords, y, NULL,
+                         (psMinimizeChi2PowellFunc) psMinimizePowellChi2Gauss1D);
+
+    printf("\nThe chi-squared is %f\n", min->value);
+
+    expectedParm[0] = MEAN;
+    expectedParm[1] = STDEV;
+    for (i=0;i<NUM_PARAMS;i++) {
+        printf("Parameter %d at the minimum is %f (expected: %f)\n", i,
+               myParams->data.F32[i], expectedParm[i]);
+    }
+
+    psFree(min);
+    psFree(myCovar);
+    psFree(myParams);
+    psFree(myCoords);
+    psFree(y);
+
+    psMemCheckCorruption(1);
+    memLeaks = psMemCheckLeaks(currentId,NULL,NULL,false);
+    if (0 != memLeaks) {
+        psAbort(__func__,"Memory Leaks! (%d leaks)", memLeaks);
+    }
+    return (!testStatus);
+}
+
+psS32 main()
+{
+    t00();
+    t01();
+}
+//This code is
+
Index: /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psRandom.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psRandom.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psRandom.c	(revision 22331)
@@ -0,0 +1,476 @@
+/*****************************************************************************
+This routine must ensure that the various random number generator functions
+work properly.
+ 
+    t00(): ensure that psRandom structs are properly allocated by psRandomAlloc().
+    t01(): ensure that psRandomUniform() produces a sequence of numbers with
+    proper mean and stdev.
+    t02(): ensure that psRandomGaussian() produces a sequence of numbers with
+    proper mean and stdev.
+    t03(): ensure that psRandomPoisson() produces a sequence of numbers with
+    proper mean and stdev.
+    t04(): ensure that psRandomReset() properly seeds the random number
+    generator for psRandomUniform().
+    t05(): ensure that psRandomReset() properly seeds the random number
+    generator for psRandomGaussian().
+    t06(): ensure that psRandomReset() properly seeds the random number
+    generator for psRandomPoisson().
+ *****************************************************************************/
+#include <stdio.h>
+#include <math.h>
+#include "pslib_strict.h"
+#include "psTest.h"
+
+#define NUM_DATA 10000
+#define SEED 54321
+#define SEED2 345
+#define UNIFORM_MEAN 0.5
+#define UNIFORM_STDEV 0.3
+#define GAUSSIAN_MEAN 0.0
+#define GAUSSIAN_STDEV 1.0
+#define POISSON_MEAN 15.0
+#define POISSON_STDEV (POISSON_MEAN / 4)
+#define ERROR_TOLERANCE 0.1
+psS32 testStatus = true;
+
+psS32 t00()
+{
+    psRandom *myRNG = NULL;
+    psS32 currentId = psMemGetId();
+    psS32 memLeaks = 0;
+
+    printPositiveTestHeader(stdout,
+                            "psRandom functions",
+                            "psRandomAlloc()");
+
+    // Valid type allocation
+    myRNG = psRandomAlloc(PS_RANDOM_TAUS, SEED);
+    if (myRNG == NULL) {
+        printf("ERROR: Could not allocate psRandom structure\n");
+        testStatus = false;
+    }
+    if (myRNG->type != PS_RANDOM_TAUS) {
+        psError(PS_ERR_UNKNOWN,true,"Did not have the expected type");
+        testStatus = false;
+    }
+    psFree(myRNG);
+
+    // Valid type allocation with seed equal to zero
+    psLogSetDestination("file:seed_msglog1.txt");
+    myRNG = psRandomAlloc(PS_RANDOM_TAUS, 0);
+    psLogSetDestination("dest:stderr");
+    if (myRNG == NULL) {
+        printf("ERROR: Could not allocate psRandom structure\n");
+        testStatus = false;
+    }
+    if (myRNG->type != PS_RANDOM_TAUS) {
+        psError(PS_ERR_UNKNOWN,true,"Did not have the expected type");
+        testStatus = false;
+    }
+    psFree(myRNG);
+
+    // Invalid type allocation
+    psLogMsg(__func__,PS_LOG_INFO,"Invalid type, should generate error message");
+    myRNG = psRandomAlloc(100,SEED);
+    if (myRNG != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Did not return NULL for invalid type");
+        testStatus = false;
+    }
+
+    // Negative seed value
+    myRNG = psRandomAlloc(PS_RANDOM_TAUS,-5);
+    if(myRNG == NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Did not return allocated psRandom");
+        testStatus = false;
+    }
+    psFree(myRNG);
+
+    psMemCheckCorruption(1);
+    memLeaks = psMemCheckLeaks(currentId,NULL,stderr,false);
+    if (0 != memLeaks) {
+        printf("ERROR: Memory Leaks! (%d leaks)", memLeaks);
+        testStatus = false;
+    }
+
+    printFooter(stdout,
+                "psRandom functions",
+                "psRandomAlloc()",
+                testStatus);
+
+    return(testStatus);
+}
+
+psS32 t01()
+{
+    psRandom *myRNG = NULL;
+    psS32 currentId = psMemGetId();
+    psS32 memLeaks = 0;
+    psVector *rans = psVectorAlloc(NUM_DATA, PS_TYPE_F64);
+    psStats *stats = psStatsAlloc(PS_STAT_SAMPLE_MEAN);
+
+    printPositiveTestHeader(stdout,
+                            "psRandom functions",
+                            "psRandomAlloc() and psRandomUniform()");
+
+    myRNG = psRandomAlloc(PS_RANDOM_TAUS, SEED);
+    if (myRNG == NULL) {
+        printf("ERROR: Could not allocate psRandom structure\n");
+        testStatus = false;
+    }
+
+    for (psS32 i = 0 ; i < NUM_DATA ; i++) {
+        rans->data.F64[i] = psRandomUniform(myRNG);
+        //        printf("%.2f\n", rans->data.F64[i]);
+    }
+    stats = psVectorStats(stats, rans, NULL, NULL, 0);
+    printf("Mean is %.2f\n", stats->sampleMean);
+    stats->options = PS_STAT_SAMPLE_STDEV;
+    stats = psVectorStats(stats, rans, NULL, NULL, 0);
+    printf("Standard deviation is %.2f\n", stats->sampleStdev);
+    if ((fabs(stats->sampleMean - UNIFORM_MEAN) / UNIFORM_MEAN) > ERROR_TOLERANCE) {
+        printf("ERROR: psRandomUniform() mean is %.2f, should be %.2f\n", stats->sampleMean, UNIFORM_MEAN);
+        testStatus = false;
+    }
+    if ((fabs(stats->sampleStdev - UNIFORM_STDEV) / UNIFORM_STDEV) > ERROR_TOLERANCE) {
+        printf("ERROR: psRandomUniform() stdev is %.2f, should be %.2f\n", stats->sampleStdev, UNIFORM_STDEV);
+        testStatus = false;
+    }
+
+    psMemCheckCorruption(1);
+    psFree(myRNG);
+    psFree(rans);
+    psFree(stats);
+
+    psLogMsg(__func__,PS_LOG_INFO,"NULL psRandom variable, should generate error message");
+    if(psRandomUniform(NULL) != 0) {
+        psError(PS_ERR_UNKNOWN,true,"Did not return zero for null psRandom");
+        testStatus = false;
+    }
+
+    psMemCheckCorruption(1);
+    memLeaks = psMemCheckLeaks(currentId,NULL,stderr,false);
+    if (0 != memLeaks) {
+        psAbort(__func__,"Memory Leaks! (%d leaks)", memLeaks);
+    }
+
+    printFooter(stdout,
+                "psRandom functions",
+                "psRandomAlloc() and psRandomUniform()",
+                testStatus);
+
+    return(testStatus);
+}
+
+psS32 t02()
+{
+    psRandom *myRNG = NULL;
+    psS32 currentId = psMemGetId();
+    psS32 memLeaks = 0;
+    psVector *rans = psVectorAlloc(NUM_DATA, PS_TYPE_F64);
+    psStats *stats = psStatsAlloc(PS_STAT_SAMPLE_MEAN);
+
+    printPositiveTestHeader(stdout,
+                            "psRandom functions",
+                            "psRandomAlloc() and psRandomGaussian()");
+
+    myRNG = psRandomAlloc(PS_RANDOM_TAUS, SEED);
+    if (myRNG == NULL) {
+        printf("ERROR: Could not allocate psRandom structure\n");
+        testStatus = false;
+    }
+
+    for (psS32 i = 0 ; i < NUM_DATA ; i++) {
+        rans->data.F64[i] = psRandomGaussian(myRNG);
+        //        printf("%.2f\n", rans->data.F64[i]);
+    }
+    stats = psVectorStats(stats, rans, NULL, NULL, 0);
+    printf("Mean is %.2f\n", stats->sampleMean);
+    stats->options = PS_STAT_SAMPLE_STDEV;
+    stats = psVectorStats(stats, rans, NULL, NULL, 0);
+    printf("Standard deviation is %.2f\n", stats->sampleStdev);
+    if ((fabs(stats->sampleMean - GAUSSIAN_MEAN) / 1.0) > ERROR_TOLERANCE) {
+        printf("ERROR: psRandomUniform() mean is %.2f, should be %.2f\n", stats->sampleMean, GAUSSIAN_MEAN);
+        testStatus = false;
+    }
+    if ((fabs(stats->sampleStdev - GAUSSIAN_STDEV) / GAUSSIAN_STDEV) > ERROR_TOLERANCE) {
+        printf("ERROR: psRandomUniform() stdev is %.2f, should be %.2f\n", stats->sampleStdev, GAUSSIAN_STDEV);
+        testStatus = false;
+    }
+
+    psMemCheckCorruption(1);
+    psFree(myRNG);
+    psFree(rans);
+    psFree(stats);
+
+    psLogMsg(__func__,PS_LOG_INFO,"NULL psRandom variable, should generate error message");
+    if(psRandomGaussian(NULL) != 0) {
+        psError(PS_ERR_UNKNOWN,true,"Did not return zero for null psRandom");
+        testStatus = false;
+    }
+
+    psMemCheckCorruption(1);
+    memLeaks = psMemCheckLeaks(currentId,NULL,stderr,false);
+    if (0 != memLeaks) {
+        psAbort(__func__,"Memory Leaks! (%d leaks)", memLeaks);
+    }
+
+    printFooter(stdout,
+                "psRandom functions",
+                "psRandomAlloc() and psRandomGaussian()",
+                testStatus);
+
+    return(testStatus);
+}
+
+psS32 t03()
+{
+    psRandom *myRNG = NULL;
+    psS32 currentId = psMemGetId();
+    psS32 memLeaks = 0;
+    psVector *rans = psVectorAlloc(NUM_DATA, PS_TYPE_F64);
+    psStats *stats = psStatsAlloc(PS_STAT_SAMPLE_MEAN);
+
+    printPositiveTestHeader(stdout,
+                            "psRandom functions",
+                            "psRandomAlloc() and psRandomPoisson()");
+
+    myRNG = psRandomAlloc(PS_RANDOM_TAUS, SEED);
+    if (myRNG == NULL) {
+        printf("ERROR: Could not allocate psRandom structure\n");
+        testStatus = false;
+    }
+
+    for (psS32 i = 0 ; i < NUM_DATA ; i++) {
+        rans->data.F64[i] = psRandomPoisson(myRNG, POISSON_MEAN);
+        //        printf("%.2f\n", rans->data.F64[i]);
+    }
+    stats = psVectorStats(stats, rans, NULL, NULL, 0);
+    printf("Mean is %.2f\n", stats->sampleMean);
+    stats->options = PS_STAT_SAMPLE_STDEV;
+    stats = psVectorStats(stats, rans, NULL, NULL, 0);
+    printf("Standard deviation is %.2f\n", stats->sampleStdev);
+    if ((fabs(stats->sampleMean - POISSON_MEAN) / POISSON_MEAN) > ERROR_TOLERANCE) {
+        printf("ERROR: psRandomUniform() mean is %.2f, should be %.2f\n", stats->sampleMean, POISSON_MEAN);
+        testStatus = false;
+    }
+    if ((fabs(stats->sampleStdev - POISSON_STDEV) / POISSON_STDEV) > ERROR_TOLERANCE) {
+        printf("ERROR: psRandomUniform() stdev is %.2f, should be %.2f\n", stats->sampleStdev, POISSON_STDEV);
+        testStatus = false;
+    }
+
+
+    psMemCheckCorruption(1);
+    psFree(myRNG);
+    psFree(rans);
+    psFree(stats);
+
+    psLogMsg(__func__,PS_LOG_INFO,"NULL psRandom variable, should generate error message");
+    if(psRandomPoisson(NULL, POISSON_MEAN) != 0) {
+        psError(PS_ERR_UNKNOWN,true,"Did not return zero for null psRandom");
+        testStatus = false;
+    }
+
+    psMemCheckCorruption(1);
+    memLeaks = psMemCheckLeaks(currentId,NULL,stderr,false);
+    if (0 != memLeaks) {
+        psAbort(__func__,"Memory Leaks! (%d leaks)", memLeaks);
+    }
+
+    printFooter(stdout,
+                "psRandom functions",
+                "psRandomAlloc() and psRandomPoisson()",
+                testStatus);
+
+    return(testStatus);
+}
+
+psS32 t04()
+{
+    psRandom *myRNG = NULL;
+    psS32 currentId = psMemGetId();
+    psS32 memLeaks = 0;
+    psVector *rans00 = psVectorAlloc(NUM_DATA, PS_TYPE_F64);
+    psVector *rans01 = psVectorAlloc(NUM_DATA, PS_TYPE_F64);
+    psVector *rans02 = psVectorAlloc(NUM_DATA, PS_TYPE_F64);
+
+    printPositiveTestHeader(stdout,
+                            "psRandom functions",
+                            "psRandomAlloc(), psRandomReset(), and psRandomUniform()");
+    myRNG = psRandomAlloc(PS_RANDOM_TAUS, SEED);
+    if (myRNG == NULL) {
+        printf("ERROR: Could not allocate psRandom structure\n");
+        testStatus = false;
+    }
+    psRandomReset(myRNG, SEED);
+    for (psS32 i = 0 ; i < NUM_DATA ; i++) {
+        rans00->data.F64[i] = psRandomUniform(myRNG);
+    }
+    psRandomReset(myRNG, SEED2);
+    for (psS32 i = 0 ; i < NUM_DATA ; i++) {
+        rans01->data.F64[i] = psRandomUniform(myRNG);
+    }
+    psRandomReset(myRNG, SEED);
+    for (psS32 i = 0 ; i < NUM_DATA ; i++) {
+        rans02->data.F64[i] = psRandomUniform(myRNG);
+    }
+
+    for (psS32 i = 0 ; i < NUM_DATA ; i++) {
+        if (rans00->data.F64[i] != rans02->data.F64[i]) {
+            printf("ERROR: psRandomUniform() did not produce the same results with the same seed\n");
+        }
+    }
+
+    psMemCheckCorruption(1);
+    psFree(myRNG);
+    psFree(rans00);
+    psFree(rans01);
+    psFree(rans02);
+
+    psRandom *myRNG1 = NULL;
+    myRNG1 = psRandomAlloc(PS_RANDOM_TAUS, SEED);
+    psLogSetDestination("file:seed_msglog2.txt");
+    psRandomReset(myRNG1,0);
+    psLogSetDestination("dest:stderr");
+    psFree(myRNG1);
+
+    psLogMsg(__func__,PS_LOG_INFO,"Reset a NULL psRandom variable, should generate an error message");
+    psRandomReset(NULL,SEED);
+
+    psMemCheckCorruption(1);
+    memLeaks = psMemCheckLeaks(currentId,NULL,stderr,false);
+    if (0 != memLeaks) {
+        psAbort(__func__,"Memory Leaks! (%d leaks)", memLeaks);
+    }
+
+    printFooter(stdout,
+                "psRandom functions",
+                "psRandomAlloc(), psRandomReset(), and psRandomUniform()",
+                testStatus);
+
+    return(testStatus);
+}
+
+psS32 t05()
+{
+    psRandom *myRNG = NULL;
+    psS32 currentId = psMemGetId();
+    psS32 memLeaks = 0;
+    psVector *rans00 = psVectorAlloc(NUM_DATA, PS_TYPE_F64);
+    psVector *rans01 = psVectorAlloc(NUM_DATA, PS_TYPE_F64);
+    psVector *rans02 = psVectorAlloc(NUM_DATA, PS_TYPE_F64);
+
+    printPositiveTestHeader(stdout,
+                            "psRandom functions",
+                            "psRandomAlloc(), psRandomReset(), and psRandomGaussian()");
+    myRNG = psRandomAlloc(PS_RANDOM_TAUS, SEED);
+    if (myRNG == NULL) {
+        printf("ERROR: Could not allocate psRandom structure\n");
+        testStatus = false;
+    }
+    psRandomReset(myRNG, SEED);
+    for (psS32 i = 0 ; i < NUM_DATA ; i++) {
+        rans00->data.F64[i] = psRandomGaussian(myRNG);
+    }
+    psRandomReset(myRNG, SEED2);
+    for (psS32 i = 0 ; i < NUM_DATA ; i++) {
+        rans01->data.F64[i] = psRandomGaussian(myRNG);
+    }
+    psRandomReset(myRNG, SEED);
+    for (psS32 i = 0 ; i < NUM_DATA ; i++) {
+        rans02->data.F64[i] = psRandomGaussian(myRNG);
+    }
+
+    for (psS32 i = 0 ; i < NUM_DATA ; i++) {
+        if (rans00->data.F64[i] != rans02->data.F64[i]) {
+            printf("ERROR: psRandomGaussian() did not produce the same results with the same seed\n");
+        }
+    }
+
+    psMemCheckCorruption(1);
+    psFree(myRNG);
+    psFree(rans00);
+    psFree(rans01);
+    psFree(rans02);
+    psMemCheckCorruption(1);
+    memLeaks = psMemCheckLeaks(currentId,NULL,stderr,false);
+    if (0 != memLeaks) {
+        psAbort(__func__,"Memory Leaks! (%d leaks)", memLeaks);
+    }
+
+    printFooter(stdout,
+                "psRandom functions",
+                "psRandomAlloc(), psRandomReset(), and psRandomGaussian()",
+                testStatus);
+
+    return(testStatus);
+}
+
+psS32 t06()
+{
+    psRandom *myRNG = NULL;
+    psS32 currentId = psMemGetId();
+    psS32 memLeaks = 0;
+    psVector *rans00 = psVectorAlloc(NUM_DATA, PS_TYPE_F64);
+    psVector *rans01 = psVectorAlloc(NUM_DATA, PS_TYPE_F64);
+    psVector *rans02 = psVectorAlloc(NUM_DATA, PS_TYPE_F64);
+
+    printPositiveTestHeader(stdout,
+                            "psRandom functions",
+                            "psRandomAlloc(), psRandomReset(), and psRandomPoisson()");
+    myRNG = psRandomAlloc(PS_RANDOM_TAUS, SEED);
+    if (myRNG == NULL) {
+        printf("ERROR: Could not allocate psRandom structure\n");
+        testStatus = false;
+    }
+    psRandomReset(myRNG, SEED);
+    for (psS32 i = 0 ; i < NUM_DATA ; i++) {
+        rans00->data.F64[i] = psRandomPoisson(myRNG, POISSON_MEAN);
+    }
+    psRandomReset(myRNG, SEED2);
+    for (psS32 i = 0 ; i < NUM_DATA ; i++) {
+        rans01->data.F64[i] = psRandomPoisson(myRNG, POISSON_MEAN);
+    }
+    psRandomReset(myRNG, SEED);
+    for (psS32 i = 0 ; i < NUM_DATA ; i++) {
+        rans02->data.F64[i] = psRandomPoisson(myRNG, POISSON_MEAN);
+    }
+
+    for (psS32 i = 0 ; i < NUM_DATA ; i++) {
+        if (rans00->data.F64[i] != rans02->data.F64[i]) {
+            printf("ERROR: psRandomPoisson() did not produce the same results with the same seed\n");
+        }
+    }
+
+    psMemCheckCorruption(1);
+    psFree(myRNG);
+    psFree(rans00);
+    psFree(rans01);
+    psFree(rans02);
+    psMemCheckCorruption(1);
+    memLeaks = psMemCheckLeaks(currentId,NULL,stderr,false);
+    if (0 != memLeaks) {
+        psAbort(__func__,"Memory Leaks! (%d leaks)", memLeaks);
+    }
+
+    printFooter(stdout,
+                "psRandom functions",
+                "psRandomAlloc(), psRandomReset(), and psRandomPoisson()",
+                testStatus);
+
+    return(testStatus);
+}
+
+psS32 main()
+{
+    testStatus = true;
+
+    t00();
+    t01();
+    t02();
+    t03();
+    t04();
+    t05();
+    t06();
+
+    return(!testStatus);
+}
Index: /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psStats00.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psStats00.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psStats00.c	(revision 22331)
@@ -0,0 +1,378 @@
+/** @file  tst_psStats00.c
+*
+*  @brief Contains tests for psVectorStats with sample mean calculations
+*
+*  @author George Gusciora, MHPCC
+* 
+*  @version $Revision: 1.17 $  $Name: not supported by cvs2svn $
+*  @date $Date: 2005-04-07 20:27:42 $
+*
+*  Copyright 2004-2005 Maui High Performance Computing Center, Univ. of Hawaii
+*/
+
+#include "pslib_strict.h"
+#include "psTest.h"
+
+#define ERROR_TOL  0.0001
+#define N 15
+
+static psS32 testStatsSampleMeanF32(void);
+static psS32 testStatsSampleMeanS8(void);
+static psS32 testStatsSampleMeanU16(void);
+static psS32 testStatsSampleMeanF64(void);
+
+testDescription tests[] = {
+                              {testStatsSampleMeanF32, 512, "psVectorStats",0,false},
+                              {testStatsSampleMeanS8, 512, "psVectorStats",0,false},
+                              {testStatsSampleMeanU16, 512, "psVectorStats",0,false},
+                              {testStatsSampleMeanF64, 512, "psVectorStats",0,false},
+                              {NULL}
+                          };
+
+static psF32 samplesF32[N] = { 1.1, 2.2, -3.3, 4.4, 5.5, -6.6, 7.7, 8.8, -9.9, 10.0,
+                               11.01, -12.02, 13.03, 14.04, -15.05 };
+static psS8  samplesS8[N]  = {1, 2, -3, 4, 5, -6, 7, 8, -9, 10, 11, -12, 13, 14, -15};
+static psU16 samplesU16[N] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
+static psF64 samplesF64[N] = { 1.1, 2.2, -3.3, 4.4, 5.5, -6.6, 7.7, 8.8, -9.9, 10.0,
+                               11.01, -12.02, 13.03, 14.04, -15.05 };
+static psF32 errorsF32[N] = { -0.10,  0.11, -0.12,  0.13, -0.14,  0.15, -0.16,  0.17,
+                              -0.18,  0.19, -0.20,  0.21, -0.22,  0.23, -0.24 };
+
+static psF64 expectedMeanNoMaskF32              =  2.060667;
+static psF64 expectedMeanWithMaskF32            =  2.123846;
+static psF64 expectedMeanNoMaskS8               =  2.000000;
+static psF64 expectedMeanNoMaskU16              =  8.000000;
+static psF64 expectedMeanNoMaskF64              =  2.060667;
+static psF64 expectedMeanRangeNoMaskF32         =  0.137500;
+static psF64 expectedMeanRangeWithMaskF32       = -0.366667;
+static psF64 expectedWeightMeanNoMaskF32        =  1.807210;
+static psF64 expectedWeightMeanWithMaskF32      =  1.890217;
+static psF64 expectedWeightMeanNoMaskRangeF32   =  0.640952;
+static psF64 expectedWeightMeanWithMaskRangeF32 =  0.046574;
+
+psS32 main(psS32 argc, char* argv[] )
+{
+    psLogSetLevel(PS_LOG_INFO);
+
+    return ( ! runTestSuite(stderr, "psVectorStats",tests,argc,argv) );
+}
+
+psS32 testStatsSampleMeanF32(void)
+{
+    psStats*  myStats    = NULL;
+    psVector* myVector   = NULL;
+    psVector* maskVector = NULL;
+    psVector* myErrors   = NULL;
+    psF64     mean       = 0.0;
+
+    /*************************************************************************/
+    /*  Allocate and initialize data structures                      */
+    /*************************************************************************/
+    myStats = psStatsAlloc(PS_STAT_SAMPLE_MEAN);
+    myVector = psVectorAlloc(N, PS_TYPE_F32);
+    myVector->n = N;
+    myErrors = psVectorAlloc(N, PS_TYPE_F32);
+    myErrors->n = N;
+    maskVector = psVectorAlloc(N, PS_TYPE_U8);
+    maskVector->n = N;
+
+    mean = 0.0;
+    // Set the appropriate values for the vector data.
+    for (psS32 i = 0; i < N; i++) {
+        myVector->data.F32[i] =  samplesF32[i];
+        myErrors->data.F32[i] =  errorsF32[i];
+    }
+
+    // Set the mask vector and calculate the expected maximum.
+    for (psS32 i = 0; i < N; i++) {
+
+        if (i > 1) {
+            maskVector->data.U8[i] = 0;
+        } else {
+            maskVector->data.U8[i] = 1;
+        }
+    }
+
+    /*************************************************************************/
+    /*  Call psVectorStats() with no vector mask.                    */
+    /*************************************************************************/
+    myStats = psVectorStats(myStats, myVector, NULL, NULL, 0);
+    mean = myStats->sampleMean;
+    // Verify return value is as expected
+    if ( fabs(mean - expectedMeanNoMaskF32) > ERROR_TOL ) {
+        psError(PS_ERR_UNKNOWN,true,"Returned value %f not as expected %f",
+                mean, expectedMeanNoMaskF32);
+        return 1;
+    }
+
+    // Invoke psVectorStats with no vector mask and error vector
+    myStats = psVectorStats(myStats, myVector, myErrors, NULL, 0);
+    mean = myStats->sampleMean;
+    // Verify return value is as expected
+    if ( fabs(mean - expectedWeightMeanNoMaskF32) > ERROR_TOL ) {
+        psError(PS_ERR_UNKNOWN,true,"Returned value %f not as expected %f",
+                mean, expectedWeightMeanNoMaskF32);
+        return 10;
+    }
+
+    // Invoke psVectorStats with no vector mask and data range
+    myStats->min = -10.0;
+    myStats->max =   8.0;
+    myStats->options = PS_STAT_SAMPLE_MEAN | PS_STAT_USE_RANGE;
+    myStats = psVectorStats(myStats, myVector, NULL, NULL, 0);
+    mean = myStats->sampleMean;
+    // Verify return value is as expected
+    if ( fabs(mean - expectedMeanRangeNoMaskF32) > ERROR_TOL ) {
+        psError(PS_ERR_UNKNOWN,true,"Return value %f not as expected %f",
+                mean, expectedMeanRangeNoMaskF32);
+        return 2;
+    }
+
+    // Invoke psVectorStats with no vector mask, errors and data range
+    myStats = psVectorStats(myStats, myVector, myErrors, NULL, 0);
+    mean = myStats->sampleMean;
+    // Verify return value is as expected
+    if ( fabs(mean - expectedWeightMeanNoMaskRangeF32) > ERROR_TOL) {
+        psError(PS_ERR_UNKNOWN,true,"Return value %f not as expected %f",
+                mean, expectedWeightMeanNoMaskRangeF32);
+        return 20;
+    }
+    myStats->options = PS_STAT_SAMPLE_MEAN;
+
+    /*************************************************************************/
+    /*  Call psVectorStats() with vector mask=1.                             */
+    /*************************************************************************/
+    myStats = psVectorStats(myStats, myVector, NULL, maskVector, 1);
+    mean = myStats->sampleMean;
+    if ( fabs(mean - expectedMeanWithMaskF32) > ERROR_TOL ) {
+        psError(PS_ERR_UNKNOWN,true,"Returned value %f not as expected %f",
+                mean, expectedMeanWithMaskF32);
+        return 3;
+    }
+
+    // Invoke psVectorStats with vector mask and error vector
+    myStats = psVectorStats(myStats, myVector, myErrors, maskVector, 1);
+    mean = myStats->sampleMean;
+    if ( fabs(mean - expectedWeightMeanWithMaskF32) > ERROR_TOL ) {
+        psError(PS_ERR_UNKNOWN,true,"Returned value %f not as expected %f",
+                mean, expectedWeightMeanWithMaskF32);
+        return 30;
+    }
+
+    // Invoke psVectorStats with vector mask and data range
+    myStats->options = PS_STAT_SAMPLE_MEAN | PS_STAT_USE_RANGE;
+    myStats = psVectorStats(myStats, myVector, NULL, maskVector, 1);
+    mean = myStats->sampleMean;
+    // Verify return value is as expected
+    if ( fabs(mean - expectedMeanRangeWithMaskF32) > ERROR_TOL ) {
+        psError(PS_ERR_UNKNOWN,true,"Return value %f not as expected %f",
+                mean, expectedMeanRangeWithMaskF32);
+        return 4;
+    }
+
+    // Invoke psVectorStats with vector mask, errors, and data range
+    myStats = psVectorStats(myStats, myVector, myErrors, maskVector, 1);
+    mean = myStats->sampleMean;
+    // Verify return value is as expected
+    if ( fabs(mean - expectedWeightMeanWithMaskRangeF32) > ERROR_TOL ) {
+        psError(PS_ERR_UNKNOWN,true,"Return value %f not as expected %f",
+                mean, expectedWeightMeanWithMaskRangeF32);
+        return 40;
+    }
+    myStats->options = PS_STAT_SAMPLE_MEAN;
+
+    /*************************************************************************/
+    /*  Call psVectorStats() with vector mask=2.                             */
+    /*************************************************************************/
+    // Set the mask vector and calculate the expected maximum.
+    // Set the mask vector.
+    for (psS32 i = 0; i < N; i++) {
+        if (maskVector->data.U8[i] == 1) {
+            maskVector->data.U8[i] = 2;
+        }
+    }
+    myStats = psVectorStats(myStats, myVector, NULL, maskVector, 2);
+    mean = myStats->sampleMean;
+    if (fabs(mean - expectedMeanWithMaskF32) > ERROR_TOL )  {
+        psError(PS_ERR_UNKNOWN,true,"Returned value %f not as expected %f",
+                mean,expectedMeanWithMaskF32);
+        return 5;
+    }
+
+    /*************************************************************************/
+    /*  Call psVectorStats() with vector mask=3.                             */
+    /*************************************************************************/
+    // Set the mask vector and calculate the expected maximum.
+    // Set the mask vector.
+    for (psS32 i = 0; i < N; i++) {
+        if (maskVector->data.U8[i] == 2) {
+            maskVector->data.U8[i] = 3;
+        }
+    }
+    myStats = psVectorStats(myStats, myVector, NULL, maskVector, 4);
+    mean = myStats->sampleMean;
+    if (fabs(mean - expectedMeanNoMaskF32) > ERROR_TOL ) {
+        psError(PS_ERR_UNKNOWN,true,"Return value %f not as expected %f",
+                mean,expectedMeanNoMaskF32);
+        return 6;
+    }
+
+    // Mask all values and verify return is NAN
+    for(psS32 i = 0; i < N; i++) {
+        maskVector->data.U8[i] = 1;
+    }
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate warning message");
+    myStats = psVectorStats(myStats, myVector, NULL, maskVector, 1);
+    mean = myStats->sampleMean;
+    if( !isnan(mean) ) {
+        psError(PS_ERR_UNKNOWN,true,"Did not return NAN with all values masked");
+        return 7;
+    }
+
+    /*************************************************************************/
+    /*  Call psVectorStats() with NULL inputs.                               */
+    /*************************************************************************/
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message.");
+    if( psVectorStats(myStats, NULL, NULL, NULL, 0) != myStats ) {
+        psError(PS_ERR_UNKNOWN,true,"psVectorStats did not return stats when input NULL");
+        return 8;
+    }
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message.");
+    psStats *myStats2 = psVectorStats(NULL, myVector, NULL, NULL, 0);
+    if ( myStats2 != NULL ) {
+        psError(PS_ERR_UNKNOWN,true,"psVectorStats did not return NULL");
+        return 9;
+    }
+
+    /*************************************************************************/
+    /*  Deallocate data structures                                           */
+    /*************************************************************************/
+    psFree(myStats);
+    psFree(myVector);
+    psFree(myErrors);
+    psFree(maskVector);
+    psFree(myStats2);
+
+    return 0;
+}
+
+psS32 testStatsSampleMeanS8(void)
+{
+    psStats*  myStats  = NULL;
+    psVector* myVector = NULL;
+    psF64     mean     = 0.0;
+
+    /*************************************************************************/
+    /*  Allocate and initialize data structures                      */
+    /*************************************************************************/
+    myStats = psStatsAlloc(PS_STAT_SAMPLE_MEAN);
+    myVector = psVectorAlloc(N, PS_TYPE_S8);
+    myVector->n = N;
+
+    mean = 0.0;
+    // Set the appropriate values for the vector data.
+    for (psS32 i = 0; i < N; i++) {
+        myVector->data.S8[i] =  samplesS8[i];
+    }
+
+    /*************************************************************************/
+    /*  Call psVectorStats() with no vector mask.                    */
+    /*************************************************************************/
+    myStats = psVectorStats(myStats, myVector, NULL, NULL, 0);
+    mean = myStats->sampleMean;
+    // Verify return value is as expected
+    if ( fabs(mean - expectedMeanNoMaskS8) > ERROR_TOL ) {
+        psError(PS_ERR_UNKNOWN,true,"Returned value %f not as expected %f",
+                mean, expectedMeanNoMaskS8);
+        return 1;
+    }
+
+    /*************************************************************************/
+    /*  Deallocate data structures                                           */
+    /*************************************************************************/
+    psFree(myStats);
+    psFree(myVector);
+
+    return 0;
+}
+
+psS32 testStatsSampleMeanU16(void)
+{
+    psStats*  myStats  = NULL;
+    psVector* myVector = NULL;
+    psF64     mean     = 0.0;
+
+    /*************************************************************************/
+    /*  Allocate and initialize data structures                      */
+    /*************************************************************************/
+    myStats = psStatsAlloc(PS_STAT_SAMPLE_MEAN);
+    myVector = psVectorAlloc(N, PS_TYPE_U16);
+    myVector->n = N;
+
+    mean = 0.0;
+    // Set the appropriate values for the vector data.
+    for (psS32 i = 0; i < N; i++) {
+        myVector->data.U16[i] =  samplesU16[i];
+    }
+
+    /*************************************************************************/
+    /*  Call psVectorStats() with no vector mask.                    */
+    /*************************************************************************/
+    myStats = psVectorStats(myStats, myVector, NULL, NULL, 0);
+    mean = myStats->sampleMean;
+    // Verify return value is as expected
+    if ( fabs(mean - expectedMeanNoMaskU16) > ERROR_TOL ) {
+        psError(PS_ERR_UNKNOWN,true,"Returned value %f not as expected %f",
+                mean, expectedMeanNoMaskU16);
+        return 1;
+    }
+
+    /*************************************************************************/
+    /*  Deallocate data structures                                           */
+    /*************************************************************************/
+    psFree(myStats);
+    psFree(myVector);
+
+    return 0;
+}
+
+psS32 testStatsSampleMeanF64(void)
+{
+    psStats*  myStats  = NULL;
+    psVector* myVector = NULL;
+    psF64     mean     = 0.0;
+
+    /*************************************************************************/
+    /*  Allocate and initialize data structures                      */
+    /*************************************************************************/
+    myStats = psStatsAlloc(PS_STAT_SAMPLE_MEAN);
+    myVector = psVectorAlloc(N, PS_TYPE_F64);
+    myVector->n = N;
+
+    mean = 0.0;
+    // Set the appropriate values for the vector data.
+    for (psS32 i = 0; i < N; i++) {
+        myVector->data.F64[i] =  samplesF64[i];
+    }
+
+    /*************************************************************************/
+    /*  Call psVectorStats() with no vector mask.                    */
+    /*************************************************************************/
+    myStats = psVectorStats(myStats, myVector, NULL, NULL, 0);
+    mean = myStats->sampleMean;
+    // Verify return value is as expected
+    if ( fabs(mean - expectedMeanNoMaskF64) > ERROR_TOL ) {
+        psError(PS_ERR_UNKNOWN,true,"Returned value %f not as expected %f",
+                mean, expectedMeanNoMaskF64);
+        return 1;
+    }
+
+    /*************************************************************************/
+    /*  Deallocate data structures                                           */
+    /*************************************************************************/
+    psFree(myStats);
+    psFree(myVector);
+
+    return 0;
+}
+
Index: /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psStats01.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psStats01.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psStats01.c	(revision 22331)
@@ -0,0 +1,258 @@
+/** @file  tst_psStats01.c
+*
+*  @brief Contains tests for psVectorStats with max calculations
+*
+*  @author George Gusciora, MHPCC
+*
+*  @version $Revision: 1.11 $  $Name: not supported by cvs2svn $
+*  @date $Date: 2005-04-07 20:27:42 $
+*
+* Copyright 2004-2005 Maui High Performance Computing Center, Univ. of Hawaii
+*/
+
+#include "pslib_strict.h"
+#include "psTest.h"
+
+#define N 15
+#define ERROR_TOL  0.0001
+
+static psS32 testStatsMaxF32(void);
+static psS32 testStatsMaxS8(void);
+static psS32 testStatsMaxU16(void);
+static psS32 testStatsMaxF64(void);
+
+testDescription tests[] = {
+                              {testStatsMaxF32, 518, "psVectorStats", 0, false},
+                              {testStatsMaxS8, 518, "psVectorStats", 0, false},
+                              {testStatsMaxU16, 518, "psVectorStats", 0, false},
+                              {testStatsMaxF64, 518, "psVectorStats", 0, false},
+                              {NULL}
+                          };
+
+static psF32 samplesF32[N] = { 1.1, 2.2, -3.3, 4.4, 5.5, -6.6, 7.7, 8.8, -9.9, 10.0,
+                               11.01, -12.02, 13.03, 14.04, -15.05 };
+static psS8  samplesS8[N]  = {1, 2, -3, 4, 5, -6, 7, 8, -9, 10, 11, -12, 13, 14, -15};
+static psU16 samplesU16[N] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
+static psF64 samplesF64[N] = { 1.1, 2.2, -3.3, 4.4, 5.5, -6.6, 7.7, 8.8, -9.9, 10.0,
+                               11.01, -12.02, 13.03, 14.04, -15.05 };
+
+static psF64 expectedMaxNoMaskF32                = 14.04;
+static psF64 expectedMaxNoMaskS8                 = 14.00;
+static psF64 expectedMaxNoMaskU16                = 15.00;
+static psF64 expectedMaxNoMaskF64                = 14.04;
+
+static psF64 expectedMaxWithMaskF32              = 13.03;
+static psF64 expectedMaxRangeNoMaskF32           = 10.00;
+static psF64 expectedMaxRangeWithMaskF32         = 13.03;
+
+psS32 main(psS32 argc, char* argv[] )
+{
+    psLogSetLevel(PS_LOG_INFO);
+
+    return ( ! runTestSuite(stderr, "psVectorStats", tests, argc, argv) );
+}
+
+psS32 testStatsMaxF32(void)
+{
+    psStats*  myStats    = NULL;
+    psVector* myVector   = NULL;
+    psVector* maskVector = NULL;
+    psF64     max        = 0.0;
+
+    /*************************************************************************/
+    /*  Allocate and initialize data structures                      */
+    /*************************************************************************/
+    myStats = psStatsAlloc(PS_STAT_MAX);
+    myVector = psVectorAlloc(N, PS_TYPE_F32);
+    myVector->n = N;
+    maskVector = psVectorAlloc(N, PS_TYPE_U8);
+    maskVector->n = N;
+
+    // Set the appropriate values for the vector data.
+    for (psS32 i = 0; i < N; i++) {
+        myVector->data.F32[i] = samplesF32[i];
+    }
+
+    // Set the mask vector and calculate the expected maximum.
+    for (psS32 i = 0; i < N; i++) {
+        if (i < 13) {
+            maskVector->data.U8[i] = 0;
+        } else {
+            maskVector->data.U8[i] = 1;
+        }
+    }
+
+    /*************************************************************************/
+    /*  Call psVectorStats() with no vector mask.                    */
+    /*************************************************************************/
+    myStats = psVectorStats(myStats, myVector, NULL, NULL, 0);
+    max = myStats->max;
+
+    if (fabs(max - expectedMaxNoMaskF32) > ERROR_TOL) {
+        psError(PS_ERR_UNKNOWN,true,"Max no mask return value %lf not as expected %lf",
+                max, expectedMaxNoMaskF32);
+        return 1;
+    }
+
+    /*************************************************************************/
+    /*  Call psVectorStats() with vector mask.                       */
+    /*************************************************************************/
+    myStats = psVectorStats(myStats, myVector, NULL, maskVector, 1);
+    max = myStats->max;
+    if (fabs(max - expectedMaxWithMaskF32) > ERROR_TOL) {
+        psError(PS_ERR_UNKNOWN,true,"Max with mask return value %lf not as expected %lf",
+                max, expectedMaxWithMaskF32);
+        return 2;
+    }
+
+    // Invoke function with data range with no mask
+    myStats->options = PS_STAT_MAX | PS_STAT_USE_RANGE;
+    myStats->max = 10.1;
+    myStats->min = 0.0;
+    myStats = psVectorStats(myStats, myVector, NULL, NULL, 0);
+    max = myStats->max;
+
+    if(fabs(max - expectedMaxRangeNoMaskF32) > ERROR_TOL) {
+        psError(PS_ERR_UNKNOWN,true,"Max with range no mask %lf not as expected %lf",
+                max, expectedMaxRangeNoMaskF32);
+        return 3;
+    }
+
+    // Invoke function with data range and mask
+    myStats->max = 14.0;
+    myStats->min = 0.0;
+    myStats = psVectorStats(myStats, myVector, NULL, maskVector, 1);
+    max = myStats->max;
+    if(fabs(max - expectedMaxRangeWithMaskF32) > ERROR_TOL) {
+        psError(PS_ERR_UNKNOWN,true,"Max with range with mask %lf not as expected %lf",
+                max, expectedMaxRangeWithMaskF32);
+        return 3;
+    }
+
+    // Invoke function with data range with no valid data
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate error message");
+    myStats->max = 100.00;
+    myStats->min = 90.00;
+    myStats = psVectorStats(myStats, myVector, NULL, NULL, 0);
+    max = myStats->max;
+
+    if(!isnan(max)) {
+        psError(PS_ERR_UNKNOWN,true,"Max with range with no valid elemenets did not return NAN");
+        return 4;
+    }
+
+    psFree(myStats);
+    psFree(myVector);
+    psFree(maskVector);
+
+    return 0;
+}
+
+psS32 testStatsMaxS8(void)
+{
+    psStats*  myStats    = NULL;
+    psVector* myVector   = NULL;
+    psF64     max        = 0.0;
+
+    /*************************************************************************/
+    /*  Allocate and initialize data structures                      */
+    /*************************************************************************/
+    myStats = psStatsAlloc(PS_STAT_MAX);
+    myVector = psVectorAlloc(N, PS_TYPE_S8);
+    myVector->n = N;
+
+    // Set the appropriate values for the vector data.
+    for (psS32 i = 0; i < N; i++) {
+        myVector->data.S8[i] = samplesS8[i];
+    }
+
+    /*************************************************************************/
+    /*  Call psVectorStats() with no vector mask.                    */
+    /*************************************************************************/
+    myStats = psVectorStats(myStats, myVector, NULL, NULL, 0);
+    max = myStats->max;
+
+    if (fabs(max - expectedMaxNoMaskS8) > ERROR_TOL) {
+        psError(PS_ERR_UNKNOWN,true,"Max no mask return value %lf not as expected %lf",
+                max, expectedMaxNoMaskS8);
+        return 1;
+    }
+
+    psFree(myStats);
+    psFree(myVector);
+
+    return 0;
+}
+
+psS32 testStatsMaxU16(void)
+{
+    psStats*  myStats    = NULL;
+    psVector* myVector   = NULL;
+    psF64     max        = 0.0;
+
+    /*************************************************************************/
+    /*  Allocate and initialize data structures                      */
+    /*************************************************************************/
+    myStats = psStatsAlloc(PS_STAT_MAX);
+    myVector = psVectorAlloc(N, PS_TYPE_U16);
+    myVector->n = N;
+
+    // Set the appropriate values for the vector data.
+    for (psS32 i = 0; i < N; i++) {
+        myVector->data.U16[i] = samplesU16[i];
+    }
+
+    /*************************************************************************/
+    /*  Call psVectorStats() with no vector mask.                    */
+    /*************************************************************************/
+    myStats = psVectorStats(myStats, myVector, NULL, NULL, 0);
+    max = myStats->max;
+
+    if (fabs(max - expectedMaxNoMaskU16) > ERROR_TOL) {
+        psError(PS_ERR_UNKNOWN,true,"Max no mask return value %lf not as expected %lf",
+                max, expectedMaxNoMaskU16);
+        return 1;
+    }
+
+    psFree(myStats);
+    psFree(myVector);
+
+    return 0;
+}
+
+psS32 testStatsMaxF64(void)
+{
+    psStats*  myStats    = NULL;
+    psVector* myVector   = NULL;
+    psF64     max        = 0.0;
+
+    /*************************************************************************/
+    /*  Allocate and initialize data structures                      */
+    /*************************************************************************/
+    myStats = psStatsAlloc(PS_STAT_MAX);
+    myVector = psVectorAlloc(N, PS_TYPE_F64);
+    myVector->n = N;
+
+    // Set the appropriate values for the vector data.
+    for (psS32 i = 0; i < N; i++) {
+        myVector->data.F64[i] = samplesF64[i];
+    }
+
+    /*************************************************************************/
+    /*  Call psVectorStats() with no vector mask.                    */
+    /*************************************************************************/
+    myStats = psVectorStats(myStats, myVector, NULL, NULL, 0);
+    max = myStats->max;
+
+    if (fabs(max - expectedMaxNoMaskF64) > ERROR_TOL) {
+        psError(PS_ERR_UNKNOWN,true,"Max no mask return value %lf not as expected %lf",
+                max, expectedMaxNoMaskF64);
+        return 1;
+    }
+
+    psFree(myStats);
+    psFree(myVector);
+
+    return 0;
+}
+
Index: /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psStats02.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psStats02.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psStats02.c	(revision 22331)
@@ -0,0 +1,258 @@
+/** @file  tst_psStats02.c
+*
+*  @brief Contains tests for psVectorStats with min calculations
+*
+*  @author George Gusciora, MHPCC
+*
+*  @version $Revision: 1.11 $  $Name: not supported by cvs2svn $
+*  @date $Date: 2005-04-07 20:27:42 $
+*
+* Copyright 2004-2005 Maui High Performance Computing Center, Univ. of Hawaii
+*/
+
+#include "pslib_strict.h"
+#include "psTest.h"
+
+#define N 15
+#define ERROR_TOL  0.0001
+
+static psS32 testStatsMinF32(void);
+static psS32 testStatsMinS8(void);
+static psS32 testStatsMinU16(void);
+static psS32 testStatsMinF64(void);
+
+testDescription tests[] = {
+                              {testStatsMinF32, 518, "psVectorStats", 0, false},
+                              {testStatsMinS8, 518, "psVectorStats", 0, false},
+                              {testStatsMinU16, 518, "psVectorStats", 0, false},
+                              {testStatsMinF64, 518, "psVectorStats", 0, false},
+                              {NULL}
+                          };
+
+static psF32 samplesF32[N] = { 1.1, 2.2, -3.3, 4.4, 5.5, -6.6, 7.7, 8.8, -9.9, 10.0,
+                               11.01, -12.02, 13.03, 14.04, -15.05 };
+static psS8  samplesS8[N]  = {1, 2, -3, 4, 5, -6, 7, 8, -9, 10, 11, -12, 13, 14, -15};
+static psU16 samplesU16[N] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
+static psF64 samplesF64[N] = { 1.1, 2.2, -3.3, 4.4, 5.5, -6.6, 7.7, 8.8, -9.9, 10.0,
+                               11.01, -12.02, 13.03, 14.04, -15.05 };
+
+static psF64 expectedMinNoMaskF32                = -15.05;
+static psF64 expectedMinNoMaskS8                 = -15.00;
+static psF64 expectedMinNoMaskU16                = 1.00;
+static psF64 expectedMinNoMaskF64                = -15.05;
+
+static psF64 expectedMinWithMaskF32              = -12.02;
+static psF64 expectedMinRangeNoMaskF32           =   1.10;
+static psF64 expectedMinRangeWithMaskF32         = -12.02;
+
+psS32 main(psS32 argc, char* argv[] )
+{
+    psLogSetLevel(PS_LOG_INFO);
+
+    return ( ! runTestSuite(stderr, "psVectorStats", tests, argc, argv) );
+}
+
+psS32 testStatsMinF32(void)
+{
+    psStats*  myStats    = NULL;
+    psVector* myVector   = NULL;
+    psVector* maskVector = NULL;
+    psF64     min        = 0.0;
+
+    /*************************************************************************/
+    /*  Allocate and initialize data structures                      */
+    /*************************************************************************/
+    myStats = psStatsAlloc(PS_STAT_MIN);
+    myVector = psVectorAlloc(N, PS_TYPE_F32);
+    myVector->n = N;
+    maskVector = psVectorAlloc(N, PS_TYPE_U8);
+    maskVector->n = N;
+
+    // Set the appropriate values for the vector data.
+    for (psS32 i = 0; i < N; i++) {
+        myVector->data.F32[i] = samplesF32[i];
+    }
+
+    // Set the mask vector and calculate the expected maximum.
+    for (psS32 i = 0; i < N; i++) {
+        if (i < 13) {
+            maskVector->data.U8[i] = 0;
+        } else {
+            maskVector->data.U8[i] = 1;
+        }
+    }
+
+    /*************************************************************************/
+    /*  Call psVectorStats() with no vector mask.                    */
+    /*************************************************************************/
+    myStats = psVectorStats(myStats, myVector, NULL, NULL, 0);
+    min = myStats->min;
+
+    if (fabs(min - expectedMinNoMaskF32) > ERROR_TOL) {
+        psError(PS_ERR_UNKNOWN,true,"Min no mask return value %lf not as expected %lf",
+                min, expectedMinNoMaskF32);
+        return 1;
+    }
+
+    /*************************************************************************/
+    /*  Call psVectorStats() with vector mask.                       */
+    /*************************************************************************/
+    myStats = psVectorStats(myStats, myVector, NULL, maskVector, 1);
+    min = myStats->min;
+    if (fabs(min - expectedMinWithMaskF32) > ERROR_TOL) {
+        psError(PS_ERR_UNKNOWN,true,"Min with mask return value %lf not as expected %lf",
+                min, expectedMinWithMaskF32);
+        return 2;
+    }
+
+    // Invoke function with data range with no mask
+    myStats->options = PS_STAT_MIN | PS_STAT_USE_RANGE;
+    myStats->max = 10.1;
+    myStats->min = 0.0;
+    myStats = psVectorStats(myStats, myVector, NULL, NULL, 0);
+    min = myStats->min;
+
+    if(fabs(min - expectedMinRangeNoMaskF32) > ERROR_TOL) {
+        psError(PS_ERR_UNKNOWN,true,"Min with range no mask %lf not as expected %lf",
+                min, expectedMinRangeNoMaskF32);
+        return 3;
+    }
+
+    // Invoke function with data range and mask
+    myStats->max = 10.1;
+    myStats->min = -15.00;
+    myStats = psVectorStats(myStats, myVector, NULL, maskVector, 1);
+    min = myStats->min;
+    if(fabs(min - expectedMinRangeWithMaskF32) > ERROR_TOL) {
+        psError(PS_ERR_UNKNOWN,true,"Min with range with mask %lf not as expected %lf",
+                min, expectedMinRangeWithMaskF32);
+        return 3;
+    }
+
+    // Invoke function with data range with no valid data
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate error message");
+    myStats->max = 100.00;
+    myStats->min = 90.00;
+    myStats = psVectorStats(myStats, myVector, NULL, NULL, 0);
+    min = myStats->min;
+
+    if(!isnan(min)) {
+        psError(PS_ERR_UNKNOWN,true,"Min with range with no valid elemenets did not return NAN");
+        return 4;
+    }
+
+    psFree(myStats);
+    psFree(myVector);
+    psFree(maskVector);
+
+    return 0;
+}
+
+psS32 testStatsMinS8(void)
+{
+    psStats*  myStats    = NULL;
+    psVector* myVector   = NULL;
+    psF64     min        = 0.0;
+
+    /*************************************************************************/
+    /*  Allocate and initialize data structures                      */
+    /*************************************************************************/
+    myStats = psStatsAlloc(PS_STAT_MIN);
+    myVector = psVectorAlloc(N, PS_TYPE_S8);
+    myVector->n = N;
+
+    // Set the appropriate values for the vector data.
+    for (psS32 i = 0; i < N; i++) {
+        myVector->data.S8[i] = samplesS8[i];
+    }
+
+    /*************************************************************************/
+    /*  Call psVectorStats() with no vector mask.                    */
+    /*************************************************************************/
+    myStats = psVectorStats(myStats, myVector, NULL, NULL, 0);
+    min = myStats->min;
+
+    if (fabs(min - expectedMinNoMaskS8) > ERROR_TOL) {
+        psError(PS_ERR_UNKNOWN,true,"Min no mask return value %lf not as expected %lf",
+                min, expectedMinNoMaskS8);
+        return 1;
+    }
+
+    psFree(myStats);
+    psFree(myVector);
+
+    return 0;
+}
+
+psS32 testStatsMinU16(void)
+{
+    psStats*  myStats    = NULL;
+    psVector* myVector   = NULL;
+    psF64     min        = 0.0;
+
+    /*************************************************************************/
+    /*  Allocate and initialize data structures                      */
+    /*************************************************************************/
+    myStats = psStatsAlloc(PS_STAT_MAX);
+    myVector = psVectorAlloc(N, PS_TYPE_U16);
+    myVector->n = N;
+
+    // Set the appropriate values for the vector data.
+    for (psS32 i = 0; i < N; i++) {
+        myVector->data.U16[i] = samplesU16[i];
+    }
+
+    /*************************************************************************/
+    /*  Call psVectorStats() with no vector mask.                    */
+    /*************************************************************************/
+    myStats = psVectorStats(myStats, myVector, NULL, NULL, 0);
+    min = myStats->min;
+
+    if (fabs(min - expectedMinNoMaskU16) > ERROR_TOL) {
+        psError(PS_ERR_UNKNOWN,true,"Min no mask return value %lf not as expected %lf",
+                min, expectedMinNoMaskU16);
+        return 1;
+    }
+
+    psFree(myStats);
+    psFree(myVector);
+
+    return 0;
+}
+
+psS32 testStatsMinF64(void)
+{
+    psStats*  myStats    = NULL;
+    psVector* myVector   = NULL;
+    psF64     min        = 0.0;
+
+    /*************************************************************************/
+    /*  Allocate and initialize data structures                      */
+    /*************************************************************************/
+    myStats = psStatsAlloc(PS_STAT_MIN);
+    myVector = psVectorAlloc(N, PS_TYPE_F64);
+    myVector->n = N;
+
+    // Set the appropriate values for the vector data.
+    for (psS32 i = 0; i < N; i++) {
+        myVector->data.F64[i] = samplesF64[i];
+    }
+
+    /*************************************************************************/
+    /*  Call psVectorStats() with no vector mask.                    */
+    /*************************************************************************/
+    myStats = psVectorStats(myStats, myVector, NULL, NULL, 0);
+    min = myStats->min;
+
+    if (fabs(min - expectedMinNoMaskF64) > ERROR_TOL) {
+        psError(PS_ERR_UNKNOWN,true,"Min no mask return value %lf not as expected %lf",
+                min, expectedMinNoMaskF64);
+        return 1;
+    }
+
+    psFree(myStats);
+    psFree(myVector);
+
+    return 0;
+}
+
Index: /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psStats03.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psStats03.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psStats03.c	(revision 22331)
@@ -0,0 +1,120 @@
+/*****************************************************************************
+    This routine must ensure that PS_STAT_SAMPLE_MEDIAN is correctly computed
+    by the procedure psVectorStats().
+ *****************************************************************************/
+#include <stdio.h>
+#include "pslib_strict.h"
+#include "psTest.h"
+#define N1 1029   // This should be an odd number.
+#define N ((4 * N1) + 1)
+
+psS32 main()
+{
+    psStats *myStats    = NULL;
+    psS32 testStatus      = true;
+    psS32 globalTestStatus = true;
+    psS32 i               = 0;
+    psVector *myVector  = NULL;
+    psVector *maskVector= NULL;
+    float median        = 1e99;
+    float realMedianWithMask = (float) (N-3)/4;
+    float realMedianNoMask = (float) (N-1)/2;
+    psS32 currentId       = psMemGetId();
+    psS32 memLeaks        = 0;
+
+    /*************************************************************************/
+    /*  Allocate and initialize data structures                      */
+    /*************************************************************************/
+    myStats = psStatsAlloc(PS_STAT_SAMPLE_MEDIAN);
+    myVector = psVectorAlloc(N, PS_TYPE_F32);
+    myVector->n = N;
+    maskVector = psVectorAlloc(N, PS_TYPE_U8);
+    maskVector->n = N;
+
+    // Set the appropriate values for the vector data.
+    for (i=0;i<N;i++) {
+        myVector->data.F32[i] = (float) i;
+    }
+
+    // Set the mask vector and calculate the expected median.
+    for (i=0;i<N;i++) {
+        if (i < (N/2)) {
+            maskVector->data.U8[i] = 0;
+        } else {
+            maskVector->data.U8[i] = 1;
+        }
+    }
+
+    /*************************************************************************/
+    /*  Call psVectorStats() with no vector mask.                    */
+    /*************************************************************************/
+    printPositiveTestHeader(stdout,
+                            "psStats functions",
+                            "PS_STAT_SAMPLE_MEDIAN: no vector mask");
+
+    myStats = psVectorStats(myStats, myVector, NULL, NULL, 0);
+    median = myStats->sampleMedian;
+
+    printf("Called psVectorStats() on a vector with no elements masked.\n");
+    printf("The expected median was %f.  The calculated median was %f.\n",
+           realMedianNoMask, median);
+    if (median == realMedianNoMask) {
+        testStatus = true;
+    } else {
+        testStatus = false;
+        globalTestStatus = false;
+    }
+
+    printFooter(stdout,
+                "psStats functions",
+                "PS_STAT_SAMPLE_MEDIAN: no vector mask",
+                testStatus);
+
+    /*************************************************************************/
+    /*  Call psVectorStats() with vector mask.                       */
+    /*************************************************************************/
+    printPositiveTestHeader(stdout,
+                            "psStats functions",
+                            "PS_STAT_SAMPLE_MEDIAN: with vector mask");
+
+    myStats = psVectorStats(myStats, myVector, NULL, maskVector, 1);
+    median = myStats->sampleMedian;
+    printf("Called psVectorStats() on a vector with last N/2 elements masked.\n");
+    printf("The expected median was %f.  The calculated median was %f.\n",
+           realMedianWithMask, median);
+    if (median == realMedianWithMask) {
+        testStatus = true;
+    } else {
+        testStatus = false;
+        globalTestStatus = false;
+    }
+
+    printFooter(stdout,
+                "psStats functions",
+                "PS_STAT_SAMPLE_MEDIAN: with vector mask",
+                testStatus);
+
+    /*************************************************************************/
+    /*  Deallocate data structures                                   */
+    /*************************************************************************/
+    printPositiveTestHeader(stdout,
+                            "psStats functions",
+                            "psStats(): deallocating memory");
+
+    psFree(myStats);
+    psFree(myVector);
+    psFree(maskVector);
+
+    psMemCheckCorruption(1);
+    memLeaks = psMemCheckLeaks(currentId,NULL,stderr,false);
+    if (0 != memLeaks) {
+        psAbort(__func__,"Memory Leaks! (%d leaks)", memLeaks);
+    }
+
+    printFooter(stdout,
+                "psStats functions",
+                "psStats(): deallocating memory",
+                testStatus);
+
+    return (!globalTestStatus);
+}
Index: /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psStats04.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psStats04.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psStats04.c	(revision 22331)
@@ -0,0 +1,82 @@
+/*****************************************************************************
+    This routine must ensure that PS_STAT_NVALUES is correctly computed
+    by the procedure psVectorStats().
+ 
+    Note: The NVALUES stat was removed from the IfA requirements spec.  So,
+    this test is no longer in use.
+ *****************************************************************************/
+#include <stdio.h>
+#include "pslib_strict.h"
+#include "psTest.h"
+#define N1 1029
+#define N ((4 * N1) + 1)
+
+psS32 main()
+{
+    psStats *myStats    = NULL;
+    psS32 testStatus      = true;
+    psS32 i               = 0;
+    psVector *myVector  = NULL;
+    psVector *maskVector= NULL;
+
+    /*************************************************************************/
+    /*  Allocate and initialize data structures                      */
+    /*************************************************************************/
+    myStats = psStatsAlloc(PS_STAT_NVALUES);
+    myVector = psVectorAlloc(N, PS_TYPE_F32);
+    myVector->n = N;
+    maskVector = psVectorAlloc(N, PS_TYPE_U8);
+    maskVector->n = N;
+
+    // Set the appropriate values for the vector data.
+    for (i=0;i<N;i++) {
+        myVector->data.F32[i] = (float) i;
+    }
+
+    // Set the mask vector and calculate the expected maximum.
+    for (i=0;i<N;i++) {
+        if (i < (N/2)) {
+            maskVector->data.U8[i] = 0;
+        } else {
+            maskVector->data.U8[i] = 1;
+        }
+    }
+
+    /*************************************************************************/
+    /*  Call psVectorStats() with no vector mask.                    */
+    /*************************************************************************/
+    printPositiveTestHeader(stdout,
+                            "psStats functions",
+                            "PS_STAT_NVALUES");
+
+    myStats = psVectorStats(myStats, myVector, NULL, 0);
+
+    printf("Called psVectorStats() on a vector with no elements masked.\n");
+    printf("The expected nvalues was %d.  The calculated nvalues was %d.\n",
+           N, myStats->nValues);
+    if (myStats->nValues == N) {
+        testStatus = true;
+    } else {
+        testStatus = false;
+    }
+
+    /*************************************************************************/
+    /*  Call psVectorStats() with vector mask.                       */
+    /*************************************************************************/
+    myStats = psVectorStats(myStats, myVector, maskVector, 1);
+    printf("Called psVectorStats() on a vector with last N/2 elements masked.\n");
+    printf("The expected nvalues was %d.  The calculated nvalues was %d.\n",
+           N/2, myStats->nValues);
+    if (myStats->nValues == N/2) {
+        testStatus = true;
+    } else {
+        testStatus = false;
+    }
+
+    printFooter(stdout,
+                "psHash functions",
+                "psHashAlloc()",
+                testStatus);
+
+    return (!testStatus);
+}
Index: /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psStats05.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psStats05.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psStats05.c	(revision 22331)
@@ -0,0 +1,75 @@
+/*****************************************************************************
+    This routine must ensure that the psStats structure is correctly
+    allocated and deallocated by the procedure psArrayStats().
+ *****************************************************************************/
+#include <stdio.h>
+#include "pslib_strict.h"
+#include "psTest.h"
+#define MISC_FLOAT_NUMBER 345.0
+
+psS32 main()
+{
+    psStats *myStats    = NULL;
+    psS32 testStatus      = true;
+    psS32 currentId       = psMemGetId();
+    psS32 memLeaks        = 0;
+
+    /*************************************************************************/
+    /*  Allocate and initialize data structures                      */
+    /*************************************************************************/
+    printPositiveTestHeader(stdout,
+                            "psStats functions",
+                            "Allocate the psStats structure.");
+
+    myStats = psStatsAlloc(PS_STAT_SAMPLE_MEAN);
+    myStats->sampleMean = MISC_FLOAT_NUMBER;
+    myStats->sampleMedian = MISC_FLOAT_NUMBER;
+    myStats->sampleStdev = MISC_FLOAT_NUMBER;
+    myStats->sampleUQ = MISC_FLOAT_NUMBER;
+    myStats->sampleLQ = MISC_FLOAT_NUMBER;
+    myStats->robustMean = MISC_FLOAT_NUMBER;
+    myStats->robustMedian = MISC_FLOAT_NUMBER;
+    myStats->robustMode = MISC_FLOAT_NUMBER;
+    myStats->robustStdev = MISC_FLOAT_NUMBER;
+    myStats->robustUQ = MISC_FLOAT_NUMBER;
+    myStats->robustLQ = MISC_FLOAT_NUMBER;
+    myStats->robustN50 = MISC_FLOAT_NUMBER;
+    myStats->robustNfit = MISC_FLOAT_NUMBER;
+    myStats->clippedMean = MISC_FLOAT_NUMBER;
+    myStats->clippedStdev = MISC_FLOAT_NUMBER;
+    myStats->clipSigma = MISC_FLOAT_NUMBER;
+    myStats->clipIter = MISC_FLOAT_NUMBER;
+    myStats->min = MISC_FLOAT_NUMBER;
+    myStats->max = MISC_FLOAT_NUMBER;
+    myStats->binsize = MISC_FLOAT_NUMBER;
+    myStats->options = 0x0;
+
+    psMemCheckCorruption(1);
+
+    printFooter(stdout,
+                "psStats functions",
+                "Allocate the psStats structure.",
+                testStatus);
+
+    /*************************************************************************/
+    /*  Deallocate data structures                                   */
+    /*************************************************************************/
+    printPositiveTestHeader(stdout,
+                            "psStats functions",
+                            "Deallocate the psStats structure.");
+    psFree(myStats);
+
+    psMemCheckCorruption(1);
+    memLeaks = psMemCheckLeaks(currentId,NULL,stderr,false);
+    if (0 != memLeaks) {
+        psAbort(__func__,"Memory Leaks! (%d leaks)", memLeaks);
+    }
+    psMemCheckCorruption(1);
+
+    printFooter(stdout,
+                "psStats functions",
+                "Deallocate the psStats structure.",
+                testStatus);
+
+    return (!testStatus);
+}
Index: /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psStats06.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psStats06.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psStats06.c	(revision 22331)
@@ -0,0 +1,128 @@
+/*****************************************************************************
+    This routine must ensure that PS_STAT_SAMPLE_STDEV is correctly computed
+    by the procedure psArrayStats().
+ *****************************************************************************/
+#include <stdio.h>
+#include "pslib_strict.h"
+#include "psTest.h"
+#include "psTest.h"
+#include "float.h"
+#include <math.h>
+
+#define N 15
+
+psS32 main()
+{
+    psStats *myStats    = NULL;
+    psS32 testStatus      = true;
+    psS32 globalTestStatus = true;
+    psS32 i               = 0;
+    psVector *myVector  = NULL;
+    psVector *maskVector= NULL;
+    float stdev         = 0.0;
+    // NOTE: These values were calculated by running the function on the data.
+    // A: They must be changed if we adjust the number of data points.
+    // B: We don't really know that they are correct.
+    float realStdevNoMask   = 4.472136;
+    float realStdevWithMask = 2.160247;
+    psS32 count           = 0;
+    psS32 currentId       = psMemGetId();
+    psS32 memLeaks        = 0;
+
+    /*************************************************************************/
+    /*  Allocate and initialize data structures                      */
+    /*************************************************************************/
+    myStats = psStatsAlloc(PS_STAT_SAMPLE_STDEV);
+    myVector = psVectorAlloc(N, PS_TYPE_F32);
+    myVector->n = N;
+    maskVector = psVectorAlloc(N, PS_TYPE_U8);
+    maskVector->n = N;
+
+    stdev = 0.0;
+    // Set the appropriate values for the vector data.
+    for (i=0;i<N;i++) {
+        myVector->data.F32[i] = (float) i;
+    }
+
+    // Set the mask vector and calculate the expected maximum.
+    for (i=0;i<N;i++) {
+        if (i < (N/2)) {
+            maskVector->data.U8[i] = 0;
+            count++;
+        } else {
+            maskVector->data.U8[i] = 1;
+        }
+    }
+
+    /*************************************************************************/
+    /*  Call psVectorStats() with no vector mask.                    */
+    /*************************************************************************/
+    printPositiveTestHeader(stdout,
+                            "psStats functions",
+                            "PS_STAT_SAMPLE_STDEV: no vector mask");
+
+    myStats = psVectorStats(myStats, myVector, NULL, NULL, 0);
+    stdev = myStats->sampleStdev;
+
+    printf("Called psVectorStats() on a vector with no elements masked.\n");
+    printf("The expected stdev was %f; the calculated stdev was %f\n",
+           realStdevNoMask, stdev);
+    if (fabs(stdev - realStdevNoMask) <= 2.0 * FLT_EPSILON) {
+        testStatus = true;
+    } else {
+        testStatus = false;
+        globalTestStatus = false;
+    }
+    printFooter(stdout,
+                "psVector functions",
+                "PS_STAT_SAMPLE_STDEV: no vector mask",
+                testStatus);
+
+    /*************************************************************************/
+    /*  Call psVectorStats() with vector mask.                       */
+    /*************************************************************************/
+    printPositiveTestHeader(stdout,
+                            "psStats functions",
+                            "PS_STAT_SAMPLE_STDEV: with vector mask");
+
+    myStats = psVectorStats(myStats, myVector, NULL, maskVector, 1);
+    stdev = myStats->sampleStdev;
+    printf("Called psVectorStats() on a vector with last N/2 elements masked.\n");
+    printf("The expected stdev was %f; the calculated stdev was %f\n",
+           realStdevWithMask, stdev);
+    if (fabs(stdev - realStdevWithMask) <= 2.0 * FLT_EPSILON) {
+        testStatus = true;
+    } else {
+        testStatus = false;
+        globalTestStatus = false;
+    }
+
+    printFooter(stdout,
+                "psVector functions",
+                "PS_STAT_SAMPLE_STDEV: with vector mask",
+                testStatus);
+
+    /*************************************************************************/
+    /*  Deallocate data structures                                   */
+    /*************************************************************************/
+    printPositiveTestHeader(stdout,
+                            "psStats functions",
+                            "psStats(): deallocating memory");
+
+    psFree(myStats);
+    psFree(myVector);
+    psFree(maskVector);
+
+    psMemCheckCorruption(1);
+    memLeaks = psMemCheckLeaks(currentId,NULL,stderr,false);
+    if (0 != memLeaks) {
+        psAbort(__func__,"Memory Leaks! (%d leaks)", memLeaks);
+    }
+
+    printFooter(stdout,
+                "psVector functions",
+                "psStats(): deallocating memory",
+                testStatus);
+
+    return (!globalTestStatus);
+}
Index: /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psStats07.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psStats07.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psStats07.c	(revision 22331)
@@ -0,0 +1,495 @@
+/*****************************************************************************
+   This routine must ensure that PS_STAT_ROBUST_QUARTILE is correctly computed
+   by the procedure psArrayStats().
+*****************************************************************************/
+#include <stdio.h>
+#include "pslib_strict.h"
+#include "psTest.h"
+#include "psTest.h"
+#include "float.h"
+#include <math.h>
+
+#define N 90
+#define MEAN 32.0
+#define STDEV 2.0
+#define ERROR_TOLERANCE 0.15
+
+psS32 t00()
+{
+    psStats * myStats = NULL;
+    psS32 testStatus = true;
+    psS32 globalTestStatus = true;
+    psS32 i = 0;
+    psVector *myVector = NULL;
+    psVector *maskVector = NULL;
+    // NOTE: These values were calculated by running the function on the data.
+    // They must be changed if we adjust the number of data points.
+    // We don't really know that they are correct.
+    psS32 count = 0;
+    psS32 currentId = psMemGetId();
+    psS32 memLeaks = 0;
+    float realMeanNoMask = MEAN;
+    float realMedianNoMask = MEAN;
+    float realModeNoMask = MEAN;
+    float realStdevNoMask = STDEV * 0.20;
+    float realLQNoMask = MEAN - ( 0.6 * STDEV );
+    float realUQNoMask = MEAN + ( 0.6 * STDEV );
+    psS32 realN50NoMask = N / 4;
+    psS32 realNfitNoMask = N / 4;
+
+    psTraceSetLevel(".psLib.dataManip", 0);
+    psTraceSetLevel(".psLib.dataManip.psMinimize", 0);
+    psTraceSetLevel(".psLib.dataManip.psMinimizeLMChi2Gauss1D", 0);
+    psTraceSetLevel(".psLib.dataManip.psFunctions.psGaussian", 0);
+    psTraceSetLevel(".psLib.dataManip.psFunctions", 0);
+
+    /*************************************************************************/
+    /*  Allocate and initialize data structures                              */
+    /*************************************************************************/
+    myStats = psStatsAlloc( PS_STAT_ROBUST_MEAN |
+                            PS_STAT_ROBUST_MEDIAN |
+                            PS_STAT_ROBUST_MODE |
+                            PS_STAT_ROBUST_STDEV |
+                            PS_STAT_ROBUST_QUARTILE );
+
+    maskVector = psVectorAlloc( N, PS_TYPE_U8 );
+    maskVector->n = N;
+    myVector = p_psGaussianDev( MEAN, STDEV, N );
+    // Set the mask vector and calculate the expected maximum.
+    for ( i = 0;i < N;i++ ) {
+        if ( i < ( N / 2 ) ) {
+            maskVector->data.U8[ i ] = 0;
+            count++;
+        } else {
+            maskVector->data.U8[ i ] = 1;
+        }
+    }
+    /*************************************************************************/
+    /*  Call psVectorStats() with no vector mask.                            */
+    /*************************************************************************/
+    printPositiveTestHeader( stdout,
+                             "psStats functions",
+                             "PS_STAT_ROBUST_STATS: robust mean: no vector mask" );
+
+    myStats = psVectorStats( myStats, myVector, NULL, NULL, 0 );
+
+    printf( "The expected Mean was %.2f; the calculated Mean was %.2f\n",
+            realMeanNoMask, myStats->robustMean );
+
+    if ( fabs( myStats->robustMean - realMeanNoMask ) < ( ERROR_TOLERANCE * realMeanNoMask ) ) {
+        testStatus = true;
+    } else {
+        testStatus = false;
+        globalTestStatus = false;
+    }
+    printFooter( stdout,
+                 "psVector functions",
+                 "PS_STAT_ROBUST_STATS: robust mean: no vector mask",
+                 testStatus );
+
+
+    printPositiveTestHeader( stdout,
+                             "psStats functions",
+                             "PS_STAT_ROBUST_STATS: robust Median: no vector mask" );
+
+    printf( "The expected Median was %.2f; the calculated Median was %.2f\n",
+            realMedianNoMask, myStats->robustMedian );
+    if ( fabs( myStats->robustMedian - realMedianNoMask ) < ( ERROR_TOLERANCE * realMedianNoMask ) ) {
+        testStatus = true;
+    } else {
+        testStatus = false;
+        globalTestStatus = false;
+    }
+    printFooter( stdout,
+                 "psVector functions",
+                 "PS_STAT_ROBUST_STATS: robust Median: no vector mask",
+                 testStatus );
+
+    printPositiveTestHeader( stdout,
+                             "psStats functions",
+                             "PS_STAT_ROBUST_STATS: robust Mode: no vector mask" );
+
+
+    printf( "The expected Mode was %.2f; the calculated Mode was %.2f\n",
+            realModeNoMask, myStats->robustMode );
+    if ( fabs( myStats->robustMode - realModeNoMask ) < ( ERROR_TOLERANCE * realModeNoMask ) ) {
+        testStatus = true;
+    } else {
+        testStatus = false;
+        globalTestStatus = false;
+    }
+    printFooter( stdout,
+                 "psVector functions",
+                 "PS_STAT_ROBUST_STATS: robust Mode: no vector mask",
+                 testStatus );
+
+
+
+    printPositiveTestHeader( stdout,
+                             "psStats functions",
+                             "PS_STAT_ROBUST_STATS: robust Stdev: no vector mask" );
+
+    printf( "The expected Stdev was %.2f; the calculated Stdev was %.2f\n",
+            realStdevNoMask, myStats->robustStdev );
+    if ( fabs( myStats->robustStdev - realStdevNoMask ) < ( ERROR_TOLERANCE * realStdevNoMask ) ) {
+        testStatus = true;
+    } else {
+        testStatus = false;
+        globalTestStatus = false;
+    }
+    printFooter( stdout,
+                 "psVector functions",
+                 "PS_STAT_ROBUST_STATS: robust Stdev: no vector mask",
+                 testStatus );
+
+
+
+    printPositiveTestHeader( stdout,
+                             "psStats functions",
+                             "PS_STAT_ROBUST_STATS: lower quartile: no vector mask" );
+
+    printf( "The expected LQ was %.2f; the calculated LQ was %.2f\n",
+            realLQNoMask, myStats->robustLQ );
+
+    if ( fabs( myStats->robustLQ - realLQNoMask ) < ( ERROR_TOLERANCE * realLQNoMask ) ) {
+        testStatus = true;
+    } else {
+        testStatus = false;
+        globalTestStatus = false;
+    }
+    printFooter( stdout,
+                 "psVector functions",
+                 "PS_STAT_ROBUST_STATS: lower quartile: no vector mask",
+                 testStatus );
+
+
+
+    printPositiveTestHeader( stdout,
+                             "psStats functions",
+                             "PS_STAT_ROBUST_STATS: upper quartile: no vector mask" );
+
+    printf( "The expected UQ was %.2f; the calculated UQ was %.2f\n",
+            realUQNoMask, myStats->robustUQ );
+    if ( fabs( myStats->robustUQ - realUQNoMask ) < ( ERROR_TOLERANCE * realUQNoMask ) ) {
+        testStatus = true;
+    } else {
+        testStatus = false;
+        globalTestStatus = false;
+    }
+    printFooter( stdout,
+                 "psVector functions",
+                 "PS_STAT_ROBUST_STATS: lower quartile: no vector mask",
+                 testStatus );
+
+
+
+    printPositiveTestHeader( stdout,
+                             "psStats functions",
+                             "PS_STAT_ROBUST_STATS: robust N50: no vector mask" );
+
+    // XXX:
+    realN50NoMask = myStats->robustN50;
+
+    printf( "The expected N50 was %d; the calculated N50 was %d\n",
+            realN50NoMask, myStats->robustN50 );
+    /* XXX: fix
+        if ( fabs( myStats->robustN50 - realN50NoMask ) < ( ERROR_TOLERANCE * realN50NoMask ) ) {
+            testStatus = true;
+        } else {
+            testStatus = false;
+            globalTestStatus = false;
+        }
+    */
+    printFooter( stdout,
+                 "psVector functions",
+                 "PS_STAT_ROBUST_STATS: robust N50: no vector mask",
+                 testStatus );
+
+
+
+    printPositiveTestHeader( stdout,
+                             "psStats functions",
+                             "PS_STAT_ROBUST_STATS: robust Nfit: no vector mask" );
+
+    // XXX:
+    realNfitNoMask = myStats->robustNfit;
+
+    printf( "The expected Nfit was %d; the calculated Nfit was %d\n",
+            realNfitNoMask, myStats->robustNfit );
+    /* XXX: fix
+        if ( fabs( myStats->robustNfit - realNfitNoMask ) < ( ERROR_TOLERANCE * realNfitNoMask ) ) {
+            testStatus = true;
+        } else {
+            testStatus = false;
+            globalTestStatus = false;
+        }
+    */
+    printFooter( stdout,
+                 "psVector functions",
+                 "PS_STAT_ROBUST_STATS: robust Nfit: no vector mask",
+                 testStatus );
+    return(testStatus);
+
+    /*************************************************************************/
+    /*  Deallocate data structures                                           */
+    /*************************************************************************/
+    printPositiveTestHeader( stdout,
+                             "psStats functions",
+                             "psStats(): deallocating memory" );
+
+    psFree( myStats );
+    psFree( myVector );
+    psFree( maskVector );
+
+    psMemCheckCorruption( 1 );
+    memLeaks = psMemCheckLeaks(currentId,NULL,stderr,false);
+    if ( 0 != memLeaks ) {
+        psAbort( __func__, "Memory Leaks! (%d leaks)", memLeaks );
+    }
+
+    printFooter( stdout,
+                 "psVector functions",
+                 "psStats(): deallocating memory",
+                 testStatus );
+
+    return ( !globalTestStatus );
+}
+
+
+psS32 t01()
+{
+    psStats * myStats = NULL;
+    psS32 testStatus = true;
+    psS32 globalTestStatus = true;
+    psS32 i = 0;
+    psVector *myVector = NULL;
+    psVector *maskVector = NULL;
+    // NOTE: These values were calculated by running the function on the data.
+    // A: They must be changed if we adjust the number of data points.
+    // B: We don't really know that they are correct.
+    psS32 count = 0;
+    psS32 currentId = psMemGetId();
+    psS32 memLeaks = 0;
+    float realMeanWithMask = MEAN;
+    float realMedianWithMask = MEAN;
+    float realModeWithMask = MEAN;
+    float realStdevWithMask = STDEV * 0.20;
+    float realLQWithMask = MEAN;
+    float realUQWithMask = MEAN;
+    psS32 realN50WithMask = N / 4;
+    psS32 realNfitWithMask = N / 4;
+
+    psTraceSetLevel(".psLib.dataManip.psStats", 0);
+
+    /*************************************************************************/
+    /*  Allocate and initialize data structures                              */
+    /*************************************************************************/
+    myStats = psStatsAlloc( PS_STAT_ROBUST_MEAN |
+                            PS_STAT_ROBUST_MEDIAN |
+                            PS_STAT_ROBUST_MODE |
+                            PS_STAT_ROBUST_STDEV |
+                            PS_STAT_ROBUST_QUARTILE );
+
+    maskVector = psVectorAlloc( N, PS_TYPE_U8 );
+    maskVector->n = N;
+    myVector = p_psGaussianDev( MEAN, STDEV, N );
+    // Set the mask vector and calculate the expected maximum.
+    for ( i = 0;i < N;i++ ) {
+        if ( i < ( N / 2 ) ) {
+            maskVector->data.U8[ i ] = 0;
+            count++;
+        } else {
+            maskVector->data.U8[ i ] = 1;
+        }
+    }
+
+    /*************************************************************************/
+    /*  Call psVectorStats() with vector mask.                               */
+    /*************************************************************************/
+    printPositiveTestHeader( stdout,
+                             "psStats functions",
+                             "PS_STAT_ROBUST_STATS: robust mean: with vector mask" );
+
+    printf( "Calling psVectorStats() on a vector with elements masked.\n" );
+    myStats = psVectorStats( myStats, myVector, NULL, maskVector, 1 );
+    printf( "Called psVectorStats() on a vector with elements masked.\n" );
+    printf( "The expected Mean was %.2f; the calculated Mean was %.2f\n",
+            realMeanWithMask, myStats->robustMean );
+    if ( fabs( myStats->robustMean - realMeanWithMask ) < ( ERROR_TOLERANCE * realMeanWithMask ) ) {
+        testStatus = true;
+    } else {
+        testStatus = false;
+        globalTestStatus = false;
+    }
+    printFooter( stdout,
+                 "psVector functions",
+                 "PS_STAT_ROBUST_STATS: robust mean: with vector mask",
+                 testStatus );
+
+    printPositiveTestHeader( stdout,
+                             "psStats functions",
+                             "PS_STAT_ROBUST_STATS: robust Median: with vector mask" );
+
+    printf( "The expected Median was %.2f; the calculated Median was %.2f\n",
+            realMedianWithMask, myStats->robustMedian );
+    if ( fabs( myStats->robustMedian - realMedianWithMask ) < ( ERROR_TOLERANCE * realMedianWithMask ) ) {
+        testStatus = true;
+    } else {
+        testStatus = false;
+        globalTestStatus = false;
+    }
+    printFooter( stdout,
+                 "psVector functions",
+                 "PS_STAT_ROBUST_STATS: robust Median: with vector mask",
+                 testStatus );
+
+
+
+    printPositiveTestHeader( stdout,
+                             "psStats functions",
+                             "PS_STAT_ROBUST_STATS: robust Mode: with vector mask" );
+
+    printf( "The expected Mode was %.2f; the calculated Mode was %.2f\n",
+            realModeWithMask, myStats->robustMode );
+    if ( fabs( myStats->robustMode - realModeWithMask ) < ( ERROR_TOLERANCE * realModeWithMask ) ) {
+        testStatus = true;
+    } else {
+        testStatus = false;
+        globalTestStatus = false;
+    }
+    printFooter( stdout,
+                 "psVector functions",
+                 "PS_STAT_ROBUST_STATS: robust Mode: with vector mask",
+                 testStatus );
+
+
+
+    printPositiveTestHeader( stdout,
+                             "psStats functions",
+                             "PS_STAT_ROBUST_STATS: robust Stdev: with vector mask" );
+
+    printf( "The expected Stdev was %.2f; the calculated Stdev was %.2f\n",
+            realStdevWithMask, myStats->robustStdev );
+    if ( fabs( myStats->robustStdev - realStdevWithMask ) < ( ERROR_TOLERANCE * realStdevWithMask ) ) {
+        testStatus = true;
+    } else {
+        testStatus = false;
+        globalTestStatus = false;
+    }
+    printFooter( stdout,
+                 "psVector functions",
+                 "PS_STAT_ROBUST_STATS: robust Stdev: with vector mask",
+                 testStatus );
+
+
+
+    printPositiveTestHeader( stdout,
+                             "psStats functions",
+                             "PS_STAT_ROBUST_STATS: lower quartile: with vector mask" );
+
+    printf( "The expected LQ was %.2f; the calculated LQ was %.2f\n",
+            realLQWithMask, myStats->robustLQ );
+    if ( fabs( myStats->robustLQ - realLQWithMask ) < ( ERROR_TOLERANCE * realLQWithMask ) ) {
+        testStatus = true;
+    } else {
+        testStatus = false;
+        globalTestStatus = false;
+    }
+    printFooter( stdout,
+                 "psVector functions",
+                 "PS_STAT_ROBUST_STATS: lower quartile: with vector mask",
+                 testStatus );
+
+
+
+    printPositiveTestHeader( stdout,
+                             "psStats functions",
+                             "PS_STAT_ROBUST_STATS: upper quartile: with vector mask" );
+
+    printf( "The expected UQ was %.2f; the calculated UQ was %.2f\n",
+            realUQWithMask, myStats->robustUQ );
+    if ( fabs( myStats->robustUQ - realUQWithMask ) < ( ERROR_TOLERANCE * realUQWithMask ) ) {
+        testStatus = true;
+    } else {
+        testStatus = false;
+        globalTestStatus = false;
+    }
+    printFooter( stdout,
+                 "psVector functions",
+                 "PS_STAT_ROBUST_STATS: lower quartile: with vector mask",
+                 testStatus );
+
+
+
+    printPositiveTestHeader( stdout,
+                             "psStats functions",
+                             "PS_STAT_ROBUST_STATS: robust N50: with vector mask" );
+
+    printf( "The expected N50 was %d; the calculated N50 was %d\n",
+            realN50WithMask, myStats->robustN50 );
+    /* XXX: fix
+        if ( fabs( myStats->robustN50 - realN50WithMask ) < ( ERROR_TOLERANCE * realN50WithMask ) ) {
+            testStatus = true;
+        } else {
+            testStatus = false;
+            globalTestStatus = false;
+        }
+    */
+    printFooter( stdout,
+                 "psVector functions",
+                 "PS_STAT_ROBUST_STATS: robust N50: with vector mask",
+                 testStatus );
+
+
+
+    printPositiveTestHeader( stdout,
+                             "psStats functions",
+                             "PS_STAT_ROBUST_STATS: robust Nfit: with vector mask" );
+
+    printf( "The expected Nfit was %d; the calculated Nfit was %d\n",
+            realNfitWithMask, myStats->robustNfit );
+    /* XXX: fix
+        if ( fabs( myStats->robustNfit - realNfitWithMask ) < ( ERROR_TOLERANCE * realNfitWithMask ) ) {
+            testStatus = true;
+        } else {
+            testStatus = false;
+            globalTestStatus = false;
+        }
+    */
+    printFooter( stdout,
+                 "psVector functions",
+                 "PS_STAT_ROBUST_STATS: robust Nfit: with vector mask",
+                 testStatus );
+
+
+
+    /*************************************************************************/
+    /*  Deallocate data structures                                           */
+    /*************************************************************************/
+    printPositiveTestHeader( stdout,
+                             "psStats functions",
+                             "psStats(): deallocating memory" );
+
+    psFree( myStats );
+    psFree( myVector );
+    psFree( maskVector );
+
+    psMemCheckCorruption( 1 );
+    memLeaks = psMemCheckLeaks(currentId,NULL,stderr,false);
+    if ( 0 != memLeaks ) {
+        psAbort( __func__, "Memory Leaks! (%d leaks)", memLeaks );
+    }
+
+    printFooter( stdout,
+                 "psVector functions",
+                 "psStats(): deallocating memory",
+                 testStatus );
+
+    return ( !globalTestStatus );
+}
+
+psS32 main()
+{
+    t00();
+    t01();
+}
Index: /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psStats08.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psStats08.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psStats08.c	(revision 22331)
@@ -0,0 +1,172 @@
+/*****************************************************************************
+    This routine must ensure that PS_STAT_SAMPLE_QUARTILE is correctly computed
+    by the procedure psArrayStats().
+ *****************************************************************************/
+#include <stdio.h>
+#include "pslib_strict.h"
+#include "psTest.h"
+#include "psTest.h"
+#include "float.h"
+#include <math.h>
+
+#define N1 25  //
+#define N (8 * N1) // Don't change this (N must be a multiple of 8)
+
+psS32 main()
+{
+    psStats *myStats    = NULL;
+    psS32 testStatus      = true;
+    psS32 globalTestStatus = true;
+    psS32 i               = 0;
+    psVector *myVector  = NULL;
+    psVector *maskVector= NULL;
+    // NOTE: These values were calculated by running the function on the data.
+    // A: They must be changed if we adjust the number of data points.
+    // B: We don't really know that they are correct.
+    float realLQNoMask   = N/4.0;
+    float realUQNoMask   = 3.0 * (N/4.0);
+    float realLQWithMask   = N/8.0;
+    float realUQWithMask   = 3.0 * (N/8.0);
+    psS32 count           = 0;
+    psS32 currentId       = psMemGetId();
+    psS32 memLeaks        = 0;
+
+    /*************************************************************************/
+    /*  Allocate and initialize data structures                      */
+    /*************************************************************************/
+    myStats = psStatsAlloc(PS_STAT_SAMPLE_QUARTILE);
+    myVector = psVectorAlloc(N, PS_TYPE_F32);
+    myVector->n = N;
+    maskVector = psVectorAlloc(N, PS_TYPE_U8);
+    maskVector->n = N;
+
+    // Set the appropriate values for the vector data.
+    for (i=0;i<N;i++) {
+        myVector->data.F32[i] = (float) i;
+    }
+
+    // Set the mask vector and calculate the expected maximum.
+    for (i=0;i<N;i++) {
+        if (i < (N/2)) {
+            maskVector->data.U8[i] = 0;
+            count++;
+        } else {
+            maskVector->data.U8[i] = 1;
+        }
+    }
+
+    /*************************************************************************/
+    /*  Call psVectorStats() with no vector mask.                    */
+    /*************************************************************************/
+    printPositiveTestHeader(stdout,
+                            "psStats functions",
+                            "PS_STAT_SAMPLE_LQ: no vector mask");
+
+    myStats = psVectorStats(myStats, myVector, NULL, NULL, 0);
+
+    printf("Called psVectorStats() on a vector with no elements masked.\n");
+    printf("The expected sampleLQ was %f; the calculated sampleLQ was %f\n",
+           realLQNoMask, myStats->sampleLQ);
+    if (fabs(realLQNoMask - myStats->sampleLQ) <= 2.0 * FLT_EPSILON) {
+        testStatus = true;
+    } else {
+        testStatus = false;
+        globalTestStatus = false;
+    }
+    printFooter(stdout,
+                "psVector functions",
+                "PS_STAT_SAMPLE_LQ: no vector mask",
+                testStatus);
+
+
+
+    printPositiveTestHeader(stdout,
+                            "psStats functions",
+                            "PS_STAT_SAMPLE_UQ: no vector mask");
+
+    myStats = psVectorStats(myStats, myVector, NULL, NULL, 0);
+
+    printf("Called psVectorStats() on a vector with no elements masked.\n");
+    printf("The expected sampleUQ was %f; the calculated sampleUQ was %f\n",
+           realUQNoMask, myStats->sampleUQ);
+    if (fabs(realUQNoMask - myStats->sampleUQ) <= 2.0 * FLT_EPSILON) {
+        testStatus = true;
+    } else {
+        testStatus = false;
+        globalTestStatus = false;
+    }
+    printFooter(stdout,
+                "psVector functions",
+                "PS_STAT_SAMPLE_UQ: no vector mask",
+                testStatus);
+
+    /*************************************************************************/
+    /*  Call psVectorStats() with vector mask.                       */
+    /*************************************************************************/
+    printPositiveTestHeader(stdout,
+                            "psStats functions",
+                            "PS_STAT_SAMPLE_LQ: with vector mask");
+
+    myStats = psVectorStats(myStats, myVector, NULL, maskVector, 1);
+
+    printf("Called psVectorStats() on a vector with elements masked.\n");
+    printf("The expected sampleLQ was %f; the calculated sampleLQ was %f\n",
+           realLQWithMask, myStats->sampleLQ);
+    if (fabs(realLQWithMask - myStats->sampleLQ) <= 2.0 * FLT_EPSILON) {
+        testStatus = true;
+    } else {
+        testStatus = false;
+        globalTestStatus = false;
+    }
+    printFooter(stdout,
+                "psVector functions",
+                "PS_STAT_SAMPLE_LQ: with vector mask",
+                testStatus);
+
+
+
+    printPositiveTestHeader(stdout,
+                            "psStats functions",
+                            "PS_STAT_SAMPLE_UQ: with vector mask");
+
+    myStats = psVectorStats(myStats, myVector, NULL, maskVector, 1);
+
+    printf("Called psVectorStats() on a vector with elements masked.\n");
+    printf("The expected sampleUQ was %f; the calculated sampleUQ was %f\n",
+           realUQWithMask, myStats->sampleUQ);
+    if (fabs(realUQWithMask - myStats->sampleUQ) <= 2.0 * FLT_EPSILON) {
+        testStatus = true;
+    } else {
+        testStatus = false;
+        globalTestStatus = false;
+    }
+    printFooter(stdout,
+                "psVector functions",
+                "PS_STAT_SAMPLE_UQ: with vector mask",
+                testStatus);
+
+
+    /*************************************************************************/
+    /*  Deallocate data structures                                   */
+    /*************************************************************************/
+    printPositiveTestHeader(stdout,
+                            "psStats functions",
+                            "psStats(): deallocating memory");
+
+    psFree(myStats);
+    psFree(myVector);
+    psFree(maskVector);
+
+    psMemCheckCorruption(1);
+    memLeaks = psMemCheckLeaks(currentId,NULL,stderr,false);
+    if (0 != memLeaks) {
+        psAbort(__func__,"Memory Leaks! (%d leaks)", memLeaks);
+    }
+
+    printFooter(stdout,
+                "psVector functions",
+                "psStats(): deallocating memory",
+                testStatus);
+
+    return (!globalTestStatus);
+}
Index: /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psStats09.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psStats09.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psStats09.c	(revision 22331)
@@ -0,0 +1,146 @@
+/*****************************************************************************
+    This routine must ensure that PS_STAT_CLIPPED_MEAN and
+    PS_STAT_CLIPPED_STDEV is calculate correctly by the procedure
+    psVectorStats().
+ *****************************************************************************/
+#include <stdio.h>
+#include "pslib_strict.h"
+#include "psTest.h"
+#include "psTest.h"
+#include "psImageStats.h"
+#include "float.h"
+#include <math.h>
+
+#define N 500
+#define MY_MEAN  30.0
+#define MY_RANGE 2.0
+
+psS32 main()
+{
+    psStats *myStats    = NULL;
+    psS32 testStatus      = true;
+    psS32 globalTestStatus = true;
+    psS32 i               = 0;
+    psVector *maskVector= NULL;
+    psVector *myGaussData  = NULL;
+    // NOTE: These values were calculated by running the function on the data.
+    // A: They must be changed if we adjust the number of data points.
+    // B: We don't really know that they are correct.
+    //    float realclippedMeanNoMask  = 0.0;
+    //    float realclippedStdevNoMask = 0.0;
+    //    float realclippedMeanWithMask  = 0.0;
+    //    float realclippedStdevWithMask = 0.0;
+    psS32 count           = 0;
+    psS32 currentId       = psMemGetId();
+    psS32 memLeaks        = 0;
+
+    /*************************************************************************/
+    /*  Allocate and initialize data structures                      */
+    /*************************************************************************/
+    myStats = psStatsAlloc(PS_STAT_CLIPPED_MEAN |
+                           PS_STAT_CLIPPED_STDEV);
+
+    myGaussData = psVectorAlloc(N, PS_TYPE_F32);
+    myGaussData->n = myGaussData->nalloc;
+    for (i=0;i<N;i++) {
+        myGaussData->data.F32[i] = MY_MEAN - (MY_RANGE/1.9) +
+                                   (MY_RANGE) * ((float) i) / ((float) N);
+    }
+
+    maskVector = psVectorAlloc(N, PS_TYPE_U8);
+    maskVector->n = N;
+
+    // Set the mask vector and calculate the expected maximum.
+    for (i=0;i<N;i++) {
+        if (i < (N/2)) {
+            maskVector->data.U8[i] = 0;
+            count++;
+        } else {
+            maskVector->data.U8[i] = 1;
+        }
+    }
+
+    /*************************************************************************/
+    /*  Call psVectorStats() with no vector mask.                    */
+    /*************************************************************************/
+    printPositiveTestHeader(stdout,
+                            "psStats functions",
+                            "PS_STAT_CLIPPED_MEAN: no vector mask");
+
+    myStats = psVectorStats(myStats, myGaussData, NULL, NULL, 0);
+
+    printf("Called psVectorStats() on a vector with no elements masked.\n");
+    printf("The calculated clippedMean was %.2f\n", myStats->clippedMean);
+
+    printFooter(stdout,
+                "psVector functions",
+                "PS_STAT_CLIPPED_MEAN/STDEV: no vector mask",
+                testStatus);
+
+
+
+    printPositiveTestHeader(stdout,
+                            "psStats functions",
+                            "PS_STAT_CLIPPED_STDEV: no vector mask");
+
+    printf("Called psVectorStats() on a vector with no elements masked.\n");
+    printf("The calculated clippedStdev was %.2f\n", myStats->clippedStdev);
+
+    printFooter(stdout,
+                "psVector functions",
+                "PS_STAT_CLIPPED_MEAN/STDEV: no vector mask",
+                testStatus);
+
+    /*************************************************************************/
+    /*  Call psVectorStats() with vector mask.                       */
+    /*************************************************************************/
+    printPositiveTestHeader(stdout,
+                            "psStats functions",
+                            "PS_STAT_CLIPPED_MEAN: vector mask");
+
+    myStats = psVectorStats(myStats, myGaussData, NULL, maskVector, 1);
+
+    printf("Called psVectorStats() on a vector with elements masked.\n");
+    printf("The calculated clippedMean was %.2f\n", myStats->clippedMean);
+    printFooter(stdout,
+                "psVector functions",
+                "PS_STAT_CLIPPED_MEAN/STDEV: vector mask",
+                testStatus);
+
+
+
+    printPositiveTestHeader(stdout,
+                            "psStats functions",
+                            "PS_STAT_CLIPPED_STDEV: vector mask");
+
+    printf("Called psVectorStats() on a vector with elements masked.\n");
+    printf("The calculated clippedStdev was %.2f\n", myStats->clippedStdev);
+    printFooter(stdout,
+                "psVector functions",
+                "PS_STAT_CLIPPED_MEAN/STDEV: vector mask",
+                testStatus);
+
+    /*************************************************************************/
+    /*  Deallocate data structures                                   */
+    /*************************************************************************/
+    printPositiveTestHeader(stdout,
+                            "psStats functions",
+                            "psStats(): deallocating memory");
+
+    psFree(myStats);
+    psFree(myGaussData);
+    psFree(maskVector);
+
+    psMemCheckCorruption(1);
+    memLeaks = psMemCheckLeaks(currentId,NULL,stderr,false);
+    if (0 != memLeaks) {
+        psAbort(__func__,"Memory Leaks! (%d leaks)", memLeaks);
+    }
+
+    printFooter(stdout,
+                "psVector functions",
+                "psStats(): deallocating memory",
+                testStatus);
+
+    return (!globalTestStatus);
+}
Index: /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psVectorFFT.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psVectorFFT.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/dataManip/tst_psVectorFFT.c	(revision 22331)
@@ -0,0 +1,643 @@
+/** @file  tst_psVectorFFT.c
+*
+*  @brief Contains the tests for psFFT.[ch]
+*
+*
+*  @author Robert DeSonia, MHPCC
+*
+*  @version $Revision: 1.15 $ $Name: not supported by cvs2svn $
+*  @date $Date: 2005-04-07 20:27:42 $
+*
+*  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+*/
+
+#include <math.h>
+#include <float.h>
+
+#include "psTest.h"
+#include "pslib_strict.h"
+
+#define GENIMAGE(img,c,r,TYP, valueFcn) \
+img = psImageAlloc(c,r,PS_TYPE_##TYP); \
+for (psU32 row=0;row<r;row++) { \
+    ps##TYP* imgRow = img->data.TYP[row]; \
+    for (psU32 col=0;col<c;col++) { \
+        imgRow[col] = (ps##TYP)(valueFcn); \
+    } \
+}
+
+static psS32 testVectorFFT( void );
+static psS32 testVectorRealImaginary( void );
+static psS32 testVectorComplex( void );
+static psS32 testVectorConjugate( void );
+static psS32 testVectorPowerSpectrum( void );
+
+testDescription tests[] = {
+                              {testVectorFFT, 600, "psVectorFFT", 0, false},
+                              {testVectorRealImaginary, 601, "psVectorRealImaginary", 0, false},
+                              {testVectorComplex, 602, "psVectorComplex", 0, false},
+                              {testVectorConjugate, 603, "psVectorConjugate", 0, false},
+                              {testVectorPowerSpectrum, 604, "psVectorPowerSpectrum", 0, false},
+                              {NULL}
+                          };
+
+psS32 main( psS32 argc, char* argv[] )
+{
+    psLogSetLevel( PS_LOG_INFO );
+
+    return ( ! runTestSuite( stderr, "psFFT", tests, argc, argv ) );
+}
+
+psS32 testVectorFFT( void )
+{
+    psVector * vec = NULL;
+    psVector* vec2 = NULL;
+    psVector* vec3 = NULL;
+    psVector* vec4 = NULL;
+
+    /*
+    1. assign a vector to a sinisoid
+    2. perform a forward transform
+    3. verify that the only significant component cooresponds to the freqency of the input in step 1.
+    4. perform a reverse transform
+    5. compare to original (should be equal to within a reasonable error)
+    */
+
+    // 1. assign a vector to a sinisoid
+    vec = psVectorAlloc( 100, PS_TYPE_F32 );
+    vec->n = vec->nalloc;
+    for ( psU32 n = 0; n < 100; n++ ) {
+        vec->data.F32[ n ] = sinf( ( psF32 ) n / 50.0f * PS_PI );
+    }
+
+    // 2. perform a forward transform
+    vec2 = psVectorFFT( NULL, vec, PS_FFT_FORWARD );
+    if ( vec2->type.type != PS_TYPE_C32 ) {
+        psError(PS_ERR_UNKNOWN,true, "FFT didn't produce complex values?" );
+        return 1;
+    }
+
+    // 2a. verify output vector is same size as input
+    if ( vec2->n != vec->n ) {
+        psError(PS_ERR_UNKNOWN,true, "FFT didn't return vector with same size as input");
+        return 10;
+    }
+
+
+    // 3. verify that the only significant component cooresponds to the freqency of the input in step 1.
+    for ( psU32 n = 0; n < 100; n++ ) {
+        if ( n == 1 || n == 99 ) {
+            if ( fabsf( cabsf( vec2->data.C32[ n ] ) - 50.0f ) > 0.1f ) {
+                psError(PS_ERR_UNKNOWN,true, "FFT didn't work for vector (n=%d)", n );
+                return 2;
+            }
+        } else {
+            if ( fabsf( cabsf( vec2->data.C32[ n ] ) ) > 0.1f ) {
+                psError(PS_ERR_UNKNOWN,true, "FFT didn't work for vector (n=%d)", n );
+                return 3;
+            }
+        }
+    }
+
+    // 4. perform a reverse transform
+    vec3 = psVectorFFT( NULL, vec2, PS_FFT_REVERSE );
+    if ( vec3->type.type != PS_TYPE_C32 ) {
+        psError(PS_ERR_UNKNOWN,true, "FFT didn't produce complex values?" );
+        return 4;
+    }
+    if ( vec3->n != vec2->n ) {
+        psError(PS_ERR_UNKNOWN,true, "FFT didn't return vector with same size as input");
+        return 40;
+    }
+    for ( psU32 n = 0; n < 100; n++ ) {
+        psF32 val = sinf( ( psF32 ) n / 50.0f * PS_PI );
+        psF32 vecVal = crealf( vec3->data.C32[ n ] ) / 100;
+        if ( fabsf( vecVal - val ) > 0.1f ) {
+            psError(PS_ERR_UNKNOWN,true, "Reverse FFT didn't give me the original vector back (n=%d) (%.2f vs %.2f)",
+                    n, vecVal, val );
+            return 5;
+        }
+    }
+
+    // Perform a reverse transform with real flag set
+    vec4 = psVectorFFT(NULL,vec2, (PS_FFT_REVERSE | PS_FFT_REAL_RESULT));
+    if(vec4->type.type != PS_TYPE_F32) {
+        psError(PS_ERR_UNKNOWN,true,"FFT with real result did not produce real values");
+        return 80;
+    }
+
+    // Perform vector FFT with invalid direction flags
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message.");
+    if ( psVectorFFT(NULL,vec2,(psFFTFlags)0) != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Did not return NULL with invalid direction");
+        return 70;
+    }
+
+    psFree( vec );
+    psFree( vec2 );
+    psFree( vec3 );
+    psFree( vec4 );
+
+    // Perform vector FFT with null input
+    if ( psVectorFFT(NULL,NULL,PS_FFT_FORWARD) != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Did not return NULL with null input vector");
+        return 64;
+    }
+
+    return 0;
+}
+
+psS32 testVectorRealImaginary( void )
+{
+    psVector * vec = NULL;
+    psVector* vec2 = NULL;
+    psVector* vec3 = NULL;
+    psVector* vec4 = NULL;
+    psVector* vec5 = NULL;
+    psVector* vec6 = NULL;
+    psVector* vec7 = NULL;
+    psVector* vec8 = NULL;
+    psVector* vec9 = NULL;
+    psVector* vec10 = NULL;
+    psVector* vec11 = NULL;
+
+    /*
+    1. create a C32 complex vector with distinctly different real and imaginary parts.
+    2. call psVectorReal and psVectorImaginary
+    3. compare results to the real/imaginary components of input
+    */
+
+    // 1. create a C32 complex vector with distinctly different real and imaginary parts.
+    vec = psVectorAlloc( 100, PS_TYPE_C32 );
+    vec8 = psVectorAlloc( 100, PS_TYPE_C64 );
+    vec10 = psVectorAlloc( 100, PS_TYPE_C64 );
+    vec->n = vec->nalloc;
+    vec8->n = vec8->nalloc;
+    vec10->n = vec10->nalloc;
+    for ( psU32 n = 0; n < 100; n++ ) {
+        vec->data.C32[ n ] = n + I * ( n * 2 );
+        vec8->data.C64[n] = n + I * ( n * 2 );
+        vec10->data.C64[n] = n + I * ( n * 2 );
+    }
+    vec4 = psVectorAlloc( 100, PS_TYPE_F32);
+    vec4->n = vec4->nalloc;
+    vec6 = psVectorAlloc( 100, PS_TYPE_F32);
+    vec6->n = vec6->nalloc;
+    for ( psU32 n = 0; n < 100; n++ ) {
+        vec4->data.F32[n] = n;
+        vec6->data.F32[n] = n;
+    }
+
+    // 2. call psVectorReal and psVectorImaginary
+    vec2 = psVectorReal( vec2, vec );
+    if ( vec2 == NULL ) {
+        psError(PS_ERR_UNKNOWN,true, "psVectorReal returned a NULL?" );
+        return 1;
+    }
+    if ( vec2->type.type != PS_TYPE_F32 ) {
+        psError(PS_ERR_UNKNOWN,true, "psVectorReal returned a wrong type (%d)?",
+                vec2->type.type );
+        return 2;
+    }
+
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate a warning.");
+    vec5 = psVectorReal(vec5, vec4);
+    if (vec5 == NULL) {
+        psError(PS_ERR_UNKNOWN,true,"psVectorReal returned NULL");
+        return 10;
+    }
+    if ( vec5->type.type != PS_TYPE_F32) {
+        psError(PS_ERR_UNKNOWN,true,"psVectorReal returned the wrong type");
+        return 11;
+    }
+
+    vec9 = psVectorReal(vec9,vec8);
+    if(vec9 == NULL) {
+        psError(PS_ERR_UNKNOWN,true,"psVectorReal returned NULL");
+        return 20;
+    }
+    if(vec9->type.type != PS_TYPE_F64) {
+        psError(PS_ERR_UNKNOWN,true,"psVectorReal returned the wrong type");
+        return 21;
+    }
+
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate a warning.");
+    vec3 = psVectorImaginary( vec3, vec );
+    if ( vec3 == NULL ) {
+        psError(PS_ERR_UNKNOWN,true, "psVectorImaginary returned a NULL?" );
+        return 3;
+    }
+    if ( vec3->type.type != PS_TYPE_F32 ) {
+        psError(PS_ERR_UNKNOWN,true, "psVectorImaginary returned a wrong type (%d)?",
+                vec3->type.type );
+        return 4;
+    }
+
+    vec7 = psVectorImaginary(vec7, vec6);
+    if(vec7 == NULL) {
+        psError(PS_ERR_UNKNOWN,true,"psVectorImage returned NULL");
+        return 12;
+    }
+    if(vec7->type.type != PS_TYPE_F32) {
+        psError(PS_ERR_UNKNOWN,true,"psVectorImaginary returned the wrong type");
+        return 13;
+    }
+
+    vec11 = psVectorImaginary(vec11, vec10);
+    if(vec11 == NULL) {
+        psError(PS_ERR_UNKNOWN,true,"psVectorImaginary returned NULL");
+        return 14;
+    }
+    if(vec11->type.type != PS_TYPE_F64) {
+        psError(PS_ERR_UNKNOWN,true,"psVectorImaginary returned the wrong type");
+        return 15;
+    }
+
+    // 3. compare results to the real/imaginary components of input
+    for ( psU32 n = 0; n < 100; n++ ) {
+        psF32 r = n;
+        psF32 i = ( n * 2 );
+        psF64 rr = n;
+        psF64 ii = ( n * 2 );
+        if ( fabsf( vec2->data.F32[ n ] - r ) > FLT_EPSILON ) {
+            psError(PS_ERR_UNKNOWN,true, "psVectorReal didn't return the real portion at n=%d",
+                    n );
+            return 5;
+        }
+        if ( fabsf( vec3->data.F32[ n ] - i ) > FLT_EPSILON ) {
+            psError(PS_ERR_UNKNOWN,true, "psVectorImaginary didn't return the real portion at n=%d",
+                    n );
+            return 6;
+        }
+        if ( fabsf( vec5->data.F32[n] - r) > FLT_EPSILON) {
+            psError(PS_ERR_UNKNOWN,true,"psVectorReal didn't return the real portion at n=%d",n);
+            return 50;
+        }
+        if ( fabsf( vec7->data.F32[n] - 0) > FLT_EPSILON) {
+            psError(PS_ERR_UNKNOWN,true,"psVectorImaginary did not return the imaginary portion at n=%d",n);
+            return 51;
+        }
+        if ( fabsf(vec9->data.F64[n] - rr) > FLT_EPSILON ) {
+            psError(PS_ERR_UNKNOWN,true,"psVectorReal did not return the real portion at n=%d",n);
+            return 52;
+        }
+        if ( fabsf(vec11->data.F64[n] - ii) > FLT_EPSILON) {
+            psError(PS_ERR_UNKNOWN,true,"psVectorImaginary did not return the imaginary portion at n=%d",n);
+            return 53;
+        }
+    }
+
+    psFree( vec );
+    psFree( vec2 );
+    psFree( vec3 );
+    psFree( vec4 );
+    psFree( vec5 );
+    psFree( vec6 );
+    psFree( vec7 );
+    psFree( vec8 );
+    psFree( vec9 );
+    psFree( vec10 );
+    psFree( vec11 );
+
+    // Perform vector Real with null input
+    if ( psVectorReal(NULL,NULL) != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Did not return NULL with null input vector");
+        return 63;
+    }
+    // Perform vector Imaginary with null input
+    if ( psVectorImaginary(NULL,NULL) != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Did not return NULL with null input vector");
+        return 73;
+    }
+
+    return 0;
+}
+
+psS32 testVectorComplex( void )
+{
+    psVector * vec = NULL;
+    psVector* vec2 = NULL;
+    psVector* vec3 = NULL;
+    psVector* vec4 = NULL;
+    psVector* vec5 = NULL;
+    psVector* vec6 = NULL;
+
+    /*
+    1. create two unique psF32 vectors of the same size
+    2. call psVectorComplex
+    3. verify that the result is a psC32
+    4. call psVectorReal and psVectorImaginary on step 2 results
+    5. compare step 4 results to input.
+
+    6. create a psF32 and a psF64 vector of the same size
+    7. call psVectorComplex
+    8. verify that an appropriate error occurred.
+
+    9. create two psf32 vectors of different sizes
+    10. call psVectorComplex
+    11. verify thet an appropriate error occurred.
+    */
+
+    // 1. create two unique psF32 vectors of the same size
+    vec = psVectorAlloc( 100, PS_TYPE_F32 );
+    vec2 = psVectorAlloc( 100, PS_TYPE_F32 );
+    vec4 = psVectorAlloc( 100, PS_TYPE_F64 );
+    vec5 = psVectorAlloc( 100, PS_TYPE_F64 );
+    vec->n = vec->nalloc;
+    vec2->n = vec2->nalloc;
+    vec4->n = vec4->nalloc;
+    vec5->n = vec5->nalloc;
+    for ( psU32 n = 0; n < 100; n++ ) {
+        vec->data.F32[ n ] = n;
+        vec2->data.F32[ n ] = ( n * 2 );
+        vec4->data.F64[ n ] = n;
+        vec5->data.F64[ n ] = ( n * 2 );
+    }
+
+    // 2. call psVectorComplex
+    vec3 = psVectorComplex( vec3, vec, vec2 );
+
+    // 3. verify that the result is a psC32
+    if ( vec3->type.type != PS_TYPE_C32 ) {
+        psError(PS_ERR_UNKNOWN,true, "Vector Type from psVectorComplex is not complex? (%d)",
+                vec3->type.type );
+        return 1;
+    }
+
+    // 4. call psVectorReal and psVectorImaginary on step 2 results (not needed, just use crealf/cimagf)
+    // 5. compare step 4 results to input.
+    for ( psU32 n = 0; n < 100; n++ ) {
+        if ( fabsf( crealf( vec3->data.C32[ n ] ) - n ) > FLT_EPSILON ||
+                fabsf( cimagf( vec3->data.C32[ n ] ) - ( n * 2 ) ) > FLT_EPSILON ) {
+            psError(PS_ERR_UNKNOWN,true, "psVectorComplex result is invalid (n=%d, %.2f+%.2fi)",
+                    n, crealf( vec3->data.C32[ n ] ), cimagf( vec3->data.C32[ n ] ) );
+            return 2;
+        };
+    }
+
+
+    // 6. create a psF32 and a psF64 vector of the same size
+    vec2 = psVectorRecycle( vec2, 100, PS_TYPE_F64 );
+
+    // 7. call psVectorComplex
+    psLogMsg(__func__, PS_LOG_INFO, "Following should be an error (type mismatch)." );
+    vec3 = psVectorComplex( vec3, vec, vec2 );
+    // 8. verify that an appropriate error occurred. (this partially has to be done via inspection)
+    if ( vec3 != NULL ) {
+        psError(PS_ERR_UNKNOWN,true, "psVectorComplex returned a vector though input types mismatched." );
+        return 3;
+    }
+
+    // 9. create two psf32 vectors of different sizes
+    vec2 = psVectorRecycle( vec2, 200, PS_TYPE_F32 );
+
+    // 10. call psVectorComplex
+    vec3 = psVectorComplex( vec3, vec, vec2 );
+
+    // 11. verify thet an appropriate error occurred. (actually, it isn't an error...)
+    if ( vec3->n != 100 ) {
+        psError(PS_ERR_UNKNOWN,true, "psVectorComplex returned a larger vector than the input supported (%d).", vec3->n );
+        return 4;
+    }
+
+    // Verify the function works with psF64 type
+    vec6 = psVectorComplex(vec6, vec4, vec5);
+    if( vec6->type.type != PS_TYPE_C64 ) {
+        psError(PS_ERR_UNKNOWN,true,"Vector return type is not complex");
+        return 40;
+    }
+
+    // Verify error message generated with input of invalid type
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message.");
+    vec4->type.type = PS_TYPE_S8;
+    vec5->type.type = PS_TYPE_S8;
+    vec6 = psVectorComplex(vec6, vec4, vec5);
+    if(vec6 != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Did not return NULL for invalid type");
+        return 50;
+    }
+    vec4->type.type = PS_TYPE_F64;
+    vec5->type.type = PS_TYPE_F64;
+
+    psFree( vec );
+    psFree( vec2 );
+    psFree( vec3 );
+    psFree( vec4 );
+    psFree( vec5 );
+
+    // Perform vector complex with null input
+    if ( psVectorComplex(NULL,NULL,NULL) != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Did not return NULL with null input vector");
+        return 62;
+    }
+
+    return 0;
+}
+
+psS32 testVectorConjugate( void )
+{
+    psVector * vec = NULL;
+    psVector* vec2 = NULL;
+
+    /*
+    1. create a psC32 with unique real and imaginary values.
+    2. call psVectorConjugate
+    3. verify result is psC32
+    4. verify each value is conjugate of input (a+bi -> a-bi)
+    */
+
+    // 1. create a psC32 with unique real and imaginary values.
+    vec = psVectorAlloc( 100, PS_TYPE_C32 );
+    vec->n = vec->nalloc;
+    for ( psU32 n = 0; n < 100; n++ ) {
+        vec->data.C32[ n ] = n + I * ( n * 2 );
+    }
+
+    // 2. call psVectorConjugate
+    vec2 = psVectorConjugate( vec2, vec );
+
+    // 3. verify result is psC32
+    if ( vec2->type.type != PS_TYPE_C32 ) {
+        psError(PS_ERR_UNKNOWN,true, "the psVectorConjugate didn't return a C32 vector" );
+        return 1;
+    }
+
+    // 4. verify each value is conjugate of input (a+bi -> a-bi)
+    for ( psU32 n = 0; n < 100; n++ ) {
+        if ( fabsf( crealf( vec->data.C32[ n ] ) - crealf( vec2->data.C32[ n ] ) ) > FLT_EPSILON ||
+                fabsf( cimagf( vec->data.C32[ n ] ) + cimagf( vec2->data.C32[ n ] ) ) > FLT_EPSILON ) {
+            psError(PS_ERR_UNKNOWN,true, "psVectorConjugate result is invalid (n=%d, %.2f+%.2fi)",
+                    n, crealf( vec2->data.C32[ n ] ), cimagf( vec2->data.C32[ n ] ) );
+            return 2;
+        };
+    }
+
+    psFree( vec );
+    psFree( vec2 );
+
+    // Perform conjugate for non-complex number
+    vec = psVectorAlloc( 100, PS_TYPE_F32 );
+    vec->n = vec->nalloc;
+    for ( psU32 n = 0; n < 100; n++ ) {
+        vec->data.F32[ n ] = n;
+    }
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate a warning message.");
+    vec2 = psVectorConjugate(vec2,vec);
+    if(vec2->type.type != PS_TYPE_F32) {
+        psError(PS_ERR_UNKNOWN,true,"psVectorConjugate did not return a F32 vector");
+        return 10;
+    }
+    for ( psU32 n = 0; n < 100; n++ ) {
+        if( vec->data.F32[n] != vec2->data.F32[n] ) {
+            psError(PS_ERR_UNKNOWN,true,"psVectorConjugate result is invalid (n=%d)",n);
+            return 11;
+        }
+    }
+    psFree(vec);
+
+    // Perform vector conjugate with C64 type
+    vec = psVectorAlloc( 100, PS_TYPE_C64 );
+    vec->n = vec->nalloc;
+    for ( psU32 n = 0; n < 100; n++ ) {
+        vec->data.C64[n] = n + I * ( n * 2 );
+    }
+    vec2 = psVectorConjugate(vec2,vec);
+    if(vec2->type.type != PS_TYPE_C64) {
+        psError(PS_ERR_UNKNOWN,true,"psVectorConjugate did not return a C64 vector");
+        return 12;
+    }
+    for ( psU32 n = 0; n < 100; n++ ) {
+        if ( fabsf( crealf(vec->data.C64[n]) - crealf(vec2->data.C64[n])) > FLT_EPSILON ||
+                fabsf( cimagf(vec->data.C64[n]) - cimagf(vec2->data.C64[n])) > FLT_EPSILON ) {
+            psError(PS_ERR_UNKNOWN,true,"psVectorConjugate result is invalid (n=%d)",n);
+            return 13;
+        }
+    }
+    psFree(vec);
+
+    // Perform vector conjugate with null input
+    if ( psVectorConjugate(NULL,NULL) != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Did not return NULL with null input vector");
+        return 61;
+    }
+
+    return 0;
+}
+
+psS32 testVectorPowerSpectrum( void )
+{
+    psVector * vec = NULL;
+    psVector* vec2 = NULL;
+    psVector* vec3 = NULL;
+    psVector* vec4 = NULL;
+
+    psF32 val;
+    psF64 val1;
+
+    /*
+    1. create a psC32 vector with unique real and imaginary components
+    2. call psVectorPowerSpectrum
+    3. verify result is psF32
+    4. verify the values are the square of the absolute values of the original
+    */
+
+    // 1. create a psC32 vector with unique real and imaginary components
+    vec = psVectorAlloc( 100, PS_TYPE_C32 );
+    vec->n = vec->nalloc;
+    vec3 = psVectorAlloc(100,PS_TYPE_C64);
+    vec3->n = vec3->nalloc;
+    for ( psU32 n = 0; n < 100; n++ ) {
+        vec->data.C32[ n ] = n + I * sinf( ( ( psF32 ) n ) / 50.f * PS_PI );
+        vec3->data.C64[ n ] = n + I * sinf( ( ( psF64 ) n ) / 50.f * PS_PI );
+    }
+
+    // 2. call psVectorPowerSpectrum
+    vec2 = psVectorPowerSpectrum( vec2, vec );
+    vec4 = psVectorPowerSpectrum( vec4, vec3 );
+
+    // 3. verify result is psF32
+    if ( vec2->type.type != PS_TYPE_F32 ) {
+        psError(PS_ERR_UNKNOWN,true, "the type was not PS_TYPE_F32." );
+        return 1;
+    }
+    if ( vec4->type.type != PS_TYPE_F64 ) {
+        psError(PS_ERR_UNKNOWN,true,"psPowerSpectrum did not return type PS_TYPE_F64 type = %d",vec4->type.type);
+        return 20;
+    }
+
+    // 3a. verify result is the same size a input
+    // Awaiting IfA direction on bug #228
+    //    if ( vec2->n != vec->n ) {
+    //       psError(PS_ERR_UNKNOWN,true, "Output vector size different(%d) than input vector(%d)",vec2->n, vec->n);
+    //       return 10;
+    //    }
+
+    // 4. verify the values are the square of the absolute values of the original
+    //   (ADD specifies something else)
+    //   P_0 = |C_0|^2/N^2
+    //   P_j = (|C_j|^2+|C_N-j|^2)/N^2
+    //   P_N/2 = |C_N/2|^2/N^2
+    //  where j = 1,2,...,(N/2-1)
+
+    val = cabsf( vec->data.C32[ 0 ] ) * cabsf( vec->data.C32[ 0 ] ) / 100 / 100;
+    val1= cabsf( vec3->data.C64[0] ) * cabsf(vec3->data.C64[0])/100/100;
+    if ( fabsf( vec2->data.F32[ 0 ] - val ) > FLT_EPSILON ) {
+        psError(PS_ERR_UNKNOWN,true, "psVectorPowerSpectrum result is invalid (n=0, %.2f %.2f)",
+                vec2->data.F32[ 0 ], val );
+        return 2;
+    }
+    if ( fabsf( vec4->data.C64[0] - val1 ) > FLT_EPSILON ) {
+        psError(PS_ERR_UNKNOWN,true,"psVectorPowerSpectrum result is invalid (n=0)");
+        return 21;
+    }
+
+    for ( psU32 n = 1; n < 50; n++ ) {
+        val = ( cabsf( vec->data.C32[ n ] ) * cabsf( vec->data.C32[ n ] ) +
+                cabsf( vec->data.C32[ 100 - n ] ) * cabsf( vec->data.C32[ 100 - n ] ) ) / 100 / 100;
+        val1 = (cabsf(vec3->data.C64[n]) * cabsf(vec3->data.C64[n]) +
+                cabsf(vec3->data.C64[100-n]) * cabsf(vec3->data.C64[100-n]))/100/100;
+        if ( fabsf( val - vec2->data.F32[ n ] ) > 10*FLT_EPSILON ) {
+            psError(PS_ERR_UNKNOWN,true, "psVectorPowerSpectrum result is invalid (n=%d, %.2f %.2f)",
+                    n, vec2->data.F32[ n ], val );
+            return 2;
+        }
+        if (fabsf(val1 - vec4->data.F64[n]) > 10*FLT_EPSILON) {
+            psError(PS_ERR_UNKNOWN,true,"psVectorPowerSpectrum result is invalid (n=%d, %.2f %.2f)",n,vec4->data.F64[n],val1);
+            return 22;
+        }
+    }
+
+    val = cabsf( vec->data.C32[ 50 ] ) * cabsf( vec->data.C32[ 50 ] ) / 100 / 100;
+    if ( fabsf( vec2->data.F32[ 50 ] - val ) > 10*FLT_EPSILON ) {
+        psError(PS_ERR_UNKNOWN,true, "psVectorPowerSpectrum result is invalid (n=50, %.2f %.2f)",
+                vec2->data.F32[ 0 ], val );
+        return 2;
+    };
+
+    psFree( vec );
+    psFree( vec2 );
+    psFree( vec3 );
+    psFree( vec4 );
+
+    // Perform vector power spectrum with non-complex number
+    vec = psVectorAlloc(100,PS_TYPE_F32);
+    vec->n = vec->nalloc;
+    for( psU32 n=0; n<100; n++) {
+        vec->data.F32[n] = n;
+    }
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message.");
+    if(psVectorPowerSpectrum(NULL,vec) != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"psVectorPowerSpectrum did not return a null vector.");
+        return 10;
+    }
+
+    // Perform vector power spectrum with null input
+    if ( psVectorPowerSpectrum(NULL,NULL) != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"Did not return NULL with null input vector");
+        return 60;
+    }
+
+    psFree(vec);
+
+    return 0;
+}
Index: /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psFunc00.stderr
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psFunc00.stderr	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psFunc00.stderr	(revision 22331)
@@ -0,0 +1,152 @@
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psFunc00.c                                             *
+*            TestPoint: psPolynomialXD{psPolynomial1DAlloc}                        *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|I|testPolynomial1DAlloc
+    Following should generate error msg for negative terms
+<DATE><TIME>|<HOST>|E|psPolynomial1DAlloc (FILE:LINENO)
+    Error: n is less than 0.
+
+---> TESTPOINT PASSED (psPolynomialXD{psPolynomial1DAlloc} | tst_psFunc00.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psFunc00.c                                             *
+*            TestPoint: psPolynomialXD{psPolynomial2DAlloc}                        *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|I|testPolynomial2DAlloc
+    Following should generate error msg for negative terms
+<DATE><TIME>|<HOST>|E|psPolynomial2DAlloc (FILE:LINENO)
+    Error: nX is less than 0.
+<DATE><TIME>|<HOST>|I|testPolynomial2DAlloc
+    Following should generate error msg for negative terms
+<DATE><TIME>|<HOST>|E|psPolynomial2DAlloc (FILE:LINENO)
+    Error: nY is less than 0.
+
+---> TESTPOINT PASSED (psPolynomialXD{psPolynomial2DAlloc} | tst_psFunc00.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psFunc00.c                                             *
+*            TestPoint: psPolynomialXD{psPolynomial3DAlloc}                        *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|I|testPolynomial3DAlloc
+    Following should generate error msg for negative terms
+<DATE><TIME>|<HOST>|E|psPolynomial3DAlloc (FILE:LINENO)
+    Error: nX is less than 0.
+<DATE><TIME>|<HOST>|I|testPolynomial3DAlloc
+    Following should generate error msg for negative terms
+<DATE><TIME>|<HOST>|E|psPolynomial3DAlloc (FILE:LINENO)
+    Error: nY is less than 0.
+<DATE><TIME>|<HOST>|I|testPolynomial3DAlloc
+    Following should generate error msg for negative terms
+<DATE><TIME>|<HOST>|E|psPolynomial3DAlloc (FILE:LINENO)
+    Error: nZ is less than 0.
+
+---> TESTPOINT PASSED (psPolynomialXD{psPolynomial3DAlloc} | tst_psFunc00.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psFunc00.c                                             *
+*            TestPoint: psPolynomialXD{psPolynomial4DAlloc}                        *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|I|testPolynomial4DAlloc
+    Following should generate error msg for negative terms
+<DATE><TIME>|<HOST>|E|psPolynomial4DAlloc (FILE:LINENO)
+    Error: nW is less than 0.
+<DATE><TIME>|<HOST>|I|testPolynomial4DAlloc
+    Following should generate error msg for negative terms
+<DATE><TIME>|<HOST>|E|psPolynomial4DAlloc (FILE:LINENO)
+    Error: nX is less than 0.
+<DATE><TIME>|<HOST>|I|testPolynomial4DAlloc
+    Following should generate error msg for negative terms
+<DATE><TIME>|<HOST>|E|psPolynomial4DAlloc (FILE:LINENO)
+    Error: nY is less than 0.
+<DATE><TIME>|<HOST>|I|testPolynomial4DAlloc
+    Following should generate error msg for negative terms
+<DATE><TIME>|<HOST>|E|psPolynomial4DAlloc (FILE:LINENO)
+    Error: nZ is less than 0.
+
+---> TESTPOINT PASSED (psPolynomialXD{psPolynomial4DAlloc} | tst_psFunc00.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psFunc00.c                                             *
+*            TestPoint: psPolynomialXD{psDPolynomial1DAlloc}                       *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|I|testDPolynomial1DAlloc
+    Following should generate error msg for negative terms
+<DATE><TIME>|<HOST>|E|psDPolynomial1DAlloc (FILE:LINENO)
+    Error: n is less than 0.
+
+---> TESTPOINT PASSED (psPolynomialXD{psDPolynomial1DAlloc} | tst_psFunc00.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psFunc00.c                                             *
+*            TestPoint: psPolynomialXD{psDPolynomial2DAlloc}                       *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|I|testDPolynomial2DAlloc
+    Following should generate error msg for negative terms
+<DATE><TIME>|<HOST>|E|psDPolynomial2DAlloc (FILE:LINENO)
+    Error: nX is less than 0.
+<DATE><TIME>|<HOST>|I|testDPolynomial2DAlloc
+    Following should generate error msg for negative terms
+<DATE><TIME>|<HOST>|E|psDPolynomial2DAlloc (FILE:LINENO)
+    Error: nY is less than 0.
+
+---> TESTPOINT PASSED (psPolynomialXD{psDPolynomial2DAlloc} | tst_psFunc00.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psFunc00.c                                             *
+*            TestPoint: psPolynomialXD{psDPolynomial3DAlloc}                       *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|I|testDPolynomial3DAlloc
+    Following should generate error msg for negative terms
+<DATE><TIME>|<HOST>|E|psDPolynomial3DAlloc (FILE:LINENO)
+    Error: nX is less than 0.
+<DATE><TIME>|<HOST>|I|testDPolynomial3DAlloc
+    Following should generate error msg for negative terms
+<DATE><TIME>|<HOST>|E|psDPolynomial3DAlloc (FILE:LINENO)
+    Error: nY is less than 0.
+<DATE><TIME>|<HOST>|I|testDPolynomial3DAlloc
+    Following should generate error msg for negative terms
+<DATE><TIME>|<HOST>|E|psDPolynomial3DAlloc (FILE:LINENO)
+    Error: nZ is less than 0.
+
+---> TESTPOINT PASSED (psPolynomialXD{psDPolynomial3DAlloc} | tst_psFunc00.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psFunc00.c                                             *
+*            TestPoint: psPolynomialXD{psDPolynomial4DAlloc}                       *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|I|testDPolynomial4DAlloc
+    Following should generate error msg for negative terms
+<DATE><TIME>|<HOST>|E|psDPolynomial4DAlloc (FILE:LINENO)
+    Error: nW is less than 0.
+<DATE><TIME>|<HOST>|I|testDPolynomial4DAlloc
+    Following should generate error msg for negative terms
+<DATE><TIME>|<HOST>|E|psDPolynomial4DAlloc (FILE:LINENO)
+    Error: nX is less than 0.
+<DATE><TIME>|<HOST>|I|testDPolynomial4DAlloc
+    Following should generate error msg for negative terms
+<DATE><TIME>|<HOST>|E|psDPolynomial4DAlloc (FILE:LINENO)
+    Error: nY is less than 0.
+<DATE><TIME>|<HOST>|I|testDPolynomial4DAlloc
+    Following should generate error msg for negative terms
+<DATE><TIME>|<HOST>|E|psDPolynomial4DAlloc (FILE:LINENO)
+    Error: nZ is less than 0.
+
+---> TESTPOINT PASSED (psPolynomialXD{psDPolynomial4DAlloc} | tst_psFunc00.c)
+
Index: /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psFunc01.stdout
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psFunc01.stdout	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psFunc01.stdout	(revision 22331)
@@ -0,0 +1,108 @@
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psFunc01.c                                             *
+*            TestPoint: psFunctions functions{psGaussian()}                        *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+normal psGaussian(0.000000) is 0.000000
+normal psGaussian(2.000000) is 0.000000
+normal psGaussian(4.000000) is 0.000000
+normal psGaussian(6.000000) is 0.000000
+normal psGaussian(8.000000) is 0.000000
+normal psGaussian(10.000000) is 0.000000
+normal psGaussian(12.000000) is 0.000000
+normal psGaussian(14.000000) is 0.000000
+normal psGaussian(16.000000) is 0.000000
+normal psGaussian(18.000000) is 0.000000
+normal psGaussian(20.000000) is 0.000001
+normal psGaussian(22.000000) is 0.000067
+normal psGaussian(24.000000) is 0.002216
+normal psGaussian(26.000000) is 0.026995
+normal psGaussian(28.000000) is 0.120985
+normal psGaussian(30.000000) is 0.199471
+normal psGaussian(32.000000) is 0.120985
+normal psGaussian(34.000000) is 0.026995
+normal psGaussian(36.000000) is 0.002216
+normal psGaussian(38.000000) is 0.000067
+normal psGaussian(40.000000) is 0.000001
+normal psGaussian(42.000000) is 0.000000
+normal psGaussian(44.000000) is 0.000000
+normal psGaussian(46.000000) is 0.000000
+normal psGaussian(48.000000) is 0.000000
+normal psGaussian(50.000000) is 0.000000
+normal psGaussian(52.000000) is 0.000000
+normal psGaussian(54.000000) is 0.000000
+normal psGaussian(56.000000) is 0.000000
+normal psGaussian(58.000000) is 0.000000
+NON-normal psGaussian(0.000000) is 0.000000
+NON-normal psGaussian(2.000000) is 0.000000
+NON-normal psGaussian(4.000000) is 0.000000
+NON-normal psGaussian(6.000000) is 0.000000
+NON-normal psGaussian(8.000000) is 0.000000
+NON-normal psGaussian(10.000000) is 0.000000
+NON-normal psGaussian(12.000000) is 0.000000
+NON-normal psGaussian(14.000000) is 0.000000
+NON-normal psGaussian(16.000000) is 0.000000
+NON-normal psGaussian(18.000000) is 0.000000
+NON-normal psGaussian(20.000000) is 0.000004
+NON-normal psGaussian(22.000000) is 0.000335
+NON-normal psGaussian(24.000000) is 0.011109
+NON-normal psGaussian(26.000000) is 0.135335
+NON-normal psGaussian(28.000000) is 0.606531
+NON-normal psGaussian(30.000000) is 1.000000
+NON-normal psGaussian(32.000000) is 0.606531
+NON-normal psGaussian(34.000000) is 0.135335
+NON-normal psGaussian(36.000000) is 0.011109
+NON-normal psGaussian(38.000000) is 0.000335
+NON-normal psGaussian(40.000000) is 0.000004
+NON-normal psGaussian(42.000000) is 0.000000
+NON-normal psGaussian(44.000000) is 0.000000
+NON-normal psGaussian(46.000000) is 0.000000
+NON-normal psGaussian(48.000000) is 0.000000
+NON-normal psGaussian(50.000000) is 0.000000
+NON-normal psGaussian(52.000000) is 0.000000
+NON-normal psGaussian(54.000000) is 0.000000
+NON-normal psGaussian(56.000000) is 0.000000
+NON-normal psGaussian(58.000000) is 0.000000
+
+---> TESTPOINT PASSED (psFunctions functions{psGaussian()} | tst_psFunc01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psFunc01.c                                             *
+*            TestPoint: psFunctions functions{p_psGaussianDev()}                   *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Gaussian Deviate [0] is 30.267838
+Gaussian Deviate [1] is 29.823797
+Gaussian Deviate [2] is 33.348816
+Gaussian Deviate [3] is 31.467281
+Gaussian Deviate [4] is 31.995049
+Gaussian Deviate [5] is 27.444996
+Gaussian Deviate [6] is 25.206570
+Gaussian Deviate [7] is 28.641439
+Gaussian Deviate [8] is 29.921818
+Gaussian Deviate [9] is 31.787111
+Gaussian Deviate [10] is 29.964705
+Gaussian Deviate [11] is 27.406887
+Gaussian Deviate [12] is 28.664040
+Gaussian Deviate [13] is 30.363417
+Gaussian Deviate [14] is 31.662102
+Gaussian Deviate [15] is 28.903503
+Gaussian Deviate [16] is 28.723936
+Gaussian Deviate [17] is 30.014177
+Gaussian Deviate [18] is 28.660292
+Gaussian Deviate [19] is 28.344475
+Gaussian Deviate [20] is 31.225000
+Gaussian Deviate [21] is 29.264824
+Gaussian Deviate [22] is 29.421013
+Gaussian Deviate [23] is 28.166250
+Gaussian Deviate [24] is 28.832390
+Gaussian Deviate [25] is 30.129230
+Gaussian Deviate [26] is 30.093487
+Gaussian Deviate [27] is 28.498547
+Gaussian Deviate [28] is 29.711535
+Gaussian Deviate [29] is 32.951122
+
+---> TESTPOINT PASSED (psFunctions functions{p_psGaussianDev()} | tst_psFunc01.c)
+
Index: /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psFunc02.stderr
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psFunc02.stderr	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psFunc02.stderr	(revision 22331)
@@ -0,0 +1,20 @@
+<DATE><TIME>|<HOST>|I|main
+    Following should generate an error message.
+<DATE><TIME>|<HOST>|E|psSpline1DAlloc (FILE:LINENO)
+    Error: max and min are equal.
+<DATE><TIME>|<HOST>|I|main
+    Following should generate an error message
+<DATE><TIME>|<HOST>|E|psSpline1DAlloc (FILE:LINENO)
+    Error: max and min are equal.
+<DATE><TIME>|<HOST>|I|main
+    Following should generate an error message.
+<DATE><TIME>|<HOST>|E|psSpline1DAllocGeneric (FILE:LINENO)
+    Error: order is less than 0.
+<DATE><TIME>|<HOST>|I|main
+    Following should generate an error message.
+<DATE><TIME>|<HOST>|E|psSpline1DAllocGeneric (FILE:LINENO)
+    Unallowable operation: psVector bounds or its data is NULL.
+<DATE><TIME>|<HOST>|I|main
+    Following should generate an error message.
+<DATE><TIME>|<HOST>|E|psSpline1DAllocGeneric (FILE:LINENO)
+    Unallowable operation: psVector bounds has no elements.
Index: /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psFunc02.stdout
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psFunc02.stdout	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psFunc02.stdout	(revision 22331)
@@ -0,0 +1,115 @@
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psFunc02.c                                             *
+*            TestPoint: psFunction functions{psSpline1DAlloc(): linear, normal}    *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+psSpline1D->knots->data.F32[0] is 1.000000
+psSpline1D->knots->data.F32[1] is 3.250000
+psSpline1D->knots->data.F32[2] is 5.500000
+psSpline1D->knots->data.F32[3] is 7.750000
+psSpline1D->knots->data.F32[4] is 10.000000
+
+---> TESTPOINT PASSED (psFunctions functions{psSpline1DAlloc(): linear, normal} | tst_psFunc02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psFunc02.c                                             *
+*            TestPoint: psFunction functions{psSpline1DAlloc(): linear, min/max are equal} *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psFunctions functions{psSpline1DAlloc(): linear, min/max are equal} | tst_psFunc02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psFunc02.c                                             *
+*            TestPoint: psFunction functions{psSpline1DAlloc(): linear, min > max.} *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+psSpline1D->knots->data.F32[0] is 1.000000
+psSpline1D->knots->data.F32[1] is 0.500000
+psSpline1D->knots->data.F32[2] is 0.000000
+psSpline1D->knots->data.F32[3] is -0.500000
+psSpline1D->knots->data.F32[4] is -1.000000
+
+---> TESTPOINT PASSED (psFunctions functions{psSpline1DAlloc(): linear, min > max.} | tst_psFunc02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psFunc02.c                                             *
+*            TestPoint: psFunction functions{psSpline1DAlloc(), cubic, normal}     *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+psSpline1D->data.F32[0] is 1.000000
+psSpline1D->data.F32[1] is 3.250000
+psSpline1D->data.F32[2] is 5.500000
+psSpline1D->data.F32[3] is 7.750000
+psSpline1D->data.F32[4] is 10.000000
+
+---> TESTPOINT PASSED (psFunctions functions{psSpline1DAlloc(): cubic, normal} | tst_psFunc02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psFunc02.c                                             *
+*            TestPoint: psFunction functions{psSpline1DAlloc(): cubic, min/max are equal} *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psFunctions functions{psSpline1DAlloc(): cubic, min/max are equal} | tst_psFunc02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psFunc02.c                                             *
+*            TestPoint: psFunction functions{psSpline1DAlloc(): cubic, min > max.} *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+psSpline1D->knots->data.F32[0] is 1.000000
+psSpline1D->knots->data.F32[1] is 0.500000
+psSpline1D->knots->data.F32[2] is 0.000000
+psSpline1D->knots->data.F32[3] is -0.500000
+psSpline1D->knots->data.F32[4] is -1.000000
+
+---> TESTPOINT PASSED (psFunctions functions{psSpline1DAlloc(): cubic, min > max.} | tst_psFunc02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psFunc02.c                                             *
+*            TestPoint: psFunction functions{psSpline1DAllocGeneric(): linear, normal} *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+psSpline1D->knots->data.F32[0] is 2.000000
+psSpline1D->knots->data.F32[1] is 4.000000
+psSpline1D->knots->data.F32[2] is 6.000000
+psSpline1D->knots->data.F32[3] is 8.000000
+psSpline1D->knots->data.F32[4] is 10.000000
+
+---> TESTPOINT PASSED (psFunctions functions{psSpline1DAllocGeneric(): linear, normal} | tst_psFunc02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psFunc02.c                                             *
+*            TestPoint: psFunction functions{psSpline1DAllocGeneric(): negative order} *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psFunctions functions{psSpline1DAllocGeneric(): negative order} | tst_psFunc02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psFunc02.c                                             *
+*            TestPoint: psFunction functions{psSpline1DAllocGeneric(): bound equal to NULL} *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psFunctions functions{psSpline1DAllocGeneric(): bound equal to NULL} | tst_psFunc02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psFunc02.c                                             *
+*            TestPoint: psFunction functions{psSpline1DAllocGeneric(): bounds with zero elements} *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psFunctions functions{psSpline1DAllocGeneric(): bounds with zero elements} | tst_psFunc02.c)
+
Index: /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psFunc08.stderr
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psFunc08.stderr	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psFunc08.stderr	(revision 22331)
@@ -0,0 +1,68 @@
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psFunc08.c                                             *
+*            TestPoint: psPolynomialXDEval{psPolynomial1DEval}                     *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|I|testPoly1DEval
+    Following should generate error message invalid type
+<DATE><TIME>|<HOST>|E|psPolynomial1DEval (FILE:LINENO)
+    Unknown polynomial type 0x63 found.  Evaluation failed.
+
+---> TESTPOINT PASSED (psPolynomialXDEval{psPolynomial1DEval} | tst_psFunc08.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psFunc08.c                                             *
+*            TestPoint: psPolynomialXDEval{psDPolynomial1DEval}                    *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|I|testDPoly1DEval
+    Following should generate error message invalid type
+<DATE><TIME>|<HOST>|E|psDPolynomial1DEval (FILE:LINENO)
+    Unknown polynomial type 0x63 found.  Evaluation failed.
+
+---> TESTPOINT PASSED (psPolynomialXDEval{psDPolynomial1DEval} | tst_psFunc08.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psFunc08.c                                             *
+*            TestPoint: psPolynomialXDEval{psPolynomial1DEvalVector}               *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|I|testPoly1DEvalVector
+    Following should generate an error message for NULL polynomial
+<DATE><TIME>|<HOST>|E|psPolynomial1DEvalVector (FILE:LINENO)
+    Unallowable operation: polynomial myPoly or its coeffs is NULL.
+<DATE><TIME>|<HOST>|I|testPoly1DEvalVector
+    Following should generate an error message for NULL input vector
+<DATE><TIME>|<HOST>|E|psPolynomial1DEvalVector (FILE:LINENO)
+    Unallowable operation: psVector x or its data is NULL.
+<DATE><TIME>|<HOST>|I|testPoly1DEvalVector
+    Following should generate an error message for invalid input type
+<DATE><TIME>|<HOST>|E|psPolynomial1DEvalVector (FILE:LINENO)
+    Unallowable operation: psVector x has incorrect type.
+
+---> TESTPOINT PASSED (psPolynomialXDEval{psPolynomial1DEvalVector} | tst_psFunc08.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psFunc08.c                                             *
+*            TestPoint: psPolynomialXDEval{psDPolynomial1DEvalVector}              *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|I|testDPoly1DEvalVector
+    Following should generate an error message for NULL polynomial
+<DATE><TIME>|<HOST>|E|psDPolynomial1DEvalVector (FILE:LINENO)
+    Unallowable operation: polynomial myPoly or its coeffs is NULL.
+<DATE><TIME>|<HOST>|I|testDPoly1DEvalVector
+    Following should generate an error message for NULL input vector
+<DATE><TIME>|<HOST>|E|psDPolynomial1DEvalVector (FILE:LINENO)
+    Unallowable operation: psVector x or its data is NULL.
+<DATE><TIME>|<HOST>|I|testDPoly1DEvalVector
+    Following should generate an error message for invalid input type
+<DATE><TIME>|<HOST>|E|psDPolynomial1DEvalVector (FILE:LINENO)
+    Unallowable operation: psVector x has incorrect type.
+
+---> TESTPOINT PASSED (psPolynomialXDEval{psDPolynomial1DEvalVector} | tst_psFunc08.c)
+
Index: /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psFunc09.stderr
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psFunc09.stderr	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psFunc09.stderr	(revision 22331)
@@ -0,0 +1,84 @@
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psFunc09.c                                             *
+*            TestPoint: psPolynomialXDEval{psPolynomial2DEval}                     *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|I|testPoly2DEval
+    Following should generate error message invalid type
+<DATE><TIME>|<HOST>|E|psPolynomial2DEval (FILE:LINENO)
+    Unknown polynomial type 0x63 found.  Evaluation failed.
+
+---> TESTPOINT PASSED (psPolynomialXDEval{psPolynomial2DEval} | tst_psFunc09.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psFunc09.c                                             *
+*            TestPoint: psPolynomialXDEval{psDPolynomial2DEval}                    *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|I|testDPoly2DEval
+    Following should generate error message invalid type
+<DATE><TIME>|<HOST>|E|psDPolynomial2DEval (FILE:LINENO)
+    Unknown polynomial type 0x63 found.  Evaluation failed.
+
+---> TESTPOINT PASSED (psPolynomialXDEval{psDPolynomial2DEval} | tst_psFunc09.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psFunc09.c                                             *
+*            TestPoint: psPolynomialXDEval{psPolynomial2DEvalVector}               *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|I|testPoly2DEvalVector
+    Following should generate an error message for NULL polynomial
+<DATE><TIME>|<HOST>|E|psPolynomial2DEvalVector (FILE:LINENO)
+    Unallowable operation: polynomial myPoly or its coeffs is NULL.
+<DATE><TIME>|<HOST>|I|testPoly2DEvalVector
+    Following should generate an error message for NULL input vector
+<DATE><TIME>|<HOST>|E|psPolynomial2DEvalVector (FILE:LINENO)
+    Unallowable operation: psVector x or its data is NULL.
+<DATE><TIME>|<HOST>|I|testPoly2DEvalVector
+    Following should generate an error message for NULL input vector
+<DATE><TIME>|<HOST>|E|psPolynomial2DEvalVector (FILE:LINENO)
+    Unallowable operation: psVector y or its data is NULL.
+<DATE><TIME>|<HOST>|I|testPoly2DEvalVector
+    Following should generate an error message for invalid input type
+<DATE><TIME>|<HOST>|E|psPolynomial2DEvalVector (FILE:LINENO)
+    Unallowable operation: psVector x has incorrect type.
+<DATE><TIME>|<HOST>|I|testPoly2DEvalVector
+    Following should generate an error message for invalid input type
+<DATE><TIME>|<HOST>|E|psPolynomial2DEvalVector (FILE:LINENO)
+    Unallowable operation: psVector y has incorrect type.
+
+---> TESTPOINT PASSED (psPolynomialXDEval{psPolynomial2DEvalVector} | tst_psFunc09.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psFunc09.c                                             *
+*            TestPoint: psPolynomialXDEval{psDPolynomial2DEvalVector}              *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|I|testDPoly2DEvalVector
+    Following should generate an error message for NULL polynomial
+<DATE><TIME>|<HOST>|E|psDPolynomial2DEvalVector (FILE:LINENO)
+    Unallowable operation: polynomial myPoly or its coeffs is NULL.
+<DATE><TIME>|<HOST>|I|testDPoly2DEvalVector
+    Following should generate an error message for NULL input vector
+<DATE><TIME>|<HOST>|E|psDPolynomial2DEvalVector (FILE:LINENO)
+    Unallowable operation: psVector x or its data is NULL.
+<DATE><TIME>|<HOST>|I|testDPoly2DEvalVector
+    Following should generate an error message for NULL input vector
+<DATE><TIME>|<HOST>|E|psDPolynomial2DEvalVector (FILE:LINENO)
+    Unallowable operation: psVector y or its data is NULL.
+<DATE><TIME>|<HOST>|I|testDPoly2DEvalVector
+    Following should generate an error message for invalid input type
+<DATE><TIME>|<HOST>|E|psDPolynomial2DEvalVector (FILE:LINENO)
+    Unallowable operation: psVector x has incorrect type.
+<DATE><TIME>|<HOST>|I|testDPoly2DEvalVector
+    Following should generate an error message for invalid input type
+<DATE><TIME>|<HOST>|E|psDPolynomial2DEvalVector (FILE:LINENO)
+    Unallowable operation: psVector y has incorrect type.
+
+---> TESTPOINT PASSED (psPolynomialXDEval{psDPolynomial2DEvalVector} | tst_psFunc09.c)
+
Index: /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psFunc10.stderr
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psFunc10.stderr	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psFunc10.stderr	(revision 22331)
@@ -0,0 +1,100 @@
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psFunc10.c                                             *
+*            TestPoint: psPolynomialXDEval{psPolynomial3DEval}                     *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|I|testPoly3DEval
+    Following should generate error message invalid type
+<DATE><TIME>|<HOST>|E|psPolynomial3DEval (FILE:LINENO)
+    Unknown polynomial type 0x63 found.  Evaluation failed.
+
+---> TESTPOINT PASSED (psPolynomialXDEval{psPolynomial3DEval} | tst_psFunc10.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psFunc10.c                                             *
+*            TestPoint: psPolynomialXDEval{psDPolynomial3DEval}                    *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|I|testDPoly3DEval
+    Following should generate error message invalid type
+<DATE><TIME>|<HOST>|E|psDPolynomial3DEval (FILE:LINENO)
+    Unknown polynomial type 0x63 found.  Evaluation failed.
+
+---> TESTPOINT PASSED (psPolynomialXDEval{psDPolynomial3DEval} | tst_psFunc10.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psFunc10.c                                             *
+*            TestPoint: psPolynomialXDEval{psPolynomial3DEvalVector}               *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|I|testPoly3DEvalVector
+    Following should generate an error message for NULL polynomial
+<DATE><TIME>|<HOST>|E|psPolynomial3DEvalVector (FILE:LINENO)
+    Unallowable operation: polynomial myPoly or its coeffs is NULL.
+<DATE><TIME>|<HOST>|I|testPoly3DEvalVector
+    Following should generate an error message for NULL input vector
+<DATE><TIME>|<HOST>|E|psPolynomial3DEvalVector (FILE:LINENO)
+    Unallowable operation: psVector x or its data is NULL.
+<DATE><TIME>|<HOST>|I|testPoly3DEvalVector
+    Following should generate an error message for NULL input vector
+<DATE><TIME>|<HOST>|E|psPolynomial3DEvalVector (FILE:LINENO)
+    Unallowable operation: psVector y or its data is NULL.
+<DATE><TIME>|<HOST>|I|testPoly3DEvalVector
+    Following should generate an error message for NULL input vector
+<DATE><TIME>|<HOST>|E|psPolynomial3DEvalVector (FILE:LINENO)
+    Unallowable operation: psVector z or its data is NULL.
+<DATE><TIME>|<HOST>|I|testPoly3DEvalVector
+    Following should generate an error message for invalid input type
+<DATE><TIME>|<HOST>|E|psPolynomial3DEvalVector (FILE:LINENO)
+    Unallowable operation: psVector x has incorrect type.
+<DATE><TIME>|<HOST>|I|testPoly3DEvalVector
+    Following should generate an error message for invalid input type
+<DATE><TIME>|<HOST>|E|psPolynomial3DEvalVector (FILE:LINENO)
+    Unallowable operation: psVector y has incorrect type.
+<DATE><TIME>|<HOST>|I|testPoly3DEvalVector
+    Following should generate an error message for invalid input type
+<DATE><TIME>|<HOST>|E|psPolynomial3DEvalVector (FILE:LINENO)
+    Unallowable operation: psVector z has incorrect type.
+
+---> TESTPOINT PASSED (psPolynomialXDEval{psPolynomial3DEvalVector} | tst_psFunc10.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psFunc10.c                                             *
+*            TestPoint: psPolynomialXDEval{psDPolynomial3DEvalVector}              *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|I|testDPoly3DEvalVector
+    Following should generate an error message for NULL polynomial
+<DATE><TIME>|<HOST>|E|psDPolynomial3DEvalVector (FILE:LINENO)
+    Unallowable operation: polynomial myPoly or its coeffs is NULL.
+<DATE><TIME>|<HOST>|I|testDPoly3DEvalVector
+    Following should generate an error message for NULL input vector
+<DATE><TIME>|<HOST>|E|psDPolynomial3DEvalVector (FILE:LINENO)
+    Unallowable operation: psVector x or its data is NULL.
+<DATE><TIME>|<HOST>|I|testDPoly3DEvalVector
+    Following should generate an error message for NULL input vector
+<DATE><TIME>|<HOST>|E|psDPolynomial3DEvalVector (FILE:LINENO)
+    Unallowable operation: psVector y or its data is NULL.
+<DATE><TIME>|<HOST>|I|testDPoly3DEvalVector
+    Following should generate an error message for NULL input vector
+<DATE><TIME>|<HOST>|E|psDPolynomial3DEvalVector (FILE:LINENO)
+    Unallowable operation: psVector z or its data is NULL.
+<DATE><TIME>|<HOST>|I|testDPoly3DEvalVector
+    Following should generate an error message for invalid input type
+<DATE><TIME>|<HOST>|E|psDPolynomial3DEvalVector (FILE:LINENO)
+    Unallowable operation: psVector x has incorrect type.
+<DATE><TIME>|<HOST>|I|testDPoly3DEvalVector
+    Following should generate an error message for invalid input type
+<DATE><TIME>|<HOST>|E|psDPolynomial3DEvalVector (FILE:LINENO)
+    Unallowable operation: psVector y has incorrect type.
+<DATE><TIME>|<HOST>|I|testDPoly3DEvalVector
+    Following should generate an error message for invalid input type
+<DATE><TIME>|<HOST>|E|psDPolynomial3DEvalVector (FILE:LINENO)
+    Unallowable operation: psVector z has incorrect type.
+
+---> TESTPOINT PASSED (psPolynomialXDEval{psDPolynomial3DEvalVector} | tst_psFunc10.c)
+
Index: /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psFunc11.stderr
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psFunc11.stderr	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psFunc11.stderr	(revision 22331)
@@ -0,0 +1,116 @@
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psFunc11.c                                             *
+*            TestPoint: psPolynomialXDEval{psPolynomial4DEval}                     *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|I|testPoly4DEval
+    Following should generate error message invalid type
+<DATE><TIME>|<HOST>|E|psPolynomial4DEval (FILE:LINENO)
+    Unknown polynomial type 0x63 found.  Evaluation failed.
+
+---> TESTPOINT PASSED (psPolynomialXDEval{psPolynomial4DEval} | tst_psFunc11.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psFunc11.c                                             *
+*            TestPoint: psPolynomialXDEval{psDPolynomial4DEval}                    *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|I|testDPoly4DEval
+    Following should generate error message invalid type
+<DATE><TIME>|<HOST>|E|psDPolynomial4DEval (FILE:LINENO)
+    Unknown polynomial type 0x63 found.  Evaluation failed.
+
+---> TESTPOINT PASSED (psPolynomialXDEval{psDPolynomial4DEval} | tst_psFunc11.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psFunc11.c                                             *
+*            TestPoint: psPolynomialXDEval{psPolynomial4DEvalVector}               *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|I|testPoly4DEvalVector
+    Following should generate an error message for NULL polynomial
+<DATE><TIME>|<HOST>|E|psPolynomial4DEvalVector (FILE:LINENO)
+    Unallowable operation: polynomial myPoly or its coeffs is NULL.
+<DATE><TIME>|<HOST>|I|testPoly4DEvalVector
+    Following should generate an error message for NULL input vector
+<DATE><TIME>|<HOST>|E|psPolynomial4DEvalVector (FILE:LINENO)
+    Unallowable operation: psVector w or its data is NULL.
+<DATE><TIME>|<HOST>|I|testPoly4DEvalVector
+    Following should generate an error message for NULL input vector
+<DATE><TIME>|<HOST>|E|psPolynomial4DEvalVector (FILE:LINENO)
+    Unallowable operation: psVector x or its data is NULL.
+<DATE><TIME>|<HOST>|I|testPoly4DEvalVector
+    Following should generate an error message for NULL input vector
+<DATE><TIME>|<HOST>|E|psPolynomial4DEvalVector (FILE:LINENO)
+    Unallowable operation: psVector y or its data is NULL.
+<DATE><TIME>|<HOST>|I|testPoly4DEvalVector
+    Following should generate an error message for NULL input vector
+<DATE><TIME>|<HOST>|E|psPolynomial4DEvalVector (FILE:LINENO)
+    Unallowable operation: psVector z or its data is NULL.
+<DATE><TIME>|<HOST>|I|testPoly4DEvalVector
+    Following should generate an error message for invalid input type
+<DATE><TIME>|<HOST>|E|psPolynomial4DEvalVector (FILE:LINENO)
+    Unallowable operation: psVector x has incorrect type.
+<DATE><TIME>|<HOST>|I|testPoly4DEvalVector
+    Following should generate an error message for invalid input type
+<DATE><TIME>|<HOST>|E|psPolynomial4DEvalVector (FILE:LINENO)
+    Unallowable operation: psVector y has incorrect type.
+<DATE><TIME>|<HOST>|I|testPoly4DEvalVector
+    Following should generate an error message for invalid input type
+<DATE><TIME>|<HOST>|E|psPolynomial4DEvalVector (FILE:LINENO)
+    Unallowable operation: psVector z has incorrect type.
+<DATE><TIME>|<HOST>|I|testPoly4DEvalVector
+    Following should generate an error message for invalid input type
+<DATE><TIME>|<HOST>|E|psPolynomial4DEvalVector (FILE:LINENO)
+    Unallowable operation: psVector w has incorrect type.
+
+---> TESTPOINT PASSED (psPolynomialXDEval{psPolynomial4DEvalVector} | tst_psFunc11.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psFunc11.c                                             *
+*            TestPoint: psPolynomialXDEval{psDPolynomial4DEvalVector}              *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|I|testDPoly4DEvalVector
+    Following should generate an error message for NULL polynomial
+<DATE><TIME>|<HOST>|E|psDPolynomial4DEvalVector (FILE:LINENO)
+    Unallowable operation: polynomial myPoly or its coeffs is NULL.
+<DATE><TIME>|<HOST>|I|testDPoly4DEvalVector
+    Following should generate an error message for NULL input vector
+<DATE><TIME>|<HOST>|E|psDPolynomial4DEvalVector (FILE:LINENO)
+    Unallowable operation: psVector w or its data is NULL.
+<DATE><TIME>|<HOST>|I|testDPoly4DEvalVector
+    Following should generate an error message for NULL input vector
+<DATE><TIME>|<HOST>|E|psDPolynomial4DEvalVector (FILE:LINENO)
+    Unallowable operation: psVector x or its data is NULL.
+<DATE><TIME>|<HOST>|I|testDPoly4DEvalVector
+    Following should generate an error message for NULL input vector
+<DATE><TIME>|<HOST>|E|psDPolynomial4DEvalVector (FILE:LINENO)
+    Unallowable operation: psVector y or its data is NULL.
+<DATE><TIME>|<HOST>|I|testDPoly4DEvalVector
+    Following should generate an error message for NULL input vector
+<DATE><TIME>|<HOST>|E|psDPolynomial4DEvalVector (FILE:LINENO)
+    Unallowable operation: psVector z or its data is NULL.
+<DATE><TIME>|<HOST>|I|testDPoly4DEvalVector
+    Following should generate an error message for invalid input type
+<DATE><TIME>|<HOST>|E|psDPolynomial4DEvalVector (FILE:LINENO)
+    Unallowable operation: psVector x has incorrect type.
+<DATE><TIME>|<HOST>|I|testDPoly4DEvalVector
+    Following should generate an error message for invalid input type
+<DATE><TIME>|<HOST>|E|psDPolynomial4DEvalVector (FILE:LINENO)
+    Unallowable operation: psVector y has incorrect type.
+<DATE><TIME>|<HOST>|I|testDPoly4DEvalVector
+    Following should generate an error message for invalid input type
+<DATE><TIME>|<HOST>|E|psDPolynomial4DEvalVector (FILE:LINENO)
+    Unallowable operation: psVector z has incorrect type.
+<DATE><TIME>|<HOST>|I|testDPoly4DEvalVector
+    Following should generate an error message for invalid input type
+<DATE><TIME>|<HOST>|E|psDPolynomial4DEvalVector (FILE:LINENO)
+    Unallowable operation: psVector w has incorrect type.
+
+---> TESTPOINT PASSED (psPolynomialXDEval{psDPolynomial4DEvalVector} | tst_psFunc11.c)
+
Index: /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psHist00.stderr
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psHist00.stderr	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psHist00.stderr	(revision 22331)
@@ -0,0 +1,4 @@
+<DATE><TIME>|<HOST>|I|main
+    Following should generate an error message.
+<DATE><TIME>|<HOST>|E|psHistogramAlloc (FILE:LINENO)
+    Error: (lower > upper) (30.000000 20.000000)
Index: /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psHist00.stdout
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psHist00.stdout	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psHist00.stdout	(revision 22331)
@@ -0,0 +1,87 @@
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psHist00.c                                             *
+*            TestPoint: psStats functions{Allocate the psHistogram structure.}     *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Bin number 0 bounds: (20.000 - 30.000)
+
+---> TESTPOINT PASSED (psStats functions{Allocate the psHistogram structure.} | tst_psHist00.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psHist00.c                                             *
+*            TestPoint: psStats functions{Allocate the psHistogram structure.}     *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Bin number 0 bounds: (20.000 - 25.000)
+Bin number 1 bounds: (25.000 - 30.000)
+
+---> TESTPOINT PASSED (psStats functions{Allocate the psHistogram structure.} | tst_psHist00.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psHist00.c                                             *
+*            TestPoint: psStats functions{Allocate the psHistogram structure.}     *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Bin number 0 bounds: (20.000 - 21.000)
+Bin number 1 bounds: (21.000 - 22.000)
+Bin number 2 bounds: (22.000 - 23.000)
+Bin number 3 bounds: (23.000 - 24.000)
+Bin number 4 bounds: (24.000 - 25.000)
+Bin number 5 bounds: (25.000 - 26.000)
+Bin number 6 bounds: (26.000 - 27.000)
+Bin number 7 bounds: (27.000 - 28.000)
+Bin number 8 bounds: (28.000 - 29.000)
+Bin number 9 bounds: (29.000 - 30.000)
+
+---> TESTPOINT PASSED (psStats functions{Allocate the psHistogram structure.} | tst_psHist00.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psHist00.c                                             *
+*            TestPoint: psStats functions{Allocate the psHistogram structure.}     *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Bin number 0 bounds: (20.000 - 20.500)
+Bin number 1 bounds: (20.500 - 21.000)
+Bin number 2 bounds: (21.000 - 21.500)
+Bin number 3 bounds: (21.500 - 22.000)
+Bin number 4 bounds: (22.000 - 22.500)
+Bin number 5 bounds: (22.500 - 23.000)
+Bin number 6 bounds: (23.000 - 23.500)
+Bin number 7 bounds: (23.500 - 24.000)
+Bin number 8 bounds: (24.000 - 24.500)
+Bin number 9 bounds: (24.500 - 25.000)
+Bin number 10 bounds: (25.000 - 25.500)
+Bin number 11 bounds: (25.500 - 26.000)
+Bin number 12 bounds: (26.000 - 26.500)
+Bin number 13 bounds: (26.500 - 27.000)
+Bin number 14 bounds: (27.000 - 27.500)
+Bin number 15 bounds: (27.500 - 28.000)
+Bin number 16 bounds: (28.000 - 28.500)
+Bin number 17 bounds: (28.500 - 29.000)
+Bin number 18 bounds: (29.000 - 29.500)
+Bin number 19 bounds: (29.500 - 30.000)
+
+---> TESTPOINT PASSED (psStats functions{Allocate the psHistogram structure.} | tst_psHist00.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psHist00.c                                             *
+*            TestPoint: psStats functions{Allocate the psHistogram structure. (UPPER<LOWER)} *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psStats functions{Allocate the psHistogram structure. (UPPER<LOWER)} | tst_psHist00.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psHist00.c                                             *
+*            TestPoint: psStats functions{Deallocate the psHistogram structure.}   *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psStats functions{Deallocate the psHistogram structure.} | tst_psHist00.c)
+
Index: /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psHist01.stdout
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psHist01.stdout	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psHist01.stdout	(revision 22331)
@@ -0,0 +1,78 @@
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psHist01.c                                             *
+*            TestPoint: psStats functions{Allocate the psHistogram structure.}     *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Bin number 0 bounds: (20.000 - 30.000)
+
+---> TESTPOINT PASSED (psStats functions{Allocate the psHistogram structure.} | tst_psHist01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psHist01.c                                             *
+*            TestPoint: psStats functions{Allocate the psHistogram structure.}     *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Bin number 0 bounds: (20.000 - 25.000)
+Bin number 1 bounds: (25.000 - 30.000)
+
+---> TESTPOINT PASSED (psStats functions{Allocate the psHistogram structure.} | tst_psHist01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psHist01.c                                             *
+*            TestPoint: psStats functions{Allocate the psHistogram structure.}     *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Bin number 0 bounds: (20.000 - 21.000)
+Bin number 1 bounds: (21.000 - 22.000)
+Bin number 2 bounds: (22.000 - 23.000)
+Bin number 3 bounds: (23.000 - 24.000)
+Bin number 4 bounds: (24.000 - 25.000)
+Bin number 5 bounds: (25.000 - 26.000)
+Bin number 6 bounds: (26.000 - 27.000)
+Bin number 7 bounds: (27.000 - 28.000)
+Bin number 8 bounds: (28.000 - 29.000)
+Bin number 9 bounds: (29.000 - 30.000)
+
+---> TESTPOINT PASSED (psStats functions{Allocate the psHistogram structure.} | tst_psHist01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psHist01.c                                             *
+*            TestPoint: psStats functions{Allocate the psHistogram structure.}     *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Bin number 0 bounds: (20.000 - 20.500)
+Bin number 1 bounds: (20.500 - 21.000)
+Bin number 2 bounds: (21.000 - 21.500)
+Bin number 3 bounds: (21.500 - 22.000)
+Bin number 4 bounds: (22.000 - 22.500)
+Bin number 5 bounds: (22.500 - 23.000)
+Bin number 6 bounds: (23.000 - 23.500)
+Bin number 7 bounds: (23.500 - 24.000)
+Bin number 8 bounds: (24.000 - 24.500)
+Bin number 9 bounds: (24.500 - 25.000)
+Bin number 10 bounds: (25.000 - 25.500)
+Bin number 11 bounds: (25.500 - 26.000)
+Bin number 12 bounds: (26.000 - 26.500)
+Bin number 13 bounds: (26.500 - 27.000)
+Bin number 14 bounds: (27.000 - 27.500)
+Bin number 15 bounds: (27.500 - 28.000)
+Bin number 16 bounds: (28.000 - 28.500)
+Bin number 17 bounds: (28.500 - 29.000)
+Bin number 18 bounds: (29.000 - 29.500)
+Bin number 19 bounds: (29.500 - 30.000)
+
+---> TESTPOINT PASSED (psStats functions{Allocate the psHistogram structure.} | tst_psHist01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psHist01.c                                             *
+*            TestPoint: psStats functions{Deallocate the psHistogram structure.}   *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psStats functions{Deallocate the psHistogram structure.} | tst_psHist01.c)
+
Index: /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psHist02.stderr
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psHist02.stderr	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psHist02.stderr	(revision 22331)
@@ -0,0 +1,8 @@
+<DATE><TIME>|<HOST>|I|main
+    Following should generate an error message.
+<DATE><TIME>|<HOST>|E|psVectorHistogram (FILE:LINENO)
+    Unallowable operation: out is NULL.
+<DATE><TIME>|<HOST>|I|main
+    Following should generate an error message.
+<DATE><TIME>|<HOST>|E|psVectorHistogram (FILE:LINENO)
+    Unallowable operation: psVector in or its data is NULL.
Index: /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psHist02.stdout
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psHist02.stdout	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psHist02.stdout	(revision 22331)
@@ -0,0 +1,156 @@
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psHist02.c                                             *
+*            TestPoint: psStats functions{Allocate and Perform Histogram, no mask} *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Bin number 0 bounds: (20.00 - 30.00) data (10000.000000)
+
+---> TESTPOINT PASSED (psStats functions{Allocate and Perform Histogram, no mask} | tst_psHist02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psHist02.c                                             *
+*            TestPoint: psStats functions{Allocate and Perform Histogram with mask} *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Bin number 0 bounds: (20.000 - 30.000) data (5000.000000)
+
+---> TESTPOINT PASSED (psStats functions{Allocate and Perform Histogram with mask} | tst_psHist02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psHist02.c                                             *
+*            TestPoint: psStats functions{Allocate and Perform Histogram, no mask} *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Bin number 0 bounds: (20.00 - 25.00) data (5000.000000)
+Bin number 1 bounds: (25.00 - 30.00) data (5000.000000)
+
+---> TESTPOINT PASSED (psStats functions{Allocate and Perform Histogram, no mask} | tst_psHist02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psHist02.c                                             *
+*            TestPoint: psStats functions{Allocate and Perform Histogram with mask} *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Bin number 0 bounds: (20.000 - 25.000) data (5000.000000)
+Bin number 1 bounds: (25.000 - 30.000) data (0.000000)
+
+---> TESTPOINT PASSED (psStats functions{Allocate and Perform Histogram with mask} | tst_psHist02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psHist02.c                                             *
+*            TestPoint: psStats functions{Allocate and Perform Histogram, no mask} *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Bin number 0 bounds: (20.00 - 21.00) data (1000.000000)
+Bin number 1 bounds: (21.00 - 22.00) data (1000.000000)
+Bin number 2 bounds: (22.00 - 23.00) data (1000.000000)
+Bin number 3 bounds: (23.00 - 24.00) data (1000.000000)
+Bin number 4 bounds: (24.00 - 25.00) data (1000.000000)
+Bin number 5 bounds: (25.00 - 26.00) data (1000.000000)
+Bin number 6 bounds: (26.00 - 27.00) data (1000.000000)
+Bin number 7 bounds: (27.00 - 28.00) data (1000.000000)
+Bin number 8 bounds: (28.00 - 29.00) data (1000.000000)
+Bin number 9 bounds: (29.00 - 30.00) data (1000.000000)
+
+---> TESTPOINT PASSED (psStats functions{Allocate and Perform Histogram, no mask} | tst_psHist02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psHist02.c                                             *
+*            TestPoint: psStats functions{Allocate and Perform Histogram with mask} *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Bin number 0 bounds: (20.000 - 21.000) data (1000.000000)
+Bin number 1 bounds: (21.000 - 22.000) data (1000.000000)
+Bin number 2 bounds: (22.000 - 23.000) data (1000.000000)
+Bin number 3 bounds: (23.000 - 24.000) data (1000.000000)
+Bin number 4 bounds: (24.000 - 25.000) data (1000.000000)
+Bin number 5 bounds: (25.000 - 26.000) data (0.000000)
+Bin number 6 bounds: (26.000 - 27.000) data (0.000000)
+Bin number 7 bounds: (27.000 - 28.000) data (0.000000)
+Bin number 8 bounds: (28.000 - 29.000) data (0.000000)
+Bin number 9 bounds: (29.000 - 30.000) data (0.000000)
+
+---> TESTPOINT PASSED (psStats functions{Allocate and Perform Histogram with mask} | tst_psHist02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psHist02.c                                             *
+*            TestPoint: psStats functions{Allocate and Perform Histogram, no mask} *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Bin number 0 bounds: (20.00 - 20.50) data (500.000000)
+Bin number 1 bounds: (20.50 - 21.00) data (500.000000)
+Bin number 2 bounds: (21.00 - 21.50) data (500.000000)
+Bin number 3 bounds: (21.50 - 22.00) data (500.000000)
+Bin number 4 bounds: (22.00 - 22.50) data (500.000000)
+Bin number 5 bounds: (22.50 - 23.00) data (500.000000)
+Bin number 6 bounds: (23.00 - 23.50) data (500.000000)
+Bin number 7 bounds: (23.50 - 24.00) data (500.000000)
+Bin number 8 bounds: (24.00 - 24.50) data (500.000000)
+Bin number 9 bounds: (24.50 - 25.00) data (500.000000)
+Bin number 10 bounds: (25.00 - 25.50) data (500.000000)
+Bin number 11 bounds: (25.50 - 26.00) data (500.000000)
+Bin number 12 bounds: (26.00 - 26.50) data (500.000000)
+Bin number 13 bounds: (26.50 - 27.00) data (500.000000)
+Bin number 14 bounds: (27.00 - 27.50) data (500.000000)
+Bin number 15 bounds: (27.50 - 28.00) data (500.000000)
+Bin number 16 bounds: (28.00 - 28.50) data (500.000000)
+Bin number 17 bounds: (28.50 - 29.00) data (500.000000)
+Bin number 18 bounds: (29.00 - 29.50) data (500.000000)
+Bin number 19 bounds: (29.50 - 30.00) data (500.000000)
+
+---> TESTPOINT PASSED (psStats functions{Allocate and Perform Histogram, no mask} | tst_psHist02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psHist02.c                                             *
+*            TestPoint: psStats functions{Allocate and Perform Histogram with mask} *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Bin number 0 bounds: (20.000 - 20.500) data (500.000000)
+Bin number 1 bounds: (20.500 - 21.000) data (500.000000)
+Bin number 2 bounds: (21.000 - 21.500) data (500.000000)
+Bin number 3 bounds: (21.500 - 22.000) data (500.000000)
+Bin number 4 bounds: (22.000 - 22.500) data (500.000000)
+Bin number 5 bounds: (22.500 - 23.000) data (500.000000)
+Bin number 6 bounds: (23.000 - 23.500) data (500.000000)
+Bin number 7 bounds: (23.500 - 24.000) data (500.000000)
+Bin number 8 bounds: (24.000 - 24.500) data (500.000000)
+Bin number 9 bounds: (24.500 - 25.000) data (500.000000)
+Bin number 10 bounds: (25.000 - 25.500) data (0.000000)
+Bin number 11 bounds: (25.500 - 26.000) data (0.000000)
+Bin number 12 bounds: (26.000 - 26.500) data (0.000000)
+Bin number 13 bounds: (26.500 - 27.000) data (0.000000)
+Bin number 14 bounds: (27.000 - 27.500) data (0.000000)
+Bin number 15 bounds: (27.500 - 28.000) data (0.000000)
+Bin number 16 bounds: (28.000 - 28.500) data (0.000000)
+Bin number 17 bounds: (28.500 - 29.000) data (0.000000)
+Bin number 18 bounds: (29.000 - 29.500) data (0.000000)
+Bin number 19 bounds: (29.500 - 30.000) data (0.000000)
+
+---> TESTPOINT PASSED (psStats functions{Allocate and Perform Histogram with mask} | tst_psHist02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psHist02.c                                             *
+*            TestPoint: psStats functions{Calling psVectorHistogram() with various NULL inputs.} *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psStats functions{Calling psVectorHistogram() with various NULL inputs.} | tst_psHist02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psHist02.c                                             *
+*            TestPoint: psStats functions{Deallocate the psHistogram structure.}   *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psStats functions{Deallocate the psHistogram structure.} | tst_psHist02.c)
+
Index: /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psMatrix01.stdout
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psMatrix01.stdout	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psMatrix01.stdout	(revision 22331)
@@ -0,0 +1,36 @@
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrix01.c                                           *
+*            TestPoint: psMatrix{Create input and output images}                   *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psMatrix{Create input and output images} | tst_psMatrix01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrix01.c                                           *
+*            TestPoint: psMatrix{Transpose input image into output image}          *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psMatrix{Transpose input image into output image} | tst_psMatrix01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrix01.c                                           *
+*            TestPoint: psMatrix{Transpose input image into auto allocated NULL output image} *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psMatrix{Transpose input image into auto allocated NULL output image} | tst_psMatrix01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrix01.c                                           *
+*            TestPoint: psMatrix{Free images and check for leaks}                  *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psMatrix{Free images and check for leaks} | tst_psMatrix01.c)
+
Index: /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psMatrix02.stderr
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psMatrix02.stderr	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psMatrix02.stderr	(revision 22331)
@@ -0,0 +1,6 @@
+<DATE><TIME>|<HOST>|E|psMatrixTranspose (FILE:LINENO)
+    Invalid operation: Pointer to inImage is same as outImage.
+<DATE><TIME>|<HOST>|E|psMatrixTranspose (FILE:LINENO)
+    Unallowable operation: psImage inImage or its data is NULL.
+<DATE><TIME>|<HOST>|E|psMatrixTranspose (FILE:LINENO)
+    Invalid operation. inImage not PS_TYPE_F64.
Index: /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psMatrix02.stdout
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psMatrix02.stdout	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psMatrix02.stdout	(revision 22331)
@@ -0,0 +1,45 @@
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrix02.c                                           *
+*            TestPoint: psMatrix{Input pointer same as output pointer}             *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psMatrix{Input pointer same as output pointer} | tst_psMatrix02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrix02.c                                           *
+*            TestPoint: psMatrix{Null input psImage}                               *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psMatrix{Null input psImage} | tst_psMatrix02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrix02.c                                           *
+*            TestPoint: psMatrix{Incorrect type for input pointer}                 *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psMatrix{Incorrect type for input pointer} | tst_psMatrix02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrix02.c                                           *
+*            TestPoint: psMatrix{Incorrect type for output pointer}                *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psMatrix{Incorrect type for output pointer} | tst_psMatrix02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrix02.c                                           *
+*            TestPoint: psMatrix{Matrix not square for output pointer}             *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psMatrix{Matrix not square for output pointer} | tst_psMatrix02.c)
+
Index: /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psMatrix03.stderr
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psMatrix03.stderr	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psMatrix03.stderr	(revision 22331)
@@ -0,0 +1,6 @@
+<DATE><TIME>|<HOST>|E|psMatrixLUD (FILE:LINENO)
+    Unallowable operation: psImage inImage or its data is NULL.
+<DATE><TIME>|<HOST>|E|psMatrixLUSolve (FILE:LINENO)
+    Unallowable operation: psVector inVector or its data is NULL.
+<DATE><TIME>|<HOST>|E|psMatrixLUSolve (FILE:LINENO)
+    Unallowable operation: psImage inImage or its data is NULL.
Index: /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psMatrix03.stdout
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psMatrix03.stdout	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psMatrix03.stdout	(revision 22331)
@@ -0,0 +1,69 @@
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrix03.c                                           *
+*            TestPoint: psMatrix{Create input and output images and vectors}       *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psMatrix{Create input and output images and vectors} | tst_psMatrix03.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrix03.c                                           *
+*            TestPoint: psMatrix{Calculate LU matrix}                              *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psMatrix{Calculate LU matrix} | tst_psMatrix03.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrix03.c                                           *
+*            TestPoint: psMatrix{Determine solution to matrix equation}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psMatrix{Determine solution to matrix equation} | tst_psMatrix03.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrix03.c                                           *
+*            TestPoint: psMatrix{Free input and output images and vectors}         *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psMatrix{Free input and output images and vectors} | tst_psMatrix03.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrix03.c                                           *
+*            TestPoint: psMatrix{Attempt to use null image input argument}         *
+*             TestType: Negative                                                   *
+*    ExpectedErrorText: Invalid operation: inImage or its data is NULL.            *
+*  ExpectedStatusValue: 0                                                          *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psMatrix{Attempt to use null image input argument} | tst_psMatrix03.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrix03.c                                           *
+*            TestPoint: psMatrix{Attempt to use null input vector argument}        *
+*             TestType: Negative                                                   *
+*    ExpectedErrorText: Invalid operation: inVector or its data is NULL.           *
+*  ExpectedStatusValue: 0                                                          *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psMatrix{Attempt to use null input vector argument} | tst_psMatrix03.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrix03.c                                           *
+*            TestPoint: psMatrix{Attempt to use null LU image argument}            *
+*             TestType: Negative                                                   *
+*    ExpectedErrorText: Invalid operation: inImage or its data is NULL.            *
+*  ExpectedStatusValue: 0                                                          *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psMatrix{Attempt to use null LU image argument} | tst_psMatrix03.c)
+
Index: /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psMatrix04.stderr
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psMatrix04.stderr	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psMatrix04.stderr	(revision 22331)
@@ -0,0 +1,4 @@
+<DATE><TIME>|<HOST>|E|psMatrixInvert (FILE:LINENO)
+    Unallowable operation: psImage inImage or its data is NULL.
+<DATE><TIME>|<HOST>|E|psMatrixInvert (FILE:LINENO)
+    Unallowable operation: det is NULL.
Index: /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psMatrix04.stdout
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psMatrix04.stdout	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psMatrix04.stdout	(revision 22331)
@@ -0,0 +1,58 @@
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrix04.c                                           *
+*            TestPoint: psMatrix{Create input and output images}                   *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psMatrix{Create input and output images} | tst_psMatrix04.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrix04.c                                           *
+*            TestPoint: psMatrix{Invert matrix and calculate determinant}          *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psMatrix{Invert matrix and calculate determinant} | tst_psMatrix04.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrix04.c                                           *
+*            TestPoint: psMatrix{Calculate determinant only}                       *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psMatrix{Calculate determinant only} | tst_psMatrix04.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrix04.c                                           *
+*            TestPoint: psMatrix{Free input and output images}                     *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psMatrix{Free input and output images} | tst_psMatrix04.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrix04.c                                           *
+*            TestPoint: psMatrix{Attempt to use null input image argument}         *
+*             TestType: Negative                                                   *
+*    ExpectedErrorText: Invalid operation: inImage or its data is NULL.            *
+*  ExpectedStatusValue: 0                                                          *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psMatrix{Attempt to use null input image argument} | tst_psMatrix04.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrix04.c                                           *
+*            TestPoint: psMatrix{Attempt to use null input float argument}         *
+*             TestType: Negative                                                   *
+*    ExpectedErrorText: Invalid operation: determinant argument is NULL.           *
+*  ExpectedStatusValue: 0                                                          *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psMatrix{Attempt to use null input float argument} | tst_psMatrix04.c)
+
Index: /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psMatrix05.stdout
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psMatrix05.stdout	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psMatrix05.stdout	(revision 22331)
@@ -0,0 +1,27 @@
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrix05.c                                           *
+*            TestPoint: psMatrix{Create input and output images}                   *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psMatrix{Create input and output images} | tst_psMatrix05.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrix05.c                                           *
+*            TestPoint: psMatrix{Multiply images}                                  *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psMatrix{Multiply images} | tst_psMatrix05.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrix05.c                                           *
+*            TestPoint: psMatrix{Free input and output images}                     *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psMatrix{Free input and output images} | tst_psMatrix05.c)
+
Index: /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psMatrix06.stdout
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psMatrix06.stdout	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psMatrix06.stdout	(revision 22331)
@@ -0,0 +1,27 @@
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrix06.c                                           *
+*            TestPoint: psMatrix{Create input and output images}                   *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psMatrix{Create input and output images} | tst_psMatrix06.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrix06.c                                           *
+*            TestPoint: psMatrix{Calculate Eigenvectors}                           *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psMatrix{Calculate Eigenvectors} | tst_psMatrix06.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrix06.c                                           *
+*            TestPoint: psMatrix{Free input and output images}                     *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psMatrix{Free input and output images} | tst_psMatrix06.c)
+
Index: /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psMatrix07.stderr
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psMatrix07.stderr	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psMatrix07.stderr	(revision 22331)
@@ -0,0 +1,24 @@
+<DATE><TIME>|<HOST>|I|main
+    Following should generate an error.
+<DATE><TIME>|<HOST>|E|psMatrixToVector (FILE:LINENO)
+    Unallowable operation: psImage inImage or its data is NULL.
+<DATE><TIME>|<HOST>|I|main
+    Following should generate an error.
+<DATE><TIME>|<HOST>|E|psMatrixToVector (FILE:LINENO)
+    Unallowable operation: psImage inImage or its data is NULL.
+<DATE><TIME>|<HOST>|I|main
+    Following should generate error message
+<DATE><TIME>|<HOST>|E|psMatrixToVector (FILE:LINENO)
+    Image does not have dim with 1 col or 1 row: (2 x 2).
+<DATE><TIME>|<HOST>|I|main
+    Following should generate error message
+<DATE><TIME>|<HOST>|E|psMatrixToVector (FILE:LINENO)
+    Image does not have dim with 1 col or 1 row: (2 x 2).
+<DATE><TIME>|<HOST>|I|main
+    Following should generate an error message
+<DATE><TIME>|<HOST>|E|psVectorToMatrix (FILE:LINENO)
+    Unallowable operation: psVector inVector or its data is NULL.
+<DATE><TIME>|<HOST>|I|main
+    Following should generate an error message
+<DATE><TIME>|<HOST>|E|psVectorToMatrix (FILE:LINENO)
+    Unallowable operation: psVector inVector or its data is NULL.
Index: /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psMatrix07.stdout
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psMatrix07.stdout	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psMatrix07.stdout	(revision 22331)
@@ -0,0 +1,87 @@
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrix07.c                                           *
+*            TestPoint: psMatrix{Create input and output images and vectors}       *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psMatrix{Create input and output images and vectors} | tst_psMatrix07.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrix07.c                                           *
+*            TestPoint: psMatrix{Convert matrix to PS_DIMEN_VECTOR vector}         *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psMatrix{Convert matrix to PS_DIMEN_VECTOR vector} | tst_psMatrix07.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrix07.c                                           *
+*            TestPoint: psMatrix{Attempt to use null image input argument}         *
+*             TestType: Negative                                                   *
+*    ExpectedErrorText: Invalid operation: inImage or its data is NULL.            *
+*  ExpectedStatusValue: 0                                                          *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psMatrix{Attempt to use null image input argument} | tst_psMatrix07.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrix07.c                                           *
+*            TestPoint: psMatrix{Convert matrix to PS_DIMEN_TRANSV vector}         *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psMatrix{Convert matrix to PS_DIMEN_TRANSV vector} | tst_psMatrix07.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrix07.c                                           *
+*            TestPoint: psMatrix{Improper image size}                              *
+*             TestType: Negative                                                   *
+*    ExpectedErrorText: Image does not have dim with 1 col or 1 row: (2 x 2).      *
+*  ExpectedStatusValue: 0                                                          *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psMatrix{Improper image size} | tst_psMatrix07.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrix07.c                                           *
+*            TestPoint: psMatrix{Convert PS_DIMEN_VECTOR vector to matrix}         *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psMatrix{Convert PS_DIMEN_VECTOR vector to matrix} | tst_psMatrix07.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrix07.c                                           *
+*            TestPoint: psMatrix{Attempt to use null input vector argument}        *
+*             TestType: Negative                                                   *
+*    ExpectedErrorText: Invalid operation: inVector or its data is NULL.           *
+*  ExpectedStatusValue: 0                                                          *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psMatrix{Attempt to use null input vector argument} | tst_psMatrix07.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrix07.c                                           *
+*            TestPoint: psMatrix{Convert PS_DIMEN_TRANSV vector to matrix}         *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psMatrix{Convert PS_DIMEN_TRANSV vector to matrix} | tst_psMatrix07.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrix07.c                                           *
+*            TestPoint: psMatrix{Free input and output images and vectors}         *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psMatrix{Free input and output images and vectors} | tst_psMatrix07.c)
+
Index: /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psMatrixVectorArithmetic01.stdout
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psMatrixVectorArithmetic01.stdout	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psMatrixVectorArithmetic01.stdout	(revision 22331)
@@ -0,0 +1,1156 @@
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic01.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix-matrix psBinaryOp}    *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: +
+Input:
+10 10 
+10 10 
+10 10 
+
+10 10 
+10 10 
+10 10 
+
+Output:
+20 20 
+20 20 
+20 20 
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix-matrix psBinaryOp} | tst_psMatrixVectorArithmetic01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic01.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix-matrix psBinaryOp}    *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: +
+Input:
+10.000000 10.000000 
+10.000000 10.000000 
+10.000000 10.000000 
+
+10.000000 10.000000 
+10.000000 10.000000 
+10.000000 10.000000 
+
+Output:
+20.000000 20.000000 
+20.000000 20.000000 
+20.000000 20.000000 
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix-matrix psBinaryOp} | tst_psMatrixVectorArithmetic01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic01.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix-matrix psBinaryOp}    *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: +
+Input:
+10.000000 10.000000 
+10.000000 10.000000 
+10.000000 10.000000 
+
+10.000000 10.000000 
+10.000000 10.000000 
+10.000000 10.000000 
+
+Output:
+20.000000 20.000000 
+20.000000 20.000000 
+20.000000 20.000000 
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix-matrix psBinaryOp} | tst_psMatrixVectorArithmetic01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic01.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix-matrix psBinaryOp}    *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: +
+Input:
+10.000000+10.000000i 10.000000+10.000000i 
+10.000000+10.000000i 10.000000+10.000000i 
+10.000000+10.000000i 10.000000+10.000000i 
+
+10.000000+10.000000i 10.000000+10.000000i 
+10.000000+10.000000i 10.000000+10.000000i 
+10.000000+10.000000i 10.000000+10.000000i 
+
+Output:
+20.000000+20.000000i 20.000000+20.000000i 
+20.000000+20.000000i 20.000000+20.000000i 
+20.000000+20.000000i 20.000000+20.000000i 
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix-matrix psBinaryOp} | tst_psMatrixVectorArithmetic01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic01.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix-matrix psBinaryOp}    *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: -
+Input:
+20 20 
+20 20 
+20 20 
+
+10 10 
+10 10 
+10 10 
+
+Output:
+10 10 
+10 10 
+10 10 
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix-matrix psBinaryOp} | tst_psMatrixVectorArithmetic01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic01.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix-matrix psBinaryOp}    *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: -
+Input:
+20.000000 20.000000 
+20.000000 20.000000 
+20.000000 20.000000 
+
+10.000000 10.000000 
+10.000000 10.000000 
+10.000000 10.000000 
+
+Output:
+10.000000 10.000000 
+10.000000 10.000000 
+10.000000 10.000000 
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix-matrix psBinaryOp} | tst_psMatrixVectorArithmetic01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic01.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix-matrix psBinaryOp}    *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: -
+Input:
+20.000000 20.000000 
+20.000000 20.000000 
+20.000000 20.000000 
+
+10.000000 10.000000 
+10.000000 10.000000 
+10.000000 10.000000 
+
+Output:
+10.000000 10.000000 
+10.000000 10.000000 
+10.000000 10.000000 
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix-matrix psBinaryOp} | tst_psMatrixVectorArithmetic01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic01.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix-matrix psBinaryOp}    *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: *
+Input:
+20.000000+20.000000i 20.000000+20.000000i 
+20.000000+20.000000i 20.000000+20.000000i 
+20.000000+20.000000i 20.000000+20.000000i 
+
+10.000000+10.000000i 10.000000+10.000000i 
+10.000000+10.000000i 10.000000+10.000000i 
+10.000000+10.000000i 10.000000+10.000000i 
+
+Output:
+0.000000+400.000000i 0.000000+400.000000i 
+0.000000+400.000000i 0.000000+400.000000i 
+0.000000+400.000000i 0.000000+400.000000i 
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix-matrix psBinaryOp} | tst_psMatrixVectorArithmetic01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic01.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix-matrix psBinaryOp}    *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: *
+Input:
+20 20 
+20 20 
+20 20 
+
+10 10 
+10 10 
+10 10 
+
+Output:
+200 200 
+200 200 
+200 200 
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix-matrix psBinaryOp} | tst_psMatrixVectorArithmetic01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic01.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix-matrix psBinaryOp}    *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: *
+Input:
+20.000000 20.000000 
+20.000000 20.000000 
+20.000000 20.000000 
+
+10.000000 10.000000 
+10.000000 10.000000 
+10.000000 10.000000 
+
+Output:
+200.000000 200.000000 
+200.000000 200.000000 
+200.000000 200.000000 
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix-matrix psBinaryOp} | tst_psMatrixVectorArithmetic01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic01.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix-matrix psBinaryOp}    *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: *
+Input:
+20.000000 20.000000 
+20.000000 20.000000 
+20.000000 20.000000 
+
+10.000000 10.000000 
+10.000000 10.000000 
+10.000000 10.000000 
+
+Output:
+200.000000 200.000000 
+200.000000 200.000000 
+200.000000 200.000000 
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix-matrix psBinaryOp} | tst_psMatrixVectorArithmetic01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic01.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix-matrix psBinaryOp}    *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: *
+Input:
+20.000000+20.000000i 20.000000+20.000000i 
+20.000000+20.000000i 20.000000+20.000000i 
+20.000000+20.000000i 20.000000+20.000000i 
+
+10.000000+10.000000i 10.000000+10.000000i 
+10.000000+10.000000i 10.000000+10.000000i 
+10.000000+10.000000i 10.000000+10.000000i 
+
+Output:
+0.000000+400.000000i 0.000000+400.000000i 
+0.000000+400.000000i 0.000000+400.000000i 
+0.000000+400.000000i 0.000000+400.000000i 
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix-matrix psBinaryOp} | tst_psMatrixVectorArithmetic01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic01.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix-matrix psBinaryOp}    *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: /
+Input:
+20.000000+20.000000i 20.000000+20.000000i 
+20.000000+20.000000i 20.000000+20.000000i 
+20.000000+20.000000i 20.000000+20.000000i 
+
+10.000000+10.000000i 10.000000+10.000000i 
+10.000000+10.000000i 10.000000+10.000000i 
+10.000000+10.000000i 10.000000+10.000000i 
+
+Output:
+2.000000+0.000000i 2.000000+0.000000i 
+2.000000+0.000000i 2.000000+0.000000i 
+2.000000+0.000000i 2.000000+0.000000i 
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix-matrix psBinaryOp} | tst_psMatrixVectorArithmetic01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic01.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix-matrix psBinaryOp}    *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: /
+Input:
+20 20 
+20 20 
+20 20 
+
+10 10 
+10 10 
+10 10 
+
+Output:
+2 2 
+2 2 
+2 2 
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix-matrix psBinaryOp} | tst_psMatrixVectorArithmetic01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic01.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix-matrix psBinaryOp}    *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: /
+Input:
+20.000000 20.000000 
+20.000000 20.000000 
+20.000000 20.000000 
+
+10.000000 10.000000 
+10.000000 10.000000 
+10.000000 10.000000 
+
+Output:
+2.000000 2.000000 
+2.000000 2.000000 
+2.000000 2.000000 
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix-matrix psBinaryOp} | tst_psMatrixVectorArithmetic01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic01.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix-matrix psBinaryOp}    *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: /
+Input:
+20.000000 20.000000 
+20.000000 20.000000 
+20.000000 20.000000 
+
+10.000000 10.000000 
+10.000000 10.000000 
+10.000000 10.000000 
+
+Output:
+2.000000 2.000000 
+2.000000 2.000000 
+2.000000 2.000000 
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix-matrix psBinaryOp} | tst_psMatrixVectorArithmetic01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic01.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix-matrix psBinaryOp}    *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: /
+Input:
+20.000000+20.000000i 20.000000+20.000000i 
+20.000000+20.000000i 20.000000+20.000000i 
+20.000000+20.000000i 20.000000+20.000000i 
+
+10.000000+10.000000i 10.000000+10.000000i 
+10.000000+10.000000i 10.000000+10.000000i 
+10.000000+10.000000i 10.000000+10.000000i 
+
+Output:
+2.000000+0.000000i 2.000000+0.000000i 
+2.000000+0.000000i 2.000000+0.000000i 
+2.000000+0.000000i 2.000000+0.000000i 
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix-matrix psBinaryOp} | tst_psMatrixVectorArithmetic01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic01.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix-vector psBinaryOp}    *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: +
+Input:
+10 10 
+10 10 
+10 10 
+
+5 5 5 
+
+Output:
+15 15 
+15 15 
+15 15 
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix-vector psBinaryOp} | tst_psMatrixVectorArithmetic01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic01.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix-vector psBinaryOp}    *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: +
+Input:
+10.000000 10.000000 
+10.000000 10.000000 
+10.000000 10.000000 
+
+5.000000 5.000000 5.000000 
+
+Output:
+15.000000 15.000000 
+15.000000 15.000000 
+15.000000 15.000000 
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix-vector psBinaryOp} | tst_psMatrixVectorArithmetic01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic01.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix-vector psBinaryOp}    *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: +
+Input:
+10.000000 10.000000 
+10.000000 10.000000 
+10.000000 10.000000 
+
+5.000000 5.000000 5.000000 
+
+Output:
+15.000000 15.000000 
+15.000000 15.000000 
+15.000000 15.000000 
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix-vector psBinaryOp} | tst_psMatrixVectorArithmetic01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic01.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix-vector psBinaryOp}    *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: +
+Input:
+10.000000+10.000000i 10.000000+10.000000i 
+10.000000+10.000000i 10.000000+10.000000i 
+10.000000+10.000000i 10.000000+10.000000i 
+
+5.000000+5.000000i 5.000000+5.000000i 5.000000+5.000000i 
+
+Output:
+15.000000+15.000000i 15.000000+15.000000i 
+15.000000+15.000000i 15.000000+15.000000i 
+15.000000+15.000000i 15.000000+15.000000i 
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix-vector psBinaryOp} | tst_psMatrixVectorArithmetic01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic01.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix-vector psBinaryOp}    *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: -
+Input:
+20 20 
+20 20 
+20 20 
+
+5 5 5 
+
+Output:
+15 15 
+15 15 
+15 15 
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix-vector psBinaryOp} | tst_psMatrixVectorArithmetic01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic01.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix-vector psBinaryOp}    *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: -
+Input:
+20.000000 20.000000 
+20.000000 20.000000 
+20.000000 20.000000 
+
+5.000000 5.000000 5.000000 
+
+Output:
+15.000000 15.000000 
+15.000000 15.000000 
+15.000000 15.000000 
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix-vector psBinaryOp} | tst_psMatrixVectorArithmetic01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic01.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix-vector psBinaryOp}    *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: -
+Input:
+20.000000 20.000000 
+20.000000 20.000000 
+20.000000 20.000000 
+
+5.000000 5.000000 5.000000 
+
+Output:
+15.000000 15.000000 
+15.000000 15.000000 
+15.000000 15.000000 
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix-vector psBinaryOp} | tst_psMatrixVectorArithmetic01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic01.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix-vector psBinaryOp}    *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: *
+Input:
+20.000000+20.000000i 20.000000+20.000000i 
+20.000000+20.000000i 20.000000+20.000000i 
+20.000000+20.000000i 20.000000+20.000000i 
+
+5.000000+5.000000i 5.000000+5.000000i 5.000000+5.000000i 
+
+Output:
+0.000000+200.000000i 0.000000+200.000000i 
+0.000000+200.000000i 0.000000+200.000000i 
+0.000000+200.000000i 0.000000+200.000000i 
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix-vector psBinaryOp} | tst_psMatrixVectorArithmetic01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic01.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix-vector psBinaryOp}    *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: *
+Input:
+20 20 
+20 20 
+20 20 
+
+5 5 5 
+
+Output:
+100 100 
+100 100 
+100 100 
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix-vector psBinaryOp} | tst_psMatrixVectorArithmetic01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic01.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix-vector psBinaryOp}    *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: *
+Input:
+20.000000 20.000000 
+20.000000 20.000000 
+20.000000 20.000000 
+
+5.000000 5.000000 5.000000 
+
+Output:
+100.000000 100.000000 
+100.000000 100.000000 
+100.000000 100.000000 
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix-vector psBinaryOp} | tst_psMatrixVectorArithmetic01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic01.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix-vector psBinaryOp}    *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: *
+Input:
+20.000000 20.000000 
+20.000000 20.000000 
+20.000000 20.000000 
+
+5.000000 5.000000 5.000000 
+
+Output:
+100.000000 100.000000 
+100.000000 100.000000 
+100.000000 100.000000 
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix-vector psBinaryOp} | tst_psMatrixVectorArithmetic01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic01.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix-vector psBinaryOp}    *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: *
+Input:
+20.000000+20.000000i 20.000000+20.000000i 
+20.000000+20.000000i 20.000000+20.000000i 
+20.000000+20.000000i 20.000000+20.000000i 
+
+5.000000+5.000000i 5.000000+5.000000i 5.000000+5.000000i 
+
+Output:
+0.000000+200.000000i 0.000000+200.000000i 
+0.000000+200.000000i 0.000000+200.000000i 
+0.000000+200.000000i 0.000000+200.000000i 
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix-vector psBinaryOp} | tst_psMatrixVectorArithmetic01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic01.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix-vector psBinaryOp}    *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: /
+Input:
+20.000000+20.000000i 20.000000+20.000000i 
+20.000000+20.000000i 20.000000+20.000000i 
+20.000000+20.000000i 20.000000+20.000000i 
+
+5.000000+5.000000i 5.000000+5.000000i 5.000000+5.000000i 
+
+Output:
+4.000000+0.000000i 4.000000+0.000000i 
+4.000000+0.000000i 4.000000+0.000000i 
+4.000000+0.000000i 4.000000+0.000000i 
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix-vector psBinaryOp} | tst_psMatrixVectorArithmetic01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic01.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix-vector psBinaryOp}    *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: /
+Input:
+20 20 
+20 20 
+20 20 
+
+5 5 5 
+
+Output:
+4 4 
+4 4 
+4 4 
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix-vector psBinaryOp} | tst_psMatrixVectorArithmetic01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic01.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix-vector psBinaryOp}    *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: /
+Input:
+20.000000 20.000000 
+20.000000 20.000000 
+20.000000 20.000000 
+
+5.000000 5.000000 5.000000 
+
+Output:
+4.000000 4.000000 
+4.000000 4.000000 
+4.000000 4.000000 
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix-vector psBinaryOp} | tst_psMatrixVectorArithmetic01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic01.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix-vector psBinaryOp}    *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: /
+Input:
+20.000000 20.000000 
+20.000000 20.000000 
+20.000000 20.000000 
+
+5.000000 5.000000 5.000000 
+
+Output:
+4.000000 4.000000 
+4.000000 4.000000 
+4.000000 4.000000 
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix-vector psBinaryOp} | tst_psMatrixVectorArithmetic01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic01.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix-vector psBinaryOp}    *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: /
+Input:
+20.000000+20.000000i 20.000000+20.000000i 
+20.000000+20.000000i 20.000000+20.000000i 
+20.000000+20.000000i 20.000000+20.000000i 
+
+5.000000+5.000000i 5.000000+5.000000i 5.000000+5.000000i 
+
+Output:
+4.000000+0.000000i 4.000000+0.000000i 
+4.000000+0.000000i 4.000000+0.000000i 
+4.000000+0.000000i 4.000000+0.000000i 
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix-vector psBinaryOp} | tst_psMatrixVectorArithmetic01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic01.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix-scalar psBinaryOp}    *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: +
+Input:
+10 10 
+10 10 
+10 10 
+
+5 
+
+Output:
+15 15 
+15 15 
+15 15 
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix-scalar psBinaryOp} | tst_psMatrixVectorArithmetic01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic01.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix-scalar psBinaryOp}    *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: +
+Input:
+10.000000 10.000000 
+10.000000 10.000000 
+10.000000 10.000000 
+
+5.000000 
+
+Output:
+15.000000 15.000000 
+15.000000 15.000000 
+15.000000 15.000000 
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix-scalar psBinaryOp} | tst_psMatrixVectorArithmetic01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic01.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix-scalar psBinaryOp}    *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: +
+Input:
+10.000000 10.000000 
+10.000000 10.000000 
+10.000000 10.000000 
+
+5.000000 
+
+Output:
+15.000000 15.000000 
+15.000000 15.000000 
+15.000000 15.000000 
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix-scalar psBinaryOp} | tst_psMatrixVectorArithmetic01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic01.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix-scalar psBinaryOp}    *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: +
+Input:
+10.000000+10.000000i 10.000000+10.000000i 
+10.000000+10.000000i 10.000000+10.000000i 
+10.000000+10.000000i 10.000000+10.000000i 
+
+5.000000+5.000000i 
+
+Output:
+15.000000+15.000000i 15.000000+15.000000i 
+15.000000+15.000000i 15.000000+15.000000i 
+15.000000+15.000000i 15.000000+15.000000i 
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix-scalar psBinaryOp} | tst_psMatrixVectorArithmetic01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic01.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix-scalar psBinaryOp}    *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: -
+Input:
+20 20 
+20 20 
+20 20 
+
+5 
+
+Output:
+15 15 
+15 15 
+15 15 
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix-scalar psBinaryOp} | tst_psMatrixVectorArithmetic01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic01.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix-scalar psBinaryOp}    *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: -
+Input:
+20.000000 20.000000 
+20.000000 20.000000 
+20.000000 20.000000 
+
+5.000000 
+
+Output:
+15.000000 15.000000 
+15.000000 15.000000 
+15.000000 15.000000 
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix-scalar psBinaryOp} | tst_psMatrixVectorArithmetic01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic01.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix-scalar psBinaryOp}    *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: -
+Input:
+20.000000 20.000000 
+20.000000 20.000000 
+20.000000 20.000000 
+
+5.000000 
+
+Output:
+15.000000 15.000000 
+15.000000 15.000000 
+15.000000 15.000000 
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix-scalar psBinaryOp} | tst_psMatrixVectorArithmetic01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic01.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix-scalar psBinaryOp}    *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: *
+Input:
+20.000000+20.000000i 20.000000+20.000000i 
+20.000000+20.000000i 20.000000+20.000000i 
+20.000000+20.000000i 20.000000+20.000000i 
+
+5.000000+5.000000i 
+
+Output:
+0.000000+200.000000i 0.000000+200.000000i 
+0.000000+200.000000i 0.000000+200.000000i 
+0.000000+200.000000i 0.000000+200.000000i 
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix-scalar psBinaryOp} | tst_psMatrixVectorArithmetic01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic01.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix-scalar psBinaryOp}    *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: *
+Input:
+20 20 
+20 20 
+20 20 
+
+5 
+
+Output:
+100 100 
+100 100 
+100 100 
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix-scalar psBinaryOp} | tst_psMatrixVectorArithmetic01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic01.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix-scalar psBinaryOp}    *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: *
+Input:
+20.000000 20.000000 
+20.000000 20.000000 
+20.000000 20.000000 
+
+5.000000 
+
+Output:
+100.000000 100.000000 
+100.000000 100.000000 
+100.000000 100.000000 
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix-scalar psBinaryOp} | tst_psMatrixVectorArithmetic01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic01.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix-scalar psBinaryOp}    *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: *
+Input:
+20.000000 20.000000 
+20.000000 20.000000 
+20.000000 20.000000 
+
+5.000000 
+
+Output:
+100.000000 100.000000 
+100.000000 100.000000 
+100.000000 100.000000 
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix-scalar psBinaryOp} | tst_psMatrixVectorArithmetic01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic01.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix-scalar psBinaryOp}    *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: *
+Input:
+20.000000+20.000000i 20.000000+20.000000i 
+20.000000+20.000000i 20.000000+20.000000i 
+20.000000+20.000000i 20.000000+20.000000i 
+
+5.000000+5.000000i 
+
+Output:
+0.000000+200.000000i 0.000000+200.000000i 
+0.000000+200.000000i 0.000000+200.000000i 
+0.000000+200.000000i 0.000000+200.000000i 
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix-scalar psBinaryOp} | tst_psMatrixVectorArithmetic01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic01.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix-scalar psBinaryOp}    *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: /
+Input:
+20.000000+20.000000i 20.000000+20.000000i 
+20.000000+20.000000i 20.000000+20.000000i 
+20.000000+20.000000i 20.000000+20.000000i 
+
+5.000000+5.000000i 
+
+Output:
+4.000000+0.000000i 4.000000+0.000000i 
+4.000000+0.000000i 4.000000+0.000000i 
+4.000000+0.000000i 4.000000+0.000000i 
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix-scalar psBinaryOp} | tst_psMatrixVectorArithmetic01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic01.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix-scalar psBinaryOp}    *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: /
+Input:
+20 20 
+20 20 
+20 20 
+
+5 
+
+Output:
+4 4 
+4 4 
+4 4 
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix-scalar psBinaryOp} | tst_psMatrixVectorArithmetic01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic01.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix-scalar psBinaryOp}    *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: /
+Input:
+20.000000 20.000000 
+20.000000 20.000000 
+20.000000 20.000000 
+
+5.000000 
+
+Output:
+4.000000 4.000000 
+4.000000 4.000000 
+4.000000 4.000000 
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix-scalar psBinaryOp} | tst_psMatrixVectorArithmetic01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic01.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix-scalar psBinaryOp}    *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: /
+Input:
+20.000000 20.000000 
+20.000000 20.000000 
+20.000000 20.000000 
+
+5.000000 
+
+Output:
+4.000000 4.000000 
+4.000000 4.000000 
+4.000000 4.000000 
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix-scalar psBinaryOp} | tst_psMatrixVectorArithmetic01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic01.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix-scalar psBinaryOp}    *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: /
+Input:
+20.000000+20.000000i 20.000000+20.000000i 
+20.000000+20.000000i 20.000000+20.000000i 
+20.000000+20.000000i 20.000000+20.000000i 
+
+5.000000+5.000000i 
+
+Output:
+4.000000+0.000000i 4.000000+0.000000i 
+4.000000+0.000000i 4.000000+0.000000i 
+4.000000+0.000000i 4.000000+0.000000i 
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix-scalar psBinaryOp} | tst_psMatrixVectorArithmetic01.c)
+
Index: /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psMatrixVectorArithmetic02.stdout
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psMatrixVectorArithmetic02.stdout	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psMatrixVectorArithmetic02.stdout	(revision 22331)
@@ -0,0 +1,1700 @@
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: abs
+
+
+
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: abs
+
+
+
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: abs
+
+
+
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: abs
+
+
+
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: exp
+
+
+
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: exp
+
+
+
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: exp
+
+
+
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: exp
+
+
+
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: ln
+
+
+
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: ln
+
+
+
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: ln
+
+
+
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: ln
+
+
+
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: ten
+
+
+
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: ten
+
+
+
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: ten
+
+
+
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: ten
+
+
+
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: log
+
+
+
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: log
+
+
+
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: log
+
+
+
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: log
+
+
+
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: sin
+
+
+
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: sin
+
+
+
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: sin
+
+
+
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: sin
+
+
+
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: dsin
+
+
+
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: dsin
+
+
+
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: dsin
+
+
+
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: dsin
+
+
+
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: cos
+
+
+
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: cos
+
+
+
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: cos
+
+
+
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: cos
+
+
+
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: dcos
+
+
+
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: dcos
+
+
+
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: dcos
+
+
+
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: dcos
+
+
+
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: tan
+
+
+
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: tan
+
+
+
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: tan
+
+
+
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: tan
+
+
+
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: dtan
+
+
+
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: dtan
+
+
+
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: dtan
+
+
+
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: dtan
+
+
+
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: asin
+
+
+
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: asin
+
+
+
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: asin
+
+
+
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: asin
+
+
+
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: dasin
+
+
+
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: dasin
+
+
+
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: dasin
+
+
+
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: dasin
+
+
+
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: acos
+
+
+
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: acos
+
+
+
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: acos
+
+
+
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: acos
+
+
+
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: dacos
+
+
+
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: dacos
+
+
+
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: dacos
+
+
+
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: dacos
+
+
+
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: atan
+
+
+
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: atan
+
+
+
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: atan
+
+
+
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: atan
+
+
+
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: datan
+
+
+
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: datan
+
+
+
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: datan
+
+
+
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test matrix psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: datan
+
+
+
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test matrix psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test vector psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: abs
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test vector psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test vector psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: abs
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test vector psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test vector psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: abs
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test vector psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test vector psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: abs
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test vector psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test vector psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: exp
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test vector psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test vector psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: exp
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test vector psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test vector psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: exp
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test vector psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test vector psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: exp
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test vector psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test vector psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: ln
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test vector psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test vector psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: ln
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test vector psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test vector psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: ln
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test vector psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test vector psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: ln
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test vector psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test vector psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: ten
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test vector psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test vector psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: ten
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test vector psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test vector psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: ten
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test vector psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test vector psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: ten
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test vector psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test vector psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: log
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test vector psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test vector psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: log
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test vector psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test vector psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: log
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test vector psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test vector psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: log
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test vector psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test vector psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: sin
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test vector psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test vector psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: sin
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test vector psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test vector psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: sin
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test vector psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test vector psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: sin
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test vector psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test vector psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: dsin
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test vector psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test vector psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: dsin
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test vector psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test vector psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: dsin
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test vector psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test vector psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: dsin
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test vector psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test vector psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: cos
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test vector psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test vector psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: cos
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test vector psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test vector psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: cos
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test vector psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test vector psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: cos
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test vector psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test vector psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: dcos
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test vector psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test vector psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: dcos
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test vector psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test vector psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: dcos
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test vector psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test vector psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: dcos
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test vector psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test vector psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: tan
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test vector psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test vector psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: tan
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test vector psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test vector psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: tan
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test vector psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test vector psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: tan
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test vector psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test vector psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: dtan
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test vector psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test vector psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: dtan
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test vector psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test vector psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: dtan
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test vector psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test vector psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: dtan
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test vector psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test vector psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: asin
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test vector psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test vector psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: asin
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test vector psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test vector psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: asin
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test vector psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test vector psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: asin
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test vector psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test vector psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: dasin
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test vector psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test vector psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: dasin
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test vector psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test vector psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: dasin
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test vector psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test vector psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: dasin
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test vector psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test vector psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: acos
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test vector psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test vector psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: acos
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test vector psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test vector psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: acos
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test vector psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test vector psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: acos
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test vector psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test vector psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: dacos
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test vector psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test vector psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: dacos
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test vector psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test vector psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: dacos
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test vector psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test vector psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: dacos
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test vector psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test vector psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: atan
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test vector psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test vector psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: atan
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test vector psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test vector psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: atan
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test vector psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test vector psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: atan
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test vector psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test vector psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: datan
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test vector psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test vector psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: datan
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test vector psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test vector psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: datan
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test vector psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic02.c                           *
+*            TestPoint: psMatrixVectorArithmetic{Test vector psUnaryOp}            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Operation: datan
+
+
+---> TESTPOINT PASSED (psMatrixVectorArithmetic{Test vector psUnaryOp} | tst_psMatrixVectorArithmetic02.c)
+
Index: /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psMatrixVectorArithmetic03.stderr
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psMatrixVectorArithmetic03.stderr	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psMatrixVectorArithmetic03.stderr	(revision 22331)
@@ -0,0 +1,66 @@
+<DATE><TIME>|<HOST>|I|main
+    Following should generate an error message
+<DATE><TIME>|<HOST>|E|psBinaryOp (FILE:LINENO)
+    Unallowable operation: input1 is NULL.
+<DATE><TIME>|<HOST>|I|main
+    Following should generate an error message
+<DATE><TIME>|<HOST>|E|psBinaryOp (FILE:LINENO)
+    Unallowable operation: input2 is NULL.
+<DATE><TIME>|<HOST>|I|main
+    Following should generate an error message
+<DATE><TIME>|<HOST>|E|psBinaryOp (FILE:LINENO)
+    Unallowable operation: op is NULL.
+<DATE><TIME>|<HOST>|I|main
+    Following should generate an error message
+<DATE><TIME>|<HOST>|E|psUnaryOp (FILE:LINENO)
+    Unallowable operation: in is NULL.
+<DATE><TIME>|<HOST>|I|main
+    Following should generate an error message
+<DATE><TIME>|<HOST>|E|psUnaryOp (FILE:LINENO)
+    Unallowable operation: op is NULL.
+<DATE><TIME>|<HOST>|I|main
+    Following should generate an error message
+<DATE><TIME>|<HOST>|E|psBinaryOp (FILE:LINENO)
+    ptr input1 has type 1028, ptr input2 has type 1032.
+<DATE><TIME>|<HOST>|I|main
+    Following should generate an error message
+<DATE><TIME>|<HOST>|E|psBinaryOp (FILE:LINENO)
+    Specified psImage dimensions differed, 2x2 vs 3x3.
+<DATE><TIME>|<HOST>|I|main
+    Following should generate an error message
+<DATE><TIME>|<HOST>|E|psBinaryOp (FILE:LINENO)
+    Number of elements inconsistent, 2 vs 3.  Number of elements must match.
+<DATE><TIME>|<HOST>|I|main
+    Following should generate an error message
+<DATE><TIME>|<HOST>|E|psBinaryOp (FILE:LINENO)
+    Number of elements inconsistent, 2 vs 3.  Number of elements must match.
+<DATE><TIME>|<HOST>|I|main
+    Following should generate an two error messages
+<DATE><TIME>|<HOST>|E|psVectorRecycle (FILE:LINENO)
+    The input psVector must have a vector dimension type.
+<DATE><TIME>|<HOST>|E|psUnaryOp (FILE:LINENO)
+    Couldn't create a proper output psVector.
+<DATE><TIME>|<HOST>|I|main
+    Following should generate error message
+<DATE><TIME>|<HOST>|E|psBinaryOp (FILE:LINENO)
+    The minimum operation is not supported with complex data.
+<DATE><TIME>|<HOST>|I|main
+    Following should generate an error message
+<DATE><TIME>|<HOST>|E|psBinaryOp (FILE:LINENO)
+    The maximum operation is not supported with complex data.
+<DATE><TIME>|<HOST>|I|main
+    Following should generate an error messgae
+<DATE><TIME>|<HOST>|E|psBinaryOp (FILE:LINENO)
+    Specified operation, yarg, is not supported.
+<DATE><TIME>|<HOST>|I|main
+    Following should generate an error message
+<DATE><TIME>|<HOST>|E|psUnaryOp (FILE:LINENO)
+    Specified operation, yarg, is not supported.
+<DATE><TIME>|<HOST>|I|main
+    Following should generate an error message
+<DATE><TIME>|<HOST>|E|psBinaryOp (FILE:LINENO)
+    Unallowable operation: input1 has incorrect dimensionality.
+<DATE><TIME>|<HOST>|I|main
+    Following should generate an error message
+<DATE><TIME>|<HOST>|E|psUnaryOp (FILE:LINENO)
+    Specified parameter, in, has invalid dimensionality, 4.
Index: /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psMatrixVectorArithmetic03.stdout
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psMatrixVectorArithmetic03.stdout	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psMatrixVectorArithmetic03.stdout	(revision 22331)
@@ -0,0 +1,180 @@
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic03.c                           *
+*            TestPoint: psBinaryOp{Check for output generated}                     *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psBinaryOp{Check for output generated} | tst_psMatrixVectorArithmetic03.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic03.c                           *
+*            TestPoint: psBinaryOp{Check for null input arg 1}                     *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psBinaryOp{Check for null input arg 1} | tst_psMatrixVectorArithmetic03.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic03.c                           *
+*            TestPoint: psBinaryOp{Check for null input arg 2}                     *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psBinaryOp{Check for null input arg 2} | tst_psMatrixVectorArithmetic03.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic03.c                           *
+*            TestPoint: psBinaryOp{Check for null operand}                         *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psBinaryOp{Check for null operand} | tst_psMatrixVectorArithmetic03.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic03.c                           *
+*            TestPoint: psUnaryOp{Check for null output}                           *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psUnaryOp{Check for null output} | tst_psMatrixVectorArithmetic03.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic03.c                           *
+*            TestPoint: psUnaryOp{Check for null input}                            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psUnaryOp{Check for null input} | tst_psMatrixVectorArithmetic03.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic03.c                           *
+*            TestPoint: psUnaryOp{Check for null operator}                         *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psUnaryOp{Check for null operator} | tst_psMatrixVectorArithmetic03.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic03.c                           *
+*            TestPoint: psBinaryOp{Inconsistent element types}                     *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psBinaryOp{Inconsistent element types} | tst_psMatrixVectorArithmetic03.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic03.c                           *
+*            TestPoint: psUnaryOp{Check output type conversion}                    *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psUnaryOp{Check output type conversion} | tst_psMatrixVectorArithmetic03.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic03.c                           *
+*            TestPoint: psBinaryOp{Check for inconsistent elements}                *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psBinaryOp{Check for inconsistent elements} | tst_psMatrixVectorArithmetic03.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic03.c                           *
+*            TestPoint: psUnaryOp{Check inconsistent elements in input and output} *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psUnaryOp{Check inconsistent elements in input and output} | tst_psMatrixVectorArithmetic03.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic03.c                           *
+*            TestPoint: psBinaryOp{Check inconsistent size}                        *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psBinaryOp{Check inconsistent size} | tst_psMatrixVectorArithmetic03.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic03.c                           *
+*            TestPoint: psBinaryOp{Check inconsistent size}                        *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psBinaryOp{Check inconsistent size} | tst_psMatrixVectorArithmetic03.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic03.c                           *
+*            TestPoint: psUnaryOp{Check inconsistent dimensionality}               *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psUnaryOp{Check inconsistent dimensionality} | tst_psMatrixVectorArithmetic03.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic03.c                           *
+*            TestPoint: psBinaryOp{Attempt to use min with complex numbers}        *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psBinaryOp{Attempt to use  min with complex numbers} | tst_psMatrixVectorArithmetic03.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic03.c                           *
+*            TestPoint: psBinaryOp{Attempt to use max with complex numbers}        *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psBinaryOp{Attempt to use max with complex numbers} | tst_psMatrixVectorArithmetic03.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic03.c                           *
+*            TestPoint: psBinary{Attempt to use invalid operator}                  *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psBinaryOp{Attempt to use invalid operator} | tst_psMatrixVectorArithmetic03.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic03.c                           *
+*            TestPoint: psUnaryOp{Attempt to use invalid operator}                 *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psUnaryOp{Attempt to use invalid operator} | tst_psMatrixVectorArithmetic03.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic03.c                           *
+*            TestPoint: psBinaryOp{Attempt to use input with PS_DIMEN_OTHER}       *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psBinaryOp{Attempt to use input with PS_DIMEN_OTHER} | tst_psMatrixVectorArithmetic03.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic03.c                           *
+*            TestPoint: psUnaryOp{Attempt to use input with PS_DIMEN_OTHER}        *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psUnaryOp{Attempt to use input with PS_DIMEN_OTHER} | tst_psMatrixVectorArithmetic03.c)
+
Index: /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psMatrixVectorArithmetic04.stderr
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psMatrixVectorArithmetic04.stderr	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psMatrixVectorArithmetic04.stderr	(revision 22331)
@@ -0,0 +1,36 @@
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic04.c                           *
+*            TestPoint: psBinaryOp{psBinaryOp}                                     *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psBinaryOp{psBinaryOp} | tst_psMatrixVectorArithmetic04.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic04.c                           *
+*            TestPoint: psBinaryOp{psBinaryOp}                                     *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psBinaryOp{psBinaryOp} | tst_psMatrixVectorArithmetic04.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic04.c                           *
+*            TestPoint: psBinaryOp{psBinaryOp}                                     *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psBinaryOp{psBinaryOp} | tst_psMatrixVectorArithmetic04.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMatrixVectorArithmetic04.c                           *
+*            TestPoint: psUnaryOp{psUnaryOp}                                       *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psUnaryOp{psUnaryOp} | tst_psMatrixVectorArithmetic04.c)
+
Index: /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psMinimize04.stderr
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psMinimize04.stderr	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psMinimize04.stderr	(revision 22331)
@@ -0,0 +1,4 @@
+<DATE><TIME>|<HOST>|I|t03
+    Following should generate an error for null input polynomial.
+<DATE><TIME>|<HOST>|E|psVectorFitPolynomial1D (FILE:LINENO)
+    Unallowable operation: polynomial myPoly or its coeffs is NULL.
Index: /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psMinimize04.stdout
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psMinimize04.stdout	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psMinimize04.stdout	(revision 22331)
@@ -0,0 +1,36 @@
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMinimize04.c                                         *
+*            TestPoint: psMinimize functions{psVectorFitPolynomial1D(): equal difference in variable yE *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psMinimize functions{psVectorFitPolynomial1D(): equal differences in variable yErr} | tst_psMinimize04.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMinimize04.c                                         *
+*            TestPoint: psMinimize functions{psVectorFitPolynomial1D(): yErr is NULL} *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psMinimize functions{psVectorFitPolynomial1D(): yErr is NULL} | tst_psMinimize04.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMinimize04.c                                         *
+*            TestPoint: psMinimize functions{psVectorFitPolynomial1D(): x, yErr is NULL} *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psMinimize functions{psVectorFitPolynomial1D(): x, yErr is NULL} | tst_psMinimize04.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMinimize04.c                                         *
+*            TestPoint: psMinimize functions{psVectorFitPolynomial1D(): all inputs are NULL} *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psMinimize functions{psVectorFitPolynomial1D(): all inputs are NULL} | tst_psMinimize04.c)
+
Index: /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psMinimize04_F32.stderr
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psMinimize04_F32.stderr	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psMinimize04_F32.stderr	(revision 22331)
@@ -0,0 +1,4 @@
+<DATE><TIME>|<HOST>|I|t03
+    Following should generate an error for null input polynomial.
+<DATE><TIME>|<HOST>|E|psVectorFitPolynomial1D (FILE:LINENO)
+    Unallowable operation: polynomial myPoly or its coeffs is NULL.
Index: /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psMinimize04_F32.stdout
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psMinimize04_F32.stdout	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psMinimize04_F32.stdout	(revision 22331)
@@ -0,0 +1,36 @@
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMinimize04.c                                         *
+*            TestPoint: psMinimize functions{psVectorFitPolynomial1D(): equal difference in variable yE *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psMinimize functions{psVectorFitPolynomial1D(): equal differences in variable yErr} | tst_psMinimize04.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMinimize04.c                                         *
+*            TestPoint: psMinimize functions{psVectorFitPolynomial1D(): yErr is NULL} *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psMinimize functions{psVectorFitPolynomial1D(): yErr is NULL} | tst_psMinimize04.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMinimize04.c                                         *
+*            TestPoint: psMinimize functions{psVectorFitPolynomial1D(): x, yErr is NULL} *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psMinimize functions{psVectorFitPolynomial1D(): x, yErr is NULL} | tst_psMinimize04.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMinimize04.c                                         *
+*            TestPoint: psMinimize functions{psVectorFitPolynomial1D(): all inputs are NULL} *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psMinimize functions{psVectorFitPolynomial1D(): all inputs are NULL} | tst_psMinimize04.c)
+
Index: /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psMinimize04b.stderr
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psMinimize04b.stderr	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psMinimize04b.stderr	(revision 22331)
@@ -0,0 +1,4 @@
+<DATE><TIME>|<HOST>|I|t03
+    Following should generate an error for null arguments.
+<DATE><TIME>|<HOST>|E|psVectorFitPolynomial1D (FILE:LINENO)
+    Unallowable operation: polynomial myPoly or its coeffs is NULL.
Index: /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psMinimize04b.stdout
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psMinimize04b.stdout	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psMinimize04b.stdout	(revision 22331)
@@ -0,0 +1,36 @@
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMinimize04b.c                                        *
+*            TestPoint: psMinimize functions{psVectorFitPolynomial1D(): CHEB, equal errors in yErr} *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psMinimize functions{psVectorFitPolynomial1D(): CHEB, equal errors in yErr} | tst_psMinimize04b.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMinimize04b.c                                        *
+*            TestPoint: psMinimize functions{psVectorFitPolynomial1D(): CHEB, yErr is NULL} *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psMinimize functions{psVectorFitPolynomial1D(): CHEB, yErr is NULL} | tst_psMinimize04b.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMinimize04b.c                                        *
+*            TestPoint: psMinimize functions{psVectorFitPolynomial1D(): CHEB, x, yErr is NULL} *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psMinimize functions{psVectorFitPolynomial1D(): CHEB, x, yErr is NULL} | tst_psMinimize04b.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMinimize04b.c                                        *
+*            TestPoint: psMinimize functions{psVectorFitPolynomial1D(): CHEB, yErr is NULL} *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psMinimize functions{psVectorFitPolynomial1D(): CHEB, yErr is NULL} | tst_psMinimize04b.c)
+
Index: /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psMinimize04b_F32.stderr
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psMinimize04b_F32.stderr	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psMinimize04b_F32.stderr	(revision 22331)
@@ -0,0 +1,4 @@
+<DATE><TIME>|<HOST>|I|t03
+    Following should generate an error for null arguments.
+<DATE><TIME>|<HOST>|E|psVectorFitPolynomial1D (FILE:LINENO)
+    Unallowable operation: polynomial myPoly or its coeffs is NULL.
Index: /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psMinimize04b_F32.stdout
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psMinimize04b_F32.stdout	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psMinimize04b_F32.stdout	(revision 22331)
@@ -0,0 +1,36 @@
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMinimize04b.c                                        *
+*            TestPoint: psMinimize functions{psVectorFitPolynomial1D(): CHEB, equal errors in yErr} *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psMinimize functions{psVectorFitPolynomial1D(): CHEB, equal errors in yErr} | tst_psMinimize04b.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMinimize04b.c                                        *
+*            TestPoint: psMinimize functions{psVectorFitPolynomial1D(): CHEB, yErr is NULL} *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psMinimize functions{psVectorFitPolynomial1D(): CHEB, yErr is NULL} | tst_psMinimize04b.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMinimize04b.c                                        *
+*            TestPoint: psMinimize functions{psVectorFitPolynomial1D(): CHEB, x, yErr is NULL} *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psMinimize functions{psVectorFitPolynomial1D(): CHEB, x, yErr is NULL} | tst_psMinimize04b.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMinimize04b.c                                        *
+*            TestPoint: psMinimize functions{psVectorFitPolynomial1D(): CHEB, yErr is NULL} *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psMinimize functions{psVectorFitPolynomial1D(): CHEB, yErr is NULL} | tst_psMinimize04b.c)
+
Index: /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psMinimize05.stderr
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psMinimize05.stderr	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psMinimize05.stderr	(revision 22331)
@@ -0,0 +1,16 @@
+<DATE><TIME>|<HOST>|I|t02
+    Following should generate error for null minimize.
+<DATE><TIME>|<HOST>|E|psMinimizePowell (FILE:LINENO)
+    Unallowable operation: min is NULL.
+<DATE><TIME>|<HOST>|I|t02
+    Following should generate error for null parameter vector
+<DATE><TIME>|<HOST>|E|psMinimizePowell (FILE:LINENO)
+    Unallowable operation: psVector params or its data is NULL.
+<DATE><TIME>|<HOST>|I|t02
+    Following should generate error for null coords.
+<DATE><TIME>|<HOST>|E|psMinimizePowell (FILE:LINENO)
+    Unallowable operation: coords is NULL.
+<DATE><TIME>|<HOST>|I|t02
+    Following should generate error for null function
+<DATE><TIME>|<HOST>|E|psMinimizePowell (FILE:LINENO)
+    Unallowable operation: func is NULL.
Index: /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psRandom.stderr
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psRandom.stderr	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psRandom.stderr	(revision 22331)
@@ -0,0 +1,20 @@
+<DATE><TIME>|<HOST>|I|t00
+    Invalid type, should generate error message
+<DATE><TIME>|<HOST>|E|psRandomAlloc (FILE:LINENO)
+    Unknown Random Number Generator Type
+<DATE><TIME>|<HOST>|I|t01
+    NULL psRandom variable, should generate error message
+<DATE><TIME>|<HOST>|E|psRandomUniform (FILE:LINENO)
+    Random variable is NULL.
+<DATE><TIME>|<HOST>|I|t02
+    NULL psRandom variable, should generate error message
+<DATE><TIME>|<HOST>|E|psRandomGaussian (FILE:LINENO)
+    Random variable is NULL.
+<DATE><TIME>|<HOST>|I|t03
+    NULL psRandom variable, should generate error message
+<DATE><TIME>|<HOST>|E|psRandomPoisson (FILE:LINENO)
+    Random variable is NULL.
+<DATE><TIME>|<HOST>|I|t04
+    Reset a NULL psRandom variable, should generate an error message
+<DATE><TIME>|<HOST>|E|psRandomReset (FILE:LINENO)
+    Random variable is NULL.
Index: /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psRandom.stdout
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psRandom.stdout	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psRandom.stdout	(revision 22331)
@@ -0,0 +1,69 @@
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psRandom.c                                             *
+*            TestPoint: psRandom functions{psRandomAlloc()}                        *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psRandom functions{psRandomAlloc()} | tst_psRandom.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psRandom.c                                             *
+*            TestPoint: psRandom functions{psRandomAlloc() and psRandomUniform()}  *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Mean is 0.50
+Standard deviation is 0.29
+
+---> TESTPOINT PASSED (psRandom functions{psRandomAlloc() and psRandomUniform()} | tst_psRandom.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psRandom.c                                             *
+*            TestPoint: psRandom functions{psRandomAlloc() and psRandomGaussian()} *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Mean is -0.01
+Standard deviation is 0.99
+
+---> TESTPOINT PASSED (psRandom functions{psRandomAlloc() and psRandomGaussian()} | tst_psRandom.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psRandom.c                                             *
+*            TestPoint: psRandom functions{psRandomAlloc() and psRandomPoisson()}  *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Mean is 14.98
+Standard deviation is 3.86
+
+---> TESTPOINT PASSED (psRandom functions{psRandomAlloc() and psRandomPoisson()} | tst_psRandom.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psRandom.c                                             *
+*            TestPoint: psRandom functions{psRandomAlloc(), psRandomReset(), and psRandomUniform()} *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psRandom functions{psRandomAlloc(), psRandomReset(), and psRandomUniform()} | tst_psRandom.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psRandom.c                                             *
+*            TestPoint: psRandom functions{psRandomAlloc(), psRandomReset(), and psRandomGaussian()} *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psRandom functions{psRandomAlloc(), psRandomReset(), and psRandomGaussian()} | tst_psRandom.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psRandom.c                                             *
+*            TestPoint: psRandom functions{psRandomAlloc(), psRandomReset(), and psRandomPoisson()} *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psRandom functions{psRandomAlloc(), psRandomReset(), and psRandomPoisson()} | tst_psRandom.c)
+
Index: /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psStats00.stderr
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psStats00.stderr	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psStats00.stderr	(revision 22331)
@@ -0,0 +1,48 @@
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psStats00.c                                            *
+*            TestPoint: psVectorStats{psVectorStats}                               *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|I|testStatsSampleMeanF32
+    Following should generate warning message
+<DATE><TIME>|<HOST>|W|psVectorStats
+    WARNING: psVectorStats(): p_psVectorSampleMean() returned an error.
+<DATE><TIME>|<HOST>|I|testStatsSampleMeanF32
+    Following should generate an error message.
+<DATE><TIME>|<HOST>|E|psVectorStats (FILE:LINENO)
+    Unallowable operation: psVector in or its data is NULL.
+<DATE><TIME>|<HOST>|I|testStatsSampleMeanF32
+    Following should generate an error message.
+<DATE><TIME>|<HOST>|E|psVectorStats (FILE:LINENO)
+    Unallowable operation: stats is NULL.
+
+---> TESTPOINT PASSED (psVectorStats{psVectorStats} | tst_psStats00.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psStats00.c                                            *
+*            TestPoint: psVectorStats{psVectorStats}                               *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psVectorStats{psVectorStats} | tst_psStats00.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psStats00.c                                            *
+*            TestPoint: psVectorStats{psVectorStats}                               *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psVectorStats{psVectorStats} | tst_psStats00.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psStats00.c                                            *
+*            TestPoint: psVectorStats{psVectorStats}                               *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psVectorStats{psVectorStats} | tst_psStats00.c)
+
Index: /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psStats01.stderr
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psStats01.stderr	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psStats01.stderr	(revision 22331)
@@ -0,0 +1,40 @@
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psStats01.c                                            *
+*            TestPoint: psVectorStats{psVectorStats}                               *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|I|testStatsMaxF32
+    Following should generate error message
+<DATE><TIME>|<HOST>|E|psVectorStats (FILE:LINENO)
+    Failed to calculate vector maximum
+
+---> TESTPOINT PASSED (psVectorStats{psVectorStats} | tst_psStats01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psStats01.c                                            *
+*            TestPoint: psVectorStats{psVectorStats}                               *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psVectorStats{psVectorStats} | tst_psStats01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psStats01.c                                            *
+*            TestPoint: psVectorStats{psVectorStats}                               *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psVectorStats{psVectorStats} | tst_psStats01.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psStats01.c                                            *
+*            TestPoint: psVectorStats{psVectorStats}                               *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psVectorStats{psVectorStats} | tst_psStats01.c)
+
Index: /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psStats02.stderr
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psStats02.stderr	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psStats02.stderr	(revision 22331)
@@ -0,0 +1,40 @@
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psStats02.c                                            *
+*            TestPoint: psVectorStats{psVectorStats}                               *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|I|testStatsMinF32
+    Following should generate error message
+<DATE><TIME>|<HOST>|E|psVectorStats (FILE:LINENO)
+    Failed to calculate vector minimum
+
+---> TESTPOINT PASSED (psVectorStats{psVectorStats} | tst_psStats02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psStats02.c                                            *
+*            TestPoint: psVectorStats{psVectorStats}                               *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psVectorStats{psVectorStats} | tst_psStats02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psStats02.c                                            *
+*            TestPoint: psVectorStats{psVectorStats}                               *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psVectorStats{psVectorStats} | tst_psStats02.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psStats02.c                                            *
+*            TestPoint: psVectorStats{psVectorStats}                               *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psVectorStats{psVectorStats} | tst_psStats02.c)
+
Index: /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psStats03.stdout
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psStats03.stdout	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psStats03.stdout	(revision 22331)
@@ -0,0 +1,31 @@
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psStats03.c                                            *
+*            TestPoint: psStats functions{PS_STAT_SAMPLE_MEDIAN: no vector mask}   *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Called psVectorStats() on a vector with no elements masked.
+The expected median was 2058.000000.  The calculated median was 2058.000000.
+
+---> TESTPOINT PASSED (psStats functions{PS_STAT_SAMPLE_MEDIAN: no vector mask} | tst_psStats03.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psStats03.c                                            *
+*            TestPoint: psStats functions{PS_STAT_SAMPLE_MEDIAN: with vector mask} *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Called psVectorStats() on a vector with last N/2 elements masked.
+The expected median was 1028.500000.  The calculated median was 1028.500000.
+
+---> TESTPOINT PASSED (psStats functions{PS_STAT_SAMPLE_MEDIAN: with vector mask} | tst_psStats03.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psStats03.c                                            *
+*            TestPoint: psStats functions{psStats(): deallocating memory}          *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psStats functions{psStats(): deallocating memory} | tst_psStats03.c)
+
Index: /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psStats05.stdout
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psStats05.stdout	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psStats05.stdout	(revision 22331)
@@ -0,0 +1,18 @@
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psStats05.c                                            *
+*            TestPoint: psStats functions{Allocate the psStats structure.}         *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psStats functions{Allocate the psStats structure.} | tst_psStats05.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psStats05.c                                            *
+*            TestPoint: psStats functions{Deallocate the psStats structure.}       *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psStats functions{Deallocate the psStats structure.} | tst_psStats05.c)
+
Index: /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psStats06.stdout
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psStats06.stdout	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psStats06.stdout	(revision 22331)
@@ -0,0 +1,31 @@
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psStats06.c                                            *
+*            TestPoint: psStats functions{PS_STAT_SAMPLE_STDEV: no vector mask}    *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Called psVectorStats() on a vector with no elements masked.
+The expected stdev was 4.472136; the calculated stdev was 4.472136
+
+---> TESTPOINT PASSED (psVector functions{PS_STAT_SAMPLE_STDEV: no vector mask} | tst_psStats06.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psStats06.c                                            *
+*            TestPoint: psStats functions{PS_STAT_SAMPLE_STDEV: with vector mask}  *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Called psVectorStats() on a vector with last N/2 elements masked.
+The expected stdev was 2.160247; the calculated stdev was 2.160247
+
+---> TESTPOINT PASSED (psVector functions{PS_STAT_SAMPLE_STDEV: with vector mask} | tst_psStats06.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psStats06.c                                            *
+*            TestPoint: psStats functions{psStats(): deallocating memory}          *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psVector functions{psStats(): deallocating memory} | tst_psStats06.c)
+
Index: /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psStats07.stderr
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psStats07.stderr	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psStats07.stderr	(revision 22331)
@@ -0,0 +1,8 @@
+<DATE><TIME>|<HOST>|W|p_psVectorRobustStats
+    WARNING: the fitted Gaussian has more than 10% error for the stdev.
+<DATE><TIME>|<HOST>|W|p_psVectorRobustStats
+    WARNING: Using the calculated stdev instead of Gaussian-fitted stdev.
+<DATE><TIME>|<HOST>|W|p_psVectorRobustStats
+    WARNING: the fitted Gaussian has more than 10% error for the stdev.
+<DATE><TIME>|<HOST>|W|p_psVectorRobustStats
+    WARNING: Using the calculated stdev instead of Gaussian-fitted stdev.
Index: /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psStats08.stdout
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psStats08.stdout	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psStats08.stdout	(revision 22331)
@@ -0,0 +1,53 @@
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psStats08.c                                            *
+*            TestPoint: psStats functions{PS_STAT_SAMPLE_LQ: no vector mask}       *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Called psVectorStats() on a vector with no elements masked.
+The expected sampleLQ was 50.000000; the calculated sampleLQ was 50.000000
+
+---> TESTPOINT PASSED (psVector functions{PS_STAT_SAMPLE_LQ: no vector mask} | tst_psStats08.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psStats08.c                                            *
+*            TestPoint: psStats functions{PS_STAT_SAMPLE_UQ: no vector mask}       *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Called psVectorStats() on a vector with no elements masked.
+The expected sampleUQ was 150.000000; the calculated sampleUQ was 150.000000
+
+---> TESTPOINT PASSED (psVector functions{PS_STAT_SAMPLE_UQ: no vector mask} | tst_psStats08.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psStats08.c                                            *
+*            TestPoint: psStats functions{PS_STAT_SAMPLE_LQ: with vector mask}     *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Called psVectorStats() on a vector with elements masked.
+The expected sampleLQ was 25.000000; the calculated sampleLQ was 25.000000
+
+---> TESTPOINT PASSED (psVector functions{PS_STAT_SAMPLE_LQ: with vector mask} | tst_psStats08.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psStats08.c                                            *
+*            TestPoint: psStats functions{PS_STAT_SAMPLE_UQ: with vector mask}     *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Called psVectorStats() on a vector with elements masked.
+The expected sampleUQ was 75.000000; the calculated sampleUQ was 75.000000
+
+---> TESTPOINT PASSED (psVector functions{PS_STAT_SAMPLE_UQ: with vector mask} | tst_psStats08.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psStats08.c                                            *
+*            TestPoint: psStats functions{psStats(): deallocating memory}          *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psVector functions{psStats(): deallocating memory} | tst_psStats08.c)
+
Index: /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psStats09.stdout
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psStats09.stdout	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psStats09.stdout	(revision 22331)
@@ -0,0 +1,53 @@
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psStats09.c                                            *
+*            TestPoint: psStats functions{PS_STAT_CLIPPED_MEAN: no vector mask}    *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Called psVectorStats() on a vector with no elements masked.
+The calculated clippedMean was 29.95
+
+---> TESTPOINT PASSED (psVector functions{PS_STAT_CLIPPED_MEAN/STDEV: no vector mask} | tst_psStats09.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psStats09.c                                            *
+*            TestPoint: psStats functions{PS_STAT_CLIPPED_STDEV: no vector mask}   *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Called psVectorStats() on a vector with no elements masked.
+The calculated clippedStdev was 0.58
+
+---> TESTPOINT PASSED (psVector functions{PS_STAT_CLIPPED_MEAN/STDEV: no vector mask} | tst_psStats09.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psStats09.c                                            *
+*            TestPoint: psStats functions{PS_STAT_CLIPPED_MEAN: vector mask}       *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Called psVectorStats() on a vector with elements masked.
+The calculated clippedMean was 29.45
+
+---> TESTPOINT PASSED (psVector functions{PS_STAT_CLIPPED_MEAN/STDEV: vector mask} | tst_psStats09.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psStats09.c                                            *
+*            TestPoint: psStats functions{PS_STAT_CLIPPED_STDEV: vector mask}      *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Called psVectorStats() on a vector with elements masked.
+The calculated clippedStdev was 0.29
+
+---> TESTPOINT PASSED (psVector functions{PS_STAT_CLIPPED_MEAN/STDEV: vector mask} | tst_psStats09.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psStats09.c                                            *
+*            TestPoint: psStats functions{psStats(): deallocating memory}          *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psVector functions{psStats(): deallocating memory} | tst_psStats09.c)
+
Index: /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psVectorFFT.stderr
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psVectorFFT.stderr	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/dataManip/verified/tst_psVectorFFT.stderr	(revision 22331)
@@ -0,0 +1,73 @@
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psVectorFFT.c                                          *
+*            TestPoint: psFFT{psVectorFFT}                                         *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|I|testVectorFFT
+    Following should generate an error message.
+<DATE><TIME>|<HOST>|E|psVectorFFT (FILE:LINENO)
+    Must specify the direction as either PS_FFT_FORWARD or PS_FFT_REVERSE.
+
+---> TESTPOINT PASSED (psFFT{psVectorFFT} | tst_psVectorFFT.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psVectorFFT.c                                          *
+*            TestPoint: psFFT{psVectorRealImaginary}                               *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|I|testVectorRealImaginary
+    Following should generate a warning.
+<DATE><TIME>|<HOST>|W|psVectorReal
+    Real portion of a non-Complex type called called for. Just a vector copy was performed.
+<DATE><TIME>|<HOST>|I|testVectorRealImaginary
+    Following should generate a warning.
+<DATE><TIME>|<HOST>|W|psVectorImaginary
+    Imaginary portion of a non-Complex type called for. A zeroed vector was returned.
+
+---> TESTPOINT PASSED (psFFT{psVectorRealImaginary} | tst_psVectorFFT.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psVectorFFT.c                                          *
+*            TestPoint: psFFT{psVectorComplex}                                     *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|I|testVectorComplex
+    Following should be an error (type mismatch).
+<DATE><TIME>|<HOST>|E|psVectorComplex (FILE:LINENO)
+    Real psVector type, psF32, and imaginary psVector type, psF64, must be the same.
+<DATE><TIME>|<HOST>|I|testVectorComplex
+    Following should generate an error message.
+<DATE><TIME>|<HOST>|E|psVectorComplex (FILE:LINENO)
+    Input psVector type, psS8, is required to be either psF32 or psF64.
+
+---> TESTPOINT PASSED (psFFT{psVectorComplex} | tst_psVectorFFT.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psVectorFFT.c                                          *
+*            TestPoint: psFFT{psVectorConjugate}                                   *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|I|testVectorConjugate
+    Following should generate a warning message.
+<DATE><TIME>|<HOST>|W|psVectorConjugate
+    Complex Conjugate of a non-Complex type called for. Vector copy was performed instead.
+
+---> TESTPOINT PASSED (psFFT{psVectorConjugate} | tst_psVectorFFT.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psVectorFFT.c                                          *
+*            TestPoint: psFFT{psVectorPowerSpectrum}                               *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|I|testVectorPowerSpectrum
+    Following should generate an error message.
+<DATE><TIME>|<HOST>|E|psVectorPowerSpectrum (FILE:LINENO)
+    Input psVector type, psF32, is required to be either psC32 or psC64.
+
+---> TESTPOINT PASSED (psFFT{psVectorPowerSpectrum} | tst_psVectorFFT.c)
+
Index: /tags/ipp-1-X/bug123/psLib/test/image/.cvsignore
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/image/.cvsignore	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/image/.cvsignore	(revision 22331)
@@ -0,0 +1,19 @@
+fBiOut.fits
+fOut.fits
+sBiOut.fits
+sOut.fits
+.deps
+.libs
+Makefile
+Makefile.in
+temp
+tst_psImage
+tst_psImageExtraction
+tst_psImageFFT
+tst_psImageManip
+tst_psImageConvolve
+tst_psImageIO
+tmpImages
+tst_psImageStats04
+tst_psImageInterpolate
+tst_psImageStats
Index: /tags/ipp-1-X/bug123/psLib/test/image/Makefile.am
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/image/Makefile.am	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/image/Makefile.am	(revision 22331)
@@ -0,0 +1,64 @@
+#Makefile for image functions of psLib
+#
+EXTRA_DIST = verified
+
+INCLUDES = \
+	-I$(top_srcdir)/src \
+	-I$(top_srcdir)/src/astronomy \
+	-I$(top_srcdir)/src/collections \
+	-I$(top_srcdir)/src/dataManip \
+	-I$(top_srcdir)/src/dataIO \
+	-I$(top_srcdir)/src/image \
+	-I$(top_srcdir)/src/sysUtils \
+	$(all_includes)
+
+AM_LDFLAGS = -L$(top_builddir)/src -lpslib $(PSLIB_LIBS)
+
+TESTS = \
+	tst_psImage \
+	tst_psImageFFT \
+	tst_psImageManip \
+	tst_psImageStats \
+	tst_psImageStatsSpeed \
+	tst_psImageExtraction \
+	tst_psImageConvolve \
+	tst_psImageIO \
+	tst_psImageInterpolate
+
+check_PROGRAMS =$(TESTS)
+
+check_DATA = \
+	fBiOut.fits \
+	fOut.fits \
+	sBiOut.fits \
+	sOut.fits
+
+TESTS_ENVIRONMENT = perl $(top_srcdir)/test/runTest -verified=$(srcdir)/verified 
+
+CLEANFILES = $(TESTS) $(check_DATA) temp/*
+
+tests: $(check_DATA) $(TESTS)
+
+tst_psImage_SOURCES =  tst_psImage.c
+tst_psImageFFT_SOURCES =  tst_psImageFFT.c
+tst_psImageManip_SOURCES =  tst_psImageManip.c
+tst_psImageStats_SOURCES =  tst_psImageStats.c
+tst_psImageStatsSpeed_SOURCES =  tst_psImageStatsSpeed.c
+tst_psImageExtraction_SOURCES =  tst_psImageExtraction.c
+tst_psImageConvolve_SOURCES =  tst_psImageConvolve.c
+tst_psImageIO_SOURCES =  tst_psImageIO.c
+tst_psImageInterpolate_SOURCES =  tst_psImageInterpolate.c
+
+fBiOut.fits: verified/fBiOut.fits
+	cp $? $@
+
+fOut.fits: verified/fOut.fits
+	cp $? $@
+
+sBiOut.fits: verified/sBiOut.fits
+	cp $? $@
+
+sOut.fits: verified/sOut.fits
+	cp $? $@
+
+test: check
Index: /tags/ipp-1-X/bug123/psLib/test/image/tst_psImage.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/image/tst_psImage.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/image/tst_psImage.c	(revision 22331)
@@ -0,0 +1,430 @@
+/** @file  tst_psImage.c
+ *
+ *  @brief Contains the tests for psImage.[ch]
+ *
+ *
+ *  @author Robert DeSonia, MHPCC
+ *
+ *  @version $Revision: 1.32 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-04-07 20:27:42 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+
+#include <math.h>
+#include <float.h>
+#include <string.h>
+#include <stdlib.h>
+
+#include "psTest.h"
+#include "pslib_strict.h"
+#include "psType.h"
+
+static psS32 testImageAlloc(void);
+static psS32 testImageCopy(void);
+static psS32 testRegion(void);
+
+testDescription tests[] = {
+                              {testImageAlloc,546,"psImageAlloc",0,false},
+                              {testImageAlloc,548,"psImageFree",0,true},
+                              {testImageCopy,551,"psImageCopy",0,false},
+                              {testRegion,790,"psRegionAlloc",0,false},
+                              {testRegion,791,"psRegionFromString",0,true},
+                              {NULL}
+                          };
+
+psS32 main(psS32 argc, char* argv[])
+{
+    psLogSetLevel(PS_LOG_INFO);
+
+    return ! runTestSuite(stderr,"psImage",tests,argc,argv);
+}
+
+psS32 testImageAlloc(void)
+{
+    psImage* image = NULL;
+    psU32 sizes = 6;
+    psU32 numCols[] = {
+                          0,1,1,100,100,150
+                      };
+    psU32 numRows[] = {
+                          0,1,100,1,150,100
+                      };
+    psU32 types = 12;
+    psElemType type[] = { PS_TYPE_S8, PS_TYPE_S16, PS_TYPE_S32, PS_TYPE_S64,
+                          PS_TYPE_U8, PS_TYPE_U16, PS_TYPE_U32, PS_TYPE_U64,
+                          PS_TYPE_F32, PS_TYPE_F64, PS_TYPE_C32, PS_TYPE_C64};
+
+    psLogMsg(__func__,PS_LOG_INFO,"#546 - psImageAlloc shall allocate memory for a psImage structure");
+
+    for (psU32 t=0;t<types;t++) {
+        psLogMsg(__func__,PS_LOG_INFO,"Testing psImage with type %xh",type[t]);
+
+        for (psU32 i=0;i<sizes;i++) {
+
+            if (numRows[i] == 0 || numCols[i] == 0) {
+                psLogMsg(__func__,PS_LOG_INFO,"Following should be an error.");
+            }
+
+            image = psImageAlloc(numCols[i],numRows[i],type[t]);
+
+            if (image == NULL) {
+                if (numRows[i] == 0 || numCols[i] == 0) {
+                    continue;
+                }
+                psError(PS_ERR_UNKNOWN, true,"psImageAlloc returned NULL for type %x, size %dx%d.",
+                        type[t], numCols[i], numRows[i]);
+                psFree(image);
+                return 1;
+            }
+
+            if (image->type.dimen != PS_DIMEN_IMAGE || image->type.type != type[t]) {
+                psError(PS_ERR_UNKNOWN, true,"psImageAlloc allocated wrong dimen/type (%d/%d), should be "
+                        "PS_IMAGE_DIMEN/%d", image->type.dimen, image->type.type, type[t]);
+                psFree(image);
+                return 2;
+            }
+
+            if (image->numCols != numCols[i] || image->numRows != numRows[i]) {
+                psError(PS_ERR_UNKNOWN, true,"psImageAlloc allocated wrong size %dx%d, should be %dx%d (type = %d)",
+                        image->numCols, image->numRows, numCols[i], numRows[i],type[t]);
+                psFree(image);
+                return 3;
+            }
+
+            if (image->col0 != 0 || image->row0 != 0) {
+                psError(PS_ERR_UNKNOWN, true,"psImageAlloc returned row0/col0 of %d/%d.  Should be 0/0.",
+                        image->row0, image->row0);
+                psFree(image);
+                return 4;
+            }
+
+            if (image->parent != NULL) {
+                psError(PS_ERR_UNKNOWN, true,"psImageAlloc returned non-NULL parent");
+                psFree(image);
+                return 5;
+            }
+
+            if (image->children != NULL) {
+                psError(PS_ERR_UNKNOWN, true,"psImageAlloc returned non-NULL children array");
+                psFree(image);
+                return 7;
+            }
+
+            switch (type[t]) {
+            case PS_TYPE_U16: {
+                    psU32 rows = numRows[i];
+                    psU32 cols = numCols[i];
+
+                    for (psS32 r=0;r<rows;r++) {
+                        for (psS32 c=0;c<cols;c++) {
+                            image->data.U16[r][c] = 2*c+r;
+                        }
+                    }
+                    for (psS32 r=0;r<rows;r++) {
+                        for (psS32 c=0;c<cols;c++) {
+                            if (image->data.U16[r][c] != 2*c+r) {
+                                psError(PS_ERR_UNKNOWN, true,"Could not set all pixels in uint16 image at (%d,%d)",c,r);
+                                psFree(image);
+                                return 8;
+                            }
+                        }
+                    }
+                }
+                break;
+            case PS_TYPE_F32: {
+                    psU32 rows = numRows[i];
+                    psU32 cols = numCols[i];
+
+                    for (psS32 r=0;r<rows;r++) {
+                        for (psS32 c=0;c<cols;c++) {
+                            image->data.F32[r][c] = 2.0f*c+r;
+                        }
+                    }
+                    for (psS32 r=0;r<rows;r++) {
+                        for (psS32 c=0;c<cols;c++) {
+                            if (fabsf(image->data.F32[r][c] - (2.0f*c+r)) > FLT_EPSILON) {
+                                psError(PS_ERR_UNKNOWN, true,"Could not set all pixels in float image at (%d,%d)",c,r);
+                                psFree(image);
+                                return 8;
+                            }
+                        }
+                    }
+                }
+                break;
+            case PS_TYPE_F64: {
+                    psU32 rows = numRows[i];
+                    psU32 cols = numCols[i];
+
+                    for (psS32 r=0;r<rows;r++) {
+                        for (psS32 c=0;c<cols;c++) {
+                            image->data.F64[r][c] = 2.0f*c+r;
+                        }
+                    }
+                    for (psS32 r=0;r<rows;r++) {
+                        for (psS32 c=0;c<cols;c++) {
+                            if (fabs(image->data.F64[r][c] - (2.0f*c+r)) > DBL_EPSILON) {
+                                psError(PS_ERR_UNKNOWN, true,"Could not set all pixels in double image at (%d,%d)",c,r);
+                                psFree(image);
+                                return 8;
+                            }
+                        }
+                    }
+                }
+                break;
+            case PS_TYPE_C32: {
+                    psU32 rows = numRows[i];
+                    psU32 cols = numCols[i];
+
+                    for (psS32 r=0;r<rows;r++) {
+                        for (psS32 c=0;c<cols;c++) {
+                            image->data.C32[r][c] = r + I * c;
+                        }
+                    }
+                    for (psS32 r=0;r<rows;r++) {
+                        for (psS32 c=0;c<cols;c++) {
+                            if (fabsf(crealf(image->data.C32[r][c]) - r) > FLT_EPSILON ||
+                                    fabsf(cimagf(image->data.C32[r][c]) - c) > FLT_EPSILON ) {
+                                psError(PS_ERR_UNKNOWN, true,"Could not set all pixels in complex image at (%d,%d)",c,r);
+                                psFree(image);
+                                return 8;
+                            }
+                        }
+                    }
+                }
+                break;
+            default: {
+                    // ignore type and just use as byte bucket.
+                    psU32 rows = numRows[i];
+                    psU32 cols = numCols[i]*PSELEMTYPE_SIZEOF(type[t]);
+
+                    for (psS32 r=0;r<rows;r++) {
+                        for (psS32 c=0;c<cols;c++) {
+                            image->data.U8[r][c] = (uint8_t)(r + c);
+                        }
+                    }
+                    for (psS32 r=0;r<rows;r++) {
+                        for (psS32 c=0;c<cols;c++) {
+                            if (image->data.U8[r][c] != (uint8_t)(r + c)) {
+                                psError(PS_ERR_UNKNOWN, true,"Could not set all pixels in image (type=%d) at (%d,%d)",
+                                        type[t],c,r);
+                                psFree(image);
+                                return 8;
+                            }
+                        }
+                    }
+                }
+            }
+            psFree(image);
+        }
+    }
+
+    // #548: Verify no memory leaks or corruption are detected after a valid psImage structure with multiple
+    // children is freed.
+    image = psImageAlloc(100,100,PS_TYPE_F32);
+    psImageSubset(image,50,0,70,20);
+    psImageSubset(image,70,20,90,40);
+
+    psFree(image);
+
+    return 0;
+}
+
+psS32 testImageCopy(void)
+{
+    psImage* img = NULL;
+    psImage* img2 = NULL;
+    psImage* img3 = NULL;
+    psImage* img4 = NULL;
+    psU32 c = 128;
+    psU32 r = 256;
+
+    img = psImageAlloc(c,r,PS_TYPE_F32);
+    for (unsigned row=0;row<r;row++) {
+        psF32* imgRow = img->data.F32[row];
+        for (unsigned col=0;col<c;col++) {
+            imgRow[col] = (psF32)(row+col);
+        }
+    }
+    img2 = psImageAlloc(c,r,PS_TYPE_F32);
+    for (unsigned row=0;row<r;row++) {
+        psF32* img2Row = img2->data.F32[row];
+        for (unsigned col=0;col<c;col++) {
+            img2Row[col] = 0.0f;
+        }
+    }
+
+    img3 = psImageCopy(img2,img,PS_TYPE_F32);
+
+    // Verify the returned psImage structure pointer is equal to the input parameter output.
+    if (img2 != img3) {
+        psError(PS_ERR_UNKNOWN, true,"the image given for recycled wasn't");
+        return 1;
+    }
+
+    // Verify the returned psImage structure is the same type as the input image structure
+    // if the specified output argument is NULL.
+    img4 = psImageCopy(NULL,img,PS_TYPE_F32);
+    if (img4 == NULL) {
+        psError(PS_ERR_UNKNOWN, true,"output image doesn't exist");
+        return 4;
+    }
+    if (img4->type.type != img->type.type) {
+        psError(PS_ERR_UNKNOWN, true,"output image is not the same type as input image");
+        return 4;
+    }
+    for (psU32 row=0;row<r;row++) {
+        psF32* imgInRow = img->data.F32[row];
+        psF32* imgOutRow = img4->data.F32[row];
+        for (unsigned col=0;col<c;col++) {
+            if( imgInRow[col] != imgOutRow[col] ) {
+                psError(PS_ERR_UNKNOWN, true,"Input image not equal to output image at %d,%d!",
+                        col, row);
+                return 4;
+            }
+        }
+    }
+
+    // Verify the returned psImage structure member are equal to the values in
+    // the input psImage structure input.
+
+    #define testImageCopyType(IN,OUT) \
+    img = psImageRecycle(img,c,r,PS_TYPE_##IN); \
+    for (unsigned row=0;row<r;row++) { \
+        ps##IN* imgRow = img->data.IN[row]; \
+        for (unsigned col=0;col<c;col++) { \
+            imgRow[col] = (ps##IN)(row+col); \
+        } \
+    } \
+    img2 = psImageCopy(img2,img,PS_TYPE_##OUT); \
+    if (img2 == NULL) { \
+        psError(PS_ERR_UNKNOWN, true,"psImageCopy failed to copy U8."); \
+        return 2; \
+    } \
+    for (psU32 row=0;row<r;row++) { \
+        ps##IN* imgRow = img->data.IN[row]; \
+        ps##OUT* img2Row = img2->data.OUT[row]; \
+        for (psU32 col=0;col<c;col++) { \
+            if (abs(imgRow[col] - (ps##IN)(row+col)) > 0.5) { \
+                psError(PS_ERR_UNKNOWN, true,"Input image was changed at %d,%d!", \
+                        col,row); \
+                return 2; \
+            } \
+            if (abs(img2Row[col] - (ps##OUT)(imgRow[col])) > 0.5) { \
+                psError(PS_ERR_UNKNOWN, true,"returned psImage values after copy don't match at %d,%d " \
+                        "(%d vs %d)",\
+                        col,row,img2Row[col], (ps##OUT)(imgRow[col])); \
+                return 2; \
+            } \
+        } \
+    }
+
+    #define testImageCopyTypes(IN) \
+    printf("to psF32\n"); \
+    testImageCopyType(IN,F32);\
+    printf("to psF64\n"); \
+    testImageCopyType(IN,F64); \
+    printf("to psU8\n"); \
+    testImageCopyType(IN,U8); \
+    printf("to psU16\n"); \
+    testImageCopyType(IN,U16); \
+    printf("to psU32\n"); \
+    testImageCopyType(IN,U32); \
+    printf("to psS8\n"); \
+    testImageCopyType(IN,S8);\
+    printf("to psS16\n"); \
+    testImageCopyType(IN,S16);\
+    printf("to psS32\n"); \
+    testImageCopyType(IN,S32);
+
+    psLogMsg(__func__,PS_LOG_INFO,"Image Copy Test for psU8");
+    testImageCopyTypes(U8);
+    psLogMsg(__func__,PS_LOG_INFO,"Image Copy Test for psU16");
+    testImageCopyTypes(U16);
+    psLogMsg(__func__,PS_LOG_INFO,"Image Copy Test for psU32");
+    testImageCopyTypes(U32);
+    psLogMsg(__func__,PS_LOG_INFO,"Image Copy Test for psS8");
+    testImageCopyTypes(S8);
+    psLogMsg(__func__,PS_LOG_INFO,"Image Copy Test for psS16");
+    testImageCopyTypes(S16);
+    psLogMsg(__func__,PS_LOG_INFO,"Image Copy Test for psS32");
+    testImageCopyTypes(S32);
+    psLogMsg(__func__,PS_LOG_INFO,"Image Copy Test for psF32");
+    testImageCopyTypes(F32);
+    psLogMsg(__func__,PS_LOG_INFO,"Image Copy Test for psF64");
+    testImageCopyTypes(F64);
+
+    // Verify the returned psImage structure pointer is null and program
+    // execution doesn't stop, if the input parameter input is null.
+    psLogMsg(__func__,PS_LOG_INFO,"An error should follow...");
+    img3 = psImageCopy(NULL,NULL,PS_TYPE_F32);
+    if (img3 != NULL) {
+        psError(PS_ERR_UNKNOWN, true,"psImageCopy didn't return NULL when input image was NULL.");
+        return 3;
+    }
+
+    psFree(img);
+    psFree(img2);
+    psFree(img3);
+    psFree(img4);
+
+    return 0;
+}
+
+static psS32 testRegion(void)
+{
+    int testNum = 0;
+
+
+    // Testpoint #790
+
+    psRegion* region = psRegionAlloc(1,2,3,4);
+
+    testNum++;
+    if (region == NULL) {
+        psError(PS_ERR_UNKNOWN, false,
+                "psRegionAlloc returned a NULL pointer.");
+        return testNum;
+    }
+
+    testNum++;
+    if (region->x0 != 1 || region->x1 != 2 || region->y0 != 3 || region->y1 != 4) {
+        psError(PS_ERR_UNKNOWN, false,
+                "The region attributes are not set properly (%s)",
+                psRegionToString(region));
+        return testNum;
+    }
+
+    psFree(region);
+
+    // Testpoint #791
+
+    region = psRegionFromString("[1:2,3:4]");
+
+    testNum++;
+    if (region == NULL) {
+        psError(PS_ERR_UNKNOWN, false,
+                "psRegionFromString returned a NULL pointer.");
+        return testNum;
+    }
+
+    testNum++;
+    if (region->x0 != 1 || region->x1 != 2 || region->y0 != 3 || region->y1 != 4) {
+        psError(PS_ERR_UNKNOWN, false,
+                "The region attributes are not set properly (%s)",
+                psRegionToString(region));
+        return testNum;
+    }
+
+    psFree(region);
+    region = psRegionFromString("[1:2,3:]");
+
+    testNum++;
+    if (region != NULL) {
+        psError(PS_ERR_UNKNOWN, false,
+                "psRegionFromString returned a non-NULL pointer given a malformed string.");
+        return testNum;
+    }
+
+    return 0;
+}
Index: /tags/ipp-1-X/bug123/psLib/test/image/tst_psImageConvolve.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/image/tst_psImageConvolve.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/image/tst_psImageConvolve.c	(revision 22331)
@@ -0,0 +1,435 @@
+/** @file  tst_psImageConvolve.c
+ *
+ *  @brief Contains the tests for psImageConvolve.[ch]
+ *
+ *  @author Robert DeSonia, MHPCC
+ *
+ *  @version $Revision: 1.10 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-04-15 00:12:09 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+
+#include <math.h>
+#include <float.h>
+#include <string.h>
+#include <stdlib.h>
+
+#include "psTest.h"
+#include "pslib_strict.h"
+#include "psType.h"
+
+static psS32 testKernelAlloc(void);
+static psS32 testKernelGenerate(void);
+static psS32 testImageConvolve(void);
+
+testDescription tests[] = {
+                              {testKernelAlloc,731,"psKernelAlloc",0,false},
+                              {testKernelGenerate,732,"psKernelGenerate",0,false},
+                              {testImageConvolve,733,"psImageConvolve",0,false},
+                              {NULL}
+                          };
+
+psS32 main(psS32 argc, char* argv[])
+{
+    psLogSetLevel(PS_LOG_INFO);
+
+    return ! runTestSuite(stderr,"psImage",tests,argc,argv);
+}
+
+static psS32 testKernelAlloc(void)
+{
+    psS32 numCases = 4;
+    psS32 xMin[] = { -5,  0,-10,  5};
+    psS32 xMax[] = {  0,  5, -5, 10};
+    psS32 yMin[] = { -4,  0, -8,  4};
+    psS32 yMax[] = {  0,  4, -4,  8};
+    psS32 i;
+    psKernel* k;
+
+    for (i=0;i<numCases;i++) {
+        k = psKernelAlloc(xMin[i],xMax[i],yMin[i],yMax[i]);
+
+        if (k == NULL) {
+            psError(PS_ERR_UNKNOWN, true,"psKernelAlloc returned NULL for [%d:%d,%d:%d].",
+                    xMin[i], xMax[i], yMin[i], yMax[i]);
+            return i*10+1;
+        }
+
+        if (k->xMin != xMin[i] || k->xMax != xMax[i] ||
+                k->yMin != yMin[i] || k->yMax != yMax[i]) {
+            psError(PS_ERR_UNKNOWN, true,"Min/max members, [%d:%d,%d:%d], of psKernel wrong. Should be [%d:%d,%d:%d].",
+                    k->xMin,k->xMax, k->yMin, k->yMax,
+                    xMin[i], xMax[i], yMin[i], yMax[i]);
+            return i*10+2;
+        }
+
+        if (k->image->numCols != xMax[i]-xMin[i]+1 ||
+                k->image->numRows != yMax[i]-yMin[i]+1) {
+            psError(PS_ERR_UNKNOWN, true,"Size of the kernel image is wrong (%dx%d vs %dx%d).",
+                    xMax[i]-xMin[i]+1, yMax[i]-yMin[i]+1,
+                    k->image->numCols, k->image->numRows);
+            return i*10+2;
+        }
+
+        for (psS32 j=yMin[i]; j<yMax[i]; j++) {
+            if (k->kernel[j]+xMin[i] != k->image->data.PS_TYPE_KERNEL_DATA[j-yMin[i]]) {
+                psError(PS_ERR_UNKNOWN, true,"The kernel pointer was set wrong for row %d.",
+                        j);
+                return i*10+4;
+            }
+        }
+
+        psFree(k);
+    }
+
+    psLogMsg(__func__,PS_LOG_INFO,"Following should be a warning (xMin > xMax)");
+    k = psKernelAlloc(5, -5, -2, 2);
+    if (k == NULL) {
+        psError(PS_ERR_UNKNOWN, true,"psKernelAlloc returned NULL for xMin > xMax.");
+        return i*10+5;
+    }
+
+    if (k->xMin != -5 || k->xMax != 5) {
+        psError(PS_ERR_UNKNOWN, true,"psKernelAlloc didn't swap xMin & xMax.");
+        return i*10+6;
+    }
+
+    psFree(k);
+
+    psLogMsg(__func__,PS_LOG_INFO,"Following should be a warning (yMin > yMax)");
+    k = psKernelAlloc(-2, 2, 5, -5);
+    if (k == NULL) {
+        psError(PS_ERR_UNKNOWN, true,"psKernelAlloc returned NULL for yMin > yMax.");
+        return i*10+7;
+    }
+
+    if (k->yMin != -5 || k->yMax != 5) {
+        psError(PS_ERR_UNKNOWN, true,"psKernelAlloc didn't swap yMin & yMax.");
+        return i*10+8;
+    }
+
+    psFree(k);
+
+    return 0;
+}
+
+static psS32 testKernelGenerate(void)
+{
+    psS32 size = 5;
+    psS32 t[] = { 1, 2, 8, 9, 10 };
+    psS32 x[] = { 0, 1, 0, -1, 0 };
+    psS32 y[] = { 2, 1, -1, -2, 0 };
+    psKernelType sum;
+
+    psVector* xVec = psVectorAlloc(size,PS_TYPE_U32);
+    psVector* yVec = psVectorAlloc(size,PS_TYPE_U32);
+    psVector* tVec = psVectorAlloc(size,PS_TYPE_U32);
+
+    for (psS32 i = 0; i < size; i++) {
+        xVec->data.U32[i] = x[i];
+        yVec->data.U32[i] = y[i];
+        tVec->data.U32[i] = t[i];
+    }
+
+    psKernel* result = psKernelGenerate(tVec, xVec, yVec, false);
+
+    if (result == NULL) {
+        psError(PS_ERR_UNKNOWN, true,"psKernelGenerate returned NULL.");
+        return 1;
+    }
+
+    if (result->xMin != -1 || result->xMax != 1 ||
+            result->yMin != -2 || result->yMax != 2) {
+        psError(PS_ERR_UNKNOWN, true,"psKernelGenerate result had a range of [%d:%d,%d:%d].  Suppose to be [-2:2,-1:1].",
+                result->xMin, result->xMax, result->yMin, result->yMax);
+        return 2;
+    }
+
+    sum = 0.0;
+    printf("Resulting kernel:\n");
+    for (psS32 y = result->yMin; y <= result->yMax; y++) {
+        for (psS32 x = result->xMin; x <= result->xMax; x++) {
+            printf(" %6.2f ", result->kernel[y][x]);
+            sum += result->kernel[y][x];
+        }
+        printf("\n");
+    }
+    if (fabsf(1.0 - sum) > FLT_EPSILON) {
+        psError(PS_ERR_UNKNOWN, true,"psKernelGenerate result is not normalized (sum=%g).",
+                sum);
+
+        return 3;
+
+    }
+
+    if (fabsf(result->kernel[-2][0] - 0.1) > FLT_EPSILON ||
+            fabsf(result->kernel[ -1][ -1] - 0.1) > FLT_EPSILON ||
+            fabsf(result->kernel[ 1][ 0] - 0.6) > FLT_EPSILON ||
+            fabsf(result->kernel[2][1] - 0.1) > FLT_EPSILON) {
+        psError(PS_ERR_UNKNOWN, true,"psKernelGenerate result values, %g,%g,%g,%g, are wrong. Suppose to be 0.1,0.1,0.6,0.1",
+                result->kernel[-2][0], result->kernel[-1][-1],
+                result->kernel[1][0], result->kernel[2][1]);
+
+        return 4;
+    }
+
+    psFree(result);
+    psFree(xVec);
+    psFree(yVec);
+    psFree(tVec);
+
+    xVec = psVectorAlloc(size,PS_TYPE_S16);
+    yVec = psVectorAlloc(size,PS_TYPE_S16);
+    tVec = psVectorAlloc(size,PS_TYPE_S16);
+
+    for (psS32 i = 0; i < size; i++) {
+        xVec->data.S16[i] = x[i];
+        yVec->data.S16[i] = y[i];
+        tVec->data.S16[i] = t[i];
+    }
+
+    result = psKernelGenerate(tVec, xVec, yVec, true);
+
+    if (result == NULL) {
+        psError(PS_ERR_UNKNOWN, true,"psKernelGenerate returned NULL.");
+        return 5;
+    }
+
+    if (result->xMin != 0 || result->xMax != 1 ||
+            result->yMin != 0 || result->yMax != 3) {
+        psError(PS_ERR_UNKNOWN, true,"psKernelGenerate result had a range of [%d:%d,%d:%d].  Suppose to be [0:1,1:2].",
+                result->xMin, result->xMax, result->yMin, result->yMax);
+        return 6;
+    }
+
+    sum = 0.0;
+    printf("Resulting kernel (relative=true):\n");
+    for (psS32 y = result->yMin; y <= result->yMax; y++) {
+        for (psS32 x = result->xMin; x <= result->xMax; x++) {
+            printf(" %6.2f ", result->kernel[y][x]);
+            sum += result->kernel[y][x];
+        }
+        printf("\n");
+    }
+    if (fabsf(1.0 - sum) > FLT_EPSILON) {
+        psError(PS_ERR_UNKNOWN, true,"psKernelGenerate result is not normalized (sum=%g).",
+                sum);
+
+        return 7;
+
+    }
+
+    if (fabsf(result->kernel[0][0] - 19.0/30.0) > FLT_EPSILON ||
+            fabsf(result->kernel[2][0] - 1.0/30.0) > FLT_EPSILON ||
+            fabsf(result->kernel[2][1] - 8.0/30.0) > FLT_EPSILON ||
+            fabsf(result->kernel[3][1] - 2.0/30.0) > FLT_EPSILON) {
+        psError(PS_ERR_UNKNOWN, true,"psKernelGenerate result values, %g,%g;%g,%g, are wrong. Suppose to be 2,6;1,0.",
+                result->kernel[0][0], result->kernel[2][0],
+                result->kernel[2][1], result->kernel[3][1]);
+
+        return 8;
+    }
+
+    psFree(result);
+    psFree(xVec);
+    psFree(yVec);
+    psFree(tVec);
+
+    xVec = psVectorAlloc(size,PS_TYPE_F32);
+    yVec = psVectorAlloc(size,PS_TYPE_F32);
+    tVec = psVectorAlloc(size,PS_TYPE_F32);
+
+    for (psS32 i = 0; i < size; i++) {
+        xVec->data.F32[i] = x[i]+0.1;
+        yVec->data.F32[i] = y[i]+0.2;
+        tVec->data.F32[i] = t[i]+0.3;
+    }
+
+    tVec->n--; // decrease size by one to make vectors unequal in length.
+    psLogMsg(__func__,PS_LOG_INFO, "Following should be an error.");
+    result = psKernelGenerate(tVec, xVec, yVec, false);
+    if (result != NULL) {
+        psError(PS_ERR_UNKNOWN, true,"psKernelGenerate returned non-NULL given differing sized vectors.");
+        return 9;
+    }
+
+    psFree(result);
+
+    psLogMsg(__func__,PS_LOG_INFO, "Following should be a error (time vector NULL).");
+    result = psKernelGenerate(NULL, xVec, yVec, true);
+    if (result != NULL) {
+        psError(PS_ERR_UNKNOWN, true,"psKernelGenerate returned a kernel with no time vector.");
+        return 11;
+    }
+
+    psLogMsg(__func__,PS_LOG_INFO, "Following should be a error (x vector NULL).");
+    result = psKernelGenerate(tVec, NULL, yVec, true);
+    if (result != NULL) {
+        psError(PS_ERR_UNKNOWN, true,"psKernelGenerate returned a kernel with no x vector.");
+        return 11;
+    }
+
+    psLogMsg(__func__,PS_LOG_INFO, "Following should be a error (y vector NULL).");
+    result = psKernelGenerate(tVec, xVec, NULL, true);
+    if (result != NULL) {
+        psError(PS_ERR_UNKNOWN, true,"psKernelGenerate returned a kernel with no y vector.");
+        return 11;
+    }
+
+    psFree(xVec);
+    psFree(yVec);
+    psFree(tVec);
+    psFree(result);
+
+    return 0;
+}
+
+static psS32 testImageConvolve(void)
+{
+    const psS32 r = 200;
+    const psS32 c = 300;
+    psS32 sum;
+
+    // approximate a normalized gaussian kernel.
+    psKernel* g = psKernelAlloc(-1,1,-1,1);
+    g->kernel[-1][-1] =
+        g->kernel[-1][1] =
+            g->kernel[1][-1] =
+                g->kernel[1][1] = 0.0113;
+    g->kernel[1][0] =
+        g->kernel[-1][0] =
+            g->kernel[0][-1] =
+                g->kernel[0][1] = 0.0838;
+    g->kernel[0][0] = 0.6193;
+
+    // create a normalized non-symetric kernel.
+    psKernel* nsk = psKernelAlloc(0,2,0,2);
+    sum = 0.0;
+    for (psS32 i=0;i<2;i++) {
+        for (psS32 j=0;j<2;j++) {
+            nsk->kernel[i][j] = i+j;
+            sum = i+j;
+        }
+    }
+    for (psS32 i=0;i<2;i++) {
+        for (psS32 j=0;j<2;j++) {
+            nsk->kernel[i][j] /= sum;
+        }
+    }
+
+
+    psImage* img = psImageAlloc(c,r,PS_TYPE_F32);
+    memset(img->data.F32[0],0,c*r*PSELEMTYPE_SIZEOF(PS_TYPE_F32));
+    img->data.F32[0][0] = 1.0f;
+    img->data.F32[r/2][c/2] = 1.0f;
+    img->data.F32[r-1][c/2] = 1.0f;
+
+    // test spacial convolution of gaussian
+    psLogMsg(__func__,PS_LOG_INFO,"Testing direct gaussian convolution");
+    psImage* out = psImageConvolve(NULL, img, g, true);
+
+    if (out == NULL) {
+        psError(PS_ERR_UNKNOWN, true, "psImageConvolve returned a NULL for direct gaussian case.");
+        return 1;
+    }
+
+    if (out->numCols != c || out->numRows != r) {
+        psError(PS_ERR_UNKNOWN, true, "psImageConvolve result image is %dx%d, but expected %dx%d.",
+                out->numCols, out->numRows,
+                c,r);
+        return 2;
+    }
+
+    if (out->type.type != PS_TYPE_F32) {
+        char* typeStr;
+        PS_TYPE_NAME(typeStr,out->type.type);
+        psError(PS_ERR_UNKNOWN, true, "psImageConvolve result image is of type %s, not psF32.",
+                typeStr);
+        return 3;
+    }
+
+    // test values
+    for (psS32 i=-1;i<1;i++) {
+        for (psS32 j=-1;j<1;j++) {
+            if (fabsf(out->data.F32[r/2+i][c/2+j] - g->kernel[i][j]) > 0.0001) {
+                psError(PS_ERR_UNKNOWN, true,"Convolved image wrong at %d,%d.  Value is %g, expected %g.",
+                        c/2+j,r/2+i,
+                        out->data.F32[r/2+i][c/2+j], g->kernel[i][j]);
+                return 4;
+            }
+            if (i >= 0 && j >= 0 && fabsf(out->data.F32[i][j] - g->kernel[i][j]) > 0.0001) {
+                psError(PS_ERR_UNKNOWN, true,"Convolved image wrong at %d,%d.  Value is %g, expected %g.",
+                        j,i,
+                        out->data.F32[i][j], g->kernel[i][j]);
+                return 5;
+            }
+            if (i <= 0 && fabsf(out->data.F32[r-1+i][c/2+j] - g->kernel[i][j]) > 0.0001) {
+                psError(PS_ERR_UNKNOWN, true,"Convolved image wrong at %d,%d.  Value is %g, expected %g.",
+                        c/2+j,r-1+i,
+                        out->data.F32[r-1+i][c/2+j], g->kernel[i][j]);
+                return 6;
+            }
+        }
+    }
+
+    // test fourier convolution of gaussian
+    psLogMsg(__func__,PS_LOG_INFO,"Testing fourier gaussian convolution");
+    psImage* out2 = psImageConvolve(out, img, g, false);
+
+    if (out == NULL) {
+        psError(PS_ERR_UNKNOWN, true, "psImageConvolve returned a NULL for gaussian case.");
+        return 10;
+    }
+
+    if (out != out2) {
+        psError(PS_ERR_UNKNOWN, true, "psImageConvolve didn't recycle the supplied out image struct.");
+        return 11;
+    }
+
+    if (out->numCols != c || out->numRows != r) {
+        psError(PS_ERR_UNKNOWN, true, "psImageConvolve result image is %dx%d, but expected %dx%d.",
+                out->numCols, out->numRows,
+                c,r);
+        return 12;
+    }
+
+    if (out->type.type != PS_TYPE_F32) {
+        char* typeStr;
+        PS_TYPE_NAME(typeStr,out->type.type);
+        psError(PS_ERR_UNKNOWN, true, "psImageConvolve result image is of type %s, not psF32.",
+                typeStr);
+        return 13;
+    }
+
+    // test values
+    for (psS32 i=-1;i<1;i++) {
+        for (psS32 j=-1;j<1;j++) {
+            if (fabsf(out->data.F32[r/2+i][c/2+j] - g->kernel[i][j]) > 0.01) {
+                psError(PS_ERR_UNKNOWN, true,"Convolved image wrong at %d,%d.  Value is %g, expected %g.",
+                        c/2+j,r/2+i,
+                        out->data.F32[r/2+i][c/2+j], g->kernel[i][j]);
+                return 14;
+            }
+            if (i >= 0 && j >= 0 && fabsf(out->data.F32[i][j] - g->kernel[i][j]) > 0.01) {
+                psError(PS_ERR_UNKNOWN, true,"Convolved image wrong at %d,%d.  Value is %g, expected %g.",
+                        j,i,
+                        out->data.F32[i][j], g->kernel[i][j]);
+                return 15;
+            }
+            if (i <= 0 && fabsf(out->data.F32[r-1+i][c/2+j] - g->kernel[i][j]) > 0.01) {
+                psError(PS_ERR_UNKNOWN, true,"Convolved image wrong at %d,%d.  Value is %g, expected %g.",
+                        c/2+j,r-1+i,
+                        out->data.F32[r-1+i][c/2+j], g->kernel[i][j]);
+                return 16;
+            }
+        }
+    }
+
+    psFree(g);
+    psFree(img);
+    psFree(nsk);
+    psFree(out);
+    return 0;
+}
+
Index: /tags/ipp-1-X/bug123/psLib/test/image/tst_psImageExtraction.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/image/tst_psImageExtraction.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/image/tst_psImageExtraction.c	(revision 22331)
@@ -0,0 +1,1418 @@
+/** @file  tst_psImageExtraction.c
+*
+*  @brief Contains the tests for psImageExtraction.[ch]
+*
+*
+*  @author Robert DeSonia, MHPCC
+*
+*  @version $Revision: 1.22 $ $Name: not supported by cvs2svn $
+*  @date $Date: 2005-04-07 20:27:42 $
+*
+*  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+*/
+#include<stdlib.h>
+#include<string.h>
+
+#include "psTest.h"
+#include "pslib_strict.h"
+#include "psType.h"
+
+static psS32 testImageSlice(void);
+static psS32 testImageSubset(void);
+static psS32 testImageSubsection(void);
+static psS32 testImageTrim(void);
+static psS32 testImageCut(void);
+static psS32 testImageRadialCut(void);
+
+
+testDescription tests[] = {
+                              {testImageSubset,547,"psImageSubset",0,false},
+                              {testImageSubset,550,"psImageSubset",0,true},
+                              {testImageSubsection,730,"psImageSubsection",0,false},
+                              {testImageSlice, 552, "psImageSlice", 0, false},
+                              {testImageTrim, 744, "psImageTrim", 0, false},
+                              {testImageCut, 555, "psImageCut", 0, false},
+                              {testImageRadialCut, 557, "psImageRadialCut", 0, false},
+                              {NULL}
+                          };
+
+psS32 main( psS32 argc, char* argv[] )
+{
+    return ! runTestSuite( stderr, "psImage", tests, argc, argv );
+}
+
+psS32 testImageSlice(void)
+{
+    const psS32 r = 200;
+    const psS32 c = 300;
+    const psS32 m = r / 2 -1;
+    const psS32 n = r / 4 -1;
+    psVector* out = NULL;
+    psImage* image;
+    psVector* positions = psVectorAlloc( r, PS_TYPE_U32 );
+    psImage* mask = psImageAlloc( c, r, PS_TYPE_MASK );
+    psStats* stat = psStatsAlloc( PS_STAT_SAMPLE_MEDIAN );
+
+    /*
+        This function shall extract pixels from a specified region of a psImage
+        structure into a vector using a specified statistical method.
+
+        Verify the returned psVector structure contains expected data, if the 
+        input psImage input has known data and the psStats structure specifies 
+        a known statistical method. At least two different statistical methods 
+        should be used within a valid range of psImage data. Allow for a delta 
+        when comparing results to allow for testing a different platforms. Two 
+        cases should be used for each possible direction. Data region cases 
+        should include 0x0, 1x1, Nx1, 1xN, NxN, MxN
+     
+     */
+
+    for ( psS32 row = 0;row < r;row++ ) {
+        psMaskType* maskRow = mask->data.PS_TYPE_MASK_DATA[row];
+        for ( psS32 col = 0;col < c;col++ ) {
+            maskRow[ col ] = 0;
+        }
+    }
+
+    #define PSIMAGESLICE_TEST1(TYPE,M,N,DIRECTION,TRUTH_SIZE,TRUTHPIX_X,TRUTHPIX_Y,TESTNUM) \
+    image = psImageAlloc( c, r, PS_TYPE_##TYPE ); \
+    for ( psS32 row = 0;row < r;row++ ) { \
+        ps##TYPE *imageRow = image->data.TYPE[ row ]; \
+        ps##TYPE rowOffset = row * 2; \
+        for ( psS32 col = 0;col < c;col++ ) { \
+            imageRow[ col ] = col + rowOffset; \
+        } \
+    } \
+    out = psImageSlice(out,positions,image,mask,1,c/10,r/10,c/10+M,r/10+N,DIRECTION,stat); \
+    \
+    if (out->n != TRUTH_SIZE) { \
+        psError(PS_ERR_UNKNOWN,true,"Number of results is wrong (%d, not %d)", \
+                out->n,n); \
+        return TESTNUM*4+1; \
+    } \
+    \
+    if (positions->n != TRUTH_SIZE) { \
+        psError(PS_ERR_UNKNOWN,true,"Number of results for positions vector is wrong (%d, not %d)", \
+                out->n,n); \
+        return TESTNUM*4+2; \
+    } \
+    \
+    for (psS32 i=0;i<out->n;i++) { \
+        if (fabs(out->data.F64[i]-image->data.TYPE[r/10+TRUTHPIX_Y][c/10+TRUTHPIX_X]) > 1.0/(psF64)r) { \
+            psError(PS_ERR_UNKNOWN,true,"Improper result at position %d.  Got %g, expected %g",i, \
+                    out->data.F64[i],image->data.TYPE[r/10+TRUTHPIX_Y][c/10+TRUTHPIX_X]); \
+            return TESTNUM*4+3; \
+        } \
+        if (DIRECTION == PS_CUT_X_POS || DIRECTION == PS_CUT_X_NEG) { \
+            if (positions->data.U32[i] != c/10+TRUTHPIX_X) { \
+                psError(PS_ERR_UNKNOWN,true,"Improper positions (%d vs %d) result @ %d.", \
+                        positions->data.U32[i],c/10+TRUTHPIX_X,i); \
+                return TESTNUM*4+4; \
+            } \
+        } else { \
+            if (positions->data.U32[i] != r/10+TRUTHPIX_Y) { \
+                psError(PS_ERR_UNKNOWN,true,"Improper positions (%d vs %d) result @ %d.", \
+                        positions->data.U32[i],r/10+TRUTHPIX_Y,i); \
+                return TESTNUM*4+4; \
+            } \
+        } \
+    } \
+    psFree(image);
+
+    #define PSIMAGESLICE_TEST(TYPE) \
+    /* test MxN case */ \
+    PSIMAGESLICE_TEST1(TYPE, m, n, PS_CUT_X_POS, m, i, n / 2, 0 ); \
+    PSIMAGESLICE_TEST1(TYPE, m, n, PS_CUT_X_NEG, m, m - 1 - i, n / 2, 1 ); \
+    PSIMAGESLICE_TEST1(TYPE, m, n, PS_CUT_Y_POS, n, m / 2, i, 2 ); \
+    PSIMAGESLICE_TEST1(TYPE, m, n, PS_CUT_Y_NEG, n, m / 2, n - 1 - i, 3 ); \
+    \
+    /* test Mx1 case */ \
+    PSIMAGESLICE_TEST1(TYPE, m, 1, PS_CUT_X_POS, m, i, 0, 4 ); \
+    PSIMAGESLICE_TEST1(TYPE, m, 1, PS_CUT_X_NEG, m, m - 1 - i, 0, 5 ); \
+    PSIMAGESLICE_TEST1(TYPE, m, 1, PS_CUT_Y_POS, 1, m / 2, 0, 6 ); \
+    PSIMAGESLICE_TEST1(TYPE, m, 1, PS_CUT_Y_NEG, 1, m / 2, 0, 7 ); \
+    \
+    /* test 1xN case */ \
+    PSIMAGESLICE_TEST1(TYPE, 1, n, PS_CUT_X_POS, 1, 0, n / 2, 8 ); \
+    PSIMAGESLICE_TEST1(TYPE, 1, n, PS_CUT_X_NEG, 1, 0, n / 2, 9 ); \
+    PSIMAGESLICE_TEST1(TYPE, 1, n, PS_CUT_Y_POS, n, 0, i, 10 ); \
+    PSIMAGESLICE_TEST1(TYPE, 1, n, PS_CUT_Y_NEG, n, 0, n - 1 - i, 11 ); \
+    \
+    /* test 1x1 case */ \
+    PSIMAGESLICE_TEST1(TYPE, 1, 1, PS_CUT_X_POS, 1, 0, 0, 12 ); \
+    PSIMAGESLICE_TEST1(TYPE, 1, 1, PS_CUT_X_NEG, 1, 0, 0, 13 ); \
+    PSIMAGESLICE_TEST1(TYPE, 1, 1, PS_CUT_Y_POS, 1, 0, 0, 14 ); \
+    PSIMAGESLICE_TEST1(TYPE, 1, 1, PS_CUT_Y_NEG, 1, 0, 0, 15 ); \
+
+    PSIMAGESLICE_TEST(F32);
+    PSIMAGESLICE_TEST(F64);
+    PSIMAGESLICE_TEST(U16);
+
+    image = psImageAlloc( c, r, PS_TYPE_F32 );
+
+    /*
+       Verify the returned psVector structure pointer is null and program 
+       execution doesn't stop, if input psImage input is null.
+
+    */
+    psLogMsg( __func__, PS_LOG_INFO, "Following should be an error." );
+    out = psImageSlice( out,
+                        NULL, NULL,
+                        NULL, 0,
+                        c/10, r/10,
+                        c/10 + 1, r/10 + 1,
+                        PS_CUT_X_POS,
+                        stat );
+    if ( out != NULL ) {
+        psError( PS_ERR_UNKNOWN,true, "Giving a NULL image, psImageSlice didn't return NULL as expected" );
+        return 101;
+    }
+
+
+    /*
+       Verify the returned psVector structure pointer is null and program 
+       execution doesn't stop, if input psStats stats is null.
+    */
+    psLogMsg( __func__, PS_LOG_INFO, "Following should be an error." );
+    out = psImageSlice( out,
+                        NULL, image,
+                        mask, 1,
+                        c/10, r/10,
+                        c/10 + 1,
+                        r/10 + 1,
+                        PS_CUT_X_POS,
+                        NULL );
+    if ( out != NULL ) {
+        psError( PS_ERR_UNKNOWN,true, "Giving a NULL stat struct, psImageSlice didn't return NULL as expected" );
+        return 102;
+    }
+    /*
+
+       Verify the returned psVector structure pointer is null and program 
+       executions doesn't stop, if the input direction is not set to one of 
+       the two valid values.
+    */
+    psLogMsg( __func__, PS_LOG_INFO, "Following should be an error." );
+    out = psImageSlice( out, NULL,
+                        image,
+                        mask, 1,
+                        c/10, r/10,
+                        c/10+1, r/10+1,
+                        5,
+                        stat);
+    if ( out != NULL ) {
+        psError( PS_ERR_UNKNOWN,true, "Giving a bogus direction flag, psImageSlice didn't return NULL as expected" );
+        return 103;
+    }
+
+    /*
+       Verify the returned psVector structure pointer is null and program 
+       execution doesn't stop, if the input nrow and/or ncol are zero.
+    */
+    psLogMsg( __func__, PS_LOG_INFO, "Following should be an error." );
+    out = psImageSlice( out,
+                        NULL,
+                        image,
+                        mask, 1,
+                        c/10, r/10,
+                        c/10, r/10,
+                        PS_CUT_X_POS,
+                        stat );
+    if ( out != NULL ) {
+        psError( PS_ERR_UNKNOWN,true, "Giving a 0x0 region, psImageSlice didn't return NULL as expected" );
+        return 104;
+    }
+
+    /*
+       Verify the returned psVector structure pointer is null and program 
+       execution doesn't stop, if the inputs row, col, nrow, ncol specify a 
+       regions of data that is not within the input psImage structure.
+    */
+    psLogMsg( __func__, PS_LOG_INFO, "Following should be an error." );
+    out = psImageSlice( out, NULL,
+                        image,
+                        mask, 1,
+                        c+1, r/10,
+                        c+2, r/10+10,
+                        PS_CUT_X_POS,
+                        stat );
+    if ( out != NULL ) {
+        psError( PS_ERR_UNKNOWN,true, "Giving an invalid x position, psImageSlice didn't return NULL as expected" );
+        return 105;
+    }
+
+    psLogMsg( __func__, PS_LOG_INFO, "Following should be an error." );
+    out = psImageSlice( out, NULL,
+                        image,
+                        mask, 1,
+                        c/10, r+1,
+                        c/10+1,r+5,
+                        PS_CUT_X_POS,
+                        stat );
+    if ( out != NULL ) {
+        psError( PS_ERR_UNKNOWN,true, "Giving an invalid y position, psImageSlice didn't return NULL as expected" );
+        return 106;
+    }
+
+    psLogMsg( __func__, PS_LOG_INFO, "Following should be an error." );
+    out = psImageSlice( out, NULL,
+                        image,
+                        mask, 1,
+                        c/10, r/10,
+                        c+1, r/10+1,
+                        PS_CUT_X_POS,
+                        stat);
+    if ( out != NULL ) {
+        psError( PS_ERR_UNKNOWN,true, "Giving an invalid numCols, psImageSlice didn't return NULL as expected" );
+        return 107;
+    }
+
+    psLogMsg( __func__, PS_LOG_INFO, "Following should be an error." );
+    out = psImageSlice( out, NULL,
+                        image,
+                        mask, 1,
+                        c/10, r/10,
+                        c/10+1, r + 1,
+                        PS_CUT_X_POS,
+                        stat);
+    if ( out != NULL ) {
+        psError( PS_ERR_UNKNOWN,true, "Giving an invalid numRows, psImageSlice didn't return NULL as expected" );
+        return 108;
+    }
+
+    /*
+       Verify the returned psVector structure pointer is null and program 
+       execution doesn't stop, if the input psStat structure member options is 
+       zero which indicates no statistic method specified.
+    */
+    psLogMsg( __func__, PS_LOG_INFO, "Following should be an error." );
+    stat->options = 0;
+    out = psImageSlice( out, NULL,
+                        image,
+                        mask, 1,
+                        c/10, r/10,
+                        c/10+1, r/10+1,
+                        PS_CUT_X_POS,
+                        stat);
+    if ( out != NULL ) {
+        psError( PS_ERR_UNKNOWN,true, "Giving an invalid numRows, psImageSlice didn't return NULL as expected" );
+        return 109;
+    }
+
+    /* Verify that a mask of different size than the input image returns null and program
+       execution doesn't stop.
+    */
+    psLogMsg( __func__, PS_LOG_INFO, "Following should be an error mask size != image size.");
+    stat->options = PS_STAT_SAMPLE_MEDIAN;
+    psImage* maskSz = psImageAlloc( r, c, PS_TYPE_MASK );
+    out = psImageSlice( out, NULL,
+                        image,
+                        maskSz, 1,
+                        c/10, r/10,
+                        c/10+1, r/10+1,
+                        PS_CUT_X_POS,
+                        stat);
+    if ( out != NULL ) {
+        psError( PS_ERR_UNKNOWN,true, "Mask size different than image size didn't return NULL as expected" );
+        return 110;
+    }
+
+    /* Verify the a invalid type mask returns null and program execution doesn't stop.
+    */
+    psLogMsg( __func__, PS_LOG_INFO, "Following should be an error invalid mask type.");
+    psImage* maskS8 = psImageAlloc( c, r, PS_TYPE_S8 );
+    out =  psImageSlice( out, NULL,
+                         image,
+                         maskS8, 1,
+                         c/10, r/10,
+                         c/10+1, r/10+1,
+                         PS_CUT_X_POS,
+                         stat);
+    if ( out != NULL ) {
+        psError( PS_ERR_UNKNOWN,true, "Mask invalid type didn't return NULL as expected.");
+        return 111;
+    }
+
+    psFree( image );
+    psFree( positions );
+    psFree( mask );
+    psFree( out );
+    psFree( stat );
+    psFree( maskS8 );
+    psFree( maskSz );
+
+    return 0;
+
+}
+
+// #547: psImageSubset shall create child image of a specified size from a parent psImage structure
+psS32 testImageSubset(void)
+{
+    psImage preSubsetStruct;
+    psImage* original;
+    psImage* subset1 = NULL;
+    psImage* subset2 = NULL;
+    psImage* subset3 = NULL;
+    psS32 c = 128;
+    psS32 r = 256;
+
+    original = psImageAlloc(c,r,PS_TYPE_U32);
+    for (psS32 row=0;row<r;row++) {
+        for (psS32 col=0;col<c;col++) {
+            original->data.F32[row][col] = row*1000+col;
+        }
+    }
+
+    memcpy(&preSubsetStruct,original,sizeof(psImage));
+
+    subset2 = psImageSubset(original,c/4,r/4,c/4+c/2,r/4+r/2);
+
+    subset3 = psImageSubset(original,0,0,c/2,r/2);
+
+    psLogMsg(__func__,PS_LOG_INFO,"Verify the returned psImage structure members nrow and ncol are equal to "
+             "the input parameter nrow and ncol respectively.");
+
+    if (subset2->numCols != c/2 || subset2->numRows != r/2) {
+        psError(PS_ERR_UNKNOWN,true,"psImageSubset output size was not proper(%dx%d, should be %dx%d).",
+                subset2->numCols, subset2->numRows, c/2,r/2);
+        return 1;
+    }
+
+    if (subset3->numCols != c/2 || subset3->numRows != r/2) {
+        psError(PS_ERR_UNKNOWN,true,"psImageSubset output size was not proper(%dx%d, should be %dx%d).",
+                subset3->numCols, subset3->numRows, c/2,r/2);
+        return 2;
+    }
+
+    psLogMsg(__func__,PS_LOG_INFO,"Verify the returned psImage structure contains expected values in the "
+             "row member, if the input psImage structure image contains known values.");
+
+    for (psS32 row=0;row<r/2;row++) {
+        for (psS32 col=0;col<c/2;col++) {
+            if (subset2->data.U32[row][col] != original->data.U32[row+r/4][col+c/4]) {
+                psError(PS_ERR_UNKNOWN,true,"psImageSubset output #1 was wrong at %dx%d (%d vs %d).",
+                        row,col,subset2->data.U32[row][col], original->data.U32[row+r/4][col+c/4]);
+                return 3;
+            }
+            if (subset3->data.U32[row][col] != original->data.U32[row][col]) {
+                psError(PS_ERR_UNKNOWN,true,"psImageSubset output #1 was wrong at %dx%d (%d vs %d).",
+                        row,col,subset2->data.U32[row][col], original->data.U32[row][col]);
+                return 4;
+            }
+        }
+    }
+
+    psLogMsg(__func__,PS_LOG_INFO,"Verify the returned psImage structure member type is equal to the input "
+             "psImage structure member type.");
+
+    if (subset2->type.type != PS_TYPE_U32) {
+        psError(PS_ERR_UNKNOWN,true,"psImageSubset output type was not proper(%d, should be %d).",
+                subset2->type.type, PS_TYPE_U32);
+        return 6;
+    }
+    if (subset3->type.type != PS_TYPE_U32) {
+        psError(PS_ERR_UNKNOWN,true,"psImageSubset output type was not proper(%d, should be %d).",
+                subset3->type.type, PS_TYPE_U32);
+        return 7;
+    }
+
+    psLogMsg(__func__,PS_LOG_INFO,"Verify the returned psImage structure members row0 and col0 are equal to "
+             "the input parameters row0 and col0 respectively.");
+
+    if (subset2->col0 != c/4 || subset2->row0 != r/4) {
+        psError(PS_ERR_UNKNOWN,true,"psImageSubset didn't set col0/row0 for subset2 (%d/%d, should be %d/%d).",
+                subset2->col0,subset2->row0,c/4,r/4);
+        return 8;
+    }
+    if (subset3->col0 != 0 || subset3->row0 != 0) {
+        psError(PS_ERR_UNKNOWN,true,"psImageSubset didn't set col0/row0 for subset3 (%d/%d, should be %d/%d).",
+                subset3->col0,subset3->row0,0,0);
+        return 9;
+    }
+
+    psLogMsg(__func__,PS_LOG_INFO,"Verify the returned psImage structure member parent is equal to the "
+             "input psImage structure pointer image.");
+
+    if (subset2->parent != original || subset3->parent != original) {
+        psError(PS_ERR_UNKNOWN,true,"psImageSubset didn't set parent.");
+        return 10;
+    }
+
+    psLogMsg(__func__,PS_LOG_INFO,"Verify the returned psImage structure member children is null.");
+
+    if (subset2->children != NULL || subset3->children != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"psImageSubset didn't set children to NULL.");
+        return 11;
+    }
+
+    psLogMsg(__func__,PS_LOG_INFO,"Verify the input psImage structure image only has the following members "
+             "changed: 1) Nchildren is increased by one. 2) parent contains pointer psImage structure "
+             "out at parent[Nchildren-1].");
+
+    if (original->children == NULL || original->children->n != 2) {
+        psError(PS_ERR_UNKNOWN,true,"psImageSubset didn't increment number of children by one per subset.");
+        return 12;
+    }
+    if (original->children->data[0] != subset2 || original->children->data[1] != subset3) {
+        psError(PS_ERR_UNKNOWN,true,"psImageSubset didn't properly store the children pointers.");
+        return 13;
+    }
+
+    psLogMsg(__func__,PS_LOG_INFO,"Verify the returned psImage structure pointer is null and program "
+             "execution doesn't stop, if the input parameter image is null. Also verified the input "
+             "psImage structure is not modified.");
+
+    psLogMsg(__func__,PS_LOG_INFO,"An error should follow...");
+    subset1 = psImageSubset(NULL,0,0,c/2,r/2);
+    if (subset1 != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"psImageSubset didn't return NULL when input image was NULL.");
+        return 14;
+    }
+
+    psLogMsg(__func__,PS_LOG_INFO,"Verify the returned psImage structure pointer is null and program "
+             " execution doesn't stop, if the input parameters nrow and/or ncol are zero. Also verify "
+             "input psImage structure is not modified.");
+
+    memcpy(&preSubsetStruct,original,sizeof(psImage));
+    psLogMsg(__func__,PS_LOG_INFO,"An error should follow...");
+    subset1 = psImageSubset(original,0,r/2,c/2,r/2);
+    if (subset1 != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"psImageSubset didn't return NULL when numRows=0.");
+        return 15;
+    }
+    psLogMsg(__func__,PS_LOG_INFO,"An error should follow...");
+    subset1 = psImageSubset(original,c/2,0,c/2,r/2);
+    if (subset1 != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"psImageSubset didn't return NULL when numCols=0.");
+        return 16;
+    }
+    if (memcmp(original,&preSubsetStruct,sizeof(psImage)) != 0) {
+        psError(PS_ERR_UNKNOWN,true,"psImageSubset changed the original struct though it failed to subset.");
+        return 17;
+    }
+
+
+    psLogMsg(__func__,PS_LOG_INFO,"Verify the returned psImage structure pointer is null and program "
+             "execution doesn't stop, if the input parameters row0 and col0 are not within the range of "
+             "values of psImage structure image.");
+
+    psLogMsg(__func__,PS_LOG_INFO,"An error should follow...");
+    subset1 = psImageSubset(original,0,0,c/2,r*2);
+    if (subset1 != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"psImageSubset didn't return NULL when subset origin was outside of "
+                "image (via cols).");
+        return 18;
+    }
+    psLogMsg(__func__,PS_LOG_INFO,"An error should follow...");
+    subset1 = psImageSubset(original,0,0,c*2,r/2);
+    if (subset1 != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"psImageSubset didn't return NULL when subset origin was outside of "
+                "image (via rows).");
+        return 19;
+    }
+    psLogMsg(__func__,PS_LOG_INFO,"An error should follow...");
+    subset1 = psImageSubset(original,-1,0,c/2,r/2);
+    if (subset1 != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"psImageSubset didn't return NULL when subset origin was outside of "
+                "image (col0=-1).");
+        return 20;
+    }
+    psLogMsg(__func__,PS_LOG_INFO,"An error should follow...");
+    subset1 = psImageSubset(original,0,-1,c/2,r/2);
+    if (subset1 != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"psImageSubset didn't return NULL when subset origin was outside of "
+                "image (row0=-1).");
+        return 21;
+    }
+
+    psLogMsg(__func__,PS_LOG_INFO,"Verify the returned psImage structure pointer is null and program "
+             "execution doesn't stop if the input parameters nrow, ncol, row0 and col0 specify a range of "
+             "data not within the input psImage structure image.  Also verify the input psImage structure "
+             "is not modified.");
+
+    psLogMsg(__func__,PS_LOG_INFO,"An error should follow...");
+    subset1 = psImageSubset(original,0,0,c/2,r+1);
+    if (subset1 != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"psImageSubset didn't return NULL when subset was outside of image (via rows).");
+        return 22;
+    }
+    psLogMsg(__func__,PS_LOG_INFO,"An error should follow...");
+    subset1 = psImageSubset(original,0,0,c+1,r/2);
+    if (subset1 != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"psImageSubset didn't return NULL when subset was outside of image (via cols).");
+        return 23;
+    }
+    psLogMsg(__func__,PS_LOG_INFO,"An error should follow...");
+    subset1 = psImageSubset(original,0,0,c+1,r+1);
+    if (subset1 != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"psImageSubset didn't return NULL when subset was outside of image (via row+cols).");
+        return 24;
+    }
+
+    psLogMsg(__func__, PS_LOG_INFO, "psImageFreeChildren shall deallocate any children images of a "
+             "psImage structure");
+
+    memcpy(&preSubsetStruct,original,sizeof(psImage));
+
+    psImageFreeChildren(original);
+
+    // Verify the returned psImage structure member Nchildren is set to zero.
+    if (original->children != NULL && original->children->n > 0) {
+        psError(PS_ERR_UNKNOWN,true,"psImageFreeChildren didn't set number of children to zero.");
+        return 25;
+    }
+
+    //Verify the returned psImage structure members type, nrow, ncol, row0, col0, rows and parent are not
+    // modified.
+    if (preSubsetStruct.numRows != original->numRows ||
+            preSubsetStruct.numCols != original->numCols ||
+            preSubsetStruct.row0 != original->row0 ||
+            preSubsetStruct.col0 != original->col0) {
+
+        psError(PS_ERR_UNKNOWN,true,"psImageFreeChildren modified parent's non-children elements.");
+        return 27;
+    }
+
+    psFree(original);
+
+    return 0;
+}
+
+// #730: psImageSubsection shall create child image of a specified size from a parent psImage structure
+psS32 testImageSubsection(void)
+{
+    psImage* original;
+    psImage* subset;
+    psS32 c = 128;
+    psS32 r = 256;
+    psS32 i;
+    psS32 numRegions = 4;
+    psS32 x1[] = {  0, 32, 64, 32};
+    psS32 x2[] = { 32, 64,127, 64};
+    psS32 y1[] = {  0, 32, 32,128};
+    psS32 y2[] = { 32, 64, 64,255};
+
+    original = psImageAlloc(c,r,PS_TYPE_U32);
+    for (psS32 row=0;row<r;row++) {
+        for (psS32 col=0;col<c;col++) {
+            original->data.F32[row][col] = row*1000+col;
+        }
+    }
+
+    for (i=0; i<numRegions; i++) {
+        char sectionStr[64];
+        sprintf(sectionStr,"[%d:%d,%d:%d]",x1[i],x2[i],y1[i],y2[i]);
+
+        psLogMsg(__func__,PS_LOG_INFO,"Testing subsection %s.",
+                 sectionStr);
+
+        subset = psImageSubsection(original,sectionStr);
+
+        if (subset == NULL) {
+            psError(PS_ERR_UNKNOWN,true,"psImageSubsection returned a NULL with a subset of %s.",
+                    sectionStr);
+            return 10*i+1;
+        }
+
+        if (subset->type.type != PS_TYPE_U32) {
+            psError(PS_ERR_UNKNOWN,true,"psImageSubsection output type was not proper(%d, should be %d).",
+                    subset->type.type, PS_TYPE_U32);
+            return 10*i+2;
+        }
+
+        if (subset->col0 != x1[i] || subset->row0 != y1[i]) {
+            psError(PS_ERR_UNKNOWN,true,"psImageSubsection didn't set properly col0/row0 (%d/%d, should be %d/%d).",
+                    subset->col0,subset->row0,x1[i],y1[i]);
+            return 10*i+3;
+        }
+
+        if (subset->parent != original) {
+            psError(PS_ERR_UNKNOWN,true,"psImageSubsection didn't set parent.");
+            return 10*i+4;
+        }
+
+        if (subset->children != NULL) {
+            psError(PS_ERR_UNKNOWN,true,"psImageSubsection didn't set children to NULL.");
+            return 10*i+5;
+        }
+
+        if (original->children == NULL || original->children->n != i+1) {
+            psError(PS_ERR_UNKNOWN,true,"psImageSubsection didn't increment number of children by one per subset.");
+            return 10*i+6;
+        }
+
+
+        if (original->children->data[i] != subset) {
+            psError(PS_ERR_UNKNOWN,true,"psImageSubsection didn't properly store the children pointer.");
+            return 10*i+7;
+        }
+
+        psS32 numCols = x2[i]-x1[i]+1;
+        psS32 numRows = y2[i]-y1[i]+1;
+        if (subset->numCols != numCols || subset->numRows != numRows) {
+            psError(PS_ERR_UNKNOWN,true,"psImageSubsection output size was not proper(%dx%d, should be %dx%d).",
+                    subset->numCols, subset->numRows, numCols, numRows);
+            return 10*i+8;
+        }
+
+        for (psS32 row=0;row<numRows;row++) {
+            for (psS32 col=0;col<numCols;col++) {
+                if (subset->data.U32[row][col] != original->data.U32[row+y1[i]][col+x1[i]]) {
+                    psError(PS_ERR_UNKNOWN,true,"psImageSubset output #1 was wrong at %dx%d (%d vs %d).",
+                            row,col,subset->data.U32[row][col], original->data.U32[row+y1[i]][col+x1[i]]);
+                    return 10*i+9;
+                }
+            }
+        }
+    }
+
+    psLogMsg(__func__,PS_LOG_INFO,"An error should follow (x1>x2)");
+    subset = psImageSubsection(original,"[64:32,32:64]");
+    if (subset != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"psImageSubsection didn't return NULL when x1 > x2.");
+        return 10*i+10;
+    }
+
+    psLogMsg(__func__,PS_LOG_INFO,"An error should follow (y1>y2)");
+    subset = psImageSubsection(original,"[32:64,64:32]");
+    if (subset != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"psImageSubsection didn't return NULL when y1 > y2.");
+        return 10*i+11;
+    }
+
+    psLogMsg(__func__,PS_LOG_INFO,"An error should follow (x2>nCols)");
+    subset = psImageSubsection(original,"[64:256,32:64]"); // assumes c<256
+    if (subset != NULL) {
+        psError(PS_ERR_UNKNOWN, true,"psImageSubsection didn't return NULL when x2 > c.");
+        return 10*i+12;
+    }
+
+    psLogMsg(__func__,PS_LOG_INFO,"An error should follow (y2>=nRows)");
+    subset = psImageSubsection(original,"[32:64,64:256]"); // assumes r==256
+    if (subset != NULL) {
+        psError(PS_ERR_UNKNOWN, true,"psImageSubsection didn't return NULL when y2 > r.");
+        return 10*i+13;
+    }
+
+    psLogMsg(__func__,PS_LOG_INFO,"An error should follow (malformed string - no brackets)");
+    subset = psImageSubsection(original,"32:64,32:64");
+    if (subset != NULL) {
+        psError(PS_ERR_UNKNOWN, true,"psImageSubsection didn't return NULL when subsection was '32:64,32:64'.");
+        return 10*i+14;
+    }
+
+    psLogMsg(__func__,PS_LOG_INFO,"An error should follow (malformed string - no colons)");
+    subset = psImageSubsection(original,"[32-64,32-64]");
+    if (subset != NULL) {
+        psError(PS_ERR_UNKNOWN, true,"psImageSubsection didn't return NULL when subsection was '[32-64,32-64]'.");
+        return 10*i+15;
+    }
+
+    psLogMsg(__func__,PS_LOG_INFO,"An error should follow (malformed string - not four numbers)");
+    subset = psImageSubsection(original,"[32:64,32]");
+    if (subset != NULL) {
+        psError(PS_ERR_UNKNOWN, true,"psImageSubsection didn't return NULL when subsection was '[32:64,32]'.");
+        return 10*i+16;
+    }
+
+    psLogMsg(__func__,PS_LOG_INFO,"An error should follow (image is NULL)");
+    subset = psImageSubsection(NULL,"[32:64,32:64]");
+    if (subset != NULL) {
+        psError(PS_ERR_UNKNOWN, true,"psImageSubsection didn't return NULL when image was NULL.");
+        return 10*i+17;
+    }
+
+    psLogMsg(__func__,PS_LOG_INFO,"An error should follow (subsection string is NULL)");
+    subset = psImageSubsection(original,NULL);
+    if (subset != NULL) {
+        psError(PS_ERR_UNKNOWN, true,"psImageSubsection didn't return NULL when subsection was NULL.");
+        return 10*i+18;
+    }
+
+    psFree(original);
+
+    return 0;
+}
+
+static psS32 testImageTrim(void)
+{
+    psS32 r = 200;
+    psS32 c = 300;
+    psS32 qtrR = r/4;
+    psS32 qtrC = c/4;
+    psS32 halfR = r/2;
+    psS32 halfC = c/2;
+
+    psImage* image = psImageAlloc(c,r,PS_TYPE_F32);
+    for (psS32 row = 0; row < image->numRows; row++) {
+        for (psS32 col = 0; col < image->numCols; col++) {
+            image->data.F32[row][col] = (psF32)col + (psF32)row/1000.0f;
+        }
+    }
+
+    /*
+        1. invoke psImageTrim with non-NULL image, and a valid region 
+           x0,y0->x1,y1 (using only positive values). Verify that:
+            a. the return psImage is the same as the input psImage.
+            b. the size of the psImage is x1-x0 by y1-y0.
+            c. the pixel values coorespond to the region [x0:x1-1,y0:y1-1].
+    */
+    psImage* image1 = psImageCopy(NULL,image,PS_TYPE_F32);
+    psImage* image2 = psImageTrim(image1,qtrC,qtrR,qtrC+halfC,qtrR+halfR);
+
+    if (image1 != image2) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "Return value not same as input value.  Not done in-place?");
+        return 1;
+    }
+
+    if (image2->numCols != halfC ||
+            image2->numRows != halfR) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "The resulting image size was %dx%d, but should be %dx%d.",
+                 image2->numCols, image2->numRows,
+                 halfC, halfR);
+        return 2;
+    }
+
+    for (psS32 row = 0; row < image2->numRows; row++) {
+        for (psS32 col = 0; col < image2->numCols; col++) {
+            if (fabsf(image2->data.F32[row][col] - image->data.F32[row+qtrR][col+qtrC]) > FLT_EPSILON) {
+                psLogMsg(__func__,PS_LOG_ERROR,
+                         "The value at (%d,%d) was %g, but should be %g.",
+                         col,row,
+                         image2->data.F32[row][col],
+                         image->data.F32[row+qtrR][col+qtrC]);
+                return 3;
+            }
+        }
+    }
+
+    /*
+        2. invoke psImageTrim with non-NULL image and valid region where x1=0, 
+           y1=0. Verify that:
+            a. the return psImage size is numCols-x0 by numRows-y0
+            b. the pixel values coorespond to the region 
+               [x0:numCols-1,y0:numRows-1].
+    */
+    image1 = psImageCopy(image1,image,PS_TYPE_F32);
+    image2 = psImageTrim(image1,qtrC,qtrR,0,0);
+
+    if (image1 != image2) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "Return value not same as input value.  Not done in-place?");
+        return 11;
+    }
+
+    if (image2->numCols != image->numCols-qtrC ||
+            image2->numRows != image->numRows-qtrR) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "The resulting image size was %dx%d, but should be %dx%d.",
+                 image2->numCols, image2->numRows,
+                 image->numCols-qtrC, image->numRows-qtrR);
+        return 12;
+    }
+
+    for (psS32 row = 0; row < image2->numRows; row++) {
+        for (psS32 col = 0; col < image2->numCols; col++) {
+            if (fabsf(image2->data.F32[row][col] -
+                      image->data.F32[row+qtrR][col+qtrC]) > FLT_EPSILON) {
+                psLogMsg(__func__,PS_LOG_ERROR,
+                         "The value at (%d,%d) was %g, but should be %g.",
+                         col,row,
+                         image2->data.F32[row][col],
+                         image->data.F32[row+qtrR][col+qtrC]);
+                return 13;
+            }
+        }
+    }
+
+    /*
+        4. invoke psImageTrim with x1<0, y1<0. Verify:
+            a. the psImage size is (numCols+x1)-x0 by (numRows+y1)-y0.
+            b. the pixel values coorespond to the region 
+               [x0:numCols+x1-1,y0:numRows+y1-1].
+
+    */
+    image1 = psImageCopy(image1,image,PS_TYPE_F32);
+    image2 = psImageTrim(image1,qtrC,qtrR,-qtrC,-qtrR);
+
+    if (image1 != image2) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "Return value not same as input value.  Not done in-place?");
+        return 21;
+    }
+
+    if (image2->numCols != image->numCols-qtrC-qtrC ||
+            image2->numRows != image->numRows-qtrR-qtrR) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "The resulting image size was %dx%d, but should be %dx%d.",
+                 image2->numCols, image2->numRows,
+                 image->numCols-qtrC, image->numRows-qtrR);
+        return 22;
+    }
+
+    for (psS32 row = 0; row < image2->numRows; row++) {
+        for (psS32 col = 0; col < image2->numCols; col++) {
+            if (fabsf(image2->data.F32[row][col] -
+                      image->data.F32[row+qtrR][col+qtrC]) > FLT_EPSILON) {
+                psLogMsg(__func__,PS_LOG_ERROR,
+                         "The value at (%d,%d) was %g, but should be %g.",
+                         col,row,
+                         image2->data.F32[row][col],
+                         image->data.F32[row+qtrR][col+qtrC]);
+                return 23;
+            }
+        }
+    }
+
+    psFree(image2);
+
+    /*
+        6. invoke psImageTrim with image=NULL Verify:
+            a. execution does not cease.
+            b. return value is NULL
+            c. appropriate error is generated.
+    */
+
+    image2 = psImageTrim(NULL,qtrC,qtrR,0,0);
+
+    if (image2 != NULL) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "psImageTrim did not return NULL given a NULL input image.");
+        return 31;
+    }
+    psErr* err = psErrorLast();
+    if (err == NULL || err->code != PS_ERR_BAD_PARAMETER_NULL) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "psImageTrim did not generate an appropriate error for NULL input image.");
+        psErrorStackPrint(stderr,"Error Stack:");
+        return 32;
+    }
+    psFree(err);
+
+    image1 = psImageCopy(NULL,image,PS_TYPE_F32);
+    image2 = psImageTrim(image1,-1,0,0,0);
+
+    if (image2 != NULL) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "psImageTrim did not return NULL given x0=-1.");
+        return 33;
+    }
+    err = psErrorLast();
+    if (err == NULL || err->code != PS_ERR_BAD_PARAMETER_VALUE) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "psImageTrim did not generate an appropriate error for x0=-1.");
+        psErrorStackPrint(stderr,"Error Stack:");
+        return 34;
+    }
+    psFree(err);
+
+    image1 = psImageCopy(NULL,image,PS_TYPE_F32);
+    image2 = psImageTrim(image1,0,-1,0,0);
+
+    if (image2 != NULL) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "psImageTrim did not return NULL given y0=-1.");
+        return 35;
+    }
+    err = psErrorLast();
+    if (err == NULL || err->code != PS_ERR_BAD_PARAMETER_VALUE) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "psImageTrim did not generate an appropriate error for y0=-1.");
+        psErrorStackPrint(stderr,"Error Stack:");
+        return 36;
+    }
+    psFree(err);
+
+    image1 = psImageCopy(NULL,image,PS_TYPE_F32);
+    image2 = psImageTrim(image1,0,0,image->numCols+1,0);
+
+    if (image2 != NULL) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "psImageTrim did not return NULL given x1=numCols+1.");
+        return 37;
+    }
+    err = psErrorLast();
+    if (err == NULL || err->code != PS_ERR_BAD_PARAMETER_VALUE) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "psImageTrim did not generate an appropriate error for x1=numCols+1.");
+        psErrorStackPrint(stderr,"Error Stack:");
+        return 38;
+    }
+    psFree(err);
+
+    image1 = psImageCopy(NULL,image,PS_TYPE_F32);
+    image2 = psImageTrim(image1,0,0,0,image->numRows+1);
+
+    if (image2 != NULL) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "psImageTrim did not return NULL given y1=numRows+1.");
+        return 39;
+    }
+    err = psErrorLast();
+    if (err == NULL || err->code != PS_ERR_BAD_PARAMETER_VALUE) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "psImageTrim did not generate an appropriate error for y1=numRows+1.");
+        psErrorStackPrint(stderr,"Error Stack:");
+        return 40;
+    }
+    psFree(err);
+
+    image1 = psImageCopy(NULL,image,PS_TYPE_F32);
+    image2 = psImageTrim(image1,0,0,-image->numCols,0);
+
+    if (image2 != NULL) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "psImageTrim did not return NULL given x1=-numCols.");
+        return 41;
+    }
+    err = psErrorLast();
+    if (err == NULL || err->code != PS_ERR_BAD_PARAMETER_VALUE) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "psImageTrim did not generate an appropriate error for x1=-numCols.");
+        psErrorStackPrint(stderr,"Error Stack:");
+        return 42;
+    }
+    psFree(err);
+
+    image1 = psImageCopy(NULL,image,PS_TYPE_F32);
+    image2 = psImageTrim(image1,0,0,0,-image->numRows);
+
+    if (image2 != NULL) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "psImageTrim did not return NULL given y1=-numRows.");
+        return 41;
+    }
+    err = psErrorLast();
+    if (err == NULL || err->code != PS_ERR_BAD_PARAMETER_VALUE) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "psImageTrim did not generate an appropriate error for y1=-numRows.");
+        psErrorStackPrint(stderr,"Error Stack:");
+        return 42;
+    }
+    psFree(err);
+
+    psFree(image);
+    return 0;
+}
+
+static psS32 testImageCut(void)
+{
+    psS32 c = 300;
+    psS32 r = 200;
+    psS32 numPoints = 15;
+    float startCol[] = { 40,150, 40,  0,280, 40,280, -1,300, 20, 20, 20, 20, 20, 20};
+    float endCol[] =   {240,150,240,299, 40,240, 40,240,240, -1,300,240,240,240,240};
+    float startRow[] = { 20, 10,100,  0, 20,180,180, 10, 10, 10, 10, -1,200, 10, 10};
+    float endRow[] =   {160,180,100,199,160, 10, 10,180,180,180,180,180,180, -1,200};
+    psBool success[] = {true,true,true,true,true,true,true,false,false,false,false,false,false,false,false};
+    psU32 length = 100;
+
+    psImage* image = psImageAlloc(c,r,PS_TYPE_F32);
+    psImage* mask = psImageAlloc(c,r,PS_TYPE_MASK);
+    for (psS32 row = 0; row < image->numRows; row++) {
+        for (psS32 col = 0; col < image->numCols; col++) {
+            image->data.F32[row][col] = (psF32)col + (psF32)row/1000.0f;
+            if ((row & 0x0F) == 0) {
+                mask->data.PS_TYPE_MASK_DATA[row][col] = 1;
+            } else {
+                mask->data.PS_TYPE_MASK_DATA[row][col] = 0;
+            }
+        }
+    }
+    psVector* rows = psVectorAlloc(length,PS_TYPE_F32);
+    psVector* cols = psVectorAlloc(length,PS_TYPE_F32);
+
+    psVector* result = NULL;
+    for (psS32 n = 0; n < numPoints; n++) {
+        psVector* orig = result;
+        if (! success[n]) {
+            psLogMsg(__func__,PS_LOG_INFO,"The following should be an error.");
+        }
+        if (n == 1) {
+            result = psImageCut(result,
+                                cols,rows,
+                                image,
+                                NULL,0,
+                                startCol[n], startRow[n],
+                                endCol[n], endRow[n],
+                                length,
+                                PS_INTERPOLATE_FLAT);
+        } else {
+            result = psImageCut(result,
+                                cols,rows,
+                                image,
+                                mask,1,
+                                startCol[n], startRow[n],
+                                endCol[n], endRow[n],
+                                length,
+                                PS_INTERPOLATE_FLAT);
+        }
+
+        if (success[n]) {
+            if (result == NULL) {
+                psLogMsg(__func__,PS_LOG_ERROR,
+                         "psImageCut returned NULL instead of a valid result.");
+                return n*10+1;
+            }
+
+            if (orig != NULL && orig != result) {
+                psLogMsg(__func__,PS_LOG_ERROR,
+                         "psImageCut didn't recycle the out parameter properly.");
+                return n*10+2;
+            }
+
+            float deltaRow = (endRow[n]-startRow[n])/(length-1);
+            float deltaCol = (endCol[n]-startCol[n])/(length-1);
+            psF32 truth;
+            for (psS32 i = 0; i < length; i++) {
+                float x = (float)startCol[n]+(float)i*deltaCol;
+                float y = (float)startRow[n]+(float)i*deltaRow;
+                if (n == 1) {
+                    truth = psImagePixelInterpolate( image, x, y,
+                                                     NULL,0,0,PS_INTERPOLATE_FLAT);
+                } else {
+                    truth = psImagePixelInterpolate( image, x, y,
+                                                     mask,1,0,PS_INTERPOLATE_FLAT);
+                }
+                if (fabs(result->data.F32[i]-truth) > FLT_EPSILON) {
+                    psLogMsg(__func__,PS_LOG_ERROR,
+                             "Bad result in position %d; Found %g but expected %g.",
+                             i, result->data.F32[i], truth);
+                    return n*10+5;
+                }
+                if (fabsf(x - cols->data.F32[i]) > FLT_EPSILON ||
+                        fabsf(y - rows->data.F32[i]) > FLT_EPSILON) {
+                    psLogMsg(__func__,PS_LOG_ERROR,
+                             "Bad resulting col/row at index %d; Found (%g,%g) but expected (%g,%g).",
+                             i, cols->data.F32[i], rows->data.F32[i], x, y);
+                    return n*10+6;
+                }
+            }
+        } else {
+            if (result != NULL) {
+                psLogMsg(__func__,PS_LOG_ERROR,
+                         "psImageCut did not return NULL with a cut of (%g,%g)->(%g,%g).",
+                         startCol[n],startRow[n],endCol[n],endRow[n]);
+                return n*10+7;
+            }
+            psErr* err = psErrorLast();
+            if (err->code != PS_ERR_BAD_PARAMETER_VALUE) {
+                psLogMsg(__func__,PS_LOG_ERROR,
+                         "psImageCut did not generate proper error message.");
+                return 105;
+            }
+            psFree(err);
+        }
+    }
+
+    psLogMsg(__func__,PS_LOG_INFO,"Following should be an error (NULL image).");
+    result = psImageCut(result,
+                        cols,rows,
+                        NULL,
+                        mask,1,
+                        startCol[0], startRow[0],
+                        endCol[0], endRow[0],
+                        length,
+                        PS_INTERPOLATE_FLAT);
+    if (result != NULL) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "psImageCut did not return NULL given NULL image.");
+        return 100;
+    }
+    psErr* err = psErrorLast();
+    if (err->code != PS_ERR_BAD_PARAMETER_NULL) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "psImageCut did not generate proper error message given NULL image.");
+        return 101;
+    }
+    psFree(err);
+
+    psLogMsg(__func__,PS_LOG_INFO,"Following should be an error (length=0).");
+    result = psImageCut(result,
+                        cols,rows,
+                        image,
+                        mask,1,
+                        startCol[0], startRow[0],
+                        endCol[0], endRow[0],
+                        0,
+                        PS_INTERPOLATE_FLAT);
+    if (result != NULL) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "psImageCut did not return NULL given length=0.");
+        return 102;
+    }
+    err = psErrorLast();
+    if (err->code != PS_ERR_BAD_PARAMETER_VALUE) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "psImageCut did not generate proper error message given length=0.");
+        return 103;
+    }
+    psFree(err);
+
+    psFree(result);
+    psFree(image);
+    psFree(mask);
+    psFree(rows);
+    psFree(cols);
+
+    return 0;
+}
+
+static psS32 testImageRadialCut(void)
+{
+    psS32 c = 300;
+    psS32 r = 200;
+    psS32 centerX = c/2;
+    psS32 centerY = r/2;
+    psErr* err = NULL;
+
+    psImage* image = psImageAlloc(c,r,PS_TYPE_F32);
+    psImage* mask = psImageAlloc(c,r,PS_TYPE_MASK);
+    for (psS32 row = 0; row < image->numRows; row++) {
+        for (psS32 col = 0; col < image->numCols; col++) {
+            image->data.F32[row][col] = sqrtf((col-centerX)*(col-centerX)+(row-centerY)*(row-centerY));
+            if ((row & 0x0F) == 0) {
+                mask->data.PS_TYPE_MASK_DATA[row][col] = 1;
+            } else {
+                mask->data.PS_TYPE_MASK_DATA[row][col] = 0;
+            }
+        }
+    }
+
+    psStats* stat = psStatsAlloc(PS_STAT_SAMPLE_MEAN);
+    psVector* radii = psVectorAlloc(10,PS_TYPE_F32);
+    for (psS32 i=0; i < 10; i++) {
+        radii->data.F32[i] = 10+i*10;
+    }
+
+    psVector* result = NULL;
+
+    result = psImageRadialCut(result,image,mask,1,centerX,centerY,radii,stat);
+
+    if (result == NULL) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "Return value of NULL unexpected.");
+        return 1;
+    }
+
+    if (result->type.type != PS_TYPE_F64) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "Return type not psF64, as expected.");
+        return 2;
+    }
+
+    for (psS32 i=0; i < 9; i++) {
+        if (fabs(result->data.F64[i] - (15.0+i*10)) > 1) {
+            psLogMsg(__func__,PS_LOG_ERROR,
+                     "Result was not as expected for radii #%d (%g, expected %d +/- 1)",
+                     result->data.F64[i], (15.0+i*10) );
+            return 3+i;
+        }
+    }
+
+    // again, but without mask
+    psVector* orig = result;
+    result = psImageRadialCut(result,image,NULL,1,centerX,centerY,radii,stat);
+
+    if (result == NULL) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "Return value of NULL unexpected.");
+        return 12;
+    }
+
+    if (result != orig) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "Return value of is not same as input parameter 'out'.");
+        return 13;
+    }
+
+    for (psS32 i=0; i < 9; i++) {
+        if (fabs(result->data.F64[i] - (15.0+i*10)) > 1) {
+            psLogMsg(__func__,PS_LOG_ERROR,
+                     "Result was not as expected for radii #%d (%g, expected %d +/- 1)",
+                     result->data.F64[i], (15.0+i*10) );
+            return 14+i;
+        }
+    }
+
+    // NULL input image...
+    psLogMsg(__func__,PS_LOG_INFO,"Following should be an error.");
+    result = psImageRadialCut(result,NULL,NULL,1,centerX,centerY,radii,stat);
+
+    if (result != NULL) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "Return value not NULL as expected.");
+        return 23;
+    }
+
+    err = psErrorLast();
+    if (err->code != PS_ERR_BAD_PARAMETER_NULL) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "psImageRadialCut did not generate proper error message.");
+        return 24;
+    }
+    psFree(err);
+
+    // NULL input radii...
+    psLogMsg(__func__,PS_LOG_INFO,"Following should be an error.");
+    result = psImageRadialCut(result,image,mask,1,centerX,centerY,NULL,stat);
+
+    if (result != NULL) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "Return value not NULL as expected.");
+        return 23;
+    }
+
+    err = psErrorLast();
+    if (err->code != PS_ERR_BAD_PARAMETER_NULL) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "psImageRadialCut did not generate proper error message.");
+        return 24;
+    }
+    psFree(err);
+
+    // NULL input stat...
+    psLogMsg(__func__,PS_LOG_INFO,"Following should be an error.");
+    result = psImageRadialCut(result,image,mask,1,centerX,centerY,radii,NULL);
+
+    if (result != NULL) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "Return value not NULL as expected.");
+        return 23;
+    }
+
+    err = psErrorLast();
+    if (err->code != PS_ERR_BAD_PARAMETER_NULL) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "psImageRadialCut did not generate proper error message.");
+        return 24;
+    }
+    psFree(err);
+
+    // Bad center X
+    psLogMsg(__func__,PS_LOG_INFO,"Following should be an error.");
+    result = psImageRadialCut(result,image,mask,1,
+                              c+1,centerY,radii,stat);
+
+    if (result != NULL) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "Return value not NULL as expected.");
+        return 25;
+    }
+
+    err = psErrorLast();
+    if (err->code != PS_ERR_BAD_PARAMETER_VALUE) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "psImageRadialCut did not generate proper error message.");
+        return 26;
+    }
+    psFree(err);
+
+    // Bad center Y
+    psLogMsg(__func__,PS_LOG_INFO,"Following should be an error.");
+    result = psImageRadialCut(result,image,mask,1,
+                              centerX,r+1,radii,stat);
+
+    if (result != NULL) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "Return value not NULL as expected.");
+        return 27;
+    }
+
+    err = psErrorLast();
+    if (err->code != PS_ERR_BAD_PARAMETER_VALUE) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "psImageRadialCut did not generate proper error message.");
+        return 28;
+    }
+    psFree(err);
+
+    // Bad mask type (N.B., swapped image/mask to do this)
+    psLogMsg(__func__,PS_LOG_INFO,"Following should be an error.");
+    result = psImageRadialCut(result,mask,image,1,
+                              centerX,r+1,radii,stat);
+
+    if (result != NULL) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "Return value not NULL as expected.");
+        return 29;
+    }
+
+    err = psErrorLast();
+    if (err->code != PS_ERR_BAD_PARAMETER_TYPE) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "psImageRadialCut did not generate proper error message.");
+        return 30;
+    }
+    psFree(err);
+
+    // Bad mask size
+    psImage* mask2 = psImageAlloc(c/2,r/2,PS_TYPE_MASK);
+    psLogMsg(__func__,PS_LOG_INFO,"Following should be an error.");
+    result = psImageRadialCut(result,image, mask2, 1,
+                              centerX,centerY,radii,stat);
+    psFree(mask2);
+    if (result != NULL) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "Return value not NULL as expected.");
+        return 31;
+    }
+
+    err = psErrorLast();
+    if (err->code != PS_ERR_BAD_PARAMETER_SIZE) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "psImageRadialCut did not generate proper error message.");
+        return 32;
+    }
+    psFree(err);
+
+    // Bad radii size
+    psVector* radii2 = psVectorAlloc(1,PS_TYPE_MASK);
+    psLogMsg(__func__,PS_LOG_INFO,"Following should be an error.");
+    result = psImageRadialCut(result,image, mask, 1,
+                              centerX,centerY,radii2,stat);
+    psFree(radii2);
+    if (result != NULL) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "Return value not NULL as expected.");
+        return 33;
+    }
+
+    err = psErrorLast();
+    if (err->code != PS_ERR_BAD_PARAMETER_SIZE) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "psImageRadialCut did not generate proper error message.");
+        return 34;
+    }
+    psFree(err);
+
+    // bad input stat option...
+    stat->options = 0;
+    psLogMsg(__func__,PS_LOG_INFO,"Following should be an error.");
+    result = psImageRadialCut(result,image,mask,1,centerX,centerY,radii,stat);
+    stat->options = PS_STAT_SAMPLE_MEAN;
+
+    if (result != NULL) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "Return value not NULL as expected.");
+        return 35;
+    }
+
+    err = psErrorLast();
+    if (err->code != PS_ERR_BAD_PARAMETER_VALUE) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "psImageRadialCut did not generate proper error message.");
+        return 36;
+    }
+    psFree(err);
+
+    psFree(image);
+    psFree(mask);
+    psFree(radii);
+    psFree(stat);
+    psFree(result);
+
+    return 0;
+}
Index: /tags/ipp-1-X/bug123/psLib/test/image/tst_psImageFFT.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/image/tst_psImageFFT.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/image/tst_psImageFFT.c	(revision 22331)
@@ -0,0 +1,663 @@
+/** @file  tst_psImageFFT.c
+ *
+ *  @brief Contains the tests for psFFT.[ch]
+ *
+ *
+ *  @author Robert DeSonia, MHPCC
+ *
+ *  @version $Revision: 1.18 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-04-15 00:12:09 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+
+#include <math.h>
+#include <float.h>
+
+#include "psTest.h"
+#include "pslib_strict.h"
+
+#define GENIMAGE(img,c,r,TYP, valueFcn) \
+img = psImageAlloc(c,r,PS_TYPE_##TYP); \
+for (psU32 row=0;row<r;row++) { \
+    ps##TYP* imgRow = img->data.TYP[row]; \
+    for (psU32 col=0;col<c;col++) { \
+        imgRow[col] = (ps##TYP)(valueFcn); \
+    } \
+}
+
+static psS32 testImageFFT(void);
+static psS32 testImageRealImaginary(void);
+static psS32 testImageComplex(void);
+static psS32 testImageConjugate(void);
+static psS32 testImagePowerSpectrum(void);
+
+testDescription tests[] = {
+                              {testImageFFT,632,"psImageFFT",0,false},
+                              {testImageRealImaginary,633,"psImageRealImaginary",0,false},
+                              {testImageComplex,634,"psImageComplex",0,false},
+                              {testImageConjugate,635,"psImageConjugate",0,false},
+                              {testImagePowerSpectrum,636,"psImagePowerSpectrum",0,false},
+                              {NULL}
+                          };
+
+psS32 main(psS32 argc, char* argv[])
+{
+    psLogSetLevel(PS_LOG_INFO);
+
+    return (! runTestSuite(stderr,"psFFT",tests,argc,argv) );
+}
+
+psS32 testImageFFT(void)
+{
+    psImage* img = NULL;
+    psImage* img2 = NULL;
+    psImage* img3 = NULL;
+    psU32 m = 128;
+    psU32 n = 64;
+    psImage* img4 = NULL;
+    psImage* img5 = NULL;
+
+    /*
+    1. assign a image to a radial sinisoid
+    2. perform a forward transform
+    3. verify that the only significant component cooresponds to the freqency of the input in step 1.
+    4. perform a reverse transform
+    5. compare to original (should be equal to within a reasonable error)
+    */
+
+    // 1. assign a image to a radial sinisoid
+    GENIMAGE(img,m,n,F32, sinf((32.0f-row)/32.0f*PS_PI)+sinf((64.0f-col)/64.0f*PS_PI));
+
+    // 2. perform a forward transform
+    img2 = psImageFFT(img2,img,PS_FFT_FORWARD);
+    if (img2->type.type != PS_TYPE_C32) {
+        psError(PS_ERR_UNKNOWN, true,"FFT didn't produce complex values?");
+        return 1;
+    }
+    if (img2->numCols != m || img2->numRows != n) {
+        psError(PS_ERR_UNKNOWN, true,"FFT didn't produce proper size result (%dx%d vs. expected %dx%d).",
+                img2->numCols,img2->numRows,m,n);
+        return 2;
+    }
+
+    // 3. verify that the only significant component cooresponds to the freqency of the input in step 1.
+    for (psU32 row=0;row<n;row++) {
+        psC32* img2Row = img2->data.C32[row];
+        for (psU32 col=0;col<m;col++) {
+            psF32 mag = cabsf(img2Row[col])/m/n;
+            if (mag > 0.1f) {
+                // must be (0,1) or (0,n-1) or (1,0) or (m-1,0)
+                if (! (col == 0 && (row == 1 || row == n-1))
+                        && ! (row == 0 && (col==1 || col == m-1)) ) {
+                    psError(PS_ERR_UNKNOWN, true,"Result invalid at %d,%d (%.2f)",col,row,mag);
+                    return 3;
+                }
+            } else
+                if ( (col == 0 && (row == 1 || row == n-1))
+                        || (row == 0 && (col==1 || col == m-1)) ) {
+                    psError(PS_ERR_UNKNOWN, true,"Result invalid at %d,%d (%.2f)",col,row,mag);
+                    return 4;
+                }
+        }
+    }
+
+
+    // 4. perform a reverse transform
+    img3 = psImageFFT(img3,img2,PS_FFT_REVERSE);
+
+    if (img3->type.type != PS_TYPE_C32) {
+        psError(PS_ERR_UNKNOWN, true,"FFT didn't produce complex values?");
+        return 5;
+    }
+
+    if (img3->numCols != m || img3->numRows != n) {
+        psError(PS_ERR_UNKNOWN, true,"FFT didn't produce proper size result (%dx%d vs. expected %dx%d).",
+                img3->numCols,img3->numRows,m,n);
+        return 6;
+    }
+
+    for (psU32 row=0;row<n;row++) {
+        psC32* img3Row = img3->data.C32[row];
+        psF32* imgRow = img->data.F32[row];
+        for (psU32 col=0;col<m;col++) {
+            psF32 pixel = creal(img3Row[col])/m/n;
+            if (fabsf(pixel-imgRow[col]) > 0.1) {
+                psError(PS_ERR_UNKNOWN, true,"Reverse FFT didn't give original image back (%d,%d %.2f vs %.2f)",
+                        col,row,pixel,imgRow[col]);
+                return 7;
+            }
+        }
+    }
+
+    // 4. perform a reverse transform to real result
+    img3 = psImageFFT(img3,img2,PS_FFT_REVERSE|PS_FFT_REAL_RESULT);
+
+    if (img3->type.type != PS_TYPE_F32) {
+        char* typeStr;
+        PS_TYPE_NAME(typeStr,img3->type.type)
+        psError(PS_ERR_UNKNOWN, true,"FFT asked to make real result, but I got a %s type image?",typeStr);
+        return 8;
+    }
+
+    if (img3->numCols != m || img3->numRows != n) {
+        psError(PS_ERR_UNKNOWN, true,"FFT didn't produce proper size result (%dx%d vs. expected %dx%d).",
+                img3->numCols,img3->numRows,m,n);
+        return 9;
+    }
+
+    for (psU32 row=0;row<n;row++) {
+        psF32* img3Row = img3->data.F32[row];
+        psF32* imgRow = img->data.F32[row];
+        for (psU32 col=0;col<m;col++) {
+            psF32 pixel = img3Row[col]/m/n;
+            if (fabsf(pixel-imgRow[col]) > 0.1) {
+                psError(PS_ERR_UNKNOWN, true,"Reverse FFT didn't give original image back (%d,%d %.2f vs %.2f)",
+                        col,row,pixel,imgRow[col]);
+                return 10;
+            }
+        }
+    }
+
+    // check if error occurs if FORWARD and REVERSE are both given.
+    psLogMsg(__func__,PS_LOG_INFO,"Following should be an error.");
+    if (psImageFFT(NULL,img2,PS_FFT_REVERSE|PS_FFT_FORWARD) != NULL) {
+        psError(PS_ERR_UNKNOWN, true,"PS_FFT_REVERSE|PS_FFT_FORWARD option produced something?");
+        return 11;
+    }
+
+    psLogMsg(__func__,PS_LOG_INFO,"Following should be an error.");
+    if (psImageFFT(NULL,img2,PS_FFT_FORWARD|PS_FFT_REAL_RESULT) != NULL) {
+        psError(PS_ERR_UNKNOWN, true,"PS_FFT_FORWARD|PS_FFT_REAL_RESULT option produced something?");
+        return 12;
+    }
+
+    /* Verify return null and program execution doesn't stop if input image is null */
+    img4 = psImageFFT(NULL,NULL,PS_FFT_FORWARD);
+    if (img4 != NULL ) {
+        psError(PS_ERR_UNKNOWN, true,"psImageFFT should return null for a null input image.");
+        return 10;
+    }
+
+    /* Verify return null and program execution doesn't stop if input image is invalid direction */
+    GENIMAGE(img4,8,8,S8,row+col);
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate error for invalid direction.");
+    img5 = psImageFFT(NULL,img4,PS_FFT_REAL_RESULT);
+    if (img5 != NULL) {
+        psError(PS_ERR_UNKNOWN, true,"psImageFFT should return null for an invalid FFT direction.");
+        return 11;
+    }
+    psFree(img4);
+
+    psFree(img);
+    psFree(img2);
+    psFree(img3);
+
+    return 0;
+}
+
+psS32 testImageRealImaginary(void)
+{
+    psImage* img = NULL;
+    psImage* img2 = NULL;
+    psImage* img3 = NULL;
+    psImage* c64Img = NULL;
+    psImage* c64Img2 = NULL;
+    psImage* c64Img3 = NULL;
+    psImage* ncImg = NULL;
+    psImage* ncImg2 = NULL;
+    psImage* ncImg3 = NULL;
+
+    psU32 m = 128;
+    psU32 n = 64;
+
+    /*
+    1. create a C32 complex vector with distinctly different real and imaginary parts.
+    2. call psImageReal and psImageImaginary
+    3. compare results to the real/imaginary components of input
+    */
+
+    // 1. create a C32 complex vector with distinctly different real and imaginary parts.
+    GENIMAGE(img,m,n,C32, row + I * col);
+
+    // 2. call psImageReal and psImageImaginary
+    img2 = psImageReal(img2,img);
+    if (img2 == NULL) {
+        psError(PS_ERR_UNKNOWN, true,"psImageReal returned a NULL?");
+        return 1;
+    }
+    if (img2->type.type != PS_TYPE_F32) {
+        psError(PS_ERR_UNKNOWN, true,"psImageReal returned a wrong type (%d)?",
+                img2->type.type);
+        return 2;
+    }
+
+    img3 = psImageImaginary(img3,img);
+    if (img3 == NULL) {
+        psError(PS_ERR_UNKNOWN, true,"psImageImaginary returned a NULL?");
+        return 3;
+    }
+    if (img3->type.type != PS_TYPE_F32) {
+        psError(PS_ERR_UNKNOWN, true,"psImageImaginary returned a wrong type (%d)?",
+                img3->type.type);
+        return 4;
+    }
+
+    // 3. compare results to the real/imaginary components of input
+    for (psU32 row=0;row<n;row++) {
+        psF32* img2Row = img2->data.F32[row];
+        psF32* img3Row = img3->data.F32[row];
+        for (psU32 col=0;col<m;col++) {
+            if (fabsf(img2Row[col] - row) > FLT_EPSILON) {
+                psError(PS_ERR_UNKNOWN, true,"psImageReal didn't return the real portion at n=%d",
+                        n);
+                return 5;
+            }
+            if (fabsf(img3Row[col] - col) > FLT_EPSILON) {
+                psError(PS_ERR_UNKNOWN, true,"psImageImaginary didn't return the imag portion at n=%d",
+                        n);
+                return 6;
+            }
+        }
+    }
+
+    psFree(img);
+    psFree(img2);
+    psFree(img3);
+
+    /*
+    1. create a C64 complex vector with distinctly different real and imaginary parts.
+    2. call psImageReal and psImageImaginary
+    3. compare results to the real/imaginary components of input
+    */
+
+    // 1. create a C64 complex vector with distinctly different real and imaginary parts.
+    GENIMAGE(c64Img,m,n,C64, row + I * col);
+
+    // 2. call psImageReal and psImageImaginary
+    c64Img2 = psImageReal(c64Img2,c64Img);
+    if (c64Img2 == NULL) {
+        psError(PS_ERR_UNKNOWN, true,"psImageReal returned a NULL?");
+        return 1;
+    }
+    if (c64Img2->type.type != PS_TYPE_F64) {
+        psError(PS_ERR_UNKNOWN, true,"psImageReal returned a wrong type (%d)?",
+                img2->type.type);
+        return 2;
+    }
+
+    c64Img3 = psImageImaginary(c64Img3,c64Img);
+    if (c64Img3 == NULL) {
+        psError(PS_ERR_UNKNOWN, true,"psImageImaginary returned a NULL?");
+        return 3;
+    }
+    if (c64Img3->type.type != PS_TYPE_F64) {
+        psError(PS_ERR_UNKNOWN, true,"psImageImaginary returned a wrong type (%d)?",
+                c64Img3->type.type);
+        return 4;
+    }
+
+    // 3. compare results to the real/imaginary components of input
+    for (psU32 row=0;row<n;row++) {
+        psF64* img2Row = c64Img2->data.F64[row];
+        psF64* img3Row = c64Img3->data.F64[row];
+        for (psU32 col=0;col<m;col++) {
+            if (fabsf(img2Row[col] - row) > FLT_EPSILON) {
+                psError(PS_ERR_UNKNOWN, true,"psImageReal didn't return the real portion at n=%d",
+                        n);
+                return 5;
+            }
+            if (fabsf(img3Row[col] - col) > FLT_EPSILON) {
+                psError(PS_ERR_UNKNOWN, true,"psImageImaginary didn't return the imag portion at n=%d",
+                        n);
+                return 6;
+            }
+        }
+    }
+
+    GENIMAGE(ncImg,m,n,F32,row+col);
+    ncImg2 = psImageReal(ncImg2,ncImg);
+    ncImg3 = psImageImaginary(ncImg3,ncImg);
+    if(ncImg2 == NULL) {
+        psError(PS_ERR_UNKNOWN,true,"psImageReal returned NULL");
+        return 40;
+    }
+    if(ncImg2->type.type != PS_TYPE_F32) {
+        psError(PS_ERR_UNKNOWN,true,"psImageReal returned a wrong type");
+        return 41;
+    }
+    if(ncImg3 == NULL) {
+        psError(PS_ERR_UNKNOWN,true,"psImageImaginary returned NULL");
+        return 42;
+    }
+    if(ncImg3->type.type != PS_TYPE_F32) {
+        psError(PS_ERR_UNKNOWN,true,"psImageImaginary returned NULL");
+        return 43;
+    }
+    for(psU32 row=0; row<n; row++) {
+        psF32* ncImg2Row = ncImg2->data.F32[row];
+        psF32* ncImg3Row = ncImg3->data.F32[row];
+        for(psU32 col=0; col<m; col++) {
+            if(fabsf(ncImg2Row[col] - (row+col)) > FLT_EPSILON) {
+                psError(PS_ERR_UNKNOWN,true,"psImageReal didn't return the real portion");
+                return 45;
+            }
+            if(fabsf(ncImg3Row[col] - 0) > FLT_EPSILON) {
+                psError(PS_ERR_UNKNOWN,true,"psImageImaginary didn't return the imaginary portion");
+                return 46;
+            }
+        }
+    }
+    psFree(ncImg);
+    psFree(ncImg2);
+    psFree(ncImg3);
+
+    psFree(c64Img);
+    psFree(c64Img2);
+    psFree(c64Img3);
+
+    // Perform psImageReal with null input
+    if(psImageReal(NULL,NULL) != NULL ) {
+        psError(PS_ERR_UNKNOWN,true,"psImageReal did not return null with null input");
+        return 10;
+    }
+
+    // Perform psImageImaginary with null input
+    if(psImageImaginary(NULL,NULL) != NULL ) {
+        psError(PS_ERR_UNKNOWN,true,"psImageImaginary did not return null with null input");
+        return 10;
+    }
+
+    return 0;
+}
+
+psS32 testImageComplex(void)
+{
+    psImage* img = NULL;
+    psImage* img2 = NULL;
+    psImage* img3 = NULL;
+    psImage* c64Img = NULL;
+    psImage* c64Img2 = NULL;
+    psImage* c64Img3 = NULL;
+    psImage* pImg = NULL;
+    psImage* pImg2 = NULL;
+    psImage* pImg3 = NULL;
+
+    psU32 m = 128;
+    psU32 n = 64;
+
+    /*
+    1. create two unique psF32 vectors of the same size
+    2. call psImageComplex
+    3. verify that the result is a psC32
+    4. use crealf and cimagf on step 2 results
+    5. compare step 4 results to input.
+
+    6. create a psF32 and a psF64 vector of the same size
+    7. call psImageComplex
+    8. verify that an appropriate error occurred.
+
+    9. create two psf32 vectors of different sizes
+    10. call psImageComplex
+    11. verify thet an appropriate error occurred.
+    */
+
+    // 1. create two unique psF32 vectors of the same size
+    GENIMAGE(img,m,n,F32,row);
+    GENIMAGE(img2,m,n,F32,col);
+    GENIMAGE(c64Img,m,n,F64,row);
+    GENIMAGE(c64Img2,m,n,F64,col);
+    GENIMAGE(pImg,m,n,S16,row);
+    GENIMAGE(pImg2,m,n,S16,col);
+
+    // 2. call psImageComplex
+    img3 = psImageComplex(img3,img,img2);
+    c64Img3 = psImageComplex(c64Img3,c64Img,c64Img2);
+
+    // 3. verify that the result is a psC32
+    if (img3->type.type != PS_TYPE_C32) {
+        psError(PS_ERR_UNKNOWN, true,"Image Type from psImageComplex is not complex? (%d)",
+                img3->type.type);
+        return 1;
+    }
+    if (c64Img3->type.type != PS_TYPE_C64) {
+        psError(PS_ERR_UNKNOWN,true,"Image type from psImageComplex is not complex");
+        return 10;
+    }
+
+    // 4. call psImageReal and psImageImaginary on step 2 results (not needed, just use crealf/cimagf)
+    // 5. compare step 4 results to input.
+    for (psU32 row=0;row<n;row++) {
+        psC32* img3Row = img3->data.C32[row];
+        psC64* c64Img3Row = c64Img3->data.C64[row];
+        for (psU32 col=0;col<m;col++) {
+            if (fabsf(crealf(img3Row[col]) - row) > FLT_EPSILON ||
+                    fabsf(cimagf(img3Row[col]) - col) > FLT_EPSILON) {
+                psError(PS_ERR_UNKNOWN, true,"psImageComplex result is invalid (%d,%d, %.2f+%.2fi)",
+                        col,row,crealf(img3Row[col]),cimagf(img3Row[col]));
+                return 2;
+            }
+            if (fabsf(crealf(c64Img3Row[col]) - row) > FLT_EPSILON ||
+                    fabsf(cimagf(c64Img3Row[col]) - col) > FLT_EPSILON) {
+                psError(PS_ERR_UNKNOWN,true,"psImageComplex result is invalid");
+                return 3;
+            }
+        }
+    }
+
+    // 6. create a psF32 and a psF64 image of the same size
+    img2 = psImageRecycle(img2,m,n,PS_TYPE_F64);
+
+    // 7. call psImageComplex
+    psLogMsg(__func__,PS_LOG_INFO, "Following should be an error (type mismatch).");
+    img3 = psImageComplex(img3,img,img2);
+    // 8. verify that an appropriate error occurred. (this partially has to be done via inspection)
+    if (img3 != NULL) {
+        psError(PS_ERR_UNKNOWN, true,"psImageComplex returned a image though input types mismatched.");
+        return 3;
+    }
+
+    // 9. create two psf32 vectors of different sizes
+    img2 = psImageRecycle(img2,m/2,n,PS_TYPE_F32);
+
+    // 10. call psImageComplex
+    psLogMsg(__func__,PS_LOG_INFO, "Following should be an error (size mismatch).");
+    img3 = psImageComplex(img3,img,img2);
+
+    // 11. verify thet an appropriate error occurred.
+    if (img3 != NULL) {
+        psError(PS_ERR_UNKNOWN, true,"psImageComplex returned a image though input sizes mismatched.");
+        return 4;
+    }
+
+    // Perform psImageComplex with invalid type
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message.");
+    pImg3 = psImageComplex(pImg3,pImg,pImg2);
+    if ( pImg3 != NULL) {
+        psError(PS_ERR_UNKNOWN,true,"psImageComplex did not return NULL");
+        return 50;
+    }
+
+    psFree(img);
+    psFree(img2);
+    psFree(img3);
+    psFree(c64Img);
+    psFree(c64Img2);
+    psFree(c64Img3);
+    psFree(pImg);
+    psFree(pImg2);
+
+    // Perform psImageComplex with null input
+    if(psImageComplex(NULL,NULL,NULL) != NULL ) {
+        psError(PS_ERR_UNKNOWN,true,"psImageComplex did not return null with null input");
+        return 20;
+    }
+
+    return 0;
+}
+
+psS32 testImageConjugate(void)
+{
+    psImage* img = NULL;
+    psImage* img2 = NULL;
+    psImage* c64Img = NULL;
+    psImage* c64Img2 = NULL;
+    psImage* pImg = NULL;
+    psImage* pImg2 = NULL;
+
+    psU32 m = 128;
+    psU32 n = 64;
+
+    /*
+    1. create a psC32 with unique real and imaginary values.
+    2. call psImageConjugate
+    3. verify result is psC32
+    4. verify each value is conjugate of input (a+bi -> a-bi)
+    */
+
+    // 1. create a psC32 with unique real and imaginary values.
+    GENIMAGE(img,m,n,C32, row + I * col);
+    GENIMAGE(c64Img,m,n,C64,row + I*col);
+    GENIMAGE(pImg,m,n,F32,row+col);
+
+    // 2. call psImageConjugate
+    img2 = psImageConjugate(img2,img);
+    c64Img2 = psImageConjugate(c64Img2,c64Img);
+    pImg2 = psImageConjugate(pImg2,pImg);
+
+    // 3. verify result is psC32
+    if (img2->type.type != PS_TYPE_C32) {
+        psError(PS_ERR_UNKNOWN, true,"the psImageConjugate didn't return a C32 image.");
+        return 1;
+    }
+    if (c64Img2->type.type != PS_TYPE_C64) {
+        psError(PS_ERR_UNKNOWN,true,"psImageConjugate did not return a C64 image");
+        return 10;
+    }
+    if (pImg2->type.type != PS_TYPE_F32) {
+        psError(PS_ERR_UNKNOWN,true,"psImageConjugate did not return a F32 image");
+        return 11;
+    }
+
+    // 4. verify each value is conjugate of input (a+bi -> a-bi)
+    for (psU32 row=0;row<n;row++) {
+        psC32* img2Row = img2->data.C32[row];
+        psC64* c64Img2Row = c64Img2->data.C64[row];
+        psF32* pImg2Row = pImg2->data.F32[row];
+        for (psU32 col=0;col<m;col++) {
+            if (fabsf(crealf(img2Row[col]) - row) > FLT_EPSILON ||
+                    fabsf(cimagf(img2Row[col]) + col) > FLT_EPSILON) {
+                psError(PS_ERR_UNKNOWN, true,"psImageComplex result is invalid (%d,%d, %.2f+%.2fi)",
+                        col,row,crealf(img2Row[col]),cimagf(img2Row[col]));
+                return 2;
+            }
+            if (fabsf(crealf(c64Img2Row[col]) - row) > FLT_EPSILON ||
+                    fabsf(cimagf(c64Img2Row[col]) + col) > FLT_EPSILON) {
+                psError(PS_ERR_UNKNOWN,true,"psImageComplex result is invalid");
+                return 20;
+            }
+            if (fabsf(pImg2Row[col] - (row+col)) > FLT_EPSILON) {
+                psError(PS_ERR_UNKNOWN,true,"psImageComplex result is invalid");
+                return 21;
+            }
+        }
+    }
+
+    psFree(img);
+    psFree(img2);
+    psFree(c64Img);
+    psFree(c64Img2);
+    psFree(pImg);
+    psFree(pImg2);
+
+    // Perform psImageConjugate with null input
+    if(psImageConjugate(NULL,NULL) != NULL ) {
+        psError(PS_ERR_UNKNOWN,true,"psImageConjugate did not return null with null input");
+        return 30;
+    }
+
+    return 0;
+}
+
+psS32 testImagePowerSpectrum(void)
+{
+    psImage* img = NULL;
+    psImage* img2 = NULL;
+    psImage* c64Img = NULL;
+    psImage* c64Img2 = NULL;
+    psImage* pImg = NULL;
+
+    psU32 m = 128;
+    psU32 n = 64;
+
+    /*
+    1. create a psC32 vector with unique real and imaginary components
+    2. call psImagePowerSpectrum
+    3. verify result is psF32
+    4. verify the values are the square of the absolute values of the original
+    */
+
+    // 1. create a psC32 vector with unique real and imaginary components
+    GENIMAGE(img,m,n,C32, row + I * col);
+    GENIMAGE(c64Img,m,n,C64,row+I*col);
+    GENIMAGE(pImg,m,n,F32,row+col);
+
+    // 2. call psImagePowerSpectrum
+    img2 = psImagePowerSpectrum(img2,img);
+    c64Img2 = psImagePowerSpectrum(c64Img2, c64Img);
+
+    // 3. verify result is psF32
+    if (img2->type.type != PS_TYPE_F32) {
+        psError(PS_ERR_UNKNOWN, true,"the type was not PS_TYPE_F32.");
+        return 1;
+    }
+    if (c64Img2->type.type != PS_TYPE_F64) {
+        psError(PS_ERR_UNKNOWN,true,"psImagePowerSpectrum did not return PS_TYPE_F64");
+        return 10;
+    }
+
+    // 4. verify the values are the square of the absolute values of the original
+    for (psU32 row=0;row<n;row++) {
+        psC32* imgRow = img->data.C32[row];
+        psF32* img2Row = img2->data.F32[row];
+        psC64* c64ImgRow = c64Img->data.C64[row];
+        psF64* c64Img2Row = c64Img2->data.F64[row];
+        for (psU32 col=0;col<m;col++) {
+            psF32 power = cabs(imgRow[col]);
+            psF64 power64 = cabs(c64ImgRow[col]);
+            power *= power/n/n/m/m;
+            power64 *= power64/n/n/m/m;
+
+            if (fabsf(img2Row[col] - power) > 2.0f*FLT_EPSILON) {
+                psError(PS_ERR_UNKNOWN, true,"psImagePowerSpectrum result is invalid (%d,%d, %.2f vs %.2f)",
+                        col,row,img2Row[col],power);
+                return 2;
+            }
+            if (fabsf(c64Img2Row[col] - power64) > 2.0f*FLT_EPSILON) {
+                psError(PS_ERR_UNKNOWN,true,"psImagePowerSpectrum result is invalid");
+                return 22;
+            }
+        }
+    }
+
+    psFree(img);
+    psFree(img2);
+    psFree(c64Img);
+    psFree(c64Img2);
+
+    // Perform psImagePowerSpectrum with invalid input
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate error message.");
+    if(psImagePowerSpectrum(NULL,pImg) != NULL ) {
+        psError(PS_ERR_UNKNOWN,true,"psImagePowerSpectrum did not return null with invalid type");
+        return 41;
+    }
+    psFree(pImg);
+
+    // Perform psImagePowerSpectrum with null input
+    if(psImagePowerSpectrum(NULL,NULL) != NULL ) {
+        psError(PS_ERR_UNKNOWN,true,"psImagePowerSpectrum did not return null with null input");
+        return 40;
+    }
+
+    return 0;
+}
Index: /tags/ipp-1-X/bug123/psLib/test/image/tst_psImageIO.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/image/tst_psImageIO.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/image/tst_psImageIO.c	(revision 22331)
@@ -0,0 +1,388 @@
+/** @file  tst_psImageIO.c
+ *
+ *  @brief Contains the tests for psImageIO.[ch]
+ *
+ *
+ *  @author Robert DeSonia, MHPCC
+ *
+ *  @version $Revision: 1.14 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-04-07 20:27:42 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+
+#include <math.h>
+#include <float.h>
+#include <string.h>
+#include <stdlib.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <fitsio.h>
+
+#include "psTest.h"
+#include "pslib_strict.h"
+
+#define GENIMAGE(img,c,r,TYP, valueFcn) \
+img = psImageAlloc(c,r,PS_TYPE_##TYP); \
+for (psU32 row=0;row<r;row++) { \
+    ps##TYP* imgRow = img->data.TYP[row]; \
+    for (psU32 col=0;col<c;col++) { \
+        imgRow[col] = (ps##TYP)(valueFcn); \
+    } \
+}
+
+static psS32 testImageRead(void);
+static psS32 testImageWrite(void);
+
+testDescription tests[] = {
+                              {
+                                  testImageRead,567,"psImageReadSection",0,false
+                              },
+                              {
+                                  testImageWrite,569,"psImageWriteSection",0,false
+                              },
+                              {
+                                  NULL
+                              }
+                          };
+
+psS32 main(psS32 argc, char* argv[])
+{
+    psLogSetLevel(PS_LOG_INFO);
+
+    if (! runTestSuite(stderr,"psImage",tests,argc,argv)) {
+        psAbort(__FILE__,"One or more tests failed");
+    }
+    return 0;
+}
+
+psS32 testImageRead(void)
+{
+    psS32 N = 256;
+    psS32 M = 128;
+    psImage* image = NULL;
+
+    /*
+        This function shall open the specified FITS file, read the specified data
+        and place the data into a psImage structure. This function shall generate
+        an error message and return NULL if any of the input parameters are out of
+        range, image file doesn't exist or image is zero or one dimensional.
+
+        Verify the returned psImage structure contains expected values, if the input
+        parameter filename specifies an available FITS file with known 2dimensional
+        data, input parameters col, row, ncol, nrow, z specify data range with the
+        FITS file. Cases should include 1x1, Nx1, 1xN, NxN and MxN sub images and
+        total FITS file image. (done in macro)
+
+        Verify the returned psImage structure is equal to the input parameter
+        'output', if specified. (done in macro)
+
+        */
+
+    /* generate FITS file to read */
+
+    #define testReadTypeSize(m, n, readM0, readN0, readM, readN, TYP, filename) \
+    { \
+        psImage* img = NULL; \
+        psImage* img2 = NULL; \
+        psImage* img3 = NULL; \
+        psImage* img4 = NULL; \
+        /*        psImage* img_ref = NULL; */ \
+        \
+        GENIMAGE(img,m,n,TYP,row+2*col); \
+        img2 = psImageCopy(img2,img,PS_TYPE_##TYP); \
+        GENIMAGE(img3,m,n,TYP,row+2*col); \
+        psImageClip(img3,32.0,32.0,120.0,120.0); \
+        img4 = psImageCopy(img4,img3,PS_TYPE_##TYP); \
+        remove(filename); \
+        if (! psImageWriteSection(img3,0,0,1,NULL,0,filename)) { \
+            psError(PS_ERR_UNKNOWN, true,"Failed to write test image %s",filename); \
+            return 1; \
+        } \
+        if (! psImageWriteSection(img,0,0,0,NULL,0,filename)) { \
+            psError(PS_ERR_UNKNOWN, true,"Failed to write test image %s",filename); \
+            return 2; \
+        } \
+        if (! psImageWriteSection(img,0,0,1,NULL,1,filename)) { \
+            psError(PS_ERR_UNKNOWN, true,"Failed to write test image %s",filename); \
+            return 3; \
+        } \
+        if (! psImageWriteSection(img3,0,0,0,NULL,1,filename)) { \
+            psError(PS_ERR_UNKNOWN, true,"Failed to write test image %s",filename); \
+            return 4; \
+        } \
+        psFree(img); \
+        img = NULL; \
+        /*        img_ref = img = psImageAlloc(2,2,PS_TYPE_F32); */ \
+        psFree(img3); \
+        img3 = NULL; \
+        img = psImageReadSection(img,readM0,readN0,readM,readN,0,NULL,0,filename); \
+        /*        if (img_ref != img) { */ \
+        /*            psError(PS_ERR_UNKNOWN, true,"psImageReadSection didn't recycle the psImage?"); */ \
+        /*            return 5; */ \
+        /*        } */ \
+        img3 = psImageReadSection(img3,readM0,readN0,readM,readN,1,NULL,0,filename); \
+        if (img3 == NULL) { \
+            psError(PS_ERR_UNKNOWN, true,"Failed to read test image %s",filename); \
+            return 6; \
+        } \
+        for (psU32 row = readN0; row < readN; row++) { \
+            ps##TYP* imgRow = img->data.TYP[row-readN0]; \
+            ps##TYP* img2Row = img2->data.TYP[row]; \
+            ps##TYP* img3Row = img3->data.TYP[row-readN0]; \
+            ps##TYP* img4Row = img4->data.TYP[row]; \
+            for (psU32 col = readM0; col < readM; col++) { \
+                if (fabsf(imgRow[col-readM0]-img2Row[col]) > FLT_EPSILON) { \
+                    psError(PS_ERR_UNKNOWN, true,"Image changed in I/O operation at %d,%d,0 (%.2f vs %.2f) for %s", \
+                            col,row,(psF32)imgRow[col-readM0],(psF32)img2Row[col],filename); \
+                    return 7; \
+                } \
+                if (fabsf(img3Row[col-readM0]-img4Row[col]) > FLT_EPSILON) { \
+                    psError(PS_ERR_UNKNOWN, true,"Image changed in I/O operation at %d,%d,1 (%.2f vs %.2f) for %s", \
+                            col,row,(psF32)img3Row[col-readM0],(psF32)img4Row[col],filename); \
+                    return 8; \
+                } \
+            } \
+        } \
+        psFree(img); \
+        img = NULL; \
+        psFree(img3); \
+        img3 = NULL; \
+        img3 = psImageReadSection(img3,readM0,readN0,readM,readN,0,NULL,1,filename); \
+        img = psImageReadSection(img,readM0,readN0,readM,readN,1,NULL,1,filename); \
+        if (img == NULL) { \
+            psError(PS_ERR_UNKNOWN, true,"Failed to read test image %s",filename); \
+            return 9; \
+        } \
+        for (psU32 row = readN0; row < readN; row++) { \
+            ps##TYP* imgRow = img->data.TYP[row-readN0]; \
+            ps##TYP* img2Row = img2->data.TYP[row]; \
+            ps##TYP* img3Row = img3->data.TYP[row-readN0]; \
+            ps##TYP* img4Row = img4->data.TYP[row]; \
+            for (psU32 col = readM0; col < readM; col++) { \
+                if (fabsf(imgRow[col-readM0]-img2Row[col]) > FLT_EPSILON) { \
+                    psError(PS_ERR_UNKNOWN, true,"Image changed in I/O operation at %d,%d,0 (%.2f vs %.2f) for %s", \
+                            col,row,(psF32)imgRow[col-readM0],(psF32)img2Row[col],filename); \
+                    return 10; \
+                } \
+                if (fabsf(img3Row[col-readM0]-img4Row[col]) > FLT_EPSILON) { \
+                    psError(PS_ERR_UNKNOWN, true,"Image changed in I/O operation at %d,%d,1 (%.2f vs %.2f) for %s", \
+                            col,row,(psF32)img3Row[col-readM0],(psF32)img4Row[col],filename); \
+                    return 11; \
+                } \
+            } \
+        } \
+        psFree(img); \
+        psFree(img2); \
+        psFree(img3); \
+        psFree(img4); \
+    }
+
+    #define testReadType(TYP,filename) \
+    mkdir("tmpImages",0777); \
+    testReadTypeSize(1,1,0,0,1,1,TYP,"tmpImages/1x1_" filename); \
+    testReadTypeSize(M,1,M/4,0,M/2,1,TYP,"tmpImages/Mx1_" filename); \
+    testReadTypeSize(1,N,0,N/4,1,N/2,TYP,"tmpImages/1xN_" filename); \
+    testReadTypeSize(M,N,M/4,N/4,M/2,N/2,TYP,"tmpImages/MxN_" filename);
+
+    testReadType(U8,"U8.fits");
+    //    testReadType(S8,"S8.fits");   Not a requirement
+    testReadType(S16,"S16.fits");
+    //    testReadType(U16,"U16.fits"); Not a requirement
+    testReadType(S32,"S32.fits");
+    //    testReadType(U32,"U32.fits"); Not a requirement
+    testReadType(F32,"F32.fits");
+    testReadType(F64,"F64.fits");
+
+    /*
+    Verify the returned psImage structure pointer is null, error log message is
+    generated and program execution doesn't stop, if input parameter filename
+    specifies a file that doesn't exist.
+    */
+
+    psLogMsg(__func__,PS_LOG_INFO,"Following should be an error as file doesn't exist.");
+    image = psImageReadSection(image,0,0,M,N,0,NULL,0,"foobar.fits");
+    if (image != NULL) {
+        psError(PS_ERR_UNKNOWN, true,"Image returned though filename did not exist.");
+        return 12;
+    }
+
+    /*
+    Verify the returned psImage structure pointer is null, error log message is
+    generatedand program execution doesn't stop, if input parameter filename
+    is null.Verify the returned psImage structurepointer is null, error log
+    message is generated and program execution doesn't stop, if input
+    parameters col,row, ncol, nrow and/or z specify a data range which is not
+    within the data range of the FITS file.
+    */
+
+    psLogMsg(__func__,PS_LOG_INFO,"Following should be an error as filename is NULL.");
+    image = psImageReadSection(image,0,0,M,N,0,NULL,0,NULL);
+    if (image != NULL) {
+        psError(PS_ERR_UNKNOWN, true,"Image returned though filename was NULL.");
+        return 13;
+    }
+
+    /*
+    Verify the returned psImage structure pointer is null, error log message is
+    generated and program execution doesn't stop,if input parameters extname
+    and/or extnum specify an extension which is not valid in the FITS file.
+    */
+
+    psLogMsg(__func__,PS_LOG_INFO,"Following should be an error as extnum is invalid.");
+    image = psImageReadSection(image,0,0,M,N,0,NULL,4,"tmpImages/MxN_F32.fits");
+    if (image != NULL) {
+        psError(PS_ERR_UNKNOWN, true,"Image returned though extnum was invalid.");
+        return 14;
+    }
+    psLogMsg(__func__,PS_LOG_INFO,"Following should be an error as extname is invalid.");
+    image = psImageReadSection(image,0,0,M,N,0,"bogus",0,"tmpImages/MxN_F32.fits");
+    if (image != NULL) {
+        psError(PS_ERR_UNKNOWN, true,"Image returned though extnum was invalid.");
+        return 15;
+    }
+
+    /*
+    Verify the returned psImage structure pointer is null, error log message is
+    generated and program execution doesn't stop,if input parameter filename
+    specifies a FITS file that is zero or one dimensional.
+
+    XXX
+    N.B: since I can't write anything but 2 or 3 dimensional image, I can't
+    do this programatically at this time.  I verified that this functionality
+    exists in the source code via inspection. (line 101 in psImageIO.c for v1.3)
+    -rdd
+    */
+
+    return 0;
+}
+
+psS32 testImageWrite(void)
+{
+    psImage* img = NULL;
+    psImage* img2 = NULL;
+    psS32 m = 64;
+    psS32 n = 96;
+
+    /*
+    This function shall write the specified section within a psImage structure
+    to a FITS file. If the specifiedfile exists, then data should overwrite the
+    section to write. If the specified file doesn't exist, it shall be created.
+    If an extenstion is specified, then a basic primary header data unit shall
+    be created.
+    */
+
+    /*
+    Verify a FITS file named filename is generated and contains expected
+    values, if the input parameter input contains known data values, input
+    parameters col, row, ncol, nrow specify a valid data region within psImage
+    structure.
+
+    Verify a FITS file named filename is generated and contains a primary
+    header data unit with extension with expected values, if the input
+    parameter input contains known data values, input parameters col, row,
+    ncol, nrow specify a valid data region within psImage structure and
+    extname and/or extnum specify an extenstion to write.
+
+    N.B. : these are done in testImageRead tests, see above.
+    */
+
+    /*
+    Verify a FITS file named filename is overwritten and contains
+    expected values, if the input parameter input contains known data values,
+    input parameters col, row, ncol, nrow specify a valid data region within
+    psImage structure.
+    */
+
+    GENIMAGE(img,m,n,F32,0);
+    GENIMAGE(img2,m,n,F32,row+2*col);
+    mkdir("tmpImages",0777);
+    remove
+        ("writeTest.fits")
+        ;
+    if (! psImageWriteSection(img,0,0,0,NULL,0,"tmpImages/writeTest.fits")) {
+        psError(PS_ERR_UNKNOWN, true,"Couldn't write writeTest.fits.");
+        return 14;
+    }
+    if (! psImageWriteSection(img2,0,0,0,NULL,0,"tmpImages/writeTest.fits")) {
+        psError(PS_ERR_UNKNOWN, true,"Couldn't overwrite writeTest.fits.");
+        return 15;
+    }
+    psFree(img);
+    psFree(img2);
+
+    // Did it really overwrite the pixel values?  Let's read it in and see.
+    img = psImageReadSection(NULL,0,0,m,n,0,NULL,0,"tmpImages/writeTest.fits");
+    if (img == NULL) {
+        psError(PS_ERR_UNKNOWN, true,"Could not read in writeTest.fits.");
+        return 16;
+    }
+    for (psU32 row=0;row<n;row++) {
+        psF32* imgRow = img->data.F32[row];
+        for (psU32 col=0;col<m;col++) {
+            if (fabsf(imgRow[col] - (row+2*col)) > FLT_EPSILON) {
+                psError(PS_ERR_UNKNOWN, true,"The image values were not overwritten at %d,%d (%.2f vs %.2f)",
+                        col,row,imgRow[col],(row+2*col));
+                return 17;
+            }
+        }
+    }
+
+    psFree(img);
+
+    /*
+    Verify false is returned and program execution is not stopped, if the input image
+    is null.
+    */
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message because input image is null.");
+    if ( psImageWriteSection(NULL,0,0,0,NULL,0,"tmpImages/writeTest.fits")) {
+        psError(PS_ERR_UNKNOWN, true,"psImageWriteSection did not return false when input image is NULL.");
+        return 20;
+    }
+
+    /*
+    Verify error message generated when invalid path specified for output file.
+    */
+    psLogMsg(__func__,PS_LOG_INFO,"Following should be an error for passing invalid image type.");
+    GENIMAGE(img,32,32,U8,row+2*col);
+    if ( psImageWriteSection(img,0,0,0,NULL,0,"panstarrs/writeFits.fits")) {
+        psError(PS_ERR_UNKNOWN, true,"psImageWriteSection did not return false for invalid path name.");
+        return 22;
+    }
+
+    /*
+    Verify error message generated when an invalid FITs file is specified
+    */
+    FILE *fileptr = fopen("tmpImages/writeInvalidFile.fits","w");
+    fprintf(fileptr," ");
+    fclose(fileptr);
+    psLogMsg(__func__,PS_LOG_INFO,"Following should be an error for passing invalid FITS file.");
+    if ( psImageWriteSection(img,0,0,0,NULL,0,"tmpImages/writeInvalidFile.fits")) {
+        psError(PS_ERR_UNKNOWN, true,"psImageWriteSection did not return false for invalid FITS file.");
+        return 22;
+    }
+    remove
+        ("tmpImages/writeInvalidFile.fits");
+
+    /*
+    Verify error message when invalid extension name is provided
+    */
+    psLogMsg(__func__,PS_LOG_INFO,"Following should be an error for invalid extension name.");
+    if ( psImageWriteSection(img,0,0,0,"ext2",0,"tmpImages/writeTest.fits")) {
+        psError(PS_ERR_UNKNOWN, true,"psImageWriteSection did not return false for invalid extension name.");
+        return 23;
+    }
+
+    /*
+    Verified error message when invalid extension number is provided
+    */
+    psLogMsg(__func__,PS_LOG_INFO,"Following should be an error for invalid extension number.");
+    if ( psImageWriteSection(img,0,0,0,NULL,99,"tmpImages/writeTest.fits")) {
+        psError(PS_ERR_UNKNOWN, true,"psImageWriteSection did not return false for invalid extension number.");
+        return 24;
+    }
+
+    psFree(img);
+
+    return 0;
+}
Index: /tags/ipp-1-X/bug123/psLib/test/image/tst_psImageInterpolate.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/image/tst_psImageInterpolate.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/image/tst_psImageInterpolate.c	(revision 22331)
@@ -0,0 +1,282 @@
+/** @file tst_psImageInterpolate.c
+ *
+ * @brief Contains the tests for psImagePixelInterpolate
+ *
+ * @author Eric Van Alst, MHPCC
+ *
+ * @version $Revision: 1.6 $
+ *          $Name: not supported by cvs2svn $
+ * @date $Date: 2005-04-07 20:27:42 $
+ *
+ * Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ *
+ */
+
+#include "psTest.h"
+#include "pslib_strict.h"
+
+#define GENIMAGE(img,c,r,TYP,valueFcn) \
+img = psImageAlloc(c,r,PS_TYPE_##TYP); \
+for(psU32 row=0; row<r; row++) { \
+    ps##TYP* imgRow = img->data.TYP[row]; \
+    for(psU32 col=0; col<c; col++) { \
+        imgRow[col] = (ps##TYP)(valueFcn); \
+    } \
+}
+
+#define CHECK_INTERP_VALUE(img,x,y,mask,maskval,exposed,TYPE,expected) \
+val = (psF32)psImagePixelInterpolate(img,x,y,mask,maskval,exposed,PS_INTERPOLATE_##TYPE); \
+printf("returned = %.2f    expected = %.2f\n",val,expected); \
+if(fabsf(val-expected)>FLT_EPSILON) { \
+    psError(PS_ERR_UNKNOWN,true,"Return value is not as expected."); \
+    return 1; \
+}
+
+#define CHECK_INTERP_BY_TYPE(TYPE) \
+GENIMAGE(img1,10,10,TYPE,row+col) \
+CHECK_INTERP_VALUE(img1,1.9,1.6,NULL,0,0,FLAT,2.0) \
+CHECK_INTERP_VALUE(img1,4.0,2.0,NULL,0,0,BILINEAR,5.0) \
+psFree(img1);
+
+static psS32 testInterpolateFlatBilinear(void);
+static psS32 testInterpolateError(void);
+static psS32 testInterpolateMaskFlatBilinear(void);
+static psS32 testInterpolate1D(void);
+
+testDescription tests[] = {
+                              {testInterpolateFlatBilinear,999,"psImagePixelInterpolate",0,false},
+                              {testInterpolateError,999,"psImagePixelInterpolate",0,false},
+                              {testInterpolateMaskFlatBilinear,999,"psImagePixelInterpolate",0,false},
+                              {testInterpolate1D,999,"psImagePixelInterpolate",0,false},
+                              {NULL}
+                          };
+
+psS32 main(psS32 argc, char* argv[])
+{
+    psLogSetLevel(PS_LOG_INFO);
+
+    if ( !runTestSuite(stderr,"psImagePixelInterpolate",tests,argc,argv) ) {
+        return 1;
+    } else {
+        return 0;
+    }
+}
+
+psS32 testInterpolateFlatBilinear(void)
+{
+    psImage* img1;
+    psF32 val = 0;
+
+    // Perform simple(four neighbor) FLAT interpolation for all types
+    // Perform bilinear interpolation for all types
+    CHECK_INTERP_BY_TYPE(S8)
+    CHECK_INTERP_BY_TYPE(S16)
+    CHECK_INTERP_BY_TYPE(S32)
+    CHECK_INTERP_BY_TYPE(S64)
+    CHECK_INTERP_BY_TYPE(U8)
+    CHECK_INTERP_BY_TYPE(U16)
+    CHECK_INTERP_BY_TYPE(U32)
+    CHECK_INTERP_BY_TYPE(U64)
+    CHECK_INTERP_BY_TYPE(F32)
+    CHECK_INTERP_BY_TYPE(F64)
+    CHECK_INTERP_BY_TYPE(C32)
+    CHECK_INTERP_BY_TYPE(C64)
+
+    return 0;
+}
+
+psS32 testInterpolateError(void)
+{
+    psF32 val = 0;
+    psImage* img1 = NULL;
+
+    // Perform interpolation with NULL input image and verify return and error message
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message");
+    val = psImagePixelInterpolate(img1,1.2,1.2,NULL,0,5.0,PS_INTERPOLATE_FLAT);
+    if(val != 5.0) {
+        psError(PS_ERR_UNKNOWN,true,"Did not return the unexposed value");
+        return 10;
+    }
+
+    // Perform interpolation with invalid input image type
+    img1 = psImageAlloc(10,10,PS_TYPE_BOOL);
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message");
+    val = psImagePixelInterpolate(img1,1.2,1.2,NULL,0,10.0,PS_INTERPOLATE_FLAT);
+    if(val != 10.0) {
+        psError(PS_ERR_UNKNOWN,true,"Did not return the unexposed value");
+        return 11;
+    }
+
+    // Perform interpolation with invalid method
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error message");
+    val = psImagePixelInterpolate(img1,1.2,1.2,NULL,0,10.0,PS_INTERPOLATE_BILINEAR+1);
+    if(val != 10.0) {
+        psError(PS_ERR_UNKNOWN,true,"Did not return the unexposed value");
+        return 12;
+    }
+
+    psFree(img1);
+
+    return 0;
+}
+
+// The following assumptions about the test image are:
+//
+//                     col
+//             0   1   2   3   4   5   6   7  ...
+//
+// row 0       0   1   2   3   4   5   6   7
+// row 1       1   2   3   4   5   6   7   8
+// row 2       2   3   4   5   6   7   8   9
+// ...
+
+psS32 testInterpolateMaskFlatBilinear(void)
+{
+    psImage* img1 = NULL;
+    psImage* msk1 = NULL;
+    psF32 val = 0;
+
+    // Perform interpolate with mask and mask value set at nearest pixel to verify
+    // the unexposed value is return
+    GENIMAGE(img1,10,10,F32,row+col)
+    GENIMAGE(msk1,10,10,U8,0)
+    msk1->data.U8[1][1] = 1;
+    CHECK_INTERP_VALUE(img1,1.9,1.6,msk1,1,10.0,FLAT,10.0)
+    psFree(msk1);
+    psFree(img1);
+
+    // Perform interpolate with mask and one mask value for bilinear (upper left pixel)
+    GENIMAGE(img1,10,10,F32,row+col)
+    GENIMAGE(msk1,10,10,U8,0)
+    msk1->data.U8[1][3] = 1;
+    CHECK_INTERP_VALUE(img1,4.0,2.0,msk1,1,0,BILINEAR,5.25)
+    psFree(msk1);
+    psFree(img1);
+
+    // Perform interpolate with mask and one mask value for bilinear (upper right pixel)
+    GENIMAGE(img1,10,10,F32,row+col)
+    GENIMAGE(msk1,10,10,U8,0)
+    msk1->data.U8[1][4] = 1;
+    CHECK_INTERP_VALUE(img1,4.0,2.0,msk1,1,0,BILINEAR,4.75)
+    psFree(msk1);
+    psFree(img1);
+
+    // Perform interpolate with mask and one mask value for bilinear (lower left pixel)
+    GENIMAGE(img1,10,10,F32,row+col)
+    GENIMAGE(msk1,10,10,U8,0)
+    msk1->data.U8[2][3] = 1;
+    CHECK_INTERP_VALUE(img1,4.0,2.0,msk1,1,0,BILINEAR,5.25)
+    psFree(msk1);
+    psFree(img1);
+
+    // Perform interpolate with mask and one mask value for bilinear (lower right pixel)
+    GENIMAGE(img1,10,10,F32,row+col)
+    GENIMAGE(msk1,10,10,U8,0)
+    msk1->data.U8[2][4] = 1;
+    CHECK_INTERP_VALUE(img1,4.0,2.0,msk1,1,0,BILINEAR,4.75)
+    psFree(msk1);
+    psFree(img1);
+
+    // Perform interpolate with mask and one mask value for bilinear (upper pixels)
+    GENIMAGE(img1,10,10,F32,row+col)
+    GENIMAGE(msk1,10,10,U8,0)
+    msk1->data.U8[1][3] = 1;
+    msk1->data.U8[1][4] = 1;
+    CHECK_INTERP_VALUE(img1,4.0,2.0,msk1,1,0,BILINEAR,5.5)
+    psFree(msk1);
+    psFree(img1);
+
+    // Perform interpolate with mask and one mask value for bilinear (lower pixels)
+    GENIMAGE(img1,10,10,F32,row+col)
+    GENIMAGE(msk1,10,10,U8,0)
+    msk1->data.U8[2][3] = 1;
+    msk1->data.U8[2][4] = 1;
+    CHECK_INTERP_VALUE(img1,4.0,2.0,msk1,1,0,BILINEAR,4.5)
+    psFree(msk1);
+    psFree(img1);
+
+    // Perform interpolate with mask and one mask value for bilinear (left pixels)
+    GENIMAGE(img1,10,10,F32,row+col)
+    GENIMAGE(msk1,10,10,U8,0)
+    msk1->data.U8[1][3] = 1;
+    msk1->data.U8[2][3] = 1;
+    CHECK_INTERP_VALUE(img1,4.0,2.0,msk1,1,0,BILINEAR,5.5)
+    psFree(msk1);
+    psFree(img1);
+
+    // Perform interpolate with mask and one mask value for bilinear (right pixels)
+    GENIMAGE(img1,10,10,F32,row+col)
+    GENIMAGE(msk1,10,10,U8,0)
+    msk1->data.U8[1][4] = 1;
+    msk1->data.U8[2][4] = 1;
+    CHECK_INTERP_VALUE(img1,4.0,2.0,msk1,1,0,BILINEAR,4.5)
+    psFree(msk1);
+    psFree(img1);
+
+    // Perform interpolate with mask only one valid pixel (upper left)
+    GENIMAGE(img1,10,10,F32,row+col)
+    GENIMAGE(msk1,10,10,U8,0)
+    msk1->data.U8[1][4] = 1;
+    msk1->data.U8[2][3] = 1;
+    msk1->data.U8[2][4] = 1;
+    CHECK_INTERP_VALUE(img1,4.0,2.0,msk1,1,0,BILINEAR,4.0)
+    psFree(msk1);
+    psFree(img1);
+
+    // Perform interpolate with mask only one valid pixel (upper right)
+    GENIMAGE(img1,10,10,F32,row+col)
+    GENIMAGE(msk1,10,10,U8,0)
+    msk1->data.U8[1][3] = 1;
+    msk1->data.U8[2][3] = 1;
+    msk1->data.U8[2][4] = 1;
+    CHECK_INTERP_VALUE(img1,4.0,2.0,msk1,1,0,BILINEAR,5.0)
+    psFree(msk1);
+    psFree(img1);
+
+    // Perform interpolate with mask only one valid pixel (lower left)
+    GENIMAGE(img1,10,10,F32,row+col)
+    GENIMAGE(msk1,10,10,U8,0)
+    msk1->data.U8[1][3] = 1;
+    msk1->data.U8[1][4] = 1;
+    msk1->data.U8[2][4] = 1;
+    CHECK_INTERP_VALUE(img1,4.0,2.0,msk1,1,0,BILINEAR,5.0)
+    psFree(msk1);
+    psFree(img1);
+
+    // Perform interpolate with mask only one valid pixel (lower right)
+    GENIMAGE(img1,10,10,F32,row+col)
+    GENIMAGE(msk1,10,10,U8,0)
+    msk1->data.U8[1][3] = 1;
+    msk1->data.U8[1][4] = 1;
+    msk1->data.U8[2][3] = 1;
+    CHECK_INTERP_VALUE(img1,4.0,2.0,msk1,1,0,BILINEAR,6.0)
+    psFree(msk1);
+    psFree(img1);
+
+    // Perform interpolate with mask no valid pixels
+    GENIMAGE(img1,10,10,F32,row+col)
+    GENIMAGE(msk1,10,10,U8,0)
+    msk1->data.U8[1][3] = 1;
+    msk1->data.U8[1][4] = 1;
+    msk1->data.U8[2][3] = 1;
+    msk1->data.U8[2][4] = 1;
+    CHECK_INTERP_VALUE(img1,4.0,2.0,msk1,1,0,BILINEAR,0.0)
+    psFree(msk1);
+    psFree(img1);
+    return 0;
+}
+
+// Perform interpolation for a 1D image
+psS32 testInterpolate1D(void)
+{
+    psImage* img1 = NULL;
+    psF32 val = 0;
+
+    GENIMAGE(img1,10,1,F32,row+col)
+    CHECK_INTERP_VALUE(img1,4.0,0.0,NULL,0,100.0,BILINEAR,3.5)
+
+    psFree(img1);
+
+    return 0;
+}
+
Index: /tags/ipp-1-X/bug123/psLib/test/image/tst_psImageManip.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/image/tst_psImageManip.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/image/tst_psImageManip.c	(revision 22331)
@@ -0,0 +1,1810 @@
+/** @file  tst_psImageManip.c
+ *
+ *  @brief Contains the tests for psImageManip.[ch]
+ *
+ *
+ *  @author Robert DeSonia, MHPCC
+ *
+ *  @version $Revision: 1.41 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2005-04-07 20:27:42 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+
+
+#include <math.h>
+#include <float.h>
+#include <string.h>
+#include <stdlib.h>
+#include <string.h>                    // for memset
+#include <sys/stat.h>
+#include <sys/types.h>
+
+#include "psTest.h"
+#include "pslib_strict.h"
+#include "psType.h"
+
+static psS32 testImageClip(void);
+static psS32 testImageClipNAN(void);
+static psS32 testImageClipComplexRegion(void);
+static psS32 testImageOverlay(void);
+static psS32 testImageRebin(void);
+static psS32 testImageRoll(void);
+static psS32 testImageRotate(void);
+static psS32 testImageShift(void);
+static psS32 testImageShiftCase(psS32 cols, psS32 rows, float colShift,float rowShift);
+static psS32 testImageResample(void);
+
+testDescription tests[] = {
+                              {testImageClip,571,"psImageClip",0,false},
+                              {testImageClipNAN,572,"psImageClipNAN",0,false},
+                              {testImageClipComplexRegion,673,"psImageClipComplexRegion",0,false},
+                              {testImageOverlay,573,"psImageOverlay",0,false},
+                              {testImageRebin,559,"psImageRebin",0,false},
+                              {testImageRoll,562,"psImageRoll",0,false},
+                              {testImageRotate,560,"psImageRotate",0,false},
+                              {testImageShift,561,"psImageShift",0,false},
+                              {testImageResample,743,"psImageResample",0,false},
+                              {NULL}
+                          };
+
+psS32 main(psS32 argc, char* argv[])
+{
+    psLogSetLevel(PS_LOG_INFO);
+
+    return ! runTestSuite(stderr,"psImage",tests,argc,argv);
+}
+
+
+psS32 testImageClip(void)
+{
+    psImage* img = NULL;
+    psU32 c = 128;
+    psU32 r = 256;
+    psF64 min;
+    psF64 max;
+    psS32 numClipped = 0;
+    psS32 retVal;
+
+    psLogMsg(__func__,PS_LOG_INFO,
+             "psImageClip shall limit the minimum and maximum data value within a psImage structure");
+
+    /*
+
+        psImageClip shall limit the minimum and maximum data value within a
+        psImage structure to a specified min and max value.
+
+        Verify the returned integer is equal to the number of pixels clipped,
+        if the input psImage structure contains known values and input parameters
+        min and max have know values.
+
+        Verify the psImage structure specified by the input parameter input is
+        modified to contain the expected values, if the input psImage structure
+        contains known values, min and max are specified and vmin and vmax
+        parameters are known.
+
+        Verify the retuned integer is zero, psImage structure input is unmodified
+        and program executions doesn't stop, if input parameter psImage structure
+        pointer is null.
+
+        Verify the retuned integer is zero, psImage structure input is unmodified
+        and program executions doesn't stop, if input parameter min is larger than max.
+    */
+
+    // create image
+    #define testImageClipByType(datatype) \
+    img = psImageAlloc(c,r,PS_TYPE_##datatype); \
+    for (psU32 row=0;row<r;row++) { \
+        ps##datatype* imgRow = img->data.datatype[row]; \
+        for (psU32 col=0;col<c;col++) { \
+            imgRow[col] = (ps##datatype)(row+col); \
+        } \
+    } \
+    min = (psF64)r/2.0; \
+    max = (psF64)r; \
+    \
+    retVal = psImageClip(img,min,(double)PS_MIN_##datatype,max,(double)PS_MAX_##datatype); \
+    \
+    numClipped = 0; \
+    for (psU32 row=0;row<r;row++) { \
+        ps##datatype* imgRow = img->data.datatype[row]; \
+        for (psU32 col=0;col<c;col++) { \
+            ps##datatype value = (ps##datatype)(row+col); \
+            if (value < min) { \
+                numClipped++; \
+                value = PS_MIN_##datatype; \
+            } else if (value > max) { \
+                numClipped++; \
+                value = PS_MAX_##datatype; \
+            } \
+            if (fabsf(imgRow[col]-value) > FLT_EPSILON) { \
+                psError(PS_ERR_UNKNOWN, true,"Pixel value is not as expected (%g vs %g) at %u,%u", \
+                        (psF64)imgRow[col],(psF64)value,col,row); \
+                return 1; \
+            } \
+        } \
+    } \
+    if (retVal != numClipped) { \
+        psError(PS_ERR_UNKNOWN, true,"Expected %d clips, but got %d", \
+                numClipped,retVal); \
+        return 2; \
+    } \
+    psFree(img);
+
+    #define testImageClipByComplexType(datatype) \
+    img = psImageAlloc(c,r,PS_TYPE_##datatype); \
+    for (psU32 row=0;row<r;row++) { \
+        ps##datatype* imgRow = img->data.datatype[row]; \
+        for (psU32 col=0;col<c;col++) { \
+            imgRow[col] = (ps##datatype)(row+I*col); \
+        } \
+    } \
+    min = (float)r/2.0f; \
+    max = (float)r; \
+    \
+    retVal = psImageClip(img,min,-1.0f,max,-2.0f); \
+    \
+    numClipped = 0; \
+    for (psU32 row=0;row<r;row++) { \
+        ps##datatype* imgRow = img->data.datatype[row]; \
+        for (psU32 col=0;col<c;col++) { \
+            ps##datatype value = row+I*col; \
+            if (cabs(value) < min) { \
+                numClipped++; \
+                value = -1.0f; \
+            } else if (cabs(value) > max) { \
+                numClipped++; \
+                value = -2.0f; \
+            } \
+            if (fabsf(creal(imgRow[col])-creal(value)) > FLT_EPSILON || \
+                    fabsf(cimag(imgRow[col])-cimag(value)) > FLT_EPSILON) { \
+                psError(PS_ERR_UNKNOWN, true,"Pixel value is not as expected (%.2f+%.2fi vs %.2f+%.2fi) at %u,%u", \
+                        creal(imgRow[col]),cimag(imgRow[col]),creal(value),cimag(value),col,row); \
+                return 1; \
+            } \
+        } \
+    } \
+    if (retVal != numClipped) { \
+        psError(PS_ERR_UNKNOWN, true,"Expected %d clips, but got %d", \
+                numClipped,retVal); \
+        return 2; \
+    } \
+    psFree(img);
+
+    psLogMsg(__func__,PS_LOG_INFO,"Testing clipping of F64 imagery");
+    testImageClipByType(F64);
+    psLogMsg(__func__,PS_LOG_INFO,"Testing clipping of F32 imagery");
+    testImageClipByType(F32);
+    psLogMsg(__func__,PS_LOG_INFO,"Testing clipping of S32 imagery");
+    testImageClipByType(S32);
+    psLogMsg(__func__,PS_LOG_INFO,"Testing clipping of S16 imagery");
+    testImageClipByType(S16);
+    psLogMsg(__func__,PS_LOG_INFO,"Testing clipping of S8 imagery");
+    testImageClipByType(S8);
+    //    psLogMsg(__func__,PS_LOG_INFO,"Testing clipping of U32 imagery");
+    //    testImageClipByType(U32);
+    psLogMsg(__func__,PS_LOG_INFO,"Testing clipping of U16 imagery");
+    testImageClipByType(U16);
+    psLogMsg(__func__,PS_LOG_INFO,"Testing clipping of U8 imagery");
+    testImageClipByType(U8);
+    psLogMsg(__func__,PS_LOG_INFO,"Testing clipping of C32 imagery");
+    testImageClipByComplexType(C32);
+    psLogMsg(__func__,PS_LOG_INFO,"Testing clipping of C64 imagery");
+    testImageClipByComplexType(C64);
+
+    // Verify the retuned integer is zero, psImage structure input is unmodified
+    // and program executions doesn't stop, if input parameter psImage structure
+    // pointer is null.
+    retVal = psImageClip(NULL,min,-1.0f,max,-2.0f);
+    if (retVal != 0) {
+        psError(PS_ERR_UNKNOWN, true,"Expected zero return for clips of a NULL image.");
+        return 3;
+    }
+
+    // Verify the retuned integer is zero, psImage structure input is unmodified
+    // and program executions doesn't stop, if input parameter min is larger than max.
+    psLogMsg(__func__,PS_LOG_INFO,"Following should be an error (max<min)");
+    retVal = psImageClip(img,max,-1.0f,min,-2.0f);
+    if (retVal != 0) {
+        psError(PS_ERR_UNKNOWN, true,"Expected zero return for clips when max < min.");
+        return 4;
+    }
+
+    return 0;
+}
+
+psS32 testImageClipNAN(void)
+{
+    psImage* img = NULL;
+    psU32 c = 128;
+    psU32 r = 256;
+    psS32 numClipped = 0;
+    psS32 retVal;
+
+    psLogMsg(__func__,PS_LOG_INFO,
+             "psImageClipNaN shall modified pixel values of NaN with a specified value");
+
+    /*
+        psImageClipNaN shall modify a psImage structure with pixel values set
+        to NaN to a value specified as an input parameter.
+
+        Verify the returned integer is equal to the number of pixels modified
+        and the psImage is modified at locations where NaN pixels where
+        located to the value specified in the input parameter value.
+
+        Verify the returned integer is zero and program execution doesn't stop,
+        if the input parameter psImage structure pointer is null.
+    */
+
+    // create image
+    #define testImageClipNaNByType(datatype) \
+    img = psImageAlloc(c,r,PS_TYPE_##datatype); \
+    for (unsigned row=0;row<r;row++) { \
+        ps##datatype* imgRow = img->data.datatype[row]; \
+        for (unsigned col=0;col<c;col++) { \
+            if (row == col) { \
+                imgRow[col] = NAN; \
+            } else if (row+1 == col) { \
+                imgRow[col] = INFINITY; \
+            } else { \
+                imgRow[col] = (ps##datatype)(row+col); \
+            } \
+        } \
+    } \
+    \
+    retVal = psImageClipNaN(img,-1.0f); \
+    \
+    numClipped = 0; \
+    for (unsigned row=0;row<r;row++) { \
+        ps##datatype* imgRow = img->data.datatype[row]; \
+        for (unsigned col=0;col<c;col++) { \
+            ps##datatype value = (ps##datatype)(row+col); \
+            if ( (row == col) || (row+1 == col) ) { \
+                numClipped++; \
+                value = -1.0; \
+            } \
+            if (fabsf(imgRow[col]-value) > FLT_EPSILON) { \
+                psError(PS_ERR_UNKNOWN, true,"Pixel value is not as expected (%f vs %f) at %d,%d", \
+                        imgRow[col],value,col,row); \
+                return 1; \
+            } \
+        } \
+    } \
+    if (retVal != numClipped) { \
+        psError(PS_ERR_UNKNOWN, true,"Expected %d clips, but got %d", \
+                numClipped,retVal); \
+        return 2; \
+    } \
+    psFree(img);
+
+    testImageClipNaNByType(F32);
+    testImageClipNaNByType(F64);
+    testImageClipNaNByType(C32);
+    testImageClipNaNByType(C64);
+
+    // Verify the retuned integer is zero, psImage structure input is unmodified
+    // and program executions doesn't stop, if input parameter psImage structure
+    // pointer is null.
+    retVal = psImageClipNaN(NULL,-1.0f);
+    if (retVal != 0) {
+        psError(PS_ERR_UNKNOWN, true,"Expected zero return for clips of a NULL image.");
+        return 3;
+    }
+
+    // Verify program execution doesn't stop if the input image type is something
+    // other than F32, F64, C32, C64.
+    img = psImageAlloc(c,r,PS_TYPE_S32);
+    psLogMsg(__func__,PS_LOG_INFO,"Following should be an error (invalid type)");
+    retVal = psImageClipNaN(img,2.0f);
+    if (retVal != 0) {
+        psError(PS_ERR_UNKNOWN, true,"Expected zero return for clip of invalid image type.");
+        return 4;
+    }
+    psFree(img);
+
+    return 0;
+}
+
+psS32 testImageClipComplexRegion(void)
+{
+    psImage* img = NULL;
+    psU32 c = 1024;
+    psU32 r = 2048;
+    psS32 numClipped = 0;
+    psS32 retVal;
+
+    psLogMsg(__func__,PS_LOG_INFO,
+             "psImageClipNaN shall modified pixel values of NaN with a specified value");
+
+    /*
+    1. Create a complex image with a wide range of complex values
+
+    2. call psImageClipComplexRegion with min and max where there is at least
+       2 pixels in the image above) that is:
+        a) real(p) < real(min) && complex(p) < complex(min),
+        b) real(p) < real(min) && complex(min) < complex(p) < complex(max)
+        c) real(min) < real(p) < real(max) && complex(p) < complex(min)
+        d) real(min) < real(p) < real(max) && complex(min) < complex(p) < complex(max)
+        e) real(p) > real(max) && complex(min) < complex(p) < complex(max)
+        f) real(pmin) < real(p) < real(max) && complex(p) > complex(max)
+        g) real(p) > real(max) && complex(p) > complex(max)
+        h) real(p) < real(min) && complex(p) > complex(max)
+        i) real(p) > real(max) && complex(p) < complex(min)
+
+    3. verify that All pixels in case (a), (b), and (c) have the value vmin
+
+    4. verify that all pixels in case (d) are unchanged from input
+
+    5. verify that all pixels in case (e), (f), (g), (h), and (i) have the
+       value vmax
+
+    */
+
+    #define testImageClipComplexByType(datatype,MIN,MAX) /* datatype must be complex */ \
+    /* create image */ \
+    img = psImageAlloc(c,r,PS_TYPE_##datatype); \
+    for (unsigned row=0;row<r;row++) { \
+        ps##datatype* imgRow = img->data.datatype[row]; \
+        for (unsigned col=0;col<c;col++) { \
+            imgRow[col] = row+I*col; \
+        } \
+    } \
+    \
+    retVal = psImageClipComplexRegion(img,MIN,-1.0-1.0*I,MAX,-2.0-2.0*I); \
+    \
+    numClipped = 0; \
+    for (unsigned row=0;row<r;row++) { \
+        ps##datatype* imgRow = img->data.datatype[row]; \
+        for (unsigned col=0;col<c;col++) { \
+            ps##datatype value = (ps##datatype)(row+I*col); \
+            if ( (row > creal(MAX)) || (col > cimag(MAX)) ) { \
+                numClipped++; \
+                value = -2.0-2.0*I; \
+            } else if ((row < creal(MIN)) || (col < cimag(MIN)) ) { \
+                numClipped++; \
+                value = -1.0-1.0*I; \
+            } \
+            if (cabs(imgRow[col]-value) > FLT_EPSILON) { \
+                psError(PS_ERR_UNKNOWN, true,"Pixel value is not as expected (%g%+gi vs %g%+gi) at %d,%d", \
+                        creal(imgRow[col]),cimag(imgRow[col]),creal(value),cimag(value),col,row); \
+                return 1; \
+            } \
+        } \
+    } \
+    if (retVal != numClipped) { \
+        psError(PS_ERR_UNKNOWN, true,"Expected %d clips, but got %d", \
+                numClipped,retVal); \
+        return 2; \
+    } \
+    psFree(img);
+
+    complex double min = ((double)r)/5.0+I*((double)c)/4.0;
+    complex double max = ((double)r)/3.0+I*((double)c)/2.0;
+
+    psLogMsg(__func__,PS_LOG_INFO,"Testing clipping at %g%+gi to %g%+gi for psC32",
+             creal(min),cimag(min),creal(max),cimag(max));
+
+    testImageClipComplexByType(C32,min,max);
+
+    psLogMsg(__func__,PS_LOG_INFO,"Testing clipping at %g%+gi to %g%+gi for psC64",
+             creal(min),cimag(min),creal(max),cimag(max));
+    testImageClipComplexByType(C64,min,max);
+
+    //  6. Call psImageClipComplexRegion with NULL input parameter; should error
+    //     but not stop execution.
+
+    psLogMsg(__func__,PS_LOG_INFO,"Following should be an error:");
+    retVal = psImageClipComplexRegion(NULL,0,0,0,0);
+    if (retVal != 0) {
+        psError(PS_ERR_UNKNOWN, true,"Expected zero return for clips of a NULL image.");
+        return 3;
+    }
+
+
+    img = psImageAlloc(c,r,PS_TYPE_C32);
+    for (unsigned row=0;row<r;row++) {
+        psC32* imgRow = img->data.C32[row];
+        for (unsigned col=0;col<c;col++) {
+            imgRow[col] = row+I*col;
+        }
+    }
+
+    //  7. Call psImageClipComplexRegion with min > max; should error and return 0,
+    //     but not stop execution
+
+    psLogMsg(__func__,PS_LOG_INFO,"Following should be an error:");
+    retVal = psImageClipComplexRegion(img,10.0+I*1.0,-1.0,5.0+5.0*I,-2.0);
+    if (retVal != 0) {
+        psError(PS_ERR_UNKNOWN, true,"Expected zero return for creal(min)>creal(max).");
+        return 3;
+    }
+    psLogMsg(__func__,PS_LOG_INFO,"Following should be an error:");
+    retVal = psImageClipComplexRegion(img,1.0+I*10.0,-1.0,5.0+5.0*I,-2.0);
+    if (retVal != 0) {
+        psError(PS_ERR_UNKNOWN, true,"Expected zero return for cimag(min)>cimag(max).");
+        return 3;
+    }
+    psLogMsg(__func__,PS_LOG_INFO,"Following should be an error:");
+    retVal = psImageClipComplexRegion(img,10.0+I*10.0,-1.0,5.0+5.0*I,-2.0);
+    if (retVal != 0) {
+        psError(PS_ERR_UNKNOWN, true,"Expected zero return for min>max.");
+        return 3;
+    }
+
+    //  8. Call psImageClipComplexRegion with the follow vmin/vmax values; each
+    //     should error and return 0, but not stop execution
+    //      a) vmin < datatype region's minimum
+    //      b) vmax < datatype region's minimum
+    //      c) vmin > datatype region's maximum
+    //      d) vmax > datatype region's maximum
+
+    psLogMsg(__func__,PS_LOG_INFO,"Following should be an error:");
+    retVal = psImageClipComplexRegion(img,
+                                      1.0+I*1.0,
+                                      -2.0*(double)FLT_MAX,
+                                      5.0+5.0*I,
+                                      0.0);
+    if (retVal != 0) {
+        psError(PS_ERR_UNKNOWN, true,"Expected zero return for vmin not in datatype range.");
+        return 80;
+    }
+
+    psLogMsg(__func__,PS_LOG_INFO,"Following should be an error:");
+    retVal = psImageClipComplexRegion(img,
+                                      1.0+I*1.0,
+                                      2.0*(double)FLT_MAX,
+                                      5.0+5.0*I,
+                                      0.0);
+    if (retVal != 0) {
+        psError(PS_ERR_UNKNOWN, true,"Expected zero return for vmin not in datatype range.");
+        return 81;
+    }
+
+    psLogMsg(__func__,PS_LOG_INFO,"Following should be an error:");
+    retVal = psImageClipComplexRegion(img,
+                                      1.0+I*1.0,
+                                      -2.0*(double)FLT_MAX*I,
+                                      5.0+5.0*I,
+                                      0.0);
+    if (retVal != 0) {
+        psError(PS_ERR_UNKNOWN, true,"Expected zero return for vmin not in datatype range.");
+        return 82;
+    }
+
+    psLogMsg(__func__,PS_LOG_INFO,"Following should be an error:");
+    retVal = psImageClipComplexRegion(img,
+                                      1.0+I*1.0,
+                                      2.0*(double)FLT_MAX*I,
+                                      5.0+5.0*I,
+                                      0.0);
+    if (retVal != 0) {
+        psError(PS_ERR_UNKNOWN, true,"Expected zero return for vmin not in datatype range.");
+        return 83;
+    }
+
+    psLogMsg(__func__,PS_LOG_INFO,"Following should be an error:");
+    retVal = psImageClipComplexRegion(img,
+                                      1.0+I*1.0,
+                                      0.0,
+                                      5.0+5.0*I,
+                                      -2.0*(double)FLT_MAX);
+    if (retVal != 0) {
+        psError(PS_ERR_UNKNOWN, true,"Expected zero return for vmax not in datatype range.");
+        return 84;
+    }
+
+    psLogMsg(__func__,PS_LOG_INFO,"Following should be an error:");
+    retVal = psImageClipComplexRegion(img,
+                                      1.0+I*1.0,
+                                      0.0,
+                                      5.0+5.0*I,
+                                      2.0*(double)FLT_MAX);
+    if (retVal != 0) {
+        psError(PS_ERR_UNKNOWN, true,"Expected zero return for vmax not in datatype range.");
+        return 85;
+    }
+
+    psLogMsg(__func__,PS_LOG_INFO,"Following should be an error:");
+    retVal = psImageClipComplexRegion(img,
+                                      1.0+I*1.0,
+                                      0.0,
+                                      5.0+5.0*I,
+                                      -2.0*(double)FLT_MAX*I);
+    if (retVal != 0) {
+        psError(PS_ERR_UNKNOWN, true,"Expected zero return for vmax not in datatype range.");
+        return 87;
+    }
+
+    psLogMsg(__func__,PS_LOG_INFO,"Following should be an error:");
+    retVal = psImageClipComplexRegion(img,
+                                      1.0+I*1.0,
+                                      0.0,
+                                      5.0+5.0*I,
+                                      2.0*(double)FLT_MAX*I);
+    if (retVal != 0) {
+        psError(PS_ERR_UNKNOWN, true,"Expected zero return for vmax not in datatype range.");
+        return 88;
+    }
+
+
+    // now check if vmin > vmax is OK
+    for (unsigned row=0;row<r;row++) {
+        psC32* imgRow = img->data.C32[row];
+        for (unsigned col=0;col<c;col++) {
+            imgRow[col] = row+I*col;
+        }
+    }
+    retVal = psImageClipComplexRegion(img,
+                                      1.0+I*1.0,
+                                      10.0,
+                                      5.0+5.0*I,
+                                      0.0);
+    if (retVal == 0) {
+        psError(PS_ERR_UNKNOWN, true,"Didn't expect zero return for vmin > vmax.");
+        return 83;
+    }
+
+
+    psFree(img);
+    img = NULL;
+
+    //  9. Call psImageClipComplexRegion with the max value out of datatype's
+    //     range; should clip as expected (see step 1-5). Repeat with min value
+    //     out of datatype's range.
+
+    testImageClipComplexByType(C32,-(double)FLT_MAX*2.0-I*(double)FLT_MAX*2.0,10.0+I*10.0);
+    testImageClipComplexByType(C32,10.0+I*10.0,(double)FLT_MAX*2.0+I*(double)FLT_MAX*2.0);
+
+    // Verify program execution doesn't stop if the input image type is something
+    // other than C32, C64.
+    img = psImageAlloc(c,r,PS_TYPE_S32);
+    psLogMsg(__func__,PS_LOG_INFO,"Following should be an error (invalid type)");
+    retVal = psImageClipComplexRegion(img,2.0,10.0,5.0,0.0);
+    if (retVal != 0) {
+        psError(PS_ERR_UNKNOWN, true,"Expected zero return for clip of invalid image type.");
+        return 84;
+    }
+    psFree(img);
+
+    return 0;
+}
+
+psS32 testImageOverlay(void)
+{
+
+    psImage* img = NULL;
+    psImage* img2 = NULL;
+    psImage* img3 = NULL;
+    psImage* img4 = NULL;
+    psU32 c = 128;
+    psU32 r = 256;
+    psS32 retVal;
+
+    /*
+    psImageSectionOverlay shall modified pixel values in a psImage structure to
+    be equal to the value of the originaldata and an overlay image with a
+    specified operation. Valid operations include =, +, -, *, /.
+
+    Verify the returned integer is zero
+    and the input parameter psImage structure is modified at the specified
+    location and range with the given overlay image and the specified
+    function. Cases should include all the valid operations. Comparison of
+    expected values should include a delta to allow for testing on
+    different platforms.
+
+    */
+
+    #define testOverlayTypeOP(DATATYPE,OP,OPSTRING) \
+    img = psImageAlloc(c,r,PS_TYPE_##DATATYPE); \
+    for (unsigned row=0;row<r;row++) { \
+        ps##DATATYPE* imgRow = img->data.DATATYPE[row]; \
+        for (unsigned col=0;col<c;col++) { \
+            imgRow[col] = 6.0; \
+        } \
+    } \
+    img2 = psImageAlloc(c/2,r/2,PS_TYPE_##DATATYPE); \
+    for (unsigned row=0;row<r/2;row++) { \
+        ps##DATATYPE* img2Row = img2->data.DATATYPE[row]; \
+        for (unsigned col=0;col<c/2;col++) { \
+            img2Row[col] = 2.0; \
+        } \
+    } \
+    retVal = psImageOverlaySection(img,img2,c/4,r/4,OPSTRING); \
+    if (retVal == 0) { \
+        psError(PS_ERR_UNKNOWN, true,"psImageOverlaySection returned zero with %s op", \
+                OPSTRING); \
+        return 1; \
+    } \
+    for (unsigned row=0;row<r;row++) { \
+        ps##DATATYPE* imgRow = img->data.DATATYPE[row]; \
+        ps##DATATYPE* img2Row = img2->data.DATATYPE[row]; \
+        for (unsigned col=0;col<c;col++) { \
+            ps##DATATYPE val = 6.0; \
+            if ( ! (row < r/4 || row >= r/2+r/4 || col < c/4 || col >= c/2+c/4)) { \
+                val OP 2.0; \
+            } \
+            if (fabsf(imgRow[col] - val) > FLT_EPSILON) { \
+                psError(PS_ERR_UNKNOWN, true,"Value incorrect at %d,%d (%.2f vs %.2f for %s)", \
+                        col,row,imgRow[col],val,OPSTRING); \
+                return 2; \
+            } \
+            if (row < r/2 && col < c/2 && fabsf(img2Row[col] - 2.0) > FLT_EPSILON) { \
+                psError(PS_ERR_UNKNOWN, true,"Overlay modified at %d,%d (%.2f for %s)", \
+                        col,row,img2Row[col],OPSTRING); \
+                return 2; \
+            } \
+        } \
+    } \
+    psFree(img); \
+    psFree(img2);
+
+    #define testOverlayType(DATATYPE) \
+    testOverlayTypeOP(DATATYPE,+=,"+"); \
+    testOverlayTypeOP(DATATYPE,-=,"-"); \
+    testOverlayTypeOP(DATATYPE,*=,"*");\
+    testOverlayTypeOP(DATATYPE,/=,"/");\
+    testOverlayTypeOP(DATATYPE,=,"=");
+
+    testOverlayType(C64);
+    testOverlayType(C32);
+    testOverlayType(F64);
+    testOverlayType(F32);
+    testOverlayType(S16);
+    testOverlayType(S8);
+    testOverlayType(U16);
+    testOverlayType(U8);
+
+    /*
+    Verify the returned integer is equal to non-zero and the input psImage structure
+    is unmodified, if the overlay specified is not within the data range of the
+    input psImage structure.
+    */
+
+    img = psImageAlloc(c,r,PS_TYPE_F32);
+    for (unsigned row=0;row<r;row++) {
+        psF32* imgRow = img->data.F32[row];
+        for (unsigned col=0;col<c;col++) {
+            imgRow[col] = 6.0f;
+        }
+    }
+    img2 = psImageAlloc(c,r,PS_TYPE_F32);
+    for (unsigned row=0;row<r;row++) {
+        psF32* img2Row = img2->data.F32[row];
+        for (unsigned col=0;col<c;col++) {
+            img2Row[col] = 2.0f;
+        }
+    }
+    img3 = psImageAlloc(c,r,PS_TYPE_S64);
+    for (unsigned row=0;row<r;row++) {
+        psS64* img3Row = img3->data.S64[row];
+        for (unsigned col=0;col<c;col++) {
+            img3Row[col] = 6.0f;
+        }
+    }
+    img4 = psImageAlloc(c,r,PS_TYPE_S64);
+    for (unsigned row=0;row<r;row++) {
+        psS64* img4Row = img4->data.S64[row];
+        for (unsigned col=0;col<c;col++) {
+            img4Row[col] = 2.0f;
+        }
+    }
+
+    psLogMsg(__func__,PS_LOG_INFO,"Following should error as overlay isn't "
+             "within image boundaries");
+    retVal = psImageOverlaySection(img,img2,c/4,r/4,"+");
+    if (retVal != 0) {
+        psError(PS_ERR_UNKNOWN, true,"psImageOverlaySection did not return "
+                "zero even though overlay too big");
+        return 3;
+    }
+    for (unsigned row=0;row<r;row++) {
+        psF32* imgRow = img->data.F32[row];
+        for (unsigned col=0;col<c;col++) {
+            if (imgRow[col] != 6.0f) {
+                psError(PS_ERR_UNKNOWN, true,"Input image modified when overlay size too big");
+                return 4;
+            }
+        }
+    }
+
+    /*
+    Verify the returned integer is equal to non-zero, the input psImage
+    structure is unmodified and program execution doesn't stop, if the
+    overlay specified is null.
+    */
+
+    psLogMsg(__func__,PS_LOG_INFO,"Following should error as overlay is NULL");
+    retVal = psImageOverlaySection(img,NULL,c/4,r/4,"+");
+    if (retVal != 0) {
+        psError(PS_ERR_UNKNOWN, true,"psImageOverlaySection did not return "
+                "zero even though overlay too big");
+        return 5;
+    }
+    for (unsigned row=0;row<r;row++) {
+        psF32* imgRow = img->data.F32[row];
+        for (unsigned col=0;col<c;col++) {
+            if (imgRow[col] != 6.0f) {
+                psError(PS_ERR_UNKNOWN, true,"Input image modified when overlay NULL");
+                return 6;
+            }
+        }
+    }
+
+    /*
+    Verify the returned integer is equal to non-zero and program execution
+    doesn't stop, if the input parameter image is null.
+    */
+
+    psLogMsg(__func__,PS_LOG_INFO,"Following should error as image input is NULL");
+    retVal = psImageOverlaySection(NULL,img2,c/4,r/4,"+");
+    if (retVal != 0) {
+        psError(PS_ERR_UNKNOWN, true,"psImageOverlaySection returned non-zero even though "
+                "overlay too big");
+        return 7;
+    }
+
+    /*
+    Verify the return integer is equal to non-zero and program execution
+    doesn't stop, if the specified operator is not =,+,-,*,/
+    */
+
+    psLogMsg(__func__,PS_LOG_INFO,"Following should error as operator is invalid");
+    retVal = psImageOverlaySection(img,img2,0,0,"$");
+    if (retVal != 0) {
+        psError(PS_ERR_UNKNOWN, true,"psImageOverlaySection returned non-zero even though "
+                "overlay operator is invalid");
+        return 8;
+    }
+
+    /*
+    Verify the return integer is equal to non-zero and program execution
+    doesn't stop, if the specified operator is NULL
+    */
+
+    psLogMsg(__func__,PS_LOG_INFO,"Following should error as operator is invalid");
+    retVal = psImageOverlaySection(img,img2,0,0,NULL);
+    if(retVal != 0) {
+        psError(PS_ERR_UNKNOWN, true,"psImageOverlaySection returned non-zero even though "
+                "overlay operator is NULL");
+        return 9;
+    }
+
+    /*
+    Verify the return integer is equal to non-zero and program execution
+    doesn't stop, if overlay image is a different type than the input image
+    */
+    psLogMsg(__func__,PS_LOG_INFO,"Following should error as overlay is "
+             "a different type");
+    retVal = psImageOverlaySection(img,img3,0,0,"+");
+    if(retVal != 0) {
+        psError(PS_ERR_UNKNOWN, true,"psImageOverlaySection returned nonzero eventhough "
+                " overlay image type is different than input image.");
+        return 10;
+    }
+
+    /*
+    Verify program execution doen't stop, if the overly image contains
+    zero values with division operation is specified.
+    */
+    for (unsigned row=0;row<r;row++) {
+        psF32* img2Row = img2->data.F32[row];
+        for (unsigned col=0;col<c;col++) {
+            img2Row[col] = 0.0f;
+        }
+    }
+    retVal = psImageOverlaySection(img,img2,0,0,"/");
+    if (retVal == 0) {
+        psError(PS_ERR_UNKNOWN, true,"psImageOverlaySection returned zero when "
+                "checking divide-by-zero.");
+        return 12;
+    }
+
+    psFree(img);
+    psFree(img2);
+    psFree(img3);
+    psFree(img4);
+
+    return 0;
+}
+
+static psS32 testImageRebin(void)
+{
+
+    /*
+    This function shall generate a rescaled version of a psImage structure
+    derived from a specified statistics method.
+    */
+
+    psImage* in = NULL;
+    psImage* out = NULL;
+    psImage* out2 = NULL;
+    psImage* out3 = NULL;
+    psImage* mask = NULL;
+    psImage* meanTruth = NULL;
+    psImage* meanTruthWMask = NULL;
+    psImage* maxTruth = NULL;
+    psStats stats;
+
+    /*
+    Verify the returned psImage structure contains expected values, if the
+    input parameter input contains known data, the input scale is a known
+    value with a known statistical method specified in stats. Cases should
+    include at least two different scales and statistical methods. Comparison
+    of expected values should include a delta to allow testing on different
+    platforms.
+    */
+
+    #define testRebinType(DATATYPE)  \
+    in = psImageAlloc(16,16,PS_TYPE_##DATATYPE); \
+    mask = psImageAlloc(16,16,PS_TYPE_U8); \
+    meanTruth = psImageAlloc(4,4,PS_TYPE_F32); \
+    meanTruthWMask = psImageAlloc(4,4,PS_TYPE_F32); \
+    maxTruth = psImageAlloc(6,6,PS_TYPE_F32); \
+    memset(meanTruth->data.F32[0],0,sizeof(psF32)*4*4); \
+    memset(meanTruthWMask->data.F32[0],0,sizeof(psF32)*4*4); \
+    memset(maxTruth->data.F32[0],0,sizeof(psF32)*6*6); \
+    for (psS32 row = 0; row<16; row++) { \
+        ps##DATATYPE* inRow = in->data.DATATYPE[row]; \
+        psF32* meanTruthRow = meanTruth->data.F32[row/4]; \
+        psF32* meanTruthWMaskRow = meanTruthWMask->data.F32[row/4]; \
+        psF32* maxTruthRow = maxTruth->data.F32[row/3]; \
+        psU8* maskRow = mask->data.U8[row]; \
+        for (psS32 col = 0; col<16; col++) { \
+            if(col != 15) { \
+                maskRow[col] = 0; \
+            } else { \
+                maskRow[col] = 1; \
+            } \
+            inRow[col] = row + col; \
+            meanTruthRow[col/4] += row + col; \
+            if (maxTruthRow[col/3] < row + col) { \
+                maxTruthRow[col/3] = row+col; \
+            } \
+            if(maskRow[col] == 0 ) { \
+                meanTruthWMaskRow[col/4] += row + col; \
+            } \
+        } \
+    } \
+    for (psS32 row = 0; row<4; row++) { \
+        psF32* meanTruthRow = meanTruth->data.F32[row]; \
+        psF32* meanTruthWMaskRow = meanTruthWMask->data.F32[row]; \
+        for (psS32 col = 0; col<4; col++) { \
+            meanTruthRow[col] /= 16; \
+            if ( col == 3 ) { \
+                meanTruthWMaskRow[col] /= 12; \
+            } else { \
+                meanTruthWMaskRow[col] /= 16; \
+            } \
+        } \
+    } \
+    stats.options = PS_STAT_SAMPLE_MEAN; \
+    out = psImageRebin(NULL,in,NULL,0,4,&stats); \
+    if (out == NULL) { \
+        psError(PS_ERR_UNKNOWN, true,"psImageRebin returned a NULL pointer!?"); \
+        return 1; \
+    } \
+    if (out->numRows != 4 || out->numCols != 4) { \
+        psError(PS_ERR_UNKNOWN, true,"psImageRebin didn't produce the proper size image " \
+                "(%d x %d).", \
+                out->numCols, out->numRows); \
+        return 2; \
+    } \
+    for (psS32 row = 0; row<4; row++) { \
+        ps##DATATYPE* outRow = out->data.DATATYPE[row]; \
+        psF32* truthRow = meanTruth->data.F32[row]; \
+        for (psS32 col = 0; col<4; col++) { \
+            if (fabsf((float)outRow[col]-(float)truthRow[col]) > FLT_EPSILON) { \
+                psError(PS_ERR_UNKNOWN, true,"psImageRebin didn't produce the proper mean " \
+                        "result at (%d,%d) [%f vs %f].", \
+                        col,row,outRow[col],truthRow[col]); \
+                return 3; \
+            } \
+        } \
+    } \
+    stats.options = PS_STAT_SAMPLE_MEAN; \
+    out3 = psImageRebin(NULL,in,mask,1,4,&stats); \
+    for (psS32 row = 0; row<4; row++) { \
+        ps##DATATYPE* outRow = out3->data.DATATYPE[row]; \
+        psF32* truthRow = meanTruthWMask->data.F32[row]; \
+        for ( psS32 col = 0; col<4; col++) { \
+            if(abs((psS32)outRow[col]-(psS32)truthRow[col]) > FLT_EPSILON) { \
+                psError(PS_ERR_UNKNOWN, true,"psImageRebin with mask didn't produce the proper mean " \
+                        "result at (%d,%d) [%f vs %f].", \
+                        col,row,outRow[col],truthRow[col]); \
+                return 3; \
+            } \
+        } \
+    } \
+    stats.options = PS_STAT_MAX; \
+    out2 = psImageRebin(out,in,NULL,0,3,&stats); \
+    if (out != out2) { \
+        psError(PS_ERR_UNKNOWN, true,"psImageRebin didn't recycle a psImage properly!?"); \
+        return 7; \
+    } \
+    if (out == NULL) { \
+        psError(PS_ERR_UNKNOWN, true,"psImageRebin returned a NULL pointer!?"); \
+        return 4; \
+    } \
+    if (out->numRows != 6 || out->numCols != 6) { \
+        psError(PS_ERR_UNKNOWN, true,"psImageRebin didn't produce the proper size image " \
+                "(%d x %d).", \
+                out->numCols, out->numRows); \
+        return 5; \
+    } \
+    for (psS32 row = 0; row<6; row++) { \
+        ps##DATATYPE* outRow = out->data.DATATYPE[row]; \
+        psF32* truthRow = maxTruth->data.F32[row]; \
+        for (psS32 col = 0; col<6; col++) { \
+            if (fabsf((float)outRow[col]-(float)truthRow[col]) > FLT_EPSILON) { \
+                psError(PS_ERR_UNKNOWN, true,"psImageRebin didn't produce the proper " \
+                        "max result at (%d,%d) [%f vs %f].", \
+                        col,row,outRow[col],truthRow[col]); \
+                return 6; \
+            } \
+        } \
+    } \
+    psFree(in); \
+    psFree(out); \
+    psFree(out3); \
+    psFree(mask); \
+    psFree(meanTruth); \
+    psFree(meanTruthWMask); \
+    psFree(maxTruth);
+
+    testRebinType(F32);
+    testRebinType(F64);
+    testRebinType(U16);
+    testRebinType(S8);
+
+    // Verify the returned psImage structure is null and program execution
+    // doesn't stop, if the input image type is not supported.
+    psLogMsg(__func__,PS_LOG_INFO,"Following should be an error for unsupported type.");
+    in = psImageAlloc(16,16,PS_TYPE_U8);
+    mask = psImageAlloc(16,16,PS_TYPE_F32);
+    stats.options = PS_STAT_SAMPLE_MEAN;
+    out = psImageRebin(NULL,in,NULL,0,4,&stats);
+    if(out != NULL) {
+        psError(PS_ERR_UNKNOWN, true,"psImageRebin return an image eventhough the "
+                "type is not handled.");
+        return 14;
+    }
+    // Verify the returned psImage structure is null and program execution
+    // doesn't stop, if the mask type is not U8
+    psLogMsg(__func__,PS_LOG_INFO,"Following should be an error for invallid mask type.");
+    out = psImageRebin(NULL,in,mask,1,4,&stats);
+    if(out != NULL) {
+        psError(PS_ERR_UNKNOWN, true,"psImageRebin return an image eventhough the "
+                "mask is not the correct type.");
+        return 17;
+    }
+    psFree(mask);
+    psFree(in);
+
+    // Verify the returned psImage structure is null and program execution
+    // doesn't stop, if the input parameter input is null.
+
+    out2 = psImageRebin(NULL,NULL,NULL,0,1,&stats);
+
+    if (out2 != NULL) {
+        psError(PS_ERR_UNKNOWN, true,"psImageRebin returned an image though the input was "
+                "NULL!?");
+        return 8;
+    }
+
+    // Verify the returned psImage structure is null and program execution
+    // doesn't stop, if the input parameter scale is less than or equal to zero.
+    in = psImageAlloc(16, 16, PS_TYPE_F32);
+    psLogMsg(__func__,PS_LOG_INFO,"Following should be an error for scale < 0.");
+    out2 = psImageRebin(NULL,in,NULL,0,0,&stats);
+
+    if (out2 != NULL) {
+        psError(PS_ERR_UNKNOWN, true,"psImageRebin returned an image though the scale was "
+                "zero!?");
+        return 9;
+    }
+
+    // Verify the returned psImage structure is null and program execution
+    // doesn't stop, if the input parameter stats is null.
+    psLogMsg(__func__,PS_LOG_INFO,"Following should be an error for stats null.");
+    out2 = psImageRebin(NULL,in,NULL,0,1,NULL);
+
+    if (out2 != NULL) {
+        psError(PS_ERR_UNKNOWN, true,"psImageRebin returned an image though the stats was "
+                "NULL!?");
+        return 10;
+    }
+
+    // Verify the returned psImage structure is null and program execution
+    // doesn't stop, if the input parameter psStats structure member options
+    // is zero or any value which doesn't correspond to a valid statistical
+    // method.
+    psLogMsg(__func__,PS_LOG_INFO,"Following should be an error for stats options 0.");
+    stats.options = 0;
+    out2 = psImageRebin(NULL,in,NULL,0,1,&stats);
+
+    if (out2 != NULL) {
+        psError(PS_ERR_UNKNOWN, true,"psImageRebin returned an image though the stats "
+                "options was zero!?");
+        return 11;
+    }
+
+    psLogMsg(__func__,PS_LOG_INFO,"Following should be an error for stat options use range.");
+    stats.options = PS_STAT_USE_RANGE;
+    out2 = psImageRebin(NULL,in,NULL,0,1,&stats);
+
+    if (out2 != NULL) {
+        psError(PS_ERR_UNKNOWN, true,"psImageRebin returned an image though the stats "
+                "options was PS_STAT_USE_RANGE!?");
+        return 12;
+    }
+
+    // Verify the returned psImage structure is null and program execution
+    // doesn't stop, if the input parameter psStats structure member options
+    // specifies more than one valid statistical method.
+    psLogMsg(__func__,PS_LOG_INFO,"Following should be an error for stats with multiple options.");
+    stats.options = PS_STAT_SAMPLE_MEAN + PS_STAT_MAX;
+    out2 = psImageRebin(NULL,in,NULL,0,1,&stats);
+
+    if (out2 != NULL) {
+        psError(PS_ERR_UNKNOWN, true,"psImageRebin returned an image though the stats "
+                "options was PS_STAT_SAMPLE_MEAN+PS_STAT_MAX!?");
+        return 13;
+    }
+
+    psFree(in);
+
+    return 0;
+}
+
+static psS32 testImageRoll(void)
+{
+
+    psImage* in;
+    psImage* out;
+    psImage* out2;
+    psS32 rows = 64;
+    psS32 cols = 64;
+    psS32 rows1 = 8;
+    psS32 cols1 = 8;
+
+    /*
+     The function psImageRoll shall generate a new psImage structure by
+     rolling the input image the correponding number of pixels in the vertical
+     and/or horizontal direction. The image output image shall be the same size
+     as the input image. Values which roll off the image are wrapped to the
+     other side.
+
+     Verify the returned psImage structure contains expected values, if the
+     input image contains known values and the roll performed is known.
+     Cases should include no roll, vertical roll, horizontal roll and
+     combination vertical/horizontal rolls. Positive and negative rolls
+     should be performed.
+    */
+
+    in = psImageAlloc(cols,rows,PS_TYPE_F32);
+    for (psS32 row=0;row<rows;row++) {
+        psF32* inRow = in->data.F32[row];
+        for (psS32 col=0;col<cols;col++) {
+            inRow[col] = (psF32)row+(psF32)col/1000.0f;
+        }
+    }
+
+    out = psImageRoll(NULL,in,0,0);
+    for (psS32 row=0;row<rows;row++) {
+        psF32* inRow = in->data.F32[row];
+        psF32* outRow = out->data.F32[row];
+        for (psS32 col=0;col<cols;col++) {
+            if (inRow[col] != outRow[col]) {
+                psError(PS_ERR_UNKNOWN, true,"psImageRoll didn't produce expected result "
+                        "at %d,%d (%f vs %f) for dx=0, dy=0.",
+                        col,row,inRow[col],outRow[col]);
+                return 3;
+            }
+        }
+    }
+
+    out2 = psImageRoll(out,in,cols/4,0);
+    for (psS32 row=0;row<rows;row++) {
+        psF32* inRow = in->data.F32[row];
+        psF32* outRow = out->data.F32[row];
+        for (psS32 col=0;col<cols;col++) {
+            if (inRow[(col+cols/4) % cols] != outRow[col]) {
+                psError(PS_ERR_UNKNOWN, true,"psImageRoll didn't produce expected result "
+                        "at %d,%d (%f vs %f) for dx=cols/4, dy=0.",
+                        col,row,inRow[(col+cols/4) % cols],outRow[col]);
+                return 4;
+            }
+        }
+    }
+
+    // Verify the returned psImage structure pointer is equal to the input
+    // parameter out if provided.
+    if (out2 != out) {
+        psError(PS_ERR_UNKNOWN, true,"psImageRoll didn't recycle my out psImage!?");
+        return 1;
+    }
+
+    out = psImageRoll(out,in,0,rows/4);
+    for (psS32 row=0;row<rows;row++) {
+        psF32* inRow = in->data.F32[(row+rows/4)%rows];
+        psF32* outRow = out->data.F32[row];
+        for (psS32 col=0;col<cols;col++) {
+            if (inRow[col] != outRow[col]) {
+                psError(PS_ERR_UNKNOWN, true,"psImageRoll didn't produce expected result "
+                        "at %d,%d (%f vs %f) for dx=0, dy=rows/4.",
+                        col,row,inRow[col],outRow[col]);
+                return 5;
+            }
+        }
+    }
+
+    out = psImageRoll(out,in,cols/4,rows/4);
+    for (psS32 row=0;row<rows;row++) {
+        psF32* inRow = in->data.F32[(row+rows/4)%rows];
+        psF32* outRow = out->data.F32[row];
+        for (psS32 col=0;col<cols;col++) {
+            if (inRow[(col+cols/4) % cols] != outRow[col]) {
+                psError(PS_ERR_UNKNOWN, true,"psImageRoll didn't produce expected result "
+                        "at %d,%d (%f vs %f) for dx=cols/4, dy=rows/4.",
+                        col,row,inRow[(col+cols/4) % cols],outRow[col]);
+                return 6;
+            }
+        }
+    }
+
+    out = psImageRoll(out,in,-cols/4,0);
+    for (psS32 row=0;row<rows;row++) {
+        psF32* inRow = in->data.F32[row];
+        psF32* outRow = out->data.F32[row];
+        for (psS32 col=0;col<cols;col++) {
+            if (inRow[(col+(cols-cols/4)) % cols] != outRow[col]) {
+                psError(PS_ERR_UNKNOWN, true,"psImageRoll didn't produce expected result "
+                        "at %d,%d (%f vs %f) for dx=-cols/4, dy=0.",
+                        col,row,inRow[(col+(cols-cols/4)) % cols],outRow[col]);
+                return 7;
+            }
+        }
+    }
+
+    out = psImageRoll(out,in,0,-rows/4);
+    for (psS32 row=0;row<rows;row++) {
+        psF32* inRow = in->data.F32[(row+rows-rows/4)%rows];
+        psF32* outRow = out->data.F32[row];
+        for (psS32 col=0;col<cols;col++) {
+            if (inRow[col] != outRow[col]) {
+                psError(PS_ERR_UNKNOWN, true,"psImageRoll didn't produce expected result "
+                        "at %d,%d (%f vs %f) for dx=0, dy=-rows/4.",
+                        col,row,inRow[col],outRow[col]);
+                return 8;
+            }
+        }
+    }
+
+    out = psImageRoll(out,in,-cols/4,-rows/4);
+    for (psS32 row=0;row<rows;row++) {
+        psF32* inRow = in->data.F32[(row+rows-rows/4)%rows];
+        psF32* outRow = out->data.F32[row];
+        for (psS32 col=0;col<cols;col++) {
+            if (inRow[(col+cols-cols/4) % cols] != outRow[col]) {
+                psError(PS_ERR_UNKNOWN, true,"psImageRoll didn't produce expected result "
+                        "at %d,%d (%f vs %f) for dx=cols/4, dy=rows/4.",
+                        col,row,inRow[(col+cols-cols/4) % cols],outRow[col]);
+                return 9;
+            }
+        }
+    }
+
+
+    // Verify the returned psImage structure pointer is null and program
+    // execution doesn't stop, if input parameter input is null.
+    psLogMsg(__func__,PS_LOG_INFO,"Following should generate an error.");
+    out2 = psImageRoll(NULL,NULL,0,0);
+    if (out2 != NULL) {
+        psError(PS_ERR_UNKNOWN, true,"psImageRoll did not return NULL though input image was NULL!?");
+        return 2;
+    }
+
+    psFree(in);
+    psFree(out);
+
+    #define testRollType(DATATYPE) \
+    in = psImageAlloc(rows1,cols1,PS_TYPE_##DATATYPE); \
+    \
+    for (psS32 row=0;row<rows1;row++) { \
+        ps##DATATYPE* inRow = in->data.DATATYPE[row]; \
+        for (psS32 col=0;col<cols1;col++) { \
+            inRow[col] = (ps##DATATYPE)row+(ps##DATATYPE)col; \
+        } \
+    } \
+    \
+    out = psImageRoll(NULL,in,rows1/4,cols1/4); \
+    for (psS32 row=0;row<rows1;row++) { \
+        ps##DATATYPE* inRow = in->data.DATATYPE[(row+rows1/4)%rows1]; \
+        ps##DATATYPE* outRow = out->data.DATATYPE[row]; \
+        for (psS32 col=0;col<cols1;col++) { \
+            if (inRow[(col+cols1/4)%cols1] != outRow[col]) { \
+                psError(PS_ERR_UNKNOWN, true,"psImageRoll didn't produce expected result " \
+                        "at %d,%d (%f vs %f) for dx=0, dy=0.", \
+                        col,row,(float)inRow[col],(float)outRow[col]); \
+                return 3; \
+            } \
+        } \
+    } \
+    psFree(in); \
+    psFree(out);
+
+    testRollType(U8);
+    testRollType(U16);
+    testRollType(S8);
+    testRollType(S16);
+    testRollType(F64);
+    testRollType(C32);
+    testRollType(C64);
+
+    return 0;
+}
+
+psS32 testImageRotate(void)
+{
+    /*
+
+    This function shall calculate a new psImage structure based upon the
+    rotation of a given psImage structure. The center of rotation shall be the
+    center pixel of the input image.
+
+    The following steps of the testpoint are done manually via inspection of
+    temp/fOut.fits & temp/sOut.fits.
+
+        * Verify the returned psImage structure contains expected values, if
+          the input parameter psImage contains known values. Cases should
+          include rotations of 0, 45, 90, 135, 180, 225, 270, 315, 360 and at leat one
+          other arbitrary angle. Cases of the input image should include image
+          with a center pixel and an image without a center pixel.
+        * Verify the returned psImage structure contains pixels set to exposed value, if
+          the rotation and input psImage to not correspond to the output image.
+
+    */
+
+    psImage* fOut = NULL;
+    psImage* sOut = NULL;
+    psImage* fBiOut = NULL;
+    psImage* sBiOut = NULL;
+    psImage* fTruth = NULL;
+    psImage* sTruth = NULL;
+    psImage* fBiTruth = NULL;
+    psImage* sBiTruth = NULL;
+    psS32 rows = 64;
+    psS32 cols = 64;
+    psImage* fImg = psImageAlloc(cols,rows,PS_TYPE_F32);
+    psImage* sImg = psImageAlloc(cols,rows,PS_TYPE_S16);
+
+    for(psS32 row=0;row<rows;row++) {
+        psF32* fRow = fImg->data.F32[row];
+        psS16* sRow = sImg->data.S16[row];
+        for (psS32 col=0;col<cols;col++) {
+            fRow[col] = (psF32)(row)+(psF32)(col)/100.0f;
+            sRow[col] = row-2*col;
+        }
+    }
+
+    // since interpolation is involved, etc., the simplist way to verify things
+    // is to verify the results manually and bless it for automated comparison
+    // thereafter
+
+
+    // write results of various rotates to a file and verify with truth images
+    mkdir("temp",0777);
+    remove
+        ("temp/fOut.fits")
+        ;
+    remove
+        ("temp/sOut.fits")
+        ;
+    remove
+        ("temp/fBiOut.fits")
+        ;
+    remove
+        ("temp/sBiOut.fits");
+    ;
+    psS32 index = 0;
+    psBool fail = false;
+    psF32 radianRot;
+    for (psS32 rot=-180;rot<=180;rot+=45) {
+        psImage* oldOut = fOut;
+        psImage* oldBiOut = fBiOut;
+
+        if (rot == 90) {
+            radianRot = PS_PI_2;
+        } else if (rot == -90) {
+            radianRot = PS_PI+PS_PI_2;
+        } else if (rot == 180 || rot == -180) {
+            radianRot = PS_PI;
+        } else {
+            radianRot = ((float)rot)*PS_PI/180.0;
+        }
+
+        fOut = psImageRotate(fOut,fImg,radianRot,-1.0,PS_INTERPOLATE_FLAT);
+        fBiOut = psImageRotate(fBiOut,fImg,radianRot,-1.0,PS_INTERPOLATE_BILINEAR);
+        // Verify the returned psImage structure is equal to the input
+        // parameter out if provided.
+        if (oldOut != NULL && oldOut != fOut) {
+            psError(PS_ERR_UNKNOWN, true,"the output recycle functionality failed");
+            return 2;
+        }
+        if (oldBiOut != NULL && oldBiOut != fBiOut) {
+            psError(PS_ERR_UNKNOWN, true,"the output recycle functionality failed");
+            return 4;
+        }
+        sOut = psImageRotate(sOut,sImg,radianRot,-1.0,PS_INTERPOLATE_FLAT);
+        sBiOut = psImageRotate(sBiOut,sImg,radianRot,-1.0,PS_INTERPOLATE_BILINEAR);
+        if (! psImageWriteSection(fOut,0,0,0,NULL,index,"temp/fOut.fits") ) {
+            psError(PS_ERR_UNKNOWN, true,"Can not write to temp/fOut.fits, so why continue!?");
+            return 20;
+        }
+        if (! psImageWriteSection(sOut,0,0,0,NULL,index,"temp/sOut.fits") ) {
+            psError(PS_ERR_UNKNOWN, true,"Can not write to temp/sOut.fits, so why continue!?");
+            return 21;
+        }
+        if (! psImageWriteSection(fBiOut,0,0,0,NULL,index,"temp/fBiOut.fits") ) {
+            psError(PS_ERR_UNKNOWN, true,"Can not write to temp/fBiOut.fits, so why continue!?");
+            return 40;
+        }
+        if (! psImageWriteSection(sBiOut,0,0,0,NULL,index,"temp/sBiOut.fits") ) {
+            psError(PS_ERR_UNKNOWN, true,"Can not write to temp/sBiOut.fits, so why continue!?");
+            return 41;
+        }
+
+        // now, let's compare this with the verified file
+        fTruth = psImageReadSection(fTruth,0,0,0,0,0,NULL,index,"temp/fOut.fits");
+        sTruth = psImageReadSection(sTruth,0,0,0,0,0,NULL,index,"temp/sOut.fits");
+        fBiTruth = psImageReadSection(fBiTruth,0,0,0,0,0,NULL,index,"temp/fBiOut.fits");
+        sBiTruth = psImageReadSection(sBiTruth,0,0,0,0,0,NULL,index,"temp/sBiOut.fits");
+        if (fTruth == NULL) {
+            psError(PS_ERR_UNKNOWN, true,"verified psF32 image failed to be read (%d deg. rotation)",
+                    rot);
+            fail = true;
+        } else {
+            if (fTruth->numRows != fOut->numRows || fTruth->numCols != fOut->numCols) {
+                psError(PS_ERR_UNKNOWN, true,"Rotated float image size did not match truth "
+                        "image for %d deg rotation (%dx%d vs %dx%d).",
+                        rot,fOut->numCols,fOut->numRows,fTruth->numCols,fTruth->numRows);
+                fail = true;
+            } else {
+                for (psS32 row=0;row<fTruth->numRows;row++) {
+                    psF32* truthRow = fTruth->data.F32[row];
+                    psF32* outRow = fOut->data.F32[row];
+                    for (psS32 col=0;col<fTruth->numCols;col++) {
+                        if (fabsf(truthRow[col]-outRow[col]) > 1) {
+                            psError(PS_ERR_UNKNOWN, true,"Float Image mismatch (%f vs %f) at %d,%d.",
+                                    outRow[col], truthRow[col],col,row);
+                            fail = true;
+                        }
+                    }
+                }
+            }
+        }
+
+        if (sTruth == NULL) {
+            psError(PS_ERR_UNKNOWN, true,"verified psS16 image failed to be read "
+                    "(%d deg. rotation)",rot);
+            fail = true;
+        } else {
+            if (sTruth->numRows != sOut->numRows ||
+                    sTruth->numCols != sOut->numCols) {
+                psError(PS_ERR_UNKNOWN, true,"Rotated psS16 image size did not match truth "
+                        "image for %d deg rotation.",rot);
+                fail = true;
+            } else {
+                for (psS32 row=0;row<sTruth->numRows;row++) {
+                    psS16* truthRow = sTruth->data.S16[row];
+                    psS16* outRow = sOut->data.S16[row];
+                    for (psS32 col=0;col<sTruth->numCols;col++) {
+                        if (fabsf(truthRow[col]-outRow[col]) > 1) {
+                            psError(PS_ERR_UNKNOWN, true,"Short Image mismatch (%d vs %d) "
+                                    "at %d,%d.",
+                                    outRow[col], truthRow[col],col,row);
+                            fail = true;
+                        }
+                    }
+                }
+            }
+        }
+
+
+        if (fBiTruth == NULL) {
+            psError(PS_ERR_UNKNOWN, true,"verified psF32 Bi image failed to be read (%d deg. rotation)",
+                    rot);
+            fail = true;
+        } else {
+            if (fBiTruth->numRows != fBiOut->numRows || fBiTruth->numCols != fBiOut->numCols) {
+                psError(PS_ERR_UNKNOWN, true,"Rotated float image size did not match truth "
+                        "image for %d deg rotation (%dx%d vs %dx%d). BILINEAR",
+                        rot,fBiOut->numCols,fBiOut->numRows,fBiTruth->numCols,fBiTruth->numRows);
+                fail = true;
+            } else {
+                for (psS32 row=0;row<fBiTruth->numRows;row++) {
+                    psF32* truthRow = fBiTruth->data.F32[row];
+                    psF32* outRow = fBiOut->data.F32[row];
+                    for (psS32 col=0;col<fBiTruth->numCols;col++) {
+                        if (fabsf(truthRow[col]-outRow[col]) > 1) {
+                            psError(PS_ERR_UNKNOWN, true,"Float Image mismatch (%f vs %f) at %d,%d. BILINEAR",
+                                    outRow[col], truthRow[col],col,row);
+                            fail = true;
+                        }
+                    }
+                }
+            }
+        }
+
+        if (sBiTruth == NULL) {
+            psError(PS_ERR_UNKNOWN, true,"verified psS16 image failed to be read "
+                    "(%d deg. rotation) BILINEAR",rot);
+            fail = true;
+        } else {
+            if (sBiTruth->numRows != sBiOut->numRows ||
+                    sBiTruth->numCols != sBiOut->numCols) {
+                psError(PS_ERR_UNKNOWN, true,"Rotated psS16 image size did not match truth "
+                        "image for %d deg rotation. BILINEAR",rot);
+                fail = true;
+            } else {
+                for (psS32 row=0;row<sBiTruth->numRows;row++) {
+                    psS16* truthRow = sBiTruth->data.S16[row];
+                    psS16* outRow = sBiOut->data.S16[row];
+                    for (psS32 col=0;col<sBiTruth->numCols;col++) {
+                        if (fabsf(truthRow[col]-outRow[col]) > 1) {
+                            psError(PS_ERR_UNKNOWN, true,"Short Image mismatch (%d vs %d) "
+                                    "at %d,%d. BILINEAR",
+                                    outRow[col], truthRow[col],col,row);
+                            fail = true;
+                        }
+                    }
+                }
+            }
+        }
+
+        index++;
+    }
+
+    if (fail) {
+        psError(PS_ERR_UNKNOWN, true,"One or more images didn't match truth or truth did "
+                "not exist.");
+        return 10;
+    }
+
+
+    // Verify the returned psImage structure pointer is null and program
+    // execution doesn't stop, if the input parameter input is null.
+    psLogMsg(__func__,PS_LOG_INFO,"Following should be an error");
+    fOut = psImageRotate(fOut,NULL,0,0,PS_INTERPOLATE_FLAT);
+    if (fOut != NULL) {
+        psError(PS_ERR_UNKNOWN, true,"NULL wasn't returned though the input image was NULL.");
+        return 3;
+    }
+
+    // Verify the returned psImage structure pointer is null and program
+    // execution doesn't stop, if the specified interpolation mode is invalid
+    psLogMsg(__func__,PS_LOG_INFO,"Following should be an error for invalid "
+             "interpolation type.");
+    fOut = psImageRotate(fOut, fImg, 33, 0, -1);
+    if (fOut != NULL) {
+        psError(PS_ERR_UNKNOWN, true,"NULL wasn't returned though the interpolation mode "
+                "is invalid.");
+        return 4;
+    }
+
+    psFree(sOut);
+    psFree(fImg);
+    psFree(sImg);
+    psFree(fTruth);
+    psFree(sTruth);
+    psFree(sBiOut);
+    psFree(fBiTruth);
+    psFree(sBiTruth);
+    psFree(fBiOut);
+
+    return 0;
+}
+
+static psS32 testImageShift(void)
+{
+    /* psImageShift:
+
+       This functions shall generate a new psImage structure by shifting the
+       input psImage structure a specified number of pixels in the horizontal
+       and/or vertical directions.
+
+       Verify the returned psImage structure contains expected values, if the
+       input psImage structure contains known values and a know shift in the
+       vertical and/or horizontal directions. Cases should include no shift,
+       vertical only(up,down), horizontal only(right, left), and combination
+       shift. Cases should include fractional shifts. Comparison of expected
+       values should include a delta to allow for testing on different
+       platforms.
+
+       Verify the returned psImage structure contains values for pixels not in
+       the original image set to the input parameter exposed.
+
+    */
+
+    psS32 retVal=0;
+
+    // integer shift
+    retVal |= testImageShiftCase(64,128,0.0f,0.0f);
+    retVal |= testImageShiftCase(64,128,0.0f,16.0f);
+    retVal |= testImageShiftCase(64,128,0.0f,-16.0f);
+    retVal |= testImageShiftCase(64,128,32.0f,0.0f);
+    retVal |= testImageShiftCase(64,128,-32.0f,0.0f);
+    retVal |= testImageShiftCase(64,128,32.0f,16.0f);
+    retVal |= testImageShiftCase(64,128,32.0f,-16.0f);
+    retVal |= testImageShiftCase(64,128,-32.0f,16.0f);
+    retVal |= testImageShiftCase(64,128,-32.0f,-16.0f);
+
+    if (retVal != 0) {
+        return retVal;
+    }
+
+    // fractional shift
+    retVal |= testImageShiftCase(64,128,0.0f,16.4f);
+    retVal |= testImageShiftCase(64,128,0.0f,-16.4f);
+    retVal |= testImageShiftCase(64,128,32.7f,0.0f);
+    retVal |= testImageShiftCase(64,128,-32.7f,0.0f);
+    retVal |= testImageShiftCase(64,128,32.6f,16.2f);
+    retVal |= testImageShiftCase(64,128,32.6f,-16.2f);
+    retVal |= testImageShiftCase(64,128,-32.6f,16.2f);
+    retVal |= testImageShiftCase(64,128,-32.6f,-16.2f);
+
+    if (retVal != 0) {
+        return retVal;
+    }
+
+    /*
+       Verify the returned psImage structure pointer is equal to the input
+       parameter out if provided.
+    */
+    psImage* fImg = psImageAlloc(32,32,PS_TYPE_F32);
+    psImage* fRecycle = psImageAlloc(32,32,PS_TYPE_F32);
+    psImage* fOut = psImageShift(fRecycle, fImg, 8,8, NAN, PS_INTERPOLATE_FLAT);
+
+    if (fRecycle != fOut) {
+        psError(PS_ERR_UNKNOWN, true,"psImageShift didn't recycle my image?");
+        return 10;
+    }
+
+    /*
+       Verify the returned psImage structure pointer is null and program
+       execution doesn't stop, if the input psImage structure pointer is null.
+    */
+    psLogMsg(__func__,PS_LOG_INFO,"Following should be an error...");
+    fOut = psImageShift(fOut,NULL,8,8,NAN,PS_INTERPOLATE_FLAT);
+    if (fOut != NULL) {
+        psError(PS_ERR_UNKNOWN, true,"psImageShift didn't return NULL given a NULL input image.");
+        return 11;
+    }
+
+    // Verify the returned psImage structure is null and program execution
+    // doesn't stop, if the specified interpolation mode is invalid.
+    psLogMsg(__func__,PS_LOG_INFO,"Following should be an error for invalid interpolation mode.");
+    fOut = psImageShift(fOut,fImg,8,8,NAN,-1);
+    if (fOut != NULL ) {
+        psError(PS_ERR_UNKNOWN, true,"psImageShift didn't return NULL given an invalid interpolation mode.");
+        return 12;
+    }
+
+    psFree(fImg);
+
+    return 0;
+}
+
+static psS32 testImageShiftCase(psS32 cols,
+                                psS32 rows,
+                                float colShift,
+                                float rowShift)
+{
+    psImage* fOut = NULL;
+    psImage* sOut = NULL;
+
+    psLogMsg(__func__,PS_LOG_INFO,"Testing psImageShift with a %dx%d image for "
+             "a shift of %g,%g.",cols,rows,colShift,rowShift);
+
+    psImage* fImg = psImageAlloc(cols,rows,PS_TYPE_F32);
+    psImage* sImg = psImageAlloc(cols,rows,PS_TYPE_S16);
+    psImage* fBiOut = psImageAlloc(cols,rows,PS_TYPE_F32);
+    psImage* sBiOut = psImageAlloc(cols,rows,PS_TYPE_S16);
+
+    for(psS32 row=0;row<rows;row++) {
+        psF32* fRow = fImg->data.F32[row];
+        psS16* sRow = sImg->data.S16[row];
+        for (psS32 col=0;col<cols;col++) {
+            fRow[col] = (psF32)(row)+(psF32)(col)/100.0f;
+            sRow[col] = row-2*col;
+        }
+    }
+
+    fOut = psImageShift(fOut, fImg, colShift, rowShift, NAN, PS_INTERPOLATE_FLAT);
+    sOut = psImageShift(sOut, sImg, colShift, rowShift, -1, PS_INTERPOLATE_FLAT);
+    fBiOut = psImageShift(fBiOut, fImg, colShift, rowShift, NAN, PS_INTERPOLATE_BILINEAR);
+    sBiOut = psImageShift(sBiOut, sImg, colShift, rowShift, -1, PS_INTERPOLATE_BILINEAR);
+
+    for(psS32 row=0;row<rows;row++) {
+        psF32* fRow = fOut->data.F32[row];
+        psS16* sRow = sOut->data.S16[row];
+        psF32* fBiRow = fBiOut->data.F32[row];
+        psS16* sBiRow = sBiOut->data.S16[row];
+
+        for (psS32 col=0;col<cols;col++) {
+            psF32 fValue = psImagePixelInterpolate(fImg,col+colShift,
+                                                   row+rowShift,NULL,0,NAN,PS_INTERPOLATE_FLAT);
+            psS16 sValue = (psS16)psImagePixelInterpolate(sImg,col+colShift,
+                           row+rowShift,NULL,0,-1,PS_INTERPOLATE_FLAT);
+
+            psF32 fBiValue = psImagePixelInterpolate(fImg,col+colShift,
+                             row+rowShift,NULL,0,NAN,PS_INTERPOLATE_BILINEAR);
+            psS16 sBiValue = (psS16)psImagePixelInterpolate(sImg,col+colShift,
+                             row+rowShift,NULL,0,-1,PS_INTERPOLATE_BILINEAR);
+
+            if (fabsf(fRow[col] - fValue) > FLT_EPSILON) {
+                psError(PS_ERR_UNKNOWN, true,"Float image not shifted correctly at %d,%d (%g vs %g)",
+                        col,row,fRow[col],fValue);
+                return 1;
+            }
+            if (sRow[col] != sValue) {
+                psError(PS_ERR_UNKNOWN, true,"Short image not shifted correctly at %d,%d (%d vs %d)",
+                        col,row,sRow[col],sValue);
+                return 2;
+            }
+            if (fabsf(fBiRow[col] - fBiValue) > FLT_EPSILON) {
+                psError(PS_ERR_UNKNOWN, true,"Float image not shifted correctly at %d,%d (%g vs %g)",
+                        col,row,fBiRow[col],fBiValue);
+                return 1;
+            }
+            if (sBiRow[col] != sBiValue) {
+                psError(PS_ERR_UNKNOWN, true,"Short image not shifted correctly at %d,%d (%d vs %d)",
+                        col,row,sBiRow[col],sBiValue);
+                return 2;
+            }
+        }
+    }
+
+    psFree(fImg);
+    psFree(sImg);
+    psFree(fOut);
+    psFree(sOut);
+    psFree(fBiOut);
+    psFree(sBiOut);
+
+    return 0;
+}
+
+static psS32 testImageResample(void)
+{
+
+    psS32 rows = 60;
+    psS32 cols = 80;
+    psImage* result = NULL;
+    psS32 scale = 4;
+    psErr* err;
+
+    psImage* image = psImageAlloc(cols,rows,PS_TYPE_F32);
+    for(psS32 row=0;row<rows;row++) {
+        psF32* imageRow = image->data.F32[row];
+        for (psS32 col=0;col<cols;col++) {
+            imageRow[col] = row+2*col;
+        }
+    }
+    result = psImageCopy(NULL,image,PS_TYPE_F64);
+    psImage* orig = result;
+    result = psImageResample(result,image,scale,PS_INTERPOLATE_FLAT);
+
+    if (result == NULL) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "NULL return unexpected");
+        return 1;
+    }
+
+    if (result != orig) {
+        psLogMsg(__func__,PS_LOG_ERROR,"failure to recycle image.");
+        return 2;
+    }
+
+    if (result->type.type != PS_TYPE_F32) {
+        psLogMsg(__func__,PS_LOG_ERROR,"unexpected type");
+        return 3;
+    }
+
+
+    if (result->numCols != image->numCols*scale ||
+            result->numRows != image->numRows*scale) {
+        psLogMsg(__func__,PS_LOG_ERROR,"The size of the result is %dx%d, but %dx%d was expected.",
+                 result->numCols,result->numRows,
+                 image->numCols*scale, image->numRows*scale);
+        return 4;
+    }
+
+    psF32 truthValue;
+    for(psS32 row=0;row<result->numRows;row++) {
+        for (psS32 col=0;col<result->numCols;col++) {
+            truthValue = psImagePixelInterpolate(image,
+                                                 (float)col/(float)scale,(float)row/(float)scale,
+                                                 NULL,0,-1,PS_INTERPOLATE_FLAT);
+            if (fabs(truthValue - result->data.F32[row][col]) > FLT_EPSILON) {
+                psLogMsg(__func__,PS_LOG_ERROR,"value bad at (%d,%d).  Got %g, expected %g.",
+                         col,row,result->data.F32[row][col], truthValue);
+                return 5;
+            }
+        }
+    }
+
+    // verify that image=null is handled properly.
+    psErrorClear();
+    result = psImageResample(result,NULL,scale,PS_INTERPOLATE_FLAT);
+
+    if (result != NULL) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "return was not NULL, as expected.");
+        return 6;
+    }
+    err = psErrorLast();
+    if (err->code != PS_ERR_BAD_PARAMETER_NULL) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "error message was not appropriate type.");
+        return 7;
+    }
+    psFree(err);
+
+    // verify that scale < 1 is handled properly
+    psErrorClear();
+    result = psImageResample(result,image,0,PS_INTERPOLATE_FLAT);
+
+    if (result != NULL) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "return was not NULL, as expected.");
+        return 8;
+    }
+    err = psErrorLast();
+    if (err->code != PS_ERR_BAD_PARAMETER_VALUE) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "error message was not appropriate type.");
+        return 9;
+    }
+    psFree(err);
+
+    // verify that invalid interpolation mode is handled properly
+    psErrorClear();
+    result = psImageResample(result,image,2,-1);
+
+    if (result != NULL) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "return was not NULL, as expected.");
+        return 10;
+    }
+    err = psErrorLast();
+    if (err->code != PS_ERR_BAD_PARAMETER_VALUE) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "error message was not appropriate type.");
+        return 11;
+    }
+    psFree(err);
+
+    // Verify that that an invalid image type is handled properly
+    psErrorClear();
+    psImage* invImage = psImageAlloc(cols,rows,PS_TYPE_BOOL);
+    memset(invImage->rawDataBuffer,0,cols*rows*sizeof(psBool)); // make sure the image is of all NULLs
+    result = psImageResample(result,invImage,2,PS_INTERPOLATE_FLAT);
+    if (result != NULL) {
+        psLogMsg(__func__,PS_LOG_ERROR,"return was not NULL, as expected.");
+        return 20;
+    }
+    err = psErrorLast();
+    if (err->code != PS_ERR_BAD_PARAMETER_TYPE) {
+        psLogMsg(__func__,PS_LOG_ERROR,"error message was not appropriate type.");
+        return 21;
+    }
+    psFree(err);
+
+    psFree(image);
+    psFree(result);
+    psFree(invImage);
+
+    return 0;
+}
+
Index: /tags/ipp-1-X/bug123/psLib/test/image/tst_psImageStats.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/image/tst_psImageStats.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/image/tst_psImageStats.c	(revision 22331)
@@ -0,0 +1,692 @@
+/*
+*  C Implementation: %{MODULE}
+*
+* Description: 
+*
+*
+* Author: %{AUTHOR} <%{EMAIL}>, (C) %{YEAR}
+*
+* Copyright: See COPYING file that comes with this distribution
+*
+*/
+
+#include <stdio.h>
+#include <float.h>
+#include <math.h>
+
+#include "pslib_strict.h"
+#include "psTest.h"
+
+static psS32 testPsImageHistogram(void);
+static psS32 testPsImageStats(void);
+static psS32 testPsImageFitPolynomial(void);
+static psS32 testPsImagePixelInterpolate(void);
+static psS32 testPsImageEvalPolynom(void);
+
+static bool FitChebyF32(int numCols, int numRows);
+static bool FitChebyF64(int numCols, int numRows);
+
+testDescription tests[] = {
+                              {testPsImageHistogram,0,"psImageHistogram",0,false},
+                              {testPsImageStats,1,"psImageStats",0,false},
+                              {testPsImageFitPolynomial,2,"psImageFitPolynomial",0,false},
+                              {testPsImagePixelInterpolate,3,"psImagePixelInterpolate",0,false},
+                              {testPsImageEvalPolynom,4,"psImageEvalPolynom()",0,false},
+                              {NULL}
+                          };
+
+psS32 main(psS32 argc, char* argv[])
+{
+    psLogSetLevel(PS_LOG_INFO);
+
+    return ! runTestSuite(stderr,"psImage",tests,argc,argv);
+}
+
+
+
+static psS32 testPsImageHistogram(void)
+{
+    const int NUM_BINS = 20;
+    const int N = 32;
+    const int M = 64;
+
+    psHistogram * myHist = NULL;
+    psHistogram *myHist2 = NULL;
+    psImage *tmpImage = NULL;
+    psImage *tmpImage2 = NULL;
+    psImage *tmpMask = NULL;
+    psImage *tmpMask2 = NULL;
+    psS32 testStatus = true;
+    psS32 nb = 0;
+    psS32 i = 0;
+    psS32 j = 0;
+    psS32 IMAGE_X_SIZE = 0;
+    psS32 IMAGE_Y_SIZE = 0;
+    psS32 currentId = 0;
+
+    currentId = psMemGetId();
+    for ( nb = 0;nb < 7;nb++ ) {
+        if ( nb == 0 ) {
+            IMAGE_X_SIZE = 1;
+            IMAGE_Y_SIZE = 1;
+        }
+        if ( nb == 1 ) {
+            IMAGE_X_SIZE = 1;
+            IMAGE_Y_SIZE = N;
+        }
+        if ( nb == 2 ) {
+            IMAGE_X_SIZE = N;
+            IMAGE_Y_SIZE = 1;
+        }
+        if ( nb == 3 ) {
+            IMAGE_X_SIZE = N;
+            IMAGE_Y_SIZE = N;
+        }
+        if ( nb == 4 ) {
+            IMAGE_X_SIZE = N;
+            IMAGE_Y_SIZE = M;
+        }
+        if ( nb == 5 ) {
+            IMAGE_X_SIZE = M;
+            IMAGE_Y_SIZE = N;
+        }
+        if ( nb == 6 ) {
+            IMAGE_X_SIZE = M;
+            IMAGE_Y_SIZE = N;
+        }
+        fprintf(stderr, "*******************************\n" );
+        if (nb != 6) {
+            fprintf(stderr, "* IMAGE SIZE is (%d by %d)\n", IMAGE_X_SIZE, IMAGE_Y_SIZE );
+        } else {
+            fprintf(stderr, "* IMAGE SUBSET SIZE is (%d by %d)\n", IMAGE_X_SIZE, IMAGE_Y_SIZE );
+        }
+        fprintf(stderr, "*******************************\n" );
+        /*********************************************************************/
+        /*  Allocate and initialize data structures                      */
+        /*********************************************************************/
+        if (nb != 6) {
+            tmpImage = psImageAlloc( IMAGE_X_SIZE, IMAGE_Y_SIZE, PS_TYPE_F32 );
+            tmpMask = psImageAlloc( IMAGE_X_SIZE, IMAGE_Y_SIZE, PS_TYPE_U8 );
+            tmpImage2 = NULL;
+            tmpMask2 = NULL;
+        } else {
+            tmpImage2 = psImageAlloc( IMAGE_X_SIZE*2, IMAGE_Y_SIZE*2, PS_TYPE_F32 );
+            tmpMask2 = psImageAlloc( IMAGE_X_SIZE*2, IMAGE_Y_SIZE*2, PS_TYPE_U8 );
+            tmpImage = psImageSubset(tmpImage2,
+                                     IMAGE_X_SIZE/4, IMAGE_Y_SIZE/4,
+                                     IMAGE_X_SIZE/4+IMAGE_X_SIZE, IMAGE_Y_SIZE/4+IMAGE_Y_SIZE);
+            tmpMask= psImageSubset(tmpMask2,
+                                   IMAGE_X_SIZE/4, IMAGE_Y_SIZE/4,
+                                   IMAGE_X_SIZE/4+IMAGE_X_SIZE, IMAGE_Y_SIZE/4+IMAGE_Y_SIZE);
+        }
+
+
+        for ( i = 0;i < tmpImage->numRows;i++ ) {
+            for ( j = 0;j < tmpImage->numCols;j++ ) {
+                tmpImage->data.F32[ i ][ j ] = ( float ) ( i + j + 0.1 );
+            }
+        }
+
+
+        for ( i = 0;i < tmpMask->numRows;i++ ) {
+            for ( j = 0;j < tmpMask->numCols;j++ ) {
+                if ( ( i > ( tmpMask->numRows / 2 ) ) &&
+                        ( j > ( tmpMask->numCols / 2 ) ) ) {
+                    tmpMask->data.U8[ i ][ j ] = 1;
+                } else {
+                    tmpMask->data.U8[ i ][ j ] = 0;
+                }
+            }
+        }
+
+        /*************************************************************************/
+        /*  Calculate Histogram with no mask                             */
+        /*************************************************************************/
+
+        myHist = psHistogramAlloc( 0.0, ( float ) ( IMAGE_X_SIZE + IMAGE_Y_SIZE ),
+                                   NUM_BINS );
+        myHist = psImageHistogram( myHist, tmpImage, NULL, 0 );
+        for ( i = 0;i < NUM_BINS;i++ ) {
+            fprintf(stderr, "Bin number %d bounds: (%.1f - %.1f) data (%.2f)\n", i,
+                    myHist->bounds->data.F32[ i ],
+                    myHist->bounds->data.F32[ i + 1 ],
+                    myHist->nums->data.F32[ i ] );
+        }
+        psFree( myHist );
+
+        /*************************************************************************/
+        /*  Calculate Histogram with mask                                */
+        /*************************************************************************/
+
+        myHist = psHistogramAlloc( 0.0, ( float ) ( IMAGE_X_SIZE + IMAGE_Y_SIZE ),
+                                   NUM_BINS );
+        myHist = psImageHistogram( myHist, tmpImage, tmpMask, 1 );
+        for ( i = 0;i < NUM_BINS;i++ ) {
+            fprintf( stderr, "Bin number %d bounds: (%.2f - %.2f) data (%.2f)\n", i,
+                     myHist->bounds->data.F32[ i ],
+                     myHist->bounds->data.F32[ i + 1 ],
+                     myHist->nums->data.F32[ i ] );
+        }
+
+        /*************************************************************************/
+        /*  Deallocate data structures                                   */
+        /*************************************************************************/
+        psFree( myHist );
+        psFree( tmpImage );
+        psFree( tmpImage2 );
+        psFree( tmpMask );
+        psFree( tmpMask2 );
+    }
+    tmpImage = psImageAlloc( IMAGE_X_SIZE, IMAGE_Y_SIZE, PS_TYPE_F32 );
+    myHist = psHistogramAlloc( 0.0, ( float ) ( IMAGE_X_SIZE + IMAGE_Y_SIZE ),
+                               NUM_BINS );
+    myHist2 = psImageHistogram( NULL, tmpImage, NULL, 0 );
+    if ( myHist2 != NULL ) {
+        fprintf(stderr, "ERROR: myHist2 not equal to NULL\n" );
+    }
+
+    myHist2 = psImageHistogram( myHist, NULL, NULL, 0 );
+    myHist2 = psImageHistogram( NULL, tmpImage, NULL, 0 );
+    if ( myHist2 != NULL ) {
+        fprintf(stderr, "ERROR: myHist2 not equal to NULL\n" );
+    }
+
+
+    tmpMask = psImageAlloc( IMAGE_X_SIZE, IMAGE_Y_SIZE, PS_TYPE_S8 );
+    for ( i = 0;i < tmpMask->numRows;i++ ) {
+        for ( j = 0;j < tmpMask->numCols;j++ ) {
+            if ( ( i > ( tmpMask->numRows / 2 ) ) &&
+                    ( j > ( tmpMask->numCols / 2 ) ) ) {
+                tmpMask->data.S8[ i ][ j ] = 1;
+            } else {
+                tmpMask->data.S8[ i ][ j ] = 0;
+            }
+        }
+    }
+
+    psLogMsg(__func__,PS_LOG_INFO,"Following should be an error for invalid mask type.");
+    myHist2 = psImageHistogram(myHist,tmpImage,tmpMask,1);
+    if (myHist2 != NULL) {
+        fprintf(stderr,"ERROR: myHist2 not equal to NULL\n");
+    }
+
+    psFree( tmpMask );
+    psFree(myHist);
+    psFree(myHist2);
+    psFree( tmpImage );
+
+    return ( !testStatus );
+}
+
+static psS32 testPsImageStats()
+{
+    const int N  = 32;
+    const int M = 64;
+
+    psStats * myStats = NULL;
+    psStats *myStats2 = NULL;
+    psImage *tmpImage = NULL;
+    psImage *tmpImage2 = NULL;
+    psImage *tmpMask = NULL;
+    psImage *tmpMask2 = NULL;
+    psS32 testStatus = true;
+    psS32 nb = 0;
+    psS32 i = 0;
+    psS32 j = 0;
+    psS32 IMAGE_X_SIZE = 0;
+    psS32 IMAGE_Y_SIZE = 0;
+    psS32 currentId = 0;
+
+    currentId = psMemGetId();
+    for ( nb = 0;nb < 7;nb++ ) {
+        if ( nb == 0 ) {
+            IMAGE_X_SIZE = 1;
+            IMAGE_Y_SIZE = 1;
+        }
+        if ( nb == 1 ) {
+            IMAGE_X_SIZE = 1;
+            IMAGE_Y_SIZE = N;
+        }
+        if ( nb == 2 ) {
+            IMAGE_X_SIZE = N;
+            IMAGE_Y_SIZE = 1;
+        }
+        if ( nb == 3 ) {
+            IMAGE_X_SIZE = N;
+            IMAGE_Y_SIZE = N;
+        }
+        if ( nb == 4 ) {
+            IMAGE_X_SIZE = N;
+            IMAGE_Y_SIZE = M;
+        }
+        if ( nb == 5 ) {
+            IMAGE_X_SIZE = M;
+            IMAGE_Y_SIZE = N;
+        }
+        if ( nb == 6 ) {
+            IMAGE_X_SIZE = M;
+            IMAGE_Y_SIZE = N;
+        }
+        fprintf(stderr, "*******************************\n" );
+        if (nb != 6) {
+            fprintf(stderr, "* IMAGE SIZE is (%d by %d)\n", IMAGE_X_SIZE, IMAGE_Y_SIZE );
+        } else {
+            fprintf(stderr, "* IMAGE SUBSET SIZE is (%d by %d)\n", IMAGE_X_SIZE, IMAGE_Y_SIZE );
+        }
+        fprintf(stderr, "*******************************\n" );
+
+        /*************************************************************************/
+        /*  Allocate and initialize data structures                      */
+        /*************************************************************************/
+        if (nb != 6) {
+            tmpImage = psImageAlloc( IMAGE_X_SIZE, IMAGE_Y_SIZE, PS_TYPE_F32 );
+            tmpMask = psImageAlloc( IMAGE_X_SIZE, IMAGE_Y_SIZE, PS_TYPE_U8 );
+            tmpImage2 = NULL;
+            tmpMask2 = NULL;
+        } else {
+            tmpImage2 = psImageAlloc( IMAGE_X_SIZE*2, IMAGE_Y_SIZE*2, PS_TYPE_F32 );
+            tmpMask2 = psImageAlloc( IMAGE_X_SIZE*2, IMAGE_Y_SIZE*2, PS_TYPE_U8 );
+            tmpImage = psImageSubset(tmpImage2,
+                                     IMAGE_X_SIZE/4, IMAGE_Y_SIZE/4,
+                                     IMAGE_X_SIZE/4+IMAGE_X_SIZE, IMAGE_Y_SIZE/4+IMAGE_Y_SIZE);
+            tmpMask = psImageSubset(tmpMask2,
+                                    IMAGE_X_SIZE/4, IMAGE_Y_SIZE/4,
+                                    IMAGE_X_SIZE/4+IMAGE_X_SIZE, IMAGE_Y_SIZE/4+IMAGE_Y_SIZE);
+        }
+
+        for ( i = 0;i < tmpImage->numRows;i++ ) {
+            for ( j = 0;j < tmpImage->numCols;j++ ) {
+                tmpImage->data.F32[ i ][ j ] = ( float ) ( i + j );
+            }
+        }
+        for ( i = 0;i < tmpMask->numRows;i++ ) {
+            for ( j = 0;j < tmpMask->numCols;j++ ) {
+                if ( ( i > ( tmpMask->numRows / 2 ) ) &&
+                        ( j > ( tmpMask->numCols / 2 ) ) ) {
+                    tmpMask->data.U8[ i ][ j ] = 1;
+                } else {
+                    tmpMask->data.U8[ i ][ j ] = 0;
+                }
+            }
+        }
+
+        myStats = psStatsAlloc( PS_STAT_SAMPLE_MEAN );
+        /*************************************************************************/
+        /*  Calculate Sample Mean with no mask                           */
+        /*************************************************************************/
+        psStats* tmpStats = myStats;
+        myStats = psImageStats( myStats, tmpImage, NULL, 0 );
+        if ( myStats != tmpStats ) {
+            fprintf(stderr,"ERROR: input psStats not equal to return psStats\n");
+            psAbort(__func__,"Failed input psStats equal to returned psStats");
+        }
+        fprintf(stderr, "The sample mean was %.2f\n", myStats->sampleMean );
+
+        /*************************************************************************/
+        /*  Calculate Sample Mean with mask                              */
+        /*************************************************************************/
+
+        myStats = psImageStats( myStats, tmpImage, tmpMask, 1 );
+        fprintf(stderr, "The sample mean was %.2f\n", myStats->sampleMean );
+
+        /*************************************************************************/
+        /*  Deallocate data structures                                   */
+        /*************************************************************************/
+        psFree( myStats );
+        psFree( tmpImage );
+        psFree( tmpMask );
+        psFree( tmpImage2 );
+        psFree( tmpMask2 );
+    }
+
+    /*************************************************************************/
+    /*  Test With Various Null Inputs                                        */
+    /*************************************************************************/
+
+    tmpImage = psImageAlloc( IMAGE_X_SIZE, IMAGE_Y_SIZE, PS_TYPE_F32 );
+    tmpMask = psImageAlloc( IMAGE_X_SIZE, IMAGE_Y_SIZE, PS_TYPE_U8 );
+    myStats = psStatsAlloc( 0 );
+
+    myStats2 = psImageStats( myStats, NULL, NULL, 0 );
+    if ( myStats2 != NULL ) {
+        fprintf(stderr, "ERROR: myStats2 = psImageStats(myStats, NULL, NULL, 0) != NULL\n" );
+    }
+
+    myStats2 = psImageStats( NULL, tmpImage, NULL, 0 );
+    if ( myStats2 != NULL ) {
+        fprintf(stderr, "ERROR: myStats2 = psImageStats(NULL, tmpImage, NULL, 0) != NULL\n" );
+    }
+
+    myStats2 = psImageStats( myStats, tmpImage, NULL, 0 );
+
+    psFree( myStats );
+    psFree( tmpImage );
+    psFree( tmpMask );
+
+    tmpImage = psImageAlloc( IMAGE_X_SIZE, IMAGE_Y_SIZE, PS_TYPE_F32);
+    tmpMask = psImageAlloc( IMAGE_X_SIZE, IMAGE_Y_SIZE, PS_TYPE_U32);
+    myStats = psStatsAlloc( PS_STAT_SAMPLE_MEAN );
+    myStats2 = psImageStats( myStats, tmpImage, tmpMask, 0 );
+    if ( myStats2 != NULL ) {
+        fprintf(stderr, "ERROR: psImageStats did not return null when mask is invalid type.\n");
+    }
+    psFree(tmpImage);
+    psFree(tmpMask);
+    psFree(myStats);
+
+    return ( !testStatus );
+}
+
+static psS32 testPsImageFitPolynomial()
+{
+    const int IMAGE_SIZE = 64;
+    const int CHEBY_X_DIM = 8;
+    const int CHEBY_Y_DIM = 8;
+    const int THRESHOLD = 10;
+
+    psStats * myStats = NULL;
+    psImage *tmpImage = NULL;
+    psImage *outImage = NULL;
+    psImage *nullImage = NULL;
+    psPolynomial2D *my2DPoly = NULL;
+    psPolynomial2D *null2DPoly = NULL;
+    psS32 testStatus = true;
+    psS32 i = 0;
+    psS32 j = 0;
+    psS32 currentId = 0;
+
+    currentId = psMemGetId();
+    /*************************************************************************/
+    /*  Allocate and initialize data structures                      */
+    /*************************************************************************/
+    tmpImage = psImageAlloc( IMAGE_SIZE, IMAGE_SIZE, PS_TYPE_F32 );
+    outImage = psImageAlloc( IMAGE_SIZE, IMAGE_SIZE, PS_TYPE_F32 );
+    for ( i = 0;i < IMAGE_SIZE;i++ ) {
+        for ( j = 0;j < IMAGE_SIZE;j++ ) {
+            tmpImage->data.F32[ i ][ j ] = 4.0;
+            tmpImage->data.F32[ i ][ j ] = ( float ) ( i + j );
+            tmpImage->data.F32[ i ][ j ] = ( float ) ( i + j ) + ( 4.0 * ( float ) i );
+            outImage->data.F32[ i ][ j ] = 0.0;
+        }
+    }
+    my2DPoly = psPolynomial2DAlloc( CHEBY_X_DIM, CHEBY_Y_DIM, PS_POLYNOMIAL_CHEB );
+    /*************************************************************************/
+    /*  Calculate Chebyshev Polynomials, no mask                     */
+    /*************************************************************************/
+    my2DPoly = psImageFitPolynomial( my2DPoly, tmpImage );
+    for ( i = 0;i < CHEBY_X_DIM;i++ ) {
+        for ( j = 0;j < CHEBY_Y_DIM;j++ ) {
+            fprintf(stderr, "Cheby Polynomial (%d, %d) coefficient is %.2f\n", i, j, 0.0001f+my2DPoly->coeff[ i ][ j ] );
+        }
+    }
+
+    psLogMsg(__func__,PS_LOG_INFO,"Following should be an error message for NULL coeffs argument.");
+    null2DPoly = psImageFitPolynomial( NULL, tmpImage );
+    if ( null2DPoly != NULL ) {
+        fprintf(stderr,"ERROR: psImageFitPolynomial did not return NULL with invalid coeffs argument.");
+    }
+
+    psLogMsg(__func__,PS_LOG_INFO,"Following should be a error message for NULL input argument.");
+    null2DPoly = psImageFitPolynomial( null2DPoly, NULL );
+    if ( null2DPoly != NULL ) {
+        fprintf(stderr,"ERROR: psImageFitPolynomial did not return NULL with null input image.");
+    }
+
+    /*************************************************************************/
+    /*  Evaluate Chebyshev Polynomials, no mask                      */
+    /*************************************************************************/
+    outImage = psImageEvalPolynomial( outImage, my2DPoly );
+    for ( i = 0;i < IMAGE_SIZE;i++ ) {
+        for ( j = 0;j < IMAGE_SIZE;j++ ) {
+
+            //             fprintf(stderr,"pixel[%d][%d] is (%.2f, %.2f)\n", i, j,
+            //                     tmpImage->data.F32[i][j],
+            //                     outImage->data.F32[i][j]);
+            if ( fabs( outImage->data.F32[ i ][ j ] - tmpImage->data.F32[ i ][ j ] ) > THRESHOLD ) {
+                fprintf(stderr, "Pixel (%d, %d) is %.2f, should be %.2f\n", i, j,
+                        outImage->data.F32[ i ][ j ],
+                        tmpImage->data.F32[ i ][ j ] );
+            }
+
+        }
+    }
+
+
+    psLogMsg(__func__,PS_LOG_INFO,"Following should be an error message for NULL coeffs argument.");
+    nullImage = psImageEvalPolynomial( outImage, NULL );
+    if ( nullImage != NULL ) {
+        fprintf(stderr,"ERROR: psImageEvalPolynomial did not return NULL with invalid coeffs argument.");
+    }
+
+    psLogMsg(__func__,PS_LOG_INFO,"Following should be a error message for NULL input argument.");
+    nullImage = psImageEvalPolynomial( NULL, my2DPoly );
+    if ( nullImage != NULL ) {
+        fprintf(stderr,"ERROR: psImageEvalPolynomial did not return NULL with null input image.");
+    }
+
+    /*************************************************************************/
+    /*  Deallocate data structures                                   */
+    /*************************************************************************/
+    psFree( myStats );
+    psFree( tmpImage );
+    psFree( outImage );
+    psFree( my2DPoly );
+
+    return ( !testStatus );
+}
+
+static psS32 testPsImagePixelInterpolate()
+{
+    const int IMAGE_SIZE = 10;
+
+    psImage *tmpImage   = NULL;
+    psS32 testStatus      = true;
+    psS32 i               = 0;
+    psS32 j               = 0;
+    float pixel         = 0.0;
+    float x             = 0.0;
+    float y             = 0.0;
+
+    /*************************************************************************/
+    /*  Allocate and initialize data structures                      */
+    /*************************************************************************/
+    tmpImage = psImageAlloc(IMAGE_SIZE, IMAGE_SIZE, PS_TYPE_F32);
+    for (i=0;i<IMAGE_SIZE;i++) {
+        for (j=0;j<IMAGE_SIZE;j++) {
+            tmpImage->data.F32[i][j] = 4.0;
+            tmpImage->data.F32[i][j] = (float) (i + j) + (4.0 * (float) i);
+            tmpImage->data.F32[i][j] = (float) (i + j);
+            fprintf(stderr,"%.1f ", tmpImage->data.F32[i][j]);
+        }
+        fprintf(stderr,"\n");
+    }
+    for (i=0;i<IMAGE_SIZE-1;i++) {
+        for (j=0;j<IMAGE_SIZE-1;j++) {
+            x = 0.2 + (float) i;
+            y = 0.2 + (float) j;
+            pixel = psImagePixelInterpolate(tmpImage,
+                                            x, y,
+                                            NULL, 0,
+                                            0,
+                                            PS_INTERPOLATE_BILINEAR);
+            fprintf(stderr,"%.1f ", pixel);
+        }
+        fprintf(stderr,"\n");
+    }
+
+    for (i=0;i<IMAGE_SIZE-1;i++) {
+        for (j=0;j<IMAGE_SIZE-1;j++) {
+            x = 0.2 + (float) i;
+            y = 0.2 + (float) j;
+            pixel = psImagePixelInterpolate(tmpImage,
+                                            x, y,
+                                            NULL,0,
+                                            0,
+                                            PS_INTERPOLATE_BILINEAR);
+            fprintf(stderr,"image[%.1f][%.1f] is interpolated at %.1f\n", x, y, pixel);
+        }
+    }
+
+    psFree(tmpImage);
+
+    return (!testStatus);
+}
+
+#define I_POLY(X, Y) \
+((A) + (B * X) + (C * Y) + (D * X * Y) + (E * X * X) + (F * Y * Y)) \
+
+static bool FitChebyF32(int numCols, int numRows)
+{
+    const double A = 1.0;
+    const double B = 2.0;
+    const double C = 3.0;
+    const double D = 4.0;
+    const double E = 5.0;
+    const double F = 6.0;
+    const double ERROR_TOL = 0.1;
+
+    psImage *tmpImage     = NULL;
+    psImage *outImage     = NULL;
+    bool testStatus      = true;
+    psS32 i               = 0;
+    psS32 j               = 0;
+    float chi2 = 0.0;
+
+
+    fprintf(stderr,"psImageFitPolynomial(), psImageEvalPolynom(): (%d by %d)\n", numRows, numCols);
+
+    /*************************************************************************/
+    /*  Allocate and initialize data structures                      */
+    /*************************************************************************/
+
+    tmpImage = psImageAlloc(numCols, numRows, PS_TYPE_F32);
+    outImage = psImageAlloc(numCols, numRows, PS_TYPE_F32);
+    for (i=0;i<numRows;i++) {
+        for (j=0;j<numCols;j++) {
+            tmpImage->data.F32[i][j] = I_POLY(((float) i), ((float) j));
+        }
+    }
+
+    psPolynomial2D *chebys = psPolynomial2DAlloc(5, 5, PS_POLYNOMIAL_CHEB);
+
+    chebys = psImageFitPolynomial(chebys, tmpImage);
+
+    outImage = psImageEvalPolynomial(outImage, chebys);
+
+    chi2 = 0.0;
+    for (i=0;i<numRows;i++) {
+        for (j=0;j<numCols;j++) {
+            float expect = tmpImage->data.F32[i][j];
+            float actual = outImage->data.F32[i][j];
+            chi2+= (actual-expect) * (actual-expect);
+            if (fabs((actual - expect) / expect) > ERROR_TOL) {
+                fprintf(stderr,"pixel [%d][%d] is %.2f should be %.2f\n", i, j, actual, expect);
+            }
+        }
+    }
+    chi2/= ((float) (numCols * numRows));
+    fprintf(stderr,"The chi-squared per pixel is %.2f\n", chi2);
+
+    psFree(tmpImage);
+    psFree(outImage);
+    psFree(chebys);
+
+    /*************************************************************************/
+    /*  Deallocate data structures                                   */
+    /*************************************************************************/
+
+    return(testStatus);
+}
+
+static bool FitChebyF64(int numCols, int numRows)
+{
+    const double A = 1.0;
+    const double B = 2.0;
+    const double C = 3.0;
+    const double D = 4.0;
+    const double E = 5.0;
+    const double F = 6.0;
+    const double ERROR_TOL = 0.1;
+
+    psImage *tmpImage     = NULL;
+    psImage *outImage     = NULL;
+    bool testStatus      = true;
+    psS32 i               = 0;
+    psS32 j               = 0;
+    double chi2 = 0.0;
+
+
+    fprintf(stderr,"psImageFitPolynomial(), psImageEvalPolynom(): (%d by %d)\n", numRows, numCols);
+
+    /*************************************************************************/
+    /*  Allocate and initialize data structures                      */
+    /*************************************************************************/
+
+    tmpImage = psImageAlloc(numCols, numRows, PS_TYPE_F64);
+    outImage = psImageAlloc(numCols, numRows, PS_TYPE_F64);
+    for (i=0;i<numRows;i++) {
+        for (j=0;j<numCols;j++) {
+            tmpImage->data.F64[i][j] = I_POLY(((double) i), ((double) j));
+        }
+    }
+
+    psPolynomial2D *chebys = psPolynomial2DAlloc(5, 5, PS_POLYNOMIAL_CHEB);
+
+    chebys = psImageFitPolynomial(chebys, tmpImage);
+
+    outImage = psImageEvalPolynomial(outImage, chebys);
+
+    chi2 = 0.0;
+    for (i=0;i<numRows;i++) {
+        for (j=0;j<numCols;j++) {
+            double expect = tmpImage->data.F64[i][j];
+            double actual = outImage->data.F64[i][j];
+            chi2+= (actual-expect) * (actual-expect);
+            if (fabs((actual - expect) / expect) > ERROR_TOL) {
+                fprintf(stderr,"pixel [%d][%d] is %.2f should be %.2f\n", i, j, actual, expect);
+            }
+        }
+    }
+    chi2/= ((double) (numCols * numRows));
+    fprintf(stderr,"The chi-squared per pixel is %.2f\n", chi2);
+
+    psFree(tmpImage);
+    psFree(outImage);
+    psFree(chebys);
+
+    /*************************************************************************/
+    /*  Deallocate data structures                                   */
+    /*************************************************************************/
+
+    return(testStatus);
+}
+
+static psS32 testPsImageEvalPolynom()
+{
+    if (!FitChebyF32(1, 1)) {
+        return 1;
+    }
+    if (!FitChebyF32(1, 5)) {
+        return 2;
+    }
+    if (!FitChebyF32(5, 1)) {
+        return 3;
+    }
+    if (!FitChebyF32(5, 5)) {
+        return 4;
+    }
+    if (!FitChebyF64(1, 1)) {
+        return 5;
+    }
+    if (!FitChebyF64(1, 5)) {
+        return 6;
+    }
+    if (!FitChebyF64(5, 1)) {
+        return 7;
+    }
+    if (!FitChebyF64(5, 5)) {
+        return 8;
+    }
+    return 0;
+}
+
Index: /tags/ipp-1-X/bug123/psLib/test/image/verified/fBiOut.fits
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/image/verified/fBiOut.fits	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/image/verified/fBiOut.fits	(revision 22331)
@@ -0,0 +1,6427 @@
+SIMPLE  =                    T / file does conform to FITS standard             BITPIX  =                  -32 / number of bits per data pixel                  NAXIS   =                    3 / number of data axes                            NAXIS1  =                   64 / length of data axis 1                          NAXIS2  =                   64 / length of data axis 2                          NAXIS3  =                    1 / length of data axis 3                          EXTEND  =                    T / FITS dataset may contain extensions            COMMENT   FITS (Flexible Image Transport System) format is defined in 'AstronomyCOMMENT   and Astrophysics', volume 376, page 359; bibcode: 2001A&A...376..359H BZERO   =   0.000000000000E+00 / Pixel Value Offset                             BSCALE  =   1.000000000000E+00 / Pixel Value Scale                              END                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             B~
+B~záB~p€B~ffB~\)B~QìB~G®B~=qB~33B~(öB~
+žB~{B~
+=B~  B}õÃB}ë
+B}áHB}×
+B}ÌÍB}ÂB}žRB}®B}£×B}B}\B}
+B}záB}p€B}ffB}\)B}QìB}G®B}=qB}33B}(öB}
+žB}{B}
+=B}  B|õÃB|ë
+B|áHB|×
+B|ÌÍB|ÂB|žRB|®B|£×B|B|\B|
+B|záB|p€B|ffB|\)B|QìB|G®B|=qB|33B|(öB|
+žB|{B|
+=B|  Bz
+BzzáBzp€BzffBz\)BzQìBzG®Bz=qBz33Bz(öBz
+žBz{Bz
+=Bz  ByõÃByë
+ByáHBy×
+ByÌÍByÂByžRBy®By£×ByBy\By
+ByzáByp€ByffBy\)ByQìByG®By=qBy33By(öBy
+žBy{By
+=By  BxõÃBxë
+BxáHBx×
+BxÌÍBxÂBxžRBx®Bx£×BxBx\Bx
+BxzáBxp€BxffBx\)BxQìBxG®Bx=qBx33Bx(öBx
+žBx{Bx
+=Bx  Bv
+BvzáBvp€BvffBv\)BvQìBvG®Bv=qBv33Bv(öBv
+žBv{Bv
+=Bv  BuõÃBuë
+BuáHBu×
+BuÌÍBuÂBužRBu®Bu£×BuBu\Bu
+BuzáBup€BuffBu\)BuQìBuG®Bu=qBu33Bu(öBu
+žBu{Bu
+=Bu  BtõÃBtë
+BtáHBt×
+BtÌÍBtÂBtžRBt®Bt£×BtBt\Bt
+BtzáBtp€BtffBt\)BtQìBtG®Bt=qBt33Bt(öBt
+žBt{Bt
+=Bt  Br
+BrzáBrp€BrffBr\)BrQìBrG®Br=qBr33Br(öBr
+žBr{Br
+=Br  BqõÃBqë
+BqáHBq×
+BqÌÍBqÂBqžRBq®Bq£×BqBq\Bq
+BqzáBqp€BqffBq\)BqQìBqG®Bq=qBq33Bq(öBq
+žBq{Bq
+=Bq  BpõÃBpë
+BpáHBp×
+BpÌÍBpÂBpžRBp®Bp£×BpBp\Bp
+BpzáBpp€BpffBp\)BpQìBpG®Bp=qBp33Bp(öBp
+žBp{Bp
+=Bp  Bn
+BnzáBnp€BnffBn\)BnQìBnG®Bn=qBn33Bn(öBn
+žBn{Bn
+=Bn  BmõÃBmë
+BmáHBm×
+BmÌÍBmÂBmžRBm®Bm£×BmBm\Bm
+BmzáBmp€BmffBm\)BmQìBmG®Bm=qBm33Bm(öBm
+žBm{Bm
+=Bm  BlõÃBlë
+BláHBl×
+BlÌÍBlÂBlžRBl®Bl£×BlBl\Bl
+BlzáBlp€BlffBl\)BlQìBlG®Bl=qBl33Bl(öBl
+žBl{Bl
+=Bl  Bj
+BjzáBjp€BjffBj\)BjQìBjG®Bj=qBj33Bj(öBj
+žBj{Bj
+=Bj  BiõÃBië
+BiáHBi×
+BiÌÍBiÂBižRBi®Bi£×BiBi\Bi
+BizáBip€BiffBi\)BiQìBiG®Bi=qBi33Bi(öBi
+žBi{Bi
+=Bi  BhõÃBhë
+BháHBh×
+BhÌÍBhÂBhžRBh®Bh£×BhBh\Bh
+BhzáBhp€BhffBh\)BhQìBhG®Bh=qBh33Bh(öBh
+žBh{Bh
+=Bh  Bf
+BfzáBfp€BfffBf\)BfQìBfG®Bf=qBf33Bf(öBf
+žBf{Bf
+=Bf  BeõÃBeë
+BeáHBe×
+BeÌÍBeÂBežRBe®Be£×BeBe\Be
+BezáBep€BeffBe\)BeQìBeG®Be=qBe33Be(öBe
+žBe{Be
+=Be  BdõÃBdë
+BdáHBd×
+BdÌÍBdÂBdžRBd®Bd£×BdBd\Bd
+BdzáBdp€BdffBd\)BdQìBdG®Bd=qBd33Bd(öBd
+žBd{Bd
+=Bd  Bb
+BbzáBbp€BbffBb\)BbQìBbG®Bb=qBb33Bb(öBb
+žBb{Bb
+=Bb  BaõÃBaë
+BaáHBa×
+BaÌÍBaÂBažRBa®Ba£×BaBa\Ba
+BazáBap€BaffBa\)BaQìBaG®Ba=qBa33Ba(öBa
+žBa{Ba
+=Ba  B`õÃB`ë
+B`áHB`×
+B`ÌÍB`ÂB`žRB`®B`£×B`B`\B`
+B`záB`p€B`ffB`\)B`QìB`G®B`=qB`33B`(öB`
+žB`{B`
+=B`  B^
+B^záB^p€B^ffB^\)B^QìB^G®B^=qB^33B^(öB^
+žB^{B^
+=B^  B]õÃB]ë
+B]áHB]×
+B]ÌÍB]ÂB]žRB]®B]£×B]B]\B]
+B]záB]p€B]ffB]\)B]QìB]G®B]=qB]33B](öB]
+žB]{B]
+=B]  B\õÃB\ë
+B\áHB\×
+B\ÌÍB\ÂB\žRB\®B\£×B\B\\B\
+B\záB\p€B\ffB\\)B\QìB\G®B\=qB\33B\(öB\
+žB\{B\
+=B\  BZ
+BZzáBZp€BZffBZ\)BZQìBZG®BZ=qBZ33BZ(öBZ
+žBZ{BZ
+=BZ  BYõÃBYë
+BYáHBY×
+BYÌÍBYÂBYžRBY®BY£×BYBY\BY
+BYzáBYp€BYffBY\)BYQìBYG®BY=qBY33BY(öBY
+žBY{BY
+=BY  BXõÃBXë
+BXáHBX×
+BXÌÍBXÂBXžRBX®BX£×BXBX\BX
+BXzáBXp€BXffBX\)BXQìBXG®BX=qBX33BX(öBX
+žBX{BX
+=BX  BV
+BVzáBVp€BVffBV\)BVQìBVG®BV=qBV33BV(öBV
+žBV{BV
+=BV  BUõÃBUë
+BUáHBU×
+BUÌÍBUÂBUžRBU®BU£×BUBU\BU
+BUzáBUp€BUffBU\)BUQìBUG®BU=qBU33BU(öBU
+žBU{BU
+=BU  BTõÃBTë
+BTáHBT×
+BTÌÍBTÂBTžRBT®BT£×BTBT\BT
+BTzáBTp€BTffBT\)BTQìBTG®BT=qBT33BT(öBT
+žBT{BT
+=BT  BR
+BRzáBRp€BRffBR\)BRQìBRG®BR=qBR33BR(öBR
+žBR{BR
+=BR  BQõÃBQë
+BQáHBQ×
+BQÌÍBQÂBQžRBQ®BQ£×BQBQ\BQ
+BQzáBQp€BQffBQ\)BQQìBQG®BQ=qBQ33BQ(öBQ
+žBQ{BQ
+=BQ  BPõÃBPë
+BPáHBP×
+BPÌÍBPÂBPžRBP®BP£×BPBP\BP
+BPzáBPp€BPffBP\)BPQìBPG®BP=qBP33BP(öBP
+žBP{BP
+=BP  BN
+BNzáBNp€BNffBN\)BNQìBNG®BN=qBN33BN(öBN
+žBN{BN
+=BN  BMõÃBMë
+BMáHBM×
+BMÌÍBMÂBMžRBM®BM£×BMBM\BM
+BMzáBMp€BMffBM\)BMQìBMG®BM=qBM33BM(öBM
+žBM{BM
+=BM  BLõÃBLë
+BLáHBL×
+BLÌÍBLÂBLžRBL®BL£×BLBL\BL
+BLzáBLp€BLffBL\)BLQìBLG®BL=qBL33BL(öBL
+žBL{BL
+=BL  BJ
+BJzáBJp€BJffBJ\)BJQìBJG®BJ=qBJ33BJ(öBJ
+žBJ{BJ
+=BJ  BIõÃBIë
+BIáHBI×
+BIÌÍBIÂBIžRBI®BI£×BIBI\BI
+BIzáBIp€BIffBI\)BIQìBIG®BI=qBI33BI(öBI
+žBI{BI
+=BI  BHõÃBHë
+BHáHBH×
+BHÌÍBHÂBHžRBH®BH£×BHBH\BH
+BHzáBHp€BHffBH\)BHQìBHG®BH=qBH33BH(öBH
+žBH{BH
+=BH  BF
+BFzáBFp€BFffBF\)BFQìBFG®BF=qBF33BF(öBF
+žBF{BF
+=BF  BEõÃBEë
+BEáHBE×
+BEÌÍBEÂBEžRBE®BE£×BEBE\BE
+BEzáBEp€BEffBE\)BEQìBEG®BE=qBE33BE(öBE
+žBE{BE
+=BE  BDõÃBDë
+BDáHBD×
+BDÌÍBDÂBDžRBD®BD£×BDBD\BD
+BDzáBDp€BDffBD\)BDQìBDG®BD=qBD33BD(öBD
+žBD{BD
+=BD  BB
+BBzáBBp€BBffBB\)BBQìBBG®BB=qBB33BB(öBB
+žBB{BB
+=BB  BAõÃBAë
+BAáHBA×
+BAÌÍBAÂBAžRBA®BA£×BABA\BA
+BAzáBAp€BAffBA\)BAQìBAG®BA=qBA33BA(öBA
+žBA{BA
+=BA  B@õÃB@ë
+B@áHB@×
+B@ÌÍB@ÂB@žRB@®B@£×B@B@\B@
+B@záB@p€B@ffB@\)B@QìB@G®B@=qB@33B@(öB@
+žB@{B@
+=B@  B>
+B>záB>p€B>ffB>\)B>QìB>G®B>=qB>33B>(öB>
+žB>{B>
+=B>  B=õÃB=ë
+B=áHB=×
+B=ÌÍB=ÂB=žRB=®B=£×B=B=\B=
+B=záB=p€B=ffB=\)B=QìB=G®B==qB=33B=(öB=
+žB={B=
+=B=  B<õÃB<ë
+B<áHB<×
+B<ÌÍB<ÂB<žRB<®B<£×B<B<\B<
+B<záB<p€B<ffB<\)B<QìB<G®B<=qB<33B<(öB<
+žB<{B<
+=B<  B:
+B:záB:p€B:ffB:\)B:QìB:G®B:=qB:33B:(öB:
+žB:{B:
+=B:  B9õÃB9ë
+B9áHB9×
+B9ÌÍB9ÂB9žRB9®B9£×B9B9\B9
+B9záB9p€B9ffB9\)B9QìB9G®B9=qB933B9(öB9
+žB9{B9
+=B9  B8õÃB8ë
+B8áHB8×
+B8ÌÍB8ÂB8žRB8®B8£×B8B8\B8
+B8záB8p€B8ffB8\)B8QìB8G®B8=qB833B8(öB8
+žB8{B8
+=B8  B6
+B6záB6p€B6ffB6\)B6QìB6G®B6=qB633B6(öB6
+žB6{B6
+=B6  B5õÃB5ë
+B5áHB5×
+B5ÌÍB5ÂB5žRB5®B5£×B5B5\B5
+B5záB5p€B5ffB5\)B5QìB5G®B5=qB533B5(öB5
+žB5{B5
+=B5  B4õÃB4ë
+B4áHB4×
+B4ÌÍB4ÂB4žRB4®B4£×B4B4\B4
+B4záB4p€B4ffB4\)B4QìB4G®B4=qB433B4(öB4
+žB4{B4
+=B4  B2
+B2záB2p€B2ffB2\)B2QìB2G®B2=qB233B2(öB2
+žB2{B2
+=B2  B1õÃB1ë
+B1áHB1×
+B1ÌÍB1ÂB1žRB1®B1£×B1B1\B1
+B1záB1p€B1ffB1\)B1QìB1G®B1=qB133B1(öB1
+žB1{B1
+=B1  B0õÃB0ë
+B0áHB0×
+B0ÌÍB0ÂB0žRB0®B0£×B0B0\B0
+B0záB0p€B0ffB0\)B0QìB0G®B0=qB033B0(öB0
+žB0{B0
+=B0  B.
+B.záB.p€B.ffB.\)B.QìB.G®B.=qB.33B.(öB.
+žB.{B.
+=B.  B-õÃB-ë
+B-áHB-×
+B-ÌÍB-ÂB-žRB-®B-£×B-B-\B-
+B-záB-p€B-ffB-\)B-QìB-G®B-=qB-33B-(öB-
+žB-{B-
+=B-  B,õÃB,ë
+B,áHB,×
+B,ÌÍB,ÂB,žRB,®B,£×B,B,\B,
+B,záB,p€B,ffB,\)B,QìB,G®B,=qB,33B,(öB,
+žB,{B,
+=B,  B*
+B*záB*p€B*ffB*\)B*QìB*G®B*=qB*33B*(öB*
+žB*{B*
+=B*  B)õÃB)ë
+B)áHB)×
+B)ÌÍB)ÂB)žRB)®B)£×B)B)\B)
+B)záB)p€B)ffB)\)B)QìB)G®B)=qB)33B)(öB)
+žB){B)
+=B)  B(õÃB(ë
+B(áHB(×
+B(ÌÍB(ÂB(žRB(®B(£×B(B(\B(
+B(záB(p€B(ffB(\)B(QìB(G®B(=qB(33B((öB(
+žB({B(
+=B(  B&
+B&záB&p€B&ffB&\)B&QìB&G®B&=qB&33B&(öB&
+žB&{B&
+=B&  B%õÃB%ë
+B%áHB%×
+B%ÌÍB%ÂB%žRB%®B%£×B%B%\B%
+B%záB%p€B%ffB%\)B%QìB%G®B%=qB%33B%(öB%
+žB%{B%
+=B%  B$õÃB$ë
+B$áHB$×
+B$ÌÍB$ÂB$žRB$®B$£×B$B$\B$
+B$záB$p€B$ffB$\)B$QìB$G®B$=qB$33B$(öB$
+žB${B$
+=B$  B"
+B"záB"p€B"ffB"\)B"QìB"G®B"=qB"33B"(öB"
+žB"{B"
+=B"  B!õÃB!ë
+B!áHB!×
+B!ÌÍB!ÂB!žRB!®B!£×B!B!\B!
+B!záB!p€B!ffB!\)B!QìB!G®B!=qB!33B!(öB!
+žB!{B!
+=B!  B õÃB ë
+B áHB ×
+B ÌÍB ÂB žRB ®B £×B B \B 
+B záB p€B ffB \)B QìB G®B =qB 33B (öB 
+žB {B 
+=B   B
+
+B
+záB
+p€B
+ffB
+\)B
+QìB
+G®B
+=qB
+33B
+(öB
+
+žB
+{B
+
+=B
+  B
+õÃB
+ë
+B
+áHB
+×
+B
+ÌÍB
+ÂB
+žRB
+®B
+£×B
+B
+\B
+
+B
+záB
+p€B
+ffB
+\)B
+QìB
+G®B
+=qB
+33B
+(öB
+
+žB
+{B
+
+=B
+  B
+õÃB
+ë
+B
+áHB
+×
+B
+ÌÍB
+ÂB
+žRB
+®B
+£×B
+B
+\B
+
+B
+záB
+p€B
+ffB
+\)B
+QìB
+G®B
+=qB
+33B
+(öB
+
+žB
+{B
+
+=B
+  B
+BzáBp€BffB\)BQìBG®B=qB33B(öB
+žB{B
+=B  BõÃBë
+BáHB×
+BÌÍBÂBžRB®B£×BB\B
+BzáBp€BffB\)BQìBG®B=qB33B(öB
+žB{B
+=B  BõÃBë
+BáHB×
+BÌÍBÂBžRB®B£×BB\B
+BzáBp€BffB\)BQìBG®B=qB33B(öB
+žB{B
+=B  B
+BzáBp€BffB\)BQìBG®B=qB33B(öB
+žB{B
+=B  BõÃBë
+BáHB×
+BÌÍBÂBžRB®B£×BB\B
+BzáBp€BffB\)BQìBG®B=qB33B(öB
+žB{B
+=B  BõÃBë
+BáHB×
+BÌÍBÂBžRB®B£×BB\B
+BzáBp€BffB\)BQìBG®B=qB33B(öB
+žB{B
+=B  B
+BzáBp€BffB\)BQìBG®B=qB33B(öB
+žB{B
+=B  BõÃBë
+BáHB×
+BÌÍBÂBžRB®B£×BB\B
+BzáBp€BffB\)BQìBG®B=qB33B(öB
+žB{B
+=B  BõÃBë
+BáHB×
+BÌÍBÂBžRB®B£×BB\B
+BzáBp€BffB\)BQìBG®B=qB33B(öB
+žB{B
+=B  B
+BzáBp€BffB\)BQìBG®B=qB33B(öB
+žB{B
+=B  B
+õÃB
+ë
+B
+áHB
+×
+B
+ÌÍB
+ÂB
+žRB
+®B
+£×B
+B
+\B
+
+B
+záB
+p€B
+ffB
+\)B
+QìB
+G®B
+=qB
+33B
+(öB
+
+žB
+{B
+=B
+  B
+õÃB
+ë
+B
+áHB
+×
+B
+ÌÍB
+ÂB
+žRB
+®B
+£×B
+B
+\B
+
+B
+záB
+p€B
+ffB
+\)B
+QìB
+G®B
+=qB
+33B
+(öB
+
+žB
+{B
+
+=B
+  B
+
+B
+záB
+p€B
+ffB
+\)B
+QìB
+G®B
+=qB
+33B
+(öB
+
+žB
+{B
+
+=B
+  B	õÃB	ë
+B	áHB	×
+B	ÌÍB	ÂB	žRB	®B	£×B	B	\B	
+B	záB	p€B	ffB	\)B	QìB	G®B	=qB	33B	(öB	
+žB	{B	
+=B	  BõÃBë
+BáHB×
+BÌÍBÂBžRB®B£×BB\B
+BzáBp€BffB\)BQìBG®B=qB33B(öB
+žB{B
+=B  B
+BzáBp€BffB\)BQìBG®B=qB33B(öB
+žB{B
+=B  BõÃBë
+BáHB×
+BÌÍBÂBžRB®B£×BB\B
+BzáBp€BffB\)BQìBG®B=qB33B(öB
+žB{B
+=B  BõÃBë
+BáHB×
+BÌÍBÂBžRB®B£×BB\B
+BzáBp€BffB\)BQìBG®B=qB33B(öB
+žB{B
+=B  B
+BzáBp€BffB\)BQìBG®B=qB33B(öB
+žB{B
+=B  BõÃBë
+BáHB×
+BÌÍBÂBžRB®B£×BB\B
+BzáBp€BffB\)BQìBG®B=qB33B(öB
+žB{B
+=B  B õÃB ë
+B áHB ×
+B ÌÍB ÂB žRB ®B £×B B \B 
+B záB p€B ffB \)B QìB G®B =qB 33B (öB 
+žB {B 
+=B   Aý
+=AüõÃAüáHAüÌÍAüžRAü£×Aü\AüzáAüffAüQìAü=qAü(öAü{Aü  Aûë
+Aû×
+AûÂAû®AûAû
+Aûp€Aû\)AûG®Aû33Aû
+žAû
+=AúõÃAúáHAúÌÍAúžRAú£×Aú\AúzáAúffAúQìAú=qAú(öAú{Aú  Aùë
+Aù×
+AùÂAù®AùAù
+Aùp€Aù\)AùG®Aù33Aù
+žAù
+=AøõÃAøáHAøÌÍAøžRAø£×Aø\AøzáAøffAøQìAø=qAø(öAø{Aø  Aõ
+=AôõÃAôáHAôÌÍAôžRAô£×Aô\AôzáAôffAôQìAô=qAô(öAô{Aô  Aóë
+Aó×
+AóÂAó®AóAó
+Aóp€Aó\)AóG®Aó33Aó
+žAó
+=AòõÃAòáHAòÌÍAòžRAò£×Aò\AòzáAòffAòQìAò=qAò(öAò{Aò  Añë
+Añ×
+AñÂAñ®AñAñ
+Añp€Añ\)AñG®Añ33Añ
+žAñ
+=AðõÃAðáHAðÌÍAðžRAð£×Að\AðzáAðffAðQìAð=qAð(öAð{Að  Aí
+=AìõÃAìáHAìÌÍAìžRAì£×Aì\AìzáAìffAìQìAì=qAì(öAì{Aì  Aëë
+Aë×
+AëÂAë®AëAë
+Aëp€Aë\)AëG®Aë33Aë
+žAë
+=AêõÃAêáHAêÌÍAêžRAê£×Aê\AêzáAêffAêQìAê=qAê(öAê{Aê  Aéë
+Aé×
+AéÂAé®AéAé
+Aép€Aé\)AéG®Aé33Aé
+žAé
+=AèõÃAèáHAèÌÍAèžRAè£×Aè\AèzáAèffAèQìAè=qAè(öAè{Aè  Aå
+=AäõÃAäáHAäÌÍAäžRAä£×Aä\AäzáAäffAäQìAä=qAä(öAä{Aä  Aãë
+Aã×
+AãÂAã®AãAã
+Aãp€Aã\)AãG®Aã33Aã
+žAã
+=AâõÃAâáHAâÌÍAâžRAâ£×Aâ\AâzáAâffAâQìAâ=qAâ(öAâ{Aâ  Aáë
+Aá×
+AáÂAá®AáAá
+Aáp€Aá\)AáG®Aá33Aá
+žAá
+=AàõÃAàáHAàÌÍAàžRAà£×Aà\AàzáAàffAàQìAà=qAà(öAà{Aà  AÝ
+=AÜõÃAÜáHAÜÌÍAÜžRAÜ£×AÜ\AÜzáAÜffAÜQìAÜ=qAÜ(öAÜ{AÜ  AÛë
+AÛ×
+AÛÂAÛ®AÛAÛ
+AÛp€AÛ\)AÛG®AÛ33AÛ
+žAÛ
+=AÚõÃAÚáHAÚÌÍAÚžRAÚ£×AÚ\AÚzáAÚffAÚQìAÚ=qAÚ(öAÚ{AÚ  AÙë
+AÙ×
+AÙÂAÙ®AÙAÙ
+AÙp€AÙ\)AÙG®AÙ33AÙ
+žAÙ
+=AØõÃAØáHAØÌÍAØžRAØ£×AØ\AØzáAØffAØQìAØ=qAØ(öAØ{AØ  AÕ
+=AÔõÃAÔáHAÔÌÍAÔžRAÔ£×AÔ\AÔzáAÔffAÔQìAÔ=qAÔ(öAÔ{AÔ  AÓë
+AÓ×
+AÓÂAÓ®AÓAÓ
+AÓp€AÓ\)AÓG®AÓ33AÓ
+žAÓ
+=AÒõÃAÒáHAÒÌÍAÒžRAÒ£×AÒ\AÒzáAÒffAÒQìAÒ=qAÒ(öAÒ{AÒ  AÑë
+AÑ×
+AÑÂAÑ®AÑAÑ
+AÑp€AÑ\)AÑG®AÑ33AÑ
+žAÑ
+=AÐõÃAÐáHAÐÌÍAÐžRAÐ£×AÐ\AÐzáAÐffAÐQìAÐ=qAÐ(öAÐ{AÐ  AÍ
+=AÌõÃAÌáHAÌÌÍAÌžRAÌ£×AÌ\AÌzáAÌffAÌQìAÌ=qAÌ(öAÌ{AÌ  AËë
+AË×
+AËÂAË®AËAË
+AËp€AË\)AËG®AË33AË
+žAË
+=AÊõÃAÊáHAÊÌÍAÊžRAÊ£×AÊ\AÊzáAÊffAÊQìAÊ=qAÊ(öAÊ{AÊ  AÉë
+AÉ×
+AÉÂAÉ®AÉAÉ
+AÉp€AÉ\)AÉG®AÉ33AÉ
+žAÉ
+=AÈõÃAÈáHAÈÌÍAÈžRAÈ£×AÈ\AÈzáAÈffAÈQìAÈ=qAÈ(öAÈ{AÈ  AÅ
+=AÄõÃAÄáHAÄÌÍAÄžRAÄ£×AÄ\AÄzáAÄffAÄQìAÄ=qAÄ(öAÄ{AÄ  AÃë
+AÃ×
+AÃÂAÃ®AÃAÃ
+AÃp€AÃ\)AÃG®AÃ33AÃ
+žAÃ
+=AÂõÃAÂáHAÂÌÍAÂžRAÂ£×AÂ\AÂzáAÂffAÂQìAÂ=qAÂ(öAÂ{AÂ  AÁë
+AÁ×
+AÁÂAÁ®AÁAÁ
+AÁp€AÁ\)AÁG®AÁ33AÁ
+žAÁ
+=AÀõÃAÀáHAÀÌÍAÀžRAÀ£×AÀ\AÀzáAÀffAÀQìAÀ=qAÀ(öAÀ{AÀ  Aœ
+=AŒõÃAŒáHAŒÌÍAŒžRAŒ£×AŒ\AŒzáAŒffAŒQìAŒ=qAŒ(öAŒ{AŒ  A»ë
+A»×
+A»ÂA»®A»A»
+A»p€A»\)A»G®A»33A»
+žA»
+=AºõÃAºáHAºÌÍAºžRAº£×Aº\AºzáAºffAºQìAº=qAº(öAº{Aº  A¹ë
+A¹×
+A¹ÂA¹®A¹A¹
+A¹p€A¹\)A¹G®A¹33A¹
+žA¹
+=AžõÃAžáHAžÌÍAžžRAž£×Až\AžzáAžffAžQìAž=qAž(öAž{Až  Aµ
+=AŽõÃAŽáHAŽÌÍAŽžRAŽ£×AŽ\AŽzáAŽffAŽQìAŽ=qAŽ(öAŽ{AŽ  A³ë
+A³×
+A³ÂA³®A³A³
+A³p€A³\)A³G®A³33A³
+žA³
+=A²õÃA²áHA²ÌÍA²žRA²£×A²\A²záA²ffA²QìA²=qA²(öA²{A²  A±ë
+A±×
+A±ÂA±®A±A±
+A±p€A±\)A±G®A±33A±
+žA±
+=A°õÃA°áHA°ÌÍA°žRA°£×A°\A°záA°ffA°QìA°=qA°(öA°{A°  A­
+=A¬õÃA¬áHA¬ÌÍA¬žRA¬£×A¬\A¬záA¬ffA¬QìA¬=qA¬(öA¬{A¬  A«ë
+A«×
+A«ÂA«®A«A«
+A«p€A«\)A«G®A«33A«
+žA«
+=AªõÃAªáHAªÌÍAªžRAª£×Aª\AªzáAªffAªQìAª=qAª(öAª{Aª  A©ë
+A©×
+A©ÂA©®A©A©
+A©p€A©\)A©G®A©33A©
+žA©
+=AšõÃAšáHAšÌÍAšžRAš£×Aš\AšzáAšffAšQìAš=qAš(öAš{Aš  A¥
+=A€õÃA€áHA€ÌÍA€žRA€£×A€\A€záA€ffA€QìA€=qA€(öA€{A€  A£ë
+A£×
+A£ÂA£®A£A£
+A£p€A£\)A£G®A£33A£
+žA£
+=A¢õÃA¢áHA¢ÌÍA¢žRA¢£×A¢\A¢záA¢ffA¢QìA¢=qA¢(öA¢{A¢  A¡ë
+A¡×
+A¡ÂA¡®A¡A¡
+A¡p€A¡\)A¡G®A¡33A¡
+žA¡
+=A õÃA áHA ÌÍA žRA £×A \A záA ffA QìA =qA (öA {A   A
+=AõÃAáHAÌÍAžRA£×A\AzáAffAQìA=qA(öA{A  Aë
+A×
+AÂA®AA
+Ap€A\)AG®A33A
+žA
+=AõÃAáHAÌÍAžRA£×A\AzáAffAQìA=qA(öA{A  Aë
+A×
+AÂA®AA
+Ap€A\)AG®A33A
+žA
+=AõÃAáHAÌÍAžRA£×A\AzáAffAQìA=qA(öA{A  A
+=AõÃAáHAÌÍAžRA£×A\AzáAffAQìA=qA(öA{A  Aë
+A×
+AÂA®AA
+Ap€A\)AG®A33A
+žA
+=AõÃAáHAÌÍAžRA£×A\AzáAffAQìA=qA(öA{A  Aë
+A×
+AÂA®AA
+Ap€A\)AG®A33A
+žA
+=AõÃAáHAÌÍAžRA£×A\AzáAffAQìA=qA(öA{A  A
+=AõÃAáHAÌÍAžRA£×A\AzáAffAQìA=qA(öA{A  Aë
+A×
+AÂA®AA
+Ap€A\)AG®A33A
+žA
+=AõÃAáHAÌÍAžRA£×A\AzáAffAQìA=qA(öA{A  Aë
+A×
+AÂA®AA
+Ap€A\)AG®A33A
+žA
+=AõÃAáHAÌÍAžRA£×A\AzáAffAQìA=qA(öA{A  A
+
+=AõÃAáHAÌÍAžRA£×A\AzáAffAQìA=qA(öA{A  Aë
+A×
+AÂA®AA
+Ap€A\)AG®A33A
+žA
+=AõÃAáHAÌÍAžRA£×A\AzáAffAQìA=qA(öA{A  Aë
+A×
+AÂA®AA
+Ap€A\)AG®A33A
+žA
+=AõÃAáHAÌÍAžRA£×A\AzáAffAQìA=qA(öA{A  Az{Ayë
+AyÂAyAyp€AyG®Ay
+žAxõÃAxÌÍAx£×AxzáAxQìAx(öAx  Aw×
+Aw®Aw
+Aw\)Aw33Aw
+=AváHAvžRAv\AvffAv=qAv{Auë
+AuÂAuAup€AuG®Au
+žAtõÃAtÌÍAt£×AtzáAtQìAt(öAt  As×
+As®As
+As\)As33As
+=AráHAržRAr\ArffAr=qAr{Aqë
+AqÂAqAqp€AqG®Aq
+žApõÃApÌÍAp£×ApzáApQìAp(öAp  Aj{Aië
+AiÂAiAip€AiG®Ai
+žAhõÃAhÌÍAh£×AhzáAhQìAh(öAh  Ag×
+Ag®Ag
+Ag\)Ag33Ag
+=AfáHAfžRAf\AfffAf=qAf{Aeë
+AeÂAeAep€AeG®Ae
+žAdõÃAdÌÍAd£×AdzáAdQìAd(öAd  Ac×
+Ac®Ac
+Ac\)Ac33Ac
+=AbáHAbžRAb\AbffAb=qAb{Aaë
+AaÂAaAap€AaG®Aa
+žA`õÃA`ÌÍA`£×A`záA`QìA`(öA`  AZ{AYë
+AYÂAYAYp€AYG®AY
+žAXõÃAXÌÍAX£×AXzáAXQìAX(öAX  AW×
+AW®AW
+AW\)AW33AW
+=AVáHAVžRAV\AVffAV=qAV{AUë
+AUÂAUAUp€AUG®AU
+žATõÃATÌÍAT£×ATzáATQìAT(öAT  AS×
+AS®AS
+AS\)AS33AS
+=ARáHARžRAR\ARffAR=qAR{AQë
+AQÂAQAQp€AQG®AQ
+žAPõÃAPÌÍAP£×APzáAPQìAP(öAP  AJ{AIë
+AIÂAIAIp€AIG®AI
+žAHõÃAHÌÍAH£×AHzáAHQìAH(öAH  AG×
+AG®AG
+AG\)AG33AG
+=AFáHAFžRAF\AFffAF=qAF{AEë
+AEÂAEAEp€AEG®AE
+žADõÃADÌÍAD£×ADzáADQìAD(öAD  AC×
+AC®AC
+AC\)AC33AC
+=ABáHABžRAB\ABffAB=qAB{AAë
+AAÂAAAAp€AAG®AA
+žA@õÃA@ÌÍA@£×A@záA@QìA@(öA@  A:{A9ë
+A9ÂA9A9p€A9G®A9
+žA8õÃA8ÌÍA8£×A8záA8QìA8(öA8  A7×
+A7®A7
+A7\)A733A7
+=A6áHA6žRA6\A6ffA6=qA6{A5ë
+A5ÂA5A5p€A5G®A5
+žA4õÃA4ÌÍA4£×A4záA4QìA4(öA4  A3×
+A3®A3
+A3\)A333A3
+=A2áHA2žRA2\A2ffA2=qA2{A1ë
+A1ÂA1A1p€A1G®A1
+žA0õÃA0ÌÍA0£×A0záA0QìA0(öA0  A*{A)ë
+A)ÂA)A)p€A)G®A)
+žA(õÃA(ÌÍA(£×A(záA(QìA((öA(  A'×
+A'®A'
+A'\)A'33A'
+=A&áHA&žRA&\A&ffA&=qA&{A%ë
+A%ÂA%A%p€A%G®A%
+žA$õÃA$ÌÍA$£×A$záA$QìA$(öA$  A#×
+A#®A#
+A#\)A#33A#
+=A"áHA"žRA"\A"ffA"=qA"{A!ë
+A!ÂA!A!p€A!G®A!
+žA õÃA ÌÍA £×A záA QìA (öA   A{Aë
+AÂAAp€AG®A
+žAõÃAÌÍA£×AzáAQìA(öA  A×
+A®A
+A\)A33A
+=AáHAžRA\AffA=qA{Aë
+AÂAAp€AG®A
+žAõÃAÌÍA£×AzáAQìA(öA  A×
+A®A
+A\)A33A
+=AáHAžRA\AffA=qA{Aë
+AÂAAp€AG®A
+žAõÃAÌÍA£×AzáAQìA(öA  A
+{A	ë
+A	ÂA	A	p€A	G®A	
+žAõÃAÌÍA£×AzáAQìA(öA  A×
+A®A
+A\)A33A
+=AáHAžRA\AffA=qA{Aë
+AÂAAp€AG®A
+žAõÃAÌÍA£×AzáAQìA(öA  A×
+A®A
+A\)A33A
+=AáHAžRA\AffA=qA{Aë
+AÂAAp€AG®A
+žA õÃA ÌÍA £×A záA QìA (öA   @ô(ö@ó×
+@ó
+@ó33@òáH@ò\@ò=q@ñë
+@ñ@ñG®@ðõÂ@ð£×@ðQì@ð  @ï®@ï\)@ï
+=@îžR@îff@î{@íÂ@íp€@í
+ž@ìÌÍ@ìzá@ì(ö@ë×
+@ë
+@ë33@êáH@ê\@ê=q@éë
+@é@éG®@èõÃ@è£×@èQì@è  @ç®@ç\)@ç
+=@æžR@æff@æ{@åÂ@åp€@å
+ž@äÌÍ@äzá@ä(ö@ã×
+@ã
+@ã33@âáH@â\@â=q@áë
+@á@áG®@àõÃ@à£×@àQì@à  @Ô(ö@Ó×
+@Ó
+@Ó33@ÒáH@Ò\@Ò=q@Ñë
+@Ñ@ÑG®@ÐõÂ@Ð£×@ÐQì@Ð  @Ï®@Ï\)@Ï
+=@ÎžR@Îff@Î{@ÍÂ@Íp€@Í
+ž@ÌÌÍ@Ìzá@Ì(ö@Ë×
+@Ë
+@Ë33@ÊáH@Ê\@Ê=q@Éë
+@É@ÉG®@ÈõÃ@È£×@ÈQì@È  @Ç®@Ç\)@Ç
+=@ÆžR@Æff@Æ{@ÅÂ@Åp€@Å
+ž@ÄÌÍ@Äzá@Ä(ö@Ã×
+@Ã
+@Ã33@ÂáH@Â\@Â=q@Áë
+@Á@ÁG®@ÀõÃ@À£×@ÀQì@À  @Ž(ö@³×
+@³
+@³33@²áH@²\@²=q@±ë
+@±@±G®@°õÂ@°£×@°Qì@°  @¯®@¯\)@¯
+=@®žR@®ff@®{@­Â@­p€@­
+ž@¬ÌÍ@¬zá@¬(ö@«×
+@«
+@«33@ªáH@ª\@ª=q@©ë
+@©@©G®@šõÃ@š£×@šQì@š  @§®@§\)@§
+=@ŠžR@Šff@Š{@¥Â@¥p€@¥
+ž@€ÌÍ@€zá@€(ö@£×
+@£
+@£33@¢áH@¢\@¢=q@¡ë
+@¡@¡G®@ õÃ@ £×@ Qì@   @(ö@×
+@
+@33@áH@\@=q@ë
+@@G®@õÂ@£×@Qì@  @®@\)@
+=@žR@ff@{@Â@p€@
+ž@ÌÍ@zá@(ö@×
+@
+@33@áH@\@=q@ë
+@@G®@õÃ@£×@Qì@  @®@\)@
+=@žR@ff@{@
+Â@
+p€@
+
+ž@ÌÍ@zá@(ö@×
+@
+@33@áH@\@=q@ë
+@@G®@õÃ@£×@Qì@  @hQì@g®@g
+>@fff@eÂ@e
+ž@dzá@c×
+@c33@b\@aë
+@aG®@`£×@`  @_\)@^žR@^{@]p€@\ÌÍ@\(ö@[
+@ZáH@Z=q@Y@XõÂ@XQì@W®@W
+>@Vff@UÂ@U
+ž@Tzá@S×
+@S33@R\@Që
+@QG®@P£×@P  @O\)@NžR@N{@Mp€@LÌÍ@L(ö@K
+@JáH@J=q@I@HõÃ@HQì@G®@G
+=@Fff@EÂ@E
+ž@Dzá@C×
+@C33@B\@Aë
+@AG®@@£×@@  @(Qì@'®@'
+>@&ff@%Â@%
+ž@$zá@#×
+@#33@"\@!ë
+@!G®@ £×@   @\)@
+žR@
+{@
+p€@
+ÌÍ@
+(ö@
+@áH@=q@@õÂ@Qì@®@
+>@ff@Â@
+ž@zá@×
+@33@\@ë
+@G®@£×@  @\)@žR@{@
+p€@
+ÌÍ@
+(ö@
+
+@
+áH@
+=q@	@õÃ@Qì@®@
+=@ff@Â@
+ž@zá@×
+@33@\@ë
+@G®@ £×@   ?Ð£×?Ï\)?Î{?ÌÌÍ?Ë
+
+?Ê=p?ÈõÂ?Ç®?Æff?Å
+ž?Ã×
+?Â\?ÁG®?À  ?ŸžR?œp€?Œ(ö?ºáH?¹?žQì?·
+>?µÂ?Žzá?³33?±ë
+?°£×?¯\)?®{?¬ÌÍ?«
+?ª=q?šõÂ?§®?Šff?¥
+ž?£×
+?¢\?¡G®?   ?žR?p€?(ö?áH??Qì?
+>?Â?zá?33?ë
+?£×?\)?{?ÌÍ?
+?=q?õÃ?®?ff?
+
+ž?×
+?\?G®?  ?!G®?
+žR?
+(ö??
+=?zá?ë
+?\)?
+ÌÍ?
+=q?®?
+ž?\?   >úáH>õÂ>ð£×>ë
+>æff>áG®>Ü(ö>×
+=>Ñë
+>ÌÌÍ>Ç®>Â\>œp€>žQì>³33>®{>šõÃ>£×
+>žR>>zá>\)>=q>
+
+ž>  >uÂ>k
+>aG®>W
+=>LÌÍ>B\>8Qì>.{>#×
+>>\)>
+ž=õÂ=áG®=ÌÌÍ=žQì=£×
+=\)=uÂ=LÌÍ=#×
+<õÂ<£×
+<#×
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    XTENSION= 'IMAGE   '           / IMAGE extension                                BITPIX  =                  -32 / number of bits per data pixel                  NAXIS   =                    3 / number of data axes                            NAXIS1  =                   91 / length of data axis 1                          NAXIS2  =                   91 / length of data axis 2                          NAXIS3  =                    1 / length of data axis 3                          PCOUNT  =                    0 / required keyword; must = 0                     GCOUNT  =                    1 / required keyword; must = 1                     BZERO   =   0.000000000000E+00 / Pixel Value Offset                             BSCALE  =   1.000000000000E+00 / Pixel Value Scale                              END                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B~bB~Æ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  BxºrB{-B~[B~vK¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  BsKBuæBx²ÜB{³B~LB~gÏ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  Bmj#Bp=ÞBs
+ŽBu×Bx€aB{q7B~>B~YT¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  BgÁûBj¶BmbBp/cBrü9BuÉBxæB{bœB~/B~JÙ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  BbÓBdíBgºdBj;BmTBp çBríŸBuºBxkB{TAB~!B~<^¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B\q«B_EfBb<BdßBg«éBjx¿BmEBpmBrßCBu¬BxxðB{EÆB~B~-ã¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  BVÉBY?B\jB_6ìBbÂBdÐBgoBjjFBm7
+BpòBrÐÉBuBxjuB{7LB~"B~g¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  BQ!\BSõBVÁíBYÄB\[B_(pBaõGBdÂ
+BgôBj[ÊBm(¡BoõwBrÂMBu$Bx[úB{(ÐB}õ§B~ì¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  BKy4BNLïBQÅBSæBV³rBYHB\MB_öBaæÌBd³¢BgyBjMOBm%BoæüBr³ÒBušBxMB{UB}ç+B~q¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  BEÑ
+BH€ÇBKqBN>tBQ
+JBSØ BV€÷BYqÎB\>€B_
+zBaØQBd¥'BgqýBj>ÔBm
+ªBoØBr¥WBur-Bx?B{
+ÚB}Ø°B}óö¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B@(äBBüBEÉuBHLBKc"BN/øBPüÏBSÉŠBV|BYcRB\0)B^üÿBaÉÕBd¬BgcBj0XBlý/BoÊBrÛBuc²Bx0Bzý_B}Ê5B}åz¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B:œB=TxB@!NBBî%BEºûBHÑBKTšBN!BPîUBS»+BVBYTØB\!®B^î
+Ba»[Bd1BgUBj!ÞBlîŽBo»BraBuU8Bx"BzîäB}»»B}Öÿ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B4ØB7¬PB:y&B=EýB@ÓBBß©BE¬BHyWBKF-BNBPßÚBS¬°BVyBYF]B\3B^à	Ba¬àBdy¶BgFBjcBlà9Bo­BryæBuFŒBxBzàiB}­?B}È¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B/0mB2(B4ÐþB7ÕB:j«B=7B@XBBÑ/BEBHjÛBK7²BNBPÑ^BS5BVk
+BY7áB\žB^ÑBadBdk;Bg8BjèBlÑŸBoBrkkBu8ABxBzÑîB}ÄB}º¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B)EB,\ B/(ÖB1õ­B4ÂB7YB:\0B=)B?õÝBBÂ³BEBH\`BK)6BMö
+BPÂãBS¹BV\BY)fB[ö<B^ÃBaéBd\ÀBg)BiölBlÃCBoBr\ïBu)ÆBwöBzÃrB}HB}«¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B#à
+B&³ØB)®B,M
+B/[B1ç1B4ŽB7ßB:MµB=B?çbBBŽ8BEBHMåBK»BMçBPŽhBS>BVNBYëB[çÁB^ŽBanBdNDBgBiçñBlŽÇBoBrNtBuJBwè BzŽ÷B}ÍB}¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B
+7õB!
+°B#ØB&¥]B)r3B,?	B/
+àB1Ø·B4¥B7rcB:?:B=
+B?ØæBB¥œBErBH?iBK
+@BMÙBP¥ìBSrÃBV?BY
+pB[ÙFB^Š
+BaróBd?ÉBg
+BiÙvBlŠLBos"Br?øBu
+ÏBwÙ¥BzŠ|B}sRB}¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  BÎBcB
+0_B ý6B#Ê
+B&âB)c¹B,0B.ýfB1Ê<B4B7céB:0¿B<ýB?ÊlBBBBEdBH0ïBJýÅBMÊBPrBSdIBV1BXýõB[ÊÌB^¢BadxBd1OBfþ%BiÊûBlÑBodšBr1~BtþUBwË+BzB}dØB}¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  BçŠB»aB7BUB
+!äB îºB#»B&hB)U>B,"B.îëB1»ÁB4B7UnB:"DB<ïB?»ñBBÇBEUBH"tBJïJBMŒ!BP÷BSUÍBV"€BXïzB[ŒPB^'BaUýBd"ÓBfï©BiŒBlVBoV-Br#BtïÙBwŒ°BzB}V\B}q ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B
+?~B9BàB¬æByŒBFB
+iB à@B#­B&yìB)FÃB,B.àoB1­FB4z
+B7FòB:ÉB<àB?­uBBzLBEG"BHùBJàÏBM­¥BPz|BSGRBV(BXàÿB[­ÕB^z«BaGBdXBfá.Bi®BlzÛBoG±BrBtá^Bw®4Bz{
+B}GáB}c$¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  BVB
+kB
+7çBŸBÑBjBkAB8B
+îB ÑÄB#B&kqB)8GB,
+B.ÑôB1ÊB4k¡B78wB:MB<Ò$B?úBBkÑBE8§BH}BJÒTBM*BPl BS8×BV­BXÒB[YB^l0Ba9BdÝBfÒ³BiBll`Bo96Br
+BtÒãBw¹BzlB}9fB}Tª¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  Bï.BÂéB¿B
+\B
+)lBöBBÃBðB\ÆB)B
+ösB ÃIB#B&\öB))ÌB+ö¢B.ÃyB1OB4]%B7)üB9öÒB<Ã©B?BB]UBE*,BG÷BJÃØBM¯BP]
+BS*[BU÷1BXÄB[ÞB^]µBa*Bc÷aBfÄ8BiBl]äBo*»Bq÷BtÄgBw>Bz^B}*ëB}F.¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  Aø
+Aþ5BçBŽnBDB
+NB
+ñBçÈBŽBtBNKB!B
+ç÷B ŽÎB#€B&NzB)QB+è'B.ŽýB1ÔB4NªB7B9èWB<µ-B?BBNÚBE°BGèBJµ]BM3BPO	BSàBUè¶BXµB[cB^O9Ba
+BcèæBfµŒBiBlOiBo
+?BqéBtµíBwÃBzOB}
+pB}7³¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  Aí=ŒAòå3Aø~àAþBÙ
+B¥òBrÉB
+? B
+
+vBÙLBŠ#BrùB?ÏB
+ŠB
+Ù|B ŠRB#s)B&?ÿB)
+ÕB+Ù¬B.ŠB1sYB4@/B7
+B9ÙÜB<Š²B?sBB@_BE
+5BGÚ
+BJŠáBMsžBP@BS
+eBUÚ;BX§B[sèB^@ŸBa
+BcÚkBf§ABitBl@îBo
+ÅBqÚBt§qBwtHBzA
+B}
+ôB})8¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  AáílAçãAí.AòÈ=AøaêAýûBÊ¡BxBdNB
+1$B
+ýûBÊÑB§Bd~B1TBþ*B
+ËB ×B#d­B&1B(þZB+Ë1B.B1dÝB41ŽB6þB9Ë`B<7B?e
+BB1ãBDþ¹BGËBJfBMe=BP2BRþéBUËÀBXB[elB^2CB`ÿBcËïBfÆBieBl2sBnÿIBqÌ BtöBweÌBz2£B|ÿyB}Œ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  AÖ
+AÜDAáÞ@AçwíAíAò«GAøDóAýÞ BŒ&BüBUÓB
+"©B
+ïBŒVB,BVB"ÙBï¯B
+Œ
+B \B#V2B&#	B(ïßB+ŒµB.B1VbB4#8B6ðB9ŒåB<»B?VBB#hBDð>BGœBJëBMVÁBP#BRðnBUœDBXB[VñB^#ÇB`ðBcœuBfKBiW!Bl#øBnðÎBqœ€Bt{BwWQBz$'B|ðþB}
+A¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  AËLÌAÐôCAÖðAÜ'AáÁJAçZ÷Aìô£AòPAø'üAýÁ©B­«BzBGWB
+.B
+áB­ÚBz±BGB]Bá4B
+®
+B záB#G·B&B(ádB+®:B.{B1GçB4œB6áB9®iB<{@B?HBBíBDáÃBG®BJ{pBMHFBP
+BRáóBU®ÉBX{B[HvB^MB`â#Bc®ùBf{ÐBiHŠBl|BnâSBq¯)Bt{ÿBwHÖBz¬B|âB|ýÆ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  A¿ü|AÅ£óAË= AÐ×MAÖpúAÜ
+§Aá€SAç> Aì×¬AòqYAø
+Aý€²B/BlB8ÜB
+²B
+ÒB_Bl5B9
+BâBÒ¹B
+B leB#9<B&B(ÒèB+¿B.lB19kB4AB6ÓB9îB<lÅB?9BBqBDÓHBG 
+BJlôBM9ËBP¡BRÓwBU NBXm%B[9ûB^ÑB`ÓšBc ~BfmTBi:+BlBnÓ×Bq ®BtmBw:ZBz1B|ÔB|ïJ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  AŽ¬,AºS£A¿íPAÅýAË ªAÐºWAÖTAÛí°Aá\Aç!	Aìº¶AòTbA÷îAýŒBŽB]B*aB	÷7B
+Ä
+BäB]ºB*B÷gBÄ=B
+B ]êB#*ÀB%÷B(ÄmB+CB.^B1*ðB3÷ÆB6ÄB9sB<^IB?+ BA÷öBDÄÌBG£BJ^yBM+OBOø&BRÄýBUÓBX^©B[+B]øVB`Å,BcBf^ÙBi+¯BkøBnÅ\Bq2Bt_	Bw+ßByøµB|ÅB|àÏ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  A©[ÜA¯SAŽ Aº6­A¿ÐZAÅjAË³AÐ`AÖ7
+AÛÐ¹AájfAçAì¿Aò7lA÷ÑAýjÆB9BOBåB	èŒB
+µBiBO?B
+BèìBµÂB
+B OoB#
+EB%éB(µñB+ÈB.OB1
+uB3éKB6¶!B9øB<OÎB?
+€BAé{BD¶QBG'BJOþBM
+ÕBOé«BR¶BUXBXP.B[
+B]éÛB`¶±BcBfP^Bi
+4Bkê
+Bn¶áBq·BtPBw
+dByê:B|·B|ÒT¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  A
+A£³A©L¯A®æ\AŽ	Aº¶A¿³bAÅMAÊæ»AÐhAÖAÛ³ÁAáMnAæçAìÈAòuA÷Ž"AýMÎBsœB@B
+jB	ÚAB
+§BsíB@ÄB
+BÚpB§GB
+t
+B @óB#
+ÉB%Ú B(§vB+tMB.A#B1
+ùB3ÚÐB6§ŠB9t|B<ASB?)BAÚÿBD§ÖBGt­BJABMYBOÛ0BRšBUtÜBXA³B[B]Û_B`š6Bcu
+BfAâBi¹BkÛBnšeBqu<BtBBwèByÛ¿B|šB|ÃØ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  A»;Ab²Aü_A£
+A©/¹A®ÉfAŽcA¹ü¿A¿kAÅ0AÊÉÅAÐcqAÕý
+AÛËAá0xAæÊ%AìcÒAñý~A÷+Aý0×BeBB2BþïB	ËÅB
+BerB2HBÿBËõBËB
+e¡B 2xB"ÿNB%Ì%B(ûB+eÑB.2šB0ÿ~B3ÌTB6+B9fB<2×B>ÿ®BAÌ
+BD[BGf1BJ3BLÿÞBOÌŽBRBUfaBX37B[ B]ÌäB`ºBcfBf3gBi =BkÍBnêBqfÀBt3Bw mByÍCB|B|µ]¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  AjëAbA¬AEŒAßiA£yA©ÂA®¬oAŽFA¹ßÈA¿yuAÅ!AÊ¬ÎAÐF{AÕà(AÛyÕAáAæ­.AìFÛAñàA÷z4AýáBVÇB#BðtB	œJB
+ BV÷B#ÍBð£BœyBPB
+W&B #ýB"ðÓB%œ©B(B+WVB.$,B0ñB3œÙB6¯B9WB<$]B>ñ3BAŸ	BDàBGW¶BJ$BLñcBOŸ9BRBUWæBX$ŒBZñB]ŸiB`?BcXBf$ìBhñÂBkŸBnoBqXEBt%BvñòByŸÈB|B|Šâ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  Ax58AÂA[¿AõlAA(ÆAÂrA£\AšõËA®xAŽ)%A¹ÂÑA¿\~AÄö+AÊØAÐ)
+AÕÃ2AÛ\ÞAàöAæ7Aì)äAñÃA÷]=AüöêBHLB"BáøB	®ÏB
+{¥BH{BQBâ(B®þB{ÕB
+H«B B"âXB%¯.B(|B+HÛB.±B0âB3¯^B6|5B9I
+B<áB>âžBA¯BD|dBGI;BJBLâçBO¯ŸBR|BUIjBXABZãB]¯íB`|ÄBcIBfpBhãGBk°
+Bn|óBqIÊBt BvãvBy°MB|}$B|g¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  AaAlãAxßA¥
+A>ÉAØvAr"A
+ÏA¥{A£?(AšØÕA®rAŽ
+.A¹¥ÛA¿?AÄÙ5AÊrâAÐ
+AÕŠ;AÛ?çAàÙAæsAAì
+íAñŠA÷@GAüÙóB9ÐB§BÓ}B	 SB
+m)B: BÖBÓ­B BmYB
+:0B B"ÓÜB% ³B(mB+:_B.6B0Ô
+B3 ãB6m¹B9:B<fB>Ô<BA¡BDméBG:¿BJBLÔlBO¡BBRnBU:ïBXÅBZÔB]¡rB`nHBc;BfõBhÔËBk¡¢BnnxBq;NBt%BvÔüBy¡ÒB|nšB|ì¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  AJóûAVBèAav@Al©AwÜñA&A!ÒA»AU+AîØA
+A£"1Aš»ÞA®UA³ï8A¹åA¿"AÄŒ>AÊUëAÏïAÕDAÛ"ñAàŒAæVJAëï÷Añ£A÷#QAüŒýB+UBø+BÅB	ØB
+^®B+
+Bø[BÅ1BB^ÞB
++ŽBøB"ÅaB%7B(_B++åB-ø»B0ÅB3hB6_>B9,B;øëB>ÅÁBABD_nBG,DBIùBLÅñBOÇBR_BU,tBWùJBZÆ B]÷B`_ÍBc,£BeùzBhÆPBk&Bn_ýBq,ÔBsùªBvÆByWB|`-B|{p¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  A4S]A?¢JAJÕ¢AVûAa<SAlo¬Aw£Ak/AÛAA85AÑáAkA£;AšèA®8A³ÒBA¹kîA¿AÄGAÊ8ôAÏÒ¡AÕlMAÛúAà§Aæ9SAëÓAñl®A÷ZAü B
+ÙBé°B¶B	]B
+P3B
+	BéàB¶¶BBPcB
+
+9BêB"¶æB%œB(PB+
+iB-ê@B0·B3ìB6PÃB9
+B;êoB>·FBA
+BDPòBG
+ÉBIêBL·uBOLBRQ"BU
+øBWêÏBZ·¥B]{B`QRBc
+(BeêþBh·ÕBk¬BnQBq
+XBsë/BvžByÛB|Q²B|lõ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  A
+²¿A)¬A45A?h]AJµAUÏAafAl5¿AwiAN8AçåAA>AŽëANA¢èEAšòA®A³µKA¹N÷AŸè€AÄQAÊýAÏµªAÕOWAÚéAà±Aæ
+^Aë¶
+AñO·AöécAüB^BÛ5Bš
+B	táB
+AžBBÛdBš;BuBAçB
+ŸBÛB"škB%uAB(BB+îB-ÛÄB0šB3uqB6BGB9
+B;ÛôB>šÊBAu¡BDBwBGMBIÜ$BLšúBOuÐBRB§BU}BWÜSBZ©*B]v B`BÖBc­BeÜBh©ZBkv0BnCBqÝBsÜ³Bv©Byv`B|C6B|^z¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  A!AaA
+fA(Ç¿A3ûA?.pAJaÈAU!A`ÈyAkûÑAw/*A1BAÊîAdAþHAõA1¢A¢ËNAšdûA­þ§A³TA¹2AŸË­AÄeZAÉÿAÏ³AÕ2aAÚÌAàeºAåÿgAëAñ2ÀAöÌmAüfB ÿãBÌ¹BB	ffB
+3<B BÌéB¿BfB3mB
+ CBÍB"ðB%fÆB(3B+ sB-ÍIB0B3föB63ÌB9 ¢B;ÍyB>OBAg%BD3üBG ÒBIÍšBLBOgUBR4+BUBWÍØBZ®B]g
+B`4\Bc2BeÎBhßBkgµBn4BqbBsÎ8BvBygåB|4»B|Oÿ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  @àã@÷ÞAóÇA' A
+ZxA(ÑA3Á)A>ôAJ'ÚAU[2A`AkÁäAvõ<AJA­÷AG€AáQAzýAªA¢®VAšHA­á°A³{\A¹	AŸ®¶AÄHbAÉâAÏ{œAÕiAÚ¯AàHÂAåâoAë|
+AñÈAö¯uAüI"B ñgBŸ=BB	WêB
+$ÀBñBŸmBDBXB$ðB
+ñÇBŸB"sB%XJB(% B*ñöB-ŸÍB0£B3XyB6%PB8ò&B;ŸüB>ÓBAX©BD%BFòVBI¿,BLBOXÙBR%¯BTò
+BW¿\BZ3B]Y	B`%ßBbò¶Be¿BhbBkY9Bn&BpòåBs¿ŒBvByYiB|&?B|A¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  @³¡È@Ê?¢@àŠS@÷
+A¹ÚAí3A
+ A(SäA3<A>ºAIííAU!FA`TAköAv»OA÷TAA*­AÄZA^A÷³A¢`Aš+
+A­Ä¹A³^fAžøAŸÀAÄ+mAÉÅAÏ^ÆAÔørAÚAà+ÌAåÅxAë_%AðøÒAö~Aü,+B âëB¯ÂB|B	InB
+EBã
+B¯òB|ÈBIBuB
+ãKB°"B"|øB%IÎB(¥B*ã{B-°QB0}(B3IþB6ÕB8ã«B;°B>}WBAJ.BDBFãÚBI°±BL}BOJ]BR4BTä
+BW°áBZ}·B]JB`dBbä:Be±Bh}çBkJœBnBpäjBs±ABv~ByJíB|ÄB|3¿  ¿  ¿  ¿  ¿  ¿  @`@þe@³e@ÉËÇ@à2x@ö)AíA³FA
+æA(öA3MOA>šAIŽ ATçXA`±AkN	AvbAÚ]At
+A
+·A§cAAAÚŒA¢tiAšA­§ÂA³ApAžÛ
+AŸtÉAÄvAÉš"AÏAÏAÔÛ|AÚu(AàÕAåšAëB.AðÛÛAöuAü5B ÔpB¡FBn
+B	:ôB
+ÊBÔ B¡wBnMB;#BúB
+ÔÐB¡ŠB"n}B%;SB()B*Õ B-¡ÖB0n­B3;B6YB8Õ/B;¢B>nÜBA;²BDBFÕ_BI¢5BLo
+BO;ãBR¹BTÕBW¢fBZo<B]<B`éBbÕ¿Be¢BholBk<BBn	BpÕïBs¢ÅBvoBy<rB|	HB|$¿  ¿  ¿  ¿  @2>@_zS@#Ú@@²ñ<@ÉWì@ßŸ@ö%OAF AyXA
+¬±A'à
+A3bA>FºAIzAT­kA_àÄAk
+AvGuAœgAWAðÀAlA$AœÆA¢WrA§ñ A­ÍA³$yAžŸ&AŸWÒAÃñAÉ,AÏ$ØAÔŸ
+AÚX2AßñÞAåAë%9AðŸåAöXAûò>B ÅõBÌB_¢B	,xB
+ùOBÆ%BûB_ÒB,šBù~B
+ÆUB+B"`B%,ØB'ù®B*Æ
+B-[B0`1B3-B5ùÞB8ÆŽB;B>`aBA-7BCú
+BFÆäBI»BL`BO-gBQú>BTÇBWêBZ`ÁB]-B_úmBbÇDBeBh`ñBk-ÇBmúBpÇtBsJBva By-÷B{úÍB|¿  ¿  ?¯xI@÷Ú@1Å<@^@
+° @°@²}b@Èä@ßJÃ@õ±tA
+A?lA
+rÄA'Š
+A2ÙuA>
+ÍAI@&ATs~A_Š×AjÚ/Av
+A pA:
+AÓÉAmvA"A ÐA¢:}A§Ô)A­mÖA³Až¡/AŸ:ÜAÃÔAÉn5AÏâAÔ¡AÚ;;AßÔéAånAëBAð¡îAö;AûÕHB ·zBPBQ'B	
+ýB
+êÓB·ªBBQVB
+-BëB
+·ÙB°B"QB%
+]B'ë3B*ž	B-ßB0Q¶B3
+B5ëbB8ž9B;
+B>QåBA
+ŒBCëBFžiBI
+?BLRBO
+ìBQëÂBTžBW
+oBZREB]
+B_ëòBbžÉBe
+BhRuBkLBmì"BpžøBs
+ÏBvR¥By{B{ìQB|?!G®?)Õ?®
+@$@0Ý@]ªé@
+<%@¢×@²	@Èp8@ÞÖé@õ=AÒ&A~A
+8×A'l/A2A=ÒàAI9AT9A_léAj BAuÓAyA
+&A¶ÒAPAê-AÙA¢
+A§·2A­PßA²êAž8AŸ
+åAÃ·AÉQ>AÎêëAÔAÚ
+EAß·òAåQAêëKAðøAö
+€AûžQB šÿBuÕBB«B	B
+ÜXB©.BvBBÛB±BÜB
+©^Bv5B"C
+B%áB'Ü·B*©B-vdB0C:B3B5ÜçB8©œB;vB>CkBAABCÝBF©îBIvÄBLCBOqBQÝGBTª
+BWvôBZCÊB]¡B_ÝwBbªMBew$BhCúBkÐBmÝ§Bpª}BswSBvD)By B{ÝÖ¿  ?b(?&6¬?¬¶@(p@/õÒ@\Ã4@ÈK@.ü@±­@Çü^@Þc@ôÉÀA9AËAþêA'2BA2eA=óAHÌKASÿ€A_2üAjfUAu­AfA 0AÝA3AÍ6AfâA¢ A§<A­3èA²ÍAžgBAŸ îAÃAÉ4IAÎÍõAÔg¢AÚNAßûAå4šAêÎTAðhAö®AûZB BgZB40B	B
+ÍÝB³BgB4`B6BÎ
+B
+ãBg¹B"4B%fB'Î<B*B-géB04¿B3B5ÎlB8CB;hB>4ïBAÆBCÎBFrBIhIBL5BOõBQÎÌBT¢BWhyBZ5OB]%B_ÎüBbÒBehšBh5BkUBmÏ+BpBshØBv5®By	j¿  ¿  ?ÃV?"×?ªæ°@@º@/
+@[Û~@Tp@»!@±!Ò@Ç@Ýï3@ôUäA^KA£AÄüA&øTA2+¬A=_AH]ASÅ¶A^ùAj,gAu_¿AIA
+ã9A|æAA°?AIìA¡ãA§}EA­òA²°AžJKAœãùAÃ}¥AÉRAÎ°þAÔJ«AÙäXAß~Aå±Aê±^AðK
+Aõä·Aû~eB BXÞB%µBòB
+¿aB8BYB%åBò»B¿B
+gBY>B"&B$òêB'¿ÁB*B-YmB0&DB2óB5¿ñB8ÇB;YB>&tB@óJBCÀ!BF÷BIYÍBL&€BNózBQÀQBT'BWYýBZ&ÔB\óªB_ÀBbWBeZ-Bh'BjóÙBmÀ°BpBsaB¿  ¿  ¿  ¿  ?$?
+ù?©F@Y@.&h@ZóÊ@à@GG@°­÷@Çš@Ý{Y@óâ
+A$^AW¶AA&ŸgA1ñ¿A=%AHXpASÉA^¿!AiòyAu%ÒA,A
+ÆCA_ïAùAHA,õA¡Æ¢A§`NA¬ùûA²©Až-UAœÇAÃ`¯AÈú[AÎAÔ-ŽAÙÇaAßaAäúºAêgAð.AõÇÁAûanB }BJcB9BäB
+°æB}œBJBiBä?B±B
+}ìBJÂB"B$äoB'±EB*~
+B-JóB0ÉB2äB5±vB8~LB;K"B>ùB@äÏBC±¥BF~|BIKRBL)BNäÿBQ±ÕBT~¬BWKBZXB\å/B_²Bb~ÛBeK±BhBjå^Bm¹¿  ¿  ¿  ¿  ¿  ¿  ?
+²?Z1?§GÝ@ qQ@->³@Z
+@l»@Ól@°:
+@Æ Î@Ý@ón0AêpA
+ÉAQ!A&zA1·ÒA<ë+AH
+ASQÛA^
+4AižAtëåAA
+©LABøAÜ¥AvRAþA¡©«A§CYA¬ÝA²v²Až_Aœª
+AÃCžAÈÝdAÎwAÔŸAÙªjAßDAäÝÅAêwqAð
+AõªÊAûDwB oB;èBŸBÕB
+¢kBoAB<BîBÕÄB¢B
+oqB<GB"	
+B$ÕôB'¢ËB*o¡B-<wB0	NB2Ö$B5¢úB8oÑB;<§B>	}B@ÖTBC£*BFpBI<×BL	­BNÖBQ£ZBTp0BW=BZ	ÝB\Ö³B_£Bbp`Be=6Bhò¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ?æá?»X?¥xp?ÿ5@,Vý@Y$_@øà@_@¯ÆC@Æ,ó@Ü€@òúTA°AãÜA4A&JA1}åA<±=AGäASïA^KGAi~At±øAåQA
+UA&A¿®AY[Aó	A¡µA§&bA¬ÀA²Y»A·óhAœAÃ&ÁAÈÀnAÎZAÓóÇAÙuAß'!AäÀÎAêZzAïô'AõÔAû'B `B-mBúCBÇB
+ïB`ÆB-BúrBÇIBB
+`õB-ÌB!ú£B$ÇyB'OB*a&B--üB/úÒB2Ç©B5B8aUB;.,B=ûB@ÇÙBC¯BFa
+BI.\BKû2BNÈBQßBTaµBW.BYûaB\È8B_BbhÊ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ?
+H?
+?£©?ýCÌ@+oI@X<ª@
+@ë·@¯Rh@Å¹@ÜÊ@òzAvA©ïAÝGA&A1CøA<wQAGª©ARÞA^ZAiD²Atx
+A«dA
+o^A	
+A¢¹A<eAÖA¡o¿A§	kA¬£A²<ÄA·ÖqAœp
+AÃ	ÊAÈ£wAÎ=%AÓÖÑAÙp~Aß
+*Aä£×Aê=Aï×0AõpÝAû
+B RB
+ñBëÇBžB
+
+tBRJB!Bë÷BžÍB
+€B
+R{BQB!ì'B$žþB'
+ÔB*RªB-B/ìWB2¹-B5B8RÚB;±B=ìB@¹]BC4BFS
+BIàBKì·BN¹BQcBTS9BW BYìæB\À¢¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ?	©>?}¬?¡Ù?ût_@*@WTô@+@wÛ@®Þ@ÅE=@Û«î@òA<šAp A£YA%Ö²A1
+
+A<=bAGp»AR€A]×lAi
+ÄAt>
+AquA
+RhAìA
+ÁAnA¹A¡RÇAŠìsA¬ A²ÍA·¹yAœS&AÂìÔAÈAÎ -AÓ¹ÚAÙSAÞí3AäßAê Aïº9AõSåAúíB CBvBÝLBª"B
+vùBCÏB¥BÝ|BªSBw)B
+CÿBÖB!Ý¬B$ªB'wYB*D/B-B/ÝÜB2ª²B5wB8D_B;5B=Þ
+B@ªâBCwžBFDBIeBKÞ;BN«BQwèBTDŸBWz¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ?
+k?
+ÞÚ? 
+2?ù€ö@)Þ@Vm@@Q@@®j²@ÄÑc@Û8@ñÅA»A6AilA%ÄA0Ð
+A<uAG6ÎARj&A]AhÐ×At/A7A
+5qAÏ
+AhÊAwA#A¡5ÐAŠÏ}A¬i)A²ÖA·Aœ60AÂÏÝAÈiAÎ6AÓãAÙ6AÞÐ<AäiéAêAïBAõ6ïAúÐB 5$BúBÎÑB§B
+h}B5TB+BÏB×Bh®B
+5BZB!Ï1B$B'hÝB*5ŽB-B/ÏaB27B5i
+B85äB;ºB=ÏB@gBCi=BF6BIéBKÏÀBNBQpR¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ?k?	@?:Å?÷Õ@(ž(@U
+@)u@&@­ö×@Ä]@ÚÄ9@ñ*êAÈÎAü&A/A%b×A00A;ÉAFüáAR09A]cAhêAsÊBA~ýA
+zA²'AKÓAåA-A¡ÙAŠ²A¬L4A±åàA·Aœ:AÂ²æAÈLAÍæ?AÓìAÙAÞ³EAäLòAéæAïLAõùAú³¥B &©BóBÀUB,B
+ZB&ÙBó¯BÀB\BZ2B
+'	B
+óßB!ÀµB$B'ZbB*'9B,ôB/ÀåB2ŒB5ZB8'hB:ô?B=ÁB@ëBCZÁBF'BHônBKÈ*¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  >ý?¡/?k\?ö!@'Ðs@TÕ@µ@
+L@­ý@Ãé®@ÚP_@ð·AáAÂ9AõA%(êA0\CA;AFÂóAQöLA])€Ah\ýAsUA~Ã®AûA0A.ÝAÈAb6A ûäAŠA¬/=A±ÈêA·bAŒüCAÂïAÈ/AÍÉIAÓbõAØü¢AÞOAä/üAéÉ©AïcUAôýAú¯B -BåB±ÛB~±B
+KB^Bå4B²
+B~áBK·B
+B
+ådB!²:B$B'KçB*œB,åB/²jB2@B5LB8íB:åÃB=²B@pBCLFBF ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  >ö[ë?U?ï?ô6Ž@&èœ@S¶
+@AÀ@šq@­"@ÃuÓ@ÙÜ@ðC4ATóAKA»€A$îüA0"TA;U­AFAQŒ^A\ï¶Ah#AsVgA~ÀAÞAx9AæA«AE@A ÞíAŠxA¬FA±«óA·EAŒßLAÂxùAÈ¥AÍ¬RAÓEÿAØß¬AÞyYAäAé¬²AïF_Aôà
+AúyžB 	³BÖB£_Bp6B
+=
+B	âBÖ¹B£BpeB=<B
+
+B
+ÖéB!£¿B$pB'=lB*
+BB,×B/£ïB2pÅB5=B8
+qB:×HB=€
+B@wÚ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  >ï
+I>üÇ?Ì?ògK@&@RÎj@Ì@4@¬G@Ãù@Ùh©@ïÏZAAN^A¶A$µA/ègA;ÀAFOAQqA\µÉAgé!As
+zA~OÓAÁA[DAôðAA(JA ÁöAŠ[£A«õOA±üA·(©AŒÂUAÂ\AÇõ¯AÍ\AÓ)	AØÂ¶AÞ\bAãöAé»Aï)hAôÃAú\ÁAÿönBÈBäBaºB
+.B
+ûgBÈ=BBaêB.ÁBûB
+ÈmB!DB$bB'.ðB)ûÇB,ÈB/sB2bIB5/ B7ûöB:Ï²¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  >çà¥>õc?ý
+?ðâ@%T@Qæ¶@~Ž@Àœ@¬'m@Â
+@ØôÏ@ï[AáAqAGÉA${"A/®zA:áÓAF+AQHA\{ÜAg¯5ArâA~çA€ A>MA×úAqŠA
+SA €ÿAŠ>¬A«ØYA±rA·
+²AŒ¥_AÂ?
+AÇØ¹AÍrfAÓ
+AØ¥¿AÞ?kAãÙAérÅAï
+qAôŠ
+Aú?ËAÿÙxB¹BiBS?B
+ B
+ììB¹ÂBBSoB EBí
+B
+¹òB!ÈB$SB' uB)íKB,º!B/øB2SÎB5'¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  >à£>îK ?-¬?îÈq@$1@Pþý@}Ì_@Là@«³@ÂB@Øó@îç€A§*A
+ÚA
+ÛA$A4A/tA:§äAEÛ=AQA\AîAguFAršA}ÛøA©A!UA»AT®Aî[A AŠ!ŽA«»aA±UA¶î»AŒhAÂ"AÇ»ÁAÍUnAÒïAØÇAÞ"tAãŒ AéUÍAîïzAô&Aú"ÔAÿŒB«BwìBDÃB
+B
+ÞpB«FBx
+BDóBÉBÞB
+«vB!xLB$E"B'øB)ÞÏB,«¥B/a¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  >Ùe]>ç
+û?^C?ìù@#Iç@PH@|äª@Ù@«?·@ÁŠh@Ø
+@îsÊAm=A
+ AÓîA$FA/:A:møAE¡PAPÔšA\Ag;YArn²A}¢
+Aj²A^A
+A7žAÑdA kAŠŸA«kA±8A¶ÑÅAŒkqAÂ
+AÇÊAÍ8wAÒÒ$AØkÐAÞ}Aã*Aé8ÖAîÒAôl1AúÝAÿBBiqB6HB
+
+B
+ÏôBËBi¡B6wBNBÐ$B
+úB!iÐB$6§B'}B)×9¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  >Ò'»>ßÐY?Û?ë)@"b3@O/@{üö@e,@ªËÝ@Á2@×?@íÿïA3PA
+fšAA#ÍZA/ ²A:4
+AEgcAP»A[ÎAglAr4ÅA}h
+AM»AçhAAÁAŽnA NA¥çÈA«uA±!A¶ŽÎAŒNzAÁè'AÇÔAÍAÒµ-AØNÚAÝèAã4AéáAîµAôO:AùèæAÿB BZöB'ÌB
+ô£B
+ÁyBOB[&B'üBôÒBÁšB
+B![UB$/¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  >Êê>Øµ?¿r?éZ6@!z~@NGà@{A@ñR@ªX@ÀŸ³@×%d@íAùcA
+,ŒA`A#lA.ÆÅA9ú
+AE-vAP`ÎA['AfÇAqú×A}./A0ÄAÊqAd
+AýËAxA 1%A¥ÊÑA«d~A°þ*A¶×AŒ1AÁË0AÇdÝAÌþAÒ7AØ1äAÝËAãe=AèþêAîAô2CAùËðAÿeB€BL{BQB
+æ'B
+²þBÔBLªBBæWB³-B
+é¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  >Ã¬s>ÑTñ?ð?çÆ@ Å@M`'@z-@}u@©ä&@ÀJ×@Ö±@í9A¿uA
+òÍA&&A#Y~A.×A9À/ADóAP&àA[Z8AfAqÀéA|ôBAÎA­{AG(AàÕAzA .A¥­ÚA«GA°á4A¶zàAŒAÁ®:AÇGçAÌáAÒ{AAØíAÝ®AãHFAèáóAî{ AôLAù®ùAÿH¥Bq)B=ÿB
+ÖB
+×¬B
+€BqXB>/B
+BÞÁ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  >ŒnÐ>ÊN? ?å»\@«@Lxr@yEÔ@	@©pL@¿Öý@Ö=®@ì€_A
+A
+žàAì9A#A.RêA9BAD¹AOìòA[ KAfS€AqüA|ºUAöØA
+A*1AÃÞA]A÷7A¥äA«*A°Ä=A¶]êA»÷AÁDAÇ*ñAÌÄAÒ^JA×÷öAÝ£Aã+PAèÄüAî^©AóøVAùAÿ+¯Bb®B/BüZB
+É0B
+BbÝB6¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  >µ1,>ÂÙª?Q/?ãëó@
+Ã\@KŸ@x^ @Á@šür@¿c#@ÕÉÔ@ì0
+AKA
+~óA²LA"å€A.üA9LTAD­AO³AZæ^Af·AqMA|iAÙáAsA
+:AŠçA@AÚ@A¥síA«
+A°§GA¶@ôA»Ú¡AÁtMAÇ
+úAÌ§ŠAÒASA×Û AÝt¬AãYAèšAîA²AóÛ`Aùu
+Aÿ·BT2B!BíßB
+ºµB
+q¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  >­ó>»?Æ?â
+@
+Ûš@J©
+@wvl@!ç@š@ŸïI@ÕUù@ëŒ«A®A
+EAx^A"«¶A-ßA9hADEÀAOyAZ¬qAeßÉAq"A|F|AŒêAVAðDAðA#AœJA¥V÷Aªð€A°QA¶#ýA»œªAÁWVAÆñAÌ°AÒ$\A×Ÿ	AÝW¶AâñbAèAî$œAóŸiAùXAþñÁBE·BBæI¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  >Šµå>Ž^C?²U?àM@
+óï@IÁQ@v³@®
+@š»@Ÿ{m@Ôâ
+@ëHÎA ×¿A
+
+A>pA"qÉA-¥!A8ØzAD
+ÒAO?*AZrAe¥ÜApÙ4A|
+AóA9AÓLAlùAŠA SA¥: AªÓ¬A°mYA¶A» ²AÁ:_AÆÔ
+AÌmžAÒeA×¡AÝ:¿AâÔlAènAîÅAó¡rAù;
+AþÔËB>!¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  >xA>­ À?âô?Þ}¹@
+
+?@HÙ¡@u§@:3@§ ã@Ÿ@ÔnD@êÔöA ÓA
+Ñ,AA"7ÝA-k5A8ACÑæAO?AZ8AekïApGA{Ò¡AýA
+ªA¶WAPAé±A]A¥
+
+Aª¶¶A°PcAµêA»ŒAÁ
+iAÆ·AÌPÂAÑêpA×
+AÝ
+ÉAâ·vAèQ#AíêÏAó|Aù+ó¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  >:>¥ã??Ü®P@$@Gñì@t¿N@ÆX@§-@œº@Óúk@êaA cæA
+?AÊA!ýïA-1HA8d¡ACùANËQAYþ©Ae2Ape[A{ŽAfAÿŽAaA3
+AÌºAffA¥ AªÀA°3lAµÍA»fÆAÁ rAÆ AÌ3ÍAÑÍyA×g&AÝ ÓAâAè4,AíÛ£¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  >üú>¥x?D"?ÚÞç@<Ö@G
+8@s×@R~@Š¹/@œß@Ó@éíAA )ùA
+]QAªA!ÄA,÷[A8*³AC^
+ANdAYÄœAdøAp+nA{^ÇAIAâœA|jAA¯ÃAIpA€ã
+Aª|ÉA°vAµ°"A»IÐAÀã}AÆ})AÌÖAÑ°A×J/AÜãÜAâS¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  >¿W>h?~é?Ù@U*@F"@rïí@Þ§@ŠEX@Œ¬	@Óº@éyk@ÿà
+A
+#gAV¿A!A,œpA7ðÈAC$!ANWyAYÒAdŸ*AoñA{$ÜA,AÅÈA_tAù!AÍA,zA€Æ'Aª_ÓA¯ùAµ.A»,ÚAÀÆAÆ`4AËùàAÑA×;¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  >³>*q?{JÂ?×@%@mv@E:×@r9@jÍ@¥Ñ~@Œ8/@Òà@é@ÿlBA
+éyA
+ÒA!P*A,A7¶ÛABê4AN
+AYPäAd=Ao·AzêïA$AšÑAB}AÜ*Au×AA€©1AªBÞA¯ÜAµv7A»äAÀ©AÆC=AËêŽ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  >v
+>ìÍ?w«ð?Õpœ@
+Á@DS#@q @öó@¥]€@»ÄU@Ò+@è¶@þøgA
+¯AâåA!=A,IA7|îAB°FAMãAYøAdJPAo}šAz±Aò-AÚA%A¿3AXáAòA€:Aª%çA¯¿AµY@AºòíAÀd¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  >h
+×>¯j?t
+>?Ó¡d@@Ckv@p8Ø@
+@€éÎ@»P~@Ñ·/@è
+à@þA
+u¡AšúA ÜRA,ªA7CABv\AM©ŽAXÝ
+AdeAoCœAzwAÕ8AnäAA¢?A;ëAÕA€oEAªñA¯¢AµJ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  >Y>tã?pnm?ÑÑû@¶`@BÂ@oQ$@C@€uó@ºÜ¥@ÑCU@çª@þ·A
+;ŽAo
+A ¢eA+ÕŸA7	AB<nAMoÇAX£AcÖxAo	ÐAz=)AžBAQïAëA
+HA
+õAž¡A€RNA©ùÅ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  >KJ>fhÆ?lÏ»?Ð¢@ÎŽ@A@niw@m@€
+@ºhÎ@ÐÏ@ç60@ýáA
+ÉA5"A hzA+ÒA6Ï+ABAM5ÜAXi4AcAnÏåAz?ALA4ùAÎŠAhRAÿA©v¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ><>Wí?i0è?Î39@ç @@Ža@mÃ@'@£C@¹ôô@Ð[¥@æÂV@ý)A	ÇÜAû4A .A+aåA6>AAÈALûïAX/GAcbAnøAyÉRA~VAA±¯AY&¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  >.»>Ir7?e?ÌcÐ@ÿK@?Ì­@l@³ž@£i@¹@ÏçË@æN|@üµ-A	ïAÁGAô A+'øA6[QAA©ALÂAWõZAc(³An\
+AydAa_AÖ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  >€s>:÷p?aóe?Êx@@>å @k²b@?â@¢Š@¹
+D@Ïsõ@åÚ¥@üAVA	TA\AºµA*î
+A6!eAATŸALAW»oAbîÇAn" Ayq¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  >)/>,|,?^T?ÈÅ@/ê@=ýL@jÊ­@Ì@¢2¹@žj@Ï @åfË@ûÍ}A	AMoAÇA*Ž A5çyAAÑALN)AWAbÐo¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  >­é>
+ æ?ZµÃ?ÆõŠ@H5@=@iâù@X.@¡Ÿß@ž%@Î@@äòò@ûY¢Aà)AAFÛA*z3A5­A@àäAL/Ñ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  =èeE>?W?Å&M@`@<-ë@hûM@äW@¡K@·±º@Îj@ä@úåÌAŠ?AÙA
+ïA*@HA55¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  =Ën¹>
+Ù?Sx@?ÃVä@xÕ@;F7@h@p~@ ×.@·=ß@Í€@ä
+A@úqòAlQAªA
+î¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  =®x1=å *?OÙ?Á@
+(@:^@g+ì@ü§@ cX@¶Ê	@Í0º@ãk@ùþ
+AMû¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  =€=È)?L:Œ?¿ž#@
+©t@9vÖ@fD8@Í@ï~@¶V/@ÌŒà@ãZº¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  =i.=«3?Hë?œèº@
+ÁÀ@8"@e\@ó@{€@¶~¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  =/)==?Dý9?Œa@
+Ú@7§u@dt×@ØF¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  <êwô=bì?A^h?ºIù@	ò_@7.¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  <m;Š=( Ü?=¿?¹W6¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  9°ç\=
+J¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              XTENSION= 'IMAGE   '           / IMAGE extension                                BITPIX  =                  -32 / number of bits per data pixel                  NAXIS   =                    3 / number of data axes                            NAXIS1  =                   64 / length of data axis 1                          NAXIS2  =                   64 / length of data axis 2                          NAXIS3  =                    1 / length of data axis 3                          PCOUNT  =                    0 / required keyword; must = 0                     GCOUNT  =                    1 / required keyword; must = 1                     BZERO   =   0.000000000000E+00 / Pixel Value Offset                             BSCALE  =   1.000000000000E+00 / Pixel Value Scale                              END                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             ?!G®?Ð£×@(Qì@hQì@(ö@Ž(ö@Ô(ö@ô(öA
+{A{A*{A:{AJ{AZ{Aj{Az{A
+
+=A
+=A
+=A
+=A¥
+=A­
+=Aµ
+=Aœ
+=AÅ
+=AÍ
+=AÕ
+=AÝ
+=Aå
+=Aí
+=Aõ
+=Aý
+=B
+B
+B
+
+B
+B
+B
+B
+B
+
+B"
+B&
+B*
+B.
+B2
+B6
+B:
+B>
+BB
+BF
+BJ
+BN
+BR
+BV
+BZ
+B^
+Bb
+Bf
+Bj
+Bn
+Br
+Bv
+Bz
+B~
+?
+žR?Ï\)@'®@g®@×
+@³×
+@Ó×
+@ó×
+A	ë
+Aë
+A)ë
+A9ë
+AIë
+AYë
+Aië
+Ayë
+AõÃAõÃAõÃAõÃA€õÃA¬õÃAŽõÃAŒõÃAÄõÃAÌõÃAÔõÃAÜõÃAäõÃAìõÃAôõÃAüõÃBzáBzáB
+záBzáBzáBzáBzáB
+záB"záB&záB*záB.záB2záB6záB:záB>záBBzáBFzáBJzáBNzáBRzáBVzáBZzáB^záBbzáBfzáBjzáBnzáBrzáBvzáBzzáB~zá?
+(ö?Î{@'
+>@g
+>@
+@³
+@Ó
+@ó
+A	ÂAÂA)ÂA9ÂAIÂAYÂAiÂAyÂAáHAáHAáHAáHA€áHA¬áHAŽáHAŒáHAÄáHAÌáHAÔáHAÜáHAäáHAìáHAôáHAüáHBp€Bp€B
+p€Bp€Bp€Bp€Bp€B
+p€B"p€B&p€B*p€B.p€B2p€B6p€B:p€B>p€BBp€BFp€BJp€BNp€BRp€BVp€BZp€B^p€Bbp€Bfp€Bjp€Bnp€Brp€Bvp€Bzp€B~p€??ÌÌÍ@&ff@fff@33@³33@Ó33@ó33A	AA)A9AIAYAiAyAÌÍAÌÍAÌÍAÌÍA€ÌÍA¬ÌÍAŽÌÍAŒÌÍAÄÌÍAÌÌÍAÔÌÍAÜÌÍAäÌÍAìÌÍAôÌÍAüÌÍBffBffB
+ffBffBffBffBffB
+ffB"ffB&ffB*ffB.ffB2ffB6ffB:ffB>ffBBffBFffBJffBNffBRffBVffBZffB^ffBbffBfffBjffBnffBrffBvffBzffB~ff?
+=?Ë
+
+@%Â@eÂ@áH@²áH@ÒáH@òáHA	p€Ap€A)p€A9p€AIp€AYp€Aip€Ayp€AžRAžRAžRAžRA€žRA¬žRAŽžRAŒžRAÄžRAÌžRAÔžRAÜžRAäžRAìžRAôžRAüžRB\)B\)B
+\)B\)B\)B\)B\)B
+\)B"\)B&\)B*\)B.\)B2\)B6\)B:\)B>\)BB\)BF\)BJ\)BN\)BR\)BV\)BZ\)B^\)Bb\)Bf\)Bj\)Bn\)Br\)Bv\)Bz\)B~\)?zá?Ê=p@%
+ž@e
+ž@\@²\@Ò\@ò\A	G®AG®A)G®A9G®AIG®AYG®AiG®AyG®A£×A£×A£×A£×A€£×A¬£×AŽ£×AŒ£×AÄ£×AÌ£×AÔ£×AÜ£×Aä£×Aì£×Aô£×Aü£×BQìBQìB
+QìBQìBQìBQìBQìB
+QìB"QìB&QìB*QìB.QìB2QìB6QìB:QìB>QìBBQìBFQìBJQìBNQìBRQìBVQìBZQìB^QìBbQìBfQìBjQìBnQìBrQìBvQìBzQìB~Qì?ë
+?ÈõÂ@$zá@dzá@=q@²=q@Ò=q@ò=qA	
+žA
+žA)
+žA9
+žAI
+žAY
+žAi
+žAy
+žA\A\A\A\A€\A¬\AŽ\AŒ\AÄ\AÌ\AÔ\AÜ\Aä\Aì\Aô\Aü\BG®BG®B
+G®BG®BG®BG®BG®B
+G®B"G®B&G®B*G®B.G®B2G®B6G®B:G®B>G®BBG®BFG®BJG®BNG®BRG®BVG®BZG®B^G®BbG®BfG®BjG®BnG®BrG®BvG®BzG®B~G®?\)?Ç®@#×
+@c×
+@ë
+@±ë
+@Ñë
+@ñë
+AõÃAõÃA(õÃA8õÃAHõÃAXõÃAhõÃAxõÃAzáAzáAzáAzáA€záA¬záAŽzáAŒzáAÄzáAÌzáAÔzáAÜzáAäzáAìzáAôzáAüzáB=qB=qB
+=qB=qB=qB=qB=qB
+=qB"=qB&=qB*=qB.=qB2=qB6=qB:=qB>=qBB=qBF=qBJ=qBN=qBR=qBV=qBZ=qB^=qBb=qBf=qBj=qBn=qBr=qBv=qBz=qB~=q?
+ÌÍ?Æff@#33@c33@@±@Ñ@ñAÌÍAÌÍA(ÌÍA8ÌÍAHÌÍAXÌÍAhÌÍAxÌÍAffAffAffAffA€ffA¬ffAŽffAŒffAÄffAÌffAÔffAÜffAäffAìffAôffAüffB33B33B
+33B33B33B33B33B
+33B"33B&33B*33B.33B233B633B:33B>33BB33BF33BJ33BN33BR33BV33BZ33B^33Bb33Bf33Bj33Bn33Br33Bv33Bz33B~33?
+=q?Å
+ž@"\@b\@G®@±G®@ÑG®@ñG®A£×A£×A(£×A8£×AH£×AX£×Ah£×Ax£×AQìAQìAQìAQìA€QìA¬QìAŽQìAŒQìAÄQìAÌQìAÔQìAÜQìAäQìAìQìAôQìAüQìB(öB(öB
+(öB(öB(öB(öB(öB
+(öB"(öB&(öB*(öB.(öB2(öB6(öB:(öB>(öBB(öBF(öBJ(öBN(öBR(öBV(öBZ(öB^(öBb(öBf(öBj(öBn(öBr(öBv(öBz(öB~(ö?®?Ã×
+@!ë
+@aë
+@õÂ@°õÂ@ÐõÂ@ðõÂAzáAzáA(záA8záAHzáAXzáAhzáAxzáA=qA=qA=qA=qA€=qA¬=qAŽ=qAŒ=qAÄ=qAÌ=qAÔ=qAÜ=qAä=qAì=qAô=qAü=qB
+žB
+žB
+
+žB
+žB
+žB
+žB
+žB
+
+žB"
+žB&
+žB*
+žB.
+žB2
+žB6
+žB:
+žB>
+žBB
+žBF
+žBJ
+žBN
+žBR
+žBV
+žBZ
+žB^
+žBb
+žBf
+žBj
+žBn
+žBr
+žBv
+žBz
+žB~
+ž?
+ž?Â\@!G®@aG®@£×@°£×@Ð£×@ð£×AQìAQìA(QìA8QìAHQìAXQìAhQìAxQìA(öA(öA(öA(öA€(öA¬(öAŽ(öAŒ(öAÄ(öAÌ(öAÔ(öAÜ(öAä(öAì(öAô(öAü(öB{B{B
+{B{B{B{B{B
+{B"{B&{B*{B.{B2{B6{B:{B>{BB{BF{BJ{BN{BR{BV{BZ{B^{Bb{Bf{Bj{Bn{Br{Bv{Bz{B~{?\?ÁG®@ £×@`£×@Qì@°Qì@ÐQì@ðQìA(öA(öA((öA8(öAH(öAX(öAh(öAx(öA{A{A{A{A€{A¬{AŽ{AŒ{AÄ{AÌ{AÔ{AÜ{Aä{Aì{Aô{Aü{B
+=B
+=B
+
+=B
+=B
+=B
+=B
+=B
+
+=B"
+=B&
+=B*
+=B.
+=B2
+=B6
+=B:
+=B>
+=BB
+=BF
+=BJ
+=BN
+=BR
+=BV
+=BZ
+=B^
+=Bb
+=Bf
+=Bj
+=Bn
+=Br
+=Bv
+=Bz
+=B~
+=?   ?À  @   @`  @  @°  @Ð  @ð  A  A  A(  A8  AH  AX  Ah  Ax  A  A  A  A  A€  A¬  AŽ  AŒ  AÄ  AÌ  AÔ  AÜ  Aä  Aì  Aô  Aü  B  B  B
+  B  B  B  B  B
+  B"  B&  B*  B.  B2  B6  B:  B>  BB  BF  BJ  BN  BR  BV  BZ  B^  Bb  Bf  Bj  Bn  Br  Bv  Bz  B~  >úáH?ŸžR@\)@_\)@®@¯®@Ï®@ï®A×
+A×
+A'×
+A7×
+AG×
+AW×
+Ag×
+Aw×
+Aë
+Aë
+Aë
+Aë
+A£ë
+A«ë
+A³ë
+A»ë
+AÃë
+AËë
+AÓë
+AÛë
+Aãë
+Aëë
+Aóë
+Aûë
+BõÃBõÃB	õÃB
+õÃBõÃBõÃBõÃB
+õÃB!õÃB%õÃB)õÃB-õÃB1õÃB5õÃB9õÃB=õÃBAõÃBEõÃBIõÃBMõÃBQõÃBUõÃBYõÃB]õÃBaõÃBeõÃBiõÃBmõÃBqõÃBuõÃByõÃB}õÃ>õÂ?œp€@
+žR@^žR@\)@¯\)@Ï\)@ï\)A®A®A'®A7®AG®AW®Ag®Aw®A×
+A×
+A×
+A×
+A£×
+A«×
+A³×
+A»×
+AÃ×
+AË×
+AÓ×
+AÛ×
+Aã×
+Aë×
+Aó×
+Aû×
+Bë
+Bë
+B	ë
+B
+ë
+Bë
+Bë
+Bë
+B
+ë
+B!ë
+B%ë
+B)ë
+B-ë
+B1ë
+B5ë
+B9ë
+B=ë
+BAë
+BEë
+BIë
+BMë
+BQë
+BUë
+BYë
+B]ë
+Baë
+Beë
+Bië
+Bmë
+Bqë
+Buë
+Byë
+B}ë
+>ð£×?Œ(ö@
+{@^{@
+=@¯
+=@Ï
+=@ï
+=A
+A
+A'
+A7
+AG
+AW
+Ag
+Aw
+AÂAÂAÂAÂA£ÂA«ÂA³ÂA»ÂAÃÂAËÂAÓÂAÛÂAãÂAëÂAóÂAûÂBáHBáHB	áHB
+áHBáHBáHBáHB
+áHB!áHB%áHB)áHB-áHB1áHB5áHB9áHB=áHBAáHBEáHBIáHBMáHBQáHBUáHBYáHB]áHBaáHBeáHBiáHBmáHBqáHBuáHByáHB}áH>ë
+?ºáH@
+p€@]p€@žR@®žR@ÎžR@îžRA\)A\)A'\)A7\)AG\)AW\)Ag\)Aw\)A®A®A®A®A£®A«®A³®A»®AÃ®AË®AÓ®AÛ®Aã®Aë®Aó®Aû®B×
+B×
+B	×
+B
+×
+B×
+B×
+B×
+B
+×
+B!×
+B%×
+B)×
+B-×
+B1×
+B5×
+B9×
+B=×
+BA×
+BE×
+BI×
+BM×
+BQ×
+BU×
+BY×
+B]×
+Ba×
+Be×
+Bi×
+Bm×
+Bq×
+Bu×
+By×
+B}×
+>æff?¹@
+ÌÍ@\ÌÍ@ff@®ff@Îff@îffA33A33A'33A733AG33AW33Ag33Aw33AAAAA£A«A³A»AÃAËAÓAÛAãAëAóAûBÌÍBÌÍB	ÌÍB
+ÌÍBÌÍBÌÍBÌÍB
+ÌÍB!ÌÍB%ÌÍB)ÌÍB-ÌÍB1ÌÍB5ÌÍB9ÌÍB=ÌÍBAÌÍBEÌÍBIÌÍBMÌÍBQÌÍBUÌÍBYÌÍB]ÌÍBaÌÍBeÌÍBiÌÍBmÌÍBqÌÍBuÌÍByÌÍB}ÌÍ>áG®?žQì@
+(ö@\(ö@{@®{@Î{@î{A
+=A
+=A'
+=A7
+=AG
+=AW
+=Ag
+=Aw
+=A
+A
+A
+A
+A£
+A«
+A³
+A»
+AÃ
+AË
+AÓ
+AÛ
+Aã
+Aë
+Aó
+Aû
+BÂBÂB	ÂB
+ÂBÂBÂBÂB
+ÂB!ÂB%ÂB)ÂB-ÂB1ÂB5ÂB9ÂB=ÂBAÂBEÂBIÂBMÂBQÂBUÂBYÂB]ÂBaÂBeÂBiÂBmÂBqÂBuÂByÂB}Â>Ü(ö?·
+>@
+@[
+@Â@­Â@ÍÂ@íÂAáHAáHA&áHA6áHAFáHAVáHAfáHAváHAp€Ap€Ap€Ap€A£p€A«p€A³p€A»p€AÃp€AËp€AÓp€AÛp€Aãp€Aëp€Aóp€Aûp€BžRBžRB	žRB
+žRBžRBžRBžRB
+žRB!žRB%žRB)žRB-žRB1žRB5žRB9žRB=žRBAžRBEžRBIžRBMžRBQžRBUžRBYžRB]žRBažRBežRBižRBmžRBqžRBužRByžRB}žR>×
+=?µÂ@áH@ZáH@p€@­p€@Íp€@íp€AžRAžRA&žRA6žRAFžRAVžRAfžRAvžRA\)A\)A\)A\)A£\)A«\)A³\)A»\)AÃ\)AË\)AÓ\)AÛ\)Aã\)Aë\)Aó\)Aû\)B®B®B	®B
+®B®B®B®B
+®B!®B%®B)®B-®B1®B5®B9®B=®BA®BE®BI®BM®BQ®BU®BY®B]®Ba®Be®Bi®Bm®Bq®Bu®By®B}®>Ñë
+?Žzá@=q@Z=q@
+ž@­
+ž@Í
+ž@í
+žA\A\A&\A6\AF\AV\Af\Av\AG®AG®AG®AG®A£G®A«G®A³G®A»G®AÃG®AËG®AÓG®AÛG®AãG®AëG®AóG®AûG®B£×B£×B	£×B
+£×B£×B£×B£×B
+£×B!£×B%£×B)£×B-£×B1£×B5£×B9£×B=£×BA£×BE£×BI£×BM£×BQ£×BU£×BY£×B]£×Ba£×Be£×Bi£×Bm£×Bq£×Bu£×By£×B}£×>ÌÌÍ?³33@@Y@ÌÍ@¬ÌÍ@ÌÌÍ@ìÌÍAffAffA&ffA6ffAFffAVffAfffAvffA33A33A33A33A£33A«33A³33A»33AÃ33AË33AÓ33AÛ33Aã33Aë33Aó33Aû33BBB	B
+BBBB
+B!B%B)B-B1B5B9B=BABEBIBMBQBUBYB]BaBeBiBmBqBuByB}>Ç®?±ë
+@õÂ@XõÂ@zá@¬zá@Ìzá@ìzáA=qA=qA&=qA6=qAF=qAV=qAf=qAv=qA
+žA
+žA
+žA
+žA£
+žA«
+žA³
+žA»
+žAÃ
+žAË
+žAÓ
+žAÛ
+žAã
+žAë
+žAó
+žAû
+žB\B\B	\B
+\B\B\B\B
+\B!\B%\B)\B-\B1\B5\B9\B=\BA\BE\BI\BM\BQ\BU\BY\B]\Ba\Be\Bi\Bm\Bq\Bu\By\B}\>Â\?°£×@Qì@XQì@(ö@¬(ö@Ì(ö@ì(öA{A{A&{A6{AF{AV{Af{Av{A
+=A
+=A
+=A
+=A£
+=A«
+=A³
+=A»
+=AÃ
+=AË
+=AÓ
+=AÛ
+=Aã
+=Aë
+=Aó
+=Aû
+=B
+B
+B	
+B
+
+B
+B
+B
+B
+
+B!
+B%
+B)
+B-
+B1
+B5
+B9
+B=
+BA
+BE
+BI
+BM
+BQ
+BU
+BY
+B]
+Ba
+Be
+Bi
+Bm
+Bq
+Bu
+By
+B}
+>œp€?¯\)@®@W®@×
+@«×
+@Ë×
+@ë×
+Aë
+Aë
+A%ë
+A5ë
+AEë
+AUë
+Aeë
+Auë
+AõÃAõÃAõÃAõÃA¢õÃAªõÃA²õÃAºõÃAÂõÃAÊõÃAÒõÃAÚõÃAâõÃAêõÃAòõÃAúõÃBzáBzáB	záB
+záBzáBzáBzáB
+záB!záB%záB)záB-záB1záB5záB9záB=záBAzáBEzáBIzáBMzáBQzáBUzáBYzáB]záBazáBezáBizáBmzáBqzáBuzáByzáB}zá>žQì?®{@
+>@W
+>@
+@«
+@Ë
+@ë
+AÂAÂA%ÂA5ÂAEÂAUÂAeÂAuÂAáHAáHAáHAáHA¢áHAªáHA²áHAºáHAÂáHAÊáHAÒáHAÚáHAâáHAêáHAòáHAúáHBp€Bp€B	p€B
+p€Bp€Bp€Bp€B
+p€B!p€B%p€B)p€B-p€B1p€B5p€B9p€B=p€BAp€BEp€BIp€BMp€BQp€BUp€BYp€B]p€Bap€Bep€Bip€Bmp€Bqp€Bup€Byp€B}p€>³33?¬ÌÍ@ff@Vff@33@«33@Ë33@ë33AAA%A5AEAUAeAuAÌÍAÌÍAÌÍAÌÍA¢ÌÍAªÌÍA²ÌÍAºÌÍAÂÌÍAÊÌÍAÒÌÍAÚÌÍAâÌÍAêÌÍAòÌÍAúÌÍBffBffB	ffB
+ffBffBffBffB
+ffB!ffB%ffB)ffB-ffB1ffB5ffB9ffB=ffBAffBEffBIffBMffBQffBUffBYffB]ffBaffBeffBiffBmffBqffBuffByffB}ff>®{?«
+@Â@UÂ@áH@ªáH@ÊáH@êáHAp€Ap€A%p€A5p€AEp€AUp€Aep€Aup€AžRAžRAžRAžRA¢žRAªžRA²žRAºžRAÂžRAÊžRAÒžRAÚžRAâžRAêžRAòžRAúžRB\)B\)B	\)B
+\)B\)B\)B\)B
+\)B!\)B%\)B)\)B-\)B1\)B5\)B9\)B=\)BA\)BE\)BI\)BM\)BQ\)BU\)BY\)B]\)Ba\)Be\)Bi\)Bm\)Bq\)Bu\)By\)B}\)>šõÃ?ª=q@
+ž@U
+ž@\@ª\@Ê\@ê\AG®AG®A%G®A5G®AEG®AUG®AeG®AuG®A£×A£×A£×A£×A¢£×Aª£×A²£×Aº£×AÂ£×AÊ£×AÒ£×AÚ£×Aâ£×Aê£×Aò£×Aú£×BQìBQìB	QìB
+QìBQìBQìBQìB
+QìB!QìB%QìB)QìB-QìB1QìB5QìB9QìB=QìBAQìBEQìBIQìBMQìBQQìBUQìBYQìB]QìBaQìBeQìBiQìBmQìBqQìBuQìByQìB}Qì>£×
+?šõÂ@zá@Tzá@=q@ª=q@Ê=q@ê=qA
+žA
+žA%
+žA5
+žAE
+žAU
+žAe
+žAu
+žA\A\A\A\A¢\Aª\A²\Aº\AÂ\AÊ\AÒ\AÚ\Aâ\Aê\Aò\Aú\BG®BG®B	G®B
+G®BG®BG®BG®B
+G®B!G®B%G®B)G®B-G®B1G®B5G®B9G®B=G®BAG®BEG®BIG®BMG®BQG®BUG®BYG®B]G®BaG®BeG®BiG®BmG®BqG®BuG®ByG®B}G®>žR?§®@×
+@S×
+@ë
+@©ë
+@Éë
+@éë
+AõÃAõÃA$õÃA4õÃADõÃATõÃAdõÃAtõÃAzáAzáAzáAzáA¢záAªzáA²záAºzáAÂzáAÊzáAÒzáAÚzáAâzáAêzáAòzáAúzáB=qB=qB	=qB
+=qB=qB=qB=qB
+=qB!=qB%=qB)=qB-=qB1=qB5=qB9=qB==qBA=qBE=qBI=qBM=qBQ=qBU=qBY=qB]=qBa=qBe=qBi=qBm=qBq=qBu=qBy=qB}=q>?Šff@33@S33@@©@É@éAÌÍAÌÍA$ÌÍA4ÌÍADÌÍATÌÍAdÌÍAtÌÍAffAffAffAffA¢ffAªffA²ffAºffAÂffAÊffAÒffAÚffAâffAêffAòffAúffB33B33B	33B
+33B33B33B33B
+33B!33B%33B)33B-33B133B533B933B=33BA33BE33BI33BM33BQ33BU33BY33B]33Ba33Be33Bi33Bm33Bq33Bu33By33B}33>zá?¥
+ž@\@R\@G®@©G®@ÉG®@éG®A£×A£×A$£×A4£×AD£×AT£×Ad£×At£×AQìAQìAQìAQìA¢QìAªQìA²QìAºQìAÂQìAÊQìAÒQìAÚQìAâQìAêQìAòQìAúQìB(öB(öB	(öB
+(öB(öB(öB(öB
+(öB!(öB%(öB)(öB-(öB1(öB5(öB9(öB=(öBA(öBE(öBI(öBM(öBQ(öBU(öBY(öB](öBa(öBe(öBi(öBm(öBq(öBu(öBy(öB}(ö>\)?£×
+@ë
+@Që
+@õÃ@šõÃ@ÈõÃ@èõÃAzáAzáA$záA4záADzáATzáAdzáAtzáA=qA=qA=qA=qA¢=qAª=qA²=qAº=qAÂ=qAÊ=qAÒ=qAÚ=qAâ=qAê=qAò=qAú=qB
+žB
+žB	
+žB
+
+žB
+žB
+žB
+žB
+
+žB!
+žB%
+žB)
+žB-
+žB1
+žB5
+žB9
+žB=
+žBA
+žBE
+žBI
+žBM
+žBQ
+žBU
+žBY
+žB]
+žBa
+žBe
+žBi
+žBm
+žBq
+žBu
+žBy
+žB}
+ž>=q?¢\@G®@QG®@£×@š£×@È£×@è£×AQìAQìA$QìA4QìADQìATQìAdQìAtQìA(öA(öA(öA(öA¢(öAª(öA²(öAº(öAÂ(öAÊ(öAÒ(öAÚ(öAâ(öAê(öAò(öAú(öB{B{B	{B
+{B{B{B{B
+{B!{B%{B){B-{B1{B5{B9{B={BA{BE{BI{BM{BQ{BU{BY{B]{Ba{Be{Bi{Bm{Bq{Bu{By{B}{>
+
+ž?¡G®@£×@P£×@Qì@šQì@ÈQì@èQìA(öA(öA$(öA4(öAD(öAT(öAd(öAt(öA{A{A{A{A¢{Aª{A²{Aº{AÂ{AÊ{AÒ{AÚ{Aâ{Aê{Aò{Aú{B
+=B
+=B	
+=B
+=B
+=B
+=B
+=B
+
+=B!
+=B%
+=B)
+=B-
+=B1
+=B5
+=B9
+=B=
+=BA
+=BE
+=BI
+=BM
+=BQ
+=BU
+=BY
+=B]
+=Ba
+=Be
+=Bi
+=Bm
+=Bq
+=Bu
+=By
+=B}
+=>  ?   @  @P  @  @š  @È  @è  A  A  A$  A4  AD  AT  Ad  At  A  A  A  A  A¢  Aª  A²  Aº  AÂ  AÊ  AÒ  AÚ  Aâ  Aê  Aò  Aú  B  B  B	  B
+  B  B  B  B
+  B!  B%  B)  B-  B1  B5  B9  B=  BA  BE  BI  BM  BQ  BU  BY  B]  Ba  Be  Bi  Bm  Bq  Bu  By  B}  >uÂ?žR@\)@O\)@®@§®@Ç®@ç®A×
+A×
+A#×
+A3×
+AC×
+AS×
+Ac×
+As×
+Aë
+Aë
+Aë
+Aë
+A¡ë
+A©ë
+A±ë
+A¹ë
+AÁë
+AÉë
+AÑë
+AÙë
+Aáë
+Aéë
+Añë
+Aùë
+B õÃBõÃBõÃB
+õÃBõÃBõÃBõÃB
+õÃB õÃB$õÃB(õÃB,õÃB0õÃB4õÃB8õÃB<õÃB@õÃBDõÃBHõÃBLõÃBPõÃBTõÃBXõÃB\õÃB`õÃBdõÃBhõÃBlõÃBpõÃBtõÃBxõÃB|õÃ>k
+?p€@žR@NžR@\)@§\)@Ç\)@ç\)A®A®A#®A3®AC®AS®Ac®As®A×
+A×
+A×
+A×
+A¡×
+A©×
+A±×
+A¹×
+AÁ×
+AÉ×
+AÑ×
+AÙ×
+Aá×
+Aé×
+Añ×
+Aù×
+B ë
+Bë
+Bë
+B
+ë
+Bë
+Bë
+Bë
+B
+ë
+B ë
+B$ë
+B(ë
+B,ë
+B0ë
+B4ë
+B8ë
+B<ë
+B@ë
+BDë
+BHë
+BLë
+BPë
+BTë
+BXë
+B\ë
+B`ë
+Bdë
+Bhë
+Blë
+Bpë
+Btë
+Bxë
+B|ë
+>aG®?(ö@{@N{@
+=@§
+=@Ç
+=@ç
+=A
+A
+A#
+A3
+AC
+AS
+Ac
+As
+AÂAÂAÂAÂA¡ÂA©ÂA±ÂA¹ÂAÁÂAÉÂAÑÂAÙÂAáÂAéÂAñÂAùÂB áHBáHBáHB
+áHBáHBáHBáHB
+áHB áHB$áHB(áHB,áHB0áHB4áHB8áHB<áHB@áHBDáHBHáHBLáHBPáHBTáHBXáHB\áHB`áHBdáHBháHBláHBpáHBtáHBxáHB|áH>W
+=?áH@
+p€@Mp€@žR@ŠžR@ÆžR@æžRA\)A\)A#\)A3\)AC\)AS\)Ac\)As\)A®A®A®A®A¡®A©®A±®A¹®AÁ®AÉ®AÑ®AÙ®Aá®Aé®Añ®Aù®B ×
+B×
+B×
+B
+×
+B×
+B×
+B×
+B
+×
+B ×
+B$×
+B(×
+B,×
+B0×
+B4×
+B8×
+B<×
+B@×
+BD×
+BH×
+BL×
+BP×
+BT×
+BX×
+B\×
+B`×
+Bd×
+Bh×
+Bl×
+Bp×
+Bt×
+Bx×
+B|×
+>LÌÍ?@
+ÌÍ@LÌÍ@ff@Šff@Æff@æffA33A33A#33A333AC33AS33Ac33As33AAAAA¡A©A±A¹AÁAÉAÑAÙAáAéAñAùB ÌÍBÌÍBÌÍB
+ÌÍBÌÍBÌÍBÌÍB
+ÌÍB ÌÍB$ÌÍB(ÌÍB,ÌÍB0ÌÍB4ÌÍB8ÌÍB<ÌÍB@ÌÍBDÌÍBHÌÍBLÌÍBPÌÍBTÌÍBXÌÍB\ÌÍB`ÌÍBdÌÍBhÌÍBlÌÍBpÌÍBtÌÍBxÌÍB|ÌÍ>B\?Qì@
+(ö@L(ö@{@Š{@Æ{@æ{A
+=A
+=A#
+=A3
+=AC
+=AS
+=Ac
+=As
+=A
+A
+A
+A
+A¡
+A©
+A±
+A¹
+AÁ
+AÉ
+AÑ
+AÙ
+Aá
+Aé
+Añ
+Aù
+B ÂBÂBÂB
+ÂBÂBÂBÂB
+ÂB ÂB$ÂB(ÂB,ÂB0ÂB4ÂB8ÂB<ÂB@ÂBDÂBHÂBLÂBPÂBTÂBXÂB\ÂB`ÂBdÂBhÂBlÂBpÂBtÂBxÂB|Â>8Qì?
+>@
+
+@K
+@
+Â@¥Â@ÅÂ@åÂAáHAáHA"áHA2áHABáHARáHAbáHAráHAp€Ap€Ap€Ap€A¡p€A©p€A±p€A¹p€AÁp€AÉp€AÑp€AÙp€Aáp€Aép€Añp€Aùp€B žRBžRBžRB
+žRBžRBžRBžRB
+žRB žRB$žRB(žRB,žRB0žRB4žRB8žRB<žRB@žRBDžRBHžRBLžRBPžRBTžRBXžRB\žRB`žRBdžRBhžRBlžRBpžRBtžRBxžRB|žR>.{?Â@
+áH@JáH@
+p€@¥p€@Åp€@åp€AžRAžRA"žRA2žRABžRARžRAbžRAržRA\)A\)A\)A\)A¡\)A©\)A±\)A¹\)AÁ\)AÉ\)AÑ\)AÙ\)Aá\)Aé\)Añ\)Aù\)B ®B®B®B
+®B®B®B®B
+®B ®B$®B(®B,®B0®B4®B8®B<®B@®BD®BH®BL®BP®BT®BX®B\®B`®Bd®Bh®Bl®Bp®Bt®Bx®B|®>#×
+?zá@
+=q@J=q@
+
+ž@¥
+ž@Å
+ž@å
+žA\A\A"\A2\AB\AR\Ab\Ar\AG®AG®AG®AG®A¡G®A©G®A±G®A¹G®AÁG®AÉG®AÑG®AÙG®AáG®AéG®AñG®AùG®B £×B£×B£×B
+£×B£×B£×B£×B
+£×B £×B$£×B(£×B,£×B0£×B4£×B8£×B<£×B@£×BD£×BH£×BL£×BP£×BT£×BX£×B\£×B`£×Bd£×Bh£×Bl£×Bp£×Bt£×Bx£×B|£×>?33@	@I@ÌÍ@€ÌÍ@ÄÌÍ@äÌÍAffAffA"ffA2ffABffARffAbffArffA33A33A33A33A¡33A©33A±33A¹33AÁ33AÉ33AÑ33AÙ33Aá33Aé33Añ33Aù33B BBB
+BBBB
+B B$B(B,B0B4B8B<B@BDBHBLBPBTBXB\B`BdBhBlBpBtBxB|>\)?ë
+@õÃ@HõÃ@zá@€zá@Äzá@äzáA=qA=qA"=qA2=qAB=qAR=qAb=qAr=qA
+žA
+žA
+žA
+žA¡
+žA©
+žA±
+žA¹
+žAÁ
+žAÉ
+žAÑ
+žAÙ
+žAá
+žAé
+žAñ
+žAù
+žB \B\B\B
+\B\B\B\B
+\B \B$\B(\B,\B0\B4\B8\B<\B@\BD\BH\BL\BP\BT\BX\B\\B`\Bd\Bh\Bl\Bp\Bt\Bx\B|\>
+ž?£×@Qì@HQì@(ö@€(ö@Ä(ö@ä(öA{A{A"{A2{AB{AR{Ab{Ar{A
+=A
+=A
+=A
+=A¡
+=A©
+=A±
+=A¹
+=AÁ
+=AÉ
+=AÑ
+=AÙ
+=Aá
+=Aé
+=Añ
+=Aù
+=B 
+B
+B
+B
+
+B
+B
+B
+B
+
+B 
+B$
+B(
+B,
+B0
+B4
+B8
+B<
+B@
+BD
+BH
+BL
+BP
+BT
+BX
+B\
+B`
+Bd
+Bh
+Bl
+Bp
+Bt
+Bx
+B|
+=õÂ?\)@®@G®@×
+@£×
+@Ã×
+@ã×
+Aë
+Aë
+A!ë
+A1ë
+AAë
+AQë
+Aaë
+Aqë
+AõÃAõÃAõÃAõÃA õÃAšõÃA°õÃAžõÃAÀõÃAÈõÃAÐõÃAØõÃAàõÃAèõÃAðõÃAøõÃB záBzáBzáB
+záBzáBzáBzáB
+záB záB$záB(záB,záB0záB4záB8záB<záB@záBDzáBHzáBLzáBPzáBTzáBXzáB\záB`záBdzáBhzáBlzáBpzáBtzáBxzáB|zá=áG®?{@
+=@G
+=@
+@£
+@Ã
+@ã
+AÂAÂA!ÂA1ÂAAÂAQÂAaÂAqÂAáHAáHAáHAáHA áHAšáHA°áHAžáHAÀáHAÈáHAÐáHAØáHAàáHAèáHAðáHAøáHB p€Bp€Bp€B
+p€Bp€Bp€Bp€B
+p€B p€B$p€B(p€B,p€B0p€B4p€B8p€B<p€B@p€BDp€BHp€BLp€BPp€BTp€BXp€B\p€B`p€Bdp€Bhp€Blp€Bpp€Btp€Bxp€B|p€=ÌÌÍ?ÌÍ@ff@Fff@33@£33@Ã33@ã33AAA!A1AAAQAaAqAÌÍAÌÍAÌÍAÌÍA ÌÍAšÌÍA°ÌÍAžÌÍAÀÌÍAÈÌÍAÐÌÍAØÌÍAàÌÍAèÌÍAðÌÍAøÌÍB ffBffBffB
+ffBffBffBffB
+ffB ffB$ffB(ffB,ffB0ffB4ffB8ffB<ffB@ffBDffBHffBLffBPffBTffBXffB\ffB`ffBdffBhffBlffBpffBtffBxffB|ff=žQì?
+@Â@EÂ@áH@¢áH@ÂáH@âáHAp€Ap€A!p€A1p€AAp€AQp€Aap€Aqp€AžRAžRAžRAžRA žRAšžRA°žRAžžRAÀžRAÈžRAÐžRAØžRAàžRAèžRAðžRAøžRB \)B\)B\)B
+\)B\)B\)B\)B
+\)B \)B$\)B(\)B,\)B0\)B4\)B8\)B<\)B@\)BD\)BH\)BL\)BP\)BT\)BX\)B\\)B`\)Bd\)Bh\)Bl\)Bp\)Bt\)Bx\)B|\)=£×
+?=q@
+ž@E
+ž@\@¢\@Â\@â\AG®AG®A!G®A1G®AAG®AQG®AaG®AqG®A£×A£×A£×A£×A £×Aš£×A°£×Až£×AÀ£×AÈ£×AÐ£×AØ£×Aà£×Aè£×Að£×Aø£×B QìBQìBQìB
+QìBQìBQìBQìB
+QìB QìB$QìB(QìB,QìB0QìB4QìB8QìB<QìB@QìBDQìBHQìBLQìBPQìBTQìBXQìB\QìB`QìBdQìBhQìBlQìBpQìBtQìBxQìB|Qì=\)?õÃ@zá@Dzá@=q@¢=q@Â=q@â=qA
+žA
+žA!
+žA1
+žAA
+žAQ
+žAa
+žAq
+žA\A\A\A\A \Aš\A°\Až\AÀ\AÈ\AÐ\AØ\Aà\Aè\Að\Aø\B G®BG®BG®B
+G®BG®BG®BG®B
+G®B G®B$G®B(G®B,G®B0G®B4G®B8G®B<G®B@G®BDG®BHG®BLG®BPG®BTG®BXG®B\G®B`G®BdG®BhG®BlG®BpG®BtG®BxG®B|G®=uÂ?®@×
+@C×
+@ë
+@¡ë
+@Áë
+@áë
+A õÃAõÃA õÃA0õÃA@õÃAPõÃA`õÃApõÃAzáAzáAzáAzáA záAšzáA°záAžzáAÀzáAÈzáAÐzáAØzáAàzáAèzáAðzáAøzáB =qB=qB=qB
+=qB=qB=qB=qB
+=qB =qB$=qB(=qB,=qB0=qB4=qB8=qB<=qB@=qBD=qBH=qBL=qBP=qBT=qBX=qB\=qB`=qBd=qBh=qBl=qBp=qBt=qBx=qB|=q=LÌÍ?ff@33@C33@@¡@Á@áA ÌÍAÌÍA ÌÍA0ÌÍA@ÌÍAPÌÍA`ÌÍApÌÍAffAffAffAffA ffAšffA°ffAžffAÀffAÈffAÐffAØffAàffAèffAðffAøffB 33B33B33B
+33B33B33B33B
+33B 33B$33B(33B,33B033B433B833B<33B@33BD33BH33BL33BP33BT33BX33B\33B`33Bd33Bh33Bl33Bp33Bt33Bx33B|33=#×
+?
+
+ž@\@B\@G®@¡G®@ÁG®@áG®A £×A£×A £×A0£×A@£×AP£×A`£×Ap£×AQìAQìAQìAQìA QìAšQìA°QìAžQìAÀQìAÈQìAÐQìAØQìAàQìAèQìAðQìAøQìB (öB(öB(öB
+(öB(öB(öB(öB
+(öB (öB$(öB((öB,(öB0(öB4(öB8(öB<(öB@(öBD(öBH(öBL(öBP(öBT(öBX(öB\(öB`(öBd(öBh(öBl(öBp(öBt(öBx(öB|(ö<õÂ?×
+@ë
+@Aë
+@õÃ@ õÃ@ÀõÃ@àõÃA záAzáA záA0záA@záAPzáA`záApzáA=qA=qA=qA=qA =qAš=qA°=qAž=qAÀ=qAÈ=qAÐ=qAØ=qAà=qAè=qAð=qAø=qB 
+žB
+žB
+žB
+
+žB
+žB
+žB
+žB
+
+žB 
+žB$
+žB(
+žB,
+žB0
+žB4
+žB8
+žB<
+žB@
+žBD
+žBH
+žBL
+žBP
+žBT
+žBX
+žB\
+žB`
+žBd
+žBh
+žBl
+žBp
+žBt
+žBx
+žB|
+ž<£×
+?\@G®@AG®@£×@ £×@À£×@à£×A QìAQìA QìA0QìA@QìAPQìA`QìApQìA(öA(öA(öA(öA (öAš(öA°(öAž(öAÀ(öAÈ(öAÐ(öAØ(öAà(öAè(öAð(öAø(öB {B{B{B
+{B{B{B{B
+{B {B${B({B,{B0{B4{B8{B<{B@{BD{BH{BL{BP{BT{BX{B\{B`{Bd{Bh{Bl{Bp{Bt{Bx{B|{<#×
+?G®@ £×@@£×@Qì@ Qì@ÀQì@àQìA (öA(öA (öA0(öA@(öAP(öA`(öAp(öA{A{A{A{A {Aš{A°{Až{AÀ{AÈ{AÐ{AØ{Aà{Aè{Að{Aø{B 
+=B
+=B
+=B
+
+=B
+=B
+=B
+=B
+
+=B 
+=B$
+=B(
+=B,
+=B0
+=B4
+=B8
+=B<
+=B@
+=BD
+=BH
+=BL
+=BP
+=BT
+=BX
+=B\
+=B`
+=Bd
+=Bh
+=Bl
+=Bp
+=Bt
+=Bx
+=B|
+=    ?  @   @@  @  @   @À  @à  A   A  A   A0  A@  AP  A`  Ap  A  A  A  A  A   Aš  A°  Až  AÀ  AÈ  AÐ  AØ  Aà  Aè  Að  Aø  B   B  B  B
+  B  B  B  B
+  B   B$  B(  B,  B0  B4  B8  B<  B@  BD  BH  BL  BP  BT  BX  B\  B`  Bd  Bh  Bl  Bp  Bt  Bx  B|                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  XTENSION= 'IMAGE   '           / IMAGE extension                                BITPIX  =                  -32 / number of bits per data pixel                  NAXIS   =                    3 / number of data axes                            NAXIS1  =                   91 / length of data axis 1                          NAXIS2  =                   91 / length of data axis 2                          NAXIS3  =                    1 / length of data axis 3                          PCOUNT  =                    0 / required keyword; must = 0                     GCOUNT  =                    1 / required keyword; must = 1                     BZERO   =   0.000000000000E+00 / Pixel Value Offset                             BSCALE  =   1.000000000000E+00 / Pixel Value Scale                              END                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ?!1?)ì¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ?
+Æ?(þ?¯m®@ý¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ?óô?$h,?­E@:@29Q@_¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ?U"? É:?«ÎÌ@}@1Q@_«@]â@D¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ?¶P?
+*h?©ÿb@ŽÈ@0ià@^
+ø@
+ê@Ä@³ @ÊB¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ??w?š/ê@Í
+@/#@]7;@
+v)@P¶@³+B@ÊÎ@ààZ@÷Œ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ?
+x­?ì¥?Š`@ åX@.o@\O@
+O@ÜÜ@²·g@Éô@àl@÷G
+AÌAb|¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ?ÙÚ?M³?€?ÿû6@-²²@[gÊ@q@hý@²C@É
+@ßø¡@öÓ.AÖÜAD"A
+±hA)¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ?;	?®á?¢Á?þ+Î@,Êþ@Z@@õ#@±Ï¯@Èª;@ßÈ@ö_TAðA
+5A
+wzA(äÀA4RA?£¶¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ? 7?
+? ò6?ü\e@+ãJ@Ya@Šœ@I@±[Õ@È6a@ßí@õëyAcAÐHA
+=A(ªÓA4A?
+^AJò€AVDT¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  >ùúÊ?q
+?"Ÿ?úì@*û@X°€@2Þ@
+j@°ç÷@ÇÂ@Þ@õwA)AYA
+A(päA3Þ*A?KoAJžŽAV%úAa@Aläð¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  >òœ(?ÒL?SU?øœ@*Ù@WÈð@¿@@°t
+@ÇNš@Þ)5@õÁAï&A\lA
+É±A(6÷A3€<A?AJ~ÈAUì
+AaYRAlÆAx3ÞAÂÇ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  >ë? 3Z?Ü?öî
+@),
+@Vá4@K&@%³@° >@ÆÚÊ@ÝµV@ôâAµ7A"}A
+ÂA'ýA3jMA>×AJDØAU²
+AadAl©AwùîA³Aj=A¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  >äAà>ù)?Žs?õ
+¢@(Dh@Uù@×L@±Ø@¯d@Æfñ@ÝA|@ô
+A{IAèA
+UÕA'ÃA30`A>ŠAJ
+ëAUx1A`åvAlRŒAwÀA€AMHAëAºAcf¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  >Ý<>ñë,?äú?óO)@'\¬@UÃ@cm@=ú@¯
+@Åó@ÜÍ@óš+AA[A® A
+åA'+A2öqA>c·AIÐüAU>BA`«AlÍAwAy­A0PAæóAAT:A
+ÜA£³µ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  >ÕÆ>ê­??ñÀ@&t÷@T*@ï@Ê@®€«@Å8@ÜYÃ@ó4PAnAt³AáùA'O>A2ŒA>)ÉAIAUUA`qAkÞàAwL%A\¶AYAÉýA A7CAíçA£€A©[,A¯¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  >Îõ>ão€?F?ï°G@%;@SBR@{µ@VA@®0Í@Å
+Y@Ûåå@òÀqAÍ~A:ÄAš
+A'OA2A=ïÚAI]ATÊeA`7«Ak€ñAw6A?ŸAöaA­AcšALAÐïA£A©>6A®ôÙAŽ«{AºTT¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  >ÇKQ>Ü2?v¯?íàÞ@$¥@RZ@Û@âg@­Œó@Ä@Ûr
+@òLAA ÖAn
+A&ÛbA2HšA=µíAI#3ATxA_ýœAkkAvØIA"ÈAÙkAAF±AýUA³øA£jA©!?A®×âAŽAºE)A¿ûËAÅ€€¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  >À
+®>Ôô
+?§6?ìe@#œÊ@Qrá@'ù@n@­I@Ä#¡@Úþ-@ñØ¹AY¢AÆèA4-A&¡rA2žA={þAHéDATVA_ÃÏAk1AvYAÐAŒsAsA)ºAà]A A£M€A©GA®ºëAŽqAº(1A¿ÞÕAÅxAËLAÐôó¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  >žÐ
+>Í¶z?×Î?êAü@"Ö@P-@~@E@ú®@¬Õ;@Ã¯Ç@ÚS@ñdßAµAúAú@A&gA1ÔËA=BAH¯VAT
+A_âAj÷'AvdmAèÚA}AV!A
+ÃAÃfAz
+A£0­AšçPA®ôAŽTAº
+;A¿ÁÞAÅxAË/%AÐåÈAÖjAÜEC¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  >±f>Æx?U?èr@!îY@O£p@}X@Ð@¬a\@Ã;è@Úu@ðñAåÆAS
+AÀQA&-A1ÜA="AHugASâ¬A_OòAjœ8Av*~AËâAA9)AïÌAŠpA]A£µAšÊYA®üAŽ7A¹îCA¿€æAÅ[AË-AÐÈÐAÖtAÜ6Aáì¹Aç¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  >ªTÃ>¿:ó?8ì?æ£@!¥@N»»@|pÔ@ö@«í@ÂÈ@Ù¢@ð}&A«ÙAAdA%ó©A1`ïA<Î4AH;zASšÀA_AjJAuðA®ëAeA
+2AÒÖAyA@
+A¢öÀAš­bA®dAŽ©A¹ÑLA¿ïAÅ>AÊõ6AÐ«ÚAÖb}AÜ AáÏÄAçgAí=	Aòåâ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  >£>·ý?is?äÓ¡@ 
+ç@MÓÿ@{@@«y€@ÂT0@Ù.Œ@ð	HAqéAß/ALuA%¹»A1' A<EAHASnÐA^ÜAjI\Au¶¡AôAHAÿ:AµÞAlA#%A¢ÙÈAškA®GA³ý±A¹ŽTA¿jøAÅ!AÊØ>AÐâAÖE
+AÛü)Aá²ÌAçioAí AòÖ¶AøXAþ61¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  >Ù|>°¿??ã@@77@LìN@z¡g@+@@«Ì@ÁàX@Øºä@ïpA7þA¥CAA%ÎA0íA<ZZAGÇAS4äA^¢*AjpAu|µAtýA+ AâDAçAOA.A¢ŒÑAšsuA®*A³à»A¹_A¿NAÅ€AÊ»HAÐqëAÖ(AÛß2AáÕAçLyAí
+Aò¹¿AøpcAþ'BîÕBÃA¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  >×>©è?
+Ê©?á4×@
+O@L@y¹²@·f@ªñ@Ál~@ØG
+@ï!AþAkVAØA%EáA0³&A< lAG²ARúøA^h=AiÕAuBÈAXAªAÅMA{ðA2Aé7A¢ÚAšV~A®
+!A³ÃÅA¹zhA¿1
+AÄç¯AÊQAÐTôAÖ
+AÛÂ;AáxÞAç/Aìæ%AòÉAøSlAþ
+BàYB»«BýB
+ki¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  >^4>¢DD?û@?ßen@
+gÎ@K
+å@xÑþ@C@ª
+@Àø€@×Ó/@î­ŒAÄ#A1iA®A%
+ôA0y:A;æAGSÄARÁ
+A^.PAiAuÛA;A
+ñŽAšWA^úAAÌ@A¢äAš9A­ð*A³ŠÎA¹]qA¿AÄÊžAÊ[AÐ7ÿAÕî¡AÛ¥DAá[èAçAìÉ.AòÒAø6uAýíBÑÞB­0BB
+cÓB
+?%B¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  > > ?+×?Ý@
+@J51@wêJ@Ï±@©ª=@ÀÉ@×_U@î9âA6A
+÷|AdÁA$ÒA0?LA;¬AGØAR
+A]ôbAiašAtÎîA
+A
+ÔœAaABAø§A¯JA¢eíAš
+A­Ó4A³×A¹@zAŸ÷
+AÄ­ÁAÊdeAÐAÕÑ«AÛOAá>ñAæõAì¬8AòbÛAø~AýÐ"BÃcBŽBzB
+UXB
+0©B
+ûBçMB»¹¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  >}ÅØ>Èü?\n?ÛÆ@e@IM}@w@[×@©6c@Àï@Öë{@íÆAPIA
+œA*ÕA$A0_A;r¥AFßêARM0A]ºvAi'»At A#A
+·ÆAnjA%
+AÛ±ATA¢H÷A§ÿA­¶=A³làA¹#AŸÚ'AÄÊAÊGnAÏþAÕŽµAÛkXAá!ûAæØAìAAòEäA÷üAý³+BŽçB9BkB
+FÜB
+".BýBØÑBŽ#BuBcá¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  >oJ>X?}
+?Ù÷3@°±@HeÈ@vá@çý@šÂ@¿@Öw¡@íR-A\A
+¡AðçA$^-A/ËsA;8žAF¥ýARCA]AhíÎAt[AÈYA
+ÐAQsAAŸºAu]A¢,A§â€A­GA³OêA¹AŸœ0AÄsÔAÊ*wAÏáAÕŸAÛNaAáAæ»šAìrKAò(ïA÷ßAý4BŠlBŸB]B
+8aB
+³BïBÊVB¥šBùB\KB
+7B!
+	¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  >`ÏI>
+Mµ?y{8?Ø'Ë@Èý@G~@u3,@t"@šN®@¿);@ÖÆ@ìÞSAÜoA
+IµA¶úA$$?A/
+A:þËAFlAQÙVA]FAh³áAt!&AlA
+}ÙA4|Aë A¡ÃAXfA¢
+A§Å­A­|QA³2ôAžéAŸ :AÄVÝAÊ
+AÏÄ$AÕzÇAÛ1jAàèAæ±AìUUAò
+øA÷ÂAýy?BñBsBBNB
+)æB
+7BàB»ÛB,Br~BMÐB
+)!B!sB#ßÅB&Ž1¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  >RT >|  ?uÜf?ÖXb@áH@F_@tKw@ H@§ÚÔ@Ÿµ`@Õì@ìjyA¢A
+ÇA}
+A#êSA/WA:ÄÝAF2#AQiA]
+¯AhyôAsç9ATA
+`ãAAÎ)AÌA;pA¡òA§š¶A­_ZA³ýAžÌ¡AŸDAÄ9çAÉðAÏ§-AÕ]ÐAÛtAàËAæºAì8^AñïA÷¥¥Aý\HBuBdÇB@B
+jB
+öŒBÒB­_B±BdB?TB
+ŠB õøB#ÑIB&¬B)íB,\Y¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  >CØž>m€Ø?r=?Ôù@ù@E®«@scÃ@m@§fú@ŸA@Õ
+@ëöAhA
+ÕÚAC A#°eA/
+«A:ñAEø6AQe{A\ÒÁAh@As­MAA
+CìAúA±3AgÖA
+yA¡Õ
+A§ÀA­BcA²ùAž¯ªAŸfMAÄ
+ñAÉÓAÏ7AÕ@ÚAÚ÷}Aà® AædÄAìgAñÒ
+A÷®Aý?QBzúBVLB1B
+
+ïB
+èABÃBäBz6BUB0ÙB
+
++B ç|B#ÂÎB& B)yqB,TÃB/0B2¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  >5]q>_)?nÃ?Ò¹@ß@DÆö@r|@@Šó@œÍ«@Ôš8@ëÄA.šA
+íA	3A#vxA.ãŸA:QAEŸIAQ+A\ÔAhAss_A~à¥A
+&öAÝA<AJàAA¡ž&A§nÉA­%lA²ÜAž³AŸIVAÃÿúAÉ¶AÏmAAÕ#äAÚÚAà*AæGÍAëþpAñµA÷k·Aý"ZBlBGÐB#"B	þtB
+ÙÅBµBiBkºBG
+B"^B
+ý¯B ÙB#ŽSB&€B)jöB,FHB/!B1üëB4Ø=B7¬©¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  >&â)>P®?k ?Ðê/@*/@CßF@q^@€»@ŠG@œYÓ@Ô4_@ëëA ô»A
+bAÏGA#<A.©ÒA:AE]APñ¢A\^èAgÌ.As9sA~Š¹A
+
+ AÀ£AwGA-êAäA¡1A§QÔA­wA²¿AžuœAŸ,aAÃãAÉ§AÏPKAÕîAÚœAàt5Aæ*ØAëá{Añ
+A÷NÁAýeB^B9UB§B	ïøB
+ËJBŠBíB]?B8BâB
+ï4B ÊB#¥×B&)B)\{B,7ÌB/
+B1îpB4ÉÁB7¥B:eB=TÑ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  >fâ>B3?ga
+?ÏŸ@Bv@B÷@p¬Š@0ß@Š
+k@Œå÷@ÓÀ@êA ºÍA
+(AXA#A.oäA9Ý)AEJoAP·ŽA\$úAg?Arÿ
+A~lÊAíA£¬AZOAòAÇA¡~9A§4ÜA¬ëA²¢#AžXÆAŸiAÃÆ
+AÉ|°AÏ3SAÔéöAÚ AàW=Aæ
+áAëÄAñ{'A÷1ÊAüèmBOB*ÚB,B	á}B
+ŒÏB BsrBNÄB*BgB
+à¹B Œ
+B#\B&r®B)MÿB,)QB/£B1ßôB4»FB7B:qéB=M;B@(BBüù¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  >	ë>3·?cÂD?ÍKQ@ZÀ@B×@oÄï@œ@¥@Œr
+@ÓLš@ê'4A àA
+î%A[kA"È±A.5öA9£<AEAP}ÇA[ë
+AgXRArÅA~2ÝAÐAµA=XAóüAªA¡aBA§æA¬ÎA²
+,Až;ÐAœòsAÃ©AÉ_¹AÏ\AÔÍ AÚ£Aà:FAåðêAë§Añ^1A÷ÔAüËwBA
+B
+_B÷°B	ÓB
+®TB¥Bd÷B@HBBöìB
+Ò=B ­B#áB&d2B)?B,ÖB.ö'B1ÑyB4¬ËB7
+B:cnB=>ÀB@BBõcBEÐµBH¥!¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  =öà©>%<3?`#k?Ë{ä@s	@A(!@nÝ9@I)@¥#Ž@»þ@@ÒØÍ@é³YA FòA
+Ž8A!}A"ÂA-üA9iNADÖAPCÙA[±Ag
+dArªA}øñA³
+AiŸA bA×AšA¡DLAŠúïA¬±A²h6Až
+ÙAœÕ|AÃ AÉBÃAÎùfAÔ°	AÚf¬Aà
+PAåÓóAëAñA:Aö÷ÝAü®B2B
+ãBé5B	ÄB
+ØB{*BV|B1ÍB
+BèpB
+ÃÂB B#zeB&U·B)1	B,
+ZB.ç¬B1ÂþB4OB7y¡B:TóB=0DB@
+BBæèBEÂ9BHBKxÝBNMI¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  =Ùê>Àí?\?É¬{@U@@@l@mõ@ÕN@€¯Ú@»g@Òdò@é?~A 
+A
+zJAçA"TÖA-ÂA9/`ADŠAP	ìA[w1AfäwArQœA}¿A%ALÈAlAºAp²A¡'UAŠÝøA¬A²K?AžâAœžAÃo)AÉ%ÌAÎÜpAÔAÚI¶Aà YAå¶üAëm Añ$CAöÚæAüB$BÿhBÚºB	¶
+B
+]Bl¯BH B#RBþ€BÙõB
+µGB B#kêB&G<B)"B+ýßB.Ù1B1ŽB4ÔB7k&B:FwB=!ÉB?ýBBØlBE³ŸBHBKjaBNE³BQ!BSõq¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  =Œó>E?XåÀ?ÇÝ@£@?X¶@m
+Î@as@€;ÿ@»@Ññ@èË€@ÿŠ0A
+@]A­¢A"èA-.A8õtADb¹AOÏþA[=DAfªArÏA}
+Ay.A/ÒAæuAASŒA¡
+^AŠÁA¬w¥A².HA·äìAœAÃR2AÉÖAÎ¿yAÔv
+AÚ,ÀAßãcAåAëP©AñLAöœðAütBBðíBÌ>B	§B
+âB^3B9
+B×Bð(BËzB
+ŠÌB 
+B#]oB&8ÀB)B+ïdB.ÊµB1ŠB4YB7\ªB:7üB=NB?îBBÉñBE¥CBHBK[æBN78BQBSíÛBVÉ-BY¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  =ý=ó@?UFæ?Æ
+¡@»ç@>pÿ@l&@í@£È$@º¢°@Ñ}<@èWÈ@ÿ2SA
+oAsµA!àúA-N?A8»
+AD(ËAOA[VAfpAqÝáA}K'A\7AÚAÉ}A!A6ÄA ígAŠ€
+A¬Z­A²QA·ÇôAœ~AÃ5;AÈëÞAÎ¢AÔY%AÚÈAßÆkAå}Aë3²AðêUAö øAüWBBâpBœÂB	B
+teBO·B+	BZBá¬BŒþB
+OB s¡B#NóB&*DB)B+àçB.Œ9B1B4rÜB7N.B:)B=ÑB?à#BB»uBEÆBHrBKMjBN(»BQ
+BSß_BVº°BYB\qTB_EÀ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  =t=Ö?Qš?Ä>6@Ô2@=I@k>a@yœ@£TH@º.Õ@Ñ	a@çãí@þŸyA
+ÌA9ÈA!§
+A-SA8ACîÝAO\#AZÉiAf6¯Aq£ôA}9A?@AõãA¬Ac*AÍA ÐqAŠA¬=·A±ô[A·ªýAœa¡AÃDAÈÎçAÎ
+AÔ<.AÙòÑAß©uAå`Aë»AðÍ_AöAü:¥B ø£BÓõB¯GB	B
+eêBA<B
+B÷ßBÓ1B®B
+ÔB e&B#@wB&ÉB(÷B+ÒlB.­ŸB1B4daB7?³B:B<öVB?ÑšBB¬ùBEKBHcBK>îBN@BPõBSÐãBV¬5BYB\bØB_>*Bb|Bdíè¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  =LÍ=¹Šä?N	:?ÂnÌ@ì}@<¡@jV¬@â@¢ào@¹ºû@Ð@çp@þJA
+AÿÚA!m A,ÚfA8G«ACŽñAO"6AZ{AeüÁAqjA|×LA"IAØíAAF3Aü×A ³zAŠj
+A¬ ÁA±×dA·AœD«AÂûMAÈ±ñAÎhAÔ7AÙÕÛAß~AåC!AêùÅAð°hAög
+Aü
+¯B ê(BÅzB ÌB	|
+B
+WoB2ÀBBédBÄµB B
+{YB VªB#1üB&
+NB(èB+ÃñB.CB1zB4UæB717B:
+B<çÛB?Ã,BB~BEyÐBHU!BK0sBN
+ÅBPçBSÂhBVºBYy
+B\T]B_/¯Bb
+ BdæRBgÁ€Bj¿  ¿  ¿  ¿  ¿  ¿  =2³=°8?Jjd?À`@Ç@;¹ß@inö@@¢l@¹G@Ð!¬@æü8@ýÖÂA
+X§AÅíA!32A, wA8
+œAC{ANèHAZUAeÂÓAq0A|`ASA»öArA)=AßàA AŠM'A¬ÊA±ºmA·qAœ'ŽAÂÞWAÈûAÎKAÔAAÙžäAßoAå&+AêÜÎAðqAöJAü žB Û­B¶ÿBPB	m¢B
+HôB$EBÿBÚèB¶:BB
+lÝB H/B##B%þÒB(Ú$B+µvB.ÇB1lB4GkB7"ŒB9þB<Ù_B?Ž±BBBEkTBHFŠBK!øBMýIBPØBS³íBV>BYjB\EâB_!3Baü
+Bd××Bg³(BjzBmiÌBp>8¿  ¿  ¿  ¿  <°/=s4?FË?ŸÏø@
+
+@:Ò*@hB@
+-@¡ø¹@žÓE@Ï­Ñ@æ]@ýbèA
+
+¹AÿA ùEA,fA7ÓÐACAAN®[AZ¡AeæApö,A|csAè]A AU£A
+FAÂéA yAŠ00A«æÓA±wA·TAœ
+œAÂÁaAÈxAÎ.§AÓåKAÙíAßRAå	4Aê¿×Aðv{Aö-
+AûãÁB Í2BšBÕB	_'B
+:xBÊBñ
+BÌmB§¿BB
+^bB 9ŽB#B%ðWB(Ë©B+ŠúB.LB1]B48ïB7AB9ïB<ÊäB?Š6BBBE\ÙBH8+BK|BMîÎBPÊ BS¥qBVÃBY\B\7fB_žBaî
+BdÉ[Bg€­BjÿBm[PBp6¢BsôBuæ`¿  ¿  ;òÃë=E
+ê?C,œ?œ @
+5^@9êu@g@ªS@¡ß@ž_k@Ï9÷@æ@üïA	äÍARA ¿WA,,A7ãAC)ANtnAYá³AeNùApŒ?A|)
+AËfA	A8­AïPA¥óA \AŠ9A«ÉÝA±A·7#AŒíÇAÂ€jAÈ[
+AÎ±AÓÈTAÙ~÷Aß5Aäì=Aê¢áAðYAö'AûÆËB Ÿ·BBuZB	P«B
++ýBOBâ BœòBDBtB
+OçB +8B#B%áÜB(œ-B+B.sÑB1O"B4*tB7ÆB9áB<ŒiB?»BBs
+BEN^BH)¯BKBMàSBP»€BSöBVrHBYMB\(ëB_=BaßBdºàBg2BjqBmLÕBp('BsxBuÞÊBxº
+B{    =
+??è?»1"@
+Mš@9¿@f·×@6x@¡@·ë@ÎÆ
+@å š@ü{4A	ªàA%A 
+kA+ò°A7_õABÍ;AN:AY§ÇAe
+ApQA{ïA®oAeA¶AÒYAýA ? A¥öCA«¬æA±cA·-AŒÐÐAÂsAÈ>AÍôºAÓ«]AÙbAß€AäÏGAê
+ëAð<Aõó1Aû©ÔB °;BBfßB	B0B
+
+BøÓBÔ%B¯wBÈBfB
+AlB 
+œB"øB%Ó`B(®²B+B.eUB1@§B4ùB6÷JB9ÒB<­îB??BBdBE?ãBH4BJöBMÑ×BP­)BS{BVcÌBY?
+B\pB^õÁBaÑBd¬eBg¶BjcBm>ZBp«BrôýBuÐOBx« B{òB~bD¿  ?=š\?¹a·@
+eó@8
+@eÐ"@Â@ *@·w¶@ÎRB@å,Î@üZA	pòAÞ8A K~A+žÃA7&	ABNAN AYmÙAdÛApHeA{µ«AyAH
+Aþ¿AµcAlA "©A¥ÙMA«ðA±FA¶ý6AŒ³ÙAÂj}AÈ! AÍ×ÃAÓgAÙE
+AÞû­Aä²QAêhôAðAõÖ;AûÝB ¡ÀB}BXcB	3µB
+BêXBÅªB ûB|MBWB
+2ðB BB"éB%ÄåB( 7B+{B.VÚB12,B4
+}B6èÏB9Ä!B<rB?zÄBBVBE1gBH
+¹BJè
+BMÃ\BP®BSyÿBVUQBY0£B\
+ôB^çFBaÂBdéBgy;BjTBm/ÞBp
+0BræBuÁÓBx%B{xwB~SÈB~}¿  ¿  @	ì@73U@dèl@NÂ@ )N@·Û@ÍÞg@äžó@û~A	7A€JA A+~ÕA6ìABY`AMÆŠAY3ëAd¡0ApvA{{ŒAtA+$AáÈAkAOA ²A¥ŒUA«røA±)A¶à?AŒâAÂM
+AÈ(AÍºÌAÓqoAÙ(AÞÞ¶AäYAêKüAð Aõ¹CAûoæB EBnBIèB	%:B
+ BÛÝB·/BBmÒBI#B
+$uBÿÇB"ÛB%¶jB(ŒB+m
+B.H_B1#°B3ÿB6ÚTB9µ¥B<÷B?lIBBGBE"ìBGþ>BJÙBMŽáBP3BSkBVFÖBY"'B[ýyB^ØËBaŽ
+BdnBgjÀBjFBm!cBoüµBrØBu³XBxªB{iûB~EMB~o¿  ¿  ¿  ¿  @do
+@Úè@µt@¶ @Íj@äE@û£AýAj]A×£A+DèA6²-ABsAM¹AXùþAdgDAoÔA{AÏAWA.AÄÑA{tA2Aè»A¥^A«VA±
+¥A¶ÃHAŒyìAÂ0AÇç2AÍÕAÓTxAÙ
+
+AÞÁ¿AäxbAê/Aïå©AõLAûRðB ÉB`B;mB	ŸB
+òBÍbBš³BB_WB:šB
+úBñKB"ÌB%§ïB(@B+^B.9äB15B3ðB6ËØB9§*B<|B?]ÍBB9BEqBGïÂBJËBMŠfBP·BS]	BV8[BY¬B[îþB^ÊOBa¥¡BdóBg\DBj7BmèBoî9BrÉBu€ÝBx.B{[B~6ÒB~`¿  ¿  ¿  ¿  ¿  ¿  @xÂ@¶
+%@Ìö±@ãÑ=@ú«ÊAÃ*A0pAµA+
+ûA6xAAAåAMRËAXÀAd-WAoA{âA:Añ8A§ÛA^~A!AËÄA¥hA«9
+A°ï®A¶ŠRAŒ\õAÂAÇÊ<AÍßAÓ7AØî%AÞ€ÈAä[lAêAïÈ²AõVAû5ùB vNBQ B,ñB	CB
+ãBŸæB8BuBPÛB,-B
+BâÐB"Ÿ"B%sB(tÅB+PB.+hB1ºB3â
+B6œ]B9¯B<t B?ORBB*€BEõBGáGBJŒBMêBPs<BSNBV)ßBY1B[àB^»ÔBa&BdrwBgMÉBj)BmlBoßŸBr»BuaBxq³B{MB~(VB~R¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  @Ìº @ã]c@ú7ïA=AöAcÈA*ÑA6>SAA«AMßAX$AcóiAo`¯AzÍõA
+AÔAAäAAAø+A®ÎA¥eqA«
+A°ÒžA¶[AŒ?þAÁö¢AÇ­EAÍcèAÓAØÑ/AÞÒAä>uAéõAï«ŒAõb_AûB gÓBC$B
+vBùÈB
+ÕB°kBœBgBB`B
+²B
+ùBÔUB"¯§B%øB(fJB+AB.
+íB0ø?B3ÓB6®âB94B<e
+B?@×BB
+(BD÷zBGÒÌBJ®
+BMoBPdÁBS@BVdBXö¶B[ÒB^­YBa«BdcüBg?NBjBlõñBoÑCBr¬BuæBxc8B{>B~ÛB~C¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  @ùû<AOOAŒA)ÚA* A6eAAq«ALÞðAXL6Ac¹|Ao&ÁAzA §A·JAmîA$AÛ4AØA¥H{Aªÿ
+A°µÁA¶ldAŒ#AÁÙ«AÇNAÍFòAÒýAØŽ8AÞjÜAä!AéØ"AïÅAõEhAúü
+B YXB4ªBûBëLB
+ÆB¡ðB}ABXB3åB6B
+êBÅÚB"¡+B%|}B(WÏB+3 B.rB0éÃB3ÅB6 gB9{žB<W
+B?2\BB
+­BDèÿBGÄPBJ¢BMzôBPVEBS1BV
+éBXè:B[ÃB^ÞBaz/BdUBg0ÓBj
+$BlçvBoÂÇBrBuykBxTŒB{0B~
+`B~5 ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  A<A
+ïíA*]3A5ÊxAA7ŸAL¥AXIAcAnìÔAzZAã°ATAP÷AAŸ>AtáA¥+Aªâ(A°ËA¶OnAŒAÁŒŽAÇsXAÍ)ûAÒàAØBAÞMåAäAé»,AïqÏAõ(rAúßB JÜB&.BBÜÒB
+ž#BtBnÆBJB%iB »B
+Ü
+B·^B"°B%nB(ISB+$¥B-ÿ÷B0ÛHB3¶B6ëB9m=B<HB?#àBAÿ2BDÚBGµÕBJ'BMlxBPGÊBS#
+BUþmBXÙ¿B[µB^bBakŽBdGBg"WBiý©BlØûBoŽLBrBujïBxFAB{!B}üäB~&¥¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  A*>ÚA5A@ýÑALkAWØ\AcE¡An²çAz .AÆ¹A}]A4 Aê€A¡GAWêA¥AªÅ1A°{ÔA¶2xA»éAÁŸAÇVaAÍ
+AÒÃšAØzKAÞ0îAãçAé5AïTØAõ
+|AúÂB <aB³BóBÎVB
+©šBúB`KB;BîBò@B
+ÍBšãB"5B%_B(:ØB+*B-ñ{B0ÌÍB3šB6pB9^ÂB<:B?eBAð·BDÌBG§ZBJ«BM]ýBP9OBS BUïòBXËDB[ŠB^çBa]9Bd8BgÜBiï.BlÊBo¥ÑBr#Bu\tBx7ÆB{B}îiB~*¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  A@ßwAL1(AWnAc
+³AnxùAyæ>A©ÃA`fAAÍ¬AOA:óA€ñAªš9A°^ÝA¶A»Ì#AÁÇAÇ9jAÌð
+AÒŠ°AØ]SAÞ÷AãÊAé=Aï7áAôîAú¥'B -äB	6BäB¿ÚB
+,Bv}BQÏB-!BrBãÃB
+¿BgB"užB%Q
+B(,\B+­B-âÿB0ŸQB3¢B6tôB9PFB<+B?éBAâ:BDœBGÞBJt/BMOBP*ÒBS$BUávBXŒÇB[B^skBaNŒBd*Bg`Bià±BlŒBoUBrrŠBuMøBx)JB{B}ßíB~	®¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  AWAbÑÆAn?
+Ay¬QAÌACoAúA°¶AgXA
+üA€ÔAªCA°AæAµøA»¯-AÁeÐAÇ
+sAÌÓAÒºAØ@]AÝ÷ Aã­£AédGAïêAôÑAú0B iBú»BÖ
+B±^B
+°BhBCTB
+¥Bù÷BÕIB
+°BëB"g=B%BB(
+àB*ù2B-ÔB0¯ÕB3'B6fyB9AÊB<
+
+B>ønBAÓ¿BD¯BGbBJeŽBMABP
+WBR÷©BUÒúBX®LB[B^dïBa@ABdBföäBiÒ6Bl­BoÙBrd+Bu?}BxÎBzö B}ÑrB}û3¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  An ²AyrdAoÕA&yAÝ
+A¿AJcAA€·šAªnLA°$ïAµÛA»6AÁHÙAÆÿ}AÌ¶ AÒlÃAØ#gAÝÚ
+Aã­AéGPAîýóAôŽAúk:B îBì?BÇB¢ãB
+~4BYB4ØB*Bë|BÆÍB
+¢B}qB"XÂB%4B(eB*ê·B-ÆB0¡ZB3|¬B6WýB93OB<¡B>éòBAÅDBD BG{çBJW9BM2BP
+ÜBRé.BUÄBXÑB[{"B^VtBa1ÆBd
+BfèiBiÃ»Bl
+Boz^BrU°Bu1Bx
+SBzç¥B}ÂöB}ìž¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  A`©A	AÀ%AvÉA-lAäA€³AªQVA°øAµŸA»u?AÁ+ãAÆâAÌ)AÒOÍAØpAÝœAãs·Aé*ZAîàýAô AúNCB sBÝÅB¹BgB
+o¹BK
+B&\B®BÝ BžRB
+€BnõB"JGB%%B( êB*Ü;B-·B0ßB3n0B6IB9$ÔB< %B>ÛwBA¶ÉBDBGmlBJHŸBM$BOÿaBRÚ²BU¶BXVB[l§B^GùBa#JBcþBfÙîBiµ?BlBokãBrG4Bu"BwýØBzÙ)B}Ž{B}Þ=¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  A°ùAYÒAuAÇA€}ŒAª4_A¯ëAµ¡ŠA»XHAÁìAÆÅAÌ|3AÒ2ÖA×éyAÝ 
+AãVÀAé
+cAîÄAôzªAú1MAÿçïBÏIBªB
+íB
+a>B<BáBó3BÎB©ÖB
+
+(B`zB";ÌB%
+B'òoB*ÍÁB-©B0cB3_µB6;B9XB;ñªB>ÌüBAšMBDBG^ñBJ:BBMBOðæBRÌ7BU§BXÚB[^,B^9~BaÏBcð!BfËrBiŠÄBlBo]gBr8¹Bu
+Bwï\BzÊ®B}Š B}ÏÁ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  AIAª"A€`ÅAªiA¯Î
+Aµ¯A»;SAÀñöAÆšAÌ_<AÒßA×ÌAÝ&Aã9ÉAèðmAî§Aô]³AúWAÿÊøBÀÎB BwqB
+RÃB.B	fBä·BÀ	B[B
+v¬BQþB"-PB%¢B'ãôB*¿EB-B0uéB3Q:B6,B9ÝB;ã/B>ŸBAÒBDu$BGPuBJ+ÇBMBOâjBRœŒBUBXt_B[O±B^+BaTBcáŠBfŒ÷BiIBlsBoNìBr*>BuBwàáBzŒ3B}B}ÁF¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  A€QA©úrA¯±Aµg¹A»
+\AÀÔÿAÆ£AÌBFAÑøèA×¯AÝf/Aã
+ÓAèÓvAîAô@œAù÷`Aÿ®B²SB€BhöB
+DHBBúëBÖ=B±BßB
+h1BCB"
+ÔB$ú&B'ÕxB*°ÊB-
+B0gmB3B¿B6
+B8ùbB;Ô³B>°BAWBDfšBGAúBJ
+LBLøBOÓïBR¯ABUBXeäB[A6B^
+B`÷ÙBcÓ*Bf®|BiÎBleBo@qBrÂBt÷BwÒfBz­·B}	B}²Ë¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  A¯¡éAµJÂA»eAÀž	AÆn¬AÌ%OAÑÛóA×AÝI8AâÿÜAè¶Aîm#Aô#ÆAùÚiAÿ
+B£×B)BZ{B
+5ÌB
+BìpBÇÁB£B~eB
+Y¶B5B"YB$ë«B'ÆüB*¢NB-} B0XòB34DB6B8êçB;Æ9B>¡BA|ÛBDX-BG3BJÐBLê"BOÅtBR ÅBU|BXWiB[2ºB^
+B`é^BcÄ¯Bf Bi{RBlV€Bo1öBr
+GBtèBwÃêBz<B}zB}€O¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  Aºò9AÀAÆQµAÌYAÑŸüA×uAÝ,CAââæAèAîP,AôÏAùœsAÿtB\Bp®BKÿB
+'QB£BÝôB¹FBBoéB
+K;B&B"ÞB$Ý/B'žB*ÓB-o$B0JvB3%ÈB6B8ÜlB;·œB>BAnaBDI²BG%BJ UBLÛ§BO¶øBRJBUmBXHíB[$?B]ÿB`ÚâBc¶4BfBil×BlH)Bo#zBqþÌBtÚ
+BwµoBzÁB}lB}Ô¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  AÆBAËëbAÑ¢A×X©AÝLAâÅïAè|Aî36AóéØAù |AÿWBáBb3B=B
+ÖB
+ô'BÏyBªËB
+BanB
+<ÀBB!ócB$ÎµB'ªB*
+WB-`©B0;ûB3LB5òB8ÍðB;©BB>BA_åBD;7BGBIñÚBLÍ+BOš}BRÏBU_ BX:rB[ÄB]ñB`ÌgBc§¹Bf
+Bi^\Bl9®BoÿBqðQBtË¢BwŠôBzFB}]B}Y¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  AÑÙA×;²AÜòUAâšùAè_Aî?AóÌãAùAÿ:'BxfBS·B/	B
+
+[B
+å¬BÀþBOBw¡BRóB
+.DB	B!äèB$À9B'B*vÝB-R.B0-B3ÑB5ä#B8¿tB;ÆB>vBAQjBD,ŒBG
+BIã_BLŸ±BOBRuSBUP¥BX+÷B[HB]âB`œìBc=BftBiOáBl+2BoBqáÖBtœ'BwyBzsÊB}O
+B}xÞ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  AÜã)AâAèB¥AíùIAó¯ìAùfAÿ
+1BiêBE<B B
+ûßB
+×1B²BÔBi&BDwB
+ÉB
+ûB!ÖlB$±ŸB'B*haB-C³B0B2úVB5Õ§B8°ùB;KB>gBABîBD
+@BFùBIÔäBL°5BOBRfÙBUB*BX
+{BZøÍB]ÔB`¯pBcÂBffBiAeBl
+·Bnø	BqÓZBt®¬BwþBzeOB}@¡B}jb¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  Aè3yAíÜRAóõAùIAÿ ;B[oB6ÁBB
+ídB
+È¶B€BYBZ«B5üB
+NB
+ìB!ÇñB$£CB'~B*YæB-58B0B2ëÛB5Ç-B8¢~B;}ÏB>Y!BA4sBDÄBFëBIÆhBL¡ºBO}
+BRX]BU3¯BXBZêRB]Å£B` õBc|GBfWBi2êBl<BnéBqÄßBt 1Bw{BzVÔB}2&B}[ç¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  AóÉAù,¢AþãDBLôB(EBB
+ÞéB
+º:BBpÞBL/B'B
+ÓB
+Þ$B!¹vB$ÇB'pB*KkB-&ŒB0B2Ý`B5ž±B8B;oUB>JŠBA%÷BDIBFÜBI·ìBL>BOnBRIâBU%4BX 
+BZÛ×B]·)B`zBcmËBfI
+Bi$oBkÿÀBnÛBq¶dBtµBwmBzHYB}#ªB}Ml¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  AþÔB>xBÊBõ
+B
+ÐmB
+«¿BBbbB=ŽBBôWB
+Ï©B!ªûB$LB'aB*<ïB-AB/óB2ÎäB5ª6B8
+B;`ÙB><+BA}BCòÎBFÎBI©qBLÃBO`BR;fBUžBWò
+BZÍ\B]š­B`ÿBc_QBf:¢BióBkñEBnÌBq§èBt:Bw^Bz9ÝB}/B}>ñ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B4Bæ B
+ÁòB
+DBxBSçB/9B
+BåÜB
+Á.B!B$wÑB'S#B*.tB-	ÆB/åB2ÀiB5»B8w
+B;R^B>-°BA	BCäSBF¿¥BIöBLvGBOQBR,ëBU<BWãBZŸàB]2B`uBcPÕBf,'BiyBkâÊBnŸBqmBtt¿BwPBz+bB}ŽB}0u¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B
+º\B
+ÈBjBElB œBüB×aB
+²²B!B$iVB'D§B*ùB,ûKB/ÖB2±îB5?B8hB;CãB>4B@úBCÕØBF±)BI{BLgÍBOC
+BR
+oBTùÁBWÕBZ°dB]¶B`gBcBZBf
+¬BhøýBkÔOBn¯¡BqòBtfCBwABz
+çB|ø8B}!ú¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  BbB6ïBABíBÈäB
+€6B!B$ZÙB'6+B*}B,ìÎB/È B2£rB5~ÃB8ZB;5fB>žB@ì
+BCÇ[BF¢­BI}ÿBLYPBO4¢BRôBTëEBWÆBZ¡èB]}:B`XBc3ÝBf/BhêBkÅÓBn¡$Bq|vBtWÈBw3BzjB|éŒB}¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B
+«BßBºiB
+»B!q
+B$L^B''°B*B,ÞSB/¹¥B2öB5pHB8KB;&ëB>=B@ÝBCžàBF2BIoBLJÕBO&'BRxBTÜÊBWž
+BZmB]nŸB`JBc%bBf ³BhÜBk·WBn©BqmûBtILBw$ByÿðB|ÛAB}¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B²ÓB
+?B!bB$=ãB'4B)ôB,ÏØB/«)B2{B5aÍB8=
+B;pB=óÂB@ÏBCªeBF
+¶BIaBL<ZBO«BQòýBTÎOBW© BZòB]`DB`;BcæBeò8BhÍBkšÛBn-Bq_Bt:ÑBw#ByñtB|ÌÆB|ö¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B!ZûB$/gB'
+¹B)æ
+B,Á\B/®B2x B5SQB8.£B;	õB=åFB@ÀBCêBFw;BIRBL-ÞBO	0BQäBT¿ÓBW%BZvwB]QÈB`-BclBeãœBh¿Bk`Bnu²BqQBt,UBw§ByâùB|ŸKB|è
+¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B'#B)×B,²áB/3B2iB5DÖB8 (B:ûyB=ÖËB@²
+BCnBFhÀBIDBLcBNúµBQÖBT±XBWªBZgûB]CMB`
+BbùðBeÕBBh°BkåBng6BqBBt
+ÚBvù+ByÔ}B|¯ÏB|Ù¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B,«JB/¶B2[B56ZB8«B:ìýB=ÈOB@£ BC~òBFZDBI5BLçBNì9BQÇBT¢ÜBW~-BZYB]4ÑB`"BbëtBeÆÆBh¢Bk}iBnX»Bq4
+Bt]Bvê¯ByÆB|¡RB|Ë¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B2SrB5'ÞB80B:ÞB=¹ÓB@%BCpwBFKÈBI'BLlBNÝœBQ¹BTaBWo²BZKB]&UB`§BbÜùBežJBhBknîBnJ?Bq%Bt ãBvÜ4By·
+B|×B|Œ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B7ûB:ÐB=«XB@ªBCaûBF=MBIBKóðBNÏBBQªBT
+åBWa7BZ<B]ÚB_ó,BbÎ}Be©ÏBh
+!Bk`rBn;ÄBqBsògBvÍ¹By©
+B|\B|®¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B=£ÂB@x.BCSBF.ÒBI
+#BKåuBNÀÇBQBTwjBWRŒBZ.
+B]	_B_ä±BbÀBeTBhv¥BkQ÷Bn-IBqBsãìBv¿>ByB|uáB|¥¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  BCKéBF UBHû§BKÖùBN²JBQBThîBWD?BZB\úãB_Ö4Bb±BeØBhh)BkC{Bn
+ÌBpú
+BsÕpBv°ÁByB|geB|)¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  BHôBKÈ}BN£ÏBQ!BTZrBW5ÄBZB\ìgB_Ç¹Bb£
+Be~\BhY®Bk5 BnQBpë£BsÆôBv¢FBy}B|XéB|®¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  BN9BQp¥BTK÷BW'IBZB\ÝìB_¹>BbBeoáBhK3Bk&BnÖBpÝ(BsžyBvËByo
+B|JnB|t3¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  BTDaBWÍBYôB\ÏqB_ªÂBbBeafBh<·Bk	Bmó[BpÎ¬Bs©þBv
+PBy`¡B|;óB|e·¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  BYìB\ÀôB_FBbwBeRéBh.;Bk	BmäÞBpÀ0BsBvvÓByR%B|-wB|W<¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B_°Bbi
+BeDnBhÀBjûBmÖcBp±µBsBvhXByCªB|
+ûB|HÁ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  Be<ØBhDBjìBmÇèBp£9Bs~BvYÝBy5.B|B|:F¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  Bjå Bm¹lBpŸBspBvKaBy&³B|B|+Ê¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  Bp'BsaBv<åBy7B{óB|
+O¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  Bv5OBy	»B{å
+B|Ô¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B{ÝwB| X¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              XTENSION= 'IMAGE   '           / IMAGE extension                                BITPIX  =                  -32 / number of bits per data pixel                  NAXIS   =                    3 / number of data axes                            NAXIS1  =                   64 / length of data axis 1                          NAXIS2  =                   64 / length of data axis 2                          NAXIS3  =                    1 / length of data axis 3                          PCOUNT  =                    0 / required keyword; must = 0                     GCOUNT  =                    1 / required keyword; must = 1                     BZERO   =   0.000000000000E+00 / Pixel Value Offset                             BSCALE  =   1.000000000000E+00 / Pixel Value Scale                              END                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 <#×
+<£×
+<õÂ=#×
+=LÌÍ=uÂ=\)=£×
+=žQì=ÌÌÍ=áG®=õÂ>
+ž>\)>>#×
+>.{>8Qì>B\>LÌÍ>W
+=>aG®>k
+>uÂ>  >
+
+ž>=q>\)>zá>>žR>£×
+>šõÃ>®{>³33>žQì>œp€>Â\>Ç®>ÌÌÍ>Ñë
+>×
+=>Ü(ö>áG®>æff>ë
+>ð£×>õÂ>úáH?   ?\?
+ž?®?
+=q?
+ÌÍ?\)?ë
+?zá?
+=??
+(ö?
+žR?!G®?  ?G®?\?×
+?
+
+ž?ff?®?õÃ?=q?
+?ÌÍ?{?\)?£×?ë
+?33?zá?Â?
+>?Qì??áH?(ö?p€?žR?   ?¡G®?¢\?£×
+?¥
+ž?Šff?§®?šõÂ?ª=q?«
+?¬ÌÍ?®{?¯\)?°£×?±ë
+?³33?Žzá?µÂ?·
+>?žQì?¹?ºáH?Œ(ö?œp€?ŸžR?À  ?ÁG®?Â\?Ã×
+?Å
+ž?Æff?Ç®?ÈõÂ?Ê=p?Ë
+
+?ÌÌÍ?Î{?Ï\)?Ð£×@   @ £×@G®@ë
+@\@33@×
+@zá@
+ž@Â@ff@
+=@®@Qì@õÃ@	@
+=q@
+áH@
+
+@
+(ö@
+ÌÍ@
+p€@{@žR@\)@  @£×@G®@ë
+@\@33@×
+@zá@
+ž@Â@ff@
+>@®@Qì@õÂ@@=q@áH@
+@
+(ö@
+ÌÍ@
+p€@
+{@
+žR@\)@   @ £×@!G®@!ë
+@"\@#33@#×
+@$zá@%
+ž@%Â@&ff@'
+>@'®@(Qì@@  @@£×@AG®@Aë
+@B\@C33@C×
+@Dzá@E
+ž@EÂ@Fff@G
+=@G®@HQì@HõÃ@I@J=q@JáH@K
+@L(ö@LÌÍ@Mp€@N{@NžR@O\)@P  @P£×@QG®@Që
+@R\@S33@S×
+@Tzá@U
+ž@UÂ@Vff@W
+>@W®@XQì@XõÂ@Y@Z=q@ZáH@[
+@\(ö@\ÌÍ@]p€@^{@^žR@_\)@`  @`£×@aG®@aë
+@b\@c33@c×
+@dzá@e
+ž@eÂ@fff@g
+>@g®@hQì@  @Qì@£×@õÃ@G®@@ë
+@=q@\@áH@33@
+@×
+@(ö@zá@ÌÍ@
+
+ž@
+p€@
+Â@{@ff@žR@
+=@\)@®@  @Qì@£×@õÃ@G®@@ë
+@=q@\@áH@33@
+@×
+@(ö@zá@ÌÍ@
+ž@p€@Â@{@ff@žR@
+=@\)@®@  @Qì@£×@õÂ@G®@@ë
+@=q@\@áH@33@
+@×
+@(ö@   @ Qì@ £×@ õÃ@¡G®@¡@¡ë
+@¢=q@¢\@¢áH@£33@£
+@£×
+@€(ö@€zá@€ÌÍ@¥
+ž@¥p€@¥Â@Š{@Šff@ŠžR@§
+=@§\)@§®@š  @šQì@š£×@šõÃ@©G®@©@©ë
+@ª=q@ª\@ªáH@«33@«
+@«×
+@¬(ö@¬zá@¬ÌÍ@­
+ž@­p€@­Â@®{@®ff@®žR@¯
+=@¯\)@¯®@°  @°Qì@°£×@°õÂ@±G®@±@±ë
+@²=q@²\@²áH@³33@³
+@³×
+@Ž(ö@À  @ÀQì@À£×@ÀõÃ@ÁG®@Á@Áë
+@Â=q@Â\@ÂáH@Ã33@Ã
+@Ã×
+@Ä(ö@Äzá@ÄÌÍ@Å
+ž@Åp€@ÅÂ@Æ{@Æff@ÆžR@Ç
+=@Ç\)@Ç®@È  @ÈQì@È£×@ÈõÃ@ÉG®@É@Éë
+@Ê=q@Ê\@ÊáH@Ë33@Ë
+@Ë×
+@Ì(ö@Ìzá@ÌÌÍ@Í
+ž@Íp€@ÍÂ@Î{@Îff@ÎžR@Ï
+=@Ï\)@Ï®@Ð  @ÐQì@Ð£×@ÐõÂ@ÑG®@Ñ@Ñë
+@Ò=q@Ò\@ÒáH@Ó33@Ó
+@Ó×
+@Ô(ö@à  @àQì@à£×@àõÃ@áG®@á@áë
+@â=q@â\@âáH@ã33@ã
+@ã×
+@ä(ö@äzá@äÌÍ@å
+ž@åp€@åÂ@æ{@æff@æžR@ç
+=@ç\)@ç®@è  @èQì@è£×@èõÃ@éG®@é@éë
+@ê=q@ê\@êáH@ë33@ë
+@ë×
+@ì(ö@ìzá@ìÌÍ@í
+ž@íp€@íÂ@î{@îff@îžR@ï
+=@ï\)@ï®@ð  @ðQì@ð£×@ðõÂ@ñG®@ñ@ñë
+@ò=q@ò\@òáH@ó33@ó
+@ó×
+@ô(öA   A (öA QìA záA £×A ÌÍA õÃA
+žAG®Ap€AAÂAë
+A{A=qAffA\AžRAáHA
+=A33A\)A
+A®A×
+A  A(öAQìAzáA£×AÌÍAõÃA
+žAG®Ap€AAÂAë
+A{A=qAffA\AžRAáHA
+=A33A\)A
+A®A×
+A  A(öAQìAzáA£×AÌÍAõÃA	
+žA	G®A	p€A	A	ÂA	ë
+A
+{A  A(öAQìAzáA£×AÌÍAõÃA
+žAG®Ap€AAÂAë
+A{A=qAffA\AžRAáHA
+=A33A\)A
+A®A×
+A  A(öAQìAzáA£×AÌÍAõÃA
+žAG®Ap€AAÂAë
+A{A=qAffA\AžRAáHA
+=A33A\)A
+A®A×
+A  A(öAQìAzáA£×AÌÍAõÃA
+žAG®Ap€AAÂAë
+A{A   A (öA QìA záA £×A ÌÍA õÃA!
+žA!G®A!p€A!A!ÂA!ë
+A"{A"=qA"ffA"\A"žRA"áHA#
+=A#33A#\)A#
+A#®A#×
+A$  A$(öA$QìA$záA$£×A$ÌÍA$õÃA%
+žA%G®A%p€A%A%ÂA%ë
+A&{A&=qA&ffA&\A&žRA&áHA'
+=A'33A'\)A'
+A'®A'×
+A(  A((öA(QìA(záA(£×A(ÌÍA(õÃA)
+žA)G®A)p€A)A)ÂA)ë
+A*{A0  A0(öA0QìA0záA0£×A0ÌÍA0õÃA1
+žA1G®A1p€A1A1ÂA1ë
+A2{A2=qA2ffA2\A2žRA2áHA3
+=A333A3\)A3
+A3®A3×
+A4  A4(öA4QìA4záA4£×A4ÌÍA4õÃA5
+žA5G®A5p€A5A5ÂA5ë
+A6{A6=qA6ffA6\A6žRA6áHA7
+=A733A7\)A7
+A7®A7×
+A8  A8(öA8QìA8záA8£×A8ÌÍA8õÃA9
+žA9G®A9p€A9A9ÂA9ë
+A:{A@  A@(öA@QìA@záA@£×A@ÌÍA@õÃAA
+žAAG®AAp€AAAAÂAAë
+AB{AB=qABffAB\ABžRABáHAC
+=AC33AC\)AC
+AC®AC×
+AD  AD(öADQìADzáAD£×ADÌÍADõÃAE
+žAEG®AEp€AEAEÂAEë
+AF{AF=qAFffAF\AFžRAFáHAG
+=AG33AG\)AG
+AG®AG×
+AH  AH(öAHQìAHzáAH£×AHÌÍAHõÃAI
+žAIG®AIp€AIAIÂAIë
+AJ{AP  AP(öAPQìAPzáAP£×APÌÍAPõÃAQ
+žAQG®AQp€AQAQÂAQë
+AR{AR=qARffAR\ARžRARáHAS
+=AS33AS\)AS
+AS®AS×
+AT  AT(öATQìATzáAT£×ATÌÍATõÃAU
+žAUG®AUp€AUAUÂAUë
+AV{AV=qAVffAV\AVžRAVáHAW
+=AW33AW\)AW
+AW®AW×
+AX  AX(öAXQìAXzáAX£×AXÌÍAXõÃAY
+žAYG®AYp€AYAYÂAYë
+AZ{A`  A`(öA`QìA`záA`£×A`ÌÍA`õÃAa
+žAaG®Aap€AaAaÂAaë
+Ab{Ab=qAbffAb\AbžRAbáHAc
+=Ac33Ac\)Ac
+Ac®Ac×
+Ad  Ad(öAdQìAdzáAd£×AdÌÍAdõÃAe
+žAeG®Aep€AeAeÂAeë
+Af{Af=qAfffAf\AfžRAfáHAg
+=Ag33Ag\)Ag
+Ag®Ag×
+Ah  Ah(öAhQìAhzáAh£×AhÌÍAhõÃAi
+žAiG®Aip€AiAiÂAië
+Aj{Ap  Ap(öApQìApzáAp£×ApÌÍApõÃAq
+žAqG®Aqp€AqAqÂAqë
+Ar{Ar=qArffAr\AržRAráHAs
+=As33As\)As
+As®As×
+At  At(öAtQìAtzáAt£×AtÌÍAtõÃAu
+žAuG®Aup€AuAuÂAuë
+Av{Av=qAvffAv\AvžRAváHAw
+=Aw33Aw\)Aw
+Aw®Aw×
+Ax  Ax(öAxQìAxzáAx£×AxÌÍAxõÃAy
+žAyG®Ayp€AyAyÂAyë
+Az{A  A{A(öA=qAQìAffAzáA\A£×AžRAÌÍAáHAõÃA
+=A
+žA33AG®A\)Ap€A
+AA®AÂA×
+Aë
+A  A{A(öA=qAQìAffAzáA\A£×AžRAÌÍAáHAõÃA
+=A
+žA33AG®A\)Ap€A
+AA®AÂA×
+Aë
+A  A{A(öA=qAQìAffAzáA\A£×AžRAÌÍAáHAõÃA
+
+=A  A{A(öA=qAQìAffAzáA\A£×AžRAÌÍAáHAõÃA
+=A
+žA33AG®A\)Ap€A
+AA®AÂA×
+Aë
+A  A{A(öA=qAQìAffAzáA\A£×AžRAÌÍAáHAõÃA
+=A
+žA33AG®A\)Ap€A
+AA®AÂA×
+Aë
+A  A{A(öA=qAQìAffAzáA\A£×AžRAÌÍAáHAõÃA
+=A  A{A(öA=qAQìAffAzáA\A£×AžRAÌÍAáHAõÃA
+=A
+žA33AG®A\)Ap€A
+AA®AÂA×
+Aë
+A  A{A(öA=qAQìAffAzáA\A£×AžRAÌÍAáHAõÃA
+=A
+žA33AG®A\)Ap€A
+AA®AÂA×
+Aë
+A  A{A(öA=qAQìAffAzáA\A£×AžRAÌÍAáHAõÃA
+=A  A{A(öA=qAQìAffAzáA\A£×AžRAÌÍAáHAõÃA
+=A
+žA33AG®A\)Ap€A
+AA®AÂA×
+Aë
+A  A{A(öA=qAQìAffAzáA\A£×AžRAÌÍAáHAõÃA
+=A
+žA33AG®A\)Ap€A
+AA®AÂA×
+Aë
+A  A{A(öA=qAQìAffAzáA\A£×AžRAÌÍAáHAõÃA
+=A   A {A (öA =qA QìA ffA záA \A £×A žRA ÌÍA áHA õÃA¡
+=A¡
+žA¡33A¡G®A¡\)A¡p€A¡
+A¡A¡®A¡ÂA¡×
+A¡ë
+A¢  A¢{A¢(öA¢=qA¢QìA¢ffA¢záA¢\A¢£×A¢žRA¢ÌÍA¢áHA¢õÃA£
+=A£
+žA£33A£G®A£\)A£p€A£
+A£A£®A£ÂA£×
+A£ë
+A€  A€{A€(öA€=qA€QìA€ffA€záA€\A€£×A€žRA€ÌÍA€áHA€õÃA¥
+=Aš  Aš{Aš(öAš=qAšQìAšffAšzáAš\Aš£×AšžRAšÌÍAšáHAšõÃA©
+=A©
+žA©33A©G®A©\)A©p€A©
+A©A©®A©ÂA©×
+A©ë
+Aª  Aª{Aª(öAª=qAªQìAªffAªzáAª\Aª£×AªžRAªÌÍAªáHAªõÃA«
+=A«
+žA«33A«G®A«\)A«p€A«
+A«A«®A«ÂA«×
+A«ë
+A¬  A¬{A¬(öA¬=qA¬QìA¬ffA¬záA¬\A¬£×A¬žRA¬ÌÍA¬áHA¬õÃA­
+=A°  A°{A°(öA°=qA°QìA°ffA°záA°\A°£×A°žRA°ÌÍA°áHA°õÃA±
+=A±
+žA±33A±G®A±\)A±p€A±
+A±A±®A±ÂA±×
+A±ë
+A²  A²{A²(öA²=qA²QìA²ffA²záA²\A²£×A²žRA²ÌÍA²áHA²õÃA³
+=A³
+žA³33A³G®A³\)A³p€A³
+A³A³®A³ÂA³×
+A³ë
+AŽ  AŽ{AŽ(öAŽ=qAŽQìAŽffAŽzáAŽ\AŽ£×AŽžRAŽÌÍAŽáHAŽõÃAµ
+=Až  Až{Až(öAž=qAžQìAžffAžzáAž\Až£×AžžRAžÌÍAžáHAžõÃA¹
+=A¹
+žA¹33A¹G®A¹\)A¹p€A¹
+A¹A¹®A¹ÂA¹×
+A¹ë
+Aº  Aº{Aº(öAº=qAºQìAºffAºzáAº\Aº£×AºžRAºÌÍAºáHAºõÃA»
+=A»
+žA»33A»G®A»\)A»p€A»
+A»A»®A»ÂA»×
+A»ë
+AŒ  AŒ{AŒ(öAŒ=qAŒQìAŒffAŒzáAŒ\AŒ£×AŒžRAŒÌÍAŒáHAŒõÃAœ
+=AÀ  AÀ{AÀ(öAÀ=qAÀQìAÀffAÀzáAÀ\AÀ£×AÀžRAÀÌÍAÀáHAÀõÃAÁ
+=AÁ
+žAÁ33AÁG®AÁ\)AÁp€AÁ
+AÁAÁ®AÁÂAÁ×
+AÁë
+AÂ  AÂ{AÂ(öAÂ=qAÂQìAÂffAÂzáAÂ\AÂ£×AÂžRAÂÌÍAÂáHAÂõÃAÃ
+=AÃ
+žAÃ33AÃG®AÃ\)AÃp€AÃ
+AÃAÃ®AÃÂAÃ×
+AÃë
+AÄ  AÄ{AÄ(öAÄ=qAÄQìAÄffAÄzáAÄ\AÄ£×AÄžRAÄÌÍAÄáHAÄõÃAÅ
+=AÈ  AÈ{AÈ(öAÈ=qAÈQìAÈffAÈzáAÈ\AÈ£×AÈžRAÈÌÍAÈáHAÈõÃAÉ
+=AÉ
+žAÉ33AÉG®AÉ\)AÉp€AÉ
+AÉAÉ®AÉÂAÉ×
+AÉë
+AÊ  AÊ{AÊ(öAÊ=qAÊQìAÊffAÊzáAÊ\AÊ£×AÊžRAÊÌÍAÊáHAÊõÃAË
+=AË
+žAË33AËG®AË\)AËp€AË
+AËAË®AËÂAË×
+AËë
+AÌ  AÌ{AÌ(öAÌ=qAÌQìAÌffAÌzáAÌ\AÌ£×AÌžRAÌÌÍAÌáHAÌõÃAÍ
+=AÐ  AÐ{AÐ(öAÐ=qAÐQìAÐffAÐzáAÐ\AÐ£×AÐžRAÐÌÍAÐáHAÐõÃAÑ
+=AÑ
+žAÑ33AÑG®AÑ\)AÑp€AÑ
+AÑAÑ®AÑÂAÑ×
+AÑë
+AÒ  AÒ{AÒ(öAÒ=qAÒQìAÒffAÒzáAÒ\AÒ£×AÒžRAÒÌÍAÒáHAÒõÃAÓ
+=AÓ
+žAÓ33AÓG®AÓ\)AÓp€AÓ
+AÓAÓ®AÓÂAÓ×
+AÓë
+AÔ  AÔ{AÔ(öAÔ=qAÔQìAÔffAÔzáAÔ\AÔ£×AÔžRAÔÌÍAÔáHAÔõÃAÕ
+=AØ  AØ{AØ(öAØ=qAØQìAØffAØzáAØ\AØ£×AØžRAØÌÍAØáHAØõÃAÙ
+=AÙ
+žAÙ33AÙG®AÙ\)AÙp€AÙ
+AÙAÙ®AÙÂAÙ×
+AÙë
+AÚ  AÚ{AÚ(öAÚ=qAÚQìAÚffAÚzáAÚ\AÚ£×AÚžRAÚÌÍAÚáHAÚõÃAÛ
+=AÛ
+žAÛ33AÛG®AÛ\)AÛp€AÛ
+AÛAÛ®AÛÂAÛ×
+AÛë
+AÜ  AÜ{AÜ(öAÜ=qAÜQìAÜffAÜzáAÜ\AÜ£×AÜžRAÜÌÍAÜáHAÜõÃAÝ
+=Aà  Aà{Aà(öAà=qAàQìAàffAàzáAà\Aà£×AàžRAàÌÍAàáHAàõÃAá
+=Aá
+žAá33AáG®Aá\)Aáp€Aá
+AáAá®AáÂAá×
+Aáë
+Aâ  Aâ{Aâ(öAâ=qAâQìAâffAâzáAâ\Aâ£×AâžRAâÌÍAâáHAâõÃAã
+=Aã
+žAã33AãG®Aã\)Aãp€Aã
+AãAã®AãÂAã×
+Aãë
+Aä  Aä{Aä(öAä=qAäQìAäffAäzáAä\Aä£×AäžRAäÌÍAäáHAäõÃAå
+=Aè  Aè{Aè(öAè=qAèQìAèffAèzáAè\Aè£×AèžRAèÌÍAèáHAèõÃAé
+=Aé
+žAé33AéG®Aé\)Aép€Aé
+AéAé®AéÂAé×
+Aéë
+Aê  Aê{Aê(öAê=qAêQìAêffAêzáAê\Aê£×AêžRAêÌÍAêáHAêõÃAë
+=Aë
+žAë33AëG®Aë\)Aëp€Aë
+AëAë®AëÂAë×
+Aëë
+Aì  Aì{Aì(öAì=qAìQìAìffAìzáAì\Aì£×AìžRAìÌÍAìáHAìõÃAí
+=Að  Að{Að(öAð=qAðQìAðffAðzáAð\Að£×AðžRAðÌÍAðáHAðõÃAñ
+=Añ
+žAñ33AñG®Añ\)Añp€Añ
+AñAñ®AñÂAñ×
+Añë
+Aò  Aò{Aò(öAò=qAòQìAòffAòzáAò\Aò£×AòžRAòÌÍAòáHAòõÃAó
+=Aó
+žAó33AóG®Aó\)Aóp€Aó
+AóAó®AóÂAó×
+Aóë
+Aô  Aô{Aô(öAô=qAôQìAôffAôzáAô\Aô£×AôžRAôÌÍAôáHAôõÃAõ
+=Aø  Aø{Aø(öAø=qAøQìAøffAøzáAø\Aø£×AøžRAøÌÍAøáHAøõÃAù
+=Aù
+žAù33AùG®Aù\)Aùp€Aù
+AùAù®AùÂAù×
+Aùë
+Aú  Aú{Aú(öAú=qAúQìAúffAúzáAú\Aú£×AúžRAúÌÍAúáHAúõÃAû
+=Aû
+žAû33AûG®Aû\)Aûp€Aû
+AûAû®AûÂAû×
+Aûë
+Aü  Aü{Aü(öAü=qAüQìAüffAüzáAü\Aü£×AüžRAüÌÍAüáHAüõÃAý
+=B   B 
+=B {B 
+žB (öB 33B =qB G®B QìB \)B ffB p€B záB 
+B \B B £×B ®B žRB ÂB ÌÍB ×
+B áHB ë
+B õÃB  B
+=B{B
+žB(öB33B=qBG®BQìB\)BffBp€BzáB
+B\BB£×B®BžRBÂBÌÍB×
+BáHBë
+BõÃB  B
+=B{B
+žB(öB33B=qBG®BQìB\)BffBp€BzáB
+B  B
+=B{B
+žB(öB33B=qBG®BQìB\)BffBp€BzáB
+B\BB£×B®BžRBÂBÌÍB×
+BáHBë
+BõÃB  B
+=B{B
+žB(öB33B=qBG®BQìB\)BffBp€BzáB
+B\BB£×B®BžRBÂBÌÍB×
+BáHBë
+BõÃB  B
+=B{B
+žB(öB33B=qBG®BQìB\)BffBp€BzáB
+B  B
+=B{B
+žB(öB33B=qBG®BQìB\)BffBp€BzáB
+B\BB£×B®BžRBÂBÌÍB×
+BáHBë
+BõÃB	  B	
+=B	{B	
+žB	(öB	33B	=qB	G®B	QìB	\)B	ffB	p€B	záB	
+B	\B	B	£×B	®B	žRB	ÂB	ÌÍB	×
+B	áHB	ë
+B	õÃB
+  B
+
+=B
+{B
+
+žB
+(öB
+33B
+=qB
+G®B
+QìB
+\)B
+ffB
+p€B
+záB
+
+B
+  B
+
+=B
+{B
+
+žB
+(öB
+33B
+=qB
+G®B
+QìB
+\)B
+ffB
+p€B
+záB
+
+B
+\B
+B
+£×B
+®B
+žRB
+ÂB
+ÌÍB
+×
+B
+áHB
+ë
+B
+õÃB
+  B
+=B
+{B
+
+žB
+(öB
+33B
+=qB
+G®B
+QìB
+\)B
+ffB
+p€B
+záB
+
+B
+\B
+B
+£×B
+®B
+žRB
+ÂB
+ÌÍB
+×
+B
+áHB
+ë
+B
+õÃB  B
+=B{B
+žB(öB33B=qBG®BQìB\)BffBp€BzáB
+B  B
+=B{B
+žB(öB33B=qBG®BQìB\)BffBp€BzáB
+B\BB£×B®BžRBÂBÌÍB×
+BáHBë
+BõÃB  B
+=B{B
+žB(öB33B=qBG®BQìB\)BffBp€BzáB
+B\BB£×B®BžRBÂBÌÍB×
+BáHBë
+BõÃB  B
+=B{B
+žB(öB33B=qBG®BQìB\)BffBp€BzáB
+B  B
+=B{B
+žB(öB33B=qBG®BQìB\)BffBp€BzáB
+B\BB£×B®BžRBÂBÌÍB×
+BáHBë
+BõÃB  B
+=B{B
+žB(öB33B=qBG®BQìB\)BffBp€BzáB
+B\BB£×B®BžRBÂBÌÍB×
+BáHBë
+BõÃB  B
+=B{B
+žB(öB33B=qBG®BQìB\)BffBp€BzáB
+B  B
+=B{B
+žB(öB33B=qBG®BQìB\)BffBp€BzáB
+B\BB£×B®BžRBÂBÌÍB×
+BáHBë
+BõÃB  B
+=B{B
+žB(öB33B=qBG®BQìB\)BffBp€BzáB
+B\BB£×B®BžRBÂBÌÍB×
+BáHBë
+BõÃB  B
+=B{B
+žB(öB33B=qBG®BQìB\)BffBp€BzáB
+B
+  B
+
+=B
+{B
+
+žB
+(öB
+33B
+=qB
+G®B
+QìB
+\)B
+ffB
+p€B
+záB
+
+B
+\B
+B
+£×B
+®B
+žRB
+ÂB
+ÌÍB
+×
+B
+áHB
+ë
+B
+õÃB
+  B
+
+=B
+{B
+
+žB
+(öB
+33B
+=qB
+G®B
+QìB
+\)B
+ffB
+p€B
+záB
+
+B
+\B
+B
+£×B
+®B
+žRB
+ÂB
+ÌÍB
+×
+B
+áHB
+ë
+B
+õÃB
+  B
+
+=B
+{B
+
+žB
+(öB
+33B
+=qB
+G®B
+QìB
+\)B
+ffB
+p€B
+záB
+
+B   B 
+=B {B 
+žB (öB 33B =qB G®B QìB \)B ffB p€B záB 
+B \B B £×B ®B žRB ÂB ÌÍB ×
+B áHB ë
+B õÃB!  B!
+=B!{B!
+žB!(öB!33B!=qB!G®B!QìB!\)B!ffB!p€B!záB!
+B!\B!B!£×B!®B!žRB!ÂB!ÌÍB!×
+B!áHB!ë
+B!õÃB"  B"
+=B"{B"
+žB"(öB"33B"=qB"G®B"QìB"\)B"ffB"p€B"záB"
+B$  B$
+=B${B$
+žB$(öB$33B$=qB$G®B$QìB$\)B$ffB$p€B$záB$
+B$\B$B$£×B$®B$žRB$ÂB$ÌÍB$×
+B$áHB$ë
+B$õÃB%  B%
+=B%{B%
+žB%(öB%33B%=qB%G®B%QìB%\)B%ffB%p€B%záB%
+B%\B%B%£×B%®B%žRB%ÂB%ÌÍB%×
+B%áHB%ë
+B%õÃB&  B&
+=B&{B&
+žB&(öB&33B&=qB&G®B&QìB&\)B&ffB&p€B&záB&
+B(  B(
+=B({B(
+žB((öB(33B(=qB(G®B(QìB(\)B(ffB(p€B(záB(
+B(\B(B(£×B(®B(žRB(ÂB(ÌÍB(×
+B(áHB(ë
+B(õÃB)  B)
+=B){B)
+žB)(öB)33B)=qB)G®B)QìB)\)B)ffB)p€B)záB)
+B)\B)B)£×B)®B)žRB)ÂB)ÌÍB)×
+B)áHB)ë
+B)õÃB*  B*
+=B*{B*
+žB*(öB*33B*=qB*G®B*QìB*\)B*ffB*p€B*záB*
+B,  B,
+=B,{B,
+žB,(öB,33B,=qB,G®B,QìB,\)B,ffB,p€B,záB,
+B,\B,B,£×B,®B,žRB,ÂB,ÌÍB,×
+B,áHB,ë
+B,õÃB-  B-
+=B-{B-
+žB-(öB-33B-=qB-G®B-QìB-\)B-ffB-p€B-záB-
+B-\B-B-£×B-®B-žRB-ÂB-ÌÍB-×
+B-áHB-ë
+B-õÃB.  B.
+=B.{B.
+žB.(öB.33B.=qB.G®B.QìB.\)B.ffB.p€B.záB.
+B0  B0
+=B0{B0
+žB0(öB033B0=qB0G®B0QìB0\)B0ffB0p€B0záB0
+B0\B0B0£×B0®B0žRB0ÂB0ÌÍB0×
+B0áHB0ë
+B0õÃB1  B1
+=B1{B1
+žB1(öB133B1=qB1G®B1QìB1\)B1ffB1p€B1záB1
+B1\B1B1£×B1®B1žRB1ÂB1ÌÍB1×
+B1áHB1ë
+B1õÃB2  B2
+=B2{B2
+žB2(öB233B2=qB2G®B2QìB2\)B2ffB2p€B2záB2
+B4  B4
+=B4{B4
+žB4(öB433B4=qB4G®B4QìB4\)B4ffB4p€B4záB4
+B4\B4B4£×B4®B4žRB4ÂB4ÌÍB4×
+B4áHB4ë
+B4õÃB5  B5
+=B5{B5
+žB5(öB533B5=qB5G®B5QìB5\)B5ffB5p€B5záB5
+B5\B5B5£×B5®B5žRB5ÂB5ÌÍB5×
+B5áHB5ë
+B5õÃB6  B6
+=B6{B6
+žB6(öB633B6=qB6G®B6QìB6\)B6ffB6p€B6záB6
+B8  B8
+=B8{B8
+žB8(öB833B8=qB8G®B8QìB8\)B8ffB8p€B8záB8
+B8\B8B8£×B8®B8žRB8ÂB8ÌÍB8×
+B8áHB8ë
+B8õÃB9  B9
+=B9{B9
+žB9(öB933B9=qB9G®B9QìB9\)B9ffB9p€B9záB9
+B9\B9B9£×B9®B9žRB9ÂB9ÌÍB9×
+B9áHB9ë
+B9õÃB:  B:
+=B:{B:
+žB:(öB:33B:=qB:G®B:QìB:\)B:ffB:p€B:záB:
+B<  B<
+=B<{B<
+žB<(öB<33B<=qB<G®B<QìB<\)B<ffB<p€B<záB<
+B<\B<B<£×B<®B<žRB<ÂB<ÌÍB<×
+B<áHB<ë
+B<õÃB=  B=
+=B={B=
+žB=(öB=33B==qB=G®B=QìB=\)B=ffB=p€B=záB=
+B=\B=B=£×B=®B=žRB=ÂB=ÌÍB=×
+B=áHB=ë
+B=õÃB>  B>
+=B>{B>
+žB>(öB>33B>=qB>G®B>QìB>\)B>ffB>p€B>záB>
+B@  B@
+=B@{B@
+žB@(öB@33B@=qB@G®B@QìB@\)B@ffB@p€B@záB@
+B@\B@B@£×B@®B@žRB@ÂB@ÌÍB@×
+B@áHB@ë
+B@õÃBA  BA
+=BA{BA
+žBA(öBA33BA=qBAG®BAQìBA\)BAffBAp€BAzáBA
+BA\BABA£×BA®BAžRBAÂBAÌÍBA×
+BAáHBAë
+BAõÃBB  BB
+=BB{BB
+žBB(öBB33BB=qBBG®BBQìBB\)BBffBBp€BBzáBB
+BD  BD
+=BD{BD
+žBD(öBD33BD=qBDG®BDQìBD\)BDffBDp€BDzáBD
+BD\BDBD£×BD®BDžRBDÂBDÌÍBD×
+BDáHBDë
+BDõÃBE  BE
+=BE{BE
+žBE(öBE33BE=qBEG®BEQìBE\)BEffBEp€BEzáBE
+BE\BEBE£×BE®BEžRBEÂBEÌÍBE×
+BEáHBEë
+BEõÃBF  BF
+=BF{BF
+žBF(öBF33BF=qBFG®BFQìBF\)BFffBFp€BFzáBF
+BH  BH
+=BH{BH
+žBH(öBH33BH=qBHG®BHQìBH\)BHffBHp€BHzáBH
+BH\BHBH£×BH®BHžRBHÂBHÌÍBH×
+BHáHBHë
+BHõÃBI  BI
+=BI{BI
+žBI(öBI33BI=qBIG®BIQìBI\)BIffBIp€BIzáBI
+BI\BIBI£×BI®BIžRBIÂBIÌÍBI×
+BIáHBIë
+BIõÃBJ  BJ
+=BJ{BJ
+žBJ(öBJ33BJ=qBJG®BJQìBJ\)BJffBJp€BJzáBJ
+BL  BL
+=BL{BL
+žBL(öBL33BL=qBLG®BLQìBL\)BLffBLp€BLzáBL
+BL\BLBL£×BL®BLžRBLÂBLÌÍBL×
+BLáHBLë
+BLõÃBM  BM
+=BM{BM
+žBM(öBM33BM=qBMG®BMQìBM\)BMffBMp€BMzáBM
+BM\BMBM£×BM®BMžRBMÂBMÌÍBM×
+BMáHBMë
+BMõÃBN  BN
+=BN{BN
+žBN(öBN33BN=qBNG®BNQìBN\)BNffBNp€BNzáBN
+BP  BP
+=BP{BP
+žBP(öBP33BP=qBPG®BPQìBP\)BPffBPp€BPzáBP
+BP\BPBP£×BP®BPžRBPÂBPÌÍBP×
+BPáHBPë
+BPõÃBQ  BQ
+=BQ{BQ
+žBQ(öBQ33BQ=qBQG®BQQìBQ\)BQffBQp€BQzáBQ
+BQ\BQBQ£×BQ®BQžRBQÂBQÌÍBQ×
+BQáHBQë
+BQõÃBR  BR
+=BR{BR
+žBR(öBR33BR=qBRG®BRQìBR\)BRffBRp€BRzáBR
+BT  BT
+=BT{BT
+žBT(öBT33BT=qBTG®BTQìBT\)BTffBTp€BTzáBT
+BT\BTBT£×BT®BTžRBTÂBTÌÍBT×
+BTáHBTë
+BTõÃBU  BU
+=BU{BU
+žBU(öBU33BU=qBUG®BUQìBU\)BUffBUp€BUzáBU
+BU\BUBU£×BU®BUžRBUÂBUÌÍBU×
+BUáHBUë
+BUõÃBV  BV
+=BV{BV
+žBV(öBV33BV=qBVG®BVQìBV\)BVffBVp€BVzáBV
+BX  BX
+=BX{BX
+žBX(öBX33BX=qBXG®BXQìBX\)BXffBXp€BXzáBX
+BX\BXBX£×BX®BXžRBXÂBXÌÍBX×
+BXáHBXë
+BXõÃBY  BY
+=BY{BY
+žBY(öBY33BY=qBYG®BYQìBY\)BYffBYp€BYzáBY
+BY\BYBY£×BY®BYžRBYÂBYÌÍBY×
+BYáHBYë
+BYõÃBZ  BZ
+=BZ{BZ
+žBZ(öBZ33BZ=qBZG®BZQìBZ\)BZffBZp€BZzáBZ
+B\  B\
+=B\{B\
+žB\(öB\33B\=qB\G®B\QìB\\)B\ffB\p€B\záB\
+B\\B\B\£×B\®B\žRB\ÂB\ÌÍB\×
+B\áHB\ë
+B\õÃB]  B]
+=B]{B]
+žB](öB]33B]=qB]G®B]QìB]\)B]ffB]p€B]záB]
+B]\B]B]£×B]®B]žRB]ÂB]ÌÍB]×
+B]áHB]ë
+B]õÃB^  B^
+=B^{B^
+žB^(öB^33B^=qB^G®B^QìB^\)B^ffB^p€B^záB^
+B`  B`
+=B`{B`
+žB`(öB`33B`=qB`G®B`QìB`\)B`ffB`p€B`záB`
+B`\B`B`£×B`®B`žRB`ÂB`ÌÍB`×
+B`áHB`ë
+B`õÃBa  Ba
+=Ba{Ba
+žBa(öBa33Ba=qBaG®BaQìBa\)BaffBap€BazáBa
+Ba\BaBa£×Ba®BažRBaÂBaÌÍBa×
+BaáHBaë
+BaõÃBb  Bb
+=Bb{Bb
+žBb(öBb33Bb=qBbG®BbQìBb\)BbffBbp€BbzáBb
+Bd  Bd
+=Bd{Bd
+žBd(öBd33Bd=qBdG®BdQìBd\)BdffBdp€BdzáBd
+Bd\BdBd£×Bd®BdžRBdÂBdÌÍBd×
+BdáHBdë
+BdõÃBe  Be
+=Be{Be
+žBe(öBe33Be=qBeG®BeQìBe\)BeffBep€BezáBe
+Be\BeBe£×Be®BežRBeÂBeÌÍBe×
+BeáHBeë
+BeõÃBf  Bf
+=Bf{Bf
+žBf(öBf33Bf=qBfG®BfQìBf\)BfffBfp€BfzáBf
+Bh  Bh
+=Bh{Bh
+žBh(öBh33Bh=qBhG®BhQìBh\)BhffBhp€BhzáBh
+Bh\BhBh£×Bh®BhžRBhÂBhÌÍBh×
+BháHBhë
+BhõÃBi  Bi
+=Bi{Bi
+žBi(öBi33Bi=qBiG®BiQìBi\)BiffBip€BizáBi
+Bi\BiBi£×Bi®BižRBiÂBiÌÍBi×
+BiáHBië
+BiõÃBj  Bj
+=Bj{Bj
+žBj(öBj33Bj=qBjG®BjQìBj\)BjffBjp€BjzáBj
+Bl  Bl
+=Bl{Bl
+žBl(öBl33Bl=qBlG®BlQìBl\)BlffBlp€BlzáBl
+Bl\BlBl£×Bl®BlžRBlÂBlÌÍBl×
+BláHBlë
+BlõÃBm  Bm
+=Bm{Bm
+žBm(öBm33Bm=qBmG®BmQìBm\)BmffBmp€BmzáBm
+Bm\BmBm£×Bm®BmžRBmÂBmÌÍBm×
+BmáHBmë
+BmõÃBn  Bn
+=Bn{Bn
+žBn(öBn33Bn=qBnG®BnQìBn\)BnffBnp€BnzáBn
+Bp  Bp
+=Bp{Bp
+žBp(öBp33Bp=qBpG®BpQìBp\)BpffBpp€BpzáBp
+Bp\BpBp£×Bp®BpžRBpÂBpÌÍBp×
+BpáHBpë
+BpõÃBq  Bq
+=Bq{Bq
+žBq(öBq33Bq=qBqG®BqQìBq\)BqffBqp€BqzáBq
+Bq\BqBq£×Bq®BqžRBqÂBqÌÍBq×
+BqáHBqë
+BqõÃBr  Br
+=Br{Br
+žBr(öBr33Br=qBrG®BrQìBr\)BrffBrp€BrzáBr
+Bt  Bt
+=Bt{Bt
+žBt(öBt33Bt=qBtG®BtQìBt\)BtffBtp€BtzáBt
+Bt\BtBt£×Bt®BtžRBtÂBtÌÍBt×
+BtáHBtë
+BtõÃBu  Bu
+=Bu{Bu
+žBu(öBu33Bu=qBuG®BuQìBu\)BuffBup€BuzáBu
+Bu\BuBu£×Bu®BužRBuÂBuÌÍBu×
+BuáHBuë
+BuõÃBv  Bv
+=Bv{Bv
+žBv(öBv33Bv=qBvG®BvQìBv\)BvffBvp€BvzáBv
+Bx  Bx
+=Bx{Bx
+žBx(öBx33Bx=qBxG®BxQìBx\)BxffBxp€BxzáBx
+Bx\BxBx£×Bx®BxžRBxÂBxÌÍBx×
+BxáHBxë
+BxõÃBy  By
+=By{By
+žBy(öBy33By=qByG®ByQìBy\)ByffByp€ByzáBy
+By\ByBy£×By®ByžRByÂByÌÍBy×
+ByáHByë
+ByõÃBz  Bz
+=Bz{Bz
+žBz(öBz33Bz=qBzG®BzQìBz\)BzffBzp€BzzáBz
+B|  B|
+=B|{B|
+žB|(öB|33B|=qB|G®B|QìB|\)B|ffB|p€B|záB|
+B|\B|B|£×B|®B|žRB|ÂB|ÌÍB|×
+B|áHB|ë
+B|õÃB}  B}
+=B}{B}
+žB}(öB}33B}=qB}G®B}QìB}\)B}ffB}p€B}záB}
+B}\B}B}£×B}®B}žRB}ÂB}ÌÍB}×
+B}áHB}ë
+B}õÃB~  B~
+=B~{B~
+žB~(öB~33B~=qB~G®B~QìB~\)B~ffB~p€B~záB~
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                XTENSION= 'IMAGE   '           / IMAGE extension                                BITPIX  =                  -32 / number of bits per data pixel                  NAXIS   =                    3 / number of data axes                            NAXIS1  =                   91 / length of data axis 1                          NAXIS2  =                   91 / length of data axis 2                          NAXIS3  =                    1 / length of data axis 3                          PCOUNT  =                    0 / required keyword; must = 0                     GCOUNT  =                    1 / required keyword; must = 1                     BZERO   =   0.000000000000E+00 / Pixel Value Offset                             BSCALE  =   1.000000000000E+00 / Pixel Value Scale                              END                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  =
+(Ð9±¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ?¹V:?=œ =(a<m<{¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  @7-@	ñâ?ºHþ?A\r=bn|<êxs¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  @Ø@dt\@7Šù@
+Ù?Œg?DûC=-Ë=/)S¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  @¶<@{b@±@e\@8@
+Á;?œç°?HÔ=«"U=ig¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  @ãZx@ÌŒ@¶Uí@ï<@@fCµ@9vR@
+šï?¿·?L8Š=Èâ=Á¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  AMÚ@ùýÚ@ã)@Í0x@¶ÉÇ@ c@üf@g+i@:^@
+£?Á?O×x=åm=®xL¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  A
+îxAAl3@úqµ@ä
+@Í€S@·=¢@ Öñ@p@@h
+@;Eº@xX?ÃUê?SvJ>ý=ËnÙ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  A5A*@)A
+ÑAÙxAŠ @úå@ä~Þ@Î-@·±|@¡JË@ä@húÒ@<-o@`
+?Å%S?W>~C=èee¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  AL/°A@àÃA5­kA*zAFºAaAà	@ûYa@äò°@Îÿ@ž%N@¡Ÿ@Wì@iâv@=@G°?Æô?Z³¬>
+ø>­÷¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  AbÐNAWaALN	AA°A5çXA*³ÿA§AMNA	ö@ûÍ;@åf@ÎÿÙ@ž(@¢2w@ËÆ@jÊ*@=üÇ@/e?ÈÄ?^R~>,sÏ>)>¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  AypìAn!ÿAbî§AW»NALöAATA6!EA*íìAºA<A	Sã@üA@åÚd@Ïs³@¹
+@¢ŠQ@?¡@k±ß@>ä|@?Ên?añO>:ï>€¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  AÆAaOAyEAn[ìAc(AWõ;ALÁãAAA6[2A+'ÚAôAÁ(A	Ð@üŽï@æN>@Ïç@¹Ý@£,@³z@l@?Ì1@þÎ?ÌbÖ?e!>Ij[>.Ì¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  AYA±AðA~DAyÉ.AnÕAcb}AX/$ALûÌAAÈtA6A+aÂA .jAûA	Ç¹@ý(Â@æÂ@Ð[`@¹ô®@£þ@'M@m8@@³Õ@æs?Î2?i.²>Wä£><¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  A©dAíAh@AÎA4çA:AzAnÏÂAcjAXiAM5¹AB`A6ÏA+°A hWA4ÿA
+Š@ý@ç5ê@ÐÏ:@ºh@€Ø@'@nhì@A@Î'?Ð?lÍ
+>f_ê>KZ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  A©ùŽA€R=AžA
+äA
+7AëAQÞAž1Az=Ao	°AcÖWAX¢þAMoŠAB<NA7õA+ÕA ¢DAnëA
+;@þv@ç©Å@ÑC@ºÜc@€u²@@oP¡@B>@µÛ?ÑÐñ?plW>tÛ1>Y¡¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  AµJA¯¢AªàA€o4AÕA;ÚA¢.AAnÓAÕ'AzvõAoCAdDAXÜìAM©ABv;A7BâA,A Ü1AšÙA
+u@þP@è
+@Ñ¶î@»P=@€é@Û@p8U@Cjó@?Ó Z?t
+(>«<>h
+è¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  AÀTAºòÝAµY0A¯¿Aª%×A€*Aò~AXÑA¿#A%wAÊAò
+Az°âAo}AdJ1AYÙAMãAB°'A7|ÏA,IwA!AâÆA
+¯m@þø*@èy@Ò*È@»Ä@¥]f@ö¶@q 	@DR§@
+D?ÕoÃ?w©ú>èà>v/¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  AËê¢AÆC+AÀ©~A»ÒAµv%A¯ÜxAªBÌA€©AqAuÅAÜABlAš¿AAzêËAo·sAdAYPÁAN
+iABêA7¶¹A,`A!PA
+¯A
+éV@ÿkü@éK@Ò@Œ7ê@¥Ñ8@j@r®@E:K@lè?×?
+?{H>&>»¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  A×:òAÑ{AËùÎAÆ`"AÀÆuA»,ÈAµ
+A¯ùoAª_ÁA€ÆA,hAŒAùA_bAÅ¶A,	A{$žAoñ_AdŸAY¯ANWWAC#þA7ð¥A,œMA!ôAVA
+#D@ÿßÖ@éy&@Ót@Œ«Ä@ŠE@Þb@rïb@F" @T?Ùt?~ç]>c§>¿_¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  AâBAÜãËA×J
+AÑ°rAÌÅAÆ}AÀãlA»I¿Aµ°A°eAª|žA€ã
+AI_A¯²AA|YAâ¬AI A{^ŠAp+MAd÷õAYÄANCAC]ëA8*A,÷:A!ÃâAA
+]0A )Ø@éí @ÓO@œ@Šží@R<@s×@G	Ž@<Q?ÚÝÝ?C>¡K>ý¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  AíÛAè4AânAÝ ÂA×gAÑÍhAÌ3ŒAÆAÁ aA»fµAµÍA°3\Aª¯A¥ AfVAÌ©A2üAPAÿ£AeöA{Ape:Ae1áAYþANË0ACØA8dA-1'A!ýÎAÊvA
+
+A cÆ@ê`Ú@Óú)@œx@§,Ç@Æ@tŸÌ@Gñh@$?Ü­F?>¥Þî>:Š¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  Aù+âAókAíêŸAèQAâ·eAÝ
+žA×
+AÑê_AÌP±AÆ·AÁ
+XA»¬AµéÿA°PRAª¶ŠA¥
+ùALAé AOóA¶FA
+AìA{ÒAp'AekÎAZ8vAO
+ACÑÅA8lA-kA"7ŒAdA
+Ñ
+A ²@êÔŽ@Ôn@ŸR@§ ¢@9ñ@uŠ@HÙ
+@
+
+º?Þ|¯?áé>­
+>xJ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B>AþÔ¹Aù;
+Aó¡`Aî³AènAâÔZAÝ:­A× ÿAÒSAÌmŠAÆÓúAÁ:MA»  A¶ôA°mGAªÓA¥9îA AAAlçAÓ:A9AáA|
+hApÙAe¥žAZr_AO?AD
+®A8ØVA-€þA"q¥A>LA
+
+ôA ×@ëH@ÔáÖ@Ÿ{%@št@­Ã@v$@IÀÁ@
+ó_?àK÷?±2>ŽYµ>Šµí¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  Bæ@BBE®Aþñ¯AùXAóŸVAî$ªAèýAâñOAÝW£A×œöAÒ$JAÌAÆððAÁWDA»œA¶#êA°>AªðA¥VäAœ7A#AÝAð1AVAŒØA|FVAqýAeß€AZ¬LAOxôADEA9CA-ÞêA"«Ax9A
+DáA@ëŒa@ÕU°@Ÿîÿ@šN@!@wuÙ@Jšv@
+Û?â`?>»Y>­ó¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B
+hB
+º¬BíÖB! BT)AÿŠAùtúAóÛMAîAAè§óAãFAÝtA×ÚíAÒA@AÌ§AÇ
+çAÁt:A»ÚA¶@áA°§4A«
+A¥sÚAÚ-A@AŠÔA
+(As{AÙÎA|CAqLêAfAZæ:AO²áADA9L0A.×A"åA²'A
+~ÏAKv@ì0;@ÕÉ@¿bÙ@šü)@x@x]@K*@
+ÂÇ?ãêÊ?P>ÂÔü>µ15¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B6BbÔB
+þB
+É(BüQB/{Bb¥Aÿ+AùïAóøCAî^AèÄêAã+=AÝA×÷äAÒ^7AÌÄAÇ*ÞAÁ1A»÷A¶]×A°Ä*A«*}A¥ÑA÷$A]xAÃËA*
+ArAöÅA|º0AqØAfSA[ &AOìÎAD¹uA9
+A.RÅA#mAìA
+žŒA
+c@ì€@Ö=e@¿ÖŽ@©p@	R@yEB@Lwß@ª|?åº2?m>Ê¡>ŒnÙ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  BÞžB
+üB>&BqPB
+€yB
+×£B
+ÍB=öBq AÿHAù®æAô:Aî{AèáàAãH4AÝ®AØÚAÒ{.AÌáAÇGÔAÁ®'AŒzA¶zÎA°á!A«GtA¥­ÈA AznAàÂAGA­hA»A|ô
+AqÀÄAflA[ZAP&»ADócA9À
+A.²A#YZA&A
+ò©A¿P@íð@Ö±?@ÀJ@©ãÝ@},@z,ö@M_@ 1?ç?îÖ>ÑPD>Ã¬|¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B
+ßB³#BæMBwBL BÊB
+²ôB
+æ
+BGBLqBAÿeAùËÛAô2.AîAèþÕAãe(AÝË|AØ1ÏAÒ"AÌþuAÇdÈAÁË
+AŒ1oA¶ÂA°þA«diA¥ÊŒA 1AcAý¶Ad	AÊ\A0°A}.Aqú­AfÇUA[ýAP`¥AE-LA9ùôA.ÆA#CA_êA
+,Aù:@íÂ@×%@ÀŸ`@ªW¯@ðþ@{@NG8@!yÕ?éXå?Ÿ>Øh>Êê ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B$/B![KB
+uBÁBôÈB'òB[
+BEB
+ÁoB
+ôB'ÂBZìBAÿAùèÒAôO%AîµxAéÌAãAÝèrAØNÅAÒµAÍlAÇ¿AÁèAŒNfA¶Ž¹A±
+A«`A¥ç³A NAŽYA¬A AçSAMŠA}góAr4AgCA[ÍêAPAEg9A:3áA/ A#Í0AØA
+fA3&@íÿ@×ë@Á2:@ªË@dÙ@{üO@O.ì@"a?ë(M?>ßË
+>Ò'Ä¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B)×/B'sB$6B!iÇB
+ðBÐBDB6mBiBÁB
+ÏêB
+B6>BigBAÿtAúÈAôl
+AîÒoAé8ÂAãAÞhAØkŒAÒÒAÍ8bAÇ¶AÂ	AŒk\A¶Ñ°A±8A«VAŠ©A jüAÑPA7£AöAJAjA}¡áArnAg;0A\×APÔAE¡&A:mÎA/:vA$
+AÓÄA
+ lAm@îsv@Ø
+Å@ÁŠ@«?c@Ø³@|ä@P @#I>?ì÷·?\ñ>ç¯>Ùeh¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B/WB,«B)ÞÅB'ïB$EB!xBB
+«lBÞB¿BDéBxB«<B
+ÞfB
+BD¹BwâB«
+AÿŒkAú"¿AôAîïeAéUžAãŒ
+AÞ"_AØ²AÒïAÍUYAÇ»¬AÂ" AŒSA¶îŠA±TùA«»LAŠ! A óAîFATAºíA!@AA}ÛÎAršuAgu
+A\AÄAQlAEÛA:§»A/tbA$A
+A
+²A
+ÚYA§@îçQ@Ø@Âï@«³>@L@}Ëž@PþV@$0ó?îÇ ?,Z>îFT>à£
+¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B5'B2SÃB/íB,ºB)í@B' jB$SB!œB
+¹çBíB :BSdBB¹·B
+ìáB
+ 
+BS4B^B¹AÿÙbAú?µAôŠAï
+\Aér¯AãÙAÞ?VAØ¥©AÓ
+üAÍrPAÇØ£AÂ>öAŒ¥IA·
+A±qðA«ØCAŠ>A €êA
+=AqA×äA>7A€A~»ArâbAg¯
+A\{²AQHYAF A:ášA/®PA$z÷AGAFAàî@ï[+@Øôz@ÂÉ@¬'@Àg@~³l@Qæ
+@%§?ð?ûÄ>õù>çà°¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B:ÏŠB7ûêB5/B2b>B/gB,ÈB)û»B'.äB$bB!8B
+ÈaBûB.µBaÞBBÈ1B
+û[B
+.
+Ba®BØBÈAÿöVAú\ªAôÂýAï)PAé€Aãõ÷AÞ\JAØÂAÓ(ñAÍDAÇõAÂ[êAŒÂ>A·(A±äA«õ8AŠ[A ÁÞA(2A
+AôØA[,AÁ~A~O£As
+LAgèóA\µAQBAFNêA;A/è9A$ŽàAAN/A×@ïÎý@ÙhL@Ã@¬ê@49@@RÍ¯@& L?òeÒ?Ë
+>üÁ
+>ï
+U¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B@wÎB=€B:×<B8
+fB5=B2p¹B/£ãB,×
+B*
+6B'=`B$pB!£³B
+ÖÝB
+
+B=0BpYB£BÖ­B	ÖB
+= Bp*B£SBÖ}B 	§Aúy AôßôAïFGAé¬AäîAÞyAAØßAÓEçAÍ¬:AÈAÂxáAŒß4A·EA±«ÛA¬.AŠxA ÞÕAE(A«|AÎAx"AÞuA~AsV8Ah"àA\ïAQŒ/AF×A;U~A0"&A$îÍA»uA
+ATÄ@ðB×@ÙÜ&@Ãuu@­Ä@š@Ac@Sµc@&è ?ô5;?u?ÿ`>ö[ø¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  BFöBCL:B@dB=²B:å·B8áB5L
+B24B/²^B,åB*±B'KÛB$B!².B
+åXB
+BK«B~ÕB±þBå(BRB
+K{B~¥B±ÏBäøB !AúAôüêAïc>AéÉAä/äAÞ7AØüAÓbÞAÍÉ1AÈ/AÂØAŒü+A·b~A±ÈÒA¬/%AŠxA ûÌAb
+AÈrA.ÅAAûlA~Ã~As&Ah\ÍA])uAQö
+AFÂÄA;kA0\A%(»AõbAÂ	A±@ð¶±@ÚP @ÃéO@­@î@µ=@T@'Ïµ?ö€?iÞ?2>ý¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  BKÈ
+BHôbBF'BCZ¶B@ßB=Á	B:ô3B8'\B5ZB2°B/ÀÙB,ôB*'-B'ZVB$B!À©B
+óÓB
+&ýBZ&BPBÀzBó£B&ÍB
+Y÷B BÀIBósB &Aú³AõáAï4AéæAäLÚAÞ³.AÙAÓÔAÍæ(AÈL{AÂ²ÎAœ"A·uA±åÈA¬L
+AŠ²nA¡ÂAAåhAKŒA²A
+bA~ýkAsÊAhºA]cbAR0	AFü±A;ÉYA0 A%b§A/OAû÷AÈ@ñ*@ÚÃÛ@Ä]*@­öy@È@)@UÌ@(·i?÷Ô
+?9G?	=?k ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  BQpFBNBKÏŽBIÞBF6BCi1B@[B=ÏB;®B85ØB5iB2+B/ÏUB-~B*5šB'hÑB$ûB!Ï%BNB
+5xBh¢BËBÎõBB5HB
+hqBBÎÅBîB 5AúÐAõ6×Aï*Aê~AäiÑAÞÐ$AÙ6xAÓËAÎ
+AÈirAÂÏÅAœ6A·lA²ŸA¬iAŠÏeA¡5žA
+A_Ah²AÏA
+5YA7XAt AhÐ§A]OARi÷AG6A<EA0ÏíA%Ai<A5äA@ñf@Û7µ@ÄÑ@®jS@¢@ò@Vl@)
+?ù£v? °?
+ÛÖ?
+r¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  BWmBTD±BQwÛBN«BKÞ.BIXBFDBCw«B@ªÕB=ÝÿB;(B8DRB5w|B2ª¥B/ÝÏB-øB*D"B'wLB$ªuB!ÝBÉB
+CòBw
+BªFBÝoBBCÂB
+vìBªBÝ?BiB CAúíxAõSÌAïºAê rAäÆAÞíAÙSlAÓ¹ÀAÎ AÈfAÂìºAœS
+A·¹`A²³A¬AŠìZA¡R­A¹ ATA
+§AëúA
+RNAqAAt=éAi
+A]×8AR£ßAGpA<=/A1	ÖA%Ö~A£%AoÍA<t@ò8@Û«@ÅDÖ@®Þ%@wt@Ä@WT%@*Â?ûrŸ?¡×ù?zg?	©D¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B\ÀBYìÙBW BTS-BQVBN¹BKìªBIÓBFRýBC'B@¹PB=ìzB;€B8RÍB5
+÷B2¹ B/ìJB-tB*RB'
+ÇB$žñB!ìBDB
+RnB
+BžÀBëêBBR=B
+
+gBžBë»B
+åB RAû
+oAõpÂAï×Aê=iAä£ŒAß
+AÙpcAÓÖ¶AÎ=
+AÈ£\AÃ	°AœpA·ÖVA²<ªA¬¢ýA§	PA¡o€AÕ÷A<JA¢AñA
+oDA«.AtwÖAiD}A^%ARÝÍAGªtA<w
+A1CÃA&kAÝA©ºAvb@ò@Üa@Åž°@¯R @ëO@@X;Ù@+nv?ýB'?£§b?:?
+H¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  BbhœB_B\È+BYûUBW.~BTašBQÒBNÇûBKû%BI.OBFaxBC¢B@ÇÌB=úõB;.B8aHB5rB2ÇB/úÅB--ïB*aB'BB$ÇlB!úB-¿B
+`èBBÇ<BúeB-B`¹B
+ãBÇ
+Bú6B-`B `Aû'fAõ¹Aïô
+AêZ`AäÀ³Aß'AÙZAÓó¬AÎZ AÈÀSAÃ&ŠAœúA·óMA²Y A¬¿ôA§&GA¡AòîAYAA¿A%çA
+:AåAt±ÃAi~kA^KASºAGäaA<±	A1}°A&JXA Aã§A°N@òùì@Ü<@Æ,@¯ÅÚ@_)@øx@Y#@,V+?ÿ?¥vË?ž
+?æè¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  BhåBe=)BbpSB_£}B\ÖŠBZ	ÐBW<úBTp#BQ£MBNÖwBL	 BI<ÊBFoôBC£
+B@ÖGB>	pB;<B8oÄB5¢íB2ÖB0	AB-<jB*oB'¢ŸB$ÕçB"	B<:B
+odB¢BÕ·BáB<
+Bo5B
+¢^BÕB²B;ÛB oAûD\Aõª°AðAêwVAäÝªAßCüAÙªPAÔ£AÎvöAÈÝJAÃCAœ©ðAžDA²vA¬ÜêA§C>A¡©AäAv7AÜABÞA
+©1AAtë°AižXA^ÿASQ§AH
+NA<êöA1·A&EAPìA
+Aê<@ómÇ@Ý@Æ e@°9Ž@Ó@lR@Z
+B@-=ß@ p|?§F3?VÝ?
+¹¿  ¿  ¿  ¿  ¿  ¿  Bm¹
+BjåQBh{BeK¥Bb~ÎB_±øB\å"BZKBWKuBT~BQ±ÈBNäòBL
+BIKEBF~oBC±B@äÂB>ìB;KB8~?B5±iB2äB0ŒB-JæB*~B'±8B$äbB"BJµB
+}ßB±	Bä3B]BJB}°B
+°ÚBäB,BJVB }AûaSAõÇŠAð-úAêLAäú Aß`óAÙÇFAÔ-AÎíAÈú@AÃ`AœÆçAž-:A²A¬ùáA§`4A¡ÆA,ÚA.AùA_ÔA
+Æ(A,{Au%AiòEA^ŸìASAHX<A=$ãA1ñA&Ÿ2AÚAWA$)@óá¡@Ýzð@Ç?@°­@FÞ@à-@Zòö@.%@X1?©?
+õ¯?$¿  ¿  ¿  ¿  Bsa4BpxBmÀ¢BjóÌBh&õBeZBbIB_ÀrB\óBZ&ÆBWYïBTBQÀCBNólBL&BIY¿BFéBCÀB@ó<B>&fB;YB8¹B5¿ãB2ó
+B0&6B-Y_B*B'¿³B$òÜB"&BY0B
+ZB¿Bò­B%×BYB*B
+¿SBò}B%§BXÐB úAû~HAõäAðJîAê±AAåAß}èAÙä;AÔJAÎ°âAÉ5AÃ}AœãÜAžJ/A²°A­ÕA§}(A¡ã|AIÏA°"AvA|ÉA
+ã
+AIpAu_Aj,.A^øÖASÅ}AH$A=^ÌA2+tA&øAÄÃAkA^@ôUs@ÝîÂ@Ç@±!a@º°@Sÿ@[Ú@/
+8@?Õ?ªäæ?"B?Ã^¿  ¿  By	\Bv5 BshÊBpôBmÏ
+BkGBh5qBehBbÄB_ÎîB]BZ5ABWhkBTBQÎŸBOçBL5BIh;BFdBCÎBAžB>4áB;h
+B85B5Î^B3B04±B-gÛB*B'Î.B%XB"4Bg¬B
+ÕBÍÿB)B4RBg{B¥B
+ÍÏB	 øB4"BgLB uAû>AöAðgäAêÎ8Aå4AßÞAÚ2AÔg
+AÎÍØAÉ4,AÃAŸ ÒAžg%A²ÍxA­3ÌA§A¢ rAfÆAÍA3lAÀA AffAutAjfA_2ÂASÿjAHÌA=¹A2eaA'2	Aþ°AËWAÿ@ôÉN@Þb@Çûì@±;@.@ÇÙ@\ÂO@/ôí@'?¬ŽO?&3?b/B|  B{ÝÈByòBvD
+BswEBpªoBmÝBkÂBhCìBewBbª?B_ÝiB]BZCŒBWvæBTªBQÝ9BOcBLCBIv¶BF©àBCÝ	BA3B>C]B;vB8©¯B5ÜÙB3B0C,B-vVB*©B'ÜªB%ÔB"BýBv'B
+©QBÜzB£BBÍBu÷B© B
+ÜJB	tBBBuÇB šñAûž4Aö
+AðÛAêë.AåQAß·ÕAÚ
+(AÔ|AÎêÏAÉQ"AÃ·uAŸ
+ÈAž
+A²êoA­PÂA§·A¢
+iAŒAêAPcA¶¶A
+	A\AuÓ`Aj A_l°AT9WAIÿA=Ò§A2NA'kõA
+8AEAÑí@õ=(@ÞÖw@ÈoÆ@²	@¢e@
+;³@]ª@0Ü¢@??®ž?)Ñå¿  B|B{ìDBymBvRBs
+ÁBpžêBmìBk>BhRgBe
+Bbž»B_ëäB]BZR7BW
+aBTžBQëŽBO
+ÞBLRBI
+1BFž[BCë
+BA
+®B>Q×B;
+B8ž+B5ëTB3
+~B0QšB-ÒB*·üB'ë%B%
+OB"QyB¢B
+·ËBêõB
+BQHBrB·B
+êÅB	
+ïBQBBB ·lAûÕ+Aö;~Að¡ÒAë%AånxAßÔÌAÚ;AÔ¡rAÏÅAÉnAÃÔlAŸ:¿Až¡A³fA­m¹A§Ô
+A¢:`A ³AAmYAÓ¬A: A SAv
+NAjÙõA_ŠATsEAI?ìA>
+A2Ù;A'¥ãA
+rA?2A
+Ù@õ±@ßJQ@Èã¡@²|ð@>@
+¯@^¹@1ÄV@öó?¯vw¿  ¿  B|B{ú¿By-éBvaBs<BpÇfBmúBk-¹Bh`ãBe
+BbÇ6B_ú_B]-BZ`³BWÜBTÇBQú0BO-YBL`BI­BFÆÖBCùÿBA-)B>`SB;|B8ÆŠB5ùÐB3,úB0`$B-MB*ÆwB'ù¡B%,ÊB"_óB
+B
+ÆGBùpB,B_ÄBíBÆB
+ùAB	,jB_BŸB ÅçAûò"AöXuAðŸÈAë%
+AåoAßñÂAÚXAÔŸhAÏ$ŒAÉAÃñbAŸW¶AžŸ	A³$\A­°A§ñA¢WVAœ©A#üAPAð£AVöAœJAvG;AkãA_àAT­1AIyÙA>FA3)A'ßÐA
+¬wAyAEÇ@ö$Ý@ßŸ,@ÉWz@²ðÊ@@#h@_yn@2=¶¿  ¿  ¿  ¿  B|$B|	:By<dBvoBs¢·BpÕáBn	
+Bk<4Bho^Be¢BbÕ±B`ÛB]<BZo.BW¢XBTÕBR«BO;ÕBLnþBI¢'BFÕQBD{BA;€B>nÎB;¡øB8Õ"B6LB3;uB0nB-¡ÉB*ÔòB(B%;EB"noB¡B
+ÔÂBìB;Bn?B¡iBÔB
+ŒB	:æBnB¡9B ÔbAüAöulAðÛ¿AëBAåšeAàžAÚu
+AÔÛ_AÏA²AÉšAÄYAŸt¬AžÛ A³ASA­§ŠAš
+ùA¢tLAÚ A@óA§FA
+AsíAÚ@Av(AkMÏA`wATçAI³ÇA>nA3MA(œA
+æeA³
+AŽ@ö·@à2@ÉËU@³d€@ýó@`¿  ¿  ¿  ¿  ¿  ¿  B|3B|¶ByJßBv~	Bs±3Bpä\BnBkJ¯Bh}ÙBe±Bbä,B`VB]JBZ}©BW°ÓBTãýBR&BOJOBL}yBI°£BFãÌBDöBAJ B>}JB;°tB8ãB6ÇB3IñB0}B-°CB*ãmB(B%IÀB"|êB°B
+ã=BgBIB|ºB¯äBãB
+7B	IaB|B¯ŽB âÞAü,AöbAðøµAë_AåÅ\Aà+¯AÚAÔøVAÏ^©AÉÄüAÄ+PAŸ£Až÷öA³^IA­ÄAš*ðA¢CA÷A]êAÄ=A*AäA÷7Av»AkœA`TeAU!
+AIí³A>º[A3A(SªA
+ RAìúA¹¡@÷
+@à¥à@Ê?/@³¡T¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B|AB|&/ByYYBvBs¿¬BpòÕBn%ÿBkY)BhRBe¿|BbòŠB`%ÏB]XùBZ#BW¿LBTòuBR%BOXÉBLòBI¿
+BFòFBD%pBAXB>ÃB;ŸíB8òB6%@B3XiB0B-ŸœB*ñæB(%B%X:B"cBŸB
+ñ·B$àBX
+B4BŸ]BñB
+$°B	WÚBBŸ-B ñWAüIAö¯TAñšAë{ûAåâNAàH¢AÚ®õAÕHAÏ{AÉáïAÄHBAŸ®A¹èA³{<A­áAšGâA¢®6AAzÜAá0AGA­×A)AvôûAkÁ¢A`IAUZñAJ'A>ô@A3ÀèA(A
+Z7A&ÞAó@÷[@àâ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B|OÿB|4ªBygÔBvýBsÎ'BqQBn4zBkg€BhÎBeÍ÷Bc!B`4KB]gtBZBWÍÇBU ñBR4BOgDBLnBIÍBG ÂBD3ëBAgB>?B;ÍhB9 B63»B3fåB0B-Í8B+ bB(3B%fµB"ßBÍB
+ 2B3\Bf
+B¯BÌØB B
+3,B	fUBBÌšB ÿÒAüeøAöÌKAñ2AëòAåÿEAàeAÚËìAÕ2?AÏAÉþåAÄe8AŸËA¹1ßA³2A­þAšdÙA¢Ë,A1AÓAþ'AdyAÊÌA1 Aw.çAkûA`È7AUÞAJaA?..A3úÕA(Ç|A
+$A`ÌAÞ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B|^zB|C%ByvOBv©yBsÜ¢BqÌBnBöBkvBh©IBeÜsBcB`BÅB]uïBZ©BWÜBBUlBRBBOuÀBLšêBIÜBG=BDBgBAuB>š¹B;ÛãB9
+B6B6B3u`B0šB-Û³B+ÝB(BB%u0B"šZBÛB
+­BA×Bu Bš*BÛTB}B
+A§B	tÐB§úBÛ$BMAüîAöéBAñOAëµèAæ
+<AàAÚèâAÕO5AÏµAÊÜAÄ/AŸèA¹NÖA³µ)A®|AšÐA¢è#ANwAŽÉA
+ApAçÃANAwhÕAl5|Aa$AUÎÌAJsA?hA44ÂA)jA
+²|¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B|lõB|Q¡ByÊBv·ôBsë
+Bq
+GBnQqBkBh·ÄBeêíBc
+B`QAB]jBZ·BWêŸBU
+èBRQBO;BL·eBIêBG
+žBDPáBA
+B>·5B;ê^B9
+B6P²B3ÛB0·B-ê/B+
+XB(PB%¬B"¶ÕBéÿB
+
+(BPRB|B¶¥BéÏB
+øB
+P"B	LB¶uBéB
+ÉAüåA÷8AñlAëÒßAæ92Aà
+AÛØAÕl,AÏÒAÊ8ÒAÄ&A¿yA¹kÌA³Ò A®8sAšÇA£AklAÑÀA8AfAºAk
+Aw¢ÂAlojAa<AVžAJÕ`A?¢A4S¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B|{pB|`
+ByFBvÆoBsùBq,ÃBn_ìBkBhÆ?BeùiBc,B`_ŒB]æBZÆBWù:BU,cBR_BO·BLÅàBIù	BG,3BD_]BAB>Å°B;øÚB9,B6_-B3WB0ÅB-øªB++ÔB(^ýB%'B"ÅPBøzB
++€B^ÍB÷BÅ BøJB+tB
+^B	ÇBÄñBøB+DAüŒÜA÷#/AñAëïÕAæV(AàŒ|AÛ"ÏAÕ"AÏïvAÊUÉAÄŒ
+A¿"pA¹ÃA³ïA®UiAš»ŒA£"AcAî¶AU
+A»]A!°AAwÜ¯Al©VAauþAVBŠAJóž¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B|ìB|nBy¡ÁBvÔëBtBq;=BnngBk¡BhÔºBfäBc;B`n8B]¡bBZÔBXµBU:ßBRnBO¡1BLÔ[BJ
+BG:®BDmØBA¡B>Ô+B<UB9:B6mšB3 ÒB0ÓüB.%B+:OB(mxB% ¢B"ÓÌB õB
+:BmHB rBÓBÅB9ïB
+mB	 BBÓlBB9¿AüÙÒA÷@%AñŠxAì
+ÌAæsAàÙrAÛ?ÆAÕŠAÐ
+lAÊrÀAÄÙA¿?gA¹¥¹AŽ
+
+A®r`AšØ³A£?A¥ZA
+­Ar AØTA>§A€úAxAlãDAaV¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B|gB|}By°<BvãeBtBqI¹Bn|âBk°
+Bhã6Bf`BcIB`|³B]¯ÝBZãBX0BUIYBR|BO¯­BLâÖBJ BGI*BD|SBA¯}B>â§B<ÐB9HúB6|$B3¯MB0âwB. B+HÊB({ôB%¯
+B"âGB pB
+HB{ÄB®íBâBABHjB
+{B	®ŸBáçBBH;AüöÈA÷]
+AñÃoAì)ÂAæAàöiAÛ\ŒAÕÃAÐ)cAÊ·AÄö	A¿\\A¹Â°AŽ)A®VAšõªA£[ýAÂPA(€A÷AõKA[AÁñAx4ô¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B|ŠâB|ByŸ·BvñáBt%
+BqX4Bn^BkŸBhñ²Bf$ÛBcXB`/B]ŸXBZñBX$«BUWÕBRþBOŸ(BLñRBJ${BGW¥BDÏBAœøB>ñ"B<$LB9WuB6B3œÈB0ðòB.$
+B+WEB(oB%œB"ðÂB #ìB
+WB?BœiBðB#ŒBVæB
+B	œ9BðcB#BV¶Aý¿A÷zAñàfAìF¹Aæ­
+Aá`AÛy³AÕàAÐFYAÊ¬¬AÅ A¿ySA¹ßŠAŽEúA®¬MA© A£xôAßGAEA«îA@AjÉ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B|µ]B|	ByÍ2Bw \Bt3Bqf°BnÚBkÍBi -Bf3WBcfB`©B]ÌÓBZÿýBX3&BUfPBRzBOÌ£BLÿÍBJ2÷BGf BDJBAÌtB>ÿB<2ÇB9eðB6B3ÌDB0ÿmB.2B+eÀB(êB%ÌB"ÿ=B 2gB
+eBºBËäBÿB27BeaB
+B	ËŽBþÞB2Be1Aý0¶A÷	Añý\Aìc°AæÊAá0WAÛ©AÕüüAÐcPAÊÉ£AÅ/öA¿JA¹üAŽbðA®ÉDA©/A£ëAü>AbA»¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B|ÃØB|šByÛ®BwØBtBBqu+BnšUBkÛBišBfAÑBctûB`š%B]ÛNB[xBXA¢BUtËBR§õBOÛBMHBJArBGtBD§ÅBAÚïB?B<ABB9tlB6§B3Ú¿B1
+èB.AB+t<B(§eB%ÚB#
+¹B @âB
+t
+B§6BÚ_B
+B@³BsÜB
+§B	Ú0B
+YB@Bs¬AýM¬A÷Ž AòSAì§AææùAáMLAÛ³ AÖóAÐFAÊæAÅLíA¿³@AºAŽçA®æ;A©LA£²àA
+i¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B|ÒTB|¶þByê(Bw
+QBtP{Bq¥Bn¶ÎBké÷Bi
+!BfPKBctB`¶B]éÈB[
+ñBXPBUEBR¶nBOéBM
+ÂBJOëBGBD¶>BAéhB?
+B<O»B9åB6¶B3é8B1
+bB.OB+µB(µßB%éB#
+2B O\B
+
+Bµ¯BèÙB
+BO,BVB
+µB	è©BÒBNüB&AýjA÷ÐóAò7EAìAçìAáj?AÛÐAÖ6æAÐ9AËAÅiàA¿Ð3Aº6AŽÚA¯,A©[µ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B|àÐB|ÅyByø£Bw+ÍBt^öBqBnÅIBkøsBi+Bf^ÆBcðB`ÅB]øCB[+mBX^BUÀBRÄêBOøBM+=BJ^fBGBDÄºBA÷ãB?+
+B<^6B9`B6ÄB3÷³B1*ÝB.^B+0B(ÄZB%÷B#*­B ]×B
+BÄ*B÷TB*~B]§BÑB
+ÃúB	÷$B*NB]wB¡AýA÷íèAòT<AìºAç âAá6AÛíAÖSÜAÐº0AË AÅ×A¿í*AºS|AŽ¬¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B|ïKB|ÓõBz
+Bw:GBtmqBq BnÓÄBlîBi:BfmABc kB`ÓB^ŸB[9èBXmBU ;BRÓeBPBM9žBJlâBG 
+BDÓ5BB^B?9B<l²B9ÛB6ÓB4/B19XB.lB+¬B(ÒÕB&ÿB#9)B lRB
+|BÒŠBÏB8ùBl"BLB
+ÒvB
+B8ÉBkóB
+Aý€Aø
+ßAòq2Aì×Aç=ÙAá€,AÜ
+AÖpÓAÐ×'AË=zAÅ£ÌA¿üU¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B|ýÆB|âoBzBwHÃBt{ìBq¯Bnâ@BliBiHBf{œBc®æB`âB^:B[HcBX{BU®¶BRáàBP
+BMH3BJ{]BG®BDá°BBÚB?HB<{-B9®WB6áB4ªB1GÔB.zýB+®'B(áQB&zB#G€B zÎB
+­÷Bá!BJBGtBzB­ÇB
+àñB
+BGDBznB­AýÁAø'ÖAò)Aìô|AçZÐAáÁ#AÜ'wAÖÊAÐô
+AËL¥¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B}
+AB|ðëBz$BwW>BthBqœBnð»Bl#åBiWBf8BcœbB`ðB^#µB[VÞBXBUœ2BRð[BP#
+BMV®BJØBGœBDð+BB#UB?VB<šB9ŒÒB6ïüB4#%B1VOB.yB+Œ¢B(ïÌB&"öB#VB IB
+ŒrBïB"ÆBUïBBŒCB
+ïlB
+"BUÀBéBŒAýÞyAøDÌAò« AísAçwÇAáÞAÜDlAÖõ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B}ŒB|ÿfBz2Bwe¹BtãBqÌ
+Bnÿ6Bl2`BieBf³BcËÝB`ÿB^20B[eZBXBUË­BRþÖBP2 BMe*BJSBGË}BDþ§BB1ÐB?dúB<$B9ËMB6þwB41¡B1dÊB.ôB+Ë
+B(þGB&1qB#dB ÄB
+ÊîBþB1ABdkBBÊŸB
+ýèB
+1Bd;BeBÊAýûpAøaÃAòÈAí.jAçŒAáíE¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B})8B}
+áBzA
+Bwt5Bt§^BqÚBo
+²Bl@ÛBitBf§.BcÚXBa
+B^@«B[sÕBXŠþBUÚ(BS
+RBP@{BMs¥BJŠÏBGÙøBE
+"BB@LB?suB<ŠB9ÙÉB7
+òB4@
+B1sFB.ŠoB+ÙB)
+ÂB&?ìB#sB Š?B
+ÙiB
+B?ŒBræBŠBÙ9B
+
+cB
+?Br¶B¥ßBÙ
+AþgAø~ºAòå
+Aí=¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B}7³B}
+]BzOBw°BtµÚBqéBo
+-BlOVBiBfµªBcèÓBaýB^O&B[PBXµzBUè£BSÍBPN÷BM BJµJBGètBEBBNÇB?ñB<µB9èDB7nB4NB1ÁB.ŽêB+èB)>B&NgB#B Ž»B
+çäBBN8BaBŽBçµB
+ÞB
+NB2BŽ[Bç
+Aþ5\Aøå¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B}F.B}*ØBz^Bw+BtÄUBq÷~Bo*šBl]ÒBiûBfÄ%Bc÷NBa*xB^]¢B[ËBXÃõBU÷BS*HBP]rBMBJÃÅBGöïBE*BB]BB?lB<ÃB9ö¿B7)éB4]B1<B.ÃfB+öB))¹B&\ãB#
+B Ã6B
+ö`B)B\³BÝBÃBö/B
+)ZB
+\B­BÂ×Bï¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B}TªB}9SBzl}BwŠBtÒÐBrúBo9#BllMBivBfÒ BdÊBa8óB^l
+B[GBXÒpBVBS8ÄBPkíBMBJÒABHjBE8BBkŸB?çB<ÒB::B78dB4kB1·B.ÑáB,
+B)84B&k^B#B Ñ±B
+ÛB8Bk.BWBÑB«B
+7ÕB
+jÿBC¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B}c%B}GÌBzzöBw® BtáIBrsBoGBlzÆBi­ðBfáBdCBaGmB^zB[­ÀBXàêBVBSG=BPzgBM­BJàºBHäBEG
+BBz7B?­`B<àB:ŽB7FÝB4zB1­1B.àZB,B)F®B&y×B#­B à+B
+TBF}ByšB¬ÑBßûB%B
+?i¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B}q B}VHBzqBwŒBtïÄBr"îBoVBlABiŒkBfïBd"ŸBaUèB^B[Œ;BXïeBV"BSUžBPâBMŒ
+BJï5BH"_BEUBB²B?»ÜB<ïB:"/B7UYB4B1»¬B.îÖB,!ÿB)U)B&SB#»|B î¥B
+!ÐBTùB#B»MBç¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B}B}dÃBzìBwËBtþ@Br1iBodBlœBiÊæBfþBd1:BadcB^B[Ê·BXýàBV1
+BSd4BP]BMÊBJý°BH0ÚBEdBB-B?ÊWB<ýB:0ªB7cÔB4þB1Ê'B.ýQB,0{B)c€B&ÍB#ÉøB ý!B
+0KBcuB¹¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B}B}s>BzŠhBwÙBu
+»Br?åBosBlŠ8BiÙbBg
+Bd?µBarßB^ŠB[Ù2BY
+\BV?
+BSr¯BP¥ØBMÙBK
+,BH?UBErBB¥©B?ØÒB=
+üB:?&B7rOB4¥yB1Ø£B/
+ÌB,>õB)r B&¥IB#ØsB!
+B
+7á¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B}B}¹BzŽãBwè
+Bu6BrN`BoBlŽ³BiçÝBgBdN0BaZB^ŽB[ç­BY×BVN BS*BPŽTBMç}BK§BHMÑBEúBBŽ$B?çNB=wB:M¡B7ËB4³ôB1ç
+B/HB,MqB)B&³ÅB#à	¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B}«B}5BzÃ^BwöBu)²Br\ÛBoBlÃ/BiöXBg)Bd\¬BaÕB^ÂÿB[ö(BY)RBV\|BS¥BPÂÏBMõùBK)"BH\LBEvBBÂB?õÉB=(óB:\
+B7EB4ÂpB1õB/(ÃB,[íB)1¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B}ºB}°BzÑÚBxBu8-BrkWBoBlÑªBjÔBg7ýBdk'BaPB^ÑzB\€BY7ÍBVj÷BS!BPÑJBNtBK7BHjÇBEñBBÑB@DB=7mB:jB7ÁB4ÐëB2B/0Y¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B}ÈB}­+BzàUBxBuFšBryÒBo¬üBlà%BjOBgFxBdy¢Ba¬ÌB^ßõB\BYFIBVyrBS¬BPßÆBNïBKFBHyCBE¬lBBßB@ÀB=EéB:yB7¬=B4Ø¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B}ÖÿB}»§BzîÐBx!úBuU$BrMBo»wBlî Bj!ÊBgTôBd
+Ba»GB^îqB\!BYTÄBVîBS»BPîABN!kBKTBHœBEºèBBîB@!;B=TeB:©¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B}åzB}Ê"BzýLBx0uBucBrÈBoÉòBlý
+Bj0EBgcoBdBaÉÂB^üìB\0BYc?BViBSÉBPüŒBN/åBKcBH9BEÉcBBüB@(Ñ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B}óöB}ØB{
+ÅBx>îBurBr¥BBoØkBm
+Bj>¿BgqèBd¥BaØ<B_
+eB\>BYq¹BV€âBSØ
+BQ
+6BN>_BKqBH€³BEÐ÷¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B~qB}çB{@BxMjBuBr³œBoæçBmBjM:BgdBd³Baæ·B_áB\M
+BY3BV³^BSæBQ±BNLÛBKy¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B~ìB}õB{(»Bx[åBuBrÂ8BoõbBm(Bj[µBgßBdÂ	Baõ2B_([B\[BY¯BVÁÙBSõBQ!G¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B~gB~
+B{77Bxj`BuBrÐŽBpÝBm7Bjj1BgZBdÐBb®B_6×B\jBY+BVÉo¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B~-ãB~B{E²BxxÜBu¬Brß/BpYBmEBjx«Bg«ÖBdÞÿBb)B_ESB\q¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B~<^B~!B{T-BxWBuºBríªBp ÓBmSþBj'BgºQBdí{Bb¿¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B~JÙB~/B{b©BxÒBuÈûBrü&Bp/OBmbyBj£BgÁç¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B~YUB~=úB{q#Bx€MBu×wBs
+¡Bp=ËBmj¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B~gÏB~LuB{Bx²ÉBuåóBs7¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B~vKB~ZñB{Bxº_¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B~ÇB~b
+¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              XTENSION= 'IMAGE   '           / IMAGE extension                                BITPIX  =                  -32 / number of bits per data pixel                  NAXIS   =                    3 / number of data axes                            NAXIS1  =                   64 / length of data axis 1                          NAXIS2  =                   64 / length of data axis 2                          NAXIS3  =                    1 / length of data axis 3                          PCOUNT  =                    0 / required keyword; must = 0                     GCOUNT  =                    1 / required keyword; must = 1                     BZERO   =   0.000000000000E+00 / Pixel Value Offset                             BSCALE  =   1.000000000000E+00 / Pixel Value Scale                              END                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             B|  Bx  Bt  Bp  Bl  Bh  Bd  B`  B\  BX  BT  BP  BL  BH  BD  B@  B<  B8  B4  B0  B,  B(  B$  B   B
+  B  B  B  B
+  B  B  B   Aø  Að  Aè  Aà  AØ  AÐ  AÈ  AÀ  Až  A°  Aš  A   A  A  A  A  Ap  A`  AP  A@  A0  A   A  A   @à  @À  @   @  @@  @   ?      B|
+=Bx
+=Bt
+=Bp
+=Bl
+=Bh
+=Bd
+=B`
+=B\
+=BX
+=BT
+=BP
+=BL
+=BH
+=BD
+=B@
+=B<
+=B8
+=B4
+=B0
+=B,
+=B(
+=B$
+=B 
+=B
+
+=B
+=B
+=B
+=B
+
+=B
+=B
+=B 
+=Aø{Að{Aè{Aà{AØ{AÐ{AÈ{AÀ{Až{A°{Aš{A {A{A{A{A{Ap(öA`(öAP(öA@(öA0(öA (öA(öA (ö@àQì@ÀQì@ Qì@Qì@@£×@ £×?G®<#×
+B|{Bx{Bt{Bp{Bl{Bh{Bd{B`{B\{BX{BT{BP{BL{BH{BD{B@{B<{B8{B4{B0{B,{B({B${B {B
+{B{B{B{B
+{B{B{B {Aø(öAð(öAè(öAà(öAØ(öAÐ(öAÈ(öAÀ(öAž(öA°(öAš(öA (öA(öA(öA(öA(öApQìA`QìAPQìA@QìA0QìA QìAQìA Qì@à£×@À£×@ £×@£×@AG®@G®?\<£×
+B|
+žBx
+žBt
+žBp
+žBl
+žBh
+žBd
+žB`
+žB\
+žBX
+žBT
+žBP
+žBL
+žBH
+žBD
+žB@
+žB<
+žB8
+žB4
+žB0
+žB,
+žB(
+žB$
+žB 
+žB
+
+žB
+žB
+žB
+žB
+
+žB
+žB
+žB 
+žAø=qAð=qAè=qAà=qAØ=qAÐ=qAÈ=qAÀ=qAž=qA°=qAš=qA =qA=qA=qA=qA=qApzáA`záAPzáA@záA0záA záAzáA zá@àõÃ@ÀõÃ@ õÃ@õÃ@Aë
+@ë
+?×
+<õÂB|(öBx(öBt(öBp(öBl(öBh(öBd(öB`(öB\(öBX(öBT(öBP(öBL(öBH(öBD(öB@(öB<(öB8(öB4(öB0(öB,(öB((öB$(öB (öB
+(öB(öB(öB(öB
+(öB(öB(öB (öAøQìAðQìAèQìAàQìAØQìAÐQìAÈQìAÀQìAžQìA°QìAšQìA QìAQìAQìAQìAQìAp£×A`£×AP£×A@£×A0£×A £×A£×A £×@áG®@ÁG®@¡G®@G®@B\@\?
+
+ž=#×
+B|33Bx33Bt33Bp33Bl33Bh33Bd33B`33B\33BX33BT33BP33BL33BH33BD33B@33B<33B833B433B033B,33B(33B$33B 33B
+33B33B33B33B
+33B33B33B 33AøffAðffAèffAàffAØffAÐffAÈffAÀffAžffA°ffAšffA ffAffAffAffAffApÌÍA`ÌÍAPÌÍA@ÌÍA0ÌÍA ÌÍAÌÍA ÌÍ@á@Á@¡@@C33@33?ff=LÌÍB|=qBx=qBt=qBp=qBl=qBh=qBd=qB`=qB\=qBX=qBT=qBP=qBL=qBH=qBD=qB@=qB<=qB8=qB4=qB0=qB,=qB(=qB$=qB =qB
+=qB=qB=qB=qB
+=qB=qB=qB =qAøzáAðzáAèzáAàzáAØzáAÐzáAÈzáAÀzáAžzáA°záAšzáA záAzáAzáAzáAzáApõÃA`õÃAPõÃA@õÃA0õÃA õÃAõÃA õÃ@áë
+@Áë
+@¡ë
+@ë
+@C×
+@×
+?®=uÂB|G®BxG®BtG®BpG®BlG®BhG®BdG®B`G®B\G®BXG®BTG®BPG®BLG®BHG®BDG®B@G®B<G®B8G®B4G®B0G®B,G®B(G®B$G®B G®B
+G®BG®BG®BG®B
+G®BG®BG®B G®Aø\Að\Aè\Aà\AØ\AÐ\AÈ\AÀ\Až\A°\Aš\A \A\A\A\A\Aq
+žAa
+žAQ
+žAA
+žA1
+žA!
+žA
+žA
+ž@â=q@Â=q@¢=q@=q@Dzá@zá?õÃ=\)B|QìBxQìBtQìBpQìBlQìBhQìBdQìB`QìB\QìBXQìBTQìBPQìBLQìBHQìBDQìB@QìB<QìB8QìB4QìB0QìB,QìB(QìB$QìB QìB
+QìBQìBQìBQìB
+QìBQìBQìB QìAø£×Að£×Aè£×Aà£×AØ£×AÐ£×AÈ£×AÀ£×Až£×A°£×Aš£×A £×A£×A£×A£×A£×AqG®AaG®AQG®AAG®A1G®A!G®AG®AG®@â\@Â\@¢\@\@E
+ž@
+ž?=q=£×
+B|\)Bx\)Bt\)Bp\)Bl\)Bh\)Bd\)B`\)B\\)BX\)BT\)BP\)BL\)BH\)BD\)B@\)B<\)B8\)B4\)B0\)B,\)B(\)B$\)B \)B
+\)B\)B\)B\)B
+\)B\)B\)B \)AøžRAðžRAèžRAàžRAØžRAÐžRAÈžRAÀžRAžžRA°žRAšžRA žRAžRAžRAžRAžRAqp€Aap€AQp€AAp€A1p€A!p€Ap€Ap€@âáH@ÂáH@¢áH@áH@EÂ@Â?
+=žQìB|ffBxffBtffBpffBlffBhffBdffB`ffB\ffBXffBTffBPffBLffBHffBDffB@ffB<ffB8ffB4ffB0ffB,ffB(ffB$ffB ffB
+ffBffBffBffB
+ffBffBffB ffAøÌÍAðÌÍAèÌÍAàÌÍAØÌÍAÐÌÍAÈÌÍAÀÌÍAžÌÍA°ÌÍAšÌÍA ÌÍAÌÍAÌÍAÌÍAÌÍAqAaAQAAA1A!AA@ã33@Ã33@£33@33@Fff@ff?ÌÍ=ÌÌÍB|p€Bxp€Btp€Bpp€Blp€Bhp€Bdp€B`p€B\p€BXp€BTp€BPp€BLp€BHp€BDp€B@p€B<p€B8p€B4p€B0p€B,p€B(p€B$p€B p€B
+p€Bp€Bp€Bp€B
+p€Bp€Bp€B p€AøáHAðáHAèáHAàáHAØáHAÐáHAÈáHAÀáHAžáHA°áHAšáHA áHAáHAáHAáHAáHAqÂAaÂAQÂAAÂA1ÂA!ÂAÂAÂ@ã
+@Ã
+@£
+@
+@G
+=@
+=?{=áG®B|záBxzáBtzáBpzáBlzáBhzáBdzáB`záB\záBXzáBTzáBPzáBLzáBHzáBDzáB@záB<záB8záB4záB0záB,záB(záB$záB záB
+záBzáBzáBzáB
+záBzáBzáB záAøõÃAðõÃAèõÃAàõÃAØõÃAÐõÃAÈõÃAÀõÃAžõÃA°õÃAšõÃA õÃAõÃAõÃAõÃAõÃAqë
+Aaë
+AQë
+AAë
+A1ë
+A!ë
+Aë
+Aë
+@ã×
+@Ã×
+@£×
+@×
+@G®@®?\)=õÂB|
+Bx
+Bt
+Bp
+Bl
+Bh
+Bd
+B`
+B\
+BX
+BT
+BP
+BL
+BH
+BD
+B@
+B<
+B8
+B4
+B0
+B,
+B(
+B$
+B 
+B
+
+B
+B
+B
+B
+
+B
+B
+B 
+Aù
+=Añ
+=Aé
+=Aá
+=AÙ
+=AÑ
+=AÉ
+=AÁ
+=A¹
+=A±
+=A©
+=A¡
+=A
+=A
+=A
+=A
+=Ar{Ab{AR{AB{A2{A"{A{A{@ä(ö@Ä(ö@€(ö@(ö@HQì@Qì?£×>
+žB|\Bx\Bt\Bp\Bl\Bh\Bd\B`\B\\BX\BT\BP\BL\BH\BD\B@\B<\B8\B4\B0\B,\B(\B$\B \B
+\B\B\B\B
+\B\B\B \Aù
+žAñ
+žAé
+žAá
+žAÙ
+žAÑ
+žAÉ
+žAÁ
+žA¹
+žA±
+žA©
+žA¡
+žA
+žA
+žA
+žA
+žAr=qAb=qAR=qAB=qA2=qA"=qA=qA=q@äzá@Äzá@€zá@zá@HõÃ@õÃ?ë
+>\)B|BxBtBpBlBhBdB`B\BXBTBPBLBHBDB@B<B8B4B0B,B(B$B B
+BBBB
+BBB Aù33Añ33Aé33Aá33AÙ33AÑ33AÉ33AÁ33A¹33A±33A©33A¡33A33A33A33A33ArffAbffARffABffA2ffA"ffAffAff@äÌÍ@ÄÌÍ@€ÌÍ@ÌÍ@I@	?33>B|£×Bx£×Bt£×Bp£×Bl£×Bh£×Bd£×B`£×B\£×BX£×BT£×BP£×BL£×BH£×BD£×B@£×B<£×B8£×B4£×B0£×B,£×B(£×B$£×B £×B
+£×B£×B£×B£×B
+£×B£×B£×B £×AùG®AñG®AéG®AáG®AÙG®AÑG®AÉG®AÁG®A¹G®A±G®A©G®A¡G®AG®AG®AG®AG®Ar\Ab\AR\AB\A2\A"\A\A\@å
+ž@Å
+ž@¥
+ž@
+
+ž@J=q@
+=q?zá>#×
+B|®Bx®Bt®Bp®Bl®Bh®Bd®B`®B\®BX®BT®BP®BL®BH®BD®B@®B<®B8®B4®B0®B,®B(®B$®B ®B
+®B®B®B®B
+®B®B®B ®Aù\)Añ\)Aé\)Aá\)AÙ\)AÑ\)AÉ\)AÁ\)A¹\)A±\)A©\)A¡\)A\)A\)A\)A\)AržRAbžRARžRABžRA2žRA"žRAžRAžR@åp€@Åp€@¥p€@
+p€@JáH@
+áH?Â>.{B|žRBxžRBtžRBpžRBlžRBhžRBdžRB`žRB\žRBXžRBTžRBPžRBLžRBHžRBDžRB@žRB<žRB8žRB4žRB0žRB,žRB(žRB$žRB žRB
+žRBžRBžRBžRB
+žRBžRBžRB žRAùp€Añp€Aép€Aáp€AÙp€AÑp€AÉp€AÁp€A¹p€A±p€A©p€A¡p€Ap€Ap€Ap€Ap€AráHAbáHARáHABáHA2áHA"áHAáHAáH@åÂ@ÅÂ@¥Â@
+Â@K
+@
+
+?
+>>8QìB|ÂBxÂBtÂBpÂBlÂBhÂBdÂB`ÂB\ÂBXÂBTÂBPÂBLÂBHÂBDÂB@ÂB<ÂB8ÂB4ÂB0ÂB,ÂB(ÂB$ÂB ÂB
+ÂBÂBÂBÂB
+ÂBÂBÂB ÂAù
+Añ
+Aé
+Aá
+AÙ
+AÑ
+AÉ
+AÁ
+A¹
+A±
+A©
+A¡
+A
+A
+A
+A
+As
+=Ac
+=AS
+=AC
+=A3
+=A#
+=A
+=A
+=@æ{@Æ{@Š{@{@L(ö@
+(ö?Qì>B\B|ÌÍBxÌÍBtÌÍBpÌÍBlÌÍBhÌÍBdÌÍB`ÌÍB\ÌÍBXÌÍBTÌÍBPÌÍBLÌÍBHÌÍBDÌÍB@ÌÍB<ÌÍB8ÌÍB4ÌÍB0ÌÍB,ÌÍB(ÌÍB$ÌÍB ÌÍB
+ÌÍBÌÍBÌÍBÌÍB
+ÌÍBÌÍBÌÍB ÌÍAùAñAéAáAÙAÑAÉAÁA¹A±A©A¡AAAAAs33Ac33AS33AC33A333A#33A33A33@æff@Æff@Šff@ff@LÌÍ@
+ÌÍ?>LÌÍB|×
+Bx×
+Bt×
+Bp×
+Bl×
+Bh×
+Bd×
+B`×
+B\×
+BX×
+BT×
+BP×
+BL×
+BH×
+BD×
+B@×
+B<×
+B8×
+B4×
+B0×
+B,×
+B(×
+B$×
+B ×
+B
+×
+B×
+B×
+B×
+B
+×
+B×
+B×
+B ×
+Aù®Añ®Aé®Aá®AÙ®AÑ®AÉ®AÁ®A¹®A±®A©®A¡®A®A®A®A®As\)Ac\)AS\)AC\)A3\)A#\)A\)A\)@æžR@ÆžR@ŠžR@žR@Mp€@
+p€?áH>W
+=B|áHBxáHBtáHBpáHBláHBháHBdáHB`áHB\áHBXáHBTáHBPáHBLáHBHáHBDáHB@áHB<áHB8áHB4áHB0áHB,áHB(áHB$áHB áHB
+áHBáHBáHBáHB
+áHBáHBáHB áHAùÂAñÂAéÂAáÂAÙÂAÑÂAÉÂAÁÂA¹ÂA±ÂA©ÂA¡ÂAÂAÂAÂAÂAs
+Ac
+AS
+AC
+A3
+A#
+A
+A
+@ç
+=@Ç
+=@§
+=@
+=@N{@{?(ö>aG®B|ë
+Bxë
+Btë
+Bpë
+Blë
+Bhë
+Bdë
+B`ë
+B\ë
+BXë
+BTë
+BPë
+BLë
+BHë
+BDë
+B@ë
+B<ë
+B8ë
+B4ë
+B0ë
+B,ë
+B(ë
+B$ë
+B ë
+B
+ë
+Bë
+Bë
+Bë
+B
+ë
+Bë
+Bë
+B ë
+Aù×
+Añ×
+Aé×
+Aá×
+AÙ×
+AÑ×
+AÉ×
+AÁ×
+A¹×
+A±×
+A©×
+A¡×
+A×
+A×
+A×
+A×
+As®Ac®AS®AC®A3®A#®A®A®@ç\)@Ç\)@§\)@\)@NžR@žR?p€>k
+B|õÃBxõÃBtõÃBpõÃBlõÃBhõÃBdõÃB`õÃB\õÃBXõÃBTõÃBPõÃBLõÃBHõÃBDõÃB@õÃB<õÃB8õÃB4õÃB0õÃB,õÃB(õÃB$õÃB õÃB
+õÃBõÃBõÃBõÃB
+õÃBõÃBõÃB õÃAùë
+Añë
+Aéë
+Aáë
+AÙë
+AÑë
+AÉë
+AÁë
+A¹ë
+A±ë
+A©ë
+A¡ë
+Aë
+Aë
+Aë
+Aë
+As×
+Ac×
+AS×
+AC×
+A3×
+A#×
+A×
+A×
+@ç®@Ç®@§®@®@O\)@\)?žR>uÂB}  By  Bu  Bq  Bm  Bi  Be  Ba  B]  BY  BU  BQ  BM  BI  BE  BA  B=  B9  B5  B1  B-  B)  B%  B!  B
+  B  B  B  B
+  B	  B  B  Aú  Aò  Aê  Aâ  AÚ  AÒ  AÊ  AÂ  Aº  A²  Aª  A¢  A  A  A  A  At  Ad  AT  AD  A4  A$  A  A  @è  @È  @š  @  @P  @  ?   >  B}
+=By
+=Bu
+=Bq
+=Bm
+=Bi
+=Be
+=Ba
+=B]
+=BY
+=BU
+=BQ
+=BM
+=BI
+=BE
+=BA
+=B=
+=B9
+=B5
+=B1
+=B-
+=B)
+=B%
+=B!
+=B
+
+=B
+=B
+=B
+=B
+=B	
+=B
+=B
+=Aú{Aò{Aê{Aâ{AÚ{AÒ{AÊ{AÂ{Aº{A²{Aª{A¢{A{A{A{A{At(öAd(öAT(öAD(öA4(öA$(öA(öA(ö@èQì@ÈQì@šQì@Qì@P£×@£×?¡G®>
+
+žB}{By{Bu{Bq{Bm{Bi{Be{Ba{B]{BY{BU{BQ{BM{BI{BE{BA{B={B9{B5{B1{B-{B){B%{B!{B
+{B{B{B{B
+{B	{B{B{Aú(öAò(öAê(öAâ(öAÚ(öAÒ(öAÊ(öAÂ(öAº(öA²(öAª(öA¢(öA(öA(öA(öA(öAtQìAdQìATQìADQìA4QìA$QìAQìAQì@è£×@È£×@š£×@£×@QG®@G®?¢\>=qB}
+žBy
+žBu
+žBq
+žBm
+žBi
+žBe
+žBa
+žB]
+žBY
+žBU
+žBQ
+žBM
+žBI
+žBE
+žBA
+žB=
+žB9
+žB5
+žB1
+žB-
+žB)
+žB%
+žB!
+žB
+
+žB
+žB
+žB
+žB
+
+žB	
+žB
+žB
+žAú=qAò=qAê=qAâ=qAÚ=qAÒ=qAÊ=qAÂ=qAº=qA²=qAª=qA¢=qA=qA=qA=qA=qAtzáAdzáATzáADzáA4záA$záAzáAzá@èõÃ@ÈõÃ@šõÃ@õÃ@Që
+@ë
+?£×
+>\)B}(öBy(öBu(öBq(öBm(öBi(öBe(öBa(öB](öBY(öBU(öBQ(öBM(öBI(öBE(öBA(öB=(öB9(öB5(öB1(öB-(öB)(öB%(öB!(öB
+(öB(öB(öB(öB
+(öB	(öB(öB(öAúQìAòQìAêQìAâQìAÚQìAÒQìAÊQìAÂQìAºQìA²QìAªQìA¢QìAQìAQìAQìAQìAt£×Ad£×AT£×AD£×A4£×A$£×A£×A£×@éG®@ÉG®@©G®@G®@R\@\?¥
+ž>záB}33By33Bu33Bq33Bm33Bi33Be33Ba33B]33BY33BU33BQ33BM33BI33BE33BA33B=33B933B533B133B-33B)33B%33B!33B
+33B33B33B33B
+33B	33B33B33AúffAòffAêffAâffAÚffAÒffAÊffAÂffAºffA²ffAªffA¢ffAffAffAffAffAtÌÍAdÌÍATÌÍADÌÍA4ÌÍA$ÌÍAÌÍAÌÍ@é@É@©@@S33@33?Šff>B}=qBy=qBu=qBq=qBm=qBi=qBe=qBa=qB]=qBY=qBU=qBQ=qBM=qBI=qBE=qBA=qB==qB9=qB5=qB1=qB-=qB)=qB%=qB!=qB
+=qB=qB=qB=qB
+=qB	=qB=qB=qAúzáAòzáAêzáAâzáAÚzáAÒzáAÊzáAÂzáAºzáA²záAªzáA¢záAzáAzáAzáAzáAtõÃAdõÃATõÃADõÃA4õÃA$õÃAõÃAõÃ@éë
+@Éë
+@©ë
+@ë
+@S×
+@×
+?§®>žRB}G®ByG®BuG®BqG®BmG®BiG®BeG®BaG®B]G®BYG®BUG®BQG®BMG®BIG®BEG®BAG®B=G®B9G®B5G®B1G®B-G®B)G®B%G®B!G®B
+G®BG®BG®BG®B
+G®B	G®BG®BG®Aú\Aò\Aê\Aâ\AÚ\AÒ\AÊ\AÂ\Aº\A²\Aª\A¢\A\A\A\A\Au
+žAe
+žAU
+žAE
+žA5
+žA%
+žA
+žA
+ž@ê=q@Ê=q@ª=q@=q@Tzá@zá?šõÂ>£×
+B}QìByQìBuQìBqQìBmQìBiQìBeQìBaQìB]QìBYQìBUQìBQQìBMQìBIQìBEQìBAQìB=QìB9QìB5QìB1QìB-QìB)QìB%QìB!QìB
+QìBQìBQìBQìB
+QìB	QìBQìBQìAú£×Aò£×Aê£×Aâ£×AÚ£×AÒ£×AÊ£×AÂ£×Aº£×A²£×Aª£×A¢£×A£×A£×A£×A£×AuG®AeG®AUG®AEG®A5G®A%G®AG®AG®@ê\@Ê\@ª\@\@U
+ž@
+ž?ª=q>šõÃB}\)By\)Bu\)Bq\)Bm\)Bi\)Be\)Ba\)B]\)BY\)BU\)BQ\)BM\)BI\)BE\)BA\)B=\)B9\)B5\)B1\)B-\)B)\)B%\)B!\)B
+\)B\)B\)B\)B
+\)B	\)B\)B\)AúžRAòžRAêžRAâžRAÚžRAÒžRAÊžRAÂžRAºžRA²žRAªžRA¢žRAžRAžRAžRAžRAup€Aep€AUp€AEp€A5p€A%p€Ap€Ap€@êáH@ÊáH@ªáH@áH@UÂ@Â?«
+>®{B}ffByffBuffBqffBmffBiffBeffBaffB]ffBYffBUffBQffBMffBIffBEffBAffB=ffB9ffB5ffB1ffB-ffB)ffB%ffB!ffB
+ffBffBffBffB
+ffB	ffBffBffAúÌÍAòÌÍAêÌÍAâÌÍAÚÌÍAÒÌÍAÊÌÍAÂÌÍAºÌÍA²ÌÍAªÌÍA¢ÌÍAÌÍAÌÍAÌÍAÌÍAuAeAUAEA5A%AA@ë33@Ë33@«33@33@Vff@ff?¬ÌÍ>³33B}p€Byp€Bup€Bqp€Bmp€Bip€Bep€Bap€B]p€BYp€BUp€BQp€BMp€BIp€BEp€BAp€B=p€B9p€B5p€B1p€B-p€B)p€B%p€B!p€B
+p€Bp€Bp€Bp€B
+p€B	p€Bp€Bp€AúáHAòáHAêáHAâáHAÚáHAÒáHAÊáHAÂáHAºáHA²áHAªáHA¢áHAáHAáHAáHAáHAuÂAeÂAUÂAEÂA5ÂA%ÂAÂAÂ@ë
+@Ë
+@«
+@
+@W
+>@
+>?®{>žQìB}záByzáBuzáBqzáBmzáBizáBezáBazáB]záBYzáBUzáBQzáBMzáBIzáBEzáBAzáB=záB9záB5záB1záB-záB)záB%záB!záB
+záBzáBzáBzáB
+záB	záBzáBzáAúõÃAòõÃAêõÃAâõÃAÚõÃAÒõÃAÊõÃAÂõÃAºõÃA²õÃAªõÃA¢õÃAõÃAõÃAõÃAõÃAuë
+Aeë
+AUë
+AEë
+A5ë
+A%ë
+Aë
+Aë
+@ë×
+@Ë×
+@«×
+@×
+@W®@®?¯\)>œp€B}
+By
+Bu
+Bq
+Bm
+Bi
+Be
+Ba
+B]
+BY
+BU
+BQ
+BM
+BI
+BE
+BA
+B=
+B9
+B5
+B1
+B-
+B)
+B%
+B!
+B
+
+B
+B
+B
+B
+
+B	
+B
+B
+Aû
+=Aó
+=Aë
+=Aã
+=AÛ
+=AÓ
+=AË
+=AÃ
+=A»
+=A³
+=A«
+=A£
+=A
+=A
+=A
+=A
+=Av{Af{AV{AF{A6{A&{A{A{@ì(ö@Ì(ö@¬(ö@(ö@XQì@Qì?°£×>Â\B}\By\Bu\Bq\Bm\Bi\Be\Ba\B]\BY\BU\BQ\BM\BI\BE\BA\B=\B9\B5\B1\B-\B)\B%\B!\B
+\B\B\B\B
+\B	\B\B\Aû
+žAó
+žAë
+žAã
+žAÛ
+žAÓ
+žAË
+žAÃ
+žA»
+žA³
+žA«
+žA£
+žA
+žA
+žA
+žA
+žAv=qAf=qAV=qAF=qA6=qA&=qA=qA=q@ìzá@Ìzá@¬zá@zá@XõÂ@õÂ?±ë
+>Ç®B}ByBuBqBmBiBeBaB]BYBUBQBMBIBEBAB=B9B5B1B-B)B%B!B
+BBBB
+B	BBAû33Aó33Aë33Aã33AÛ33AÓ33AË33AÃ33A»33A³33A«33A£33A33A33A33A33AvffAfffAVffAFffA6ffA&ffAffAff@ìÌÍ@ÌÌÍ@¬ÌÍ@ÌÍ@Y@?³33>ÌÌÍB}£×By£×Bu£×Bq£×Bm£×Bi£×Be£×Ba£×B]£×BY£×BU£×BQ£×BM£×BI£×BE£×BA£×B=£×B9£×B5£×B1£×B-£×B)£×B%£×B!£×B
+£×B£×B£×B£×B
+£×B	£×B£×B£×AûG®AóG®AëG®AãG®AÛG®AÓG®AËG®AÃG®A»G®A³G®A«G®A£G®AG®AG®AG®AG®Av\Af\AV\AF\A6\A&\A\A\@í
+ž@Í
+ž@­
+ž@
+ž@Z=q@=q?Žzá>Ñë
+B}®By®Bu®Bq®Bm®Bi®Be®Ba®B]®BY®BU®BQ®BM®BI®BE®BA®B=®B9®B5®B1®B-®B)®B%®B!®B
+®B®B®B®B
+®B	®B®B®Aû\)Aó\)Aë\)Aã\)AÛ\)AÓ\)AË\)AÃ\)A»\)A³\)A«\)A£\)A\)A\)A\)A\)AvžRAfžRAVžRAFžRA6žRA&žRAžRAžR@íp€@Íp€@­p€@p€@ZáH@áH?µÂ>×
+=B}žRByžRBužRBqžRBmžRBižRBežRBažRB]žRBYžRBUžRBQžRBMžRBIžRBEžRBAžRB=žRB9žRB5žRB1žRB-žRB)žRB%žRB!žRB
+žRBžRBžRBžRB
+žRB	žRBžRBžRAûp€Aóp€Aëp€Aãp€AÛp€AÓp€AËp€AÃp€A»p€A³p€A«p€A£p€Ap€Ap€Ap€Ap€AváHAfáHAVáHAFáHA6áHA&áHAáHAáH@íÂ@ÍÂ@­Â@Â@[
+@
+?·
+>>Ü(öB}ÂByÂBuÂBqÂBmÂBiÂBeÂBaÂB]ÂBYÂBUÂBQÂBMÂBIÂBEÂBAÂB=ÂB9ÂB5ÂB1ÂB-ÂB)ÂB%ÂB!ÂB
+ÂBÂBÂBÂB
+ÂB	ÂBÂBÂAû
+Aó
+Aë
+Aã
+AÛ
+AÓ
+AË
+AÃ
+A»
+A³
+A«
+A£
+A
+A
+A
+A
+Aw
+=Ag
+=AW
+=AG
+=A7
+=A'
+=A
+=A
+=@î{@Î{@®{@{@\(ö@
+(ö?žQì>áG®B}ÌÍByÌÍBuÌÍBqÌÍBmÌÍBiÌÍBeÌÍBaÌÍB]ÌÍBYÌÍBUÌÍBQÌÍBMÌÍBIÌÍBEÌÍBAÌÍB=ÌÍB9ÌÍB5ÌÍB1ÌÍB-ÌÍB)ÌÍB%ÌÍB!ÌÍB
+ÌÍBÌÍBÌÍBÌÍB
+ÌÍB	ÌÍBÌÍBÌÍAûAóAëAãAÛAÓAËAÃA»A³A«A£AAAAAw33Ag33AW33AG33A733A'33A33A33@îff@Îff@®ff@ff@\ÌÍ@
+ÌÍ?¹>æffB}×
+By×
+Bu×
+Bq×
+Bm×
+Bi×
+Be×
+Ba×
+B]×
+BY×
+BU×
+BQ×
+BM×
+BI×
+BE×
+BA×
+B=×
+B9×
+B5×
+B1×
+B-×
+B)×
+B%×
+B!×
+B
+×
+B×
+B×
+B×
+B
+×
+B	×
+B×
+B×
+Aû®Aó®Aë®Aã®AÛ®AÓ®AË®AÃ®A»®A³®A«®A£®A®A®A®A®Aw\)Ag\)AW\)AG\)A7\)A'\)A\)A\)@îžR@ÎžR@®žR@žR@]p€@
+p€?ºáH>ë
+B}áHByáHBuáHBqáHBmáHBiáHBeáHBaáHB]áHBYáHBUáHBQáHBMáHBIáHBEáHBAáHB=áHB9áHB5áHB1áHB-áHB)áHB%áHB!áHB
+áHBáHBáHBáHB
+áHB	áHBáHBáHAûÂAóÂAëÂAãÂAÛÂAÓÂAËÂAÃÂA»ÂA³ÂA«ÂA£ÂAÂAÂAÂAÂAw
+Ag
+AW
+AG
+A7
+A'
+A
+A
+@ï
+=@Ï
+=@¯
+=@
+=@^{@
+{?Œ(ö>ð£×B}ë
+Byë
+Buë
+Bqë
+Bmë
+Bië
+Beë
+Baë
+B]ë
+BYë
+BUë
+BQë
+BMë
+BIë
+BEë
+BAë
+B=ë
+B9ë
+B5ë
+B1ë
+B-ë
+B)ë
+B%ë
+B!ë
+B
+ë
+Bë
+Bë
+Bë
+B
+ë
+B	ë
+Bë
+Bë
+Aû×
+Aó×
+Aë×
+Aã×
+AÛ×
+AÓ×
+AË×
+AÃ×
+A»×
+A³×
+A«×
+A£×
+A×
+A×
+A×
+A×
+Aw®Ag®AW®AG®A7®A'®A®A®@ï\)@Ï\)@¯\)@\)@^žR@
+žR?œp€>õÂB}õÃByõÃBuõÃBqõÃBmõÃBiõÃBeõÃBaõÃB]õÃBYõÃBUõÃBQõÃBMõÃBIõÃBEõÃBAõÃB=õÃB9õÃB5õÃB1õÃB-õÃB)õÃB%õÃB!õÃB
+õÃBõÃBõÃBõÃB
+õÃB	õÃBõÃBõÃAûë
+Aóë
+Aëë
+Aãë
+AÛë
+AÓë
+AËë
+AÃë
+A»ë
+A³ë
+A«ë
+A£ë
+Aë
+Aë
+Aë
+Aë
+Aw×
+Ag×
+AW×
+AG×
+A7×
+A'×
+A×
+A×
+@ï®@Ï®@¯®@®@_\)@\)?ŸžR>úáHB~  Bz  Bv  Br  Bn  Bj  Bf  Bb  B^  BZ  BV  BR  BN  BJ  BF  BB  B>  B:  B6  B2  B.  B*  B&  B"  B
+  B  B  B  B  B
+  B  B  Aü  Aô  Aì  Aä  AÜ  AÔ  AÌ  AÄ  AŒ  AŽ  A¬  A€  A  A  A  A  Ax  Ah  AX  AH  A8  A(  A  A  @ð  @Ð  @°  @  @`  @   ?À  ?   B~
+=Bz
+=Bv
+=Br
+=Bn
+=Bj
+=Bf
+=Bb
+=B^
+=BZ
+=BV
+=BR
+=BN
+=BJ
+=BF
+=BB
+=B>
+=B:
+=B6
+=B2
+=B.
+=B*
+=B&
+=B"
+=B
+
+=B
+=B
+=B
+=B
+=B
+
+=B
+=B
+=Aü{Aô{Aì{Aä{AÜ{AÔ{AÌ{AÄ{AŒ{AŽ{A¬{A€{A{A{A{A{Ax(öAh(öAX(öAH(öA8(öA((öA(öA(ö@ðQì@ÐQì@°Qì@Qì@`£×@ £×?ÁG®?\B~{Bz{Bv{Br{Bn{Bj{Bf{Bb{B^{BZ{BV{BR{BN{BJ{BF{BB{B>{B:{B6{B2{B.{B*{B&{B"{B
+{B{B{B{B{B
+{B{B{Aü(öAô(öAì(öAä(öAÜ(öAÔ(öAÌ(öAÄ(öAŒ(öAŽ(öA¬(öA€(öA(öA(öA(öA(öAxQìAhQìAXQìAHQìA8QìA(QìAQìAQì@ð£×@Ð£×@°£×@£×@aG®@!G®?Â\?
+žB~
+žBz
+žBv
+žBr
+žBn
+žBj
+žBf
+žBb
+žB^
+žBZ
+žBV
+žBR
+žBN
+žBJ
+žBF
+žBB
+žB>
+žB:
+žB6
+žB2
+žB.
+žB*
+žB&
+žB"
+žB
+
+žB
+žB
+žB
+žB
+žB
+
+žB
+žB
+žAü=qAô=qAì=qAä=qAÜ=qAÔ=qAÌ=qAÄ=qAŒ=qAŽ=qA¬=qA€=qA=qA=qA=qA=qAxzáAhzáAXzáAHzáA8záA(záAzáAzá@ðõÂ@ÐõÂ@°õÂ@õÂ@aë
+@!ë
+?Ã×
+?®B~(öBz(öBv(öBr(öBn(öBj(öBf(öBb(öB^(öBZ(öBV(öBR(öBN(öBJ(öBF(öBB(öB>(öB:(öB6(öB2(öB.(öB*(öB&(öB"(öB
+(öB(öB(öB(öB(öB
+(öB(öB(öAüQìAôQìAìQìAäQìAÜQìAÔQìAÌQìAÄQìAŒQìAŽQìA¬QìA€QìAQìAQìAQìAQìAx£×Ah£×AX£×AH£×A8£×A(£×A£×A£×@ñG®@ÑG®@±G®@G®@b\@"\?Å
+ž?
+=qB~33Bz33Bv33Br33Bn33Bj33Bf33Bb33B^33BZ33BV33BR33BN33BJ33BF33BB33B>33B:33B633B233B.33B*33B&33B"33B
+33B33B33B33B33B
+33B33B33AüffAôffAìffAäffAÜffAÔffAÌffAÄffAŒffAŽffA¬ffA€ffAffAffAffAffAxÌÍAhÌÍAXÌÍAHÌÍA8ÌÍA(ÌÍAÌÍAÌÍ@ñ@Ñ@±@@c33@#33?Æff?
+ÌÍB~=qBz=qBv=qBr=qBn=qBj=qBf=qBb=qB^=qBZ=qBV=qBR=qBN=qBJ=qBF=qBB=qB>=qB:=qB6=qB2=qB.=qB*=qB&=qB"=qB
+=qB=qB=qB=qB=qB
+=qB=qB=qAüzáAôzáAìzáAäzáAÜzáAÔzáAÌzáAÄzáAŒzáAŽzáA¬záA€záAzáAzáAzáAzáAxõÃAhõÃAXõÃAHõÃA8õÃA(õÃAõÃAõÃ@ñë
+@Ñë
+@±ë
+@ë
+@c×
+@#×
+?Ç®?\)B~G®BzG®BvG®BrG®BnG®BjG®BfG®BbG®B^G®BZG®BVG®BRG®BNG®BJG®BFG®BBG®B>G®B:G®B6G®B2G®B.G®B*G®B&G®B"G®B
+G®BG®BG®BG®BG®B
+G®BG®BG®Aü\Aô\Aì\Aä\AÜ\AÔ\AÌ\AÄ\AŒ\AŽ\A¬\A€\A\A\A\A\Ay
+žAi
+žAY
+žAI
+žA9
+žA)
+žA
+žA	
+ž@ò=q@Ò=q@²=q@=q@dzá@$zá?ÈõÂ?ë
+B~QìBzQìBvQìBrQìBnQìBjQìBfQìBbQìB^QìBZQìBVQìBRQìBNQìBJQìBFQìBBQìB>QìB:QìB6QìB2QìB.QìB*QìB&QìB"QìB
+QìBQìBQìBQìBQìB
+QìBQìBQìAü£×Aô£×Aì£×Aä£×AÜ£×AÔ£×AÌ£×AÄ£×AŒ£×AŽ£×A¬£×A€£×A£×A£×A£×A£×AyG®AiG®AYG®AIG®A9G®A)G®AG®A	G®@ò\@Ò\@²\@\@e
+ž@%
+ž?Ê=p?záB~\)Bz\)Bv\)Br\)Bn\)Bj\)Bf\)Bb\)B^\)BZ\)BV\)BR\)BN\)BJ\)BF\)BB\)B>\)B:\)B6\)B2\)B.\)B*\)B&\)B"\)B
+\)B\)B\)B\)B\)B
+\)B\)B\)AüžRAôžRAìžRAäžRAÜžRAÔžRAÌžRAÄžRAŒžRAŽžRA¬žRA€žRAžRAžRAžRAžRAyp€Aip€AYp€AIp€A9p€A)p€Ap€A	p€@òáH@ÒáH@²áH@áH@eÂ@%Â?Ë
+
+?
+=B~ffBzffBvffBrffBnffBjffBfffBbffB^ffBZffBVffBRffBNffBJffBFffBBffB>ffB:ffB6ffB2ffB.ffB*ffB&ffB"ffB
+ffBffBffBffBffB
+ffBffBffAüÌÍAôÌÍAìÌÍAäÌÍAÜÌÍAÔÌÍAÌÌÍAÄÌÍAŒÌÍAŽÌÍA¬ÌÍA€ÌÍAÌÍAÌÍAÌÍAÌÍAyAiAYAIA9A)AA	@ó33@Ó33@³33@33@fff@&ff?ÌÌÍ?B~p€Bzp€Bvp€Brp€Bnp€Bjp€Bfp€Bbp€B^p€BZp€BVp€BRp€BNp€BJp€BFp€BBp€B>p€B:p€B6p€B2p€B.p€B*p€B&p€B"p€B
+p€Bp€Bp€Bp€Bp€B
+p€Bp€Bp€AüáHAôáHAìáHAäáHAÜáHAÔáHAÌáHAÄáHAŒáHAŽáHA¬áHA€áHAáHAáHAáHAáHAyÂAiÂAYÂAIÂA9ÂA)ÂAÂA	Â@ó
+@Ó
+@³
+@
+@g
+>@'
+>?Î{?
+(öB~záBzzáBvzáBrzáBnzáBjzáBfzáBbzáB^záBZzáBVzáBRzáBNzáBJzáBFzáBBzáB>záB:záB6záB2záB.záB*záB&záB"záB
+záBzáBzáBzáBzáB
+záBzáBzáAüõÃAôõÃAìõÃAäõÃAÜõÃAÔõÃAÌõÃAÄõÃAŒõÃAŽõÃA¬õÃA€õÃAõÃAõÃAõÃAõÃAyë
+Aië
+AYë
+AIë
+A9ë
+A)ë
+Aë
+A	ë
+@ó×
+@Ó×
+@³×
+@×
+@g®@'®?Ï\)?
+žRB~
+Bz
+Bv
+Br
+Bn
+Bj
+Bf
+Bb
+B^
+BZ
+BV
+BR
+BN
+BJ
+BF
+BB
+B>
+B:
+B6
+B2
+B.
+B*
+B&
+B"
+B
+
+B
+B
+B
+B
+B
+
+B
+B
+Aý
+=Aõ
+=Aí
+=Aå
+=AÝ
+=AÕ
+=AÍ
+=AÅ
+=Aœ
+=Aµ
+=A­
+=A¥
+=A
+=A
+=A
+=A
+
+=Az{Aj{AZ{AJ{A:{A*{A{A
+{@ô(ö@Ô(ö@Ž(ö@(ö@hQì@(Qì?Ð£×?!G®                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                XTENSION= 'IMAGE   '           / IMAGE extension                                BITPIX  =                  -32 / number of bits per data pixel                  NAXIS   =                    3 / number of data axes                            NAXIS1  =                   91 / length of data axis 1                          NAXIS2  =                   91 / length of data axis 2                          NAXIS3  =                    1 / length of data axis 3                          PCOUNT  =                    0 / required keyword; must = 0                     GCOUNT  =                    1 / required keyword; must = 1                     BZERO   =   0.000000000000E+00 / Pixel Value Offset                             BSCALE  =   1.000000000000E+00 / Pixel Value Scale                              END                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B| XB{Ýf¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B|ÔB{äþBy	¬Bv5@¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B|
+OB{óyBy(Bv<ÖBsaBp¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B|+ÊB|õBy&£BvKQBsp Bp®Bm¹\Bjäð¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B|:FB|pBy5
+BvYÍBs~{Bp£)BmÇ×BjìBh4Be<È¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B|HÁB|
+ëByCBvhHBsöBp±¥BmÖSBjûBh¯BeD^Bbi
+B_ ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B|W<B|-gByRBvvÃBsrBpÀ BmäÎBk	}Bh.+BeRÙBbwB_6B\ÀäBYìx¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B|e·B|;âBy`Bv
+?Bs©íBpÎBmóJBkøBh<ŠBeaUBbB_ª±B\Ï_BYôBWŒBTDP¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B|t3B|J]Byo
+BvºBsžhBpÝBnÅBk&sBhK"BeoÐBb~B_¹-B\ÝÛBZBW'7BTKæBQpBN(¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B|®B|XØBy}Bv¢5BsÆãBpëBn@Bk4ïBhYBe~KBb¢úB_ÇšB\ìVBZBW5³BTZaBQBN£ŸBKÈlBHô ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B|)B|gTByBv°°BsÕ_Bpú
+Bn
+»BkCjBhhBeÇBb±uB_Ö#B\úÒBZBWD.BThÝBQBN²9BKÖçBHûBF DBCKØ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B|¥B|uÑByBv¿.BsãÜBqBn-9BkQçBhvBeDBb¿òB_ä¡B]	OBZ-ýBWR¬BTwZBQBNÀ·BKåeBI
+BF.ÁBCSpB@x
+B=£²¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B|®B|LByšûBvÍ©BsòWBqBn;ŽBk`bBh
+Be©¿BbÎmB_ó
+B]ÊBZ<yBWa'BT
+ÕBQªBNÏ2BKóàBIBF==BCaëB@B=«HB:ÏöB7û¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B|ŒB|ÇBy·uBvÜ$Bt ÓBq%BnJ/BknÞBhBež:BbÜéB`B]&EBZJôBWo¢BTQBQžÿBNÝ­BL\BI'
+BFKžBCpgB@B=¹ÃB:ÞqB8 B5'ÎB2Sb¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B|ËB|¡BByÅñBvêBtMBq3üBnX«Bk}YBh¢BeÆ¶BbëdB`B]4ÁBZYoBW~
+BT¢ÌBQÇzBNì)BL×BI5
+BFZ4BC~âB@£B=È?B:ìíB8B56IB2ZøB/ŠB,«:¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B|ÙB|¯ŸByÔlBvùBt
+ÉBqBwBng%BkÔBh°BeÕ1BbùßB`
+B]C<BZgêBWBT±GBQÕõBNú€BLRBIDBFh¯BC]B@²
+B=ÖºB:ûhB8 B5DÅB2isB/!B,²ÐB)×~B'¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B|è
+B|Ÿ9ByâçBwBt,DBqPòBnu¡BkOBhŸýBeã¬Bc[B`-	B]Q·BZvfBWBT¿ÂBQäqBO	BL-ÍBIR|BFw*BCÙB@ÀB=å5B;	äB8.B5S@B2wïB/B,ÁKB)åùB'
+šB$/VB!Zê¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B|öB|ÌµByñcBwBt:¿Bq_nBn
+BkšÊBhÍyBeò'BcÕB`;B]`3BZáBW©BTÎ>BQòìBOBL<IBI`÷BF
+¥BCªTB@ÏB=ó±B;_B8=
+B5aŒB2jB/«B,ÏÇB)ôuB'#B$=ÑB!bB
+.B²Â¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B}B|Û0ByÿÞBw$BtI;BqméBnBk·FBhÛôBf ¢Bc%QB`IÿB]n­BZ\BWž
+BTÜ¹BRgBO&BLJÄBIorBF!BCžÏB@Ý}B>,B;&ÚB8KB5p7B2åB/¹B,ÞBB*ðB''B$LMB!pûB
+©BºXBßB
+¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B}B|é«BzYBw3BtW¶Bq|eBn¡BkÅÁBhêoBf
+Bc3ÌB`XzB]})BZ¡×BWÆ
+BTë4BRãBO4BLY?BI}îBF¢BCÇJB@ëùB>§B;5UB8ZB5~²B2£aB/ÈB,ìœB*lB'6B$ZÈB!wB
+€%BÈÓBíB0B6ÞBbr¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B}!úB|ø&Bz
+ÕBwABtf1BqàBn¯BkÔ=BhøëBf
+BcBGB`föB]€BZ°RBWÕBTù¯BR
+]BOC
+BLg»BIiBF±BCÕÆB@útB>"B;CÑB8hB5-B2±ÜB/ÖB,û9B*çB'DB$iDB!òB
+² B×OBûýB «BEYBjB
+¶B
+ºJ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B}0uB}€Bz+RBwP Btt¯Bq]BnŸ
+BkâºBihBf,BcPÅB`usB]!BZŸÐBWã~BU,BR,ÛBOQBLv7BIæBF¿BCäCBAñB>- B;RNB8vüB5«B2ÀYB/åB-	¶B*.dB'SB$wÁB!oB
+Á
+BåÌB
+zB/)BS×Bx
+B
+3B
+ÁâBæB$¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B}>ñB}Bz9ÍBw^|Bt*Bq§ØBnÌBkñ5BiãBf:Bc_@B`ïB]šBZÍKBWñùBUšBR;VBO`BL³BI©aBFÎBCòŸBAmB><B;`ÉB8
+xB5ª&B2ÎÔB/óB-1B*<ßB'aB$<B!ªëB
+ÏBôGBöB=€BbRBB
+«¯B
+Ð]Bõ
+BºB>hAþÓø¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B}MlB}#BzHIBwl÷Bt¥Bq¶TBnÛBkÿ°Bi$_BfI
+Bcm»B`jB]·BZÛÇBX uBU%#BRIÑBOnBL.BI·ÜBFÜBD9BA%çB>JB;oEB8óB5ž¡B2ÝPB0þB-&¬B*K[B'p	B$·B!¹fB
+ÞB
+ÃB'qBLBpÎB|B
+º*B
+ÞÙBB(5BLãAþã#Aù,Aóš¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B}[çB}2BzVÄBw{rBt !BqÄÏBné}Bl,Bi2ÚBfWBc|7B` åB]ÅBZêBBXðBU3BRXMBO|ûBL¡©BIÆXBFëBDŽBA4cB>YB;}¿B8¢nB5Ç
+B2ëËB0yB-5(B*YÖB'~B$£3B!ÇáB
+ìB
+>B5ìBZBIB£÷B
+ÈŠB
+íTBB6±B[_Aÿ AùIwAóÔAíÜ1Aè3X¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B}jbB}@Bze?BwîBt®BqÓJBn÷ùBl
+§BiAUBffBc²B`¯`B]ÔBZøœBX
+kBUBBRfÈBOwBL°%BIÔÓBFùBD
+0BABÞB>gB;;B8°éB5ÕB2úFB0
+õB-C£B*hQB' B$±®B!Ö\B
+û
+B
+¹BDgBiBÄB²sB
+×!B
+ûÏB ~BE,BiÚAÿ
+AùfnAó¯ËAíù'AèBAâáAÜã¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B}xÝB}O
+BzsºBwhBtœBqáÆBotBl+"BiOÑBftBc-B`œÜB]âB[8BX+çBUPBRuCBOòBLŸ BIãOBGýBD,«BAQYB>vB;¶B8¿dB5äB3ÁB0-oB-R
+B*vÍB'{B$À)B!äØB	B
+.4BRãBwB?BÀîB
+åB
+
+KB.ùBS§BxVAÿ:AùeAóÌÂAî
+Aè_{Aâš×AÜò4A×;AÑž¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B}YB}]Bz5BwŠäBtËBqð@BoïBl9Bi^LBfúBc§©B`ÌWB]ñB[ŽBX:bBU_BR¿BOšmBLÍBIñÊBGxBD;'BA_ÕB>B;©1B8ÍàB5òB3<B0;ëB-`B*
+GB'©öB$Î¥B!óSBB
+<°Ba^B
+Bª»BÏiB
+ôB
+ÆB=tBb#BÑAÿVÿAù [Aóé·Aî3Aè|rAâÅÎAÝ+A×XAÑ¡äAËëAAÆBh¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B}ÔB}lBz±Bwµ_BtÚ
+BqþŒBo#jBlHBilÇBfvBc¶$B`ÚÒB]ÿB[$/BXHÝBUmBR:BO¶èBLÛBJ EBG$óBDI¢BAnPB>ÿB;·­B8Ü[B6	B3%žB0JfB-oB*ÃB'žqB$ÝB"ÎB&}B
+K+BoÙBB¹6BÝäBB
+'ABKïBpBLAÿsõAùœQAô®AîP
+AègAââÅAÝ,"A×u~AÑŸÛAÌ7AÆQAÀñAºò¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B}€OB}z~Bz,BwÃÚBtèBr
+7Bo1åBlVBi{BBfðBcÄB`éNB^
+üB[2ªBXWYBU|BR µBOÅdBLêBJÀBG3oBDX
+BA|ËB>¡zB;Æ(B8ê×B6
+B343B0XáB-}B*¢>B'ÆìB$ëB"IB4÷B
+YŠB~UB£BÇ±Bì`BB
+5ŒBZkBB£ÇAÿëAùÚHAô#¥AîmAè¶^Aâÿ»AÝIA×uAÑÛÒAÌ%.AÆnAÀ·çA»DAµJ¡A¯¡È¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B}²ÊB}ùBz­§BwÒVBt÷Br²Bo@aBleBiœBf®lBcÓB`÷ÈB^
+wB[A&BXeÔBUBR¯1BOÓßBLøBJ
+<BGAêBDfBAGB>¯õB;Ô£B8ùRB6
+ B3B¯B0g]B-
+B*°¹B'ÕhB$úB"
+ÄBCsB
+h!BÏB±~BÖ-BúÛBB
+D8BhæBB²CAÿ­âAù÷?Aô@AîøAèÓUAã
+±AÝfA×¯kAÑøÇAÌB%AÆAÀÔÞA»
+;AµgA¯°ôA©úQA€Qx¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B}ÁFB}vBzŒ$BwàÓBuBr*0BoNÞBlsBi;BfŒéBcáBaFB^*ôB[O¢BXtQBU BRœ®BOâ\BM
+BJ+¹BGPgBDuBAÄB>ŸrB;ã!B9ÏB6,}B3Q,B0uÚB-B*¿7B'ãåB%B"-BBQðB
+vBMB¿ûBä©B	XB.B
+RµBwcBBÀÀAÿÊÜAú9Aô]AîŠóAèðOAã9¬AÝ	A×ÌeAÒÂAÌ_AÆš{AÀñÙA»;6AµA¯ÍïAªKA€`šAªA,¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B}ÏÁB}¥òBzÊ BwïNBuüBr8«Bo]YBlBiŠ¶BfËdBcðBaÁB^9oB[^
+BXÌBU§zBRÌ)BOðØBMBJ:4BG^ãBDBAš?B>ÌîB;ñB9JB6:ùB3_§B0UB-©B*Í²B'òaB%B";œB`kB
+
+B©ÈBÎvBó%BÓB<B
+a0B
+ßBªBÏ;AÿçÓAú10AôzAîÃéAé
+FAãV£AÝÿA×é\AÒ2¹AÌ|AÆÅrAÁÏA»X+Aµ¡A¯êæAª4BA€}AÆûAXAYµA°Ü¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B}Þ=B}ŽmBzÙBwýÊBu"xBrG&BokÔBlBiµ1BfÙàBcþBa#<B^GëB[lBXGBUµöBRÚ€BOÿRBM$BJH°BGm^BD
+BA¶»B>ÛiB< B9$ÆB6ItB3n"B0ÑB-·B*Ü-B( ÜB%%B"J9BnçB
+BžCBÜòB B&NBJýB
+o«BYB¹BÝ·B eAúN&AôAîàßAé*=AãsAÝŒöAØSAÒO¯AÌ
+AÆâiAÁ+ÅA»u"AµŸA°ÛAªQ9A€AãòA-OAv«AÀA	eA`¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B}ìžB}ÂèBzçBx
+EBu0óBrU¢BozPBlþBiÃ¬Bfè[Bd
+	Ba1žB^VfB[{BXÃBUÄqBRéBP
+ÎBM2|BJW*BG{ÙBD BAÅ6B>éäB<B93AB6WïB3|B0¡LB-ÅúB*ê©B(WB%4B"XŽB}bB
+¢BÆ¿BëmBB4ÊBYxB
+~&B¢ÕBÇBì1B àAúk
+AôŽyAîýÖAéG3AãAÝÙíAØ#IAÒlŠAÌ¶AÆÿ_AÁHŒA»AµÛuA°$ÒAªn/A€·A éAJFA¢AÜÿA&[AožAyr)An y¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B}û3B}ÑdBzöBxÀBu?oBrd
+BoËBl­zBiÒ(BföÖBdBa@3B^dáB[BX®>BUÒìBR÷BP
+IBM@÷BJeŠBGTBD¯BAÓ±B>ø`B<
+B9AŒB6fkB3B0¯ÇB-ÔvB*ù$B(
+ÒB%BB"g/BÝB
+°BÕ:BùéB
+BCEBgóB
+¢B±PBÕþBú­B [AúAôÑpAïÍAéd)Aã­AÝöãAØ@?AÒAÌÒùAÇ
+VAÁe³A»¯AµølA°AÉAª%A€ÔA
+ßAg;A°AùöACRA¯Ay¬An>ÑAbÑAWÛ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B~	®B}ßßB{Bx)<BuMêBrrBoGBl»õBià£BgRBd* BaN®B^s\B[
+BXŒ¹BUáhBSBP*ÄBMOsBJt!BGÏBDœ~BAâ,B?ÚB<+B9P8B6tæB3B0ŸCB-âñB+B(,NB%PüB"uªBYB
+¿BãµBdB-BQÁBvoB
+
+B¿ËBäzB	(B -ÖAú¥
+AôîgAï7ÃAé AãÊ}AÞÙAØ]6AÒŠAÌïïAÇ9MAÁ©A»ÌA¶cA°^¿Aªš
+A€ñyA:ÕA2AÍAëA`IA©ŠAyæAnxŸAc
+yAW3AL0íA@ß=¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B~*B}îZB{Bx7·Bu\eBrBo¥ÂBlÊpBiïBgÍBd8{Ba]*B^ØB[ŠBXË4BUïãBSBP9@BM]îBJBG§KBDËùBAð§B?VB<:B9^²B6aB3šB0ÌŸB-ñlB+B(:ÉB%_wB"&BšÔB
+ÍBò1BßB;B`<BêB
+©BÎGBòõB£B <RAúÂAõ
+]AïTºAéAãçsAÞ0ÐAØz-AÒÃAÍ
+æAÇVCAÁA»èýA¶2YA°{¶AªÅA¥oAWÌA¡)Aê
+A3âA}?AÆAzñAn²«AcEeAWØ ALjÛA@ýA5OA*>¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B~&¥B}üÕB{!BxF2BujàBrBoŽ=BlØìBiýBg"HBdF÷Bak¥B^SB[µBXÙ°BUþ^BS#
+BPG»BMliBJBGµÆBDÚtBAÿ#B?#ÑB<HB9m.B6ÜB3¶B0Û9B-ÿèB+$B(IDB%móB"¡B·OB
+ÛþB ¬B%ZBJ	Bn·BeB
+žBÜÂBpB&B JÍAúÞ÷Aõ(TAïq±Aé»
+AäjAÞMÇAØ#AÒàAÍ)ÝAÇs9AÁŒAŒóA¶OOA°­Aªâ	A¥+fAtÃAŸA|APÙA5AãAzYÞAnìAcSAX
+AL€ÇAA7A5Ê=A*\÷A
+ï±A¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B~5 B~
+QB{/ÿBxT­Buy\Br
+BoÂžBlçgBj
+Bg0ÄBdUrBaz B^ÏB[Ã}BXè+BV
+ÚBS1BPV6BMzäBJBGÄABDèðBB
+B?2LB<VûB9{©B6 WB3ÅB0éŽB.bB+3B(WÀB%|nB"¡
+BÅËB
+êyB'B3ÖBXB}2B¡áB
+ÆBë=BìB4B YHAúûíAõEJAï§AéØAä!aAÞjœAØŽAÒýwAÍFÓAÇ0AÁÙAŒ"éA¶lFA°µ£AªþÿA¥H]A¹AÛA$sAmÏA·,A AzËAo&
+Ac¹@AXKúALÞµAAqoA6)A*äA)AŒYAO@ùúÆ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B~CB~ÌB{>zBxc)Bu×Br¬
+BoÑ4BlõâBjBg??BdcíBaB^­JB[ÑøBXö§BVUBS@BPd²BM`BJ®BGÒŒBD÷kBB
+B?@ÈB<evB9$B6®ÓB3ÓB0ø/B.
+ÞB+AB(f:B%éB"¯BÔFB
+øôB
+£BBQBfÿB®B°\B
+Õ
+Bù¹B
+gBCB gÄAûäAõbAAï«AéôúAä>WAÞŽAØÑAÓmAÍcÊAÇ­'AÁöAŒ?àA¶=A°ÒA«öA¥eSA®¯Aø
+AAiAÆAÔ#A
+AzÍžAo`rAcó-AX
+çAM¢AA«\A6>A*ÐÑAcAöFA@ú7v@ã\ë@Ì¹¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B~RB~(IB{LøBxqŠBuTBr»Boß±Bm_Bj)BgMŒBdrjBaB^»ÇB[àvBY$BV)ÒBSNBPs/BMÝBJŒBGá:BEèBB*B?OEB<sóB9¢B6œPB3áþB1­B.+[B+P	B(tžB%fB"ŸBâÃB
+rB, BPÎBu}B+BŸÙB
+ãB	6B,äBQB vAAû5ßAõ;AïÈAêõAä[QAÞ€®AØî
+AÓ7hAÍÅAÇÊ!AÂ~AŒ\ÛA¶Š7A°ïA«8ñA¥MAËªAA^cA§ÁAñ
+A:zA{­AohAd-"AX¿ÜAMRAAåQA6x
+A+
+ÆAA0;AÂõ@ú«a@ãÐÕ@ÌöJ@¶¿@x^¿  ¿  ¿  ¿  ¿  ¿  B~`B~6ÅB{[sBx!Bu€ÐBrÉ~Boî,BmÛBj7Bg\7BdæBa¥B^ÊBB[îñBYBV8NBS\üBPªBMŠYBJËBGïµBEdBB9B?]ÀB<nB9§
+B6ËËB3ðzB1(B.9ÖB+^
+B(3B%§áB"ÌBñ>B
+ìB:B_JBøBšŠBÍUB
+òB	±B;`B`B ŒAûRÕAõ2AïåAê.ëAäxHAÞÁ¥AÙ
+AÓT^AÍ»AÇçAÂ0uAŒyÑA¶Ã.A±
+A«UçA¥DAè¡A1ýA{ZAÄ·AAWqA{AAoÔUAdgAXùÊAMAB>A6±ùA+D³A×nAj(Aüã@û:@äD¯@Íj$@¶@µ@Ú@dnD¿  ¿  ¿  ¿  B~o
+B~E?B{iîBxBu³KBr×ùBoüšBm!VBjFBgj³BdaBaŽB^ØŸB[ýlBY"BVFÉBSkwBP&BMŽÔBJÙBGþ1BE"ßBBGB?l<B<êB9µB6ÚFB3þõB1#£B.HRB+m B(®B%¶]B"Û
+Bÿ¹B
+$hBIBmÄBsB·"BÛÐB
+ ~B	%-BIÛBnB 8AûoÌAõ¹)Að
+AêKâAä?AÞÞAÙ'øAÓqUAÍº±AÈAÂMkAŒÈA¶à%A±)A«rÞA¥Œ;A ANôAQAá­A+
+AtgA{{ApBAd üAY3·AMÆqABY,A6ëæA+~ A [A€A	6Ð@û@äž@ÍÝþ@·s@ (è@N]@dç€@72@	ëÊ¿  ¿  B~}B~S»B{xiBxBuÁÆBræuBp
+#Bm/ÑBjTBgy.BdÜBaÂB^ç9B\
+çBY0BVUDBSyòBP¡BMÃOBJçþBH
+¬BE1ZBBV	B?z·B<eB9ÄB6èÂB4
+pB12
+B.VÍB+{{B( *B%ÄØB"éB 5B
+2ãBWB|@B îBÅBêKB
+úB	3šBXVB}B ¡³AûÂAõÖAð|AêhÙAä²5AÞûAÙDïAÓKAÍ×šAÈ!AÂjaAŒ³ŸA¶ýA±FxA«ÕA¥Ù1A "AkëAµGAþ€AHA]A{µtApH/AdÚéAYm€AN ^ABA7%ÓA+žA KHAÞA	pœ@üï@å,d@ÎQÙ@·wM@ Â@Â7@eÏX@8A@
+e)?¹`%?=¥@B~
+B~b7B{äBx«BuÐABrôïBpBm>MBjbûBg©Bd¬XBaÑB^õŽB\cBY?BVc¿BSnBP­
+BMÑÊBJöyBH'BE?ÖBBdB?2B<­áB9ÒB6÷=B4ìB1@B.eHB+öB(®¥B%ÓSB"øB 
+°B
+A^Bf
+B»B¯iBÔBøÆB
+
+tB	B#BfÒBB °.Aû©¹AõóAð<rAê
+ÏAäÏ,AßAÙaåAÓ«BAÍôAÈ=ûAÂXAŒÐµA·A±cnA«¬ËA¥ö(A ?
+AáAÒ>AAd÷A®TA{ïaAp
+Ae×AY§AN:KABÍA7_ÀA+ò{A 
+5AðA	ªª@üzÉ@å >@ÎÅ³@·ë(@¡@6@f·
+@9õ@
+LÞ?»/??Ÿ=
+f$¿  B{{BxºBuÞŒBskBp(BmLÇBjqvBg%BdºÓBaßB_0B\(ÞBYMBVr;BSéBP»BMàFBKôBH)¢BENQBBrÿB?®B<Œ\B9á
+B7¹B4*gB1OB.sÄB+rB(œ B%áÎB#}B ++B
+OÚBtB6BœåBâBAB
++ðB	PBuLBûB ŸªAûÆ¯Aö
+AðYiAê¢ÅAäì"Aß5AÙ~ÜAÓÈ9AÎAÈZòAÂ€OAŒí«A·7A±eA«ÉÁAŠ
+A \{A¥ØAï5A8AîAËKA|)OApŒ	AeNÃAYá~ANt9ACóA7­A,,hA ¿"AQÝA	ä@üî£@æ@Ï9@ž_@¡w@©ì@gÁ@9é©@
+4?Œþö?C)=ES?;ò¿
+¿  ¿  BuæSBsçBp6Bm[CBjñBg€BdÉNBaíýB_«B\7YBY\BV¶BS¥dBPÊBMîÁBKoBH8
+BE\ÌBBzB?Š)B<Ê×B9ïB74B48âB1]B.?B+ŠíB(ËB%ðJB#øB 9ŠB
+^UBB§²BÌ`BñBœB
+:kB	_BÈBšvB Í$AûãŠAö-Aðv_Aê¿ŒAå	AßRuAÙÒAÓå/AÎ.AÈwéAÂÁEAœ
+¢A·SÿA±[A«æžAŠ0A yqAÂÎA
++AUAåAèAA|c<ApõöAe±AZkAN®%AC@àA7ÓA,fUA ùAÊA
+
+@ýb}@æò@Ï­g@žÒÜ@¡øQ@
+Æ@hu@:Ñ^@
+
+G?ŸÎ_?FÈa=@Y<°ø¿  ¿  ¿  ¿  Bp>,BmiÀBjmBg³
+Bd×ÊBaüxB_!'B\EÖBYjBV2BS³áBPØBMý=BK!ìBHFBEkHBB÷B?Ž¥B<ÙSB9þB7"°B4G_B1l
+B.»B+µjB(ÚB%þÆB##uB H#B
+lÑBB¶.BÚÜBÿB$9B
+HçB	mBDB¶òB Û¡Aü AöIûAðXAêÜµAå&AßonAÙžËAÔ'AÎKAÈáAÂÞ>Aœ'A·p÷A±ºTA¬±AŠM
+A jAßÇA)#ArA»ÝA:A|-Aq/çAeÂ¢AZU\ANèACzÑA8
+A, FA!3AÅ»A
+Xu@ýÖ_@æûÔ@Ð!I@¹FŸ@¢l3@š@in9@;¹"@
+?Àç?Jgr=º=2¿  ¿  ¿  ¿  ¿  ¿  BjBgÁBdæEBb
+ôB_/¢B\TPBYxÿBV®BSÂ\BPç
+BN
+¹BK0gBHUBEyÄBBrB?Ã B<çÏB:
+}B71+B4UÚB1zB.7B+ÃåB(èB&
+BB#1ðB VB
+{MBûBÄ©BéWBB2ŽB
+WcB	|B ¿BÅnB ê
+Aü
+AöfòAð°OAêù«AåCAßeAÙÕÁAÔ
+AÎh{AÈ±×AÂû4AœDA·îA±×KA¬ §AŠjA ³aAüœAFAwAØÓA"0A|×AqiÔAeüAZIAO"ACŽŸA8GyA,Ú3A!líAÿšA
+c@þJ:@ço¯@Ð#@¹º@¢à
+@@jUî@< Ö@ë¿?ÂmQ?ND=¹F=L1¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  BdíÜBboB_>
+B\bÌBYzBV¬(BSÐ×BPõBN4BK>âBHcBE?BB¬íB?ÑB<öJB:øB7?§B4dUB1B.­²B+Ò`B(÷B&œB#@kB eB
+ÈB®vBÓ%B÷ÓB
+BA/B
+eÞB	B¯;BÓéB øAü:AöèAðÍEAë¢Aå_ÿAß©[AÙòžAÔ<AÎ
+qAÈÎÎAÃ+AœaA·ªäA±ôAA¬=AŠûA ÐWAŽAcA¬mAõÊA?'A}Aq£ÂAf6|AZÉ6AO[ðACî«A8fA- A!ŠÛA9A
+ÌO@þŸ@çã@Ñý@º.r@£Sç@y\@k=¢@=@Ós?Ä<¹?Q¥=Ö
+Ê=¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B_EŽB\qGBYõBVº€BSßRBQ BN(¯BKM^BHr
+BEºBB»iB?àB=ÅB:)tB7N"B4rÐB1B.Œ-B+àÛB)B&*8B#NçB sB
+CBŒòBá BNB*ýBO«B
+tYB	Bœ¶BâdBAüWAö ßAðê;Aë3Aå|õAßÆRAÚ¯AÔY
+AÎ¢hAÈëÅAÃ5!Aœ~~A·ÇÛA²7A¬ZAŠ£ñA íNA6«AAÉdAÁA\
+A}JôAqÝ®AfpiA[$AOÞAD(A8»RA-N
+A!àÈAsA
+=@ÿ1î@èWc@Ñ|Ø@º¢L@£ÇÁ@í6@l%V@>p?@»(?Æ
+!?UCç=ó|V=ü§¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  BYBVÉBSíÍBQ|BN7*BK[ØBHBE¥6BBÉäB?îB=AB:7ïB7\B4LB1¥úB.ÊšB+ïWB)B&8³B#]bB B
+Š¿BËmBðBÊB9xB^&B
+ÕB	§BÌ1BðßBAütyAöœÕAñ2AëPAåëAßãHAÚ,¥AÔvAÎ¿_AÉ»AÃRAœuA·äÑA²..A¬wAŠÀçA¡
+DAS¡AþAæ[A/·AyA}áArAfªVA[=AOÏËADbA8õ@A-úA"ŽA­oA
+@*@ÿ¥È@èË=@Ñð²@»'@€;@a@m
+
+@?Wô@¢Ü?ÇÛ?Xâž>9r=Œó5¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  BSõeBQ øBNEŠBKjUBHBE³±BBØ`B?ýB=!œB:FkB7kB4ÈB1ŽvB.Ù%B+ýÓB)"B&G0B#kÞB B
+µ;BÙéBþB#FBGôBl£B
+QB	µÿBÚ®Bÿ\B$
+AüqAöÚÎAñ$+AëmAå¶äAà AAÚIAÔúAÎÜWAÉ%ŽAÃoAœžmAžÊA²K'A¬AŠÝàA¡'=ApA¹öASAL°A
+A}ŸÓArQAfäGA[wAP	ŒADvA9/1A-ÁìA"TŠAç`A
+zA 
+Õ@é?@Òd@»	@€¯~@Ôó@môÐ@@?ž@¡?É«?\Ê>µž=ÙéÁ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  BNM=BKxÐBH~BEÂ-BBæÛB@
+B=08B:TçB7yB4CB1ÂòB.ç B,
+NB)0ýB&U«B#zYB B
+Ã¶BèdB
+B1ÁBVpB{
+B
+ÌB	Ä{Bé)B
+×B2Aü®hAö÷ÅAñA!Aë~AåÓÛAà
+7AÚfAÔ¯ñAÎùMAÉBªAÃAœÕdAž
+ÁA²h
+A¬±zAŠú×A¡D3AAÖíA IAiŠA³A}øÀArzAg
+5A[°ïAPC©ADÖdA9i
+A-ûØA"A!NA
+ŽA FÂ@é²ù@ÒØn@»ýã@¥#X@HÍ@nÜ@A'm@rV?Ëz|?` >%0þ=öàN¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  BH¥BEÐšBBõVB@B=>³B:caB7B4¬¿B1ÑmB.öB,ÊB)?xB&d&B#ÕB ­B
+Ò1BöàBB@<BdëBB
+®HB	ÒöB÷€B
+SBAAüË_A÷ŒAñ^Aë§uAåðÑAà:.AÚAÔÌçAÏDAÉ_¡AÃšýAœòZAž;·A²
+A¬ÎqA§ÍA¡a*AªAóãA=@AAÏùA~2¬ArÅgAgX!A[êÜAP}AEQA9£
+A.5ÆA"ÈA[:A
+íõA °@ê&Ô@ÓLH@Œqœ@¥2@Œ§@oÄ8@B!@Z
+?ÍIå?c¿m>3¬E>	ëm¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  BBüíB@(B=M.B:qÝB7B4»9B1ßèB/B,)EB)MóB&r¢B#PB »þB
+à­B[B*	BNžBsfBB
+ŒÃB	áqB B*ÎBO|AüèUA÷1±Añ{AëÄlAæ
+ÈAàW%AÚ AÔéÞAÏ3;AÉ|AÃÅôAŸQAžX­A²¢
+A¬ëgA§4ÄA¡~!AÇ}AÚAZ7A£AìðA~lArÿTAgA\$ÉAP·AEJ>A9ÜùA.o³A#mA(A
+'âA º@ê®@ÓÀ"@Œå@Š
+
+@0@p«í@BöÖ@AŸ?ÏN?g^>>B'>fŽ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B=TÅB:XB7¥B4ÉµB1îcB/B,7ÀB)\oB&
+B#¥ËB ÊzB
+ï(BÖB8
+B]3BáBŠB
+Ë>B	ïìBB9IB]øAýKA÷NšAñAëáaAæ*¿Aàt
+AÚœxAÕÕAÏP1AÉAÃâëAŸ,GAžu€A²¿A­]A§QºA¡AätA-ÑAw-AÀA
+	çA~ŠAs9AAgËüA\^¶APñqAE+A:åA.© A#<[AÏA
+aÏA ô@ë@Ô3ý@œYr@Š~æ@€\@q¡@CÞ@)s?Ðè·?jý>P¢Ó>&áû¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B7¬B4Ø1B1üßB/!B,F<B)jêB&B#ŽHB ØöB
+ý€B"SBGBk¯B^Bµ
+B
+ÙºB	þiB#BGÅBltAý"DA÷k¡AñŽýAëþZAæG·AàAÚÚqAÕ#ÎAÏm*AÉ¶AÃÿãAŸI@AžA²ÛùA­%VA§n³A¡žAlAJÉA&AÝA
+&ßA~àxAss2AhíA\§AQ+bAEŸ
+A:P×A.ãA#vKA	A
+ÁA.{@ëk@Ô§ß@œÍT@ŠòÉ@>@r{e@DÆO@7?Òž@?n#>_>5]C¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B2vB/0	B,T·B)yfB&B#ÂÂB çqB
+
+ B0ÎBU|Bz+BÙBÃB
+è6B
+
+äB1BVABzïAý?;A÷AñÑôAìQAæd­Aà®
+AÚ÷gAÕ@ÃAÏ!AÉÓ~AÄ
+ÚAŸf7Až¯A²øðA­BMA§©A¡ÕA
+cAg¿A±
+AúyA
+CÖAeAs­ Ah?ÚA\ÒAQeOAEø	A:ÄA/
+~A#°9ABóA
+Õ­Ahh@ëöE@Õº@ŸA/@§f£@@sc@E®@øì?Ô©?r:õ>mb>CØ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B,\NB)áB&¬B#Ñ>B õìB
+B?IBcøBŠB­TBÒB
+ö±B
+_B@BdŒBjAý\1A÷¥AñîëAì8GAæ€AàËAÛ]AÕ]ºAÏ§AÉðsAÄ9ÑAŸ-AžÌA³çA­_CA§š A¡ñýA;YA¶AÎAoA
+`ÌATSAsç
+AhyÇA]
+AQ<AF1öA:Ä±A/WkA#ê&A|àA
+A¢U@ìj@Õ@Ÿµ@§Ú~@ÿò@tJÎ@F·@à ?ÖW?uÙÅ>|€>RSÍ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B&Ž&B#ß¹B!gB
+)BMÄBrrB!B»ÐBà~B
+,B
+)ÛBNBs7BæAýy(A÷Â
+Aò
+áAìU>AæAàç÷AÛ1TAÕz±AÏÄ
+AÊ
+jAÄVÇAŸ #AžéA³2ÝA­|:A§ÅA¢óAXPA¡­Aë	A4fA
+}ÃA?At úAh³ŽA]FnAQÙ)AFkäA:þA/XA$$A¶ÍA
+IAÜB@ìÝù@Ön@¿(ã@šNX@sÌ@u2@G}k@ÈT?Ø&z?yx>
+Hv>`Ï¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B!
+þB
+7B\?BîB¥BÊJBîùB
+šB
+8VB]B³BŠaAý
+A÷ß{Aò(ØAìr5Aæ»AáîAÛNKAÕ§AÏáAÊ*aAÄsœAŸœA¹wA³OÓA­1A§âA¢+êAuGAŸ£A AQ]A
+¹AÈ,AtZçAhí¡A]\ARAF¥ÐA;8A/ËFA$^ AðºA
+uA/@íQÓ@ÖwH@¿œ@šÂ2@ç§@v7@He @°	?Ùõã?}i>>oJ\¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  Bc×BjBŽBØÇBýuB
+"#B
+FÒBkB/BŽÝAý³A÷üsAòEÐAì-AæØAá!çAÛkCAÕŽ AÏýýAÊGYAÄ¶AŸÚA¹#oA³lÌA­¶)A§ÿ
+A¢HãA?AÛA$ùAnUA
+·²AAtØAi'A]ºMARMAFßÂA;r|A06A$ñA*¬A
+œfAP @íÅµ@Öë+@À@©6@[@wü@ILä@Í?ÛÅl?[=>Ä>>}Å€¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B»¯BçBB
+ðB
+0B
+UMByûBªBÃYAýÐAøjAòbÇAì¬#AæõAá>ÝAÛ:AÕÑAÐóAÊdPAÄ­­AŸ÷	A¹@fA³ÃA­ÓAš
+|A¢eÙA¯5AøAAïALA
+Ô©A
+AtÎÅAiaA]ô:ARôAG¯A;¬iA0?$A$ÑÞAdA
+÷SA@î9@×_@Àz@©©ï@Ïc@wé°@J4@
+?ÝÕ?*Š>â> v¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  BB
+?B
+cÈBwB­%BÑÓAýíAø6aAòœAìÉAçwAá[ÓAÛ¥0AÕîAÐ7êAÊGAÄÊ£A¿ A¹]]A³Š¹A­ðAš9sA¢ÏAÌ,AA^åAšCA
+ñA:üAu²AimA^.'ARÀáAGSA;æVA0yA%
+ËAA1@AÃú@î­j@×Òß@ÀøT@ª
+É@C>@xÑe@K
+M@
+g6?ßd=?ú>¢?
+>^¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  B
+k_BòB» BàOAþ	ûAøSWAòŽAìæAç/mAáxÊAÛÂ'AÖ
+AÐTàAÊ=AÄçA¿0÷A¹zSA³Ã°A®
+
+AšViA¢ÆAé#A2A{ÜAÅ9AAWòAuBAiÕYA^hARúÏAGA< CA0²þA%EžAØsAk-Aýè@ï!D@ØF¹@Ál.@ª£@·@y¹@L@
+Nê?á3Š?
+Éx>©}*>œ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  BÃ7BîÊAþ&ñAøpNAò¹«AíAçLdAáÁAÛß
+AÖ(zAÐq×AÊ»3AÅA¿MíA¹JA³à§A®*Ašs`A¢ŒœAAOvAÓAâ/A+AtéAu|AjGA^¢AS4»AGÇvA<Z1A0ìëA%¥A`A¥A7Õ@ï@Øº@Áà@«}@*ò@z Í@Lë¶@6?ã?á>°ºÍ>Ùb¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  Aþ6AøFAòÖ£Aí  Açi]Aá²¹AÛüAÖEsAÐÏAÊØ,AÅ!A¿jåA¹ŽBA³ýA®FüAšYA¢ÙµA#AloAµËAÿ(AH
+AáAu¶}AjI8A^ÛòASn­AHgA<!A1&ÜA%¹ALQAß
+AqÆ@ð	@Ù.u@ÂSë@«y_@Ô@{@MÓ{@ 
+c?äÒ?hk>·øñ>£¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  AòåÏAí<öAçSAáÏ°AÜ
+AÖbiAÐ«ÆAÊõ#AÅ>A¿ÜA¹Ñ9AŽA®còAš­OA¢ö¬A@	AeAÒÂA
+Ae{A®ØAuðjAj%A_ßASšAH;TA<ÎA1`ÉA%óA>AùA«³@ð|Û@Ù¢P@ÂÇÅ@«í9@¯@|pG@N»/@!?æ¢?7Ó>¿6>ªT©¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  AçAáìŠAÜ6AÖ`AÐÈœAËAÅ[vA¿€ÓA¹î/AŽ7A®éAšÊEA£¢A\ÿAŠ\Aï¹A9ArAËÏAv*XAjœA_OÌASâAHuAA=üA1¶A&-qAÀ+ARåAå @ððµ@Ú*@Ã;@¬a@@}Wú@O¢ä@!íÌ?èqj?<>Æt6>±J¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  AÜE/AÖVAÐå³AË/AÅxmA¿ÁÉAº
+&AŽTA®ßAšç<A£0AyõAÃRA
+¯AV
+AiAèÅAvdEAjöÿA_ºAT
+tAH¯.A=AéA1Ô£A&g^AúAÓA@ñd@Ú@Ã¯y@¬Ôî@úb@~?¯@P@"Õ?ê@Ó?Ö€>Í±Ú>žÏï¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  AÐôßAËLAÅcA¿ÞÀAº(
+AŽqyA®ºÖA©3A£MAìAàIA)¥AsAŒ_AŒAv2Ak0íA_Ã§ATVaAHé
+A={ÖA2A&¡KA4AÆÀAYz@ñØi@ÚýÞ@Ä#S@­HÈ@n=@'d@QrM@#œ6?ì<?Š
+>Ôï~>À
+¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  AÅ€A¿ûžAºEAŽrA®×ÏA©!+A£jA³åAýAAFAûAÙWA"ŽAvØ#AkjÝA_ýATSAI#
+A=µÇA2HA&Û<AmöA ±Ak@òLK@ÛqÁ@Ä5@­Œª@â@@RZ@$€ú?íßÅ?u>Ü-¢>ÇK5¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  AºTAAŽ«hA®ôÅA©>"A£AÐÛA8AcA¬ñAöNA?«AwAk€ËA`7
+ATÊ?AI\úA=ïµA2oA')A§äA:AÍX@òÀ&@Ûå@Å
+@®0
+@Uù@{n@SAÆ@%®?ï¯.?Dÿ>ãkE>ÎÚ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  A¯ñA©[A£€uAíÒA7/AAÉèAEA\¡AwKýAkÞžA`qsAU-AIçA>)¡A2Œ\A'OAáÑAtAF@ó4 @ÜYu@Å~ê@®€_@ÉÓ@ïI@T)z@&tc?ñ~?i>êšé>ÕÆ}¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  A£³¡A
+ÈAT%AAæßA0;AyAw
+êAl¥A`«_AU>AIÐÕA>cA2öIA'A
+ŸA®yAA3@ó§Û@ÜÍO@ÅòÄ@¯9@=®@c#@U.@'\?óN ?ãÒ>ñæ>Ý!¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  AcQAºxAÕAM2AAw¿ØAlRA`åLAUxAJ
+ÁA>|A307A'ÂñA
+U«AèeA{ @ôŽ@ÝA*@Æf@¯@±@Öý@Uøã@(CÌ?õ
+i?³:>ù$1>äAÅ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  AAj*A³AwùÈAlAa>AU±øAJD²A>×mA3j'A'üâA
+A"WAµ@ô@Ýµ
+@ÆÚ@¯ÿö@%k@Jß@Và§@)+?öìò?Ã? 1*>ëi¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  AÂ³Ax3¶AlÆpAaY*AUëåAJ~ A?ZA3€A(6ÏA
+ÉA\DAîþ@õq@Þ(æ@ÇN[@°sÏ@D@Ÿº@WÈ\@*E?øŒ[?R,?Ïü>òœ
+¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  AläÉAaAV%ÒAJžA?KGA3ÞA(pŒA
+vA1A(ë@õwK@ÞÀ@ÇÂ5@°çª@
+@2@X°@*úù?úÃ?!?nÍ>ùú®¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  AVD+AJòzA?
+4A4îA(ª©A
+=dAÐ
+AbØ@õë%@ß@È6@±[@ù@Šn@YÄ@+â­?ü[,? ðý?
+
+? )¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  A?£A4QàA(äA
+wTA
+AÊ@ö_@ß}@È©ñ@±Ïg@ôÛ@P@Z@,Êr?þ*µ?¢À?¬°?:û¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  A)óA
+±BACüAÖ¶@öÒâ@ßøW@É
+Ì@²CA@hµ@*@[g=@-²&?ÿú
+?€ï?K?ÙÌ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  AbUA€@÷FŒ@àl1@ÉŠ@²·@Ü@
+@\Nò@.Ú@ äÃ?Š_X?êU?
+x¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  @÷n@àà
+@Ê@³*õ@Pj@
+uß@]6Š@/@Ìx?š.Á?'?q¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  @ÊB2@³Ð@ÄD@
+é¹@^
+[@0iC@Ž,?©þ*?
+'ø?¶B¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  @ þ@]@_@1Q@ñ?«Í³? Ç
+?U¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  @_@28œ@¥?­
+?$eÝ?óç¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  @ý	?¯l
+?(®?
+ž¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ?)ê;?!1¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿  ¿                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              XTENSION= 'IMAGE   '           / IMAGE extension                                BITPIX  =                  -32 / number of bits per data pixel                  NAXIS   =                    3 / number of data axes                            NAXIS1  =                   64 / length of data axis 1                          NAXIS2  =                   64 / length of data axis 2                          NAXIS3  =                    1 / length of data axis 3                          PCOUNT  =                    0 / required keyword; must = 0                     GCOUNT  =                    1 / required keyword; must = 1                     BZERO   =   0.000000000000E+00 / Pixel Value Offset                             BSCALE  =   1.000000000000E+00 / Pixel Value Scale                              END                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             B~
+B~záB~p€B~ffB~\)B~QìB~G®B~=qB~33B~(öB~
+žB~{B~
+=B~  B}õÃB}ë
+B}áHB}×
+B}ÌÍB}ÂB}žRB}®B}£×B}B}\B}
+B}záB}p€B}ffB}\)B}QìB}G®B}=qB}33B}(öB}
+žB}{B}
+=B}  B|õÃB|ë
+B|áHB|×
+B|ÌÍB|ÂB|žRB|®B|£×B|B|\B|
+B|záB|p€B|ffB|\)B|QìB|G®B|=qB|33B|(öB|
+žB|{B|
+=B|  Bz
+BzzáBzp€BzffBz\)BzQìBzG®Bz=qBz33Bz(öBz
+žBz{Bz
+=Bz  ByõÃByë
+ByáHBy×
+ByÌÍByÂByžRBy®By£×ByBy\By
+ByzáByp€ByffBy\)ByQìByG®By=qBy33By(öBy
+žBy{By
+=By  BxõÃBxë
+BxáHBx×
+BxÌÍBxÂBxžRBx®Bx£×BxBx\Bx
+BxzáBxp€BxffBx\)BxQìBxG®Bx=qBx33Bx(öBx
+žBx{Bx
+=Bx  Bv
+BvzáBvp€BvffBv\)BvQìBvG®Bv=qBv33Bv(öBv
+žBv{Bv
+=Bv  BuõÃBuë
+BuáHBu×
+BuÌÍBuÂBužRBu®Bu£×BuBu\Bu
+BuzáBup€BuffBu\)BuQìBuG®Bu=qBu33Bu(öBu
+žBu{Bu
+=Bu  BtõÃBtë
+BtáHBt×
+BtÌÍBtÂBtžRBt®Bt£×BtBt\Bt
+BtzáBtp€BtffBt\)BtQìBtG®Bt=qBt33Bt(öBt
+žBt{Bt
+=Bt  Br
+BrzáBrp€BrffBr\)BrQìBrG®Br=qBr33Br(öBr
+žBr{Br
+=Br  BqõÃBqë
+BqáHBq×
+BqÌÍBqÂBqžRBq®Bq£×BqBq\Bq
+BqzáBqp€BqffBq\)BqQìBqG®Bq=qBq33Bq(öBq
+žBq{Bq
+=Bq  BpõÃBpë
+BpáHBp×
+BpÌÍBpÂBpžRBp®Bp£×BpBp\Bp
+BpzáBpp€BpffBp\)BpQìBpG®Bp=qBp33Bp(öBp
+žBp{Bp
+=Bp  Bn
+BnzáBnp€BnffBn\)BnQìBnG®Bn=qBn33Bn(öBn
+žBn{Bn
+=Bn  BmõÃBmë
+BmáHBm×
+BmÌÍBmÂBmžRBm®Bm£×BmBm\Bm
+BmzáBmp€BmffBm\)BmQìBmG®Bm=qBm33Bm(öBm
+žBm{Bm
+=Bm  BlõÃBlë
+BláHBl×
+BlÌÍBlÂBlžRBl®Bl£×BlBl\Bl
+BlzáBlp€BlffBl\)BlQìBlG®Bl=qBl33Bl(öBl
+žBl{Bl
+=Bl  Bj
+BjzáBjp€BjffBj\)BjQìBjG®Bj=qBj33Bj(öBj
+žBj{Bj
+=Bj  BiõÃBië
+BiáHBi×
+BiÌÍBiÂBižRBi®Bi£×BiBi\Bi
+BizáBip€BiffBi\)BiQìBiG®Bi=qBi33Bi(öBi
+žBi{Bi
+=Bi  BhõÃBhë
+BháHBh×
+BhÌÍBhÂBhžRBh®Bh£×BhBh\Bh
+BhzáBhp€BhffBh\)BhQìBhG®Bh=qBh33Bh(öBh
+žBh{Bh
+=Bh  Bf
+BfzáBfp€BfffBf\)BfQìBfG®Bf=qBf33Bf(öBf
+žBf{Bf
+=Bf  BeõÃBeë
+BeáHBe×
+BeÌÍBeÂBežRBe®Be£×BeBe\Be
+BezáBep€BeffBe\)BeQìBeG®Be=qBe33Be(öBe
+žBe{Be
+=Be  BdõÃBdë
+BdáHBd×
+BdÌÍBdÂBdžRBd®Bd£×BdBd\Bd
+BdzáBdp€BdffBd\)BdQìBdG®Bd=qBd33Bd(öBd
+žBd{Bd
+=Bd  Bb
+BbzáBbp€BbffBb\)BbQìBbG®Bb=qBb33Bb(öBb
+žBb{Bb
+=Bb  BaõÃBaë
+BaáHBa×
+BaÌÍBaÂBažRBa®Ba£×BaBa\Ba
+BazáBap€BaffBa\)BaQìBaG®Ba=qBa33Ba(öBa
+žBa{Ba
+=Ba  B`õÃB`ë
+B`áHB`×
+B`ÌÍB`ÂB`žRB`®B`£×B`B`\B`
+B`záB`p€B`ffB`\)B`QìB`G®B`=qB`33B`(öB`
+žB`{B`
+=B`  B^
+B^záB^p€B^ffB^\)B^QìB^G®B^=qB^33B^(öB^
+žB^{B^
+=B^  B]õÃB]ë
+B]áHB]×
+B]ÌÍB]ÂB]žRB]®B]£×B]B]\B]
+B]záB]p€B]ffB]\)B]QìB]G®B]=qB]33B](öB]
+žB]{B]
+=B]  B\õÃB\ë
+B\áHB\×
+B\ÌÍB\ÂB\žRB\®B\£×B\B\\B\
+B\záB\p€B\ffB\\)B\QìB\G®B\=qB\33B\(öB\
+žB\{B\
+=B\  BZ
+BZzáBZp€BZffBZ\)BZQìBZG®BZ=qBZ33BZ(öBZ
+žBZ{BZ
+=BZ  BYõÃBYë
+BYáHBY×
+BYÌÍBYÂBYžRBY®BY£×BYBY\BY
+BYzáBYp€BYffBY\)BYQìBYG®BY=qBY33BY(öBY
+žBY{BY
+=BY  BXõÃBXë
+BXáHBX×
+BXÌÍBXÂBXžRBX®BX£×BXBX\BX
+BXzáBXp€BXffBX\)BXQìBXG®BX=qBX33BX(öBX
+žBX{BX
+=BX  BV
+BVzáBVp€BVffBV\)BVQìBVG®BV=qBV33BV(öBV
+žBV{BV
+=BV  BUõÃBUë
+BUáHBU×
+BUÌÍBUÂBUžRBU®BU£×BUBU\BU
+BUzáBUp€BUffBU\)BUQìBUG®BU=qBU33BU(öBU
+žBU{BU
+=BU  BTõÃBTë
+BTáHBT×
+BTÌÍBTÂBTžRBT®BT£×BTBT\BT
+BTzáBTp€BTffBT\)BTQìBTG®BT=qBT33BT(öBT
+žBT{BT
+=BT  BR
+BRzáBRp€BRffBR\)BRQìBRG®BR=qBR33BR(öBR
+žBR{BR
+=BR  BQõÃBQë
+BQáHBQ×
+BQÌÍBQÂBQžRBQ®BQ£×BQBQ\BQ
+BQzáBQp€BQffBQ\)BQQìBQG®BQ=qBQ33BQ(öBQ
+žBQ{BQ
+=BQ  BPõÃBPë
+BPáHBP×
+BPÌÍBPÂBPžRBP®BP£×BPBP\BP
+BPzáBPp€BPffBP\)BPQìBPG®BP=qBP33BP(öBP
+žBP{BP
+=BP  BN
+BNzáBNp€BNffBN\)BNQìBNG®BN=qBN33BN(öBN
+žBN{BN
+=BN  BMõÃBMë
+BMáHBM×
+BMÌÍBMÂBMžRBM®BM£×BMBM\BM
+BMzáBMp€BMffBM\)BMQìBMG®BM=qBM33BM(öBM
+žBM{BM
+=BM  BLõÃBLë
+BLáHBL×
+BLÌÍBLÂBLžRBL®BL£×BLBL\BL
+BLzáBLp€BLffBL\)BLQìBLG®BL=qBL33BL(öBL
+žBL{BL
+=BL  BJ
+BJzáBJp€BJffBJ\)BJQìBJG®BJ=qBJ33BJ(öBJ
+žBJ{BJ
+=BJ  BIõÃBIë
+BIáHBI×
+BIÌÍBIÂBIžRBI®BI£×BIBI\BI
+BIzáBIp€BIffBI\)BIQìBIG®BI=qBI33BI(öBI
+žBI{BI
+=BI  BHõÃBHë
+BHáHBH×
+BHÌÍBHÂBHžRBH®BH£×BHBH\BH
+BHzáBHp€BHffBH\)BHQìBHG®BH=qBH33BH(öBH
+žBH{BH
+=BH  BF
+BFzáBFp€BFffBF\)BFQìBFG®BF=qBF33BF(öBF
+žBF{BF
+=BF  BEõÃBEë
+BEáHBE×
+BEÌÍBEÂBEžRBE®BE£×BEBE\BE
+BEzáBEp€BEffBE\)BEQìBEG®BE=qBE33BE(öBE
+žBE{BE
+=BE  BDõÃBDë
+BDáHBD×
+BDÌÍBDÂBDžRBD®BD£×BDBD\BD
+BDzáBDp€BDffBD\)BDQìBDG®BD=qBD33BD(öBD
+žBD{BD
+=BD  BB
+BBzáBBp€BBffBB\)BBQìBBG®BB=qBB33BB(öBB
+žBB{BB
+=BB  BAõÃBAë
+BAáHBA×
+BAÌÍBAÂBAžRBA®BA£×BABA\BA
+BAzáBAp€BAffBA\)BAQìBAG®BA=qBA33BA(öBA
+žBA{BA
+=BA  B@õÃB@ë
+B@áHB@×
+B@ÌÍB@ÂB@žRB@®B@£×B@B@\B@
+B@záB@p€B@ffB@\)B@QìB@G®B@=qB@33B@(öB@
+žB@{B@
+=B@  B>
+B>záB>p€B>ffB>\)B>QìB>G®B>=qB>33B>(öB>
+žB>{B>
+=B>  B=õÃB=ë
+B=áHB=×
+B=ÌÍB=ÂB=žRB=®B=£×B=B=\B=
+B=záB=p€B=ffB=\)B=QìB=G®B==qB=33B=(öB=
+žB={B=
+=B=  B<õÃB<ë
+B<áHB<×
+B<ÌÍB<ÂB<žRB<®B<£×B<B<\B<
+B<záB<p€B<ffB<\)B<QìB<G®B<=qB<33B<(öB<
+žB<{B<
+=B<  B:
+B:záB:p€B:ffB:\)B:QìB:G®B:=qB:33B:(öB:
+žB:{B:
+=B:  B9õÃB9ë
+B9áHB9×
+B9ÌÍB9ÂB9žRB9®B9£×B9B9\B9
+B9záB9p€B9ffB9\)B9QìB9G®B9=qB933B9(öB9
+žB9{B9
+=B9  B8õÃB8ë
+B8áHB8×
+B8ÌÍB8ÂB8žRB8®B8£×B8B8\B8
+B8záB8p€B8ffB8\)B8QìB8G®B8=qB833B8(öB8
+žB8{B8
+=B8  B6
+B6záB6p€B6ffB6\)B6QìB6G®B6=qB633B6(öB6
+žB6{B6
+=B6  B5õÃB5ë
+B5áHB5×
+B5ÌÍB5ÂB5žRB5®B5£×B5B5\B5
+B5záB5p€B5ffB5\)B5QìB5G®B5=qB533B5(öB5
+žB5{B5
+=B5  B4õÃB4ë
+B4áHB4×
+B4ÌÍB4ÂB4žRB4®B4£×B4B4\B4
+B4záB4p€B4ffB4\)B4QìB4G®B4=qB433B4(öB4
+žB4{B4
+=B4  B2
+B2záB2p€B2ffB2\)B2QìB2G®B2=qB233B2(öB2
+žB2{B2
+=B2  B1õÃB1ë
+B1áHB1×
+B1ÌÍB1ÂB1žRB1®B1£×B1B1\B1
+B1záB1p€B1ffB1\)B1QìB1G®B1=qB133B1(öB1
+žB1{B1
+=B1  B0õÃB0ë
+B0áHB0×
+B0ÌÍB0ÂB0žRB0®B0£×B0B0\B0
+B0záB0p€B0ffB0\)B0QìB0G®B0=qB033B0(öB0
+žB0{B0
+=B0  B.
+B.záB.p€B.ffB.\)B.QìB.G®B.=qB.33B.(öB.
+žB.{B.
+=B.  B-õÃB-ë
+B-áHB-×
+B-ÌÍB-ÂB-žRB-®B-£×B-B-\B-
+B-záB-p€B-ffB-\)B-QìB-G®B-=qB-33B-(öB-
+žB-{B-
+=B-  B,õÃB,ë
+B,áHB,×
+B,ÌÍB,ÂB,žRB,®B,£×B,B,\B,
+B,záB,p€B,ffB,\)B,QìB,G®B,=qB,33B,(öB,
+žB,{B,
+=B,  B*
+B*záB*p€B*ffB*\)B*QìB*G®B*=qB*33B*(öB*
+žB*{B*
+=B*  B)õÃB)ë
+B)áHB)×
+B)ÌÍB)ÂB)žRB)®B)£×B)B)\B)
+B)záB)p€B)ffB)\)B)QìB)G®B)=qB)33B)(öB)
+žB){B)
+=B)  B(õÃB(ë
+B(áHB(×
+B(ÌÍB(ÂB(žRB(®B(£×B(B(\B(
+B(záB(p€B(ffB(\)B(QìB(G®B(=qB(33B((öB(
+žB({B(
+=B(  B&
+B&záB&p€B&ffB&\)B&QìB&G®B&=qB&33B&(öB&
+žB&{B&
+=B&  B%õÃB%ë
+B%áHB%×
+B%ÌÍB%ÂB%žRB%®B%£×B%B%\B%
+B%záB%p€B%ffB%\)B%QìB%G®B%=qB%33B%(öB%
+žB%{B%
+=B%  B$õÃB$ë
+B$áHB$×
+B$ÌÍB$ÂB$žRB$®B$£×B$B$\B$
+B$záB$p€B$ffB$\)B$QìB$G®B$=qB$33B$(öB$
+žB${B$
+=B$  B"
+B"záB"p€B"ffB"\)B"QìB"G®B"=qB"33B"(öB"
+žB"{B"
+=B"  B!õÃB!ë
+B!áHB!×
+B!ÌÍB!ÂB!žRB!®B!£×B!B!\B!
+B!záB!p€B!ffB!\)B!QìB!G®B!=qB!33B!(öB!
+žB!{B!
+=B!  B õÃB ë
+B áHB ×
+B ÌÍB ÂB žRB ®B £×B B \B 
+B záB p€B ffB \)B QìB G®B =qB 33B (öB 
+žB {B 
+=B   B
+
+B
+záB
+p€B
+ffB
+\)B
+QìB
+G®B
+=qB
+33B
+(öB
+
+žB
+{B
+
+=B
+  B
+õÃB
+ë
+B
+áHB
+×
+B
+ÌÍB
+ÂB
+žRB
+®B
+£×B
+B
+\B
+
+B
+záB
+p€B
+ffB
+\)B
+QìB
+G®B
+=qB
+33B
+(öB
+
+žB
+{B
+
+=B
+  B
+õÃB
+ë
+B
+áHB
+×
+B
+ÌÍB
+ÂB
+žRB
+®B
+£×B
+B
+\B
+
+B
+záB
+p€B
+ffB
+\)B
+QìB
+G®B
+=qB
+33B
+(öB
+
+žB
+{B
+
+=B
+  B
+BzáBp€BffB\)BQìBG®B=qB33B(öB
+žB{B
+=B  BõÃBë
+BáHB×
+BÌÍBÂBžRB®B£×BB\B
+BzáBp€BffB\)BQìBG®B=qB33B(öB
+žB{B
+=B  BõÃBë
+BáHB×
+BÌÍBÂBžRB®B£×BB\B
+BzáBp€BffB\)BQìBG®B=qB33B(öB
+žB{B
+=B  B
+BzáBp€BffB\)BQìBG®B=qB33B(öB
+žB{B
+=B  BõÃBë
+BáHB×
+BÌÍBÂBžRB®B£×BB\B
+BzáBp€BffB\)BQìBG®B=qB33B(öB
+žB{B
+=B  BõÃBë
+BáHB×
+BÌÍBÂBžRB®B£×BB\B
+BzáBp€BffB\)BQìBG®B=qB33B(öB
+žB{B
+=B  B
+BzáBp€BffB\)BQìBG®B=qB33B(öB
+žB{B
+=B  BõÃBë
+BáHB×
+BÌÍBÂBžRB®B£×BB\B
+BzáBp€BffB\)BQìBG®B=qB33B(öB
+žB{B
+=B  BõÃBë
+BáHB×
+BÌÍBÂBžRB®B£×BB\B
+BzáBp€BffB\)BQìBG®B=qB33B(öB
+žB{B
+=B  B
+BzáBp€BffB\)BQìBG®B=qB33B(öB
+žB{B
+=B  B
+õÃB
+ë
+B
+áHB
+×
+B
+ÌÍB
+ÂB
+žRB
+®B
+£×B
+B
+\B
+
+B
+záB
+p€B
+ffB
+\)B
+QìB
+G®B
+=qB
+33B
+(öB
+
+žB
+{B
+=B
+  B
+õÃB
+ë
+B
+áHB
+×
+B
+ÌÍB
+ÂB
+žRB
+®B
+£×B
+B
+\B
+
+B
+záB
+p€B
+ffB
+\)B
+QìB
+G®B
+=qB
+33B
+(öB
+
+žB
+{B
+
+=B
+  B
+
+B
+záB
+p€B
+ffB
+\)B
+QìB
+G®B
+=qB
+33B
+(öB
+
+žB
+{B
+
+=B
+  B	õÃB	ë
+B	áHB	×
+B	ÌÍB	ÂB	žRB	®B	£×B	B	\B	
+B	záB	p€B	ffB	\)B	QìB	G®B	=qB	33B	(öB	
+žB	{B	
+=B	  BõÃBë
+BáHB×
+BÌÍBÂBžRB®B£×BB\B
+BzáBp€BffB\)BQìBG®B=qB33B(öB
+žB{B
+=B  B
+BzáBp€BffB\)BQìBG®B=qB33B(öB
+žB{B
+=B  BõÃBë
+BáHB×
+BÌÍBÂBžRB®B£×BB\B
+BzáBp€BffB\)BQìBG®B=qB33B(öB
+žB{B
+=B  BõÃBë
+BáHB×
+BÌÍBÂBžRB®B£×BB\B
+BzáBp€BffB\)BQìBG®B=qB33B(öB
+žB{B
+=B  B
+BzáBp€BffB\)BQìBG®B=qB33B(öB
+žB{B
+=B  BõÃBë
+BáHB×
+BÌÍBÂBžRB®B£×BB\B
+BzáBp€BffB\)BQìBG®B=qB33B(öB
+žB{B
+=B  B õÃB ë
+B áHB ×
+B ÌÍB ÂB žRB ®B £×B B \B 
+B záB p€B ffB \)B QìB G®B =qB 33B (öB 
+žB {B 
+=B   Aý
+=AüõÃAüáHAüÌÍAüžRAü£×Aü\AüzáAüffAüQìAü=qAü(öAü{Aü  Aûë
+Aû×
+AûÂAû®AûAû
+Aûp€Aû\)AûG®Aû33Aû
+žAû
+=AúõÃAúáHAúÌÍAúžRAú£×Aú\AúzáAúffAúQìAú=qAú(öAú{Aú  Aùë
+Aù×
+AùÂAù®AùAù
+Aùp€Aù\)AùG®Aù33Aù
+žAù
+=AøõÃAøáHAøÌÍAøžRAø£×Aø\AøzáAøffAøQìAø=qAø(öAø{Aø  Aõ
+=AôõÃAôáHAôÌÍAôžRAô£×Aô\AôzáAôffAôQìAô=qAô(öAô{Aô  Aóë
+Aó×
+AóÂAó®AóAó
+Aóp€Aó\)AóG®Aó33Aó
+žAó
+=AòõÃAòáHAòÌÍAòžRAò£×Aò\AòzáAòffAòQìAò=qAò(öAò{Aò  Añë
+Añ×
+AñÂAñ®AñAñ
+Añp€Añ\)AñG®Añ33Añ
+žAñ
+=AðõÃAðáHAðÌÍAðžRAð£×Að\AðzáAðffAðQìAð=qAð(öAð{Að  Aí
+=AìõÃAìáHAìÌÍAìžRAì£×Aì\AìzáAìffAìQìAì=qAì(öAì{Aì  Aëë
+Aë×
+AëÂAë®AëAë
+Aëp€Aë\)AëG®Aë33Aë
+žAë
+=AêõÃAêáHAêÌÍAêžRAê£×Aê\AêzáAêffAêQìAê=qAê(öAê{Aê  Aéë
+Aé×
+AéÂAé®AéAé
+Aép€Aé\)AéG®Aé33Aé
+žAé
+=AèõÃAèáHAèÌÍAèžRAè£×Aè\AèzáAèffAèQìAè=qAè(öAè{Aè  Aå
+=AäõÃAäáHAäÌÍAäžRAä£×Aä\AäzáAäffAäQìAä=qAä(öAä{Aä  Aãë
+Aã×
+AãÂAã®AãAã
+Aãp€Aã\)AãG®Aã33Aã
+žAã
+=AâõÃAâáHAâÌÍAâžRAâ£×Aâ\AâzáAâffAâQìAâ=qAâ(öAâ{Aâ  Aáë
+Aá×
+AáÂAá®AáAá
+Aáp€Aá\)AáG®Aá33Aá
+žAá
+=AàõÃAàáHAàÌÍAàžRAà£×Aà\AàzáAàffAàQìAà=qAà(öAà{Aà  AÝ
+=AÜõÃAÜáHAÜÌÍAÜžRAÜ£×AÜ\AÜzáAÜffAÜQìAÜ=qAÜ(öAÜ{AÜ  AÛë
+AÛ×
+AÛÂAÛ®AÛAÛ
+AÛp€AÛ\)AÛG®AÛ33AÛ
+žAÛ
+=AÚõÃAÚáHAÚÌÍAÚžRAÚ£×AÚ\AÚzáAÚffAÚQìAÚ=qAÚ(öAÚ{AÚ  AÙë
+AÙ×
+AÙÂAÙ®AÙAÙ
+AÙp€AÙ\)AÙG®AÙ33AÙ
+žAÙ
+=AØõÃAØáHAØÌÍAØžRAØ£×AØ\AØzáAØffAØQìAØ=qAØ(öAØ{AØ  AÕ
+=AÔõÃAÔáHAÔÌÍAÔžRAÔ£×AÔ\AÔzáAÔffAÔQìAÔ=qAÔ(öAÔ{AÔ  AÓë
+AÓ×
+AÓÂAÓ®AÓAÓ
+AÓp€AÓ\)AÓG®AÓ33AÓ
+žAÓ
+=AÒõÃAÒáHAÒÌÍAÒžRAÒ£×AÒ\AÒzáAÒffAÒQìAÒ=qAÒ(öAÒ{AÒ  AÑë
+AÑ×
+AÑÂAÑ®AÑAÑ
+AÑp€AÑ\)AÑG®AÑ33AÑ
+žAÑ
+=AÐõÃAÐáHAÐÌÍAÐžRAÐ£×AÐ\AÐzáAÐffAÐQìAÐ=qAÐ(öAÐ{AÐ  AÍ
+=AÌõÃAÌáHAÌÌÍAÌžRAÌ£×AÌ\AÌzáAÌffAÌQìAÌ=qAÌ(öAÌ{AÌ  AËë
+AË×
+AËÂAË®AËAË
+AËp€AË\)AËG®AË33AË
+žAË
+=AÊõÃAÊáHAÊÌÍAÊžRAÊ£×AÊ\AÊzáAÊffAÊQìAÊ=qAÊ(öAÊ{AÊ  AÉë
+AÉ×
+AÉÂAÉ®AÉAÉ
+AÉp€AÉ\)AÉG®AÉ33AÉ
+žAÉ
+=AÈõÃAÈáHAÈÌÍAÈžRAÈ£×AÈ\AÈzáAÈffAÈQìAÈ=qAÈ(öAÈ{AÈ  AÅ
+=AÄõÃAÄáHAÄÌÍAÄžRAÄ£×AÄ\AÄzáAÄffAÄQìAÄ=qAÄ(öAÄ{AÄ  AÃë
+AÃ×
+AÃÂAÃ®AÃAÃ
+AÃp€AÃ\)AÃG®AÃ33AÃ
+žAÃ
+=AÂõÃAÂáHAÂÌÍAÂžRAÂ£×AÂ\AÂzáAÂffAÂQìAÂ=qAÂ(öAÂ{AÂ  AÁë
+AÁ×
+AÁÂAÁ®AÁAÁ
+AÁp€AÁ\)AÁG®AÁ33AÁ
+žAÁ
+=AÀõÃAÀáHAÀÌÍAÀžRAÀ£×AÀ\AÀzáAÀffAÀQìAÀ=qAÀ(öAÀ{AÀ  Aœ
+=AŒõÃAŒáHAŒÌÍAŒžRAŒ£×AŒ\AŒzáAŒffAŒQìAŒ=qAŒ(öAŒ{AŒ  A»ë
+A»×
+A»ÂA»®A»A»
+A»p€A»\)A»G®A»33A»
+žA»
+=AºõÃAºáHAºÌÍAºžRAº£×Aº\AºzáAºffAºQìAº=qAº(öAº{Aº  A¹ë
+A¹×
+A¹ÂA¹®A¹A¹
+A¹p€A¹\)A¹G®A¹33A¹
+žA¹
+=AžõÃAžáHAžÌÍAžžRAž£×Až\AžzáAžffAžQìAž=qAž(öAž{Až  Aµ
+=AŽõÃAŽáHAŽÌÍAŽžRAŽ£×AŽ\AŽzáAŽffAŽQìAŽ=qAŽ(öAŽ{AŽ  A³ë
+A³×
+A³ÂA³®A³A³
+A³p€A³\)A³G®A³33A³
+žA³
+=A²õÃA²áHA²ÌÍA²žRA²£×A²\A²záA²ffA²QìA²=qA²(öA²{A²  A±ë
+A±×
+A±ÂA±®A±A±
+A±p€A±\)A±G®A±33A±
+žA±
+=A°õÃA°áHA°ÌÍA°žRA°£×A°\A°záA°ffA°QìA°=qA°(öA°{A°  A­
+=A¬õÃA¬áHA¬ÌÍA¬žRA¬£×A¬\A¬záA¬ffA¬QìA¬=qA¬(öA¬{A¬  A«ë
+A«×
+A«ÂA«®A«A«
+A«p€A«\)A«G®A«33A«
+žA«
+=AªõÃAªáHAªÌÍAªžRAª£×Aª\AªzáAªffAªQìAª=qAª(öAª{Aª  A©ë
+A©×
+A©ÂA©®A©A©
+A©p€A©\)A©G®A©33A©
+žA©
+=AšõÃAšáHAšÌÍAšžRAš£×Aš\AšzáAšffAšQìAš=qAš(öAš{Aš  A¥
+=A€õÃA€áHA€ÌÍA€žRA€£×A€\A€záA€ffA€QìA€=qA€(öA€{A€  A£ë
+A£×
+A£ÂA£®A£A£
+A£p€A£\)A£G®A£33A£
+žA£
+=A¢õÃA¢áHA¢ÌÍA¢žRA¢£×A¢\A¢záA¢ffA¢QìA¢=qA¢(öA¢{A¢  A¡ë
+A¡×
+A¡ÂA¡®A¡A¡
+A¡p€A¡\)A¡G®A¡33A¡
+žA¡
+=A õÃA áHA ÌÍA žRA £×A \A záA ffA QìA =qA (öA {A   A
+=AõÃAáHAÌÍAžRA£×A\AzáAffAQìA=qA(öA{A  Aë
+A×
+AÂA®AA
+Ap€A\)AG®A33A
+žA
+=AõÃAáHAÌÍAžRA£×A\AzáAffAQìA=qA(öA{A  Aë
+A×
+AÂA®AA
+Ap€A\)AG®A33A
+žA
+=AõÃAáHAÌÍAžRA£×A\AzáAffAQìA=qA(öA{A  A
+=AõÃAáHAÌÍAžRA£×A\AzáAffAQìA=qA(öA{A  Aë
+A×
+AÂA®AA
+Ap€A\)AG®A33A
+žA
+=AõÃAáHAÌÍAžRA£×A\AzáAffAQìA=qA(öA{A  Aë
+A×
+AÂA®AA
+Ap€A\)AG®A33A
+žA
+=AõÃAáHAÌÍAžRA£×A\AzáAffAQìA=qA(öA{A  A
+=AõÃAáHAÌÍAžRA£×A\AzáAffAQìA=qA(öA{A  Aë
+A×
+AÂA®AA
+Ap€A\)AG®A33A
+žA
+=AõÃAáHAÌÍAžRA£×A\AzáAffAQìA=qA(öA{A  Aë
+A×
+AÂA®AA
+Ap€A\)AG®A33A
+žA
+=AõÃAáHAÌÍAžRA£×A\AzáAffAQìA=qA(öA{A  A
+
+=AõÃAáHAÌÍAžRA£×A\AzáAffAQìA=qA(öA{A  Aë
+A×
+AÂA®AA
+Ap€A\)AG®A33A
+žA
+=AõÃAáHAÌÍAžRA£×A\AzáAffAQìA=qA(öA{A  Aë
+A×
+AÂA®AA
+Ap€A\)AG®A33A
+žA
+=AõÃAáHAÌÍAžRA£×A\AzáAffAQìA=qA(öA{A  Az{Ayë
+AyÂAyAyp€AyG®Ay
+žAxõÃAxÌÍAx£×AxzáAxQìAx(öAx  Aw×
+Aw®Aw
+Aw\)Aw33Aw
+=AváHAvžRAv\AvffAv=qAv{Auë
+AuÂAuAup€AuG®Au
+žAtõÃAtÌÍAt£×AtzáAtQìAt(öAt  As×
+As®As
+As\)As33As
+=AráHAržRAr\ArffAr=qAr{Aqë
+AqÂAqAqp€AqG®Aq
+žApõÃApÌÍAp£×ApzáApQìAp(öAp  Aj{Aië
+AiÂAiAip€AiG®Ai
+žAhõÃAhÌÍAh£×AhzáAhQìAh(öAh  Ag×
+Ag®Ag
+Ag\)Ag33Ag
+=AfáHAfžRAf\AfffAf=qAf{Aeë
+AeÂAeAep€AeG®Ae
+žAdõÃAdÌÍAd£×AdzáAdQìAd(öAd  Ac×
+Ac®Ac
+Ac\)Ac33Ac
+=AbáHAbžRAb\AbffAb=qAb{Aaë
+AaÂAaAap€AaG®Aa
+žA`õÃA`ÌÍA`£×A`záA`QìA`(öA`  AZ{AYë
+AYÂAYAYp€AYG®AY
+žAXõÃAXÌÍAX£×AXzáAXQìAX(öAX  AW×
+AW®AW
+AW\)AW33AW
+=AVáHAVžRAV\AVffAV=qAV{AUë
+AUÂAUAUp€AUG®AU
+žATõÃATÌÍAT£×ATzáATQìAT(öAT  AS×
+AS®AS
+AS\)AS33AS
+=ARáHARžRAR\ARffAR=qAR{AQë
+AQÂAQAQp€AQG®AQ
+žAPõÃAPÌÍAP£×APzáAPQìAP(öAP  AJ{AIë
+AIÂAIAIp€AIG®AI
+žAHõÃAHÌÍAH£×AHzáAHQìAH(öAH  AG×
+AG®AG
+AG\)AG33AG
+=AFáHAFžRAF\AFffAF=qAF{AEë
+AEÂAEAEp€AEG®AE
+žADõÃADÌÍAD£×ADzáADQìAD(öAD  AC×
+AC®AC
+AC\)AC33AC
+=ABáHABžRAB\ABffAB=qAB{AAë
+AAÂAAAAp€AAG®AA
+žA@õÃA@ÌÍA@£×A@záA@QìA@(öA@  A:{A9ë
+A9ÂA9A9p€A9G®A9
+žA8õÃA8ÌÍA8£×A8záA8QìA8(öA8  A7×
+A7®A7
+A7\)A733A7
+=A6áHA6žRA6\A6ffA6=qA6{A5ë
+A5ÂA5A5p€A5G®A5
+žA4õÃA4ÌÍA4£×A4záA4QìA4(öA4  A3×
+A3®A3
+A3\)A333A3
+=A2áHA2žRA2\A2ffA2=qA2{A1ë
+A1ÂA1A1p€A1G®A1
+žA0õÃA0ÌÍA0£×A0záA0QìA0(öA0  A*{A)ë
+A)ÂA)A)p€A)G®A)
+žA(õÃA(ÌÍA(£×A(záA(QìA((öA(  A'×
+A'®A'
+A'\)A'33A'
+=A&áHA&žRA&\A&ffA&=qA&{A%ë
+A%ÂA%A%p€A%G®A%
+žA$õÃA$ÌÍA$£×A$záA$QìA$(öA$  A#×
+A#®A#
+A#\)A#33A#
+=A"áHA"žRA"\A"ffA"=qA"{A!ë
+A!ÂA!A!p€A!G®A!
+žA õÃA ÌÍA £×A záA QìA (öA   A{Aë
+AÂAAp€AG®A
+žAõÃAÌÍA£×AzáAQìA(öA  A×
+A®A
+A\)A33A
+=AáHAžRA\AffA=qA{Aë
+AÂAAp€AG®A
+žAõÃAÌÍA£×AzáAQìA(öA  A×
+A®A
+A\)A33A
+=AáHAžRA\AffA=qA{Aë
+AÂAAp€AG®A
+žAõÃAÌÍA£×AzáAQìA(öA  A
+{A	ë
+A	ÂA	A	p€A	G®A	
+žAõÃAÌÍA£×AzáAQìA(öA  A×
+A®A
+A\)A33A
+=AáHAžRA\AffA=qA{Aë
+AÂAAp€AG®A
+žAõÃAÌÍA£×AzáAQìA(öA  A×
+A®A
+A\)A33A
+=AáHAžRA\AffA=qA{Aë
+AÂAAp€AG®A
+žA õÃA ÌÍA £×A záA QìA (öA   @ô(ö@ó×
+@ó
+@ó33@òáH@ò\@ò=q@ñë
+@ñ@ñG®@ðõÂ@ð£×@ðQì@ð  @ï®@ï\)@ï
+=@îžR@îff@î{@íÂ@íp€@í
+ž@ìÌÍ@ìzá@ì(ö@ë×
+@ë
+@ë33@êáH@ê\@ê=q@éë
+@é@éG®@èõÃ@è£×@èQì@è  @ç®@ç\)@ç
+=@æžR@æff@æ{@åÂ@åp€@å
+ž@äÌÍ@äzá@ä(ö@ã×
+@ã
+@ã33@âáH@â\@â=q@áë
+@á@áG®@àõÃ@à£×@àQì@à  @Ô(ö@Ó×
+@Ó
+@Ó33@ÒáH@Ò\@Ò=q@Ñë
+@Ñ@ÑG®@ÐõÂ@Ð£×@ÐQì@Ð  @Ï®@Ï\)@Ï
+=@ÎžR@Îff@Î{@ÍÂ@Íp€@Í
+ž@ÌÌÍ@Ìzá@Ì(ö@Ë×
+@Ë
+@Ë33@ÊáH@Ê\@Ê=q@Éë
+@É@ÉG®@ÈõÃ@È£×@ÈQì@È  @Ç®@Ç\)@Ç
+=@ÆžR@Æff@Æ{@ÅÂ@Åp€@Å
+ž@ÄÌÍ@Äzá@Ä(ö@Ã×
+@Ã
+@Ã33@ÂáH@Â\@Â=q@Áë
+@Á@ÁG®@ÀõÃ@À£×@ÀQì@À  @Ž(ö@³×
+@³
+@³33@²áH@²\@²=q@±ë
+@±@±G®@°õÂ@°£×@°Qì@°  @¯®@¯\)@¯
+=@®žR@®ff@®{@­Â@­p€@­
+ž@¬ÌÍ@¬zá@¬(ö@«×
+@«
+@«33@ªáH@ª\@ª=q@©ë
+@©@©G®@šõÃ@š£×@šQì@š  @§®@§\)@§
+=@ŠžR@Šff@Š{@¥Â@¥p€@¥
+ž@€ÌÍ@€zá@€(ö@£×
+@£
+@£33@¢áH@¢\@¢=q@¡ë
+@¡@¡G®@ õÃ@ £×@ Qì@   @(ö@×
+@
+@33@áH@\@=q@ë
+@@G®@õÂ@£×@Qì@  @®@\)@
+=@žR@ff@{@Â@p€@
+ž@ÌÍ@zá@(ö@×
+@
+@33@áH@\@=q@ë
+@@G®@õÃ@£×@Qì@  @®@\)@
+=@žR@ff@{@
+Â@
+p€@
+
+ž@ÌÍ@zá@(ö@×
+@
+@33@áH@\@=q@ë
+@@G®@õÃ@£×@Qì@  @hQì@g®@g
+>@fff@eÂ@e
+ž@dzá@c×
+@c33@b\@aë
+@aG®@`£×@`  @_\)@^žR@^{@]p€@\ÌÍ@\(ö@[
+@ZáH@Z=q@Y@XõÂ@XQì@W®@W
+>@Vff@UÂ@U
+ž@Tzá@S×
+@S33@R\@Që
+@QG®@P£×@P  @O\)@NžR@N{@Mp€@LÌÍ@L(ö@K
+@JáH@J=q@I@HõÃ@HQì@G®@G
+=@Fff@EÂ@E
+ž@Dzá@C×
+@C33@B\@Aë
+@AG®@@£×@@  @(Qì@'®@'
+>@&ff@%Â@%
+ž@$zá@#×
+@#33@"\@!ë
+@!G®@ £×@   @\)@
+žR@
+{@
+p€@
+ÌÍ@
+(ö@
+@áH@=q@@õÂ@Qì@®@
+>@ff@Â@
+ž@zá@×
+@33@\@ë
+@G®@£×@  @\)@žR@{@
+p€@
+ÌÍ@
+(ö@
+
+@
+áH@
+=q@	@õÃ@Qì@®@
+=@ff@Â@
+ž@zá@×
+@33@\@ë
+@G®@ £×@   ?Ð£×?Ï\)?Î{?ÌÌÍ?Ë
+
+?Ê=p?ÈõÂ?Ç®?Æff?Å
+ž?Ã×
+?Â\?ÁG®?À  ?ŸžR?œp€?Œ(ö?ºáH?¹?žQì?·
+>?µÂ?Žzá?³33?±ë
+?°£×?¯\)?®{?¬ÌÍ?«
+?ª=q?šõÂ?§®?Šff?¥
+ž?£×
+?¢\?¡G®?   ?žR?p€?(ö?áH??Qì?
+>?Â?zá?33?ë
+?£×?\)?{?ÌÍ?
+?=q?õÃ?®?ff?
+
+ž?×
+?\?G®?  ?!G®?
+žR?
+(ö??
+=?zá?ë
+?\)?
+ÌÍ?
+=q?®?
+ž?\?   >úáH>õÂ>ð£×>ë
+>æff>áG®>Ü(ö>×
+=>Ñë
+>ÌÌÍ>Ç®>Â\>œp€>žQì>³33>®{>šõÃ>£×
+>žR>>zá>\)>=q>
+
+ž>  >uÂ>k
+>aG®>W
+=>LÌÍ>B\>8Qì>.{>#×
+>>\)>
+ž=õÂ=áG®=ÌÌÍ=žQì=£×
+=\)=uÂ=LÌÍ=#×
+<õÂ<£×
+<#×
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    
Index: /tags/ipp-1-X/bug123/psLib/test/image/verified/sBiOut.fits
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/image/verified/sBiOut.fits	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/image/verified/sBiOut.fits	(revision 22331)
@@ -0,0 +1,1414 @@
+SIMPLE  =                    T / file does conform to FITS standard             BITPIX  =                   16 / number of bits per data pixel                  NAXIS   =                    3 / number of data axes                            NAXIS1  =                   64 / length of data axis 1                          NAXIS2  =                   64 / length of data axis 2                          NAXIS3  =                    1 / length of data axis 3                          EXTEND  =                    T / FITS dataset may contain extensions            COMMENT   FITS (Flexible Image Transport System) format is defined in 'AstronomyCOMMENT   and Astrophysics', volume 376, page 359; bibcode: 2001A&A...376..359H BZERO   =   0.000000000000E+00 / Pixel Value Offset                             BSCALE  =   1.000000000000E+00 / Pixel Value Scale                              END                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             ÿÁÿÃÿÅÿÇÿÉÿËÿÍÿÏÿÑÿÓÿÕÿ×ÿÙÿÛÿÝÿßÿáÿãÿåÿçÿéÿëÿíÿïÿñÿóÿõÿ÷ÿùÿûÿýÿÿ     	 
+ 
+        
+  ! # % ' ) + - / 1 3 5 7 9 ; = ?ÿÀÿÂÿÄÿÆÿÈÿÊÿÌÿÎÿÐÿÒÿÔÿÖÿØÿÚÿÜÿÞÿàÿâÿäÿæÿèÿêÿìÿîÿðÿòÿôÿöÿøÿúÿüÿþ       
+ 
+        
+ 
+   " $ & ( * , . 0 2 4 6 8 : < >ÿ¿ÿÁÿÃÿÅÿÇÿÉÿËÿÍÿÏÿÑÿÓÿÕÿ×ÿÙÿÛÿÝÿßÿáÿãÿåÿçÿéÿëÿíÿïÿñÿóÿõÿ÷ÿùÿûÿýÿÿ     	 
+ 
+        
+  ! # % ' ) + - / 1 3 5 7 9 ; =ÿŸÿÀÿÂÿÄÿÆÿÈÿÊÿÌÿÎÿÐÿÒÿÔÿÖÿØÿÚÿÜÿÞÿàÿâÿäÿæÿèÿêÿìÿîÿðÿòÿôÿöÿøÿúÿüÿþ       
+ 
+        
+ 
+   " $ & ( * , . 0 2 4 6 8 : <ÿœÿ¿ÿÁÿÃÿÅÿÇÿÉÿËÿÍÿÏÿÑÿÓÿÕÿ×ÿÙÿÛÿÝÿßÿáÿãÿåÿçÿéÿëÿíÿïÿñÿóÿõÿ÷ÿùÿûÿýÿÿ     	 
+ 
+        
+  ! # % ' ) + - / 1 3 5 7 9 ;ÿŒÿŸÿÀÿÂÿÄÿÆÿÈÿÊÿÌÿÎÿÐÿÒÿÔÿÖÿØÿÚÿÜÿÞÿàÿâÿäÿæÿèÿêÿìÿîÿðÿòÿôÿöÿøÿúÿüÿþ       
+ 
+        
+ 
+   " $ & ( * , . 0 2 4 6 8 :ÿ»ÿœÿ¿ÿÁÿÃÿÅÿÇÿÉÿËÿÍÿÏÿÑÿÓÿÕÿ×ÿÙÿÛÿÝÿßÿáÿãÿåÿçÿéÿëÿíÿïÿñÿóÿõÿ÷ÿùÿûÿýÿÿ     	 
+ 
+        
+  ! # % ' ) + - / 1 3 5 7 9ÿºÿŒÿŸÿÀÿÂÿÄÿÆÿÈÿÊÿÌÿÎÿÐÿÒÿÔÿÖÿØÿÚÿÜÿÞÿàÿâÿäÿæÿèÿêÿìÿîÿðÿòÿôÿöÿøÿúÿüÿþ       
+ 
+        
+ 
+   " $ & ( * , . 0 2 4 6 8ÿ¹ÿ»ÿœÿ¿ÿÁÿÃÿÅÿÇÿÉÿËÿÍÿÏÿÑÿÓÿÕÿ×ÿÙÿÛÿÝÿßÿáÿãÿåÿçÿéÿëÿíÿïÿñÿóÿõÿ÷ÿùÿûÿýÿÿ     	 
+ 
+        
+  ! # % ' ) + - / 1 3 5 7ÿžÿºÿŒÿŸÿÀÿÂÿÄÿÆÿÈÿÊÿÌÿÎÿÐÿÒÿÔÿÖÿØÿÚÿÜÿÞÿàÿâÿäÿæÿèÿêÿìÿîÿðÿòÿôÿöÿøÿúÿüÿþ       
+ 
+        
+ 
+   " $ & ( * , . 0 2 4 6ÿ·ÿ¹ÿ»ÿœÿ¿ÿÁÿÃÿÅÿÇÿÉÿËÿÍÿÏÿÑÿÓÿÕÿ×ÿÙÿÛÿÝÿßÿáÿãÿåÿçÿéÿëÿíÿïÿñÿóÿõÿ÷ÿùÿûÿýÿÿ     	 
+ 
+        
+  ! # % ' ) + - / 1 3 5ÿ¶ÿžÿºÿŒÿŸÿÀÿÂÿÄÿÆÿÈÿÊÿÌÿÎÿÐÿÒÿÔÿÖÿØÿÚÿÜÿÞÿàÿâÿäÿæÿèÿêÿìÿîÿðÿòÿôÿöÿøÿúÿüÿþ       
+ 
+        
+ 
+   " $ & ( * , . 0 2 4ÿµÿ·ÿ¹ÿ»ÿœÿ¿ÿÁÿÃÿÅÿÇÿÉÿËÿÍÿÏÿÑÿÓÿÕÿ×ÿÙÿÛÿÝÿßÿáÿãÿåÿçÿéÿëÿíÿïÿñÿóÿõÿ÷ÿùÿûÿýÿÿ     	 
+ 
+        
+  ! # % ' ) + - / 1 3ÿŽÿ¶ÿžÿºÿŒÿŸÿÀÿÂÿÄÿÆÿÈÿÊÿÌÿÎÿÐÿÒÿÔÿÖÿØÿÚÿÜÿÞÿàÿâÿäÿæÿèÿêÿìÿîÿðÿòÿôÿöÿøÿúÿüÿþ       
+ 
+        
+ 
+   " $ & ( * , . 0 2ÿ³ÿµÿ·ÿ¹ÿ»ÿœÿ¿ÿÁÿÃÿÅÿÇÿÉÿËÿÍÿÏÿÑÿÓÿÕÿ×ÿÙÿÛÿÝÿßÿáÿãÿåÿçÿéÿëÿíÿïÿñÿóÿõÿ÷ÿùÿûÿýÿÿ     	 
+ 
+        
+  ! # % ' ) + - / 1ÿ²ÿŽÿ¶ÿžÿºÿŒÿŸÿÀÿÂÿÄÿÆÿÈÿÊÿÌÿÎÿÐÿÒÿÔÿÖÿØÿÚÿÜÿÞÿàÿâÿäÿæÿèÿêÿìÿîÿðÿòÿôÿöÿøÿúÿüÿþ       
+ 
+        
+ 
+   " $ & ( * , . 0ÿ±ÿ³ÿµÿ·ÿ¹ÿ»ÿœÿ¿ÿÁÿÃÿÅÿÇÿÉÿËÿÍÿÏÿÑÿÓÿÕÿ×ÿÙÿÛÿÝÿßÿáÿãÿåÿçÿéÿëÿíÿïÿñÿóÿõÿ÷ÿùÿûÿýÿÿ     	 
+ 
+        
+  ! # % ' ) + - /ÿ°ÿ²ÿŽÿ¶ÿžÿºÿŒÿŸÿÀÿÂÿÄÿÆÿÈÿÊÿÌÿÎÿÐÿÒÿÔÿÖÿØÿÚÿÜÿÞÿàÿâÿäÿæÿèÿêÿìÿîÿðÿòÿôÿöÿøÿúÿüÿþ       
+ 
+        
+ 
+   " $ & ( * , .ÿ¯ÿ±ÿ³ÿµÿ·ÿ¹ÿ»ÿœÿ¿ÿÁÿÃÿÅÿÇÿÉÿËÿÍÿÏÿÑÿÓÿÕÿ×ÿÙÿÛÿÝÿßÿáÿãÿåÿçÿéÿëÿíÿïÿñÿóÿõÿ÷ÿùÿûÿýÿÿ     	 
+ 
+        
+  ! # % ' ) + -ÿ®ÿ°ÿ²ÿŽÿ¶ÿžÿºÿŒÿŸÿÀÿÂÿÄÿÆÿÈÿÊÿÌÿÎÿÐÿÒÿÔÿÖÿØÿÚÿÜÿÞÿàÿâÿäÿæÿèÿêÿìÿîÿðÿòÿôÿöÿøÿúÿüÿþ       
+ 
+        
+ 
+   " $ & ( * ,ÿ­ÿ¯ÿ±ÿ³ÿµÿ·ÿ¹ÿ»ÿœÿ¿ÿÁÿÃÿÅÿÇÿÉÿËÿÍÿÏÿÑÿÓÿÕÿ×ÿÙÿÛÿÝÿßÿáÿãÿåÿçÿéÿëÿíÿïÿñÿóÿõÿ÷ÿùÿûÿýÿÿ     	 
+ 
+        
+  ! # % ' ) +ÿ¬ÿ®ÿ°ÿ²ÿŽÿ¶ÿžÿºÿŒÿŸÿÀÿÂÿÄÿÆÿÈÿÊÿÌÿÎÿÐÿÒÿÔÿÖÿØÿÚÿÜÿÞÿàÿâÿäÿæÿèÿêÿìÿîÿðÿòÿôÿöÿøÿúÿüÿþ       
+ 
+        
+ 
+   " $ & ( *ÿ«ÿ­ÿ¯ÿ±ÿ³ÿµÿ·ÿ¹ÿ»ÿœÿ¿ÿÁÿÃÿÅÿÇÿÉÿËÿÍÿÏÿÑÿÓÿÕÿ×ÿÙÿÛÿÝÿßÿáÿãÿåÿçÿéÿëÿíÿïÿñÿóÿõÿ÷ÿùÿûÿýÿÿ     	 
+ 
+        
+  ! # % ' )ÿªÿ¬ÿ®ÿ°ÿ²ÿŽÿ¶ÿžÿºÿŒÿŸÿÀÿÂÿÄÿÆÿÈÿÊÿÌÿÎÿÐÿÒÿÔÿÖÿØÿÚÿÜÿÞÿàÿâÿäÿæÿèÿêÿìÿîÿðÿòÿôÿöÿøÿúÿüÿþ       
+ 
+        
+ 
+   " $ & (ÿ©ÿ«ÿ­ÿ¯ÿ±ÿ³ÿµÿ·ÿ¹ÿ»ÿœÿ¿ÿÁÿÃÿÅÿÇÿÉÿËÿÍÿÏÿÑÿÓÿÕÿ×ÿÙÿÛÿÝÿßÿáÿãÿåÿçÿéÿëÿíÿïÿñÿóÿõÿ÷ÿùÿûÿýÿÿ     	 
+ 
+        
+  ! # % 'ÿšÿªÿ¬ÿ®ÿ°ÿ²ÿŽÿ¶ÿžÿºÿŒÿŸÿÀÿÂÿÄÿÆÿÈÿÊÿÌÿÎÿÐÿÒÿÔÿÖÿØÿÚÿÜÿÞÿàÿâÿäÿæÿèÿêÿìÿîÿðÿòÿôÿöÿøÿúÿüÿþ       
+ 
+        
+ 
+   " $ &ÿ§ÿ©ÿ«ÿ­ÿ¯ÿ±ÿ³ÿµÿ·ÿ¹ÿ»ÿœÿ¿ÿÁÿÃÿÅÿÇÿÉÿËÿÍÿÏÿÑÿÓÿÕÿ×ÿÙÿÛÿÝÿßÿáÿãÿåÿçÿéÿëÿíÿïÿñÿóÿõÿ÷ÿùÿûÿýÿÿ     	 
+ 
+        
+  ! # %ÿŠÿšÿªÿ¬ÿ®ÿ°ÿ²ÿŽÿ¶ÿžÿºÿŒÿŸÿÀÿÂÿÄÿÆÿÈÿÊÿÌÿÎÿÐÿÒÿÔÿÖÿØÿÚÿÜÿÞÿàÿâÿäÿæÿèÿêÿìÿîÿðÿòÿôÿöÿøÿúÿüÿþ       
+ 
+        
+ 
+   " $ÿ¥ÿ§ÿ©ÿ«ÿ­ÿ¯ÿ±ÿ³ÿµÿ·ÿ¹ÿ»ÿœÿ¿ÿÁÿÃÿÅÿÇÿÉÿËÿÍÿÏÿÑÿÓÿÕÿ×ÿÙÿÛÿÝÿßÿáÿãÿåÿçÿéÿëÿíÿïÿñÿóÿõÿ÷ÿùÿûÿýÿÿ     	 
+ 
+        
+  ! #ÿ€ÿŠÿšÿªÿ¬ÿ®ÿ°ÿ²ÿŽÿ¶ÿžÿºÿŒÿŸÿÀÿÂÿÄÿÆÿÈÿÊÿÌÿÎÿÐÿÒÿÔÿÖÿØÿÚÿÜÿÞÿàÿâÿäÿæÿèÿêÿìÿîÿðÿòÿôÿöÿøÿúÿüÿþ       
+ 
+        
+ 
+   "ÿ£ÿ¥ÿ§ÿ©ÿ«ÿ­ÿ¯ÿ±ÿ³ÿµÿ·ÿ¹ÿ»ÿœÿ¿ÿÁÿÃÿÅÿÇÿÉÿËÿÍÿÏÿÑÿÓÿÕÿ×ÿÙÿÛÿÝÿßÿáÿãÿåÿçÿéÿëÿíÿïÿñÿóÿõÿ÷ÿùÿûÿýÿÿ     	 
+ 
+        
+  !ÿ¢ÿ€ÿŠÿšÿªÿ¬ÿ®ÿ°ÿ²ÿŽÿ¶ÿžÿºÿŒÿŸÿÀÿÂÿÄÿÆÿÈÿÊÿÌÿÎÿÐÿÒÿÔÿÖÿØÿÚÿÜÿÞÿàÿâÿäÿæÿèÿêÿìÿîÿðÿòÿôÿöÿøÿúÿüÿþ       
+ 
+        
+ 
+  ÿ¡ÿ£ÿ¥ÿ§ÿ©ÿ«ÿ­ÿ¯ÿ±ÿ³ÿµÿ·ÿ¹ÿ»ÿœÿ¿ÿÁÿÃÿÅÿÇÿÉÿËÿÍÿÏÿÑÿÓÿÕÿ×ÿÙÿÛÿÝÿßÿáÿãÿåÿçÿéÿëÿíÿïÿñÿóÿõÿ÷ÿùÿûÿýÿÿ     	 
+ 
+        
+ ÿ ÿ¢ÿ€ÿŠÿšÿªÿ¬ÿ®ÿ°ÿ²ÿŽÿ¶ÿžÿºÿŒÿŸÿÀÿÂÿÄÿÆÿÈÿÊÿÌÿÎÿÐÿÒÿÔÿÖÿØÿÚÿÜÿÞÿàÿâÿäÿæÿèÿêÿìÿîÿðÿòÿôÿöÿøÿúÿüÿþ       
+ 
+        
+ 
+ÿÿ¡ÿ£ÿ¥ÿ§ÿ©ÿ«ÿ­ÿ¯ÿ±ÿ³ÿµÿ·ÿ¹ÿ»ÿœÿ¿ÿÁÿÃÿÅÿÇÿÉÿËÿÍÿÏÿÑÿÓÿÕÿ×ÿÙÿÛÿÝÿßÿáÿãÿåÿçÿéÿëÿíÿïÿñÿóÿõÿ÷ÿùÿûÿýÿÿ     	 
+ 
+        
+ÿÿ ÿ¢ÿ€ÿŠÿšÿªÿ¬ÿ®ÿ°ÿ²ÿŽÿ¶ÿžÿºÿŒÿŸÿÀÿÂÿÄÿÆÿÈÿÊÿÌÿÎÿÐÿÒÿÔÿÖÿØÿÚÿÜÿÞÿàÿâÿäÿæÿèÿêÿìÿîÿðÿòÿôÿöÿøÿúÿüÿþ       
+ 
+        
+ÿÿÿ¡ÿ£ÿ¥ÿ§ÿ©ÿ«ÿ­ÿ¯ÿ±ÿ³ÿµÿ·ÿ¹ÿ»ÿœÿ¿ÿÁÿÃÿÅÿÇÿÉÿËÿÍÿÏÿÑÿÓÿÕÿ×ÿÙÿÛÿÝÿßÿáÿãÿåÿçÿéÿëÿíÿïÿñÿóÿõÿ÷ÿùÿûÿýÿÿ     	 
+ 
+       ÿÿÿ ÿ¢ÿ€ÿŠÿšÿªÿ¬ÿ®ÿ°ÿ²ÿŽÿ¶ÿžÿºÿŒÿŸÿÀÿÂÿÄÿÆÿÈÿÊÿÌÿÎÿÐÿÒÿÔÿÖÿØÿÚÿÜÿÞÿàÿâÿäÿæÿèÿêÿìÿîÿðÿòÿôÿöÿøÿúÿüÿþ       
+ 
+       ÿÿÿÿ¡ÿ£ÿ¥ÿ§ÿ©ÿ«ÿ­ÿ¯ÿ±ÿ³ÿµÿ·ÿ¹ÿ»ÿœÿ¿ÿÁÿÃÿÅÿÇÿÉÿËÿÍÿÏÿÑÿÓÿÕÿ×ÿÙÿÛÿÝÿßÿáÿãÿåÿçÿéÿëÿíÿïÿñÿóÿõÿ÷ÿùÿûÿýÿÿ     	 
+ 
+      ÿÿÿÿ ÿ¢ÿ€ÿŠÿšÿªÿ¬ÿ®ÿ°ÿ²ÿŽÿ¶ÿžÿºÿŒÿŸÿÀÿÂÿÄÿÆÿÈÿÊÿÌÿÎÿÐÿÒÿÔÿÖÿØÿÚÿÜÿÞÿàÿâÿäÿæÿèÿêÿìÿîÿðÿòÿôÿöÿøÿúÿüÿþ       
+ 
+      ÿÿÿÿÿ¡ÿ£ÿ¥ÿ§ÿ©ÿ«ÿ­ÿ¯ÿ±ÿ³ÿµÿ·ÿ¹ÿ»ÿœÿ¿ÿÁÿÃÿÅÿÇÿÉÿËÿÍÿÏÿÑÿÓÿÕÿ×ÿÙÿÛÿÝÿßÿáÿãÿåÿçÿéÿëÿíÿïÿñÿóÿõÿ÷ÿùÿûÿýÿÿ     	 
+ 
+     ÿÿÿÿÿ ÿ¢ÿ€ÿŠÿšÿªÿ¬ÿ®ÿ°ÿ²ÿŽÿ¶ÿžÿºÿŒÿŸÿÀÿÂÿÄÿÆÿÈÿÊÿÌÿÎÿÐÿÒÿÔÿÖÿØÿÚÿÜÿÞÿàÿâÿäÿæÿèÿêÿìÿîÿðÿòÿôÿöÿøÿúÿüÿþ       
+ 
+     ÿÿÿÿÿÿ¡ÿ£ÿ¥ÿ§ÿ©ÿ«ÿ­ÿ¯ÿ±ÿ³ÿµÿ·ÿ¹ÿ»ÿœÿ¿ÿÁÿÃÿÅÿÇÿÉÿËÿÍÿÏÿÑÿÓÿÕÿ×ÿÙÿÛÿÝÿßÿáÿãÿåÿçÿéÿëÿíÿïÿñÿóÿõÿ÷ÿùÿûÿýÿÿ     	 
+ 
+    ÿÿÿÿÿÿ ÿ¢ÿ€ÿŠÿšÿªÿ¬ÿ®ÿ°ÿ²ÿŽÿ¶ÿžÿºÿŒÿŸÿÀÿÂÿÄÿÆÿÈÿÊÿÌÿÎÿÐÿÒÿÔÿÖÿØÿÚÿÜÿÞÿàÿâÿäÿæÿèÿêÿìÿîÿðÿòÿôÿöÿøÿúÿüÿþ       
+ 
+    ÿÿÿÿÿÿÿ¡ÿ£ÿ¥ÿ§ÿ©ÿ«ÿ­ÿ¯ÿ±ÿ³ÿµÿ·ÿ¹ÿ»ÿœÿ¿ÿÁÿÃÿÅÿÇÿÉÿËÿÍÿÏÿÑÿÓÿÕÿ×ÿÙÿÛÿÝÿßÿáÿãÿåÿçÿéÿëÿíÿïÿñÿóÿõÿ÷ÿùÿûÿýÿÿ     	 
+ 
+   ÿÿÿÿÿÿÿ ÿ¢ÿ€ÿŠÿšÿªÿ¬ÿ®ÿ°ÿ²ÿŽÿ¶ÿžÿºÿŒÿŸÿÀÿÂÿÄÿÆÿÈÿÊÿÌÿÎÿÐÿÒÿÔÿÖÿØÿÚÿÜÿÞÿàÿâÿäÿæÿèÿêÿìÿîÿðÿòÿôÿöÿøÿúÿüÿþ       
+ 
+   ÿÿÿÿÿÿÿÿ¡ÿ£ÿ¥ÿ§ÿ©ÿ«ÿ­ÿ¯ÿ±ÿ³ÿµÿ·ÿ¹ÿ»ÿœÿ¿ÿÁÿÃÿÅÿÇÿÉÿËÿÍÿÏÿÑÿÓÿÕÿ×ÿÙÿÛÿÝÿßÿáÿãÿåÿçÿéÿëÿíÿïÿñÿóÿõÿ÷ÿùÿûÿýÿÿ     	 
+ 
+  ÿÿÿÿÿÿÿÿ ÿ¢ÿ€ÿŠÿšÿªÿ¬ÿ®ÿ°ÿ²ÿŽÿ¶ÿžÿºÿŒÿŸÿÀÿÂÿÄÿÆÿÈÿÊÿÌÿÎÿÐÿÒÿÔÿÖÿØÿÚÿÜÿÞÿàÿâÿäÿæÿèÿêÿìÿîÿðÿòÿôÿöÿøÿúÿüÿþ       
+ 
+  ÿÿÿÿÿÿÿÿÿ¡ÿ£ÿ¥ÿ§ÿ©ÿ«ÿ­ÿ¯ÿ±ÿ³ÿµÿ·ÿ¹ÿ»ÿœÿ¿ÿÁÿÃÿÅÿÇÿÉÿËÿÍÿÏÿÑÿÓÿÕÿ×ÿÙÿÛÿÝÿßÿáÿãÿåÿçÿéÿëÿíÿïÿñÿóÿõÿ÷ÿùÿûÿýÿÿ     	 
+ 
+ ÿÿÿÿÿÿÿÿÿ ÿ¢ÿ€ÿŠÿšÿªÿ¬ÿ®ÿ°ÿ²ÿŽÿ¶ÿžÿºÿŒÿŸÿÀÿÂÿÄÿÆÿÈÿÊÿÌÿÎÿÐÿÒÿÔÿÖÿØÿÚÿÜÿÞÿàÿâÿäÿæÿèÿêÿìÿîÿðÿòÿôÿöÿøÿúÿüÿþ       
+ 
+ ÿÿÿÿÿÿÿÿÿÿ¡ÿ£ÿ¥ÿ§ÿ©ÿ«ÿ­ÿ¯ÿ±ÿ³ÿµÿ·ÿ¹ÿ»ÿœÿ¿ÿÁÿÃÿÅÿÇÿÉÿËÿÍÿÏÿÑÿÓÿÕÿ×ÿÙÿÛÿÝÿßÿáÿãÿåÿçÿéÿëÿíÿïÿñÿóÿõÿ÷ÿùÿûÿýÿÿ     	 
+ 
+ÿÿÿÿÿÿÿÿÿÿ ÿ¢ÿ€ÿŠÿšÿªÿ¬ÿ®ÿ°ÿ²ÿŽÿ¶ÿžÿºÿŒÿŸÿÀÿÂÿÄÿÆÿÈÿÊÿÌÿÎÿÐÿÒÿÔÿÖÿØÿÚÿÜÿÞÿàÿâÿäÿæÿèÿêÿìÿîÿðÿòÿôÿöÿøÿúÿüÿþ       
+ 
+ÿÿÿÿÿÿÿÿÿÿÿ¡ÿ£ÿ¥ÿ§ÿ©ÿ«ÿ­ÿ¯ÿ±ÿ³ÿµÿ·ÿ¹ÿ»ÿœÿ¿ÿÁÿÃÿÅÿÇÿÉÿËÿÍÿÏÿÑÿÓÿÕÿ×ÿÙÿÛÿÝÿßÿáÿãÿåÿçÿéÿëÿíÿïÿñÿóÿõÿ÷ÿùÿûÿýÿÿ     	 
+ÿÿÿÿÿÿÿÿÿÿÿ ÿ¢ÿ€ÿŠÿšÿªÿ¬ÿ®ÿ°ÿ²ÿŽÿ¶ÿžÿºÿŒÿŸÿÀÿÂÿÄÿÆÿÈÿÊÿÌÿÎÿÐÿÒÿÔÿÖÿØÿÚÿÜÿÞÿàÿâÿäÿæÿèÿêÿìÿîÿðÿòÿôÿöÿøÿúÿüÿþ       
+ÿÿÿÿÿÿÿÿÿÿÿÿ¡ÿ£ÿ¥ÿ§ÿ©ÿ«ÿ­ÿ¯ÿ±ÿ³ÿµÿ·ÿ¹ÿ»ÿœÿ¿ÿÁÿÃÿÅÿÇÿÉÿËÿÍÿÏÿÑÿÓÿÕÿ×ÿÙÿÛÿÝÿßÿáÿãÿåÿçÿéÿëÿíÿïÿñÿóÿõÿ÷ÿùÿûÿýÿÿ     	ÿÿÿÿÿÿÿÿÿÿÿÿ ÿ¢ÿ€ÿŠÿšÿªÿ¬ÿ®ÿ°ÿ²ÿŽÿ¶ÿžÿºÿŒÿŸÿÀÿÂÿÄÿÆÿÈÿÊÿÌÿÎÿÐÿÒÿÔÿÖÿØÿÚÿÜÿÞÿàÿâÿäÿæÿèÿêÿìÿîÿðÿòÿôÿöÿøÿúÿüÿþ      ÿÿÿÿÿÿÿÿÿÿÿÿÿ¡ÿ£ÿ¥ÿ§ÿ©ÿ«ÿ­ÿ¯ÿ±ÿ³ÿµÿ·ÿ¹ÿ»ÿœÿ¿ÿÁÿÃÿÅÿÇÿÉÿËÿÍÿÏÿÑÿÓÿÕÿ×ÿÙÿÛÿÝÿßÿáÿãÿåÿçÿéÿëÿíÿïÿñÿóÿõÿ÷ÿùÿûÿýÿÿ    ÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ¢ÿ€ÿŠÿšÿªÿ¬ÿ®ÿ°ÿ²ÿŽÿ¶ÿžÿºÿŒÿŸÿÀÿÂÿÄÿÆÿÈÿÊÿÌÿÎÿÐÿÒÿÔÿÖÿØÿÚÿÜÿÞÿàÿâÿäÿæÿèÿêÿìÿîÿðÿòÿôÿöÿøÿúÿüÿþ     ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¡ÿ£ÿ¥ÿ§ÿ©ÿ«ÿ­ÿ¯ÿ±ÿ³ÿµÿ·ÿ¹ÿ»ÿœÿ¿ÿÁÿÃÿÅÿÇÿÉÿËÿÍÿÏÿÑÿÓÿÕÿ×ÿÙÿÛÿÝÿßÿáÿãÿåÿçÿéÿëÿíÿïÿñÿóÿõÿ÷ÿùÿûÿýÿÿ   ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ¢ÿ€ÿŠÿšÿªÿ¬ÿ®ÿ°ÿ²ÿŽÿ¶ÿžÿºÿŒÿŸÿÀÿÂÿÄÿÆÿÈÿÊÿÌÿÎÿÐÿÒÿÔÿÖÿØÿÚÿÜÿÞÿàÿâÿäÿæÿèÿêÿìÿîÿðÿòÿôÿöÿøÿúÿüÿþ    ÿ
+ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¡ÿ£ÿ¥ÿ§ÿ©ÿ«ÿ­ÿ¯ÿ±ÿ³ÿµÿ·ÿ¹ÿ»ÿœÿ¿ÿÁÿÃÿÅÿÇÿÉÿËÿÍÿÏÿÑÿÓÿÕÿ×ÿÙÿÛÿÝÿßÿáÿãÿåÿçÿéÿëÿíÿïÿñÿóÿõÿ÷ÿùÿûÿýÿÿ  ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ¢ÿ€ÿŠÿšÿªÿ¬ÿ®ÿ°ÿ²ÿŽÿ¶ÿžÿºÿŒÿŸÿÀÿÂÿÄÿÆÿÈÿÊÿÌÿÎÿÐÿÒÿÔÿÖÿØÿÚÿÜÿÞÿàÿâÿäÿæÿèÿêÿìÿîÿðÿòÿôÿöÿøÿúÿüÿþ   ÿÿ
+ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¡ÿ£ÿ¥ÿ§ÿ©ÿ«ÿ­ÿ¯ÿ±ÿ³ÿµÿ·ÿ¹ÿ»ÿœÿ¿ÿÁÿÃÿÅÿÇÿÉÿËÿÍÿÏÿÑÿÓÿÕÿ×ÿÙÿÛÿÝÿßÿáÿãÿåÿçÿéÿëÿíÿïÿñÿóÿõÿ÷ÿùÿûÿýÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ¢ÿ€ÿŠÿšÿªÿ¬ÿ®ÿ°ÿ²ÿŽÿ¶ÿžÿºÿŒÿŸÿÀÿÂÿÄÿÆÿÈÿÊÿÌÿÎÿÐÿÒÿÔÿÖÿØÿÚÿÜÿÞÿàÿâÿäÿæÿèÿêÿìÿîÿðÿòÿôÿöÿøÿúÿüÿþ                                                                                                                                                                                                                                                                                                                                                                                                                                                                  XTENSION= 'IMAGE   '           / IMAGE extension                                BITPIX  =                   16 / number of bits per data pixel                  NAXIS   =                    3 / number of data axes                            NAXIS1  =                   91 / length of data axis 1                          NAXIS2  =                   91 / length of data axis 2                          NAXIS3  =                    1 / length of data axis 3                          PCOUNT  =                    0 / required keyword; must = 0                     GCOUNT  =                    1 / required keyword; must = 1                     BZERO   =   0.000000000000E+00 / Pixel Value Offset                             BSCALE  =   1.000000000000E+00 / Pixel Value Scale                              END                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÁÿÂÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÁÿÃÿÄÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿ÿ¿ÿÂÿÄÿÆÿÇÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿœÿŸÿÀÿÂÿÄÿÆÿÉÿÊÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŒÿœÿ¿ÿÁÿÃÿÅÿÇÿÉÿËÿÍÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿºÿ»ÿœÿ¿ÿÂÿÄÿÆÿÈÿÊÿÌÿÎÿÐÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¹ÿºÿŒÿŸÿÀÿÂÿÄÿÆÿÉÿËÿÍÿÏÿÑÿÓÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÿžÿºÿœÿ¿ÿÁÿÃÿÅÿÇÿÉÿËÿÎÿÐÿÒÿÔÿÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¶ÿ·ÿ¹ÿ»ÿœÿ¿ÿÂÿÄÿÆÿÈÿÊÿÌÿÎÿÐÿÓÿÕÿ×ÿØÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿµÿ¶ÿžÿºÿŒÿŸÿÀÿÂÿÄÿÆÿÉÿËÿÍÿÏÿÑÿÓÿÕÿ×ÿÚÿÛÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ³ÿŽÿ¶ÿžÿºÿœÿ¿ÿÁÿÃÿÅÿÇÿÉÿËÿÎÿÐÿÒÿÔÿÖÿØÿÚÿÜÿÞÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ²ÿ³ÿµÿ·ÿ¹ÿ»ÿœÿ¿ÿÂÿÄÿÆÿÈÿÊÿÌÿÎÿÐÿÓÿÕÿ×ÿÙÿÛÿÝÿßÿáÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ°ÿ±ÿ³ÿ¶ÿžÿºÿŒÿŸÿÀÿÂÿÄÿÆÿÉÿËÿÍÿÏÿÑÿÓÿÕÿ×ÿÚÿÜÿÞÿàÿâÿäÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¯ÿ°ÿ²ÿŽÿ¶ÿžÿºÿœÿ¿ÿÁÿÃÿÅÿÇÿÉÿËÿÎÿÐÿÒÿÔÿÖÿØÿÚÿÜÿßÿáÿãÿåÿæÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ®ÿ®ÿ±ÿ³ÿµÿ·ÿ¹ÿ»ÿœÿ¿ÿÂÿÄÿÆÿÈÿÊÿÌÿÎÿÐÿÓÿÕÿ×ÿÙÿÛÿÝÿßÿáÿãÿæÿèÿéÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¬ÿ­ÿ¯ÿ±ÿ³ÿ¶ÿžÿºÿŒÿŸÿÀÿÂÿÄÿÆÿÉÿËÿÍÿÏÿÑÿÓÿÕÿ×ÿÚÿÜÿÞÿàÿâÿäÿæÿèÿëÿìÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ«ÿ¬ÿ®ÿ°ÿ²ÿŽÿ¶ÿžÿºÿœÿ¿ÿÁÿÃÿÅÿÇÿÉÿËÿÎÿÐÿÒÿÔÿÖÿØÿÚÿÜÿßÿáÿãÿåÿçÿéÿëÿíÿïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ©ÿªÿ¬ÿ®ÿ±ÿ³ÿµÿ·ÿ¹ÿ»ÿœÿ¿ÿÂÿÄÿÆÿÈÿÊÿÌÿÎÿÐÿÓÿÕÿ×ÿÙÿÛÿÝÿßÿáÿãÿæÿèÿêÿìÿîÿðÿòÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿšÿ©ÿ«ÿ­ÿ¯ÿ±ÿ³ÿ¶ÿžÿºÿŒÿŸÿÀÿÂÿÄÿÆÿÉÿËÿÍÿÏÿÑÿÓÿÕÿ×ÿÚÿÜÿÞÿàÿâÿäÿæÿèÿëÿíÿïÿñÿóÿôÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ§ÿ§ÿ©ÿ¬ÿ®ÿ°ÿ²ÿŽÿ¶ÿžÿºÿœÿ¿ÿÁÿÃÿÅÿÇÿÉÿËÿÎÿÐÿÒÿÔÿÖÿØÿÚÿÜÿßÿáÿãÿåÿçÿéÿëÿíÿïÿòÿôÿöÿ÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¥ÿŠÿšÿªÿ¬ÿ®ÿ±ÿ³ÿµÿ·ÿ¹ÿ»ÿœÿ¿ÿÂÿÄÿÆÿÈÿÊÿÌÿÎÿÐÿÓÿÕÿ×ÿÙÿÛÿÝÿßÿáÿãÿæÿèÿêÿìÿîÿðÿòÿôÿ÷ÿùÿúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿ¥ÿ§ÿ©ÿ«ÿ­ÿ¯ÿ±ÿ³ÿ¶ÿžÿºÿŒÿŸÿÀÿÂÿÄÿÆÿÉÿËÿÍÿÏÿÑÿÓÿÕÿ×ÿÚÿÜÿÞÿàÿâÿäÿæÿèÿëÿíÿïÿñÿóÿõÿ÷ÿùÿüÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¢ÿ£ÿ¥ÿ§ÿ©ÿ¬ÿ®ÿ°ÿ²ÿŽÿ¶ÿžÿºÿœÿ¿ÿÁÿÃÿÅÿÇÿÉÿËÿÎÿÐÿÒÿÔÿÖÿØÿÚÿÜÿßÿáÿãÿåÿçÿéÿëÿíÿïÿòÿôÿöÿøÿúÿüÿþ  ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¡ÿ¢ÿ€ÿŠÿšÿªÿ¬ÿ®ÿ±ÿ³ÿµÿ·ÿ¹ÿ»ÿœÿ¿ÿÂÿÄÿÆÿÈÿÊÿÌÿÎÿÐÿÓÿÕÿ×ÿÙÿÛÿÝÿßÿáÿãÿæÿèÿêÿìÿîÿðÿòÿôÿ÷ÿùÿûÿýÿÿ   ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ ÿ¢ÿ¥ÿ§ÿ©ÿ«ÿ­ÿ¯ÿ±ÿ³ÿ¶ÿžÿºÿŒÿŸÿÀÿÂÿÄÿÆÿÉÿËÿÍÿÏÿÑÿÓÿÕÿ×ÿÚÿÜÿÞÿàÿâÿäÿæÿèÿëÿíÿïÿñÿóÿõÿ÷ÿùÿüÿþ     ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¡ÿ£ÿ¥ÿ§ÿ©ÿ¬ÿ®ÿ°ÿ²ÿŽÿ¶ÿžÿºÿœÿ¿ÿÁÿÃÿÅÿÇÿÉÿËÿÎÿÐÿÒÿÔÿÖÿØÿÚÿÜÿßÿáÿãÿåÿçÿéÿëÿíÿïÿòÿôÿöÿøÿúÿüÿþ      ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ¢ÿ€ÿŠÿšÿªÿ¬ÿ®ÿ±ÿ³ÿµÿ·ÿ¹ÿ»ÿœÿ¿ÿÂÿÄÿÆÿÈÿÊÿÌÿÎÿÐÿÓÿÕÿ×ÿÙÿÛÿÝÿßÿáÿãÿæÿèÿêÿìÿîÿðÿòÿôÿ÷ÿùÿûÿýÿÿ      	 
+ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ¢ÿ¥ÿ§ÿ©ÿ«ÿ­ÿ¯ÿ±ÿ³ÿ¶ÿžÿºÿŒÿŸÿÀÿÂÿÄÿÆÿÉÿËÿÍÿÏÿÑÿÓÿÕÿ×ÿÚÿÜÿÞÿàÿâÿäÿæÿèÿëÿíÿïÿñÿóÿõÿ÷ÿùÿüÿþ       	 
+ 
+ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¡ÿ£ÿ¥ÿ§ÿ©ÿ¬ÿ®ÿ°ÿ²ÿŽÿ¶ÿžÿºÿœÿ¿ÿÁÿÃÿÅÿÇÿÉÿËÿÎÿÐÿÒÿÔÿÖÿØÿÚÿÜÿßÿáÿãÿåÿçÿéÿëÿíÿïÿòÿôÿöÿøÿúÿüÿþ       
+ 
+  ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ¢ÿ€ÿŠÿšÿªÿ¬ÿ®ÿ±ÿ³ÿµÿ·ÿ¹ÿ»ÿœÿ¿ÿÂÿÄÿÆÿÈÿÊÿÌÿÎÿÐÿÓÿÕÿ×ÿÙÿÛÿÝÿßÿáÿãÿæÿèÿêÿìÿîÿðÿòÿôÿ÷ÿùÿûÿýÿÿ      	 
+ 
+   ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ¢ÿ¥ÿ§ÿ©ÿ«ÿ­ÿ¯ÿ±ÿ³ÿ¶ÿžÿºÿŒÿŸÿÀÿÂÿÄÿÆÿÉÿËÿÍÿÏÿÑÿÓÿÕÿ×ÿÚÿÜÿÞÿàÿâÿäÿæÿèÿëÿíÿïÿñÿóÿõÿ÷ÿùÿüÿþ       	 
+     ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¡ÿ£ÿ¥ÿ§ÿ©ÿ¬ÿ®ÿ°ÿ²ÿŽÿ¶ÿžÿºÿœÿ¿ÿÁÿÃÿÅÿÇÿÉÿËÿÎÿÐÿÒÿÔÿÖÿØÿÚÿÜÿßÿáÿãÿåÿçÿéÿëÿíÿïÿòÿôÿöÿøÿúÿüÿþ       
+ 
+      ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ¢ÿ€ÿŠÿšÿªÿ¬ÿ®ÿ±ÿ³ÿµÿ·ÿ¹ÿ»ÿœÿ¿ÿÂÿÄÿÆÿÈÿÊÿÌÿÎÿÐÿÓÿÕÿ×ÿÙÿÛÿÝÿßÿáÿãÿæÿèÿêÿìÿîÿðÿòÿôÿ÷ÿùÿûÿýÿÿ      	 
+ 
+       ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ¢ÿ¥ÿ§ÿ©ÿ«ÿ­ÿ¯ÿ±ÿ³ÿ¶ÿžÿºÿŒÿŸÿÀÿÂÿÄÿÆÿÉÿËÿÍÿÏÿÑÿÓÿÕÿ×ÿÚÿÜÿÞÿàÿâÿäÿæÿèÿëÿíÿïÿñÿóÿõÿ÷ÿùÿüÿþ       	 
+        
+ 
+ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¡ÿ£ÿ¥ÿ§ÿ©ÿ¬ÿ®ÿ°ÿ²ÿŽÿ¶ÿžÿºÿœÿ¿ÿÁÿÃÿÅÿÇÿÉÿËÿÎÿÐÿÒÿÔÿÖÿØÿÚÿÜÿßÿáÿãÿåÿçÿéÿëÿíÿïÿòÿôÿöÿøÿúÿüÿþ       
+ 
+        
+  !ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ¢ÿ€ÿŠÿšÿªÿ¬ÿ®ÿ±ÿ³ÿµÿ·ÿ¹ÿ»ÿœÿ¿ÿÂÿÄÿÆÿÈÿÊÿÌÿÎÿÐÿÓÿÕÿ×ÿÙÿÛÿÝÿßÿáÿãÿæÿèÿêÿìÿîÿðÿòÿôÿ÷ÿùÿûÿýÿÿ      	 
+ 
+       
+ 
+   " $ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ¢ÿ¥ÿ§ÿ©ÿ«ÿ­ÿ¯ÿ±ÿ³ÿ¶ÿžÿºÿŒÿŸÿÀÿÂÿÄÿÆÿÉÿËÿÍÿÏÿÑÿÓÿÕÿ×ÿÚÿÜÿÞÿàÿâÿäÿæÿèÿëÿíÿïÿñÿóÿõÿ÷ÿùÿüÿþ       	 
+        
+  ! # % &ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¡ÿ£ÿ¥ÿ§ÿ©ÿ¬ÿ®ÿ°ÿ²ÿŽÿ¶ÿžÿºÿœÿ¿ÿÁÿÃÿÅÿÇÿÉÿËÿÎÿÐÿÒÿÔÿÖÿØÿÚÿÜÿßÿáÿãÿåÿçÿéÿëÿíÿïÿòÿôÿöÿøÿúÿüÿþ       
+ 
+        
+  ! $ & ( )ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ¢ÿ€ÿŠÿšÿªÿ¬ÿ®ÿ±ÿ³ÿµÿ·ÿ¹ÿ»ÿœÿ¿ÿÂÿÄÿÆÿÈÿÊÿÌÿÎÿÐÿÓÿÕÿ×ÿÙÿÛÿÝÿßÿáÿãÿæÿèÿêÿìÿîÿðÿòÿôÿ÷ÿùÿûÿýÿÿ      	 
+ 
+       
+ 
+   " $ & ( + ,ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ¢ÿ¥ÿ§ÿ©ÿ«ÿ­ÿ¯ÿ±ÿ³ÿ¶ÿžÿºÿŒÿŸÿÀÿÂÿÄÿÆÿÉÿËÿÍÿÏÿÑÿÓÿÕÿ×ÿÚÿÜÿÞÿàÿâÿäÿæÿèÿëÿíÿïÿñÿóÿõÿ÷ÿùÿüÿþ       	 
+        
+  ! # % ' ) + - /ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¡ÿ£ÿ¥ÿ§ÿ©ÿ¬ÿ®ÿ°ÿ²ÿŽÿ¶ÿžÿºÿœÿ¿ÿÁÿÃÿÅÿÇÿÉÿËÿÎÿÐÿÒÿÔÿÖÿØÿÚÿÜÿßÿáÿãÿåÿçÿéÿëÿíÿïÿòÿôÿöÿøÿúÿüÿþ       
+ 
+        
+  ! $ & ( * , . 0 2ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ¢ÿ€ÿŠÿšÿªÿ¬ÿ®ÿ±ÿ³ÿµÿ·ÿ¹ÿ»ÿœÿ¿ÿÂÿÄÿÆÿÈÿÊÿÌÿÎÿÐÿÓÿÕÿ×ÿÙÿÛÿÝÿßÿáÿãÿæÿèÿêÿìÿîÿðÿòÿôÿ÷ÿùÿûÿýÿÿ      	 
+ 
+       
+ 
+   " $ & ( + - / 1 3 5ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ¢ÿ¥ÿ§ÿ©ÿ«ÿ­ÿ¯ÿ±ÿ³ÿ¶ÿžÿºÿŒÿŸÿÀÿÂÿÄÿÆÿÉÿËÿÍÿÏÿÑÿÓÿÕÿ×ÿÚÿÜÿÞÿàÿâÿäÿæÿèÿëÿíÿïÿñÿóÿõÿ÷ÿùÿüÿþ       	 
+        
+  ! # % ' ) + - 0 2 4 6 7ÿÿÿÿÿÿÿÿÿ
+ÿ
+ÿÿÿÿÿÿÿÿÿÿÿÿÿ¡ÿ£ÿ¥ÿ§ÿ©ÿ¬ÿ®ÿ°ÿ²ÿŽÿ¶ÿžÿºÿœÿ¿ÿÁÿÃÿÅÿÇÿÉÿËÿÎÿÐÿÒÿÔÿÖÿØÿÚÿÜÿßÿáÿãÿåÿçÿéÿëÿíÿïÿòÿôÿöÿøÿúÿüÿþ       
+ 
+        
+  ! $ & ( * , . 0 2 4 7 9 :ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ¢ÿ€ÿŠÿšÿªÿ¬ÿ®ÿ±ÿ³ÿµÿ·ÿ¹ÿ»ÿœÿ¿ÿÂÿÄÿÆÿÈÿÊÿÌÿÎÿÐÿÓÿÕÿ×ÿÙÿÛÿÝÿßÿáÿãÿæÿèÿêÿìÿîÿðÿòÿôÿ÷ÿùÿûÿýÿÿ      	 
+ 
+       
+ 
+   " $ & ( + - / 1 3 5 7 9 < =ÿÿÿ
+ÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ¢ÿ¥ÿ§ÿ©ÿ«ÿ­ÿ¯ÿ±ÿ³ÿ¶ÿžÿºÿŒÿŸÿÀÿÂÿÄÿÆÿÉÿËÿÍÿÏÿÑÿÓÿÕÿ×ÿÚÿÜÿÞÿàÿâÿäÿæÿèÿëÿíÿïÿñÿóÿõÿ÷ÿùÿüÿþ       	 
+        
+  ! # % ' ) + - 0 2 4 6 8 : < >ÿÿÿÿ
+ÿÿÿÿÿÿÿÿÿÿÿÿÿ¡ÿ£ÿ¥ÿ§ÿ©ÿ¬ÿ®ÿ°ÿ²ÿŽÿ¶ÿžÿºÿœÿ¿ÿÁÿÃÿÅÿÇÿÉÿËÿÎÿÐÿÒÿÔÿÖÿØÿÚÿÜÿßÿáÿãÿåÿçÿéÿëÿíÿïÿòÿôÿöÿøÿúÿüÿþ       
+ 
+        
+  ! $ & ( * , . 0 2 4 7 9 ; = >ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ¢ÿ€ÿŠÿšÿªÿ¬ÿ®ÿ±ÿ³ÿµÿ·ÿ¹ÿ»ÿœÿ¿ÿÂÿÄÿÆÿÈÿÊÿÌÿÎÿÐÿÓÿÕÿ×ÿÙÿÛÿÝÿßÿáÿãÿæÿèÿêÿìÿîÿðÿòÿôÿ÷ÿùÿûÿýÿÿ      	 
+ 
+       
+ 
+   " $ & ( + - / 1 3 5 7 9 < <ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ¢ÿ¥ÿ§ÿ©ÿ«ÿ­ÿ¯ÿ±ÿ³ÿ¶ÿžÿºÿŒÿŸÿÀÿÂÿÄÿÆÿÉÿËÿÍÿÏÿÑÿÓÿÕÿ×ÿÚÿÜÿÞÿàÿâÿäÿæÿèÿëÿíÿïÿñÿóÿõÿ÷ÿùÿüÿþ       	 
+        
+  ! # % ' ) + - 0 2 4 6 8 : ;ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¡ÿ£ÿ¥ÿ§ÿ©ÿ¬ÿ®ÿ°ÿ²ÿŽÿ¶ÿžÿºÿœÿ¿ÿÁÿÃÿÅÿÇÿÉÿËÿÎÿÐÿÒÿÔÿÖÿØÿÚÿÜÿßÿáÿãÿåÿçÿéÿëÿíÿïÿòÿôÿöÿøÿúÿüÿþ       
+ 
+        
+  ! $ & ( * , . 0 2 4 7 9 :ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ¢ÿ€ÿŠÿšÿªÿ¬ÿ®ÿ±ÿ³ÿµÿ·ÿ¹ÿ»ÿœÿ¿ÿÂÿÄÿÆÿÈÿÊÿÌÿÎÿÐÿÓÿÕÿ×ÿÙÿÛÿÝÿßÿáÿãÿæÿèÿêÿìÿîÿðÿòÿôÿ÷ÿùÿûÿýÿÿ      	 
+ 
+       
+ 
+   " $ & ( + - / 1 3 5 7 8ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ¢ÿ¥ÿ§ÿ©ÿ«ÿ­ÿ¯ÿ±ÿ³ÿ¶ÿžÿºÿŒÿŸÿÀÿÂÿÄÿÆÿÉÿËÿÍÿÏÿÑÿÓÿÕÿ×ÿÚÿÜÿÞÿàÿâÿäÿæÿèÿëÿíÿïÿñÿóÿõÿ÷ÿùÿüÿþ       	 
+        
+  ! # % ' ) + - 0 2 4 6 7ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¡ÿ£ÿ¥ÿ§ÿ©ÿ¬ÿ®ÿ°ÿ²ÿŽÿ¶ÿžÿºÿœÿ¿ÿÁÿÃÿÅÿÇÿÉÿËÿÎÿÐÿÒÿÔÿÖÿØÿÚÿÜÿßÿáÿãÿåÿçÿéÿëÿíÿïÿòÿôÿöÿøÿúÿüÿþ       
+ 
+        
+  ! $ & ( * , . 0 2 4 5ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ¢ÿ€ÿŠÿšÿªÿ¬ÿ®ÿ±ÿ³ÿµÿ·ÿ¹ÿ»ÿœÿ¿ÿÂÿÄÿÆÿÈÿÊÿÌÿÎÿÐÿÓÿÕÿ×ÿÙÿÛÿÝÿßÿáÿãÿæÿèÿêÿìÿîÿðÿòÿôÿ÷ÿùÿûÿýÿÿ      	 
+ 
+       
+ 
+   " $ & ( + - / 1 3 4ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ¢ÿ¥ÿ§ÿ©ÿ«ÿ­ÿ¯ÿ±ÿ³ÿ¶ÿžÿºÿŒÿŸÿÀÿÂÿÄÿÆÿÉÿËÿÍÿÏÿÑÿÓÿÕÿ×ÿÚÿÜÿÞÿàÿâÿäÿæÿèÿëÿíÿïÿñÿóÿõÿ÷ÿùÿüÿþ       	 
+        
+  ! # % ' ) + - 0 2 2ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¡ÿ£ÿ¥ÿ§ÿ©ÿ¬ÿ®ÿ°ÿ²ÿŽÿ¶ÿžÿºÿœÿ¿ÿÁÿÃÿÅÿÇÿÉÿËÿÎÿÐÿÒÿÔÿÖÿØÿÚÿÜÿßÿáÿãÿåÿçÿéÿëÿíÿïÿòÿôÿöÿøÿúÿüÿþ       
+ 
+        
+  ! $ & ( * , . 0 1ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ¢ÿ€ÿŠÿšÿªÿ¬ÿ®ÿ±ÿ³ÿµÿ·ÿ¹ÿ»ÿœÿ¿ÿÂÿÄÿÆÿÈÿÊÿÌÿÎÿÐÿÓÿÕÿ×ÿÙÿÛÿÝÿßÿáÿãÿæÿèÿêÿìÿîÿðÿòÿôÿ÷ÿùÿûÿýÿÿ      	 
+ 
+       
+ 
+   " $ & ( + - / 0ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ£ÿ¥ÿ§ÿ©ÿ«ÿ­ÿ¯ÿ±ÿ³ÿ¶ÿžÿºÿŒÿŸÿÀÿÂÿÄÿÆÿÉÿËÿÍÿÏÿÑÿÓÿÕÿ×ÿÚÿÜÿÞÿàÿâÿäÿæÿèÿëÿíÿïÿñÿóÿõÿ÷ÿùÿüÿþ       	 
+        
+  ! # % ' ) + - .ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŠÿ§ÿ©ÿ¬ÿ®ÿ°ÿ²ÿŽÿ¶ÿžÿºÿœÿ¿ÿÁÿÃÿÅÿÇÿÉÿËÿÎÿÐÿÒÿÔÿÖÿØÿÚÿÜÿßÿáÿãÿåÿçÿéÿëÿíÿïÿòÿôÿöÿøÿúÿüÿþ       
+ 
+        
+  ! $ & ( * , -ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ©ÿªÿ¬ÿ®ÿ±ÿ³ÿµÿ·ÿ¹ÿ»ÿœÿ¿ÿÂÿÄÿÆÿÈÿÊÿÌÿÎÿÐÿÓÿÕÿ×ÿÙÿÛÿÝÿßÿáÿãÿæÿèÿêÿìÿîÿðÿòÿôÿ÷ÿùÿûÿýÿÿ      	 
+ 
+       
+ 
+   " $ & ( + +ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¬ÿ­ÿ¯ÿ±ÿ³ÿ¶ÿžÿºÿŒÿŸÿÀÿÂÿÄÿÆÿÉÿËÿÍÿÏÿÑÿÓÿÕÿ×ÿÚÿÜÿÞÿàÿâÿäÿæÿèÿëÿíÿïÿñÿóÿõÿ÷ÿùÿüÿþ       	 
+        
+  ! # % ' ) *ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ®ÿ°ÿ²ÿŽÿ¶ÿžÿºÿœÿ¿ÿÁÿÃÿÅÿÇÿÉÿËÿÎÿÐÿÒÿÔÿÖÿØÿÚÿÜÿßÿáÿãÿåÿçÿéÿëÿíÿïÿòÿôÿöÿøÿúÿüÿþ       
+ 
+        
+  ! $ & ( )ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ±ÿ³ÿµÿ·ÿ¹ÿ»ÿœÿ¿ÿÂÿÄÿÆÿÈÿÊÿÌÿÎÿÐÿÓÿÕÿ×ÿÙÿÛÿÝÿßÿáÿãÿæÿèÿêÿìÿîÿðÿòÿôÿ÷ÿùÿûÿýÿÿ      	 
+ 
+       
+ 
+   " $ & 'ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŽÿ¶ÿžÿºÿŒÿŸÿÀÿÂÿÄÿÆÿÉÿËÿÍÿÏÿÑÿÓÿÕÿ×ÿÚÿÜÿÞÿàÿâÿäÿæÿèÿëÿíÿïÿñÿóÿõÿ÷ÿùÿüÿþ       	 
+        
+  ! # % &ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ·ÿžÿºÿœÿ¿ÿÁÿÃÿÅÿÇÿÉÿËÿÎÿÐÿÒÿÔÿÖÿØÿÚÿÜÿßÿáÿãÿåÿçÿéÿëÿíÿïÿòÿôÿöÿøÿúÿüÿþ       
+ 
+        
+  ! $ $ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿºÿ»ÿœÿ¿ÿÂÿÄÿÆÿÈÿÊÿÌÿÎÿÐÿÓÿÕÿ×ÿÙÿÛÿÝÿßÿáÿãÿæÿèÿêÿìÿîÿðÿòÿôÿ÷ÿùÿûÿýÿÿ      	 
+ 
+       
+ 
+   " #ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿœÿŸÿÀÿÂÿÄÿÆÿÉÿËÿÍÿÏÿÑÿÓÿÕÿ×ÿÚÿÜÿÞÿàÿâÿäÿæÿèÿëÿíÿïÿñÿóÿõÿ÷ÿùÿüÿþ       	 
+        
+  ! !ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿ÿÁÿÃÿÅÿÇÿÉÿËÿÎÿÐÿÒÿÔÿÖÿØÿÚÿÜÿßÿáÿãÿåÿçÿéÿëÿíÿïÿòÿôÿöÿøÿúÿüÿþ       
+ 
+        
+   ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÂÿÄÿÆÿÈÿÊÿÌÿÎÿÐÿÓÿÕÿ×ÿÙÿÛÿÝÿßÿáÿãÿæÿèÿêÿìÿîÿðÿòÿôÿ÷ÿùÿûÿýÿÿ      	 
+ 
+       
+ 
+ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÅÿÆÿÉÿËÿÍÿÏÿÑÿÓÿÕÿ×ÿÚÿÜÿÞÿàÿâÿäÿæÿèÿëÿíÿïÿñÿóÿõÿ÷ÿùÿüÿþ       	 
+        
+ 
+ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÈÿÉÿËÿÎÿÐÿÒÿÔÿÖÿØÿÚÿÜÿßÿáÿãÿåÿçÿéÿëÿíÿïÿòÿôÿöÿøÿúÿüÿþ       
+ 
+        
+ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿËÿÌÿÎÿÐÿÓÿÕÿ×ÿÙÿÛÿÝÿßÿáÿãÿæÿèÿêÿìÿîÿðÿòÿôÿ÷ÿùÿûÿýÿÿ      	 
+ 
+       ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÎÿÏÿÑÿÓÿÕÿ×ÿÚÿÜÿÞÿàÿâÿäÿæÿèÿëÿíÿïÿñÿóÿõÿ÷ÿùÿüÿþ       	 
+       ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÐÿÒÿÔÿÖÿØÿÚÿÜÿßÿáÿãÿåÿçÿéÿëÿíÿïÿòÿôÿöÿøÿúÿüÿþ       
+ 
+      ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÓÿÕÿ×ÿÙÿÛÿÝÿßÿáÿãÿæÿèÿêÿìÿîÿðÿòÿôÿ÷ÿùÿûÿýÿÿ      	 
+ 
+     ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÖÿ×ÿÚÿÜÿÞÿàÿâÿäÿæÿèÿëÿíÿïÿñÿóÿõÿ÷ÿùÿüÿþ       	 
+     ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÙÿÚÿÜÿßÿáÿãÿåÿçÿéÿëÿíÿïÿòÿôÿöÿøÿúÿüÿþ       
+ 
+    ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÜÿÝÿßÿáÿãÿæÿèÿêÿìÿîÿðÿòÿôÿ÷ÿùÿûÿýÿÿ      	 
+ 
+   ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÞÿàÿâÿäÿæÿèÿëÿíÿïÿñÿóÿõÿ÷ÿùÿüÿþ       	 
+   ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿáÿãÿåÿçÿéÿëÿíÿïÿòÿôÿöÿøÿúÿüÿþ       
+ 
+  ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿäÿæÿèÿêÿìÿîÿðÿòÿôÿ÷ÿùÿûÿýÿÿ      	 
+ 
+ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿçÿèÿëÿíÿïÿñÿóÿõÿ÷ÿùÿüÿþ       	 
+ 
+ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿêÿëÿíÿïÿòÿôÿöÿøÿúÿüÿþ       
+ 
+ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿíÿîÿðÿòÿôÿ÷ÿùÿûÿýÿÿ      	 	ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿïÿñÿóÿõÿ÷ÿùÿüÿþ       ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿòÿôÿöÿøÿúÿüÿþ      ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿõÿ÷ÿùÿûÿýÿÿ     ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøÿùÿüÿþ     ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿüÿþ    ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿ   ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ    ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              XTENSION= 'IMAGE   '           / IMAGE extension                                BITPIX  =                   16 / number of bits per data pixel                  NAXIS   =                    3 / number of data axes                            NAXIS1  =                   64 / length of data axis 1                          NAXIS2  =                   64 / length of data axis 2                          NAXIS3  =                    1 / length of data axis 3                          PCOUNT  =                    0 / required keyword; must = 0                     GCOUNT  =                    1 / required keyword; must = 1                     BZERO   =   0.000000000000E+00 / Pixel Value Offset                             BSCALE  =   1.000000000000E+00 / Pixel Value Scale                              END                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             ÿÿÿÿ
+ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ¡ÿ¢ÿ£ÿ€ÿ¥ÿŠÿ§ÿšÿ©ÿªÿ«ÿ¬ÿ­ÿ®ÿ¯ÿ°ÿ±ÿ²ÿ³ÿŽÿµÿ¶ÿ·ÿžÿ¹ÿºÿ»ÿŒÿœÿŸÿ¿ÿÀÿÁÿÿ
+ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ¡ÿ¢ÿ£ÿ€ÿ¥ÿŠÿ§ÿšÿ©ÿªÿ«ÿ¬ÿ­ÿ®ÿ¯ÿ°ÿ±ÿ²ÿ³ÿŽÿµÿ¶ÿ·ÿžÿ¹ÿºÿ»ÿŒÿœÿŸÿ¿ÿÀÿÁÿÂÿÃÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ¡ÿ¢ÿ£ÿ€ÿ¥ÿŠÿ§ÿšÿ©ÿªÿ«ÿ¬ÿ­ÿ®ÿ¯ÿ°ÿ±ÿ²ÿ³ÿŽÿµÿ¶ÿ·ÿžÿ¹ÿºÿ»ÿŒÿœÿŸÿ¿ÿÀÿÁÿÂÿÃÿÄÿÅÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ¡ÿ¢ÿ£ÿ€ÿ¥ÿŠÿ§ÿšÿ©ÿªÿ«ÿ¬ÿ­ÿ®ÿ¯ÿ°ÿ±ÿ²ÿ³ÿŽÿµÿ¶ÿ·ÿžÿ¹ÿºÿ»ÿŒÿœÿŸÿ¿ÿÀÿÁÿÂÿÃÿÄÿÅÿÆÿÇÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ¡ÿ¢ÿ£ÿ€ÿ¥ÿŠÿ§ÿšÿ©ÿªÿ«ÿ¬ÿ­ÿ®ÿ¯ÿ°ÿ±ÿ²ÿ³ÿŽÿµÿ¶ÿ·ÿžÿ¹ÿºÿ»ÿŒÿœÿŸÿ¿ÿÀÿÁÿÂÿÃÿÄÿÅÿÆÿÇÿÈÿÉÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ¡ÿ¢ÿ£ÿ€ÿ¥ÿŠÿ§ÿšÿ©ÿªÿ«ÿ¬ÿ­ÿ®ÿ¯ÿ°ÿ±ÿ²ÿ³ÿŽÿµÿ¶ÿ·ÿžÿ¹ÿºÿ»ÿŒÿœÿŸÿ¿ÿÀÿÁÿÂÿÃÿÄÿÅÿÆÿÇÿÈÿÉÿÊÿËÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ¡ÿ¢ÿ£ÿ€ÿ¥ÿŠÿ§ÿšÿ©ÿªÿ«ÿ¬ÿ­ÿ®ÿ¯ÿ°ÿ±ÿ²ÿ³ÿŽÿµÿ¶ÿ·ÿžÿ¹ÿºÿ»ÿŒÿœÿŸÿ¿ÿÀÿÁÿÂÿÃÿÄÿÅÿÆÿÇÿÈÿÉÿÊÿËÿÌÿÍÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ¡ÿ¢ÿ£ÿ€ÿ¥ÿŠÿ§ÿšÿ©ÿªÿ«ÿ¬ÿ­ÿ®ÿ¯ÿ°ÿ±ÿ²ÿ³ÿŽÿµÿ¶ÿ·ÿžÿ¹ÿºÿ»ÿŒÿœÿŸÿ¿ÿÀÿÁÿÂÿÃÿÄÿÅÿÆÿÇÿÈÿÉÿÊÿËÿÌÿÍÿÎÿÏÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ¡ÿ¢ÿ£ÿ€ÿ¥ÿŠÿ§ÿšÿ©ÿªÿ«ÿ¬ÿ­ÿ®ÿ¯ÿ°ÿ±ÿ²ÿ³ÿŽÿµÿ¶ÿ·ÿžÿ¹ÿºÿ»ÿŒÿœÿŸÿ¿ÿÀÿÁÿÂÿÃÿÄÿÅÿÆÿÇÿÈÿÉÿÊÿËÿÌÿÍÿÎÿÏÿÐÿÑÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ¡ÿ¢ÿ£ÿ€ÿ¥ÿŠÿ§ÿšÿ©ÿªÿ«ÿ¬ÿ­ÿ®ÿ¯ÿ°ÿ±ÿ²ÿ³ÿŽÿµÿ¶ÿ·ÿžÿ¹ÿºÿ»ÿŒÿœÿŸÿ¿ÿÀÿÁÿÂÿÃÿÄÿÅÿÆÿÇÿÈÿÉÿÊÿËÿÌÿÍÿÎÿÏÿÐÿÑÿÒÿÓÿÿÿÿÿÿÿÿÿÿÿ ÿ¡ÿ¢ÿ£ÿ€ÿ¥ÿŠÿ§ÿšÿ©ÿªÿ«ÿ¬ÿ­ÿ®ÿ¯ÿ°ÿ±ÿ²ÿ³ÿŽÿµÿ¶ÿ·ÿžÿ¹ÿºÿ»ÿŒÿœÿŸÿ¿ÿÀÿÁÿÂÿÃÿÄÿÅÿÆÿÇÿÈÿÉÿÊÿËÿÌÿÍÿÎÿÏÿÐÿÑÿÒÿÓÿÔÿÕÿÿÿÿÿÿÿÿÿ ÿ¡ÿ¢ÿ£ÿ€ÿ¥ÿŠÿ§ÿšÿ©ÿªÿ«ÿ¬ÿ­ÿ®ÿ¯ÿ°ÿ±ÿ²ÿ³ÿŽÿµÿ¶ÿ·ÿžÿ¹ÿºÿ»ÿŒÿœÿŸÿ¿ÿÀÿÁÿÂÿÃÿÄÿÅÿÆÿÇÿÈÿÉÿÊÿËÿÌÿÍÿÎÿÏÿÐÿÑÿÒÿÓÿÔÿÕÿÖÿ×ÿÿÿÿÿÿÿ ÿ¡ÿ¢ÿ£ÿ€ÿ¥ÿŠÿ§ÿšÿ©ÿªÿ«ÿ¬ÿ­ÿ®ÿ¯ÿ°ÿ±ÿ²ÿ³ÿŽÿµÿ¶ÿ·ÿžÿ¹ÿºÿ»ÿŒÿœÿŸÿ¿ÿÀÿÁÿÂÿÃÿÄÿÅÿÆÿÇÿÈÿÉÿÊÿËÿÌÿÍÿÎÿÏÿÐÿÑÿÒÿÓÿÔÿÕÿÖÿ×ÿØÿÙÿÿÿÿÿ ÿ¡ÿ¢ÿ£ÿ€ÿ¥ÿŠÿ§ÿšÿ©ÿªÿ«ÿ¬ÿ­ÿ®ÿ¯ÿ°ÿ±ÿ²ÿ³ÿŽÿµÿ¶ÿ·ÿžÿ¹ÿºÿ»ÿŒÿœÿŸÿ¿ÿÀÿÁÿÂÿÃÿÄÿÅÿÆÿÇÿÈÿÉÿÊÿËÿÌÿÍÿÎÿÏÿÐÿÑÿÒÿÓÿÔÿÕÿÖÿ×ÿØÿÙÿÚÿÛÿÿÿ ÿ¡ÿ¢ÿ£ÿ€ÿ¥ÿŠÿ§ÿšÿ©ÿªÿ«ÿ¬ÿ­ÿ®ÿ¯ÿ°ÿ±ÿ²ÿ³ÿŽÿµÿ¶ÿ·ÿžÿ¹ÿºÿ»ÿŒÿœÿŸÿ¿ÿÀÿÁÿÂÿÃÿÄÿÅÿÆÿÇÿÈÿÉÿÊÿËÿÌÿÍÿÎÿÏÿÐÿÑÿÒÿÓÿÔÿÕÿÖÿ×ÿØÿÙÿÚÿÛÿÜÿÝÿ ÿ¡ÿ¢ÿ£ÿ€ÿ¥ÿŠÿ§ÿšÿ©ÿªÿ«ÿ¬ÿ­ÿ®ÿ¯ÿ°ÿ±ÿ²ÿ³ÿŽÿµÿ¶ÿ·ÿžÿ¹ÿºÿ»ÿŒÿœÿŸÿ¿ÿÀÿÁÿÂÿÃÿÄÿÅÿÆÿÇÿÈÿÉÿÊÿËÿÌÿÍÿÎÿÏÿÐÿÑÿÒÿÓÿÔÿÕÿÖÿ×ÿØÿÙÿÚÿÛÿÜÿÝÿÞÿßÿ¢ÿ£ÿ€ÿ¥ÿŠÿ§ÿšÿ©ÿªÿ«ÿ¬ÿ­ÿ®ÿ¯ÿ°ÿ±ÿ²ÿ³ÿŽÿµÿ¶ÿ·ÿžÿ¹ÿºÿ»ÿŒÿœÿŸÿ¿ÿÀÿÁÿÂÿÃÿÄÿÅÿÆÿÇÿÈÿÉÿÊÿËÿÌÿÍÿÎÿÏÿÐÿÑÿÒÿÓÿÔÿÕÿÖÿ×ÿØÿÙÿÚÿÛÿÜÿÝÿÞÿßÿàÿáÿ€ÿ¥ÿŠÿ§ÿšÿ©ÿªÿ«ÿ¬ÿ­ÿ®ÿ¯ÿ°ÿ±ÿ²ÿ³ÿŽÿµÿ¶ÿ·ÿžÿ¹ÿºÿ»ÿŒÿœÿŸÿ¿ÿÀÿÁÿÂÿÃÿÄÿÅÿÆÿÇÿÈÿÉÿÊÿËÿÌÿÍÿÎÿÏÿÐÿÑÿÒÿÓÿÔÿÕÿÖÿ×ÿØÿÙÿÚÿÛÿÜÿÝÿÞÿßÿàÿáÿâÿãÿŠÿ§ÿšÿ©ÿªÿ«ÿ¬ÿ­ÿ®ÿ¯ÿ°ÿ±ÿ²ÿ³ÿŽÿµÿ¶ÿ·ÿžÿ¹ÿºÿ»ÿŒÿœÿŸÿ¿ÿÀÿÁÿÂÿÃÿÄÿÅÿÆÿÇÿÈÿÉÿÊÿËÿÌÿÍÿÎÿÏÿÐÿÑÿÒÿÓÿÔÿÕÿÖÿ×ÿØÿÙÿÚÿÛÿÜÿÝÿÞÿßÿàÿáÿâÿãÿäÿåÿšÿ©ÿªÿ«ÿ¬ÿ­ÿ®ÿ¯ÿ°ÿ±ÿ²ÿ³ÿŽÿµÿ¶ÿ·ÿžÿ¹ÿºÿ»ÿŒÿœÿŸÿ¿ÿÀÿÁÿÂÿÃÿÄÿÅÿÆÿÇÿÈÿÉÿÊÿËÿÌÿÍÿÎÿÏÿÐÿÑÿÒÿÓÿÔÿÕÿÖÿ×ÿØÿÙÿÚÿÛÿÜÿÝÿÞÿßÿàÿáÿâÿãÿäÿåÿæÿçÿªÿ«ÿ¬ÿ­ÿ®ÿ¯ÿ°ÿ±ÿ²ÿ³ÿŽÿµÿ¶ÿ·ÿžÿ¹ÿºÿ»ÿŒÿœÿŸÿ¿ÿÀÿÁÿÂÿÃÿÄÿÅÿÆÿÇÿÈÿÉÿÊÿËÿÌÿÍÿÎÿÏÿÐÿÑÿÒÿÓÿÔÿÕÿÖÿ×ÿØÿÙÿÚÿÛÿÜÿÝÿÞÿßÿàÿáÿâÿãÿäÿåÿæÿçÿèÿéÿ¬ÿ­ÿ®ÿ¯ÿ°ÿ±ÿ²ÿ³ÿŽÿµÿ¶ÿ·ÿžÿ¹ÿºÿ»ÿŒÿœÿŸÿ¿ÿÀÿÁÿÂÿÃÿÄÿÅÿÆÿÇÿÈÿÉÿÊÿËÿÌÿÍÿÎÿÏÿÐÿÑÿÒÿÓÿÔÿÕÿÖÿ×ÿØÿÙÿÚÿÛÿÜÿÝÿÞÿßÿàÿáÿâÿãÿäÿåÿæÿçÿèÿéÿêÿëÿ®ÿ¯ÿ°ÿ±ÿ²ÿ³ÿŽÿµÿ¶ÿ·ÿžÿ¹ÿºÿ»ÿŒÿœÿŸÿ¿ÿÀÿÁÿÂÿÃÿÄÿÅÿÆÿÇÿÈÿÉÿÊÿËÿÌÿÍÿÎÿÏÿÐÿÑÿÒÿÓÿÔÿÕÿÖÿ×ÿØÿÙÿÚÿÛÿÜÿÝÿÞÿßÿàÿáÿâÿãÿäÿåÿæÿçÿèÿéÿêÿëÿìÿíÿ°ÿ±ÿ²ÿ³ÿŽÿµÿ¶ÿ·ÿžÿ¹ÿºÿ»ÿŒÿœÿŸÿ¿ÿÀÿÁÿÂÿÃÿÄÿÅÿÆÿÇÿÈÿÉÿÊÿËÿÌÿÍÿÎÿÏÿÐÿÑÿÒÿÓÿÔÿÕÿÖÿ×ÿØÿÙÿÚÿÛÿÜÿÝÿÞÿßÿàÿáÿâÿãÿäÿåÿæÿçÿèÿéÿêÿëÿìÿíÿîÿïÿ²ÿ³ÿŽÿµÿ¶ÿ·ÿžÿ¹ÿºÿ»ÿŒÿœÿŸÿ¿ÿÀÿÁÿÂÿÃÿÄÿÅÿÆÿÇÿÈÿÉÿÊÿËÿÌÿÍÿÎÿÏÿÐÿÑÿÒÿÓÿÔÿÕÿÖÿ×ÿØÿÙÿÚÿÛÿÜÿÝÿÞÿßÿàÿáÿâÿãÿäÿåÿæÿçÿèÿéÿêÿëÿìÿíÿîÿïÿðÿñÿŽÿµÿ¶ÿ·ÿžÿ¹ÿºÿ»ÿŒÿœÿŸÿ¿ÿÀÿÁÿÂÿÃÿÄÿÅÿÆÿÇÿÈÿÉÿÊÿËÿÌÿÍÿÎÿÏÿÐÿÑÿÒÿÓÿÔÿÕÿÖÿ×ÿØÿÙÿÚÿÛÿÜÿÝÿÞÿßÿàÿáÿâÿãÿäÿåÿæÿçÿèÿéÿêÿëÿìÿíÿîÿïÿðÿñÿòÿóÿ¶ÿ·ÿžÿ¹ÿºÿ»ÿŒÿœÿŸÿ¿ÿÀÿÁÿÂÿÃÿÄÿÅÿÆÿÇÿÈÿÉÿÊÿËÿÌÿÍÿÎÿÏÿÐÿÑÿÒÿÓÿÔÿÕÿÖÿ×ÿØÿÙÿÚÿÛÿÜÿÝÿÞÿßÿàÿáÿâÿãÿäÿåÿæÿçÿèÿéÿêÿëÿìÿíÿîÿïÿðÿñÿòÿóÿôÿõÿžÿ¹ÿºÿ»ÿŒÿœÿŸÿ¿ÿÀÿÁÿÂÿÃÿÄÿÅÿÆÿÇÿÈÿÉÿÊÿËÿÌÿÍÿÎÿÏÿÐÿÑÿÒÿÓÿÔÿÕÿÖÿ×ÿØÿÙÿÚÿÛÿÜÿÝÿÞÿßÿàÿáÿâÿãÿäÿåÿæÿçÿèÿéÿêÿëÿìÿíÿîÿïÿðÿñÿòÿóÿôÿõÿöÿ÷ÿºÿ»ÿŒÿœÿŸÿ¿ÿÀÿÁÿÂÿÃÿÄÿÅÿÆÿÇÿÈÿÉÿÊÿËÿÌÿÍÿÎÿÏÿÐÿÑÿÒÿÓÿÔÿÕÿÖÿ×ÿØÿÙÿÚÿÛÿÜÿÝÿÞÿßÿàÿáÿâÿãÿäÿåÿæÿçÿèÿéÿêÿëÿìÿíÿîÿïÿðÿñÿòÿóÿôÿõÿöÿ÷ÿøÿùÿŒÿœÿŸÿ¿ÿÀÿÁÿÂÿÃÿÄÿÅÿÆÿÇÿÈÿÉÿÊÿËÿÌÿÍÿÎÿÏÿÐÿÑÿÒÿÓÿÔÿÕÿÖÿ×ÿØÿÙÿÚÿÛÿÜÿÝÿÞÿßÿàÿáÿâÿãÿäÿåÿæÿçÿèÿéÿêÿëÿìÿíÿîÿïÿðÿñÿòÿóÿôÿõÿöÿ÷ÿøÿùÿúÿûÿŸÿ¿ÿÀÿÁÿÂÿÃÿÄÿÅÿÆÿÇÿÈÿÉÿÊÿËÿÌÿÍÿÎÿÏÿÐÿÑÿÒÿÓÿÔÿÕÿÖÿ×ÿØÿÙÿÚÿÛÿÜÿÝÿÞÿßÿàÿáÿâÿãÿäÿåÿæÿçÿèÿéÿêÿëÿìÿíÿîÿïÿðÿñÿòÿóÿôÿõÿöÿ÷ÿøÿùÿúÿûÿüÿýÿÀÿÁÿÂÿÃÿÄÿÅÿÆÿÇÿÈÿÉÿÊÿËÿÌÿÍÿÎÿÏÿÐÿÑÿÒÿÓÿÔÿÕÿÖÿ×ÿØÿÙÿÚÿÛÿÜÿÝÿÞÿßÿàÿáÿâÿãÿäÿåÿæÿçÿèÿéÿêÿëÿìÿíÿîÿïÿðÿñÿòÿóÿôÿõÿöÿ÷ÿøÿùÿúÿûÿüÿýÿþÿÿÿÂÿÃÿÄÿÅÿÆÿÇÿÈÿÉÿÊÿËÿÌÿÍÿÎÿÏÿÐÿÑÿÒÿÓÿÔÿÕÿÖÿ×ÿØÿÙÿÚÿÛÿÜÿÝÿÞÿßÿàÿáÿâÿãÿäÿåÿæÿçÿèÿéÿêÿëÿìÿíÿîÿïÿðÿñÿòÿóÿôÿõÿöÿ÷ÿøÿùÿúÿûÿüÿýÿþÿÿ   ÿÄÿÅÿÆÿÇÿÈÿÉÿÊÿËÿÌÿÍÿÎÿÏÿÐÿÑÿÒÿÓÿÔÿÕÿÖÿ×ÿØÿÙÿÚÿÛÿÜÿÝÿÞÿßÿàÿáÿâÿãÿäÿåÿæÿçÿèÿéÿêÿëÿìÿíÿîÿïÿðÿñÿòÿóÿôÿõÿöÿ÷ÿøÿùÿúÿûÿüÿýÿþÿÿ     ÿÆÿÇÿÈÿÉÿÊÿËÿÌÿÍÿÎÿÏÿÐÿÑÿÒÿÓÿÔÿÕÿÖÿ×ÿØÿÙÿÚÿÛÿÜÿÝÿÞÿßÿàÿáÿâÿãÿäÿåÿæÿçÿèÿéÿêÿëÿìÿíÿîÿïÿðÿñÿòÿóÿôÿõÿöÿ÷ÿøÿùÿúÿûÿüÿýÿþÿÿ       ÿÈÿÉÿÊÿËÿÌÿÍÿÎÿÏÿÐÿÑÿÒÿÓÿÔÿÕÿÖÿ×ÿØÿÙÿÚÿÛÿÜÿÝÿÞÿßÿàÿáÿâÿãÿäÿåÿæÿçÿèÿéÿêÿëÿìÿíÿîÿïÿðÿñÿòÿóÿôÿõÿöÿ÷ÿøÿùÿúÿûÿüÿýÿþÿÿ         ÿÊÿËÿÌÿÍÿÎÿÏÿÐÿÑÿÒÿÓÿÔÿÕÿÖÿ×ÿØÿÙÿÚÿÛÿÜÿÝÿÞÿßÿàÿáÿâÿãÿäÿåÿæÿçÿèÿéÿêÿëÿìÿíÿîÿïÿðÿñÿòÿóÿôÿõÿöÿ÷ÿøÿùÿúÿûÿüÿýÿþÿÿ           	ÿÌÿÍÿÎÿÏÿÐÿÑÿÒÿÓÿÔÿÕÿÖÿ×ÿØÿÙÿÚÿÛÿÜÿÝÿÞÿßÿàÿáÿâÿãÿäÿåÿæÿçÿèÿéÿêÿëÿìÿíÿîÿïÿðÿñÿòÿóÿôÿõÿöÿ÷ÿøÿùÿúÿûÿüÿýÿþÿÿ           	 
+ 
+ÿÎÿÏÿÐÿÑÿÒÿÓÿÔÿÕÿÖÿ×ÿØÿÙÿÚÿÛÿÜÿÝÿÞÿßÿàÿáÿâÿãÿäÿåÿæÿçÿèÿéÿêÿëÿìÿíÿîÿïÿðÿñÿòÿóÿôÿõÿöÿ÷ÿøÿùÿúÿûÿüÿýÿþÿÿ           	 
+ 
+ 
+ 
+ÿÐÿÑÿÒÿÓÿÔÿÕÿÖÿ×ÿØÿÙÿÚÿÛÿÜÿÝÿÞÿßÿàÿáÿâÿãÿäÿåÿæÿçÿèÿéÿêÿëÿìÿíÿîÿïÿðÿñÿòÿóÿôÿõÿöÿ÷ÿøÿùÿúÿûÿüÿýÿþÿÿ           	 
+ 
+ 
+ 
+  ÿÒÿÓÿÔÿÕÿÖÿ×ÿØÿÙÿÚÿÛÿÜÿÝÿÞÿßÿàÿáÿâÿãÿäÿåÿæÿçÿèÿéÿêÿëÿìÿíÿîÿïÿðÿñÿòÿóÿôÿõÿöÿ÷ÿøÿùÿúÿûÿüÿýÿþÿÿ           	 
+ 
+ 
+ 
+    ÿÔÿÕÿÖÿ×ÿØÿÙÿÚÿÛÿÜÿÝÿÞÿßÿàÿáÿâÿãÿäÿåÿæÿçÿèÿéÿêÿëÿìÿíÿîÿïÿðÿñÿòÿóÿôÿõÿöÿ÷ÿøÿùÿúÿûÿüÿýÿþÿÿ           	 
+ 
+ 
+ 
+      ÿÖÿ×ÿØÿÙÿÚÿÛÿÜÿÝÿÞÿßÿàÿáÿâÿãÿäÿåÿæÿçÿèÿéÿêÿëÿìÿíÿîÿïÿðÿñÿòÿóÿôÿõÿöÿ÷ÿøÿùÿúÿûÿüÿýÿþÿÿ           	 
+ 
+ 
+ 
+        ÿØÿÙÿÚÿÛÿÜÿÝÿÞÿßÿàÿáÿâÿãÿäÿåÿæÿçÿèÿéÿêÿëÿìÿíÿîÿïÿðÿñÿòÿóÿôÿõÿöÿ÷ÿøÿùÿúÿûÿüÿýÿþÿÿ           	 
+ 
+ 
+ 
+          ÿÚÿÛÿÜÿÝÿÞÿßÿàÿáÿâÿãÿäÿåÿæÿçÿèÿéÿêÿëÿìÿíÿîÿïÿðÿñÿòÿóÿôÿõÿöÿ÷ÿøÿùÿúÿûÿüÿýÿþÿÿ           	 
+ 
+ 
+ 
+            ÿÜÿÝÿÞÿßÿàÿáÿâÿãÿäÿåÿæÿçÿèÿéÿêÿëÿìÿíÿîÿïÿðÿñÿòÿóÿôÿõÿöÿ÷ÿøÿùÿúÿûÿüÿýÿþÿÿ           	 
+ 
+ 
+ 
+              ÿÞÿßÿàÿáÿâÿãÿäÿåÿæÿçÿèÿéÿêÿëÿìÿíÿîÿïÿðÿñÿòÿóÿôÿõÿöÿ÷ÿøÿùÿúÿûÿüÿýÿþÿÿ           	 
+ 
+ 
+ 
+               
+ 
+ÿàÿáÿâÿãÿäÿåÿæÿçÿèÿéÿêÿëÿìÿíÿîÿïÿðÿñÿòÿóÿôÿõÿöÿ÷ÿøÿùÿúÿûÿüÿýÿþÿÿ           	 
+ 
+ 
+ 
+               
+ 
+ 
+ ÿâÿãÿäÿåÿæÿçÿèÿéÿêÿëÿìÿíÿîÿïÿðÿñÿòÿóÿôÿõÿöÿ÷ÿøÿùÿúÿûÿüÿýÿþÿÿ           	 
+ 
+ 
+ 
+               
+ 
+ 
+    !ÿäÿåÿæÿçÿèÿéÿêÿëÿìÿíÿîÿïÿðÿñÿòÿóÿôÿõÿöÿ÷ÿøÿùÿúÿûÿüÿýÿþÿÿ           	 
+ 
+ 
+ 
+               
+ 
+ 
+    ! " #ÿæÿçÿèÿéÿêÿëÿìÿíÿîÿïÿðÿñÿòÿóÿôÿõÿöÿ÷ÿøÿùÿúÿûÿüÿýÿþÿÿ           	 
+ 
+ 
+ 
+               
+ 
+ 
+    ! " # $ %ÿèÿéÿêÿëÿìÿíÿîÿïÿðÿñÿòÿóÿôÿõÿöÿ÷ÿøÿùÿúÿûÿüÿýÿþÿÿ           	 
+ 
+ 
+ 
+               
+ 
+ 
+    ! " # $ % & 'ÿêÿëÿìÿíÿîÿïÿðÿñÿòÿóÿôÿõÿöÿ÷ÿøÿùÿúÿûÿüÿýÿþÿÿ           	 
+ 
+ 
+ 
+               
+ 
+ 
+    ! " # $ % & ' ( )ÿìÿíÿîÿïÿðÿñÿòÿóÿôÿõÿöÿ÷ÿøÿùÿúÿûÿüÿýÿþÿÿ           	 
+ 
+ 
+ 
+               
+ 
+ 
+    ! " # $ % & ' ( ) * +ÿîÿïÿðÿñÿòÿóÿôÿõÿöÿ÷ÿøÿùÿúÿûÿüÿýÿþÿÿ           	 
+ 
+ 
+ 
+               
+ 
+ 
+    ! " # $ % & ' ( ) * + , -ÿðÿñÿòÿóÿôÿõÿöÿ÷ÿøÿùÿúÿûÿüÿýÿþÿÿ           	 
+ 
+ 
+ 
+               
+ 
+ 
+    ! " # $ % & ' ( ) * + , - . /ÿòÿóÿôÿõÿöÿ÷ÿøÿùÿúÿûÿüÿýÿþÿÿ           	 
+ 
+ 
+ 
+               
+ 
+ 
+    ! " # $ % & ' ( ) * + , - . / 0 1ÿôÿõÿöÿ÷ÿøÿùÿúÿûÿüÿýÿþÿÿ           	 
+ 
+ 
+ 
+               
+ 
+ 
+    ! " # $ % & ' ( ) * + , - . / 0 1 2 3ÿöÿ÷ÿøÿùÿúÿûÿüÿýÿþÿÿ           	 
+ 
+ 
+ 
+               
+ 
+ 
+    ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5ÿøÿùÿúÿûÿüÿýÿþÿÿ           	 
+ 
+ 
+ 
+               
+ 
+ 
+    ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7ÿúÿûÿüÿýÿþÿÿ           	 
+ 
+ 
+ 
+               
+ 
+ 
+    ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9ÿüÿýÿþÿÿ           	 
+ 
+ 
+ 
+               
+ 
+ 
+    ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ;ÿþÿÿ           	 
+ 
+ 
+ 
+               
+ 
+ 
+    ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < =           	 
+ 
+ 
+ 
+               
+ 
+ 
+    ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?                                                                                                                                                                                                                                                                                                                                                                                                                                                                XTENSION= 'IMAGE   '           / IMAGE extension                                BITPIX  =                   16 / number of bits per data pixel                  NAXIS   =                    3 / number of data axes                            NAXIS1  =                   91 / length of data axis 1                          NAXIS2  =                   91 / length of data axis 2                          NAXIS3  =                    1 / length of data axis 3                          PCOUNT  =                    0 / required keyword; must = 0                     GCOUNT  =                    1 / required keyword; must = 1                     BZERO   =   0.000000000000E+00 / Pixel Value Offset                             BSCALE  =   1.000000000000E+00 / Pixel Value Scale                              END                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
+ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
+ÿ
+ÿ
+ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¢ÿ ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¥ÿ£ÿ¢ÿ¢ÿ¡ÿ ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ§ÿŠÿ¥ÿ¥ÿ€ÿ£ÿ¢ÿ¢ÿ¡ÿ ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿªÿ©ÿšÿ§ÿ§ÿŠÿ¥ÿ¥ÿ€ÿ£ÿ¢ÿ¢ÿ¡ÿ ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ­ÿ¬ÿ«ÿªÿ©ÿ©ÿšÿ§ÿ§ÿŠÿ¥ÿ¥ÿ€ÿ£ÿ¢ÿ¢ÿ¡ÿ ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ°ÿ®ÿ®ÿ­ÿ¬ÿ¬ÿ«ÿªÿ©ÿ©ÿšÿ§ÿ§ÿŠÿ¥ÿ¥ÿ€ÿ£ÿ¢ÿ¢ÿ¡ÿ ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ³ÿ±ÿ±ÿ°ÿ¯ÿ®ÿ®ÿ­ÿ¬ÿ¬ÿ«ÿªÿ©ÿ©ÿšÿ§ÿ§ÿŠÿ¥ÿ¥ÿ€ÿ£ÿ¢ÿ¢ÿ¡ÿ ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿµÿŽÿ³ÿ³ÿ²ÿ±ÿ±ÿ°ÿ¯ÿ®ÿ®ÿ­ÿ¬ÿ¬ÿ«ÿªÿ©ÿ©ÿšÿ§ÿ§ÿŠÿ¥ÿ¥ÿ€ÿ£ÿ¢ÿ¢ÿ¡ÿ ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÿ·ÿ¶ÿ¶ÿµÿŽÿ³ÿ³ÿ²ÿ±ÿ±ÿ°ÿ¯ÿ®ÿ®ÿ­ÿ¬ÿ¬ÿ«ÿªÿ©ÿ©ÿšÿ§ÿ§ÿŠÿ¥ÿ¥ÿ€ÿ£ÿ¢ÿ¢ÿ¡ÿ ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ»ÿºÿ¹ÿžÿžÿ·ÿ¶ÿ¶ÿµÿŽÿ³ÿ³ÿ²ÿ±ÿ±ÿ°ÿ¯ÿ®ÿ®ÿ­ÿ¬ÿ¬ÿ«ÿªÿ©ÿ©ÿšÿ§ÿ§ÿŠÿ¥ÿ¥ÿ€ÿ£ÿ¢ÿ¢ÿ¡ÿ ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŸÿœÿŒÿ»ÿºÿºÿ¹ÿžÿžÿ·ÿ¶ÿ¶ÿµÿŽÿ³ÿ³ÿ²ÿ±ÿ±ÿ°ÿ¯ÿ®ÿ®ÿ­ÿ¬ÿ¬ÿ«ÿªÿ©ÿ©ÿšÿ§ÿ§ÿŠÿ¥ÿ¥ÿ€ÿ£ÿ¢ÿ¢ÿ¡ÿ ÿ ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÁÿ¿ÿ¿ÿŸÿœÿœÿŒÿ»ÿºÿºÿ¹ÿžÿžÿ·ÿ¶ÿ¶ÿµÿŽÿ³ÿ³ÿ²ÿ±ÿ±ÿ°ÿ¯ÿ®ÿ®ÿ­ÿ¬ÿ¬ÿ«ÿªÿ©ÿ©ÿšÿ§ÿ§ÿŠÿ¥ÿ¥ÿ€ÿ£ÿ¢ÿ¢ÿ¡ÿ¢ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÄÿÂÿÂÿÁÿÀÿ¿ÿ¿ÿŸÿœÿœÿŒÿ»ÿºÿºÿ¹ÿžÿžÿ·ÿ¶ÿ¶ÿµÿŽÿ³ÿ³ÿ²ÿ±ÿ±ÿ°ÿ¯ÿ®ÿ®ÿ­ÿ¬ÿ¬ÿ«ÿªÿ©ÿ©ÿšÿ§ÿ§ÿŠÿ¥ÿ¥ÿ€ÿ£ÿ¢ÿ£ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÆÿÅÿÄÿÄÿÃÿÂÿÂÿÁÿÀÿ¿ÿ¿ÿŸÿœÿœÿŒÿ»ÿºÿºÿ¹ÿžÿžÿ·ÿ¶ÿ¶ÿµÿŽÿ³ÿ³ÿ²ÿ±ÿ±ÿ°ÿ¯ÿ®ÿ®ÿ­ÿ¬ÿ¬ÿ«ÿªÿ©ÿ©ÿšÿ§ÿ§ÿŠÿ¥ÿ¥ÿ€ÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÉÿÈÿÇÿÆÿÆÿÅÿÄÿÄÿÃÿÂÿÂÿÁÿÀÿ¿ÿ¿ÿŸÿœÿœÿŒÿ»ÿºÿºÿ¹ÿžÿžÿ·ÿ¶ÿ¶ÿµÿŽÿ³ÿ³ÿ²ÿ±ÿ±ÿ°ÿ¯ÿ®ÿ®ÿ­ÿ¬ÿ¬ÿ«ÿªÿ©ÿ©ÿšÿ§ÿ§ÿŠÿ¥ÿŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÌÿËÿÊÿÉÿÉÿÈÿÇÿÆÿÆÿÅÿÄÿÄÿÃÿÂÿÂÿÁÿÀÿ¿ÿ¿ÿŸÿœÿœÿŒÿ»ÿºÿºÿ¹ÿžÿžÿ·ÿ¶ÿ¶ÿµÿŽÿ³ÿ³ÿ²ÿ±ÿ±ÿ°ÿ¯ÿ®ÿ®ÿ­ÿ¬ÿ¬ÿ«ÿªÿ©ÿ©ÿšÿ§ÿ§ÿ§ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÏÿÎÿÍÿÌÿËÿËÿÊÿÉÿÉÿÈÿÇÿÆÿÆÿÅÿÄÿÄÿÃÿÂÿÂÿÁÿÀÿ¿ÿ¿ÿŸÿœÿœÿŒÿ»ÿºÿºÿ¹ÿžÿžÿ·ÿ¶ÿ¶ÿµÿŽÿ³ÿ³ÿ²ÿ±ÿ±ÿ°ÿ¯ÿ®ÿ®ÿ­ÿ¬ÿ¬ÿ«ÿªÿ©ÿ©ÿšÿ©ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÒÿÐÿÐÿÏÿÎÿÎÿÍÿÌÿËÿËÿÊÿÉÿÉÿÈÿÇÿÆÿÆÿÅÿÄÿÄÿÃÿÂÿÂÿÁÿÀÿ¿ÿ¿ÿŸÿœÿœÿŒÿ»ÿºÿºÿ¹ÿžÿžÿ·ÿ¶ÿ¶ÿµÿŽÿ³ÿ³ÿ²ÿ±ÿ±ÿ°ÿ¯ÿ®ÿ®ÿ­ÿ¬ÿ¬ÿ«ÿªÿ©ÿªÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÕÿÓÿÓÿÒÿÑÿÐÿÐÿÏÿÎÿÎÿÍÿÌÿËÿËÿÊÿÉÿÉÿÈÿÇÿÆÿÆÿÅÿÄÿÄÿÃÿÂÿÂÿÁÿÀÿ¿ÿ¿ÿŸÿœÿœÿŒÿ»ÿºÿºÿ¹ÿžÿžÿ·ÿ¶ÿ¶ÿµÿŽÿ³ÿ³ÿ²ÿ±ÿ±ÿ°ÿ¯ÿ®ÿ®ÿ­ÿ¬ÿ¬ÿ«ÿ¬ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ×ÿÖÿÕÿÕÿÔÿÓÿÓÿÒÿÑÿÐÿÐÿÏÿÎÿÎÿÍÿÌÿËÿËÿÊÿÉÿÉÿÈÿÇÿÆÿÆÿÅÿÄÿÄÿÃÿÂÿÂÿÁÿÀÿ¿ÿ¿ÿŸÿœÿœÿŒÿ»ÿºÿºÿ¹ÿžÿžÿ·ÿ¶ÿ¶ÿµÿŽÿ³ÿ³ÿ²ÿ±ÿ±ÿ°ÿ¯ÿ®ÿ®ÿ­ÿ¬ÿ­ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÚÿÙÿØÿ×ÿ×ÿÖÿÕÿÕÿÔÿÓÿÓÿÒÿÑÿÐÿÐÿÏÿÎÿÎÿÍÿÌÿËÿËÿÊÿÉÿÉÿÈÿÇÿÆÿÆÿÅÿÄÿÄÿÃÿÂÿÂÿÁÿÀÿ¿ÿ¿ÿŸÿœÿœÿŒÿ»ÿºÿºÿ¹ÿžÿžÿ·ÿ¶ÿ¶ÿµÿŽÿ³ÿ³ÿ²ÿ±ÿ±ÿ°ÿ¯ÿ®ÿ®ÿ®ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÝÿÜÿÛÿÚÿÚÿÙÿØÿ×ÿ×ÿÖÿÕÿÕÿÔÿÓÿÓÿÒÿÑÿÐÿÐÿÏÿÎÿÎÿÍÿÌÿËÿËÿÊÿÉÿÉÿÈÿÇÿÆÿÆÿÅÿÄÿÄÿÃÿÂÿÂÿÁÿÀÿ¿ÿ¿ÿŸÿœÿœÿŒÿ»ÿºÿºÿ¹ÿžÿžÿ·ÿ¶ÿ¶ÿµÿŽÿ³ÿ³ÿ²ÿ±ÿ±ÿ°ÿ¯ÿ°ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿßÿÞÿÝÿÜÿÜÿÛÿÚÿÚÿÙÿØÿ×ÿ×ÿÖÿÕÿÕÿÔÿÓÿÓÿÒÿÑÿÐÿÐÿÏÿÎÿÎÿÍÿÌÿËÿËÿÊÿÉÿÉÿÈÿÇÿÆÿÆÿÅÿÄÿÄÿÃÿÂÿÂÿÁÿÀÿ¿ÿ¿ÿŸÿœÿœÿŒÿ»ÿºÿºÿ¹ÿžÿžÿ·ÿ¶ÿ¶ÿµÿŽÿ³ÿ³ÿ²ÿ±ÿ±ÿ±ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿãÿáÿáÿàÿßÿßÿÞÿÝÿÜÿÜÿÛÿÚÿÚÿÙÿØÿ×ÿ×ÿÖÿÕÿÕÿÔÿÓÿÓÿÒÿÑÿÐÿÐÿÏÿÎÿÎÿÍÿÌÿËÿËÿÊÿÉÿÉÿÈÿÇÿÆÿÆÿÅÿÄÿÄÿÃÿÂÿÂÿÁÿÀÿ¿ÿ¿ÿŸÿœÿœÿŒÿ»ÿºÿºÿ¹ÿžÿžÿ·ÿ¶ÿ¶ÿµÿŽÿ³ÿ³ÿ²ÿ³ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿæÿäÿãÿãÿâÿáÿáÿàÿßÿßÿÞÿÝÿÜÿÜÿÛÿÚÿÚÿÙÿØÿ×ÿ×ÿÖÿÕÿÕÿÔÿÓÿÓÿÒÿÑÿÐÿÐÿÏÿÎÿÎÿÍÿÌÿËÿËÿÊÿÉÿÉÿÈÿÇÿÆÿÆÿÅÿÄÿÄÿÃÿÂÿÂÿÁÿÀÿ¿ÿ¿ÿŸÿœÿœÿŒÿ»ÿºÿºÿ¹ÿžÿžÿ·ÿ¶ÿ¶ÿµÿŽÿ³ÿŽÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿèÿçÿæÿæÿåÿäÿãÿãÿâÿáÿáÿàÿßÿßÿÞÿÝÿÜÿÜÿÛÿÚÿÚÿÙÿØÿ×ÿ×ÿÖÿÕÿÕÿÔÿÓÿÓÿÒÿÑÿÐÿÐÿÏÿÎÿÎÿÍÿÌÿËÿËÿÊÿÉÿÉÿÈÿÇÿÆÿÆÿÅÿÄÿÄÿÃÿÂÿÂÿÁÿÀÿ¿ÿ¿ÿŸÿœÿœÿŒÿ»ÿºÿºÿ¹ÿžÿžÿ·ÿ¶ÿ¶ÿµÿµÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿëÿêÿéÿèÿèÿçÿæÿæÿåÿäÿãÿãÿâÿáÿáÿàÿßÿßÿÞÿÝÿÜÿÜÿÛÿÚÿÚÿÙÿØÿ×ÿ×ÿÖÿÕÿÕÿÔÿÓÿÓÿÒÿÑÿÐÿÐÿÏÿÎÿÎÿÍÿÌÿËÿËÿÊÿÉÿÉÿÈÿÇÿÆÿÆÿÅÿÄÿÄÿÃÿÂÿÂÿÁÿÀÿ¿ÿ¿ÿŸÿœÿœÿŒÿ»ÿºÿºÿ¹ÿžÿžÿ·ÿ¶ÿ·ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿîÿíÿìÿëÿëÿêÿéÿèÿèÿçÿæÿæÿåÿäÿãÿãÿâÿáÿáÿàÿßÿßÿÞÿÝÿÜÿÜÿÛÿÚÿÚÿÙÿØÿ×ÿ×ÿÖÿÕÿÕÿÔÿÓÿÓÿÒÿÑÿÐÿÐÿÏÿÎÿÎÿÍÿÌÿËÿËÿÊÿÉÿÉÿÈÿÇÿÆÿÆÿÅÿÄÿÄÿÃÿÂÿÂÿÁÿÀÿ¿ÿ¿ÿŸÿœÿœÿŒÿ»ÿºÿºÿ¹ÿžÿžÿžÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñÿïÿïÿîÿíÿíÿìÿëÿëÿêÿéÿèÿèÿçÿæÿæÿåÿäÿãÿãÿâÿáÿáÿàÿßÿßÿÞÿÝÿÜÿÜÿÛÿÚÿÚÿÙÿØÿ×ÿ×ÿÖÿÕÿÕÿÔÿÓÿÓÿÒÿÑÿÐÿÐÿÏÿÎÿÎÿÍÿÌÿËÿËÿÊÿÉÿÉÿÈÿÇÿÆÿÆÿÅÿÄÿÄÿÃÿÂÿÂÿÁÿÀÿ¿ÿ¿ÿŸÿœÿœÿŒÿ»ÿºÿºÿ¹ÿºÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿôÿòÿòÿñÿðÿïÿïÿîÿíÿíÿìÿëÿëÿêÿéÿèÿèÿçÿæÿæÿåÿäÿãÿãÿâÿáÿáÿàÿßÿßÿÞÿÝÿÜÿÜÿÛÿÚÿÚÿÙÿØÿ×ÿ×ÿÖÿÕÿÕÿÔÿÓÿÓÿÒÿÑÿÐÿÐÿÏÿÎÿÎÿÍÿÌÿËÿËÿÊÿÉÿÉÿÈÿÇÿÆÿÆÿÅÿÄÿÄÿÃÿÂÿÂÿÁÿÀÿ¿ÿ¿ÿŸÿœÿœÿŒÿ»ÿºÿ»ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷ÿõÿôÿôÿóÿòÿòÿñÿðÿïÿïÿîÿíÿíÿìÿëÿëÿêÿéÿèÿèÿçÿæÿæÿåÿäÿãÿãÿâÿáÿáÿàÿßÿßÿÞÿÝÿÜÿÜÿÛÿÚÿÚÿÙÿØÿ×ÿ×ÿÖÿÕÿÕÿÔÿÓÿÓÿÒÿÑÿÐÿÐÿÏÿÎÿÎÿÍÿÌÿËÿËÿÊÿÉÿÉÿÈÿÇÿÆÿÆÿÅÿÄÿÄÿÃÿÂÿÂÿÁÿÀÿ¿ÿ¿ÿŸÿœÿœÿŒÿœÿÿÿÿÿÿÿÿÿÿÿÿÿùÿøÿ÷ÿ÷ÿöÿõÿôÿôÿóÿòÿòÿñÿðÿïÿïÿîÿíÿíÿìÿëÿëÿêÿéÿèÿèÿçÿæÿæÿåÿäÿãÿãÿâÿáÿáÿàÿßÿßÿÞÿÝÿÜÿÜÿÛÿÚÿÚÿÙÿØÿ×ÿ×ÿÖÿÕÿÕÿÔÿÓÿÓÿÒÿÑÿÐÿÐÿÏÿÎÿÎÿÍÿÌÿËÿËÿÊÿÉÿÉÿÈÿÇÿÆÿÆÿÅÿÄÿÄÿÃÿÂÿÂÿÁÿÀÿ¿ÿ¿ÿŸÿœÿŸÿÿÿÿÿÿÿÿÿüÿûÿúÿùÿùÿøÿ÷ÿ÷ÿöÿõÿôÿôÿóÿòÿòÿñÿðÿïÿïÿîÿíÿíÿìÿëÿëÿêÿéÿèÿèÿçÿæÿæÿåÿäÿãÿãÿâÿáÿáÿàÿßÿßÿÞÿÝÿÜÿÜÿÛÿÚÿÚÿÙÿØÿ×ÿ×ÿÖÿÕÿÕÿÔÿÓÿÓÿÒÿÑÿÐÿÐÿÏÿÎÿÎÿÍÿÌÿËÿËÿÊÿÉÿÉÿÈÿÇÿÆÿÆÿÅÿÄÿÄÿÃÿÂÿÂÿÁÿÀÿ¿ÿ¿ÿ¿ÿÿÿÿÿÿÿþÿýÿüÿüÿûÿúÿùÿùÿøÿ÷ÿ÷ÿöÿõÿôÿôÿóÿòÿòÿñÿðÿïÿïÿîÿíÿíÿìÿëÿëÿêÿéÿèÿèÿçÿæÿæÿåÿäÿãÿãÿâÿáÿáÿàÿßÿßÿÞÿÝÿÜÿÜÿÛÿÚÿÚÿÙÿØÿ×ÿ×ÿÖÿÕÿÕÿÔÿÓÿÓÿÒÿÑÿÐÿÐÿÏÿÎÿÎÿÍÿÌÿËÿËÿÊÿÉÿÉÿÈÿÇÿÆÿÆÿÅÿÄÿÄÿÃÿÂÿÂÿÁÿÀÿÁ      ÿÿÿþÿþÿýÿüÿüÿûÿúÿùÿùÿøÿ÷ÿ÷ÿöÿõÿôÿôÿóÿòÿòÿñÿðÿïÿïÿîÿíÿíÿìÿëÿëÿêÿéÿèÿèÿçÿæÿæÿåÿäÿãÿãÿâÿáÿáÿàÿßÿßÿÞÿÝÿÜÿÜÿÛÿÚÿÚÿÙÿØÿ×ÿ×ÿÖÿÕÿÕÿÔÿÓÿÓÿÒÿÑÿÐÿÐÿÏÿÎÿÎÿÍÿÌÿËÿËÿÊÿÉÿÉÿÈÿÇÿÆÿÆÿÅÿÄÿÄÿÃÿÂÿÂÿÿ         ÿÿÿþÿþÿýÿüÿüÿûÿúÿùÿùÿøÿ÷ÿ÷ÿöÿõÿôÿôÿóÿòÿòÿñÿðÿïÿïÿîÿíÿíÿìÿëÿëÿêÿéÿèÿèÿçÿæÿæÿåÿäÿãÿãÿâÿáÿáÿàÿßÿßÿÞÿÝÿÜÿÜÿÛÿÚÿÚÿÙÿØÿ×ÿ×ÿÖÿÕÿÕÿÔÿÓÿÓÿÒÿÑÿÐÿÐÿÏÿÎÿÎÿÍÿÌÿËÿËÿÊÿÉÿÉÿÈÿÇÿÆÿÆÿÅÿÄÿÃÿÿÿÿ          ÿÿÿþÿþÿýÿüÿüÿûÿúÿùÿùÿøÿ÷ÿ÷ÿöÿõÿôÿôÿóÿòÿòÿñÿðÿïÿïÿîÿíÿíÿìÿëÿëÿêÿéÿèÿèÿçÿæÿæÿåÿäÿãÿãÿâÿáÿáÿàÿßÿßÿÞÿÝÿÜÿÜÿÛÿÚÿÚÿÙÿØÿ×ÿ×ÿÖÿÕÿÕÿÔÿÓÿÓÿÒÿÑÿÐÿÐÿÏÿÎÿÎÿÍÿÌÿËÿËÿÊÿÉÿÉÿÈÿÇÿÆÿÿÿÿÿÿÿÿ            ÿÿÿþÿþÿýÿüÿüÿûÿúÿùÿùÿøÿ÷ÿ÷ÿöÿõÿôÿôÿóÿòÿòÿñÿðÿïÿïÿîÿíÿíÿìÿëÿëÿêÿéÿèÿèÿçÿæÿæÿåÿäÿãÿãÿâÿáÿáÿàÿßÿßÿÞÿÝÿÜÿÜÿÛÿÚÿÚÿÙÿØÿ×ÿ×ÿÖÿÕÿÕÿÔÿÓÿÓÿÒÿÑÿÐÿÐÿÏÿÎÿÎÿÍÿÌÿËÿËÿÊÿÉÿÿÿÿÿÿÿÿÿÿÿÿ              ÿÿÿþÿþÿýÿüÿüÿûÿúÿùÿùÿøÿ÷ÿ÷ÿöÿõÿôÿôÿóÿòÿòÿñÿðÿïÿïÿîÿíÿíÿìÿëÿëÿêÿéÿèÿèÿçÿæÿæÿåÿäÿãÿãÿâÿáÿáÿàÿßÿßÿÞÿÝÿÜÿÜÿÛÿÚÿÚÿÙÿØÿ×ÿ×ÿÖÿÕÿÕÿÔÿÓÿÓÿÒÿÑÿÐÿÐÿÏÿÎÿÎÿÍÿËÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ                ÿÿÿþÿþÿýÿüÿüÿûÿúÿùÿùÿøÿ÷ÿ÷ÿöÿõÿôÿôÿóÿòÿòÿñÿðÿïÿïÿîÿíÿíÿìÿëÿëÿêÿéÿèÿèÿçÿæÿæÿåÿäÿãÿãÿâÿáÿáÿàÿßÿßÿÞÿÝÿÜÿÜÿÛÿÚÿÚÿÙÿØÿ×ÿ×ÿÖÿÕÿÕÿÔÿÓÿÓÿÒÿÑÿÐÿÐÿÎÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ                  ÿÿÿþÿþÿýÿüÿüÿûÿúÿùÿùÿøÿ÷ÿ÷ÿöÿõÿôÿôÿóÿòÿòÿñÿðÿïÿïÿîÿíÿíÿìÿëÿëÿêÿéÿèÿèÿçÿæÿæÿåÿäÿãÿãÿâÿáÿáÿàÿßÿßÿÞÿÝÿÜÿÜÿÛÿÚÿÚÿÙÿØÿ×ÿ×ÿÖÿÕÿÕÿÔÿÓÿÓÿÑÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ 	 	 	                 ÿÿÿþÿþÿýÿüÿüÿûÿúÿùÿùÿøÿ÷ÿ÷ÿöÿõÿôÿôÿóÿòÿòÿñÿðÿïÿïÿîÿíÿíÿìÿëÿëÿêÿéÿèÿèÿçÿæÿæÿåÿäÿãÿãÿâÿáÿáÿàÿßÿßÿÞÿÝÿÜÿÜÿÛÿÚÿÚÿÙÿØÿ×ÿ×ÿÖÿÕÿÔÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ 
+ 
+ 
+ 	 	                 ÿÿÿþÿþÿýÿüÿüÿûÿúÿùÿùÿøÿ÷ÿ÷ÿöÿõÿôÿôÿóÿòÿòÿñÿðÿïÿïÿîÿíÿíÿìÿëÿëÿêÿéÿèÿèÿçÿæÿæÿåÿäÿãÿãÿâÿáÿáÿàÿßÿßÿÞÿÝÿÜÿÜÿÛÿÚÿÚÿÙÿØÿ×ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ 
+ 
+ 
+ 
+ 
+ 	 	                 ÿÿÿþÿþÿýÿüÿüÿûÿúÿùÿùÿøÿ÷ÿ÷ÿöÿõÿôÿôÿóÿòÿòÿñÿðÿïÿïÿîÿíÿíÿìÿëÿëÿêÿéÿèÿèÿçÿæÿæÿåÿäÿãÿãÿâÿáÿáÿàÿßÿßÿÞÿÝÿÜÿÜÿÛÿÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ 
+  
+ 
+ 
+ 
+ 
+ 	 	                 ÿÿÿþÿþÿýÿüÿüÿûÿúÿùÿùÿøÿ÷ÿ÷ÿöÿõÿôÿôÿóÿòÿòÿñÿðÿïÿïÿîÿíÿíÿìÿëÿëÿêÿéÿèÿèÿçÿæÿæÿåÿäÿãÿãÿâÿáÿáÿàÿßÿßÿÞÿÜÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ     
+ 
+ 
+ 
+ 
+ 	 	                 ÿÿÿþÿþÿýÿüÿüÿûÿúÿùÿùÿøÿ÷ÿ÷ÿöÿõÿôÿôÿóÿòÿòÿñÿðÿïÿïÿîÿíÿíÿìÿëÿëÿêÿéÿèÿèÿçÿæÿæÿåÿäÿãÿãÿâÿáÿáÿßÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ       
+ 
+ 
+ 
+ 
+ 	 	                 ÿÿÿþÿþÿýÿüÿüÿûÿúÿùÿùÿøÿ÷ÿ÷ÿöÿõÿôÿôÿóÿòÿòÿñÿðÿïÿïÿîÿíÿíÿìÿëÿëÿêÿéÿèÿèÿçÿæÿæÿåÿäÿãÿâÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ         
+ 
+ 
+ 
+ 
+ 	 	                 ÿÿÿþÿþÿýÿüÿüÿûÿúÿùÿùÿøÿ÷ÿ÷ÿöÿõÿôÿôÿóÿòÿòÿñÿðÿïÿïÿîÿíÿíÿìÿëÿëÿêÿéÿèÿèÿçÿæÿåÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ           
+ 
+ 
+ 
+ 
+ 	 	                 ÿÿÿþÿþÿýÿüÿüÿûÿúÿùÿùÿøÿ÷ÿ÷ÿöÿõÿôÿôÿóÿòÿòÿñÿðÿïÿïÿîÿíÿíÿìÿëÿëÿêÿéÿèÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ             
+ 
+ 
+ 
+ 
+ 	 	                 ÿÿÿþÿþÿýÿüÿüÿûÿúÿùÿùÿøÿ÷ÿ÷ÿöÿõÿôÿôÿóÿòÿòÿñÿðÿïÿïÿîÿíÿíÿìÿëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ               
+ 
+ 
+ 
+ 
+ 	 	                 ÿÿÿþÿþÿýÿüÿüÿûÿúÿùÿùÿøÿ÷ÿ÷ÿöÿõÿôÿôÿóÿòÿòÿñÿðÿïÿïÿíÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ                 
+ 
+ 
+ 
+ 
+ 	 	                 ÿÿÿþÿþÿýÿüÿüÿûÿúÿùÿùÿøÿ÷ÿ÷ÿöÿõÿôÿôÿóÿòÿòÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ                   
+ 
+ 
+ 
+ 
+ 	 	                 ÿÿÿþÿþÿýÿüÿüÿûÿúÿùÿùÿøÿ÷ÿ÷ÿöÿõÿôÿóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ                     
+ 
+ 
+ 
+ 
+ 	 	                 ÿÿÿþÿþÿýÿüÿüÿûÿúÿùÿùÿøÿ÷ÿöÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ  
+                     
+ 
+ 
+ 
+ 
+ 	 	                 ÿÿÿþÿþÿýÿüÿüÿûÿúÿùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ 
+ 
+ 
+ 
+                     
+ 
+ 
+ 
+ 
+ 	 	                 ÿÿÿþÿþÿýÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ 
+  
+ 
+ 
+ 
+                     
+ 
+ 
+ 
+ 
+ 	 	                 ÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ      
+ 
+ 
+ 
+                     
+ 
+ 
+ 
+ 
+ 	 	            ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ! ! !     
+ 
+ 
+ 
+                     
+ 
+ 
+ 
+ 
+ 	 	       ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ " # " ! !     
+ 
+ 
+ 
+                     
+ 
+ 
+ 
+ 
+ 	 	   ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ $ $ $ # " ! !     
+ 
+ 
+ 
+                     
+ 
+ 
+ 
+ 
+ 	ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ % & % $ $ # " ! !     
+ 
+ 
+ 
+                     
+ 
+ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ & ' & & % $ $ # " ! !     
+ 
+ 
+ 
+                  ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ( ( ( ' & & % $ $ # " ! !     
+ 
+ 
+ 
+              ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ) * ) ( ( ' & & % $ $ # " ! !     
+ 
+ 
+ 
+          ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ + + + * ) ( ( ' & & % $ $ # " ! !     
+ 
+ 
+ 
+      ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ , - , + + * ) ( ( ' & & % $ $ # " ! !     
+ 
+ 
+ 
+  ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ - . - - , + + * ) ( ( ' & & % $ $ # " ! !     
+ 
+ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ / 0 / . - - , + + * ) ( ( ' & & % $ $ # " ! ! ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ 0 1 0 0 / . - - , + + * ) ( ( ' & & % $ $ "ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ 2 2 2 1 0 0 / . - - , + + * ) ( ( ' & %ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ 3 4 3 2 2 1 0 0 / . - - , + + * ) (ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ 5 5 4 4 3 2 2 1 0 0 / . - - , +ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ 6 7 6 5 4 4 3 2 2 1 0 0 / -ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ 7 8 7 7 6 5 4 4 3 2 2 0ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ 9 9 9 8 7 7 6 5 4 3ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ : ; : 9 9 8 7 6ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ < < < ; : 9ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ = > = <ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ > >ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              XTENSION= 'IMAGE   '           / IMAGE extension                                BITPIX  =                   16 / number of bits per data pixel                  NAXIS   =                    3 / number of data axes                            NAXIS1  =                   64 / length of data axis 1                          NAXIS2  =                   64 / length of data axis 2                          NAXIS3  =                    1 / length of data axis 3                          PCOUNT  =                    0 / required keyword; must = 0                     GCOUNT  =                    1 / required keyword; must = 1                     BZERO   =   0.000000000000E+00 / Pixel Value Offset                             BSCALE  =   1.000000000000E+00 / Pixel Value Scale                              END                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               ÿþÿüÿúÿøÿöÿôÿòÿðÿîÿìÿêÿèÿæÿäÿâÿàÿÞÿÜÿÚÿØÿÖÿÔÿÒÿÐÿÎÿÌÿÊÿÈÿÆÿÄÿÂÿÀÿŸÿŒÿºÿžÿ¶ÿŽÿ²ÿ°ÿ®ÿ¬ÿªÿšÿŠÿ€ÿ¢ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿýÿûÿùÿ÷ÿõÿóÿñÿïÿíÿëÿéÿçÿåÿãÿáÿßÿÝÿÛÿÙÿ×ÿÕÿÓÿÑÿÏÿÍÿËÿÉÿÇÿÅÿÃÿÁÿ¿ÿœÿ»ÿ¹ÿ·ÿµÿ³ÿ±ÿ¯ÿ­ÿ«ÿ©ÿ§ÿ¥ÿ£ÿ¡ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
+ÿ   ÿþÿüÿúÿøÿöÿôÿòÿðÿîÿìÿêÿèÿæÿäÿâÿàÿÞÿÜÿÚÿØÿÖÿÔÿÒÿÐÿÎÿÌÿÊÿÈÿÆÿÄÿÂÿÀÿŸÿŒÿºÿžÿ¶ÿŽÿ²ÿ°ÿ®ÿ¬ÿªÿšÿŠÿ€ÿ¢ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ  ÿÿÿýÿûÿùÿ÷ÿõÿóÿñÿïÿíÿëÿéÿçÿåÿãÿáÿßÿÝÿÛÿÙÿ×ÿÕÿÓÿÑÿÏÿÍÿËÿÉÿÇÿÅÿÃÿÁÿ¿ÿœÿ»ÿ¹ÿ·ÿµÿ³ÿ±ÿ¯ÿ­ÿ«ÿ©ÿ§ÿ¥ÿ£ÿ¡ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
+    ÿþÿüÿúÿøÿöÿôÿòÿðÿîÿìÿêÿèÿæÿäÿâÿàÿÞÿÜÿÚÿØÿÖÿÔÿÒÿÐÿÎÿÌÿÊÿÈÿÆÿÄÿÂÿÀÿŸÿŒÿºÿžÿ¶ÿŽÿ²ÿ°ÿ®ÿ¬ÿªÿšÿŠÿ€ÿ¢ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿ   ÿÿÿýÿûÿùÿ÷ÿõÿóÿñÿïÿíÿëÿéÿçÿåÿãÿáÿßÿÝÿÛÿÙÿ×ÿÕÿÓÿÑÿÏÿÍÿËÿÉÿÇÿÅÿÃÿÁÿ¿ÿœÿ»ÿ¹ÿ·ÿµÿ³ÿ±ÿ¯ÿ­ÿ«ÿ©ÿ§ÿ¥ÿ£ÿ¡ÿÿÿÿÿÿÿÿÿÿÿÿÿ     ÿþÿüÿúÿøÿöÿôÿòÿðÿîÿìÿêÿèÿæÿäÿâÿàÿÞÿÜÿÚÿØÿÖÿÔÿÒÿÐÿÎÿÌÿÊÿÈÿÆÿÄÿÂÿÀÿŸÿŒÿºÿžÿ¶ÿŽÿ²ÿ°ÿ®ÿ¬ÿªÿšÿŠÿ€ÿ¢ÿ ÿÿÿÿÿÿÿÿÿÿÿÿ    ÿÿÿýÿûÿùÿ÷ÿõÿóÿñÿïÿíÿëÿéÿçÿåÿãÿáÿßÿÝÿÛÿÙÿ×ÿÕÿÓÿÑÿÏÿÍÿËÿÉÿÇÿÅÿÃÿÁÿ¿ÿœÿ»ÿ¹ÿ·ÿµÿ³ÿ±ÿ¯ÿ­ÿ«ÿ©ÿ§ÿ¥ÿ£ÿ¡ÿÿÿÿÿÿÿÿÿÿÿÿ      ÿþÿüÿúÿøÿöÿôÿòÿðÿîÿìÿêÿèÿæÿäÿâÿàÿÞÿÜÿÚÿØÿÖÿÔÿÒÿÐÿÎÿÌÿÊÿÈÿÆÿÄÿÂÿÀÿŸÿŒÿºÿžÿ¶ÿŽÿ²ÿ°ÿ®ÿ¬ÿªÿšÿŠÿ€ÿ¢ÿ ÿÿÿÿÿÿÿÿÿÿÿ 	    ÿÿÿýÿûÿùÿ÷ÿõÿóÿñÿïÿíÿëÿéÿçÿåÿãÿáÿßÿÝÿÛÿÙÿ×ÿÕÿÓÿÑÿÏÿÍÿËÿÉÿÇÿÅÿÃÿÁÿ¿ÿœÿ»ÿ¹ÿ·ÿµÿ³ÿ±ÿ¯ÿ­ÿ«ÿ©ÿ§ÿ¥ÿ£ÿ¡ÿÿÿÿÿÿÿÿÿÿÿ 
+      ÿþÿüÿúÿøÿöÿôÿòÿðÿîÿìÿêÿèÿæÿäÿâÿàÿÞÿÜÿÚÿØÿÖÿÔÿÒÿÐÿÎÿÌÿÊÿÈÿÆÿÄÿÂÿÀÿŸÿŒÿºÿžÿ¶ÿŽÿ²ÿ°ÿ®ÿ¬ÿªÿšÿŠÿ€ÿ¢ÿ ÿÿÿÿÿÿÿÿÿÿ 
+ 	    ÿÿÿýÿûÿùÿ÷ÿõÿóÿñÿïÿíÿëÿéÿçÿåÿãÿáÿßÿÝÿÛÿÙÿ×ÿÕÿÓÿÑÿÏÿÍÿËÿÉÿÇÿÅÿÃÿÁÿ¿ÿœÿ»ÿ¹ÿ·ÿµÿ³ÿ±ÿ¯ÿ­ÿ«ÿ©ÿ§ÿ¥ÿ£ÿ¡ÿÿÿÿÿÿÿÿÿÿ 
+ 
+      ÿþÿüÿúÿøÿöÿôÿòÿðÿîÿìÿêÿèÿæÿäÿâÿàÿÞÿÜÿÚÿØÿÖÿÔÿÒÿÐÿÎÿÌÿÊÿÈÿÆÿÄÿÂÿÀÿŸÿŒÿºÿžÿ¶ÿŽÿ²ÿ°ÿ®ÿ¬ÿªÿšÿŠÿ€ÿ¢ÿ ÿÿÿÿÿÿÿÿÿ 
+ 
+ 	    ÿÿÿýÿûÿùÿ÷ÿõÿóÿñÿïÿíÿëÿéÿçÿåÿãÿáÿßÿÝÿÛÿÙÿ×ÿÕÿÓÿÑÿÏÿÍÿËÿÉÿÇÿÅÿÃÿÁÿ¿ÿœÿ»ÿ¹ÿ·ÿµÿ³ÿ±ÿ¯ÿ­ÿ«ÿ©ÿ§ÿ¥ÿ£ÿ¡ÿÿÿÿÿÿÿÿÿ  
+ 
+      ÿþÿüÿúÿøÿöÿôÿòÿðÿîÿìÿêÿèÿæÿäÿâÿàÿÞÿÜÿÚÿØÿÖÿÔÿÒÿÐÿÎÿÌÿÊÿÈÿÆÿÄÿÂÿÀÿŸÿŒÿºÿžÿ¶ÿŽÿ²ÿ°ÿ®ÿ¬ÿªÿšÿŠÿ€ÿ¢ÿ ÿÿÿÿÿÿÿÿ  
+ 
+ 	    ÿÿÿýÿûÿùÿ÷ÿõÿóÿñÿïÿíÿëÿéÿçÿåÿãÿáÿßÿÝÿÛÿÙÿ×ÿÕÿÓÿÑÿÏÿÍÿËÿÉÿÇÿÅÿÃÿÁÿ¿ÿœÿ»ÿ¹ÿ·ÿµÿ³ÿ±ÿ¯ÿ­ÿ«ÿ©ÿ§ÿ¥ÿ£ÿ¡ÿÿÿÿÿÿÿÿ   
+ 
+      ÿþÿüÿúÿøÿöÿôÿòÿðÿîÿìÿêÿèÿæÿäÿâÿàÿÞÿÜÿÚÿØÿÖÿÔÿÒÿÐÿÎÿÌÿÊÿÈÿÆÿÄÿÂÿÀÿŸÿŒÿºÿžÿ¶ÿŽÿ²ÿ°ÿ®ÿ¬ÿªÿšÿŠÿ€ÿ¢ÿ ÿÿÿÿÿÿÿ   
+ 
+ 	    ÿÿÿýÿûÿùÿ÷ÿõÿóÿñÿïÿíÿëÿéÿçÿåÿãÿáÿßÿÝÿÛÿÙÿ×ÿÕÿÓÿÑÿÏÿÍÿËÿÉÿÇÿÅÿÃÿÁÿ¿ÿœÿ»ÿ¹ÿ·ÿµÿ³ÿ±ÿ¯ÿ­ÿ«ÿ©ÿ§ÿ¥ÿ£ÿ¡ÿÿÿÿÿÿÿ    
+ 
+      ÿþÿüÿúÿøÿöÿôÿòÿðÿîÿìÿêÿèÿæÿäÿâÿàÿÞÿÜÿÚÿØÿÖÿÔÿÒÿÐÿÎÿÌÿÊÿÈÿÆÿÄÿÂÿÀÿŸÿŒÿºÿžÿ¶ÿŽÿ²ÿ°ÿ®ÿ¬ÿªÿšÿŠÿ€ÿ¢ÿ ÿÿÿÿÿÿ    
+ 
+ 	    ÿÿÿýÿûÿùÿ÷ÿõÿóÿñÿïÿíÿëÿéÿçÿåÿãÿáÿßÿÝÿÛÿÙÿ×ÿÕÿÓÿÑÿÏÿÍÿËÿÉÿÇÿÅÿÃÿÁÿ¿ÿœÿ»ÿ¹ÿ·ÿµÿ³ÿ±ÿ¯ÿ­ÿ«ÿ©ÿ§ÿ¥ÿ£ÿ¡ÿÿÿÿÿÿ     
+ 
+      ÿþÿüÿúÿøÿöÿôÿòÿðÿîÿìÿêÿèÿæÿäÿâÿàÿÞÿÜÿÚÿØÿÖÿÔÿÒÿÐÿÎÿÌÿÊÿÈÿÆÿÄÿÂÿÀÿŸÿŒÿºÿžÿ¶ÿŽÿ²ÿ°ÿ®ÿ¬ÿªÿšÿŠÿ€ÿ¢ÿ ÿÿÿÿÿ     
+ 
+ 	    ÿÿÿýÿûÿùÿ÷ÿõÿóÿñÿïÿíÿëÿéÿçÿåÿãÿáÿßÿÝÿÛÿÙÿ×ÿÕÿÓÿÑÿÏÿÍÿËÿÉÿÇÿÅÿÃÿÁÿ¿ÿœÿ»ÿ¹ÿ·ÿµÿ³ÿ±ÿ¯ÿ­ÿ«ÿ©ÿ§ÿ¥ÿ£ÿ¡ÿÿÿÿÿ      
+ 
+      ÿþÿüÿúÿøÿöÿôÿòÿðÿîÿìÿêÿèÿæÿäÿâÿàÿÞÿÜÿÚÿØÿÖÿÔÿÒÿÐÿÎÿÌÿÊÿÈÿÆÿÄÿÂÿÀÿŸÿŒÿºÿžÿ¶ÿŽÿ²ÿ°ÿ®ÿ¬ÿªÿšÿŠÿ€ÿ¢ÿ ÿÿÿÿ      
+ 
+ 	    ÿÿÿýÿûÿùÿ÷ÿõÿóÿñÿïÿíÿëÿéÿçÿåÿãÿáÿßÿÝÿÛÿÙÿ×ÿÕÿÓÿÑÿÏÿÍÿËÿÉÿÇÿÅÿÃÿÁÿ¿ÿœÿ»ÿ¹ÿ·ÿµÿ³ÿ±ÿ¯ÿ­ÿ«ÿ©ÿ§ÿ¥ÿ£ÿ¡ÿÿÿÿ       
+ 
+      ÿþÿüÿúÿøÿöÿôÿòÿðÿîÿìÿêÿèÿæÿäÿâÿàÿÞÿÜÿÚÿØÿÖÿÔÿÒÿÐÿÎÿÌÿÊÿÈÿÆÿÄÿÂÿÀÿŸÿŒÿºÿžÿ¶ÿŽÿ²ÿ°ÿ®ÿ¬ÿªÿšÿŠÿ€ÿ¢ÿ ÿÿÿ       
+ 
+ 	    ÿÿÿýÿûÿùÿ÷ÿõÿóÿñÿïÿíÿëÿéÿçÿåÿãÿáÿßÿÝÿÛÿÙÿ×ÿÕÿÓÿÑÿÏÿÍÿËÿÉÿÇÿÅÿÃÿÁÿ¿ÿœÿ»ÿ¹ÿ·ÿµÿ³ÿ±ÿ¯ÿ­ÿ«ÿ©ÿ§ÿ¥ÿ£ÿ¡ÿÿÿ        
+ 
+      ÿþÿüÿúÿøÿöÿôÿòÿðÿîÿìÿêÿèÿæÿäÿâÿàÿÞÿÜÿÚÿØÿÖÿÔÿÒÿÐÿÎÿÌÿÊÿÈÿÆÿÄÿÂÿÀÿŸÿŒÿºÿžÿ¶ÿŽÿ²ÿ°ÿ®ÿ¬ÿªÿšÿŠÿ€ÿ¢ÿ ÿÿ        
+ 
+ 	    ÿÿÿýÿûÿùÿ÷ÿõÿóÿñÿïÿíÿëÿéÿçÿåÿãÿáÿßÿÝÿÛÿÙÿ×ÿÕÿÓÿÑÿÏÿÍÿËÿÉÿÇÿÅÿÃÿÁÿ¿ÿœÿ»ÿ¹ÿ·ÿµÿ³ÿ±ÿ¯ÿ­ÿ«ÿ©ÿ§ÿ¥ÿ£ÿ¡ÿÿ 
+        
+ 
+      ÿþÿüÿúÿøÿöÿôÿòÿðÿîÿìÿêÿèÿæÿäÿâÿàÿÞÿÜÿÚÿØÿÖÿÔÿÒÿÐÿÎÿÌÿÊÿÈÿÆÿÄÿÂÿÀÿŸÿŒÿºÿžÿ¶ÿŽÿ²ÿ°ÿ®ÿ¬ÿªÿšÿŠÿ€ÿ¢ÿ ÿ 
+        
+ 
+ 	    ÿÿÿýÿûÿùÿ÷ÿõÿóÿñÿïÿíÿëÿéÿçÿåÿãÿáÿßÿÝÿÛÿÙÿ×ÿÕÿÓÿÑÿÏÿÍÿËÿÉÿÇÿÅÿÃÿÁÿ¿ÿœÿ»ÿ¹ÿ·ÿµÿ³ÿ±ÿ¯ÿ­ÿ«ÿ©ÿ§ÿ¥ÿ£ÿ¡ÿ 
+ 
+        
+ 
+      ÿþÿüÿúÿøÿöÿôÿòÿðÿîÿìÿêÿèÿæÿäÿâÿàÿÞÿÜÿÚÿØÿÖÿÔÿÒÿÐÿÎÿÌÿÊÿÈÿÆÿÄÿÂÿÀÿŸÿŒÿºÿžÿ¶ÿŽÿ²ÿ°ÿ®ÿ¬ÿªÿšÿŠÿ€ÿ¢ÿ   
+        
+ 
+ 	    ÿÿÿýÿûÿùÿ÷ÿõÿóÿñÿïÿíÿëÿéÿçÿåÿãÿáÿßÿÝÿÛÿÙÿ×ÿÕÿÓÿÑÿÏÿÍÿËÿÉÿÇÿÅÿÃÿÁÿ¿ÿœÿ»ÿ¹ÿ·ÿµÿ³ÿ±ÿ¯ÿ­ÿ«ÿ©ÿ§ÿ¥ÿ£ÿ¡   
+ 
+        
+ 
+      ÿþÿüÿúÿøÿöÿôÿòÿðÿîÿìÿêÿèÿæÿäÿâÿàÿÞÿÜÿÚÿØÿÖÿÔÿÒÿÐÿÎÿÌÿÊÿÈÿÆÿÄÿÂÿÀÿŸÿŒÿºÿžÿ¶ÿŽÿ²ÿ°ÿ®ÿ¬ÿªÿšÿŠÿ€ÿ¢ !  
+        
+ 
+ 	    ÿÿÿýÿûÿùÿ÷ÿõÿóÿñÿïÿíÿëÿéÿçÿåÿãÿáÿßÿÝÿÛÿÙÿ×ÿÕÿÓÿÑÿÏÿÍÿËÿÉÿÇÿÅÿÃÿÁÿ¿ÿœÿ»ÿ¹ÿ·ÿµÿ³ÿ±ÿ¯ÿ­ÿ«ÿ©ÿ§ÿ¥ÿ£ "   
+ 
+        
+ 
+      ÿþÿüÿúÿøÿöÿôÿòÿðÿîÿìÿêÿèÿæÿäÿâÿàÿÞÿÜÿÚÿØÿÖÿÔÿÒÿÐÿÎÿÌÿÊÿÈÿÆÿÄÿÂÿÀÿŸÿŒÿºÿžÿ¶ÿŽÿ²ÿ°ÿ®ÿ¬ÿªÿšÿŠÿ€ # !  
+        
+ 
+ 	    ÿÿÿýÿûÿùÿ÷ÿõÿóÿñÿïÿíÿëÿéÿçÿåÿãÿáÿßÿÝÿÛÿÙÿ×ÿÕÿÓÿÑÿÏÿÍÿËÿÉÿÇÿÅÿÃÿÁÿ¿ÿœÿ»ÿ¹ÿ·ÿµÿ³ÿ±ÿ¯ÿ­ÿ«ÿ©ÿ§ÿ¥ $ "   
+ 
+        
+ 
+      ÿþÿüÿúÿøÿöÿôÿòÿðÿîÿìÿêÿèÿæÿäÿâÿàÿÞÿÜÿÚÿØÿÖÿÔÿÒÿÐÿÎÿÌÿÊÿÈÿÆÿÄÿÂÿÀÿŸÿŒÿºÿžÿ¶ÿŽÿ²ÿ°ÿ®ÿ¬ÿªÿšÿŠ % # !  
+        
+ 
+ 	    ÿÿÿýÿûÿùÿ÷ÿõÿóÿñÿïÿíÿëÿéÿçÿåÿãÿáÿßÿÝÿÛÿÙÿ×ÿÕÿÓÿÑÿÏÿÍÿËÿÉÿÇÿÅÿÃÿÁÿ¿ÿœÿ»ÿ¹ÿ·ÿµÿ³ÿ±ÿ¯ÿ­ÿ«ÿ©ÿ§ & $ "   
+ 
+        
+ 
+      ÿþÿüÿúÿøÿöÿôÿòÿðÿîÿìÿêÿèÿæÿäÿâÿàÿÞÿÜÿÚÿØÿÖÿÔÿÒÿÐÿÎÿÌÿÊÿÈÿÆÿÄÿÂÿÀÿŸÿŒÿºÿžÿ¶ÿŽÿ²ÿ°ÿ®ÿ¬ÿªÿš ' % # !  
+        
+ 
+ 	    ÿÿÿýÿûÿùÿ÷ÿõÿóÿñÿïÿíÿëÿéÿçÿåÿãÿáÿßÿÝÿÛÿÙÿ×ÿÕÿÓÿÑÿÏÿÍÿËÿÉÿÇÿÅÿÃÿÁÿ¿ÿœÿ»ÿ¹ÿ·ÿµÿ³ÿ±ÿ¯ÿ­ÿ«ÿ© ( & $ "   
+ 
+        
+ 
+      ÿþÿüÿúÿøÿöÿôÿòÿðÿîÿìÿêÿèÿæÿäÿâÿàÿÞÿÜÿÚÿØÿÖÿÔÿÒÿÐÿÎÿÌÿÊÿÈÿÆÿÄÿÂÿÀÿŸÿŒÿºÿžÿ¶ÿŽÿ²ÿ°ÿ®ÿ¬ÿª ) ' % # !  
+        
+ 
+ 	    ÿÿÿýÿûÿùÿ÷ÿõÿóÿñÿïÿíÿëÿéÿçÿåÿãÿáÿßÿÝÿÛÿÙÿ×ÿÕÿÓÿÑÿÏÿÍÿËÿÉÿÇÿÅÿÃÿÁÿ¿ÿœÿ»ÿ¹ÿ·ÿµÿ³ÿ±ÿ¯ÿ­ÿ« * ( & $ "   
+ 
+        
+ 
+      ÿþÿüÿúÿøÿöÿôÿòÿðÿîÿìÿêÿèÿæÿäÿâÿàÿÞÿÜÿÚÿØÿÖÿÔÿÒÿÐÿÎÿÌÿÊÿÈÿÆÿÄÿÂÿÀÿŸÿŒÿºÿžÿ¶ÿŽÿ²ÿ°ÿ®ÿ¬ + ) ' % # !  
+        
+ 
+ 	    ÿÿÿýÿûÿùÿ÷ÿõÿóÿñÿïÿíÿëÿéÿçÿåÿãÿáÿßÿÝÿÛÿÙÿ×ÿÕÿÓÿÑÿÏÿÍÿËÿÉÿÇÿÅÿÃÿÁÿ¿ÿœÿ»ÿ¹ÿ·ÿµÿ³ÿ±ÿ¯ÿ­ , * ( & $ "   
+ 
+        
+ 
+      ÿþÿüÿúÿøÿöÿôÿòÿðÿîÿìÿêÿèÿæÿäÿâÿàÿÞÿÜÿÚÿØÿÖÿÔÿÒÿÐÿÎÿÌÿÊÿÈÿÆÿÄÿÂÿÀÿŸÿŒÿºÿžÿ¶ÿŽÿ²ÿ°ÿ® - + ) ' % # !  
+        
+ 
+ 	    ÿÿÿýÿûÿùÿ÷ÿõÿóÿñÿïÿíÿëÿéÿçÿåÿãÿáÿßÿÝÿÛÿÙÿ×ÿÕÿÓÿÑÿÏÿÍÿËÿÉÿÇÿÅÿÃÿÁÿ¿ÿœÿ»ÿ¹ÿ·ÿµÿ³ÿ±ÿ¯ . , * ( & $ "   
+ 
+        
+ 
+      ÿþÿüÿúÿøÿöÿôÿòÿðÿîÿìÿêÿèÿæÿäÿâÿàÿÞÿÜÿÚÿØÿÖÿÔÿÒÿÐÿÎÿÌÿÊÿÈÿÆÿÄÿÂÿÀÿŸÿŒÿºÿžÿ¶ÿŽÿ²ÿ° / - + ) ' % # !  
+        
+ 
+ 	    ÿÿÿýÿûÿùÿ÷ÿõÿóÿñÿïÿíÿëÿéÿçÿåÿãÿáÿßÿÝÿÛÿÙÿ×ÿÕÿÓÿÑÿÏÿÍÿËÿÉÿÇÿÅÿÃÿÁÿ¿ÿœÿ»ÿ¹ÿ·ÿµÿ³ÿ± 0 . , * ( & $ "   
+ 
+        
+ 
+      ÿþÿüÿúÿøÿöÿôÿòÿðÿîÿìÿêÿèÿæÿäÿâÿàÿÞÿÜÿÚÿØÿÖÿÔÿÒÿÐÿÎÿÌÿÊÿÈÿÆÿÄÿÂÿÀÿŸÿŒÿºÿžÿ¶ÿŽÿ² 1 / - + ) ' % # !  
+        
+ 
+ 	    ÿÿÿýÿûÿùÿ÷ÿõÿóÿñÿïÿíÿëÿéÿçÿåÿãÿáÿßÿÝÿÛÿÙÿ×ÿÕÿÓÿÑÿÏÿÍÿËÿÉÿÇÿÅÿÃÿÁÿ¿ÿœÿ»ÿ¹ÿ·ÿµÿ³ 2 0 . , * ( & $ "   
+ 
+        
+ 
+      ÿþÿüÿúÿøÿöÿôÿòÿðÿîÿìÿêÿèÿæÿäÿâÿàÿÞÿÜÿÚÿØÿÖÿÔÿÒÿÐÿÎÿÌÿÊÿÈÿÆÿÄÿÂÿÀÿŸÿŒÿºÿžÿ¶ÿŽ 3 1 / - + ) ' % # !  
+        
+ 
+ 	    ÿÿÿýÿûÿùÿ÷ÿõÿóÿñÿïÿíÿëÿéÿçÿåÿãÿáÿßÿÝÿÛÿÙÿ×ÿÕÿÓÿÑÿÏÿÍÿËÿÉÿÇÿÅÿÃÿÁÿ¿ÿœÿ»ÿ¹ÿ·ÿµ 4 2 0 . , * ( & $ "   
+ 
+        
+ 
+      ÿþÿüÿúÿøÿöÿôÿòÿðÿîÿìÿêÿèÿæÿäÿâÿàÿÞÿÜÿÚÿØÿÖÿÔÿÒÿÐÿÎÿÌÿÊÿÈÿÆÿÄÿÂÿÀÿŸÿŒÿºÿžÿ¶ 5 3 1 / - + ) ' % # !  
+        
+ 
+ 	    ÿÿÿýÿûÿùÿ÷ÿõÿóÿñÿïÿíÿëÿéÿçÿåÿãÿáÿßÿÝÿÛÿÙÿ×ÿÕÿÓÿÑÿÏÿÍÿËÿÉÿÇÿÅÿÃÿÁÿ¿ÿœÿ»ÿ¹ÿ· 6 4 2 0 . , * ( & $ "   
+ 
+        
+ 
+      ÿþÿüÿúÿøÿöÿôÿòÿðÿîÿìÿêÿèÿæÿäÿâÿàÿÞÿÜÿÚÿØÿÖÿÔÿÒÿÐÿÎÿÌÿÊÿÈÿÆÿÄÿÂÿÀÿŸÿŒÿºÿž 7 5 3 1 / - + ) ' % # !  
+        
+ 
+ 	    ÿÿÿýÿûÿùÿ÷ÿõÿóÿñÿïÿíÿëÿéÿçÿåÿãÿáÿßÿÝÿÛÿÙÿ×ÿÕÿÓÿÑÿÏÿÍÿËÿÉÿÇÿÅÿÃÿÁÿ¿ÿœÿ»ÿ¹ 8 6 4 2 0 . , * ( & $ "   
+ 
+        
+ 
+      ÿþÿüÿúÿøÿöÿôÿòÿðÿîÿìÿêÿèÿæÿäÿâÿàÿÞÿÜÿÚÿØÿÖÿÔÿÒÿÐÿÎÿÌÿÊÿÈÿÆÿÄÿÂÿÀÿŸÿŒÿº 9 7 5 3 1 / - + ) ' % # !  
+        
+ 
+ 	    ÿÿÿýÿûÿùÿ÷ÿõÿóÿñÿïÿíÿëÿéÿçÿåÿãÿáÿßÿÝÿÛÿÙÿ×ÿÕÿÓÿÑÿÏÿÍÿËÿÉÿÇÿÅÿÃÿÁÿ¿ÿœÿ» : 8 6 4 2 0 . , * ( & $ "   
+ 
+        
+ 
+      ÿþÿüÿúÿøÿöÿôÿòÿðÿîÿìÿêÿèÿæÿäÿâÿàÿÞÿÜÿÚÿØÿÖÿÔÿÒÿÐÿÎÿÌÿÊÿÈÿÆÿÄÿÂÿÀÿŸÿŒ ; 9 7 5 3 1 / - + ) ' % # !  
+        
+ 
+ 	    ÿÿÿýÿûÿùÿ÷ÿõÿóÿñÿïÿíÿëÿéÿçÿåÿãÿáÿßÿÝÿÛÿÙÿ×ÿÕÿÓÿÑÿÏÿÍÿËÿÉÿÇÿÅÿÃÿÁÿ¿ÿœ < : 8 6 4 2 0 . , * ( & $ "   
+ 
+        
+ 
+      ÿþÿüÿúÿøÿöÿôÿòÿðÿîÿìÿêÿèÿæÿäÿâÿàÿÞÿÜÿÚÿØÿÖÿÔÿÒÿÐÿÎÿÌÿÊÿÈÿÆÿÄÿÂÿÀÿŸ = ; 9 7 5 3 1 / - + ) ' % # !  
+        
+ 
+ 	    ÿÿÿýÿûÿùÿ÷ÿõÿóÿñÿïÿíÿëÿéÿçÿåÿãÿáÿßÿÝÿÛÿÙÿ×ÿÕÿÓÿÑÿÏÿÍÿËÿÉÿÇÿÅÿÃÿÁÿ¿ > < : 8 6 4 2 0 . , * ( & $ "   
+ 
+        
+ 
+      ÿþÿüÿúÿøÿöÿôÿòÿðÿîÿìÿêÿèÿæÿäÿâÿàÿÞÿÜÿÚÿØÿÖÿÔÿÒÿÐÿÎÿÌÿÊÿÈÿÆÿÄÿÂÿÀ ? = ; 9 7 5 3 1 / - + ) ' % # !  
+        
+ 
+ 	    ÿÿÿýÿûÿùÿ÷ÿõÿóÿñÿïÿíÿëÿéÿçÿåÿãÿáÿßÿÝÿÛÿÙÿ×ÿÕÿÓÿÑÿÏÿÍÿËÿÉÿÇÿÅÿÃÿÁ                                                                                                                                                                                                                                                                                                                                                                                                                                                                XTENSION= 'IMAGE   '           / IMAGE extension                                BITPIX  =                   16 / number of bits per data pixel                  NAXIS   =                    3 / number of data axes                            NAXIS1  =                   91 / length of data axis 1                          NAXIS2  =                   91 / length of data axis 2                          NAXIS3  =                    1 / length of data axis 3                          PCOUNT  =                    0 / required keyword; must = 0                     GCOUNT  =                    1 / required keyword; must = 1                     BZERO   =   0.000000000000E+00 / Pixel Value Offset                             BSCALE  =   1.000000000000E+00 / Pixel Value Scale                              END                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ    ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ   ÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ    ÿþÿüÿûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ     ÿþÿüÿùÿøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ     ÿÿÿýÿûÿùÿ÷ÿõÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ      ÿþÿüÿúÿøÿöÿôÿòÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ       ÿþÿüÿùÿ÷ÿõÿóÿñÿïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ 	 	     ÿÿÿýÿûÿùÿ÷ÿôÿòÿðÿîÿíÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ 
+ 
+      ÿþÿüÿúÿøÿöÿôÿòÿïÿíÿëÿêÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ 
+ 
+ 	      ÿþÿüÿùÿ÷ÿõÿóÿñÿïÿíÿëÿèÿçÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ  
+ 
+ 	     ÿÿÿýÿûÿùÿ÷ÿôÿòÿðÿîÿìÿêÿèÿæÿäÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ   
+ 
+      ÿþÿüÿúÿøÿöÿôÿòÿïÿíÿëÿéÿçÿåÿãÿáÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ    
+ 	      ÿþÿüÿùÿ÷ÿõÿóÿñÿïÿíÿëÿèÿæÿäÿâÿàÿÞÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ    
+ 
+ 	     ÿÿÿýÿûÿùÿ÷ÿôÿòÿðÿîÿìÿêÿèÿæÿãÿáÿßÿÝÿÜÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ     
+ 
+      ÿþÿüÿúÿøÿöÿôÿòÿïÿíÿëÿéÿçÿåÿãÿáÿßÿÜÿÚÿÙÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ      
+ 	      ÿþÿüÿùÿ÷ÿõÿóÿñÿïÿíÿëÿèÿæÿäÿâÿàÿÞÿÜÿÚÿ×ÿÖÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ      
+ 
+ 	     ÿÿÿýÿûÿùÿ÷ÿôÿòÿðÿîÿìÿêÿèÿæÿãÿáÿßÿÝÿÛÿÙÿ×ÿÕÿÓÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ       
+ 
+      ÿþÿüÿúÿøÿöÿôÿòÿïÿíÿëÿéÿçÿåÿãÿáÿßÿÜÿÚÿØÿÖÿÔÿÒÿÐÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ        
+ 	      ÿþÿüÿùÿ÷ÿõÿóÿñÿïÿíÿëÿèÿæÿäÿâÿàÿÞÿÜÿÚÿ×ÿÕÿÓÿÑÿÏÿÎÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ        
+ 
+ 	     ÿÿÿýÿûÿùÿ÷ÿôÿòÿðÿîÿìÿêÿèÿæÿãÿáÿßÿÝÿÛÿÙÿ×ÿÕÿÓÿÐÿÎÿÌÿËÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ 
+        
+ 
+      ÿþÿüÿúÿøÿöÿôÿòÿïÿíÿëÿéÿçÿåÿãÿáÿßÿÜÿÚÿØÿÖÿÔÿÒÿÐÿÎÿËÿÉÿÈÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ 
+ 
+        
+ 	      ÿþÿüÿùÿ÷ÿõÿóÿñÿïÿíÿëÿèÿæÿäÿâÿàÿÞÿÜÿÚÿ×ÿÕÿÓÿÑÿÏÿÍÿËÿÉÿÆÿÅÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ  
+ 
+       
+ 
+ 	     ÿÿÿýÿûÿùÿ÷ÿôÿòÿðÿîÿìÿêÿèÿæÿãÿáÿßÿÝÿÛÿÙÿ×ÿÕÿÓÿÐÿÎÿÌÿÊÿÈÿÆÿÄÿÂÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ    
+        
+ 
+      ÿþÿüÿúÿøÿöÿôÿòÿïÿíÿëÿéÿçÿåÿãÿáÿßÿÜÿÚÿØÿÖÿÔÿÒÿÐÿÎÿËÿÉÿÇÿÅÿÃÿÁÿ¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ! !  
+        
+ 	      ÿþÿüÿùÿ÷ÿõÿóÿñÿïÿíÿëÿèÿæÿäÿâÿàÿÞÿÜÿÚÿ×ÿÕÿÓÿÑÿÏÿÍÿËÿÉÿÆÿÄÿÂÿÀÿŸÿœÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ # "   
+ 
+       
+ 
+ 	     ÿÿÿýÿûÿùÿ÷ÿôÿòÿðÿîÿìÿêÿèÿæÿãÿáÿßÿÝÿÛÿÙÿ×ÿÕÿÓÿÐÿÎÿÌÿÊÿÈÿÆÿÄÿÂÿ¿ÿœÿ»ÿºÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ $ $ !  
+        
+ 
+      ÿþÿüÿúÿøÿöÿôÿòÿïÿíÿëÿéÿçÿåÿãÿáÿßÿÜÿÚÿØÿÖÿÔÿÒÿÐÿÎÿËÿÉÿÇÿÅÿÃÿÁÿ¿ÿœÿºÿžÿ·ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ & % # !  
+        
+ 	      ÿþÿüÿùÿ÷ÿõÿóÿñÿïÿíÿëÿèÿæÿäÿâÿàÿÞÿÜÿÚÿ×ÿÕÿÓÿÑÿÏÿÍÿËÿÉÿÆÿÄÿÂÿÀÿŸÿŒÿºÿžÿ¶ÿŽÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ' & $ "   
+ 
+       
+ 
+ 	     ÿÿÿýÿûÿùÿ÷ÿôÿòÿðÿîÿìÿêÿèÿæÿãÿáÿßÿÝÿÛÿÙÿ×ÿÕÿÓÿÐÿÎÿÌÿÊÿÈÿÆÿÄÿÂÿ¿ÿœÿ»ÿ¹ÿ·ÿµÿ³ÿ±ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ) ( & $ !  
+        
+ 
+      ÿþÿüÿúÿøÿöÿôÿòÿïÿíÿëÿéÿçÿåÿãÿáÿßÿÜÿÚÿØÿÖÿÔÿÒÿÐÿÎÿËÿÉÿÇÿÅÿÃÿÁÿ¿ÿœÿºÿžÿ¶ÿŽÿ²ÿ°ÿ®ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ * ) ' % # !  
+        
+ 	      ÿþÿüÿùÿ÷ÿõÿóÿñÿïÿíÿëÿèÿæÿäÿâÿàÿÞÿÜÿÚÿ×ÿÕÿÓÿÑÿÏÿÍÿËÿÉÿÆÿÄÿÂÿÀÿŸÿŒÿºÿžÿ¶ÿ³ÿ±ÿ¯ÿ­ÿ¬ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ + + ( & $ "   
+ 
+       
+ 
+ 	     ÿÿÿýÿûÿùÿ÷ÿôÿòÿðÿîÿìÿêÿèÿæÿãÿáÿßÿÝÿÛÿÙÿ×ÿÕÿÓÿÐÿÎÿÌÿÊÿÈÿÆÿÄÿÂÿ¿ÿœÿ»ÿ¹ÿ·ÿµÿ³ÿ±ÿ®ÿ¬ÿªÿ©ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ - , * ( & $ !  
+        
+ 
+      ÿþÿüÿúÿøÿöÿôÿòÿïÿíÿëÿéÿçÿåÿãÿáÿßÿÜÿÚÿØÿÖÿÔÿÒÿÐÿÎÿËÿÉÿÇÿÅÿÃÿÁÿ¿ÿœÿºÿžÿ¶ÿŽÿ²ÿ°ÿ®ÿ¬ÿ©ÿ§ÿŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ . - + ) ' % # !  
+        
+ 	      ÿþÿüÿùÿ÷ÿõÿóÿñÿïÿíÿëÿèÿæÿäÿâÿàÿÞÿÜÿÚÿ×ÿÕÿÓÿÑÿÏÿÍÿËÿÉÿÆÿÄÿÂÿÀÿŸÿŒÿºÿžÿ¶ÿ³ÿ±ÿ¯ÿ­ÿ«ÿ©ÿ§ÿ¥ÿ£ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ 0 / - + ( & $ "   
+ 
+       
+ 
+ 	     ÿÿÿýÿûÿùÿ÷ÿôÿòÿðÿîÿìÿêÿèÿæÿãÿáÿßÿÝÿÛÿÙÿ×ÿÕÿÓÿÐÿÎÿÌÿÊÿÈÿÆÿÄÿÂÿ¿ÿœÿ»ÿ¹ÿ·ÿµÿ³ÿ±ÿ®ÿ¬ÿªÿšÿŠÿ€ÿ¢ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ 1 0 . , * ( & $ !  
+        
+ 
+      ÿþÿüÿúÿøÿöÿôÿòÿïÿíÿëÿéÿçÿåÿãÿáÿßÿÜÿÚÿØÿÖÿÔÿÒÿÐÿÎÿËÿÉÿÇÿÅÿÃÿÁÿ¿ÿœÿºÿžÿ¶ÿŽÿ²ÿ°ÿ®ÿ¬ÿ©ÿ§ÿ¥ÿ£ÿ¡ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ 2 2 0 - + ) ' % # !  
+        
+ 	      ÿþÿüÿùÿ÷ÿõÿóÿñÿïÿíÿëÿèÿæÿäÿâÿàÿÞÿÜÿÚÿ×ÿÕÿÓÿÑÿÏÿÍÿËÿÉÿÆÿÄÿÂÿÀÿŸÿŒÿºÿžÿ¶ÿ³ÿ±ÿ¯ÿ­ÿ«ÿ©ÿ§ÿ¥ÿ¢ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ 4 3 1 / - + ( & $ "   
+ 
+       
+ 
+ 	     ÿÿÿýÿûÿùÿ÷ÿôÿòÿðÿîÿìÿêÿèÿæÿãÿáÿßÿÝÿÛÿÙÿ×ÿÕÿÓÿÐÿÎÿÌÿÊÿÈÿÆÿÄÿÂÿ¿ÿœÿ»ÿ¹ÿ·ÿµÿ³ÿ±ÿ®ÿ¬ÿªÿšÿŠÿ€ÿ¢ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ 5 4 2 0 . , * ( & $ !  
+        
+ 
+      ÿþÿüÿúÿøÿöÿôÿòÿïÿíÿëÿéÿçÿåÿãÿáÿßÿÜÿÚÿØÿÖÿÔÿÒÿÐÿÎÿËÿÉÿÇÿÅÿÃÿÁÿ¿ÿœÿºÿžÿ¶ÿŽÿ²ÿ°ÿ®ÿ¬ÿ©ÿ§ÿ¥ÿ£ÿ¡ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ 7 6 4 2 0 - + ) ' % # !  
+        
+ 	      ÿþÿüÿùÿ÷ÿõÿóÿñÿïÿíÿëÿèÿæÿäÿâÿàÿÞÿÜÿÚÿ×ÿÕÿÓÿÑÿÏÿÍÿËÿÉÿÆÿÄÿÂÿÀÿŸÿŒÿºÿžÿ¶ÿ³ÿ±ÿ¯ÿ­ÿ«ÿ©ÿ§ÿ¥ÿ¢ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ 8 7 5 3 1 / - + ( & $ "   
+ 
+       
+ 
+ 	     ÿÿÿýÿûÿùÿ÷ÿôÿòÿðÿîÿìÿêÿèÿæÿãÿáÿßÿÝÿÛÿÙÿ×ÿÕÿÓÿÐÿÎÿÌÿÊÿÈÿÆÿÄÿÂÿ¿ÿœÿ»ÿ¹ÿ·ÿµÿ³ÿ±ÿ®ÿ¬ÿªÿšÿŠÿ€ÿ¢ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ : 9 7 4 2 0 . , * ( & $ !  
+        
+ 
+      ÿþÿüÿúÿøÿöÿôÿòÿïÿíÿëÿéÿçÿåÿãÿáÿßÿÜÿÚÿØÿÖÿÔÿÒÿÐÿÎÿËÿÉÿÇÿÅÿÃÿÁÿ¿ÿœÿºÿžÿ¶ÿŽÿ²ÿ°ÿ®ÿ¬ÿ©ÿ§ÿ¥ÿ£ÿ¡ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ; : 8 6 4 2 0 - + ) ' % # !  
+        
+ 	      ÿþÿüÿùÿ÷ÿõÿóÿñÿïÿíÿëÿèÿæÿäÿâÿàÿÞÿÜÿÚÿ×ÿÕÿÓÿÑÿÏÿÍÿËÿÉÿÆÿÄÿÂÿÀÿŸÿŒÿºÿžÿ¶ÿ³ÿ±ÿ¯ÿ­ÿ«ÿ©ÿ§ÿ¥ÿ¢ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ < < 9 7 5 3 1 / - + ( & $ "   
+ 
+       
+ 
+ 	     ÿÿÿýÿûÿùÿ÷ÿôÿòÿðÿîÿìÿêÿèÿæÿãÿáÿßÿÝÿÛÿÙÿ×ÿÕÿÓÿÐÿÎÿÌÿÊÿÈÿÆÿÄÿÂÿ¿ÿœÿ»ÿ¹ÿ·ÿµÿ³ÿ±ÿ®ÿ¬ÿªÿšÿŠÿ€ÿ¢ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ > = ; 9 7 4 2 0 . , * ( & $ !  
+        
+ 
+      ÿþÿüÿúÿøÿöÿôÿòÿïÿíÿëÿéÿçÿåÿãÿáÿßÿÜÿÚÿØÿÖÿÔÿÒÿÐÿÎÿËÿÉÿÇÿÅÿÃÿÁÿ¿ÿœÿºÿžÿ¶ÿŽÿ²ÿ°ÿ®ÿ¬ÿ©ÿ§ÿ¥ÿ£ÿ¡ÿÿÿÿÿÿÿÿÿÿÿÿÿ
+ÿ ? > < : 8 6 4 2 0 - + ) ' % # !  
+        
+ 	      ÿþÿüÿùÿ÷ÿõÿóÿñÿïÿíÿëÿèÿæÿäÿâÿàÿÞÿÜÿÚÿ×ÿÕÿÓÿÑÿÏÿÍÿËÿÉÿÆÿÄÿÂÿÀÿŸÿŒÿºÿžÿ¶ÿ³ÿ±ÿ¯ÿ­ÿ«ÿ©ÿ§ÿ¥ÿ¢ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿ
+ÿÿÿ = < 9 7 5 3 1 / - + ( & $ "   
+ 
+       
+ 
+ 	     ÿÿÿýÿûÿùÿ÷ÿôÿòÿðÿîÿìÿêÿèÿæÿãÿáÿßÿÝÿÛÿÙÿ×ÿÕÿÓÿÐÿÎÿÌÿÊÿÈÿÆÿÄÿÂÿ¿ÿœÿ»ÿ¹ÿ·ÿµÿ³ÿ±ÿ®ÿ¬ÿªÿšÿŠÿ€ÿ¢ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ : 9 7 4 2 0 . , * ( & $ !  
+        
+ 
+      ÿþÿüÿúÿøÿöÿôÿòÿïÿíÿëÿéÿçÿåÿãÿáÿßÿÜÿÚÿØÿÖÿÔÿÒÿÐÿÎÿËÿÉÿÇÿÅÿÃÿÁÿ¿ÿœÿºÿžÿ¶ÿŽÿ²ÿ°ÿ®ÿ¬ÿ©ÿ§ÿ¥ÿ£ÿ¡ÿÿÿÿÿÿÿÿÿÿÿÿÿ
+ÿ
+ÿÿÿÿÿÿÿÿ 7 6 4 2 0 - + ) ' % # !  
+        
+ 	      ÿþÿüÿùÿ÷ÿõÿóÿñÿïÿíÿëÿèÿæÿäÿâÿàÿÞÿÜÿÚÿ×ÿÕÿÓÿÑÿÏÿÍÿËÿÉÿÆÿÄÿÂÿÀÿŸÿŒÿºÿžÿ¶ÿ³ÿ±ÿ¯ÿ­ÿ«ÿ©ÿ§ÿ¥ÿ¢ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ 5 3 1 / - + ( & $ "   
+ 
+       
+ 
+ 	     ÿÿÿýÿûÿùÿ÷ÿôÿòÿðÿîÿìÿêÿèÿæÿãÿáÿßÿÝÿÛÿÙÿ×ÿÕÿÓÿÐÿÎÿÌÿÊÿÈÿÆÿÄÿÂÿ¿ÿœÿ»ÿ¹ÿ·ÿµÿ³ÿ±ÿ®ÿ¬ÿªÿšÿŠÿ€ÿ¢ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ 2 0 . , * ( & $ !  
+        
+ 
+      ÿþÿüÿúÿøÿöÿôÿòÿïÿíÿëÿéÿçÿåÿãÿáÿßÿÜÿÚÿØÿÖÿÔÿÒÿÐÿÎÿËÿÉÿÇÿÅÿÃÿÁÿ¿ÿœÿºÿžÿ¶ÿŽÿ²ÿ°ÿ®ÿ¬ÿ©ÿ§ÿ¥ÿ£ÿ¡ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ / - + ) ' % # !  
+        
+ 	      ÿþÿüÿùÿ÷ÿõÿóÿñÿïÿíÿëÿèÿæÿäÿâÿàÿÞÿÜÿÚÿ×ÿÕÿÓÿÑÿÏÿÍÿËÿÉÿÆÿÄÿÂÿÀÿŸÿŒÿºÿžÿ¶ÿ³ÿ±ÿ¯ÿ­ÿ«ÿ©ÿ§ÿ¥ÿ¢ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ , + ( & $ "   
+ 
+       
+ 
+ 	     ÿÿÿýÿûÿùÿ÷ÿôÿòÿðÿîÿìÿêÿèÿæÿãÿáÿßÿÝÿÛÿÙÿ×ÿÕÿÓÿÐÿÎÿÌÿÊÿÈÿÆÿÄÿÂÿ¿ÿœÿ»ÿ¹ÿ·ÿµÿ³ÿ±ÿ®ÿ¬ÿªÿšÿŠÿ€ÿ¢ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ) ( & $ !  
+        
+ 
+      ÿþÿüÿúÿøÿöÿôÿòÿïÿíÿëÿéÿçÿåÿãÿáÿßÿÜÿÚÿØÿÖÿÔÿÒÿÐÿÎÿËÿÉÿÇÿÅÿÃÿÁÿ¿ÿœÿºÿžÿ¶ÿŽÿ²ÿ°ÿ®ÿ¬ÿ©ÿ§ÿ¥ÿ£ÿ¡ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ & % # !  
+        
+ 	      ÿþÿüÿùÿ÷ÿõÿóÿñÿïÿíÿëÿèÿæÿäÿâÿàÿÞÿÜÿÚÿ×ÿÕÿÓÿÑÿÏÿÍÿËÿÉÿÆÿÄÿÂÿÀÿŸÿŒÿºÿžÿ¶ÿ³ÿ±ÿ¯ÿ­ÿ«ÿ©ÿ§ÿ¥ÿ¢ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ $ "   
+ 
+       
+ 
+ 	     ÿÿÿýÿûÿùÿ÷ÿôÿòÿðÿîÿìÿêÿèÿæÿãÿáÿßÿÝÿÛÿÙÿ×ÿÕÿÓÿÐÿÎÿÌÿÊÿÈÿÆÿÄÿÂÿ¿ÿœÿ»ÿ¹ÿ·ÿµÿ³ÿ±ÿ®ÿ¬ÿªÿšÿŠÿ€ÿ¢ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ !  
+        
+ 
+      ÿþÿüÿúÿøÿöÿôÿòÿïÿíÿëÿéÿçÿåÿãÿáÿßÿÜÿÚÿØÿÖÿÔÿÒÿÐÿÎÿËÿÉÿÇÿÅÿÃÿÁÿ¿ÿœÿºÿžÿ¶ÿŽÿ²ÿ°ÿ®ÿ¬ÿ©ÿ§ÿ¥ÿ£ÿ¡ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ 
+ 
+        
+ 	      ÿþÿüÿùÿ÷ÿõÿóÿñÿïÿíÿëÿèÿæÿäÿâÿàÿÞÿÜÿÚÿ×ÿÕÿÓÿÑÿÏÿÍÿËÿÉÿÆÿÄÿÂÿÀÿŸÿŒÿºÿžÿ¶ÿ³ÿ±ÿ¯ÿ­ÿ«ÿ©ÿ§ÿ¥ÿ¢ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ        
+ 
+ 	     ÿÿÿýÿûÿùÿ÷ÿôÿòÿðÿîÿìÿêÿèÿæÿãÿáÿßÿÝÿÛÿÙÿ×ÿÕÿÓÿÐÿÎÿÌÿÊÿÈÿÆÿÄÿÂÿ¿ÿœÿ»ÿ¹ÿ·ÿµÿ³ÿ±ÿ®ÿ¬ÿªÿšÿŠÿ€ÿ¢ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ       
+ 
+      ÿþÿüÿúÿøÿöÿôÿòÿïÿíÿëÿéÿçÿåÿãÿáÿßÿÜÿÚÿØÿÖÿÔÿÒÿÐÿÎÿËÿÉÿÇÿÅÿÃÿÁÿ¿ÿœÿºÿžÿ¶ÿŽÿ²ÿ°ÿ®ÿ¬ÿ©ÿ§ÿ¥ÿ£ÿ¡ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ      
+ 	      ÿþÿüÿùÿ÷ÿõÿóÿñÿïÿíÿëÿèÿæÿäÿâÿàÿÞÿÜÿÚÿ×ÿÕÿÓÿÑÿÏÿÍÿËÿÉÿÆÿÄÿÂÿÀÿŸÿŒÿºÿžÿ¶ÿ³ÿ±ÿ¯ÿ­ÿ«ÿ©ÿ§ÿ¥ÿ¢ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ    
+ 
+ 	     ÿÿÿýÿûÿùÿ÷ÿôÿòÿðÿîÿìÿêÿèÿæÿãÿáÿßÿÝÿÛÿÙÿ×ÿÕÿÓÿÐÿÎÿÌÿÊÿÈÿÆÿÄÿÂÿ¿ÿœÿ»ÿ¹ÿ·ÿµÿ³ÿ±ÿ®ÿ¬ÿªÿšÿŠÿ€ÿ¢ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ   
+ 
+      ÿþÿüÿúÿøÿöÿôÿòÿïÿíÿëÿéÿçÿåÿãÿáÿßÿÜÿÚÿØÿÖÿÔÿÒÿÐÿÎÿËÿÉÿÇÿÅÿÃÿÁÿ¿ÿœÿºÿžÿ¶ÿŽÿ²ÿ°ÿ®ÿ¬ÿ©ÿ§ÿ¥ÿ£ÿ¡ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ 
+ 
+ 	      ÿþÿüÿùÿ÷ÿõÿóÿñÿïÿíÿëÿèÿæÿäÿâÿàÿÞÿÜÿÚÿ×ÿÕÿÓÿÑÿÏÿÍÿËÿÉÿÆÿÄÿÂÿÀÿŸÿŒÿºÿžÿ¶ÿ³ÿ±ÿ¯ÿ­ÿ«ÿ©ÿ§ÿ¥ÿ¢ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ 
+ 	     ÿÿÿýÿûÿùÿ÷ÿôÿòÿðÿîÿìÿêÿèÿæÿãÿáÿßÿÝÿÛÿÙÿ×ÿÕÿÓÿÐÿÎÿÌÿÊÿÈÿÆÿÄÿÂÿ¿ÿœÿ»ÿ¹ÿ·ÿµÿ³ÿ±ÿ®ÿ¬ÿªÿšÿŠÿ€ÿ¢ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ      ÿþÿüÿúÿøÿöÿôÿòÿïÿíÿëÿéÿçÿåÿãÿáÿßÿÜÿÚÿØÿÖÿÔÿÒÿÐÿÎÿËÿÉÿÇÿÅÿÃÿÁÿ¿ÿœÿºÿžÿ¶ÿŽÿ²ÿ°ÿ®ÿ¬ÿ©ÿ§ÿ¥ÿ£ÿ¡ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ     ÿþÿüÿùÿ÷ÿõÿóÿñÿïÿíÿëÿèÿæÿäÿâÿàÿÞÿÜÿÚÿ×ÿÕÿÓÿÑÿÏÿÍÿËÿÉÿÆÿÄÿÂÿÀÿŸÿŒÿºÿžÿ¶ÿ³ÿ±ÿ¯ÿ­ÿ«ÿ©ÿ§ÿ¥ÿ¢ÿ ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ   ÿÿÿýÿûÿùÿ÷ÿôÿòÿðÿîÿìÿêÿèÿæÿãÿáÿßÿÝÿÛÿÙÿ×ÿÕÿÓÿÐÿÎÿÌÿÊÿÈÿÆÿÄÿÂÿ¿ÿœÿ»ÿ¹ÿ·ÿµÿ³ÿ±ÿ®ÿ¬ÿªÿšÿŠÿ€ÿ¢ÿ¡ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ  ÿþÿüÿúÿøÿöÿôÿòÿïÿíÿëÿéÿçÿåÿãÿáÿßÿÜÿÚÿØÿÖÿÔÿÒÿÐÿÎÿËÿÉÿÇÿÅÿÃÿÁÿ¿ÿœÿºÿžÿ¶ÿŽÿ²ÿ°ÿ®ÿ¬ÿ©ÿ§ÿ¥ÿ£ÿ¢ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿüÿùÿ÷ÿõÿóÿñÿïÿíÿëÿèÿæÿäÿâÿàÿÞÿÜÿÚÿ×ÿÕÿÓÿÑÿÏÿÍÿËÿÉÿÆÿÄÿÂÿÀÿŸÿŒÿºÿžÿ¶ÿ³ÿ±ÿ¯ÿ­ÿ«ÿ©ÿ§ÿ¥ÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúÿùÿ÷ÿôÿòÿðÿîÿìÿêÿèÿæÿãÿáÿßÿÝÿÛÿÙÿ×ÿÕÿÓÿÐÿÎÿÌÿÊÿÈÿÆÿÄÿÂÿ¿ÿœÿ»ÿ¹ÿ·ÿµÿ³ÿ±ÿ®ÿ¬ÿªÿšÿŠÿ¥ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷ÿöÿôÿòÿïÿíÿëÿéÿçÿåÿãÿáÿßÿÜÿÚÿØÿÖÿÔÿÒÿÐÿÎÿËÿÉÿÇÿÅÿÃÿÁÿ¿ÿœÿºÿžÿ¶ÿŽÿ²ÿ°ÿ®ÿ¬ÿ©ÿ§ÿ§ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿôÿóÿñÿïÿíÿëÿèÿæÿäÿâÿàÿÞÿÜÿÚÿ×ÿÕÿÓÿÑÿÏÿÍÿËÿÉÿÆÿÄÿÂÿÀÿŸÿŒÿºÿžÿ¶ÿ³ÿ±ÿ¯ÿ­ÿ«ÿ©ÿšÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿòÿðÿîÿìÿêÿèÿæÿãÿáÿßÿÝÿÛÿÙÿ×ÿÕÿÓÿÐÿÎÿÌÿÊÿÈÿÆÿÄÿÂÿ¿ÿœÿ»ÿ¹ÿ·ÿµÿ³ÿ±ÿ®ÿ¬ÿªÿ©ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿïÿíÿëÿéÿçÿåÿãÿáÿßÿÜÿÚÿØÿÖÿÔÿÒÿÐÿÎÿËÿÉÿÇÿÅÿÃÿÁÿ¿ÿœÿºÿžÿ¶ÿŽÿ²ÿ°ÿ®ÿ¬ÿ«ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿìÿëÿèÿæÿäÿâÿàÿÞÿÜÿÚÿ×ÿÕÿÓÿÑÿÏÿÍÿËÿÉÿÆÿÄÿÂÿÀÿŸÿŒÿºÿžÿ¶ÿ³ÿ±ÿ¯ÿ­ÿ¬ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿéÿèÿæÿãÿáÿßÿÝÿÛÿÙÿ×ÿÕÿÓÿÐÿÎÿÌÿÊÿÈÿÆÿÄÿÂÿ¿ÿœÿ»ÿ¹ÿ·ÿµÿ³ÿ±ÿ®ÿ®ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿæÿåÿãÿáÿßÿÜÿÚÿØÿÖÿÔÿÒÿÐÿÎÿËÿÉÿÇÿÅÿÃÿÁÿ¿ÿœÿºÿžÿ¶ÿŽÿ²ÿ°ÿ¯ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿäÿâÿàÿÞÿÜÿÚÿ×ÿÕÿÓÿÑÿÏÿÍÿËÿÉÿÆÿÄÿÂÿÀÿŸÿŒÿºÿžÿ¶ÿ³ÿ±ÿ°ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿáÿßÿÝÿÛÿÙÿ×ÿÕÿÓÿÐÿÎÿÌÿÊÿÈÿÆÿÄÿÂÿ¿ÿœÿ»ÿ¹ÿ·ÿµÿ³ÿ²ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÞÿÜÿÚÿØÿÖÿÔÿÒÿÐÿÎÿËÿÉÿÇÿÅÿÃÿÁÿ¿ÿœÿºÿžÿ¶ÿŽÿ³ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÛÿÚÿ×ÿÕÿÓÿÑÿÏÿÍÿËÿÉÿÆÿÄÿÂÿÀÿŸÿŒÿºÿžÿ¶ÿµÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿØÿ×ÿÕÿÓÿÐÿÎÿÌÿÊÿÈÿÆÿÄÿÂÿ¿ÿœÿ»ÿ¹ÿ·ÿ¶ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÕÿÔÿÒÿÐÿÎÿËÿÉÿÇÿÅÿÃÿÁÿ¿ÿœÿºÿžÿžÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÓÿÑÿÏÿÍÿËÿÉÿÆÿÄÿÂÿÀÿŸÿŒÿºÿ¹ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÐÿÎÿÌÿÊÿÈÿÆÿÄÿÂÿ¿ÿœÿ»ÿºÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÍÿËÿÉÿÇÿÅÿÃÿÁÿ¿ÿœÿŒÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÊÿÉÿÆÿÄÿÂÿÀÿŸÿœÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÇÿÆÿÄÿÂÿ¿ÿ¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÄÿÃÿÁÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÂÿÁÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              XTENSION= 'IMAGE   '           / IMAGE extension                                BITPIX  =                   16 / number of bits per data pixel                  NAXIS   =                    3 / number of data axes                            NAXIS1  =                   64 / length of data axis 1                          NAXIS2  =                   64 / length of data axis 2                          NAXIS3  =                    1 / length of data axis 3                          PCOUNT  =                    0 / required keyword; must = 0                     GCOUNT  =                    1 / required keyword; must = 1                     BZERO   =   0.000000000000E+00 / Pixel Value Offset                             BSCALE  =   1.000000000000E+00 / Pixel Value Scale                              END                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              ? > = < ; : 9 8 7 6 5 4 3 2 1 0 / . - , + * ) ( ' & % $ # " !    
+ 
+ 
+               
+ 
+ 
+ 
+ 	           = < ; : 9 8 7 6 5 4 3 2 1 0 / . - , + * ) ( ' & % $ # " !    
+ 
+ 
+               
+ 
+ 
+ 
+ 	          ÿÿÿþ ; : 9 8 7 6 5 4 3 2 1 0 / . - , + * ) ( ' & % $ # " !    
+ 
+ 
+               
+ 
+ 
+ 
+ 	          ÿÿÿþÿýÿü 9 8 7 6 5 4 3 2 1 0 / . - , + * ) ( ' & % $ # " !    
+ 
+ 
+               
+ 
+ 
+ 
+ 	          ÿÿÿþÿýÿüÿûÿú 7 6 5 4 3 2 1 0 / . - , + * ) ( ' & % $ # " !    
+ 
+ 
+               
+ 
+ 
+ 
+ 	          ÿÿÿþÿýÿüÿûÿúÿùÿø 5 4 3 2 1 0 / . - , + * ) ( ' & % $ # " !    
+ 
+ 
+               
+ 
+ 
+ 
+ 	          ÿÿÿþÿýÿüÿûÿúÿùÿøÿ÷ÿö 3 2 1 0 / . - , + * ) ( ' & % $ # " !    
+ 
+ 
+               
+ 
+ 
+ 
+ 	          ÿÿÿþÿýÿüÿûÿúÿùÿøÿ÷ÿöÿõÿô 1 0 / . - , + * ) ( ' & % $ # " !    
+ 
+ 
+               
+ 
+ 
+ 
+ 	          ÿÿÿþÿýÿüÿûÿúÿùÿøÿ÷ÿöÿõÿôÿóÿò / . - , + * ) ( ' & % $ # " !    
+ 
+ 
+               
+ 
+ 
+ 
+ 	          ÿÿÿþÿýÿüÿûÿúÿùÿøÿ÷ÿöÿõÿôÿóÿòÿñÿð - , + * ) ( ' & % $ # " !    
+ 
+ 
+               
+ 
+ 
+ 
+ 	          ÿÿÿþÿýÿüÿûÿúÿùÿøÿ÷ÿöÿõÿôÿóÿòÿñÿðÿïÿî + * ) ( ' & % $ # " !    
+ 
+ 
+               
+ 
+ 
+ 
+ 	          ÿÿÿþÿýÿüÿûÿúÿùÿøÿ÷ÿöÿõÿôÿóÿòÿñÿðÿïÿîÿíÿì ) ( ' & % $ # " !    
+ 
+ 
+               
+ 
+ 
+ 
+ 	          ÿÿÿþÿýÿüÿûÿúÿùÿøÿ÷ÿöÿõÿôÿóÿòÿñÿðÿïÿîÿíÿìÿëÿê ' & % $ # " !    
+ 
+ 
+               
+ 
+ 
+ 
+ 	          ÿÿÿþÿýÿüÿûÿúÿùÿøÿ÷ÿöÿõÿôÿóÿòÿñÿðÿïÿîÿíÿìÿëÿêÿéÿè % $ # " !    
+ 
+ 
+               
+ 
+ 
+ 
+ 	          ÿÿÿþÿýÿüÿûÿúÿùÿøÿ÷ÿöÿõÿôÿóÿòÿñÿðÿïÿîÿíÿìÿëÿêÿéÿèÿçÿæ # " !    
+ 
+ 
+               
+ 
+ 
+ 
+ 	          ÿÿÿþÿýÿüÿûÿúÿùÿøÿ÷ÿöÿõÿôÿóÿòÿñÿðÿïÿîÿíÿìÿëÿêÿéÿèÿçÿæÿåÿä !    
+ 
+ 
+               
+ 
+ 
+ 
+ 	          ÿÿÿþÿýÿüÿûÿúÿùÿøÿ÷ÿöÿõÿôÿóÿòÿñÿðÿïÿîÿíÿìÿëÿêÿéÿèÿçÿæÿåÿäÿãÿâ  
+ 
+ 
+               
+ 
+ 
+ 
+ 	          ÿÿÿþÿýÿüÿûÿúÿùÿøÿ÷ÿöÿõÿôÿóÿòÿñÿðÿïÿîÿíÿìÿëÿêÿéÿèÿçÿæÿåÿäÿãÿâÿáÿà 
+ 
+               
+ 
+ 
+ 
+ 	          ÿÿÿþÿýÿüÿûÿúÿùÿøÿ÷ÿöÿõÿôÿóÿòÿñÿðÿïÿîÿíÿìÿëÿêÿéÿèÿçÿæÿåÿäÿãÿâÿáÿàÿßÿÞ               
+ 
+ 
+ 
+ 	          ÿÿÿþÿýÿüÿûÿúÿùÿøÿ÷ÿöÿõÿôÿóÿòÿñÿðÿïÿîÿíÿìÿëÿêÿéÿèÿçÿæÿåÿäÿãÿâÿáÿàÿßÿÞÿÝÿÜ             
+ 
+ 
+ 
+ 	          ÿÿÿþÿýÿüÿûÿúÿùÿøÿ÷ÿöÿõÿôÿóÿòÿñÿðÿïÿîÿíÿìÿëÿêÿéÿèÿçÿæÿåÿäÿãÿâÿáÿàÿßÿÞÿÝÿÜÿÛÿÚ           
+ 
+ 
+ 
+ 	          ÿÿÿþÿýÿüÿûÿúÿùÿøÿ÷ÿöÿõÿôÿóÿòÿñÿðÿïÿîÿíÿìÿëÿêÿéÿèÿçÿæÿåÿäÿãÿâÿáÿàÿßÿÞÿÝÿÜÿÛÿÚÿÙÿØ         
+ 
+ 
+ 
+ 	          ÿÿÿþÿýÿüÿûÿúÿùÿøÿ÷ÿöÿõÿôÿóÿòÿñÿðÿïÿîÿíÿìÿëÿêÿéÿèÿçÿæÿåÿäÿãÿâÿáÿàÿßÿÞÿÝÿÜÿÛÿÚÿÙÿØÿ×ÿÖ       
+ 
+ 
+ 
+ 	          ÿÿÿþÿýÿüÿûÿúÿùÿøÿ÷ÿöÿõÿôÿóÿòÿñÿðÿïÿîÿíÿìÿëÿêÿéÿèÿçÿæÿåÿäÿãÿâÿáÿàÿßÿÞÿÝÿÜÿÛÿÚÿÙÿØÿ×ÿÖÿÕÿÔ     
+ 
+ 
+ 
+ 	          ÿÿÿþÿýÿüÿûÿúÿùÿøÿ÷ÿöÿõÿôÿóÿòÿñÿðÿïÿîÿíÿìÿëÿêÿéÿèÿçÿæÿåÿäÿãÿâÿáÿàÿßÿÞÿÝÿÜÿÛÿÚÿÙÿØÿ×ÿÖÿÕÿÔÿÓÿÒ   
+ 
+ 
+ 
+ 	          ÿÿÿþÿýÿüÿûÿúÿùÿøÿ÷ÿöÿõÿôÿóÿòÿñÿðÿïÿîÿíÿìÿëÿêÿéÿèÿçÿæÿåÿäÿãÿâÿáÿàÿßÿÞÿÝÿÜÿÛÿÚÿÙÿØÿ×ÿÖÿÕÿÔÿÓÿÒÿÑÿÐ 
+ 
+ 
+ 
+ 	          ÿÿÿþÿýÿüÿûÿúÿùÿøÿ÷ÿöÿõÿôÿóÿòÿñÿðÿïÿîÿíÿìÿëÿêÿéÿèÿçÿæÿåÿäÿãÿâÿáÿàÿßÿÞÿÝÿÜÿÛÿÚÿÙÿØÿ×ÿÖÿÕÿÔÿÓÿÒÿÑÿÐÿÏÿÎ 
+ 
+ 	          ÿÿÿþÿýÿüÿûÿúÿùÿøÿ÷ÿöÿõÿôÿóÿòÿñÿðÿïÿîÿíÿìÿëÿêÿéÿèÿçÿæÿåÿäÿãÿâÿáÿàÿßÿÞÿÝÿÜÿÛÿÚÿÙÿØÿ×ÿÖÿÕÿÔÿÓÿÒÿÑÿÐÿÏÿÎÿÍÿÌ 	          ÿÿÿþÿýÿüÿûÿúÿùÿøÿ÷ÿöÿõÿôÿóÿòÿñÿðÿïÿîÿíÿìÿëÿêÿéÿèÿçÿæÿåÿäÿãÿâÿáÿàÿßÿÞÿÝÿÜÿÛÿÚÿÙÿØÿ×ÿÖÿÕÿÔÿÓÿÒÿÑÿÐÿÏÿÎÿÍÿÌÿËÿÊ         ÿÿÿþÿýÿüÿûÿúÿùÿøÿ÷ÿöÿõÿôÿóÿòÿñÿðÿïÿîÿíÿìÿëÿêÿéÿèÿçÿæÿåÿäÿãÿâÿáÿàÿßÿÞÿÝÿÜÿÛÿÚÿÙÿØÿ×ÿÖÿÕÿÔÿÓÿÒÿÑÿÐÿÏÿÎÿÍÿÌÿËÿÊÿÉÿÈ       ÿÿÿþÿýÿüÿûÿúÿùÿøÿ÷ÿöÿõÿôÿóÿòÿñÿðÿïÿîÿíÿìÿëÿêÿéÿèÿçÿæÿåÿäÿãÿâÿáÿàÿßÿÞÿÝÿÜÿÛÿÚÿÙÿØÿ×ÿÖÿÕÿÔÿÓÿÒÿÑÿÐÿÏÿÎÿÍÿÌÿËÿÊÿÉÿÈÿÇÿÆ     ÿÿÿþÿýÿüÿûÿúÿùÿøÿ÷ÿöÿõÿôÿóÿòÿñÿðÿïÿîÿíÿìÿëÿêÿéÿèÿçÿæÿåÿäÿãÿâÿáÿàÿßÿÞÿÝÿÜÿÛÿÚÿÙÿØÿ×ÿÖÿÕÿÔÿÓÿÒÿÑÿÐÿÏÿÎÿÍÿÌÿËÿÊÿÉÿÈÿÇÿÆÿÅÿÄ   ÿÿÿþÿýÿüÿûÿúÿùÿøÿ÷ÿöÿõÿôÿóÿòÿñÿðÿïÿîÿíÿìÿëÿêÿéÿèÿçÿæÿåÿäÿãÿâÿáÿàÿßÿÞÿÝÿÜÿÛÿÚÿÙÿØÿ×ÿÖÿÕÿÔÿÓÿÒÿÑÿÐÿÏÿÎÿÍÿÌÿËÿÊÿÉÿÈÿÇÿÆÿÅÿÄÿÃÿÂÿÿÿþÿýÿüÿûÿúÿùÿøÿ÷ÿöÿõÿôÿóÿòÿñÿðÿïÿîÿíÿìÿëÿêÿéÿèÿçÿæÿåÿäÿãÿâÿáÿàÿßÿÞÿÝÿÜÿÛÿÚÿÙÿØÿ×ÿÖÿÕÿÔÿÓÿÒÿÑÿÐÿÏÿÎÿÍÿÌÿËÿÊÿÉÿÈÿÇÿÆÿÅÿÄÿÃÿÂÿÁÿÀÿýÿüÿûÿúÿùÿøÿ÷ÿöÿõÿôÿóÿòÿñÿðÿïÿîÿíÿìÿëÿêÿéÿèÿçÿæÿåÿäÿãÿâÿáÿàÿßÿÞÿÝÿÜÿÛÿÚÿÙÿØÿ×ÿÖÿÕÿÔÿÓÿÒÿÑÿÐÿÏÿÎÿÍÿÌÿËÿÊÿÉÿÈÿÇÿÆÿÅÿÄÿÃÿÂÿÁÿÀÿ¿ÿŸÿûÿúÿùÿøÿ÷ÿöÿõÿôÿóÿòÿñÿðÿïÿîÿíÿìÿëÿêÿéÿèÿçÿæÿåÿäÿãÿâÿáÿàÿßÿÞÿÝÿÜÿÛÿÚÿÙÿØÿ×ÿÖÿÕÿÔÿÓÿÒÿÑÿÐÿÏÿÎÿÍÿÌÿËÿÊÿÉÿÈÿÇÿÆÿÅÿÄÿÃÿÂÿÁÿÀÿ¿ÿŸÿœÿŒÿùÿøÿ÷ÿöÿõÿôÿóÿòÿñÿðÿïÿîÿíÿìÿëÿêÿéÿèÿçÿæÿåÿäÿãÿâÿáÿàÿßÿÞÿÝÿÜÿÛÿÚÿÙÿØÿ×ÿÖÿÕÿÔÿÓÿÒÿÑÿÐÿÏÿÎÿÍÿÌÿËÿÊÿÉÿÈÿÇÿÆÿÅÿÄÿÃÿÂÿÁÿÀÿ¿ÿŸÿœÿŒÿ»ÿºÿ÷ÿöÿõÿôÿóÿòÿñÿðÿïÿîÿíÿìÿëÿêÿéÿèÿçÿæÿåÿäÿãÿâÿáÿàÿßÿÞÿÝÿÜÿÛÿÚÿÙÿØÿ×ÿÖÿÕÿÔÿÓÿÒÿÑÿÐÿÏÿÎÿÍÿÌÿËÿÊÿÉÿÈÿÇÿÆÿÅÿÄÿÃÿÂÿÁÿÀÿ¿ÿŸÿœÿŒÿ»ÿºÿ¹ÿžÿõÿôÿóÿòÿñÿðÿïÿîÿíÿìÿëÿêÿéÿèÿçÿæÿåÿäÿãÿâÿáÿàÿßÿÞÿÝÿÜÿÛÿÚÿÙÿØÿ×ÿÖÿÕÿÔÿÓÿÒÿÑÿÐÿÏÿÎÿÍÿÌÿËÿÊÿÉÿÈÿÇÿÆÿÅÿÄÿÃÿÂÿÁÿÀÿ¿ÿŸÿœÿŒÿ»ÿºÿ¹ÿžÿ·ÿ¶ÿóÿòÿñÿðÿïÿîÿíÿìÿëÿêÿéÿèÿçÿæÿåÿäÿãÿâÿáÿàÿßÿÞÿÝÿÜÿÛÿÚÿÙÿØÿ×ÿÖÿÕÿÔÿÓÿÒÿÑÿÐÿÏÿÎÿÍÿÌÿËÿÊÿÉÿÈÿÇÿÆÿÅÿÄÿÃÿÂÿÁÿÀÿ¿ÿŸÿœÿŒÿ»ÿºÿ¹ÿžÿ·ÿ¶ÿµÿŽÿñÿðÿïÿîÿíÿìÿëÿêÿéÿèÿçÿæÿåÿäÿãÿâÿáÿàÿßÿÞÿÝÿÜÿÛÿÚÿÙÿØÿ×ÿÖÿÕÿÔÿÓÿÒÿÑÿÐÿÏÿÎÿÍÿÌÿËÿÊÿÉÿÈÿÇÿÆÿÅÿÄÿÃÿÂÿÁÿÀÿ¿ÿŸÿœÿŒÿ»ÿºÿ¹ÿžÿ·ÿ¶ÿµÿŽÿ³ÿ²ÿïÿîÿíÿìÿëÿêÿéÿèÿçÿæÿåÿäÿãÿâÿáÿàÿßÿÞÿÝÿÜÿÛÿÚÿÙÿØÿ×ÿÖÿÕÿÔÿÓÿÒÿÑÿÐÿÏÿÎÿÍÿÌÿËÿÊÿÉÿÈÿÇÿÆÿÅÿÄÿÃÿÂÿÁÿÀÿ¿ÿŸÿœÿŒÿ»ÿºÿ¹ÿžÿ·ÿ¶ÿµÿŽÿ³ÿ²ÿ±ÿ°ÿíÿìÿëÿêÿéÿèÿçÿæÿåÿäÿãÿâÿáÿàÿßÿÞÿÝÿÜÿÛÿÚÿÙÿØÿ×ÿÖÿÕÿÔÿÓÿÒÿÑÿÐÿÏÿÎÿÍÿÌÿËÿÊÿÉÿÈÿÇÿÆÿÅÿÄÿÃÿÂÿÁÿÀÿ¿ÿŸÿœÿŒÿ»ÿºÿ¹ÿžÿ·ÿ¶ÿµÿŽÿ³ÿ²ÿ±ÿ°ÿ¯ÿ®ÿëÿêÿéÿèÿçÿæÿåÿäÿãÿâÿáÿàÿßÿÞÿÝÿÜÿÛÿÚÿÙÿØÿ×ÿÖÿÕÿÔÿÓÿÒÿÑÿÐÿÏÿÎÿÍÿÌÿËÿÊÿÉÿÈÿÇÿÆÿÅÿÄÿÃÿÂÿÁÿÀÿ¿ÿŸÿœÿŒÿ»ÿºÿ¹ÿžÿ·ÿ¶ÿµÿŽÿ³ÿ²ÿ±ÿ°ÿ¯ÿ®ÿ­ÿ¬ÿéÿèÿçÿæÿåÿäÿãÿâÿáÿàÿßÿÞÿÝÿÜÿÛÿÚÿÙÿØÿ×ÿÖÿÕÿÔÿÓÿÒÿÑÿÐÿÏÿÎÿÍÿÌÿËÿÊÿÉÿÈÿÇÿÆÿÅÿÄÿÃÿÂÿÁÿÀÿ¿ÿŸÿœÿŒÿ»ÿºÿ¹ÿžÿ·ÿ¶ÿµÿŽÿ³ÿ²ÿ±ÿ°ÿ¯ÿ®ÿ­ÿ¬ÿ«ÿªÿçÿæÿåÿäÿãÿâÿáÿàÿßÿÞÿÝÿÜÿÛÿÚÿÙÿØÿ×ÿÖÿÕÿÔÿÓÿÒÿÑÿÐÿÏÿÎÿÍÿÌÿËÿÊÿÉÿÈÿÇÿÆÿÅÿÄÿÃÿÂÿÁÿÀÿ¿ÿŸÿœÿŒÿ»ÿºÿ¹ÿžÿ·ÿ¶ÿµÿŽÿ³ÿ²ÿ±ÿ°ÿ¯ÿ®ÿ­ÿ¬ÿ«ÿªÿ©ÿšÿåÿäÿãÿâÿáÿàÿßÿÞÿÝÿÜÿÛÿÚÿÙÿØÿ×ÿÖÿÕÿÔÿÓÿÒÿÑÿÐÿÏÿÎÿÍÿÌÿËÿÊÿÉÿÈÿÇÿÆÿÅÿÄÿÃÿÂÿÁÿÀÿ¿ÿŸÿœÿŒÿ»ÿºÿ¹ÿžÿ·ÿ¶ÿµÿŽÿ³ÿ²ÿ±ÿ°ÿ¯ÿ®ÿ­ÿ¬ÿ«ÿªÿ©ÿšÿ§ÿŠÿãÿâÿáÿàÿßÿÞÿÝÿÜÿÛÿÚÿÙÿØÿ×ÿÖÿÕÿÔÿÓÿÒÿÑÿÐÿÏÿÎÿÍÿÌÿËÿÊÿÉÿÈÿÇÿÆÿÅÿÄÿÃÿÂÿÁÿÀÿ¿ÿŸÿœÿŒÿ»ÿºÿ¹ÿžÿ·ÿ¶ÿµÿŽÿ³ÿ²ÿ±ÿ°ÿ¯ÿ®ÿ­ÿ¬ÿ«ÿªÿ©ÿšÿ§ÿŠÿ¥ÿ€ÿáÿàÿßÿÞÿÝÿÜÿÛÿÚÿÙÿØÿ×ÿÖÿÕÿÔÿÓÿÒÿÑÿÐÿÏÿÎÿÍÿÌÿËÿÊÿÉÿÈÿÇÿÆÿÅÿÄÿÃÿÂÿÁÿÀÿ¿ÿŸÿœÿŒÿ»ÿºÿ¹ÿžÿ·ÿ¶ÿµÿŽÿ³ÿ²ÿ±ÿ°ÿ¯ÿ®ÿ­ÿ¬ÿ«ÿªÿ©ÿšÿ§ÿŠÿ¥ÿ€ÿ£ÿ¢ÿßÿÞÿÝÿÜÿÛÿÚÿÙÿØÿ×ÿÖÿÕÿÔÿÓÿÒÿÑÿÐÿÏÿÎÿÍÿÌÿËÿÊÿÉÿÈÿÇÿÆÿÅÿÄÿÃÿÂÿÁÿÀÿ¿ÿŸÿœÿŒÿ»ÿºÿ¹ÿžÿ·ÿ¶ÿµÿŽÿ³ÿ²ÿ±ÿ°ÿ¯ÿ®ÿ­ÿ¬ÿ«ÿªÿ©ÿšÿ§ÿŠÿ¥ÿ€ÿ£ÿ¢ÿ¡ÿ ÿÝÿÜÿÛÿÚÿÙÿØÿ×ÿÖÿÕÿÔÿÓÿÒÿÑÿÐÿÏÿÎÿÍÿÌÿËÿÊÿÉÿÈÿÇÿÆÿÅÿÄÿÃÿÂÿÁÿÀÿ¿ÿŸÿœÿŒÿ»ÿºÿ¹ÿžÿ·ÿ¶ÿµÿŽÿ³ÿ²ÿ±ÿ°ÿ¯ÿ®ÿ­ÿ¬ÿ«ÿªÿ©ÿšÿ§ÿŠÿ¥ÿ€ÿ£ÿ¢ÿ¡ÿ ÿÿÿÛÿÚÿÙÿØÿ×ÿÖÿÕÿÔÿÓÿÒÿÑÿÐÿÏÿÎÿÍÿÌÿËÿÊÿÉÿÈÿÇÿÆÿÅÿÄÿÃÿÂÿÁÿÀÿ¿ÿŸÿœÿŒÿ»ÿºÿ¹ÿžÿ·ÿ¶ÿµÿŽÿ³ÿ²ÿ±ÿ°ÿ¯ÿ®ÿ­ÿ¬ÿ«ÿªÿ©ÿšÿ§ÿŠÿ¥ÿ€ÿ£ÿ¢ÿ¡ÿ ÿÿÿÿÿÙÿØÿ×ÿÖÿÕÿÔÿÓÿÒÿÑÿÐÿÏÿÎÿÍÿÌÿËÿÊÿÉÿÈÿÇÿÆÿÅÿÄÿÃÿÂÿÁÿÀÿ¿ÿŸÿœÿŒÿ»ÿºÿ¹ÿžÿ·ÿ¶ÿµÿŽÿ³ÿ²ÿ±ÿ°ÿ¯ÿ®ÿ­ÿ¬ÿ«ÿªÿ©ÿšÿ§ÿŠÿ¥ÿ€ÿ£ÿ¢ÿ¡ÿ ÿÿÿÿÿÿÿ×ÿÖÿÕÿÔÿÓÿÒÿÑÿÐÿÏÿÎÿÍÿÌÿËÿÊÿÉÿÈÿÇÿÆÿÅÿÄÿÃÿÂÿÁÿÀÿ¿ÿŸÿœÿŒÿ»ÿºÿ¹ÿžÿ·ÿ¶ÿµÿŽÿ³ÿ²ÿ±ÿ°ÿ¯ÿ®ÿ­ÿ¬ÿ«ÿªÿ©ÿšÿ§ÿŠÿ¥ÿ€ÿ£ÿ¢ÿ¡ÿ ÿÿÿÿÿÿÿÿÿÕÿÔÿÓÿÒÿÑÿÐÿÏÿÎÿÍÿÌÿËÿÊÿÉÿÈÿÇÿÆÿÅÿÄÿÃÿÂÿÁÿÀÿ¿ÿŸÿœÿŒÿ»ÿºÿ¹ÿžÿ·ÿ¶ÿµÿŽÿ³ÿ²ÿ±ÿ°ÿ¯ÿ®ÿ­ÿ¬ÿ«ÿªÿ©ÿšÿ§ÿŠÿ¥ÿ€ÿ£ÿ¢ÿ¡ÿ ÿÿÿÿÿÿÿÿÿÿÿÓÿÒÿÑÿÐÿÏÿÎÿÍÿÌÿËÿÊÿÉÿÈÿÇÿÆÿÅÿÄÿÃÿÂÿÁÿÀÿ¿ÿŸÿœÿŒÿ»ÿºÿ¹ÿžÿ·ÿ¶ÿµÿŽÿ³ÿ²ÿ±ÿ°ÿ¯ÿ®ÿ­ÿ¬ÿ«ÿªÿ©ÿšÿ§ÿŠÿ¥ÿ€ÿ£ÿ¢ÿ¡ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÑÿÐÿÏÿÎÿÍÿÌÿËÿÊÿÉÿÈÿÇÿÆÿÅÿÄÿÃÿÂÿÁÿÀÿ¿ÿŸÿœÿŒÿ»ÿºÿ¹ÿžÿ·ÿ¶ÿµÿŽÿ³ÿ²ÿ±ÿ°ÿ¯ÿ®ÿ­ÿ¬ÿ«ÿªÿ©ÿšÿ§ÿŠÿ¥ÿ€ÿ£ÿ¢ÿ¡ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÏÿÎÿÍÿÌÿËÿÊÿÉÿÈÿÇÿÆÿÅÿÄÿÃÿÂÿÁÿÀÿ¿ÿŸÿœÿŒÿ»ÿºÿ¹ÿžÿ·ÿ¶ÿµÿŽÿ³ÿ²ÿ±ÿ°ÿ¯ÿ®ÿ­ÿ¬ÿ«ÿªÿ©ÿšÿ§ÿŠÿ¥ÿ€ÿ£ÿ¢ÿ¡ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÍÿÌÿËÿÊÿÉÿÈÿÇÿÆÿÅÿÄÿÃÿÂÿÁÿÀÿ¿ÿŸÿœÿŒÿ»ÿºÿ¹ÿžÿ·ÿ¶ÿµÿŽÿ³ÿ²ÿ±ÿ°ÿ¯ÿ®ÿ­ÿ¬ÿ«ÿªÿ©ÿšÿ§ÿŠÿ¥ÿ€ÿ£ÿ¢ÿ¡ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿËÿÊÿÉÿÈÿÇÿÆÿÅÿÄÿÃÿÂÿÁÿÀÿ¿ÿŸÿœÿŒÿ»ÿºÿ¹ÿžÿ·ÿ¶ÿµÿŽÿ³ÿ²ÿ±ÿ°ÿ¯ÿ®ÿ­ÿ¬ÿ«ÿªÿ©ÿšÿ§ÿŠÿ¥ÿ€ÿ£ÿ¢ÿ¡ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÉÿÈÿÇÿÆÿÅÿÄÿÃÿÂÿÁÿÀÿ¿ÿŸÿœÿŒÿ»ÿºÿ¹ÿžÿ·ÿ¶ÿµÿŽÿ³ÿ²ÿ±ÿ°ÿ¯ÿ®ÿ­ÿ¬ÿ«ÿªÿ©ÿšÿ§ÿŠÿ¥ÿ€ÿ£ÿ¢ÿ¡ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÇÿÆÿÅÿÄÿÃÿÂÿÁÿÀÿ¿ÿŸÿœÿŒÿ»ÿºÿ¹ÿžÿ·ÿ¶ÿµÿŽÿ³ÿ²ÿ±ÿ°ÿ¯ÿ®ÿ­ÿ¬ÿ«ÿªÿ©ÿšÿ§ÿŠÿ¥ÿ€ÿ£ÿ¢ÿ¡ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÅÿÄÿÃÿÂÿÁÿÀÿ¿ÿŸÿœÿŒÿ»ÿºÿ¹ÿžÿ·ÿ¶ÿµÿŽÿ³ÿ²ÿ±ÿ°ÿ¯ÿ®ÿ­ÿ¬ÿ«ÿªÿ©ÿšÿ§ÿŠÿ¥ÿ€ÿ£ÿ¢ÿ¡ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÃÿÂÿÁÿÀÿ¿ÿŸÿœÿŒÿ»ÿºÿ¹ÿžÿ·ÿ¶ÿµÿŽÿ³ÿ²ÿ±ÿ°ÿ¯ÿ®ÿ­ÿ¬ÿ«ÿªÿ©ÿšÿ§ÿŠÿ¥ÿ€ÿ£ÿ¢ÿ¡ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
+ÿÿÁÿÀÿ¿ÿŸÿœÿŒÿ»ÿºÿ¹ÿžÿ·ÿ¶ÿµÿŽÿ³ÿ²ÿ±ÿ°ÿ¯ÿ®ÿ­ÿ¬ÿ«ÿªÿ©ÿšÿ§ÿŠÿ¥ÿ€ÿ£ÿ¢ÿ¡ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
+ÿÿÿ                                                                                                                                                                                                                                                                                                                                                                                                                                                                XTENSION= 'IMAGE   '           / IMAGE extension                                BITPIX  =                   16 / number of bits per data pixel                  NAXIS   =                    3 / number of data axes                            NAXIS1  =                   91 / length of data axis 1                          NAXIS2  =                   91 / length of data axis 2                          NAXIS3  =                    1 / length of data axis 3                          PCOUNT  =                    0 / required keyword; must = 0                     GCOUNT  =                    1 / required keyword; must = 1                     BZERO   =   0.000000000000E+00 / Pixel Value Offset                             BSCALE  =   1.000000000000E+00 / Pixel Value Scale                              END                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ > >ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ < = > =ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ 9 : ; < < <ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ 6 7 8 9 9 : ; :ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ 3 4 5 6 7 7 8 9 9 9ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ 0 2 2 3 4 4 5 6 7 7 8 7ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ - / 0 0 1 2 2 3 4 4 5 6 7 6ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ + , - - . / 0 0 1 2 2 3 4 4 5 5ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ( ) * + + , - - . / 0 0 1 2 2 3 4 3ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ % & ' ( ( ) * + + , - - . / 0 0 1 2 2 2ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ " $ $ % & & ' ( ( ) * + + , - - . / 0 0 1 0ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ  ! ! " # $ $ % & & ' ( ( ) * + + , - - . / 0 /ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ 
+ 
+     ! ! " # $ $ % & & ' ( ( ) * + + , - - . -ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ   
+ 
+ 
+ 
+     ! ! " # $ $ % & & ' ( ( ) * + + , - ,ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ       
+ 
+ 
+ 
+     ! ! " # $ $ % & & ' ( ( ) * + + +ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ           
+ 
+ 
+ 
+     ! ! " # $ $ % & & ' ( ( ) * )ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ               
+ 
+ 
+ 
+     ! ! " # $ $ % & & ' ( ( (ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ                   
+ 
+ 
+ 
+     ! ! " # $ $ % & & ' &ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ 
+ 
+                     
+ 
+ 
+ 
+     ! ! " # $ $ % & %ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ 	 
+ 
+ 
+ 
+ 
+                     
+ 
+ 
+ 
+     ! ! " # $ $ $ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ    	 	 
+ 
+ 
+ 
+ 
+                     
+ 
+ 
+ 
+     ! ! " # "ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ        	 	 
+ 
+ 
+ 
+ 
+                     
+ 
+ 
+ 
+     ! ! !ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ             	 	 
+ 
+ 
+ 
+ 
+                     
+ 
+ 
+ 
+     ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ                  	 	 
+ 
+ 
+ 
+ 
+                     
+ 
+ 
+ 
+  
+ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿýÿþÿþÿÿ                  	 	 
+ 
+ 
+ 
+ 
+                     
+ 
+ 
+ 
+ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùÿúÿûÿüÿüÿýÿþÿþÿÿ                  	 	 
+ 
+ 
+ 
+ 
+                     
+ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöÿ÷ÿøÿùÿùÿúÿûÿüÿüÿýÿþÿþÿÿ                  	 	 
+ 
+ 
+ 
+ 
+                    ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿóÿôÿõÿöÿ÷ÿ÷ÿøÿùÿùÿúÿûÿüÿüÿýÿþÿþÿÿ                  	 	 
+ 
+ 
+ 
+ 
+                  ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿòÿòÿóÿôÿôÿõÿöÿ÷ÿ÷ÿøÿùÿùÿúÿûÿüÿüÿýÿþÿþÿÿ                  	 	 
+ 
+ 
+ 
+ 
+                ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿíÿïÿïÿðÿñÿòÿòÿóÿôÿôÿõÿöÿ÷ÿ÷ÿøÿùÿùÿúÿûÿüÿüÿýÿþÿþÿÿ                  	 	 
+ 
+ 
+ 
+ 
+              ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿëÿìÿíÿíÿîÿïÿïÿðÿñÿòÿòÿóÿôÿôÿõÿöÿ÷ÿ÷ÿøÿùÿùÿúÿûÿüÿüÿýÿþÿþÿÿ                  	 	 
+ 
+ 
+ 
+ 
+            ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿèÿéÿêÿëÿëÿìÿíÿíÿîÿïÿïÿðÿñÿòÿòÿóÿôÿôÿõÿöÿ÷ÿ÷ÿøÿùÿùÿúÿûÿüÿüÿýÿþÿþÿÿ                  	 	 
+ 
+ 
+ 
+ 
+          ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿåÿæÿçÿèÿèÿéÿêÿëÿëÿìÿíÿíÿîÿïÿïÿðÿñÿòÿòÿóÿôÿôÿõÿöÿ÷ÿ÷ÿøÿùÿùÿúÿûÿüÿüÿýÿþÿþÿÿ                  	 	 
+ 
+ 
+ 
+ 
+        ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿâÿãÿäÿåÿæÿæÿçÿèÿèÿéÿêÿëÿëÿìÿíÿíÿîÿïÿïÿðÿñÿòÿòÿóÿôÿôÿõÿöÿ÷ÿ÷ÿøÿùÿùÿúÿûÿüÿüÿýÿþÿþÿÿ                  	 	 
+ 
+ 
+ 
+ 
+      ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿßÿáÿáÿâÿãÿãÿäÿåÿæÿæÿçÿèÿèÿéÿêÿëÿëÿìÿíÿíÿîÿïÿïÿðÿñÿòÿòÿóÿôÿôÿõÿöÿ÷ÿ÷ÿøÿùÿùÿúÿûÿüÿüÿýÿþÿþÿÿ                  	 	 
+ 
+ 
+ 
+ 
+    ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÜÿÞÿßÿßÿàÿáÿáÿâÿãÿãÿäÿåÿæÿæÿçÿèÿèÿéÿêÿëÿëÿìÿíÿíÿîÿïÿïÿðÿñÿòÿòÿóÿôÿôÿõÿöÿ÷ÿ÷ÿøÿùÿùÿúÿûÿüÿüÿýÿþÿþÿÿ                  	 	 
+ 
+ 
+ 
+ 
+  
+ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÚÿÛÿÜÿÜÿÝÿÞÿßÿßÿàÿáÿáÿâÿãÿãÿäÿåÿæÿæÿçÿèÿèÿéÿêÿëÿëÿìÿíÿíÿîÿïÿïÿðÿñÿòÿòÿóÿôÿôÿõÿöÿ÷ÿ÷ÿøÿùÿùÿúÿûÿüÿüÿýÿþÿþÿÿ                  	 	 
+ 
+ 
+ 
+ 
+ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ×ÿØÿÙÿÚÿÚÿÛÿÜÿÜÿÝÿÞÿßÿßÿàÿáÿáÿâÿãÿãÿäÿåÿæÿæÿçÿèÿèÿéÿêÿëÿëÿìÿíÿíÿîÿïÿïÿðÿñÿòÿòÿóÿôÿôÿõÿöÿ÷ÿ÷ÿøÿùÿùÿúÿûÿüÿüÿýÿþÿþÿÿ                  	 	 
+ 
+ 
+ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÔÿÕÿÖÿ×ÿ×ÿØÿÙÿÚÿÚÿÛÿÜÿÜÿÝÿÞÿßÿßÿàÿáÿáÿâÿãÿãÿäÿåÿæÿæÿçÿèÿèÿéÿêÿëÿëÿìÿíÿíÿîÿïÿïÿðÿñÿòÿòÿóÿôÿôÿõÿöÿ÷ÿ÷ÿøÿùÿùÿúÿûÿüÿüÿýÿþÿþÿÿ                  	 	 	ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÑÿÓÿÓÿÔÿÕÿÕÿÖÿ×ÿ×ÿØÿÙÿÚÿÚÿÛÿÜÿÜÿÝÿÞÿßÿßÿàÿáÿáÿâÿãÿãÿäÿåÿæÿæÿçÿèÿèÿéÿêÿëÿëÿìÿíÿíÿîÿïÿïÿðÿñÿòÿòÿóÿôÿôÿõÿöÿ÷ÿ÷ÿøÿùÿùÿúÿûÿüÿüÿýÿþÿþÿÿ                  ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÎÿÐÿÐÿÑÿÒÿÓÿÓÿÔÿÕÿÕÿÖÿ×ÿ×ÿØÿÙÿÚÿÚÿÛÿÜÿÜÿÝÿÞÿßÿßÿàÿáÿáÿâÿãÿãÿäÿåÿæÿæÿçÿèÿèÿéÿêÿëÿëÿìÿíÿíÿîÿïÿïÿðÿñÿòÿòÿóÿôÿôÿõÿöÿ÷ÿ÷ÿøÿùÿùÿúÿûÿüÿüÿýÿþÿþÿÿ                ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿËÿÍÿÎÿÎÿÏÿÐÿÐÿÑÿÒÿÓÿÓÿÔÿÕÿÕÿÖÿ×ÿ×ÿØÿÙÿÚÿÚÿÛÿÜÿÜÿÝÿÞÿßÿßÿàÿáÿáÿâÿãÿãÿäÿåÿæÿæÿçÿèÿèÿéÿêÿëÿëÿìÿíÿíÿîÿïÿïÿðÿñÿòÿòÿóÿôÿôÿõÿöÿ÷ÿ÷ÿøÿùÿùÿúÿûÿüÿüÿýÿþÿþÿÿ              ÿÿÿÿÿÿÿÿÿÿÿÿÿÉÿÊÿËÿËÿÌÿÍÿÎÿÎÿÏÿÐÿÐÿÑÿÒÿÓÿÓÿÔÿÕÿÕÿÖÿ×ÿ×ÿØÿÙÿÚÿÚÿÛÿÜÿÜÿÝÿÞÿßÿßÿàÿáÿáÿâÿãÿãÿäÿåÿæÿæÿçÿèÿèÿéÿêÿëÿëÿìÿíÿíÿîÿïÿïÿðÿñÿòÿòÿóÿôÿôÿõÿöÿ÷ÿ÷ÿøÿùÿùÿúÿûÿüÿüÿýÿþÿþÿÿ            ÿÿÿÿÿÿÿÿÿÆÿÇÿÈÿÉÿÉÿÊÿËÿËÿÌÿÍÿÎÿÎÿÏÿÐÿÐÿÑÿÒÿÓÿÓÿÔÿÕÿÕÿÖÿ×ÿ×ÿØÿÙÿÚÿÚÿÛÿÜÿÜÿÝÿÞÿßÿßÿàÿáÿáÿâÿãÿãÿäÿåÿæÿæÿçÿèÿèÿéÿêÿëÿëÿìÿíÿíÿîÿïÿïÿðÿñÿòÿòÿóÿôÿôÿõÿöÿ÷ÿ÷ÿøÿùÿùÿúÿûÿüÿüÿýÿþÿþÿÿ          ÿÿÿÿÿÃÿÄÿÅÿÆÿÆÿÇÿÈÿÉÿÉÿÊÿËÿËÿÌÿÍÿÎÿÎÿÏÿÐÿÐÿÑÿÒÿÓÿÓÿÔÿÕÿÕÿÖÿ×ÿ×ÿØÿÙÿÚÿÚÿÛÿÜÿÜÿÝÿÞÿßÿßÿàÿáÿáÿâÿãÿãÿäÿåÿæÿæÿçÿèÿèÿéÿêÿëÿëÿìÿíÿíÿîÿïÿïÿðÿñÿòÿòÿóÿôÿôÿõÿöÿ÷ÿ÷ÿøÿùÿùÿúÿûÿüÿüÿýÿþÿþÿÿ         ÿÁÿÂÿÂÿÃÿÄÿÄÿÅÿÆÿÆÿÇÿÈÿÉÿÉÿÊÿËÿËÿÌÿÍÿÎÿÎÿÏÿÐÿÐÿÑÿÒÿÓÿÓÿÔÿÕÿÕÿÖÿ×ÿ×ÿØÿÙÿÚÿÚÿÛÿÜÿÜÿÝÿÞÿßÿßÿàÿáÿáÿâÿãÿãÿäÿåÿæÿæÿçÿèÿèÿéÿêÿëÿëÿìÿíÿíÿîÿïÿïÿðÿñÿòÿòÿóÿôÿôÿõÿöÿ÷ÿ÷ÿøÿùÿùÿúÿûÿüÿüÿýÿþÿþÿÿ    ÿÿÿÁÿÀÿÁÿÂÿÂÿÃÿÄÿÄÿÅÿÆÿÆÿÇÿÈÿÉÿÉÿÊÿËÿËÿÌÿÍÿÎÿÎÿÏÿÐÿÐÿÑÿÒÿÓÿÓÿÔÿÕÿÕÿÖÿ×ÿ×ÿØÿÙÿÚÿÚÿÛÿÜÿÜÿÝÿÞÿßÿßÿàÿáÿáÿâÿãÿãÿäÿåÿæÿæÿçÿèÿèÿéÿêÿëÿëÿìÿíÿíÿîÿïÿïÿðÿñÿòÿòÿóÿôÿôÿõÿöÿ÷ÿ÷ÿøÿùÿùÿúÿûÿüÿüÿýÿþÿÿÿÿÿÿÿ¿ÿ¿ÿ¿ÿÀÿÁÿÂÿÂÿÃÿÄÿÄÿÅÿÆÿÆÿÇÿÈÿÉÿÉÿÊÿËÿËÿÌÿÍÿÎÿÎÿÏÿÐÿÐÿÑÿÒÿÓÿÓÿÔÿÕÿÕÿÖÿ×ÿ×ÿØÿÙÿÚÿÚÿÛÿÜÿÜÿÝÿÞÿßÿßÿàÿáÿáÿâÿãÿãÿäÿåÿæÿæÿçÿèÿèÿéÿêÿëÿëÿìÿíÿíÿîÿïÿïÿðÿñÿòÿòÿóÿôÿôÿõÿöÿ÷ÿ÷ÿøÿùÿùÿúÿûÿüÿÿÿÿÿÿÿÿÿŸÿœÿŸÿ¿ÿ¿ÿÀÿÁÿÂÿÂÿÃÿÄÿÄÿÅÿÆÿÆÿÇÿÈÿÉÿÉÿÊÿËÿËÿÌÿÍÿÎÿÎÿÏÿÐÿÐÿÑÿÒÿÓÿÓÿÔÿÕÿÕÿÖÿ×ÿ×ÿØÿÙÿÚÿÚÿÛÿÜÿÜÿÝÿÞÿßÿßÿàÿáÿáÿâÿãÿãÿäÿåÿæÿæÿçÿèÿèÿéÿêÿëÿëÿìÿíÿíÿîÿïÿïÿðÿñÿòÿòÿóÿôÿôÿõÿöÿ÷ÿ÷ÿøÿùÿÿÿÿÿÿÿÿÿÿÿÿÿœÿŒÿœÿœÿŸÿ¿ÿ¿ÿÀÿÁÿÂÿÂÿÃÿÄÿÄÿÅÿÆÿÆÿÇÿÈÿÉÿÉÿÊÿËÿËÿÌÿÍÿÎÿÎÿÏÿÐÿÐÿÑÿÒÿÓÿÓÿÔÿÕÿÕÿÖÿ×ÿ×ÿØÿÙÿÚÿÚÿÛÿÜÿÜÿÝÿÞÿßÿßÿàÿáÿáÿâÿãÿãÿäÿåÿæÿæÿçÿèÿèÿéÿêÿëÿëÿìÿíÿíÿîÿïÿïÿðÿñÿòÿòÿóÿôÿôÿõÿ÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ»ÿºÿ»ÿŒÿœÿœÿŸÿ¿ÿ¿ÿÀÿÁÿÂÿÂÿÃÿÄÿÄÿÅÿÆÿÆÿÇÿÈÿÉÿÉÿÊÿËÿËÿÌÿÍÿÎÿÎÿÏÿÐÿÐÿÑÿÒÿÓÿÓÿÔÿÕÿÕÿÖÿ×ÿ×ÿØÿÙÿÚÿÚÿÛÿÜÿÜÿÝÿÞÿßÿßÿàÿáÿáÿâÿãÿãÿäÿåÿæÿæÿçÿèÿèÿéÿêÿëÿëÿìÿíÿíÿîÿïÿïÿðÿñÿòÿòÿôÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿºÿ¹ÿºÿºÿ»ÿŒÿœÿœÿŸÿ¿ÿ¿ÿÀÿÁÿÂÿÂÿÃÿÄÿÄÿÅÿÆÿÆÿÇÿÈÿÉÿÉÿÊÿËÿËÿÌÿÍÿÎÿÎÿÏÿÐÿÐÿÑÿÒÿÓÿÓÿÔÿÕÿÕÿÖÿ×ÿ×ÿØÿÙÿÚÿÚÿÛÿÜÿÜÿÝÿÞÿßÿßÿàÿáÿáÿâÿãÿãÿäÿåÿæÿæÿçÿèÿèÿéÿêÿëÿëÿìÿíÿíÿîÿïÿïÿñÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÿžÿžÿ¹ÿºÿºÿ»ÿŒÿœÿœÿŸÿ¿ÿ¿ÿÀÿÁÿÂÿÂÿÃÿÄÿÄÿÅÿÆÿÆÿÇÿÈÿÉÿÉÿÊÿËÿËÿÌÿÍÿÎÿÎÿÏÿÐÿÐÿÑÿÒÿÓÿÓÿÔÿÕÿÕÿÖÿ×ÿ×ÿØÿÙÿÚÿÚÿÛÿÜÿÜÿÝÿÞÿßÿßÿàÿáÿáÿâÿãÿãÿäÿåÿæÿæÿçÿèÿèÿéÿêÿëÿëÿìÿíÿîÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ·ÿ¶ÿ·ÿžÿžÿ¹ÿºÿºÿ»ÿŒÿœÿœÿŸÿ¿ÿ¿ÿÀÿÁÿÂÿÂÿÃÿÄÿÄÿÅÿÆÿÆÿÇÿÈÿÉÿÉÿÊÿËÿËÿÌÿÍÿÎÿÎÿÏÿÐÿÐÿÑÿÒÿÓÿÓÿÔÿÕÿÕÿÖÿ×ÿ×ÿØÿÙÿÚÿÚÿÛÿÜÿÜÿÝÿÞÿßÿßÿàÿáÿáÿâÿãÿãÿäÿåÿæÿæÿçÿèÿèÿéÿêÿëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿµÿµÿ¶ÿ¶ÿ·ÿžÿžÿ¹ÿºÿºÿ»ÿŒÿœÿœÿŸÿ¿ÿ¿ÿÀÿÁÿÂÿÂÿÃÿÄÿÄÿÅÿÆÿÆÿÇÿÈÿÉÿÉÿÊÿËÿËÿÌÿÍÿÎÿÎÿÏÿÐÿÐÿÑÿÒÿÓÿÓÿÔÿÕÿÕÿÖÿ×ÿ×ÿØÿÙÿÚÿÚÿÛÿÜÿÜÿÝÿÞÿßÿßÿàÿáÿáÿâÿãÿãÿäÿåÿæÿæÿçÿèÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŽÿ³ÿŽÿµÿ¶ÿ¶ÿ·ÿžÿžÿ¹ÿºÿºÿ»ÿŒÿœÿœÿŸÿ¿ÿ¿ÿÀÿÁÿÂÿÂÿÃÿÄÿÄÿÅÿÆÿÆÿÇÿÈÿÉÿÉÿÊÿËÿËÿÌÿÍÿÎÿÎÿÏÿÐÿÐÿÑÿÒÿÓÿÓÿÔÿÕÿÕÿÖÿ×ÿ×ÿØÿÙÿÚÿÚÿÛÿÜÿÜÿÝÿÞÿßÿßÿàÿáÿáÿâÿãÿãÿäÿæÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ³ÿ²ÿ³ÿ³ÿŽÿµÿ¶ÿ¶ÿ·ÿžÿžÿ¹ÿºÿºÿ»ÿŒÿœÿœÿŸÿ¿ÿ¿ÿÀÿÁÿÂÿÂÿÃÿÄÿÄÿÅÿÆÿÆÿÇÿÈÿÉÿÉÿÊÿËÿËÿÌÿÍÿÎÿÎÿÏÿÐÿÐÿÑÿÒÿÓÿÓÿÔÿÕÿÕÿÖÿ×ÿ×ÿØÿÙÿÚÿÚÿÛÿÜÿÜÿÝÿÞÿßÿßÿàÿáÿáÿãÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ±ÿ±ÿ±ÿ²ÿ³ÿ³ÿŽÿµÿ¶ÿ¶ÿ·ÿžÿžÿ¹ÿºÿºÿ»ÿŒÿœÿœÿŸÿ¿ÿ¿ÿÀÿÁÿÂÿÂÿÃÿÄÿÄÿÅÿÆÿÆÿÇÿÈÿÉÿÉÿÊÿËÿËÿÌÿÍÿÎÿÎÿÏÿÐÿÐÿÑÿÒÿÓÿÓÿÔÿÕÿÕÿÖÿ×ÿ×ÿØÿÙÿÚÿÚÿÛÿÜÿÜÿÝÿÞÿßÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ°ÿ¯ÿ°ÿ±ÿ±ÿ²ÿ³ÿ³ÿŽÿµÿ¶ÿ¶ÿ·ÿžÿžÿ¹ÿºÿºÿ»ÿŒÿœÿœÿŸÿ¿ÿ¿ÿÀÿÁÿÂÿÂÿÃÿÄÿÄÿÅÿÆÿÆÿÇÿÈÿÉÿÉÿÊÿËÿËÿÌÿÍÿÎÿÎÿÏÿÐÿÐÿÑÿÒÿÓÿÓÿÔÿÕÿÕÿÖÿ×ÿ×ÿØÿÙÿÚÿÚÿÛÿÜÿÝÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ®ÿ®ÿ®ÿ¯ÿ°ÿ±ÿ±ÿ²ÿ³ÿ³ÿŽÿµÿ¶ÿ¶ÿ·ÿžÿžÿ¹ÿºÿºÿ»ÿŒÿœÿœÿŸÿ¿ÿ¿ÿÀÿÁÿÂÿÂÿÃÿÄÿÄÿÅÿÆÿÆÿÇÿÈÿÉÿÉÿÊÿËÿËÿÌÿÍÿÎÿÎÿÏÿÐÿÐÿÑÿÒÿÓÿÓÿÔÿÕÿÕÿÖÿ×ÿ×ÿØÿÙÿÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ­ÿ¬ÿ­ÿ®ÿ®ÿ¯ÿ°ÿ±ÿ±ÿ²ÿ³ÿ³ÿŽÿµÿ¶ÿ¶ÿ·ÿžÿžÿ¹ÿºÿºÿ»ÿŒÿœÿœÿŸÿ¿ÿ¿ÿÀÿÁÿÂÿÂÿÃÿÄÿÄÿÅÿÆÿÆÿÇÿÈÿÉÿÉÿÊÿËÿËÿÌÿÍÿÎÿÎÿÏÿÐÿÐÿÑÿÒÿÓÿÓÿÔÿÕÿÕÿÖÿ×ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¬ÿ«ÿ¬ÿ¬ÿ­ÿ®ÿ®ÿ¯ÿ°ÿ±ÿ±ÿ²ÿ³ÿ³ÿŽÿµÿ¶ÿ¶ÿ·ÿžÿžÿ¹ÿºÿºÿ»ÿŒÿœÿœÿŸÿ¿ÿ¿ÿÀÿÁÿÂÿÂÿÃÿÄÿÄÿÅÿÆÿÆÿÇÿÈÿÉÿÉÿÊÿËÿËÿÌÿÍÿÎÿÎÿÏÿÐÿÐÿÑÿÒÿÓÿÓÿÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿªÿ©ÿªÿ«ÿ¬ÿ¬ÿ­ÿ®ÿ®ÿ¯ÿ°ÿ±ÿ±ÿ²ÿ³ÿ³ÿŽÿµÿ¶ÿ¶ÿ·ÿžÿžÿ¹ÿºÿºÿ»ÿŒÿœÿœÿŸÿ¿ÿ¿ÿÀÿÁÿÂÿÂÿÃÿÄÿÄÿÅÿÆÿÆÿÇÿÈÿÉÿÉÿÊÿËÿËÿÌÿÍÿÎÿÎÿÏÿÐÿÐÿÒÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ©ÿšÿ©ÿ©ÿªÿ«ÿ¬ÿ¬ÿ­ÿ®ÿ®ÿ¯ÿ°ÿ±ÿ±ÿ²ÿ³ÿ³ÿŽÿµÿ¶ÿ¶ÿ·ÿžÿžÿ¹ÿºÿºÿ»ÿŒÿœÿœÿŸÿ¿ÿ¿ÿÀÿÁÿÂÿÂÿÃÿÄÿÄÿÅÿÆÿÆÿÇÿÈÿÉÿÉÿÊÿËÿËÿÌÿÍÿÎÿÏÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ§ÿ§ÿ§ÿšÿ©ÿ©ÿªÿ«ÿ¬ÿ¬ÿ­ÿ®ÿ®ÿ¯ÿ°ÿ±ÿ±ÿ²ÿ³ÿ³ÿŽÿµÿ¶ÿ¶ÿ·ÿžÿžÿ¹ÿºÿºÿ»ÿŒÿœÿœÿŸÿ¿ÿ¿ÿÀÿÁÿÂÿÂÿÃÿÄÿÄÿÅÿÆÿÆÿÇÿÈÿÉÿÉÿÊÿËÿÌÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŠÿ¥ÿŠÿ§ÿ§ÿšÿ©ÿ©ÿªÿ«ÿ¬ÿ¬ÿ­ÿ®ÿ®ÿ¯ÿ°ÿ±ÿ±ÿ²ÿ³ÿ³ÿŽÿµÿ¶ÿ¶ÿ·ÿžÿžÿ¹ÿºÿºÿ»ÿŒÿœÿœÿŸÿ¿ÿ¿ÿÀÿÁÿÂÿÂÿÃÿÄÿÄÿÅÿÆÿÆÿÇÿÈÿÉÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿ€ÿ¥ÿ¥ÿŠÿ§ÿ§ÿšÿ©ÿ©ÿªÿ«ÿ¬ÿ¬ÿ­ÿ®ÿ®ÿ¯ÿ°ÿ±ÿ±ÿ²ÿ³ÿ³ÿŽÿµÿ¶ÿ¶ÿ·ÿžÿžÿ¹ÿºÿºÿ»ÿŒÿœÿœÿŸÿ¿ÿ¿ÿÀÿÁÿÂÿÂÿÃÿÄÿÄÿÅÿÆÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ£ÿ¢ÿ£ÿ€ÿ¥ÿ¥ÿŠÿ§ÿ§ÿšÿ©ÿ©ÿªÿ«ÿ¬ÿ¬ÿ­ÿ®ÿ®ÿ¯ÿ°ÿ±ÿ±ÿ²ÿ³ÿ³ÿŽÿµÿ¶ÿ¶ÿ·ÿžÿžÿ¹ÿºÿºÿ»ÿŒÿœÿœÿŸÿ¿ÿ¿ÿÀÿÁÿÂÿÂÿÄÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¢ÿ¡ÿ¢ÿ¢ÿ£ÿ€ÿ¥ÿ¥ÿŠÿ§ÿ§ÿšÿ©ÿ©ÿªÿ«ÿ¬ÿ¬ÿ­ÿ®ÿ®ÿ¯ÿ°ÿ±ÿ±ÿ²ÿ³ÿ³ÿŽÿµÿ¶ÿ¶ÿ·ÿžÿžÿ¹ÿºÿºÿ»ÿŒÿœÿœÿŸÿ¿ÿ¿ÿÁÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ ÿ ÿ¡ÿ¢ÿ¢ÿ£ÿ€ÿ¥ÿ¥ÿŠÿ§ÿ§ÿšÿ©ÿ©ÿªÿ«ÿ¬ÿ¬ÿ­ÿ®ÿ®ÿ¯ÿ°ÿ±ÿ±ÿ²ÿ³ÿ³ÿŽÿµÿ¶ÿ¶ÿ·ÿžÿžÿ¹ÿºÿºÿ»ÿŒÿœÿŸÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ ÿ¡ÿ¢ÿ¢ÿ£ÿ€ÿ¥ÿ¥ÿŠÿ§ÿ§ÿšÿ©ÿ©ÿªÿ«ÿ¬ÿ¬ÿ­ÿ®ÿ®ÿ¯ÿ°ÿ±ÿ±ÿ²ÿ³ÿ³ÿŽÿµÿ¶ÿ¶ÿ·ÿžÿžÿ¹ÿºÿ»ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ ÿ¡ÿ¢ÿ¢ÿ£ÿ€ÿ¥ÿ¥ÿŠÿ§ÿ§ÿšÿ©ÿ©ÿªÿ«ÿ¬ÿ¬ÿ­ÿ®ÿ®ÿ¯ÿ°ÿ±ÿ±ÿ²ÿ³ÿ³ÿŽÿµÿ¶ÿ¶ÿ·ÿžÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ ÿ¡ÿ¢ÿ¢ÿ£ÿ€ÿ¥ÿ¥ÿŠÿ§ÿ§ÿšÿ©ÿ©ÿªÿ«ÿ¬ÿ¬ÿ­ÿ®ÿ®ÿ¯ÿ°ÿ±ÿ±ÿ²ÿ³ÿ³ÿŽÿµÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ ÿ¡ÿ¢ÿ¢ÿ£ÿ€ÿ¥ÿ¥ÿŠÿ§ÿ§ÿšÿ©ÿ©ÿªÿ«ÿ¬ÿ¬ÿ­ÿ®ÿ®ÿ¯ÿ°ÿ±ÿ±ÿ³ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ ÿ¡ÿ¢ÿ¢ÿ£ÿ€ÿ¥ÿ¥ÿŠÿ§ÿ§ÿšÿ©ÿ©ÿªÿ«ÿ¬ÿ¬ÿ­ÿ®ÿ®ÿ°ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ ÿ¡ÿ¢ÿ¢ÿ£ÿ€ÿ¥ÿ¥ÿŠÿ§ÿ§ÿšÿ©ÿ©ÿªÿ«ÿ¬ÿ­ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ ÿ¡ÿ¢ÿ¢ÿ£ÿ€ÿ¥ÿ¥ÿŠÿ§ÿ§ÿšÿ©ÿªÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ ÿ¡ÿ¢ÿ¢ÿ£ÿ€ÿ¥ÿ¥ÿŠÿ§ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ ÿ¡ÿ¢ÿ¢ÿ£ÿ¥ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ ÿ¢ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
+ÿ
+ÿ
+ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
+ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              XTENSION= 'IMAGE   '           / IMAGE extension                                BITPIX  =                   16 / number of bits per data pixel                  NAXIS   =                    3 / number of data axes                            NAXIS1  =                   64 / length of data axis 1                          NAXIS2  =                   64 / length of data axis 2                          NAXIS3  =                    1 / length of data axis 3                          PCOUNT  =                    0 / required keyword; must = 0                     GCOUNT  =                    1 / required keyword; must = 1                     BZERO   =   0.000000000000E+00 / Pixel Value Offset                             BSCALE  =   1.000000000000E+00 / Pixel Value Scale                              END                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             ÿÁÿÃÿÅÿÇÿÉÿËÿÍÿÏÿÑÿÓÿÕÿ×ÿÙÿÛÿÝÿßÿáÿãÿåÿçÿéÿëÿíÿïÿñÿóÿõÿ÷ÿùÿûÿýÿÿ     	 
+ 
+        
+  ! # % ' ) + - / 1 3 5 7 9 ; = ?ÿÀÿÂÿÄÿÆÿÈÿÊÿÌÿÎÿÐÿÒÿÔÿÖÿØÿÚÿÜÿÞÿàÿâÿäÿæÿèÿêÿìÿîÿðÿòÿôÿöÿøÿúÿüÿþ       
+ 
+        
+ 
+   " $ & ( * , . 0 2 4 6 8 : < >ÿ¿ÿÁÿÃÿÅÿÇÿÉÿËÿÍÿÏÿÑÿÓÿÕÿ×ÿÙÿÛÿÝÿßÿáÿãÿåÿçÿéÿëÿíÿïÿñÿóÿõÿ÷ÿùÿûÿýÿÿ     	 
+ 
+        
+  ! # % ' ) + - / 1 3 5 7 9 ; =ÿŸÿÀÿÂÿÄÿÆÿÈÿÊÿÌÿÎÿÐÿÒÿÔÿÖÿØÿÚÿÜÿÞÿàÿâÿäÿæÿèÿêÿìÿîÿðÿòÿôÿöÿøÿúÿüÿþ       
+ 
+        
+ 
+   " $ & ( * , . 0 2 4 6 8 : <ÿœÿ¿ÿÁÿÃÿÅÿÇÿÉÿËÿÍÿÏÿÑÿÓÿÕÿ×ÿÙÿÛÿÝÿßÿáÿãÿåÿçÿéÿëÿíÿïÿñÿóÿõÿ÷ÿùÿûÿýÿÿ     	 
+ 
+        
+  ! # % ' ) + - / 1 3 5 7 9 ;ÿŒÿŸÿÀÿÂÿÄÿÆÿÈÿÊÿÌÿÎÿÐÿÒÿÔÿÖÿØÿÚÿÜÿÞÿàÿâÿäÿæÿèÿêÿìÿîÿðÿòÿôÿöÿøÿúÿüÿþ       
+ 
+        
+ 
+   " $ & ( * , . 0 2 4 6 8 :ÿ»ÿœÿ¿ÿÁÿÃÿÅÿÇÿÉÿËÿÍÿÏÿÑÿÓÿÕÿ×ÿÙÿÛÿÝÿßÿáÿãÿåÿçÿéÿëÿíÿïÿñÿóÿõÿ÷ÿùÿûÿýÿÿ     	 
+ 
+        
+  ! # % ' ) + - / 1 3 5 7 9ÿºÿŒÿŸÿÀÿÂÿÄÿÆÿÈÿÊÿÌÿÎÿÐÿÒÿÔÿÖÿØÿÚÿÜÿÞÿàÿâÿäÿæÿèÿêÿìÿîÿðÿòÿôÿöÿøÿúÿüÿþ       
+ 
+        
+ 
+   " $ & ( * , . 0 2 4 6 8ÿ¹ÿ»ÿœÿ¿ÿÁÿÃÿÅÿÇÿÉÿËÿÍÿÏÿÑÿÓÿÕÿ×ÿÙÿÛÿÝÿßÿáÿãÿåÿçÿéÿëÿíÿïÿñÿóÿõÿ÷ÿùÿûÿýÿÿ     	 
+ 
+        
+  ! # % ' ) + - / 1 3 5 7ÿžÿºÿŒÿŸÿÀÿÂÿÄÿÆÿÈÿÊÿÌÿÎÿÐÿÒÿÔÿÖÿØÿÚÿÜÿÞÿàÿâÿäÿæÿèÿêÿìÿîÿðÿòÿôÿöÿøÿúÿüÿþ       
+ 
+        
+ 
+   " $ & ( * , . 0 2 4 6ÿ·ÿ¹ÿ»ÿœÿ¿ÿÁÿÃÿÅÿÇÿÉÿËÿÍÿÏÿÑÿÓÿÕÿ×ÿÙÿÛÿÝÿßÿáÿãÿåÿçÿéÿëÿíÿïÿñÿóÿõÿ÷ÿùÿûÿýÿÿ     	 
+ 
+        
+  ! # % ' ) + - / 1 3 5ÿ¶ÿžÿºÿŒÿŸÿÀÿÂÿÄÿÆÿÈÿÊÿÌÿÎÿÐÿÒÿÔÿÖÿØÿÚÿÜÿÞÿàÿâÿäÿæÿèÿêÿìÿîÿðÿòÿôÿöÿøÿúÿüÿþ       
+ 
+        
+ 
+   " $ & ( * , . 0 2 4ÿµÿ·ÿ¹ÿ»ÿœÿ¿ÿÁÿÃÿÅÿÇÿÉÿËÿÍÿÏÿÑÿÓÿÕÿ×ÿÙÿÛÿÝÿßÿáÿãÿåÿçÿéÿëÿíÿïÿñÿóÿõÿ÷ÿùÿûÿýÿÿ     	 
+ 
+        
+  ! # % ' ) + - / 1 3ÿŽÿ¶ÿžÿºÿŒÿŸÿÀÿÂÿÄÿÆÿÈÿÊÿÌÿÎÿÐÿÒÿÔÿÖÿØÿÚÿÜÿÞÿàÿâÿäÿæÿèÿêÿìÿîÿðÿòÿôÿöÿøÿúÿüÿþ       
+ 
+        
+ 
+   " $ & ( * , . 0 2ÿ³ÿµÿ·ÿ¹ÿ»ÿœÿ¿ÿÁÿÃÿÅÿÇÿÉÿËÿÍÿÏÿÑÿÓÿÕÿ×ÿÙÿÛÿÝÿßÿáÿãÿåÿçÿéÿëÿíÿïÿñÿóÿõÿ÷ÿùÿûÿýÿÿ     	 
+ 
+        
+  ! # % ' ) + - / 1ÿ²ÿŽÿ¶ÿžÿºÿŒÿŸÿÀÿÂÿÄÿÆÿÈÿÊÿÌÿÎÿÐÿÒÿÔÿÖÿØÿÚÿÜÿÞÿàÿâÿäÿæÿèÿêÿìÿîÿðÿòÿôÿöÿøÿúÿüÿþ       
+ 
+        
+ 
+   " $ & ( * , . 0ÿ±ÿ³ÿµÿ·ÿ¹ÿ»ÿœÿ¿ÿÁÿÃÿÅÿÇÿÉÿËÿÍÿÏÿÑÿÓÿÕÿ×ÿÙÿÛÿÝÿßÿáÿãÿåÿçÿéÿëÿíÿïÿñÿóÿõÿ÷ÿùÿûÿýÿÿ     	 
+ 
+        
+  ! # % ' ) + - /ÿ°ÿ²ÿŽÿ¶ÿžÿºÿŒÿŸÿÀÿÂÿÄÿÆÿÈÿÊÿÌÿÎÿÐÿÒÿÔÿÖÿØÿÚÿÜÿÞÿàÿâÿäÿæÿèÿêÿìÿîÿðÿòÿôÿöÿøÿúÿüÿþ       
+ 
+        
+ 
+   " $ & ( * , .ÿ¯ÿ±ÿ³ÿµÿ·ÿ¹ÿ»ÿœÿ¿ÿÁÿÃÿÅÿÇÿÉÿËÿÍÿÏÿÑÿÓÿÕÿ×ÿÙÿÛÿÝÿßÿáÿãÿåÿçÿéÿëÿíÿïÿñÿóÿõÿ÷ÿùÿûÿýÿÿ     	 
+ 
+        
+  ! # % ' ) + -ÿ®ÿ°ÿ²ÿŽÿ¶ÿžÿºÿŒÿŸÿÀÿÂÿÄÿÆÿÈÿÊÿÌÿÎÿÐÿÒÿÔÿÖÿØÿÚÿÜÿÞÿàÿâÿäÿæÿèÿêÿìÿîÿðÿòÿôÿöÿøÿúÿüÿþ       
+ 
+        
+ 
+   " $ & ( * ,ÿ­ÿ¯ÿ±ÿ³ÿµÿ·ÿ¹ÿ»ÿœÿ¿ÿÁÿÃÿÅÿÇÿÉÿËÿÍÿÏÿÑÿÓÿÕÿ×ÿÙÿÛÿÝÿßÿáÿãÿåÿçÿéÿëÿíÿïÿñÿóÿõÿ÷ÿùÿûÿýÿÿ     	 
+ 
+        
+  ! # % ' ) +ÿ¬ÿ®ÿ°ÿ²ÿŽÿ¶ÿžÿºÿŒÿŸÿÀÿÂÿÄÿÆÿÈÿÊÿÌÿÎÿÐÿÒÿÔÿÖÿØÿÚÿÜÿÞÿàÿâÿäÿæÿèÿêÿìÿîÿðÿòÿôÿöÿøÿúÿüÿþ       
+ 
+        
+ 
+   " $ & ( *ÿ«ÿ­ÿ¯ÿ±ÿ³ÿµÿ·ÿ¹ÿ»ÿœÿ¿ÿÁÿÃÿÅÿÇÿÉÿËÿÍÿÏÿÑÿÓÿÕÿ×ÿÙÿÛÿÝÿßÿáÿãÿåÿçÿéÿëÿíÿïÿñÿóÿõÿ÷ÿùÿûÿýÿÿ     	 
+ 
+        
+  ! # % ' )ÿªÿ¬ÿ®ÿ°ÿ²ÿŽÿ¶ÿžÿºÿŒÿŸÿÀÿÂÿÄÿÆÿÈÿÊÿÌÿÎÿÐÿÒÿÔÿÖÿØÿÚÿÜÿÞÿàÿâÿäÿæÿèÿêÿìÿîÿðÿòÿôÿöÿøÿúÿüÿþ       
+ 
+        
+ 
+   " $ & (ÿ©ÿ«ÿ­ÿ¯ÿ±ÿ³ÿµÿ·ÿ¹ÿ»ÿœÿ¿ÿÁÿÃÿÅÿÇÿÉÿËÿÍÿÏÿÑÿÓÿÕÿ×ÿÙÿÛÿÝÿßÿáÿãÿåÿçÿéÿëÿíÿïÿñÿóÿõÿ÷ÿùÿûÿýÿÿ     	 
+ 
+        
+  ! # % 'ÿšÿªÿ¬ÿ®ÿ°ÿ²ÿŽÿ¶ÿžÿºÿŒÿŸÿÀÿÂÿÄÿÆÿÈÿÊÿÌÿÎÿÐÿÒÿÔÿÖÿØÿÚÿÜÿÞÿàÿâÿäÿæÿèÿêÿìÿîÿðÿòÿôÿöÿøÿúÿüÿþ       
+ 
+        
+ 
+   " $ &ÿ§ÿ©ÿ«ÿ­ÿ¯ÿ±ÿ³ÿµÿ·ÿ¹ÿ»ÿœÿ¿ÿÁÿÃÿÅÿÇÿÉÿËÿÍÿÏÿÑÿÓÿÕÿ×ÿÙÿÛÿÝÿßÿáÿãÿåÿçÿéÿëÿíÿïÿñÿóÿõÿ÷ÿùÿûÿýÿÿ     	 
+ 
+        
+  ! # %ÿŠÿšÿªÿ¬ÿ®ÿ°ÿ²ÿŽÿ¶ÿžÿºÿŒÿŸÿÀÿÂÿÄÿÆÿÈÿÊÿÌÿÎÿÐÿÒÿÔÿÖÿØÿÚÿÜÿÞÿàÿâÿäÿæÿèÿêÿìÿîÿðÿòÿôÿöÿøÿúÿüÿþ       
+ 
+        
+ 
+   " $ÿ¥ÿ§ÿ©ÿ«ÿ­ÿ¯ÿ±ÿ³ÿµÿ·ÿ¹ÿ»ÿœÿ¿ÿÁÿÃÿÅÿÇÿÉÿËÿÍÿÏÿÑÿÓÿÕÿ×ÿÙÿÛÿÝÿßÿáÿãÿåÿçÿéÿëÿíÿïÿñÿóÿõÿ÷ÿùÿûÿýÿÿ     	 
+ 
+        
+  ! #ÿ€ÿŠÿšÿªÿ¬ÿ®ÿ°ÿ²ÿŽÿ¶ÿžÿºÿŒÿŸÿÀÿÂÿÄÿÆÿÈÿÊÿÌÿÎÿÐÿÒÿÔÿÖÿØÿÚÿÜÿÞÿàÿâÿäÿæÿèÿêÿìÿîÿðÿòÿôÿöÿøÿúÿüÿþ       
+ 
+        
+ 
+   "ÿ£ÿ¥ÿ§ÿ©ÿ«ÿ­ÿ¯ÿ±ÿ³ÿµÿ·ÿ¹ÿ»ÿœÿ¿ÿÁÿÃÿÅÿÇÿÉÿËÿÍÿÏÿÑÿÓÿÕÿ×ÿÙÿÛÿÝÿßÿáÿãÿåÿçÿéÿëÿíÿïÿñÿóÿõÿ÷ÿùÿûÿýÿÿ     	 
+ 
+        
+  !ÿ¢ÿ€ÿŠÿšÿªÿ¬ÿ®ÿ°ÿ²ÿŽÿ¶ÿžÿºÿŒÿŸÿÀÿÂÿÄÿÆÿÈÿÊÿÌÿÎÿÐÿÒÿÔÿÖÿØÿÚÿÜÿÞÿàÿâÿäÿæÿèÿêÿìÿîÿðÿòÿôÿöÿøÿúÿüÿþ       
+ 
+        
+ 
+  ÿ¡ÿ£ÿ¥ÿ§ÿ©ÿ«ÿ­ÿ¯ÿ±ÿ³ÿµÿ·ÿ¹ÿ»ÿœÿ¿ÿÁÿÃÿÅÿÇÿÉÿËÿÍÿÏÿÑÿÓÿÕÿ×ÿÙÿÛÿÝÿßÿáÿãÿåÿçÿéÿëÿíÿïÿñÿóÿõÿ÷ÿùÿûÿýÿÿ     	 
+ 
+        
+ ÿ ÿ¢ÿ€ÿŠÿšÿªÿ¬ÿ®ÿ°ÿ²ÿŽÿ¶ÿžÿºÿŒÿŸÿÀÿÂÿÄÿÆÿÈÿÊÿÌÿÎÿÐÿÒÿÔÿÖÿØÿÚÿÜÿÞÿàÿâÿäÿæÿèÿêÿìÿîÿðÿòÿôÿöÿøÿúÿüÿþ       
+ 
+        
+ 
+ÿÿ¡ÿ£ÿ¥ÿ§ÿ©ÿ«ÿ­ÿ¯ÿ±ÿ³ÿµÿ·ÿ¹ÿ»ÿœÿ¿ÿÁÿÃÿÅÿÇÿÉÿËÿÍÿÏÿÑÿÓÿÕÿ×ÿÙÿÛÿÝÿßÿáÿãÿåÿçÿéÿëÿíÿïÿñÿóÿõÿ÷ÿùÿûÿýÿÿ     	 
+ 
+        
+ÿÿ ÿ¢ÿ€ÿŠÿšÿªÿ¬ÿ®ÿ°ÿ²ÿŽÿ¶ÿžÿºÿŒÿŸÿÀÿÂÿÄÿÆÿÈÿÊÿÌÿÎÿÐÿÒÿÔÿÖÿØÿÚÿÜÿÞÿàÿâÿäÿæÿèÿêÿìÿîÿðÿòÿôÿöÿøÿúÿüÿþ       
+ 
+        
+ÿÿÿ¡ÿ£ÿ¥ÿ§ÿ©ÿ«ÿ­ÿ¯ÿ±ÿ³ÿµÿ·ÿ¹ÿ»ÿœÿ¿ÿÁÿÃÿÅÿÇÿÉÿËÿÍÿÏÿÑÿÓÿÕÿ×ÿÙÿÛÿÝÿßÿáÿãÿåÿçÿéÿëÿíÿïÿñÿóÿõÿ÷ÿùÿûÿýÿÿ     	 
+ 
+       ÿÿÿ ÿ¢ÿ€ÿŠÿšÿªÿ¬ÿ®ÿ°ÿ²ÿŽÿ¶ÿžÿºÿŒÿŸÿÀÿÂÿÄÿÆÿÈÿÊÿÌÿÎÿÐÿÒÿÔÿÖÿØÿÚÿÜÿÞÿàÿâÿäÿæÿèÿêÿìÿîÿðÿòÿôÿöÿøÿúÿüÿþ       
+ 
+       ÿÿÿÿ¡ÿ£ÿ¥ÿ§ÿ©ÿ«ÿ­ÿ¯ÿ±ÿ³ÿµÿ·ÿ¹ÿ»ÿœÿ¿ÿÁÿÃÿÅÿÇÿÉÿËÿÍÿÏÿÑÿÓÿÕÿ×ÿÙÿÛÿÝÿßÿáÿãÿåÿçÿéÿëÿíÿïÿñÿóÿõÿ÷ÿùÿûÿýÿÿ     	 
+ 
+      ÿÿÿÿ ÿ¢ÿ€ÿŠÿšÿªÿ¬ÿ®ÿ°ÿ²ÿŽÿ¶ÿžÿºÿŒÿŸÿÀÿÂÿÄÿÆÿÈÿÊÿÌÿÎÿÐÿÒÿÔÿÖÿØÿÚÿÜÿÞÿàÿâÿäÿæÿèÿêÿìÿîÿðÿòÿôÿöÿøÿúÿüÿþ       
+ 
+      ÿÿÿÿÿ¡ÿ£ÿ¥ÿ§ÿ©ÿ«ÿ­ÿ¯ÿ±ÿ³ÿµÿ·ÿ¹ÿ»ÿœÿ¿ÿÁÿÃÿÅÿÇÿÉÿËÿÍÿÏÿÑÿÓÿÕÿ×ÿÙÿÛÿÝÿßÿáÿãÿåÿçÿéÿëÿíÿïÿñÿóÿõÿ÷ÿùÿûÿýÿÿ     	 
+ 
+     ÿÿÿÿÿ ÿ¢ÿ€ÿŠÿšÿªÿ¬ÿ®ÿ°ÿ²ÿŽÿ¶ÿžÿºÿŒÿŸÿÀÿÂÿÄÿÆÿÈÿÊÿÌÿÎÿÐÿÒÿÔÿÖÿØÿÚÿÜÿÞÿàÿâÿäÿæÿèÿêÿìÿîÿðÿòÿôÿöÿøÿúÿüÿþ       
+ 
+     ÿÿÿÿÿÿ¡ÿ£ÿ¥ÿ§ÿ©ÿ«ÿ­ÿ¯ÿ±ÿ³ÿµÿ·ÿ¹ÿ»ÿœÿ¿ÿÁÿÃÿÅÿÇÿÉÿËÿÍÿÏÿÑÿÓÿÕÿ×ÿÙÿÛÿÝÿßÿáÿãÿåÿçÿéÿëÿíÿïÿñÿóÿõÿ÷ÿùÿûÿýÿÿ     	 
+ 
+    ÿÿÿÿÿÿ ÿ¢ÿ€ÿŠÿšÿªÿ¬ÿ®ÿ°ÿ²ÿŽÿ¶ÿžÿºÿŒÿŸÿÀÿÂÿÄÿÆÿÈÿÊÿÌÿÎÿÐÿÒÿÔÿÖÿØÿÚÿÜÿÞÿàÿâÿäÿæÿèÿêÿìÿîÿðÿòÿôÿöÿøÿúÿüÿþ       
+ 
+    ÿÿÿÿÿÿÿ¡ÿ£ÿ¥ÿ§ÿ©ÿ«ÿ­ÿ¯ÿ±ÿ³ÿµÿ·ÿ¹ÿ»ÿœÿ¿ÿÁÿÃÿÅÿÇÿÉÿËÿÍÿÏÿÑÿÓÿÕÿ×ÿÙÿÛÿÝÿßÿáÿãÿåÿçÿéÿëÿíÿïÿñÿóÿõÿ÷ÿùÿûÿýÿÿ     	 
+ 
+   ÿÿÿÿÿÿÿ ÿ¢ÿ€ÿŠÿšÿªÿ¬ÿ®ÿ°ÿ²ÿŽÿ¶ÿžÿºÿŒÿŸÿÀÿÂÿÄÿÆÿÈÿÊÿÌÿÎÿÐÿÒÿÔÿÖÿØÿÚÿÜÿÞÿàÿâÿäÿæÿèÿêÿìÿîÿðÿòÿôÿöÿøÿúÿüÿþ       
+ 
+   ÿÿÿÿÿÿÿÿ¡ÿ£ÿ¥ÿ§ÿ©ÿ«ÿ­ÿ¯ÿ±ÿ³ÿµÿ·ÿ¹ÿ»ÿœÿ¿ÿÁÿÃÿÅÿÇÿÉÿËÿÍÿÏÿÑÿÓÿÕÿ×ÿÙÿÛÿÝÿßÿáÿãÿåÿçÿéÿëÿíÿïÿñÿóÿõÿ÷ÿùÿûÿýÿÿ     	 
+ 
+  ÿÿÿÿÿÿÿÿ ÿ¢ÿ€ÿŠÿšÿªÿ¬ÿ®ÿ°ÿ²ÿŽÿ¶ÿžÿºÿŒÿŸÿÀÿÂÿÄÿÆÿÈÿÊÿÌÿÎÿÐÿÒÿÔÿÖÿØÿÚÿÜÿÞÿàÿâÿäÿæÿèÿêÿìÿîÿðÿòÿôÿöÿøÿúÿüÿþ       
+ 
+  ÿÿÿÿÿÿÿÿÿ¡ÿ£ÿ¥ÿ§ÿ©ÿ«ÿ­ÿ¯ÿ±ÿ³ÿµÿ·ÿ¹ÿ»ÿœÿ¿ÿÁÿÃÿÅÿÇÿÉÿËÿÍÿÏÿÑÿÓÿÕÿ×ÿÙÿÛÿÝÿßÿáÿãÿåÿçÿéÿëÿíÿïÿñÿóÿõÿ÷ÿùÿûÿýÿÿ     	 
+ 
+ ÿÿÿÿÿÿÿÿÿ ÿ¢ÿ€ÿŠÿšÿªÿ¬ÿ®ÿ°ÿ²ÿŽÿ¶ÿžÿºÿŒÿŸÿÀÿÂÿÄÿÆÿÈÿÊÿÌÿÎÿÐÿÒÿÔÿÖÿØÿÚÿÜÿÞÿàÿâÿäÿæÿèÿêÿìÿîÿðÿòÿôÿöÿøÿúÿüÿþ       
+ 
+ ÿÿÿÿÿÿÿÿÿÿ¡ÿ£ÿ¥ÿ§ÿ©ÿ«ÿ­ÿ¯ÿ±ÿ³ÿµÿ·ÿ¹ÿ»ÿœÿ¿ÿÁÿÃÿÅÿÇÿÉÿËÿÍÿÏÿÑÿÓÿÕÿ×ÿÙÿÛÿÝÿßÿáÿãÿåÿçÿéÿëÿíÿïÿñÿóÿõÿ÷ÿùÿûÿýÿÿ     	 
+ 
+ÿÿÿÿÿÿÿÿÿÿ ÿ¢ÿ€ÿŠÿšÿªÿ¬ÿ®ÿ°ÿ²ÿŽÿ¶ÿžÿºÿŒÿŸÿÀÿÂÿÄÿÆÿÈÿÊÿÌÿÎÿÐÿÒÿÔÿÖÿØÿÚÿÜÿÞÿàÿâÿäÿæÿèÿêÿìÿîÿðÿòÿôÿöÿøÿúÿüÿþ       
+ 
+ÿÿÿÿÿÿÿÿÿÿÿ¡ÿ£ÿ¥ÿ§ÿ©ÿ«ÿ­ÿ¯ÿ±ÿ³ÿµÿ·ÿ¹ÿ»ÿœÿ¿ÿÁÿÃÿÅÿÇÿÉÿËÿÍÿÏÿÑÿÓÿÕÿ×ÿÙÿÛÿÝÿßÿáÿãÿåÿçÿéÿëÿíÿïÿñÿóÿõÿ÷ÿùÿûÿýÿÿ     	 
+ÿÿÿÿÿÿÿÿÿÿÿ ÿ¢ÿ€ÿŠÿšÿªÿ¬ÿ®ÿ°ÿ²ÿŽÿ¶ÿžÿºÿŒÿŸÿÀÿÂÿÄÿÆÿÈÿÊÿÌÿÎÿÐÿÒÿÔÿÖÿØÿÚÿÜÿÞÿàÿâÿäÿæÿèÿêÿìÿîÿðÿòÿôÿöÿøÿúÿüÿþ       
+ÿÿÿÿÿÿÿÿÿÿÿÿ¡ÿ£ÿ¥ÿ§ÿ©ÿ«ÿ­ÿ¯ÿ±ÿ³ÿµÿ·ÿ¹ÿ»ÿœÿ¿ÿÁÿÃÿÅÿÇÿÉÿËÿÍÿÏÿÑÿÓÿÕÿ×ÿÙÿÛÿÝÿßÿáÿãÿåÿçÿéÿëÿíÿïÿñÿóÿõÿ÷ÿùÿûÿýÿÿ     	ÿÿÿÿÿÿÿÿÿÿÿÿ ÿ¢ÿ€ÿŠÿšÿªÿ¬ÿ®ÿ°ÿ²ÿŽÿ¶ÿžÿºÿŒÿŸÿÀÿÂÿÄÿÆÿÈÿÊÿÌÿÎÿÐÿÒÿÔÿÖÿØÿÚÿÜÿÞÿàÿâÿäÿæÿèÿêÿìÿîÿðÿòÿôÿöÿøÿúÿüÿþ      ÿÿÿÿÿÿÿÿÿÿÿÿÿ¡ÿ£ÿ¥ÿ§ÿ©ÿ«ÿ­ÿ¯ÿ±ÿ³ÿµÿ·ÿ¹ÿ»ÿœÿ¿ÿÁÿÃÿÅÿÇÿÉÿËÿÍÿÏÿÑÿÓÿÕÿ×ÿÙÿÛÿÝÿßÿáÿãÿåÿçÿéÿëÿíÿïÿñÿóÿõÿ÷ÿùÿûÿýÿÿ    ÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ¢ÿ€ÿŠÿšÿªÿ¬ÿ®ÿ°ÿ²ÿŽÿ¶ÿžÿºÿŒÿŸÿÀÿÂÿÄÿÆÿÈÿÊÿÌÿÎÿÐÿÒÿÔÿÖÿØÿÚÿÜÿÞÿàÿâÿäÿæÿèÿêÿìÿîÿðÿòÿôÿöÿøÿúÿüÿþ     ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¡ÿ£ÿ¥ÿ§ÿ©ÿ«ÿ­ÿ¯ÿ±ÿ³ÿµÿ·ÿ¹ÿ»ÿœÿ¿ÿÁÿÃÿÅÿÇÿÉÿËÿÍÿÏÿÑÿÓÿÕÿ×ÿÙÿÛÿÝÿßÿáÿãÿåÿçÿéÿëÿíÿïÿñÿóÿõÿ÷ÿùÿûÿýÿÿ   ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ¢ÿ€ÿŠÿšÿªÿ¬ÿ®ÿ°ÿ²ÿŽÿ¶ÿžÿºÿŒÿŸÿÀÿÂÿÄÿÆÿÈÿÊÿÌÿÎÿÐÿÒÿÔÿÖÿØÿÚÿÜÿÞÿàÿâÿäÿæÿèÿêÿìÿîÿðÿòÿôÿöÿøÿúÿüÿþ    ÿ
+ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¡ÿ£ÿ¥ÿ§ÿ©ÿ«ÿ­ÿ¯ÿ±ÿ³ÿµÿ·ÿ¹ÿ»ÿœÿ¿ÿÁÿÃÿÅÿÇÿÉÿËÿÍÿÏÿÑÿÓÿÕÿ×ÿÙÿÛÿÝÿßÿáÿãÿåÿçÿéÿëÿíÿïÿñÿóÿõÿ÷ÿùÿûÿýÿÿ  ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ¢ÿ€ÿŠÿšÿªÿ¬ÿ®ÿ°ÿ²ÿŽÿ¶ÿžÿºÿŒÿŸÿÀÿÂÿÄÿÆÿÈÿÊÿÌÿÎÿÐÿÒÿÔÿÖÿØÿÚÿÜÿÞÿàÿâÿäÿæÿèÿêÿìÿîÿðÿòÿôÿöÿøÿúÿüÿþ   ÿÿ
+ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¡ÿ£ÿ¥ÿ§ÿ©ÿ«ÿ­ÿ¯ÿ±ÿ³ÿµÿ·ÿ¹ÿ»ÿœÿ¿ÿÁÿÃÿÅÿÇÿÉÿËÿÍÿÏÿÑÿÓÿÕÿ×ÿÙÿÛÿÝÿßÿáÿãÿåÿçÿéÿëÿíÿïÿñÿóÿõÿ÷ÿùÿûÿýÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ¢ÿ€ÿŠÿšÿªÿ¬ÿ®ÿ°ÿ²ÿŽÿ¶ÿžÿºÿŒÿŸÿÀÿÂÿÄÿÆÿÈÿÊÿÌÿÎÿÐÿÒÿÔÿÖÿØÿÚÿÜÿÞÿàÿâÿäÿæÿèÿêÿìÿîÿðÿòÿôÿöÿøÿúÿüÿþ                                                                                                                                                                                                                                                                                                                                                                                                                                                                  
Index: /tags/ipp-1-X/bug123/psLib/test/image/verified/tst_psImage.stderr
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/image/verified/tst_psImage.stderr	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/image/verified/tst_psImage.stderr	(revision 22331)
@@ -0,0 +1,123 @@
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psImage.c                                              *
+*            TestPoint: psImage{psImageAlloc}                                      *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|I|testImageAlloc
+    #546 - psImageAlloc shall allocate memory for a psImage structure
+<DATE><TIME>|<HOST>|I|testImageAlloc
+    Testing psImage with type 101h
+<DATE><TIME>|<HOST>|I|testImageAlloc
+    Following should be an error.
+<DATE><TIME>|<HOST>|E|psImageAlloc (FILE:LINENO)
+    Specified number of rows (0) or columns (0) is invalid.
+<DATE><TIME>|<HOST>|I|testImageAlloc
+    Testing psImage with type 102h
+<DATE><TIME>|<HOST>|I|testImageAlloc
+    Following should be an error.
+<DATE><TIME>|<HOST>|E|psImageAlloc (FILE:LINENO)
+    Specified number of rows (0) or columns (0) is invalid.
+<DATE><TIME>|<HOST>|I|testImageAlloc
+    Testing psImage with type 104h
+<DATE><TIME>|<HOST>|I|testImageAlloc
+    Following should be an error.
+<DATE><TIME>|<HOST>|E|psImageAlloc (FILE:LINENO)
+    Specified number of rows (0) or columns (0) is invalid.
+<DATE><TIME>|<HOST>|I|testImageAlloc
+    Testing psImage with type 108h
+<DATE><TIME>|<HOST>|I|testImageAlloc
+    Following should be an error.
+<DATE><TIME>|<HOST>|E|psImageAlloc (FILE:LINENO)
+    Specified number of rows (0) or columns (0) is invalid.
+<DATE><TIME>|<HOST>|I|testImageAlloc
+    Testing psImage with type 301h
+<DATE><TIME>|<HOST>|I|testImageAlloc
+    Following should be an error.
+<DATE><TIME>|<HOST>|E|psImageAlloc (FILE:LINENO)
+    Specified number of rows (0) or columns (0) is invalid.
+<DATE><TIME>|<HOST>|I|testImageAlloc
+    Testing psImage with type 302h
+<DATE><TIME>|<HOST>|I|testImageAlloc
+    Following should be an error.
+<DATE><TIME>|<HOST>|E|psImageAlloc (FILE:LINENO)
+    Specified number of rows (0) or columns (0) is invalid.
+<DATE><TIME>|<HOST>|I|testImageAlloc
+    Testing psImage with type 304h
+<DATE><TIME>|<HOST>|I|testImageAlloc
+    Following should be an error.
+<DATE><TIME>|<HOST>|E|psImageAlloc (FILE:LINENO)
+    Specified number of rows (0) or columns (0) is invalid.
+<DATE><TIME>|<HOST>|I|testImageAlloc
+    Testing psImage with type 308h
+<DATE><TIME>|<HOST>|I|testImageAlloc
+    Following should be an error.
+<DATE><TIME>|<HOST>|E|psImageAlloc (FILE:LINENO)
+    Specified number of rows (0) or columns (0) is invalid.
+<DATE><TIME>|<HOST>|I|testImageAlloc
+    Testing psImage with type 404h
+<DATE><TIME>|<HOST>|I|testImageAlloc
+    Following should be an error.
+<DATE><TIME>|<HOST>|E|psImageAlloc (FILE:LINENO)
+    Specified number of rows (0) or columns (0) is invalid.
+<DATE><TIME>|<HOST>|I|testImageAlloc
+    Testing psImage with type 408h
+<DATE><TIME>|<HOST>|I|testImageAlloc
+    Following should be an error.
+<DATE><TIME>|<HOST>|E|psImageAlloc (FILE:LINENO)
+    Specified number of rows (0) or columns (0) is invalid.
+<DATE><TIME>|<HOST>|I|testImageAlloc
+    Testing psImage with type 808h
+<DATE><TIME>|<HOST>|I|testImageAlloc
+    Following should be an error.
+<DATE><TIME>|<HOST>|E|psImageAlloc (FILE:LINENO)
+    Specified number of rows (0) or columns (0) is invalid.
+<DATE><TIME>|<HOST>|I|testImageAlloc
+    Testing psImage with type 810h
+<DATE><TIME>|<HOST>|I|testImageAlloc
+    Following should be an error.
+<DATE><TIME>|<HOST>|E|psImageAlloc (FILE:LINENO)
+    Specified number of rows (0) or columns (0) is invalid.
+
+---> TESTPOINT PASSED (psImage{psImageAlloc} | tst_psImage.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psImage.c                                              *
+*            TestPoint: psImage{psImageCopy}                                       *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|I|testImageCopy
+    Image Copy Test for psU8
+<DATE><TIME>|<HOST>|I|testImageCopy
+    Image Copy Test for psU16
+<DATE><TIME>|<HOST>|I|testImageCopy
+    Image Copy Test for psU32
+<DATE><TIME>|<HOST>|I|testImageCopy
+    Image Copy Test for psS8
+<DATE><TIME>|<HOST>|I|testImageCopy
+    Image Copy Test for psS16
+<DATE><TIME>|<HOST>|I|testImageCopy
+    Image Copy Test for psS32
+<DATE><TIME>|<HOST>|I|testImageCopy
+    Image Copy Test for psF32
+<DATE><TIME>|<HOST>|I|testImageCopy
+    Image Copy Test for psF64
+<DATE><TIME>|<HOST>|I|testImageCopy
+    An error should follow...
+<DATE><TIME>|<HOST>|E|psImageCopy (FILE:LINENO)
+    Can not operate on a NULL psImage.
+
+---> TESTPOINT PASSED (psImage{psImageCopy} | tst_psImage.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psImage.c                                              *
+*            TestPoint: psImage{psRegionAlloc}                                     *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|E|psRegionFromString (FILE:LINENO)
+    Specified subsection string, '[1:2,3:]', can not be parsed.  Must be in the form '[x1:x2,y1:y2]'.
+
+---> TESTPOINT PASSED (psImage{psRegionAlloc} | tst_psImage.c)
+
Index: /tags/ipp-1-X/bug123/psLib/test/image/verified/tst_psImageConvolve.stderr
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/image/verified/tst_psImageConvolve.stderr	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/image/verified/tst_psImageConvolve.stderr	(revision 22331)
@@ -0,0 +1,42 @@
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psImageConvolve.c                                      *
+*            TestPoint: psImage{psKernelAlloc}                                     *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|I|testKernelAlloc
+    Following should be a warning (xMin > xMax)
+<DATE><TIME>|<HOST>|W|psKernelAlloc
+    Specified xMin, 5, was greater than xMax, -5.  Values swapped.
+<DATE><TIME>|<HOST>|I|testKernelAlloc
+    Following should be a warning (yMin > yMax)
+<DATE><TIME>|<HOST>|W|psKernelAlloc
+    Specified yMin, 5, was greater than yMax, -5.  Values swapped.
+
+---> TESTPOINT PASSED (psImage{psKernelAlloc} | tst_psImageConvolve.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psImageConvolve.c                                      *
+*            TestPoint: psImage{psKernelGenerate}                                  *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|I|testKernelGenerate
+    Following should be an error.
+<DATE><TIME>|<HOST>|E|psKernelGenerate (FILE:LINENO)
+    Shift vectors can not be of different sizes.
+<DATE><TIME>|<HOST>|I|testKernelGenerate
+    Following should be a error (time vector NULL).
+<DATE><TIME>|<HOST>|E|psKernelGenerate (FILE:LINENO)
+    Specified shift vectors can not be NULL.
+<DATE><TIME>|<HOST>|I|testKernelGenerate
+    Following should be a error (x vector NULL).
+<DATE><TIME>|<HOST>|E|psKernelGenerate (FILE:LINENO)
+    Specified shift vectors can not be NULL.
+<DATE><TIME>|<HOST>|I|testKernelGenerate
+    Following should be a error (y vector NULL).
+<DATE><TIME>|<HOST>|E|psKernelGenerate (FILE:LINENO)
+    Specified shift vectors can not be NULL.
+
+---> TESTPOINT PASSED (psImage{psKernelGenerate} | tst_psImageConvolve.c)
+
Index: /tags/ipp-1-X/bug123/psLib/test/image/verified/tst_psImageExtraction.stderr
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/image/verified/tst_psImageExtraction.stderr	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/image/verified/tst_psImageExtraction.stderr	(revision 22331)
@@ -0,0 +1,296 @@
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psImageExtraction.c                                    *
+*            TestPoint: psImage{psImageSubset}                                     *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|I|testImageSubset
+    Verify the returned psImage structure members nrow and ncol are equal to the input parameter nrow and ncol respectively.
+<DATE><TIME>|<HOST>|I|testImageSubset
+    Verify the returned psImage structure contains expected values in the row member, if the input psImage structure image contains known values.
+<DATE><TIME>|<HOST>|I|testImageSubset
+    Verify the returned psImage structure member type is equal to the input psImage structure member type.
+<DATE><TIME>|<HOST>|I|testImageSubset
+    Verify the returned psImage structure members row0 and col0 are equal to the input parameters row0 and col0 respectively.
+<DATE><TIME>|<HOST>|I|testImageSubset
+    Verify the returned psImage structure member parent is equal to the input psImage structure pointer image.
+<DATE><TIME>|<HOST>|I|testImageSubset
+    Verify the returned psImage structure member children is null.
+<DATE><TIME>|<HOST>|I|testImageSubset
+    Verify the input psImage structure image only has the following members changed: 1) Nchildren is increased by one. 2) parent contains pointer psImage structure out at parent[Nchildren-1].
+<DATE><TIME>|<HOST>|I|testImageSubset
+    Verify the returned psImage structure pointer is null and program execution doesn't stop, if the input parameter image is null. Also verified the input psImage structure is not modified.
+<DATE><TIME>|<HOST>|I|testImageSubset
+    An error should follow...
+<DATE><TIME>|<HOST>|E|imageSubset (FILE:LINENO)
+    Can not operate on a NULL psImage.
+<DATE><TIME>|<HOST>|I|testImageSubset
+    Verify the returned psImage structure pointer is null and program  execution doesn't stop, if the input parameters nrow and/or ncol are zero. Also verify input psImage structure is not modified.
+<DATE><TIME>|<HOST>|I|testImageSubset
+    An error should follow...
+<DATE><TIME>|<HOST>|E|imageSubset (FILE:LINENO)
+    Specified subset range, [0:63,128:127], is invalid or outside input psImage's boundaries, [0:127,0:255].
+<DATE><TIME>|<HOST>|I|testImageSubset
+    An error should follow...
+<DATE><TIME>|<HOST>|E|imageSubset (FILE:LINENO)
+    Specified subset range, [64:63,0:127], is invalid or outside input psImage's boundaries, [0:127,0:255].
+<DATE><TIME>|<HOST>|I|testImageSubset
+    Verify the returned psImage structure pointer is null and program execution doesn't stop, if the input parameters row0 and col0 are not within the range of values of psImage structure image.
+<DATE><TIME>|<HOST>|I|testImageSubset
+    An error should follow...
+<DATE><TIME>|<HOST>|E|imageSubset (FILE:LINENO)
+    Specified subset range, [0:63,0:511], is invalid or outside input psImage's boundaries, [0:127,0:255].
+<DATE><TIME>|<HOST>|I|testImageSubset
+    An error should follow...
+<DATE><TIME>|<HOST>|E|imageSubset (FILE:LINENO)
+    Specified subset range, [0:255,0:127], is invalid or outside input psImage's boundaries, [0:127,0:255].
+<DATE><TIME>|<HOST>|I|testImageSubset
+    An error should follow...
+<DATE><TIME>|<HOST>|E|imageSubset (FILE:LINENO)
+    Specified subset range, [-1:63,0:127], is invalid or outside input psImage's boundaries, [0:127,0:255].
+<DATE><TIME>|<HOST>|I|testImageSubset
+    An error should follow...
+<DATE><TIME>|<HOST>|E|imageSubset (FILE:LINENO)
+    Specified subset range, [0:63,-1:127], is invalid or outside input psImage's boundaries, [0:127,0:255].
+<DATE><TIME>|<HOST>|I|testImageSubset
+    Verify the returned psImage structure pointer is null and program execution doesn't stop if the input parameters nrow, ncol, row0 and col0 specify a range of data not within the input psImage structure image.  Also verify the input psImage structure is not modified.
+<DATE><TIME>|<HOST>|I|testImageSubset
+    An error should follow...
+<DATE><TIME>|<HOST>|E|imageSubset (FILE:LINENO)
+    Specified subset range, [0:63,0:256], is invalid or outside input psImage's boundaries, [0:127,0:255].
+<DATE><TIME>|<HOST>|I|testImageSubset
+    An error should follow...
+<DATE><TIME>|<HOST>|E|imageSubset (FILE:LINENO)
+    Specified subset range, [0:128,0:127], is invalid or outside input psImage's boundaries, [0:127,0:255].
+<DATE><TIME>|<HOST>|I|testImageSubset
+    An error should follow...
+<DATE><TIME>|<HOST>|E|imageSubset (FILE:LINENO)
+    Specified subset range, [0:128,0:256], is invalid or outside input psImage's boundaries, [0:127,0:255].
+<DATE><TIME>|<HOST>|I|testImageSubset
+    psImageFreeChildren shall deallocate any children images of a psImage structure
+
+---> TESTPOINT PASSED (psImage{psImageSubset} | tst_psImageExtraction.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psImageExtraction.c                                    *
+*            TestPoint: psImage{psImageSubsection}                                 *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|I|testImageSubsection
+    Testing subsection [0:32,0:32].
+<DATE><TIME>|<HOST>|I|testImageSubsection
+    Testing subsection [32:64,32:64].
+<DATE><TIME>|<HOST>|I|testImageSubsection
+    Testing subsection [64:127,32:64].
+<DATE><TIME>|<HOST>|I|testImageSubsection
+    Testing subsection [32:64,128:255].
+<DATE><TIME>|<HOST>|I|testImageSubsection
+    An error should follow (x1>x2)
+<DATE><TIME>|<HOST>|E|psImageSubsection (FILE:LINENO)
+    Specified subset range, [64:32,32:64], is invalid.  Ranges must be incremental.
+<DATE><TIME>|<HOST>|I|testImageSubsection
+    An error should follow (y1>y2)
+<DATE><TIME>|<HOST>|E|psImageSubsection (FILE:LINENO)
+    Specified subset range, [32:64,64:32], is invalid.  Ranges must be incremental.
+<DATE><TIME>|<HOST>|I|testImageSubsection
+    An error should follow (x2>nCols)
+<DATE><TIME>|<HOST>|E|imageSubset (FILE:LINENO)
+    Specified subset range, [64:256,32:64], is invalid or outside input psImage's boundaries, [0:127,0:255].
+<DATE><TIME>|<HOST>|I|testImageSubsection
+    An error should follow (y2>=nRows)
+<DATE><TIME>|<HOST>|E|imageSubset (FILE:LINENO)
+    Specified subset range, [32:64,64:256], is invalid or outside input psImage's boundaries, [0:127,0:255].
+<DATE><TIME>|<HOST>|I|testImageSubsection
+    An error should follow (malformed string - no brackets)
+<DATE><TIME>|<HOST>|E|psImageSubsection (FILE:LINENO)
+    Specified subsection string, '32:64,32:64', can not be parsed.  Must be in the form '[x1:x2,y1:y2]'.
+<DATE><TIME>|<HOST>|I|testImageSubsection
+    An error should follow (malformed string - no colons)
+<DATE><TIME>|<HOST>|E|psImageSubsection (FILE:LINENO)
+    Specified subsection string, '[32-64,32-64]', can not be parsed.  Must be in the form '[x1:x2,y1:y2]'.
+<DATE><TIME>|<HOST>|I|testImageSubsection
+    An error should follow (malformed string - not four numbers)
+<DATE><TIME>|<HOST>|E|psImageSubsection (FILE:LINENO)
+    Specified subsection string, '[32:64,32]', can not be parsed.  Must be in the form '[x1:x2,y1:y2]'.
+<DATE><TIME>|<HOST>|I|testImageSubsection
+    An error should follow (image is NULL)
+<DATE><TIME>|<HOST>|E|imageSubset (FILE:LINENO)
+    Can not operate on a NULL psImage.
+<DATE><TIME>|<HOST>|I|testImageSubsection
+    An error should follow (subsection string is NULL)
+<DATE><TIME>|<HOST>|E|psImageSubsection (FILE:LINENO)
+    Specified subsection string can not be NULL.
+
+---> TESTPOINT PASSED (psImage{psImageSubsection} | tst_psImageExtraction.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psImageExtraction.c                                    *
+*            TestPoint: psImage{psImageSlice}                                      *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|I|testImageSlice
+    Following should be an error.
+<DATE><TIME>|<HOST>|E|psImageSlice (FILE:LINENO)
+    Can not operate on a NULL psImage.
+<DATE><TIME>|<HOST>|I|testImageSlice
+    Following should be an error.
+<DATE><TIME>|<HOST>|E|psImageSlice (FILE:LINENO)
+    Specified statistic can not be NULL.
+<DATE><TIME>|<HOST>|I|testImageSlice
+    Following should be an error.
+<DATE><TIME>|<HOST>|E|psImageSlice (FILE:LINENO)
+    Specified slice direction, 5, is invalid.
+<DATE><TIME>|<HOST>|I|testImageSlice
+    Following should be an error.
+<DATE><TIME>|<HOST>|E|psImageSlice (FILE:LINENO)
+    Specified subset range, [30:30,20:20], is invalid or outside input psImage's boundaries, [0:300,0:200].
+<DATE><TIME>|<HOST>|I|testImageSlice
+    Following should be an error.
+<DATE><TIME>|<HOST>|E|psImageSlice (FILE:LINENO)
+    Specified subset range, [301:302,20:30], is invalid or outside input psImage's boundaries, [0:300,0:200].
+<DATE><TIME>|<HOST>|I|testImageSlice
+    Following should be an error.
+<DATE><TIME>|<HOST>|E|psImageSlice (FILE:LINENO)
+    Specified subset range, [30:31,201:205], is invalid or outside input psImage's boundaries, [0:300,0:200].
+<DATE><TIME>|<HOST>|I|testImageSlice
+    Following should be an error.
+<DATE><TIME>|<HOST>|E|psImageSlice (FILE:LINENO)
+    Specified subset range, [30:301,20:21], is invalid or outside input psImage's boundaries, [0:300,0:200].
+<DATE><TIME>|<HOST>|I|testImageSlice
+    Following should be an error.
+<DATE><TIME>|<HOST>|E|psImageSlice (FILE:LINENO)
+    Specified subset range, [30:31,20:201], is invalid or outside input psImage's boundaries, [0:300,0:200].
+<DATE><TIME>|<HOST>|I|testImageSlice
+    Following should be an error.
+<DATE><TIME>|<HOST>|E|psImageSlice (FILE:LINENO)
+    Specified statistic option, 0, is not valid.  Must specify one and only one statistic type.
+<DATE><TIME>|<HOST>|I|testImageSlice
+    Following should be an error mask size != image size.
+<DATE><TIME>|<HOST>|E|psImageSlice (FILE:LINENO)
+    Input psImage mask size, 200x300, does not match psImage input size, 300x200.
+<DATE><TIME>|<HOST>|I|testImageSlice
+    Following should be an error invalid mask type.
+<DATE><TIME>|<HOST>|E|psImageSlice (FILE:LINENO)
+    Input psImage mask type, psS8, is not the supported mask datatype of psU8.
+
+---> TESTPOINT PASSED (psImage{psImageSlice} | tst_psImageExtraction.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psImageExtraction.c                                    *
+*            TestPoint: psImage{psImageTrim}                                       *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|E|psImageTrim (FILE:LINENO)
+    Can not operate on a NULL psImage.
+<DATE><TIME>|<HOST>|E|psImageTrim (FILE:LINENO)
+    Specified subset range, [-1:299,0:199], is invalid or outside input psImage's boundaries, [0:299,0:199].
+<DATE><TIME>|<HOST>|E|psImageTrim (FILE:LINENO)
+    Specified subset range, [0:299,-1:199], is invalid or outside input psImage's boundaries, [0:299,0:199].
+<DATE><TIME>|<HOST>|E|psImageTrim (FILE:LINENO)
+    Specified subset range, [0:300,0:199], is invalid or outside input psImage's boundaries, [0:299,0:199].
+<DATE><TIME>|<HOST>|E|psImageTrim (FILE:LINENO)
+    Specified subset range, [0:299,0:200], is invalid or outside input psImage's boundaries, [0:299,0:199].
+<DATE><TIME>|<HOST>|E|psImageTrim (FILE:LINENO)
+    Specified subset range, [0:-1,0:199], is invalid or outside input psImage's boundaries, [0:299,0:199].
+<DATE><TIME>|<HOST>|E|psImageTrim (FILE:LINENO)
+    Specified subset range, [0:299,0:-1], is invalid or outside input psImage's boundaries, [0:299,0:199].
+
+---> TESTPOINT PASSED (psImage{psImageTrim} | tst_psImageExtraction.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psImageExtraction.c                                    *
+*            TestPoint: psImage{psImageCut}                                        *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|I|testImageCut
+    The following should be an error.
+<DATE><TIME>|<HOST>|E|psImageCut (FILE:LINENO)
+    Specified line, (-1.000000,10.000000)->(240.000000,180.000000), does not entirely lie in psImage's boundaries, [0:299,0:199].
+<DATE><TIME>|<HOST>|I|testImageCut
+    The following should be an error.
+<DATE><TIME>|<HOST>|E|psImageCut (FILE:LINENO)
+    Specified line, (300.000000,10.000000)->(240.000000,180.000000), does not entirely lie in psImage's boundaries, [0:299,0:199].
+<DATE><TIME>|<HOST>|I|testImageCut
+    The following should be an error.
+<DATE><TIME>|<HOST>|E|psImageCut (FILE:LINENO)
+    Specified line, (20.000000,10.000000)->(-1.000000,180.000000), does not entirely lie in psImage's boundaries, [0:299,0:199].
+<DATE><TIME>|<HOST>|I|testImageCut
+    The following should be an error.
+<DATE><TIME>|<HOST>|E|psImageCut (FILE:LINENO)
+    Specified line, (20.000000,10.000000)->(300.000000,180.000000), does not entirely lie in psImage's boundaries, [0:299,0:199].
+<DATE><TIME>|<HOST>|I|testImageCut
+    The following should be an error.
+<DATE><TIME>|<HOST>|E|psImageCut (FILE:LINENO)
+    Specified line, (20.000000,-1.000000)->(240.000000,180.000000), does not entirely lie in psImage's boundaries, [0:299,0:199].
+<DATE><TIME>|<HOST>|I|testImageCut
+    The following should be an error.
+<DATE><TIME>|<HOST>|E|psImageCut (FILE:LINENO)
+    Specified line, (20.000000,200.000000)->(240.000000,180.000000), does not entirely lie in psImage's boundaries, [0:299,0:199].
+<DATE><TIME>|<HOST>|I|testImageCut
+    The following should be an error.
+<DATE><TIME>|<HOST>|E|psImageCut (FILE:LINENO)
+    Specified line, (20.000000,10.000000)->(240.000000,-1.000000), does not entirely lie in psImage's boundaries, [0:299,0:199].
+<DATE><TIME>|<HOST>|I|testImageCut
+    The following should be an error.
+<DATE><TIME>|<HOST>|E|psImageCut (FILE:LINENO)
+    Specified line, (20.000000,10.000000)->(240.000000,200.000000), does not entirely lie in psImage's boundaries, [0:299,0:199].
+<DATE><TIME>|<HOST>|I|testImageCut
+    Following should be an error (NULL image).
+<DATE><TIME>|<HOST>|E|psImageCut (FILE:LINENO)
+    Can not operate on a NULL psImage.
+<DATE><TIME>|<HOST>|I|testImageCut
+    Following should be an error (length=0).
+<DATE><TIME>|<HOST>|E|psImageCut (FILE:LINENO)
+    Specified number of samples, 0, must be greater than 1 to make a line.
+
+---> TESTPOINT PASSED (psImage{psImageCut} | tst_psImageExtraction.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psImageExtraction.c                                    *
+*            TestPoint: psImage{psImageRadialCut}                                  *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|I|testImageRadialCut
+    Following should be an error.
+<DATE><TIME>|<HOST>|E|psImageRadialCut (FILE:LINENO)
+    Can not operate on a NULL psImage.
+<DATE><TIME>|<HOST>|I|testImageRadialCut
+    Following should be an error.
+<DATE><TIME>|<HOST>|E|psImageRadialCut (FILE:LINENO)
+    Specified radii vector can not be NULL.
+<DATE><TIME>|<HOST>|I|testImageRadialCut
+    Following should be an error.
+<DATE><TIME>|<HOST>|E|psImageRadialCut (FILE:LINENO)
+    Specified statistic can not be NULL.
+<DATE><TIME>|<HOST>|I|testImageRadialCut
+    Following should be an error.
+<DATE><TIME>|<HOST>|E|psImageRadialCut (FILE:LINENO)
+    Specified center, (301,100), is outside of the psImage boundaries, [0:299,0:199].
+<DATE><TIME>|<HOST>|I|testImageRadialCut
+    Following should be an error.
+<DATE><TIME>|<HOST>|E|psImageRadialCut (FILE:LINENO)
+    Specified center, (150,201), is outside of the psImage boundaries, [0:299,0:199].
+<DATE><TIME>|<HOST>|I|testImageRadialCut
+    Following should be an error.
+<DATE><TIME>|<HOST>|E|psImageRadialCut (FILE:LINENO)
+    Input psImage mask type, psF32, is not the supported mask datatype of psU8.
+<DATE><TIME>|<HOST>|I|testImageRadialCut
+    Following should be an error.
+<DATE><TIME>|<HOST>|E|psImageRadialCut (FILE:LINENO)
+    Input psImage mask size, 150x100, does not match psImage input size, 300x200.
+<DATE><TIME>|<HOST>|I|testImageRadialCut
+    Following should be an error.
+<DATE><TIME>|<HOST>|E|psImageRadialCut (FILE:LINENO)
+    Input radii vector size, 1, can not be less than 2.
+<DATE><TIME>|<HOST>|I|testImageRadialCut
+    Following should be an error.
+<DATE><TIME>|<HOST>|E|psImageRadialCut (FILE:LINENO)
+    Specified statistic option, 0, is not valid.  Must specify one and only one statistic type.
+
+---> TESTPOINT PASSED (psImage{psImageRadialCut} | tst_psImageExtraction.c)
+
Index: /tags/ipp-1-X/bug123/psLib/test/image/verified/tst_psImageFFT.stderr
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/image/verified/tst_psImageFFT.stderr	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/image/verified/tst_psImageFFT.stderr	(revision 22331)
@@ -0,0 +1,73 @@
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psImageFFT.c                                           *
+*            TestPoint: psFFT{psImageFFT}                                          *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|I|testImageFFT
+    Following should be an error.
+<DATE><TIME>|<HOST>|E|psImageFFT (FILE:LINENO)
+    Can not specify both PS_FFT_FORWARD and PS_FFT_REVERSE options.
+<DATE><TIME>|<HOST>|I|testImageFFT
+    Following should be an error.
+<DATE><TIME>|<HOST>|E|psImageFFT (FILE:LINENO)
+    The PS_FFT_FORWARD and PS_FFT_REAL_RESULT combinition is not supported.
+<DATE><TIME>|<HOST>|I|testImageFFT
+    Following should generate error for invalid direction.
+<DATE><TIME>|<HOST>|E|psImageFFT (FILE:LINENO)
+    Must specify either PS_FFT_FORWARD or PS_FFT_REVERSE option.
+
+---> TESTPOINT PASSED (psFFT{psImageFFT} | tst_psImageFFT.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psImageFFT.c                                           *
+*            TestPoint: psFFT{psImageRealImaginary}                                *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psFFT{psImageRealImaginary} | tst_psImageFFT.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psImageFFT.c                                           *
+*            TestPoint: psFFT{psImageComplex}                                      *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|I|testImageComplex
+    Following should be an error (type mismatch).
+<DATE><TIME>|<HOST>|E|psImageComplex (FILE:LINENO)
+    Real psImage type (psF32) and imaginary psImage type (psF64) must be the same.
+<DATE><TIME>|<HOST>|I|testImageComplex
+    Following should be an error (size mismatch).
+<DATE><TIME>|<HOST>|E|psImageComplex (FILE:LINENO)
+    Real psImage size (128x64) and imaginary psImage size (64x64) must be the same.
+<DATE><TIME>|<HOST>|I|testImageComplex
+    Following should generate an error message.
+<DATE><TIME>|<HOST>|E|psImageComplex (FILE:LINENO)
+    Input psImage type, psS16, is required to be either psF32 or psF64.
+
+---> TESTPOINT PASSED (psFFT{psImageComplex} | tst_psImageFFT.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psImageFFT.c                                           *
+*            TestPoint: psFFT{psImageConjugate}                                    *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psFFT{psImageConjugate} | tst_psImageFFT.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psImageFFT.c                                           *
+*            TestPoint: psFFT{psImagePowerSpectrum}                                *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|I|testImagePowerSpectrum
+    Following should generate error message.
+<DATE><TIME>|<HOST>|E|psImagePowerSpectrum (FILE:LINENO)
+    Input psImage type, psF32, is required to be either psC32 or psC64.
+
+---> TESTPOINT PASSED (psFFT{psImagePowerSpectrum} | tst_psImageFFT.c)
+
Index: /tags/ipp-1-X/bug123/psLib/test/image/verified/tst_psImageIO.stderr
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/image/verified/tst_psImageIO.stderr	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/image/verified/tst_psImageIO.stderr	(revision 22331)
@@ -0,0 +1,404 @@
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psImageIO.c                                            *
+*            TestPoint: psImage{psImageReadSection}                                *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|I|testImageRead
+    Following should be an error as file doesn't exist.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|E|psImageReadSection (FILE:LINENO)
+    Could not open file,'foobar.fits'.
+    CFITSIO Error: could not open the named file
+<DATE><TIME>|<HOST>|I|testImageRead
+    Following should be an error as filename is NULL.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|E|psImageReadSection (FILE:LINENO)
+    Specified filename can not be NULL.
+<DATE><TIME>|<HOST>|I|testImageRead
+    Following should be an error as extnum is invalid.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|E|psImageReadSection (FILE:LINENO)
+    Could not find HDU #4 in file tmpImages/MxN_F32.fits.
+    CFITSIO Error: tried to move past end of file
+<DATE><TIME>|<HOST>|I|testImageRead
+    Following should be an error as extname is invalid.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|E|psImageReadSection (FILE:LINENO)
+    Could not find HDU with extension name 'bogus' in file tmpImages/MxN_F32.fits.
+    CFITSIO Error: illegal HDU number
+
+---> TESTPOINT PASSED (psImage{psImageReadSection} | tst_psImageIO.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psImageIO.c                                            *
+*            TestPoint: psImage{psImageWriteSection}                               *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|I|testImageWrite
+    Following should generate an error message because input image is null.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|E|psImageWriteSection (FILE:LINENO)
+    Can not operate on a NULL psImage.
+<DATE><TIME>|<HOST>|I|testImageWrite
+    Following should be an error for passing invalid image type.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|E|psImageWriteSection (FILE:LINENO)
+    Could not create file,'panstarrs/writeFits.fits'.
+    CFITSIO Error: couldn't create the named file
+<DATE><TIME>|<HOST>|I|testImageWrite
+    Following should be an error for passing invalid FITS file.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|E|psImageWriteSection (FILE:LINENO)
+    Could not open file,'tmpImages/writeInvalidFile.fits'.
+    CFITSIO Error: tried to move past end of file
+<DATE><TIME>|<HOST>|I|testImageWrite
+    Following should be an error for invalid extension name.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|E|psImageWriteSection (FILE:LINENO)
+    Could not find HDU with extension name 'ext2' in file tmpImages/writeTest.fits.
+    CFITSIO Error: illegal HDU number
+<DATE><TIME>|<HOST>|I|testImageWrite
+    Following should be an error for invalid extension number.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|E|psImageWriteSection (FILE:LINENO)
+    Specified extension number, 99, must not exceed number of HDUs, 1, by more than one.
+
+---> TESTPOINT PASSED (psImage{psImageWriteSection} | tst_psImageIO.c)
+
Index: /tags/ipp-1-X/bug123/psLib/test/image/verified/tst_psImageInterpolate.stderr
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/image/verified/tst_psImageInterpolate.stderr	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/image/verified/tst_psImageInterpolate.stderr	(revision 22331)
@@ -0,0 +1,48 @@
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psImageInterpolate.c                                   *
+*            TestPoint: psImagePixelInterpolate{psImagePixelInterpolate}           *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psImagePixelInterpolate{psImagePixelInterpolate} | tst_psImageInterpolate.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psImageInterpolate.c                                   *
+*            TestPoint: psImagePixelInterpolate{psImagePixelInterpolate}           *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|I|testInterpolateError
+    Following should generate an error message
+<DATE><TIME>|<HOST>|E|psImagePixelInterpolate (FILE:LINENO)
+    Can not operate on a NULL psImage.
+<DATE><TIME>|<HOST>|I|testInterpolateError
+    Following should generate an error message
+<DATE><TIME>|<HOST>|E|psImagePixelInterpolate (FILE:LINENO)
+    Specified psImage type, psBool, is not supported.
+<DATE><TIME>|<HOST>|I|testInterpolateError
+    Following should generate an error message
+<DATE><TIME>|<HOST>|E|psImagePixelInterpolate (FILE:LINENO)
+    Specified psImage type, psBool, is not supported.
+
+---> TESTPOINT PASSED (psImagePixelInterpolate{psImagePixelInterpolate} | tst_psImageInterpolate.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psImageInterpolate.c                                   *
+*            TestPoint: psImagePixelInterpolate{psImagePixelInterpolate}           *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psImagePixelInterpolate{psImagePixelInterpolate} | tst_psImageInterpolate.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psImageInterpolate.c                                   *
+*            TestPoint: psImagePixelInterpolate{psImagePixelInterpolate}           *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psImagePixelInterpolate{psImagePixelInterpolate} | tst_psImageInterpolate.c)
+
Index: /tags/ipp-1-X/bug123/psLib/test/image/verified/tst_psImageManip.stderr
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/image/verified/tst_psImageManip.stderr	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/image/verified/tst_psImageManip.stderr	(revision 22331)
@@ -0,0 +1,429 @@
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psImageManip.c                                         *
+*            TestPoint: psImage{psImageClip}                                       *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|I|testImageClip
+    psImageClip shall limit the minimum and maximum data value within a psImage structure
+<DATE><TIME>|<HOST>|I|testImageClip
+    Testing clipping of F64 imagery
+<DATE><TIME>|<HOST>|I|testImageClip
+    Testing clipping of F32 imagery
+<DATE><TIME>|<HOST>|I|testImageClip
+    Testing clipping of S32 imagery
+<DATE><TIME>|<HOST>|I|testImageClip
+    Testing clipping of S16 imagery
+<DATE><TIME>|<HOST>|I|testImageClip
+    Testing clipping of S8 imagery
+<DATE><TIME>|<HOST>|I|testImageClip
+    Testing clipping of U16 imagery
+<DATE><TIME>|<HOST>|I|testImageClip
+    Testing clipping of U8 imagery
+<DATE><TIME>|<HOST>|I|testImageClip
+    Testing clipping of C32 imagery
+<DATE><TIME>|<HOST>|I|testImageClip
+    Testing clipping of C64 imagery
+<DATE><TIME>|<HOST>|I|testImageClip
+    Following should be an error (max<min)
+<DATE><TIME>|<HOST>|E|psImageClip (FILE:LINENO)
+    Specified min value, 256, can not be greater than the specified max value, 128.
+
+---> TESTPOINT PASSED (psImage{psImageClip} | tst_psImageManip.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psImageManip.c                                         *
+*            TestPoint: psImage{psImageClipNAN}                                    *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|I|testImageClipNAN
+    psImageClipNaN shall modified pixel values of NaN with a specified value
+<DATE><TIME>|<HOST>|I|testImageClipNAN
+    Following should be an error (invalid type)
+<DATE><TIME>|<HOST>|E|psImageClipNaN (FILE:LINENO)
+    Specified psImage type, psS32, is not supported.
+
+---> TESTPOINT PASSED (psImage{psImageClipNAN} | tst_psImageManip.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psImageManip.c                                         *
+*            TestPoint: psImage{psImageClipComplexRegion}                          *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|I|testImageClipComplexRegion
+    psImageClipNaN shall modified pixel values of NaN with a specified value
+<DATE><TIME>|<HOST>|I|testImageClipComplexRegion
+    Testing clipping at 409.6+256i to 682.667+512i for psC32
+<DATE><TIME>|<HOST>|I|testImageClipComplexRegion
+    Testing clipping at 409.6+256i to 682.667+512i for psC64
+<DATE><TIME>|<HOST>|I|testImageClipComplexRegion
+    Following should be an error:
+<DATE><TIME>|<HOST>|E|psImageClipComplexRegion (FILE:LINENO)
+    Can not operate on a NULL psImage.
+<DATE><TIME>|<HOST>|I|testImageClipComplexRegion
+    Following should be an error:
+<DATE><TIME>|<HOST>|E|psImageClipComplexRegion (FILE:LINENO)
+    Specified real-portion of min value, 10, can not be greater than the real-portion of max value, 5.
+<DATE><TIME>|<HOST>|I|testImageClipComplexRegion
+    Following should be an error:
+<DATE><TIME>|<HOST>|E|psImageClipComplexRegion (FILE:LINENO)
+    Specified imaginary-portion of min value, 10, can not be greater than the imaginary-portion of max value, 5.
+<DATE><TIME>|<HOST>|I|testImageClipComplexRegion
+    Following should be an error:
+<DATE><TIME>|<HOST>|E|psImageClipComplexRegion (FILE:LINENO)
+    Specified real-portion of min value, 10, can not be greater than the real-portion of max value, 5.
+<DATE><TIME>|<HOST>|I|testImageClipComplexRegion
+    Following should be an error:
+<DATE><TIME>|<HOST>|E|psImageClipComplexRegion (FILE:LINENO)
+    Specified vmin value, -6.80565e+38+0i, is not the the range of input psImage's valid pixel values (psC32), i.e. [-3.40282e+38:3.40282e+38].
+<DATE><TIME>|<HOST>|I|testImageClipComplexRegion
+    Following should be an error:
+<DATE><TIME>|<HOST>|E|psImageClipComplexRegion (FILE:LINENO)
+    Specified vmin value, 6.80565e+38+0i, is not the the range of input psImage's valid pixel values (psC32), i.e. [-3.40282e+38:3.40282e+38].
+<DATE><TIME>|<HOST>|I|testImageClipComplexRegion
+    Following should be an error:
+<DATE><TIME>|<HOST>|E|psImageClipComplexRegion (FILE:LINENO)
+    Specified vmin value, -0-6.80565e+38i, is not the the range of input psImage's valid pixel values (psC32), i.e. [-3.40282e+38:3.40282e+38].
+<DATE><TIME>|<HOST>|I|testImageClipComplexRegion
+    Following should be an error:
+<DATE><TIME>|<HOST>|E|psImageClipComplexRegion (FILE:LINENO)
+    Specified vmin value, 0+6.80565e+38i, is not the the range of input psImage's valid pixel values (psC32), i.e. [-3.40282e+38:3.40282e+38].
+<DATE><TIME>|<HOST>|I|testImageClipComplexRegion
+    Following should be an error:
+<DATE><TIME>|<HOST>|E|psImageClipComplexRegion (FILE:LINENO)
+    Specified vmax value, -6.80565e+38+0i, is not the the range of input psImage's valid pixel values (psC32), i.e. [-3.40282e+38:3.40282e+38].
+<DATE><TIME>|<HOST>|I|testImageClipComplexRegion
+    Following should be an error:
+<DATE><TIME>|<HOST>|E|psImageClipComplexRegion (FILE:LINENO)
+    Specified vmax value, 6.80565e+38+0i, is not the the range of input psImage's valid pixel values (psC32), i.e. [-3.40282e+38:3.40282e+38].
+<DATE><TIME>|<HOST>|I|testImageClipComplexRegion
+    Following should be an error:
+<DATE><TIME>|<HOST>|E|psImageClipComplexRegion (FILE:LINENO)
+    Specified vmax value, -0-6.80565e+38i, is not the the range of input psImage's valid pixel values (psC32), i.e. [-3.40282e+38:3.40282e+38].
+<DATE><TIME>|<HOST>|I|testImageClipComplexRegion
+    Following should be an error:
+<DATE><TIME>|<HOST>|E|psImageClipComplexRegion (FILE:LINENO)
+    Specified vmax value, 0+6.80565e+38i, is not the the range of input psImage's valid pixel values (psC32), i.e. [-3.40282e+38:3.40282e+38].
+<DATE><TIME>|<HOST>|I|testImageClipComplexRegion
+    Following should be an error (invalid type)
+<DATE><TIME>|<HOST>|E|psImageClipComplexRegion (FILE:LINENO)
+    Specified psImage type, psS32, is not supported.
+
+---> TESTPOINT PASSED (psImage{psImageClipComplexRegion} | tst_psImageManip.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psImageManip.c                                         *
+*            TestPoint: psImage{psImageOverlay}                                    *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|I|testImageOverlay
+    Following should error as overlay isn't within image boundaries
+<DATE><TIME>|<HOST>|E|psImageOverlaySection (FILE:LINENO)
+    Specified subset range, [32:160,64:320], is invalid or outside input psImage's boundaries, [0:128,0:256].
+<DATE><TIME>|<HOST>|I|testImageOverlay
+    Following should error as overlay is NULL
+<DATE><TIME>|<HOST>|E|psImageOverlaySection (FILE:LINENO)
+    Can not operate on a NULL psImage.
+<DATE><TIME>|<HOST>|I|testImageOverlay
+    Following should error as image input is NULL
+<DATE><TIME>|<HOST>|E|psImageOverlaySection (FILE:LINENO)
+    Can not operate on a NULL psImage.
+<DATE><TIME>|<HOST>|I|testImageOverlay
+    Following should error as operator is invalid
+<DATE><TIME>|<HOST>|E|psImageOverlaySection (FILE:LINENO)
+    Specified operation, '$', is not supported.
+<DATE><TIME>|<HOST>|I|testImageOverlay
+    Following should error as operator is invalid
+<DATE><TIME>|<HOST>|E|psImageOverlaySection (FILE:LINENO)
+    Operation can not be NULL.
+<DATE><TIME>|<HOST>|I|testImageOverlay
+    Following should error as overlay is a different type
+<DATE><TIME>|<HOST>|E|psImageOverlaySection (FILE:LINENO)
+    Input overlay psImage type, psS64, must match input psImage type, psF32.
+
+---> TESTPOINT PASSED (psImage{psImageOverlay} | tst_psImageManip.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psImageManip.c                                         *
+*            TestPoint: psImage{psImageRebin}                                      *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|I|testImageRebin
+    Following should be an error for unsupported type.
+<DATE><TIME>|<HOST>|E|psImageRebin (FILE:LINENO)
+    Specified psImage type, psU8, is not supported.
+<DATE><TIME>|<HOST>|I|testImageRebin
+    Following should be an error for invallid mask type.
+<DATE><TIME>|<HOST>|E|psImageRebin (FILE:LINENO)
+    Input psImage mask type, psF32, is not the supported mask datatype of psU8.
+<DATE><TIME>|<HOST>|E|psImageRebin (FILE:LINENO)
+    Can not operate on a NULL psImage.
+<DATE><TIME>|<HOST>|I|testImageRebin
+    Following should be an error for scale < 0.
+<DATE><TIME>|<HOST>|E|psImageRebin (FILE:LINENO)
+    Specified scale value, 0, must be a positive value.
+<DATE><TIME>|<HOST>|I|testImageRebin
+    Following should be an error for stats null.
+<DATE><TIME>|<HOST>|E|psImageRebin (FILE:LINENO)
+    Specified statistic can not be NULL.
+<DATE><TIME>|<HOST>|I|testImageRebin
+    Following should be an error for stats options 0.
+<DATE><TIME>|<HOST>|E|psImageRebin (FILE:LINENO)
+    Specified statistic option, 0, is not valid.  Must specify one and only one statistic type.
+<DATE><TIME>|<HOST>|I|testImageRebin
+    Following should be an error for stat options use range.
+<DATE><TIME>|<HOST>|E|psImageRebin (FILE:LINENO)
+    Specified statistic option, 8192, is not valid.  Must specify one and only one statistic type.
+<DATE><TIME>|<HOST>|I|testImageRebin
+    Following should be an error for stats with multiple options.
+<DATE><TIME>|<HOST>|E|psImageRebin (FILE:LINENO)
+    Specified statistic option, 2049, is not valid.  Must specify one and only one statistic type.
+
+---> TESTPOINT PASSED (psImage{psImageRebin} | tst_psImageManip.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psImageManip.c                                         *
+*            TestPoint: psImage{psImageRoll}                                       *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|I|testImageRoll
+    Following should generate an error.
+<DATE><TIME>|<HOST>|E|psImageRoll (FILE:LINENO)
+    Can not operate on a NULL psImage.
+
+---> TESTPOINT PASSED (psImage{psImageRoll} | tst_psImageManip.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psImageManip.c                                         *
+*            TestPoint: psImage{psImageRotate}                                     *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageWriteSection
+    psImageWriteSection is deprecated.  Consider using psFitsWriteImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|W|psImageReadSection
+    psImageReadSection is deprecated.  Consider using psFitsReadImage instead.
+<DATE><TIME>|<HOST>|I|testImageRotate
+    Following should be an error
+<DATE><TIME>|<HOST>|E|psImageRotate (FILE:LINENO)
+    Can not operate on a NULL psImage.
+<DATE><TIME>|<HOST>|I|testImageRotate
+    Following should be an error for invalid interpolation type.
+<DATE><TIME>|<HOST>|E|psImageRotate (FILE:LINENO)
+    Specified interpolation mode, -1, is unsupported.
+
+---> TESTPOINT PASSED (psImage{psImageRotate} | tst_psImageManip.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psImageManip.c                                         *
+*            TestPoint: psImage{psImageShift}                                      *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|I|testImageShiftCase
+    Testing psImageShift with a 64x128 image for a shift of 0,0.
+<DATE><TIME>|<HOST>|I|testImageShiftCase
+    Testing psImageShift with a 64x128 image for a shift of 0,16.
+<DATE><TIME>|<HOST>|I|testImageShiftCase
+    Testing psImageShift with a 64x128 image for a shift of 0,-16.
+<DATE><TIME>|<HOST>|I|testImageShiftCase
+    Testing psImageShift with a 64x128 image for a shift of 32,0.
+<DATE><TIME>|<HOST>|I|testImageShiftCase
+    Testing psImageShift with a 64x128 image for a shift of -32,0.
+<DATE><TIME>|<HOST>|I|testImageShiftCase
+    Testing psImageShift with a 64x128 image for a shift of 32,16.
+<DATE><TIME>|<HOST>|I|testImageShiftCase
+    Testing psImageShift with a 64x128 image for a shift of 32,-16.
+<DATE><TIME>|<HOST>|I|testImageShiftCase
+    Testing psImageShift with a 64x128 image for a shift of -32,16.
+<DATE><TIME>|<HOST>|I|testImageShiftCase
+    Testing psImageShift with a 64x128 image for a shift of -32,-16.
+<DATE><TIME>|<HOST>|I|testImageShiftCase
+    Testing psImageShift with a 64x128 image for a shift of 0,16.4.
+<DATE><TIME>|<HOST>|I|testImageShiftCase
+    Testing psImageShift with a 64x128 image for a shift of 0,-16.4.
+<DATE><TIME>|<HOST>|I|testImageShiftCase
+    Testing psImageShift with a 64x128 image for a shift of 32.7,0.
+<DATE><TIME>|<HOST>|I|testImageShiftCase
+    Testing psImageShift with a 64x128 image for a shift of -32.7,0.
+<DATE><TIME>|<HOST>|I|testImageShiftCase
+    Testing psImageShift with a 64x128 image for a shift of 32.6,16.2.
+<DATE><TIME>|<HOST>|I|testImageShiftCase
+    Testing psImageShift with a 64x128 image for a shift of 32.6,-16.2.
+<DATE><TIME>|<HOST>|I|testImageShiftCase
+    Testing psImageShift with a 64x128 image for a shift of -32.6,16.2.
+<DATE><TIME>|<HOST>|I|testImageShiftCase
+    Testing psImageShift with a 64x128 image for a shift of -32.6,-16.2.
+<DATE><TIME>|<HOST>|I|testImageShift
+    Following should be an error...
+<DATE><TIME>|<HOST>|E|psImageShift (FILE:LINENO)
+    Can not operate on a NULL psImage.
+<DATE><TIME>|<HOST>|I|testImageShift
+    Following should be an error for invalid interpolation mode.
+<DATE><TIME>|<HOST>|E|psImageShift (FILE:LINENO)
+    Specified interpolation mode, -1, is unsupported.
+
+---> TESTPOINT PASSED (psImage{psImageShift} | tst_psImageManip.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psImageManip.c                                         *
+*            TestPoint: psImage{psImageResample}                                   *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|E|psImageResample (FILE:LINENO)
+    Can not operate on a NULL psImage.
+<DATE><TIME>|<HOST>|E|psImageResample (FILE:LINENO)
+    Specified scale value, 0, must be a positive value.
+<DATE><TIME>|<HOST>|E|psImageResample (FILE:LINENO)
+    Specified interpolation mode, -1, is unsupported.
+<DATE><TIME>|<HOST>|E|psImageResample (FILE:LINENO)
+    Specified psImage type, psBool, is not supported.
+
+---> TESTPOINT PASSED (psImage{psImageResample} | tst_psImageManip.c)
+
Index: /tags/ipp-1-X/bug123/psLib/test/image/verified/tst_psImageStats.stderr
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/image/verified/tst_psImageStats.stderr	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/image/verified/tst_psImageStats.stderr	(revision 22331)
@@ -0,0 +1,617 @@
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psImageStats.c                                         *
+*            TestPoint: psImage{psImageHistogram}                                  *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+*******************************
+* IMAGE SIZE is (1 by 1)
+*******************************
+Bin number 0 bounds: (0.0 - 0.1) data (1.00)
+Bin number 1 bounds: (0.1 - 0.2) data (0.00)
+Bin number 2 bounds: (0.2 - 0.3) data (0.00)
+Bin number 3 bounds: (0.3 - 0.4) data (0.00)
+Bin number 4 bounds: (0.4 - 0.5) data (0.00)
+Bin number 5 bounds: (0.5 - 0.6) data (0.00)
+Bin number 6 bounds: (0.6 - 0.7) data (0.00)
+Bin number 7 bounds: (0.7 - 0.8) data (0.00)
+Bin number 8 bounds: (0.8 - 0.9) data (0.00)
+Bin number 9 bounds: (0.9 - 1.0) data (0.00)
+Bin number 10 bounds: (1.0 - 1.1) data (0.00)
+Bin number 11 bounds: (1.1 - 1.2) data (0.00)
+Bin number 12 bounds: (1.2 - 1.3) data (0.00)
+Bin number 13 bounds: (1.3 - 1.4) data (0.00)
+Bin number 14 bounds: (1.4 - 1.5) data (0.00)
+Bin number 15 bounds: (1.5 - 1.6) data (0.00)
+Bin number 16 bounds: (1.6 - 1.7) data (0.00)
+Bin number 17 bounds: (1.7 - 1.8) data (0.00)
+Bin number 18 bounds: (1.8 - 1.9) data (0.00)
+Bin number 19 bounds: (1.9 - 2.0) data (0.00)
+Bin number 0 bounds: (0.00 - 0.10) data (1.00)
+Bin number 1 bounds: (0.10 - 0.20) data (0.00)
+Bin number 2 bounds: (0.20 - 0.30) data (0.00)
+Bin number 3 bounds: (0.30 - 0.40) data (0.00)
+Bin number 4 bounds: (0.40 - 0.50) data (0.00)
+Bin number 5 bounds: (0.50 - 0.60) data (0.00)
+Bin number 6 bounds: (0.60 - 0.70) data (0.00)
+Bin number 7 bounds: (0.70 - 0.80) data (0.00)
+Bin number 8 bounds: (0.80 - 0.90) data (0.00)
+Bin number 9 bounds: (0.90 - 1.00) data (0.00)
+Bin number 10 bounds: (1.00 - 1.10) data (0.00)
+Bin number 11 bounds: (1.10 - 1.20) data (0.00)
+Bin number 12 bounds: (1.20 - 1.30) data (0.00)
+Bin number 13 bounds: (1.30 - 1.40) data (0.00)
+Bin number 14 bounds: (1.40 - 1.50) data (0.00)
+Bin number 15 bounds: (1.50 - 1.60) data (0.00)
+Bin number 16 bounds: (1.60 - 1.70) data (0.00)
+Bin number 17 bounds: (1.70 - 1.80) data (0.00)
+Bin number 18 bounds: (1.80 - 1.90) data (0.00)
+Bin number 19 bounds: (1.90 - 2.00) data (0.00)
+*******************************
+* IMAGE SIZE is (1 by 32)
+*******************************
+Bin number 0 bounds: (0.0 - 1.7) data (2.00)
+Bin number 1 bounds: (1.7 - 3.3) data (2.00)
+Bin number 2 bounds: (3.3 - 5.0) data (1.00)
+Bin number 3 bounds: (5.0 - 6.6) data (2.00)
+Bin number 4 bounds: (6.6 - 8.2) data (2.00)
+Bin number 5 bounds: (8.2 - 9.9) data (1.00)
+Bin number 6 bounds: (9.9 - 11.6) data (2.00)
+Bin number 7 bounds: (11.6 - 13.2) data (2.00)
+Bin number 8 bounds: (13.2 - 14.9) data (1.00)
+Bin number 9 bounds: (14.9 - 16.5) data (2.00)
+Bin number 10 bounds: (16.5 - 18.2) data (2.00)
+Bin number 11 bounds: (18.2 - 19.8) data (1.00)
+Bin number 12 bounds: (19.8 - 21.5) data (2.00)
+Bin number 13 bounds: (21.5 - 23.1) data (2.00)
+Bin number 14 bounds: (23.1 - 24.8) data (1.00)
+Bin number 15 bounds: (24.8 - 26.4) data (2.00)
+Bin number 16 bounds: (26.4 - 28.1) data (1.00)
+Bin number 17 bounds: (28.1 - 29.7) data (2.00)
+Bin number 18 bounds: (29.7 - 31.4) data (2.00)
+Bin number 19 bounds: (31.4 - 33.0) data (0.00)
+Bin number 0 bounds: (0.00 - 1.65) data (2.00)
+Bin number 1 bounds: (1.65 - 3.30) data (2.00)
+Bin number 2 bounds: (3.30 - 4.95) data (1.00)
+Bin number 3 bounds: (4.95 - 6.60) data (2.00)
+Bin number 4 bounds: (6.60 - 8.25) data (2.00)
+Bin number 5 bounds: (8.25 - 9.90) data (1.00)
+Bin number 6 bounds: (9.90 - 11.55) data (2.00)
+Bin number 7 bounds: (11.55 - 13.20) data (2.00)
+Bin number 8 bounds: (13.20 - 14.85) data (1.00)
+Bin number 9 bounds: (14.85 - 16.50) data (2.00)
+Bin number 10 bounds: (16.50 - 18.15) data (2.00)
+Bin number 11 bounds: (18.15 - 19.80) data (1.00)
+Bin number 12 bounds: (19.80 - 21.45) data (2.00)
+Bin number 13 bounds: (21.45 - 23.10) data (2.00)
+Bin number 14 bounds: (23.10 - 24.75) data (1.00)
+Bin number 15 bounds: (24.75 - 26.40) data (2.00)
+Bin number 16 bounds: (26.40 - 28.05) data (1.00)
+Bin number 17 bounds: (28.05 - 29.70) data (2.00)
+Bin number 18 bounds: (29.70 - 31.35) data (2.00)
+Bin number 19 bounds: (31.35 - 33.00) data (0.00)
+*******************************
+* IMAGE SIZE is (32 by 1)
+*******************************
+Bin number 0 bounds: (0.0 - 1.7) data (2.00)
+Bin number 1 bounds: (1.7 - 3.3) data (2.00)
+Bin number 2 bounds: (3.3 - 5.0) data (1.00)
+Bin number 3 bounds: (5.0 - 6.6) data (2.00)
+Bin number 4 bounds: (6.6 - 8.2) data (2.00)
+Bin number 5 bounds: (8.2 - 9.9) data (1.00)
+Bin number 6 bounds: (9.9 - 11.6) data (2.00)
+Bin number 7 bounds: (11.6 - 13.2) data (2.00)
+Bin number 8 bounds: (13.2 - 14.9) data (1.00)
+Bin number 9 bounds: (14.9 - 16.5) data (2.00)
+Bin number 10 bounds: (16.5 - 18.2) data (2.00)
+Bin number 11 bounds: (18.2 - 19.8) data (1.00)
+Bin number 12 bounds: (19.8 - 21.5) data (2.00)
+Bin number 13 bounds: (21.5 - 23.1) data (2.00)
+Bin number 14 bounds: (23.1 - 24.8) data (1.00)
+Bin number 15 bounds: (24.8 - 26.4) data (2.00)
+Bin number 16 bounds: (26.4 - 28.1) data (1.00)
+Bin number 17 bounds: (28.1 - 29.7) data (2.00)
+Bin number 18 bounds: (29.7 - 31.4) data (2.00)
+Bin number 19 bounds: (31.4 - 33.0) data (0.00)
+Bin number 0 bounds: (0.00 - 1.65) data (2.00)
+Bin number 1 bounds: (1.65 - 3.30) data (2.00)
+Bin number 2 bounds: (3.30 - 4.95) data (1.00)
+Bin number 3 bounds: (4.95 - 6.60) data (2.00)
+Bin number 4 bounds: (6.60 - 8.25) data (2.00)
+Bin number 5 bounds: (8.25 - 9.90) data (1.00)
+Bin number 6 bounds: (9.90 - 11.55) data (2.00)
+Bin number 7 bounds: (11.55 - 13.20) data (2.00)
+Bin number 8 bounds: (13.20 - 14.85) data (1.00)
+Bin number 9 bounds: (14.85 - 16.50) data (2.00)
+Bin number 10 bounds: (16.50 - 18.15) data (2.00)
+Bin number 11 bounds: (18.15 - 19.80) data (1.00)
+Bin number 12 bounds: (19.80 - 21.45) data (2.00)
+Bin number 13 bounds: (21.45 - 23.10) data (2.00)
+Bin number 14 bounds: (23.10 - 24.75) data (1.00)
+Bin number 15 bounds: (24.75 - 26.40) data (2.00)
+Bin number 16 bounds: (26.40 - 28.05) data (1.00)
+Bin number 17 bounds: (28.05 - 29.70) data (2.00)
+Bin number 18 bounds: (29.70 - 31.35) data (2.00)
+Bin number 19 bounds: (31.35 - 33.00) data (0.00)
+*******************************
+* IMAGE SIZE is (32 by 32)
+*******************************
+Bin number 0 bounds: (0.0 - 3.2) data (10.00)
+Bin number 1 bounds: (3.2 - 6.4) data (18.00)
+Bin number 2 bounds: (6.4 - 9.6) data (27.00)
+Bin number 3 bounds: (9.6 - 12.8) data (36.00)
+Bin number 4 bounds: (12.8 - 16.0) data (45.00)
+Bin number 5 bounds: (16.0 - 19.2) data (74.00)
+Bin number 6 bounds: (19.2 - 22.4) data (66.00)
+Bin number 7 bounds: (22.4 - 25.6) data (75.00)
+Bin number 8 bounds: (25.6 - 28.8) data (84.00)
+Bin number 9 bounds: (28.8 - 32.0) data (93.00)
+Bin number 10 bounds: (32.0 - 35.2) data (118.00)
+Bin number 11 bounds: (35.2 - 38.4) data (78.00)
+Bin number 12 bounds: (38.4 - 41.6) data (69.00)
+Bin number 13 bounds: (41.6 - 44.8) data (60.00)
+Bin number 14 bounds: (44.8 - 48.0) data (51.00)
+Bin number 15 bounds: (48.0 - 51.2) data (54.00)
+Bin number 16 bounds: (51.2 - 54.4) data (30.00)
+Bin number 17 bounds: (54.4 - 57.6) data (21.00)
+Bin number 18 bounds: (57.6 - 60.8) data (12.00)
+Bin number 19 bounds: (60.8 - 64.0) data (3.00)
+Bin number 0 bounds: (0.00 - 3.20) data (10.00)
+Bin number 1 bounds: (3.20 - 6.40) data (18.00)
+Bin number 2 bounds: (6.40 - 9.60) data (27.00)
+Bin number 3 bounds: (9.60 - 12.80) data (36.00)
+Bin number 4 bounds: (12.80 - 16.00) data (45.00)
+Bin number 5 bounds: (16.00 - 19.20) data (74.00)
+Bin number 6 bounds: (19.20 - 22.40) data (66.00)
+Bin number 7 bounds: (22.40 - 25.60) data (75.00)
+Bin number 8 bounds: (25.60 - 28.80) data (84.00)
+Bin number 9 bounds: (28.80 - 32.00) data (93.00)
+Bin number 10 bounds: (32.00 - 35.20) data (115.00)
+Bin number 11 bounds: (35.20 - 38.40) data (66.00)
+Bin number 12 bounds: (38.40 - 41.60) data (48.00)
+Bin number 13 bounds: (41.60 - 44.80) data (30.00)
+Bin number 14 bounds: (44.80 - 48.00) data (12.00)
+Bin number 15 bounds: (48.00 - 51.20) data (0.00)
+Bin number 16 bounds: (51.20 - 54.40) data (0.00)
+Bin number 17 bounds: (54.40 - 57.60) data (0.00)
+Bin number 18 bounds: (57.60 - 60.80) data (0.00)
+Bin number 19 bounds: (60.80 - 64.00) data (0.00)
+*******************************
+* IMAGE SIZE is (32 by 64)
+*******************************
+Bin number 0 bounds: (0.0 - 4.8) data (15.00)
+Bin number 1 bounds: (4.8 - 9.6) data (40.00)
+Bin number 2 bounds: (9.6 - 14.4) data (65.00)
+Bin number 3 bounds: (14.4 - 19.2) data (90.00)
+Bin number 4 bounds: (19.2 - 24.0) data (90.00)
+Bin number 5 bounds: (24.0 - 28.8) data (135.00)
+Bin number 6 bounds: (28.8 - 33.6) data (157.00)
+Bin number 7 bounds: (33.6 - 38.4) data (160.00)
+Bin number 8 bounds: (38.4 - 43.2) data (160.00)
+Bin number 9 bounds: (43.2 - 48.0) data (128.00)
+Bin number 10 bounds: (48.0 - 52.8) data (160.00)
+Bin number 11 bounds: (52.8 - 57.6) data (160.00)
+Bin number 12 bounds: (57.6 - 62.4) data (160.00)
+Bin number 13 bounds: (62.4 - 67.2) data (150.00)
+Bin number 14 bounds: (67.2 - 72.0) data (102.00)
+Bin number 15 bounds: (72.0 - 76.8) data (105.00)
+Bin number 16 bounds: (76.8 - 81.6) data (80.00)
+Bin number 17 bounds: (81.6 - 86.4) data (55.00)
+Bin number 18 bounds: (86.4 - 91.2) data (30.00)
+Bin number 19 bounds: (91.2 - 96.0) data (6.00)
+Bin number 0 bounds: (0.00 - 4.80) data (15.00)
+Bin number 1 bounds: (4.80 - 9.60) data (40.00)
+Bin number 2 bounds: (9.60 - 14.40) data (65.00)
+Bin number 3 bounds: (14.40 - 19.20) data (90.00)
+Bin number 4 bounds: (19.20 - 24.00) data (90.00)
+Bin number 5 bounds: (24.00 - 28.80) data (135.00)
+Bin number 6 bounds: (28.80 - 33.60) data (157.00)
+Bin number 7 bounds: (33.60 - 38.40) data (160.00)
+Bin number 8 bounds: (38.40 - 43.20) data (160.00)
+Bin number 9 bounds: (43.20 - 48.00) data (128.00)
+Bin number 10 bounds: (48.00 - 52.80) data (154.00)
+Bin number 11 bounds: (52.80 - 57.60) data (130.00)
+Bin number 12 bounds: (57.60 - 62.40) data (105.00)
+Bin number 13 bounds: (62.40 - 67.20) data (76.00)
+Bin number 14 bounds: (67.20 - 72.00) data (42.00)
+Bin number 15 bounds: (72.00 - 76.80) data (30.00)
+Bin number 16 bounds: (76.80 - 81.60) data (6.00)
+Bin number 17 bounds: (81.60 - 86.40) data (0.00)
+Bin number 18 bounds: (86.40 - 91.20) data (0.00)
+Bin number 19 bounds: (91.20 - 96.00) data (0.00)
+*******************************
+* IMAGE SIZE is (64 by 32)
+*******************************
+Bin number 0 bounds: (0.0 - 4.8) data (15.00)
+Bin number 1 bounds: (4.8 - 9.6) data (40.00)
+Bin number 2 bounds: (9.6 - 14.4) data (65.00)
+Bin number 3 bounds: (14.4 - 19.2) data (90.00)
+Bin number 4 bounds: (19.2 - 24.0) data (90.00)
+Bin number 5 bounds: (24.0 - 28.8) data (135.00)
+Bin number 6 bounds: (28.8 - 33.6) data (157.00)
+Bin number 7 bounds: (33.6 - 38.4) data (160.00)
+Bin number 8 bounds: (38.4 - 43.2) data (160.00)
+Bin number 9 bounds: (43.2 - 48.0) data (128.00)
+Bin number 10 bounds: (48.0 - 52.8) data (160.00)
+Bin number 11 bounds: (52.8 - 57.6) data (160.00)
+Bin number 12 bounds: (57.6 - 62.4) data (160.00)
+Bin number 13 bounds: (62.4 - 67.2) data (150.00)
+Bin number 14 bounds: (67.2 - 72.0) data (102.00)
+Bin number 15 bounds: (72.0 - 76.8) data (105.00)
+Bin number 16 bounds: (76.8 - 81.6) data (80.00)
+Bin number 17 bounds: (81.6 - 86.4) data (55.00)
+Bin number 18 bounds: (86.4 - 91.2) data (30.00)
+Bin number 19 bounds: (91.2 - 96.0) data (6.00)
+Bin number 0 bounds: (0.00 - 4.80) data (15.00)
+Bin number 1 bounds: (4.80 - 9.60) data (40.00)
+Bin number 2 bounds: (9.60 - 14.40) data (65.00)
+Bin number 3 bounds: (14.40 - 19.20) data (90.00)
+Bin number 4 bounds: (19.20 - 24.00) data (90.00)
+Bin number 5 bounds: (24.00 - 28.80) data (135.00)
+Bin number 6 bounds: (28.80 - 33.60) data (157.00)
+Bin number 7 bounds: (33.60 - 38.40) data (160.00)
+Bin number 8 bounds: (38.40 - 43.20) data (160.00)
+Bin number 9 bounds: (43.20 - 48.00) data (128.00)
+Bin number 10 bounds: (48.00 - 52.80) data (154.00)
+Bin number 11 bounds: (52.80 - 57.60) data (130.00)
+Bin number 12 bounds: (57.60 - 62.40) data (105.00)
+Bin number 13 bounds: (62.40 - 67.20) data (76.00)
+Bin number 14 bounds: (67.20 - 72.00) data (42.00)
+Bin number 15 bounds: (72.00 - 76.80) data (30.00)
+Bin number 16 bounds: (76.80 - 81.60) data (6.00)
+Bin number 17 bounds: (81.60 - 86.40) data (0.00)
+Bin number 18 bounds: (86.40 - 91.20) data (0.00)
+Bin number 19 bounds: (91.20 - 96.00) data (0.00)
+*******************************
+* IMAGE SUBSET SIZE is (64 by 32)
+*******************************
+Bin number 0 bounds: (0.0 - 4.8) data (15.00)
+Bin number 1 bounds: (4.8 - 9.6) data (40.00)
+Bin number 2 bounds: (9.6 - 14.4) data (65.00)
+Bin number 3 bounds: (14.4 - 19.2) data (90.00)
+Bin number 4 bounds: (19.2 - 24.0) data (90.00)
+Bin number 5 bounds: (24.0 - 28.8) data (135.00)
+Bin number 6 bounds: (28.8 - 33.6) data (157.00)
+Bin number 7 bounds: (33.6 - 38.4) data (160.00)
+Bin number 8 bounds: (38.4 - 43.2) data (160.00)
+Bin number 9 bounds: (43.2 - 48.0) data (128.00)
+Bin number 10 bounds: (48.0 - 52.8) data (160.00)
+Bin number 11 bounds: (52.8 - 57.6) data (160.00)
+Bin number 12 bounds: (57.6 - 62.4) data (160.00)
+Bin number 13 bounds: (62.4 - 67.2) data (150.00)
+Bin number 14 bounds: (67.2 - 72.0) data (102.00)
+Bin number 15 bounds: (72.0 - 76.8) data (105.00)
+Bin number 16 bounds: (76.8 - 81.6) data (80.00)
+Bin number 17 bounds: (81.6 - 86.4) data (55.00)
+Bin number 18 bounds: (86.4 - 91.2) data (30.00)
+Bin number 19 bounds: (91.2 - 96.0) data (6.00)
+Bin number 0 bounds: (0.00 - 4.80) data (15.00)
+Bin number 1 bounds: (4.80 - 9.60) data (40.00)
+Bin number 2 bounds: (9.60 - 14.40) data (65.00)
+Bin number 3 bounds: (14.40 - 19.20) data (90.00)
+Bin number 4 bounds: (19.20 - 24.00) data (90.00)
+Bin number 5 bounds: (24.00 - 28.80) data (135.00)
+Bin number 6 bounds: (28.80 - 33.60) data (157.00)
+Bin number 7 bounds: (33.60 - 38.40) data (160.00)
+Bin number 8 bounds: (38.40 - 43.20) data (160.00)
+Bin number 9 bounds: (43.20 - 48.00) data (128.00)
+Bin number 10 bounds: (48.00 - 52.80) data (154.00)
+Bin number 11 bounds: (52.80 - 57.60) data (130.00)
+Bin number 12 bounds: (57.60 - 62.40) data (105.00)
+Bin number 13 bounds: (62.40 - 67.20) data (76.00)
+Bin number 14 bounds: (67.20 - 72.00) data (42.00)
+Bin number 15 bounds: (72.00 - 76.80) data (30.00)
+Bin number 16 bounds: (76.80 - 81.60) data (6.00)
+Bin number 17 bounds: (81.60 - 86.40) data (0.00)
+Bin number 18 bounds: (86.40 - 91.20) data (0.00)
+Bin number 19 bounds: (91.20 - 96.00) data (0.00)
+<DATE><TIME>|<HOST>|E|psImageHistogram (FILE:LINENO)
+    Unallowable operation: out is NULL.
+<DATE><TIME>|<HOST>|E|psImageHistogram (FILE:LINENO)
+    Unallowable operation: in is NULL.
+<DATE><TIME>|<HOST>|E|psImageHistogram (FILE:LINENO)
+    Unallowable operation: out is NULL.
+<DATE><TIME>|<HOST>|I|testPsImageHistogram
+    Following should be an error for invalid mask type.
+<DATE><TIME>|<HOST>|E|psImageHistogram (FILE:LINENO)
+    Unallowable operation: psImage mask has incorrect type.
+
+---> TESTPOINT PASSED (psImage{psImageHistogram} | tst_psImageStats.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psImageStats.c                                         *
+*            TestPoint: psImage{psImageStats}                                      *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+*******************************
+* IMAGE SIZE is (1 by 1)
+*******************************
+The sample mean was 0.00
+The sample mean was 0.00
+*******************************
+* IMAGE SIZE is (1 by 32)
+*******************************
+The sample mean was 15.50
+The sample mean was 15.50
+*******************************
+* IMAGE SIZE is (32 by 1)
+*******************************
+The sample mean was 15.50
+The sample mean was 15.50
+*******************************
+* IMAGE SIZE is (32 by 32)
+*******************************
+The sample mean was 31.00
+The sample mean was 26.21
+*******************************
+* IMAGE SIZE is (32 by 64)
+*******************************
+The sample mean was 47.00
+The sample mean was 39.66
+*******************************
+* IMAGE SIZE is (64 by 32)
+*******************************
+The sample mean was 47.00
+The sample mean was 39.66
+*******************************
+* IMAGE SUBSET SIZE is (64 by 32)
+*******************************
+The sample mean was 47.00
+The sample mean was 39.66
+<DATE><TIME>|<HOST>|E|psImageStats (FILE:LINENO)
+    Error: stats->options is 0.
+<DATE><TIME>|<HOST>|E|psImageStats (FILE:LINENO)
+    Unallowable operation: stats is NULL.
+<DATE><TIME>|<HOST>|E|psImageStats (FILE:LINENO)
+    Error: stats->options is 0.
+<DATE><TIME>|<HOST>|E|psImageStats (FILE:LINENO)
+    Unallowable operation: psImage mask has incorrect type.
+
+---> TESTPOINT PASSED (psImage{psImageStats} | tst_psImageStats.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psImageStats.c                                         *
+*            TestPoint: psImage{psImageFitPolynomial}                              *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+Cheby Polynomial (0, 0) coefficient is 189.00
+Cheby Polynomial (0, 1) coefficient is 25.94
+Cheby Polynomial (0, 2) coefficient is 0.00
+Cheby Polynomial (0, 3) coefficient is 2.88
+Cheby Polynomial (0, 4) coefficient is 0.00
+Cheby Polynomial (0, 5) coefficient is 1.04
+Cheby Polynomial (0, 6) coefficient is 0.00
+Cheby Polynomial (0, 7) coefficient is 0.53
+Cheby Polynomial (1, 0) coefficient is 129.68
+Cheby Polynomial (1, 1) coefficient is 0.00
+Cheby Polynomial (1, 2) coefficient is 0.00
+Cheby Polynomial (1, 3) coefficient is 0.00
+Cheby Polynomial (1, 4) coefficient is 0.00
+Cheby Polynomial (1, 5) coefficient is 0.00
+Cheby Polynomial (1, 6) coefficient is 0.00
+Cheby Polynomial (1, 7) coefficient is 0.00
+Cheby Polynomial (2, 0) coefficient is 0.00
+Cheby Polynomial (2, 1) coefficient is 0.00
+Cheby Polynomial (2, 2) coefficient is 0.00
+Cheby Polynomial (2, 3) coefficient is 0.00
+Cheby Polynomial (2, 4) coefficient is 0.00
+Cheby Polynomial (2, 5) coefficient is 0.00
+Cheby Polynomial (2, 6) coefficient is 0.00
+Cheby Polynomial (2, 7) coefficient is 0.00
+Cheby Polynomial (3, 0) coefficient is 14.40
+Cheby Polynomial (3, 1) coefficient is 0.00
+Cheby Polynomial (3, 2) coefficient is 0.00
+Cheby Polynomial (3, 3) coefficient is 0.00
+Cheby Polynomial (3, 4) coefficient is 0.00
+Cheby Polynomial (3, 5) coefficient is 0.00
+Cheby Polynomial (3, 6) coefficient is 0.00
+Cheby Polynomial (3, 7) coefficient is 0.00
+Cheby Polynomial (4, 0) coefficient is 0.00
+Cheby Polynomial (4, 1) coefficient is 0.00
+Cheby Polynomial (4, 2) coefficient is 0.00
+Cheby Polynomial (4, 3) coefficient is 0.00
+Cheby Polynomial (4, 4) coefficient is 0.00
+Cheby Polynomial (4, 5) coefficient is 0.00
+Cheby Polynomial (4, 6) coefficient is 0.00
+Cheby Polynomial (4, 7) coefficient is 0.00
+Cheby Polynomial (5, 0) coefficient is 5.17
+Cheby Polynomial (5, 1) coefficient is 0.00
+Cheby Polynomial (5, 2) coefficient is 0.00
+Cheby Polynomial (5, 3) coefficient is 0.00
+Cheby Polynomial (5, 4) coefficient is 0.00
+Cheby Polynomial (5, 5) coefficient is 0.00
+Cheby Polynomial (5, 6) coefficient is 0.00
+Cheby Polynomial (5, 7) coefficient is 0.00
+Cheby Polynomial (6, 0) coefficient is 0.00
+Cheby Polynomial (6, 1) coefficient is 0.00
+Cheby Polynomial (6, 2) coefficient is 0.00
+Cheby Polynomial (6, 3) coefficient is 0.00
+Cheby Polynomial (6, 4) coefficient is 0.00
+Cheby Polynomial (6, 5) coefficient is 0.00
+Cheby Polynomial (6, 6) coefficient is 0.00
+Cheby Polynomial (6, 7) coefficient is 0.00
+Cheby Polynomial (7, 0) coefficient is 2.63
+Cheby Polynomial (7, 1) coefficient is 0.00
+Cheby Polynomial (7, 2) coefficient is 0.00
+Cheby Polynomial (7, 3) coefficient is 0.00
+Cheby Polynomial (7, 4) coefficient is 0.00
+Cheby Polynomial (7, 5) coefficient is 0.00
+Cheby Polynomial (7, 6) coefficient is 0.00
+Cheby Polynomial (7, 7) coefficient is 0.00
+<DATE><TIME>|<HOST>|I|testPsImageFitPolynomial
+    Following should be an error message for NULL coeffs argument.
+<DATE><TIME>|<HOST>|E|psImageFitPolynomial (FILE:LINENO)
+    Unallowable operation: polynomial coeffs or its coeffs is NULL.
+<DATE><TIME>|<HOST>|I|testPsImageFitPolynomial
+    Following should be a error message for NULL input argument.
+<DATE><TIME>|<HOST>|E|psImageFitPolynomial (FILE:LINENO)
+    Unallowable operation: psImage input or its data is NULL.
+<DATE><TIME>|<HOST>|I|testPsImageFitPolynomial
+    Following should be an error message for NULL coeffs argument.
+<DATE><TIME>|<HOST>|E|psImageEvalPolynomial (FILE:LINENO)
+    Unallowable operation: polynomial coeffs or its coeffs is NULL.
+<DATE><TIME>|<HOST>|I|testPsImageFitPolynomial
+    Following should be a error message for NULL input argument.
+<DATE><TIME>|<HOST>|E|psImageEvalPolynomial (FILE:LINENO)
+    Unallowable operation: psImage input or its data is NULL.
+
+---> TESTPOINT PASSED (psImage{psImageFitPolynomial} | tst_psImageStats.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psImageStats.c                                         *
+*            TestPoint: psImage{psImagePixelInterpolate}                           *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+0.0 1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0 
+1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0 10.0 
+2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0 10.0 11.0 
+3.0 4.0 5.0 6.0 7.0 8.0 9.0 10.0 11.0 12.0 
+4.0 5.0 6.0 7.0 8.0 9.0 10.0 11.0 12.0 13.0 
+5.0 6.0 7.0 8.0 9.0 10.0 11.0 12.0 13.0 14.0 
+6.0 7.0 8.0 9.0 10.0 11.0 12.0 13.0 14.0 15.0 
+7.0 8.0 9.0 10.0 11.0 12.0 13.0 14.0 15.0 16.0 
+8.0 9.0 10.0 11.0 12.0 13.0 14.0 15.0 16.0 17.0 
+9.0 10.0 11.0 12.0 13.0 14.0 15.0 16.0 17.0 18.0 
+0.0 0.7 1.7 2.7 3.7 4.7 5.7 6.7 7.7 
+0.7 1.4 2.4 3.4 4.4 5.4 6.4 7.4 8.4 
+1.7 2.4 3.4 4.4 5.4 6.4 7.4 8.4 9.4 
+2.7 3.4 4.4 5.4 6.4 7.4 8.4 9.4 10.4 
+3.7 4.4 5.4 6.4 7.4 8.4 9.4 10.4 11.4 
+4.7 5.4 6.4 7.4 8.4 9.4 10.4 11.4 12.4 
+5.7 6.4 7.4 8.4 9.4 10.4 11.4 12.4 13.4 
+6.7 7.4 8.4 9.4 10.4 11.4 12.4 13.4 14.4 
+7.7 8.4 9.4 10.4 11.4 12.4 13.4 14.4 15.4 
+image[0.2][0.2] is interpolated at 0.0
+image[0.2][1.2] is interpolated at 0.7
+image[0.2][2.2] is interpolated at 1.7
+image[0.2][3.2] is interpolated at 2.7
+image[0.2][4.2] is interpolated at 3.7
+image[0.2][5.2] is interpolated at 4.7
+image[0.2][6.2] is interpolated at 5.7
+image[0.2][7.2] is interpolated at 6.7
+image[0.2][8.2] is interpolated at 7.7
+image[1.2][0.2] is interpolated at 0.7
+image[1.2][1.2] is interpolated at 1.4
+image[1.2][2.2] is interpolated at 2.4
+image[1.2][3.2] is interpolated at 3.4
+image[1.2][4.2] is interpolated at 4.4
+image[1.2][5.2] is interpolated at 5.4
+image[1.2][6.2] is interpolated at 6.4
+image[1.2][7.2] is interpolated at 7.4
+image[1.2][8.2] is interpolated at 8.4
+image[2.2][0.2] is interpolated at 1.7
+image[2.2][1.2] is interpolated at 2.4
+image[2.2][2.2] is interpolated at 3.4
+image[2.2][3.2] is interpolated at 4.4
+image[2.2][4.2] is interpolated at 5.4
+image[2.2][5.2] is interpolated at 6.4
+image[2.2][6.2] is interpolated at 7.4
+image[2.2][7.2] is interpolated at 8.4
+image[2.2][8.2] is interpolated at 9.4
+image[3.2][0.2] is interpolated at 2.7
+image[3.2][1.2] is interpolated at 3.4
+image[3.2][2.2] is interpolated at 4.4
+image[3.2][3.2] is interpolated at 5.4
+image[3.2][4.2] is interpolated at 6.4
+image[3.2][5.2] is interpolated at 7.4
+image[3.2][6.2] is interpolated at 8.4
+image[3.2][7.2] is interpolated at 9.4
+image[3.2][8.2] is interpolated at 10.4
+image[4.2][0.2] is interpolated at 3.7
+image[4.2][1.2] is interpolated at 4.4
+image[4.2][2.2] is interpolated at 5.4
+image[4.2][3.2] is interpolated at 6.4
+image[4.2][4.2] is interpolated at 7.4
+image[4.2][5.2] is interpolated at 8.4
+image[4.2][6.2] is interpolated at 9.4
+image[4.2][7.2] is interpolated at 10.4
+image[4.2][8.2] is interpolated at 11.4
+image[5.2][0.2] is interpolated at 4.7
+image[5.2][1.2] is interpolated at 5.4
+image[5.2][2.2] is interpolated at 6.4
+image[5.2][3.2] is interpolated at 7.4
+image[5.2][4.2] is interpolated at 8.4
+image[5.2][5.2] is interpolated at 9.4
+image[5.2][6.2] is interpolated at 10.4
+image[5.2][7.2] is interpolated at 11.4
+image[5.2][8.2] is interpolated at 12.4
+image[6.2][0.2] is interpolated at 5.7
+image[6.2][1.2] is interpolated at 6.4
+image[6.2][2.2] is interpolated at 7.4
+image[6.2][3.2] is interpolated at 8.4
+image[6.2][4.2] is interpolated at 9.4
+image[6.2][5.2] is interpolated at 10.4
+image[6.2][6.2] is interpolated at 11.4
+image[6.2][7.2] is interpolated at 12.4
+image[6.2][8.2] is interpolated at 13.4
+image[7.2][0.2] is interpolated at 6.7
+image[7.2][1.2] is interpolated at 7.4
+image[7.2][2.2] is interpolated at 8.4
+image[7.2][3.2] is interpolated at 9.4
+image[7.2][4.2] is interpolated at 10.4
+image[7.2][5.2] is interpolated at 11.4
+image[7.2][6.2] is interpolated at 12.4
+image[7.2][7.2] is interpolated at 13.4
+image[7.2][8.2] is interpolated at 14.4
+image[8.2][0.2] is interpolated at 7.7
+image[8.2][1.2] is interpolated at 8.4
+image[8.2][2.2] is interpolated at 9.4
+image[8.2][3.2] is interpolated at 10.4
+image[8.2][4.2] is interpolated at 11.4
+image[8.2][5.2] is interpolated at 12.4
+image[8.2][6.2] is interpolated at 13.4
+image[8.2][7.2] is interpolated at 14.4
+image[8.2][8.2] is interpolated at 15.4
+
+---> TESTPOINT PASSED (psImage{psImagePixelInterpolate} | tst_psImageStats.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psImageStats.c                                         *
+*            TestPoint: psImage{psImageEvalPolynom()}                              *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+psImageFitPolynomial(), psImageEvalPolynom(): (1 by 1)
+pixel [0][0] is 25.00 should be 1.00
+The chi-squared per pixel is 576.00
+psImageFitPolynomial(), psImageEvalPolynom(): (5 by 1)
+pixel [0][0] is 5.00 should be 1.00
+pixel [1][0] is 40.00 should be 8.00
+pixel [2][0] is 125.00 should be 25.00
+pixel [3][0] is 260.00 should be 52.00
+pixel [4][0] is 445.00 should be 89.00
+The chi-squared per pixel is 36208.00
+psImageFitPolynomial(), psImageEvalPolynom(): (1 by 5)
+pixel [0][0] is 5.00 should be 1.00
+pixel [0][1] is 50.00 should be 10.00
+pixel [0][2] is 155.00 should be 31.00
+pixel [0][3] is 320.00 should be 64.00
+pixel [0][4] is 545.00 should be 109.00
+The chi-squared per pixel is 54524.80
+psImageFitPolynomial(), psImageEvalPolynom(): (5 by 5)
+The chi-squared per pixel is 0.00
+psImageFitPolynomial(), psImageEvalPolynom(): (1 by 1)
+pixel [0][0] is 25.00 should be 1.00
+The chi-squared per pixel is 576.00
+psImageFitPolynomial(), psImageEvalPolynom(): (5 by 1)
+pixel [0][0] is 5.00 should be 1.00
+pixel [1][0] is 40.00 should be 8.00
+pixel [2][0] is 125.00 should be 25.00
+pixel [3][0] is 260.00 should be 52.00
+pixel [4][0] is 445.00 should be 89.00
+The chi-squared per pixel is 36208.00
+psImageFitPolynomial(), psImageEvalPolynom(): (1 by 5)
+pixel [0][0] is 5.00 should be 1.00
+pixel [0][1] is 50.00 should be 10.00
+pixel [0][2] is 155.00 should be 31.00
+pixel [0][3] is 320.00 should be 64.00
+pixel [0][4] is 545.00 should be 109.00
+The chi-squared per pixel is 54524.81
+psImageFitPolynomial(), psImageEvalPolynom(): (5 by 5)
+The chi-squared per pixel is 0.00
+
+---> TESTPOINT PASSED (psImage{psImageEvalPolynom()} | tst_psImageStats.c)
+
Index: /tags/ipp-1-X/bug123/psLib/test/psTest.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/psTest.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/psTest.c	(revision 22331)
@@ -0,0 +1,249 @@
+//
+// C Implementation: psTest
+//
+// Description:
+//
+//
+// Author: Robert DeSonia <robert.desonia@mhpcc.hpc.mil>, (C) 2004
+//
+// Copyright: See COPYING file that comes with this distribution
+//
+//
+
+
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/wait.h>
+#include <stdbool.h>
+#include <string.h>
+
+#include "psTest.h"
+#include "psMemory.h"
+#include "psError.h"
+#include "psTrace.h"
+
+#define HEADER_TOP    "/***************************** TESTPOINT ******************************************\\\n"
+#define HEADER_LINE_STRING   "* %20s: %-58s *\n"
+#define HEADER_LINE_INT      "* %20s: %-58d *\n"
+#define HEADER_BOTTOM "\\**********************************************************************************/\n\n"
+
+psBool p_runTestSuite( FILE *fp, const char* testPointFile, const char* packageName,
+                       testDescription tests[], psS32 argc, char * const argv[] )
+{
+    psBool success = true;
+    psBool runAll = true;
+    psBool useFork = true;
+    psBool found;
+    psS32 c;
+    psS32 n;
+    extern char *optarg;
+
+    if ( argc > 0 ) {
+        while ( ( c = getopt( argc, argv, "lhn:dt:" ) ) != -1 ) {
+            switch ( c ) {
+            case 'h':
+                printf( "Usage: %s [-l] [-d] [-h] [-n=Testpoint#] [-t=TestpointName]\n"
+                        "    where:\n"
+                        "           -l  : lists the testpoints contained in this test driver executable\n"
+                        "           -d  : turns on debugger-friendly mode (no forking, aborts/signals are not handled)\n"
+                        "           -h  : prints this help\n"
+                        "           -n  : specifies a particular testpoint by number to run\n"
+                        "           -t  : specifies a particular testpoint by name to run\n"
+                        "    (if no -l, -n or -t options are given, all testpoints are run)\n",
+                        argv[ 0 ] );
+                runAll = false;
+                break;
+            case 'd':
+                useFork = false;
+                break;
+            case 'l':
+                printf( "Test Driver:  %s\n", testPointFile );
+                printf( "Package Name: %s\n", packageName );
+                printf( "Testpoints:\n" );
+                runAll = false;
+                for ( psS32 index = 0; tests[ index ].fcn != NULL; index++ ) {
+                    printf( "    %6d - %s \n", tests[ index ].testPointNumber,
+                            tests[ index ].testPointName );
+                }
+                printf( "\n" );
+                break;
+            case 't':
+                runAll = false;
+                for ( psS32 index = 0; tests[ index ].fcn != NULL; index++ ) {
+                    if ( strcmp( optarg, tests[ index ].testPointName ) == 0 ) {
+                        success = p_runTest( fp,
+                                             testPointFile,
+                                             packageName,
+                                             tests[ index ].testPointName,
+                                             tests[ index ].fcn,
+                                             tests[ index ].expectedReturn,
+                                             useFork ) && success;
+                    }
+                }
+                break;
+            case 'n':
+                runAll = false;
+                if ( sscanf( optarg, "%i", &n ) != 1 ) {
+                    psError(PS_ERR_UNKNOWN, true, "Failed to parse the testpoint number (%s).",
+                            optarg );
+                    break;
+                }
+                found = false;
+                for ( psS32 index = 0; tests[ index ].fcn != NULL; index++ ) {
+                    if ( n == tests[ index ].testPointNumber ) {
+                        found = true;
+                        success = p_runTest( fp,
+                                             testPointFile,
+                                             packageName,
+                                             tests[ index ].testPointName,
+                                             tests[ index ].fcn,
+                                             tests[ index ].expectedReturn,
+                                             useFork ) && success;
+                    }
+                }
+                if ( ! found ) {
+                    psError(PS_ERR_UNKNOWN, true, "The specified testpoint number (%d) doesn't exist in this test driver.",
+                            n );
+                    break;
+                }
+                break;
+            case '?':
+                psError(PS_ERR_UNKNOWN, true, "Option %s is not recognized and is ignored.", optarg );
+                break;
+            }
+        }
+    }
+
+    if ( runAll ) {
+        for ( psS32 index = 0; tests[ index ].fcn != NULL; index++ ) {
+            if ( ! tests[ index ].isDuplicateEntry ) {
+                success = p_runTest( fp,
+                                     testPointFile,
+                                     packageName,
+                                     tests[ index ].testPointName,
+                                     tests[ index ].fcn,
+                                     tests[ index ].expectedReturn,
+                                     useFork ) && success;
+            }
+        }
+    }
+
+    if ( ! success ) {
+        psError( PS_ERR_UNKNOWN, true,
+                 "One or more tests failed" );
+    }
+
+    return success;
+}
+
+psBool p_runTest( FILE *fp, const char* testPointFile, const char* packageName, const char* testPointName,
+                  testFcn fcn, psS32 expectedReturn, psBool useFork )
+{
+    psS32 childReturn = 0;
+    pid_t child;
+
+    p_printPositiveTestHeader( fp, testPointFile, packageName, testPointName );
+
+    if ( useFork ) {
+        child = fork();
+        if ( child == 0 ) {                   // I am the child process, run the test
+            psS32 currentId = psMemGetId();
+            psS32 retVal = fcn();
+            fflush(stdout);
+            fflush(stderr);
+            if ( retVal == 0 ) { // only bother checking memory if test executed to end.
+                if ( psMemCheckLeaks( currentId, NULL, stderr, false ) != 0 ) {
+                    psError(PS_ERR_UNKNOWN, true, "Memory Leaks Detected" );
+                    retVal = 64;
+                }
+                psMemCheckCorruption( 1 );
+            }
+            exit( retVal );
+        } else
+            if ( child < 0 ) {
+                fprintf( fp, "Couldn't fork a process to run a negative test (%s|%s)",
+                         packageName, testPointName );
+                abort();
+            }
+
+        waitpid( child, &childReturn, 0 );
+        if ( WIFSIGNALED( childReturn ) ) {
+            childReturn = -WTERMSIG( childReturn );
+        } else {
+            childReturn = WEXITSTATUS( childReturn );
+        }
+    } else {
+        psS32 currentId = psMemGetId();
+        childReturn = fcn();
+        fflush(stdout);
+        fflush(stderr);
+        if ( childReturn == 0 ) { // only bother checking memory if test executed to end.
+            if ( psMemCheckLeaks( currentId, NULL, stderr, false ) != 0 ) {
+                psError(PS_ERR_UNKNOWN, true, "Memory Leaks Detected" );
+                childReturn = 64;
+            }
+            psMemCheckCorruption( 1 );
+        }
+    }
+
+
+    if ( childReturn != expectedReturn ) {
+        fprintf( fp, "Return value mismatch: expected %d, got %d",
+                 expectedReturn, childReturn );
+    }
+
+    p_printFooter( fp, testPointFile, packageName, testPointName,
+                   ( childReturn == expectedReturn ) );
+
+    return ( childReturn == expectedReturn );
+}
+
+void p_printPositiveTestHeader( FILE *fp,
+                                const char* testPointFile,
+                                const char* packageName,
+                                const char* testPointName )
+{
+    char TP[ 80 ];
+
+    snprintf( TP, 80, "%s{%s}", packageName, testPointName );
+
+    fprintf( fp, HEADER_TOP );
+    fprintf( fp, HEADER_LINE_STRING, "TestFile", testPointFile );
+    fprintf( fp, HEADER_LINE_STRING, "TestPoint", TP );
+    fprintf( fp, HEADER_LINE_STRING, "TestType", "Positive" );
+    fprintf( fp, HEADER_BOTTOM );
+}
+
+void p_printNegativeTestHeader( FILE *fp,
+                                const char* testPointFile,
+                                const char* packageName,
+                                const char* testPointName,
+                                const char* expectedError,
+                                psS32 exitValue )
+{
+    char TP[ 80 ];
+
+    snprintf( TP, 80, "%s{%s}", packageName, testPointName );
+
+    fprintf( fp, HEADER_TOP );
+    fprintf( fp, HEADER_LINE_STRING, "TestFile", testPointFile );
+    fprintf( fp, HEADER_LINE_STRING, "TestPoint", TP );
+    fprintf( fp, HEADER_LINE_STRING, "TestType", "Negative" );
+    fprintf( fp, HEADER_LINE_STRING, "ExpectedErrorText", expectedError );
+    fprintf( fp, HEADER_LINE_INT, "ExpectedStatusValue", exitValue );
+    fprintf( fp, HEADER_BOTTOM );
+}
+
+
+void p_printFooter( FILE *fp,
+                    const char* testPointFile,
+                    const char* packageName,
+                    const char* testPointName,
+                    psBool success )
+{
+    if ( success ) {
+        fprintf( fp, "\n---> TESTPOINT PASSED (%s{%s} | %s)\n\n", packageName, testPointName, testPointFile );
+    } else {
+        fprintf( fp, "\n---> TESTPOINT FAILED (%s{%s} | %s)\n\n", packageName, testPointName, testPointFile );
+    }
+}
Index: /tags/ipp-1-X/bug123/psLib/test/psTest.h
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/psTest.h	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/psTest.h	(revision 22331)
@@ -0,0 +1,82 @@
+
+#ifndef PSTEST_H
+#define PSTEST_H
+
+#include <stdio.h>
+
+#include "psType.h"
+
+#define printPositiveTestHeader(filePtr, packageName, testPointName) \
+p_printPositiveTestHeader(filePtr, __FILE__, packageName, testPointName)
+
+#define printNegativeTestHeader(filePtr, packageName, testPointName, expectedError, exitValue) \
+p_printNegativeTestHeader(filePtr, __FILE__, packageName, testPointName, expectedError, exitValue)
+
+#define printFooter(filePtr, packageName, testPointName, success) \
+p_printFooter(filePtr, __FILE__, packageName, testPointName, success)
+
+typedef psS32 (*testFcn)(void);
+
+typedef struct
+{
+    testFcn     fcn;
+    psS32       testPointNumber;
+    const char* testPointName;
+    psS32       expectedReturn;
+    psBool      isDuplicateEntry;
+}
+testDescription;
+
+#define runTest(filePtr, packageName, testPointName, fcn, expectedReturn, useFork) \
+p_runTest(filePtr, __FILE__, packageName, testPointName, fcn, expectedReturn, useFork)
+
+#define runTestSuite(filePtr, packageName, tests, argc, argv) \
+p_runTestSuite(filePtr, __FILE__, packageName, tests, argc, argv)
+
+
+/////////////////////////// PRIVATE FUNCTIONS //////////////////////////////
+
+psBool p_runTest(
+    FILE *fp,
+    const char* testPointFile,
+    const char* packageName,
+    const char* testPointName,
+    testFcn fcn,
+    psS32 expectedReturn,
+    psBool useFork
+);
+
+psBool p_runTestSuite(
+    FILE *fp,
+    const char* testPointFile,
+    const char* packageName,
+    testDescription tests[],
+    psS32 argc,
+    char * const argv[]
+);
+
+void p_printPositiveTestHeader(
+    FILE *fp,
+    const char* testPointFile,
+    const char* packageName,
+    const char* testPointName
+);
+
+void p_printNegativeTestHeader(
+    FILE *fp,
+    const char* testPointFile,
+    const char* packageName,
+    const char* testPointName,
+    const char* expectedError,
+    psS32 exitValue
+);
+
+void p_printFooter(
+    FILE *fp,
+    const char* testPointFile,
+    const char* packageName,
+    const char* testPointName,
+    psBool success
+);
+
+#endif
Index: /tags/ipp-1-X/bug123/psLib/test/runTest
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/runTest	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/runTest	(revision 22331)
@@ -0,0 +1,384 @@
+#!/usr/bin/perl
+#
+#  This is a perl script to execute a single test driver program.  The script
+#  will examine the return value of the test driver and capture STDOUT, STDERR
+#  to files.  If the return value of the test driver is not zero, the test is
+#  deemed a failure.  STDOUT and STDERR files will be place in a subdirectory
+#  named temp and the files will be compared with verified STDOUT, STDERR files
+#  in a subdirectory named verified.  If there are no STDOUT, STDERR files in
+#  the verified directory, the captured STDOUT, STDERR files will be scanned
+#  for words which indicate a failure.
+#
+#  Assumptions:  A verified subdirectory with STDOUT, STDERR files exists for
+#                the test driver specified in the arguements if an exact
+#                match of the streams STDOUT, STDERR is necessary.
+#
+#  Return values:
+#                 Bit mapped values
+#                 0    Test run successfull and all tests passed
+#                 1    Verified directory did not exist
+#                 8    STDOUT files did not compare
+#                16    STDERR files did not compare
+#                32    Test driver doesn't exist or is not executable
+#                64    Test driver did not return zero
+#
+#  SYNOSIS:  runTest testDriverName
+#
+#  $Revison:  $  $Name: not supported by cvs2svn $
+#  $Date: 2005-04-09 00:04:57 $
+#
+#  Copyright 2004 Maui High Performance Computering Center, University of Hawaii
+#
+################################################################################
+
+# Provides functions for handling psS64 command line options
+use Getopt::Long;
+
+$verifiedDir = "verified";
+
+# Assign variables based on the presence of command line options to the script
+GetOptions(
+    "reset!"       => \$reset,
+    "resetStderr!" => \$resetStderr,
+    "resetStdout!" => \$resetStdout,
+    "verified=s"   => \$verifiedDir,
+    "help!"        => \$help,
+    "quiet!"       => \$quiet,
+    "printpassfail!"     => \$verbose
+);
+
+if ($help || $#ARGV < 0) {
+    print "Usage: runTest  [--help] [--verified=DIR] [--quiet] [--printpassfail] \\\n",
+          "                [--reset] [--resetStderr] [--resetStdout] testfile(s)\n\n";
+    exit(0);
+}
+
+if ($reset) {
+    $resetStderr = 1;
+    $resetStdout = 1;
+}
+
+# Initialize exit value
+$exitValue = 0;
+
+# Set up the PSLIB_ROOT environment variable if the user doesn't have it set
+if ( $ENV{'PSLIB_ROOT'} ) {
+
+	# Add PSLIB_ROOT/lib to LD_LIBRARY_PATH and DYLD_LIBRARY_PATH environment vars
+	$ENV{'LD_LIBRARY_PATH'}   = "$ENV{'PSLIB_ROOT'}/src/.libs:$ENV{'LD_LIBRARY_PATH'}";
+	$ENV{'DYLD_LIBRARY_PATH'} = "$ENV{'PSLIB_ROOT'}/src/.libs:$ENV{'DYLD_LIBRARY_PATH'}";
+}
+
+# Loop through the arguements passed to the script
+foreach (@ARGV) {
+    chomp;
+    $testFile = $_;
+
+    # Check if a temp directory already exists in the current work directory
+    if ( !( -e "temp" ) ) {
+        # Create temp directory to store STDOUT, STDERR files during test run
+        `mkdir temp`;
+    }
+
+    # Check if a verified directory exists in the current work directory
+    if ( !( -e $verifiedDir ) ) {
+
+        # Display message that verified subdirectory doesn't exist
+        print STDERR "        Verified directory doesn't exist.\n";
+
+        # Exit script since the test cannot be run with verified files
+        $exitValue = 1;
+    }
+
+    # Check if the test driver file exists and is executable
+    if ( ( -e $testFile ) && ( -x $testFile ) ) {
+
+        # Invoke the test driver
+        system("./$testFile 1> temp/$testFile.stdout 2> temp/$testFile.stderr");
+
+        # Check the return value of the test driver.  A value other than 0
+        # indicates failure of the test driver unless the test driver is name
+        # with a leading 'a' which indicates the test driver is expecting an
+        # abort condition to terminate the driver.
+        if (   ( $? != 0 && ( $testFile !~ /^A/i ) )
+            || ( $? == 0 && ( $testFile =~ /^A/i ) ) )
+        {
+
+            # Display failure message with return value to user
+            if ( $? != 0 && ( $testFile !~ /^A/i ) ) {
+                print STDERR "Failed - Test Driver returned $?, expected 0.\n";
+            }
+            elsif ( $? == 0 && ( $testFile =~ /^A/i ) ) {
+                print STDERR "Failed - Test Driver returned $?, expected abort.\n";
+            }
+            $exitValue |= 64;
+        }
+
+        # Test driver succeeded.
+
+        # Create filtered version of stdout and stderr
+
+        # Open the STDOUT file for reading
+        open( OUTFILE, "< temp/$testFile.stdout" );
+
+        # Open mod file to place filtered STDOUT
+        open( MODFILE,  "> temp/$testFile.stdout.mod" );
+        open( MODFILE2, "> $verifiedDir/$testFile.stdout" ) if $resetStdout;
+
+        # Replace the variable date, time and host information with constants
+        $hostname = `hostname`;
+        chop $hostname;
+        while (<OUTFILE>) {
+            s/\s+\d+:\d+:\d+\w/<TIME>/g;
+            s/\d+:\d+:\d+/<DATE>/g;
+            s/$hostname\s*/<HOST>/g;
+            s/: Line \d+/: Line <LINENO>/g;
+            s/\(.*\:\d+\)/\(FILE\:LINENO\)/g;
+            s/\s+[\_\-\/\.\w]+\:\d+/ FILE\:LINENO/g;
+            s/allocate \d+ bytes at/allocate <N> bytes at/g;
+            s/v\d+.\d+.\d+/vX.X.X/g;
+
+            if (m/TestPoint:\s*([^\*]+)/) {
+                $testfile = $1;
+            }
+            if (m/^---> TESTPOINT\s(\S+)/) {
+                print "\t$testfile- $1\n" if ($verbose || $1 eq "FAILED");
+                if ($1 eq "FAILED") {
+                    print $testoutput;
+                }
+            }
+
+            # Filter lines with malloc.  This is an artifact of memory testing
+            # with the Mac testbed
+            if ( !m/\*\*\*\smalloc/ ) {
+                print MODFILE ($_);
+                print MODFILE2 ($_) if $resetStdout;
+            }
+        }
+
+        # Close mod file
+        close(MODFILE);
+        close(MODFILE2) if $resetStdout;
+
+        # Close STDERR file
+        close(OUTFILE);
+
+        # Open the STDERR file for reading
+        open( OUTFILE, "< temp/$testFile.stderr" );
+
+        # Open mod file to place filtered STDERR
+        open( MODFILE,  "> temp/$testFile.stderr.mod" );
+        open( MODFILE2, "> $verifiedDir/$testFile.stderr" ) if $resetStderr;
+
+        # Replace the variable date, time and host information with constants
+        while (<OUTFILE>) {
+            s/\s+\d+:\d+:\d+\w/<TIME>/g;
+            s/\d+:\d+:\d+/<DATE>/g;
+            s/$hostname\s*/<HOST>/g;
+            s/: Line \d+/: Line <LINENO>/g;
+            s/\(.*\:\d+\)/\(FILE\:LINENO\)/g;
+            s/\s+[\_\-\/\.\w]+\:\d+/ FILE\:LINENO/g;
+            s/allocate \d+ bytes at/allocate <N> bytes at/g;
+            s/v\d+.\d+.\d+/vX.X.X/g;
+
+            if (m/\*\*\*\*\*\* TESTPOINT \*\*\*\*\*\*/) {
+                $testoutput = $_;
+            }
+            $testoutput += $_;
+
+            if (m/ TestPoint:\s*([^\*]+)/) {
+                $testfile = $1;
+            }
+            if (m/^---> TESTPOINT\s(\S+)/) {
+                print "\t$testfile- $1\n" if ($verbose || $1 eq "FAILED");
+                if ($1 eq "FAILED") {
+                    print $testoutput;
+                }
+            }
+
+            # Filter lines with malloc.  This is an artifact of memory testing
+            # with the Mac testbed
+
+            if ( !m/\*\*\*\smalloc/ ) {
+                print MODFILE ($_);
+                print MODFILE2 ($_) if $resetStderr;
+            }
+        }
+
+        # Close mod file
+        close(MODFILE);
+        close(MODFILE2) if $resetStderr;
+
+        # Close STDERR file
+        close(OUTFILE);
+
+        # Compare STDOUT capture with verified file
+        $exitValue = &compareStream("$verifiedDir/$testFile.stdout");
+
+        # Check exit value to determine if verified file doesn't exist
+        if ( $exitValue & 2 ) {
+
+            # STDOUT verified doesn't exist.  Search STDOUT capture
+            # for strings indicating error or failure
+            $exitValue |= &errorStrSearch("$testFile.stdout");
+        }
+
+        # Compare STDERR capture with verified file
+        $exitValue |= &compareStream("$verifiedDir/$testFile.stderr");
+
+        # Check exit value to determine if verified file doesn't exist
+        if ( $exitValue & 4 ) {
+
+            # STDERR verified doesn't exist.  Search STDERR capture
+            # for strings indicating error or failure
+            $exitValue |= &errorStrSearch("$testFile.stderr");
+        }
+   }
+    else {
+
+        # Since test driver doesn't exist or is not executable then display
+        # message to user.
+        print STDERR "\tNeed to specify an executable test file.\n";
+
+        # Exit value set to indicate test driver doesn't exist or not executable
+        $exitValue |= 32;
+    }
+}
+
+# Exit for the script with exit value
+# Ignore the first three bit flags in exitValue since there are not indicators
+# of a failed test
+if ( ( $exitValue >> 3 ) != 0 ) {
+    print STDERR "Test failed - return status = $exitValue\n\n";
+}
+else {
+    exit(0);
+}
+exit($exitValue);
+
+################################################################################
+#
+#  SUBROUTINE: errorStrSearch
+#
+#      Description:  This subroutine will search the file specified in its
+#                    parameter for error strings and if they do exists
+#                    the appropriate value will be returned.
+#
+#      Parameter(s): fileName - input file to search for strings
+#
+#      Return:   0  -  No error strings found
+#               64  -  Error strings found in STDOUT
+#              128  -  Error strings found in STDERR
+#
+###############################################################################
+
+sub errorStrSearch {
+    local ($fileName)  = @_;
+    local ($returnVal) = 0;
+
+    # Open the captured file
+    open( CAPT_FILE, "<temp/$fileName" );
+
+    # Scan through all the lines of the file searching for error strings
+    while (<CAPT_FILE>) {
+        if (   m/FAIL/i
+            || m/FAULT/i
+            || m/ERROR/i
+            || m/Not Found/i
+            || m/SIGNAL/i
+            || m/NO SUCH FILE/i
+            || m/\|E\|/i
+            || m/\|A\|/i )
+        {
+            print STDERR "\tFailed - File $fileName contains error strings.\n";
+            if ( $fileName =~ m/out/ ) {
+                $returnVal = 64;
+            }
+            elsif ( $fileName =~ m/err/ ) {
+                $returnVal = 128;
+            }
+            last;
+        }
+    }
+
+    # Close the capture file
+    close(CAPT_FILE);
+
+    # Return the return value
+    return ($returnVal);
+}
+
+################################################################################
+#
+#  SUBROUTINE: compareStream
+#
+#      Description:  This subroutine will compare the captured stream file with
+#                    a file in the verified directory if one exists.
+#
+#      Parameter(s): streamFile - input file to compare
+#
+#      Return:   0  -  Compare successful
+#                2  -  STDOUT verified file doesn't exist
+#                4  -  STDERR verified file doesn't exist
+#                8  -  STDOUT verified file doesn't compare
+#               16  -  STDERR verified file doesn't compare
+#
+###############################################################################
+
+sub compareStream {
+    local ($streamFile) = @_;
+    local ($returnVal)  = 0;
+    local ($tempFile)   = "";
+
+    # Check for existence of verified STD stream files
+    if ( !( -e $streamFile ) ) {
+
+        # Set exit value bit 1 to indicate proper failure
+        if ( $streamFile =~ /out$/ ) {
+            $returnVal |= 2;
+        }
+        elsif ( $streamFile =~ /err$/ ) {
+            $returnVal |= 4;
+        }
+    }
+    else {
+
+        # Verified STD stream file exists
+
+        # Create name of the temp file to compare
+        $tempFile = $streamFile;
+        $tempFile =~ s/$verifiedDir/temp/;
+        $tempFile = $tempFile . ".mod";
+
+        # Perform difference on the STD stream files
+        $diffstdout = `diff $streamFile $tempFile`;
+
+        # Check the return value of the difference
+        if ( $? != 0 ) {
+
+            # Difference of STD stream files failed
+
+            # Check for STDOUT in file name to convey appropirate return value
+            if ( $streamFile =~ /out$/ ) {
+
+                # Display message of the failure of difference to user
+                print STDERR "\tFailed - STDOUT differences\n";
+
+                # Exit value to indicate STDOUT did not compare
+                $returnVal |= 8;
+            }
+            elsif ( $streamFile =~ /err$/ ) {
+
+                # Display message of the failure of difference to user
+                print STDERR "\tFailed - STDERR differences\n";
+
+                # Exit value to indicate STDERR did not compare
+                $returnVal |= 16;
+            }
+        }
+    }
+
+    # Return the result of the compare
+    return ($returnVal);
+}
+
Index: /tags/ipp-1-X/bug123/psLib/test/sysUtils/.cvsignore
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/sysUtils/.cvsignore	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/sysUtils/.cvsignore	(revision 22331)
@@ -0,0 +1,16 @@
+.deps
+.libs
+Makefile
+Makefile.in
+temp
+tst_psAbort
+tst_psError
+tst_psLogMsg
+tst_psMemory
+tst_psStringCopy
+tst_psTrace
+tst_psTrace02_OUT
+tst_psTrace
+core*
+log.txt
+tst_psConfigure
Index: /tags/ipp-1-X/bug123/psLib/test/sysUtils/Makefile.am
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/sysUtils/Makefile.am	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/sysUtils/Makefile.am	(revision 22331)
@@ -0,0 +1,44 @@
+#Makefile for sysUtils functions of psLib
+#
+EXTRA_DIST = verified
+
+INCLUDES = \
+	-I$(top_srcdir)/src \
+	-I$(top_srcdir)/src/astronomy \
+	-I$(top_srcdir)/src/collections \
+	-I$(top_srcdir)/src/dataManip \
+	-I$(top_srcdir)/src/dataIO \
+	-I$(top_srcdir)/src/image \
+	-I$(top_srcdir)/src/sysUtils \
+	$(all_includes)
+
+AM_LDFLAGS = -L$(top_builddir)/src -lpslib $(PSLIB_LIBS)
+
+TESTS = \
+	tst_psAbort      \
+	tst_psMemory     \
+	tst_psError      \
+	tst_psLogMsg     \
+	tst_psStringCopy \
+	tst_psTrace      \
+	tst_psConfigure
+
+check_PROGRAMS =$(TESTS)
+
+check_DATA =
+
+TESTS_ENVIRONMENT = perl $(top_srcdir)/test/runTest -verified=$(srcdir)/verified 
+
+CLEANFILES = $(TESTS) $(check_DATA) temp/*
+
+tests: $(check_DATA) $(TESTS)
+
+tst_psAbort_SOURCES =  tst_psAbort.c
+tst_psMemory_SOURCES =  tst_psMemory.c
+tst_psError_SOURCES =  tst_psError.c
+tst_psLogMsg_SOURCES =  tst_psLogMsg.c
+tst_psStringCopy_SOURCES =  tst_psStringCopy.c
+tst_psTrace_SOURCES =  tst_psTrace.c
+tst_psConfigure_SOURCES =  tst_psConfigure.c
+
+test: check
Index: /tags/ipp-1-X/bug123/psLib/test/sysUtils/tst_psAbort.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/sysUtils/tst_psAbort.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/sysUtils/tst_psAbort.c	(revision 22331)
@@ -0,0 +1,76 @@
+/** @file  atst_psAbort_01.c
+ *
+ *  @brief Test driver for psAbort function
+ *
+ *  This test drivers contains the following test points for psAbort
+ *     1) Multiple type values in abort message
+ *
+ *  @author  Eric Van Alst, MHPCC
+ *
+ *  @version $Revision: 1.5 $  $Name: not supported by cvs2svn $
+ *  @date  $Date: 2005-04-07 20:27:42 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ */
+
+#include "pslib_strict.h"
+#include "psTest.h"
+
+static psS32 testAbort00(void);
+static psS32 testAbort01(void);
+static psS32 testAbort02(void);
+
+testDescription tests[] = {
+                              {testAbort00, 0, "Multiple type values in abort message", -6, false},
+                              {testAbort01, 1, "String values in abort message", -6, false},
+                              {testAbort02, 2, "Empty strings in abort message", -6, false},
+                              {NULL}
+                          };
+
+psS32 main( psS32 argc, char* argv[] )
+{
+    psLogSetLevel( PS_LOG_INFO );
+
+    return ( ! runTestSuite( stderr, "psAbort", tests, argc, argv ) );
+}
+
+static psS32 testAbort00(void)
+{
+    psS32   intval = 1;
+    psS64  longval = 2;
+    float floatval = 3.01;
+    char  charval = 'E';
+    char  *stringval = "E R R O R";
+
+    // Test point #1 Multiple type values placed in the error string
+    psAbort(__func__,
+            "ALL TYPES intval = %d longval = %lld floatval = %f charval = %c strval = %s",
+            intval, longval, floatval, charval, stringval );
+
+    // Program execution should have ended before this statement but if it
+    // does not return a zero since the expected return value of this test
+    // is a non-zero value
+    return 0;
+}
+
+static psS32 testAbort01(void)
+{
+    // Test point #2 String values in abort message
+    psAbort(PS_STRING(__LINE__), "NO_VALUES");
+
+    // Program execution should have ended before this statement but if it
+    // does not return a zero since the expected return value of this test
+    // is a non-zero value
+    return 0;
+}
+
+static psS32 testAbort02(void)
+{
+    // Test point #2 String values in abort message
+    psAbort("","");
+
+    // Program execution should have ended before this statement but if it
+    // does not return a zero since the expected return value of this test
+    // is a non-zero value
+    return 0;
+}
Index: /tags/ipp-1-X/bug123/psLib/test/sysUtils/tst_psConfigure.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/sysUtils/tst_psConfigure.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/sysUtils/tst_psConfigure.c	(revision 22331)
@@ -0,0 +1,52 @@
+/** @file  tst_psConfigure.c
+ *
+ *  @brief Test driver for psconfigure functions
+ *
+ *  This test driver contains the following test points for psConfigure
+ *  functions.
+ *    1) Return current psLib version
+ *
+ *  Return:   Number of test points which failed
+ *
+ *  @author  Ross Harman, MHPCC
+ *
+ *  @version $Revision: 1.3 $  $Name: not supported by cvs2svn $
+ *  @date  $Date: 2005-04-07 20:27:42 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ *
+ */
+
+#include "pslib_strict.h"
+#include "psTest.h"
+
+
+static psS32 psLibVersion00(void);
+
+
+testDescription tests[] = {
+                              {psLibVersion00, 0, "Return current psLib version", 0, false},
+                              {NULL}
+                          };
+
+
+psS32 main(psS32 argc, char* argv[])
+{
+    psLogSetLevel(PS_LOG_INFO);
+
+    return(!runTestSuite( stderr, "psConfigure", tests, argc, argv));
+}
+
+
+static psS32 psLibVersion00(void)
+{
+    char *stringVal = NULL;
+
+    stringVal = psLibVersion();
+    psLogMsg(__func__,PS_LOG_INFO,"Current psLib version is: %s", stringVal);
+    psFree(stringVal);
+
+
+    return 0;
+}
+
Index: /tags/ipp-1-X/bug123/psLib/test/sysUtils/tst_psError.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/sysUtils/tst_psError.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/sysUtils/tst_psError.c	(revision 22331)
@@ -0,0 +1,393 @@
+/** @file  tst_psError.c
+ *
+ *  @brief Test driver for psError function
+ *
+ *  This test driver contains the following test points for psError
+ *     testError00 - psError()                          (Testpoint #486)
+ *     testError01 - psErrorMsg(), psErrorStackPrint()  (Testpoint #725)
+ *     testError02 - psErrorStackPrintV()               (Testpoint #726)
+ *     testError03 - psErrorGet(), psErrorLast()        (Testpoint #727)
+ *     testError04 - psErrorClear()                     (Testpoint #728)
+ *     testError05 - psErrorCodeString()                (Testpoint #729)
+ *
+ *  @author  Eric Van Alst, MHPCC
+ *
+ *  @version $Revision: 1.18 $  $Name: not supported by cvs2svn $
+ *  @date  $Date: 2005-04-07 20:27:42 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "pslib_strict.h"
+#include "psTest.h"
+
+static psS32 testError00(void);
+static psS32 testError01(void);
+static psS32 testError02(void);
+static psS32 testError03(void);
+static psS32 testError04(void);
+static psS32 testError05(void);
+static psS32 testErrorRegister(void);
+
+// Function used in testError02 to verify the psErrorStackPrintV function
+static void myErrorStackPrint(FILE *fd,
+                              const char *fmt,
+                              ...)
+{
+    va_list ap;
+
+    // Test whether psErrorStackPrintV() accept a va_list for output variables
+    va_start(ap, fmt);
+    psErrorStackPrintV(fd, fmt, ap);
+    va_end(ap);
+}
+
+testDescription tests[] = {
+                              {testError00, 486, "psError()", 0, false},
+                              {testError01, 725, "psErrorMsg(),psErrorStackPrint()", 0, false},
+                              {testError02, 726, "psErrorStackPrintV()", 0, false},
+                              {testError03, 727, "psErrorGet(),psErrorLast()", 0, false},
+                              {testError04, 728, "psErrorClear()", 0, false},
+                              {testError05, 729, "psErrorCodeString()", 0, false},
+                              {testErrorRegister, 751, "psErrorRegister()", 0, false},
+                              {NULL}
+                          };
+
+psS32 main( psS32 argc, char* argv[] )
+{
+    psLogSetLevel( PS_LOG_INFO );
+
+    return ( !runTestSuite(stderr, "psError", tests, argc, argv) );
+}
+
+static psS32 testError05(void)
+{
+    psErrorCode code = PS_ERR_BAD_PARAMETER_VALUE;
+
+    // Verify the return value of psErrorCodeString
+    psLogMsg("tst_psError05", PS_LOG_INFO, psErrorCodeString(code));
+
+    // Verify the return value of psErrorCodeString if code is negative
+    if( psErrorCodeString(-1) != NULL) {
+        psLogMsg("tst_psError05", PS_LOG_INFO, "Failed error string with neg. code");
+        return 40;
+    }
+
+    return 0;
+}
+
+static psS32 testError04(void)
+{
+    psErrorCode code = PS_ERR_BAD_PARAMETER_VALUE;
+    psErr *last = NULL;
+    psErr *lastAfterClear = NULL;
+
+    // With an attemp error stack call psErrorClear
+    psErrorClear();
+
+    // Get the last error message and verify PS_ERR_NONE (empty stack)
+    lastAfterClear = psErrorLast();
+    if(lastAfterClear->code != PS_ERR_NONE) {
+        psLogMsg("tst_psError05", PS_LOG_ERROR, "psErrorLast did not return expected.");
+        return 30;
+    }
+    psFree(lastAfterClear);
+
+    // Generate three error messages to have messages on error stack
+    if (psError(code, true, "Error code = %d", code) !=  code) {
+        psLogMsg("tst_psError04", PS_LOG_ERROR, "Failed return value verify.");
+        return 31;
+    }
+    if (psError((code+1), false, "Error code = %d", (code+1)) != (code+1)) {
+        psLogMsg("tst_psError04", PS_LOG_ERROR, "Failed return value verify.");
+        return 32;
+    }
+    if (psError((code+2), false, "Error code = %d", (code+2)) != (code+2)) {
+        psLogMsg("tst_psError04", PS_LOG_ERROR, "Failed return value verify.");
+        return 33;
+    }
+
+    // Get the last error message and verify it has the expected code
+    last = psErrorLast();
+    if(last->code != (code+2)) {
+        psLogMsg("tst_psError04", PS_LOG_ERROR, "psErrorLast did not return expected.");
+        return 34;
+    }
+    psFree(last);
+
+    // Clear the error stack
+    psErrorClear();
+
+    // Get the last error message after clear and verify is has PS_ERR_NONE code
+    lastAfterClear = psErrorLast();
+    if(lastAfterClear->code != PS_ERR_NONE) {
+        psLogMsg("tst_psError05", PS_LOG_ERROR, "psErrorLast did not return expected.");
+        return 35;
+    }
+    psFree(lastAfterClear);
+
+    return 0;
+}
+
+static psS32 testError03(void)
+{
+    psErrorCode code = PS_ERR_BAD_PARAMETER_VALUE;
+    psErr *last = NULL;
+    psErr *getErr = NULL;
+
+    // Attempt to get last error message with an empty stack verify psErr with code PS_ERR_NONE
+    last = psErrorLast();
+    if(last->code != PS_ERR_NONE) {
+        psLogMsg("tst_psError03", PS_LOG_ERROR, "psErrorLast did return PS_ERR_NONE for empty stack");
+        return 20;
+    }
+    psFree(last);
+
+    // Attempt to get specific error message with empty stack verify psErr with code PS_ERR_NONE
+    getErr= psErrorGet(2);
+    if(getErr->code != PS_ERR_NONE) {
+        psLogMsg("tst_psError03", PS_LOG_ERROR, "psErrorGet did not return PS_ERR_NONE  for empty stack");
+        return 21;
+    }
+    psFree(getErr);
+
+    // Attempt to get error message with invalid index and an empty stack
+    getErr= psErrorGet(-1);
+    if(getErr->code != PS_ERR_NONE) {
+        psLogMsg("tst_psError03", PS_LOG_ERROR, "psErrorGet with invalid index/empty stack");
+        return 22;
+    }
+    psFree(getErr);
+
+    // Generate three error messages
+    if (psError(code, true, "Error code = %d", code) !=  code) {
+        psLogMsg("tst_psError03", PS_LOG_ERROR, "Failed return value verify.");
+        return 23;
+    }
+    if (psError((code+1), false, "Error code = %d", (code+1)) != (code+1)) {
+        psLogMsg("tst_psError03", PS_LOG_ERROR, "Failed return value verify.");
+        return 24;
+    }
+    if (psError((code+2), false, "Error code = %d", (code+2)) != (code+2)) {
+        psLogMsg("tst_psError03", PS_LOG_ERROR, "Failed return value verify.");
+        return 25;
+    }
+
+    last = psErrorLast();
+    getErr= psErrorGet(0);
+
+    // Check that last and get with 0 index are equal
+    if(last != getErr) {
+        psLogMsg("tst_psError03", PS_LOG_ERROR, "psErrorGet(0) not equal to psErrorLast");
+        return 26;
+    }
+    psFree(last);
+
+    // Verify the last error message was returned
+    if ( getErr->code != (code+2) ) {
+        psLogMsg("tst_psError03", PS_LOG_ERROR, "psErrorLast() did not retrieve last error");
+        return 27;
+    }
+    psFree(getErr);
+
+    // Verify the middle error message can be retrieved
+    getErr= psErrorGet(1);
+    if ( getErr->code != (code+1)) {
+        psLogMsg("tst_psError03", PS_LOG_ERROR, "psErrorGet() did not retrieve proper error");
+        return 28;
+    }
+    psFree(getErr);
+
+    // Verify the psErrorGet returns NULL if an invalid index is given
+    getErr= psErrorGet(-1);
+    if ( getErr->code != PS_ERR_NONE ) {
+        psLogMsg("tst_psError03", PS_LOG_ERROR, "psErrorGet() did not return PS_ERR_NONE w/ invalid arg");
+        return 29;
+    }
+    psFree(getErr);
+
+    return 0;
+}
+
+static psS32 testError02(void)
+{
+    psErrorCode code = PS_ERR_BAD_PARAMETER_VALUE;
+
+    // Generate error message and verify return value
+    if (psError(code, true, "Error code = %d", code) != code ) {
+        psLogMsg("tst_psError02", PS_LOG_ERROR, "Failed return value verify.");
+        return 10;
+    }
+    myErrorStackPrint(stderr,"ERROR STACK PRINT Test%dA",2);
+
+    return 0;
+}
+
+static psS32 testError01(void)
+{
+    psErrorCode code=PS_ERR_BAD_PARAMETER_VALUE;
+
+    // Verify the return value of psErrorMsg is the psErrorCode passed
+    if ( psError(code, true, "Error code = %d", code) != code) {
+        psLogMsg("tst_psError01", PS_LOG_ERROR, "Failed return value verify.");
+        return 1;
+    }
+    psErrorStackPrint(stderr,"ERROR STACK PRINT Test1A");
+
+    // test1B empty string in for name argument
+    if ( psError(code+1, true, "Error code = %d", code+1) != code+1) {
+        psLogMsg("tst_psError01", PS_LOG_ERROR, "Failed return with empty string.");
+        return 2;
+    }
+    psErrorStackPrint(stderr,"ERROR STACK PRINT Test1B");
+
+    // test1D undefined code
+    if ( psError(-1, true, "Error code = %d", -1) != -1) {
+        psLogMsg("test_psError01", PS_LOG_ERROR, "Failed return with undefined code.");
+        return 4;
+    }
+    psErrorStackPrint(stderr,"ERROR STACK PRINT Test1D");
+
+    // test1E set psErrorMsg argument to false
+    if( psError(code, false, "Error code = %d", code) != code) {
+        psLogMsg("test_psError01", PS_LOG_ERROR, "Failed return with false new arg.");
+        return 5;
+    }
+    psErrorStackPrint(stderr,"ERROR STACK PRINT Test1E");
+
+    // test1F psErrorMsg with a error code less then PS_ERR_BASE(256)
+    if( psError(9, true, "Errno code = %d", 9) != 9) {
+        psLogMsg("test_psError01", PS_LOG_ERROR, "Failed return with errno code.");
+        return 6;
+    }
+    psErrorStackPrint(stderr,"ERROR STACK PRINT Test1F");
+
+    return 0;
+}
+
+static psS32 testError00(void)
+{
+
+    psS32  intval=1;
+    psS64 longval = 2;
+    float floatval = 3.01;
+    char  charval = 'E';
+    char *stringval = "E R R O R";
+
+    // Test point #1 Multiple type values placed in the error string
+    psError(PS_ERR_UNKNOWN, true,
+            "ALL TYPES intval = %d longval = %lld floatval = %f charval = %c strval = %s",
+            intval,longval,floatval,charval,stringval);
+
+    // Test point #2 String values in error message
+    psError(PS_ERR_UNKNOWN, true, "NO VALUES");
+
+    // Test point #3 Empty strings in error message
+    psError(PS_ERR_UNKNOWN, true, "");
+
+    return 0;
+}
+
+static psS32 testErrorRegister(void)
+{
+
+    psS32 numErr = 4;
+    psErrorDescription errDesc[] = { {PS_ERR_N_ERR_CLASSES+1,"first"},
+                                     {PS_ERR_N_ERR_CLASSES+2,"second"},
+                                     {PS_ERR_N_ERR_CLASSES+3,"third"},
+                                     {PS_ERR_N_ERR_CLASSES+4,"fourth"} };
+    /*
+        1. invoke psErrorRegister with a n>1 array of psErrorDescriptions. Verify that:
+            a. Each error description given is retrievable with psErrorCodeString.
+    */
+    psErrorRegister(errDesc,numErr);
+
+    for (psS32 i = 0; i < numErr; i++) {
+        const char* desc = psErrorCodeString(PS_ERR_N_ERR_CLASSES+1+i);
+        if (desc == NULL) {
+            psLogMsg(__func__,PS_LOG_ERROR,
+                     "psErrorCode didn't find registered error code.");
+            return 1+i*10;
+        }
+        if (strcmp(desc,errDesc[i].description) != 0) {
+            psLogMsg(__func__,PS_LOG_ERROR,
+                     "psErrorCode didn't return the proper description.  Got '%s', expected '%s'.",
+                     desc,errDesc[i].description);
+            return 2+i*10;
+        }
+    }
+
+    /*
+        2. invoke psErrorCodeString with a static/builtin psLib error code. Verify:
+            a. the result is correct.
+    */
+    const char* desc = psErrorCodeString(PS_ERR_N_ERR_CLASSES);
+    if (desc == NULL) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "psErrorCode didn't find static error code.");
+        return 40;
+    }
+    if (strcmp(desc,"error classes end marker") != 0) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "psErrorCode didn't return the proper description.  Got '%s', expected '%s'.",
+                 desc,"error classes end marker");
+        return 41;
+    }
+
+    desc = psErrorCodeString(PS_ERR_NONE);
+    if (desc == NULL) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "psErrorCode didn't find static error code.");
+        return 42;
+    }
+    if (strcmp(desc,"not an error") != 0) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "psErrorCode didn't return the proper description.  Got '%s', expected '%s'.",
+                 desc,"not an error");
+        return 43;
+    }
+
+    /*
+        3. invoke psErrorCodeString with an invalid code. Verify a NULL is returned.
+    */
+    desc = psErrorCodeString(PS_ERR_N_ERR_CLASSES+numErr+1);
+    if (desc != NULL) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "psErrorCode didn't return a NULL with a bogus input code.");
+        return 44;
+    }
+
+    /*
+        4. invoke psErrorRegister with a NULL psErrorDescription. Verify that:
+            a. the execution does not cease.
+            b. an appropriate error is generated.
+    */
+    psLogMsg(__func__,PS_LOG_INFO,"Following should be an error.");
+    psErrorClear();
+    psErrorRegister(NULL,1);
+    psErr* err = psErrorLast();
+    if (err->code != PS_ERR_BAD_PARAMETER_NULL) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "psErrorCode didn't generate proper error code for NULL input.");
+        return 45;
+    }
+    psFree(err);
+
+    /*
+        5. invoke psErrorRegister with nerror=0. Verify that no error occurs.
+    */
+    psErrorClear();
+    psErrorRegister(errDesc,0);
+    err = psErrorLast();
+    if (err->code != PS_ERR_NONE) {
+        psLogMsg(__func__,PS_LOG_ERROR,
+                 "psErrorCode generated an error for nErrors = 0.");
+        return 46;
+    }
+    psFree(err);
+    return 0;
+}
Index: /tags/ipp-1-X/bug123/psLib/test/sysUtils/tst_psLogMsg.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/sysUtils/tst_psLogMsg.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/sysUtils/tst_psLogMsg.c	(revision 22331)
@@ -0,0 +1,219 @@
+/*****************************************************************************
+    This code will test whether trace levels can be set successfully.
+    This code will test whether trace messages can be displayed with printf
+    style string.
+ *****************************************************************************/
+#include <stdio.h>
+#include "pslib_strict.h"
+#include "psTest.h"
+
+static psS32 testLogMsg00();
+static psS32 testLogMsg01();
+static psS32 testLogMsg02();
+static psS32 testLogMsg03();
+static psS32 testLogMsg04();
+static psS32 testLogMsg05();
+
+testDescription tests[] = {
+                              {
+                                  testLogMsg00, 0, "default log levels, printf-style strings", 0, false
+                              },
+                              {
+                                  testLogMsg01, 1, "default log levels, psVLogMsg()", 0, false
+                              },
+                              {
+                                  testLogMsg02, 2, "psLogSetLevel()", 0, false
+                              },
+                              {
+                                  testLogMsg03, 3, "psLogSetFormat()", 0, false
+                              },
+                              {
+                                  testLogMsg04, 4, "Output Format", 0, false
+                              },
+                              {
+                                  testLogMsg05, 5, "psLogSetDestination()", 0, false
+                              },
+                              {
+                                  NULL
+                              }
+                          };
+
+psS32 main( psS32 argc, char* argv[] )
+{
+    psLogSetLevel( PS_LOG_INFO );
+
+    return ( ! runTestSuite( stderr, "psLogMsg", tests, argc, argv ) );
+}
+
+
+static void myLogMsg(const char *name,
+                     psS32 level,
+                     const char *fmt,
+                     ...)
+{
+    va_list ap;
+
+    // Test whether psLogMsgV() accept a va_list for output variables.
+    va_start(ap, fmt);
+    psLogMsgV(name, level, fmt, ap);
+    va_end(ap);
+}
+
+static psS32 testLogMsg00()
+{
+    psS32 i = 0;
+
+    // Send a log messages for levels 0:9.  Only the first four messages
+    // should actually be displayed.
+    for (i=0;i<10;i++) {
+        psLogMsg(__func__, i, "Hello World!  My level is %d %f %s\n", i,
+                 (float) i, "beep beep");
+    }
+
+    return 0;
+}
+
+static psS32 testLogMsg01()
+{
+    psS32 i = 0;
+
+    // Send a log messages for levels 0:9.  Only the first four messages
+    // should actually be displayed.
+    for (i=0;i<10;i++) {
+        myLogMsg(__func__, i, "Hello World!  My level is %d %f %s\n", i,
+                 (float) i, "beep beep");
+    }
+
+    return 0;
+}
+
+static psS32 testLogMsg02()
+{
+
+    psLogSetLevel(9);
+    // Send a log messages for levels 0:9.
+    for (psS32 i=0;i<10;i++) {
+        psLogMsg(__func__, i, "Hello World!  My level is %d\n", i);
+    }
+
+    psLogSetLevel(5);
+    psLogMsg(__func__, 6, "This should not be displayed (level %d)\n", 6);
+    psLogSetLevel(4);
+    psLogMsg(__func__, 4, "This should  be displayed (level %d)\n", 4);
+
+    return 0;
+}
+
+static psS32 testLogMsg03()
+{
+    psS32 i;
+
+    fprintf(stderr,"------------- psLogSetFormat() -------------\n");
+    psLogSetFormat("");
+    for (i=0;i<10;i++) {
+        psLogMsg(__func__, i, "Hello World!  My level is %d\n", i);
+    }
+
+    fprintf(stderr,"------------- psLogSetFormat(NULL) -------------\n");
+    psLogSetFormat(NULL);
+    for (i=0;i<10;i++) {
+        psLogMsg(__func__, i, "Hello World!  My level is %d\n", i);
+    }
+
+    fprintf(stderr,"------------- psLogSetFormat(T) -------------\n");
+    psLogSetFormat("T");
+    for (i=0;i<10;i++) {
+        psLogMsg(__func__, i, "Hello World!  My level is %d\n", i);
+    }
+
+    fprintf(stderr,"------------- psLogSetFormat(H) -------------\n");
+    psLogSetFormat("H");
+    for (i=0;i<10;i++) {
+        psLogMsg(__func__, i, "Hello World!  My level is %d\n", i);
+    }
+
+    fprintf(stderr,"------------- psLogSetFormat(L) -------------\n");
+    psLogSetFormat("L");
+    for (i=0;i<10;i++) {
+        psLogMsg(__func__, i, "Hello World!  My level is %d\n", i);
+    }
+
+    fprintf(stderr,"------------- psLogSetFormat(N) -------------\n");
+    psLogSetFormat("N");
+    for (i=0;i<10;i++) {
+        psLogMsg(__func__, i, "Hello World!  My level is %d\n", i);
+    }
+
+    fprintf(stderr,"------------- psLogSetFormat(M) -------------\n");
+    psLogSetFormat("M");
+    for (i=0;i<10;i++) {
+        psLogMsg(__func__, i, "Hello World!  My level is %d\n", i);
+    }
+
+    fprintf(stderr,"------------- psLogSetFormat(THLNM) -------------\n");
+    psLogSetFormat("THLNM");
+    for (i=0;i<10;i++) {
+        psLogMsg(__func__, i, "Hello World!  My level is %d\n", i);
+    }
+
+    return 0;
+}
+
+
+psS32 testLogMsg04()
+{
+    psLogMsg("Under 15 chars", 0, "Hello World!\n");
+    psLogMsg("This string is more than 15 chars", 0, "Hello World!\n");
+    psLogMsg(__func__, 0, "Line #1\n");
+    psLogMsg(__func__, 0, "Line #2\n");
+    psLogMsg(__func__, 0, "Line #3");
+    psLogMsg(__func__, 0, "Line #4");
+
+    return 0;
+}
+
+psS32 testLogMsg05()
+{
+    psS32 i = 0;
+    FILE* file;
+    char line[256];
+
+    printf("--------------- psLogSetDestination(PS_LOG_NONE) ----------------\n");
+    psLogSetDestination("none");
+    for (i=0;i<10;i++) {
+        psLogMsg(__func__, i, "Hello World!  My level is %d\n", i);
+    }
+
+    printf("------------- psLogSetDestination(PS_LOG_TO_STDERR) -------------\n");
+    psLogSetDestination("dest:stderr");
+    for (i=0;i<10;i++) {
+        psLogMsg(__func__, i, "Hello World!  My level is %d\n", i);
+    }
+
+    printf("------------- psLogSetDestination(PS_LOG_TO_STDOUT) -------------\n");
+    psLogSetDestination("dest:stdout");
+    for (i=0;i<10;i++) {
+        psLogMsg(__func__, i, "Hello World!  My level is %d\n", i);
+    }
+    printf("--------------- psLogSetDestination(""file:log.txt"") ---------------\n");
+    psLogSetDestination("file:log.txt");
+    for (i=0;i<10;i++) {
+        psLogMsg(__func__, i, "Hello World!  My level is %d\n", i);
+    }
+
+    psLogSetDestination("none");
+    printf("--------------------- The Contents of log.txt -------------------\n");
+    file = fopen("log.txt","r");
+    while ( fgets(line,256,file) != NULL ) {
+        printf("%s",line);
+    }
+    fclose(file);
+
+    printf("--------------- psLogSetDestination(""file:/eva/log.txt"") ----------\n");
+    psLogSetDestination("file:/eva/log.txt");
+    for ( i=0;i<10;i++) {
+        psLogMsg(__func__, i, "Hello World! My level is %d\n", i);
+    }
+
+    return 0;
+}
Index: /tags/ipp-1-X/bug123/psLib/test/sysUtils/tst_psMemory.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/sysUtils/tst_psMemory.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/sysUtils/tst_psMemory.c	(revision 22331)
@@ -0,0 +1,534 @@
+/** @file  tst_psMemory.c
+*
+*  @brief Contains the tests for psMemory.[ch]
+*
+*
+*  @author Robert DeSonia, MHPCC
+*
+*  @version $Revision: 1.32 $ $Name: not supported by cvs2svn $
+*  @date $Date: 2005-04-07 20:27:42 $
+*
+*  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+*/
+
+#include <unistd.h>
+#include <sys/wait.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <limits.h>
+#include <stdlib.h>
+
+
+#include "psTest.h"
+#include "pslib.h" // need to allow malloc for callback use
+
+static psS32 TPFreeReferencedMemory( void );
+static psS32 TPOutOfMemory( void );
+static psS32 TPReallocOutOfMemory( void );
+static psPtr TPOutOfMemoryExhaustedCallback( size_t size );
+static psS32 TPCheckBufferPositive( void );
+static psS32 TPrealloc( void );
+static psS32 TPallocCallback( void );
+static psMemoryId memAllocateCallback( const psMemBlock *ptr );
+static psMemoryId memFreeCallback( const psMemBlock *ptr );
+static psS32 TPcheckLeaks( void );
+static psS32 TPmemCorruption( void );
+static psS32 TPmultipleFree( void );
+void memProblemCallback( const psMemBlock *ptr, const char *file, psS32 lineno );
+
+static psS32 problemCallbackCalled = 0;
+static psS32 allocCallbackCalled = 0;
+static psS32 freeCallbackCalled = 0;
+static psS32 exhaustedCallbackCalled = 0;
+
+testDescription tests[] = {
+                              {TPCheckBufferPositive, 449, "checkBufferPositive", 0, false},
+                              {TPOutOfMemory, 450, "outOfMemory", -6, false},
+                              {TPReallocOutOfMemory, 562, "reallocOutOfMemory", -6, false},
+                              {TPrealloc, 451, "psRealloc", 0, false},
+                              {TPallocCallback, 452, "allocCallback", 0, false},
+                              {TPallocCallback, 453, "allocCallback2", 0, true},
+                              {TPcheckLeaks, 454, "checkLeaks", 0, false},
+                              {TPmemCorruption, 455, "psMemCorruption", 0, false},
+                              {TPFreeReferencedMemory, 456, "freeReferencedMemory", 0, false},
+                              {TPmultipleFree, 699, "multipleFree", -6, false},
+                              {NULL}
+                          };
+
+psS32 main(psS32 argc, char* argv[])
+{
+    psLogSetLevel( PS_LOG_INFO );
+
+    return ( ! runTestSuite( stderr, "psMemory", tests, argc, argv ) );
+}
+
+// Testpoint #449, psAlloc shall allocate memory blocks writeable by caller.
+psS32 TPCheckBufferPositive( void )
+{
+    psS32 * mem;
+    const psS32 size = 100;
+    psS32 failed = 0;
+
+    psLogMsg( __func__, PS_LOG_INFO, "psAlloc shall allocate memory blocks writeable by caller.\n" );
+
+    mem = ( psS32* ) psAlloc( size * sizeof( psS32 ) );
+    if ( mem == NULL ) {
+        psError(PS_ERR_UNKNOWN, true, "psAlloc returned a NULL value in %s!", __func__ );
+        return 1;
+    }
+
+    for ( psS32 index = 0;index < size;index++ ) {
+        mem[ index ] = index;
+    }
+
+    for ( psS32 index = 0;index < size;index++ ) {
+        if ( mem[ index ] != index ) {
+            failed++;
+        }
+    }
+
+    psFree( mem );
+
+    return failed;
+}
+
+psS32 TPFreeReferencedMemory( void )
+{
+    // create memory
+    psS32 * mem;
+    psS32 ref = 0;
+
+    psLogMsg( __func__, PS_LOG_INFO, "memory reference count shall be incrementable/decrementable" );
+
+    mem = ( psS32* ) psAlloc( 100 * sizeof( psS32 ) );
+
+    ref = psMemGetRefCounter( mem );
+    if ( ref != 1 ) {
+        psError(PS_ERR_UNKNOWN, true, "Expected to buffer reference count to be initially 1, but it was %d.", ref );
+        return 1;
+    }
+
+    psMemIncrRefCounter( mem );
+    psMemIncrRefCounter( mem );
+    psMemIncrRefCounter( mem );
+
+    ref = psMemGetRefCounter( mem );
+    if ( ref != 4 ) {
+        psError(PS_ERR_UNKNOWN, true, "Expected to find buffer reference count to be 4, but it was %d.", ref );
+        return 1;
+    }
+
+    psMemDecrRefCounter( mem );
+    psMemDecrRefCounter( mem );
+
+    ref = psMemGetRefCounter( mem );
+    if ( ref != 2 ) {
+        psError(PS_ERR_UNKNOWN, true, "Expected to find buffer reference count to be 2, but it was %d.", ref );
+        return 1;
+    }
+
+    psLogMsg( __func__, PS_LOG_INFO, "psFree shall be just decrement a multiple refererenced pointer." );
+
+    psFree( mem );
+
+    ref = psMemGetRefCounter( mem );
+    if ( ref != 1 ) {
+        psError(PS_ERR_UNKNOWN, true, "Expected to find buffer reference count to be 1, but it was %d.", ref );
+        return 1;
+    }
+
+    psFree( mem );
+
+    return 0;
+}
+
+// Bug/Task #562 regression test.  Upon requesting more memory than is available, psRealloc shall call
+// the psMemExhaustedCallback.
+psS32 TPReallocOutOfMemory( void )
+{
+    psS32 * mem[ 100 ];
+    psMemExhaustedCallback cb;
+
+    for ( psS32 lcv = 0; lcv < 100; lcv++ ) {
+        mem[ lcv ] = NULL;
+    }
+
+    psLogMsg( __func__, PS_LOG_INFO, "Upon requesting more memory than is available, psRealloc shall call "
+              "the psMemExhaustedCallback.\n" );
+
+    exhaustedCallbackCalled = 0;
+
+    cb = psMemExhaustedCallbackSet( TPOutOfMemoryExhaustedCallback );
+
+    for ( psS32 lcv = 0; lcv < 100; lcv++ ) {
+        mem[ lcv ] = ( psS32* ) psAlloc( 10 );
+    }
+
+    for ( psS32 lcv = 0; lcv < 100; lcv++ ) {
+        mem[ lcv ] = ( psS32* ) psRealloc( mem[ lcv ], SIZE_MAX/2 - 1000 );
+    }
+
+    psMemExhaustedCallbackSet( cb );
+
+    if ( exhaustedCallbackCalled == 0 ) {
+        psError(PS_ERR_UNKNOWN,true, "Called psRealloc with HUGE memory requirement and survived in %s!", __func__ );
+        return 1;
+    }
+
+    for ( psS32 lcv = 0; lcv < 100; lcv++ ) {
+        psFree( mem[ lcv ] );
+    }
+
+    return 0;
+}
+// Testpoint #450,  Upon requesting more memory than is available, psalloc shall call
+// the psMemExhaustedCallback.
+psS32 TPOutOfMemory( void )
+{
+    psS32 * mem[ 100 ];
+    psMemExhaustedCallback cb;
+
+    for ( psS32 lcv = 0; lcv < 100; lcv++ ) {
+        mem[ lcv ] = NULL;
+    }
+
+    psLogMsg( __func__, PS_LOG_INFO, "Upon requesting more memory than is available, psalloc shall call "
+              "the psMemExhaustedCallback.\n" );
+
+    exhaustedCallbackCalled = 0;
+
+    cb = psMemExhaustedCallbackSet( TPOutOfMemoryExhaustedCallback );
+
+    for ( psS32 lcv = 0; lcv < 100; lcv++ ) {
+        mem[ lcv ] = ( psS32* ) psAlloc( SIZE_MAX/2 - 1000 );
+    }
+
+    psMemExhaustedCallbackSet( cb );
+
+    if ( exhaustedCallbackCalled == 0 ) {
+        psError(PS_ERR_UNKNOWN,true, "Called psAlloc with HUGE memory requirement and survived in %s!", __func__ );
+        return 1;
+    }
+
+    for ( psS32 lcv = 0; lcv < 100; lcv++ ) {
+        psFree( mem[ lcv ] );
+    }
+
+    return 0;
+}
+
+// Testpoint #451,  psRealloc shall increase/decrease memory buffer while preserving contents
+psS32 TPrealloc( void )
+{
+    psS32 * mem1;
+    psS32* mem2;
+    psS32* mem3;
+    const psS32 initialSize = 100;
+
+    psLogMsg( __func__, PS_LOG_INFO, "psRealloc shall increase/decrease memory buffer while "
+              "preserving contents" );
+
+    // allocate buffer with known values.
+    mem1 = ( psS32* ) psAlloc( initialSize * sizeof( psS32 ) );
+    mem2 = ( psS32* ) psAlloc( initialSize * sizeof( psS32 ) );
+    mem3 = ( psS32* ) psAlloc( initialSize * sizeof( psS32 ) );
+    for ( psS32 lcv = 0;lcv < initialSize;lcv++ ) {
+        mem1[ lcv ] = mem2[ lcv ] = mem3[ lcv ] = lcv;
+    }
+
+    psMemCheckCorruption( 1 );
+    psLogMsg( __func__, PS_LOG_INFO, "Expanding memory buffer." );
+
+    // realloc to 2x
+    mem1 = ( psS32* ) psRealloc( mem1, 2 * initialSize * sizeof( psS32 ) );
+    mem2 = ( psS32* ) psRealloc( mem2, 2 * initialSize * sizeof( psS32 ) );
+    mem3 = ( psS32* ) psRealloc( mem3, 2 * initialSize * sizeof( psS32 ) );
+
+    // check values of initial block
+    for ( psS32 i = 0;i < initialSize;i++ ) {
+        if ( mem1[ i ] != i || mem2[ i ] != i || mem3[ i ] != i ) {
+            psError(PS_ERR_UNKNOWN,true, "Realloc didn't preserve the contents with expanding buffer in %s.",
+                    __func__ );
+            break;
+        }
+    }
+
+    psMemCheckCorruption( 1 );
+    psLogMsg( __func__, PS_LOG_INFO, "Shrinking memory buffer." );
+
+    // realloc to 1/2 initial value.
+    mem1 = ( psS32* ) psRealloc( mem1, ( initialSize / 2 ) * sizeof( psS32 ) );
+    mem2 = ( psS32* ) psRealloc( mem2, ( initialSize / 2 ) * sizeof( psS32 ) );
+    mem3 = ( psS32* ) psRealloc( mem3, ( initialSize / 2 ) * sizeof( psS32 ) );
+
+    // check values of initial block
+    for ( psS32 i = 0;i < initialSize / 2;i++ ) {
+        if ( mem1[ i ] != i || mem2[ i ] != i || mem3[ i ] != i ) {
+            psError(PS_ERR_UNKNOWN,true, "Realloc didn't preserve the contents with shrinking buffer in %s.",
+                    __func__ );
+            break;
+        }
+    }
+
+    psFree( mem1 );
+    psFree( mem2 );
+    psFree( mem3 );
+
+    return 0;
+}
+
+psS32 TPallocCallback( void )
+{
+    psS32 * mem1;
+    psS32* mem2;
+    psS32* mem3;
+    psS32 currentId = psMemGetId();
+    const psS32 initialSize = 100;
+    psS32 mark;
+
+    allocCallbackCalled = 0;
+    freeCallbackCalled = 0;
+    psMemAllocateCallbackSet( memAllocateCallback );
+    psMemFreeCallbackSet( memFreeCallback );
+
+    psMemAllocateCallbackSetID( currentId + 1 );
+    psMemFreeCallbackSetID( currentId + 1 );
+
+    psLogMsg( __func__, PS_LOG_INFO, "call to psAlloc/psRealloc shall generate a callback if specified "
+              "memory ID is allocated." );
+
+    // allocate buffer with known values.
+    mem1 = ( psS32* ) psAlloc( initialSize * sizeof( psS32 ) );
+    mem2 = ( psS32* ) psAlloc( initialSize * sizeof( psS32 ) );
+    mem3 = ( psS32* ) psAlloc( initialSize * sizeof( psS32 ) );
+
+    psFree( mem1 );
+    psFree( mem2 );
+    psFree( mem3 );
+
+    if ( allocCallbackCalled != 2 || freeCallbackCalled != 2 ) {
+        psError(PS_ERR_UNKNOWN,true, "alloc/free callbacks were not called the proper number of times in %s",
+                __func__ );
+        return 1;
+    }
+
+    allocCallbackCalled = 0;
+    freeCallbackCalled = 0;
+
+    mark = psMemGetId();
+
+    mem1 = ( psS32* ) psAlloc( initialSize * sizeof( psS32 ) );
+
+    psMemAllocateCallbackSetID( mark );
+
+    mem1 = ( psS32* ) psRealloc( mem1, initialSize * 2 * sizeof( psS32 ) );
+
+    psFree( mem1 );
+
+    if ( allocCallbackCalled != 2 ) {
+        psError(PS_ERR_UNKNOWN,true, "realloc callbacks were not called the proper number of times in %s",
+                __func__ );
+        return 1;
+    }
+
+    return 0;
+
+}
+
+psS32 TPcheckLeaks( void )
+{
+    const psS32 numBuffers = 5;
+    psS32* buffers[ 5 ];
+    psS32 lcv;
+    psS32 currentId = psMemGetId();
+    psMemBlock** blks;
+    psS32 nLeaks = 0;
+    psS32 lineMark = 0;
+
+    psLogMsg( __func__, PS_LOG_INFO, "psMemCheckLeaks shall return the number of blocks above an ID "
+              "that are still allocated" );
+
+    for ( lcv = 0;lcv < numBuffers;lcv++ ) {
+        lineMark = __LINE__ + 1;
+        buffers[ lcv ] = psAlloc( sizeof( psS32 ) );
+    }
+
+    for ( lcv = 1;lcv < numBuffers;lcv++ ) {
+        psFree( buffers[ lcv ] );
+    }
+
+    psLogMsg( __func__, PS_LOG_INFO, "following psMemCheckLeaks call should produce one instance." );
+
+    nLeaks = psMemCheckLeaks( currentId, &blks, stderr, false );
+
+    if ( nLeaks != 1 ) {
+        psError(PS_ERR_UNKNOWN,true, "psMemCheckLeaks should have found 1 leak, but found %d in %s.", nLeaks, __func__ );
+        return 1;
+    }
+
+    if ( blks[ 0 ] ->lineno != lineMark ) {
+        psError(PS_ERR_UNKNOWN,true, "psMemCheckLeaks found a leak other than the expected one (line %d vs %d) in %s.",
+                lineMark, blks[ 0 ] ->lineno, __func__ );
+        return 1;
+    }
+
+    psFree( buffers[ 0 ] );
+    psFree( blks );
+
+    psLogMsg( __func__, PS_LOG_INFO, "Testing psMemCheckLeaks again with a different leak location" );
+    psMemCheckLeaks(currentId,NULL,stderr, false);
+
+    for ( lcv = 0;lcv < numBuffers;lcv++ ) {
+        lineMark = __LINE__ + 1;
+        buffers[ lcv ] = psAlloc( sizeof( psS32 ) );
+    }
+
+    for ( lcv = 0;lcv < numBuffers - 1;lcv++ ) {
+        psFree( buffers[ lcv ] );
+    }
+
+    psLogMsg( __func__, PS_LOG_INFO, "following psMemCheckLeaks call should produce one error." );
+
+    nLeaks = psMemCheckLeaks( currentId, &blks, stderr, false );
+
+    if ( nLeaks != 1 ) {
+        psError(PS_ERR_UNKNOWN,true, "psMemCheckLeaks should have found 1 leak, but found %d in %s.", nLeaks, __func__ );
+        return 1;
+    }
+
+    if ( blks[ 0 ] ->lineno != lineMark ) {
+        psError(PS_ERR_UNKNOWN,true, "psMemCheckLeaks found a leak other than the expected one in %s.", __func__ );
+        return 1;
+    }
+
+    psFree( buffers[ 4 ] );
+    psFree( blks );
+
+    psLogMsg( __func__, PS_LOG_INFO, "Testing psMemCheckLeaks again with multiple leak locations." );
+
+    for ( lcv = 0;lcv < numBuffers;lcv++ ) {
+        lineMark = __LINE__ + 1;
+        buffers[ lcv ] = psAlloc( sizeof( psS32 ) );
+    }
+
+    for ( lcv = 0;lcv < numBuffers;lcv++ ) {
+        if ( lcv % 2 == 0 ) {
+            psFree( buffers[ lcv ] );
+        }
+    }
+
+    psLogMsg( __func__, PS_LOG_INFO, "following psMemCheckLeaks call should produce two errors." );
+
+    nLeaks = psMemCheckLeaks( currentId, &blks, stderr, false );
+
+    if ( nLeaks != 2 ) {
+        psError(PS_ERR_UNKNOWN,true, "psMemCheckLeaks should have found 1 leak, but found %d in %s.", nLeaks, __func__ );
+        return 1;
+    }
+
+    if ( blks[ 0 ] ->lineno != lineMark ) {
+        psError(PS_ERR_UNKNOWN,true, "psMemCheckLeaks found a leak other than the expected one in %s.", __func__ );
+        return 1;
+    }
+
+    psFree( blks );
+    psFree( buffers[ 1 ] );
+    psFree( buffers[ 3 ] );
+
+    return 0;
+}
+
+psS32 TPmemCorruption( void )
+{
+    psS32 * buffer = NULL;
+    psS32 oldValue = 0;
+    psS32 corruptions = 0;
+    psMemProblemCallback cb;
+
+    psLogMsg( __func__, PS_LOG_INFO, "psMemCheckCorruption shall detect memory corruptions" );
+
+    buffer = psAlloc( sizeof( psS32 ) );
+
+    // cause memory corruption via buffer underflow
+    *buffer = 1;
+    buffer--;
+    oldValue = *buffer;
+    *buffer = 2;
+
+    problemCallbackCalled = 0;
+    cb = psMemProblemCallbackSet( memProblemCallback );
+
+    psLogMsg( __func__, PS_LOG_INFO, "psMemCheckCorruption should output an error message and "
+              "memProblemCallback callback should be called." );
+
+    corruptions = psMemCheckCorruption( 0 );
+
+    // restore the memory problem callback
+    psMemProblemCallbackSet( cb );
+
+    // restore the value, 'uncorrupting' the buffer
+    *buffer = oldValue;
+    buffer++;
+
+    psFree( buffer );
+
+    if ( corruptions != 1 ) {
+        psError(PS_ERR_UNKNOWN,true, "Expected one memory corruption but found %d in %s.",
+                corruptions, __func__ );
+        return 1;
+    }
+
+    if ( problemCallbackCalled != 1 ) {
+        psError(PS_ERR_UNKNOWN,true, "The memProblemCallback was not invoked but should have been in %s",
+                __func__ );
+        return 1;
+    }
+
+    return 0;
+
+}
+
+void memProblemCallback( const psMemBlock *ptr, const char *file, psS32 lineno )
+{
+    psLogMsg( __func__, PS_LOG_INFO, "memory callback called for id %lld (%s:%d).",
+              ptr->id, file, lineno );
+    problemCallbackCalled++;
+    return ;
+}
+
+psMemoryId memAllocateCallback( const psMemBlock *ptr )
+{
+    psLogMsg( __func__, PS_LOG_INFO, "block %lld was (re)allocated", ptr->id );
+    allocCallbackCalled++;
+    return 1;
+}
+
+psMemoryId memFreeCallback( const psMemBlock *ptr )
+{
+    psLogMsg( __func__, PS_LOG_INFO, "block %lld was freed", ptr->id );
+    freeCallbackCalled++;
+    return 1;
+}
+
+psPtr TPOutOfMemoryExhaustedCallback( size_t size )
+{
+    psLogMsg( __func__, PS_LOG_INFO, "Custom MemExhaustedCallback was invoked." );
+    exhaustedCallbackCalled++;
+    return NULL;
+}
+
+psS32 TPmultipleFree( void )
+{
+
+    psPtr  buffer = psAlloc( 1024 );
+
+    psFree( buffer );
+
+    psLogMsg( __func__, PS_LOG_INFO, "Next should abort due to multiple freeing." );
+    psFree( buffer );
+
+    psError(PS_ERR_UNKNOWN,true,
+            "Multiple psFree call survived");
+
+    return 0;
+}
Index: /tags/ipp-1-X/bug123/psLib/test/sysUtils/tst_psString.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/sysUtils/tst_psString.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/sysUtils/tst_psString.c	(revision 22331)
@@ -0,0 +1,250 @@
+/** @file  tst_psString.c
+ *
+ *  @brief Test driver for psStringCopy functions
+ *
+ *  This test driver contains the following test points for psStringCopy
+ *  and psStringNCopy functions.
+ *    1) Verify string copy - psStringCopy
+ *    2) Verify empty string copy - psStringCopy
+ *    3) Verify string copy with length - psStringNCopy
+ *    4) Verify empty string copy with length - psStringNCopy
+ *    5) Copy string to larger string - psStringNCopy
+ *    6) Copy string with negative size - psStringNCopy
+ *    7) Verifiy creation of string literal - PS_STRING
+ *
+ *  Return:   Number of test points which failed
+ *
+ *  @author  Eric Van Alst, MHPCC
+ *
+ *  @version $Revision: 1.13 $  $Name: not supported by cvs2svn $
+ *  @date  $Date: 2005-04-07 20:27:42 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ *
+ */
+
+#include <string.h>
+#include "pslib_strict.h"
+#include "psTest.h"
+
+static psS32 testStringCopy00(void);
+static psS32 testStringCopy01(void);
+static psS32 testStringCopy02(void);
+static psS32 testStringCopy03(void);
+static psS32 testStringCopy04(void);
+static psS32 testStringCopy05(void);
+static psS32 testStringCopy06(void);
+
+testDescription tests[] = {
+                              {testStringCopy00, 0, "Verify string copy", 0, false},
+                              {testStringCopy01, 1, "Verify empty string copy", 0, false},
+                              {testStringCopy02, 2, "Verify string copy with length", 0, false},
+                              {testStringCopy03, 3, "Verify empty string copy with length", 0, false},
+                              {testStringCopy04, 4, "Copy string to larger string", 0, false},
+                              {testStringCopy05, 5, "Copy string with negative size", 0, false},
+                              {testStringCopy06, 6, "Verify creation of string literal", 0, false},
+                              {NULL}
+                          };
+
+psS32 main( psS32 argc, char* argv[] )
+{
+    psLogSetLevel( PS_LOG_INFO );
+
+    return ( ! runTestSuite( stderr, "psString", tests, argc, argv ) );
+}
+
+/*
+psS32 main( psS32 argc,
+          char * argv[] )
+{
+    psBool  tpResult = false;
+    char  stringval[20] = "E R R O R";
+    char  stringval1[20] = "e r r o r";
+    char  *stringvalnocopy = "F A I L";
+    char  *substringval = "e r r";
+    psS32   substringlen = 6;
+    char  *emptyval = "";
+    psS32   tpFails = 0;
+    char  *strResult;
+    psS32   increaseSize = 5;
+    psS32   negativeSize = -5;
+    psS32   result = 0;
+    psS32   result1 = 0;
+    psS32   memBlockAllocated = 0;
+    psMemBlock ***memBlockPtr = NULL;
+ 
+*/
+
+static psS32 testStringCopy00(void)
+{
+    char  stringval[20] = "E R R O R";
+    psS32   result = 0;
+    psS32   result1 = 0;
+    char  *strResult;
+
+    // Test point #1 Verify string copy - psStringCopy
+    strResult = psStringCopy(stringval);
+    // Perform string compare
+    result = strcmp(strResult, stringval);
+    // Modify original string
+    stringval[0]='G';
+    result1 = strcmp(strResult, stringval);
+    stringval[0]='E';
+    if ( ( result != 0 ) || ( result1 == 0) ) {
+        fprintf(stderr, "Failed test point #1 strcmp result = %d expected 0\n",result);
+        fprintf(stderr, "                               src = %s expected %s\n",
+                strResult, stringval);
+        fprintf(stderr, "             changed strcmp result = %d expected 1\n",result1);
+        fprintf(stderr, "             changed           src = %s expected %s\n",strResult,
+                stringval);
+        return 1;
+    }
+
+    // Free memory allocated
+    psFree(strResult);
+
+    return 0;
+}
+
+static psS32 testStringCopy01(void)
+{
+    char  *emptyval = "";
+    psS32   result = 0;
+    char  *strResult;
+
+    // Test point #2 Verify empty string copy - psStringCopy
+    strResult = psStringCopy(emptyval);
+    // Perform string compare
+    result = strcmp(strResult, emptyval);
+    if ( result != 0 ) {
+        fprintf(stderr,"Failed test point #2 strcmp result = %d expected 0\n",result);
+        fprintf(stderr,"                               src = %s expected %s\n",
+                strResult, emptyval);
+        return 1;
+    }
+
+    // Free memory allocated
+    psFree(strResult);
+
+    return 0;
+}
+
+static psS32 testStringCopy02(void)
+{
+    psS32   result = 0;
+    psS32   result1 = 0;
+    char  *strResult;
+    char  stringval1[20] = "e r r o r";
+    psS32   substringlen = 5;
+    char  *substringval = "e r r";
+
+    // Test point #3 Verify string copy with length - psStringNCopy
+    strResult = psStringNCopy(stringval1, substringlen);
+    // Perform string compare and get string length
+    result = strncmp(strResult, substringval, substringlen);
+    // Change original string
+    stringval1[0] = 'g';
+    result1 = strncmp(strResult, substringval, substringlen);
+    if ( ( result != 0 ) || ( result1 != 0 ) ) {
+        fprintf(stderr,"Failed test point #3 strcmp result = %d expected 0\n",result);
+        fprintf(stderr,"                               src = %s expected %s\n",
+                strResult, substringval);
+        fprintf(stderr,"             changed strcmp result = %d expected 0\n",result1);
+        fprintf(stderr,"                               src = %s expected %s\n",
+                strResult, substringval);
+        return 1;
+    }
+    // Free memory allocated
+    psFree(strResult);
+
+    return 0;
+}
+
+static psS32 testStringCopy03(void)
+{
+    psS32   result = 0;
+    psS32   result1 = 0;
+    char  *strResult;
+    char  *stringvalnocopy = "F A I L";
+
+    // Test point #4 Verify empty string copy with length - psStringNCopy
+    strResult = psStringNCopy(stringvalnocopy, 0);
+    // Perform string compare and get sting length
+    result = strcmp(strResult, stringvalnocopy);
+    result1 = strlen(strResult);
+    if ( result == 0 ) {
+        fprintf(stderr,"Failed test point #4 strcmp result = %d didn't expected %d\n",result,0);
+        fprintf(stderr,"                               src = %s didn't expected %s\n",
+                strResult, stringvalnocopy);
+        return 1;
+    }
+    // Free memory
+    psFree(strResult);
+
+    return 0;
+}
+
+static psS32 testStringCopy04(void)
+{
+    psS32   result = 0;
+    psS32   result1 = 0;
+    char  *strResult;
+    char  stringval[20] = "E R R O R";
+    psS32   increaseSize = 5;
+
+    // Test point #5 Copy string to larger string - psStringNCopy
+    strResult = psStringNCopy(stringval, (strlen(stringval) + increaseSize));
+    // Perform string compare and get string length
+    result = strcmp(strResult, stringval);
+    result1 = strlen(strResult);
+    // The strings should still compare
+    if ( ( result != 0 ) ||
+            ( result1 != strlen(stringval) ) ) {
+        fprintf(stderr,"Failed test point #5 strcmp result = %d expected %d\n",result,0);
+        fprintf(stderr,"                               src = %s expected %s\n",
+                strResult, stringval);
+        fprintf(stderr,"                     strlne result = %d expected %d\n",result1,
+                (psS32)strlen(stringval));
+        return 1;
+    }
+    // Free memory
+    psFree(strResult);
+
+    return 0;
+}
+
+static psS32 testStringCopy05(void)
+{
+    char  *strResult;
+    char  stringval[20] = "E R R O R";
+    psS32   negativeSize = -5;
+
+    // Test point #6 Copy string with negative size - psStringNCopy
+    strResult = psStringNCopy(stringval, negativeSize);
+    if ( strResult != NULL ) {
+        fprintf(stderr,"Failed test point #6 return value = %p expected NULL\n",
+                strResult);
+        return 1;
+    }
+    // Memory should not have been allocated
+
+    return 0;
+}
+
+static psS32 testStringCopy06(void)
+{
+    char  *strResult;
+    char  stringval[20] = "E R R O R";
+    psS32   result = 0;
+
+    // Test point #7 Verify creation of string literal - PS_STRING
+    strResult = PS_STRING(E R R O R);
+    result = strcmp(strResult, stringval);
+    if ( result != 0 ) {
+        fprintf(stderr,"Failed test point #7 strcmp result = %d expected %d",result,0);
+        return 1;
+    }
+    // Memory should not have been allocated
+
+    return 0;
+}
Index: /tags/ipp-1-X/bug123/psLib/test/sysUtils/tst_psStringCopy.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/sysUtils/tst_psStringCopy.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/sysUtils/tst_psStringCopy.c	(revision 22331)
@@ -0,0 +1,250 @@
+/** @file  tst_psString.c
+ *
+ *  @brief Test driver for psStringCopy functions
+ *
+ *  This test driver contains the following test points for psStringCopy
+ *  and psStringNCopy functions.
+ *    1) Verify string copy - psStringCopy
+ *    2) Verify empty string copy - psStringCopy
+ *    3) Verify string copy with length - psStringNCopy
+ *    4) Verify empty string copy with length - psStringNCopy
+ *    5) Copy string to larger string - psStringNCopy
+ *    6) Copy string with negative size - psStringNCopy
+ *    7) Verifiy creation of string literal - PS_STRING
+ *
+ *  Return:   Number of test points which failed
+ *
+ *  @author  Eric Van Alst, MHPCC
+ *
+ *  @version $Revision: 1.13 $  $Name: not supported by cvs2svn $
+ *  @date  $Date: 2005-04-07 20:27:42 $
+ *
+ *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+ *
+ */
+
+#include <string.h>
+#include "pslib_strict.h"
+#include "psTest.h"
+
+static psS32 testStringCopy00(void);
+static psS32 testStringCopy01(void);
+static psS32 testStringCopy02(void);
+static psS32 testStringCopy03(void);
+static psS32 testStringCopy04(void);
+static psS32 testStringCopy05(void);
+static psS32 testStringCopy06(void);
+
+testDescription tests[] = {
+                              {testStringCopy00, 0, "Verify string copy", 0, false},
+                              {testStringCopy01, 1, "Verify empty string copy", 0, false},
+                              {testStringCopy02, 2, "Verify string copy with length", 0, false},
+                              {testStringCopy03, 3, "Verify empty string copy with length", 0, false},
+                              {testStringCopy04, 4, "Copy string to larger string", 0, false},
+                              {testStringCopy05, 5, "Copy string with negative size", 0, false},
+                              {testStringCopy06, 6, "Verify creation of string literal", 0, false},
+                              {NULL}
+                          };
+
+psS32 main( psS32 argc, char* argv[] )
+{
+    psLogSetLevel( PS_LOG_INFO );
+
+    return ( ! runTestSuite( stderr, "psString", tests, argc, argv ) );
+}
+
+/*
+psS32 main( psS32 argc,
+          char * argv[] )
+{
+    psBool  tpResult = false;
+    char  stringval[20] = "E R R O R";
+    char  stringval1[20] = "e r r o r";
+    char  *stringvalnocopy = "F A I L";
+    char  *substringval = "e r r";
+    psS32   substringlen = 6;
+    char  *emptyval = "";
+    psS32   tpFails = 0;
+    char  *strResult;
+    psS32   increaseSize = 5;
+    psS32   negativeSize = -5;
+    psS32   result = 0;
+    psS32   result1 = 0;
+    psS32   memBlockAllocated = 0;
+    psMemBlock ***memBlockPtr = NULL;
+ 
+*/
+
+static psS32 testStringCopy00(void)
+{
+    char  stringval[20] = "E R R O R";
+    psS32   result = 0;
+    psS32   result1 = 0;
+    char  *strResult;
+
+    // Test point #1 Verify string copy - psStringCopy
+    strResult = psStringCopy(stringval);
+    // Perform string compare
+    result = strcmp(strResult, stringval);
+    // Modify original string
+    stringval[0]='G';
+    result1 = strcmp(strResult, stringval);
+    stringval[0]='E';
+    if ( ( result != 0 ) || ( result1 == 0) ) {
+        fprintf(stderr, "Failed test point #1 strcmp result = %d expected 0\n",result);
+        fprintf(stderr, "                               src = %s expected %s\n",
+                strResult, stringval);
+        fprintf(stderr, "             changed strcmp result = %d expected 1\n",result1);
+        fprintf(stderr, "             changed           src = %s expected %s\n",strResult,
+                stringval);
+        return 1;
+    }
+
+    // Free memory allocated
+    psFree(strResult);
+
+    return 0;
+}
+
+static psS32 testStringCopy01(void)
+{
+    char  *emptyval = "";
+    psS32   result = 0;
+    char  *strResult;
+
+    // Test point #2 Verify empty string copy - psStringCopy
+    strResult = psStringCopy(emptyval);
+    // Perform string compare
+    result = strcmp(strResult, emptyval);
+    if ( result != 0 ) {
+        fprintf(stderr,"Failed test point #2 strcmp result = %d expected 0\n",result);
+        fprintf(stderr,"                               src = %s expected %s\n",
+                strResult, emptyval);
+        return 1;
+    }
+
+    // Free memory allocated
+    psFree(strResult);
+
+    return 0;
+}
+
+static psS32 testStringCopy02(void)
+{
+    psS32   result = 0;
+    psS32   result1 = 0;
+    char  *strResult;
+    char  stringval1[20] = "e r r o r";
+    psS32   substringlen = 5;
+    char  *substringval = "e r r";
+
+    // Test point #3 Verify string copy with length - psStringNCopy
+    strResult = psStringNCopy(stringval1, substringlen);
+    // Perform string compare and get string length
+    result = strncmp(strResult, substringval, substringlen);
+    // Change original string
+    stringval1[0] = 'g';
+    result1 = strncmp(strResult, substringval, substringlen);
+    if ( ( result != 0 ) || ( result1 != 0 ) ) {
+        fprintf(stderr,"Failed test point #3 strcmp result = %d expected 0\n",result);
+        fprintf(stderr,"                               src = %s expected %s\n",
+                strResult, substringval);
+        fprintf(stderr,"             changed strcmp result = %d expected 0\n",result1);
+        fprintf(stderr,"                               src = %s expected %s\n",
+                strResult, substringval);
+        return 1;
+    }
+    // Free memory allocated
+    psFree(strResult);
+
+    return 0;
+}
+
+static psS32 testStringCopy03(void)
+{
+    psS32   result = 0;
+    psS32   result1 = 0;
+    char  *strResult;
+    char  *stringvalnocopy = "F A I L";
+
+    // Test point #4 Verify empty string copy with length - psStringNCopy
+    strResult = psStringNCopy(stringvalnocopy, 0);
+    // Perform string compare and get sting length
+    result = strcmp(strResult, stringvalnocopy);
+    result1 = strlen(strResult);
+    if ( result == 0 ) {
+        fprintf(stderr,"Failed test point #4 strcmp result = %d didn't expected %d\n",result,0);
+        fprintf(stderr,"                               src = %s didn't expected %s\n",
+                strResult, stringvalnocopy);
+        return 1;
+    }
+    // Free memory
+    psFree(strResult);
+
+    return 0;
+}
+
+static psS32 testStringCopy04(void)
+{
+    psS32   result = 0;
+    psS32   result1 = 0;
+    char  *strResult;
+    char  stringval[20] = "E R R O R";
+    psS32   increaseSize = 5;
+
+    // Test point #5 Copy string to larger string - psStringNCopy
+    strResult = psStringNCopy(stringval, (strlen(stringval) + increaseSize));
+    // Perform string compare and get string length
+    result = strcmp(strResult, stringval);
+    result1 = strlen(strResult);
+    // The strings should still compare
+    if ( ( result != 0 ) ||
+            ( result1 != strlen(stringval) ) ) {
+        fprintf(stderr,"Failed test point #5 strcmp result = %d expected %d\n",result,0);
+        fprintf(stderr,"                               src = %s expected %s\n",
+                strResult, stringval);
+        fprintf(stderr,"                     strlne result = %d expected %d\n",result1,
+                (psS32)strlen(stringval));
+        return 1;
+    }
+    // Free memory
+    psFree(strResult);
+
+    return 0;
+}
+
+static psS32 testStringCopy05(void)
+{
+    char  *strResult;
+    char  stringval[20] = "E R R O R";
+    psS32   negativeSize = -5;
+
+    // Test point #6 Copy string with negative size - psStringNCopy
+    strResult = psStringNCopy(stringval, negativeSize);
+    if ( strResult != NULL ) {
+        fprintf(stderr,"Failed test point #6 return value = %p expected NULL\n",
+                strResult);
+        return 1;
+    }
+    // Memory should not have been allocated
+
+    return 0;
+}
+
+static psS32 testStringCopy06(void)
+{
+    char  *strResult;
+    char  stringval[20] = "E R R O R";
+    psS32   result = 0;
+
+    // Test point #7 Verify creation of string literal - PS_STRING
+    strResult = PS_STRING(E R R O R);
+    result = strcmp(strResult, stringval);
+    if ( result != 0 ) {
+        fprintf(stderr,"Failed test point #7 strcmp result = %d expected %d",result,0);
+        return 1;
+    }
+    // Memory should not have been allocated
+
+    return 0;
+}
Index: /tags/ipp-1-X/bug123/psLib/test/sysUtils/tst_psTrace.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/sysUtils/tst_psTrace.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/sysUtils/tst_psTrace.c	(revision 22331)
@@ -0,0 +1,365 @@
+/*****************************************************************************
+    This code will test whether trace levels can be set successfully.
+ 
+    XXX: For the last two testpoints, must verify that the results are
+    correct, and put that verification in the test as well.
+ *****************************************************************************/
+#include <stdio.h>
+#include "pslib_strict.h"
+#include "psTest.h"
+
+
+static psS32 testTrace00(void);
+static psS32 testTrace01(void);
+static psS32 testTrace02(void);
+static psS32 testTrace03(void);
+static psS32 testTrace04(void);
+static psS32 testTrace05(void);
+static psS32 testTrace05a(void);
+static psS32 testTrace06(void);
+static psS32 testTrace08(void);
+
+testDescription tests[] = {
+                              {testTrace00, 0, "psTraceSetLevel() and psTraceGetLevel()", 0, false},
+                              {testTrace01, 1, "psTraceSetLevel(): set multiple components in one call", 0, false},
+                              {testTrace02, 2, "psTraceSetLevel(): test static/dynamic inheritance", 0, false},
+                              {testTrace03, 3, "psTraceReset()", 0, false},
+                              {testTrace04, 4, "psTrace()", 0, false},
+                              {testTrace05, 5, "psTracePrintLevels()", 0, false},
+                              {testTrace05a, 5, "optional leading dot and psTracePrintLevels()", 0, false},
+                              {testTrace06, 6, "Testing psTraceReset", 0, false},
+                              {testTrace08, 8, "Testing ", 0, false},
+                              {NULL}
+                          };
+
+testDescription tests2[] = {
+                               {testTrace08, 8, "Testing ", 0, false},
+                           };
+
+psS32 main( psS32 argc, char* argv[] )
+{
+    psLogSetLevel( PS_LOG_INFO );
+
+    return ( ! runTestSuite( stderr, "psTrace", tests, argc, argv ) );
+}
+
+static psS32 testTrace00(void)
+{
+    psS32 i;
+    psS32 lev = 0;
+
+    psTraceSetDestination(stderr);
+
+    for (i=0;i<10;i++) {
+        (void)psTraceSetLevel(".", i);
+        lev = psTraceGetLevel(".");
+        if (lev != i) {
+            fprintf(stderr,"ERROR: (.) expected trace level was %d, actual was %d\n",
+                    i, lev);
+            return 1;
+        }
+    }
+    (void)psTraceSetLevel(".", 3);
+
+    for (i=5;i<10;i++) {
+        (void)psTraceSetLevel(".NODE00", i);
+        lev = psTraceGetLevel(".NODE00");
+        if (lev != i) {
+            fprintf(stderr,"ERROR: (.NODE00) expected trace level was %d, actual was %d\n",
+                    i, lev);
+            return 2;
+        }
+
+        lev = psTraceGetLevel(".");
+        if (lev != 3) {
+            fprintf(stderr,"ERROR: (.) expected trace level was %d, actual was %d\n",
+                    i, 3);
+            return 3;
+        }
+    }
+
+
+    (void)psTraceSetLevel(".NODE00.NODE01", 4);
+    for (i=0;i<10;i++) {
+        (void)psTraceSetLevel(".NODE00.NODE01", i);
+        lev = psTraceGetLevel(".NODE00.NODE01");
+        if (lev != i) {
+            fprintf(stderr,"ERROR: (.NODE00.NODE01) expected trace level was %d, actual was %d\n",
+                    i, lev);
+            return 4;
+        }
+    }
+
+    return 0;
+}
+
+static psS32 testTrace01(void)
+{
+    psTraceSetDestination(stderr);
+    (void)psTraceSetLevel(".A.B.C.D.E", 5);
+
+    psTrace(".A.C.D.C",1,"You should not see this.\n");
+    psTrace(".A.B.C.D.E",2,"You should see this.\n");
+    psTrace(".A.B.C.D.E.F",3,"You should see this too.\n");
+
+    psTracePrintLevels();
+
+    return 0;
+}
+
+static psS32 testTrace02(void)
+{
+    psTraceReset();
+    psTraceSetDestination(stderr);
+    psTraceSetLevel(".A.B", 2);
+    psTraceSetLevel(".A.B.C.D.E", 5);
+    psTracePrintLevels();
+    psTraceSetLevel(".A.B", 10);
+    psTracePrintLevels();
+
+    if (10 != psTraceGetLevel(".A.B.C")) {
+        fprintf(stderr,"ERROR: .A.B.C did not dynamically inherit a trace level (%d)\n",
+                psTraceGetLevel(".A.B.C"));
+        return 2;
+    }
+
+    if (10 != psTraceGetLevel(".A.B.C.D")) {
+        fprintf(stderr,"ERROR: .A.B.C.D did not dynamically inherit a trace level (%d)\n", psTraceGetLevel(".A.B.C.D"));
+        return 2;
+    }
+
+    if (5 != psTraceGetLevel(".A.B.C.D.E")) {
+        fprintf(stderr,"ERROR: .A.B.C.D.E did dynamically inherit a trace level (%d)\n", psTraceGetLevel(".A.B.C.D.E"));
+        return 2;
+    }
+
+    return 0;
+}
+
+static psS32 testTrace03(void)
+{
+    psS32 i = 0;
+    psS32 lev = 0;
+
+    psTraceSetDestination(stderr);
+
+    for (i=0;i<10;i++) {
+        (void)psTraceSetLevel(".", i);
+        psTraceReset();
+
+        lev = psTraceGetLevel(".");
+        if (lev != PS_UNKNOWN_TRACE_LEVEL) {
+            fprintf(stderr,"ERROR: expected trace level was %d, actual was %d\n",
+                    PS_UNKNOWN_TRACE_LEVEL, lev);
+            return 1;
+        }
+    }
+    (void)psTraceSetLevel(".", 5);
+    (void)psTraceSetLevel(".a", 4);
+    (void)psTraceSetLevel(".a.b", 3);
+    (void)psTraceSetLevel(".a.b.c", 2);
+    if ((5 != psTraceGetLevel(".")) ||
+            (4 != psTraceGetLevel(".a")) ||
+            (3 != psTraceGetLevel(".a.b")) ||
+            (2 != psTraceGetLevel(".a.b.c"))) {
+        fprintf(stderr,"ERROR: trace successFlag = false;levels were not settable?\n");
+        return 2;
+    }
+
+    psTraceReset();
+    if ((PS_UNKNOWN_TRACE_LEVEL != psTraceGetLevel(".")) ||
+            (PS_UNKNOWN_TRACE_LEVEL != psTraceGetLevel(".a")) ||
+            (PS_UNKNOWN_TRACE_LEVEL != psTraceGetLevel(".a.b")) ||
+            (PS_UNKNOWN_TRACE_LEVEL != psTraceGetLevel(".a.b.c"))) {
+        fprintf(stderr,"ERROR: trace levels were not reset properly\n");
+        return 3;
+    }
+
+    return 0;
+}
+
+
+static psS32 testTrace04(void)
+{
+    FILE *fp;
+    psS32 nb = 0;
+
+    fp = fopen("tst_psTrace02_OUT", "w");
+    for (nb = 0 ; nb<4;nb++) {
+        if (nb == 0)
+            psTraceSetDestination(stdout);
+        if (nb == 1)
+            psTraceSetDestination(stderr);
+        if (nb == 2)
+            psTraceSetDestination(NULL);
+        if (nb == 3)
+            psTraceSetDestination(fp);
+
+        (void)psTraceSetLevel(".", 4);
+        psTrace(".", 5, "(0) This message should not be displayed (%x)\n",
+                0xbeefface);
+        (void)psTraceSetLevel(".", 7);
+        psTrace(".", 5, "(0) This message should be displayed (%x)\n",
+                0xbeefface);
+
+        (void)psTraceSetLevel(".a", 4);
+        psTrace(".a", 5, "(1) This message should not be displayed (%x)\n",
+                0xbeefface);
+        (void)psTraceSetLevel(".a", 7);
+        psTrace(".a", 5, "(1) This message should be displayed (%x)\n",
+                0xbeefface);
+
+
+        (void)psTraceSetLevel(".a.b", 4);
+        psTrace(".a.b", 5, "(2) This message should not be displayed (%x)\n",
+                0xbeefface);
+        (void)psTraceSetLevel(".a.b", 7);
+        psTrace(".a.b", 5, "(2) This message should be displayed (%x)\n",
+                0xbeefface);
+
+    }
+
+    fclose(fp);
+
+    return(0);
+}
+
+static psS32 testTrace05(void)
+{
+    psTraceSetDestination(stderr);
+
+    (void)psTraceSetLevel(".", 9);
+
+    (void)psTraceSetLevel(".a", 8);
+    (void)psTraceSetLevel(".b", 7);
+    (void)psTraceSetLevel(".c", 5);
+
+    (void)psTraceSetLevel(".a.a", 4);
+    (void)psTraceSetLevel(".a.b", 3);
+
+    (void)psTraceSetLevel(".b.a", 2);
+    (void)psTraceSetLevel(".b.b", 1);
+
+    (void)psTraceSetLevel(".c.a", 0);
+    (void)psTraceSetLevel(".c.b", 3);
+    (void)psTraceSetLevel(".c.c", 5);
+
+    psTracePrintLevels();
+
+    return 0;
+
+}
+
+static psS32 testTrace05a(void)
+{
+    (void)psTraceSetLevel(".", 9);
+
+    (void)psTraceSetLevel("a", 8);
+    (void)psTraceSetLevel("b", 7);
+    (void)psTraceSetLevel("c", 5);
+
+    (void)psTraceSetLevel("a.a", 4);
+    (void)psTraceSetLevel("a.b", 3);
+
+    (void)psTraceSetLevel("b.a", 2);
+    (void)psTraceSetLevel("b.b", 1);
+
+    (void)psTraceSetLevel("c.a", 0);
+    (void)psTraceSetLevel("c.b", 3);
+    (void)psTraceSetLevel("c.c", 5);
+
+    psTracePrintLevels();
+
+    return 0;
+
+}
+
+static psS32 testTrace06(void)
+{
+    psTraceSetDestination(stderr);
+
+    (void)psTraceSetLevel(".", 9);
+
+    (void)psTraceSetLevel(".a", 8);
+    (void)psTraceSetLevel(".b", 7);
+    (void)psTraceSetLevel(".c", 5);
+
+    (void)psTraceSetLevel(".a.a", 4);
+    (void)psTraceSetLevel(".a.b", 3);
+
+    (void)psTraceSetLevel(".b.a", 2);
+    (void)psTraceSetLevel(".b.b", 1);
+
+    (void)psTraceSetLevel(".c.a", 0);
+    (void)psTraceSetLevel(".c.b", 3);
+    (void)psTraceSetLevel(".c.c", 5);
+
+    psTraceReset();
+
+    if ((psTraceGetLevel(".")!=PS_UNKNOWN_TRACE_LEVEL) ||
+            (psTraceGetLevel(".a")!=PS_UNKNOWN_TRACE_LEVEL) ||
+            (psTraceGetLevel(".b")!=PS_UNKNOWN_TRACE_LEVEL) ||
+            (psTraceGetLevel(".c")!=PS_UNKNOWN_TRACE_LEVEL) ||
+            (psTraceGetLevel(".a.a")!=PS_UNKNOWN_TRACE_LEVEL) ||
+            (psTraceGetLevel(".a.b")!=PS_UNKNOWN_TRACE_LEVEL) ||
+            (psTraceGetLevel(".b.a")!=PS_UNKNOWN_TRACE_LEVEL) ||
+            (psTraceGetLevel(".b.b")!=PS_UNKNOWN_TRACE_LEVEL) ||
+            (psTraceGetLevel(".c.a")!=PS_UNKNOWN_TRACE_LEVEL) ||
+            (psTraceGetLevel(".c.b")!=PS_UNKNOWN_TRACE_LEVEL) ||
+            (psTraceGetLevel(".c.c")!=PS_UNKNOWN_TRACE_LEVEL)) {
+        return 1;
+    }
+
+    return 0;
+}
+
+// Ensure that the leading dot in the component names are optional.
+static psS32 testTrace08(void)
+{
+    psTraceReset();
+    (void)psTraceSetLevel(".", 9);
+
+    (void)psTraceSetLevel(".a", 8);
+    (void)psTraceSetLevel(".b", 7);
+    (void)psTraceSetLevel(".c", 5);
+
+    (void)psTraceSetLevel(".a.a", 4);
+    (void)psTraceSetLevel(".a.b", 3);
+
+    (void)psTraceSetLevel(".b.a", 2);
+    (void)psTraceSetLevel(".b.b", 1);
+
+    (void)psTraceSetLevel(".c.a", 0);
+    (void)psTraceSetLevel(".c.b", 3);
+    (void)psTraceSetLevel(".c.c", 5);
+
+    psTracePrintLevels();
+
+    if ((psTraceGetLevel(".")!=9) ||
+            (psTraceGetLevel("a")!=8) ||
+            (psTraceGetLevel("b")!=7) ||
+            (psTraceGetLevel("c")!=5) ||
+            (psTraceGetLevel("a.a")!=4) ||
+            (psTraceGetLevel("a.b")!=3) ||
+            (psTraceGetLevel("b.a")!=2) ||
+            (psTraceGetLevel("b.b")!=1) ||
+            (psTraceGetLevel("c.a")!=0) ||
+            (psTraceGetLevel("c.b")!=3) ||
+            (psTraceGetLevel("c.c")!=5)) {
+        printf("psTraceGetLevel(.) is %d\n", psTraceGetLevel("."));
+        printf("psTraceGetLevel(a) is %d\n", psTraceGetLevel("a"));
+        printf("psTraceGetLevel(b) is %d\n", psTraceGetLevel("b"));
+        printf("psTraceGetLevel(c) is %d\n", psTraceGetLevel("c"));
+        printf("psTraceGetLevel(a.a) is %d\n", psTraceGetLevel("a.a"));
+        printf("psTraceGetLevel(a.b) is %d\n", psTraceGetLevel("a.b"));
+        printf("psTraceGetLevel(b.a) is %d\n", psTraceGetLevel("b.a"));
+        printf("psTraceGetLevel(b.b) is %d\n", psTraceGetLevel("b.b"));
+        printf("psTraceGetLevel(c.a) is %d\n", psTraceGetLevel("c.a"));
+        printf("psTraceGetLevel(c.b) is %d\n", psTraceGetLevel("c.b"));
+        printf("psTraceGetLevel(c.c) is %d\n", psTraceGetLevel("c.c"));
+
+        return 1;
+    }
+
+    return 0;
+}
Index: /tags/ipp-1-X/bug123/psLib/test/sysUtils/verified/tst_psAbort.stderr
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/sysUtils/verified/tst_psAbort.stderr	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/sysUtils/verified/tst_psAbort.stderr	(revision 22331)
@@ -0,0 +1,32 @@
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psAbort.c                                              *
+*            TestPoint: psAbort{Multiple type values in abort message}             *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|A|testAbort00
+    ALL TYPES intval = 1 longval = 2 floatval = 3.010000 charval = E strval = E R R O R
+
+---> TESTPOINT PASSED (psAbort{Multiple type values in abort message} | tst_psAbort.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psAbort.c                                              *
+*            TestPoint: psAbort{String values in abort message}                    *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|A|__LINE__
+    NO_VALUES
+
+---> TESTPOINT PASSED (psAbort{String values in abort message} | tst_psAbort.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psAbort.c                                              *
+*            TestPoint: psAbort{Empty strings in abort message}                    *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|A|
+
+---> TESTPOINT PASSED (psAbort{Empty strings in abort message} | tst_psAbort.c)
+
Index: /tags/ipp-1-X/bug123/psLib/test/sysUtils/verified/tst_psConfigure.stderr
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/sysUtils/verified/tst_psConfigure.stderr	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/sysUtils/verified/tst_psConfigure.stderr	(revision 22331)
@@ -0,0 +1,11 @@
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psConfigure.c                                          *
+*            TestPoint: psConfigure{Return current psLib version}                  *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|I|psLibVersion00
+    Current psLib version is: pslib-vX.X.X
+
+---> TESTPOINT PASSED (psConfigure{Return current psLib version} | tst_psConfigure.c)
+
Index: /tags/ipp-1-X/bug123/psLib/test/sysUtils/verified/tst_psError.stderr
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/sysUtils/verified/tst_psError.stderr	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/sysUtils/verified/tst_psError.stderr	(revision 22331)
@@ -0,0 +1,112 @@
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psError.c                                              *
+*            TestPoint: psError{psError()}                                         *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|E|testError00 (FILE:LINENO)
+    ALL TYPES intval = 1 longval = 2 floatval = 3.010000 charval = E strval = E R R O R
+<DATE><TIME>|<HOST>|E|testError00 (FILE:LINENO)
+    NO VALUES
+<DATE><TIME>|<HOST>|E|testError00 (FILE:LINENO)
+
+---> TESTPOINT PASSED (psError{psError()} | tst_psError.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psError.c                                              *
+*            TestPoint: psError{psErrorMsg(),psErrorStackPrint()}                  *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|E|testError01 (FILE:LINENO)
+    Error code = 262
+ERROR STACK PRINT Test1A -> testError01 (FILE:LINENO): parameter is out-of-range
+     Error code = 262
+<DATE><TIME>|<HOST>|E|testError01 (FILE:LINENO)
+    Error code = 263
+ERROR STACK PRINT Test1B -> testError01 (FILE:LINENO): parameter is of unsupported type
+     Error code = 263
+<DATE><TIME>|<HOST>|E|testError01 (FILE:LINENO)
+    Error code = -1
+ERROR STACK PRINT Test1D -> testError01 (FILE:LINENO): (null)
+     Error code = -1
+<DATE><TIME>|<HOST>|E|testError01 (FILE:LINENO)
+    Error code = 262
+ERROR STACK PRINT Test1E -> testError01 (FILE:LINENO): (null)
+     Error code = -1
+ -> testError01 (FILE:LINENO): parameter is out-of-range
+     Error code = 262
+<DATE><TIME>|<HOST>|E|testError01 (FILE:LINENO)
+    Errno code = 9
+ERROR STACK PRINT Test1F -> testError01 (FILE:LINENO): Bad file descriptor
+     Errno code = 9
+
+---> TESTPOINT PASSED (psError{psErrorMsg(),psErrorStackPrint()} | tst_psError.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psError.c                                              *
+*            TestPoint: psError{psErrorStackPrintV()}                              *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|E|testError02 (FILE:LINENO)
+    Error code = 262
+ERROR STACK PRINT Test2A -> testError02 (FILE:LINENO): parameter is out-of-range
+     Error code = 262
+
+---> TESTPOINT PASSED (psError{psErrorStackPrintV()} | tst_psError.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psError.c                                              *
+*            TestPoint: psError{psErrorGet(),psErrorLast()}                        *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|E|testError03 (FILE:LINENO)
+    Error code = 262
+<DATE><TIME>|<HOST>|E|testError03 (FILE:LINENO)
+    Error code = 263
+<DATE><TIME>|<HOST>|E|testError03 (FILE:LINENO)
+    Error code = 264
+
+---> TESTPOINT PASSED (psError{psErrorGet(),psErrorLast()} | tst_psError.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psError.c                                              *
+*            TestPoint: psError{psErrorClear()}                                    *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|E|testError04 (FILE:LINENO)
+    Error code = 262
+<DATE><TIME>|<HOST>|E|testError04 (FILE:LINENO)
+    Error code = 263
+<DATE><TIME>|<HOST>|E|testError04 (FILE:LINENO)
+    Error code = 264
+
+---> TESTPOINT PASSED (psError{psErrorClear()} | tst_psError.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psError.c                                              *
+*            TestPoint: psError{psErrorCodeString()}                               *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|I|tst_psError05
+    parameter is out-of-range
+
+---> TESTPOINT PASSED (psError{psErrorCodeString()} | tst_psError.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psError.c                                              *
+*            TestPoint: psError{psErrorRegister()}                                 *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|I|testErrorRegister
+    Following should be an error.
+<DATE><TIME>|<HOST>|E|psErrorRegister (FILE:LINENO)
+    Specified psErrorDescription pointer can not be NULL.
+
+---> TESTPOINT PASSED (psError{psErrorRegister()} | tst_psError.c)
+
Index: /tags/ipp-1-X/bug123/psLib/test/sysUtils/verified/tst_psLogMsg.stderr
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/sysUtils/verified/tst_psLogMsg.stderr	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/sysUtils/verified/tst_psLogMsg.stderr	(revision 22331)
@@ -0,0 +1,168 @@
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psLogMsg.c                                             *
+*            TestPoint: psLogMsg{default log levels, printf-style strings}         *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|A|testLogMsg00
+    Hello World!  My level is 0 0.000000 beep beep
+<DATE><TIME>|<HOST>|E|testLogMsg00
+    Hello World!  My level is 1 1.000000 beep beep
+<DATE><TIME>|<HOST>|W|testLogMsg00
+    Hello World!  My level is 2 2.000000 beep beep
+<DATE><TIME>|<HOST>|I|testLogMsg00
+    Hello World!  My level is 3 3.000000 beep beep
+
+---> TESTPOINT PASSED (psLogMsg{default log levels, printf-style strings} | tst_psLogMsg.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psLogMsg.c                                             *
+*            TestPoint: psLogMsg{default log levels, psVLogMsg()}                  *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|A|testLogMsg01
+    Hello World!  My level is 0 0.000000 beep beep
+<DATE><TIME>|<HOST>|E|testLogMsg01
+    Hello World!  My level is 1 1.000000 beep beep
+<DATE><TIME>|<HOST>|W|testLogMsg01
+    Hello World!  My level is 2 2.000000 beep beep
+<DATE><TIME>|<HOST>|I|testLogMsg01
+    Hello World!  My level is 3 3.000000 beep beep
+
+---> TESTPOINT PASSED (psLogMsg{default log levels, psVLogMsg()} | tst_psLogMsg.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psLogMsg.c                                             *
+*            TestPoint: psLogMsg{psLogSetLevel()}                                  *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|A|testLogMsg02
+    Hello World!  My level is 0
+<DATE><TIME>|<HOST>|E|testLogMsg02
+    Hello World!  My level is 1
+<DATE><TIME>|<HOST>|W|testLogMsg02
+    Hello World!  My level is 2
+<DATE><TIME>|<HOST>|I|testLogMsg02
+    Hello World!  My level is 3
+<DATE><TIME>|<HOST>|4|testLogMsg02
+    Hello World!  My level is 4
+<DATE><TIME>|<HOST>|5|testLogMsg02
+    Hello World!  My level is 5
+<DATE><TIME>|<HOST>|6|testLogMsg02
+    Hello World!  My level is 6
+<DATE><TIME>|<HOST>|7|testLogMsg02
+    Hello World!  My level is 7
+<DATE><TIME>|<HOST>|8|testLogMsg02
+    Hello World!  My level is 8
+<DATE><TIME>|<HOST>|9|testLogMsg02
+    Hello World!  My level is 9
+<DATE><TIME>|<HOST>|4|testLogMsg02
+    This should  be displayed (level 4)
+
+---> TESTPOINT PASSED (psLogMsg{psLogSetLevel()} | tst_psLogMsg.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psLogMsg.c                                             *
+*            TestPoint: psLogMsg{psLogSetFormat()}                                 *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+------------- psLogSetFormat() -------------
+<DATE><TIME>|<HOST>|A|testLogMsg03
+    Hello World!  My level is 0
+<DATE><TIME>|<HOST>|E|testLogMsg03
+    Hello World!  My level is 1
+<DATE><TIME>|<HOST>|W|testLogMsg03
+    Hello World!  My level is 2
+<DATE><TIME>|<HOST>|I|testLogMsg03
+    Hello World!  My level is 3
+------------- psLogSetFormat(NULL) -------------
+------------- psLogSetFormat(T) -------------
+<DATE><TIME>
+
+<DATE><TIME>
+
+<DATE><TIME>
+
+<DATE><TIME>
+
+------------- psLogSetFormat(H) -------------
+<HOST>
+<HOST>
+<HOST>
+<HOST>
+------------- psLogSetFormat(L) -------------
+A
+
+E
+
+W
+
+I
+
+------------- psLogSetFormat(N) -------------
+testLogMsg03
+
+testLogMsg03
+
+testLogMsg03
+
+testLogMsg03
+
+------------- psLogSetFormat(M) -------------
+    Hello World!  My level is 0
+    Hello World!  My level is 1
+    Hello World!  My level is 2
+    Hello World!  My level is 3
+------------- psLogSetFormat(THLNM) -------------
+<DATE><TIME>|<HOST>|A|testLogMsg03
+    Hello World!  My level is 0
+<DATE><TIME>|<HOST>|E|testLogMsg03
+    Hello World!  My level is 1
+<DATE><TIME>|<HOST>|W|testLogMsg03
+    Hello World!  My level is 2
+<DATE><TIME>|<HOST>|I|testLogMsg03
+    Hello World!  My level is 3
+
+---> TESTPOINT PASSED (psLogMsg{psLogSetFormat()} | tst_psLogMsg.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psLogMsg.c                                             *
+*            TestPoint: psLogMsg{Output Format}                                    *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|A|Under 15 chars
+    Hello World!
+<DATE><TIME>|<HOST>|A|This string is more than 15 chars
+    Hello World!
+<DATE><TIME>|<HOST>|A|testLogMsg04
+    Line #1
+<DATE><TIME>|<HOST>|A|testLogMsg04
+    Line #2
+<DATE><TIME>|<HOST>|A|testLogMsg04
+    Line #3
+<DATE><TIME>|<HOST>|A|testLogMsg04
+    Line #4
+
+---> TESTPOINT PASSED (psLogMsg{Output Format} | tst_psLogMsg.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psLogMsg.c                                             *
+*            TestPoint: psLogMsg{psLogSetDestination()}                            *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|A|testLogMsg05
+    Hello World!  My level is 0
+<DATE><TIME>|<HOST>|E|testLogMsg05
+    Hello World!  My level is 1
+<DATE><TIME>|<HOST>|W|testLogMsg05
+    Hello World!  My level is 2
+<DATE><TIME>|<HOST>|I|testLogMsg05
+    Hello World!  My level is 3
+
+---> TESTPOINT PASSED (psLogMsg{psLogSetDestination()} | tst_psLogMsg.c)
+
Index: /tags/ipp-1-X/bug123/psLib/test/sysUtils/verified/tst_psLogMsg.stdout
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/sysUtils/verified/tst_psLogMsg.stdout	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/sysUtils/verified/tst_psLogMsg.stdout	(revision 22331)
@@ -0,0 +1,22 @@
+--------------- psLogSetDestination(PS_LOG_NONE) ----------------
+------------- psLogSetDestination(PS_LOG_TO_STDERR) -------------
+------------- psLogSetDestination(PS_LOG_TO_STDOUT) -------------
+<DATE><TIME>|<HOST>|A|testLogMsg05
+    Hello World!  My level is 0
+<DATE><TIME>|<HOST>|E|testLogMsg05
+    Hello World!  My level is 1
+<DATE><TIME>|<HOST>|W|testLogMsg05
+    Hello World!  My level is 2
+<DATE><TIME>|<HOST>|I|testLogMsg05
+    Hello World!  My level is 3
+--------------- psLogSetDestination(file:log.txt) ---------------
+--------------------- The Contents of log.txt -------------------
+<DATE><TIME>|<HOST>|A|testLogMsg05
+    Hello World!  My level is 0
+<DATE><TIME>|<HOST>|E|testLogMsg05
+    Hello World!  My level is 1
+<DATE><TIME>|<HOST>|W|testLogMsg05
+    Hello World!  My level is 2
+<DATE><TIME>|<HOST>|I|testLogMsg05
+    Hello World!  My level is 3
+--------------- psLogSetDestination(file:/eva/log.txt) ----------
Index: /tags/ipp-1-X/bug123/psLib/test/sysUtils/verified/tst_psMemory.stderr
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/sysUtils/verified/tst_psMemory.stderr	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/sysUtils/verified/tst_psMemory.stderr	(revision 22331)
@@ -0,0 +1,152 @@
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMemory.c                                             *
+*            TestPoint: psMemory{checkBufferPositive}                              *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|I|TPCheckBufferPositive
+    psAlloc shall allocate memory blocks writeable by caller.
+
+---> TESTPOINT PASSED (psMemory{checkBufferPositive} | tst_psMemory.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMemory.c                                             *
+*            TestPoint: psMemory{outOfMemory}                                      *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|I|TPOutOfMemory
+    Upon requesting more memory than is available, psalloc shall call the psMemExhaustedCallback.
+<DATE><TIME>|<HOST>|I|TPOutOfMemoryExhaustedCallback
+    Custom MemExhaustedCallback was invoked.
+<DATE><TIME>|<HOST>|A|p_psAlloc
+    Failed to allocate <N> bytes at FILE:LINENO
+
+---> TESTPOINT PASSED (psMemory{outOfMemory} | tst_psMemory.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMemory.c                                             *
+*            TestPoint: psMemory{reallocOutOfMemory}                               *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|I|TPReallocOutOfMemory
+    Upon requesting more memory than is available, psRealloc shall call the psMemExhaustedCallback.
+<DATE><TIME>|<HOST>|I|TPOutOfMemoryExhaustedCallback
+    Custom MemExhaustedCallback was invoked.
+<DATE><TIME>|<HOST>|A|p_psRealloc
+    Failed to reallocate <N> bytes at FILE:LINENO
+
+---> TESTPOINT PASSED (psMemory{reallocOutOfMemory} | tst_psMemory.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMemory.c                                             *
+*            TestPoint: psMemory{psRealloc}                                        *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|I|TPrealloc
+    psRealloc shall increase/decrease memory buffer while preserving contents
+<DATE><TIME>|<HOST>|I|TPrealloc
+    Expanding memory buffer.
+<DATE><TIME>|<HOST>|I|TPrealloc
+    Shrinking memory buffer.
+
+---> TESTPOINT PASSED (psMemory{psRealloc} | tst_psMemory.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMemory.c                                             *
+*            TestPoint: psMemory{allocCallback}                                    *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|I|TPallocCallback
+    call to psAlloc/psRealloc shall generate a callback if specified memory ID is allocated.
+<DATE><TIME>|<HOST>|I|memAllocateCallback
+    block 2 was (re)allocated
+<DATE><TIME>|<HOST>|I|memAllocateCallback
+    block 3 was (re)allocated
+<DATE><TIME>|<HOST>|I|memFreeCallback
+    block 2 was freed
+<DATE><TIME>|<HOST>|I|memFreeCallback
+    block 3 was freed
+<DATE><TIME>|<HOST>|I|memAllocateCallback
+    block 4 was (re)allocated
+<DATE><TIME>|<HOST>|I|memAllocateCallback
+    block 4 was (re)allocated
+<DATE><TIME>|<HOST>|I|memFreeCallback
+    block 4 was freed
+
+---> TESTPOINT PASSED (psMemory{allocCallback} | tst_psMemory.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMemory.c                                             *
+*            TestPoint: psMemory{checkLeaks}                                       *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|I|TPcheckLeaks
+    psMemCheckLeaks shall return the number of blocks above an ID that are still allocated
+<DATE><TIME>|<HOST>|I|TPcheckLeaks
+    following psMemCheckLeaks call should produce one instance.
+                   file:line ID
+ FILE:LINENO  1
+<DATE><TIME>|<HOST>|I|TPcheckLeaks
+    Testing psMemCheckLeaks again with a different leak location
+<DATE><TIME>|<HOST>|I|TPcheckLeaks
+    following psMemCheckLeaks call should produce one error.
+                   file:line ID
+ FILE:LINENO  11
+<DATE><TIME>|<HOST>|I|TPcheckLeaks
+    Testing psMemCheckLeaks again with multiple leak locations.
+<DATE><TIME>|<HOST>|I|TPcheckLeaks
+    following psMemCheckLeaks call should produce two errors.
+                   file:line ID
+ FILE:LINENO  16
+ FILE:LINENO  14
+
+---> TESTPOINT PASSED (psMemory{checkLeaks} | tst_psMemory.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMemory.c                                             *
+*            TestPoint: psMemory{psMemCorruption}                                  *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|I|TPmemCorruption
+    psMemCheckCorruption shall detect memory corruptions
+<DATE><TIME>|<HOST>|I|TPmemCorruption
+    psMemCheckCorruption should output an error message and memProblemCallback callback should be called.
+<DATE><TIME>|<HOST>|E|checkMemBlock (FILE:LINENO)
+    Memory block 1 is corrupted; buffer underflow detected.
+<DATE><TIME>|<HOST>|I|memProblemCallback
+    memory callback called for id 1 (FILE:LINENO).
+
+---> TESTPOINT PASSED (psMemory{psMemCorruption} | tst_psMemory.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMemory.c                                             *
+*            TestPoint: psMemory{freeReferencedMemory}                             *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|I|TPFreeReferencedMemory
+    memory reference count shall be incrementable/decrementable
+<DATE><TIME>|<HOST>|I|TPFreeReferencedMemory
+    psFree shall be just decrement a multiple refererenced pointer.
+
+---> TESTPOINT PASSED (psMemory{freeReferencedMemory} | tst_psMemory.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psMemory.c                                             *
+*            TestPoint: psMemory{multipleFree}                                     *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|I|TPmultipleFree
+    Next should abort due to multiple freeing.
+<DATE><TIME>|<HOST>|A|p_psFree
+    Block 1, allocated at FILE:LINENO, freed multiple times at FILE:LINENO.
+
+---> TESTPOINT PASSED (psMemory{multipleFree} | tst_psMemory.c)
+
Index: /tags/ipp-1-X/bug123/psLib/test/sysUtils/verified/tst_psStringCopy.stderr
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/sysUtils/verified/tst_psStringCopy.stderr	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/sysUtils/verified/tst_psStringCopy.stderr	(revision 22331)
@@ -0,0 +1,65 @@
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psStringCopy.c                                         *
+*            TestPoint: psString{Verify string copy}                               *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psString{Verify string copy} | tst_psStringCopy.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psStringCopy.c                                         *
+*            TestPoint: psString{Verify empty string copy}                         *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psString{Verify empty string copy} | tst_psStringCopy.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psStringCopy.c                                         *
+*            TestPoint: psString{Verify string copy with length}                   *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psString{Verify string copy with length} | tst_psStringCopy.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psStringCopy.c                                         *
+*            TestPoint: psString{Verify empty string copy with length}             *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psString{Verify empty string copy with length} | tst_psStringCopy.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psStringCopy.c                                         *
+*            TestPoint: psString{Copy string to larger string}                     *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psString{Copy string to larger string} | tst_psStringCopy.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psStringCopy.c                                         *
+*            TestPoint: psString{Copy string with negative size}                   *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+<DATE><TIME>|<HOST>|E|psStringNCopy (FILE:LINENO)
+    Can not copy a negative number of characters (-5).
+
+---> TESTPOINT PASSED (psString{Copy string with negative size} | tst_psStringCopy.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psStringCopy.c                                         *
+*            TestPoint: psString{Verify creation of string literal}                *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psString{Verify creation of string literal} | tst_psStringCopy.c)
+
Index: /tags/ipp-1-X/bug123/psLib/test/sysUtils/verified/tst_psTrace.stderr
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/sysUtils/verified/tst_psTrace.stderr	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/sysUtils/verified/tst_psTrace.stderr	(revision 22331)
@@ -0,0 +1,115 @@
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psTrace.c                                              *
+*            TestPoint: psTrace{psTraceSetLevel() and psTraceGetLevel()}           *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psTrace{psTraceSetLevel() and psTraceGetLevel()} | tst_psTrace.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psTrace.c                                              *
+*            TestPoint: psTrace{psTraceSetLevel(): set multiple components in one call} *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+  You should see this.
+   You should see this too.
+.                    0
+ A                   0
+  B                  0
+   C                 0
+    D                0
+     E               5
+
+---> TESTPOINT PASSED (psTrace{psTraceSetLevel(): set multiple components in one call} | tst_psTrace.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psTrace.c                                              *
+*            TestPoint: psTrace{psTraceSetLevel(): test static/dynamic inheritance} *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+.                    0
+ A                   0
+  B                  2
+   C                 2
+    D                2
+     E               5
+.                    0
+ A                   0
+  B                  10
+   C                 10
+    D                10
+     E               5
+
+---> TESTPOINT PASSED (psTrace{psTraceSetLevel(): test static/dynamic inheritance} | tst_psTrace.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psTrace.c                                              *
+*            TestPoint: psTrace{psTraceReset()}                                    *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psTrace{psTraceReset()} | tst_psTrace.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psTrace.c                                              *
+*            TestPoint: psTrace{psTrace()}                                         *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+     (0) This message should be displayed (beefface)
+     (1) This message should be displayed (beefface)
+     (2) This message should be displayed (beefface)
+
+---> TESTPOINT PASSED (psTrace{psTrace()} | tst_psTrace.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psTrace.c                                              *
+*            TestPoint: psTrace{psTracePrintLevels()}                              *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+.                    9
+ a                   8
+  a                  4
+  b                  3
+ b                   7
+  a                  2
+  b                  1
+ c                   5
+  a                  0
+  b                  3
+  c                  5
+
+---> TESTPOINT PASSED (psTrace{psTracePrintLevels()} | tst_psTrace.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psTrace.c                                              *
+*            TestPoint: psTrace{optional leading dot and psTracePrintLevels()}     *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psTrace{optional leading dot and psTracePrintLevels()} | tst_psTrace.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psTrace.c                                              *
+*            TestPoint: psTrace{Testing psTraceReset}                              *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psTrace{Testing psTraceReset} | tst_psTrace.c)
+
+/***************************** TESTPOINT ******************************************\
+*             TestFile: tst_psTrace.c                                              *
+*            TestPoint: psTrace{Testing }                                          *
+*             TestType: Positive                                                   *
+\**********************************************************************************/
+
+
+---> TESTPOINT PASSED (psTrace{Testing } | tst_psTrace.c)
+
Index: /tags/ipp-1-X/bug123/psLib/test/sysUtils/verified/tst_psTrace.stdout
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/sysUtils/verified/tst_psTrace.stdout	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/sysUtils/verified/tst_psTrace.stdout	(revision 22331)
@@ -0,0 +1,28 @@
+     (0) This message should be displayed (beefface)
+     (1) This message should be displayed (beefface)
+     (2) This message should be displayed (beefface)
+     (0) This message should be displayed (beefface)
+     (1) This message should be displayed (beefface)
+     (2) This message should be displayed (beefface)
+.                    9
+ a                   8
+  a                  4
+  b                  3
+ b                   7
+  a                  2
+  b                  1
+ c                   5
+  a                  0
+  b                  3
+  c                  5
+.                    9
+ a                   8
+  a                  4
+  b                  3
+ b                   7
+  a                  2
+  b                  1
+ c                   5
+  a                  0
+  b                  3
+  c                  5
Index: /tags/ipp-1-X/bug123/psLib/test/tst_template.c
===================================================================
--- /tags/ipp-1-X/bug123/psLib/test/tst_template.c	(revision 22331)
+++ /tags/ipp-1-X/bug123/psLib/test/tst_template.c	(revision 22331)
@@ -0,0 +1,92 @@
+/** @file  tst_psImageManip.c
+*
+*  @brief Contains the tests for psImageManip.[ch]
+*
+*
+*  @author Robert DeSonia, MHPCC
+*
+*  @version $Revision: 1.6 $ $Name: not supported by cvs2svn $
+*  @date $Date: 2005-04-07 20:27:41 $
+*
+*  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
+*/
+
+#include "psTest.h"
+#include "pslib_strict.h"
+
+static psS32 test1( void );
+static psS32 test2( void );
+static psS32 test3( void );
+
+// test description consists of:
+//    * test function
+//
+//    * testpoint number (item number in gforge testpoint log)
+//
+//    * name of the testpoint
+//
+//    * expected return value (negative numbers are signal types, e.g.,
+//      -6 for aborts).  Usually either -6 (psAbort called) or 0.
+//
+//    * boolean to signify if the test function is already in list, i.e., if
+//      the test function covers multiple testpoints.  If true, the line is
+//      ignored by runTestSuite if the user didn't explicitly specify the
+//      testpoint with the -n or -t option, as to not run a test function
+//      multiple times.
+//
+testDescription tests[] = {
+                              {
+                                  test1, 1111, "psFunctionBar", 0, false
+                              },
+                              {
+                                  test2, 1113, "psFunctionFoo", 0, false
+                              },
+                              {
+                                  test3, 1114, "psFunctionFunk", 0, false
+                              },
+
+                              // testpoint #1112 handled by same test function as #1111
+                              {
+                                  test1, 1112, "psFunctionBang", 0, true
+                              },
+
+                              // A null terminates the testDescription list
+                              {
+                                  NULL
+                              }
+                          };
+
+psS32 main( psS32 argc, char* argv[] )
+{
+    psLogSetLevel( PS_LOG_INFO );
+
+    return ( ! runTestSuite( stderr, "psImage", tests, argc, argv ) );
+}
+
+psS32 test1( void )
+{
+    // no need to check for memory leaks, as the runTestSuite does that for you.
+
+    // here is where one implements the tests for generally a single testpoint.
+
+    return 0;  // the value that indicates success is part of the testDescription
+}
+
+psS32 test2( void )
+{
+    // no need to check for memory leaks, as the runTestSuite does that for you.
+
+    // here is where one implements the tests for generally a single testpoint.
+
+    return 0;  // the value that indicates success is part of the testDescription
+}
+
+psS32 test3( void )
+{
+    // no need to check for memory leaks, as the runTestSuite does that for you.
+
+    // here is where one implements the tests for generally a single testpoint.
+
+    return 0;  // the value that indicates success is part of the testDescription
+}
+
